1
0
Fork 0
mirror of https://github.com/zeldaret/oot.git synced 2025-07-13 11:24:40 +00:00

Merge branch 'master' into doc_pause_menu

This commit is contained in:
Dragorn421 2022-11-16 21:23:31 +01:00
commit f752add633
No known key found for this signature in database
GPG key ID: 32B53D2D16FC4118
81 changed files with 1912 additions and 1689 deletions

View file

@ -31,8 +31,8 @@ u32 gUpgradeMasks[UPG_MAX] = {
0x00000E00, // UPG_SCALE
0x00003000, // UPG_WALLET
0x0001C000, // UPG_BULLET_BAG
0x000E0000, // UPG_STICKS
0x00700000, // UPG_NUTS
0x000E0000, // UPG_DEKU_STICKS
0x00700000, // UPG_DEKU_NUTS
};
u32 gUpgradeNegMasks[UPG_MAX] = {
~0x00000007, // UPG_QUIVER
@ -41,8 +41,8 @@ u32 gUpgradeNegMasks[UPG_MAX] = {
~0x00000E00, // UPG_SCALE
~0x00003000, // UPG_WALLET
~0x0001C000, // UPG_BULLET_BAG
~0x000E0000, // UPG_STICKS
~0x00700000, // UPG_NUTS
~0x000E0000, // UPG_DEKU_STICKS
~0x00700000, // UPG_DEKU_NUTS
};
u8 gEquipShifts[EQUIP_TYPE_MAX] = {
@ -59,8 +59,8 @@ u8 gUpgradeShifts[UPG_MAX] = {
9, // UPG_SCALE
12, // UPG_WALLET
14, // UPG_BULLET_BAG
17, // UPG_STICKS
20, // UPG_NUTS
17, // UPG_DEKU_STICKS
20, // UPG_DEKU_NUTS
};
u16 gUpgradeCapacities[UPG_MAX][4] = {
@ -70,8 +70,8 @@ u16 gUpgradeCapacities[UPG_MAX][4] = {
{ 0, 0, 0, 0 }, // UPG_SCALE (unused)
{ 99, 200, 500, 500 }, // UPG_WALLET
{ 0, 30, 40, 50 }, // UPG_BULLET_BAG
{ 0, 10, 20, 30 }, // UPG_STICKS
{ 0, 20, 30, 40 }, // UPG_NUTS
{ 0, 10, 20, 30 }, // UPG_DEKU_STICKS
{ 0, 20, 30, 40 }, // UPG_DEKU_NUTS
};
u32 gGsFlagsMasks[] = { 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000 };
@ -212,62 +212,62 @@ void* gItemIcons[] = {
// Used to map item IDs to inventory slots
u8 gItemSlots[] = {
SLOT_STICK, // ITEM_STICK
SLOT_NUT, // ITEM_NUT
SLOT_BOMB, // ITEM_BOMB
SLOT_BOW, // ITEM_BOW
SLOT_ARROW_FIRE, // ITEM_ARROW_FIRE
SLOT_DINS_FIRE, // ITEM_DINS_FIRE
SLOT_SLINGSHOT, // ITEM_SLINGSHOT
SLOT_OCARINA, // ITEM_OCARINA_FAIRY
SLOT_OCARINA, // ITEM_OCARINA_TIME
SLOT_BOMBCHU, // ITEM_BOMBCHU
SLOT_HOOKSHOT, // ITEM_HOOKSHOT
SLOT_HOOKSHOT, // ITEM_LONGSHOT
SLOT_ARROW_ICE, // ITEM_ARROW_ICE
SLOT_FARORES_WIND, // ITEM_FARORES_WIND
SLOT_BOOMERANG, // ITEM_BOOMERANG
SLOT_LENS, // ITEM_LENS
SLOT_BEAN, // ITEM_BEAN
SLOT_HAMMER, // ITEM_HAMMER
SLOT_ARROW_LIGHT, // ITEM_ARROW_LIGHT
SLOT_NAYRUS_LOVE, // ITEM_NAYRUS_LOVE
SLOT_BOTTLE_1, // ITEM_BOTTLE
SLOT_BOTTLE_1, // ITEM_POTION_RED
SLOT_BOTTLE_1, // ITEM_POTION_GREEN
SLOT_BOTTLE_1, // ITEM_POTION_BLUE
SLOT_BOTTLE_1, // ITEM_FAIRY
SLOT_BOTTLE_1, // ITEM_FISH
SLOT_BOTTLE_1, // ITEM_MILK_BOTTLE
SLOT_BOTTLE_1, // ITEM_LETTER_RUTO
SLOT_BOTTLE_1, // ITEM_BLUE_FIRE
SLOT_BOTTLE_1, // ITEM_BUG
SLOT_BOTTLE_1, // ITEM_BIG_POE
SLOT_BOTTLE_1, // ITEM_MILK_HALF
SLOT_BOTTLE_1, // ITEM_POE
SLOT_TRADE_CHILD, // ITEM_WEIRD_EGG
SLOT_TRADE_CHILD, // ITEM_CHICKEN
SLOT_TRADE_CHILD, // ITEM_LETTER_ZELDA
SLOT_TRADE_CHILD, // ITEM_MASK_KEATON
SLOT_TRADE_CHILD, // ITEM_MASK_SKULL
SLOT_TRADE_CHILD, // ITEM_MASK_SPOOKY
SLOT_TRADE_CHILD, // ITEM_MASK_BUNNY
SLOT_TRADE_CHILD, // ITEM_MASK_GORON
SLOT_TRADE_CHILD, // ITEM_MASK_ZORA
SLOT_TRADE_CHILD, // ITEM_MASK_GERUDO
SLOT_TRADE_CHILD, // ITEM_MASK_TRUTH
SLOT_TRADE_CHILD, // ITEM_SOLD_OUT
SLOT_TRADE_ADULT, // ITEM_POCKET_EGG
SLOT_TRADE_ADULT, // ITEM_POCKET_CUCCO
SLOT_TRADE_ADULT, // ITEM_COJIRO
SLOT_TRADE_ADULT, // ITEM_ODD_MUSHROOM
SLOT_TRADE_ADULT, // ITEM_ODD_POTION
SLOT_TRADE_ADULT, // ITEM_SAW
SLOT_TRADE_ADULT, // ITEM_SWORD_BROKEN
SLOT_TRADE_ADULT, // ITEM_PRESCRIPTION
SLOT_TRADE_ADULT, // ITEM_FROG
SLOT_TRADE_ADULT, // ITEM_EYEDROPS
SLOT_TRADE_ADULT, // ITEM_CLAIM_CHECK
SLOT_DEKU_STICK, // ITEM_DEKU_STICK
SLOT_DEKU_NUT, // ITEM_DEKU_NUT
SLOT_BOMB, // ITEM_BOMB
SLOT_BOW, // ITEM_BOW
SLOT_ARROW_FIRE, // ITEM_ARROW_FIRE
SLOT_DINS_FIRE, // ITEM_DINS_FIRE
SLOT_SLINGSHOT, // ITEM_SLINGSHOT
SLOT_OCARINA, // ITEM_OCARINA_FAIRY
SLOT_OCARINA, // ITEM_OCARINA_OF_TIME
SLOT_BOMBCHU, // ITEM_BOMBCHU
SLOT_HOOKSHOT, // ITEM_HOOKSHOT
SLOT_HOOKSHOT, // ITEM_LONGSHOT
SLOT_ARROW_ICE, // ITEM_ARROW_ICE
SLOT_FARORES_WIND, // ITEM_FARORES_WIND
SLOT_BOOMERANG, // ITEM_BOOMERANG
SLOT_LENS_OF_TRUTH, // ITEM_LENS_OF_TRUTH
SLOT_MAGIC_BEAN, // ITEM_MAGIC_BEAN
SLOT_HAMMER, // ITEM_HAMMER
SLOT_ARROW_LIGHT, // ITEM_ARROW_LIGHT
SLOT_NAYRUS_LOVE, // ITEM_NAYRUS_LOVE
SLOT_BOTTLE_1, // ITEM_BOTTLE_EMPTY
SLOT_BOTTLE_1, // ITEM_BOTTLE_POTION_RED
SLOT_BOTTLE_1, // ITEM_BOTTLE_POTION_GREEN
SLOT_BOTTLE_1, // ITEM_BOTTLE_POTION_BLUE
SLOT_BOTTLE_1, // ITEM_BOTTLE_FAIRY
SLOT_BOTTLE_1, // ITEM_BOTTLE_FISH
SLOT_BOTTLE_1, // ITEM_BOTTLE_MILK_FULL
SLOT_BOTTLE_1, // ITEM_BOTTLE_RUTOS_LETTER
SLOT_BOTTLE_1, // ITEM_BOTTLE_BLUE_FIRE
SLOT_BOTTLE_1, // ITEM_BOTTLE_BUG
SLOT_BOTTLE_1, // ITEM_BOTTLE_BIG_POE
SLOT_BOTTLE_1, // ITEM_BOTTLE_MILK_HALF
SLOT_BOTTLE_1, // ITEM_BOTTLE_POE
SLOT_TRADE_CHILD, // ITEM_WEIRD_EGG
SLOT_TRADE_CHILD, // ITEM_CHICKEN
SLOT_TRADE_CHILD, // ITEM_ZELDAS_LETTER
SLOT_TRADE_CHILD, // ITEM_MASK_KEATON
SLOT_TRADE_CHILD, // ITEM_MASK_SKULL
SLOT_TRADE_CHILD, // ITEM_MASK_SPOOKY
SLOT_TRADE_CHILD, // ITEM_MASK_BUNNY_HOOD
SLOT_TRADE_CHILD, // ITEM_MASK_GORON
SLOT_TRADE_CHILD, // ITEM_MASK_ZORA
SLOT_TRADE_CHILD, // ITEM_MASK_GERUDO
SLOT_TRADE_CHILD, // ITEM_MASK_TRUTH
SLOT_TRADE_CHILD, // ITEM_SOLD_OUT
SLOT_TRADE_ADULT, // ITEM_POCKET_EGG
SLOT_TRADE_ADULT, // ITEM_POCKET_CUCCO
SLOT_TRADE_ADULT, // ITEM_COJIRO
SLOT_TRADE_ADULT, // ITEM_ODD_MUSHROOM
SLOT_TRADE_ADULT, // ITEM_ODD_POTION
SLOT_TRADE_ADULT, // ITEM_POACHERS_SAW
SLOT_TRADE_ADULT, // ITEM_BROKEN_GORONS_SWORD
SLOT_TRADE_ADULT, // ITEM_PRESCRIPTION
SLOT_TRADE_ADULT, // ITEM_EYEBALL_FROG
SLOT_TRADE_ADULT, // ITEM_EYE_DROPS
SLOT_TRADE_ADULT, // ITEM_CLAIM_CHECK
};
void Inventory_ChangeEquipment(s16 equipment, u16 value) {

View file

@ -1,4 +1,3 @@
#include "ultra64.h"
#include "global.h"
#define DBCAM_CONTROLLER_PORT 2
@ -1507,15 +1506,15 @@ static s32 sAllocSize;
s32 DbCamera_GetFirstAvailableLetter(void) {
s32 i;
for (i = 0; i < ARRAY_COUNT(sLetters); i++) {
switch (sLetters[i]) {
case 'O':
break;
default:
return 'A' + i;
return MEMPAK_INDEX_TO_LETTER(i);
}
}
return '?';
}
@ -1653,7 +1652,7 @@ s32 DbCamera_SaveCallback(char* c) {
freeSize = Mempak_GetFreeBytes(DBCAM_CONTROLLER_PORT);
if ((u32)sAllocSize < (freeSize + ret)) {
if (!Mempak_Alloc(DBCAM_CONTROLLER_PORT, c, sAllocSize)) {
if (!Mempak_CreateFile(DBCAM_CONTROLLER_PORT, c, sAllocSize)) {
return false;
}
@ -1867,7 +1866,7 @@ s32 DbCamera_UpdateDemoControl(DbCamera* dbCamera, Camera* cam) {
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
dbCamera->sub.demoCtrlToggleSwitch ^= 1;
}
D_8012CEE0[41][9] = sCurFileIdx + 'A';
D_8012CEE0[41][9] = MEMPAK_INDEX_TO_LETTER(sCurFileIdx);
func_8006376C(0xA, 7, 5, D_8012CEE0[41]);
func_8006376C(0x10, 7, 5, D_8012CF60[dbCamera->sub.demoCtrlActionIdx]);
func_8006376C(0x14, 7, 5, D_8012CF88[0]);
@ -1891,7 +1890,7 @@ s32 DbCamera_UpdateDemoControl(DbCamera* dbCamera, Camera* cam) {
dbCamera->sub.demoCtrlMenu++;
} else {
dbCamera->sub.demoCtrlToggleSwitch ^= 1;
D_8012CF84[9] = sCurFileIdx + 'A';
D_8012CF84[9] = MEMPAK_INDEX_TO_LETTER(sCurFileIdx);
func_8006376C(0xD, 7, 5, D_8012CF88[-1]); // todo: find something better
func_8006376C(0x12, 7, 5, D_8012CF80);
func_8006376C(0xD, 9, dbCamera->sub.demoCtrlToggleSwitch ? 1 : 6, "PRESS B BUTTON");
@ -1909,7 +1908,7 @@ s32 DbCamera_UpdateDemoControl(DbCamera* dbCamera, Camera* cam) {
case DEMO_CTRL_MENU(ACTION_SAVE, MENU_CALLBACK):
case DEMO_CTRL_MENU(ACTION_LOAD, MENU_CALLBACK):
case DEMO_CTRL_MENU(ACTION_CLEAR, MENU_CALLBACK): {
D_8012CEE0[41][9] = sCurFileIdx + 'A';
D_8012CEE0[41][9] = MEMPAK_INDEX_TO_LETTER(sCurFileIdx);
func_8006376C(0xC, 7, 5, D_8012CEE0[41]);
func_8006376C(0x12, 7, 5, D_8012CF60[dbCamera->sub.demoCtrlActionIdx]);
func_8006376C(0x16, 7, 5, D_8012CF9C[0]);
@ -1927,7 +1926,7 @@ s32 DbCamera_UpdateDemoControl(DbCamera* dbCamera, Camera* cam) {
case DEMO_CTRL_MENU(ACTION_LOAD, MENU_SUCCESS):
case DEMO_CTRL_MENU(ACTION_CLEAR, MENU_SUCCESS): {
dbCamera->sub.demoCtrlToggleSwitch ^= 1;
D_8012CEE0[41][9] = sCurFileIdx + 'A';
D_8012CEE0[41][9] = MEMPAK_INDEX_TO_LETTER(sCurFileIdx);
func_8006376C(0xD, 7, 5, D_8012CEE0[41]);
func_8006376C(0x13, 7, 5, D_8012CF60[dbCamera->sub.demoCtrlMenu / 100]);
func_8006376C(0x17, 7, 5, D_8012CFA4);
@ -1950,7 +1949,7 @@ s32 DbCamera_UpdateDemoControl(DbCamera* dbCamera, Camera* cam) {
case DEMO_CTRL_MENU(ACTION_LOAD, MENU_ERROR):
case DEMO_CTRL_MENU(ACTION_CLEAR, MENU_ERROR): {
dbCamera->sub.demoCtrlToggleSwitch ^= 1;
D_8012CEE0[41][9] = sCurFileIdx + 'A';
D_8012CEE0[41][9] = MEMPAK_INDEX_TO_LETTER(sCurFileIdx);
func_8006376C(0xD, 7, 5, D_8012CEE0[(dbCamera->sub.demoCtrlMenu / 100) + 32]);
func_8006376C(0x11, 7, 5, D_8012CFAC);
func_8006376C(0x17, 7, 5, D_8012CFA4);
@ -1971,11 +1970,12 @@ s32 DbCamera_UpdateDemoControl(DbCamera* dbCamera, Camera* cam) {
default: {
if (Mempak_Init(DBCAM_CONTROLLER_PORT)) {
sMempakFiles = Mempak_FindFile(DBCAM_CONTROLLER_PORT, 'A', 'E');
sMempakFiles = Mempak_FindFiles(DBCAM_CONTROLLER_PORT, 'A', 'E');
dbCamera->sub.demoCtrlMenu = DEMO_CTRL_MENU(ACTION_E, MENU_CALLBACK);
DbCamera_CalcMempakAllocSize();
if ((1 << sCurFileIdx) & sMempakFiles) {
sMempakFilesize = Mempak_GetFileSize(DBCAM_CONTROLLER_PORT, sCurFileIdx + 'A');
sMempakFilesize =
Mempak_GetFileSize(DBCAM_CONTROLLER_PORT, MEMPAK_INDEX_TO_LETTER(sCurFileIdx));
dbCamera->sub.demoCtrlActionIdx = ACTION_LOAD;
} else {
sMempakFilesize = 0;
@ -1984,7 +1984,7 @@ s32 DbCamera_UpdateDemoControl(DbCamera* dbCamera, Camera* cam) {
block_1:
idx2 = 1;
for (i = 0; i < 5; i++) {
sp74[i * 2 + 1] = (sMempakFiles & idx2) ? i + 'A' : '?';
sp74[i * 2 + 1] = (sMempakFiles & idx2) ? MEMPAK_INDEX_TO_LETTER(i) : '?';
sp74[i * 2 + 0] = '-';
idx2 <<= 1;
@ -2002,7 +2002,8 @@ s32 DbCamera_UpdateDemoControl(DbCamera* dbCamera, Camera* cam) {
}
if ((1 << sCurFileIdx) & sMempakFiles) {
sMempakFilesize = Mempak_GetFileSize(DBCAM_CONTROLLER_PORT, sCurFileIdx + 'A');
sMempakFilesize =
Mempak_GetFileSize(DBCAM_CONTROLLER_PORT, MEMPAK_INDEX_TO_LETTER(sCurFileIdx));
dbCamera->sub.demoCtrlActionIdx = ACTION_LOAD;
} else {
sMempakFilesize = 0;
@ -2019,7 +2020,8 @@ s32 DbCamera_UpdateDemoControl(DbCamera* dbCamera, Camera* cam) {
}
if ((1 << sCurFileIdx) & sMempakFiles) {
sMempakFilesize = Mempak_GetFileSize(DBCAM_CONTROLLER_PORT, sCurFileIdx + 'A');
sMempakFilesize =
Mempak_GetFileSize(DBCAM_CONTROLLER_PORT, MEMPAK_INDEX_TO_LETTER(sCurFileIdx));
dbCamera->sub.demoCtrlActionIdx = ACTION_LOAD;
} else {
sMempakFilesize = 0;

View file

@ -1,184 +1,271 @@
/**
* @file mempak.c
*
* This file implements an interface for a controller memory pak filesystem (pfs), with operations to create, delete,
* read, write and check the size of files, as well as obtain a listing of which files currently exist.
*
* Each file is assigned an uppercase ASCII letter as an identifier, the game name for each is marked as
* 'ZELDA DEMO TOOL', encoded according to the N64 Font Code described in section 26.3 of the N64 Programming Manual.
*/
#include "global.h"
#define MEMPAK_MAX_FILES 11
OSPfs sMempakPfsHandle;
s32 sMempakFreeBytes;
s32 sMempakFiles[10];
s32 sMempakFiles[MEMPAK_MAX_FILES];
u16 sMempakCompanyCode = 1;
u32 sMempakGameCode = 1;
// "ZELDA DEMO TOOL "
u8 sMempakGameName[0x10] = { 0x33, 0x1E, 0x25, 0x1D, 0x1A, 0x0F, 0x1D, 0x1E,
0x26, 0x28, 0x0F, 0x2D, 0x28, 0x28, 0x25, 0x0F };
u8 sMempakExtName[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
// NCH is a heavily abbreviated "N64 font code CHaracter"
// Conversion from A-Z to N64 Font Code
#define NCH(c) ((c)-0x27)
// Conversion from spaces to N64 Font Code
#define NCH_SPC (0x0F)
s32 Mempak_Init(s32 controllerNb) {
OSMesgQueue* mq;
u8 sMempakGameName[PFS_FILE_NAME_LEN] = {
NCH('Z'), NCH('E'), NCH('L'), NCH('D'), NCH('A'), NCH_SPC, NCH('D'), NCH('E'),
NCH('M'), NCH('O'), NCH_SPC, NCH('T'), NCH('O'), NCH('O'), NCH('L'), NCH_SPC,
};
u8 sMempakExtName[PFS_FILE_EXT_LEN] = { 0 };
/**
* Initializes the memory pak filesystem for a memory pak in the controller plugged into the specified port. Subsequent
* memory pak operations will use the same controller port.
*
* @return true if the operation completed successfully, false otherwise
*/
s32 Mempak_Init(s32 controllerNum) {
OSMesgQueue* serialEventQueue;
s32 pad;
s32 ret = false;
mq = PadMgr_AcquireSerialEventQueue(&gPadMgr);
serialEventQueue = PadMgr_AcquireSerialEventQueue(&gPadMgr);
if (!osPfsInitPak(mq, &sMempakPfsHandle, controllerNb)) {
if (osPfsInitPak(serialEventQueue, &sMempakPfsHandle, controllerNum) == 0) {
ret = true;
}
osPfsFreeBlocks(&sMempakPfsHandle, &sMempakFreeBytes);
PadMgr_ReleaseSerialEventQueue(&gPadMgr, mq);
PadMgr_ReleaseSerialEventQueue(&gPadMgr, serialEventQueue);
return ret;
}
s32 Mempak_GetFreeBytes(s32 controllerNb) {
s32 Mempak_GetFreeBytes(s32 controllerNum) {
return sMempakFreeBytes;
}
s32 Mempak_FindFile(s32 controllerNb, char start, char end) {
OSMesgQueue* mq;
/**
* Checks if the files identified by letters between `start` and `end` (inclusive) exist on the memory pak.
*
* This must be called before performing any individual file operations.
*
* @param controllerNum Unused, the controller used is that which was last passed to `Mempak_Init`
* @param start Start file letter
* @param end End file letter (inclusive)
* @return a bitfield where set bits indicate that the file exists
*/
s32 Mempak_FindFiles(s32 controllerNum, char start, char end) {
OSMesgQueue* serialEventQueue;
s32 error;
char idx;
char letter;
u32 bit = 1;
s32 flag = 0;
s32 bits = 0;
mq = PadMgr_AcquireSerialEventQueue(&gPadMgr);
serialEventQueue = PadMgr_AcquireSerialEventQueue(&gPadMgr);
for (idx = start; idx <= end; idx++) {
sMempakExtName[0] = idx - 0x27;
for (letter = start; letter <= end; letter++) {
sMempakExtName[0] = NCH(letter);
error = osPfsFindFile(&sMempakPfsHandle, sMempakCompanyCode, sMempakGameCode, sMempakGameName, sMempakExtName,
&sMempakFiles[idx - 'A']);
&sMempakFiles[MEMPAK_LETTER_TO_INDEX(letter)]);
if (error == 0) {
flag |= bit;
bits |= bit;
} else {
sMempakFiles[idx - 'A'] = -1;
sMempakFiles[MEMPAK_LETTER_TO_INDEX(letter)] = -1;
}
bit <<= 1;
osSyncPrintf("mempak: find '%c' (%d)\n", idx, error);
osSyncPrintf("mempak: find '%c' (%d)\n", letter, error);
}
PadMgr_ReleaseSerialEventQueue(&gPadMgr, mq);
osSyncPrintf("mempak: find '%c' - '%c' %02x\n", start, end, flag);
return flag;
PadMgr_ReleaseSerialEventQueue(&gPadMgr, serialEventQueue);
osSyncPrintf("mempak: find '%c' - '%c' %02x\n", start, end, bits);
return bits;
}
s32 Mempak_Write(s32 controllerNb, char idx, void* buffer, s32 offset, s32 size) {
OSMesgQueue* mq;
/**
* Writes data to the file identified with `letter`.
*
* @param controllerNum Unused, the controller used is that which was last passed to `Mempak_Init`
* @param letter Memory pak file letter, in the range 'A' to ('A' + MEMPAK_MAX_FILES)
* @param buffer Buffer containing data to write
* @param offset Offset into the file to write to
* @param size Size in bytes
* @return true if the operation completed successfully, false otherwise
*/
s32 Mempak_Write(s32 controllerNum, char letter, void* buffer, s32 offset, s32 size) {
OSMesgQueue* serialEventQueue;
s32 error;
s32 ret = false;
s32 pad;
mq = PadMgr_AcquireSerialEventQueue(&gPadMgr);
serialEventQueue = PadMgr_AcquireSerialEventQueue(&gPadMgr);
if (size < sMempakFreeBytes) {
error = osPfsReadWriteFile(&sMempakPfsHandle, sMempakFiles[idx - 'A'], 1, offset, size, buffer);
error = osPfsReadWriteFile(&sMempakPfsHandle, sMempakFiles[MEMPAK_LETTER_TO_INDEX(letter)], PFS_WRITE, offset,
size, buffer);
if (error == 0) {
ret = true;
}
osSyncPrintf("mempak: write %d byte '%c' (%d)->%d\n", size, idx, sMempakFiles[idx - 'A'], error);
osSyncPrintf("mempak: write %d byte '%c' (%d)->%d\n", size, letter,
sMempakFiles[MEMPAK_LETTER_TO_INDEX(letter)], error);
}
PadMgr_ReleaseSerialEventQueue(&gPadMgr, mq);
PadMgr_ReleaseSerialEventQueue(&gPadMgr, serialEventQueue);
return ret;
}
s32 Mempak_Read(s32 controllerNb, char idx, void* buffer, s32 offset, s32 size) {
OSMesgQueue* mq;
/**
* Reads data from the file identified with `letter`.
*
* @param controllerNum Unused, the controller used is that which was last passed to `Mempak_Init`
* @param letter Memory pak file letter, in the range 'A' to ('A' + MEMPAK_MAX_FILES)
* @param buffer Buffer to read data into
* @param offset Offset into the file to read from
* @param size Size in bytes
* @return true if the operation completed successfully, false otherwise
*/
s32 Mempak_Read(s32 controllerNum, char letter, void* buffer, s32 offset, s32 size) {
OSMesgQueue* serialEventQueue;
s32 error;
s32 ret = false;
s32 pad;
mq = PadMgr_AcquireSerialEventQueue(&gPadMgr);
serialEventQueue = PadMgr_AcquireSerialEventQueue(&gPadMgr);
if (size < sMempakFreeBytes) {
error = osPfsReadWriteFile(&sMempakPfsHandle, sMempakFiles[idx - 'A'], 0, offset, size, buffer);
error = osPfsReadWriteFile(&sMempakPfsHandle, sMempakFiles[MEMPAK_LETTER_TO_INDEX(letter)], PFS_READ, offset,
size, buffer);
if (error == 0) {
ret = true;
}
osSyncPrintf("mempak: read %d byte '%c' (%d)<-%d\n", size, idx, sMempakFiles[idx - 'A'], error);
osSyncPrintf("mempak: read %d byte '%c' (%d)<-%d\n", size, letter, sMempakFiles[MEMPAK_LETTER_TO_INDEX(letter)],
error);
}
PadMgr_ReleaseSerialEventQueue(&gPadMgr, mq);
PadMgr_ReleaseSerialEventQueue(&gPadMgr, serialEventQueue);
return ret;
}
s32 Mempak_Alloc(s32 controllerNb, char* idx, s32 size) {
OSMesgQueue* mq;
/**
* Creates a new file on the memory pak.
*
* @param controllerNum Unused, the controller used is that which was last passed to `Mempak_Init`
* @param letter Memory pak file letter, in the range 'A' to ('A' + MEMPAK_MAX_FILES).
* If this points to a valid file letter the new file will be created using that letter, otherwise it will create
* a file using the first free letter and return it through this argument. If no letters are free, the last letter
* ('A' + MEMPAK_MAX_FILES - 1) is used.
* @param size File size
* @return true if the operation completed successfully, false otherwise
*/
s32 Mempak_CreateFile(s32 controllerNum, char* letter, s32 size) {
OSMesgQueue* serialEventQueue;
s32 error;
s32 ret = 0;
s32 ret = false;
s32 i;
s32 pad;
mq = PadMgr_AcquireSerialEventQueue(&gPadMgr);
serialEventQueue = PadMgr_AcquireSerialEventQueue(&gPadMgr);
if (*letter >= MEMPAK_INDEX_TO_LETTER(0) && *letter < MEMPAK_INDEX_TO_LETTER(MEMPAK_MAX_FILES)) {
// Create file with specific letter
sMempakExtName[0] = NCH(*letter);
if (-1 == sMempakFiles[MEMPAK_LETTER_TO_INDEX(*letter)]) {
// File does not already exist
if (*idx >= 'A' && *idx < 'L') {
sMempakExtName[0] = *idx - 0x27;
if (-1 == sMempakFiles[*idx - 'A']) {
error = osPfsAllocateFile(&sMempakPfsHandle, sMempakCompanyCode, sMempakGameCode, sMempakGameName,
sMempakExtName, size, &sMempakFiles[*idx - 'A']);
sMempakExtName, size, &sMempakFiles[MEMPAK_LETTER_TO_INDEX(*letter)]);
if (error == 0) {
ret = 1;
ret = true;
}
osSyncPrintf("mempak: alloc %d byte '%c' (%d)\n", size, *idx, error);
osSyncPrintf("mempak: alloc %d byte '%c' (%d)\n", size, *letter, error);
} else {
sMempakExtName[0] = *idx - 0x27;
// File already exists, delete then alloc
sMempakExtName[0] = NCH(*letter);
if (osPfsDeleteFile(&sMempakPfsHandle, sMempakCompanyCode, sMempakGameCode, sMempakGameName,
sMempakExtName) == 0) {
ret = 1;
ret = true;
}
error = osPfsAllocateFile(&sMempakPfsHandle, sMempakCompanyCode, sMempakGameCode, sMempakGameName,
sMempakExtName, size, &sMempakFiles[*idx - 'A']);
sMempakExtName, size, &sMempakFiles[MEMPAK_LETTER_TO_INDEX(*letter)]);
if (error == 0) {
ret |= 1;
ret |= true;
}
osSyncPrintf("mempak: resize %d byte '%c' (%d)\n", size, *idx, error);
osSyncPrintf("mempak: resize %d byte '%c' (%d)\n", size, *letter, error);
}
} else {
for (i = 0; i < ARRAY_COUNT(sMempakFiles); i++) {
// Find first free letter and create a file identified by it
for (i = 0; i < MEMPAK_MAX_FILES - 1; i++) {
if (sMempakFiles[i] == -1) {
break;
}
}
*letter = MEMPAK_INDEX_TO_LETTER(i);
*idx = i + 'A';
sMempakExtName[0] = *idx - 0x27;
sMempakExtName[0] = NCH(*letter);
error = osPfsAllocateFile(&sMempakPfsHandle, sMempakCompanyCode, sMempakGameCode, sMempakGameName,
sMempakExtName, size, &sMempakFiles[i]);
osSyncPrintf("mempak: alloc %d byte '%c' (%d) with search\n", size, *idx, error);
osSyncPrintf("mempak: alloc %d byte '%c' (%d) with search\n", size, *letter, error);
if (error == 0) {
ret = 1;
ret = true;
}
}
PadMgr_ReleaseSerialEventQueue(&gPadMgr, mq);
PadMgr_ReleaseSerialEventQueue(&gPadMgr, serialEventQueue);
return ret;
}
s32 Mempak_DeleteFile(s32 controllerNb, char idx) {
OSMesgQueue* mq;
/**
* Deletes the file identified with `letter`.
*
* @param controllerNum Unused, the controller used is that which was last passed to `Mempak_Init`
* @param letter Memory pak file letter, in the range 'A' to ('A' + MEMPAK_MAX_FILES)
* @return true if the operation completed successfully, false otherwise
*/
s32 Mempak_DeleteFile(s32 controllerNum, char letter) {
OSMesgQueue* serialEventQueue;
s32 error;
s32 ret = false;
mq = PadMgr_AcquireSerialEventQueue(&gPadMgr);
serialEventQueue = PadMgr_AcquireSerialEventQueue(&gPadMgr);
sMempakExtName[0] = idx - 0x27;
sMempakExtName[0] = NCH(letter);
error = osPfsDeleteFile(&sMempakPfsHandle, sMempakCompanyCode, sMempakGameCode, sMempakGameName, sMempakExtName);
if (error == 0) {
ret = true;
}
osSyncPrintf("mempak: delete '%c' (%d)\n", idx, error);
PadMgr_ReleaseSerialEventQueue(&gPadMgr, mq);
osSyncPrintf("mempak: delete '%c' (%d)\n", letter, error);
PadMgr_ReleaseSerialEventQueue(&gPadMgr, serialEventQueue);
return ret;
}
s32 Mempak_GetFileSize(s32 controllerNb, char idx) {
OSMesgQueue* mq = PadMgr_AcquireSerialEventQueue(&gPadMgr);
/**
* Gets the size of the file identified with `letter`.
*
* @param controllerNum Unused, the controller used is that which was last passed to `Mempak_Init`
* @param letter Memory pak file letter, in the range 'A' to ('A' + MEMPAK_MAX_FILES)
* @return the size of the file, or 0 if the operation failed for any reason
*/
s32 Mempak_GetFileSize(s32 controllerNum, char letter) {
OSMesgQueue* serialEventQueue = PadMgr_AcquireSerialEventQueue(&gPadMgr);
OSPfsState state;
s32 error = osPfsFileState(&sMempakPfsHandle, sMempakFiles[idx - 'A'], &state);
s32 error = osPfsFileState(&sMempakPfsHandle, sMempakFiles[MEMPAK_LETTER_TO_INDEX(letter)], &state);
s32 pad;
PadMgr_ReleaseSerialEventQueue(&gPadMgr, mq);
PadMgr_ReleaseSerialEventQueue(&gPadMgr, serialEventQueue);
if (error != 0) {
return 0;

View file

@ -31,13 +31,13 @@
#include "global.h"
#include "terminal.h"
#define PADMGR_LOG(controllerNo, msg) \
if (1) { \
osSyncPrintf(VT_FGCOL(YELLOW)); \
/* padmgr: Controller %d: %s */ \
osSyncPrintf("padmgr: %dコン: %s\n", (controllerNo) + 1, (msg)); \
osSyncPrintf(VT_RST); \
} \
#define PADMGR_LOG(controllerNum, msg) \
if (1) { \
osSyncPrintf(VT_FGCOL(YELLOW)); \
/* padmgr: Controller %d: %s */ \
osSyncPrintf("padmgr: %dコン: %s\n", (controllerNum) + 1, (msg)); \
osSyncPrintf(VT_RST); \
} \
(void)0
#define LOG_SEVERITY_NOLOG 0

View file

@ -8,7 +8,7 @@ void Interface_Init(PlayState* play) {
InterfaceContext* interfaceCtx = &play->interfaceCtx;
u32 parameterSize;
u16 doActionOffset;
u8 temp;
u8 timerId;
gSaveContext.sunsSongState = SUNSSONG_INACTIVE;
gSaveContext.unk_13E8 = gSaveContext.unk_13EA = 0;
@ -109,39 +109,42 @@ void Interface_Init(PlayState* play) {
0x1000, "../z_construct.c", 219);
}
osSyncPrintf("%d\n", ((void)0, gSaveContext.timer1State));
osSyncPrintf("%d\n", ((void)0, gSaveContext.timerState));
if ((gSaveContext.timer1State == 4) || (gSaveContext.timer1State == 8) || (gSaveContext.timer2State == 4) ||
(gSaveContext.timer2State == 10)) {
if ((gSaveContext.timerState == TIMER_STATE_ENV_HAZARD_TICK) ||
(gSaveContext.timerState == TIMER_STATE_DOWN_TICK) ||
(gSaveContext.subTimerState == SUBTIMER_STATE_DOWN_TICK) ||
(gSaveContext.subTimerState == SUBTIMER_STATE_UP_TICK)) {
osSyncPrintf("restart_flag=%d\n", ((void)0, gSaveContext.respawnFlag));
if ((gSaveContext.respawnFlag == -1) || (gSaveContext.respawnFlag == 1)) {
if (gSaveContext.timer1State == 4) {
gSaveContext.timer1State = 1;
gSaveContext.timerX[0] = 140;
gSaveContext.timerY[0] = 80;
if (gSaveContext.timerState == TIMER_STATE_ENV_HAZARD_TICK) {
gSaveContext.timerState = TIMER_STATE_ENV_HAZARD_INIT;
gSaveContext.timerX[TIMER_ID_MAIN] = 140;
gSaveContext.timerY[TIMER_ID_MAIN] = 80;
}
}
if ((gSaveContext.timer1State == 4) || (gSaveContext.timer1State == 8)) {
temp = 0;
if ((gSaveContext.timerState == TIMER_STATE_ENV_HAZARD_TICK) ||
(gSaveContext.timerState == TIMER_STATE_DOWN_TICK)) {
timerId = TIMER_ID_MAIN;
} else {
temp = 1;
timerId = TIMER_ID_SUB;
}
gSaveContext.timerX[temp] = 26;
gSaveContext.timerX[timerId] = 26;
if (gSaveContext.healthCapacity > 0xA0) {
gSaveContext.timerY[temp] = 54;
gSaveContext.timerY[timerId] = 54; // two rows of hearts
} else {
gSaveContext.timerY[temp] = 46;
gSaveContext.timerY[timerId] = 46; // one row of hearts
}
}
if ((gSaveContext.timer1State >= 11) && (gSaveContext.timer1State < 16)) {
gSaveContext.timer1State = 0;
if ((gSaveContext.timerState >= TIMER_STATE_UP_INIT) && (gSaveContext.timerState <= TIMER_STATE_UP_FREEZE)) {
gSaveContext.timerState = TIMER_STATE_OFF;
// "Timer Stop!!!!!!!!!!!!!!!!!!!!!!"
osSyncPrintf("タイマー停止!!!!!!!!!!!!!!!!!!!!! = %d\n", gSaveContext.timer1State);
osSyncPrintf("タイマー停止!!!!!!!!!!!!!!!!!!!!! = %d\n", gSaveContext.timerState);
}
osSyncPrintf("PARAMETER領域=%x\n", parameterSize + 0x5300); // "Parameter Area = %x"

View file

@ -39,7 +39,7 @@ u32 QuestHint_CheckCondition(QuestHintCmd* hintCmd) {
case (QUEST_HINT_CONDITION_DUNGEON_ITEM << 1):
return ((hintCmd->byte0 & 1) == 1) ==
(CHECK_DUNGEON_ITEM(hintCmd->byte1 - ITEM_KEY_BOSS, gSaveContext.mapIndex) != 0);
(CHECK_DUNGEON_ITEM(hintCmd->byte1 - ITEM_DUNGEON_BOSS_KEY, gSaveContext.mapIndex) != 0);
case (QUEST_HINT_CONDITION_ITEM << 1):
return ((hintCmd->byte0 & 1) == 1) == (hintCmd->byte3 == INV_CONTENT(hintCmd->byte1));

View file

@ -314,31 +314,31 @@ void EnItem00_Init(Actor* thisx, PlayState* play) {
Item_Give(play, ITEM_BOW);
break;
case ITEM00_ARROWS_SMALL:
Item_Give(play, ITEM_ARROWS_SMALL);
Item_Give(play, ITEM_ARROWS_5);
break;
case ITEM00_ARROWS_MEDIUM:
Item_Give(play, ITEM_ARROWS_MEDIUM);
Item_Give(play, ITEM_ARROWS_10);
break;
case ITEM00_ARROWS_LARGE:
Item_Give(play, ITEM_ARROWS_LARGE);
Item_Give(play, ITEM_ARROWS_30);
break;
case ITEM00_MAGIC_LARGE:
getItemId = GI_MAGIC_SMALL;
getItemId = GI_MAGIC_JAR_SMALL;
break;
case ITEM00_MAGIC_SMALL:
getItemId = GI_MAGIC_LARGE;
getItemId = GI_MAGIC_JAR_LARGE;
break;
case ITEM00_SMALL_KEY:
Item_Give(play, ITEM_KEY_SMALL);
Item_Give(play, ITEM_SMALL_KEY);
break;
case ITEM00_SEEDS:
getItemId = GI_SEEDS_5;
getItemId = GI_DEKU_SEEDS_5;
break;
case ITEM00_NUTS:
getItemId = GI_NUTS_5;
getItemId = GI_DEKU_NUTS_5;
break;
case ITEM00_STICK:
getItemId = GI_STICKS_1;
getItemId = GI_DEKU_STICKS_1;
break;
case ITEM00_HEART_PIECE:
case ITEM00_HEART_CONTAINER:
@ -632,10 +632,10 @@ void EnItem00_Update(Actor* thisx, PlayState* play) {
Item_Give(play, ITEM_RUPEE_GOLD);
break;
case ITEM00_STICK:
getItemId = GI_STICKS_1;
getItemId = GI_DEKU_STICKS_1;
break;
case ITEM00_NUTS:
getItemId = GI_NUTS_5;
getItemId = GI_DEKU_NUTS_5;
break;
case ITEM00_RECOVERY_HEART:
Item_Give(play, ITEM_RECOVERY_HEART);
@ -651,19 +651,19 @@ void EnItem00_Update(Actor* thisx, PlayState* play) {
Item_Give(play, ITEM_BOW);
break;
case ITEM00_ARROWS_SMALL:
Item_Give(play, ITEM_ARROWS_SMALL);
Item_Give(play, ITEM_ARROWS_5);
break;
case ITEM00_ARROWS_MEDIUM:
Item_Give(play, ITEM_ARROWS_MEDIUM);
Item_Give(play, ITEM_ARROWS_10);
break;
case ITEM00_ARROWS_LARGE:
Item_Give(play, ITEM_ARROWS_LARGE);
Item_Give(play, ITEM_ARROWS_30);
break;
case ITEM00_SEEDS:
getItemId = GI_SEEDS_5;
getItemId = GI_DEKU_SEEDS_5;
break;
case ITEM00_SMALL_KEY:
getItemId = GI_KEY_SMALL;
getItemId = GI_SMALL_KEY;
break;
case ITEM00_HEART_PIECE:
getItemId = GI_HEART_PIECE;
@ -672,10 +672,10 @@ void EnItem00_Update(Actor* thisx, PlayState* play) {
getItemId = GI_HEART_CONTAINER;
break;
case ITEM00_MAGIC_LARGE:
getItemId = GI_MAGIC_LARGE;
getItemId = GI_MAGIC_JAR_LARGE;
break;
case ITEM00_MAGIC_SMALL:
getItemId = GI_MAGIC_SMALL;
getItemId = GI_MAGIC_JAR_SMALL;
break;
case ITEM00_SHIELD_DEKU:
getItemId = GI_SHIELD_DEKU;

View file

@ -28,9 +28,9 @@ void GameOver_Update(PlayState* play) {
case GAMEOVER_DEATH_START:
Message_CloseTextbox(play);
gSaveContext.timer1State = 0;
gSaveContext.timer2State = 0;
CLEAR_EVENTINF(EVENTINF_10);
gSaveContext.timerState = TIMER_STATE_OFF;
gSaveContext.subTimerState = SUBTIMER_STATE_OFF;
CLEAR_EVENTINF(EVENTINF_MARATHON_ACTIVE);
// search inventory for spoiling items and revert if necessary
for (i = 0; i < ARRAY_COUNT(gSpoilingItems); i++) {
@ -50,8 +50,8 @@ void GameOver_Update(PlayState* play) {
// restore "temporary B" to the B Button if not a sword item
if (gSaveContext.equips.buttonItems[0] != ITEM_SWORD_KOKIRI &&
gSaveContext.equips.buttonItems[0] != ITEM_SWORD_MASTER &&
gSaveContext.equips.buttonItems[0] != ITEM_SWORD_BGS &&
gSaveContext.equips.buttonItems[0] != ITEM_SWORD_KNIFE) {
gSaveContext.equips.buttonItems[0] != ITEM_SWORD_BIGGORON &&
gSaveContext.equips.buttonItems[0] != ITEM_GIANTS_KNIFE) {
if (gSaveContext.buttonStatus[0] != BTN_ENABLED) {
gSaveContext.equips.buttonItems[0] = gSaveContext.buttonStatus[0];

View file

@ -1283,9 +1283,9 @@ void Message_Decode(PlayState* play) {
osSyncPrintf("\nEVENTタイマー ");
digits[0] = digits[1] = digits[2] = 0;
if (curChar == MESSAGE_RACE_TIME) {
digits[3] = gSaveContext.timer1Value;
digits[3] = gSaveContext.timerSeconds;
} else {
digits[3] = gSaveContext.timer2Value;
digits[3] = gSaveContext.subTimerSeconds;
}
while (digits[3] >= 60) {

File diff suppressed because it is too large Load diff

View file

@ -3,11 +3,6 @@
#include "assets/objects/object_link_boy/object_link_boy.h"
#include "assets/objects/object_link_child/object_link_child.h"
typedef struct {
/* 0x00 */ u8 flag;
/* 0x02 */ u16 textId;
} TextTriggerEntry; // size = 0x04
typedef struct {
/* 0x00 */ Gfx* dList;
/* 0x04 */ Vec3f pos;
@ -32,7 +27,7 @@ u8 sActionModelGroups[PLAYER_IA_MAX] = {
PLAYER_MODELGROUP_SWORD, // PLAYER_IA_SWORD_MASTER
PLAYER_MODELGROUP_SWORD, // PLAYER_IA_SWORD_KOKIRI
PLAYER_MODELGROUP_BGS, // PLAYER_IA_SWORD_BGS
PLAYER_MODELGROUP_10, // PLAYER_IA_STICK
PLAYER_MODELGROUP_10, // PLAYER_IA_DEKU_STICK
PLAYER_MODELGROUP_HAMMER, // PLAYER_IA_HAMMER
PLAYER_MODELGROUP_BOW_SLINGSHOT, // PLAYER_IA_BOW
PLAYER_MODELGROUP_BOW_SLINGSHOT, // PLAYER_IA_BOW_FIRE
@ -53,33 +48,33 @@ u8 sActionModelGroups[PLAYER_IA_MAX] = {
PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_FARORES_WIND
PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_NAYRUS_LOVE
PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_DINS_FIRE
PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_NUT
PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_DEKU_NUT
PLAYER_MODELGROUP_OCARINA, // PLAYER_IA_OCARINA_FAIRY
PLAYER_MODELGROUP_OOT, // PLAYER_IA_OCARINA_TIME
PLAYER_MODELGROUP_OOT, // PLAYER_IA_OCARINA_OF_TIME
PLAYER_MODELGROUP_BOTTLE, // PLAYER_IA_BOTTLE
PLAYER_MODELGROUP_BOTTLE, // PLAYER_IA_BOTTLE_FISH
PLAYER_MODELGROUP_BOTTLE, // PLAYER_IA_BOTTLE_FIRE
PLAYER_MODELGROUP_BOTTLE, // PLAYER_IA_BOTTLE_BUG
PLAYER_MODELGROUP_BOTTLE, // PLAYER_IA_BOTTLE_POE
PLAYER_MODELGROUP_BOTTLE, // PLAYER_IA_BOTTLE_BIG_POE
PLAYER_MODELGROUP_BOTTLE, // PLAYER_IA_BOTTLE_LETTER
PLAYER_MODELGROUP_BOTTLE, // PLAYER_IA_BOTTLE_RUTOS_LETTER
PLAYER_MODELGROUP_BOTTLE, // PLAYER_IA_BOTTLE_POTION_RED
PLAYER_MODELGROUP_BOTTLE, // PLAYER_IA_BOTTLE_POTION_BLUE
PLAYER_MODELGROUP_BOTTLE, // PLAYER_IA_BOTTLE_POTION_GREEN
PLAYER_MODELGROUP_BOTTLE, // PLAYER_IA_BOTTLE_MILK
PLAYER_MODELGROUP_BOTTLE, // PLAYER_IA_BOTTLE_MILK_FULL
PLAYER_MODELGROUP_BOTTLE, // PLAYER_IA_BOTTLE_MILK_HALF
PLAYER_MODELGROUP_BOTTLE, // PLAYER_IA_BOTTLE_FAIRY
PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_LETTER_ZELDA
PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_ZELDAS_LETTER
PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_WEIRD_EGG
PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_CHICKEN
PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_BEAN
PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_MAGIC_BEAN
PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_POCKET_EGG
PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_POCKET_CUCCO
PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_COJIRO
PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_ODD_MUSHROOM
PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_ODD_POTION
PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_SAW
PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_SWORD_BROKEN
PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_POACHERS_SAW
PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_BROKEN_GORONS_SWORD
PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_PRESCRIPTION
PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_FROG
PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_EYEDROPS
@ -87,19 +82,24 @@ u8 sActionModelGroups[PLAYER_IA_MAX] = {
PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_MASK_KEATON
PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_MASK_SKULL
PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_MASK_SPOOKY
PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_MASK_BUNNY
PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_MASK_BUNNY_HOOD
PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_MASK_GORON
PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_MASK_ZORA
PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_MASK_GERUDO
PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_MASK_TRUTH
PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_LENS
PLAYER_MODELGROUP_DEFAULT, // PLAYER_IA_LENS_OF_TRUTH
};
TextTriggerEntry sTextTriggers[] = {
{ 1, 0x3040 },
{ 2, 0x401D },
{ 0, 0x0000 },
{ 2, 0x401D },
typedef struct {
/* 0x0 */ u8 flag;
/* 0x2 */ u16 textId;
} EnvHazardTextTriggerEntry; // size = 0x4
EnvHazardTextTriggerEntry sEnvHazardTextTriggers[] = {
{ ENV_HAZARD_TEXT_TRIGGER_HOTROOM, 0x3040 }, // PLAYER_ENV_HAZARD_HOTROOM - 1
{ ENV_HAZARD_TEXT_TRIGGER_UNDERWATER, 0x401D }, // PLAYER_ENV_HAZARD_UNDERWATER_FLOOR - 1
{ 0, 0x0000 }, // PLAYER_ENV_HAZARD_SWIMMING - 1
{ ENV_HAZARD_TEXT_TRIGGER_UNDERWATER, 0x401D }, // PLAYER_ENV_HAZARD_UNDERWATER_FREE - 1
};
// Used to map model groups to model types for [animation, left hand, right hand, sheath, waist]
@ -590,7 +590,7 @@ void Player_SetEquipmentData(PlayState* play, Player* this) {
void Player_UpdateBottleHeld(PlayState* play, Player* this, s32 item, s32 itemAction) {
Inventory_UpdateBottleItem(play, item, this->heldItemButton);
if (item != ITEM_BOTTLE) {
if (item != ITEM_BOTTLE_EMPTY) {
this->heldItemId = item;
this->heldItemAction = itemAction;
}
@ -644,7 +644,7 @@ s32 Player_IsBurningStickInRange(PlayState* play, Vec3f* pos, f32 xzRange, f32 y
Vec3f diff;
s32 pad;
if ((this->heldItemAction == PLAYER_IA_STICK) && (this->unk_860 != 0)) {
if ((this->heldItemAction == PLAYER_IA_DEKU_STICK) && (this->unk_860 != 0)) {
Math_Vec3f_Diff(&this->meleeWeaponInfo[0].tip, pos, &diff);
return ((SQ(diff.x) + SQ(diff.z)) <= SQ(xzRange)) && (0.0f <= diff.y) && (diff.y <= yRange);
} else {
@ -778,35 +778,37 @@ return_neg:
return -1;
}
s32 func_8008F2F8(PlayState* play) {
s32 Player_GetEnvironmentalHazard(PlayState* play) {
Player* this = GET_PLAYER(play);
TextTriggerEntry* triggerEntry;
s32 var;
EnvHazardTextTriggerEntry* triggerEntry;
s32 envHazard;
if (play->roomCtx.curRoom.behaviorType2 == ROOM_BEHAVIOR_TYPE2_3) { // Room is hot
var = 0;
} else if ((this->unk_840 > 80) &&
((this->currentBoots == PLAYER_BOOTS_IRON) || (this->unk_840 >= 300))) { // Deep underwater
var = ((this->currentBoots == PLAYER_BOOTS_IRON) && (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND)) ? 1 : 3;
envHazard = PLAYER_ENV_HAZARD_HOTROOM - 1;
} else if ((this->underwaterTimer > 80) &&
((this->currentBoots == PLAYER_BOOTS_IRON) || (this->underwaterTimer >= 300))) {
envHazard = ((this->currentBoots == PLAYER_BOOTS_IRON) && (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND))
? (PLAYER_ENV_HAZARD_UNDERWATER_FLOOR - 1)
: (PLAYER_ENV_HAZARD_UNDERWATER_FREE - 1);
} else if (this->stateFlags1 & PLAYER_STATE1_27) { // Swimming
var = 2;
envHazard = PLAYER_ENV_HAZARD_SWIMMING - 1;
} else {
return 0;
return PLAYER_ENV_HAZARD_NONE;
}
// Trigger general textboxes under certain conditions, like "It's so hot in here!"
triggerEntry = &sTextTriggers[var];
triggerEntry = &sEnvHazardTextTriggers[envHazard];
if (!Player_InCsMode(play)) {
if ((triggerEntry->flag != 0) && !(gSaveContext.textTriggerFlags & triggerEntry->flag) &&
(((var == 0) && (this->currentTunic != PLAYER_TUNIC_GORON)) ||
(((var == 1) || (var == 3)) && (this->currentBoots == PLAYER_BOOTS_IRON) &&
(this->currentTunic != PLAYER_TUNIC_ZORA)))) {
if ((triggerEntry->flag != 0) && !(gSaveContext.envHazardTextTriggerFlags & triggerEntry->flag) &&
(((envHazard == (PLAYER_ENV_HAZARD_HOTROOM - 1)) && (this->currentTunic != PLAYER_TUNIC_GORON)) ||
(((envHazard == (PLAYER_ENV_HAZARD_UNDERWATER_FLOOR - 1)) ||
(envHazard == (PLAYER_ENV_HAZARD_UNDERWATER_FREE - 1))) &&
(this->currentBoots == PLAYER_BOOTS_IRON) && (this->currentTunic != PLAYER_TUNIC_ZORA)))) {
Message_StartTextbox(play, triggerEntry->textId, NULL);
gSaveContext.textTriggerFlags |= triggerEntry->flag;
gSaveContext.envHazardTextTriggerFlags |= triggerEntry->flag;
}
}
return var + 1;
return envHazard + 1;
}
u8 sEyeMouthIndices[][2] = {
@ -1450,7 +1452,7 @@ void Player_PostLimbDrawGameplay(PlayState* play, s32 limbIndex, Gfx** dList, Ve
Math_Vec3f_Copy(&this->leftHandPos, sCurBodyPartPos);
if (this->itemAction == PLAYER_IA_STICK) {
if (this->itemAction == PLAYER_IA_DEKU_STICK) {
Vec3f sp124[3];
OPEN_DISPS(play->state.gfxCtx, "../z_player_lib.c", 2633);

View file

@ -138,8 +138,8 @@ static ItemEquips sNewSaveEquips = {
static Inventory sNewSaveInventory = {
// items
{
ITEM_NONE, // SLOT_STICK
ITEM_NONE, // SLOT_NUT
ITEM_NONE, // SLOT_DEKU_STICK
ITEM_NONE, // SLOT_DEKU_NUT
ITEM_NONE, // SLOT_BOMB
ITEM_NONE, // SLOT_BOW
ITEM_NONE, // SLOT_ARROW_FIRE
@ -151,8 +151,8 @@ static Inventory sNewSaveInventory = {
ITEM_NONE, // SLOT_ARROW_ICE
ITEM_NONE, // SLOT_FARORES_WIND
ITEM_NONE, // SLOT_BOOMERANG
ITEM_NONE, // SLOT_LENS
ITEM_NONE, // SLOT_BEAN
ITEM_NONE, // SLOT_LENS_OF_TRUTH
ITEM_NONE, // SLOT_MAGIC_BEAN
ITEM_NONE, // SLOT_HAMMER
ITEM_NONE, // SLOT_ARROW_LIGHT
ITEM_NONE, // SLOT_NAYRUS_LOVE
@ -165,8 +165,8 @@ static Inventory sNewSaveInventory = {
},
// ammo
{
0, // SLOT_STICK
0, // SLOT_NUT
0, // SLOT_DEKU_STICK
0, // SLOT_DEKU_NUT
0, // SLOT_BOMB
0, // SLOT_BOW
0, // SLOT_ARROW_FIRE
@ -178,8 +178,8 @@ static Inventory sNewSaveInventory = {
0, // SLOT_ARROW_ICE
0, // SLOT_FARORES_WIND
0, // SLOT_BOOMERANG
0, // SLOT_LENS
0, // SLOT_BEAN
0, // SLOT_LENS_OF_TRUTH
0, // SLOT_MAGIC_BEAN
0, // SLOT_HAMMER
},
// equipment
@ -268,35 +268,35 @@ static ItemEquips sDebugSaveEquips = {
static Inventory sDebugSaveInventory = {
// items
{
ITEM_STICK, // SLOT_STICK
ITEM_NUT, // SLOT_NUT
ITEM_BOMB, // SLOT_BOMB
ITEM_BOW, // SLOT_BOW
ITEM_ARROW_FIRE, // SLOT_ARROW_FIRE
ITEM_DINS_FIRE, // SLOT_DINS_FIRE
ITEM_SLINGSHOT, // SLOT_SLINGSHOT
ITEM_OCARINA_FAIRY, // SLOT_OCARINA
ITEM_BOMBCHU, // SLOT_BOMBCHU
ITEM_HOOKSHOT, // SLOT_HOOKSHOT
ITEM_ARROW_ICE, // SLOT_ARROW_ICE
ITEM_FARORES_WIND, // SLOT_FARORES_WIND
ITEM_BOOMERANG, // SLOT_BOOMERANG
ITEM_LENS, // SLOT_LENS
ITEM_BEAN, // SLOT_BEAN
ITEM_HAMMER, // SLOT_HAMMER
ITEM_ARROW_LIGHT, // SLOT_ARROW_LIGHT
ITEM_NAYRUS_LOVE, // SLOT_NAYRUS_LOVE
ITEM_BOTTLE, // SLOT_BOTTLE_1
ITEM_POTION_RED, // SLOT_BOTTLE_2
ITEM_POTION_GREEN, // SLOT_BOTTLE_3
ITEM_POTION_BLUE, // SLOT_BOTTLE_4
ITEM_POCKET_EGG, // SLOT_TRADE_ADULT
ITEM_WEIRD_EGG, // SLOT_TRADE_CHILD
ITEM_DEKU_STICK, // SLOT_DEKU_STICK
ITEM_DEKU_NUT, // SLOT_DEKU_NUT
ITEM_BOMB, // SLOT_BOMB
ITEM_BOW, // SLOT_BOW
ITEM_ARROW_FIRE, // SLOT_ARROW_FIRE
ITEM_DINS_FIRE, // SLOT_DINS_FIRE
ITEM_SLINGSHOT, // SLOT_SLINGSHOT
ITEM_OCARINA_FAIRY, // SLOT_OCARINA
ITEM_BOMBCHU, // SLOT_BOMBCHU
ITEM_HOOKSHOT, // SLOT_HOOKSHOT
ITEM_ARROW_ICE, // SLOT_ARROW_ICE
ITEM_FARORES_WIND, // SLOT_FARORES_WIND
ITEM_BOOMERANG, // SLOT_BOOMERANG
ITEM_LENS_OF_TRUTH, // SLOT_LENS_OF_TRUTH
ITEM_MAGIC_BEAN, // SLOT_MAGIC_BEAN
ITEM_HAMMER, // SLOT_HAMMER
ITEM_ARROW_LIGHT, // SLOT_ARROW_LIGHT
ITEM_NAYRUS_LOVE, // SLOT_NAYRUS_LOVE
ITEM_BOTTLE_EMPTY, // SLOT_BOTTLE_1
ITEM_BOTTLE_POTION_RED, // SLOT_BOTTLE_2
ITEM_BOTTLE_POTION_GREEN, // SLOT_BOTTLE_3
ITEM_BOTTLE_POTION_BLUE, // SLOT_BOTTLE_4
ITEM_POCKET_EGG, // SLOT_TRADE_ADULT
ITEM_WEIRD_EGG, // SLOT_TRADE_CHILD
},
// ammo
{
50, // SLOT_STICK
50, // SLOT_NUT
50, // SLOT_DEKU_STICK
50, // SLOT_DEKU_NUT
10, // SLOT_BOMB
30, // SLOT_BOW
1, // SLOT_ARROW_FIRE
@ -308,8 +308,8 @@ static Inventory sDebugSaveInventory = {
1, // SLOT_ARROW_ICE
1, // SLOT_FARORES_WIND
1, // SLOT_BOOMERANG
1, // SLOT_LENS
1, // SLOT_BEAN
1, // SLOT_LENS_OF_TRUTH
1, // SLOT_MAGIC_BEAN
1 // SLOT_HAMMER
},
// equipment
@ -534,10 +534,10 @@ void Sram_OpenSave(SramContext* sramCtx) {
i = gSaveContext.eventChkInf[EVENTCHKINF_40_INDEX] & ~EVENTCHKINF_40_MASK;
gSaveContext.eventChkInf[EVENTCHKINF_40_INDEX] = i;
INV_CONTENT(ITEM_LETTER_ZELDA) = ITEM_CHICKEN;
INV_CONTENT(ITEM_ZELDAS_LETTER) = ITEM_CHICKEN;
for (j = 1; j < 4; j++) {
if (gSaveContext.equips.buttonItems[j] == ITEM_LETTER_ZELDA) {
if (gSaveContext.equips.buttonItems[j] == ITEM_ZELDAS_LETTER) {
gSaveContext.equips.buttonItems[j] = ITEM_CHICKEN;
}
}