bugfix and add to value viewer

This commit is contained in:
inspectredc 2024-01-09 17:59:28 +00:00
parent b62231a3ca
commit 0afb36d416
5 changed files with 52 additions and 39 deletions

View File

@ -1,5 +1,6 @@
#include "valueViewer.h" #include "valueViewer.h"
#include "../../UIWidgets.hpp" #include "../../UIWidgets.hpp"
#include "soh/Enhancements/stairs.h"
extern "C" { extern "C" {
#include <z64.h> #include <z64.h>
@ -14,26 +15,33 @@ s32 GfxPrint_Printf(GfxPrint* printer, const char* fmt, ...);
ImVec4 WHITE = ImVec4(1.0f, 1.0f, 1.0f, 1.0f); ImVec4 WHITE = ImVec4(1.0f, 1.0f, 1.0f, 1.0f);
static u32 stairsOutMaxFree;
static u32 stairsOutFree;
static u32 stairsOutAlloc;
std::vector<ValueTableElement> valueTable = { std::vector<ValueTableElement> valueTable = {
{ "Time", "gSaveContext.dayTime", "TIME:", TYPE_U16, false, []() -> void* { return &gSaveContext.dayTime; }, WHITE }, { "Time", "gSaveContext.dayTime", "TIME:", TYPE_U16, false, []() -> void* { return &gSaveContext.dayTime; }, WHITE },
{ "Age", "gSaveContext.linkAge", "AGE:", TYPE_S32, false, []() -> void* { return &gSaveContext.linkAge; }, WHITE }, { "Age", "gSaveContext.linkAge", "AGE:", TYPE_S32, false, []() -> void* { return &gSaveContext.linkAge; }, WHITE },
{ "Health", "gSaveContext.health", "HP:", TYPE_S16, false, []() -> void* { return &gSaveContext.health; }, WHITE }, { "Health", "gSaveContext.health", "HP:", TYPE_S16, false, []() -> void* { return &gSaveContext.health; }, WHITE },
{ "Navi Timer", "gSaveContext.naviTimer", "NAVI:", TYPE_U16, false, []() -> void* { return &gSaveContext.naviTimer; }, WHITE }, { "Navi Timer", "gSaveContext.naviTimer", "NAVI:", TYPE_U16, false, []() -> void* { return &gSaveContext.naviTimer; }, WHITE },
{ "Scene ID", "play->sceneNum", "SCENE:", TYPE_S16, true, []() -> void* { return &gPlayState->sceneNum; }, WHITE }, { "Scene ID", "play->sceneNum", "SCENE:", TYPE_S16, true, []() -> void* { return &gPlayState->sceneNum; }, WHITE },
{ "Room ID", "play->roomCtx.curRoom.num", "ROOM:", TYPE_S8, true, []() -> void* { return &gPlayState->roomCtx.curRoom.num; }, WHITE }, { "Room ID", "play->roomCtx.curRoom.num", "ROOM:", TYPE_S8, true, []() -> void* { return &gPlayState->roomCtx.curRoom.num; }, WHITE },
{ "Entrance ID", "gSaveContext.entranceIndex", "ENTR:", TYPE_S32, false, []() -> void* { return &gSaveContext.entranceIndex; }, WHITE }, { "Entrance ID", "gSaveContext.entranceIndex", "ENTR:", TYPE_S32, false, []() -> void* { return &gSaveContext.entranceIndex; }, WHITE },
{ "Cutscene ID", "gSaveContext.cutsceneIndex", "CUTS:", TYPE_S32, false, []() -> void* { return &gSaveContext.cutsceneIndex; }, WHITE }, { "Cutscene ID", "gSaveContext.cutsceneIndex", "CUTS:", TYPE_S32, false, []() -> void* { return &gSaveContext.cutsceneIndex; }, WHITE },
{ "Link X", "Player->actor.world.pos.x", "X:", TYPE_FLOAT, true, []() -> void* { return &GET_PLAYER(gPlayState)->actor.world.pos.x; }, WHITE }, { "Link X", "Player->actor.world.pos.x", "X:", TYPE_FLOAT, true, []() -> void* { return &GET_PLAYER(gPlayState)->actor.world.pos.x; }, WHITE },
{ "Link Y", "Player->actor.world.pos.y", "Y:", TYPE_FLOAT, true, []() -> void* { return &GET_PLAYER(gPlayState)->actor.world.pos.y; }, WHITE }, { "Link Y", "Player->actor.world.pos.y", "Y:", TYPE_FLOAT, true, []() -> void* { return &GET_PLAYER(gPlayState)->actor.world.pos.y; }, WHITE },
{ "Link Z", "Player->actor.world.pos.z", "Z:", TYPE_FLOAT, true, []() -> void* { return &GET_PLAYER(gPlayState)->actor.world.pos.z; }, WHITE }, { "Link Z", "Player->actor.world.pos.z", "Z:", TYPE_FLOAT, true, []() -> void* { return &GET_PLAYER(gPlayState)->actor.world.pos.z; }, WHITE },
{ "Link Yaw", "Player->actor.world.rot.y", "ROT:", TYPE_S16, true, []() -> void* { return &GET_PLAYER(gPlayState)->actor.world.rot.y; }, WHITE }, { "Link Yaw", "Player->actor.world.rot.y", "ROT:", TYPE_S16, true, []() -> void* { return &GET_PLAYER(gPlayState)->actor.world.rot.y; }, WHITE },
{ "Link Velocity", "Player->linearVelocity", "V:", TYPE_FLOAT, true, []() -> void* { return &GET_PLAYER(gPlayState)->linearVelocity; }, WHITE }, { "Link Velocity", "Player->linearVelocity", "V:", TYPE_FLOAT, true, []() -> void* { return &GET_PLAYER(gPlayState)->linearVelocity; }, WHITE },
{ "Link X Velocity", "Player->actor.velocity.x", "XV:", TYPE_FLOAT, true, []() -> void* { return &GET_PLAYER(gPlayState)->actor.velocity.x; }, WHITE }, { "Link X Velocity", "Player->actor.velocity.x", "XV:", TYPE_FLOAT, true, []() -> void* { return &GET_PLAYER(gPlayState)->actor.velocity.x; }, WHITE },
{ "Link Y Velocity", "Player->actor.velocity.y", "YV:", TYPE_FLOAT, true, []() -> void* { return &GET_PLAYER(gPlayState)->actor.velocity.y; }, WHITE }, { "Link Y Velocity", "Player->actor.velocity.y", "YV:", TYPE_FLOAT, true, []() -> void* { return &GET_PLAYER(gPlayState)->actor.velocity.y; }, WHITE },
{ "Link Z Velocity", "Player->actor.velocity.z", "ZV:", TYPE_FLOAT, true, []() -> void* { return &GET_PLAYER(gPlayState)->actor.velocity.z; }, WHITE }, { "Link Z Velocity", "Player->actor.velocity.z", "ZV:", TYPE_FLOAT, true, []() -> void* { return &GET_PLAYER(gPlayState)->actor.velocity.z; }, WHITE },
{ "Text ID", "play->msgCtx.textId", "TEXTID:", TYPE_U16, true, []() -> void* { return &gPlayState->msgCtx.textId; }, WHITE }, { "Text ID", "play->msgCtx.textId", "TEXTID:", TYPE_U16, true, []() -> void* { return &gPlayState->msgCtx.textId; }, WHITE },
{ "Analog Stick X", "play->state.input->cur.stick_x", "AX:", TYPE_S8, true, []() -> void* { return &gPlayState->state.input->cur.stick_x; }, WHITE }, { "Analog Stick X", "play->state.input->cur.stick_x", "AX:", TYPE_S8, true, []() -> void* { return &gPlayState->state.input->cur.stick_x; }, WHITE },
{ "Analog Stick Y", "play->state.input->cur.stick_y", "AY:", TYPE_S8, true, []() -> void* { return &gPlayState->state.input->cur.stick_y; }, WHITE }, { "Analog Stick Y", "play->state.input->cur.stick_y", "AY:", TYPE_S8, true, []() -> void* { return &gPlayState->state.input->cur.stick_y; }, WHITE },
{ "Stairs: outMaxFree", "", "STAIR-OM:", TYPE_U32, true, []() -> void* { StairsArena_GetSizes(&stairsOutMaxFree, &stairsOutFree, &stairsOutAlloc); return &stairsOutMaxFree; }, WHITE },
{ "Stairs: outFree", "", "STAIR-OF:", TYPE_U32, true, []() -> void* { StairsArena_GetSizes(&stairsOutMaxFree, &stairsOutFree, &stairsOutAlloc); return &stairsOutFree; }, WHITE },
{ "Stairs: outAlloc", "", "STAIR-OA:", TYPE_U32, true, []() -> void* { StairsArena_GetSizes(&stairsOutMaxFree, &stairsOutFree, &stairsOutAlloc); return &stairsOutAlloc; }, WHITE },
/* TODO: Find these (from GZ) /* TODO: Find these (from GZ)
"XZ Units Traveled (Camera based speed variable)" f32 0x801C9018 "XZ Units Traveled (Camera based speed variable)" f32 0x801C9018
"Movement Angle" x16 0x801DBB1C "Movement Angle" x16 0x801DBB1C

View File

@ -14,6 +14,7 @@ extern "C" {
#include <libultraship/bridge.h> #include <libultraship/bridge.h>
#include <libultraship/libultraship.h> #include <libultraship/libultraship.h>
#include "soh/Enhancements/enhancementTypes.h" #include "soh/Enhancements/enhancementTypes.h"
#include "soh/Enhancements/stairs.h"
extern "C" { extern "C" {
#include <z64.h> #include <z64.h>

View File

@ -457,7 +457,7 @@ std::unordered_map<u16, size_t> actorOverlaySizes = {
std::unordered_set<u16> registeredStairOverlays; std::unordered_set<u16> registeredStairOverlays;
std::unordered_map<uintptr_t, void*> generalPtrMap; std::unordered_map<uintptr_t, void*> generalPtrMap;
std::unordered_map<u16, void*> actorPtrMap; std::unordered_map<u16, void*> overlayRPtrMap;
std::unordered_map<u16, void*> overlayPtrMap; std::unordered_map<u16, void*> overlayPtrMap;
std::unordered_map<u16, void*> mallocRPtrMap; std::unordered_map<u16, void*> mallocRPtrMap;
@ -482,6 +482,10 @@ s32 Stairs_RegisterOverlay(u16 id) {
return true; return true;
} }
s32 Stairs_GetOverlayRegistered(u16 id) {
return registeredStairOverlays.contains(id);
}
s32 Stairs_UnregisterOverlay(u16 id) { s32 Stairs_UnregisterOverlay(u16 id) {
if (registeredStairOverlays.contains(id)) { if (registeredStairOverlays.contains(id)) {
registeredStairOverlays.erase(id); registeredStairOverlays.erase(id);
@ -537,9 +541,9 @@ void* StairsArena_MallocGeneral(size_t size, uintptr_t id) {
return ptr; return ptr;
} }
void* StairsArena_MallocActor(size_t size, u16 id) { void* StairsArena_MallocROverlay(size_t size, u16 id) {
void* ptr = __osMalloc(&sStairsArena, size); void* ptr = __osMallocR(&sStairsArena, size);
actorPtrMap[id] = ptr; overlayRPtrMap[id] = ptr;
// StairsArena_CheckPointer(ptr, size, "stairs_malloc", "確保"); // "Secure" // StairsArena_CheckPointer(ptr, size, "stairs_malloc", "確保"); // "Secure"
return ptr; return ptr;
@ -560,7 +564,7 @@ void* StairsArena_MallocR(size_t size) {
return ptr; return ptr;
} }
void* StairsArena_MallocRGeneral(size_t size, u16 id) { void* StairsArena_MallocRGeneral(size_t size, uintptr_t id) {
void* ptr = __osMallocR(&sStairsArena, size); void* ptr = __osMallocR(&sStairsArena, size);
mallocRPtrMap[id] = ptr; mallocRPtrMap[id] = ptr;
@ -593,12 +597,12 @@ void StairsArena_FreeGeneral(uintptr_t id) {
generalPtrMap[id] = nullptr; generalPtrMap[id] = nullptr;
} }
void StairsArena_FreeActor(u16 id) { void StairsArena_FreeMallocROverlay(u16 id) {
void* ptr = actorPtrMap[id]; void* ptr = overlayRPtrMap[id];
if (ptr) { if (ptr) {
__osFree(&sStairsArena, ptr); __osFree(&sStairsArena, ptr);
} }
actorPtrMap[id] = nullptr; overlayRPtrMap[id] = nullptr;
} }
void StairsArena_FreeOverlay(u16 id) { void StairsArena_FreeOverlay(u16 id) {
@ -656,7 +660,7 @@ void StairsArena_Cleanup() {
__osMallocCleanup(&sStairsArena); __osMallocCleanup(&sStairsArena);
registeredStairOverlays.clear(); registeredStairOverlays.clear();
generalPtrMap.clear(); generalPtrMap.clear();
actorPtrMap.clear(); overlayRPtrMap.clear();
overlayPtrMap.clear(); overlayPtrMap.clear();
mallocRPtrMap.clear(); mallocRPtrMap.clear();
absolutePtr = nullptr; absolutePtr = nullptr;

View File

@ -18,6 +18,7 @@ extern "C" {
u16 Stairs_GetAllocType(u16 id); u16 Stairs_GetAllocType(u16 id);
s32 Stairs_RegisterOverlay(u16 id); s32 Stairs_RegisterOverlay(u16 id);
s32 Stairs_GetOverlayRegistered(u16 id);
s32 Stairs_UnregisterOverlay(u16 id); s32 Stairs_UnregisterOverlay(u16 id);
s32 Stairs_RegisterAbsoluteSpace(); s32 Stairs_RegisterAbsoluteSpace();
s32 Stairs_GetAbsoluteSpace(); s32 Stairs_GetAbsoluteSpace();
@ -40,12 +41,12 @@ void StairsArena_Cleanup();
u8 StairsArena_IsInitalized(); u8 StairsArena_IsInitalized();
void* StairsArena_MallocGeneral(size_t size, uintptr_t id); void* StairsArena_MallocGeneral(size_t size, uintptr_t id);
void* StairsArena_MallocActor(size_t size, u16 id); void* StairsArena_MallocROverlay(size_t size, u16 id);
void* StairsArena_MallocOverlay(size_t size, u16 id); void* StairsArena_MallocOverlay(size_t size, u16 id);
void* StairsArena_MallocRGeneral(size_t size, u16 id); void* StairsArena_MallocRGeneral(size_t size, uintptr_t id);
void* StairsArena_MallocRAbsolute(size_t size); void* StairsArena_MallocRAbsolute(size_t size);
void StairsArena_FreeGeneral(uintptr_t id); void StairsArena_FreeGeneral(uintptr_t id);
void StairsArena_FreeActor(u16 id); void StairsArena_FreeMallocROverlay(u16 id);
void StairsArena_FreeOverlay(u16 id); void StairsArena_FreeOverlay(u16 id);
void StairsArena_FreeMallocR(u16 id); void StairsArena_FreeMallocR(u16 id);
void StairsArena_FreeAbsolute(); void StairsArena_FreeAbsolute();

View File

@ -3147,7 +3147,7 @@ void Actor_FreeOverlay(ActorDBEntry* dbEntry) {
} }
if (CVarGetInteger("gStairs", 1)) { if (CVarGetInteger("gStairs", 1)) {
if (!Stairs_RegisterOverlay(dbEntry->id)) { if (Stairs_GetOverlayRegistered(dbEntry->id)) {
u16 allocType = Stairs_GetAllocType(dbEntry->id); u16 allocType = Stairs_GetAllocType(dbEntry->id);
if (allocType & STAIRS_ACTOROVL_ALLOC_PERSISTENT) { if (allocType & STAIRS_ACTOROVL_ALLOC_PERSISTENT) {
@ -3213,10 +3213,10 @@ Actor* Actor_Spawn(ActorContext* actorCtx, PlayState* play, s16 actorId, f32 pos
} else if (allocType & STAIRS_ACTOROVL_ALLOC_ABSOLUTE) { } else if (allocType & STAIRS_ACTOROVL_ALLOC_ABSOLUTE) {
if (Stairs_RegisterAbsoluteSpace()) { if (Stairs_RegisterAbsoluteSpace()) {
StairsArena_MallocRAbsolute(overlaySize); StairsArena_MallocRAbsolute(STAIRS_ACTOROVL_ABSOLUTE_SPACE_SIZE);
} }
} else if (allocType & STAIRS_ACTOROVL_ALLOC_PERSISTENT) { } else if (allocType & STAIRS_ACTOROVL_ALLOC_PERSISTENT) {
StairsArena_MallocRGeneral(overlaySize, dbEntry->id); StairsArena_MallocROverlay(overlaySize, dbEntry->id);
} else { } else {
StairsArena_MallocOverlay(overlaySize, dbEntry->id); StairsArena_MallocOverlay(overlaySize, dbEntry->id);
} }
@ -3249,10 +3249,9 @@ Actor* Actor_Spawn(ActorContext* actorCtx, PlayState* play, s16 actorId, f32 pos
} }
if ((CVarGetInteger("gStairs", 1))) { if ((CVarGetInteger("gStairs", 1))) {
Actor* ptr = StairsArena_MallocGeneral(dbEntry->instanceSize, (uintptr_t)actor); if (StairsArena_MallocGeneral(dbEntry->instanceSize, (uintptr_t)actor) == NULL) {
if (ptr == NULL) { // Actor_FreeOverlay(dbEntry);
Actor_FreeOverlay(dbEntry); // actor = NULL;
actor = NULL;
return NULL; return NULL;
} }
} }
@ -3399,7 +3398,7 @@ Actor* Actor_Delete(ActorContext* actorCtx, Actor* actor, PlayState* play) {
newHead = Actor_RemoveFromCategory(play, actorCtx, actor); newHead = Actor_RemoveFromCategory(play, actorCtx, actor);
if (CVarGetInteger("gStairs", 1)) { if (CVarGetInteger("gStairs", 1)) {
StairsArena_FreeActor((uintptr_t)actor); StairsArena_FreeGeneral((uintptr_t)actor);
} }
ZELDA_ARENA_FREE_DEBUG(actor); ZELDA_ARENA_FREE_DEBUG(actor);