Skip to content

Commit 929b2db

Browse files
committed
Added workaround for scrolls breaking on level reset
1 parent fd63f0f commit 929b2db

7 files changed

Lines changed: 57 additions & 5 deletions

File tree

Hacktice/hook.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
<?xml version="1.0"?><patch><data><address>0x396C</address><bytes>0x3C,0x04,0x80,0x05,0x24,0x84,0xD2,0x00,0x3C,0x05,0x00,0x7F,0x24,0xA5,0x12,0x00,0x3C,0x06,0x00,0x80,0x0C,0x09,0xE1,0x41,0x00,0x00,0x00,0x00,0x0C,0x01,0x34,0x80,0x00,0x00,0x00,0x00</bytes></data><data><address>0x4688</address><bytes>0xA0,0x3B,0xB2,0x5E</bytes></data><data><address>0x4694</address><bytes>0x00,0x00,0x00,0x00</bytes></data><data><address>0x5024</address><bytes>0x10,0x00,0x00,0x05</bytes></data><data><address>0x5150</address><bytes>0x00,0x00,0x00,0x00</bytes></data><data><address>0xB5FC</address><bytes>0x3C,0x01,0x80,0x05,0x8C,0x21,0xE0,0x0C,0x00,0x20,0xF8,0x09,0x8F,0xA4,0x00,0x18,0x10,0x00,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00</bytes></data><data><address>0x58044</address><bytes>0x3C,0x01,0x80,0x05,0x8C,0x21,0xE0,0x24,0x00,0x20,0xF8,0x09,0x8F,0xA4,0x00,0x2C,0x10,0x40,0x00,0x54</bytes></data><data><address>0x96838</address><bytes>0x3C,0x0A,0x02,0x01,0x25,0x4A,0x1C,0xC8</bytes></data><data><address>0x9688C</address><bytes>0x3C,0x01,0x80,0x05,0x8C,0x21,0xE0,0x04,0x00,0x20,0xF8,0x09,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x0D,0x00,0x00,0x00,0x00</bytes></data><data><address>0x968FC</address><bytes>0x3C,0x08,0x02,0x01,0x25,0x08,0x1D,0x50</bytes></data><data><address>0x96984</address><bytes>0x10,0x00,0x00,0x54,0x00,0x00,0x00,0x00</bytes></data><data><address>0x978FC</address><bytes>0x3C,0x01,0x80,0x05,0x8C,0x21,0xE0,0x04,0x00,0x20,0xF8,0x09,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x4A,0x00,0x00,0x00,0x00</bytes></data><data><address>0x9E9C8</address><bytes>0x24,0x01,0x00,0x0A</bytes></data><data><address>0x9EA00</address><bytes>0x03,0x21,0x00,0x18,0x00,0x00,0x48,0x12,0x24,0x01,0x00,0x03,0x01,0x21,0x00,0x1A,0x00,0x00,0x50,0x12,0xA7,0xAA,0x00,0x24</bytes></data><data><address>0x9EA24</address><bytes>0x00,0x00,0x00,0x00</bytes></data><data><address>0x9EA63</address><bytes>0xB4</bytes></data><data><address>0xD8068</address><bytes>0x27,0xBD,0xFF,0xE8,0xAF,0xBF,0x00,0x14,0x3C,0x01,0x80,0x05,0x8C,0x21,0xE0,0x08,0x00,0x20,0xF8,0x09,0x00,0x00,0x00,0x00,0x8F,0xBF,0x00,0x14,0x03,0xE0,0x00,0x08,0x27,0xBD,0x00,0x18</bytes></data><data><address>0xFD354</address><bytes>0x0C,0x01,0x34,0xC0,0x00,0x00,0x00,0x00</bytes></data><data><address>0x7F1200</address><bytes>0x27,0xBD,0xFF,0xE8,0xAF,0xBF,0x00,0x14,0x00,0x00,0x20,0x25,0x0C,0x09,0xDF,0xB8,0x3C,0x05,0x80,0x00,0x3C,0x04,0x80,0x34,0x3C,0x05,0x80,0x34,0x24,0xA5,0xB0,0x44,0x24,0x84,0xB0,0x28,0x0C,0x0C,0x89,0x68,0x24,0x06,0x00,0x01,0x8F,0xBF,0x00,0x14,0x03,0xE0,0x00,0x08,0x27,0xBD,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00</bytes></data><data><address>0x7F1300</address><bytes>0x27,0xBD,0xFF,0xE8,0xAF,0xBF,0x00,0x14,0x3C,0x01,0x80,0x05,0x8C,0x21,0xE0,0x00,0x00,0x20,0xF8,0x09,0x00,0x00,0x00,0x00,0x24,0x0E,0x00,0x01,0x3C,0x01,0x80,0x39,0x8F,0xBF,0x00,0x14,0x03,0xE0,0x00,0x08,0x27,0xBD,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00</bytes></data><data><address>0x7F1400</address><bytes>0x27,0xBD,0xFF,0xE8,0xAF,0xBF,0x00,0x14,0x3C,0x09,0x80,0x05,0x8D,0x29,0xE0,0x18,0x3C,0x08,0x44,0x53,0x25,0x08,0x42,0x4C,0x11,0x09,0x00,0x09,0x00,0x00,0x00,0x00,0x3C,0x04,0x80,0x05,0x24,0x84,0xE0,0x00,0x0C,0x0C,0x97,0x48,0x34,0x05,0xE0,0x00,0x3C,0x08,0x44,0x53,0x25,0x08,0x42,0x4C,0x3C,0x01,0x80,0x05,0xAC,0x28,0xE0,0x18,0x8F,0xBF,0x00,0x14,0x03,0xE0,0x00,0x08,0x27,0xBD,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00</bytes></data><data><address>0x7F1500</address><bytes>0x27,0xBD,0xFF,0xE8,0xAF,0xBF,0x00,0x14,0x3C,0x09,0x80,0x05,0x8D,0x29,0xE0,0x18,0x3C,0x08,0x55,0x50,0x25,0x08,0x47,0x52,0x11,0x09,0x00,0x0D,0x00,0x00,0x00,0x00,0x3C,0x04,0x80,0x05,0x24,0x84,0xE0,0x00,0x0C,0x0C,0x91,0x84,0x34,0x05,0xE0,0x00,0x3C,0x04,0x80,0x05,0x24,0x84,0xE0,0x00,0x0C,0x0C,0x90,0xEC,0x34,0x05,0xE0,0x00,0x3C,0x08,0x55,0x50,0x25,0x08,0x47,0x52,0x3C,0x01,0x80,0x05,0xAC,0x28,0xE0,0x18,0x8F,0xBF,0x00,0x14,0x03,0xE0,0x00,0x08,0x27,0xBD,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00</bytes></data></patch>
1+
<?xml version="1.0"?><patch><data><address>0x396C</address><bytes>0x3C,0x04,0x80,0x05,0x24,0x84,0xD2,0x00,0x3C,0x05,0x00,0x7F,0x24,0xA5,0x12,0x00,0x3C,0x06,0x00,0x80,0x0C,0x09,0xE1,0x41,0x00,0x00,0x00,0x00,0x0C,0x01,0x34,0x80,0x00,0x00,0x00,0x00</bytes></data><data><address>0x4688</address><bytes>0xA0,0x3B,0xB2,0x5E</bytes></data><data><address>0x4694</address><bytes>0x00,0x00,0x00,0x00</bytes></data><data><address>0x5024</address><bytes>0x10,0x00,0x00,0x05</bytes></data><data><address>0x5150</address><bytes>0x00,0x00,0x00,0x00</bytes></data><data><address>0xB5FC</address><bytes>0x3C,0x01,0x80,0x05,0x8C,0x21,0xE0,0x0C,0x00,0x20,0xF8,0x09,0x8F,0xA4,0x00,0x18,0x10,0x00,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00</bytes></data><data><address>0x57E58</address><bytes>0x27,0xBD,0xFF,0xE8,0xAF,0xBF,0x00,0x14,0x3C,0x01,0x80,0x05,0x8C,0x21,0xE0,0x28,0x00,0x20,0xF8,0x09,0x00,0x00,0x00,0x00,0x8F,0xBF,0x00,0x14,0x03,0xE0,0x00,0x08,0x27,0xBD,0x00,0x18</bytes></data><data><address>0x58044</address><bytes>0x3C,0x01,0x80,0x05,0x8C,0x21,0xE0,0x24,0x00,0x20,0xF8,0x09,0x8F,0xA4,0x00,0x2C,0x10,0x40,0x00,0x54</bytes></data><data><address>0x96838</address><bytes>0x3C,0x0A,0x02,0x01,0x25,0x4A,0x1C,0xC8</bytes></data><data><address>0x9688C</address><bytes>0x3C,0x01,0x80,0x05,0x8C,0x21,0xE0,0x04,0x00,0x20,0xF8,0x09,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x0D,0x00,0x00,0x00,0x00</bytes></data><data><address>0x968FC</address><bytes>0x3C,0x08,0x02,0x01,0x25,0x08,0x1D,0x50</bytes></data><data><address>0x96984</address><bytes>0x10,0x00,0x00,0x54,0x00,0x00,0x00,0x00</bytes></data><data><address>0x978FC</address><bytes>0x3C,0x01,0x80,0x05,0x8C,0x21,0xE0,0x04,0x00,0x20,0xF8,0x09,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x4A,0x00,0x00,0x00,0x00</bytes></data><data><address>0x9E9C8</address><bytes>0x24,0x01,0x00,0x0A</bytes></data><data><address>0x9EA00</address><bytes>0x03,0x21,0x00,0x18,0x00,0x00,0x48,0x12,0x24,0x01,0x00,0x03,0x01,0x21,0x00,0x1A,0x00,0x00,0x50,0x12,0xA7,0xAA,0x00,0x24</bytes></data><data><address>0x9EA24</address><bytes>0x00,0x00,0x00,0x00</bytes></data><data><address>0x9EA63</address><bytes>0xB4</bytes></data><data><address>0xD8068</address><bytes>0x27,0xBD,0xFF,0xE8,0xAF,0xBF,0x00,0x14,0x3C,0x01,0x80,0x05,0x8C,0x21,0xE0,0x08,0x00,0x20,0xF8,0x09,0x00,0x00,0x00,0x00,0x8F,0xBF,0x00,0x14,0x03,0xE0,0x00,0x08,0x27,0xBD,0x00,0x18</bytes></data><data><address>0xFD354</address><bytes>0x0C,0x01,0x34,0xC0,0x00,0x00,0x00,0x00</bytes></data><data><address>0x7F1200</address><bytes>0x27,0xBD,0xFF,0xE8,0xAF,0xBF,0x00,0x14,0x00,0x00,0x20,0x25,0x0C,0x09,0xDF,0xB8,0x3C,0x05,0x80,0x00,0x3C,0x04,0x80,0x34,0x3C,0x05,0x80,0x34,0x24,0xA5,0xB0,0x44,0x24,0x84,0xB0,0x28,0x0C,0x0C,0x89,0x68,0x24,0x06,0x00,0x01,0x8F,0xBF,0x00,0x14,0x03,0xE0,0x00,0x08,0x27,0xBD,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00</bytes></data><data><address>0x7F1300</address><bytes>0x27,0xBD,0xFF,0xE8,0xAF,0xBF,0x00,0x14,0x3C,0x01,0x80,0x05,0x8C,0x21,0xE0,0x00,0x00,0x20,0xF8,0x09,0x00,0x00,0x00,0x00,0x24,0x0E,0x00,0x01,0x3C,0x01,0x80,0x39,0x8F,0xBF,0x00,0x14,0x03,0xE0,0x00,0x08,0x27,0xBD,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00</bytes></data><data><address>0x7F1400</address><bytes>0x27,0xBD,0xFF,0xE8,0xAF,0xBF,0x00,0x14,0x3C,0x09,0x80,0x05,0x8D,0x29,0xE0,0x18,0x3C,0x08,0x44,0x53,0x25,0x08,0x42,0x4C,0x11,0x09,0x00,0x09,0x00,0x00,0x00,0x00,0x3C,0x04,0x80,0x05,0x24,0x84,0xE0,0x00,0x0C,0x0C,0x97,0x48,0x34,0x05,0xE0,0x00,0x3C,0x08,0x44,0x53,0x25,0x08,0x42,0x4C,0x3C,0x01,0x80,0x05,0xAC,0x28,0xE0,0x18,0x8F,0xBF,0x00,0x14,0x03,0xE0,0x00,0x08,0x27,0xBD,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00</bytes></data><data><address>0x7F1500</address><bytes>0x27,0xBD,0xFF,0xE8,0xAF,0xBF,0x00,0x14,0x3C,0x09,0x80,0x05,0x8D,0x29,0xE0,0x18,0x3C,0x08,0x55,0x50,0x25,0x08,0x47,0x52,0x11,0x09,0x00,0x0D,0x00,0x00,0x00,0x00,0x3C,0x04,0x80,0x05,0x24,0x84,0xE0,0x00,0x0C,0x0C,0x91,0x84,0x34,0x05,0xE0,0x00,0x3C,0x04,0x80,0x05,0x24,0x84,0xE0,0x00,0x0C,0x0C,0x90,0xEC,0x34,0x05,0xE0,0x00,0x3C,0x08,0x55,0x50,0x25,0x08,0x47,0x52,0x3C,0x01,0x80,0x05,0xAC,0x28,0xE0,0x18,0x8F,0xBF,0x00,0x14,0x03,0xE0,0x00,0x08,0x27,0xBD,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00</bytes></data></patch>

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ PAYLOAD_DATA = $(TOOL_DIR)/payload_data
2828
CC = clang
2929
AR = llvm-ar
3030
LD = ld.lld
31-
CFLAGS = -flto -Wall -Wdouble-promotion -Oz -mfix4300 -march=mips2 --target=mips-img-elf -fomit-frame-pointer -G0 -I $(INCLUDE_PATH) -I $(INCLUDE_PATH)/libc -mno-check-zero-division -fno-exceptions -fno-builtin -fno-rtti -fno-common -mno-abicalls -DTARGET_N64 -mfpxx
31+
CFLAGS = -DBINARY -flto -Wall -Wdouble-promotion -Oz -mfix4300 -march=mips2 --target=mips-img-elf -fomit-frame-pointer -G0 -I $(INCLUDE_PATH) -I $(INCLUDE_PATH)/libc -mno-check-zero-division -fno-exceptions -fno-builtin -fno-rtti -fno-common -mno-abicalls -DTARGET_N64 -mfpxx
3232

3333
all: $(OBJ_DIR) $(ROM) $(PAYLOAD_HEADER) $(PAYLOAD_DATA)
3434

hook.asm

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,17 @@
101101
lw a0, 0x2c(sp) ; spawnInfo
102102
beq v0, r0, 0x581a8
103103

104+
; +++ set_object_respawn_info_bits hook for level reset
105+
.orga 0x57e58
106+
addiu sp, sp, -0x18
107+
sw ra, 0x14(sp)
108+
lw at, 0x8004e028
109+
jalr at
110+
nop
111+
lw ra, 0x14(sp)
112+
jr ra
113+
addiu sp, sp, 0x18
114+
104115
; +++ Main hook to load data in
105116

106117
.headersize 0x80245000

src/level_reset.c

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include "game/level_update.h"
77
#include "game/envfx_snow.h"
88
#include "object_constants.h"
9+
#include "libc/stddef.h"
910

1011
#include "cfg.h"
1112
#include "timer.h"
@@ -14,6 +15,10 @@ static bool sTimerRunningDeferred = false;
1415
extern u8 sTransitionColorFadeCount[4];
1516
extern u16 sTransitionTextureFadeCount[2];
1617

18+
#define container_of(ptr, type, member) ({ \
19+
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
20+
(type *)( (char *)__mptr - offsetof(type,member) );})
21+
1722
static void resetCamera()
1823
{
1924
struct MarioState* m = gMarioStates;
@@ -107,13 +112,48 @@ void LevelReset_onNormal()
107112
}
108113
}
109114

115+
static inline bool isScroll(struct SpawnInfo* spawnInfo)
116+
{
117+
#ifdef BINARY
118+
// TODO: This is very hacky, do a more careful check
119+
if (spawnInfo->behaviorScript == (void*) 0x401700)
120+
return true;
121+
#endif
122+
123+
return false;
124+
}
125+
110126
s32 LevelReset_onSpawnObjectsFromInfoHook(struct SpawnInfo* spawnInfo)
111127
{
112-
if (sTimerRunningDeferred)
128+
if (sTimerRunningDeferred && !isScroll(spawnInfo))
113129
{
114130
spawnInfo->behaviorArg &= ~(RESPAWN_INFO_DONT_RESPAWN << 8);
115131
return true;
116132
}
117133

118134
return (spawnInfo->behaviorArg & (RESPAWN_INFO_DONT_RESPAWN << 8)) != (RESPAWN_INFO_DONT_RESPAWN << 8);
119135
}
136+
137+
void LevelReset_setObjectRespawnInfoBits(struct Object *obj, u8 bits)
138+
{
139+
switch (obj->respawnInfoType)
140+
{
141+
case RESPAWN_INFO_TYPE_32:
142+
{
143+
u32* info32 = (u32 *) obj->respawnInfo;
144+
struct SpawnInfo* spawnInfo = container_of(info32, struct SpawnInfo, behaviorArg);
145+
if (!isScroll(spawnInfo))
146+
{
147+
*info32 |= bits << 8;
148+
}
149+
}
150+
break;
151+
152+
case RESPAWN_INFO_TYPE_16:
153+
{
154+
u16* info16 = (u16 *) obj->respawnInfo;
155+
*info16 |= bits << 8;
156+
}
157+
break;
158+
}
159+
}

src/level_reset.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@
44

55
void LevelReset_onNormal();
66
s32 LevelReset_onSpawnObjectsFromInfoHook(struct SpawnInfo* spawnInfo);
7+
void LevelReset_setObjectRespawnInfoBits(struct Object *obj, u8 bits) ;

src/main.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,6 @@ uintptr_t _start[] = {
7070
(uintptr_t) &sConfig,
7171
(uintptr_t) 0x80026000,
7272
(uintptr_t) LevelReset_onSpawnObjectsFromInfoHook,
73-
(uintptr_t) 0 /*reserved for future use*/,
73+
(uintptr_t) LevelReset_setObjectRespawnInfoBits,
7474
(uintptr_t) 0 /*reserved for future use*/,
7575
};

src/xversion.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
HACKTICE_VERSION(1, 4, 2)
1+
HACKTICE_VERSION(1, 4, 3)

0 commit comments

Comments
 (0)