mirror of
https://github.com/Xeeynamo/sotn-decomp.git
synced 2025-02-17 03:30:02 +00:00
Import 4A538, demo and 5087C data (#835)
As per title. I also added a new tool called `dirt_patch`. As I mentioned in our Discord server there is some left-over data from previous dev builds in DRA.BIN and potentially elsewhere too. The tool uses the new file `config/dirt.us.json` which stores a list of patches to avoid crazy hacks and `#ifdef` for the sake of getting a match. I hope this tool will not be abused.
This commit is contained in:
parent
130bc38d71
commit
b851d5e4d2
5
Makefile
5
Makefile
@ -66,6 +66,7 @@ SOTNDISK := $(GOPATH)/bin/sotn-disk
|
||||
GFXSTAGE := $(PYTHON) $(TOOLS_DIR)/gfxstage.py
|
||||
PNG2S := $(PYTHON) $(TOOLS_DIR)/png2s.py
|
||||
ICONV := iconv --from-code=UTF-8 --to-code=Shift-JIS
|
||||
DIRT_PATCHER := $(PYTHON) $(TOOLS_DIR)/dirt_patcher.py
|
||||
|
||||
define list_src_files
|
||||
$(foreach dir,$(ASM_DIR)/$(1),$(wildcard $(dir)/**.s))
|
||||
@ -134,7 +135,9 @@ format:
|
||||
./tools/symbols.py remove-orphans config/splat.us.strwrp.yaml
|
||||
./tools/symbols.py remove-orphans config/splat.us.tt_000.yaml
|
||||
./tools/symbols.py remove-orphans config/splat.us.stmad.yaml
|
||||
check:
|
||||
patch:
|
||||
$(DIRT_PATCHER) config/dirt.$(VERSION).json
|
||||
check: patch
|
||||
sha1sum --check config/check.$(VERSION).sha
|
||||
expected: check
|
||||
mkdir -p expected/build
|
||||
|
1
config/dirt.hd.json
Normal file
1
config/dirt.hd.json
Normal file
@ -0,0 +1 @@
|
||||
[]
|
1
config/dirt.saturn.json
Normal file
1
config/dirt.saturn.json
Normal file
@ -0,0 +1 @@
|
||||
[]
|
11
config/dirt.us.json
Normal file
11
config/dirt.us.json
Normal file
@ -0,0 +1,11 @@
|
||||
[
|
||||
{
|
||||
"name": "build/us/DRA.BIN",
|
||||
"0x220E": 41,
|
||||
"0x220F": 13,
|
||||
"0x2459": 49,
|
||||
"0x245A": 55,
|
||||
"0x245B": 44,
|
||||
"0x3C1A7": 110
|
||||
}
|
||||
]
|
@ -68,7 +68,13 @@ segments:
|
||||
- [0x1C18, ci4, memcard_14, 16, 48]
|
||||
- [0x1D98, ci4, memcard_15, 16, 48]
|
||||
- [0x1F18, .data, save_mgr]
|
||||
- [0x2178, data]
|
||||
- [0x2178, .data, 4A538] # D_800A21B8
|
||||
- [0x23F8, .data, 4A538] # D_800A2438
|
||||
- [0x23FC, .data, demo] # D_800A243C
|
||||
- [0x241C, .data, 5087C] # D_800A245C
|
||||
- [0x293C, .data, 5087C] # D_800A297C
|
||||
- [0x2B6C, .data, 5087C] # D_800A2BC0
|
||||
- [0x2BB8, .data, 5087C] # D_800A2C0C, D_800A2D44
|
||||
- [0x2CF4, .data, menu] # array of strings
|
||||
- [0x2D1C, .data, menu] # HD exclusive array of strings
|
||||
- [0x2D88, data]
|
||||
|
@ -68,8 +68,13 @@ segments:
|
||||
- [0x1C18, ci4, memcard_14, 16, 48]
|
||||
- [0x1D98, ci4, memcard_15, 16, 48]
|
||||
- [0x1F18, .data, save_mgr]
|
||||
- [0x21B8, data]
|
||||
- [0x2BC0, data]
|
||||
- [0x21B8, .data, 4A538] # D_800A21B8
|
||||
- [0x2438, .data, 4A538] # D_800A2438
|
||||
- [0x243C, .data, demo] # D_800A243C
|
||||
- [0x245C, .data, 5087C] # D_800A245C
|
||||
- [0x297C, .data, 5087C] # D_800A297C
|
||||
- [0x2BC0, .data, 5087C] # D_800A2BC0
|
||||
- [0x2C0C, .data, 5087C] # D_800A2C0C, D_800A2D44
|
||||
- [0x2D48, .data, menu]
|
||||
- [0x2D70, data]
|
||||
- [0x2EC0, .data, 5D6C4]
|
||||
|
@ -4,6 +4,7 @@ D_800A243C = 0x800A23FC;
|
||||
D_800A245C = 0x800A241C;
|
||||
D_800A297C = 0x800A293C;
|
||||
D_800A2BC0 = 0x800A2B6C;
|
||||
D_800A2D44 = 0x800A2CF0;
|
||||
c_chPlaystationButtons = 0x800A2D88;
|
||||
c_chShoulderButtons = 0x800A2D8C;
|
||||
D_800A2D7C = 0x800A2D94;
|
||||
@ -402,7 +403,6 @@ func_80129864 = 0x801294F0;
|
||||
EntitySummonSpirit = 0x80129D30;
|
||||
EntityStopWatchExpandingCircle = 0x8012A1B4;
|
||||
EntityStopWatch = 0x8012A528;
|
||||
EntitySubwpnBible = 0x8012B61C;
|
||||
EntityBatEcho = 0x8012BB84;
|
||||
func_8012C600 = 0x8012C28C;
|
||||
func_8012CB0C = 0x8012C798;
|
||||
|
@ -242,6 +242,12 @@ typedef struct Primitive {
|
||||
#define SAVE_FLAG_CLEAR (1)
|
||||
#define SAVE_FLAG_REPLAY (2)
|
||||
|
||||
#if defined(VERSION_US)
|
||||
#define MEMCARD_ID "BASLUS-00067DRAX00"
|
||||
#elif defined(VERSION_HD)
|
||||
#define MEMCARD_ID "BISLPM-86023DRAX00"
|
||||
#endif
|
||||
|
||||
typedef enum {
|
||||
Game_Init,
|
||||
Game_Title,
|
||||
|
@ -1090,7 +1090,7 @@ void func_800E414C(void) {
|
||||
}
|
||||
if (D_8003C708.flags == 0x41 && PLAYER.posX.i.hi < 0x78) {
|
||||
func_801073C0();
|
||||
g_CdStep = 1;
|
||||
g_CdStep = CdStep_LoadInit;
|
||||
g_LoadFile = CdFile_StageChr;
|
||||
g_LoadOvlIdx = D_8003C712;
|
||||
D_8003C708.unk2 = 2;
|
||||
|
@ -560,6 +560,21 @@ void ResetEntityArray(void) {
|
||||
|
||||
INCLUDE_ASM("dra/nonmatchings/4A538", RenderEntities);
|
||||
|
||||
#define PL_SPRT(x, y, flipx) (x), ((y)&0x1FF) | ((flipx) << 9)
|
||||
s16 D_800A21B8[] = {
|
||||
PL_SPRT(0x0201, 0x0101, false), PL_SPRT(0x0221, 0x0101, false),
|
||||
PL_SPRT(0x0231, 0x0101, false), PL_SPRT(0x0201, 0x0181, false),
|
||||
PL_SPRT(0x0201, 0x0101, false), PL_SPRT(0x0201, 0x0101, false),
|
||||
PL_SPRT(0x0201, 0x0101, false), PL_SPRT(0x0201, 0x0101, false),
|
||||
PL_SPRT(0x0001, 0x0101, false), PL_SPRT(0x0021, 0x0101, false),
|
||||
PL_SPRT(0x0001, 0x0181, false), PL_SPRT(0x0021, 0x0181, false),
|
||||
PL_SPRT(0x0221, 0x0181, false), PL_SPRT(0x0221, 0x0101, false),
|
||||
PL_SPRT(0x0221, 0x0181, false), PL_SPRT(0x0221, 0x0181, false),
|
||||
PL_SPRT(0x0101, 0x0101, false),
|
||||
};
|
||||
|
||||
s16 unused_800A21FC[286] = {};
|
||||
|
||||
void InitRenderer(void) {
|
||||
int i;
|
||||
POLY_GT4 *a1, *a2;
|
||||
@ -750,6 +765,8 @@ DR_ENV* func_800EDB08(POLY_GT4* poly) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
s32 D_800A2438 = 0;
|
||||
|
||||
// This function casts its return value as an s16, but at least one caller
|
||||
// (EntityGravityBootBeam) needs to receive a returned s32 so we use that here.
|
||||
s32 func_800EDB58(u8 primType, s32 count) {
|
||||
|
234
src/dra/5087C.c
234
src/dra/5087C.c
@ -2,6 +2,215 @@
|
||||
#include "menu.h"
|
||||
#include "sfx.h"
|
||||
|
||||
RoomTeleport D_800A245C[] = {
|
||||
{496, 392, 0x00A0, 0x0000, STAGE_NZ0},
|
||||
{240, 648, 0x0000, 0x0000, STAGE_NO2},
|
||||
{16, 132, 0x0038, 0x0000, STAGE_NO1},
|
||||
{496, 132, 0x0078, 0x0000, STAGE_NP3},
|
||||
{240, 132, 0x0000, 0x0000, STAGE_NO4},
|
||||
{128, 36, 0x0000, 0x0000, STAGE_CEN},
|
||||
{16, 1672, 0x0068, 0x0002, STAGE_NO1},
|
||||
{128, 212, 0x00A8, 0x0008, STAGE_NO0},
|
||||
{128, 77, 16, 0x0028, STAGE_BO6},
|
||||
{240, 388, 0x0030, 0x000D, STAGE_TOP},
|
||||
{16, 132, 16, 0x000D, STAGE_NO1},
|
||||
{16, 644, 0x0000, 0x0041, STAGE_NO0},
|
||||
{16, 132, 0x00A0, 0x0041, STAGE_NO4},
|
||||
{752, 132, 0x0050, 0x0041, STAGE_NZ0},
|
||||
{240, 132, 0x0018, 0x0041, STAGE_WRP},
|
||||
{16, 180, 0x0000, 0x0012, STAGE_DRE},
|
||||
{16, 388, 0x0050, 0x0003, STAGE_CHI},
|
||||
{112, 644, 0x0000, 0x0041, STAGE_NO3},
|
||||
{240, 132, 0x0088, 0x0005, STAGE_CAT},
|
||||
{16, 132, 128, 0x0005, STAGE_NO4},
|
||||
{16, 132, 0x0020, 0x0005, STAGE_WRP},
|
||||
{16, 132, 0x0078, 0x000C, STAGE_NP3},
|
||||
{16, 132, 0x0030, 0x000C, STAGE_NO0},
|
||||
{240, 132, 0x0060, 0x000C, STAGE_DAI},
|
||||
{16, 132, 0x0068, 0x0004, STAGE_NO0},
|
||||
{240, 132, 0x0030, 0x0004, STAGE_DAI},
|
||||
{1264, 132, 0x0030, 0x0004, STAGE_ARE},
|
||||
{16, 132, 0x0008, 0x0004, STAGE_WRP},
|
||||
{240, 388, 0x0038, 0x000E, STAGE_TOP},
|
||||
{272, 644, 0x0068, 0x000E, STAGE_NO1},
|
||||
{240, 1412, 0x0030, 0x000E, STAGE_NO2},
|
||||
{16, 132, 128, 0x000E, STAGE_NP3},
|
||||
{752, 132, 0x0038, 0x000E, STAGE_CHI},
|
||||
{16, 132, 0x0078, 0x0006, STAGE_NO2},
|
||||
{16, 132, 0x0020, 0x0006, STAGE_ARE},
|
||||
{16, 132, 0x0008, 0x0006, STAGE_NZ0},
|
||||
{16, 1924, 16, 0x0006, STAGE_TOP},
|
||||
{320, 696, 16, 0x000B, STAGE_RTOP},
|
||||
{320, 847, 16, 0x002B, STAGE_TOP},
|
||||
{16, 132, 0x0028, 0x001F, STAGE_LIB},
|
||||
{3824, 132, 0x0040, 0x0001, STAGE_NO0},
|
||||
{752, 132, 0x0060, 0x0001, STAGE_LIB},
|
||||
{240, 132, 16, 0x0001, STAGE_WRP},
|
||||
{240, 132, 0x0058, 0x0001, STAGE_NZ1},
|
||||
{896, 952, 16, 0x000B, STAGE_TOP},
|
||||
{16, 132, 0x0000, 0x000B, STAGE_NZ1},
|
||||
{16, 132, 0x0000, 0x000B, STAGE_WRP},
|
||||
{752, 648, 0x0088, 0x000B, STAGE_DAI},
|
||||
{240, 132, 0x0050, 0x0009, STAGE_NP3},
|
||||
{16, 388, 0x0088, 0x0009, STAGE_NO0},
|
||||
{240, 132, 0x0000, 0x0009, STAGE_CHI},
|
||||
{16, 180, 0x0000, 0x0009, STAGE_DRE},
|
||||
{496, 388, 0x0048, 0x000A, STAGE_DAI},
|
||||
{16, 388, 16, 0x000A, STAGE_NO2},
|
||||
{16, 132, 0x0090, 0x0041, STAGE_NO3},
|
||||
{16, 132, 0x0000, 0x0040, STAGE_MAD},
|
||||
{16, 644, 0x0000, 0x0007, STAGE_NO0},
|
||||
{16, 132, 0x00A0, 0x0007, STAGE_NO4},
|
||||
{752, 132, 0x0050, 0x0007, STAGE_NZ0},
|
||||
{240, 132, 0x0018, 0x0007, STAGE_WRP},
|
||||
{128, 164, 0x0128, 0x0012, STAGE_NO4},
|
||||
{448, 1716, 0x0058, 0x0000, STAGE_DAI},
|
||||
{16, 132, 0x0028, 0x0000, STAGE_LIB},
|
||||
{16, 132, 0x0038, 0x0000, STAGE_NO1},
|
||||
{16, 132, 128, 0x000C, STAGE_NZ0},
|
||||
{240, 132, 16, 0x0036, STAGE_CAT},
|
||||
{16, 132, 0x0020, 0x0036, STAGE_CAT},
|
||||
{496, 132, 0x0000, 0x0023, STAGE_BO7},
|
||||
{16, 132, 0x0058, 0x0037, STAGE_NO2},
|
||||
{752, 132, 0x0068, 0x0037, STAGE_NO2},
|
||||
{496, 132, 0x0000, 36, STAGE_MAR},
|
||||
{128, 388, 0x0000, 0x0038, STAGE_CEN},
|
||||
#if defined(VERSION_US)
|
||||
{496, 132, 0x0000, 0x0001, STAGE_BO4},
|
||||
#elif defined(VERSION_HD)
|
||||
{128, 77, 0x0010, 0x0028, STAGE_BO6},
|
||||
#endif
|
||||
{240, 644, 0x0008, 0x0039, STAGE_NO4},
|
||||
{16, 132, 0x00E8, 0x0039, STAGE_NO4},
|
||||
{16, 132, 0x0000, 0x0029, STAGE_BO5},
|
||||
{240, 132, 0x0000, 0x0029, STAGE_BO5},
|
||||
{240, 132, 0x0050, 0x003A, STAGE_NO1},
|
||||
{16, 132, 0x0060, 0x003A, STAGE_NO1},
|
||||
{16, 132, 0x0000, 0x0021, STAGE_BO4},
|
||||
{496, 132, 0x0000, 0x0021, STAGE_BO4},
|
||||
{752, 132, 0x0018, 0x003B, STAGE_DAI},
|
||||
{16, 132, 0x0028, 0x003B, STAGE_DAI},
|
||||
{16, 132, 0x0000, 0x0026, STAGE_BO3},
|
||||
{496, 132, 0x0000, 0x0026, STAGE_BO3},
|
||||
{496, 132, 0x0008, 0x0016, STAGE_CHI},
|
||||
{16, 132, 0x0018, 0x0016, STAGE_CHI},
|
||||
{16, 132, 0x0000, 0x0005, STAGE_BO7},
|
||||
{496, 132, 0x0000, 0x0005, STAGE_BO7},
|
||||
{16, 132, 0x0018, 0x003C, STAGE_CHI},
|
||||
{496, 132, 0x0008, 0x003C, STAGE_CHI},
|
||||
{16, 132, 0x0000, 0x0025, STAGE_BO2},
|
||||
{496, 132, 0x0000, 0x0025, STAGE_BO2},
|
||||
{240, 132, 0x0058, 0x003D, STAGE_NZ0},
|
||||
{16, 644, 0x0098, 0x003D, STAGE_NZ0},
|
||||
{16, 132, 0x0000, 0x003D, STAGE_NZ0},
|
||||
{1008, 388, 0x0000, 0x002C, STAGE_BO1},
|
||||
{16, 132, 0x0000, 0x002C, STAGE_BO1},
|
||||
{752, 132, 0x0050, 0x0017, STAGE_NO0},
|
||||
{16, 132, 0x0098, 0x0017, STAGE_NO0},
|
||||
{16, 132, 0x0000, 0x0000, STAGE_MAR},
|
||||
{240, 179, 0x0000, 0x000B, STAGE_BO6},
|
||||
{752, 132, 0x0018, 0x0019, STAGE_DAI},
|
||||
{16, 132, 0x0028, 0x0019, STAGE_DAI},
|
||||
{16, 132, 0x0000, 0x0006, STAGE_BO5},
|
||||
{496, 132, 0x0000, 0x0006, STAGE_BO5},
|
||||
{240, 132, 0x0050, 0x001A, STAGE_NO1},
|
||||
{16, 132, 0x0060, 0x001A, STAGE_NO1},
|
||||
{16, 132, 0x0000, 0x0001, STAGE_BO4},
|
||||
{240, 132, 0x00C0, 0x001B, STAGE_NO4},
|
||||
{240, 644, 0x0008, 0x001B, STAGE_NO4},
|
||||
{16, 132, 0x0008, 0x0009, STAGE_BO3},
|
||||
{1264, 132, 0x0020, 0x001C, STAGE_ARE},
|
||||
{16, 132, 0x0030, 0x001C, STAGE_ARE},
|
||||
{16, 132, 0x0000, 0x000A, STAGE_BO2},
|
||||
{496, 132, 0x0000, 0x000A, STAGE_BO2},
|
||||
{240, 132, 16, 0x001D, STAGE_CAT},
|
||||
{16, 132, 0x0020, 0x001D, STAGE_CAT},
|
||||
{496, 132, 0x0000, 0x0003, STAGE_BO1},
|
||||
{16, 132, 0x0030, 0x003E, STAGE_ARE},
|
||||
{1264, 132, 0x0020, 0x003E, STAGE_ARE},
|
||||
{496, 132, 0x0000, 0x002A, STAGE_BO0},
|
||||
{16, 132, 0x0000, 0x002A, STAGE_BO0},
|
||||
{16, 132, 0x0058, 0x001E, STAGE_NO2},
|
||||
{752, 132, 0x0068, 0x001E, STAGE_NO2},
|
||||
{496, 132, 0x0000, 0x0004, STAGE_BO0},
|
||||
{16, 132, 0x0000, 0x0000, STAGE_TE1},
|
||||
{1248, 396, 0x0000, 0x0000, STAGE_ST0},
|
||||
{240, 132, 0x0000, 0x000D, STAGE_NZ1},
|
||||
{1264, 392, 0x0000, 0x0002, STAGE_LIB},
|
||||
{16, 132, 0x0000, 0x002D, STAGE_NZ1},
|
||||
};
|
||||
|
||||
RoomBossTeleport D_800A297C[] = {
|
||||
{0x20, 0x1A, STAGE_NO0, TIMEATTACK_EVENT_FIRST_MARIA_MEET, 0x64},
|
||||
{0x00, 0x01, STAGE_DRE, 0xFF, 0x3C},
|
||||
{0x01, 0x01, STAGE_DRE, 0xFF, 0x3C},
|
||||
{0x14, 0x10, STAGE_NO2, TIMEATTACK_EVENT_ORLOX_DEFEAT, 0x7D},
|
||||
{0x13, 0x32, STAGE_CAT, TIMEATTACK_EVENT_GRANFALOON_DEFEAT, 0x76},
|
||||
{0x13, 0x16, STAGE_ARE, TIMEATTACK_EVENT_MINOTAUR_WEREWOLF_DEFEAT, 0x72},
|
||||
{0x14, 0x16, STAGE_ARE, TIMEATTACK_EVENT_MINOTAUR_WEREWOLF_DEFEAT, 0x73},
|
||||
{0x28, 0x27, STAGE_NO4, TIMEATTACK_EVENT_SCYLLA_DEFEAT, 0x6F},
|
||||
{0x39, 0x17, STAGE_NO1, TIMEATTACK_EVENT_DOPPLEGANGER_10_DEFEAT, 0x6C},
|
||||
#if defined(VERSION_US)
|
||||
{0x3A, 0x17, STAGE_NO1, TIMEATTACK_EVENT_DOPPLEGANGER_10_DEFEAT, 0x48},
|
||||
#endif
|
||||
{0x17, 0x0D, STAGE_DAI, TIMEATTACK_EVENT_HYPPOGRYPH_DEFEAT, 0x68},
|
||||
{0x18, 0x0D, STAGE_DAI, TIMEATTACK_EVENT_HYPPOGRYPH_DEFEAT, 0x69},
|
||||
{0x21, 0x08, STAGE_TOP, TIMEATTACK_EVENT_SAVE_RICHTER, 0x65},
|
||||
{0x1E, 0x28, STAGE_CHI, TIMEATTACK_EVENT_CERBERUS_DEFEAT, 0x57},
|
||||
{0x1F, 0x28, STAGE_CHI, TIMEATTACK_EVENT_CERBERUS_DEFEAT, 0x58},
|
||||
{0x2B, 0x29, STAGE_RARE, TIMEATTACK_EVENT_RALPH_GRANT_SYPHA_DEFEAT, 0x79},
|
||||
{0x2C, 0x29, STAGE_RARE, TIMEATTACK_EVENT_RALPH_GRANT_SYPHA_DEFEAT, 0x7A},
|
||||
{0x33, 0x23, STAGE_RNZ0, TIMEATTACK_EVENT_BEELZEBUB_DEFEAT, 0x60},
|
||||
{0x36, 0x24, STAGE_RNZ0, TIMEATTACK_EVENT_BEELZEBUB_DEFEAT, 0x61},
|
||||
{0x21, 0x17, STAGE_RCHI, TIMEATTACK_EVENT_DEATH_DEFEAT, 0x5B},
|
||||
{0x20, 0x17, STAGE_RCHI, TIMEATTACK_EVENT_DEATH_DEFEAT, 0x5C},
|
||||
{0x28, 0x32, STAGE_RDAI, TIMEATTACK_EVENT_MEDUSA_DEFEAT, 0x53},
|
||||
{0x27, 0x32, STAGE_RDAI, TIMEATTACK_EVENT_MEDUSA_DEFEAT, 0x54},
|
||||
{0x06, 0x28, STAGE_RNO1, TIMEATTACK_EVENT_THE_CREATURE_DEFEAT, 0x4F},
|
||||
{0x05, 0x28, STAGE_RNO1, TIMEATTACK_EVENT_THE_CREATURE_DEFEAT, 0x50},
|
||||
{0x17, 0x18, STAGE_RNO4, TIMEATTACK_EVENT_DOPPLEGANGER_40_DEFEAT, 0x4B},
|
||||
{0x2B, 0x2F, STAGE_RNO2, TIMEATTACK_EVENT_AKMODAN_II_DEFEAT, 0x46},
|
||||
{0x2C, 0x0D, STAGE_RCAT, TIMEATTACK_EVENT_GALAMOTH_DEFEAT, 0x43},
|
||||
{0x80, 0x00, 0x00, 0x00, 0x00},
|
||||
};
|
||||
|
||||
u8 D_800A2BC0[] = {
|
||||
0x0C, 0x22, 0x02, 0x81, 0x88, //
|
||||
0x0C, 0x22, 0x03, 0x82, 0x89, //
|
||||
0x20, 0x28, 0x04, 0x50, 0x58, //
|
||||
0x25, 0x29, 0x02, 0x51, 0x59, //
|
||||
0x2B, 0x0B, 0x02, 0xA1, 0xA9, //
|
||||
0x32, 0x0B, 0x04, 0xA2, 0xAA, //
|
||||
0x0B, 0x29, 0x02, 0x3A, 0x3D, //
|
||||
0x15, 0x16, 0x03, 0xB2, 0xB9, //
|
||||
0x14, 0x15, 0x01, 0xB3, 0xB8, //
|
||||
0x1D, 0x16, 0x04, 0x20, 0x28, //
|
||||
0x13, 0x13, 0x01, 0x21, 0x29, //
|
||||
0x23, 0x08, 0x01, 0x94, 0x9B, //
|
||||
0x27, 0x27, 0x03, 0xC4, 0xCA, //
|
||||
0x24, 0x1B, 0x02, 0xC6, 0xCB, //
|
||||
0x20, 0x1A, 0x03, 0x00, 0xE4, //
|
||||
0x00, // terminator
|
||||
};
|
||||
|
||||
u32 D_800A2C0C[] = {
|
||||
0x26080600, 0x00000000, 0x00000030, 0x80000000, 0x00000030, 0x80000000,
|
||||
0x0000007F, 0x80000000, 0x000000FF, 0x98000000, 0x0003FFFF, 0x98180000,
|
||||
0x07E7F8FF, 0xF818C000, 0x07FC01FF, 0x3FF8C000, 0x37FC0000, 0x001FC000,
|
||||
0x3FFC0000, 0x0000FF00, 0x3FE00000, 0x0000C000, 0x30000000, 0x0000C000,
|
||||
0x38000000, 0x0000C000, 0x3FE00000, 0x0000C000, 0x3FE00000, 0x0000C400,
|
||||
0x3FFE0000, 0x0001FF00, 0x3FFE0000, 0x00003F80, 0x30000000, 0x000003C0,
|
||||
0x3F000000, 0x000000E0, 0x3F807FE0, 0x00180070, 0x3FFFFF60, 0xFFFFC038,
|
||||
0x380003FF, 0x3818DF1C, 0x30000180, 0x0E03FFFC, 0x30000080, 0x06020100,
|
||||
0x30000080, 0x06020780, 0x00000080, 0x06030F00, 0x00000080, 0x0E021800,
|
||||
0x00000080, 0x08021000, 0x00000080, 0x0FE3F000, 0x00000080, 0x07E1E000,
|
||||
0x00000080, 0x07FFC000, 0x00000080, 0xFF8E0000, 0x000001FF, 0xC1BF800C,
|
||||
0x00003FFE, 0x01B0000C, 0x00003F80, 0x01BFFFFC, 0x00000000, 0x01807800,
|
||||
0x00000000, 0x01FFFF00, 0x00000000, 0x00003E00, 0x00000000, 0x000000FF,
|
||||
};
|
||||
|
||||
u32** D_800A2D44 = &D_800A2C0C;
|
||||
|
||||
s32 func_800F087C(u32 chunkX, u32 chunkY) {
|
||||
RoomBossTeleport* phi_s1;
|
||||
s32 res;
|
||||
@ -467,22 +676,22 @@ INCLUDE_ASM("dra/nonmatchings/5087C", func_800F1B08);
|
||||
|
||||
INCLUDE_ASM("dra/nonmatchings/5087C", func_800F1D54);
|
||||
|
||||
void func_800F1EB0(s32 arg0, s32 arg1, s32 arg2) {
|
||||
s32 data_0;
|
||||
s32 data_1;
|
||||
void func_800F1EB0(s32 playerX, s32 playerY, s32 arg2) {
|
||||
s32 x;
|
||||
s32 y;
|
||||
s32 data_2;
|
||||
s32 data_3;
|
||||
s32 data_4;
|
||||
u8* ptr;
|
||||
|
||||
if (g_StageId & STAGE_INVERTEDCASTLE_FLAG) {
|
||||
arg0 = 0x3F - arg0;
|
||||
arg1 = 0x3F - arg1;
|
||||
playerX = 0x3F - playerX;
|
||||
playerY = 0x3F - playerY;
|
||||
}
|
||||
ptr = &D_800A2BC0;
|
||||
ptr = D_800A2BC0;
|
||||
while (*ptr != 0) {
|
||||
data_0 = *ptr++;
|
||||
data_1 = *ptr++;
|
||||
x = *ptr++;
|
||||
y = *ptr++;
|
||||
data_2 = *ptr++;
|
||||
data_3 = *ptr++;
|
||||
data_4 = *ptr++;
|
||||
@ -492,11 +701,12 @@ void func_800F1EB0(s32 arg0, s32 arg1, s32 arg2) {
|
||||
if (data_3 != 0xFF) {
|
||||
if (arg2 != 0xFFFF) {
|
||||
if (arg2 == data_3) {
|
||||
func_800F1D54(data_0, data_1, data_2, data_4);
|
||||
func_800F1D54(x, y, data_2, data_4);
|
||||
}
|
||||
} else {
|
||||
if (x == playerX && y == playerY && g_CastleFlags[data_3]) {
|
||||
func_800F1D54(x, y, data_2, data_4);
|
||||
}
|
||||
} else if ((data_0 == arg0) && (data_1 == arg1) &&
|
||||
(g_CastleFlags[data_3] != 0)) {
|
||||
func_800F1D54(data_0, data_1, data_2, data_4);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,14 @@
|
||||
#include "dra.h"
|
||||
|
||||
extern u8 D_800A243C[32] = {
|
||||
STAGE_ST0, STAGE_BO0, STAGE_BO4, STAGE_BO1, STAGE_BO2,
|
||||
STAGE_BO3, STAGE_NZ0_DEMO, STAGE_BO5, STAGE_RBO1, STAGE_DRE,
|
||||
STAGE_NZ1_DEMO, STAGE_RBO0, STAGE_RBO2, STAGE_BO7, STAGE_BO6,
|
||||
STAGE_RBO3, STAGE_RBO4, STAGE_LIB_DEMO, STAGE_RBO5, STAGE_RBO7,
|
||||
STAGE_RNZ1_DEMO, STAGE_RBO8, STAGE_NO0, STAGE_NO0, STAGE_NO0,
|
||||
STAGE_NO0, STAGE_NO0, STAGE_RCEN, STAGE_RBO6,
|
||||
};
|
||||
|
||||
void DemoGameInit(s32 arg0) {
|
||||
s32 i;
|
||||
|
||||
|
@ -372,11 +372,8 @@ extern u16 g_ButtonMask[];
|
||||
extern u8 g_StageSelectOrder[];
|
||||
extern u16 D_800A04CC[];
|
||||
extern u32 D_800A04F8;
|
||||
extern s16 D_800A21B8[0x20];
|
||||
extern s32 D_800A2438;
|
||||
extern u8 D_800A243C[];
|
||||
extern RoomBossTeleport D_800A297C[];
|
||||
extern u8 D_800A2BC0[];
|
||||
extern u8 D_800A2D7C[3];
|
||||
extern u8 D_800A2D80[0x10];
|
||||
extern u8 c_chPlaystationButtons[];
|
||||
@ -402,7 +399,6 @@ extern s32 D_800A2FBC[];
|
||||
extern s32 D_800A2FC0[];
|
||||
|
||||
extern RoomTeleport D_800A245C[];
|
||||
extern s32 D_800A2464[]; // D_800A245C[0].stageId
|
||||
extern u32 D_800A2D24;
|
||||
extern const char* c_strALUCARD[];
|
||||
extern const char** c_strSTR;
|
||||
|
@ -1,24 +1,2 @@
|
||||
#include "dra.h"
|
||||
#include "../save_mgr.h"
|
||||
|
||||
#if defined(VERSION_HD)
|
||||
void MakeMemcardPath(char* dstSaveName, s32 block) {
|
||||
STRCPY(dstSaveName, "BISLPM-86023DRAX00");
|
||||
dstSaveName[0x10] += block / 10;
|
||||
dstSaveName[0x11] += block % 10;
|
||||
}
|
||||
#elif defined(VERSION_US)
|
||||
// The US version has an extra 'n' character after the string terminator,
|
||||
// probably a result of some left-overs from a previous build. Defining the
|
||||
// string `SaveName` as an array to manually append 'n' at the end was the only
|
||||
// way to get a match.
|
||||
const char HACK_SaveName[] = {
|
||||
'B', 'A', 'S', 'L', 'U', 'S', '-', '0', '0', '0',
|
||||
'6', '7', 'D', 'R', 'A', 'X', '0', '0', '\0', 'n',
|
||||
};
|
||||
void MakeMemcardPath(char* dstSaveName, s32 block) {
|
||||
__builtin_memcpy(dstSaveName, HACK_SaveName, sizeof(HACK_SaveName) - 1);
|
||||
dstSaveName[0x10] += block / 10;
|
||||
dstSaveName[0x11] += block % 10;
|
||||
}
|
||||
#endif
|
||||
|
@ -698,3 +698,9 @@ s32 LoadSaveData(SaveData* save) {
|
||||
g_randomNext = save->rng;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void MakeMemcardPath(char* dstSaveName, s32 block) {
|
||||
STRCPY(dstSaveName, MEMCARD_ID);
|
||||
dstSaveName[0x10] += block / 10;
|
||||
dstSaveName[0x11] += block % 10;
|
||||
}
|
||||
|
@ -1,8 +1,2 @@
|
||||
#include "sel.h"
|
||||
#include "../../save_mgr.h"
|
||||
|
||||
void MakeMemcardPath(char* dstSaveName, s32 block) {
|
||||
STRCPY(dstSaveName, "BASLUS-00067DRAX00");
|
||||
dstSaveName[0x10] += block / 10;
|
||||
dstSaveName[0x11] += block % 10;
|
||||
}
|
||||
|
32
tools/dirt_patcher.py
Normal file
32
tools/dirt_patcher.py
Normal file
@ -0,0 +1,32 @@
|
||||
#!/usr/bin/python3
|
||||
|
||||
import argparse
|
||||
import json
|
||||
|
||||
|
||||
def patch(config_file_name):
|
||||
with open(config_file_name, "r") as f:
|
||||
patches = json.load(f)
|
||||
for patch in patches:
|
||||
name = patch["name"]
|
||||
with open(name, "r+b") as f:
|
||||
for str_offset in patch:
|
||||
if not str_offset.startswith("0x"):
|
||||
continue
|
||||
offset = int(str_offset[2:], base=16)
|
||||
value = patch[str_offset]
|
||||
f.seek(offset)
|
||||
f.write(bytes([value]))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser(
|
||||
description="given a configuration, patches an existing binary"
|
||||
)
|
||||
parser.add_argument(
|
||||
"config",
|
||||
help="File path of the patch configuration",
|
||||
)
|
||||
|
||||
args = parser.parse_args()
|
||||
patch(args.config)
|
Loading…
x
Reference in New Issue
Block a user