mirror of
https://github.com/Ninjdai1/pokeemerald.git
synced 2025-03-19 12:08:34 +01:00
Merge branch 'master' of https://github.com/pret/pokeemerald into sideways_stairs
This commit is contained in:
commit
1b3f53bae8
572
INSTALL.md
572
INSTALL.md
@ -1,96 +1,570 @@
|
||||
# Prerequisites
|
||||
# Instructions
|
||||
|
||||
| Linux | macOS | Windows 10
|
||||
| - | - | -
|
||||
| none | [Xcode Command Line Tools Package][xcode] | [Windows Terminal][terminal] and [Windows Subsystem for Linux (WSL)][wsl]
|
||||
These instructions explain how to set up the tools required to build **pokeemerald**, which assembles the source files into a ROM.
|
||||
|
||||
[xcode]: https://developer.apple.com/library/archive/technotes/tn2339/_index.html
|
||||
[terminal]: https://docs.microsoft.com/windows/terminal/get-started
|
||||
[wsl]: https://docs.microsoft.com/windows/wsl/install-win10
|
||||
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.
|
||||
|
||||
Independently from the specific OS, make sure that the `gcc`, `g++`, `make`, `git`, and `libpng-dev` packages or their equivalents are installed and accessible to the development tools that are used by the project (this means that, for example, on Windows, the packages have to be installed in the WSL environment). The package names and installation methods may vary with each OS.
|
||||
If you run into trouble, ask for help on Discord or IRC (see [README.md](README.md)).
|
||||
|
||||
Install the devkitARM toolchain of devkitPro as per [the instructions on their wiki](https://devkitpro.org/wiki/devkitPro_pacman). On Windows, follow the Linux instructions inside WSL as any steps about the Windows installer do not apply.
|
||||
## Windows
|
||||
Windows has instructions for building with three possible terminals, providing 3 different options in case the user stumbles upon unexpected errors.
|
||||
- [Windows 10 (WSL1)](#windows-10-wsl1) (**Fastest, highly recommended**, Windows 10 only)
|
||||
- [Windows (msys2)](#windows-msys2) (Second fastest)
|
||||
- [Windows (Cygwin)](#windows-cygwin) (Slowest)
|
||||
|
||||
**Debian-based distro users:** This applies to Debian, Ubuntu, and similar distros, including in WSL. If necessary, install the `libarchive13`, `pkg-config`, and `gdebi-core` packages to be able to install devkitPro.
|
||||
Unscientific benchmarks suggest **msys2 is 2x slower** than WSL1, and **Cygwin is 5-6x slower** than WSL1.
|
||||
<details>
|
||||
<summary><i>Note for advanced users: <b>WSL2</b>...</i></summary>
|
||||
|
||||
**Windows 10 users:** WSL 2 is available in the 1903 release (build 18362) and later, therefore existing WSL 1 and [prerelease WSL](https://docs.microsoft.com/windows/wsl/install-legacy) users are recommended to update. Right-click the Start button or press `Win`+`X`, choose Run, and run `ms-settings:about` to determine the Windows version. Also check Windows Update to make sure your installation is up-to-date.
|
||||
> <b>WSL2</b> is an option and is even faster than <b>WSL1</b> if files are stored on the WSL2 file system, but some tools may have trouble interacting
|
||||
> with the WSL2 file system over the network drive. For example, tools which use Qt versions before 5.15.2 such as <a href="https://github.com/huderlem/porymap">porymap</a>
|
||||
> may <a href="https://bugreports.qt.io/browse/QTBUG-86277">have problems with parsing the <code>\\wsl$</code> network drive path</a>.
|
||||
</details>
|
||||
|
||||
**Windows 7 and 8.1 users:** pret is no longer focusing on support in pokeemerald for [old versions of Windows](https://support.microsoft.com/help/13853) so consider upgrading to a current release of Windows 10 or try a third-party guide like [this one](https://www.pokecommunity.com/showthread.php?t=425246) instead.
|
||||
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 instructions.
|
||||
|
||||
# Installation
|
||||
## Windows 10 (WSL1)
|
||||
WSL1 is the preferred terminal to build **pokeemerald**. 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).
|
||||
- Otherwise, **open WSL** and go to [Choosing where to store pokeemerald (WSL1)](#Choosing-where-to-store-pokeemerald-WSL1).
|
||||
|
||||
To set up the repository:
|
||||
### Installing WSL1
|
||||
1. Open [Windows Powershell **as Administrator**](https://i.imgur.com/QKmVbP9.png), and run the following command (Right Click or Shift+Insert is paste in the Powershell).
|
||||
|
||||
git clone https://github.com/pret/pokeemerald
|
||||
git clone https://github.com/pret/agbcc
|
||||
```powershell
|
||||
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
|
||||
```
|
||||
|
||||
cd ./agbcc
|
||||
./build.sh
|
||||
./install.sh ../pokeemerald
|
||||
2. Once the process finishes, restart your machine.
|
||||
|
||||
cd ../pokeemerald
|
||||
3. The next step is to choose and install a Linux distribution from the Microsoft Store. The following instructions will assume Ubuntu as the Linux distribution of choice.
|
||||
<details>
|
||||
<summary><i>Note for advanced users...</i></summary>
|
||||
|
||||
To build **pokeemerald.gba** for the first time and confirm it matches the official ROM image:
|
||||
> You can pick a preferred Linux distribution, but setup instructions may differ. Debian should work with the given instructions, but has not been tested.
|
||||
</details>
|
||||
|
||||
make compare
|
||||
4. Open the [Microsoft Store Linux Selection](https://aka.ms/wslstore), click Ubuntu, then click Get, which will install the Ubuntu distribution.
|
||||
<details>
|
||||
<summary><i>Notes...</i></summary>
|
||||
|
||||
> Note 1: If a dialog pops up asking for you to sign into a Microsoft Account, then just close the dialog.
|
||||
> Note 2: If the link does not work, then open the Microsoft Store manually, and search for the Ubuntu app (choose the one with no version number).
|
||||
</details>
|
||||
|
||||
### Setting up WSL1
|
||||
Some tips before proceeding:
|
||||
- In WSL, Copy and Paste is either done via
|
||||
- **right-click** (selection + right click to Copy, right click with no selection to Paste)
|
||||
- **Ctrl+Shift+C/Ctrl+Shift+V** (enabled by right-clicking the title bar, going to Properties, then checking the checkbox next to "Use Ctrl+Shift+C/V as Copy/Paste").
|
||||
- Some of the commands that you'll run will ask for your WSL password and/or confirmation to perform the stated action. This is to be expected, just enter your WSL password and/or the yes action when necessary.
|
||||
|
||||
1. Open **Ubuntu** (e.g. using Search).
|
||||
2. WSL/Ubuntu will set up its own installation when it runs for the first time. Once WSL/Ubuntu finishes installing, it will ask for a username and password (to be input in).
|
||||
<details>
|
||||
<summary><i>Note...</i></summary>
|
||||
|
||||
> When typing in the password, there will be no visible response, but the terminal will still read in input.
|
||||
</details>
|
||||
|
||||
3. Update WSL/Ubuntu before continuing. Do this by running the following command. These commands will likely take a long time to finish:
|
||||
|
||||
```bash
|
||||
sudo apt update && sudo apt upgrade
|
||||
```
|
||||
|
||||
> Note: If the repository you plan to build has an **[older revision of the INSTALL.md](https://github.com/pret/pokeemerald/blob/571c598/INSTALL.md)**, then follow the [legacy WSL1 instructions](docs/legacy_WSL1_INSTALL.md) from here.
|
||||
|
||||
4. Certain packages are required to build pokeemerald. Install these packages by running the following command:
|
||||
|
||||
```bash
|
||||
sudo apt install build-essential binutils-arm-none-eabi git libpng-dev
|
||||
```
|
||||
<details>
|
||||
<summary><i>Note...</i></summary>
|
||||
|
||||
> If the above command does not work, try the above command but replacing `apt` with `apt-get`.
|
||||
</details>
|
||||
|
||||
### Choosing where to store pokeemerald (WSL1)
|
||||
WSL has its own file system that's not natively accessible from Windows, but Windows files *are* accessible from WSL. So you're going to want to store pokeemerald within Windows.
|
||||
|
||||
For example, say you want to store pokeemerald (and agbcc) in **C:\Users\\_\<user>_\Desktop\decomps**. First, ensure that the folder already exists. Then, enter this command to **change directory** to said folder, where *\<user>* is your **Windows** username:
|
||||
|
||||
```bash
|
||||
cd /mnt/c/Users/<user>/Desktop/decomps
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary><i>Notes...</i></summary>
|
||||
|
||||
> Note 1: The Windows C:\ drive is called /mnt/c/ in WSL.
|
||||
> Note 2: If the path has spaces, then the path must be wrapped with quotations, e.g. `cd "/mnt/c/users/<user>/Desktop/decomp folder"`.
|
||||
> Note 3: 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 on Discord or IRC (see [README.md](README.md)), or continue reading below for [Windows instructions using msys2](#windows-msys2).
|
||||
|
||||
## Windows (msys2)
|
||||
|
||||
- If devkitARM is **not installed**, then go to [Installing devkitARM](#installing-devkitarm).
|
||||
- If devkitARM is installed, but msys2 **hasn't previously been set up for another decompilation project**, then go to [Setting up msys2](#setting-up-msys2).
|
||||
- Otherwise, **open msys2** and go to [Choosing where to store pokeemerald (msys2)](#choosing-where-to-store-pokeemerald-msys2).
|
||||
|
||||
### Installing devkitARM
|
||||
1. Download the devkitPro installer [here](https://github.com/devkitPro/installer/releases).
|
||||
2. Run the devkitPro installer. In the "Choose Components" screen, uncheck everything except GBA Development unless if you plan to install other devkitPro components for other purposes. Keep the install location as C:\devkitPro and leave the Start Menu option unchanged.
|
||||
|
||||
### Setting up msys2
|
||||
|
||||
Note that in msys2, Copy is Ctrl+Insert and Paste is Shift+Insert.
|
||||
|
||||
1. Open msys2 at C:\devkitPro\msys2\msys2_shell.bat.
|
||||
|
||||
2. Certain packages are required to build pokeemerald. Install these by running the following command:
|
||||
|
||||
```bash
|
||||
pacman -S make gcc zlib-devel git
|
||||
```
|
||||
<details>
|
||||
<summary><i>Note...</i></summary>
|
||||
|
||||
> This command will ask for confirmation, just enter the yes action when prompted.
|
||||
</details>
|
||||
|
||||
3. Download [libpng](https://sourceforge.net/projects/libpng/files/libpng16/1.6.37/libpng-1.6.37.tar.xz/download).
|
||||
|
||||
4. Change directory to where libpng was downloaded. By default, msys2 will start in the current user's profile folder, located at **C:\Users\\⁠_\<user>_**, where *\<user>* is your Windows username. In most cases, libpng should be saved within a subfolder of the profile folder. For example, if libpng was saved to **C:\Users\\_\<user>_\Downloads** (the Downloads location for most users), enter this command:
|
||||
|
||||
```bash
|
||||
cd Downloads
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary><i>Notes...</i></summary>
|
||||
|
||||
> Note 1: While not shown, msys uses forward slashes `/` instead of backwards slashes `\` as the directory separator.
|
||||
> Note 2: If the path has spaces, then the path must be wrapped with quotations, e.g. `cd "Downloads/My Downloads"`.
|
||||
> Note 3: Windows path names are case-insensitive so adhering to capitalization isn’t needed.
|
||||
> Note 4: If libpng was saved elsewhere, you will need to specify the full path to where libpng was downloaded, e.g. `cd c:/devkitpro/msys2` if it was saved there.
|
||||
</details>
|
||||
|
||||
5. Run the following commands to uncompress and install libpng.
|
||||
|
||||
```bash
|
||||
tar xf libpng-1.6.37.tar.xz
|
||||
cd libpng-1.6.37
|
||||
./configure --prefix=/usr
|
||||
make check
|
||||
make install
|
||||
```
|
||||
|
||||
6. Then finally, run the following command to change back to the user profile folder.
|
||||
|
||||
```bash
|
||||
cd
|
||||
```
|
||||
|
||||
### Choosing where to store pokeemerald (msys2)
|
||||
At this point, you can choose a folder to store pokeemerald into. If you're okay with storing pokeemerald in the user profile folder, then proceed to [Installation](#installation). Otherwise, you'll need to account for where pokeemerald is stored when changing directory to the pokeemerald folder.
|
||||
|
||||
For example, if you want to store pokeemerald (and agbcc) in **C:\Users\\_\<user>_\Desktop\decomps** (where *\<user>* is your **Windows** username), enter this command:
|
||||
|
||||
```bash
|
||||
cd Desktop/decomps
|
||||
```
|
||||
|
||||
If this works, then proceed to [Installation](#installation).
|
||||
|
||||
Otherwise, ask for help on Discord or IRC (see [README.md](README.md)), 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!*
|
||||
|
||||
2.
|
||||
- If Cygwin is **not installed**, or does not have all of the required packages installed, then go to [Installing Cygwin](#installing-cygwin).
|
||||
- If Cygwin is installed, but **is not configured to work with devkitARM**, then go to [Configuring devkitARM for Cygwin](#configuring-devkitarm-for-cygwin).
|
||||
- Otherwise, **open Cygwin** and go to [Choosing where to store pokeemerald (Cygwin)](#choosing-where-to-store-pokeemerald-cygwin)
|
||||
|
||||
### Installing Cygwin
|
||||
1. Download [Cygwin](https://cygwin.com/install.html): setup-x86_64.exe for 64-bit Windows, setup-x86.exe for 32-bit.
|
||||
|
||||
2. Run the Cygwin setup. Within the Cygwin setup, leave the default settings until the "Choose A Download Site" screen.
|
||||
|
||||
3. At "Choose a Download Site", select any mirror within the Available Download Sites.
|
||||
|
||||
4. At "Select Packages", set the view to "Full" (top left) and search for the following packages:
|
||||
- `make`
|
||||
- `git`
|
||||
- `gcc-core`
|
||||
- `gcc-g++`
|
||||
- `libpng-devel`
|
||||
|
||||
To quickly find these, use the search bar and type the name of each package. Ensure that the selected package name is the **exact** same as the one you're trying to download, e.g. `cmake` is **NOT** the same as `make`.
|
||||
|
||||
5. For each package, double click on the text that says "**Skip**" next to each package to select the most recent version to install. If the text says anything other than "**Skip**", (e.g. Keep or a version number), then the package is or will be installed and you don't need to do anything.
|
||||
|
||||
6. Once all required packages have been selected, finish the installation.
|
||||
|
||||
### Configuring devkitARM for Cygwin
|
||||
|
||||
Note that in Cygwin, Copy is Ctrl+Insert and Paste is Shift+Insert.
|
||||
|
||||
1. Open **Cygwin**.
|
||||
|
||||
2. Run the following commands to configure devkitPro to work with Cygwin.
|
||||
|
||||
```bash
|
||||
export DEVKITPRO=/cygdrive/c/devkitpro
|
||||
echo export DEVKITPRO=$DEVKITPRO >> ~/.bashrc
|
||||
export DEVKITARM=$DEVKITPRO/devkitARM
|
||||
echo export DEVKITARM=$DEVKITARM >> ~/.bashrc
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary><i>Note...</i></summary>
|
||||
|
||||
> Replace the drive letter c with the actual drive letter if it is not c.
|
||||
</details>
|
||||
|
||||
### Choosing where to store pokeemerald (Cygwin)
|
||||
|
||||
Cygwin has its own file system that's within Windows, at **C:\cygwin64\home\\_\<user>_**. If you don't want to store pokeemerald there, you'll need to account for where pokeemerald is stored when **changing directory** to the pokeemerald folder.
|
||||
|
||||
For example, if you want to store pokeemerald (and agbcc) in **C:\Users\\_\<user>_\Desktop\decomps**, enter this command, where *\<user>* is your **Windows** username:
|
||||
```bash
|
||||
cd c:/Users/<user>/Desktop/decomps
|
||||
```
|
||||
Note that the directory **must exist** in Windows. If you want to store pokeemerald in a dedicated folder that doesn't exist (e.g. the example provided above), then create the folder (e.g. using Windows Explorer) before executing the `cd` command.
|
||||
|
||||
<details>
|
||||
<summary><i>Notes...</i></summary>
|
||||
|
||||
> Note 1: If the path has spaces, then the path must be wrapped with quotations, e.g. `cd "c:/users/<user>/Desktop/decomp folder"`.
|
||||
> 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 on Discord or IRC (see [README.md](README.md)).
|
||||
|
||||
## 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:
|
||||
|
||||
```bash
|
||||
xcode-select --install
|
||||
```
|
||||
|
||||
2. - If libpng is **not installed**, then go to [Installing libpng (macOS)](#installing-libpng-macos).
|
||||
- If devkitARM is **not installed**, then go to [Installing devkitARM (macOS)](#installing-devkitarm-macos).
|
||||
- Otherwise, **open the Terminal** and go to [Choosing where to store pokeemerald (macOS)](#choosing-where-to-store-pokeemerald-macos)
|
||||
|
||||
### Installing libpng (macOS)
|
||||
<details>
|
||||
<summary><i>Note for advanced users...</i></summary>
|
||||
|
||||
> This guide installs libpng via Homebrew as it is the easiest method, however advanced users can install libpng through other means if they so desire.
|
||||
</details>
|
||||
|
||||
1. Open the Terminal.
|
||||
2. If Homebrew is not installed, then install [Homebrew](https://brew.sh/) by following the instructions on the website.
|
||||
3. Run the following command to install libpng.
|
||||
|
||||
```bash
|
||||
brew install libpng
|
||||
```
|
||||
libpng is now installed.
|
||||
|
||||
Continue to [Installing devkitARM (macOS)](#installing-devkitarm-macos) if **devkitARM is not installed**, otherwise, go to [Choosing where to store pokeemerald (macOS)](#choosing-where-to-store-pokeemerald-macos).
|
||||
|
||||
### Installing devkitARM (macOS)
|
||||
1. Download the `devkitpro-pacman-installer.pkg` package from [here](https://github.com/devkitPro/pacman/releases).
|
||||
2. Open the package to install devkitPro pacman.
|
||||
3. In the Terminal, run the following commands to install devkitARM:
|
||||
|
||||
```bash
|
||||
sudo dkp-pacman -Sy
|
||||
sudo dkp-pacman -S gba-dev
|
||||
sudo dkp-pacman -S devkitarm-rules
|
||||
```
|
||||
|
||||
The command with gba-dev will ask for the selection of packages to install. Just press Enter to install all of them, followed by entering Y to proceed with the installation.
|
||||
|
||||
4. After the tools are installed, devkitARM must now be made accessible from anywhere by the system. To do so, run the following commands:
|
||||
|
||||
```bash
|
||||
export DEVKITPRO=/opt/devkitpro
|
||||
echo "export DEVKITPRO=$DEVKITPRO" >> ~/.bashrc
|
||||
export DEVKITARM=$DEVKITPRO/devkitARM
|
||||
echo "export DEVKITARM=$DEVKITARM" >> ~/.bashrc
|
||||
|
||||
echo "if [ -f ~/.bashrc ]; then . ~/.bashrc; fi" >> ~/.bash_profile
|
||||
```
|
||||
|
||||
### Choosing where to store pokeemerald (macOS)
|
||||
At this point, you can choose a folder to store pokeemerald into. If you're okay with storing pokeemerald in the user folder, then proceed to [Installation](#installation). Otherwise, you'll need to account for where pokeemerald is stored when changing directory to the pokeemerald folder.
|
||||
|
||||
For example, if you want to store pokeemerald (and agbcc) in **~/Desktop/decomps**, enter this command to **change directory** to the desired folder:
|
||||
```bash
|
||||
cd Desktop/decomps
|
||||
```
|
||||
Note that the directory **must exist** in the folder system. If you want to store pokeemerald in a dedicated folder that doesn't exist (e.g. the example provided above), then create the folder (e.g. using Finder) before executing the `cd` command.
|
||||
|
||||
<details>
|
||||
<summary><i>Note..</i>.</summary>
|
||||
|
||||
> 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 on Discord or IRC (see [README.md](README.md)).
|
||||
|
||||
## Linux
|
||||
Open Terminal and enter the following commands, depending on which distro you're using.
|
||||
|
||||
### Debian/Ubuntu-based distributions
|
||||
Run the following command to install the necessary packages:
|
||||
```bash
|
||||
sudo apt install build-essential binutils-arm-none-eabi git libpng-dev
|
||||
```
|
||||
Then proceed to [Choosing where to store pokeemerald (Linux)](#choosing-where-to-store-pokeemerald-linux).
|
||||
<details>
|
||||
<summary><i>Note for legacy repos...</i></summary>
|
||||
|
||||
> If the repository you plan to build has an **[older revision of the INSTALL.md](https://github.com/pret/pokeemerald/blob/571c598/INSTALL.md)**,
|
||||
> then you will have to install devkitARM. Install all the above packages except binutils-arm-none-eabi, and follow the instructions to
|
||||
> [install devkitARM on Debian/Ubuntu-based distributions](#installing-devkitarm-on-debianubuntu-based-distributions).
|
||||
</details>
|
||||
|
||||
### Other distributions
|
||||
_(Specific instructions for other distributions would be greatly appreciated!)_
|
||||
|
||||
1. Try to find the required software in its repositories:
|
||||
- `gcc`
|
||||
- `g++`
|
||||
- `make`
|
||||
- `git`
|
||||
- `libpng-dev`
|
||||
|
||||
2. Follow the instructions [here](https://devkitpro.org/wiki/devkitPro_pacman) to install devkitPro pacman. As a reminder, the goal is to configure an existing pacman installation to recognize devkitPro's repositories.
|
||||
3. Once devkitPro pacman is configured, run the following commands:
|
||||
|
||||
```bash
|
||||
sudo pacman -Sy
|
||||
sudo pacman -S gba-dev
|
||||
```
|
||||
|
||||
The last command will ask for the selection of packages to install. Just press Enter to install all of them, followed by entering Y to proceed with the installation.
|
||||
|
||||
### Choosing where to store pokeemerald (Linux)
|
||||
At this point, you can choose a folder to store pokeemerald (and agbcc) into. If so, you'll have to account for the modified folder path when changing directory to the pokeemerald folder.
|
||||
|
||||
If this works, then proceed to [Installation](#installation). Otherwise, ask for help on Discord or IRC (see [README.md](README.md)).
|
||||
|
||||
## Installation
|
||||
|
||||
<details>
|
||||
<summary><i>Note for Windows users...</i></summary>
|
||||
|
||||
> Consider adding an exception for the `pokeemerald` and/or `decomps` folder in Windows Security using
|
||||
> [these instructions](https://support.microsoft.com/help/4028485). This prevents Microsoft Defender from
|
||||
> scanning them which might improve performance while building.
|
||||
</details>
|
||||
|
||||
1. If pokeemerald is not already downloaded (some users may prefer to download pokeemerald via a git client like GitHub Desktop), run:
|
||||
|
||||
```bash
|
||||
git clone https://github.com/pret/pokeemerald
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary><i>Note for WSL1...</i></summary>
|
||||
|
||||
> If you get an error stating `fatal: could not set 'core.filemode' to 'false'`, then run the following commands:
|
||||
> ```bash
|
||||
> cd
|
||||
> sudo umount /mnt/c
|
||||
> sudo mount -t drvfs C: /mnt/c -o metadata,noatime
|
||||
> cd <folder where pokeemerald is to be stored>
|
||||
> ```
|
||||
> Where *\<folder where pokeemerald is to be stored>* is the path of the folder [where you chose to store pokeemerald](#Choosing-where-to-store-pokeemerald-WSL1). Then run the `git clone` command again.
|
||||
</details>
|
||||
|
||||
2. Install agbcc into pokeemerald. The commands to run depend on certain conditions. **You should only follow one of the listed instructions**:
|
||||
- If agbcc has **not been built before** in the folder where you chose to store pokeemerald, run the following commands to build and install it into pokeemerald:
|
||||
|
||||
```bash
|
||||
git clone https://github.com/pret/agbcc
|
||||
cd agbcc
|
||||
./build.sh
|
||||
./install.sh ../pokeemerald
|
||||
```
|
||||
|
||||
- **Otherwise**, if agbcc has been built before (e.g. if the git clone above fails), but was **last built on a different terminal** than the one currently used (only relevant to Windows, e.g. switching from msys2 to WSL1), then run the following commands to build and install it into pokeemerald:
|
||||
|
||||
```bash
|
||||
cd agbcc
|
||||
git clean -fX
|
||||
./build.sh
|
||||
./install.sh ../pokeemerald
|
||||
```
|
||||
|
||||
- **Otherwise**, if agbcc has been built before on the same terminal, run the following commands to install agbcc into pokeemerald:
|
||||
|
||||
```bash
|
||||
cd agbcc
|
||||
./install.sh ../pokeemerald
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary><i>Note...</i></summary>
|
||||
|
||||
> If building agbcc or pokeemerald results in an error, try deleting the agbcc folder and re-installing agbcc as if it has not been built before.
|
||||
</details>
|
||||
|
||||
3. Once agbcc is installed, change directory back to the base directory where pokeemerald and agbcc are stored:
|
||||
|
||||
```bash
|
||||
cd ..
|
||||
```
|
||||
|
||||
Now you're ready to [build **pokeemerald**](#build-pokeemerald)
|
||||
## Build pokeemerald
|
||||
If you aren't in the pokeemerald directory already, then **change directory** to the pokeemerald folder:
|
||||
```bash
|
||||
cd pokeemerald
|
||||
```
|
||||
To build **pokeemerald.gba** for the first time and confirm it matches the official ROM image (Note: to speed up builds, see [Parallel builds](#parallel-builds)):
|
||||
```bash
|
||||
make compare
|
||||
```
|
||||
If an OK is returned, then the installation went smoothly.
|
||||
|
||||
**Windows users:** Consider adding exceptions for the `pokeemerald` and `agbcc` folders in Windows Security using [these instructions](https://support.microsoft.com/help/4028485). This prevents Microsoft Defender from scanning them which might improve performance while building.
|
||||
|
||||
|
||||
# Start
|
||||
<details>
|
||||
<summary>Note for Windows...</summary>
|
||||
> 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 **pokeemerald.gba** with your changes:
|
||||
|
||||
make
|
||||
|
||||
**macOS users:** If the base tools are not found in new Terminal sessions after the first successful build, run `echo "if [ -f ~/.bashrc ]; then . ~/.bashrc; fi" >> ~/.bash_profile` once to prevent the issue from occurring again. Verify that the `devkitarm-rules` package is installed as well; if not, install it by running `sudo dkp-pacman -S devkitarm-rules`.
|
||||
|
||||
```bash
|
||||
make
|
||||
```
|
||||
|
||||
# Building guidance
|
||||
|
||||
|
||||
## Parallel builds
|
||||
|
||||
See [the GNU docs](https://www.gnu.org/software/make/manual/html_node/Parallel.html) and [this Stack Exchange thread](https://unix.stackexchange.com/questions/208568) for more information.
|
||||
|
||||
To speed up building, run:
|
||||
|
||||
make -j$(nproc)
|
||||
To speed up building, first get the value of `nproc` by running the following command:
|
||||
```bash
|
||||
nproc
|
||||
```
|
||||
Builds can then be sped up by running the following command:
|
||||
```bash
|
||||
make -j<output of nproc>
|
||||
```
|
||||
Replace `<output of nproc>` with the number that the `nproc` command returned.
|
||||
|
||||
`nproc` is not available on macOS. The alternative is `sysctl -n hw.ncpu` ([relevant Stack Overflow thread](https://stackoverflow.com/questions/1715580)).
|
||||
|
||||
|
||||
## Debug info
|
||||
|
||||
To build **pokeemerald.elf** with enhanced debug info:
|
||||
|
||||
make DINFO=1
|
||||
|
||||
```bash
|
||||
make DINFO=1
|
||||
```
|
||||
|
||||
## devkitARM's C compiler
|
||||
|
||||
This project supports the `arm-none-eabi-gcc` compiler included with devkitARM r52. To build this target, simply run:
|
||||
This project supports the `arm-none-eabi-gcc` compiler included with devkitARM. If devkitARM (a.k.a. gba-dev) has already been installed as part of the platform-specific instructions, simply run:
|
||||
```bash
|
||||
make modern
|
||||
```
|
||||
Otherwise, follow the instructions below to install devkitARM.
|
||||
### Installing devkitARM on WSL1
|
||||
|
||||
make modern
|
||||
1. `gdebi-core` must be installed beforehand in order to install devkitPro pacman (which facilitates the installation of devkitARM). Install this with the following command:
|
||||
|
||||
```bash
|
||||
sudo apt install gdebi-core
|
||||
```
|
||||
<details>
|
||||
<summary><i>Note...</i></summary>
|
||||
|
||||
> If the above command does not work, try the above command but replacing `apt` with `apt-get`.
|
||||
</details>
|
||||
|
||||
2. Once `gdebi-core` is done installing, download the devkitPro pacman package [here](https://github.com/devkitPro/pacman/releases). The file to download is `devkitpro-pacman.amd64.deb`.
|
||||
3. Change directory to where the package was downloaded. For example, if the package file was saved to **C:\Users\\_\<user>_\Downloads** (the Downloads location for most users), enter this command, where *\<user> is your **Windows** username:
|
||||
|
||||
```bash
|
||||
cd /mnt/c/Users/<user>/Downloads
|
||||
```
|
||||
|
||||
4. Once the directory has been changed to the folder containing the devkitPro pacman package, run the following commands to install devkitARM.
|
||||
|
||||
```bash
|
||||
sudo gdebi devkitpro-pacman.amd64.deb
|
||||
sudo dkp-pacman -Sy
|
||||
sudo dkp-pacman -S gba-dev
|
||||
```
|
||||
The last command will ask for the selection of packages to install. Just press Enter to install all of them, followed by entering Y to proceed with the installation.
|
||||
|
||||
<details>
|
||||
<summary><i>Note...</i></summary>
|
||||
|
||||
> Note: `devkitpro-pacman.amd64.deb` is the expected filename of the devkitPro package downloaded (for the first command). If the downloaded package filename differs, then use that filename instead.
|
||||
</details>
|
||||
|
||||
5. Run the following command to set devkitPro related environment variables (alternatively, close and re-open WSL):
|
||||
|
||||
```bash
|
||||
source /etc/profile.d/devkit-env.sh
|
||||
```
|
||||
|
||||
devkitARM is now installed.
|
||||
|
||||
### Installing devkitARM on Debian/Ubuntu-based distributions
|
||||
1. If `gdebi-core` is not installed, run the following command:
|
||||
|
||||
```bash
|
||||
sudo apt install gdebi-core
|
||||
```
|
||||
2. Download the devkitPro pacman package [here](https://github.com/devkitPro/pacman/releases). The file to download is `devkitpro-pacman.amd64.deb`.
|
||||
3. Change directory to where the package was downloaded. Then, run the following commands to install devkitARM:
|
||||
|
||||
```bash
|
||||
sudo gdebi devkitpro-pacman.amd64.deb
|
||||
sudo dkp-pacman -Sy
|
||||
sudo dkp-pacman -S gba-dev
|
||||
```
|
||||
The last command will ask for the selection of packages to install. Just press Enter to install all of them, followed by entering Y to proceed with the installation.
|
||||
|
||||
> Note: `devkitpro-pacman.amd64.deb` is the expected filename of the devkitPro package downloaded (for the first command). If the downloaded package filename differs, then use that filename instead.
|
||||
|
||||
4. Run the following command to set devkitPro related environment variables (alternatively, close and re-open the Terminal):
|
||||
|
||||
```bash
|
||||
source /etc/profile.d/devkit-env.sh
|
||||
```
|
||||
|
||||
devkitARM is now installed.
|
||||
|
||||
## Other toolchains
|
||||
|
||||
To build using a toolchain other than devkitARM, override the `TOOLCHAIN` environment variable with the path to your toolchain, which must contain the subdirectory `bin`.
|
||||
|
||||
make TOOLCHAIN="/path/to/toolchain/here"
|
||||
|
||||
```bash
|
||||
make TOOLCHAIN="/path/to/toolchain/here"
|
||||
```
|
||||
The following is an example:
|
||||
|
||||
make TOOLCHAIN="/usr/local/arm-none-eabi"
|
||||
|
||||
```bash
|
||||
make TOOLCHAIN="/usr/local/arm-none-eabi"
|
||||
```
|
||||
To compile the `modern` target with this toolchain, the subdirectories `lib`, `include`, and `arm-none-eabi` must also be present.
|
||||
|
||||
|
||||
# Useful additional tools
|
||||
|
||||
* [porymap](https://github.com/huderlem/porymap) for viewing and editing maps
|
||||
|
118
Makefile
118
Makefile
@ -1,29 +1,28 @@
|
||||
TOOLCHAIN := $(DEVKITARM)
|
||||
COMPARE ?= 0
|
||||
|
||||
ifeq ($(CC),)
|
||||
HOSTCC := gcc
|
||||
else
|
||||
HOSTCC := $(CC)
|
||||
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
|
||||
|
||||
ifeq ($(CXX),)
|
||||
HOSTCXX := g++
|
||||
else
|
||||
HOSTCXX := $(CXX)
|
||||
endif
|
||||
|
||||
ifneq (,$(wildcard $(TOOLCHAIN)/base_tools))
|
||||
include $(TOOLCHAIN)/base_tools
|
||||
else
|
||||
ifneq (,$(TOOLCHAIN))
|
||||
ifneq ($(wildcard $(TOOLCHAIN)/bin),)
|
||||
export PATH := $(TOOLCHAIN)/bin:$(PATH)
|
||||
endif
|
||||
endif
|
||||
|
||||
PREFIX := arm-none-eabi-
|
||||
OBJCOPY := $(PREFIX)objcopy
|
||||
export CC := $(PREFIX)gcc
|
||||
export AS := $(PREFIX)as
|
||||
endif
|
||||
export CPP := $(PREFIX)cpp
|
||||
export LD := $(PREFIX)ld
|
||||
AS := $(PREFIX)as
|
||||
|
||||
LD := $(PREFIX)ld
|
||||
|
||||
# note: the makefile must be set up so MODERNCC is never called
|
||||
# if MODERN=0
|
||||
MODERNCC := $(PREFIX)gcc
|
||||
|
||||
ifeq ($(OS),Windows_NT)
|
||||
EXE := .exe
|
||||
@ -37,6 +36,33 @@ MAKER_CODE := 01
|
||||
REVISION := 0
|
||||
MODERN ?= 0
|
||||
|
||||
# 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 := pokeemerald.gba
|
||||
ELF_NAME := $(ROM_NAME:.gba=.elf)
|
||||
MAP_NAME := $(ROM_NAME:.gba=.map)
|
||||
OBJ_DIR_NAME := build/emerald
|
||||
|
||||
MODERN_ROM_NAME := pokeemerald_modern.gba
|
||||
MODERN_ELF_NAME := $(MODERN_ROM_NAME:.gba=.elf)
|
||||
MODERN_MAP_NAME := $(MODERN_ROM_NAME:.gba=.map)
|
||||
MODERN_OBJ_DIR_NAME := build/modern
|
||||
|
||||
SHELL := /bin/bash -o pipefail
|
||||
|
||||
ELF = $(ROM:.gba=.elf)
|
||||
@ -64,22 +90,22 @@ ASFLAGS := -mcpu=arm7tdmi --defsym MODERN=$(MODERN)
|
||||
ifeq ($(MODERN),0)
|
||||
CC1 := tools/agbcc/bin/agbcc$(EXE)
|
||||
override CFLAGS += -mthumb-interwork -Wimplicit -Wparentheses -Werror -O2 -fhex-asm -g
|
||||
ROM := pokeemerald.gba
|
||||
OBJ_DIR := build/emerald
|
||||
ROM := $(ROM_NAME)
|
||||
OBJ_DIR := $(OBJ_DIR_NAME)
|
||||
LIBPATH := -L ../../tools/agbcc/lib
|
||||
LIB := $(LIBPATH) -lgcc -lc -L../../libagbsyscall -lagbsyscall
|
||||
else
|
||||
CC1 = $(shell $(CC) --print-prog-name=cc1) -quiet
|
||||
CC1 = $(shell $(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 := pokeemerald_modern.gba
|
||||
OBJ_DIR := build/modern
|
||||
LIBPATH := -L "$(dir $(shell $(CC) -mthumb -print-file-name=libgcc.a))" -L "$(dir $(shell $(CC) -mthumb -print-file-name=libnosys.a))" -L "$(dir $(shell $(CC) -mthumb -print-file-name=libc.a))"
|
||||
ROM := $(MODERN_ROM_NAME)
|
||||
OBJ_DIR := $(MODERN_OBJ_DIR_NAME)
|
||||
LIBPATH := -L "$(dir $(shell $(MODERNCC) -mthumb -print-file-name=libgcc.a))" -L "$(dir $(shell $(MODERNCC) -mthumb -print-file-name=libnosys.a))" -L "$(dir $(shell $(MODERNCC) -mthumb -print-file-name=libc.a))"
|
||||
LIB := $(LIBPATH) -lc -lnosys -lgcc -L../../libagbsyscall -lagbsyscall
|
||||
endif
|
||||
|
||||
CPPFLAGS := -iquote include -iquote $(GFLIB_SUBDIR) -Wno-trigraphs -DMODERN=$(MODERN)
|
||||
ifeq ($(MODERN),0)
|
||||
CPPFLAGS += -I tools/agbcc/include -I tools/agbcc
|
||||
ifneq ($(MODERN),1)
|
||||
CPPFLAGS += -I tools/agbcc/include -I tools/agbcc -nostdinc -undef
|
||||
endif
|
||||
|
||||
LDFLAGS = -Map ../../$(MAP)
|
||||
@ -111,7 +137,7 @@ 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
|
||||
.PHONY: all rom clean compare tidy tools mostlyclean clean-tools $(TOOLDIRS) berry_fix libagbsyscall modern tidymodern tidynonmodern
|
||||
|
||||
infoshell = $(foreach line, $(shell $1 | sed "s/ /__SPACE__/g"), $(info $(subst __SPACE__, ,$(line))))
|
||||
|
||||
@ -162,7 +188,7 @@ all: rom
|
||||
tools: $(TOOLDIRS)
|
||||
|
||||
$(TOOLDIRS):
|
||||
@$(MAKE) -C $@ CC=$(HOSTCC) CXX=$(HOSTCXX)
|
||||
@$(MAKE) -C $@
|
||||
|
||||
rom: $(ROM)
|
||||
ifeq ($(COMPARE),1)
|
||||
@ -177,7 +203,7 @@ clean: mostlyclean clean-tools
|
||||
clean-tools:
|
||||
@$(foreach tooldir,$(TOOLDIRS),$(MAKE) clean -C $(tooldir);)
|
||||
|
||||
mostlyclean: tidy
|
||||
mostlyclean: tidynonmodern tidymodern
|
||||
rm -f $(SAMPLE_SUBDIR)/*.bin
|
||||
rm -f $(CRY_SUBDIR)/*.bin
|
||||
rm -f $(MID_SUBDIR)/*.s
|
||||
@ -189,12 +215,15 @@ mostlyclean: tidy
|
||||
@$(MAKE) clean -C berry_fix
|
||||
@$(MAKE) clean -C libagbsyscall
|
||||
|
||||
tidy:
|
||||
rm -f $(ROM) $(ELF) $(MAP)
|
||||
rm -r $(OBJ_DIR)
|
||||
ifeq ($(MODERN),0)
|
||||
@$(MAKE) tidy MODERN=1
|
||||
endif
|
||||
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
|
||||
@ -223,7 +252,7 @@ sound/%.bin: sound/%.aif ; $(AIF) $< $@
|
||||
|
||||
|
||||
ifeq ($(MODERN),0)
|
||||
$(C_BUILDDIR)/libc.o: CC1 := tools/agbcc/bin/old_agbcc
|
||||
$(C_BUILDDIR)/libc.o: CC1 := tools/agbcc/bin/old_agbcc$(EXE)
|
||||
$(C_BUILDDIR)/libc.o: CFLAGS := -O2
|
||||
|
||||
$(C_BUILDDIR)/siirtc.o: CFLAGS := -mthumb-interwork
|
||||
@ -232,10 +261,10 @@ $(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
|
||||
$(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
|
||||
$(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
|
||||
@ -296,11 +325,11 @@ endif
|
||||
|
||||
ifeq ($(NODEP),1)
|
||||
$(DATA_ASM_BUILDDIR)/%.o: $(DATA_ASM_SUBDIR)/%.s
|
||||
$(PREPROC) $< charmap.txt | $(CPP) -I include | $(AS) $(ASFLAGS) -o $@
|
||||
$(PREPROC) $< charmap.txt | $(CPP) -I include - | $(AS) $(ASFLAGS) -o $@
|
||||
else
|
||||
define DATA_ASM_DEP
|
||||
$1: $2 $$(shell $(SCANINC) -I include -I "" $2)
|
||||
$$(PREPROC) $$< charmap.txt | $$(CPP) -I include | $$(AS) $$(ASFLAGS) -o $$@
|
||||
$$(PREPROC) $$< charmap.txt | $$(CPP) -I include - | $$(AS) $$(ASFLAGS) -o $$@
|
||||
endef
|
||||
$(foreach src, $(REGULAR_DATA_ASM_SRCS), $(eval $(call DATA_ASM_DEP,$(patsubst $(DATA_ASM_SUBDIR)/%.s,$(DATA_ASM_BUILDDIR)/%.o, $(src)),$(src))))
|
||||
$(foreach src, $(C_ASM_SRCS), $(eval $(call DATA_ASM_DEP,$(patsubst $(C_SUBDIR)/%.s,$(C_BUILDDIR)/%.o, $(src)),$(src))))
|
||||
@ -330,7 +359,8 @@ $(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
|
||||
cd $(OBJ_DIR) && $(LD) $(LDFLAGS) -T ld_script.ld -o ../../$@ $(OBJS_REL) $(LIB)
|
||||
@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)
|
||||
$(FIX) $@ -t"$(TITLE)" -c$(GAME_CODE) -m$(MAKER_CODE) -r$(REVISION) --silent
|
||||
|
||||
$(ROM): $(ELF)
|
||||
@ -342,7 +372,7 @@ modern: ; @$(MAKE) MODERN=1
|
||||
berry_fix/berry_fix.gba: berry_fix
|
||||
|
||||
berry_fix:
|
||||
@$(MAKE) -C berry_fix COMPARE=$(COMPARE) TOOLCHAIN=$(TOOLCHAIN)
|
||||
@$(MAKE) -C berry_fix COMPARE=$(COMPARE) TOOLCHAIN=$(TOOLCHAIN) MODERN=$(MODERN)
|
||||
|
||||
libagbsyscall:
|
||||
@$(MAKE) -C libagbsyscall TOOLCHAIN=$(TOOLCHAIN)
|
||||
@$(MAKE) -C libagbsyscall TOOLCHAIN=$(TOOLCHAIN) MODERN=$(MODERN)
|
||||
|
@ -345,11 +345,12 @@
|
||||
.byte 0x32
|
||||
.endm
|
||||
|
||||
@ Plays the specified (song_number) song. The byte is apparently supposed to be 0x00.
|
||||
.macro playbgm song_number:req, unknown:req
|
||||
@ Plays the specified (song_number) song. If save_song is TRUE, the
|
||||
@ specified (song_number) will be saved as if savebgm was called with it.
|
||||
.macro playbgm song_number:req, save_song:req
|
||||
.byte 0x33
|
||||
.2byte \song_number
|
||||
.byte \unknown
|
||||
.byte \save_song
|
||||
.endm
|
||||
|
||||
@ Saves the specified (song_number) song to be played later.
|
||||
|
10
asmdiff.sh
10
asmdiff.sh
@ -1,11 +1,19 @@
|
||||
#!/bin/bash
|
||||
|
||||
OBJDUMP="$DEVKITARM/bin/arm-none-eabi-objdump -D -bbinary -marmv4t -Mforce-thumb"
|
||||
if [[ -d "$DEVKITARM/bin/" ]]; then
|
||||
OBJDUMP_BIN="$DEVKITARM/bin/arm-none-eabi-objdump"
|
||||
else
|
||||
OBJDUMP_BIN="arm-none-eabi-objdump"
|
||||
fi
|
||||
|
||||
OBJDUMP="$OBJDUMP_BIN -D -bbinary -marmv4t -Mforce-thumb"
|
||||
|
||||
if [ $(($1)) -ge $((0x8000000)) ]; then
|
||||
OPTIONS="--adjust-vma=0x8000000 --start-address=$(($1)) --stop-address=$(($1 + $2))"
|
||||
else
|
||||
OPTIONS="--start-address=$(($1)) --stop-address=$(($1 + $2))"
|
||||
fi
|
||||
|
||||
$OBJDUMP $OPTIONS baserom.gba > baserom.dump
|
||||
$OBJDUMP $OPTIONS pokeemerald.gba > pokeemerald.dump
|
||||
diff -u baserom.dump pokeemerald.dump
|
||||
|
@ -1,29 +1,27 @@
|
||||
TOOLCHAIN := $(DEVKITARM)
|
||||
COMPARE ?= 0
|
||||
|
||||
ifeq ($(CC),)
|
||||
HOSTCC := gcc
|
||||
else
|
||||
HOSTCC := $(CC)
|
||||
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
|
||||
|
||||
ifeq ($(CXX),)
|
||||
HOSTCXX := g++
|
||||
else
|
||||
HOSTCXX := $(CXX)
|
||||
endif
|
||||
|
||||
ifneq (,$(wildcard $(TOOLCHAIN)/base_tools))
|
||||
include $(TOOLCHAIN)/base_tools
|
||||
else
|
||||
ifneq (,$(TOOLCHAIN))
|
||||
ifneq ($(wildcard $(TOOLCHAIN)/bin),)
|
||||
export PATH := $(TOOLCHAIN)/bin:$(PATH)
|
||||
endif
|
||||
endif
|
||||
|
||||
PREFIX := arm-none-eabi-
|
||||
OBJCOPY := $(PREFIX)objcopy
|
||||
export CC := $(PREFIX)gcc
|
||||
export AS := $(PREFIX)as
|
||||
endif
|
||||
export CPP := $(PREFIX)cpp
|
||||
export LD := $(PREFIX)ld
|
||||
AS := $(PREFIX)as
|
||||
LD := $(PREFIX)ld
|
||||
|
||||
# note: the makefile must be set up so MODERNCC is never called
|
||||
# if MODERN=0
|
||||
MODERNCC := $(PREFIX)gcc
|
||||
|
||||
ifeq ($(OS),Windows_NT)
|
||||
EXE := .exe
|
||||
@ -31,6 +29,23 @@ else
|
||||
EXE :=
|
||||
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
|
||||
|
||||
GAME_CODE := AGBJ
|
||||
MAKER_CODE := 01
|
||||
REVISION := 0
|
||||
@ -166,7 +181,7 @@ $(DATA_ASM_BUILDDIR)/%.o: data_dep = $(shell $(SCANINC) $(DATA_ASM_SUBDIR)/$*.s)
|
||||
endif
|
||||
|
||||
payload:
|
||||
@$(MAKE) -C payload COMPARE=$(COMPARE) TOOLCHAIN=$(TOOLCHAIN)
|
||||
@$(MAKE) -C payload COMPARE=$(COMPARE) TOOLCHAIN=$(TOOLCHAIN) MODERN=$(MODERN)
|
||||
|
||||
payload/payload.gba: payload
|
||||
|
||||
|
@ -1,29 +1,27 @@
|
||||
TOOLCHAIN := $(DEVKITARM)
|
||||
COMPARE ?= 0
|
||||
|
||||
ifeq ($(CC),)
|
||||
HOSTCC := gcc
|
||||
else
|
||||
HOSTCC := $(CC)
|
||||
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
|
||||
|
||||
ifeq ($(CXX),)
|
||||
HOSTCXX := g++
|
||||
else
|
||||
HOSTCXX := $(CXX)
|
||||
endif
|
||||
|
||||
ifneq (,$(wildcard $(TOOLCHAIN)/base_tools))
|
||||
include $(TOOLCHAIN)/base_tools
|
||||
else
|
||||
ifneq (,$(TOOLCHAIN))
|
||||
ifneq ($(wildcard $(TOOLCHAIN)/bin),)
|
||||
export PATH := $(TOOLCHAIN)/bin:$(PATH)
|
||||
endif
|
||||
endif
|
||||
|
||||
PREFIX := arm-none-eabi-
|
||||
OBJCOPY := $(PREFIX)objcopy
|
||||
export CC := $(PREFIX)gcc
|
||||
export AS := $(PREFIX)as
|
||||
endif
|
||||
export CPP := $(PREFIX)cpp
|
||||
export LD := $(PREFIX)ld
|
||||
AS := $(PREFIX)as
|
||||
LD := $(PREFIX)ld
|
||||
|
||||
# note: the makefile must be set up so MODERNCC is never called
|
||||
# if MODERN=0
|
||||
MODERNCC := $(PREFIX)gcc
|
||||
|
||||
ifeq ($(OS),Windows_NT)
|
||||
EXE := .exe
|
||||
@ -31,6 +29,23 @@ else
|
||||
EXE :=
|
||||
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
|
||||
|
||||
SHELL := /bin/bash -o pipefail
|
||||
|
||||
CPPFLAGS := -I ../../tools/agbcc/include -I ../../tools/agbcc -iquote include -nostdinc -undef
|
||||
|
@ -736,7 +736,7 @@ EventScript_RegionMap:: @ 827208F
|
||||
|
||||
Common_EventScript_PlayBrineysBoatMusic:: @ 82720A0
|
||||
setflag FLAG_DONT_TRANSITION_MUSIC
|
||||
playbgm MUS_SAILING, 0
|
||||
playbgm MUS_SAILING, FALSE
|
||||
return
|
||||
|
||||
Common_EventScript_StopBrineysBoatMusic:: @ 82720A8
|
||||
|
@ -33,7 +33,7 @@ BattleFrontier_BattlePyramidFloor_EventScript_ShowMapName:: @ 8252A8F
|
||||
end
|
||||
|
||||
BattleFrontier_BattlePyramidFloor_EventScript_PlayPyramidMusic:: @ 8252A98
|
||||
playbgm MUS_B_PYRAMID, 0
|
||||
playbgm MUS_B_PYRAMID, FALSE
|
||||
setvar VAR_TEMP_E, 1
|
||||
end
|
||||
|
||||
|
@ -53,7 +53,7 @@ BattleFrontier_BattlePyramidTop_OnFrame: @ 825516E
|
||||
.2byte 0
|
||||
|
||||
BattleFrontier_BattlePyramidTop_EventScript_PlayPyramidMusic:: @ 8255180
|
||||
playbgm MUS_B_PYRAMID_TOP, 0
|
||||
playbgm MUS_B_PYRAMID_TOP, FALSE
|
||||
setvar VAR_TEMP_E, 1
|
||||
end
|
||||
|
||||
@ -136,7 +136,7 @@ BattleFrontier_BattlePyramidTop_EventScript_BrandonHeardSilverSpeech:: @ 82552D0
|
||||
BattleFrontier_BattlePyramidTop_EventScript_BattleBrandonSilver:: @ 82552DA
|
||||
msgbox BattleFrontier_BattlePyramidTop_Text_BringCourageToOurBattle, MSGBOX_DEFAULT
|
||||
call BattleFrontier_BattlePyramidTop_EventScript_DoBrandonBattle
|
||||
playbgm MUS_B_PYRAMID_TOP, 0
|
||||
playbgm MUS_B_PYRAMID_TOP, FALSE
|
||||
compare VAR_RESULT, 1
|
||||
goto_if_eq BattleFrontier_BattlePyramidTop_EventScript_DefeatedBrandonSilver
|
||||
goto BattleFrontier_BattlePyramid_EventScript_WarpToLobbyLost
|
||||
@ -176,7 +176,7 @@ BattleFrontier_BattlePyramidTop_EventScript_BrandonHeardGoldSpeech:: @ 8255388
|
||||
BattleFrontier_BattlePyramidTop_EventScript_BattleBrandonGold:: @ 8255392
|
||||
msgbox BattleFrontier_BattlePyramidTop_Text_EverythingYouHave, MSGBOX_DEFAULT
|
||||
call BattleFrontier_BattlePyramidTop_EventScript_DoBrandonBattle
|
||||
playbgm MUS_B_PYRAMID_TOP, 0
|
||||
playbgm MUS_B_PYRAMID_TOP, FALSE
|
||||
compare VAR_RESULT, 1
|
||||
goto_if_eq BattleFrontier_BattlePyramidTop_EventScript_DefeatedBrandonGold
|
||||
goto BattleFrontier_BattlePyramid_EventScript_WarpToLobbyLost
|
||||
|
@ -72,7 +72,7 @@ BirthIsland_Exterior_EventScript_Deoxys:: @ 8267FC1
|
||||
setfieldeffectargument 1, 58
|
||||
setfieldeffectargument 2, 26
|
||||
dofieldeffect FLDEFF_DESTROY_DEOXYS_ROCK
|
||||
playbgm MUS_RG_ENCOUNTER_DEOXYS, 0
|
||||
playbgm MUS_RG_ENCOUNTER_DEOXYS, FALSE
|
||||
waitfieldeffect FLDEFF_DESTROY_DEOXYS_ROCK
|
||||
addobject LOCALID_DEOXYS
|
||||
applymovement LOCALID_DEOXYS, BirthIsland_Exterior_Movement_DeoxysApproach
|
||||
|
@ -42,7 +42,7 @@ EverGrandeCity_ChampionsRoom_Movement_PlayerApproachWallace: @ 8228A42
|
||||
step_end
|
||||
|
||||
EverGrandeCity_ChampionsRoom_EventScript_Wallace:: @ 8228A45
|
||||
playbgm MUS_ENCOUNTER_CHAMPION, 0
|
||||
playbgm MUS_ENCOUNTER_CHAMPION, FALSE
|
||||
msgbox EverGrandeCity_ChampionsRoom_Text_IntroSpeech, MSGBOX_DEFAULT
|
||||
trainerbattle_no_intro TRAINER_WALLACE, EverGrandeCity_ChampionsRoom_Text_Defeat
|
||||
goto EverGrandeCity_ChampionsRoom_EventScript_Defeated
|
||||
@ -71,11 +71,11 @@ EverGrandeCity_ChampionsRoom_EventScript_Defeated:: @ 8228A61
|
||||
end
|
||||
|
||||
EverGrandeCity_ChampionsRoom_EventScript_PlayMayMusic:: @ 8228ABC
|
||||
playbgm MUS_ENCOUNTER_MAY, 0
|
||||
playbgm MUS_ENCOUNTER_MAY, FALSE
|
||||
return
|
||||
|
||||
EverGrandeCity_ChampionsRoom_EventScript_PlayBrendanMusic:: @ 8228AC1
|
||||
playbgm MUS_ENCOUNTER_BRENDAN, 0
|
||||
playbgm MUS_ENCOUNTER_BRENDAN, FALSE
|
||||
return
|
||||
|
||||
EverGrandeCity_ChampionsRoom_EventScript_MayAdvice:: @ 8228AC6
|
||||
|
@ -42,7 +42,7 @@ EverGrandeCity_DrakesRoom_EventScript_Drake:: @ 82286F3
|
||||
lock
|
||||
faceplayer
|
||||
goto_if_set FLAG_DEFEATED_ELITE_4_DRAKE, EverGrandeCity_DrakesRoom_EventScript_PostBattleSpeech
|
||||
playbgm MUS_ENCOUNTER_ELITE_FOUR, 0
|
||||
playbgm MUS_ENCOUNTER_ELITE_FOUR, FALSE
|
||||
msgbox EverGrandeCity_DrakesRoom_Text_IntroSpeech, MSGBOX_DEFAULT
|
||||
trainerbattle_no_intro TRAINER_DRAKE, EverGrandeCity_DrakesRoom_Text_Defeat
|
||||
goto EverGrandeCity_DrakesRoom_EventScript_Defeated
|
||||
|
@ -41,7 +41,7 @@ EverGrandeCity_GlaciasRoom_EventScript_Glacia:: @ 8228469
|
||||
lock
|
||||
faceplayer
|
||||
goto_if_set FLAG_DEFEATED_ELITE_4_GLACIA, EverGrandeCity_GlaciasRoom_EventScript_PostBattleSpeech
|
||||
playbgm MUS_ENCOUNTER_ELITE_FOUR, 0
|
||||
playbgm MUS_ENCOUNTER_ELITE_FOUR, FALSE
|
||||
msgbox EverGrandeCity_GlaciasRoom_Text_IntroSpeech, MSGBOX_DEFAULT
|
||||
trainerbattle_no_intro TRAINER_GLACIA, EverGrandeCity_GlaciasRoom_Text_Defeat
|
||||
goto EverGrandeCity_GlaciasRoom_EventScript_Defeated
|
||||
|
@ -41,7 +41,7 @@ EverGrandeCity_PhoebesRoom_EventScript_Phoebe:: @ 82281CB
|
||||
lock
|
||||
faceplayer
|
||||
goto_if_set FLAG_DEFEATED_ELITE_4_PHOEBE, EverGrandeCity_PhoebesRoom_EventScript_PostBattleSpeech
|
||||
playbgm MUS_ENCOUNTER_ELITE_FOUR, 0
|
||||
playbgm MUS_ENCOUNTER_ELITE_FOUR, FALSE
|
||||
msgbox EverGrandeCity_PhoebesRoom_Text_IntroSpeech, MSGBOX_DEFAULT
|
||||
trainerbattle_no_intro TRAINER_PHOEBE, EverGrandeCity_PhoebesRoom_Text_Defeat
|
||||
goto EverGrandeCity_PhoebesRoom_EventScript_Defeated
|
||||
|
@ -47,7 +47,7 @@ EverGrandeCity_SidneysRoom_EventScript_Sidney:: @ 8227F64
|
||||
lock
|
||||
faceplayer
|
||||
goto_if_set FLAG_DEFEATED_ELITE_4_SIDNEY, EverGrandeCity_SidneysRoom_EventScript_PostBattleSpeech
|
||||
playbgm MUS_ENCOUNTER_ELITE_FOUR, 0
|
||||
playbgm MUS_ENCOUNTER_ELITE_FOUR, FALSE
|
||||
msgbox EverGrandeCity_SidneysRoom_Text_IntroSpeech, MSGBOX_DEFAULT
|
||||
trainerbattle_no_intro TRAINER_SIDNEY, EverGrandeCity_SidneysRoom_Text_Defeat
|
||||
goto EverGrandeCity_SidneysRoom_EventScript_Defeated
|
||||
|
@ -105,11 +105,11 @@ LavaridgeTown_EventScript_RivalExit:: @ 81EA5FF
|
||||
end
|
||||
|
||||
LavaridgeTown_EventScript_PlayMayMusic:: @ 81EA630
|
||||
playbgm MUS_ENCOUNTER_MAY, 1
|
||||
playbgm MUS_ENCOUNTER_MAY, TRUE
|
||||
return
|
||||
|
||||
LavaridgeTown_EventScript_PlayBrendanMusic:: @ 81EA635
|
||||
playbgm MUS_ENCOUNTER_BRENDAN, 1
|
||||
playbgm MUS_ENCOUNTER_BRENDAN, TRUE
|
||||
return
|
||||
|
||||
LavaridgeTown_EventScript_RivalNoticePlayer:: @ 81EA63A
|
||||
|
@ -241,7 +241,7 @@ LilycoveCity_EventScript_Rival:: @ 81E2DDE
|
||||
end
|
||||
|
||||
LilycoveCity_EventScript_May:: @ 81E2DF8
|
||||
playbgm MUS_ENCOUNTER_MAY, 1
|
||||
playbgm MUS_ENCOUNTER_MAY, TRUE
|
||||
call_if_set FLAG_DECLINED_RIVAL_BATTLE_LILYCOVE, LilycoveCity_EventScript_MayAskToBattleAgain
|
||||
call_if_unset FLAG_DECLINED_RIVAL_BATTLE_LILYCOVE, LilycoveCity_EventScript_MayAskToBattle
|
||||
compare VAR_RESULT, NO
|
||||
@ -270,7 +270,7 @@ LilycoveCity_EventScript_DeclineMayBattle:: @ 81E2E5A
|
||||
end
|
||||
|
||||
LilycoveCity_EventScript_Brendan:: @ 81E2E6B
|
||||
playbgm MUS_ENCOUNTER_BRENDAN, 1
|
||||
playbgm MUS_ENCOUNTER_BRENDAN, TRUE
|
||||
call_if_set FLAG_DECLINED_RIVAL_BATTLE_LILYCOVE, LilycoveCity_EventScript_BrendanAskToBattleAgain
|
||||
call_if_unset FLAG_DECLINED_RIVAL_BATTLE_LILYCOVE, LilycoveCity_EventScript_BrendanAskToBattle
|
||||
compare VAR_RESULT, NO
|
||||
|
@ -158,7 +158,7 @@ LittlerootTown_BrendansHouse_1F_EventScript_MeetRival:: @ 81F78E2
|
||||
waitmovement 0
|
||||
compare VAR_0x8008, 1
|
||||
call_if_ne LittlerootTown_BrendansHouse_1F_EventScript_PlayerFaceBrendan
|
||||
playbgm MUS_ENCOUNTER_BRENDAN, 1
|
||||
playbgm MUS_ENCOUNTER_BRENDAN, TRUE
|
||||
compare VAR_0x8008, 0
|
||||
call_if_eq LittlerootTown_BrendansHouse_1F_EventScript_BrendanApproachPlayer0
|
||||
compare VAR_0x8008, 1
|
||||
|
@ -74,7 +74,7 @@ LittlerootTown_BrendansHouse_2F_EventScript_MeetBrendan:: @ 81F8497
|
||||
applymovement LOCALID_RIVAL, Common_Movement_Delay48
|
||||
waitmovement 0
|
||||
delay 10
|
||||
playbgm MUS_ENCOUNTER_BRENDAN, 1
|
||||
playbgm MUS_ENCOUNTER_BRENDAN, TRUE
|
||||
compare VAR_FACING, DIR_NORTH
|
||||
call_if_eq LittlerootTown_BrendansHouse_2F_EventScript_MeetBrendanNorth
|
||||
compare VAR_FACING, DIR_SOUTH
|
||||
|
@ -192,7 +192,7 @@ LittlerootTown_MaysHouse_1F_EventScript_MeetRival:: @ 81F8A8B
|
||||
waitmovement 0
|
||||
compare VAR_0x8008, 1
|
||||
call_if_ne LittlerootTown_MaysHouse_1F_EventScript_PlayerFaceMay
|
||||
playbgm MUS_ENCOUNTER_MAY, 1
|
||||
playbgm MUS_ENCOUNTER_MAY, TRUE
|
||||
compare VAR_0x8008, 0
|
||||
call_if_eq LittlerootTown_MaysHouse_1F_EventScript_MayApproachPlayer0
|
||||
compare VAR_0x8008, 1
|
||||
|
@ -74,7 +74,7 @@ LittlerootTown_MaysHouse_2F_EventScript_MeetMay:: @ 81F934A
|
||||
applymovement LOCALID_RIVAL, Common_Movement_Delay48
|
||||
waitmovement 0
|
||||
delay 10
|
||||
playbgm MUS_ENCOUNTER_MAY, 1
|
||||
playbgm MUS_ENCOUNTER_MAY, TRUE
|
||||
compare VAR_FACING, DIR_NORTH
|
||||
call_if_eq LittlerootTown_MaysHouse_2F_EventScript_MeetMayNorth
|
||||
compare VAR_FACING, DIR_SOUTH
|
||||
|
@ -11,7 +11,7 @@ MagmaHideout_4F_MapScripts:: @ 823A55F
|
||||
|
||||
MagmaHideout_4F_EventScript_Maxie:: @ 823A560
|
||||
lockall
|
||||
playbgm MUS_ENCOUNTER_MAGMA, 0
|
||||
playbgm MUS_ENCOUNTER_MAGMA, FALSE
|
||||
msgbox MagmaHideout_4F_Text_MaxieAwakenGroudon, MSGBOX_DEFAULT
|
||||
closemessage
|
||||
delay 20
|
||||
|
@ -21,7 +21,7 @@ MeteorFalls_1F_1R_EventScript_OpenStevensCave:: @ 822BD3A
|
||||
|
||||
MeteorFalls_1F_1R_EventScript_MagmaStealsMeteoriteScene:: @ 822BD5F
|
||||
lockall
|
||||
playbgm MUS_ENCOUNTER_MAGMA, 0
|
||||
playbgm MUS_ENCOUNTER_MAGMA, FALSE
|
||||
applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_FaceDown
|
||||
waitmovement 0
|
||||
delay 30
|
||||
@ -50,7 +50,7 @@ MeteorFalls_1F_1R_EventScript_MagmaStealsMeteoriteScene:: @ 822BD5F
|
||||
addobject LOCALID_ARCHIE
|
||||
addobject LOCALID_AQUA_GRUNT_1
|
||||
addobject LOCALID_AQUA_GRUNT_2
|
||||
playbgm MUS_ENCOUNTER_AQUA, 0
|
||||
playbgm MUS_ENCOUNTER_AQUA, FALSE
|
||||
applymovement LOCALID_ARCHIE, MeteorFalls_1F_1R_Movement_ArchieArrive
|
||||
applymovement LOCALID_AQUA_GRUNT_1, MeteorFalls_1F_1R_Movement_AquaGrunt1Arrive
|
||||
applymovement LOCALID_AQUA_GRUNT_2, MeteorFalls_1F_1R_Movement_AquaGrunt2Arrive
|
||||
|
@ -40,7 +40,7 @@ MtChimney_EventScript_ArchieBusyFighting:: @ 822EE02
|
||||
|
||||
MtChimney_EventScript_Maxie:: @ 822EE0B
|
||||
lockall
|
||||
playbgm MUS_ENCOUNTER_MAGMA, 0
|
||||
playbgm MUS_ENCOUNTER_MAGMA, FALSE
|
||||
msgbox MtChimney_Text_MeteoriteWillActivateVolcano, MSGBOX_DEFAULT
|
||||
applymovement LOCALID_MAXIE, Common_Movement_FacePlayer
|
||||
waitmovement 0
|
||||
|
@ -39,7 +39,7 @@ MtPyre_Summit_EventScript_TeamAquaTrigger2:: @ 8232030
|
||||
end
|
||||
|
||||
MtPyre_Summit_EventScript_TeamAquaExits:: @ 823203C
|
||||
playbgm MUS_ENCOUNTER_AQUA, 0
|
||||
playbgm MUS_ENCOUNTER_AQUA, FALSE
|
||||
applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_FaceUp
|
||||
waitmovement 0
|
||||
applymovement LOCALID_ARCHIE, Common_Movement_WalkInPlaceFastestDown
|
||||
|
@ -43,7 +43,7 @@ OldaleTown_EventScript_MartEmployee:: @ 81E8EFC
|
||||
goto_if_set FLAG_RECEIVED_POTION_OLDALE, OldaleTown_EventScript_ExplainPotion
|
||||
goto_if_set FLAG_TEMP_1, OldaleTown_EventScript_ExplainPotion
|
||||
setflag FLAG_TEMP_1
|
||||
playbgm MUS_FOLLOW_ME, 0
|
||||
playbgm MUS_FOLLOW_ME, FALSE
|
||||
msgbox OldaleTown_Text_IWorkAtPokemonMart, MSGBOX_DEFAULT
|
||||
closemessage
|
||||
switch VAR_FACING
|
||||
|
@ -271,7 +271,7 @@ PetalburgCity_EventScript_ShowGymToPlayer3:: @ 81DC4BE
|
||||
PetalburgCity_EventScript_ShowGymToPlayer:: @ 81DC4CA
|
||||
applymovement LOCALID_GYM_BOY, Common_Movement_FacePlayer
|
||||
waitmovement 0
|
||||
playbgm MUS_FOLLOW_ME, 0
|
||||
playbgm MUS_FOLLOW_ME, FALSE
|
||||
playse SE_PIN
|
||||
applymovement LOCALID_GYM_BOY, Common_Movement_ExclamationMark
|
||||
waitmovement 0
|
||||
|
@ -203,7 +203,7 @@ PetalburgCity_Gym_EventScript_BeginWallyTutorial:: @ 8204AAC
|
||||
msgbox PetalburgCity_Gym_Text_WouldYouReallyComeWithMe, MSGBOX_DEFAULT
|
||||
closemessage
|
||||
setflag FLAG_DONT_TRANSITION_MUSIC
|
||||
playbgm MUS_FOLLOW_ME, 0
|
||||
playbgm MUS_FOLLOW_ME, FALSE
|
||||
compare VAR_0x8008, 0
|
||||
call_if_eq PetalburgCity_Gym_EventScript_ExitGymWithWallySouth
|
||||
compare VAR_0x8008, 1
|
||||
@ -487,7 +487,7 @@ PetalburgCity_Gym_EventScript_WallysDadArrives:: @ 8204F13
|
||||
msgbox PetalburgCity_Gym_Text_LetMeBorrowPlayer, MSGBOX_DEFAULT
|
||||
closemessage
|
||||
setflag FLAG_DONT_TRANSITION_MUSIC
|
||||
playbgm MUS_FOLLOW_ME, 0
|
||||
playbgm MUS_FOLLOW_ME, FALSE
|
||||
compare VAR_0x8008, 1
|
||||
call_if_eq PetalburgCity_Gym_EventScript_ExitGymWithWallysDadNorth
|
||||
compare VAR_0x8008, 2
|
||||
|
@ -11,7 +11,7 @@ PetalburgWoods_EventScript_DevonResearcherLeft:: @ 822DFD7
|
||||
waitmovement 0
|
||||
msgbox PetalburgWoods_Text_HaveYouSeenShroomish, MSGBOX_DEFAULT
|
||||
closemessage
|
||||
playbgm MUS_ENCOUNTER_AQUA, 0
|
||||
playbgm MUS_ENCOUNTER_AQUA, FALSE
|
||||
applymovement LOCALID_GRUNT, PetalburgWoods_Movement_AquaEntrance
|
||||
waitmovement 0
|
||||
msgbox PetalburgWoods_Text_IWasGoingToAmbushYou, MSGBOX_DEFAULT
|
||||
@ -48,7 +48,7 @@ PetalburgWoods_EventScript_DevonResearcherRight:: @ 822E079
|
||||
waitmovement 0
|
||||
msgbox PetalburgWoods_Text_HaveYouSeenShroomish, MSGBOX_DEFAULT
|
||||
closemessage
|
||||
playbgm MUS_ENCOUNTER_AQUA, 0
|
||||
playbgm MUS_ENCOUNTER_AQUA, FALSE
|
||||
applymovement LOCALID_GRUNT, PetalburgWoods_Movement_AquaEntrance
|
||||
waitmovement 0
|
||||
msgbox PetalburgWoods_Text_IWasGoingToAmbushYou, MSGBOX_DEFAULT
|
||||
|
@ -21,7 +21,7 @@ Route101_EventScript_HideMapNamePopup:: @ 81EBCD5
|
||||
|
||||
Route101_EventScript_StartBirchRescue:: @ 81EBCDE
|
||||
lockall
|
||||
playbgm MUS_HELP, 1
|
||||
playbgm MUS_HELP, TRUE
|
||||
msgbox Route101_Text_HelpMe, MSGBOX_DEFAULT
|
||||
closemessage
|
||||
setobjectxy LOCALID_BIRCH, 0, 15
|
||||
|
@ -31,7 +31,7 @@ Route103_EventScript_Rival:: @ 81EC3C1
|
||||
Route103_EventScript_RivalMay:: @ 81EC3DA
|
||||
msgbox Route103_Text_MayRoute103Pokemon, MSGBOX_DEFAULT
|
||||
closemessage
|
||||
playbgm MUS_ENCOUNTER_MAY, 1
|
||||
playbgm MUS_ENCOUNTER_MAY, TRUE
|
||||
applymovement LOCALID_RIVAL, Common_Movement_FacePlayer
|
||||
waitmovement 0
|
||||
applymovement LOCALID_RIVAL, Common_Movement_ExclamationMark
|
||||
@ -48,7 +48,7 @@ Route103_EventScript_RivalMay:: @ 81EC3DA
|
||||
Route103_EventScript_RivalBrendan:: @ 81EC434
|
||||
msgbox Route103_Text_BrendanRoute103Pokemon, MSGBOX_DEFAULT
|
||||
closemessage
|
||||
playbgm MUS_ENCOUNTER_BRENDAN, 1
|
||||
playbgm MUS_ENCOUNTER_BRENDAN, TRUE
|
||||
applymovement LOCALID_RIVAL, Common_Movement_FacePlayer
|
||||
waitmovement 0
|
||||
applymovement LOCALID_RIVAL, Common_Movement_ExclamationMark
|
||||
|
@ -84,11 +84,11 @@ Route104_EventScript_PlayRivalMusic:: @ 81ECD11
|
||||
return
|
||||
|
||||
Route104_EventScript_PlayMayMusic:: @ 81ECD29
|
||||
playbgm MUS_ENCOUNTER_MAY, 1
|
||||
playbgm MUS_ENCOUNTER_MAY, TRUE
|
||||
return
|
||||
|
||||
Route104_EventScript_PlayBrendanMusic:: @ 81ECD2E
|
||||
playbgm MUS_ENCOUNTER_BRENDAN, 1
|
||||
playbgm MUS_ENCOUNTER_BRENDAN, TRUE
|
||||
return
|
||||
|
||||
Route104_EventScript_RivalEncounter:: @ 81ECD33
|
||||
|
@ -410,11 +410,11 @@ Route110_EventScript_RivalScene:: @ 81EF76E
|
||||
end
|
||||
|
||||
Route110_EventScript_PlayMayMusic:: @ 81EF7E1
|
||||
playbgm MUS_ENCOUNTER_MAY, 1
|
||||
playbgm MUS_ENCOUNTER_MAY, TRUE
|
||||
return
|
||||
|
||||
Route110_EventScript_PlayBrendanMusic:: @ 81EF7E6
|
||||
playbgm MUS_ENCOUNTER_BRENDAN, 1
|
||||
playbgm MUS_ENCOUNTER_BRENDAN, TRUE
|
||||
return
|
||||
|
||||
Route110_EventScript_MayBattle:: @ 81EF7EB
|
||||
|
@ -74,11 +74,11 @@ Route119_EventScript_RivalEncounter:: @ 81F4488
|
||||
end
|
||||
|
||||
Route119_EventScript_PlayMayMusic:: @ 81F4501
|
||||
playbgm MUS_ENCOUNTER_MAY, 1
|
||||
playbgm MUS_ENCOUNTER_MAY, TRUE
|
||||
return
|
||||
|
||||
Route119_EventScript_PlayBrendanMusic:: @ 81F4506
|
||||
playbgm MUS_ENCOUNTER_BRENDAN, 1
|
||||
playbgm MUS_ENCOUNTER_BRENDAN, TRUE
|
||||
return
|
||||
|
||||
Route119_EventScript_BattleMay:: @ 81F450B
|
||||
|
@ -19,7 +19,7 @@ Route121_EventScript_SafariZoneSign:: @ 81F5E0F
|
||||
|
||||
Route121_EventScript_AquaGruntsMoveOut:: @ 81F5E18
|
||||
lockall
|
||||
playbgm MUS_ENCOUNTER_AQUA, 0
|
||||
playbgm MUS_ENCOUNTER_AQUA, FALSE
|
||||
applymovement LOCALID_GRUNT_2, Common_Movement_WalkInPlaceRight
|
||||
waitmovement 0
|
||||
msgbox Route121_Text_OkayMoveOutToMtPyre, MSGBOX_DEFAULT
|
||||
|
@ -294,7 +294,7 @@ RustboroCity_EventScript_StolenGoodsTrigger4:: @ 81E09B6
|
||||
RustboroCity_EventScript_StolenGoodsScene:: @ 81E09CD
|
||||
msgbox RustboroCity_Text_OutOfTheWay, MSGBOX_DEFAULT
|
||||
closemessage
|
||||
playbgm MUS_ENCOUNTER_AQUA, 0
|
||||
playbgm MUS_ENCOUNTER_AQUA, FALSE
|
||||
addobject LOCALID_GRUNT
|
||||
addobject LOCALID_DEVON_EMPLOYEE
|
||||
applymovement LOCALID_GRUNT, RustboroCity_Movement_GruntEscape
|
||||
@ -706,11 +706,11 @@ RustboroCity_EventScript_PlayRivalMusic:: @ 81E0DD1
|
||||
return
|
||||
|
||||
RustboroCity_EventScript_PlayMayMusic:: @ 81E0DE9
|
||||
playbgm MUS_ENCOUNTER_MAY, 1
|
||||
playbgm MUS_ENCOUNTER_MAY, TRUE
|
||||
return
|
||||
|
||||
RustboroCity_EventScript_PlayBrendanMusic:: @ 81E0DEE
|
||||
playbgm MUS_ENCOUNTER_BRENDAN, 1
|
||||
playbgm MUS_ENCOUNTER_BRENDAN, TRUE
|
||||
return
|
||||
|
||||
RustboroCity_EventScript_RivalTrigger0:: @ 81E0DF3
|
||||
|
@ -39,7 +39,7 @@ RustboroCity_DevonCorp_3F_EventScript_MeetPresident:: @ 821246E
|
||||
waitmovement 0
|
||||
msgbox RustboroCity_DevonCorp_3F_Text_WordWithPresidentComeWithMe, MSGBOX_DEFAULT
|
||||
closemessage
|
||||
playbgm MUS_FOLLOW_ME, 0
|
||||
playbgm MUS_FOLLOW_ME, FALSE
|
||||
applymovement LOCALID_DEVON_EMPLOYEE, RustboroCity_DevonCorp_3F_Movement_LeadPlayerToPresident
|
||||
applymovement OBJ_EVENT_ID_PLAYER, RustboroCity_DevonCorp_3F_Movement_PlayerFollowToPresident
|
||||
waitmovement 0
|
||||
|
@ -316,7 +316,7 @@ RusturfTunnel_EventScript_Peeko:: @ 822D0AF
|
||||
RusturfTunnel_EventScript_Grunt:: @ 822D0C2
|
||||
lock
|
||||
faceplayer
|
||||
playbgm MUS_ENCOUNTER_AQUA, 0
|
||||
playbgm MUS_ENCOUNTER_AQUA, FALSE
|
||||
msgbox RusturfTunnel_Text_GruntIntro, MSGBOX_DEFAULT
|
||||
trainerbattle_no_intro TRAINER_GRUNT_RUSTURF_TUNNEL, RusturfTunnel_Text_GruntDefeat
|
||||
msgbox RusturfTunnel_Text_GruntTakePackage, MSGBOX_DEFAULT
|
||||
|
@ -18,7 +18,7 @@ SeafloorCavern_Room9_EventScript_ArchieAwakenKyogre:: @ 8234DC9
|
||||
waitmovement 0
|
||||
applymovement OBJ_EVENT_ID_PLAYER, SeafloorCavern_Room9_Movement_Delay32
|
||||
waitmovement 0
|
||||
playbgm MUS_ENCOUNTER_AQUA, 0
|
||||
playbgm MUS_ENCOUNTER_AQUA, FALSE
|
||||
msgbox SeafloorCavern_Room9_Text_ArchieHoldItRightThere, MSGBOX_DEFAULT
|
||||
closemessage
|
||||
addobject VAR_0x8004
|
||||
|
@ -603,7 +603,7 @@ SlateportCity_EventScript_CaptStern:: @ 81DD1F8
|
||||
applymovement LOCALID_CAPT_STERN, Common_Movement_WalkInPlaceFastestUp
|
||||
waitmovement 0
|
||||
msgbox SlateportCity_Text_OhPlayerWeMadeDiscovery, MSGBOX_DEFAULT
|
||||
playbgm MUS_ENCOUNTER_AQUA, 0
|
||||
playbgm MUS_ENCOUNTER_AQUA, FALSE
|
||||
msgbox SlateportCity_Text_AquaWillAssumeControlOfSubmarine, MSGBOX_DEFAULT
|
||||
applymovement LOCALID_COOK, Common_Movement_WalkInPlaceFastestLeft
|
||||
applymovement LOCALID_FAT_MAN, Common_Movement_WalkInPlaceFastestLeft
|
||||
|
@ -11,7 +11,7 @@ SlateportCity_OceanicMuseum_2F_EventScript_CaptStern:: @ 820BB00
|
||||
faceplayer
|
||||
msgbox SlateportCity_OceanicMuseum_2F_Text_ThankYouForTheParts, MSGBOX_DEFAULT
|
||||
closemessage
|
||||
playbgm MUS_ENCOUNTER_AQUA, 1
|
||||
playbgm MUS_ENCOUNTER_AQUA, TRUE
|
||||
addobject LOCALID_GRUNT_1
|
||||
applymovement LOCALID_GRUNT_1, SlateportCity_OceanicMuseum_2F_Movement_FirstGruntEnter
|
||||
waitmovement 0
|
||||
|
@ -916,7 +916,7 @@ ContestHall_EventScript_ContestResults:: @ 827A8A5
|
||||
setvar VAR_TEMP_9, 1
|
||||
showcontestresults
|
||||
setvar VAR_TEMP_9, 0
|
||||
playbgm MUS_CONTEST_WINNER, 0
|
||||
playbgm MUS_CONTEST_WINNER, FALSE
|
||||
return
|
||||
|
||||
ContestHall_EventScript_ThatsItForJudging:: @ 827A8FB
|
||||
|
@ -159,7 +159,7 @@ PlayersHouse_1F_EventScript_PetalburgGymReportMale:: @ 829286D
|
||||
call PlayersHouse_1F_EventScript_MomNoticeGymBroadcast
|
||||
applymovement OBJ_EVENT_ID_PLAYER, PlayersHouse_1F_Movement_PlayerApproachTVForGymMale
|
||||
waitmovement 0
|
||||
playbgm MUS_ENCOUNTER_INTERVIEWER, 0
|
||||
playbgm MUS_ENCOUNTER_INTERVIEWER, FALSE
|
||||
msgbox PlayersHouse_1F_Text_MaybeDadWillBeOn, MSGBOX_DEFAULT
|
||||
closemessage
|
||||
applymovement VAR_0x8005, PlayersHouse_1F_Movement_MomMakeRoomToSeeTVMale
|
||||
@ -184,7 +184,7 @@ PlayersHouse_1F_EventScript_PetalburgGymReportFemale:: @ 82928DC
|
||||
call PlayersHouse_1F_EventScript_MomNoticeGymBroadcast
|
||||
applymovement OBJ_EVENT_ID_PLAYER, PlayersHouse_1F_Movement_PlayerApproachTVForGymFemale
|
||||
waitmovement 0
|
||||
playbgm MUS_ENCOUNTER_INTERVIEWER, 0
|
||||
playbgm MUS_ENCOUNTER_INTERVIEWER, FALSE
|
||||
msgbox PlayersHouse_1F_Text_MaybeDadWillBeOn, MSGBOX_DEFAULT
|
||||
closemessage
|
||||
applymovement VAR_0x8005, PlayersHouse_1F_Movement_MomMakeRoomToSeeTVFemale
|
||||
|
41
docs/legacy_WSL1_INSTALL.md
Normal file
41
docs/legacy_WSL1_INSTALL.md
Normal file
@ -0,0 +1,41 @@
|
||||
### Setting up WSL1 (Legacy Portion)
|
||||
|
||||
1. Certain packages are required to build pokeemerald. Install these packages by running the following command:
|
||||
|
||||
```bash
|
||||
sudo apt install build-essential git libpng-dev gdebi-core
|
||||
```
|
||||
> Note: If the above command does not work, try the above command but replacing `apt` with `apt-get`.
|
||||
|
||||
2. Once the packages have finished installing, download the devkitPro pacman package [here](https://github.com/devkitPro/pacman/releases). The file to download is `devkitpro-pacman.amd64.deb`.
|
||||
|
||||
3. WSL has its own file system that's not accessible from Windows, but Windows files *are* accessible from WSL. To install the devkitPro package, you'll need to change to the **current working directory** where the package file was saved.
|
||||
|
||||
For example, if the package file was saved to **C:\Users\\_\<user>_\Downloads** (the Downloads location for most users), enter this command, where *\<user>* is your **Windows** username:
|
||||
|
||||
```bash
|
||||
cd /mnt/c/Users/<user>/Downloads
|
||||
```
|
||||
|
||||
> Note 1: The Windows C:\ drive is called /mnt/c/ in WSL.
|
||||
> Note 2: If the path has spaces, then the path must be wrapped with quotations, e.g. `cd "/mnt/c/users/<user>/Downloads folder"`.
|
||||
> Note 3: Windows path names are case-insensitive so adhering to capitalization isn't needed
|
||||
|
||||
4. Once the directory has been changed to the folder containing the devkitPro pacman package, run the following commands to install devkitARM.
|
||||
|
||||
```bash
|
||||
sudo gdebi devkitpro-pacman.amd64.deb
|
||||
sudo dkp-pacman -Sy
|
||||
sudo dkp-pacman -S gba-dev
|
||||
```
|
||||
|
||||
The last command will ask for the selection of packages to install. Just press Enter to install all of them, followed by entering Y to proceed with the installation.
|
||||
|
||||
> Note: `devkitpro-pacman.amd64.deb` is the expected filename of the devkitPro package downloaded (for the first command). If the downloaded package filename differs, then use that filename instead.
|
||||
|
||||
5. Run the following command to set devkitPro related environment variables (alternatively, close and re-open WSL):
|
||||
```bash
|
||||
source /etc/profile.d/devkit-env.sh
|
||||
```
|
||||
|
||||
Proceed to [Choosing where to store pokeemerald (WSL1) of the current INSTALL.md](/INSTALL.md#choosing-where-to-store-pokeemerald-WSL1).
|
56
gflib/bg.c
56
gflib/bg.c
@ -55,7 +55,7 @@ void ResetBgs(void)
|
||||
|
||||
static void SetBgModeInternal(u8 bgMode)
|
||||
{
|
||||
sGpuBgConfigs.bgVisibilityAndMode &= 0xFFF8;
|
||||
sGpuBgConfigs.bgVisibilityAndMode &= ~0x7;
|
||||
sGpuBgConfigs.bgVisibilityAndMode |= bgMode;
|
||||
}
|
||||
|
||||
@ -66,13 +66,11 @@ u8 GetBgMode(void)
|
||||
|
||||
void ResetBgControlStructs(void)
|
||||
{
|
||||
struct BgConfig* bgConfigs = &sGpuBgConfigs.configs[0];
|
||||
struct BgConfig zeroedConfig = sZeroedBgControlStruct;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < NUM_BACKGROUNDS; i++)
|
||||
{
|
||||
bgConfigs[i] = zeroedConfig;
|
||||
sGpuBgConfigs.configs[i] = sZeroedBgControlStruct;
|
||||
}
|
||||
}
|
||||
|
||||
@ -175,36 +173,30 @@ u8 LoadBgVram(u8 bg, const void *src, u16 size, u16 destOffset, u8 mode)
|
||||
u16 offset;
|
||||
s8 cursor;
|
||||
|
||||
if (!IsInvalidBg(bg) && sGpuBgConfigs.configs[bg].visible)
|
||||
{
|
||||
switch (mode)
|
||||
{
|
||||
case 0x1:
|
||||
offset = sGpuBgConfigs.configs[bg].charBaseIndex * BG_CHAR_SIZE;
|
||||
break;
|
||||
case 0x2:
|
||||
offset = sGpuBgConfigs.configs[bg].mapBaseIndex * BG_SCREEN_SIZE;
|
||||
break;
|
||||
default:
|
||||
cursor = -1;
|
||||
goto end;
|
||||
}
|
||||
if (IsInvalidBg(bg) || !sGpuBgConfigs.configs[bg].visible)
|
||||
return -1;
|
||||
|
||||
switch (mode)
|
||||
{
|
||||
case 0x1:
|
||||
offset = sGpuBgConfigs.configs[bg].charBaseIndex * BG_CHAR_SIZE;
|
||||
offset = destOffset + offset;
|
||||
|
||||
cursor = RequestDma3Copy(src, (void*)(offset + BG_VRAM), size, 0);
|
||||
|
||||
if (cursor == -1)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return -1;
|
||||
break;
|
||||
case 0x2:
|
||||
offset = sGpuBgConfigs.configs[bg].mapBaseIndex * BG_SCREEN_SIZE;
|
||||
offset = destOffset + offset;
|
||||
cursor = RequestDma3Copy(src, (void*)(offset + BG_VRAM), size, 0);
|
||||
if (cursor == -1)
|
||||
return -1;
|
||||
break;
|
||||
default:
|
||||
cursor = -1;
|
||||
break;
|
||||
}
|
||||
|
||||
end:
|
||||
return cursor;
|
||||
}
|
||||
|
||||
@ -254,17 +246,17 @@ static void SetBgAffineInternal(u8 bg, s32 srcCenterX, s32 srcCenterY, s16 dispC
|
||||
|
||||
switch (sGpuBgConfigs.bgVisibilityAndMode & 0x7)
|
||||
{
|
||||
default:
|
||||
case 0:
|
||||
return;
|
||||
case 1:
|
||||
if (bg != 2)
|
||||
return;
|
||||
break;
|
||||
case 2:
|
||||
if (bg < 2 || bg >= NUM_BACKGROUNDS)
|
||||
if (bg != 2 && bg != 3)
|
||||
return;
|
||||
break;
|
||||
case 0:
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
src.texX = srcCenterX;
|
||||
@ -697,7 +689,7 @@ s32 ChangeBgY(u8 bg, s32 value, u8 op)
|
||||
return sGpuBgConfigs2[bg].bg_y;
|
||||
}
|
||||
|
||||
s32 ChangeBgY_ScreenOff(u8 bg, u32 value, u8 op)
|
||||
s32 ChangeBgY_ScreenOff(u8 bg, s32 value, u8 op)
|
||||
{
|
||||
u8 mode;
|
||||
u16 temp1;
|
||||
|
@ -59,7 +59,7 @@ u16 GetBgAttribute(u8 bg, u8 attributeId);
|
||||
s32 ChangeBgX(u8 bg, s32 value, u8 op);
|
||||
s32 GetBgX(u8 bg);
|
||||
s32 ChangeBgY(u8 bg, s32 value, u8 op);
|
||||
s32 ChangeBgY_ScreenOff(u8 bg, u32 value, u8 op);
|
||||
s32 ChangeBgY_ScreenOff(u8 bg, s32 value, u8 op);
|
||||
s32 GetBgY(u8 bg);
|
||||
void SetBgAffine(u8 bg, s32 srcCenterX, s32 srcCenterY, s16 dispCenterX, s16 dispCenterY, s16 scaleX, s16 scaleY, u16 rotationAngle);
|
||||
u8 Unused_AdjustBgMosaic(u8 a1, u8 a2);
|
||||
|
@ -452,6 +452,10 @@ void SortSprites(void)
|
||||
// Although this doesn't result in a bug in the ROM,
|
||||
// the behavior is undefined.
|
||||
j--;
|
||||
#ifdef UBFIX
|
||||
if (j == 0)
|
||||
break;
|
||||
#endif
|
||||
|
||||
sprite1 = &gSprites[sSpriteOrder[j - 1]];
|
||||
sprite2 = &gSprites[sSpriteOrder[j]];
|
||||
@ -661,8 +665,7 @@ void ResetOamRange(u8 a, u8 b)
|
||||
|
||||
for (i = a; i < b; i++)
|
||||
{
|
||||
struct OamData *oamBuffer = gMain.oamBuffer;
|
||||
oamBuffer[i] = *(struct OamData *)&gDummyOamData;
|
||||
gMain.oamBuffer[i] = *(struct OamData *)&gDummyOamData;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -258,7 +258,6 @@ extern const u8 gFacilityClassToPicIndex[];
|
||||
extern const u8 gFacilityClassToTrainerClass[];
|
||||
extern const struct BaseStats gBaseStats[];
|
||||
extern const u8 *const gItemEffectTable[];
|
||||
extern const struct Evolution gEvolutionTable[][EVOS_PER_MON];
|
||||
extern const u32 gExperienceTables[][MAX_LEVEL + 1];
|
||||
extern const u16 *const gLevelUpLearnsets[];
|
||||
extern const u8 gPPUpGetMask[];
|
||||
|
@ -1,29 +1,28 @@
|
||||
TOOLCHAIN := $(DEVKITARM)
|
||||
COMPARE ?= 0
|
||||
|
||||
ifeq ($(CC),)
|
||||
HOSTCC := gcc
|
||||
else
|
||||
HOSTCC := $(CC)
|
||||
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
|
||||
|
||||
ifeq ($(CXX),)
|
||||
HOSTCXX := g++
|
||||
else
|
||||
HOSTCXX := $(CXX)
|
||||
endif
|
||||
|
||||
ifneq (,$(wildcard $(TOOLCHAIN)/base_tools))
|
||||
include $(TOOLCHAIN)/base_tools
|
||||
else
|
||||
ifneq (,$(TOOLCHAIN))
|
||||
ifneq ($(wildcard $(TOOLCHAIN)/bin),)
|
||||
export PATH := $(TOOLCHAIN)/bin:$(PATH)
|
||||
endif
|
||||
endif
|
||||
|
||||
PREFIX := arm-none-eabi-
|
||||
OBJCOPY := $(PREFIX)objcopy
|
||||
export CC := $(PREFIX)gcc
|
||||
export AS := $(PREFIX)as
|
||||
endif
|
||||
export CPP := $(PREFIX)cpp
|
||||
export LD := $(PREFIX)ld
|
||||
AS := $(PREFIX)as
|
||||
LD := $(PREFIX)ld
|
||||
AR := $(PREFIX)ar
|
||||
|
||||
# note: the makefile must be set up so MODERNCC is never called
|
||||
# if MODERN=0
|
||||
MODERNCC := $(PREFIX)gcc
|
||||
|
||||
ifeq ($(OS),Windows_NT)
|
||||
EXE := .exe
|
||||
@ -31,6 +30,23 @@ else
|
||||
EXE :=
|
||||
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
|
||||
|
||||
ASFLAGS := -mcpu=arm7tdmi
|
||||
ARFLAGS := rc
|
||||
|
||||
|
@ -9,9 +9,9 @@ MAP_EVENTS := $(patsubst $(MAPS_DIR)/%/,$(MAPS_DIR)/%/events.inc,$(MAP_DIRS))
|
||||
MAP_HEADERS := $(patsubst $(MAPS_DIR)/%/,$(MAPS_DIR)/%/header.inc,$(MAP_DIRS))
|
||||
|
||||
$(DATA_ASM_BUILDDIR)/maps.o: $(DATA_ASM_SUBDIR)/maps.s $(LAYOUTS_DIR)/layouts.inc $(LAYOUTS_DIR)/layouts_table.inc $(MAPS_DIR)/headers.inc $(MAPS_DIR)/groups.inc $(MAPS_DIR)/connections.inc $(MAP_CONNECTIONS) $(MAP_HEADERS)
|
||||
$(PREPROC) $< charmap.txt | $(CPP) -I include | $(AS) $(ASFLAGS) -o $@
|
||||
$(PREPROC) $< charmap.txt | $(CPP) -I include - | $(AS) $(ASFLAGS) -o $@
|
||||
$(DATA_ASM_BUILDDIR)/map_events.o: $(DATA_ASM_SUBDIR)/map_events.s $(MAPS_DIR)/events.inc $(MAP_EVENTS)
|
||||
$(PREPROC) $< charmap.txt | $(CPP) -I include | $(AS) $(ASFLAGS) -o $@
|
||||
$(PREPROC) $< charmap.txt | $(CPP) -I include - | $(AS) $(ASFLAGS) -o $@
|
||||
|
||||
$(MAPS_DIR)/%/header.inc: $(MAPS_DIR)/%/map.json
|
||||
$(MAPJSON) map emerald $< $(LAYOUTS_DIR)/layouts.json
|
||||
|
@ -1761,7 +1761,11 @@ static void Cmd_if_cant_faint(void)
|
||||
|
||||
gBattleMoveDamage = gBattleMoveDamage * AI_THINKING_STRUCT->simulatedRNG[AI_THINKING_STRUCT->movesetIndex] / 100;
|
||||
|
||||
// This macro is missing the damage 0 = 1 assumption.
|
||||
#ifdef BUGFIX
|
||||
// Moves always do at least 1 damage.
|
||||
if (gBattleMoveDamage == 0)
|
||||
gBattleMoveDamage = 1;
|
||||
#endif
|
||||
|
||||
if (gBattleMons[gBattlerTarget].hp > gBattleMoveDamage)
|
||||
gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1);
|
||||
@ -2019,18 +2023,24 @@ static void Cmd_if_holds_item(void)
|
||||
{
|
||||
u8 battlerId = BattleAI_GetWantedBattler(gAIScriptPtr[1]);
|
||||
u16 item;
|
||||
u8 var1, var2;
|
||||
u8 itemLo, itemHi;
|
||||
|
||||
if ((battlerId & BIT_SIDE) == (sBattler_AI & BIT_SIDE))
|
||||
item = gBattleMons[battlerId].item;
|
||||
else
|
||||
item = BATTLE_HISTORY->itemEffects[battlerId];
|
||||
|
||||
// UB: doesn't properly read an unaligned u16
|
||||
var2 = gAIScriptPtr[2];
|
||||
var1 = gAIScriptPtr[3];
|
||||
itemHi = gAIScriptPtr[2];
|
||||
itemLo = gAIScriptPtr[3];
|
||||
|
||||
if ((var1 | var2) == item)
|
||||
#ifdef BUGFIX
|
||||
// This bug doesn't affect the vanilla game because this script command
|
||||
// is only used to check ITEM_PERSIM_BERRY, whose high byte happens to
|
||||
// be 0.
|
||||
if (((itemHi << 8) | itemLo) == item)
|
||||
#else
|
||||
if ((itemLo | itemHi) == item)
|
||||
#endif
|
||||
gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4);
|
||||
else
|
||||
gAIScriptPtr += 8;
|
||||
|
@ -38,7 +38,7 @@ static void GenerateInitialRentalMons(void);
|
||||
static void GetOpponentMostCommonMonType(void);
|
||||
static void GetOpponentBattleStyle(void);
|
||||
static void RestorePlayerPartyHeldItems(void);
|
||||
static u16 GetFactoryMonId(u8 lvlMode, u8 challengeNum, bool8 arg2);
|
||||
static u16 GetFactoryMonId(u8 lvlMode, u8 challengeNum, bool8 useBetterRange);
|
||||
static u8 GetMoveBattleStyle(u16 move);
|
||||
|
||||
// Number of moves needed on the team to be considered using a certain battle style
|
||||
|
@ -383,7 +383,7 @@ static const u8 sText_ThrewPokeblockAtPkmn[] = _("{B_PLAYER_NAME} threw a {POKEB
|
||||
static const u8 sText_OutOfSafariBalls[] = _("{PLAY_SE SE_DING_DONG}ANNOUNCER: You're out of\nSAFARI BALLS! Game over!\p");
|
||||
static const u8 sText_OpponentMon1Appeared[] = _("{B_OPPONENT_MON1_NAME} appeared!\p");
|
||||
static const u8 sText_WildPkmnAppeared[] = _("Wild {B_OPPONENT_MON1_NAME} appeared!\p");
|
||||
static const u8 sText_WildPkmnAppeared2[] = _("Wild {B_OPPONENT_MON1_NAME} appeared!\p");
|
||||
static const u8 sText_LegendaryPkmnAppeared[] = _("Wild {B_OPPONENT_MON1_NAME} appeared!\p");
|
||||
static const u8 sText_WildPkmnAppearedPause[] = _("Wild {B_OPPONENT_MON1_NAME} appeared!{PAUSE 127}");
|
||||
static const u8 sText_TwoWildPkmnAppeared[] = _("Wild {B_OPPONENT_MON1_NAME} and\n{B_OPPONENT_MON2_NAME} appeared!\p");
|
||||
static const u8 sText_Trainer1WantsToBattle[] = _("{B_TRAINER1_CLASS} {B_TRAINER1_NAME}\nwould like to battle!\p");
|
||||
@ -2125,7 +2125,7 @@ void BufferStringBattle(u16 stringID)
|
||||
else
|
||||
{
|
||||
if (gBattleTypeFlags & BATTLE_TYPE_LEGENDARY)
|
||||
stringPtr = sText_WildPkmnAppeared2;
|
||||
stringPtr = sText_LegendaryPkmnAppeared;
|
||||
else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) // interesting, looks like they had something planned for wild double battles
|
||||
stringPtr = sText_TwoWildPkmnAppeared;
|
||||
else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL)
|
||||
|
@ -3357,7 +3357,7 @@ static void Cmd_getexp(void)
|
||||
// get exp getter battlerId
|
||||
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
|
||||
{
|
||||
if (!(gBattlerPartyIndexes[2] != gBattleStruct->expGetterMonId) && !(gAbsentBattlerFlags & gBitTable[2]))
|
||||
if (gBattlerPartyIndexes[2] == gBattleStruct->expGetterMonId && !(gAbsentBattlerFlags & gBitTable[2]))
|
||||
gBattleStruct->expGetterBattlerId = 2;
|
||||
else
|
||||
{
|
||||
@ -3431,14 +3431,13 @@ static void Cmd_getexp(void)
|
||||
gBattleMons[0].maxHP = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_MAX_HP);
|
||||
gBattleMons[0].attack = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_ATK);
|
||||
gBattleMons[0].defense = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_DEF);
|
||||
// Why is this duplicated?
|
||||
// Speed is duplicated, likely due to a copy-paste error.
|
||||
gBattleMons[0].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPEED);
|
||||
gBattleMons[0].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPEED);
|
||||
|
||||
gBattleMons[0].spAttack = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPATK);
|
||||
gBattleMons[0].spDefense = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPDEF);
|
||||
}
|
||||
// What is else if?
|
||||
|
||||
if (gBattlerPartyIndexes[2] == gBattleStruct->expGetterMonId && gBattleMons[2].hp && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE))
|
||||
{
|
||||
gBattleMons[2].level = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_LEVEL);
|
||||
@ -3446,10 +3445,13 @@ static void Cmd_getexp(void)
|
||||
gBattleMons[2].maxHP = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_MAX_HP);
|
||||
gBattleMons[2].attack = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_ATK);
|
||||
gBattleMons[2].defense = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_DEF);
|
||||
// Duplicated again, but this time there's no Sp Defense
|
||||
gBattleMons[2].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPEED);
|
||||
// Speed is duplicated again, but Special Defense is missing.
|
||||
#ifdef BUGFIX
|
||||
gBattleMons[2].spDefense = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPDEF);
|
||||
#else
|
||||
gBattleMons[2].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPEED);
|
||||
|
||||
#endif
|
||||
gBattleMons[2].spAttack = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPATK);
|
||||
}
|
||||
gBattleScripting.getexpState = 5;
|
||||
@ -6168,7 +6170,13 @@ static void Cmd_recordlastability(void)
|
||||
{
|
||||
gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);
|
||||
RecordAbilityBattle(gActiveBattler, gLastUsedAbility);
|
||||
gBattlescriptCurrInstr += 1; // UB: Should be + 2, one byte for command and one byte for battlerId argument.
|
||||
|
||||
#ifdef BUGFIX
|
||||
// This command occupies two bytes (one for the command id, and one for the battler id parameter).
|
||||
gBattlescriptCurrInstr += 2;
|
||||
#else
|
||||
gBattlescriptCurrInstr += 1;
|
||||
#endif
|
||||
}
|
||||
|
||||
void BufferMoveToLearnIntoBattleTextBuff2(void)
|
||||
|
@ -1323,6 +1323,12 @@ static bool8 Phase2_BigPokeball_Func1(struct Task *task)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
#define SOME_VRAM_STORE(ptr, posY, posX, toStore) \
|
||||
{ \
|
||||
u32 index = (posY) * 32 + posX; \
|
||||
ptr[index] = toStore; \
|
||||
}
|
||||
|
||||
static bool8 Phase2_BigPokeball_Func2(struct Task *task)
|
||||
{
|
||||
s16 i, j;
|
||||
@ -1335,7 +1341,7 @@ static bool8 Phase2_BigPokeball_Func2(struct Task *task)
|
||||
{
|
||||
for (j = 0; j < 30; j++, BigPokeballMap++)
|
||||
{
|
||||
tilemap[i * 32 + j] = *BigPokeballMap | 0xF000;
|
||||
SOME_VRAM_STORE(tilemap, i, j, *BigPokeballMap | 0xF000);
|
||||
}
|
||||
}
|
||||
sub_8149F98(gScanlineEffectRegBuffers[0], 0, task->tData4, 132, task->tData5, 160);
|
||||
@ -1675,12 +1681,6 @@ bool8 FldEff_Pokeball(void)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
#define SOME_VRAM_STORE(ptr, posY, posX, toStore) \
|
||||
{ \
|
||||
u32 index = (posY) * 32 + posX; \
|
||||
ptr[index] = toStore; \
|
||||
}
|
||||
|
||||
static void sub_814713C(struct Sprite *sprite)
|
||||
{
|
||||
s16 arr0[ARRAY_COUNT(sUnknown_085C8B96)];
|
||||
@ -2142,7 +2142,7 @@ static bool8 Phase2_Mugshot_Func2(struct Task *task)
|
||||
{
|
||||
for (j = 0; j < 32; j++, mugshotsMap++)
|
||||
{
|
||||
tilemap[i * 32 + j] = *mugshotsMap | 0xF000;
|
||||
SOME_VRAM_STORE(tilemap, i, j, *mugshotsMap | 0xF000);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2960,17 +2960,15 @@ static bool8 Phase2_RectangularSpiral_Func2(struct Task *task)
|
||||
|
||||
if (sub_8149048(gUnknown_085C8D38[j / 2], &sRectangularSpiralTransition[j]))
|
||||
{
|
||||
u32 one;
|
||||
done = FALSE;
|
||||
var = sRectangularSpiralTransition[j].field_2;
|
||||
one = 1;
|
||||
if ((j & 1) == one)
|
||||
if ((j % 2) == 1)
|
||||
var = 0x27D - var;
|
||||
|
||||
var2 = var % 32;
|
||||
var3 = var / 32 * 32;
|
||||
var3 = var / 32;
|
||||
|
||||
tilemap[var3 + var2] = 0xF002;
|
||||
SOME_VRAM_STORE(tilemap, var3, var2, 0xF002);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -23,6 +23,8 @@
|
||||
#include "constants/moves.h"
|
||||
#include "constants/region_map_sections.h"
|
||||
|
||||
extern const struct Evolution gEvolutionTable[][EVOS_PER_MON];
|
||||
|
||||
// this file's functions
|
||||
static void ClearDaycareMonMail(struct DaycareMail *mail);
|
||||
static void SetInitialEggData(struct Pokemon *mon, u16 species, struct DayCare *daycare);
|
||||
|
@ -34,6 +34,8 @@
|
||||
#include "constants/rgb.h"
|
||||
#include "constants/items.h"
|
||||
|
||||
extern struct Evolution gEvolutionTable[][EVOS_PER_MON];
|
||||
|
||||
struct EvoInfo
|
||||
{
|
||||
u8 preEvoSpriteId;
|
||||
@ -550,8 +552,6 @@ static void CreateShedinja(u16 preEvoSpecies, struct Pokemon* mon)
|
||||
{
|
||||
s32 i;
|
||||
struct Pokemon* shedinja = &gPlayerParty[gPlayerPartyCount];
|
||||
const struct Evolution *evos;
|
||||
const struct Evolution *evos2;
|
||||
|
||||
CopyMon(&gPlayerParty[gPlayerPartyCount], mon, sizeof(struct Pokemon));
|
||||
SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_SPECIES, &gEvolutionTable[preEvoSpecies][1].targetSpecies);
|
||||
@ -572,12 +572,8 @@ static void CreateShedinja(u16 preEvoSpecies, struct Pokemon* mon)
|
||||
CalculateMonStats(&gPlayerParty[gPlayerPartyCount]);
|
||||
CalculatePlayerPartyCount();
|
||||
|
||||
// can't match it otherwise, ehh
|
||||
evos2 = gEvolutionTable[0];
|
||||
evos = evos2 + EVOS_PER_MON * preEvoSpecies;
|
||||
|
||||
GetSetPokedexFlag(SpeciesToNationalPokedexNum(evos[1].targetSpecies), FLAG_SET_SEEN);
|
||||
GetSetPokedexFlag(SpeciesToNationalPokedexNum(evos[1].targetSpecies), FLAG_SET_CAUGHT);
|
||||
GetSetPokedexFlag(SpeciesToNationalPokedexNum(gEvolutionTable[preEvoSpecies][1].targetSpecies), FLAG_SET_SEEN);
|
||||
GetSetPokedexFlag(SpeciesToNationalPokedexNum(gEvolutionTable[preEvoSpecies][1].targetSpecies), FLAG_SET_CAUGHT);
|
||||
|
||||
if (GetMonData(shedinja, MON_DATA_SPECIES) == SPECIES_SHEDINJA
|
||||
&& GetMonData(shedinja, MON_DATA_LANGUAGE) == LANGUAGE_JAPANESE
|
||||
|
@ -1525,6 +1525,10 @@ void ply_xwave(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track
|
||||
{
|
||||
u32 wav;
|
||||
|
||||
#ifdef UBFIX
|
||||
wav = 0;
|
||||
#endif
|
||||
|
||||
READ_XCMD_BYTE(wav, 0) // UB: uninitialized variable
|
||||
READ_XCMD_BYTE(wav, 1)
|
||||
READ_XCMD_BYTE(wav, 2)
|
||||
@ -1592,6 +1596,10 @@ void ply_xcmd_0C(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *tra
|
||||
{
|
||||
u32 unk;
|
||||
|
||||
#ifdef UBFIX
|
||||
unk = 0;
|
||||
#endif
|
||||
|
||||
READ_XCMD_BYTE(unk, 0) // UB: uninitialized variable
|
||||
READ_XCMD_BYTE(unk, 1)
|
||||
|
||||
@ -1611,6 +1619,7 @@ void ply_xcmd_0C(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *tra
|
||||
void ply_xcmd_0D(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
|
||||
{
|
||||
u32 unk;
|
||||
|
||||
#ifdef UBFIX
|
||||
unk = 0;
|
||||
#endif
|
||||
|
@ -2604,9 +2604,9 @@ static void RotateUpSlamDown_0(struct Sprite *sprite)
|
||||
{
|
||||
TryFlipX(sprite);
|
||||
sprite->data[7]--;
|
||||
sprite->pos2.x = Cos(sprite->data[7], sprite->data[6]) + sprite->data[6];
|
||||
sprite->pos2.x = sprite->data[6] + Cos(sprite->data[7], sprite->data[6]);
|
||||
|
||||
sprite->pos2.y = -(Sin(sprite->data[7], sprite->data[6] += 0)); // dummy += 0 is needed to match
|
||||
sprite->pos2.y = -(Sin(sprite->data[7], sprite->data[6]));
|
||||
|
||||
HandleSetAffineData(sprite, 256, 256, (sprite->data[7] - 128) << 8);
|
||||
if (sprite->data[7] <= 120)
|
||||
@ -2634,9 +2634,9 @@ static void RotateUpSlamDown_2(struct Sprite *sprite)
|
||||
{
|
||||
TryFlipX(sprite);
|
||||
sprite->data[7] += 2;
|
||||
sprite->pos2.x = Cos(sprite->data[7], sprite->data[6]) + sprite->data[6];
|
||||
sprite->pos2.x = sprite->data[6] + Cos(sprite->data[7], sprite->data[6]);
|
||||
|
||||
sprite->pos2.y = -(Sin(sprite->data[7], sprite->data[6] += 0)); // dummy += 0 is needed to match
|
||||
sprite->pos2.y = -(Sin(sprite->data[7], sprite->data[6]));
|
||||
|
||||
HandleSetAffineData(sprite, 256, 256, (sprite->data[7] - 128) << 8);
|
||||
if (sprite->data[7] >= 128)
|
||||
@ -4066,16 +4066,15 @@ static void VerticalShakeLowTwice(struct Sprite *sprite)
|
||||
u8 var8 = sprite->data[2];
|
||||
u8 var9 = sprite->data[6];
|
||||
u8 var5 = sVerticalShakeData[sprite->data[5]][0];
|
||||
u8 var2 = var5;
|
||||
if (var5 != (u8)-1)
|
||||
var5 = sprite->data[7];
|
||||
else
|
||||
var5 = (u8)-1; // needed to match
|
||||
|
||||
var6 = sVerticalShakeData[sprite->data[5]][1];
|
||||
var7 = 0;
|
||||
if (var2 != (u8)-2)
|
||||
if (sVerticalShakeData[sprite->data[5]][0] != (u8)-2)
|
||||
var7 = (var6 - var9) * var5 / var6;
|
||||
else
|
||||
var7 = 0;
|
||||
|
||||
if (var5 == (u8)-1)
|
||||
{
|
||||
|
@ -5437,15 +5437,16 @@ static bool32 WaitForWallpaperGfxLoad(void)
|
||||
|
||||
static void DrawWallpaper(const void *tilemap, s8 direction, u8 offset)
|
||||
{
|
||||
s16 var = (offset * 2) + 3;
|
||||
s16 var = offset * 256;
|
||||
s16 var2 = (offset * 2) + 3;
|
||||
s16 x = ((sStorage->bg2_X / 8 + 10) + (direction * 24)) & 0x3F;
|
||||
|
||||
CopyRectToBgTilemapBufferRect(2, tilemap, 0, 0, 0x14, 0x12, x, 2, 0x14, 0x12, 0x11, offset << 8, var);
|
||||
CopyRectToBgTilemapBufferRect(2, tilemap, 0, 0, 0x14, 0x12, x, 2, 0x14, 0x12, 0x11, var, var2);
|
||||
|
||||
if (direction == 0)
|
||||
return;
|
||||
if (direction > 0)
|
||||
x *= 1, x += 0x14; // x * 1 is needed to match, but can be safely removed as it makes no functional difference
|
||||
x += 0x14;
|
||||
else
|
||||
x -= 4;
|
||||
|
||||
|
30
src/siirtc.c
30
src/siirtc.c
@ -71,6 +71,7 @@ static bool8 sLocked;
|
||||
static int WriteCommand(u8 value);
|
||||
static int WriteData(u8 value);
|
||||
static u8 ReadData();
|
||||
|
||||
static void EnableGpioPortRead();
|
||||
static void DisableGpioPortRead();
|
||||
|
||||
@ -98,8 +99,12 @@ u8 SiiRtcProbe(void)
|
||||
|
||||
errorCode = 0;
|
||||
|
||||
#ifdef BUGFIX
|
||||
if (!(rtc.status & SIIRTCINFO_24HOUR) || (rtc.status & SIIRTCINFO_POWER))
|
||||
#else
|
||||
if ((rtc.status & (SIIRTCINFO_POWER | SIIRTCINFO_24HOUR)) == SIIRTCINFO_POWER
|
||||
|| (rtc.status & (SIIRTCINFO_POWER | SIIRTCINFO_24HOUR)) == 0)
|
||||
#endif
|
||||
{
|
||||
// The RTC is in 12-hour mode. Reset it and switch to 24-hour mode.
|
||||
|
||||
@ -131,7 +136,7 @@ u8 SiiRtcProbe(void)
|
||||
|
||||
bool8 SiiRtcReset(void)
|
||||
{
|
||||
u8 result;
|
||||
bool8 result;
|
||||
struct SiiRtcInfo rtc;
|
||||
|
||||
if (sLocked == TRUE)
|
||||
@ -392,7 +397,11 @@ static int WriteCommand(u8 value)
|
||||
GPIO_PORT_DATA = (temp << 1) | SCK_HI | CS_HI;
|
||||
}
|
||||
|
||||
// control reaches end of non-void function
|
||||
// Nothing uses the returned value from this function,
|
||||
// so the undefined behavior is harmless in the vanilla game.
|
||||
#ifdef UBFIX
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
static int WriteData(u8 value)
|
||||
@ -409,7 +418,11 @@ static int WriteData(u8 value)
|
||||
GPIO_PORT_DATA = (temp << 1) | SCK_HI | CS_HI;
|
||||
}
|
||||
|
||||
// control reaches end of non-void function
|
||||
// Nothing uses the returned value from this function,
|
||||
// so the undefined behavior is harmless in the vanilla game.
|
||||
#ifdef UBFIX
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
static u8 ReadData()
|
||||
@ -417,9 +430,10 @@ static u8 ReadData()
|
||||
u8 i;
|
||||
u8 temp;
|
||||
u8 value;
|
||||
#ifdef UBFIX
|
||||
|
||||
#ifdef UBFIX
|
||||
value = 0;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
for (i = 0; i < 8; i++)
|
||||
{
|
||||
@ -431,7 +445,7 @@ static u8 ReadData()
|
||||
GPIO_PORT_DATA = SCK_HI | CS_HI;
|
||||
|
||||
temp = ((GPIO_PORT_DATA & SIO_HI) >> 1);
|
||||
value = (value >> 1) | (temp << 7); // UB: value is uninitialized on first iteration
|
||||
value = (value >> 1) | (temp << 7);
|
||||
}
|
||||
|
||||
return value;
|
||||
@ -439,10 +453,10 @@ static u8 ReadData()
|
||||
|
||||
static void EnableGpioPortRead()
|
||||
{
|
||||
GPIO_PORT_READ_ENABLE = 1;
|
||||
GPIO_PORT_READ_ENABLE = TRUE;
|
||||
}
|
||||
|
||||
static void DisableGpioPortRead()
|
||||
{
|
||||
GPIO_PORT_READ_ENABLE = 0;
|
||||
GPIO_PORT_READ_ENABLE = FALSE;
|
||||
}
|
||||
|
@ -6,12 +6,18 @@ LIBS = -lm
|
||||
|
||||
SRCS = main.c extended.c
|
||||
|
||||
ifeq ($(OS),Windows_NT)
|
||||
EXE := .exe
|
||||
else
|
||||
EXE :=
|
||||
endif
|
||||
|
||||
.PHONY: all clean
|
||||
|
||||
all: aif2pcm
|
||||
all: aif2pcm$(EXE)
|
||||
@:
|
||||
|
||||
aif2pcm: $(SRCS)
|
||||
aif2pcm$(EXE): $(SRCS)
|
||||
$(CC) $(CFLAGS) $(SRCS) -o $@ $(LDFLAGS) $(LIBS)
|
||||
|
||||
clean:
|
||||
|
@ -6,10 +6,16 @@ CFLAGS = -Wall -Wextra -Werror -std=c11 -O2
|
||||
|
||||
SRCS = bin2c.c
|
||||
|
||||
all: bin2c
|
||||
ifeq ($(OS),Windows_NT)
|
||||
EXE := .exe
|
||||
else
|
||||
EXE :=
|
||||
endif
|
||||
|
||||
all: bin2c$(EXE)
|
||||
@:
|
||||
|
||||
bin2c: $(SRCS)
|
||||
bin2c$(EXE): $(SRCS)
|
||||
$(CC) $(CFLAGS) $(SRCS) -o $@ $(LDFLAGS)
|
||||
|
||||
clean:
|
||||
|
@ -3,10 +3,16 @@ CC ?= gcc
|
||||
|
||||
SRCS = gbafix.c
|
||||
|
||||
all: gbafix
|
||||
ifeq ($(OS),Windows_NT)
|
||||
EXE := .exe
|
||||
else
|
||||
EXE :=
|
||||
endif
|
||||
|
||||
all: gbafix$(EXE)
|
||||
@:
|
||||
|
||||
gbafix: $(SRCS)
|
||||
gbafix$(EXE): $(SRCS)
|
||||
$(CC) $(SRCS) -o $@ $(LDFLAGS)
|
||||
|
||||
clean:
|
||||
|
@ -6,15 +6,21 @@ LIBS = -lpng -lz
|
||||
|
||||
SRCS = main.c convert_png.c gfx.c jasc_pal.c lz.c rl.c util.c font.c huff.c
|
||||
|
||||
ifeq ($(OS),Windows_NT)
|
||||
EXE := .exe
|
||||
else
|
||||
EXE :=
|
||||
endif
|
||||
|
||||
.PHONY: all clean
|
||||
|
||||
all: gbagfx
|
||||
all: gbagfx$(EXE)
|
||||
@:
|
||||
|
||||
gbagfx-debug: $(SRCS) convert_png.h gfx.h global.h jasc_pal.h lz.h rl.h util.h font.h
|
||||
gbagfx-debug$(EXE): $(SRCS) convert_png.h gfx.h global.h jasc_pal.h lz.h rl.h util.h font.h
|
||||
$(CC) $(CFLAGS) -DDEBUG $(SRCS) -o $@ $(LDFLAGS) $(LIBS)
|
||||
|
||||
gbagfx: $(SRCS) convert_png.h gfx.h global.h jasc_pal.h lz.h rl.h util.h font.h
|
||||
gbagfx$(EXE): $(SRCS) convert_png.h gfx.h global.h jasc_pal.h lz.h rl.h util.h font.h
|
||||
$(CC) $(CFLAGS) $(SRCS) -o $@ $(LDFLAGS) $(LIBS)
|
||||
|
||||
clean:
|
||||
|
@ -8,12 +8,18 @@ SRCS := jsonproc.cpp
|
||||
|
||||
HEADERS := jsonproc.h inja.hpp nlohmann/json.hpp
|
||||
|
||||
ifeq ($(OS),Windows_NT)
|
||||
EXE := .exe
|
||||
else
|
||||
EXE :=
|
||||
endif
|
||||
|
||||
.PHONY: all clean
|
||||
|
||||
all: jsonproc
|
||||
all: jsonproc$(EXE)
|
||||
@:
|
||||
|
||||
jsonproc: $(SRCS) $(HEADERS)
|
||||
jsonproc$(EXE): $(SRCS) $(HEADERS)
|
||||
$(CXX) $(CXXFLAGS) $(INCLUDES) $(SRCS) -o $@ $(LDFLAGS)
|
||||
|
||||
clean:
|
||||
|
@ -6,12 +6,18 @@ SRCS := json11.cpp mapjson.cpp
|
||||
|
||||
HEADERS := mapjson.h
|
||||
|
||||
ifeq ($(OS),Windows_NT)
|
||||
EXE := .exe
|
||||
else
|
||||
EXE :=
|
||||
endif
|
||||
|
||||
.PHONY: all clean
|
||||
|
||||
all: mapjson
|
||||
all: mapjson$(EXE)
|
||||
@:
|
||||
|
||||
mapjson: $(SRCS) $(HEADERS)
|
||||
mapjson$(EXE): $(SRCS) $(HEADERS)
|
||||
$(CXX) $(CXXFLAGS) $(SRCS) -o $@ $(LDFLAGS)
|
||||
|
||||
clean:
|
||||
|
@ -6,12 +6,18 @@ SRCS := agb.cpp error.cpp main.cpp midi.cpp tables.cpp
|
||||
|
||||
HEADERS := agb.h error.h main.h midi.h tables.h
|
||||
|
||||
ifeq ($(OS),Windows_NT)
|
||||
EXE := .exe
|
||||
else
|
||||
EXE :=
|
||||
endif
|
||||
|
||||
.PHONY: all clean
|
||||
|
||||
all: mid2agb
|
||||
all: mid2agb$(EXE)
|
||||
@:
|
||||
|
||||
mid2agb: $(SRCS) $(HEADERS)
|
||||
mid2agb$(EXE): $(SRCS) $(HEADERS)
|
||||
$(CXX) $(CXXFLAGS) $(SRCS) -o $@ $(LDFLAGS)
|
||||
|
||||
clean:
|
||||
|
@ -8,12 +8,18 @@ SRCS := asm_file.cpp c_file.cpp charmap.cpp preproc.cpp string_parser.cpp \
|
||||
HEADERS := asm_file.h c_file.h char_util.h charmap.h preproc.h string_parser.h \
|
||||
utf8.h
|
||||
|
||||
ifeq ($(OS),Windows_NT)
|
||||
EXE := .exe
|
||||
else
|
||||
EXE :=
|
||||
endif
|
||||
|
||||
.PHONY: all clean
|
||||
|
||||
all: preproc
|
||||
all: preproc$(EXE)
|
||||
@:
|
||||
|
||||
preproc: $(SRCS) $(HEADERS)
|
||||
preproc$(EXE): $(SRCS) $(HEADERS)
|
||||
$(CXX) $(CXXFLAGS) $(SRCS) -o $@ $(LDFLAGS)
|
||||
|
||||
clean:
|
||||
|
@ -8,10 +8,16 @@ HEADERS := ramscrgen.h sym_file.h elf.h char_util.h
|
||||
|
||||
.PHONY: all clean
|
||||
|
||||
all: ramscrgen
|
||||
ifeq ($(OS),Windows_NT)
|
||||
EXE := .exe
|
||||
else
|
||||
EXE :=
|
||||
endif
|
||||
|
||||
all: ramscrgen$(EXE)
|
||||
@:
|
||||
|
||||
ramscrgen: $(SRCS) $(HEADERS)
|
||||
ramscrgen$(EXE): $(SRCS) $(HEADERS)
|
||||
$(CXX) $(CXXFLAGS) $(SRCS) -o $@ $(LDFLAGS)
|
||||
|
||||
clean:
|
||||
|
@ -8,10 +8,16 @@ SRCS = main.c convert_png.c util.c font.c
|
||||
|
||||
.PHONY: all clean
|
||||
|
||||
all: rsfont
|
||||
ifeq ($(OS),Windows_NT)
|
||||
EXE := .exe
|
||||
else
|
||||
EXE :=
|
||||
endif
|
||||
|
||||
all: rsfont$(EXE)
|
||||
@:
|
||||
|
||||
rsfont: $(SRCS) convert_png.h gfx.h global.h util.h font.h
|
||||
rsfont$(EXE): $(SRCS) convert_png.h gfx.h global.h util.h font.h
|
||||
$(CC) $(CFLAGS) $(SRCS) -o $@ $(LDFLAGS) $(LIBS)
|
||||
|
||||
clean:
|
||||
|
@ -8,10 +8,16 @@ HEADERS := scaninc.h asm_file.h c_file.h source_file.h
|
||||
|
||||
.PHONY: all clean
|
||||
|
||||
all: scaninc
|
||||
ifeq ($(OS),Windows_NT)
|
||||
EXE := .exe
|
||||
else
|
||||
EXE :=
|
||||
endif
|
||||
|
||||
all: scaninc$(EXE)
|
||||
@:
|
||||
|
||||
scaninc: $(SRCS) $(HEADERS)
|
||||
scaninc$(EXE): $(SRCS) $(HEADERS)
|
||||
$(CXX) $(CXXFLAGS) $(SRCS) -o $@ $(LDFLAGS)
|
||||
|
||||
clean:
|
||||
|
Loading…
x
Reference in New Issue
Block a user