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:
Luciano Ciccariello 2023-12-12 18:36:34 +00:00 committed by GitHub
parent 130bc38d71
commit b851d5e4d2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
17 changed files with 325 additions and 50 deletions

View File

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

@ -0,0 +1 @@
[]

1
config/dirt.saturn.json Normal file
View File

@ -0,0 +1 @@
[]

11
config/dirt.us.json Normal file
View File

@ -0,0 +1,11 @@
[
{
"name": "build/us/DRA.BIN",
"0x220E": 41,
"0x220F": 13,
"0x2459": 49,
"0x245A": 55,
"0x245B": 44,
"0x3C1A7": 110
}
]

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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