Entrance splits for unique cases. Placeholder for new gameComplete Timestamp (wip). Clean up
This commit is contained in:
parent
5e9d9fb78f
commit
45fc800c57
|
@ -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:
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
});
|
||||
}
|
|
@ -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
|
||||
};
|
Loading…
Reference in New Issue