M Makefile => Makefile +2 -3
@@ 581,10 581,9 @@ $(BUILD_DIR)/%.elf: $(BUILD_DIR)/%.o
$(call print,Linking ELF file:,$<,$@)
$(V)$(LD) -e 0 -Ttext=$(SEGMENT_ADDRESS) -Map $@.map -o $@ $<
# Override for leveldata.elf, which otherwise matches the above pattern
-.SECONDEXPANSION:
-$(BUILD_DIR)/levels/%/leveldata.elf: $(BUILD_DIR)/levels/%/leveldata.o $(BUILD_DIR)/bin/$$(TEXTURE_BIN).elf
+$(BUILD_DIR)/levels/%/leveldata.elf: $(BUILD_DIR)/levels/%/leveldata.o $(wildcard $(BUILD_DIR)/bin/*.elf)
$(call print,Linking ELF file:,$<,$@)
- $(V)$(LD) -e 0 -Ttext=$(SEGMENT_ADDRESS) -Map $@.map --just-symbols=$(BUILD_DIR)/bin/$(TEXTURE_BIN).elf -o $@ $<
+ $(V)$(LD) -e 0 -Ttext=$(SEGMENT_ADDRESS) -Map $@.map $(foreach texture,$(wildcard $(BUILD_DIR)/bin/*.elf),--just-symbols=$(texture)) -o $@ $<
$(BUILD_DIR)/%.bin: $(BUILD_DIR)/%.elf
$(call print,Extracting compressible data from:,$<,$@)
M include/level_table.h => include/level_table.h +2 -0
@@ 15,6 15,8 @@ enum LevelNum {
LEVEL_MIN = LEVEL_NONE + 1
};
+#define LEVEL LEVEL_TTM
+
#undef STUB_LEVEL
#undef DEFINE_LEVEL
M include/sm64.h => include/sm64.h +39 -40
@@ 164,7 164,6 @@
#define ACT_FLAG_ALLOW_VERTICAL_WIND_ACTION /* 0x01000000 */ (1 << 24)
#define ACT_FLAG_CONTROL_JUMP_HEIGHT /* 0x02000000 */ (1 << 25)
#define ACT_FLAG_ALLOW_FIRST_PERSON /* 0x04000000 */ (1 << 26)
-#define ACT_FLAG_PAUSE_EXIT /* 0x08000000 */ (1 << 27)
#define ACT_FLAG_SWIMMING_OR_FLYING /* 0x10000000 */ (1 << 28)
#define ACT_FLAG_WATER_OR_TEXT /* 0x20000000 */ (1 << 29)
#define ACT_FLAG_THROWING /* 0x80000000 */ (1 << 31)
@@ 172,43 171,43 @@
#define ACT_UNINITIALIZED 0x00000000 // (0x000)
// group 0x000: stationary actions
-#define ACT_IDLE 0x0C400201 // (0x001 | ACT_FLAG_STATIONARY | ACT_FLAG_IDLE | ACT_FLAG_ALLOW_FIRST_PERSON | ACT_FLAG_PAUSE_EXIT)
-#define ACT_START_SLEEPING 0x0C400202 // (0x002 | ACT_FLAG_STATIONARY | ACT_FLAG_IDLE | ACT_FLAG_ALLOW_FIRST_PERSON | ACT_FLAG_PAUSE_EXIT)
-#define ACT_SLEEPING 0x0C000203 // (0x003 | ACT_FLAG_STATIONARY | ACT_FLAG_ALLOW_FIRST_PERSON | ACT_FLAG_PAUSE_EXIT)
-#define ACT_WAKING_UP 0x0C000204 // (0x004 | ACT_FLAG_STATIONARY | ACT_FLAG_ALLOW_FIRST_PERSON | ACT_FLAG_PAUSE_EXIT)
-#define ACT_PANTING 0x0C400205 // (0x005 | ACT_FLAG_STATIONARY | ACT_FLAG_IDLE | ACT_FLAG_ALLOW_FIRST_PERSON | ACT_FLAG_PAUSE_EXIT)
-#define ACT_HOLD_PANTING_UNUSED 0x08000206 // (0x006 | ACT_FLAG_STATIONARY | ACT_FLAG_PAUSE_EXIT)
-#define ACT_HOLD_IDLE 0x08000207 // (0x007 | ACT_FLAG_STATIONARY | ACT_FLAG_PAUSE_EXIT)
-#define ACT_HOLD_HEAVY_IDLE 0x08000208 // (0x008 | ACT_FLAG_STATIONARY | ACT_FLAG_PAUSE_EXIT)
-#define ACT_STANDING_AGAINST_WALL 0x0C400209 // (0x009 | ACT_FLAG_STATIONARY | ACT_FLAG_IDLE | ACT_FLAG_ALLOW_FIRST_PERSON | ACT_FLAG_PAUSE_EXIT)
-#define ACT_COUGHING 0x0C40020A // (0x00A | ACT_FLAG_STATIONARY | ACT_FLAG_IDLE | ACT_FLAG_ALLOW_FIRST_PERSON | ACT_FLAG_PAUSE_EXIT)
-#define ACT_SHIVERING 0x0C40020B // (0x00B | ACT_FLAG_STATIONARY | ACT_FLAG_IDLE | ACT_FLAG_ALLOW_FIRST_PERSON | ACT_FLAG_PAUSE_EXIT)
+#define ACT_IDLE 0x0C400201 // (0x001 | ACT_FLAG_STATIONARY | ACT_FLAG_IDLE | ACT_FLAG_ALLOW_FIRST_PERSON)
+#define ACT_START_SLEEPING 0x0C400202 // (0x002 | ACT_FLAG_STATIONARY | ACT_FLAG_IDLE | ACT_FLAG_ALLOW_FIRST_PERSON)
+#define ACT_SLEEPING 0x0C000203 // (0x003 | ACT_FLAG_STATIONARY | ACT_FLAG_ALLOW_FIRST_PERSON)
+#define ACT_WAKING_UP 0x0C000204 // (0x004 | ACT_FLAG_STATIONARY | ACT_FLAG_ALLOW_FIRST_PERSON)
+#define ACT_PANTING 0x0C400205 // (0x005 | ACT_FLAG_STATIONARY | ACT_FLAG_IDLE | ACT_FLAG_ALLOW_FIRST_PERSON)
+#define ACT_HOLD_PANTING_UNUSED 0x08000206 // (0x006 | ACT_FLAG_STATIONARY)
+#define ACT_HOLD_IDLE 0x08000207 // (0x007 | ACT_FLAG_STATIONARY)
+#define ACT_HOLD_HEAVY_IDLE 0x08000208 // (0x008 | ACT_FLAG_STATIONARY)
+#define ACT_STANDING_AGAINST_WALL 0x0C400209 // (0x009 | ACT_FLAG_STATIONARY | ACT_FLAG_IDLE | ACT_FLAG_ALLOW_FIRST_PERSON)
+#define ACT_COUGHING 0x0C40020A // (0x00A | ACT_FLAG_STATIONARY | ACT_FLAG_IDLE | ACT_FLAG_ALLOW_FIRST_PERSON)
+#define ACT_SHIVERING 0x0C40020B // (0x00B | ACT_FLAG_STATIONARY | ACT_FLAG_IDLE | ACT_FLAG_ALLOW_FIRST_PERSON)
#define ACT_IN_QUICKSAND 0x0002020D // (0x00D | ACT_FLAG_STATIONARY | ACT_FLAG_INVULNERABLE)
#define ACT_UNKNOWN_0002020E 0x0002020E // (0x00E | ACT_FLAG_STATIONARY | ACT_FLAG_INVULNERABLE)
-#define ACT_CROUCHING 0x0C008220 // (0x020 | ACT_FLAG_STATIONARY | ACT_FLAG_SHORT_HITBOX | ACT_FLAG_ALLOW_FIRST_PERSON | ACT_FLAG_PAUSE_EXIT)
-#define ACT_START_CROUCHING 0x0C008221 // (0x021 | ACT_FLAG_STATIONARY | ACT_FLAG_SHORT_HITBOX | ACT_FLAG_ALLOW_FIRST_PERSON | ACT_FLAG_PAUSE_EXIT)
-#define ACT_STOP_CROUCHING 0x0C008222 // (0x022 | ACT_FLAG_STATIONARY | ACT_FLAG_SHORT_HITBOX | ACT_FLAG_ALLOW_FIRST_PERSON | ACT_FLAG_PAUSE_EXIT)
-#define ACT_START_CRAWLING 0x0C008223 // (0x023 | ACT_FLAG_STATIONARY | ACT_FLAG_SHORT_HITBOX | ACT_FLAG_ALLOW_FIRST_PERSON | ACT_FLAG_PAUSE_EXIT)
-#define ACT_STOP_CRAWLING 0x0C008224 // (0x024 | ACT_FLAG_STATIONARY | ACT_FLAG_SHORT_HITBOX | ACT_FLAG_ALLOW_FIRST_PERSON | ACT_FLAG_PAUSE_EXIT)
-#define ACT_SLIDE_KICK_SLIDE_STOP 0x08000225 // (0x025 | ACT_FLAG_STATIONARY | ACT_FLAG_PAUSE_EXIT)
+#define ACT_CROUCHING 0x0C008220 // (0x020 | ACT_FLAG_STATIONARY | ACT_FLAG_SHORT_HITBOX | ACT_FLAG_ALLOW_FIRST_PERSON)
+#define ACT_START_CROUCHING 0x0C008221 // (0x021 | ACT_FLAG_STATIONARY | ACT_FLAG_SHORT_HITBOX | ACT_FLAG_ALLOW_FIRST_PERSON)
+#define ACT_STOP_CROUCHING 0x0C008222 // (0x022 | ACT_FLAG_STATIONARY | ACT_FLAG_SHORT_HITBOX | ACT_FLAG_ALLOW_FIRST_PERSON)
+#define ACT_START_CRAWLING 0x0C008223 // (0x023 | ACT_FLAG_STATIONARY | ACT_FLAG_SHORT_HITBOX | ACT_FLAG_ALLOW_FIRST_PERSON)
+#define ACT_STOP_CRAWLING 0x0C008224 // (0x024 | ACT_FLAG_STATIONARY | ACT_FLAG_SHORT_HITBOX | ACT_FLAG_ALLOW_FIRST_PERSON)
+#define ACT_SLIDE_KICK_SLIDE_STOP 0x08000225 // (0x025 | ACT_FLAG_STATIONARY)
#define ACT_SHOCKWAVE_BOUNCE 0x00020226 // (0x026 | ACT_FLAG_STATIONARY | ACT_FLAG_INVULNERABLE)
-#define ACT_FIRST_PERSON 0x0C000227 // (0x027 | ACT_FLAG_STATIONARY | ACT_FLAG_ALLOW_FIRST_PERSON | ACT_FLAG_PAUSE_EXIT)
-#define ACT_BACKFLIP_LAND_STOP 0x0800022F // (0x02F | ACT_FLAG_STATIONARY | ACT_FLAG_PAUSE_EXIT)
-#define ACT_JUMP_LAND_STOP 0x0C000230 // (0x030 | ACT_FLAG_STATIONARY | ACT_FLAG_ALLOW_FIRST_PERSON | ACT_FLAG_PAUSE_EXIT)
-#define ACT_DOUBLE_JUMP_LAND_STOP 0x0C000231 // (0x031 | ACT_FLAG_STATIONARY | ACT_FLAG_ALLOW_FIRST_PERSON | ACT_FLAG_PAUSE_EXIT)
-#define ACT_FREEFALL_LAND_STOP 0x0C000232 // (0x032 | ACT_FLAG_STATIONARY | ACT_FLAG_ALLOW_FIRST_PERSON | ACT_FLAG_PAUSE_EXIT)
-#define ACT_SIDE_FLIP_LAND_STOP 0x0C000233 // (0x033 | ACT_FLAG_STATIONARY | ACT_FLAG_ALLOW_FIRST_PERSON | ACT_FLAG_PAUSE_EXIT)
-#define ACT_HOLD_JUMP_LAND_STOP 0x08000234 // (0x034 | ACT_FLAG_STATIONARY | ACT_FLAG_PAUSE_EXIT)
-#define ACT_HOLD_FREEFALL_LAND_STOP 0x08000235 // (0x035 | ACT_FLAG_STATIONARY | ACT_FLAG_PAUSE_EXIT)
+#define ACT_FIRST_PERSON 0x0C000227 // (0x027 | ACT_FLAG_STATIONARY | ACT_FLAG_ALLOW_FIRST_PERSON)
+#define ACT_BACKFLIP_LAND_STOP 0x0800022F // (0x02F | ACT_FLAG_STATIONARY)
+#define ACT_JUMP_LAND_STOP 0x0C000230 // (0x030 | ACT_FLAG_STATIONARY | ACT_FLAG_ALLOW_FIRST_PERSON)
+#define ACT_DOUBLE_JUMP_LAND_STOP 0x0C000231 // (0x031 | ACT_FLAG_STATIONARY | ACT_FLAG_ALLOW_FIRST_PERSON)
+#define ACT_FREEFALL_LAND_STOP 0x0C000232 // (0x032 | ACT_FLAG_STATIONARY | ACT_FLAG_ALLOW_FIRST_PERSON)
+#define ACT_SIDE_FLIP_LAND_STOP 0x0C000233 // (0x033 | ACT_FLAG_STATIONARY | ACT_FLAG_ALLOW_FIRST_PERSON)
+#define ACT_HOLD_JUMP_LAND_STOP 0x08000234 // (0x034 | ACT_FLAG_STATIONARY)
+#define ACT_HOLD_FREEFALL_LAND_STOP 0x08000235 // (0x035 | ACT_FLAG_STATIONARY)
#define ACT_AIR_THROW_LAND 0x80000A36 // (0x036 | ACT_FLAG_STATIONARY | ACT_FLAG_AIR | ACT_FLAG_THROWING)
-#define ACT_TWIRL_LAND 0x18800238 // (0x038 | ACT_FLAG_STATIONARY | ACT_FLAG_ATTACKING | ACT_FLAG_PAUSE_EXIT | ACT_FLAG_SWIMMING_OR_FLYING)
-#define ACT_LAVA_BOOST_LAND 0x08000239 // (0x039 | ACT_FLAG_STATIONARY | ACT_FLAG_PAUSE_EXIT)
-#define ACT_TRIPLE_JUMP_LAND_STOP 0x0800023A // (0x03A | ACT_FLAG_STATIONARY | ACT_FLAG_PAUSE_EXIT)
-#define ACT_LONG_JUMP_LAND_STOP 0x0800023B // (0x03B | ACT_FLAG_STATIONARY | ACT_FLAG_PAUSE_EXIT)
+#define ACT_TWIRL_LAND 0x18800238 // (0x038 | ACT_FLAG_STATIONARY | ACT_FLAG_ATTACKING | ACT_FLAG_SWIMMING_OR_FLYING)
+#define ACT_LAVA_BOOST_LAND 0x08000239 // (0x039 | ACT_FLAG_STATIONARY)
+#define ACT_TRIPLE_JUMP_LAND_STOP 0x0800023A // (0x03A | ACT_FLAG_STATIONARY)
+#define ACT_LONG_JUMP_LAND_STOP 0x0800023B // (0x03B | ACT_FLAG_STATIONARY)
#define ACT_GROUND_POUND_LAND 0x0080023C // (0x03C | ACT_FLAG_STATIONARY | ACT_FLAG_ATTACKING)
-#define ACT_BRAKING_STOP 0x0C00023D // (0x03D | ACT_FLAG_STATIONARY | ACT_FLAG_ALLOW_FIRST_PERSON | ACT_FLAG_PAUSE_EXIT)
-#define ACT_BUTT_SLIDE_STOP 0x0C00023E // (0x03E | ACT_FLAG_STATIONARY | ACT_FLAG_ALLOW_FIRST_PERSON | ACT_FLAG_PAUSE_EXIT)
-#define ACT_HOLD_BUTT_SLIDE_STOP 0x0800043F // (0x03F | ACT_FLAG_MOVING | ACT_FLAG_PAUSE_EXIT)
+#define ACT_BRAKING_STOP 0x0C00023D // (0x03D | ACT_FLAG_STATIONARY | ACT_FLAG_ALLOW_FIRST_PERSON)
+#define ACT_BUTT_SLIDE_STOP 0x0C00023E // (0x03E | ACT_FLAG_STATIONARY | ACT_FLAG_ALLOW_FIRST_PERSON)
+#define ACT_HOLD_BUTT_SLIDE_STOP 0x0800043F // (0x03F | ACT_FLAG_MOVING)
// group 0x040: moving (ground) actions
#define ACT_WALKING 0x04000440 // (0x040 | ACT_FLAG_MOVING | ACT_FLAG_ALLOW_FIRST_PERSON)
@@ 300,8 299,8 @@
#define ACT_THROWN_BACKWARD 0x010208BE // (0x0BE | ACT_FLAG_AIR | ACT_FLAG_INVULNERABLE | ACT_FLAG_ALLOW_VERTICAL_WIND_ACTION)
// group 0x0C0: submerged actions
-#define ACT_WATER_IDLE 0x380022C0 // (0x0C0 | ACT_FLAG_STATIONARY | ACT_FLAG_SWIMMING | ACT_FLAG_PAUSE_EXIT | ACT_FLAG_SWIMMING_OR_FLYING | ACT_FLAG_WATER_OR_TEXT)
-#define ACT_HOLD_WATER_IDLE 0x380022C1 // (0x0C1 | ACT_FLAG_STATIONARY | ACT_FLAG_SWIMMING | ACT_FLAG_PAUSE_EXIT | ACT_FLAG_SWIMMING_OR_FLYING | ACT_FLAG_WATER_OR_TEXT)
+#define ACT_WATER_IDLE 0x380022C0 // (0x0C0 | ACT_FLAG_STATIONARY | ACT_FLAG_SWIMMING | ACT_FLAG_SWIMMING_OR_FLYING | ACT_FLAG_WATER_OR_TEXT)
+#define ACT_HOLD_WATER_IDLE 0x380022C1 // (0x0C1 | ACT_FLAG_STATIONARY | ACT_FLAG_SWIMMING | ACT_FLAG_SWIMMING_OR_FLYING | ACT_FLAG_WATER_OR_TEXT)
#define ACT_WATER_ACTION_END 0x300022C2 // (0x0C2 | ACT_FLAG_STATIONARY | ACT_FLAG_SWIMMING | ACT_FLAG_SWIMMING_OR_FLYING | ACT_FLAG_WATER_OR_TEXT)
#define ACT_HOLD_WATER_ACTION_END 0x300022C3 // (0x0C3 | ACT_FLAG_STATIONARY | ACT_FLAG_SWIMMING | ACT_FLAG_SWIMMING_OR_FLYING | ACT_FLAG_WATER_OR_TEXT)
#define ACT_DROWNING 0x300032C4 // (0x0C4 | ACT_FLAG_STATIONARY | ACT_FLAG_INTANGIBLE | ACT_FLAG_SWIMMING | ACT_FLAG_SWIMMING_OR_FLYING | ACT_FLAG_WATER_OR_TEXT)
@@ 320,8 319,8 @@
#define ACT_WATER_PUNCH 0x300024E1 // (0x0E1 | ACT_FLAG_MOVING | ACT_FLAG_SWIMMING | ACT_FLAG_SWIMMING_OR_FLYING | ACT_FLAG_WATER_OR_TEXT)
#define ACT_WATER_PLUNGE 0x300022E2 // (0x0E2 | ACT_FLAG_STATIONARY | ACT_FLAG_SWIMMING | ACT_FLAG_SWIMMING_OR_FLYING | ACT_FLAG_WATER_OR_TEXT)
#define ACT_CAUGHT_IN_WHIRLPOOL 0x300222E3 // (0x0E3 | ACT_FLAG_STATIONARY | ACT_FLAG_SWIMMING | ACT_FLAG_INVULNERABLE | ACT_FLAG_SWIMMING_OR_FLYING | ACT_FLAG_WATER_OR_TEXT)
-#define ACT_METAL_WATER_STANDING 0x080042F0 // (0x0F0 | ACT_FLAG_STATIONARY | ACT_FLAG_METAL_WATER | ACT_FLAG_PAUSE_EXIT)
-#define ACT_HOLD_METAL_WATER_STANDING 0x080042F1 // (0x0F1 | ACT_FLAG_STATIONARY | ACT_FLAG_METAL_WATER | ACT_FLAG_PAUSE_EXIT)
+#define ACT_METAL_WATER_STANDING 0x080042F0 // (0x0F0 | ACT_FLAG_STATIONARY | ACT_FLAG_METAL_WATER)
+#define ACT_HOLD_METAL_WATER_STANDING 0x080042F1 // (0x0F1 | ACT_FLAG_STATIONARY | ACT_FLAG_METAL_WATER)
#define ACT_METAL_WATER_WALKING 0x000044F2 // (0x0F2 | ACT_FLAG_MOVING | ACT_FLAG_METAL_WATER)
#define ACT_HOLD_METAL_WATER_WALKING 0x000044F3 // (0x0F3 | ACT_FLAG_MOVING | ACT_FLAG_METAL_WATER)
#define ACT_METAL_WATER_FALLING 0x000042F4 // (0x0F4 | ACT_FLAG_STATIONARY | ACT_FLAG_METAL_WATER)
@@ 387,16 386,16 @@
#define ACT_PUTTING_ON_CAP 0x0000133D // (0x13D | ACT_FLAG_STATIONARY | ACT_FLAG_INTANGIBLE)
// group 0x140: "automatic" actions
-#define ACT_HOLDING_POLE 0x08100340 // (0x140 | ACT_FLAG_STATIONARY | ACT_FLAG_ON_POLE | ACT_FLAG_PAUSE_EXIT)
+#define ACT_HOLDING_POLE 0x08100340 // (0x140 | ACT_FLAG_STATIONARY | ACT_FLAG_ON_POLE)
#define ACT_GRAB_POLE_SLOW 0x00100341 // (0x141 | ACT_FLAG_STATIONARY | ACT_FLAG_ON_POLE)
#define ACT_GRAB_POLE_FAST 0x00100342 // (0x142 | ACT_FLAG_STATIONARY | ACT_FLAG_ON_POLE)
#define ACT_CLIMBING_POLE 0x00100343 // (0x143 | ACT_FLAG_STATIONARY | ACT_FLAG_ON_POLE)
#define ACT_TOP_OF_POLE_TRANSITION 0x00100344 // (0x144 | ACT_FLAG_STATIONARY | ACT_FLAG_ON_POLE)
#define ACT_TOP_OF_POLE 0x00100345 // (0x145 | ACT_FLAG_STATIONARY | ACT_FLAG_ON_POLE)
-#define ACT_START_HANGING 0x08200348 // (0x148 | ACT_FLAG_STATIONARY | ACT_FLAG_HANGING | ACT_FLAG_PAUSE_EXIT)
+#define ACT_START_HANGING 0x08200348 // (0x148 | ACT_FLAG_STATIONARY | ACT_FLAG_HANGING)
#define ACT_HANGING 0x00200349 // (0x149 | ACT_FLAG_STATIONARY | ACT_FLAG_HANGING)
#define ACT_HANG_MOVING 0x0020054A // (0x14A | ACT_FLAG_MOVING | ACT_FLAG_HANGING)
-#define ACT_LEDGE_GRAB 0x0800034B // (0x14B | ACT_FLAG_STATIONARY | ACT_FLAG_PAUSE_EXIT)
+#define ACT_LEDGE_GRAB 0x0800034B // (0x14B | ACT_FLAG_STATIONARY)
#define ACT_LEDGE_CLIMB_SLOW_1 0x0000054C // (0x14C | ACT_FLAG_MOVING)
#define ACT_LEDGE_CLIMB_SLOW_2 0x0000054D // (0x14D | ACT_FLAG_MOVING)
#define ACT_LEDGE_CLIMB_DOWN 0x0000054E // (0x14E | ACT_FLAG_MOVING)
M include/text_strings.h.in => include/text_strings.h.in +2 -0
@@ 42,6 42,8 @@
#define TEXT_HUD_CONGRATULATIONS _("CONGRATULATIONS") // Course Complete Text, Bowser Courses
#endif
+#define TEXT_THI_CONTROLS _("CONTROLS - A-TINY B-HUGE")
+
#if defined(VERSION_JP) || defined(VERSION_SH)
/**
M levels/castle_inside/script.c => levels/castle_inside/script.c +0 -3
@@ 265,7 265,6 @@ const LevelScript level_castle_inside_entry[] = {
TERRAIN(/*terrainData*/ inside_castle_seg7_area_1_collision),
ROOMS(/*surfaceRooms*/ inside_castle_seg7_area_1_rooms),
MACRO_OBJECTS(/*objList*/ inside_castle_seg7_area_1_macro_objs),
- SET_BACKGROUND_MUSIC(/*settingsPreset*/ 0x0001, /*seq*/ SEQ_LEVEL_INSIDE_CASTLE),
TERRAIN_TYPE(/*terrainType*/ TERRAIN_STONE),
END_AREA(),
@@ 283,7 282,6 @@ const LevelScript level_castle_inside_entry[] = {
ROOMS(/*surfaceRooms*/ inside_castle_seg7_area_2_rooms),
MACRO_OBJECTS(/*objList*/ inside_castle_seg7_area_2_macro_objs),
INSTANT_WARP(/*index*/ 0, /*destArea*/ 2, /*displace*/ 0, -205, 410),
- SET_BACKGROUND_MUSIC(/*settingsPreset*/ 0x0001, /*seq*/ SEQ_LEVEL_INSIDE_CASTLE),
TERRAIN_TYPE(/*terrainType*/ TERRAIN_STONE),
END_AREA(),
@@ 300,7 298,6 @@ const LevelScript level_castle_inside_entry[] = {
TERRAIN(/*terrainData*/ inside_castle_seg7_area_3_collision),
ROOMS(/*surfaceRooms*/ inside_castle_seg7_area_3_rooms),
MACRO_OBJECTS(/*objList*/ inside_castle_seg7_area_3_macro_objs),
- SET_BACKGROUND_MUSIC(/*settingsPreset*/ 0x0001, /*seq*/ SEQ_LEVEL_INSIDE_CASTLE),
TERRAIN_TYPE(/*terrainType*/ TERRAIN_STONE),
END_AREA(),
M levels/entry.c => levels/entry.c +4 -3
@@ 2,8 2,9 @@
#include "sm64.h"
#include "segment_symbols.h"
#include "level_commands.h"
+#include "level_table.h"
-#include "levels/intro/header.h"
+#include "levels/scripts.h"
#include "make_const_nonconst.h"
@@ 11,7 12,7 @@ const LevelScript level_script_entry[] = {
INIT_LEVEL(),
SLEEP(/*frames*/ 2),
BLACKOUT(/*active*/ FALSE),
- SET_REG(/*value*/ 0),
- EXECUTE(/*seg*/ 0x14, /*script*/ _introSegmentRomStart, /*scriptEnd*/ _introSegmentRomEnd, /*entry*/ level_intro_splash_screen),
+ SET_REG(/*value*/ LEVEL),
+ EXECUTE(/*seg*/ 0x15, /*script*/ _scriptsSegmentRomStart, /*scriptEnd*/ _scriptsSegmentRomEnd, /*entry*/ level_main_scripts_entry),
JUMP(/*target*/ level_script_entry),
};
M levels/intro/script.c => levels/intro/script.c +9 -23
@@ 5,6 5,7 @@
#include "seq_ids.h"
#include "segment_symbols.h"
#include "level_commands.h"
+#include "level_table.h"
#include "game/area.h"
#include "game/level_update.h"
@@ 45,27 46,10 @@ const LevelScript level_intro_splash_screen[] = {
const LevelScript level_intro_mario_head_regular[] = {
INIT_LEVEL(),
- BLACKOUT(/*active*/ TRUE),
- FIXED_LOAD(/*loadAddr*/ _goddardSegmentStart, /*romStart*/ _goddardSegmentRomStart, /*romEnd*/ _goddardSegmentRomEnd),
- LOAD_MARIO_HEAD(/*loadHeadID*/ REGULAR_FACE),
- LOAD_RAW (/*seg*/ 0x13, _behaviorSegmentRomStart, _behaviorSegmentRomEnd),
- LOAD_MIO0_TEXTURE(/*seg*/ 0x0A, _title_screen_bg_mio0SegmentRomStart, _title_screen_bg_mio0SegmentRomEnd),
-
- ALLOC_LEVEL_POOL(),
- AREA(/*index*/ 1, intro_geo_mario_head_regular),
- END_AREA(),
- FREE_LEVEL_POOL(),
-
SLEEP(/*frames*/ 2),
- BLACKOUT(/*active*/ FALSE),
- LOAD_AREA(/*area*/ 1),
- SET_MENU_MUSIC(/*seq*/ SEQ_MENU_TITLE_SCREEN),
- TRANSITION(/*transType*/ WARP_TRANSITION_FADE_FROM_STAR, /*time*/ 20, /*color*/ 0x00, 0x00, 0x00),
- SLEEP(/*frames*/ 20),
- CALL_LOOP(/*arg*/ LVL_INTRO_REGULAR, /*func*/ lvl_intro_update),
- JUMP_IF(/*op*/ OP_EQ, /*arg*/ 100, script_intro_L1),
- JUMP_IF(/*op*/ OP_EQ, /*arg*/ 101, script_intro_L2),
- JUMP(script_intro_L4),
+ SET_REG(/*value*/ LEVEL),
+ EXECUTE(/*seg*/ 0x15, /*script*/ _scriptsSegmentRomStart, /*scriptEnd*/ _scriptsSegmentRomEnd, /*entry*/ level_main_scripts_entry),
+ JUMP(/*target*/ level_intro_mario_head_regular),
};
const LevelScript level_intro_mario_head_dizzy[] = {
@@ 88,9 72,11 @@ const LevelScript level_intro_mario_head_dizzy[] = {
TRANSITION(/*transType*/ WARP_TRANSITION_FADE_FROM_STAR, /*time*/ 20, /*color*/ 0x00, 0x00, 0x00),
SLEEP(/*frames*/ 20),
CALL_LOOP(/*arg*/ LVL_INTRO_GAME_OVER, /*func*/ lvl_intro_update),
- JUMP_IF(/*op*/ OP_EQ, /*arg*/ 100, script_intro_L1),
- JUMP_IF(/*op*/ OP_EQ, /*arg*/ 101, script_intro_L2),
- JUMP(script_intro_L4),
+ STOP_MUSIC(/*fadeOutTime*/ 0x00BE),
+ SLEEP(/*frames*/ 16),
+ CLEAR_LEVEL(),
+ SLEEP(/*frames*/ 2),
+ JUMP(level_intro_mario_head_regular),
};
const LevelScript level_intro_entry_4[] = {
M levels/thi/script.c => levels/thi/script.c +13 -1
@@ 77,6 77,16 @@ static const LevelScript script_func_local_8[] = {
RETURN(),
};
+static const LevelScript script_func_local_tiny[] = {
+ MARIO_POS(/*area*/ 2, /*yaw*/ 149, /*pos*/ -2211, -890, 2212),
+ RETURN(),
+};
+
+static const LevelScript script_func_local_huge[] = {
+ MARIO_POS(/*area*/ 1, /*yaw*/ 149, /*pos*/ -7372, -2969, 7373),
+ RETURN(),
+};
+
const LevelScript level_thi_entry[] = {
INIT_LEVEL(),
LOAD_MIO0 (/*seg*/ 0x07, _thi_segment_7SegmentRomStart, _thi_segment_7SegmentRomEnd),
@@ 155,7 165,9 @@ const LevelScript level_thi_entry[] = {
END_AREA(),
FREE_LEVEL_POOL(),
- MARIO_POS(/*area*/ 1, /*yaw*/ 149, /*pos*/ -7372, -2969, 7373),
+ GET_OR_SET(/*op*/ OP_GET, /*var*/ VAR_CURR_AREA_INDEX),
+ JUMP_LINK_IF(/*op*/ OP_EQ, /*arg*/ 2, script_func_local_tiny),
+ JUMP_LINK_IF(/*op*/ OP_NEQ, /*arg*/ 2, script_func_local_huge),
CALL(/*arg*/ 0, /*func*/ lvl_init_or_update),
CALL_LOOP(/*arg*/ 1, /*func*/ lvl_init_or_update),
CLEAR_LEVEL(),
M src/game/area.h => src/game/area.h +0 -1
@@ 118,7 118,6 @@ enum MenuOption {
// Course Pause Menu
MENU_OPT_CONTINUE = MENU_OPT_1,
- MENU_OPT_EXIT_COURSE = MENU_OPT_2,
MENU_OPT_CAMERA_ANGLE_R = MENU_OPT_3,
// Save Menu
M src/game/behaviors/camera_lakitu.inc.c => src/game/behaviors/camera_lakitu.inc.c +1 -4
@@ 12,10 12,7 @@
*/
void bhv_camera_lakitu_init(void) {
if (o->oBhvParams2ndByte != CAMERA_LAKITU_BP_FOLLOW_CAMERA) {
- // Despawn unless this is the very beginning of the game
- if (gNeverEnteredCastle != TRUE) {
- obj_mark_for_deletion(o);
- }
+ obj_mark_for_deletion(o);
} else {
spawn_object_relative_with_scale(CLOUD_BP_LAKITU_CLOUD, 0, 0, 0, 2.0f, o, MODEL_MIST, bhvCloud);
}
M src/game/cn_common_syms_1.c => src/game/cn_common_syms_1.c +0 -1
@@ 21,7 21,6 @@ FORCE_BSS u32 __osTimerCounter;
FORCE_BSS s16 gCurrAreaIndex;
FORCE_BSS s32 sNumCountOverflows2;
FORCE_BSS struct MemoryPool *gEffectsMemoryPool;
-FORCE_BSS s8 gNeverEnteredCastle;
FORCE_BSS s8 gRedCoinsCollected;
FORCE_BSS s16 gSavedCourseNum;
FORCE_BSS u32 __osFinalrom;
M => +1 -7
@@ 2995,10 2995,6 @@ s16 render_pause_screen(void) {
render_pause_my_score_coins();
render_pause_red_coins();
if (gMarioStates[0].action & ACT_FLAG_PAUSE_EXIT) {
render_pause_course_options(99, 93, &gMenuLineNum, 15);
}
#ifdef VERSION_EU
if (gPlayer3Controller->buttonPressed & (A_BUTTON | START_BUTTON | Z_TRIG))
#else
@@ 3011,9 3007,7 @@ s16 render_pause_screen(void) {
gMenuState = MENU_STATE_DEFAULT;
gMenuMode = MENU_MODE_NONE;
if (gMenuLineNum == MENU_OPT_EXIT_COURSE) {
index = gMenuLineNum;
} else { // MENU_OPT_CONTINUE or MENU_OPT_CAMERA_ANGLE_R
if (gMenuLineNum == MENU_OPT_CONTINUE || gMenuLineNum == MENU_OPT_CAMERA_ANGLE_R) {
index = MENU_OPT_DEFAULT;
}
M src/game/level_update.c => src/game/level_update.c +6 -28
@@ 169,7 169,6 @@ FORCE_BSS s16 sSourceWarpNodeId;
FORCE_BSS s32 sDelayedWarpArg;
FORCE_BSS s16 sUnusedLevelUpdateBss;
FORCE_BSS s8 sTimerRunning;
-s8 gNeverEnteredCastle;
struct MarioState *gMarioState = &gMarioStates[0];
u8 unused1[2] = { 0 };
@@ 329,9 328,6 @@ void set_mario_initial_action(struct MarioState *m, u32 spawnType, u32 actionArg
case MARIO_SPAWN_SPIN_AIRBORNE_CIRCLE:
set_mario_action(m, ACT_SPAWN_SPIN_AIRBORNE, 0);
break;
- case MARIO_SPAWN_DEATH:
- set_mario_action(m, ACT_FALLING_DEATH_EXIT, 0);
- break;
case MARIO_SPAWN_SPIN_AIRBORNE:
set_mario_action(m, ACT_SPAWN_SPIN_AIRBORNE, 0);
break;
@@ 344,20 340,17 @@ void set_mario_initial_action(struct MarioState *m, u32 spawnType, u32 actionArg
case MARIO_SPAWN_PAINTING_STAR_COLLECT:
set_mario_action(m, ACT_EXIT_AIRBORNE, 0);
break;
- case MARIO_SPAWN_PAINTING_DEATH:
- set_mario_action(m, ACT_DEATH_EXIT, 0);
- break;
case MARIO_SPAWN_AIRBORNE_STAR_COLLECT:
set_mario_action(m, ACT_FALLING_EXIT_AIRBORNE, 0);
break;
- case MARIO_SPAWN_AIRBORNE_DEATH:
- set_mario_action(m, ACT_UNUSED_DEATH_EXIT, 0);
- break;
case MARIO_SPAWN_LAUNCH_STAR_COLLECT:
set_mario_action(m, ACT_SPECIAL_EXIT_AIRBORNE, 0);
break;
+ case MARIO_SPAWN_DEATH:
+ case MARIO_SPAWN_PAINTING_DEATH:
+ case MARIO_SPAWN_AIRBORNE_DEATH:
case MARIO_SPAWN_LAUNCH_DEATH:
- set_mario_action(m, ACT_SPECIAL_DEATH_EXIT, 0);
+ warp_special(-2); // reset game
break;
}
@@ 834,6 827,7 @@ void initiate_delayed_warp(void) {
} else {
switch (sDelayedWarpOp) {
case WARP_OP_GAME_OVER:
+ save_file_erase(gCurrSaveFileNum - 1);
save_file_reload();
warp_special(-3);
break;
@@ 1015,16 1009,6 @@ s32 play_mode_paused(void) {
raise_background_noise(1);
gCameraMovementFlags &= ~CAM_MOVE_PAUSE_SCREEN;
set_play_mode(PLAY_MODE_NORMAL);
- } else { // MENU_OPT_EXIT_COURSE
- if (gDebugLevelSelect) {
- fade_into_special_warp(-9, 1);
- } else {
- initiate_warp(LEVEL_CASTLE, 1, 0x1F, 0);
- fade_into_special_warp(0, 0);
- gSavedCourseNum = COURSE_NONE;
- }
-
- gCameraMovementFlags &= ~CAM_MOVE_PAUSE_SCREEN;
}
return 0;
@@ 1182,12 1166,7 @@ s32 init_level(void) {
set_mario_action(gMarioState, ACT_IDLE, 0);
} else if (!gDebugLevelSelect) {
if (gMarioState->action != ACT_UNINITIALIZED) {
- if (save_file_exists(gCurrSaveFileNum - 1)) {
- set_mario_action(gMarioState, ACT_IDLE, 0);
- } else {
- set_mario_action(gMarioState, ACT_INTRO_CUTSCENE, 0);
- val4 = TRUE;
- }
+ set_mario_action(gMarioState, ACT_IDLE, 0);
}
}
}
@@ 1253,7 1232,6 @@ s32 lvl_init_from_save_file(UNUSED s16 arg0, s32 levelNum) {
#endif
sWarpDest.type = WARP_TYPE_NOT_WARPING;
sDelayedWarpOp = WARP_OP_NONE;
- gNeverEnteredCastle = !save_file_exists(gCurrSaveFileNum - 1);
gCurrLevelNum = levelNum;
gCurrCourseNum = COURSE_NONE;
M src/game/level_update.h => src/game/level_update.h +0 -1
@@ 170,7 170,6 @@ struct HudDisplay {
};
extern struct HudDisplay gHudDisplay;
-extern s8 gNeverEnteredCastle;
enum HUDDisplayFlag {
HUD_DISPLAY_FLAG_LIVES = 0x0001,
M src/game/mario.c => src/game/mario.c +5 -1
@@ 1883,7 1883,11 @@ void init_mario_from_save_file(void) {
save_file_get_total_star_count(gCurrSaveFileNum - 1, COURSE_MIN - 1, COURSE_MAX - 1);
gMarioState->numKeys = 0;
- gMarioState->numLives = 4;
+ if (gMarioState->numLives == 0) {
+ gMarioState->numLives = 4;
+ } else {
+ gMarioState->numLives--;
+ }
gMarioState->health = 0x880;
gMarioState->prevNumStarsForDialog = gMarioState->numStars;
M src/game/mario_actions_cutscene.c => src/game/mario_actions_cutscene.c +2 -10
@@ 475,10 475,6 @@ s32 act_reading_automatic_dialog(struct MarioState *m) {
// finished action
else if (m->actionState == 25) {
disable_time_stop();
- if (gNeverEnteredCastle) {
- gNeverEnteredCastle = FALSE;
- play_cutscene_music(SEQUENCE_ARGS(0, SEQ_LEVEL_INSIDE_CASTLE));
- }
if (m->prevAction == ACT_STAR_DANCE_WATER) {
set_mario_action(m, ACT_WATER_IDLE, 0); // 100c star?
} else {
@@ 611,7 607,7 @@ void general_star_dance_handler(struct MarioState *m, s32 isInWater) {
case 80:
if (!(m->actionArg & 1)) {
- level_trigger_warp(m, WARP_OP_STAR_EXIT);
+ fade_into_special_warp(-2, 0); // reset game
} else {
enable_time_stop();
create_dialog_box_with_response(gLastCompletedStarNum == 7 ? DIALOG_013 : DIALOG_014);
@@ 957,11 953,7 @@ s32 act_warp_door_spawn(struct MarioState *m) {
m->usedObj->oInteractStatus = INT_STATUS_UNK19;
}
} else if (m->usedObj->oAction == 0) {
- if (gNeverEnteredCastle == TRUE && gCurrLevelNum == LEVEL_CASTLE) {
- set_mario_action(m, ACT_READING_AUTOMATIC_DIALOG, DIALOG_021);
- } else {
- set_mario_action(m, ACT_IDLE, 0);
- }
+ set_mario_action(m, ACT_IDLE, 0);
}
set_mario_animation(m, MARIO_ANIM_FIRST_PERSON);
stop_and_set_height_to_floor(m);
M src/game/sound_init.c => src/game/sound_init.c +2 -4
@@ 232,10 232,8 @@ void set_background_music(u16 a, u16 seqArgs, s16 fadeTimer) {
sound_reset(a);
}
- if (!gNeverEnteredCastle || seqArgs != SEQ_LEVEL_INSIDE_CASTLE) {
- play_music(SEQ_PLAYER_LEVEL, seqArgs, fadeTimer);
- sCurrentMusic = seqArgs;
- }
+ play_music(SEQ_PLAYER_LEVEL, seqArgs, fadeTimer);
+ sCurrentMusic = seqArgs;
}
}
M => +29 -9
@@ 265,6 265,7 @@ void print_act_selector_strings(void) {
#endif
unsigned char starNumbers[] = { TEXT_ZERO };
unsigned char thi_controls[] = { TEXT_THI_CONTROLS };
#ifdef VERSION_EU
u8 **levelNameTbl;
@@ 323,6 324,10 @@ void print_act_selector_strings(void) {
#endif
}
if (gCurrLevelNum == LEVEL_THI) {
print_generic_string(90, 210, thi_controls);
}
#ifdef VERSION_CN
lvlNameX = get_str_x_pos_from_center(160, currLevelName + 6, 16.0f);
print_generic_string(lvlNameX, 30, currLevelName + 6);
@@ 435,21 440,36 @@ s32 lvl_update_obj_and_load_act_button_actions(UNUSED s32 arg, UNUSED s32 unused
if (gPlayer3Controller->buttonPressed & (A_BUTTON | START_BUTTON | B_BUTTON | Z_TRIG))
#endif
{
s32 valid = gCurrLevelNum != LEVEL_THI;
if (!valid) {
if (gPlayer3Controller->buttonPressed & A_BUTTON) {
gCurrAreaIndex = 2;
valid = TRUE;
} else if (gPlayer3Controller->buttonPressed & B_BUTTON) {
gCurrAreaIndex = 1;
valid = TRUE;
} else {
play_sound(SOUND_MARIO_DOH, gGlobalSoundSource);
}
}
if (valid) {
#ifdef VERSION_JP
play_sound(SOUND_MENU_STAR_SOUND, gGlobalSoundSource);
play_sound(SOUND_MENU_STAR_SOUND, gGlobalSoundSource);
#else
play_sound(SOUND_MENU_STAR_SOUND_LETS_A_GO, gGlobalSoundSource);
play_sound(SOUND_MENU_STAR_SOUND_LETS_A_GO, gGlobalSoundSource);
#endif
#if ENABLE_RUMBLE
queue_rumble_data(60, 70);
func_sh_8024C89C(1);
queue_rumble_data(60, 70);
func_sh_8024C89C(1);
#endif
if (sInitSelectedActNum >= sSelectedActIndex + 1) {
sLoadedActNum = sSelectedActIndex + 1;
} else {
sLoadedActNum = sInitSelectedActNum;
if (sInitSelectedActNum >= sSelectedActIndex + 1) {
sLoadedActNum = sSelectedActIndex + 1;
} else {
sLoadedActNum = sInitSelectedActNum;
}
gDialogCourseActNum = sSelectedActIndex + 1;
}
gDialogCourseActNum = sSelectedActIndex + 1;
}
}