Entrance splits for unique cases. Placeholder for new gameComplete Timestamp (wip). Clean up

This commit is contained in:
Caladius 2024-03-07 13:07:54 -05:00
parent 5e9d9fb78f
commit 45fc800c57
4 changed files with 139 additions and 100 deletions

View File

@ -242,7 +242,7 @@ const char* const countMappings[] = {
#define COLOR_LIGHT_BLUE ImVec4(0.00f, 0.88f, 1.00f, 1.00f)
#define COLOR_GREY ImVec4(0.78f, 0.78f, 0.78f, 1.00f)
char itemTimestampDisplayName[TIMESTAMP_MAX][21] = { "" };
char itemTimestampDisplayName[TIMESTAMP_MAX][23] = { "" };
ImVec4 itemTimestampDisplayColor[TIMESTAMP_MAX];
typedef struct {
@ -786,6 +786,7 @@ void SetupDisplayNames() {
strcpy(itemTimestampDisplayName[TIMESTAMP_BOSSRUSH_FINISH], "Boss Rush Finished: ");
strcpy(itemTimestampDisplayName[TIMESTAMP_FOUND_GREG], "Greg Found: ");
strcpy(itemTimestampDisplayName[TIMESTAMP_TRIFORCE_COMPLETED], "Triforce Completed: ");
strcpy(itemTimestampDisplayName[TIMESTAMP_TIMESPLIT_COMPLETED], "Time Split Completed: ");
}
void SetupDisplayColors() {
@ -833,6 +834,7 @@ void SetupDisplayColors() {
case TIMESTAMP_DEFEAT_GANONDORF:
case TIMESTAMP_DEFEAT_GANON:
case TIMESTAMP_TRIFORCE_COMPLETED:
case TIMESTAMP_TIMESPLIT_COMPLETED:
itemTimestampDisplayColor[i] = COLOR_YELLOW;
break;
case ITEM_SONG_STORMS:

View File

@ -36,7 +36,8 @@ typedef enum {
/* 0xA9 */ TIMESTAMP_BOSSRUSH_FINISH, // z_boss_ganon2.c
/* 0xAA */ TIMESTAMP_FOUND_GREG, // z_parameter.c
/* 0xAA */ TIMESTAMP_TRIFORCE_COMPLETED, // z_parameter.c
/* 0xAB */ TIMESTAMP_MAX
/* 0xAB */ TIMESTAMP_TIMESPLIT_COMPLETED, // TimeSplits.cpp
/* 0xAC */ TIMESTAMP_MAX
}GameplayStatTimestamp;

View File

@ -199,6 +199,8 @@ std::vector<TimeSplitObject> splitObjects = {
{ ENTER_INSIDE_GANONS_CASTLE, "Enter Ganons Castle", "SPECIAL_TRIFORCE_PIECE_WHITE"},
{ ENTER_GANONS_TOWER_COLLAPSE_INTERIOR, "Enter Tower Collapse Interior", "SPECIAL_TRIFORCE_PIECE_WHITE"},
{ ENTER_INSIDE_GANONS_CASTLE_COLLAPSE, "Enter Ganons Castle Collapse", "SPECIAL_TRIFORCE_PIECE_WHITE"},
{ ESCAPE_LOST_WOODS, "Lost Woods Escape", "SPECIAL_TRIFORCE_PIECE_WHITE"},
{ ESCAPE_KOKIRI_FOREST, "Forest Escape", "SPECIAL_TRIFORCE_PIECE_WHITE"},
};
std::vector<TimeSplitObject> equipmentObjects = {
@ -300,6 +302,8 @@ std::vector<TimeSplitObject> sceneObjects = {
{ ENTER_INSIDE_GANONS_CASTLE, "Enter Ganons Castle", "SPECIAL_TRIFORCE_PIECE_WHITE"},
{ ENTER_GANONS_TOWER_COLLAPSE_INTERIOR, "Enter Tower Collapse Interior", "SPECIAL_TRIFORCE_PIECE_WHITE"},
{ ENTER_INSIDE_GANONS_CASTLE_COLLAPSE, "Enter Ganons Castle Collapse", "SPECIAL_TRIFORCE_PIECE_WHITE"},
{ ESCAPE_LOST_WOODS, "Lost Woods Escape", "SPECIAL_TRIFORCE_PIECE_WHITE"},
{ ESCAPE_KOKIRI_FOREST, "Forest Escape", "SPECIAL_TRIFORCE_PIECE_WHITE"},
};
std::string formatTimestampTimeSplit(uint32_t value) {
@ -311,6 +315,11 @@ std::string formatTimestampTimeSplit(uint32_t value) {
return fmt::format("{}:{:0>2}:{:0>2}.{}", hh, mm, ss, ds);
}
void TimeSplitCompleteSplits() {
gSaveContext.sohStats.itemTimestamp[TIMESTAMP_DEFEAT_GANON] = GAMEPLAYSTAT_TOTAL_TIME;
gSaveContext.sohStats.gameComplete = true;
}
void TimeSplitSplitsHandlerS(uint32_t itemID) {
uint32_t loopCounter = 0;
for (auto& str : splitItem) {
@ -325,8 +334,7 @@ void TimeSplitSplitsHandlerS(uint32_t itemID) {
splitBest[loopCounter] = splitTime[loopCounter];
}
if (loopCounter == (splitItem.size() - 1)) {
gSaveContext.sohStats.itemTimestamp[TIMESTAMP_DEFEAT_GANON] = GAMEPLAYSTAT_TOTAL_TIME;
gSaveContext.sohStats.gameComplete = true;
TimeSplitCompleteSplits();
}
}
}
@ -334,10 +342,13 @@ void TimeSplitSplitsHandlerS(uint32_t itemID) {
}
}
void TimeSplitSceneSplitHandler(uint32_t sceneNum) {
void TimeSplitSceneSplitHandler(uint32_t entrance) {
uint32_t loopCounter = 0;
for (auto& str : splitItem) {
if (sceneNum == splitItem[loopCounter]) {
if (entrance == ESCAPE_KOKIRI_FOREST && gSaveContext.cutsceneIndex != 0xfff0) {
return;
}
if (entrance == splitItem[loopCounter]) {
if (splitStatus[loopCounter] == 2) {
splitTime[loopCounter] = GAMEPLAYSTAT_TOTAL_TIME;
splitStatus[loopCounter] = 1;
@ -348,8 +359,7 @@ void TimeSplitSceneSplitHandler(uint32_t sceneNum) {
splitBest[loopCounter] = splitTime[loopCounter];
}
if (loopCounter == (splitItem.size() - 1)) {
gSaveContext.sohStats.itemTimestamp[TIMESTAMP_DEFEAT_GANON] = GAMEPLAYSTAT_TOTAL_TIME;
gSaveContext.sohStats.gameComplete = true;
TimeSplitCompleteSplits();
}
}
}
@ -383,8 +393,7 @@ void TimeSplitSplitsHandler(GetItemEntry itemEntry) {
splitBest[loopCounter] = splitTime[loopCounter];
}
if (loopCounter == (splitItem.size() - 1)) {
gSaveContext.sohStats.itemTimestamp[TIMESTAMP_DEFEAT_GANON] = GAMEPLAYSTAT_TOTAL_TIME;
gSaveContext.sohStats.gameComplete = true;
TimeSplitCompleteSplits();
}
}
}
@ -1367,15 +1376,16 @@ void DrawTimeSplitListManager() {
if (ImGui::CollapsingHeader("Scenes")) {
if (ImGui::CollapsingHeader("Dungeon Entrances")) {
ImGui::BeginTable("Scenes", 2);
ImGui::TableSetupColumn("Scene1", ImGuiTableColumnFlags_WidthFixed, (250.0f * uiScale));
ImGui::TableSetupColumn("Scene2", ImGuiTableColumnFlags_WidthFixed, (250.0f * uiScale));
ImGui::BeginTable("Dungeons", 2);
ImGui::TableSetupColumn("Dungeon1", ImGuiTableColumnFlags_WidthFixed, (250.0f * uiScale));
ImGui::TableSetupColumn("Dungeon2", ImGuiTableColumnFlags_WidthFixed, (250.0f * uiScale));
ImGui::TableNextColumn();
for (const auto& obj : sceneObjects) {
if (sceneID == 8) {
ImGui::TableNextColumn();
}
if (obj.itemID >= ENTER_DEKU_TREE) {
itemNum = obj.itemID;
//TimeSplitColorTint();
if (ImGui::ImageButton(std::to_string(sceneID).c_str(),
@ -1390,6 +1400,31 @@ void DrawTimeSplitListManager() {
ImGui::PopStyleVar(1);
sceneID++;
}
}
ImGui::EndTable();
}
if (ImGui::CollapsingHeader("Overworld Entrances")) {
ImGui::BeginTable("Overworld", 1);
ImGui::TableSetupColumn("Overworld1", ImGuiTableColumnFlags_WidthFixed, (250.0f * uiScale));
ImGui::TableNextColumn();
for (const auto& obj : sceneObjects) {
if (obj.itemID < ENTER_DEKU_TREE) {
itemNum = obj.itemID;
//TimeSplitColorTint();
if (ImGui::ImageButton(std::to_string(sceneID).c_str(),
LUS::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(obj.itemImage),
ImVec2(32.0f * uiScale, 32.0f * uiScale), ImVec2(0, 0), ImVec2(1, 1), ImVec4(0, 0, 0, 0), ImVec4(1, 1, 1, 1))) {
TimeSplitAddToSplits(obj.itemID);
}
ImGui::SameLine();
ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0.0f, 5.0f));
ImGui::AlignTextToFramePadding();
ImGui::Text(obj.itemName);
ImGui::PopStyleVar(1);
sceneID++;
}
}
ImGui::EndTable();
}
}
@ -1432,7 +1467,7 @@ void TimeSplitWindow::InitElement() {
GameInteractor::Instance->RegisterGameHook<GameInteractor::OnItemReceive>([](GetItemEntry itemEntry) {
TimeSplitSplitsHandler(itemEntry);
});
GameInteractor::Instance->RegisterGameHook<GameInteractor::OnSceneInit>([](int16_t sceneNum) {
TimeSplitSceneSplitHandler(gPlayState->sceneNum + 667);
GameInteractor::Instance->RegisterGameHook<GameInteractor::OnSceneSpawnActors>([]() {
TimeSplitSceneSplitHandler(gSaveContext.entranceIndex);
});
}

View File

@ -36,8 +36,7 @@ typedef struct {
} TimeSplitObject;
typedef enum {
START_VALUE = 656,
BOSS_QUEEN_GOHMA,
BOSS_QUEEN_GOHMA = 657,
BOSS_KING_DODONGO,
BOSS_BARINADE,
BOSS_PHANTOM_GANON,
@ -66,4 +65,6 @@ typedef enum {
ENTER_INSIDE_GANONS_CASTLE,
ENTER_GANONS_TOWER_COLLAPSE_INTERIOR,
ENTER_INSIDE_GANONS_CASTLE_COLLAPSE,
ESCAPE_KOKIRI_FOREST = 286,
ESCAPE_LOST_WOODS = 477
};