Merge branch 'master' into puppycamera2

This commit is contained in:
Fazana
2021-08-15 11:18:21 +01:00
9 changed files with 5249 additions and 69 deletions

View File

@@ -510,7 +510,7 @@ ifeq ($(COMPARE),1)
@$(SHA1SUM) --quiet -c $(TARGET).sha1 && $(PRINT) "$(TARGET): $(GREEN)OK$(NO_COL)\n" || ($(PRINT) "$(YELLOW)Building the ROM file has succeeded, but does not match the original ROM.\nThis is expected, and not an error, if you are making modifications.\nTo silence this message, use 'make COMPARE=0.' $(NO_COL)\n" && false)
else
@$(SHA1SUM) $(ROM)
@$(PRINT) "${GREEN}Build succeeded.\n"
@$(PRINT) "${GREEN}Build succeeded.$(NO_COL)\n"
endif
clean:
@@ -765,7 +765,7 @@ $(BUILD_DIR)/rsp/%.bin $(BUILD_DIR)/rsp/%_data.bin: rsp/%.s
$(V)$(RSPASM) -sym $@.sym $(RSPASMFLAGS) -strequ CODE_FILE $(BUILD_DIR)/rsp/$*.bin -strequ DATA_FILE $(BUILD_DIR)/rsp/$*_data.bin $<
# Run linker script through the C preprocessor
$(BUILD_DIR)/$(LD_SCRIPT): $(LD_SCRIPT)
$(BUILD_DIR)/$(LD_SCRIPT): $(LD_SCRIPT) $(BUILD_DIR)/goddard.txt
$(call print,Preprocessing linker script:,$<,$@)
$(V)$(CPP) $(CPPFLAGS) -DBUILD_DIR=$(BUILD_DIR) -MMD -MP -MT $@ -MF $@.d -o $@ $<
@@ -779,10 +779,23 @@ $(BUILD_DIR)/libz.a: $(LIBZ_O_FILES)
@$(PRINT) "$(GREEN)Linking libz: $(BLUE)$@ $(NO_COL)\n"
$(V)$(AR) rcs -o $@ $(LIBZ_O_FILES)
# SS2: Goddard rules to get size
$(BUILD_DIR)/goddard.ld: goddard.ld $(BUILD_DIR)/libgoddard.a
$(call print,Preprocessing linker script:,$<,$@)
$(V)$(CPP) $(CPPFLAGS) -DBUILD_DIR=$(BUILD_DIR) -MMD -MP -MT $@ -MF $@.d -o $@ $<
$(BUILD_DIR)/goddard.elf: $(BUILD_DIR)/goddard.ld
@$(PRINT) "$(GREEN)Linking ELF file: $(BLUE)$@ $(NO_COL)\n"
$(V)$(LD) --gc-sections -L $(BUILD_DIR) -T undefined_syms.txt -T $< -Map $(BUILD_DIR)/goddard.map --no-check-sections -o $@ -T tools/hardcoded_syms.txt $(wildcard $(BUILD_DIR)/src/menu/*.o) -L$(LIBS_DIR) -l$(ULTRALIB) -Llib -lgoddard -u sprintf -u osMapTLB -Llib/gcclib/$(LIBGCCDIR) -lgcc
$(BUILD_DIR)/goddard.txt: $(BUILD_DIR)/goddard.elf
$(call print,Getting Goddard size...)
$(V)python3 tools/getGoddardSize.py $(BUILD_DIR)/goddard.map
# Link SM64 ELF file
$(ELF): $(O_FILES) $(YAY0_OBJ_FILES) $(SEG_FILES) $(BUILD_DIR)/$(LD_SCRIPT) undefined_syms.txt $(BUILD_DIR)/libz.a $(BUILD_DIR)/libgoddard.a
@$(PRINT) "$(GREEN)Linking ELF file: $(BLUE)$@ $(NO_COL)\n"
$(V)$(LD) --gc-sections -L $(BUILD_DIR) -T undefined_syms.txt -T $(BUILD_DIR)/$(LD_SCRIPT) -Map $(BUILD_DIR)/sm64.$(VERSION).map --no-check-sections $(addprefix -R ,$(SEG_FILES)) -o $@ $(O_FILES) -L$(LIBS_DIR) -l$(ULTRALIB) -Llib $(LINK_LIBRARIES) -u sprintf -u osMapTLB -Llib/gcclib/$(LIBGCCDIR) -lgcc
$(V)$(LD) --gc-sections -L $(BUILD_DIR) -T undefined_syms.txt -T $(BUILD_DIR)/$(LD_SCRIPT) -T goddard.txt -Map $(BUILD_DIR)/sm64.$(VERSION).map --no-check-sections $(addprefix -R ,$(SEG_FILES)) -o $@ $(O_FILES) -L$(LIBS_DIR) -l$(ULTRALIB) -Llib $(LINK_LIBRARIES) -u sprintf -u osMapTLB -Llib/gcclib/$(LIBGCCDIR) -lgcc
# Build ROM
$(ROM): $(ELF)

View File

@@ -1,9 +1,9 @@
diff --git a/include/text_strings.h.in b/include/text_strings.h.in
index d266058..4b12426 100644
index 8ccc6b1..d2bb516 100644
--- a/include/text_strings.h.in
+++ b/include/text_strings.h.in
@@ -34,6 +34,12 @@
#define TEXT_HUD_WIDE_INFO2 _("STRETCH THE IMAGE TO 16:9")
@@ -33,6 +33,12 @@
#define TEXT_HUD_WIDE_INFO _("PLEASE CONFIGURE YOUR DISPLAY OR YOUR EMULATOR TO\nSTRETCH THE IMAGE TO 16:9")
#endif
+#define TEXT_CAM_INFO_SLOWEST _("CAM SPEED: SLOWEST")
@@ -302,13 +302,13 @@ index dfcf16a..e56f8c0 100644
}
}
diff --git a/src/game/game_init.c b/src/game/game_init.c
index 6cfa8f5..63158e1 100644
index 8693507..fb8729d 100644
--- a/src/game/game_init.c
+++ b/src/game/game_init.c
@@ -46,6 +46,11 @@ OSContPad gControllerPads[4];
u8 gControllerBits;
u8 gIsConsole;
u8 gBorderHeight;
@@ -49,6 +49,11 @@ u8 gBorderHeight;
#ifdef CUSTOM_DEBUG
u8 gCustomDebugMode;
#endif
+u8 gCameraSpeed = 2;
+u8 gWaterCamOverride;
+u8 gFlyingCamOverride;
@@ -317,7 +317,7 @@ index 6cfa8f5..63158e1 100644
#ifdef EEP
s8 gEepromProbe;
#endif
@@ -715,6 +720,7 @@ void thread5_game_loop(UNUSED void *arg) {
@@ -725,6 +730,7 @@ void thread5_game_loop(UNUSED void *arg) {
play_music(SEQ_PLAYER_SFX, SEQUENCE_ARGS(0, SEQ_SOUND_PLAYER), 0);
set_sound_mode(save_file_get_sound_mode());
@@ -326,7 +326,7 @@ index 6cfa8f5..63158e1 100644
gWidescreen = save_file_get_widescreen_mode();
#endif
diff --git a/src/game/game_init.h b/src/game/game_init.h
index 87386ce..47e9724 100644
index f3f650c..fdf20b6 100644
--- a/src/game/game_init.h
+++ b/src/game/game_init.h
@@ -45,6 +45,10 @@ extern u8 gIsConsole;
@@ -338,14 +338,14 @@ index 87386ce..47e9724 100644
+extern u8 gFlyingCamOverride;
+extern u8 gKeepCliffCam;
extern u8 gBorderHeight;
#ifdef EEP
extern s8 gEepromProbe;
#ifdef CUSTOM_DEBUG
extern u8 gCustomDebugMode;
diff --git a/src/game/ingame_menu.c b/src/game/ingame_menu.c
index 9cd458a..ac2d18c 100644
index 158154c..9ffefec 100644
--- a/src/game/ingame_menu.c
+++ b/src/game/ingame_menu.c
@@ -39,6 +39,12 @@ u8 textWideInfo[] = { TEXT_HUD_WIDE_INFO };
u8 textWideInfo2[] = { TEXT_HUD_WIDE_INFO2 };
@@ -38,6 +38,12 @@ u8 textPressL[] = { TEXT_HUD_PRESS_L };
u8 textWideInfo[] = { TEXT_HUD_WIDE_INFO };
#endif
+u8 textCamInfoSlowest[] = { TEXT_CAM_INFO_SLOWEST };
@@ -357,7 +357,7 @@ index 9cd458a..ac2d18c 100644
extern u8 gLastCompletedCourseNum;
extern u8 gLastCompletedStarNum;
@@ -1350,6 +1356,45 @@ void reset_red_coins_collected(void) {
@@ -1434,6 +1440,45 @@ void reset_red_coins_collected(void) {
gRedCoinsCollected = 0;
}
@@ -403,19 +403,23 @@ index 9cd458a..ac2d18c 100644
void change_dialog_camera_angle(void) {
if (cam_select_alt_mode(0) == CAM_SELECTION_MARIO) {
gDialogCameraAngleIndex = CAM_SELECTION_MARIO;
@@ -1779,6 +1824,7 @@ s16 render_pause_courses_and_castle(void) {
@@ -1866,6 +1911,11 @@ s16 render_pause_courses_and_castle(void) {
}
#ifdef WIDE
render_widescreen_setting();
+ render_camera_speed_setting();
if (gPlayer1Controller->buttonPressed & L_TRIG){
gWidescreen ^= 1;
save_file_set_widescreen_mode(gWidescreen);
+ if (gPlayer1Controller->buttonPressed & L_TRIG){
+ gWidescreen ^= 1;
+ save_file_set_widescreen_mode(gWidescreen);
+ }
#endif
if (gDialogTextAlpha < 250) {
gDialogTextAlpha += 25;
diff --git a/src/game/mario.c b/src/game/mario.c
index b381afa..7cb9549 100644
index c0b5f76..b6da9d4 100644
--- a/src/game/mario.c
+++ b/src/game/mario.c
@@ -1443,32 +1443,39 @@ void update_mario_inputs(struct MarioState *m) {
@@ -1460,32 +1460,39 @@ void update_mario_inputs(struct MarioState *m) {
void set_submerged_cam_preset_and_spawn_bubbles(struct MarioState *m) {
f32 heightBelowWater;
s16 camPreset;
@@ -550,7 +554,7 @@ index b27d869..7fbf045 100644
if (save_file_get_flags() & SAVE_FLAG_CAP_ON_GROUND) {
switch (gSaveBuffer.files[gCurrSaveFileNum - 1][0].capLevel) {
diff --git a/src/game/save_file.h b/src/game/save_file.h
index 00fc042..7062ead 100644
index 3ac0c4d..d46a7e1 100644
--- a/src/game/save_file.h
+++ b/src/game/save_file.h
@@ -62,6 +62,7 @@ struct MainMenuSaveData
@@ -560,7 +564,7 @@ index 00fc042..7062ead 100644
+ u8 cameraSpeedSetting: 3;
#ifdef VERSION_EU
u16 language;
u8 language: 2;
@@ -167,6 +168,8 @@ u16 save_file_get_sound_mode(void);
u8 save_file_get_widescreen_mode(void);
void save_file_set_widescreen_mode(u8 mode);

46
goddard.ld Normal file
View File

@@ -0,0 +1,46 @@
OUTPUT_ARCH (mips)
#define BEGIN_SEG(name, addr) \
_##name##SegmentStart = ADDR(.name); \
_##name##SegmentRomStart = __romPos; \
.name addr : AT(__romPos)
#define END_SEG(name) \
_##name##SegmentEnd = ADDR(.name) + SIZEOF(.name); \
_##name##SegmentRomEnd = __romPos + SIZEOF(.name); \
__romPos += SIZEOF(.name);
#define BEGIN_NOLOAD(name) \
_##name##SegmentBssStart = ADDR(.name.noload); \
.name.noload (NOLOAD) :
#define END_NOLOAD(name) \
_##name##SegmentBssEnd = ADDR(.name.noload) + SIZEOF(.name.noload); \
_##name##SegmentBssSize = SIZEOF(.name.noload);
SECTIONS {
__romPos = 0;
SEG_GODDARD = 0x80345670;
BEGIN_SEG(goddard, SEG_GODDARD)
{
#define LOAD
#include "goddard.ld.inc"
#undef LOAD
. = ALIGN(16);
}
END_SEG(goddard)
BEGIN_NOLOAD(goddard) {
#define NOLOAD
#include "goddard.ld.inc"
#undef NOLOAD
. = ALIGN(16);
}
END_NOLOAD(goddard)
GODDARD_SIZE = SIZEOF(.goddard) + SIZEOF(.goddard.noload);
/DISCARD/ :
{
*(*);
}
}

41
goddard.ld.inc Normal file
View File

@@ -0,0 +1,41 @@
#ifdef LOAD
KEEP(BUILD_DIR/src/menu*.o(.text));
KEEP(BUILD_DIR/src/menu*.o(.data*));
KEEP(BUILD_DIR/src/menu*.o(.rodata*));
#ifdef KEEP_MARIO_HEAD
KEEP(BUILD_DIR/libgoddard.a:*.o(.text));
KEEP(BUILD_DIR/libgoddard.a:gd_main.o(.data*));
KEEP(BUILD_DIR/libgoddard.a:draw_objects.o(.data*));
KEEP(BUILD_DIR/libgoddard.a:objects.o(.data*));
KEEP(BUILD_DIR/libgoddard.a:particles.o(.data*));
KEEP(BUILD_DIR/libgoddard.a:dynlist_proc.o(.data*));
KEEP(BUILD_DIR/libgoddard.a:debug_utils.o(.data*));
KEEP(BUILD_DIR/libgoddard.a:joints.o(.data*));
KEEP(BUILD_DIR/libgoddard.a:shape_helper.o(.data*));
KEEP(BUILD_DIR/libgoddard.a:renderer.o(.data*));
KEEP(BUILD_DIR/libgoddard.a:gd_main.o(.rodata*));
KEEP(BUILD_DIR/libgoddard.a:gd_memory.o(.rodata*));
KEEP(BUILD_DIR/libgoddard.a:draw_objects.o(.rodata*));
KEEP(BUILD_DIR/libgoddard.a:objects.o(.rodata*));
KEEP(BUILD_DIR/libgoddard.a:skin_movement.o(.rodata*));
KEEP(BUILD_DIR/libgoddard.a:particles.o(.rodata*));
KEEP(BUILD_DIR/libgoddard.a:dynlist_proc.o(.rodata*));
KEEP(BUILD_DIR/libgoddard.a:old_menu.o(.rodata*));
KEEP(BUILD_DIR/libgoddard.a:debug_utils.o(.rodata*));
KEEP(BUILD_DIR/libgoddard.a:joints.o(.rodata*));
KEEP(BUILD_DIR/libgoddard.a:skin.o(.rodata*));
KEEP(BUILD_DIR/libgoddard.a:gd_math.o(.rodata*));
KEEP(BUILD_DIR/libgoddard.a:shape_helper.o(.rodata*));
KEEP(BUILD_DIR/libgoddard.a:renderer.o(.rodata*));
#endif
#endif
#ifdef NOLOAD
KEEP(BUILD_DIR/src/menu*.o(.bss*));
#ifdef KEEP_MARIO_HEAD
KEEP(BUILD_DIR/libgoddard.a:*.o(.bss*));
#endif
#endif

View File

@@ -27,8 +27,6 @@
*/
#define SEG_POOL_START _framebuffersSegmentBssEnd // 0x0165000 in size
#define SEG_GODDARD SEG_POOL_START + 0x113000
#define POOL_SIZE RAM_END - SEG_POOL_START
#endif // SEGMENTS_H

50
sm64.ld
View File

@@ -190,6 +190,7 @@ SECTIONS
lib/PR/hvqm/hvqm2sp1.o(.rodata*);
}
END_SEG(main)
ASSERT((_mainSegmentRomEnd <= 0x101000), "Error: Please shrink your main segment to under 1MB.")
BEGIN_NOLOAD(main)
{
BUILD_DIR/src/game*.o(.*bss*);
@@ -215,8 +216,6 @@ SECTIONS
}
END_NOLOAD(main)
/*ASSERT((. <= SEG_ENGINE), "Error: main segment extended into engine.")*/
. = _mainSegmentBssEnd;
BEGIN_SEG(engine, .)
@@ -236,8 +235,6 @@ SECTIONS
}
END_NOLOAD(engine)
/*ASSERT((. <= SEG_FRAMEBUFFERS), "Error: engine segment extended into framebuffers.")*/
. = _engineSegmentBssEnd;
BEGIN_NOLOAD(framebuffers)
{
@@ -301,47 +298,20 @@ SECTIONS
END_SEG(behavior)
/* 0x8016F000 21D7D0-255EC0 [386F0] */
BEGIN_SEG(goddard, SEG_GODDARD)
BEGIN_SEG(goddard, RAM_END - GODDARD_SIZE)
{
BUILD_DIR/src/menu*.o(.text);
BUILD_DIR/src/menu*.o(.data*);
BUILD_DIR/src/menu*.o(.rodata*);
#ifdef KEEP_MARIO_HEAD
BUILD_DIR/libgoddard.a:*.o(.text);
/* goddard subsystem data */
BUILD_DIR/libgoddard.a:gd_main.o(.data*);
BUILD_DIR/libgoddard.a:draw_objects.o(.data*);
BUILD_DIR/libgoddard.a:objects.o(.data*);
BUILD_DIR/libgoddard.a:particles.o(.data*);
BUILD_DIR/libgoddard.a:dynlist_proc.o(.data*);
BUILD_DIR/libgoddard.a:debug_utils.o(.data*);
BUILD_DIR/libgoddard.a:joints.o(.data*);
BUILD_DIR/libgoddard.a:shape_helper.o(.data*);
BUILD_DIR/libgoddard.a:renderer.o(.data*);
/* goddard subsystem rodata */
BUILD_DIR/libgoddard.a:gd_main.o(.rodata*);
BUILD_DIR/libgoddard.a:gd_memory.o(.rodata*);
BUILD_DIR/libgoddard.a:draw_objects.o(.rodata*);
BUILD_DIR/libgoddard.a:objects.o(.rodata*);
BUILD_DIR/libgoddard.a:skin_movement.o(.rodata*);
BUILD_DIR/libgoddard.a:particles.o(.rodata*);
BUILD_DIR/libgoddard.a:dynlist_proc.o(.rodata*);
BUILD_DIR/libgoddard.a:old_menu.o(.rodata*);
BUILD_DIR/libgoddard.a:debug_utils.o(.rodata*);
BUILD_DIR/libgoddard.a:joints.o(.rodata*);
BUILD_DIR/libgoddard.a:skin.o(.rodata*);
BUILD_DIR/libgoddard.a:gd_math.o(.rodata*);
BUILD_DIR/libgoddard.a:shape_helper.o(.rodata*);
BUILD_DIR/libgoddard.a:renderer.o(.rodata*);
#endif
#define LOAD
#include "goddard.ld.inc"
#undef LOAD
. = ALIGN(16);
}
END_SEG(goddard)
BEGIN_NOLOAD(goddard)
{
BUILD_DIR/src/menu*.o(.bss*);
#ifdef KEEP_MARIO_HEAD
BUILD_DIR/libgoddard.a:*.o(.bss*);
#endif
#define NOLOAD
#include "goddard.ld.inc"
#undef NOLOAD
. = ALIGN(16);
}
END_NOLOAD(goddard)

View File

@@ -416,6 +416,11 @@ void select_gfx_pool(void) {
* - Selects which framebuffer will be rendered and displayed to next time.
*/
void display_and_vsync(void) {
if (IO_READ(DPC_PIPEBUSY_REG) && gIsConsole != 1)
{
gIsConsole = 1;
gBorderHeight = BORDER_HEIGHT_CONSOLE;
}
profiler_log_thread5_time(BEFORE_DISPLAY_LISTS);
osRecvMesg(&gGfxVblankQueue, &gMainReceivedMesg, OS_MESG_BLOCK);
if (gGoddardVblankCallback != NULL) {

12
tools/getGoddardSize.py Normal file
View File

@@ -0,0 +1,12 @@
import sys, os
with open(sys.argv[1]) as f:
for line in f:
if "GODDARD_SIZE" in line:
tokens=line.split()
with open("build/us/goddard.txt", "w+") as f:
sz = int(tokens[0], 16)
sz += 16
sz &= 0xFFFFFFF0
f.write("GODDARD_SIZE = 0x%X;" % sz)

5091
tools/hardcoded_syms.txt Normal file

File diff suppressed because it is too large Load Diff