Some attempt at making the save buffer human readable, and renamed joypad.c funcs (#490)

* First pass

* Fix n64crc and add submodules properly

* Fix other versions

* Match func_8005B818 for v80 code.

* Formatting

* Fix build for JPN in last commit. Still broken in post v77 roms though.

* Fix builds for other versions.

* Match load_menu_text for other versions.

* Fix progress script

* update m2c

* Modify asset tools to remove the LD script code.

* Fix asm file macro inclue

* Get a working splat version for us_1.0 to build from the assets tool.

* update asm differ

* Update tools again

* Fix the makefile to only compile assets when requested. This will build all versions successfully, and compile assets for us_1.0 when requested.

* First round of suggestions

* Small cleanup

* Fix the gcc_generate.py path.

* Make entrypointThreadStack

* Small addition to the last commit

* "Fix" score script. Still need to fix the score values themselves, but at least it runs and is kind of close.

* Much closer matching score script

* Fix the splat version due to a breaking change in 0.33.0 for this repo for now.

* Fix the main function name

* Add gitignore entries

* Fix the padding problem to be handled by objcopy instead of a binary pad from splat.

* Update the README and change dependencies to setup.

* Have a hasm header that can be tweaked.

* Still calculate the checksum on no_verify builds or they won't work.

* Add support for boot_custom.bin

* Fix custom boot ld code.

* Fix score script

* Fix gcc building.

* Update m2c

* Fix warning, stop ignoring mod assets, and add some handy make rules.

* Uggh, serves me right for not testing.

* First stab at modifiable entrypoint.

* Fix typo, and small README change

* Stop n64crd from defaulting to returning 6105, so we can properly fail if the CIC checksum fails. Also, fix the

* fix a whole heaping spaghetti pile of warnings

* stack sizes and header depdendancies

* more warns

* fix bug oops

* t

* Update Makefile

Create extract_boot.py

* Update extract_custom_boot.py

* somehow this blew up again in the merge

* Update Makefile

* fix these

* Delete extract_boot.py

* simplification

* Sage is stoopid

* Update controller.c

* permissions

* Update get-binutils.sh

* automatically determine the CIC type at build time

* input renames

* ok pretty happy with the save macros now

* Update save_data.c

* b

* d

* ah

* rename this macro

* yeah

* Update Makefile

---------

Co-authored-by: Ryan Myers <ryan.p.myers@gmail.com>
This commit is contained in:
Fazana
2025-03-26 14:52:23 +00:00
committed by GitHub
co-authored by Ryan Myers
parent 3f48db7616
commit 50ae503e3b
21 changed files with 498 additions and 237 deletions
+11 -4
View File
@@ -9,8 +9,6 @@ $(eval $(call validate-option,NON_MATCHING,ido gcc))
# Define a custom boot file if desired to use something other than the vanilla one
BOOT_CUSTOM ?= mods/boot_custom.bin
BOOT_CIC ?= 6103
$(eval $(call validate-option,BOOT_CIC,6102 6103))
LIBULTRA_VERSION_DEFINE := -DBUILD_VERSION=4 -DBUILD_VERSION_STRING=\"2.0G\"
@@ -138,7 +136,6 @@ else
MATCHDEFS += ANTI_TAMPER=1
# Override compiler choice on matching builds.
COMPILER := ido
BOOT_CIC := 6103
C_STANDARD := -std=gnu90
endif
@@ -148,10 +145,20 @@ ASM_DEFINES = $(foreach d,$(DEFINES),$(if $(findstring =,$(d)),--defsym $(d),))
# If NON_MATCHING and using a custom boot file, (Right now just 6102).
# Define this so it will change the entrypoint in the header
BOOT_CIC :=
ifeq ($(NON_MATCHING),1)
ifeq ("$(wildcard $(BOOT_CUSTOM))","")
BOOT_CIC := 6103
BOOT_CIC := 6103
else
# Determine the CIC type automatically by checking the boot bin.
BOOT_CIC := $(shell $(PYTHON) $(TOOLS_DIR)/python/extract_custom_boot.py)
# The above returns 0 if it errors out, so course correct if it somehow happens.
ifeq ($(BOOT_CIC),0)
BOOT_CIC := 6103
endif
endif
else
BOOT_CIC := 6103
endif
ASM_DEFINES += --defsym BOOT_$(BOOT_CIC)=1
+233
View File
@@ -0,0 +1,233 @@
#ifndef _SAVE_LAYOUT_H_
#define _SAVE_LAYOUT_H_
#include "types.h"
#include "structs.h"
#include "macros.h"
#include "save_layout.h"
#include "src/save_data.h"
#include "PR/os_cont.h"
/**
* File contains the struct and macro definitions for the save layout for DKR.
*/
#define TT_COURSES \
unsigned courseAL : 1; \
unsigned courseFC : 1; \
unsigned courseJF : 1; \
unsigned courseHTV : 1; \
\
unsigned courseWB : 1; \
unsigned courseCI : 1; \
unsigned coursePL : 1; \
unsigned courseTC : 1; \
\
unsigned courseEP : 1; \
unsigned courseWC : 1; \
unsigned courseSV : 1; \
unsigned courseFV : 1; \
\
unsigned courseBC : 1; \
unsigned courseGV : 1; \
unsigned courseWP : 1; \
unsigned courseHW : 1; \
\
unsigned courseSA : 1; \
unsigned courseDMC : 1; \
unsigned courseSC : 1; \
unsigned courseSPA : 1;
#define SAVE_COURSES \
unsigned courseBluey1 : 2; \
unsigned courseFossilCanyon : 2; \
unsigned coursePirateLagoon : 2; \
unsigned courseAncientLake : 2; \
unsigned courseWalrusCove : 2; \
unsigned courseHotTopVolcano : 2; \
unsigned courseWhaleBay : 2; \
unsigned courseSnowballValley : 2; \
unsigned courseCrescentIsland : 2; \
unsigned courseFireMountain : 2; \
unsigned courseEverfrostPeak : 2; \
unsigned courseSpaceportAlpha : 2; \
unsigned courseSpacedustAlley : 2; \
unsigned courseGreenwoodVillage : 2; \
unsigned courseBoulderCanyon : 2; \
unsigned courseWindmillPlains : 2; \
unsigned courseSmokeyCastle : 2; \
unsigned courseDarkwaterBeach : 2; \
unsigned courseIciclePyramid : 2; \
unsigned courseFrostyVillage : 2; \
unsigned courseJungleFalls : 2; \
unsigned courseTreasureCaves : 2; \
unsigned courseHauntedWoods : 2; \
unsigned courseDarkmoonCaverns : 2; \
unsigned courseStarCity : 2; \
unsigned courseWizpig1 : 2; \
unsigned courseTricky1 : 2; \
unsigned courseBubbler1 : 2; \
unsigned courseSmokey1 : 2; \
unsigned courseTricky2 : 2; \
unsigned courseBluey2 : 2; \
unsigned courseBubbler2 : 2; \
unsigned courseSmokey2 : 2; \
unsigned courseWizpig2 : 2;
enum CourseRecordNames {
COURSE_FC_CAR,
COURSE_FC_HOVER,
COURSE_FC_PLANE,
COURSE_PL_HOVER,
COURSE_AL_CAR,
COURSE_AL_HOVER,
COURSE_AL_PLANE,
COURSE_WC_CAR,
COURSE_WC_HOVER,
COURSE_HTV_HOVER,
COURSE_HTV_PLANE,
COURSE_WB_HOVER,
COURSE_SV_CAR,
COURSE_SV_HOVER,
COURSE_CI_CAR,
COURSE_CI_HOVER,
COURSE_EP_CAR,
COURSE_EP_HOVER,
COURSE_EP_PLANE,
COURSE_SPA_CAR,
COURSE_SPA_HOVER,
COURSE_SPA_PLANE,
COURSE_SA_CAR,
COURSE_SA_HOVER,
COURSE_SA_PLANE,
COURSE_GV_CAR,
COURSE_GV_HOVER,
COURSE_BC_HOVER,
COURSE_WP_CAR,
COURSE_WP_HOVER,
COURSE_WP_PLANE,
COURSE_FV_CAR,
COURSE_FV_HOVER,
COURSE_FV_PLANE,
COURSE_JF_CAR,
COURSE_JF_HOVER,
COURSE_JF_PLANE,
COURSE_TC_CAR,
COURSE_TC_HOVER,
COURSE_TC_PLANE,
COURSE_HW_CAR,
COURSE_HW_HOVER,
COURSE_DMC_CAR,
COURSE_DMC_HOVER,
COURSE_SC_CAR,
COURSE_SC_HOVER,
COURSE_SC_PLANE,
COURSE_RECORD_TOTAL
};
typedef struct SaveConfig {
unsigned unlockedAdv2 : 1;
unsigned unlockedDrumstick : 1;
unsigned language : 2;
TT_COURSES
unsigned subtitles : 1;
unsigned unk0 : 31;
// unsigned checksum : 8; // For some reason, the struct becomes 12 bytes if this is there.
} SaveConfig ALIGNED8;
typedef struct SaveFile {
unsigned checksum : 16;
SAVE_COURSES
unsigned tajFlags : 6;
unsigned trophy1 : 2;
unsigned trophy2 : 2;
unsigned trophy3 : 2;
unsigned trophy4 : 2;
unsigned trophy5 : 2;
unsigned bossWizpig1 : 1;
unsigned bossTricky1 : 1;
unsigned bossBubbler1 : 1;
unsigned bossBluey1 : 1;
unsigned bossSmokey1 : 1;
unsigned bossWizpig2 : 1;
unsigned bossTricky2 : 1;
unsigned bossBubbler2 : 1;
unsigned bossBluey2 : 1;
unsigned bossSmokey2 : 1;
unsigned bossUnused1 : 1;
unsigned bossUnused2 : 1;
unsigned balloonsTotal : 7;
unsigned balloonsWorld1 : 7; // Dino Domain
unsigned balloonsWorld2 : 7; // Sherbet Island
unsigned balloonsWorld3 : 7; // Snowflake Mountain
unsigned balloonsWorld4 : 7; // Dragon Forest
unsigned balloonsWorld5 : 7; // Future Fun Land
unsigned amuletTT : 3;
unsigned amuletWizpig : 3;
unsigned flagsWorld0 : 16; // Hub, balloons
unsigned flagsWorld1 : 16; // Dino Domain
unsigned flagsWorld2 : 16; // Sherbet Island
unsigned flagsWorld3 : 16; // Snowflake Mountain
unsigned flagsWorld4 : 16; // Dragon Forest
unsigned flagsWorld5 : 16; // Future Fun Land
unsigned keyWorld0 : 1; // Hub world, unused
unsigned keyWorld1 : 1; // Dino Domain
unsigned keyWorld2 : 1; // Snowflake Mountain
unsigned keyWorld3 : 1; // Sherbet Island
unsigned keyWorld4 : 1; // Dragon Forest
unsigned keyWorld5 : 1; // Future Fun Land, unused
unsigned keyWorld6 : 1; // Unused
unsigned keyWorld7 : 1; // Unused
unsigned sceneLighthouse : 1;
unsigned sceneTTHelp : 1;
unsigned sceneAdv2 : 1;
unsigned sceneWorld1Boss1 : 1;
unsigned sceneWorld2Boss1 : 1;
unsigned sceneWorld3Boss1 : 1;
unsigned sceneWorld4Boss1 : 1;
unsigned sceneWorld5Boss1 : 1;
unsigned sceneWorld1Boss2 : 1;
unsigned sceneWorld2Boss2 : 1;
unsigned sceneWorld3Boss2 : 1;
unsigned sceneWorld4Boss2 : 1;
unsigned sceneWorld5Boss2 : 1;
unsigned sceneWizpigFace : 1;
unsigned sceneWorld1Key : 1;
unsigned sceneWorld2Key : 1;
unsigned sceneWorld3Key : 1;
unsigned sceneWorld4Key : 1;
unsigned sceneWorld5Key : 1; // Unused
unsigned name : 15;
} SaveFile ALIGNED8;
typedef struct CourseRecords {
u16 checksum;
u16 padding;
u32 courseTime[COURSE_RECORD_TOTAL];
} CourseRecords ALIGNED8;
typedef struct SaveBuffer {
SaveFile gameSave[NUMBER_OF_SAVE_FILES];
SaveConfig config;
CourseRecords fastLaps;
CourseRecords courseTimes;
} SaveBuffer ALIGNED8;
// Eeprom works in 8 byte blocks, so divide by 8 for those functions.
#define BLOCK_SIZE(x) (x / sizeof(u64))
#define SAVE_START (0)
#define CONFIG_START (SAVE_START + (sizeof(SaveFile) * NUMBER_OF_SAVE_FILES))
#define FASTEST_LAPS_START (CONFIG_START + sizeof(SaveConfig))
#define COURSE_TIMES_START (FASTEST_LAPS_START + sizeof(CourseRecords))
#define SAVE_SIZE (sizeof(SaveBuffer))
#endif
+2 -2
View File
@@ -178,8 +178,8 @@ void racer_sound_update(Object *obj, u32 buttonsPressed, u32 buttonsHeld, s32 up
if (gRacerSound != NULL) {
if (get_race_countdown()) {
if (gSoundRacerObj->playerIndex != PLAYER_COMPUTER) {
buttonsHeld = get_buttons_held_from_player(gSoundRacerObj->playerIndex);
buttonsPressed = get_buttons_pressed_from_player(gSoundRacerObj->playerIndex);
buttonsHeld = input_held(gSoundRacerObj->playerIndex);
buttonsPressed = input_pressed(gSoundRacerObj->playerIndex);
}
}
if (gRacerSound->unk0[0] == 0) {
+1 -1
View File
@@ -147,7 +147,7 @@ void init_level_globals(void) {
checksumCount += ((u8 *) (&viewport_rsp_set))[j];
}
if (checksumCount != gViewportFuncChecksum) {
disable_button_mask();
drm_disable_input();
}
#endif
}
+1 -1
View File
@@ -456,7 +456,7 @@ s32 dialogue_challenge_loop(void) {
index = func_800C38B4(index, &textBox);
}
} while (keepLooping);
playerButtons = get_buttons_pressed_from_player(PLAYER_ONE);
playerButtons = input_pressed(PLAYER_ONE);
if (D_8012A787 == 0) {
playerButtons = 0;
}
+3 -3
View File
@@ -414,7 +414,7 @@ void render_hud(Gfx **dList, MatrixS **mtx, Vertex **vertexList, Object *obj, s3
gCurrentHud = gPlayerHud[gHudCurrentViewport];
if (cutscene_id() != 10) {
if (gHUDNumPlayers == ONE_PLAYER) {
if (get_buttons_pressed_from_player(D_80126D10) & D_CBUTTONS && racer->raceFinished == FALSE &&
if (input_pressed(D_80126D10) & D_CBUTTONS && racer->raceFinished == FALSE &&
((gHudLevelHeader->race_type == RACETYPE_DEFAULT) ||
gHudLevelHeader->race_type == RACETYPE_HORSESHOE_GULCH) &&
gHudRaceStart) {
@@ -426,7 +426,7 @@ void render_hud(Gfx **dList, MatrixS **mtx, Vertex **vertexList, Object *obj, s3
gHudIndicatorTimer = 0;
}
}
} else if (get_buttons_pressed_from_player(D_80126D10) & D_CBUTTONS &&
} else if (input_pressed(D_80126D10) & D_CBUTTONS &&
racer->raceFinished == FALSE && !(gHudLevelHeader->race_type & RACETYPE_CHALLENGE) &&
gHudRaceStart) {
if (D_800E2794[gHUDNumPlayers][racer->playerIndex] < PLAYER_FOUR) {
@@ -436,7 +436,7 @@ void render_hud(Gfx **dList, MatrixS **mtx, Vertex **vertexList, Object *obj, s3
}
sound_play((SOUND_TING_HIGHEST - (D_800E2794[gHUDNumPlayers][racer->playerIndex] == 0)), NULL);
}
if (get_buttons_pressed_from_player(D_80126D10) & R_CBUTTONS && racer->raceFinished == FALSE &&
if (input_pressed(D_80126D10) & R_CBUTTONS && racer->raceFinished == FALSE &&
gHudRaceStart && gMinimapOpacity == 0) {
gHudToggleSettings[gHUDNumPlayers] = 1 - gHudToggleSettings[gHUDNumPlayers];
if (gHudToggleSettings[gHUDNumPlayers] == 0) {
+16 -16
View File
@@ -19,7 +19,7 @@ u8 sPlayerID[16];
* Return the serial interface message queue.
* Official name: joyMessageQ
*/
OSMesgQueue *get_si_mesg_queue(void) {
OSMesgQueue *si_mesg(void) {
return &sSIMesgQueue;
}
@@ -27,7 +27,7 @@ OSMesgQueue *get_si_mesg_queue(void) {
* Initialise the player controllers, and return the status when finished.
* Official name: joyInit
*/
s32 init_controllers(void) {
s32 input_init(void) {
UNUSED s32 *temp1;
u8 bitpattern;
UNUSED s32 *temp2;
@@ -36,7 +36,7 @@ s32 init_controllers(void) {
osSetEventMesg(OS_EVENT_SI, &sSIMesgQueue, gSIMesg);
osContInit(&sSIMesgQueue, &bitpattern, gControllerStatus);
osContStartReadData(&sSIMesgQueue);
initialise_player_ids();
input_assign_players();
sNoControllerPluggedIn = FALSE;
@@ -56,7 +56,7 @@ s32 init_controllers(void) {
* Also reads the latest inputs from the controllers, and sets their values.
* Official name: joyRead
*/
s32 handle_save_data_and_read_controller(s32 saveDataFlags, s32 updateRate) {
s32 input_update(s32 saveDataFlags, s32 updateRate) {
Settings **allSaves;
OSMesg unusedMsg;
Settings *settings;
@@ -125,7 +125,7 @@ s32 handle_save_data_and_read_controller(s32 saveDataFlags, s32 updateRate) {
* Set the first 4 player ID's to the controller numbers, so players can input in the menus after boot.
* Official name: joyResetMap
*/
void initialise_player_ids(void) {
void input_assign_players(void) {
s32 i;
for (i = 0; i < MAXCONTROLLERS; i++) {
sPlayerID[i] = i;
@@ -156,7 +156,7 @@ void charselect_assign_players(s8 *activePlayers) {
* Returns the id of the selected index.
* Official name: joyGetController
*/
u8 get_player_id(s32 player) {
u8 input_player_id(s32 player) {
return sPlayerID[player];
}
@@ -164,7 +164,7 @@ u8 get_player_id(s32 player) {
* Swaps the ID's of the first two indexes.
* This applies in 2 player adventure, so that player 2 can control the car in the overworld.
*/
void swap_player_1_and_2_ids(void) {
void input_swap_id(void) {
u8 tempID = sPlayerID[0];
sPlayerID[0] = sPlayerID[1];
sPlayerID[1] = tempID;
@@ -174,7 +174,7 @@ void swap_player_1_and_2_ids(void) {
* Returns the buttons that are currently pressed down on the controller.
* Official name: joyGetButtons
*/
u16 get_buttons_held_from_player(s32 player) {
u16 input_held(s32 player) {
return gControllerCurrData[sPlayerID[player]].button;
}
@@ -183,7 +183,7 @@ u16 get_buttons_held_from_player(s32 player) {
* NOTE: This was a u16, but we only got a match in menu_ghost_data_loop when it was a u32 for some reason
* Official name: joyGetPressed
*/
u32 get_buttons_pressed_from_player(s32 player) {
u32 input_pressed(s32 player) {
return gControllerButtonsPressed[sPlayerID[player]];
}
@@ -191,7 +191,7 @@ u32 get_buttons_pressed_from_player(s32 player) {
* Returns the buttons that are no longer pressed in that frame.
* Official name: joyGetReleased
*/
u16 get_buttons_released_from_player(s32 player) {
u16 input_released(s32 player) {
return gControllerButtonsReleased[sPlayerID[player]];
}
@@ -199,23 +199,23 @@ u16 get_buttons_released_from_player(s32 player) {
* Clamps the X joystick axis of the selected player to 70 and returns it.
* Official name: joyGetStickX
*/
s32 clamp_joystick_x_axis(s32 player) {
return clamp_joystick(gControllerCurrData[sPlayerID[player]].stick_x);
s32 input_clamp_stick_x(s32 player) {
return input_clamp_stick_mag(gControllerCurrData[sPlayerID[player]].stick_x);
}
/**
* Clamps the Y joystick axis of the selected player to 70 and returns it.
* Official name: joyGetStickY
*/
s32 clamp_joystick_y_axis(s32 player) {
return clamp_joystick(gControllerCurrData[sPlayerID[player]].stick_y);
s32 input_clamp_stick_y(s32 player) {
return input_clamp_stick_mag(gControllerCurrData[sPlayerID[player]].stick_y);
}
/**
* Keeps the joysticks axis reads no higher than 70 (of a possible 127 or -128)
* Will also pull the reading towards the centre.
*/
s8 clamp_joystick(s8 stickMag) {
s8 input_clamp_stick_mag(s8 stickMag) {
if (stickMag < JOYSTICK_DEADZONE && stickMag > -JOYSTICK_DEADZONE) {
return 0;
}
@@ -237,6 +237,6 @@ s8 clamp_joystick(s8 stickMag) {
* Used when anti-cheat/anti-tamper has failed in init_level_globals()
* Official Name: joySetSecurity
*/
void disable_button_mask(void) {
void drm_disable_input(void) {
gButtonMask = 0;
}
+13 -13
View File
@@ -12,19 +12,19 @@
#define JOYSTICK_DEADZONE 8
#define JOYSTICK_MAX_RANGE 70
OSMesgQueue *get_si_mesg_queue(void);
s32 init_controllers(void);
s32 handle_save_data_and_read_controller(s32 saveDataFlags, s32 updateRate);
void initialise_player_ids(void);
OSMesgQueue *si_mesg(void);
s32 input_init(void);
s32 input_update(s32 saveDataFlags, s32 updateRate);
void input_assign_players(void);
void charselect_assign_players(s8 *activePlayers);
u8 get_player_id(s32 player);
void swap_player_1_and_2_ids(void);
u16 get_buttons_held_from_player(s32 player);
u32 get_buttons_pressed_from_player(s32 player);
u16 get_buttons_released_from_player(s32 player);
s32 clamp_joystick_x_axis(s32 player);
s32 clamp_joystick_y_axis(s32 player);
s8 clamp_joystick(s8 stickMag);
void disable_button_mask(void);
u8 input_player_id(s32 player);
void input_swap_id(void);
u16 input_held(s32 player);
u32 input_pressed(s32 player);
u16 input_released(s32 player);
s32 input_clamp_stick_x(s32 player);
s32 input_clamp_stick_y(s32 player);
s8 input_clamp_stick_mag(s8 stickMag);
void drm_disable_input(void);
#endif
+41 -40
View File
@@ -29,6 +29,7 @@
#include "joypad.h"
#include "math_util.h"
#include "PRinternal/viint.h"
#include "save_layout.h"
/**
* @file Contains all the code used for every menu in the game.
@@ -2841,7 +2842,7 @@ s32 postrace_render(s32 updateRate) {
if (gPostraceState != POSTRACE_SLIDE_END) {
if (gIgnorePlayerInputTime == 0) {
for (i = 0; i < gNumberOfActivePlayers; i++) {
buttonsPressedAllPlayers |= get_buttons_pressed_from_player(i);
buttonsPressedAllPlayers |= input_pressed(i);
}
}
gMenuElementScaleTimer += updateRate;
@@ -3309,7 +3310,7 @@ void menu_title_screen_init(void) {
gSaveFileIndex = 0;
gTitleScreenCurrentOption = 0;
gNumberOfActivePlayers = 4;
initialise_player_ids();
input_assign_players();
music_play(SEQUENCE_NONE2);
sMenuMusicVolume = music_volume();
if (gResetTitleScale) {
@@ -3662,7 +3663,7 @@ s32 menu_options_loop(s32 updateRate) {
analogueY = 0;
if (gIgnorePlayerInputTime == 0 && gMenuDelay == 0) {
for (i = 0; i < MAXCONTROLLERS; i++) {
buttonsPressed |= get_buttons_pressed_from_player(i);
buttonsPressed |= input_pressed(i);
analogueX += gControllersXAxisDirection[i];
analogueY += gControllersYAxisDirection[i];
}
@@ -3930,8 +3931,8 @@ s32 menu_audio_options_loop(s32 updateRate) {
buttonsPressed = 0;
contXAxis = 0;
for (i = 0; i < 4; i++) {
buttonsPressed |= get_buttons_pressed_from_player(i);
contXAxis += clamp_joystick_x_axis(i);
buttonsPressed |= input_pressed(i);
contXAxis += input_clamp_stick_x(i);
contX += gControllersXAxisDirection[i];
contY += gControllersYAxisDirection[i];
}
@@ -5151,7 +5152,7 @@ s32 menu_save_options_loop(s32 updateRate) {
for (i = 0; i < 4; i++) {
xAxis += gControllersXAxisDirection[i];
yAxis += gControllersYAxisDirection[i];
buttonsPressed |= get_buttons_pressed_from_player(i);
buttonsPressed |= input_pressed(i);
}
}
if (gMenuStage & 8) {
@@ -5513,11 +5514,11 @@ void bootscreen_init_cpak(void) {
s32 i;
// Starting point
gBootPakData[0] = mempool_alloc_safe(SAVE_SIZE_MENU, COLOUR_TAG_WHITE);
gBootPakData[0] = mempool_alloc_safe(CPAK_HEAP_SIZE, COLOUR_TAG_WHITE);
// Fills in the table.
for (i = 1; i < ARRAY_COUNT(gBootPakData); i++) {
gBootPakData[i] = (char *) (((u32) gBootPakData[0]) + (i * (SAVE_SIZE_MENU / ARRAY_COUNT(gBootPakData))));
gBootPakData[i] = (char *) (((u32) gBootPakData[0]) + (i * (CPAK_HEAP_SIZE / ARRAY_COUNT(gBootPakData))));
}
// Only check cpak 0
@@ -5741,7 +5742,7 @@ s32 menu_controller_pak_loop(s32 updateRate) {
xStick = 0;
yStick = 0;
for (i = 0; i < MAXCONTROLLERS; i++) {
pressedButtons |= get_buttons_pressed_from_player(i);
pressedButtons |= input_pressed(i);
xStick += gControllersXAxisDirection[i];
yStick += gControllersYAxisDirection[i];
}
@@ -6138,7 +6139,7 @@ s32 menu_magic_codes_loop(s32 updateRate) {
yDir = 0;
if (gIgnorePlayerInputTime == 0 && gMenuDelay == 0) {
for (i = 0; i < MAXCONTROLLERS; i++) {
buttonsPressed |= get_buttons_pressed_from_player(i);
buttonsPressed |= input_pressed(i);
xDir += gControllersXAxisDirection[i];
yDir += gControllersYAxisDirection[i];
}
@@ -6505,7 +6506,7 @@ s32 menu_magic_codes_list_loop(s32 updateRate) {
yAxis = 0;
if (gIgnorePlayerInputTime == 0 && gMenuDelay == 0) {
for (i = 0; i < MAXCONTROLLERS; i++) {
buttonsPressed |= get_buttons_pressed_from_player(i);
buttonsPressed |= input_pressed(i);
xAxis += gControllersXAxisDirection[i];
yAxis += gControllersYAxisDirection[i];
}
@@ -6722,7 +6723,7 @@ void menu_character_select_init(void) {
u8 *channelVolumes;
breakTheLoop = FALSE;
initialise_player_ids();
input_assign_players();
if (is_drumstick_unlocked()) {
if (is_tt_unlocked()) {
gCurrCharacterSelectData = (CharacterSelectData(*)[10]) & gCharacterSelectBytesComplete;
@@ -7235,7 +7236,7 @@ s32 menu_caution_loop(s32 updateRate) {
if (gMenuDelay) {
gMenuDelay += updateRate;
} else if (gIgnorePlayerInputTime <= 0 &&
(get_buttons_pressed_from_player(PLAYER_ONE) & (A_BUTTON | B_BUTTON | START_BUTTON))) {
(input_pressed(PLAYER_ONE) & (A_BUTTON | B_BUTTON | START_BUTTON))) {
sound_play(SOUND_SELECT2, NULL);
gMenuDelay = 1;
transition_begin(&sMenuTransitionFadeIn);
@@ -7409,11 +7410,11 @@ s32 menu_game_select_loop(s32 updateRate) {
} else {
gameselect_render(updateRate);
if ((gMenuDelay == 0) && (gOpacityDecayTimer == 0)) {
playerInputs = get_buttons_pressed_from_player(PLAYER_ONE);
playerInputs = input_pressed(PLAYER_ONE);
playerYDir = gControllersYAxisDirection[0];
playerInputs = playerInputs;
if (gNumberOfActivePlayers == 2) {
playerInputs |= get_buttons_pressed_from_player(1);
playerInputs |= input_pressed(1);
playerYDir += gControllersYAxisDirection[1];
}
if (playerInputs & (A_BUTTON | START_BUTTON)) {
@@ -7699,11 +7700,11 @@ s32 fileselect_input_root(UNUSED s32 updateRate) {
s32 prevOption;
u32 buttonsPressedPlayer2;
buttonsPressed = get_buttons_pressed_from_player(PLAYER_ONE);
buttonsPressed = input_pressed(PLAYER_ONE);
xAxisDirection = gControllersXAxisDirection[PLAYER_ONE];
yAxisDirection = gControllersYAxisDirection[PLAYER_ONE];
if (gNumberOfActivePlayers == 2) {
buttonsPressedPlayer2 = get_buttons_pressed_from_player(PLAYER_TWO);
buttonsPressedPlayer2 = input_pressed(PLAYER_TWO);
buttonsPressed |= buttonsPressedPlayer2;
xAxisDirection += gControllersXAxisDirection[PLAYER_TWO];
yAxisDirection += gControllersYAxisDirection[PLAYER_TWO];
@@ -7793,10 +7794,10 @@ void fileselect_input_copy(UNUSED s32 updateRate) {
u32 buttonsPressedPlayerTwo;
settings = get_settings();
buttonsPressed = get_buttons_pressed_from_player(PLAYER_ONE);
buttonsPressed = input_pressed(PLAYER_ONE);
xAxisDirection = gControllersXAxisDirection[PLAYER_ONE];
if (gNumberOfActivePlayers == 2) {
buttonsPressedPlayerTwo = get_buttons_pressed_from_player(PLAYER_TWO);
buttonsPressedPlayerTwo = input_pressed(PLAYER_TWO);
buttonsPressed |= buttonsPressedPlayerTwo;
xAxisDirection += gControllersXAxisDirection[PLAYER_TWO];
}
@@ -7886,11 +7887,11 @@ void fileselect_input_erase(UNUSED s32 updateRate) {
s32 controllerXAxisDirection;
s32 prevOption;
buttonsPressed = get_buttons_pressed_from_player(PLAYER_ONE);
buttonsPressed = input_pressed(PLAYER_ONE);
controllerXAxisDirection = gControllersXAxisDirection[0];
if (gNumberOfActivePlayers == 2) {
buttonsPressed |= get_buttons_pressed_from_player(PLAYER_TWO);
buttonsPressed |= input_pressed(PLAYER_TWO);
controllerXAxisDirection += gControllersXAxisDirection[1];
}
@@ -8004,7 +8005,7 @@ s32 menu_file_select_loop(s32 updateRate) {
} else if (gFileErase) {
fileselect_input_erase(updateRate);
} else if (gFileNew) {
buttonsPressed = get_buttons_pressed_from_player(PLAYER_ONE);
buttonsPressed = input_pressed(PLAYER_ONE);
if (buttonsPressed & B_BUTTON && gNameEntryLength == 0) {
menu_unload_bigfont();
gFileNew = FALSE;
@@ -8145,7 +8146,7 @@ void menu_input(void) {
gMenuStickY[i] = 0;
}
for (i = 0; i < MAXCONTROLLERS; i++) {
buttonsHeld[i] = get_buttons_held_from_player(i);
buttonsHeld[i] = input_held(i);
gMenuStickX[i] = gControllersXAxisDirection[i];
gMenuStickY[i] = gControllersYAxisDirection[i];
if (i < gNumberOfActivePlayers) {
@@ -10093,7 +10094,7 @@ void menu_pause_init(void) {
gLastPlayerWhoPaused = -1;
for (i = 0; (get_active_player_count() > i && gLastPlayerWhoPaused < 0); i++) {
if (get_buttons_held_from_player(i) & START_BUTTON) {
if (input_held(i) & START_BUTTON) {
gLastPlayerWhoPaused = i;
}
}
@@ -10176,11 +10177,11 @@ void pausemenu_render(UNUSED s32 updateRate) {
halfX = x >> 1;
set_current_dialogue_box_coords(7, SCREEN_WIDTH_HALF - halfX, y - halfTemp, SCREEN_WIDTH_HALF + halfX,
halfTemp + y);
colour = &gPlayerPauseBgColour[get_player_id(gLastPlayerWhoPaused)];
colour = &gPlayerPauseBgColour[input_player_id(gLastPlayerWhoPaused)];
set_current_dialogue_background_colour(7, colour->r, colour->g, colour->b, colour->a);
set_dialogue_font(7, ASSET_FONTS_FUNFONT);
set_current_text_background_colour(7, 128, 128, 255, 0);
colour = &gPlayerPauseOptionsTextColour[get_player_id(gLastPlayerWhoPaused)];
colour = &gPlayerPauseOptionsTextColour[input_player_id(gLastPlayerWhoPaused)];
set_current_text_colour(7, colour->r, colour->g, colour->b, colour->a, 255);
alpha = gOptionBlinkTimer * 8;
if (alpha > 255) {
@@ -10244,7 +10245,7 @@ s32 menu_pause_loop(UNUSED Gfx **dl, s32 updateRate) {
buttonsPressed = 0;
if (gIgnorePlayerInputTime == 0) {
buttonsPressed = get_buttons_pressed_from_player(gLastPlayerWhoPaused);
buttonsPressed = input_pressed(gLastPlayerWhoPaused);
}
if (gMenuDelay == 0) {
@@ -10825,7 +10826,7 @@ s32 menu_postrace(Gfx **dList, MatrixS **matrices, Vertex **vertices, s32 update
buttonsPressed = 0;
if (gIgnorePlayerInputTime == FALSE && gPostRace.unk0_s32 < 0) {
for (i = 0; i < numPlayers; i++) {
buttonsPressed |= get_buttons_pressed_from_player(i);
buttonsPressed |= input_pressed(i);
}
}
switch (gMenuStage) {
@@ -11715,8 +11716,8 @@ s32 filename_enter(s32 updateRate) {
s32 i;
s32 joytickXAxis;
buttonsPressed = get_buttons_pressed_from_player(PLAYER_ONE);
joytickXAxis = clamp_joystick_x_axis(PLAYER_ONE);
buttonsPressed = input_pressed(PLAYER_ONE);
joytickXAxis = input_clamp_stick_x(PLAYER_ONE);
if (joytickXAxis > -35 && (joytickXAxis < 35)) {
joytickXAxis = 0;
}
@@ -12270,7 +12271,7 @@ s32 menu_trophy_race_rankings_loop(s32 updateRate) {
buttonsPressed = 0;
prevOption = gMenuOption;
for (i = 0; i < gNumberOfActivePlayers; i++) {
buttonsPressed |= get_buttons_pressed_from_player(i);
buttonsPressed |= input_pressed(i);
if (gControllersYAxisDirection[i] < 0) {
gMenuOption++;
}
@@ -12701,7 +12702,7 @@ s32 menu_ghost_data_loop(s32 updateRate) {
yStick = 0;
if (!gIgnorePlayerInputTime && gMenuDelay == 0) {
for (i = 0; i < MAXCONTROLLERS; i++) {
pressedButtons |= get_buttons_pressed_from_player(i);
pressedButtons |= input_pressed(i);
xStick += gControllersXAxisDirection[i];
yStick += gControllersYAxisDirection[i];
}
@@ -12848,7 +12849,7 @@ s32 menu_cinematic_loop(UNUSED s32 updateRate) {
buttonsPressed = 0;
if (gIgnorePlayerInputTime == 0) {
for (i = 0; i < gNumberOfActivePlayers; i++) {
buttonsPressed |= get_buttons_pressed_from_player(i);
buttonsPressed |= input_pressed(i);
}
}
if (func_800214C4() != 0) {
@@ -13222,7 +13223,7 @@ s32 menu_credits_loop(s32 updateRate) {
buttonsPressedAllPlayers = 0;
if (gIgnorePlayerInputTime == 0 && gMenuDelay == 0) {
for (nextIndex = 0; nextIndex < MAXCONTROLLERS; nextIndex++) {
buttonsPressedAllPlayers |= get_buttons_pressed_from_player(nextIndex);
buttonsPressedAllPlayers |= input_pressed(nextIndex);
}
}
@@ -13387,8 +13388,8 @@ void update_controller_sticks(void) {
s32 XClamp, YClamp;
s32 i;
for (i = 0; i < 4; i++) {
XClamp = clamp_joystick_x_axis(i);
YClamp = clamp_joystick_y_axis(i);
XClamp = input_clamp_stick_x(i);
YClamp = input_clamp_stick_y(i);
gControllersXAxisDirection[i] = 0;
gControllersYAxisDirection[i] = 0;
@@ -14048,7 +14049,7 @@ s32 taj_menu_loop(void) {
set_dialogue_font(1, ASSET_FONTS_FUNFONT);
}
dialogueResult = 0;
buttonsPressed = get_buttons_pressed_from_player(PLAYER_ONE);
buttonsPressed = input_pressed(PLAYER_ONE);
sDialogueOptionMax = 0;
switch (sCurrentMenuID) {
@@ -14226,7 +14227,7 @@ s32 dialogue_race_defeat(void) {
set_current_dialogue_box_coords(1, 24, 16, 184, 135);
set_dialogue_font(1, ASSET_FONTS_FUNFONT);
state = 0;
playerInput = get_buttons_pressed_from_player(PLAYER_ONE);
playerInput = input_pressed(PLAYER_ONE);
sDialogueOptionMax = 0;
gNextTajChallengeMenu = 0;
render_dialogue_text(1, POS_CENTRED, 6, gMenuText[ASSET_MENU_TEXT_LOSETOTAJ_0], 1,
@@ -14293,7 +14294,7 @@ s32 tt_menu_loop(void) {
}
set_dialogue_font(1, ASSET_FONTS_FUNFONT);
currentOption = 0;
buttonsPressed = get_buttons_pressed_from_player(PLAYER_ONE) << 0;
buttonsPressed = input_pressed(PLAYER_ONE) << 0;
sDialogueOptionMax = 0;
gDialogueOptionYOffset = 32;
switch (sCurrentMenuID) {
@@ -14630,7 +14631,7 @@ s32 trophy_race_cabinet_menu_loop(void) {
set_current_dialogue_box_coords(1, 24, 16, 184, SCREEN_HEIGHT_HALF);
set_dialogue_font(1, ASSET_FONTS_FUNFONT);
currentOption = 0;
buttonsPressed = get_buttons_pressed_from_player(PLAYER_ONE);
buttonsPressed = input_pressed(PLAYER_ONE);
render_dialogue_text(1, POS_CENTRED, 6, gMenuText[ASSET_MENU_TEXT_TROPHYRACE], 1, HORZ_ALIGN_CENTER); // TROPHY RACE
if (gControllersYAxisDirection[0] < 0) {
gDialogueSubmenu++;
+5 -5
View File
@@ -876,7 +876,7 @@ void obj_loop_rocketsignpost(Object *obj, UNUSED s32 updateRate) {
if (interactObj->distance < 200) {
if (playerObj == interactObj->obj) {
// Detect if the player honks or slams into the signpost.
if ((get_buttons_pressed_from_player(PLAYER_ONE) & Z_TRIG) || playerObj == obj->unk5C->unk100) {
if ((input_pressed(PLAYER_ONE) & Z_TRIG) || playerObj == obj->unk5C->unk100) {
begin_lighthouse_rocket_cutscene();
}
}
@@ -1248,7 +1248,7 @@ void obj_loop_stopwatchman(Object *obj, s32 updateRate) {
obj->properties.npc.timer = 1;
}
}
index = get_buttons_pressed_from_player(PLAYER_ONE);
index = input_pressed(PLAYER_ONE);
if (obj->properties.npc.action == TT_MODE_ROAM && distance < 300.0 && obj->properties.npc.timer == 0) {
if (angleDiff > -0x2000 && angleDiff < 0x2000) {
if ((obj->interactObj->flags & INTERACT_FLAGS_PUSHING && racerObj == obj->interactObj->obj) ||
@@ -1832,7 +1832,7 @@ void obj_init_animation(Object *obj, LevelObjectEntry_Animation *entry, s32 arg2
path_enable();
obj->properties.animatedObj.behaviourID = entry->actorIndex;
obj->properties.animatedObj.action = arg2;
if (arg2 != 0 && (get_buttons_pressed_from_player(PLAYER_ONE) & R_CBUTTONS)) {
if (arg2 != 0 && (input_pressed(PLAYER_ONE) & R_CBUTTONS)) {
obj->properties.animatedObj.action = 2;
}
if (((cutscene_id() == entry->channel) || (entry->channel == 20)) && (obj->unk64 == NULL) && (entry->order == 0) &&
@@ -2221,7 +2221,7 @@ void obj_loop_infopoint(Object *obj, UNUSED s32 updateRate) {
if (playerObj->segment.header->behaviorId == 1) {
Object_InfoPoint *playerObj64 = &playerObj->unk64->info_point;
player = playerObj64->unk0;
if ((player != PLAYER_COMPUTER) && (get_buttons_pressed_from_player(player) & Z_TRIG)) {
if ((player != PLAYER_COMPUTER) && (input_pressed(player) & Z_TRIG)) {
set_current_text(obj->properties.infoPoint.radius & 0xFF);
}
}
@@ -2586,7 +2586,7 @@ void obj_loop_parkwarden(Object *obj, s32 updateRate) {
zPosDiff = (racerObj->segment.trans.z_position - (racer->oz1 * 50.0f)) - obj->segment.trans.z_position;
distance = sqrtf((xPosDiff * xPosDiff) + (zPosDiff * zPosDiff));
}
buttonsPressed = get_buttons_pressed_from_player(PLAYER_ONE);
buttonsPressed = input_pressed(PLAYER_ONE);
var_a2 = FALSE;
if ((obj->properties.npc.action == NULL) && (distance < 300.0) &&
(((obj->interactObj->flags & INTERACT_FLAGS_PUSHING) && (racerObj == obj->interactObj->obj)) ||
+2 -2
View File
@@ -2404,7 +2404,7 @@ void func_80010994(s32 updateRate) {
if ((gEventCountdown == 0x50) && (gCutsceneID == 0)) {
sp54 = 0;
for (i = 0; i < MAXCONTROLLERS; i++) {
tempVal = get_buttons_pressed_from_player(i);
tempVal = input_pressed(i);
sp54 |= tempVal;
}
@@ -4550,7 +4550,7 @@ void race_transition_adventure(s32 updateRate) {
hud_visibility(1);
}
}
i = get_buttons_pressed_from_player(PLAYER_ONE) & A_BUTTON;
i = input_pressed(PLAYER_ONE) & A_BUTTON;
settings = get_settings();
if (!(settings->cutsceneFlags & 0x40000)) {
i = 0;
+5 -5
View File
@@ -2329,15 +2329,15 @@ void update_player_racer(Object *obj, s32 updateRate) {
tempVar = 1 - tempVar;
}
// Cap the joystick tilt and write the button inputs to the current buffer.
gCurrentStickX = clamp_joystick_x_axis(tempVar);
gCurrentStickX = input_clamp_stick_x(tempVar);
// Flip the steering for adventure 2.
if (get_filtered_cheats() & CHEAT_MIRRORED_TRACKS) {
gCurrentStickX = -gCurrentStickX;
}
gCurrentStickY = clamp_joystick_y_axis(tempVar);
gCurrentRacerInput = get_buttons_held_from_player(tempVar);
gCurrentButtonsPressed = get_buttons_pressed_from_player(tempVar);
gCurrentButtonsReleased = get_buttons_released_from_player(tempVar);
gCurrentStickY = input_clamp_stick_y(tempVar);
gCurrentRacerInput = input_held(tempVar);
gCurrentButtonsPressed = input_pressed(tempVar);
gCurrentButtonsReleased = input_released(tempVar);
} else {
racer_enter_door(tempRacer, updateRate);
}
+53 -49
View File
@@ -12,6 +12,7 @@
#include "joypad.h"
#include "PRinternal/viint.h"
#include "PR/os_motor.h"
#include "save_layout.h"
/************ .data ************/
@@ -69,7 +70,7 @@ u8 input_get_id(s32 controllerIndex) {
if ((controllerIndex == 0 || controllerIndex == 1) && func_8000E158()) {
controllerIndex = 1 - controllerIndex;
}
return get_player_id(controllerIndex);
return input_player_id(controllerIndex);
}
#if VERSION >= VERSION_79
@@ -833,28 +834,28 @@ s32 read_save_file(s32 saveFileNum, Settings *settings) {
s32 block;
s32 ret;
if (osEepromProbe(get_si_mesg_queue()) == 0) {
if (osEepromProbe(si_mesg()) == 0) {
stubbed_printf("WARNING : No Eprom\n");
return -1;
}
switch (saveFileNum) {
case 0:
startingAddress = 0;
startingAddress = BLOCK_SIZE(SAVE_START + (sizeof(SaveFile) * 0));
break;
case 1:
startingAddress = 5;
startingAddress = BLOCK_SIZE(SAVE_START + (sizeof(SaveFile) * 1));
break;
case 2:
startingAddress = 10;
startingAddress = BLOCK_SIZE(SAVE_START + (sizeof(SaveFile) * 2));
break;
default:
startingAddress = 10;
startingAddress = BLOCK_SIZE(SAVE_START + (sizeof(SaveFile) * 2));
break;
}
blocks = 5;
saveData = mempool_alloc_safe(blocks * sizeof(u64), COLOUR_TAG_WHITE);
for (block = 0, address = startingAddress; block < blocks; block++, address++) {
osEepromRead(get_si_mesg_queue(), address, (u8 *) &saveData[block]);
osEepromRead(si_mesg(), address, (u8 *) &saveData[block]);
}
populate_settings_from_save_data(settings, (u8 *) saveData);
mempool_free(saveData);
@@ -876,7 +877,7 @@ void erase_save_file(s32 saveFileNum, Settings *settings) {
s32 address;
s32 i;
if (osEepromProbe(get_si_mesg_queue()) != 0) {
if (osEepromProbe(si_mesg()) != 0) {
get_number_of_levels_and_worlds(&levelCount, &worldCount);
for (i = 0; i < levelCount; i++) {
settings->courseFlagsPtr[i] = 0;
@@ -891,16 +892,16 @@ void erase_save_file(s32 saveFileNum, Settings *settings) {
settings->newGame = TRUE;
switch (saveFileNum) {
case 0:
startingAddress = 0;
startingAddress = BLOCK_SIZE(SAVE_START + (sizeof(SaveFile) * 0));
break;
case 1:
startingAddress = 5;
startingAddress = BLOCK_SIZE(SAVE_START + (sizeof(SaveFile) * 1));
break;
case 2:
startingAddress = 10;
startingAddress = BLOCK_SIZE(SAVE_START + (sizeof(SaveFile) * 2));
break;
default:
startingAddress = 10;
startingAddress = BLOCK_SIZE(SAVE_START + (sizeof(SaveFile) * 2));
break;
}
blockSize = 5;
@@ -914,7 +915,7 @@ void erase_save_file(s32 saveFileNum, Settings *settings) {
if (!is_reset_pressed()) {
for (i = 0, address = startingAddress; i < blockSize; i++, address++) {
osEepromWrite(get_si_mesg_queue(), address, (u8 *) &alloc[i]);
osEepromWrite(si_mesg(), address, (u8 *) &alloc[i]);
}
}
mempool_free(alloc);
@@ -937,23 +938,23 @@ s32 write_save_data(s32 saveFileNum, Settings *settings) {
s32 blocks;
s32 i;
if (osEepromProbe(get_si_mesg_queue()) == 0) {
if (osEepromProbe(si_mesg()) == 0) {
stubbed_printf("WARNING : No Eprom\n");
return -1;
}
switch (saveFileNum) {
case 0:
startingAddress = 0x00 / sizeof(u64);
startingAddress = BLOCK_SIZE(SAVE_START + (sizeof(SaveFile) * 0));
break;
case 1:
startingAddress = 0x28 / sizeof(u64);
startingAddress = BLOCK_SIZE(SAVE_START + (sizeof(SaveFile) * 1));
break;
case 2:
startingAddress = 0x50 / sizeof(u64);
startingAddress = BLOCK_SIZE(SAVE_START + (sizeof(SaveFile) * 2));
break;
default:
startingAddress = 0x50 / sizeof(u64);
startingAddress = BLOCK_SIZE(SAVE_START + (sizeof(SaveFile) * 2));
break;
}
@@ -963,7 +964,7 @@ s32 write_save_data(s32 saveFileNum, Settings *settings) {
if (!is_reset_pressed()) {
for (i = 0, address = startingAddress; i < blocks; i++, address++) {
osEepromWrite(get_si_mesg_queue(), address, (u8 *) &alloc[i]);
osEepromWrite(si_mesg(), address, (u8 *) &alloc[i]);
}
}
@@ -983,25 +984,26 @@ s32 read_eeprom_data(Settings *settings, u8 flags) {
u64 *alloc;
s32 i;
if (osEepromProbe(get_si_mesg_queue()) == 0) {
if (osEepromProbe(si_mesg()) == 0) {
stubbed_printf("WARNING : No Eprom\n");
return -1;
}
alloc = mempool_alloc_safe(SAVE_SIZE, COLOUR_TAG_WHITE);
alloc = mempool_alloc_safe(COURSE_TIMES_START + sizeof(CourseRecords), COLOUR_TAG_WHITE);
if (flags & SAVE_DATA_FLAG_READ_FLAP_TIMES) {
s32 blocks = EEP_FLAP_SIZE;
s32 blocks = BLOCK_SIZE(sizeof(CourseRecords));
for (i = 0; i < blocks; i++) {
osEepromRead(get_si_mesg_queue(), i + EEP_FLAP_OFFSET, (u8 *) &alloc[i]);
osEepromRead(si_mesg(), BLOCK_SIZE(FASTEST_LAPS_START) + i, (u8 *) &alloc[i]);
}
func_80073588(settings, (u8 *) alloc, SAVE_DATA_FLAG_READ_FLAP_TIMES);
}
if (flags & SAVE_DATA_FLAG_READ_COURSE_TIMES) {
s32 blocks = EEP_COURSE_RECORD_SIZE;
s32 blocks = BLOCK_SIZE(sizeof(CourseRecords));
for (i = 0; i < blocks; i++) {
osEepromRead(get_si_mesg_queue(), i + EEP_COURSE_TIME_OFFSET, (u8 *) (&alloc[EEP_FLAP_SIZE] + i));
osEepromRead(si_mesg(), BLOCK_SIZE(COURSE_TIMES_START) + i,
(u8 *) (&alloc[sizeof(CourseRecords) / sizeof(u64)] + i));
}
func_80073588(settings, (u8 *) alloc, SAVE_DATA_FLAG_READ_COURSE_TIMES);
}
@@ -1022,30 +1024,31 @@ s32 write_eeprom_data(Settings *settings, u8 flags) {
u64 *alloc;
s32 i;
if (osEepromProbe(get_si_mesg_queue()) == 0) {
if (osEepromProbe(si_mesg()) == 0) {
stubbed_printf("WARNING : No Eprom\n");
return -1;
}
alloc = mempool_alloc_safe(SAVE_SIZE, COLOUR_TAG_WHITE);
alloc = mempool_alloc_safe(COURSE_TIMES_START + sizeof(CourseRecords), COLOUR_TAG_WHITE);
func_800738A4(settings, (u8 *) alloc);
if (flags & SAVE_DATA_FLAG_READ_FLAP_TIMES) {
s32 size = EEP_FLAP_SIZE;
s32 blocks = BLOCK_SIZE(sizeof(CourseRecords));
if (1) {} // Fake Match
if (!is_reset_pressed()) {
for (i = 0; i != size; i++) {
osEepromWrite(get_si_mesg_queue(), i + EEP_FLAP_OFFSET, (u8 *) &alloc[i]);
if (is_reset_pressed() == FALSE) {
for (i = 0; i != blocks; i++) {
osEepromWrite(si_mesg(), BLOCK_SIZE(FASTEST_LAPS_START) + i, (u8 *) &alloc[i]);
}
}
}
if (flags & SAVE_DATA_FLAG_READ_COURSE_TIMES) {
s32 size = EEP_COURSE_RECORD_SIZE;
if (!is_reset_pressed()) {
for (i = 0; i != size; i++) {
osEepromWrite(get_si_mesg_queue(), i + EEP_COURSE_TIME_OFFSET, (u8 *) (&alloc[EEP_FLAP_SIZE] + i));
s32 blocks = BLOCK_SIZE(sizeof(CourseRecords));
if (is_reset_pressed() == FALSE) {
for (i = 0; i != blocks; i++) {
osEepromWrite(si_mesg(), BLOCK_SIZE(COURSE_TIMES_START) + i,
(u8 *) (&alloc[sizeof(CourseRecords) / sizeof(u64)] + i));
}
}
}
@@ -1075,24 +1078,25 @@ s32 calculate_eeprom_settings_checksum(u64 eepromSettings) {
* Address (0xF * sizeof(u64)) = 0x78 - 0x80 of the actual save data file
*/
s32 read_eeprom_settings(u64 *eepromSettings) {
s32 temp;
s32 sp20;
s32 checksum;
s32 expected;
if (osEepromProbe(get_si_mesg_queue()) == 0) {
if (osEepromProbe(si_mesg()) == 0) {
stubbed_printf("WARNING : No Eprom\n");
return -1;
}
osEepromRead(get_si_mesg_queue(), 0xF, (u8 *) eepromSettings);
sp20 = calculate_eeprom_settings_checksum(*eepromSettings);
temp = *eepromSettings >> 56;
if (sp20 != temp) {
osEepromRead(si_mesg(), BLOCK_SIZE(CONFIG_START), (u8 *) eepromSettings);
expected = calculate_eeprom_settings_checksum(*eepromSettings);
checksum = *eepromSettings >> 56;
if (expected != checksum) {
// bit 24 = Unknown
// bit 25 = Seems to be a flag for whether subtitles are enabled or not.
#if REGION == REGION_JP
*eepromSettings = 0x300000C;
// JP additionally forces the language setting to Japanese.
*eepromSettings = (1 << 2) | (1 << 3) | (1 << 24) | (1 << 25);
#else
*eepromSettings = 0x3000000; // Sets bits 24 and 25 high
*eepromSettings = (1 << 24) | (1 << 25); // Sets bits 24 and 25 high
#endif
*eepromSettings <<= 8;
*eepromSettings >>= 8;
@@ -1108,15 +1112,15 @@ s32 read_eeprom_settings(u64 *eepromSettings) {
* Address (0xF * sizeof(u64)) = 0x78 - 0x80 of the actual save data file
*/
s32 write_eeprom_settings(u64 *eepromSettings) {
if (osEepromProbe(get_si_mesg_queue()) == 0) {
if (osEepromProbe(si_mesg()) == 0) {
stubbed_printf("WARNING : No Eprom\n");
return -1;
}
*eepromSettings <<= 8;
*eepromSettings >>= 8;
*eepromSettings |= (s64) (calculate_eeprom_settings_checksum(*eepromSettings)) << 56;
if (is_reset_pressed() == 0) {
osEepromWrite(get_si_mesg_queue(), 0xF, (u8 *) eepromSettings);
*eepromSettings |= (u64) (calculate_eeprom_settings_checksum(*eepromSettings)) << 56;
if (is_reset_pressed() == FALSE) {
osEepromWrite(si_mesg(), BLOCK_SIZE(CONFIG_START), (u8 *) eepromSettings);
}
return 1;
}
@@ -1593,7 +1597,7 @@ void init_controller_paks(void) {
u8 pakPattern;
s8 maxControllers;
sControllerMesgQueue = get_si_mesg_queue();
sControllerMesgQueue = si_mesg();
sRumbleTable = (s16 *) get_misc_asset(ASSET_MISC_RUMBLE_DATA);
gRumbleIdle = gRumbleActive = 0xF;
gRumbleOn = TRUE;
+2 -10
View File
@@ -26,20 +26,12 @@
#define MAX_CPAK_FILES 16
// Most of this is temporary really until we figure out where the size comes from
#define EEP_FLAP_OFFSET (0x80 / sizeof(u64))
#define EEP_COURSE_TIME_OFFSET (0x140 / sizeof(u64))
#define EEP_FLAP_SIZE (0xC0 / sizeof(u64))
#define EEP_COURSE_RECORD_SIZE (0xC0 / sizeof(u64))
#if REGION == REGION_JP
// The Save size constant seems to change depending on the file being compiled in JP?
#define SAVE_SIZE_MENU 0x400
#define SAVE_SIZE 0x200
#define CPAK_HEAP_SIZE 0x400
#define SAVE_FILE_BYTES 48
#else
#define SAVE_SIZE_MENU 0x200
#define SAVE_SIZE 0x200
#define CPAK_HEAP_SIZE 0x200
#define SAVE_FILE_BYTES 24
#endif
+7 -7
View File
@@ -152,7 +152,7 @@ UNUSED s32 D_80123568[3]; // BSS Padding
*/
void thread3_main(UNUSED void *unused) {
init_game();
gSaveDataFlags = handle_save_data_and_read_controller(gSaveDataFlags, 0);
gSaveDataFlags = input_update(gSaveDataFlags, 0);
sBootDelayTimer = 0;
gGameMode = GAMEMODE_INTRO;
while (1) {
@@ -213,7 +213,7 @@ void init_game(void) {
gfxtask_init(&gMainSched);
audio_init(&gMainSched);
func_80008040(); // Should be very similar to allocate_object_model_pools
sControllerStatus = init_controllers();
sControllerStatus = input_init();
tex_init_textures();
allocate_object_model_pools();
allocate_object_pools();
@@ -280,7 +280,7 @@ void main_game_loop(void) {
rsp_init(&gCurrDisplayList);
rdp_init(&gCurrDisplayList);
bgdraw_render(&gCurrDisplayList, (Matrix *) &gGameCurrMatrix, TRUE);
gSaveDataFlags = handle_save_data_and_read_controller(gSaveDataFlags, sLogicUpdateRate);
gSaveDataFlags = input_update(gSaveDataFlags, sLogicUpdateRate);
if (get_lockup_status()) {
render_epc_lock_up_display();
gGameMode = GAMEMODE_LOCKUP;
@@ -433,8 +433,8 @@ void mode_game(s32 updateRate) {
// Get input data for all 4 players.
for (i = 0; i < get_active_player_count(); i++) {
buttonHeldInputs |= get_buttons_held_from_player(i);
buttonPressedInputs |= get_buttons_pressed_from_player(i);
buttonHeldInputs |= input_held(i);
buttonPressedInputs |= input_pressed(i);
}
#ifdef ANTI_TAMPER
// Spam the start button, making the game unplayable because it's constantly paused.
@@ -1545,7 +1545,7 @@ void swap_lead_player(void) {
u8 *first_racer_data;
u8 *second_racer_data;
swap_player_1_and_2_ids();
input_swap_id();
func_8000E194();
first_racer_data = (u8 *) (gSettingsPtr->racers);
@@ -1574,7 +1574,7 @@ void mode_intro(void) {
s32 buttonInputs = 0;
for (i = 0; i < MAXCONTROLLERS; i++) {
buttonInputs |= get_buttons_held_from_player(i);
buttonInputs |= input_held(i);
}
if (buttonInputs & START_BUTTON) {
gShowControllerPakMenu = TRUE;
+38 -14
View File
@@ -17,9 +17,15 @@ def N64GetCIC(data: bytes) -> int:
0xACC8580A: 6106,
}.get(crc, 0)
# Extract a boot bin from the given rom, provided the setup is correct
def boot_extract(input_file, output_file="boot_custom.bin"):
mods_missing = True
cictype = 6103
if not (os.path.isfile(input_file)):
print(input_file + " cannot be found. Check the spelling in your input.")
return
if not (input_file.endswith(".z64")):
print("ROM file must be .z64. Use https://hack64.net/tools/swapper.php to convert.")
return
@@ -28,7 +34,7 @@ def boot_extract(input_file, output_file="boot_custom.bin"):
f.seek(0x40)
data = f.read(0xFC0)
if os.path.isdir('mods'):
if os.path.isdir("mods"):
print("Mods folder detected, outputting there.")
output_file = "./mods/boot_custom.bin"
mods_missing = False
@@ -41,18 +47,18 @@ def boot_extract(input_file, output_file="boot_custom.bin"):
cictype = 6102
else:
print("CIC: " + str(cictype))
if os.path.isfile("Makefile"):
print("Makefile detected, modifying CIC type.")
with open("Makefile", 'r') as f:
lines = f.readlines()
with open("Makefile", 'w') as f:
for line in lines:
if line.startswith("BOOT_CIC ?="):
f.write("BOOT_CIC ?= " + str(cictype) + "\n")
else:
f.write(line)
if os.path.isfile("./build/asm/header.s.o"):
os.remove("./build/asm/header.s.o")
#if os.path.isfile("Makefile"):
# print("Makefile detected, modifying CIC type.")
# with open("Makefile", 'r') as f:
# lines = f.readlines()
# with open("Makefile", 'w') as f:
# for line in lines:
# if line.startswith("BOOT_CIC ?="):
# f.write("BOOT_CIC ?= " + str(cictype) + "\n")
# else:
# f.write(line)
if os.path.isfile("./build/asm/header.s.o"):
os.remove("./build/asm/header.s.o")
with open(output_file, "wb") as f:
@@ -63,4 +69,22 @@ def boot_extract(input_file, output_file="boot_custom.bin"):
else:
print("Finished!")
boot_extract(sys.argv[1])
# Read the current custom boot bin and return its CIC
def boot_write():
if not os.path.isdir("mods"):
print("0")
return
if not os.path.isfile("mods/boot_custom.bin"):
print("0")
return
with open("./mods/boot_custom.bin", "rb") as f:
data = f.read(0xFC0)
cictype = N64GetCIC(data)
if (cictype == 0):
cictype = 6102
print(cictype)
if (len(sys.argv) > 1):
boot_extract(sys.argv[1])
else:
boot_write()
+13 -13
View File
@@ -937,20 +937,20 @@ debug_print_fixed_matrix_values = 0x8006A034;
debug_print_float_matrix_values = 0x8006A10C;
// controller.c .text
get_si_mesg_queue = 0x8006A1D0;
init_controllers = 0x8006A1DC;
handle_save_data_and_read_controller = 0x8006A294;
initialise_player_ids = 0x8006A504;
si_mesg = 0x8006A1D0;
input_init = 0x8006A1DC;
input_update = 0x8006A294;
input_assign_players = 0x8006A504;
charselect_assign_players = 0x8006A528;
get_player_id = 0x8006A5C8;
swap_player_1_and_2_ids = 0x8006A5DC;
get_buttons_held_from_player = 0x8006A5F8;
get_buttons_pressed_from_player = 0x8006A624;
get_buttons_released_from_player = 0x8006A648;
clamp_joystick_x_axis = 0x8006A66C;
clamp_joystick_y_axis = 0x8006A6B0;
clamp_joystick = 0x8006A6F4;
disable_button_mask = 0x8006A770;
input_player_id = 0x8006A5C8;
input_swap_id = 0x8006A5DC;
input_held = 0x8006A5F8;
input_pressed = 0x8006A624;
input_released = 0x8006A648;
input_clamp_stick_x = 0x8006A66C;
input_clamp_stick_y = 0x8006A6B0;
input_clamp_stick_mag = 0x8006A6F4;
drm_disable_input = 0x8006A770;
// game.c .text
init_level_globals = 0x8006A780;
+13 -13
View File
@@ -935,20 +935,20 @@ debug_print_fixed_matrix_values = 0x80069F64;
debug_print_float_matrix_values = 0x8006A03C;
// controller.c .text
get_si_mesg_queue = 0x8006A100;
init_controllers = 0x8006A10C;
handle_save_data_and_read_controller = 0x8006A1C4;
initialise_player_ids = 0x8006A434;
si_mesg = 0x8006A100;
input_init = 0x8006A10C;
input_update = 0x8006A1C4;
input_assign_players = 0x8006A434;
charselect_assign_players = 0x8006A458;
get_player_id = 0x8006A4F8;
swap_player_1_and_2_ids = 0x8006A50C;
get_buttons_held_from_player = 0x8006A528;
get_buttons_pressed_from_player = 0x8006A554;
get_buttons_released_from_player = 0x8006A578;
clamp_joystick_x_axis = 0x8006A59C;
clamp_joystick_y_axis = 0x8006A5E0;
clamp_joystick = 0x8006A624;
disable_button_mask = 0x8006A6A0;
input_player_id = 0x8006A4F8;
input_swap_id = 0x8006A50C;
input_held = 0x8006A528;
input_pressed = 0x8006A554;
input_released = 0x8006A578;
input_clamp_stick_x = 0x8006A59C;
input_clamp_stick_y = 0x8006A5E0;
input_clamp_stick_mag = 0x8006A624;
drm_disable_input = 0x8006A6A0;
// game.c .text
init_level_globals = 0x8006A6B0;
+13 -13
View File
@@ -879,20 +879,20 @@ set_camera_shake_by_distance = 0x8006A054;
set_camera_shake = 0x8006A168;
debug_print_fixed_matrix_values = 0x8006A1A4;
debug_print_float_matrix_values = 0x8006A27C;
get_si_mesg_queue = 0x8006A340;
init_controllers = 0x8006A34C;
handle_save_data_and_read_controller = 0x8006A404;
initialise_player_ids = 0x8006A674;
si_mesg = 0x8006A340;
input_init = 0x8006A34C;
input_update = 0x8006A404;
input_assign_players = 0x8006A674;
charselect_assign_players = 0x8006A698;
get_player_id = 0x8006A738;
swap_player_1_and_2_ids = 0x8006A74C;
get_buttons_held_from_player = 0x8006A768;
get_buttons_pressed_from_player = 0x8006A794;
get_buttons_released_from_player = 0x8006A7B8;
clamp_joystick_x_axis = 0x8006A7DC;
clamp_joystick_y_axis = 0x8006A820;
clamp_joystick = 0x8006A864;
disable_button_mask = 0x8006A8E0;
input_player_id = 0x8006A738;
input_swap_id = 0x8006A74C;
input_held = 0x8006A768;
input_pressed = 0x8006A794;
input_released = 0x8006A7B8;
input_clamp_stick_x = 0x8006A7DC;
input_clamp_stick_y = 0x8006A820;
input_clamp_stick_mag = 0x8006A864;
drm_disable_input = 0x8006A8E0;
init_level_globals = 0x8006A8F0;
func_8006ABB4 = 0x8006ADF4;
search_level_properties_forwards = 0x8006AE40;
+13 -13
View File
@@ -935,20 +935,20 @@ debug_print_fixed_matrix_values = 0x80069F64;
debug_print_float_matrix_values = 0x8006A03C;
// controller.c .text
get_si_mesg_queue = 0x8006A100;
init_controllers = 0x8006A10C;
handle_save_data_and_read_controller = 0x8006A1C4;
initialise_player_ids = 0x8006A434;
si_mesg = 0x8006A100;
input_init = 0x8006A10C;
input_update = 0x8006A1C4;
input_assign_players = 0x8006A434;
charselect_assign_players = 0x8006A458;
get_player_id = 0x8006A4F8;
swap_player_1_and_2_ids = 0x8006A50C;
get_buttons_held_from_player = 0x8006A528;
get_buttons_pressed_from_player = 0x8006A554;
get_buttons_released_from_player = 0x8006A578;
clamp_joystick_x_axis = 0x8006A59C;
clamp_joystick_y_axis = 0x8006A5E0;
clamp_joystick = 0x8006A624;
disable_button_mask = 0x8006A6A0;
input_player_id = 0x8006A4F8;
input_swap_id = 0x8006A50C;
input_held = 0x8006A528;
input_pressed = 0x8006A554;
input_released = 0x8006A578;
input_clamp_stick_x = 0x8006A59C;
input_clamp_stick_y = 0x8006A5E0;
input_clamp_stick_mag = 0x8006A624;
drm_disable_input = 0x8006A6A0;
// game.c .text
init_level_globals = 0x8006A6B0;

Some files were not shown because too many files have changed in this diff Show More