Compare commits

..

1 Commits

Author SHA1 Message Date
Jess 95f351657c feat: start working on a PC port using Normmatt's code as a base. 2022-08-25 12:29:05 +00:00
35 changed files with 182 additions and 650 deletions

View File

@ -1,24 +0,0 @@
# This CI file is used to test code pushed to "main".
image: ubuntu:rolling # Using rolling because of that OpenSSL vuln.
# Use Docker, because it just works.
before_script:
- apt update # Build a package cache with apt, because Ubuntu on Docker doesn't have one by default.
- apt install git bash libpng-dev build-essential binutils-arm-none-eabi -y # Install build dependencies.
- git config --global http.sslVerify false # disable SSL for git so that cloning the game doesn't fudge everything up.
build:
stage: build
script:
- echo "Do your build here"
- mkdir work-directory
- cd work-directory
- git clone --recursive https://gitgud.io/tbld/game.git # clone recursively so that we don't have to get agbcc ourselves
- cd game
- cd agbcc
- bash ./build.sh # Compile agbcc
- bash ./install.sh ../ # Install agbcc into tumbledemerald
- cd ..
- make -j8 # multi-threaded make

View File

@ -1,14 +0,0 @@
# Bug Report
## What issue have you found?
<!--- Please provide a detailed explanation of the bug here. -->
## What did you expect to happen instead of this bug?
<!--- What did you expect to happen instead? Please explain in detail. -->
<!--- Please check the following boxes. -->
- [ ] I am using the **latest version** of TumbledEmerald.
- [ ] I am using mGBA, the official CIA package, or a Game Boy Advance flashcart.

View File

@ -1,4 +0,0 @@
<!---
Please make sure to look at the issue templates and use the one that best describes your problem. If your issue
doesn't fit into one of these categories, please type your issue below. If we need more information, we'll ask!
-->

View File

@ -1,18 +0,0 @@
# Feature Request
## Requested feature: <!--- type what you want added here. -->
## Why do you want this feature?
<!--- Please check the following boxes. -->
- [ ] I have submitted a merge request to implement this feature. <!--- not required, but if this is the case, please indicate so! -->
- If you have submitted a merge request, please reference it here: <!--- use the !NUMBER format. -->
- [ ] This feature has not been requested in another issue before.
- [ ] I would like to be listed in the credits.

View File

@ -1,16 +0,0 @@
## Save Porting Request
Version of my save: <!--- replace this text with the game version that your save was created in. -->
Version I want to have my save ported to: <!--- replace this text with the game version you want to use your save in. -->
- [ ] I have attached my save file in `.sav` format to this request.
- [ ] I would like to authorize my save file to be used for testing and debugging purposes. (OPTIONAL)
<!---
Please note:
I might not get to your save right away. If it takes longer than a month to make you a new save, I'll update
it to work with the latest version of the game for you.
This process is NOT a conversion. This is me (an idiot!) rummaging through your save and trying to replicate it on the version you chose. I might miss something. If you notice something I missed, let me know.
-->

3
.gitmodules vendored
View File

@ -1,3 +0,0 @@
[submodule "agbcc"]
path = agbcc
url = https://github.com/pret/agbcc

View File

@ -3,6 +3,6 @@
# and commit this file to your remote git repository to share the goodness with others.
tasks:
- init: git config --global http.sslVerify false && git clone https://gitgud.io/tbld/scripts.git && cd scripts && sudo bash ./main.sh -cc
- init: echo "See INSTALL.md for compilation instructions."

View File

@ -7,7 +7,7 @@ DO:
- Keep `tumbledemerald` up-to-date with `@pret`'s decomp. (pret/pokeemerald on GitHub.com)
- Send pull requests
- Send feature requests
- Hang out with us.
- Hang out with us on **[matrix]**
- Follow the [style guide](STYLE.md)
DON'T:

View File

@ -1,9 +1,6 @@
# Cool people:
# Compilation Hall of Fame
These people have built or compiled TumbledEmerald releases in a pinch, lending their time to the project in a super helpful way!
## SanicConnoissuer_91: Built the 22.08a .CIA (and several others). Thanks a bunch, dude!
## creepyguy: Compiled 1.0.0, since I couldn't. He's awesome, go check him out on [Scratch](https://scratch.mit.edu/users/creepyguy256/)
# creepyguy: Compiled 1.0.0, since I couldn't. He's awesome, go check him out on [Scratch](https://scratch.mit.edu/users/creepyguy256/)
- @ghoulslash: A lot of the features here are directly from [ghoulslash/pokeemerald](https://github.com/ghoulslash/pokeemerald.git) and its many amazing feature branches.
- Tutorial authors: ~~Some~~ Most features were adapted from code in the [tutorials](https://github.com/pret/pokeemerald/wiki/Tutorials/) in [pret](https://github.com/pret/)'s wiki.

3
FAQ.md
View File

@ -1,3 +0,0 @@
## FAQ
Any important questions that I feel need answering will be added here.

View File

@ -13,9 +13,4 @@ titles and update them while still remaining faithful to the original games.
* The keyboard prompt automatically switches to lowercase after the first character.
* Dynamic trade names have been implemented: rather than pulling trade Pokemon info from a list, it pulls from the Pokemon's data instead.
* The "move grammar" table leftover from the Japanese versions has been completely nuked, making the game faster.
* Pokémon Center receptionists now heal your Pokémon without prompt, and you turn around once the process is over to avoid accidentally healing again
* Default options have been changed to make the game quicker.
* The Aurora Ticket, Mystic Ticket, and Old Sea Map have been reimplemented:
* For the tickets, beat Wallace and talk to the girl who originally blocks Route 101 back in Littleroot Town.
* For the map, beat Wallace and talk to the fisherman who gives you the Old Rod, telling him that fishing is "not so good."
* The Fairy type from Generation VI+ has been added.
*

View File

@ -5,11 +5,11 @@ These instructions explain how to set up the tools required to build **tumbledem
These instructions come with notes which can be expanded by clicking the "<i>Note...</i>" text.
In general, you should not need to open these unless if you get an error or if you need additional clarification.
If you run into trouble, ask for help.
If you run into trouble, ask for help on Matrix.
## Windows
Windows has instructions for building with three possible terminals, providing 3 different options in case the user stumbles upon unexpected errors.
- [Windows 10 and 11 (WSL1)](#windows-10-and-11-wsl1) (**Fastest, highly recommended**, Windows 10 and later only)
- [Windows 10 (WSL1)](#windows-10-wsl1) (**Fastest, highly recommended**, Windows 10 and later only)
- [Windows (msys2)](#windows-msys2) (Second fastest)
- [Windows (Cygwin)](#windows-cygwin) (Slowest)
@ -24,9 +24,9 @@ Unscientific benchmarks suggest **msys2 is 2x slower** than WSL1, and **Cygwin i
All of the Windows instructions assume that the default drive is "C". If this differs to your actual drive letter, then replace C with the correct drive letter when reading the instructions.
**A note of caution**: As Windows 7 is officially unsupported by Microsoft and Windows 8 has very little usage, some maintainers are unwilling to maintain the Windows 7/8 instructions. Thus, these instructions may break in the future with fixes taking longer than fixes to the Windows 10 and 11 instructions.
**A note of caution**: As Windows 7 is officially unsupported by Microsoft and Windows 8 has very little usage, some maintainers are unwilling to maintain the Windows 7/8 instructions. Thus, these instructions may break in the future with fixes taking longer than fixes to the Windows 10 instructions.
## Windows 10 and 11 (WSL1)
## Windows 10 (WSL1)
WSL1 is the preferred terminal to build **tumbledemerald**. The following instructions will explain how to install WSL1 (referred to interchangeably as WSL).
- If WSL (Debian or Ubuntu) is **not installed**, then go to [Installing WSL1](#Installing-WSL1).
- Otherwise, if WSL is installed, but it **hasn't previously been set up for another decompilation project**, then go to [Setting up WSL1](#Setting-up-WSL1).
@ -109,7 +109,7 @@ cd /mnt/c/Users/<user>/Desktop/decomps
If this works, then proceed to [Installation](#installation).
Otherwise, ask for help, or continue reading below for [Windows instructions using msys2](#windows-msys2).
Otherwise, ask for help on Matrix, or continue reading below for [Windows instructions using msys2](#windows-msys2).
## Windows (msys2)
@ -149,7 +149,7 @@ cd Desktop/decomps
If this works, then proceed to [Installation](#installation).
Otherwise, ask for help, or continue reading below for [Windows instructions using Cygwin](#windows-cygwin).
Otherwise, ask for help on Matrix, or continue reading below for [Windows instructions using Cygwin](#windows-cygwin).
## Windows (Cygwin)
1. If devkitARM is **not installed**, then follow the instructions used to [install devkitARM](#installing-devkitarm) for the msys2 setup before continuing. *Remember to not continue following the msys2 instructions by mistake!*
@ -217,7 +217,7 @@ Note that the directory **must exist** in Windows. If you want to store tumblede
> Note 2: Windows path names are case-insensitive so adhering to capitalization isn't needed
</details>
If this works, then proceed to [Installation](#installation). Otherwise, ask for help.
If this works, then proceed to [Installation](#installation). Otherwise, ask for help on Matrix.
## macOS
1. If the Xcode Command Line Tools are not installed, download the tools [here](https://developer.apple.com/xcode/resources/), open your Terminal, and run the following command:
@ -287,7 +287,7 @@ Note that the directory **must exist** in the folder system. If you want to stor
> Note: If the path has spaces, then the path must be wrapped with quotations, e.g. `cd "Desktop/decomp folder"`
</details>
If this works, then proceed to [Installation](#installation). Otherwise, ask for help.
If this works, then proceed to [Installation](#installation). Otherwise, ask for help on Matrix.
## Linux
Open Terminal and enter the following commands, depending on which distro you're using.
@ -346,7 +346,7 @@ _(Specific instructions for other distributions would be greatly appreciated!)_
### Choosing where to store tumbledemerald (Linux)
At this point, you can choose a folder to store tumbledemerald (and agbcc) into. If so, you'll have to account for the modified folder path when changing directory to the tumbledemerald folder.
If this works, then proceed to [Installation](#installation). Otherwise, ask for help.
If this works, then proceed to [Installation](#installation). Otherwise, ask for help on Matrix.
## Installation
@ -361,7 +361,7 @@ If this works, then proceed to [Installation](#installation). Otherwise, ask for
1. If tumbledemerald is not already downloaded (some users may prefer to download tumbledemerald via a git client like GitHub Desktop), run:
```bash
git clone https://gitgud.io/tbld/game.git -c http.sslVerify false --recursive
git clone https://gitlab.com/tbld/game.git
```
<details>
@ -376,42 +376,31 @@ If this works, then proceed to [Installation](#installation). Otherwise, ask for
> ```
> Where *\<folder where tumbledemerald is to be stored>* is the path of the folder [where you chose to store tumbledemerald](#Choosing-where-to-store-tumbledemerald-WSL1). Then run the `git clone` command again.
</details>
<details>
<summary><i>Why disable SSL when cloning?</i></summary>
> GitGud's servers don't seem to allow cloning over https for some
> reason. The `-c http.sslVerify false` part of the above command
> ensures that cloning works properly, but may be a security risk.
> Don't be a stupid.
</details>
2. Install agbcc into tumbledemerald. The commands to run depend on certain conditions. **You should only follow one of the listed instructions**:
- If agbcc has **not been built before** in the folder where you chose to store tumbledemerald, run the following commands to build and install it into tumbledemerald:
```bash
cd <path to tumbledemerald>
git clone https://github.com/pret/agbcc
cd agbcc
./build.sh
./install.sh ../
./install.sh ../tumbledemerald
```
- **Otherwise**, if agbcc has been built before, but was **last built on a different terminal** than the one currently used (only relevant to Windows, e.g. switching from msys2 to WSL1), then run the following commands to build and install it into tumbledemerald:
- **Otherwise**, if agbcc has been built before (e.g. if the git clone above fails), but was **last built on a different terminal** than the one currently used (only relevant to Windows, e.g. switching from msys2 to WSL1), then run the following commands to build and install it into tumbledemerald:
```bash
cd <path to tumbledemerald>
cd agbcc
git clean -fX
./build.sh
./install.sh ../
./install.sh ../tumbledemerald
```
- **Otherwise**, if agbcc has been built before on the same terminal, run the following commands to install agbcc into tumbledemerald:
```bash
cd <path to tumbledemerald>
cd agbcc
./install.sh ../
./install.sh ../tumbledemerald
```
<details>
@ -434,7 +423,7 @@ cd tumbledemerald
```
To build **tumbledemerald.gba** (Note: to speed up builds, see [Parallel builds](#parallel-builds)):
```bash
make
make compare
```
If you see something like:
```bash
@ -446,6 +435,10 @@ then the build was successful.
> If you switched terminals since the last build (e.g. from msys2 to WSL1), you must run `make clean-tools` once before any subsequent `make` commands.
</details>
To build **tumbledemerald.gba** with your changes:
```bash
make
```
# Building guidance

351
Makefile
View File

@ -1,34 +1,13 @@
TOOLCHAIN := $(DEVKITARM)
COMPARE ?= 0
ifeq (compare,$(MAKECMDGOALS))
COMPARE := 1
endif
# don't use dkP's base_tools anymore
# because the redefinition of $(CC) conflicts
# with when we want to use $(CC) to preprocess files
# thus, manually create the variables for the bin
# files, or use arm-none-eabi binaries on the system
# if dkP is not installed on this system
ifneq (,$(TOOLCHAIN))
ifneq ($(wildcard $(TOOLCHAIN)/bin),)
export PATH := $(TOOLCHAIN)/bin:$(PATH)
endif
endif
PREFIX := arm-none-eabi-
PREFIX :=
OBJCOPY := $(PREFIX)objcopy
OBJDUMP := $(PREFIX)objdump
CC := $(PREFIX)gcc
AS := $(PREFIX)as
LD := $(PREFIX)ld
SDL_DIR := /k/gba/pokeemerald-pc/SDL-1.2.15
ASM_PSEUDO_OP_CONV := sed -e 's/\.4byte/\.int/g;s/\.2byte/\.short/g'
# note: the makefile must be set up so MODERNCC is never called
# if MODERN=0
MODERNCC := $(PREFIX)gcc
PATH_MODERNCC := PATH=$(TOOLCHAIN)/bin:PATH $(MODERNCC)
export CPP := $(PREFIX)cpp
export LD := $(PREFIX)ld
ifeq ($(OS),Windows_NT)
EXE := .exe
@ -36,91 +15,41 @@ else
EXE :=
endif
TITLE := POKEMON EMER
GAME_CODE := BPEE
MAKER_CODE := 01
REVISION := 0
MODERN ?= 0
ifeq (modern,$(MAKECMDGOALS))
MODERN := 1
endif
# use arm-none-eabi-cpp for macOS
# as macOS's default compiler is clang
# and clang's preprocessor will warn on \u
# when preprocessing asm files, expecting a unicode literal
# we can't unconditionally use arm-none-eabi-cpp
# as installations which install binutils-arm-none-eabi
# don't come with it
ifneq ($(MODERN),1)
ifeq ($(shell uname -s),Darwin)
CPP := $(PREFIX)cpp
else
CPP := $(CC) -E
endif
else
CPP := $(PREFIX)cpp
endif
ROM_NAME := tumbledemerald.gba
ELF_NAME := $(ROM_NAME:.gba=.elf)
MAP_NAME := $(ROM_NAME:.gba=.map)
OBJ_DIR_NAME := build/tumbled
MODERN_ROM_NAME := tumbledemerald_modern.gba
MODERN_ELF_NAME := $(MODERN_ROM_NAME:.gba=.elf)
MODERN_MAP_NAME := $(MODERN_ROM_NAME:.gba=.map)
MODERN_OBJ_DIR_NAME := build/modern
MODERN := 1
SHELL := /bin/bash -o pipefail
ELF = $(ROM:.gba=.elf)
MAP = $(ROM:.gba=.map)
SYM = $(ROM:.gba=.sym)
C_SUBDIR = src
GFLIB_SUBDIR = gflib
ASM_SUBDIR = asm
DATA_SRC_SUBDIR = src/data
DATA_ASM_SUBDIR = data
SONG_SUBDIR = sound/songs
MID_SUBDIR = sound/songs/midi
SAMPLE_SUBDIR = sound/direct_sound_samples
CRY_SUBDIR = sound/direct_sound_samples/cries
C_BUILDDIR = $(OBJ_DIR)/$(C_SUBDIR)
GFLIB_BUILDDIR = $(OBJ_DIR)/$(GFLIB_SUBDIR)
ASM_BUILDDIR = $(OBJ_DIR)/$(ASM_SUBDIR)
DATA_ASM_BUILDDIR = $(OBJ_DIR)/$(DATA_ASM_SUBDIR)
SONG_BUILDDIR = $(OBJ_DIR)/$(SONG_SUBDIR)
MID_BUILDDIR = $(OBJ_DIR)/$(MID_SUBDIR)
ASFLAGS := -mcpu=arm7tdmi --defsym MODERN=$(MODERN)
ASFLAGS := --32 --defsym MODERN=$(MODERN) --defsym PORTABLE=1
ifeq ($(MODERN),0)
CC1 := tools/agbcc/bin/agbcc$(EXE)
override CFLAGS += -mthumb-interwork -Wimplicit -Wparentheses -Werror -O2 -fhex-asm -g
ROM := $(ROM_NAME)
OBJ_DIR := $(OBJ_DIR_NAME)
LIBPATH := -L ../../tools/agbcc/lib
LIB := $(LIBPATH) -lgcc -lc -L../../libagbsyscall -lagbsyscall
else
CC1 = $(shell $(PATH_MODERNCC) --print-prog-name=cc1) -quiet
override CFLAGS += -mthumb -mthumb-interwork -O2 -mabi=apcs-gnu -mtune=arm7tdmi -march=armv4t -fno-toplevel-reorder -Wno-pointer-to-int-cast -g
ROM := $(MODERN_ROM_NAME)
OBJ_DIR := $(MODERN_OBJ_DIR_NAME)
LIBPATH := -L "$(dir $(shell $(PATH_MODERNCC) -mthumb -print-file-name=libgcc.a))" -L "$(dir $(shell $(PATH_MODERNCC) -mthumb -print-file-name=libnosys.a))" -L "$(dir $(shell $(PATH_MODERNCC) -mthumb -print-file-name=libc.a))"
LIB := $(LIBPATH) -lc -lnosys -lgcc -L../../libagbsyscall -lagbsyscall
endif
GCC_VER := $(shell $(CC) -dumpversion)
CPPFLAGS := -iquote include -iquote $(GFLIB_SUBDIR) -Wno-trigraphs -DMODERN=$(MODERN)
ifneq ($(MODERN),1)
CPPFLAGS += -I tools/agbcc/include -I tools/agbcc -nostdinc -undef
endif
CC1 := $(shell $(PREFIX)gcc --print-prog-name=cc1) -quiet
override CFLAGS += -Wno-trigraphs -Wimplicit -Wparentheses -Wunused -O0 -g -m32 -std=gnu99 -fno-leading-underscore -fno-dce -Wno-unused-function -DPORTABLE -DNONMATCHING
ROM := pokeemerald_modern.gba
OBJ_DIR := build/pc
CPPFLAGS := -iquote include -Wno-trigraphs -D NONMATCHING -D PORTABLE -I$(SDL_DIR)/include -L$(SDL_DIR)/lib
LDFLAGS = -Map ../../$(MAP)
LIB := $(LIBPATH) -lgcc -lc
SHA1 := $(shell { command -v sha1sum || command -v shasum; } 2>/dev/null) -c
GFX := tools/gbagfx/gbagfx$(EXE)
AIF := tools/aif2pcm/aif2pcm$(EXE)
@ -132,14 +61,6 @@ FIX := tools/gbafix/gbafix$(EXE)
MAPJSON := tools/mapjson/mapjson$(EXE)
JSONPROC := tools/jsonproc/jsonproc$(EXE)
PERL := perl
TOOLDIRS := $(filter-out tools/agbcc tools/binutils,$(wildcard tools/*))
TOOLBASE = $(TOOLDIRS:tools/%=%)
TOOLS = $(foreach tool,$(TOOLBASE),tools/$(tool)/$(tool)$(EXE))
MAKEFLAGS += --no-print-directory
# Clear the default suffixes
.SUFFIXES:
# Don't delete intermediate files
@ -150,50 +71,14 @@ MAKEFLAGS += --no-print-directory
# Secondary expansion is required for dependency variables in object rules.
.SECONDEXPANSION:
.PHONY: all rom clean compare tidy tools mostlyclean clean-tools $(TOOLDIRS) berry_fix libagbsyscall modern tidymodern tidynonmodern
.PHONY: rom clean compare tidy tools mostlyclean clean-tools
infoshell = $(foreach line, $(shell $1 | sed "s/ /__SPACE__/g"), $(info $(subst __SPACE__, ,$(line))))
# Build tools when building the rom
# Disable dependency scanning for clean/tidy/tools
# Use a separate minimal makefile for speed
# Since we don't need to reload most of this makefile
ifeq (,$(filter-out all rom compare modern berry_fix libagbsyscall syms,$(MAKECMDGOALS)))
$(call infoshell, $(MAKE) -f make_tools.mk)
else
NODEP ?= 1
endif
# check if we need to scan dependencies based on the rule
ifeq (,$(MAKECMDGOALS))
SCAN_DEPS ?= 1
else
# clean, tidy, tools, mostlyclean, clean-tools, $(TOOLDIRS), tidymodern, tidynonmodern don't even build the ROM
# berry_fix and libagbsyscall do their own thing
ifeq (,$(filter-out clean tidy tools mostlyclean clean-tools $(TOOLDIRS) tidymodern tidynonmodern berry_fix libagbsyscall,$(MAKECMDGOALS)))
SCAN_DEPS ?= 0
else
SCAN_DEPS ?= 1
endif
endif
ifeq ($(SCAN_DEPS),1)
C_SRCS_IN := $(wildcard $(C_SUBDIR)/*.c $(C_SUBDIR)/*/*.c $(C_SUBDIR)/*/*/*.c)
C_SRCS := $(foreach src,$(C_SRCS_IN),$(if $(findstring .inc.c,$(src)),,$(src)))
C_SRCS := $(wildcard $(C_SUBDIR)/*.c $(C_SUBDIR)/*/*.c $(C_SUBDIR)/*/*/*.c)
C_OBJS := $(patsubst $(C_SUBDIR)/%.c,$(C_BUILDDIR)/%.o,$(C_SRCS))
GFLIB_SRCS := $(wildcard $(GFLIB_SUBDIR)/*.c)
GFLIB_OBJS := $(patsubst $(GFLIB_SUBDIR)/%.c,$(GFLIB_BUILDDIR)/%.o,$(GFLIB_SRCS))
C_ASM_SRCS += $(wildcard $(C_SUBDIR)/*.s $(C_SUBDIR)/*/*.s $(C_SUBDIR)/*/*/*.s)
C_ASM_OBJS := $(patsubst $(C_SUBDIR)/%.s,$(C_BUILDDIR)/%.o,$(C_ASM_SRCS))
ASM_SRCS := $(wildcard $(ASM_SUBDIR)/*.s)
#ASM_SRCS := $(wildcard $(ASM_SUBDIR)/*.s)
ASM_OBJS := $(patsubst $(ASM_SUBDIR)/%.s,$(ASM_BUILDDIR)/%.o,$(ASM_SRCS))
# get all the data/*.s files EXCEPT the ones with specific rules
REGULAR_DATA_ASM_SRCS := $(filter-out $(DATA_ASM_SUBDIR)/maps.s $(DATA_ASM_SUBDIR)/map_events.s, $(wildcard $(DATA_ASM_SUBDIR)/*.s))
DATA_ASM_SRCS := $(wildcard $(DATA_ASM_SUBDIR)/*.s)
DATA_ASM_OBJS := $(patsubst $(DATA_ASM_SUBDIR)/%.s,$(DATA_ASM_BUILDDIR)/%.o,$(DATA_ASM_SRCS))
@ -203,61 +88,51 @@ SONG_OBJS := $(patsubst $(SONG_SUBDIR)/%.s,$(SONG_BUILDDIR)/%.o,$(SONG_SRCS))
MID_SRCS := $(wildcard $(MID_SUBDIR)/*.mid)
MID_OBJS := $(patsubst $(MID_SUBDIR)/%.mid,$(MID_BUILDDIR)/%.o,$(MID_SRCS))
OBJS := $(C_OBJS) $(GFLIB_OBJS) $(C_ASM_OBJS) $(ASM_OBJS) $(DATA_ASM_OBJS) $(SONG_OBJS) $(MID_OBJS)
OBJS := $(C_OBJS) $(ASM_OBJS) $(DATA_ASM_OBJS) $(SONG_OBJS) $(MID_OBJS)
OBJS_REL := $(patsubst $(OBJ_DIR)/%,%,$(OBJS))
SUBDIRS := $(sort $(dir $(OBJS)))
$(shell mkdir -p $(SUBDIRS))
endif
AUTO_GEN_TARGETS :=
all: rom
TOOLDIRS := $(filter-out tools/agbcc tools/binutils,$(wildcard tools/*))
TOOLBASE = $(TOOLDIRS:tools/%=%)
TOOLS = $(foreach tool,$(TOOLBASE),tools/%(tool)/$(tool)$(EXE))
tools: $(TOOLDIRS)
$(shell mkdir -p $(SUBDIRS))
syms: $(SYM)
all: tools rom
$(TOOLDIRS):
@$(MAKE) -C $@
tools: $(TOOLS)
$(TOOLS):
@$(foreach tooldir,$(TOOLDIRS),$(MAKE) -C $(tooldir);)
rom: $(ROM)
ifeq ($(COMPARE),1)
@$(SHA1) rom.sha1
endif
# For contributors to make sure a change didn't affect the contents of the ROM.
compare: all
@$(SHA1) rom.sha1
clean: mostlyclean clean-tools
clean-tools:
@$(foreach tooldir,$(TOOLDIRS),$(MAKE) clean -C $(tooldir);)
mostlyclean: tidynonmodern tidymodern
rm -f $(SAMPLE_SUBDIR)/*.bin
rm -f $(CRY_SUBDIR)/*.bin
mostlyclean: tidy
rm -f sound/direct_sound_samples/*.bin
rm -f $(MID_SUBDIR)/*.s
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 '*.latfont' -o -iname '*.hwjpnfont' -o -iname '*.fwjpnfont' \) -exec rm {} +
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
find $(DATA_ASM_SUBDIR)/maps \( -iname 'connections.inc' -o -iname 'events.inc' -o -iname 'header.inc' \) -exec rm {} +
rm -f $(AUTO_GEN_TARGETS)
@$(MAKE) clean -C berry_fix
@$(MAKE) clean -C libagbsyscall
tidy: tidynonmodern tidymodern
tidynonmodern:
rm -f $(ROM_NAME) $(ELF_NAME) $(MAP_NAME)
rm -rf $(OBJ_DIR_NAME)
tidymodern:
rm -f $(MODERN_ROM_NAME) $(MODERN_ELF_NAME) $(MODERN_MAP_NAME)
rm -rf $(MODERN_OBJ_DIR_NAME)
ifneq ($(MODERN),0)
$(C_BUILDDIR)/berry_crush.o: override CFLAGS += -Wno-address-of-packed-member
tidy:
rm -f $(ROM) $(ELF) $(MAP)
rm -r $(OBJ_DIR)
ifeq ($(MODERN),0)
@$(MAKE) tidy MODERN=1
endif
include graphics_file_rules.mk
@ -278,129 +153,44 @@ include songs.mk
%.gbapal: %.png ; $(GFX) $< $@
%.lz: % ; $(GFX) $< $@
%.rl: % ; $(GFX) $< $@
$(CRY_SUBDIR)/%.bin: $(CRY_SUBDIR)/%.aif ; $(AIF) $< $@ --compress
sound/direct_sound_samples/cry_%.bin: sound/direct_sound_samples/cry_%.aif ; $(AIF) $< $@ --compress
sound/%.bin: sound/%.aif ; $(AIF) $< $@
ifeq ($(MODERN),0)
$(C_BUILDDIR)/libc.o: CC1 := tools/agbcc/bin/old_agbcc$(EXE)
$(C_BUILDDIR)/libc.o: CFLAGS := -O2
%src/platform/sdl2.o: CFLAGS += -fleading-underscore -O3
$(C_BUILDDIR)/siirtc.o: CFLAGS := -mthumb-interwork
$(C_BUILDDIR)/agb_flash.o: CFLAGS := -O -mthumb-interwork
$(C_BUILDDIR)/agb_flash_1m.o: CFLAGS := -O -mthumb-interwork
$(C_BUILDDIR)/agb_flash_mx.o: CFLAGS := -O -mthumb-interwork
$(C_BUILDDIR)/m4a.o: CC1 := tools/agbcc/bin/old_agbcc$(EXE)
$(C_BUILDDIR)/record_mixing.o: CFLAGS += -ffreestanding
$(C_BUILDDIR)/librfu_intr.o: CC1 := tools/agbcc/bin/agbcc_arm$(EXE)
$(C_BUILDDIR)/librfu_intr.o: CFLAGS := -O2 -mthumb-interwork -quiet
else
$(C_BUILDDIR)/librfu_intr.o: CFLAGS := -mthumb-interwork -O2 -mabi=apcs-gnu -mtune=arm7tdmi -march=armv4t -fno-toplevel-reorder -Wno-pointer-to-int-cast
endif
ifeq ($(DDEBUG), 1)
override ASFLAGS += --defsym DEBUG=1
override CPPFLAGS += -D DEBUG=1
endif
ifeq ($(DINFO),1)
override CFLAGS += -g
endif
# The dep rules have to be explicit or else missing files won't be reported.
# As a side effect, they're evaluated immediately instead of when the rule is invoked.
# It doesn't look like $(shell) can be deferred so there might not be a better way.
ifeq ($(SCAN_DEPS),1)
ifeq ($(NODEP),1)
$(C_BUILDDIR)/%.o: $(C_SUBDIR)/%.c
ifeq (,$(KEEP_TEMPS))
@echo "$(CC1) <flags> -o $@ $<"
@$(CPP) $(CPPFLAGS) $< | $(PREPROC) $< charmap.txt -i | $(CC1) $(CFLAGS) -o - - | cat - <(echo -e ".text\n\t.align\t2, 0") | $(AS) $(ASFLAGS) -o $@ -
$(C_BUILDDIR)/%.o: c_dep :=
else
$(C_BUILDDIR)/%.o: c_dep = $(shell $(SCANINC) -I include $(C_SUBDIR)/$*.c)
endif
$(C_BUILDDIR)/%.o : $(C_SUBDIR)/%.c $$(c_dep)
@$(CPP) $(CPPFLAGS) $< -o $(C_BUILDDIR)/$*.i
@$(PREPROC) $(C_BUILDDIR)/$*.i charmap.txt | $(CC1) $(CFLAGS) -o $(C_BUILDDIR)/$*.s
@echo -e ".text\n\t.align\t2, 0\n" >> $(C_BUILDDIR)/$*.s
$(AS) $(ASFLAGS) -o $@ $(C_BUILDDIR)/$*.s
endif
else
define C_DEP
$1: $2 $$(shell $(SCANINC) -I include -I tools/agbcc/include -I gflib $2)
ifeq (,$$(KEEP_TEMPS))
@echo "$$(CC1) <flags> -o $$@ $$<"
@$$(CPP) $$(CPPFLAGS) $$< | $$(PREPROC) $$< charmap.txt -i | $$(CC1) $$(CFLAGS) -o - - | cat - <(echo -e ".text\n\t.align\t2, 0") | $$(AS) $$(ASFLAGS) -o $$@ -
else
@$$(CPP) $$(CPPFLAGS) $$< -o $$(C_BUILDDIR)/$3.i
@$$(PREPROC) $$(C_BUILDDIR)/$3.i charmap.txt | $$(CC1) $$(CFLAGS) -o $$(C_BUILDDIR)/$3.s
@echo -e ".text\n\t.align\t2, 0\n" >> $$(C_BUILDDIR)/$3.s
$$(AS) $$(ASFLAGS) -o $$@ $$(C_BUILDDIR)/$3.s
endif
endef
$(foreach src, $(C_SRCS), $(eval $(call C_DEP,$(patsubst $(C_SUBDIR)/%.c,$(C_BUILDDIR)/%.o,$(src)),$(src),$(patsubst $(C_SUBDIR)/%.c,%,$(src)))))
endif
ifeq ($(NODEP),1)
$(GFLIB_BUILDDIR)/%.o: $(GFLIB_SUBDIR)/%.c $$(c_dep)
ifeq (,$(KEEP_TEMPS))
@echo "$(CC1) <flags> -o $@ $<"
@$(CPP) $(CPPFLAGS) $< | $(PREPROC) $< charmap.txt -i | $(CC1) $(CFLAGS) -o - - | cat - <(echo -e ".text\n\t.align\t2, 0") | $(AS) $(ASFLAGS) -o $@ -
$(ASM_BUILDDIR)/%.o: asm_dep :=
else
@$(CPP) $(CPPFLAGS) $< -o $(GFLIB_BUILDDIR)/$*.i
@$(PREPROC) $(GFLIB_BUILDDIR)/$*.i charmap.txt | $(CC1) $(CFLAGS) -o $(GFLIB_BUILDDIR)/$*.s
@echo -e ".text\n\t.align\t2, 0\n" >> $(GFLIB_BUILDDIR)/$*.s
$(AS) $(ASFLAGS) -o $@ $(GFLIB_BUILDDIR)/$*.s
endif
else
define GFLIB_DEP
$1: $2 $$(shell $(SCANINC) -I include -I tools/agbcc/include -I gflib $2)
ifeq (,$$(KEEP_TEMPS))
@echo "$$(CC1) <flags> -o $$@ $$<"
@$$(CPP) $$(CPPFLAGS) $$< | $$(PREPROC) $$< charmap.txt -i | $$(CC1) $$(CFLAGS) -o - - | cat - <(echo -e ".text\n\t.align\t2, 0") | $$(AS) $$(ASFLAGS) -o $$@ -
else
@$$(CPP) $$(CPPFLAGS) $$< -o $$(GFLIB_BUILDDIR)/$3.i
@$$(PREPROC) $$(GFLIB_BUILDDIR)/$3.i charmap.txt | $$(CC1) $$(CFLAGS) -o $$(GFLIB_BUILDDIR)/$3.s
@echo -e ".text\n\t.align\t2, 0\n" >> $$(GFLIB_BUILDDIR)/$3.s
$$(AS) $$(ASFLAGS) -o $$@ $$(GFLIB_BUILDDIR)/$3.s
endif
endef
$(foreach src, $(GFLIB_SRCS), $(eval $(call GFLIB_DEP,$(patsubst $(GFLIB_SUBDIR)/%.c,$(GFLIB_BUILDDIR)/%.o, $(src)),$(src),$(patsubst $(GFLIB_SUBDIR)/%.c,%, $(src)))))
$(ASM_BUILDDIR)/%.o: asm_dep = $(shell $(SCANINC) -I "" $(ASM_SUBDIR)/$*.s)
endif
ifeq ($(NODEP),1)
$(C_BUILDDIR)/%.o: $(C_SUBDIR)/%.s
$(PREPROC) $< charmap.txt | $(CPP) -I include - | $(AS) $(ASFLAGS) -o $@
else
define SRC_ASM_DATA_DEP
$1: $2 $$(shell $(SCANINC) -I include -I "" $2)
$$(PREPROC) $$< charmap.txt | $$(CPP) -I include - | $$(AS) $$(ASFLAGS) -o $$@
endef
$(foreach src, $(C_ASM_SRCS), $(eval $(call SRC_ASM_DATA_DEP,$(patsubst $(C_SUBDIR)/%.s,$(C_BUILDDIR)/%.o, $(src)),$(src))))
endif
ifeq ($(NODEP),1)
$(ASM_BUILDDIR)/%.o: $(ASM_SUBDIR)/%.s
$(ASM_BUILDDIR)/%.o: $(ASM_SUBDIR)/%.s $$(asm_dep)
$(AS) $(ASFLAGS) -o $@ $<
else
define ASM_DEP
$1: $2 $$(shell $(SCANINC) -I include -I "" $2)
$$(AS) $$(ASFLAGS) -o $$@ $$<
endef
$(foreach src, $(ASM_SRCS), $(eval $(call ASM_DEP,$(patsubst $(ASM_SUBDIR)/%.s,$(ASM_BUILDDIR)/%.o, $(src)),$(src))))
endif
ifeq ($(NODEP),1)
$(DATA_ASM_BUILDDIR)/%.o: $(DATA_ASM_SUBDIR)/%.s
$(PREPROC) $< charmap.txt | $(CPP) -I include - | $(AS) $(ASFLAGS) -o $@
$(DATA_ASM_BUILDDIR)/%.o: data_dep :=
else
$(foreach src, $(REGULAR_DATA_ASM_SRCS), $(eval $(call SRC_ASM_DATA_DEP,$(patsubst $(DATA_ASM_SUBDIR)/%.s,$(DATA_ASM_BUILDDIR)/%.o, $(src)),$(src))))
endif
$(DATA_ASM_BUILDDIR)/%.o: data_dep = $(shell $(SCANINC) -I include -I "" $(DATA_ASM_SUBDIR)/$*.s)
endif
$(DATA_ASM_BUILDDIR)/%.o: $(DATA_ASM_SUBDIR)/%.s $$(data_dep)
$(PREPROC) $< charmap.txt | $(CPP) -I include | $(ASM_PSEUDO_OP_CONV) | $(AS) $(ASFLAGS) -o $@
$(SONG_BUILDDIR)/%.o: $(SONG_SUBDIR)/%.s
$(AS) $(ASFLAGS) -I sound -o $@ $<
$(ASM_PSEUDO_OP_CONV) $< | $(AS) $(ASFLAGS) -I sound -o $@
$(OBJ_DIR)/sym_bss.ld: sym_bss.txt
$(RAMSCRGEN) .bss $< ENGLISH > $@
@ -422,28 +212,17 @@ endif
$(OBJ_DIR)/ld_script.ld: $(LD_SCRIPT) $(LD_SCRIPT_DEPS)
cd $(OBJ_DIR) && sed "s#tools/#../../tools/#g" ../../$(LD_SCRIPT) > ld_script.ld
$(ELF): $(OBJ_DIR)/ld_script.ld $(OBJS) berry_fix libagbsyscall
@echo "cd $(OBJ_DIR) && $(LD) $(LDFLAGS) -T ld_script.ld -o ../../$@ <objects> <lib>"
@cd $(OBJ_DIR) && $(LD) $(LDFLAGS) -T ld_script.ld -o ../../$@ $(OBJS_REL) $(LIB)
$(ELF): $(OBJ_DIR)/ld_script.ld $(OBJS)
cd $(OBJ_DIR) && $(LD) $(LDFLAGS) -T ld_script.ld -o ../../$@ $(OBJS_REL) $(LIB)
$(FIX) $@ -t"$(TITLE)" -c$(GAME_CODE) -m$(MAKER_CODE) -r$(REVISION) --silent
#$(ROM): $(ELF)
#$(OBJCOPY) -O binary $< $@
#$(FIX) $@ -p --silent
$(ROM): $(ELF)
$(OBJCOPY) -O binary $< $@
$(FIX) $@ -p --silent
pokeemerald.exe: $(OBJS)
$(CC) $(CFLAGS) -Wl,--demangle $^ -L$(SDL_DIR)/lib -lmingw32 -lSDLmain -lSDL.dll -lwinmm -static-libgcc -o $@
modern: all
$(ROM): pokeemerald.exe
@:
berry_fix/berry_fix.gba: berry_fix
berry_fix:
@$(MAKE) -C berry_fix COMPARE=$(COMPARE) TOOLCHAIN=$(TOOLCHAIN) MODERN=$(MODERN)
libagbsyscall:
@$(MAKE) -C libagbsyscall TOOLCHAIN=$(TOOLCHAIN) MODERN=$(MODERN)
###################
### Symbol file ###
###################
$(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' > $@
modern: ; @$(MAKE) MODERN=1

101
README.md
View File

@ -1,82 +1,39 @@
# tumbledemerald
# tumbledemerald [![Chat on Matrix](https://matrix.to/img/matrix-badge.svg)](https://matrix.to/#/#rebirthteam:matrix.org)
## Description
tumbledemerald is a hack based on the [decompilation](https://github.com/pret/pokeemerald) of Pokémon Emerald by pret. The project's aim is to modify Pokémon Emerald to bring it up to the standards of modern Pokémon titles.
This is a decompilation of Pokémon Emerald, with many improvements and edits, similar to Rangi42's [polishedcrystal](https://github.com/Rangi42/polishedcrystal)
It builds the following ROM:
**tumbledemerald.gba**
To set up the repository, see [INSTALL.md](INSTALL.md), or see our `utilities` repo for buildscripts
[<img src="https://img.shields.io/badge/Gitpod-Open%20workspace-orange.svg?logo=GITPOD&style=for-the-badge">](https://gitpod.io/#gitgud.io/tbld/game.git) [<img src="https://img.shields.io/badge/Mastodon-gray.svg?logo=MASTODON&style=for-the-badge">](https://social.linux.pizza/@sataa)
Here is the last time Tumbled was updated to `pret:master`
## Installation
Compiling tumbledemerald requires a Linux-based system with the following packages installed:
**20 December 2021**
- make (or GNU make, if you have access to it specifically.)
- gcc
- g++
- git
- GNU arm-none-eabi binutils
## See also
(Bonus points for getting it to work with Clang, cmake, and non-GNU binutils, because rms gives me a headache.)
Other disassembly and/or decompilation projects:
* [**Pokémon Red and Blue**](https://github.com/pret/pokered)
* [**Pokémon Gold and Silver (Space World '97 demo)**](https://github.com/pret/pokegold-spaceworld)
* [**Pokémon Yellow**](https://github.com/pret/pokeyellow)
* [**Pokémon Trading Card Game**](https://github.com/pret/poketcg)
* [**Pokémon Pinball**](https://github.com/pret/pokepinball)
* [**Pokémon Stadium**](https://github.com/pret/pokestadium)
* [**Pokémon Gold and Silver**](https://github.com/pret/pokegold)
* [**Pokémon Crystal**](https://github.com/pret/pokecrystal)
* [**Pokémon Ruby and Sapphire**](https://github.com/pret/pokeruby)
* [**Pokémon Pinball: Ruby & Sapphire**](https://github.com/pret/pokepinballrs)
* [**Pokémon FireRed and LeafGreen**](https://github.com/pret/pokefirered)
* [**Pokémon Mystery Dungeon: Red Rescue Team**](https://github.com/pret/pmd-red)
* [**Pokémon Diamond and Pearl**](https://github.com/pret/pokediamond)
* [**Pokémon HeartGold and SoulSilver**](https://github.com/pret/pokeheartgold)
Run this command to compile `agbcc`, pret's toolchain:
```bash
cd <path to tumbledemerald>/agbcc && ./build.sh && ./install.sh ../
```
Then just run `make` in the root folder of the repository.
If you're new to Linux-based systems or the build system in general, I recommend using Gitpod. If you opt to go that route, here's what you need to do:
## Contacts
- Click the "Gitpod" button above.
- If you haven't signed up for GitHub, GitLab, or Bitbucket before, follow the steps provided on Gitpod's site to set up an account.
- You should launch into a tab with a terminal window at the bottom. Wait until you see `agbcc successfully installed!` in the terminal window before continuing.
- Type "make" (without the quotes) into the terminal and press "Enter".
You can slide into my **[matrix]** PM's: @fierymewtwo:matrix.org. However, there is an official Rebirth "room" (see the **[matrix]** badge above)
For more detailed compilation instructions, see [this](INSTALL.md) document.
## Usage
tumbledemerald is a Game Boy Advance game. As such, you will need an [emulator](https://mgba.io) to play. The only supported emulator is [mGBA](https://mgba.io) by endrift.
## Support
If you:
* found a bug or glitch: Create an [issue](https://gitgud.io/tbld/game/-/issues) using the Bug template.
* need a save file updated: Create an [issue](https://gitgud.io/tbld/game/-/issues) using the Save Update template.
* have an idea for a cool new feature: Create an [issue](https://gitgud.io/tbld/game/-/issues) using the Feature Request template.
* want to contact me privately: Send me an [email](mailto:brodmoran@gmail.com) or send me a direct message on [Mastodon](https://social.linux.pizza/@sataa).
* want to become a contributor: Send a merge request!
We also have a forum [here](https://tumbledforums.flarum.cloud/) if you're into that!
## Roadmap
For the project roadmap, please check [here](ROADMAP.md).
## Contributing
Contributions are welcome! Please make a merge request here on GitLab using the provided template.
We're currently looking for:
* someone who can work with GBA music (to add a custom song).
* documentation contributions. Our documentation could use some updates!
* Windows buildscripts.
* volunteers to build CIA packages for tumbledemerald.
* debug menu developers.
* someone with a brain the size of Jupiter to un-GNU tumbledemerald.
See [Installation](#installation) for directions on how to set up your system to compile.
`make` will usually stop you if it sees something wrong with your code. If the error is too vague, try running `make` with the `-d` argument (`make -d`). However, the only way to be completely certain is to test.
## Notes
By default, tumbledemerald does not include Wireless Adapter support. See [this script](https://gitgud.io/tbld/scripts/-/blob/main/enable_rfu.sh) to re-enable this (for playing on a Game Boy Advance flashcart, for example.)
## Authors and acknowledgment
Lead developers: Supersonic and Werewolf
CIA packages: Supersonic and SanicConnoissuer_91
Prebuilt ROMS: Supersonic, creepyguy256, and SanicConnoissuer_91
Features: ghoulslash, Supersonic, dunsparce9, AsparagusEduardo, surskitty, DizzyEgggg, Ketsuban (if I forgot you, please let me know!)
Special thanks: SanicConnoissuer_91, Werewolf, creepyguy256, pret, Nintendo Co, Ltd., GAME FREAK, inc., Creatures, inc., and you!.
## License
Due to legal reasons, tumbledemerald does not have a license. Ask ax6.
## Project status
tumbledemerald is actively developed, with a new feature about once every week, if I feel like it.
> The old GitHub repositories are now unmaintained, and all future development will take place on GitLab.

View File

@ -1,6 +0,0 @@
## Roadmap for tumbledemerald:
### v3
* Combine Pokémon Centers and Marts into one map, similar to the current titles.
* Remove HM moves and replace them with corresponding Key Items.

View File

@ -2,10 +2,10 @@
These guidelines are to be applied to all code contributed to the `tumbledemerald` project.
- Decapitalise everything! For example, change "POKéMON" to "Pokémon". This is almost already done thanks to the Python script, but make sure to keep an eye out!
- Decapitalise everything! For example, change "POKéMON" to "Pokémon". (not yet though)
- Always type "Pokémon" with the "é" Unicode character!
- When typing "Pokédex", make sure to type it without a capital "D".
- Use good English at all times, except when it doesn't make sense to do so.
- Use good English at all times.
- Abide by an 85-character "soft limit" per line of code. (This includes comments)
- If you decompile assembly (`.s` files) and a commit to `pret:master` later decompiles the same code, please revert your changes and add pret's
C or C++ code instead.

1
agbcc

@ -1 +0,0 @@
Subproject commit d59cfb5ac1ce13d4bc9875ffef1666b118338d33

View File

@ -1378,7 +1378,7 @@ BattleFrontier_BattleTowerLobby_Text_ExplainMultiLinkRules:
.string "The Link Multi Battle Mode is for two\n"
.string "friends to mount a challenge together.\p"
.string "You and your friend must be linked with\n"
.string "Wireless Adapters or a GBA Game Link\l"
.string "Wireless Adapters or a Gba Game Link\l"
.string "cable.\p"
.string "You must choose two Pokémon at\n"
.string "the registration counter.\p"

View File

@ -118,19 +118,6 @@ DewfordTown_EventScript_FishingExcellent::
DewfordTown_EventScript_FishingNotSoGood::
msgbox DewfordTown_Text_FishingAdvice, MSGBOX_DEFAULT
goto_if_set FLAG_SYS_GAME_CLEAR, DewfordTown_EventScript_Intermediate_GiveOldSeaMap
release
end
DewfordTown_EventScript_Intermediate_GiveOldSeaMap::
goto_if_unset FLAG_RECEIVED_OLD_SEA_MAP, DewfordTown_EventScript_GiveOldSeaMap
release
end
DewfordTown_EventScript_GiveOldSeaMap::
msgbox DewfordTown_Text_MaybeExploringWouldBeBetter, MSGBOX_DEFAULT
giveitem ITEM_OLD_SEA_MAP
setflag FLAG_RECEIVED_OLD_SEA_MAP
release
end
@ -736,12 +723,6 @@ DewfordTown_Text_ThrowInFishingAdvice:
.string "you need to time the pulls on your Rod\l"
.string "to haul them in.$"
DewfordTown_Text_MaybeExploringWouldBeBetter:
.string "Hmmm... Well, if you aren't having much\n"
.string "luck with fishing...\l"
.string "Maybe exploring would be a better\n"
.string "fit for a Trainer like you?$"
DewfordTown_Text_ThatsTooBadThen:
.string "Oh, is that so?\n"
.string "That's too bad, then.$"

View File

@ -259,7 +259,6 @@ LittlerootTown_EventScript_Twin::
faceplayer
goto_if_set FLAG_ADVENTURE_STARTED, LittlerootTown_EventScript_GoodLuck
goto_if_set FLAG_RESCUED_BIRCH, LittlerootTown_EventScript_YouSavedBirch
goto_if_set FLAG_SYS_GAME_CLEAR, LittlerootTown_EventScript_Intermediate_DustyTickets
goto_if_ne VAR_LITTLEROOT_TOWN_STATE, 0, LittlerootTown_EventScript_GoSaveBirch
msgbox LittlerootTown_Text_IfYouGoInGrassPokemonWillJumpOut, MSGBOX_DEFAULT
release
@ -286,20 +285,6 @@ LittlerootTown_EventScript_GoodLuck::
release
end
LittlerootTown_EventScript_Intermediate_DustyTickets::
goto_if_unset FLAG_AURORA_MYSTIC_RECEIVED, LittlerootTown_EventScript_DustyTickets
end
LittlerootTown_EventScript_DustyTickets::
msgbox LittlerootTown_Text_FoundTickets, MSGBOX_DEFAULT
giveitem ITEM_MYSTIC_TICKET
giveitem ITEM_AURORA_TICKET
setflag FLAG_RECEIVED_AURORA_TICKET
setflag FLAG_RECEIVED_MYSTIC_TICKET
setflag FLAG_AURORA_MYSTIC_RECEIVED @ because I'm bad at hacking.
release
end
LittlerootTown_EventScript_NeedPokemonTriggerLeft::
lockall
applymovement LOCALID_TWIN, LittlerootTown_Movement_TwinApproachPlayerLeft
@ -1012,13 +997,6 @@ LittlerootTown_Text_GoodLuckCatchingPokemon:
.string "Are you going to catch Pokémon?\n"
.string "Good luck!$"
LittlerootTown_Text_FoundTickets:
.string "Um, hi!\p"
.string "I found these in an old suitcase. My\n"
.string "daddy doesn't want them, so I decided\n"
.string "to give these to you!$"
LittlerootTown_Text_TownSign:
.string "Littleroot Town\n"
.string "“A town that can't be shaded any hue.”$"

View File

@ -1258,7 +1258,7 @@ EventScript_CloseMossdeepGameCornerBarrier::
return
CableClub_OnResume:
@ special InitUnionRoom commented out by default, but can be easily re-enabled, see docs.
special InitUnionRoom
end
MossdeepCity_GameCorner_1F_EventScript_InfoMan2::

View File

@ -17,7 +17,7 @@ EventScript_PkmnCenterNurse_HealPkmn::
waitmessage
call EventScript_PkmnCenterNurse_TakeAndHealPkmn
goto_if_unset FLAG_POKERUS_EXPLAINED, EventScript_PkmnCenterNurse_CheckPokerus
goto EventScript_PkmnCenterNurse_ReturnPkmn
goto EventScript_PkmnCenterNurse_CheckTrainerHillAndUnionRoom
end
EventScript_PkmnCenterNurse_IllTakeYourPkmn::
@ -75,7 +75,7 @@ EventScript_PkmnCenterNurse_PlayerWaitingInUnionRoom::
EventScript_PkmnCenterNurse_CheckPokerus::
specialvar VAR_RESULT, IsPokerusInParty
goto_if_eq VAR_RESULT, TRUE, EventScript_PkmnCenterNurse_ExplainPokerus
goto_if_eq VAR_RESULT, FALSE, EventScript_PkmnCenterNurse_ReturnPkmn
goto_if_eq VAR_RESULT, FALSE, EventScript_PkmnCenterNurse_CheckTrainerHillAndUnionRoom
end
EventScript_PkmnCenterNurse_ExplainPokerus::

View File

@ -116,7 +116,7 @@ PlayersHouse_2F_EventScript_SetWallClock::
PlayersHouse_2F_Movement_MomEntersMale:
delay_8
walk_faster_down
walk_down
walk_in_place_faster_left
delay_16
delay_8
@ -124,18 +124,18 @@ PlayersHouse_2F_Movement_MomEntersMale:
step_end
PlayersHouse_2F_Movement_MomExitsMale:
walk_faster_right
walk_right
walk_up
delay_8
step_end
PlayersHouse_2F_Movement_MomEntersFemale:
delay_8
walk_faster_down
walk_down
walk_in_place_faster_right
delay_16
delay_8
walk_faster_right
walk_right
step_end
PlayersHouse_2F_Movement_MomExitsFemale:
@ -221,11 +221,11 @@ PlayersHouse_1F_EventScript_WatchGymBroadcast::
PlayersHouse_1F_Movement_MomApproachDadMale:
walk_up
walk_faster_right
walk_faster_right
walk_faster_right
walk_faster_right
walk_faster_down
walk_right
walk_right
walk_right
walk_right
walk_down
walk_in_place_faster_right
step_end
@ -235,12 +235,12 @@ PlayersHouse_1F_Movement_MomApproachDadFemale:
walk_left
walk_left
walk_left
walk_faster_down
walk_down
walk_in_place_faster_left
step_end
PlayersHouse_1F_Movement_MomApproachPlayerMale:
walk_faster_right
walk_right
step_end
PlayersHouse_1F_Movement_MomApproachPlayerFemale:
@ -277,8 +277,8 @@ PlayersHouse_1F_Movement_MomApproachPlayerAfterTVMale:
PlayersHouse_1F_Movement_MomApproachPlayerAfterTVFemale:
walk_up
walk_faster_right
walk_faster_right
walk_right
walk_right
step_end
PlayersHouse_1F_Movement_MomMakeRoomToSeeTVMale:
@ -287,19 +287,19 @@ PlayersHouse_1F_Movement_MomMakeRoomToSeeTVMale:
step_end
PlayersHouse_1F_Movement_MomMakeRoomToSeeTVFemale:
walk_faster_right
walk_right
walk_in_place_faster_left
step_end
PlayersHouse_1F_Movement_MomReturnToSeatMale:
walk_left
walk_faster_down
walk_down
walk_in_place_faster_right
step_end
PlayersHouse_1F_Movement_MomReturnToSeatFemale:
walk_faster_right
walk_faster_down
walk_right
walk_down
walk_in_place_faster_left
step_end
@ -393,27 +393,27 @@ PlayersHouse_1F_EventScript_Vigoroth2::
end
PlayersHouse_1F_Movement_PlayerApproachTVForGymMale:
walk_faster_down
walk_faster_down
walk_faster_left
walk_faster_left
walk_faster_left
walk_down
walk_down
walk_left
walk_left
walk_left
step_end
PlayersHouse_1F_Movement_PlayerMoveToTVMale:
walk_faster_left
walk_left
step_end
PlayersHouse_1F_Movement_PlayerApproachTVForGymFemale:
walk_faster_down
walk_faster_down
walk_faster_right
walk_faster_right
walk_faster_right
walk_down
walk_down
walk_right
walk_right
walk_right
step_end
PlayersHouse_1F_Movement_PlayerMoveToTVFemale:
walk_faster_right
walk_right
step_end
PlayersHouse_1F_Movement_MovePlayerAwayFromDoor:
@ -603,8 +603,8 @@ PlayersHouse_1F_EventScript_MomApproachPlayerAfterTVFemale::
return
PlayersHouse_1F_Movement_DadApproachPlayerMale:
walk_faster_right
walk_faster_right
walk_right
walk_right
step_end
PlayersHouse_1F_Movement_DadApproachPlayerFemale:
@ -621,24 +621,24 @@ PlayersHouse_1F_Movement_DadFaceMomFemale:
step_end
PlayersHouse_1F_Movement_DadExitsMale:
walk_faster_down
walk_faster_right
walk_faster_down
walk_down
walk_right
walk_down
delay_8
step_end
PlayersHouse_1F_Movement_DadExitsFemale:
walk_faster_down
walk_down
walk_left
walk_faster_down
walk_down
delay_8
step_end
PlayersHouse_1F_Movement_PlayerEnterRoomMale:
delay_16
walk_faster_down
walk_faster_down
walk_faster_down
walk_down
walk_down
walk_down
walk_in_place_faster_left
step_end
@ -651,9 +651,9 @@ PlayersHouse_1F_Movement_MomAndPlayerWatchDadExit:
PlayersHouse_1F_Movement_PlayerEnterRoomFemale:
delay_16
walk_faster_down
walk_faster_down
walk_faster_down
walk_down
walk_down
walk_down
walk_in_place_faster_right
step_end
@ -668,10 +668,10 @@ PlayersHouse_1F_Movement_PlayerApproachTVForLatiMale:
PlayersHouse_1F_Movement_PlayerApproachTVForLatiFemale:
walk_up
walk_faster_right
walk_faster_right
walk_faster_right
walk_faster_right
walk_right
walk_right
walk_right
walk_right
walk_in_place_faster_up
step_end

View File

@ -10,15 +10,15 @@ CableClub_Text_WhichService:
CableClub_Text_TradeUsingLinkCable::
.string "Trade Pokémon with another player\n"
.string "using a GBA Game Link cable.$"
.string "using a Gba Game Link cable.$"
CableClub_Text_BattleUsingLinkCable::
.string "You may battle another Trainer\n"
.string "using a GBA Game Link cable.$"
.string "using a Gba Game Link cable.$"
CableClub_Text_RecordCornerUsingLinkCable::
.string "You can use the Record Corner with\n"
.string "others using a GBA Game Link cable.$"
.string "others using a Gba Game Link cable.$"
@ Unused
CableClub_Text_CloseThisMenu:
@ -440,7 +440,7 @@ CableClub_Text_ExplainWirelessClubFirstTime:
.string "with your friends in this room.\p"
.string "If the Wireless Adapter isn't\n"
.string "connected, you may still link up\l"
.string "using a GBA Game Link cable.\p"
.string "using a Gba Game Link cable.\p"
.string "If that is the case, you must go\n"
.string "to the Direct Corner.\p"
.string "I hope you enjoy the Wireless \n"
@ -476,7 +476,7 @@ CableClub_Text_ExplainWirelessClub:
.string "to your friends.\p"
.string "If the Wireless Adapter isn't\n"
.string "connected, you may still link up\l"
.string "using a GBA Game Link cable.\p"
.string "using a Gba Game Link cable.\p"
.string "If that is the case, you must go\n"
.string "to the Direct Corner.\p"
.string "I hope you enjoy the Wireless \n"

View File

@ -1,4 +1,3 @@
# Got this from a GitHub gist somewhere. If you made this, please reach out so I can add you to the credits!
from glob import iglob
import re
@ -94,4 +93,4 @@ if __name__ == "__main__":
perform_decap(path, c_string_pattern, is_glob)
for path, is_glob in asm_files:
perform_decap(path, asm_string_pattern, is_glob)
perform_decap(path, asm_string_pattern, is_glob)

View File

@ -16,7 +16,7 @@ Fixes are written in the `diff` format. If you've used Git before, this should l
- [Scrolling through items in the bag causes the image to flicker](#scrolling-through-items-in-the-bag-causes-the-image-to-flicker)
## Scrolling through items in the bag causes the image to flicker (fixed in tumbledemerald.)
## Scrolling through items in the bag causes the image to flicker
**Fix:** Add the following function to [src/item_menu_icons.c](https://github.com/pret/pokeemerald/blob/master/src/item_menu_icons.c):
```diff

View File

@ -97,7 +97,7 @@
#define FLAG_LEGENDARIES_IN_SOOTOPOLIS 0x53
#define FLAG_REMOVE_WARP_FADE 0x54 // Custom flag used in tumbledemerald.
#define FLAG_AURORA_MYSTIC_RECEIVED 0x55 // Custom flag used in tumbledemerald. Basically a workaround.
#define FLAG_UNUSED_0x055 0x55 // Unused Flag
#define FLAG_HIDE_CONTEST_POKE_BALL 0x56 // Always set after new game, object it hides is added directly
#define FLAG_MET_RIVAL_MOM 0x57

BIN
pokeemerald-0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

BIN
pokeemerald-1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

1
rom.sha1 Normal file
View File

@ -0,0 +1 @@
f3ae088181bf583e55daf962a92bb46f4f1d07b7 pokeemerald.gba

View File

@ -322,16 +322,6 @@ static void HandleInputChooseAction(void)
BtlController_EmitTwoReturnValues(BUFFER_B, B_ACTION_CANCEL_PARTNER, 0);
PlayerBufferExecCompleted();
}
else
{
if(!(gBattleTypeFlags & BATTLE_TYPE_TRAINER)) //if wild, pressing B moves cursor to run
{
PlaySE(SE_SELECT);
ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBattler]);
gActionSelectionCursor[gActiveBattler] = 3;
ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0);
}
}
}
else if (JOY_NEW(START_BUTTON))
{

View File

@ -189,7 +189,7 @@ const u8 gMoveNames[MOVES_COUNT][MOVE_NAME_LENGTH + 1] =
[MOVE_SWEET_KISS] = _("Sweet Kiss"),
[MOVE_BELLY_DRUM] = _("Belly Drum"),
[MOVE_SLUDGE_BOMB] = _("Sludge Bomb"),
[MOVE_MUD_SLAP] = _("Mud-Slap"),
[MOVE_MUD_SLAP] = _("Mud-slap"),
[MOVE_OCTAZOOKA] = _("Octazooka"),
[MOVE_SPIKES] = _("Spikes"),
[MOVE_ZAP_CANNON] = _("Zap Cannon"),

View File

@ -69,8 +69,6 @@ u8 gLinkVSyncDisabled;
u32 IntrMain_Buffer[0x200];
s8 gPcmDmaCounter;
extern void CB2_FlashNotDetectedScreen(void); // for Crust's sake use mGBA, people!
static EWRAM_DATA u16 gTrainerId = 0;
//EWRAM_DATA void (**gFlashTimerIntrFunc)(void) = NULL;
@ -116,7 +114,7 @@ void AgbMain()
gSoftResetDisabled = FALSE;
if (gFlashMemoryPresent != TRUE)
SetMainCallback2(CB2_FlashNotDetectedScreen);
SetMainCallback2(NULL);
gLinkTransferringData = FALSE;
sUnusedVar = 0xFC0;

View File

@ -401,50 +401,3 @@ static bool8 WipeSectors(u32 sectorBits)
else
return TRUE;
}
void CB2_FlashNotDetectedScreen(void){
static const struct WindowTemplate textWin[] = {
{
.bg = 0,
.tilemapLeft = 3,
.tilemapTop = 2,
.width = 24,
.height = 16,
.paletteNum = 15,
.baseBlock = 1,
}
};
static const char errorMsg[] = _(
"{COLOR RED}Hey!\n"
"{COLOR DARK_GRAY}Flash memory not detected.\n\n"
"Please make sure you\nare playing the game\n"
"on the mGBA emu-\nlator"
);
if (!gMain.state){
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);
InitWindows(textWin);
DrawStdFrameWithCustomTileAndPalette(0, TRUE, 0x214, 0xE);
SaveFailedScreenTextPrint(errorMsg, 1, 0);
TransferPlttBuffer();
*(u16*)PLTT = RGB(17, 18, 31);
ShowBg(0);
gMain.state++;
}
}

View File

@ -1180,7 +1180,7 @@ const u8 gText_ThunderWave48BP[] = _("Thunder Wave{CLEAR_TO 0x4E}48Bp");
const u8 gText_SwordsDance48BP[] = _("Swords Dance{CLEAR_TO 0x4E}48Bp");
const u8 gText_DefenseCurl16BP[] = _("Defense Curl{CLEAR_TO 0x4E}16Bp");
const u8 gText_Snore24BP[] = _("Snore{CLEAR_TO 0x4E}24Bp");
const u8 gText_MudSlap24BP[] = _("Mud-Slap{CLEAR_TO 0x4E}24Bp");
const u8 gText_MudSlap24BP[] = _("Mud-slap{CLEAR_TO 0x4E}24Bp");
const u8 gText_Swift24BP[] = _("Swift{CLEAR_TO 0x4E}24Bp");
const u8 gText_IcyWind24BP[] = _("Icy Wind{CLEAR_TO 0x4E}24Bp");
const u8 gText_Endure48BP[] = _("Endure{CLEAR_TO 0x4E}48Bp");