Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 16 additions & 1 deletion src/port/Rando/CheckTracker/CheckTracker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -76,10 +76,13 @@ std::vector<std::tuple<const char*, Color_RGBA8, const char*>> defaultCheckColor
{ CVAR_NAME_ITEM_COLOR, DEFAULT_ITEM_COLOR, "Obtained Item" },
};

std::map<RandoCheckId, std::string> checkNames;

Rando::StaticData::RandoLogicData reachableRegions[RR_MAX];
Rando::StaticData::RandoLogicData reachableEvents[RA_MAX];
Rando::StaticData::RandoLogicData reachableChecks[RC_MAX];

bool isCheckTrackerInitialized = false;
bool checkTrackerPopoutState = false;
ImVec4 checkTrackerBG = ImVec4{ 0, 0, 0, 0.5f };
ImVec4 collectedChecksBG = ImVec4{ 0, 0, 0, 0.5f };
Expand Down Expand Up @@ -113,6 +116,13 @@ std::string GetTotalCheckCount() {
return totalChecks;
}

void CreateCheckStringList() {
checkNames.clear();
for (auto& entry : Rando::Logic::shuffledPool) {
checkNames.insert({ entry.randoCheckId, Ship_ConvertEnumToReadableName(entry.name) });
}
}

void UpdateWorldCheckCount(level_e world) {
worldCollected = 0;
worldTotalShuffled = 0;
Expand Down Expand Up @@ -165,6 +175,11 @@ void DrawCheckTrackerList() {
return;
}

if (!isCheckTrackerInitialized) {
CreateCheckStringList();
isCheckTrackerInitialized = true;
}

if (CVAR_SHOW_COLLECTED_CHECKS && !CVAR_SHOW_SEPARATE_COLLECTED_CHECKS) {
DrawCheckTrackerCount();
}
Expand Down Expand Up @@ -228,7 +243,7 @@ void DrawCheckTrackerList() {
}

ImGui::BeginGroup();
ImGui::TextColored(checkTextColor, Ship_ConvertEnumToReadableName(entry.name).c_str());
ImGui::TextColored(checkTextColor, checkNames.at(entry.randoCheckId).c_str());
if (entry.obtained) {
ImGui::SameLine();
RandoItemId randoItemId = Rando::Logic::GetShuffledObject(entry.randoCheckId).randoItemId;
Expand Down
2 changes: 2 additions & 0 deletions src/port/Rando/CheckTracker/CheckTracker.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
#include "port/Rando/Rando.h"
#include <ship/window/gui/GuiWindow.h>

extern bool isCheckTrackerInitialized;

namespace Rando {

namespace CheckTracker {
Expand Down
71 changes: 36 additions & 35 deletions src/port/Rando/CustomObject/CustomObject.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ extern ActorInfo chJiggy;
extern ActorInfo D_80366C80;
extern ActorInfo D_803685A0;
extern ActorInfo sumusicNote;
extern ActorInfo chExtraLife;

extern ActorInfo D_80366CA4;
extern ActorInfo D_80367D00;
Expand All @@ -71,6 +72,7 @@ std::map<actor_e, std::pair<ActorInfo, int32_t>> actorInfoMap = {
{ ACTOR_2D_MUMBO_TOKEN, { D_803685A0, ACTOR_FLAG_UNKNOWN_6 } },
{ ACTOR_46_JIGGY, { chJiggy, ACTOR_FLAG_UNKNOWN_6 | ACTOR_FLAG_UNKNOWN_7 | ACTOR_FLAG_UNKNOWN_21 } },
{ ACTOR_47_EMPTY_HONEYCOMB, { D_80366C80, ACTOR_FLAG_UNKNOWN_6 | ACTOR_FLAG_UNKNOWN_21 } },
{ ACTOR_49_EXTRA_LIFE, { chExtraLife, ACTOR_FLAG_UNKNOWN_21 } },
{ ACTOR_51_MUSIC_NOTE, { sumusicNote, ACTOR_FLAG_UNKNOWN_21 } },
{ ACTOR_5E_JINJO_YELLOW, { chJinjoYellow, ACTOR_FLAG_UNKNOWN_6 | ACTOR_FLAG_UNKNOWN_8 } },
{ ACTOR_5F_JINJO_ORANGE, { chJinjoOrange, ACTOR_FLAG_UNKNOWN_6 | ACTOR_FLAG_UNKNOWN_8 } },
Expand Down Expand Up @@ -127,30 +129,31 @@ void CustomObject::RemoveSpawnedIdFromList(RandoCheckId randoCheckId) {
}

Actor* CustomObject::SetCustomActorParametersEX(RandoCheckId randoCheckId, Actor* customActor) {
RandoSaveCheck shuffledObject = Rando::Logic::GetShuffledObject(randoCheckId);
RandoSaveCheck randoSaveCheck = RANDO_SAVE_CHECKS[randoCheckId];
customActor->marker->randoCheckId = randoCheckId;

switch (shuffledObject.randoItemId) {
case RI_EMPTY_HONEYCOMB:
RandoItemType itemType = Rando::StaticData::Items[randoSaveCheck.randoItemId].randoItemType;
switch (itemType) {
case RITYPE_EMPTY_HONEYCOMB:
ActorLocal_EmptyHoneycomb* honeycombLocal;
honeycombLocal = (ActorLocal_EmptyHoneycomb*)&customActor->local;
honeycombLocal->uid = (honeycomb_e)Rando::Logic::GetShuffledObject(randoCheckId).randoCollectionId;
break;
case RI_JIGGY:
case RITYPE_JIGGY:
ActorLocal_Jiggy* jiggyLocal;
jiggyLocal = (ActorLocal_Jiggy*)&customActor->local;
jiggyLocal->index = shuffledObject.randoCollectionId;
jiggyLocal->index = randoSaveCheck.randoCollectionId;
break;
case RI_MUMBO_TOKEN:
case RITYPE_MUMBO_TOKEN:
ActorLocal_MumboToken* tokenLocal;
tokenLocal = (ActorLocal_MumboToken*)&customActor->local;
tokenLocal->uid = (mumbotoken_e)Rando::Logic::GetShuffledObject(randoCheckId).randoCollectionId;
break;
case RI_STOP_N_SWOP_EGG:
case RI_STOP_N_SWOP_KEY:
customActor->actorTypeSpecificField = shuffledObject.randoCollectionId;
case RITYPE_SNS_EGG:
case RITYPE_SNS_KEY:
customActor->actorTypeSpecificField = randoSaveCheck.randoCollectionId;
customActor->scale = 0.5f;
if (shuffledObject.randoItemId == RI_STOP_N_SWOP_KEY) {
if (itemType == RITYPE_SNS_KEY) {
customActor->position_y += 50.0f;
}
break;
Expand Down Expand Up @@ -200,7 +203,7 @@ void CustomObject::FlushRandoSpawnQueue() {
continue;
}

actor_e randoActorId = (actor_e)Rando::StaticData::Items[randoSaveCheck.randoItemId].actorId;
actor_e randoActorId = Rando::StaticData::GetActorIdByRandoItemId(randoSaveCheck.randoItemId);
if (randoSaveCheck.obtained) {
randoActorId = GetRandomJunkActorId(randoSaveCheck);
}
Expand Down Expand Up @@ -268,8 +271,8 @@ Actor* CustomObject::ShouldCreateCustomActorEX(RandoCheckId randoCheckId, int32_
}

void CustomObject::ResolveCustomActorCollisionEX(RandoCheckId randoCheckId) {
RandoSaveCheck shuffledObject = Rando::Logic::GetShuffledObject(randoCheckId);
if (shuffledObject.randoCheckId == RC_UNKNOWN) {
RandoSaveCheck randoSaveCheck = RANDO_SAVE_CHECKS[randoCheckId];
if (randoSaveCheck.randoCheckId == RC_UNKNOWN) {
return;
}

Expand All @@ -282,26 +285,23 @@ void CustomObject::ResolveCustomActorCollisionEX(RandoCheckId randoCheckId) {
spawnPosition[1] = (int32_t)playerPosF[1];
spawnPosition[2] = (int32_t)playerPosF[2];

switch (shuffledObject.randoItemId) {
case RI_JIGGY:
Rando::StaticData::RandoStaticItem randoItem = Rando::StaticData::Items[randoSaveCheck.randoItemId];
RandoItemType itemType = randoItem.randoItemType;
int32_t currentLevel = map_getLevel(gsworld_getMap());

switch (itemType) {
case RITYPE_JIGGY:
if (CVarGetInteger(CVAR_ENHANCEMENT("Cutscenes.SkipJiggyDance"), 0)) {
fxSparkle_musicNote(sparklePos);
}
break;
case RI_JINJO_BLUE:
case RI_JINJO_GREEN:
case RI_JINJO_ORANGE:
case RI_JINJO_PINK:
case RI_JINJO_YELLOW:
if (Rando::StaticData::Checks[shuffledObject.shuffledCheckId].worldId == map_getLevel(gsworld_getMap())) {
int32_t jinjoMarkerId =
GetJinjoActorMarkerId((actor_e)Rando::StaticData::Items[shuffledObject.randoItemId].actorId);
case RITYPE_JINJO:
if (randoItem.worldId == currentLevel) {
int32_t jinjoMarkerId = GetJinjoActorMarkerId((actor_e)randoItem.actorId);
item_adjustByDiffWithHud(ITEM_12_JINJOS, (1 << ((jinjoMarkerId + 6) & 0x1F)));
} else {
if (Rando::Logic::ShouldSpawnJinjoJiggy(
Rando::StaticData::Checks[shuffledObject.shuffledCheckId].worldId)) {
RandoCheckId jiggyCheckId = Rando::StaticData::GetJinjoJiggyCheckByLevelId(
Rando::StaticData::Checks[shuffledObject.shuffledCheckId].worldId);
if (Rando::Logic::ShouldSpawnJinjoJiggy(randoItem.worldId)) {
RandoCheckId jiggyCheckId = Rando::StaticData::GetJinjoJiggyCheckByLevelId(randoItem.worldId);

if (jiggyCheckId != RC_UNKNOWN) {
Actor* customActor = ShouldCreateCustomActorEX(jiggyCheckId, spawnPosition, false);
Expand All @@ -312,18 +312,18 @@ void CustomObject::ResolveCustomActorCollisionEX(RandoCheckId randoCheckId) {
}
}
break;
case RI_MUSIC_NOTE:
D_80385FF0[Rando::StaticData::Checks[shuffledObject.shuffledCheckId].worldId]++;
if (Rando::StaticData::Checks[shuffledObject.shuffledCheckId].worldId == map_getLevel(gsworld_getMap())) {
case RITYPE_MUSIC_NOTE:
D_80385FF0[randoItem.worldId]++;
if (randoItem.worldId == currentLevel) {
item_set(ITEM_C_NOTE, D_80385FF0[map_getLevel(gsworld_getMap())]);
}

UpdateSaveDataNoteScores();
fxSparkle_musicNote(sparklePos);
coMusicPlayer_playMusic(COMUSIC_9_NOTE_COLLECTED, 16000);
break;
case RI_STOP_N_SWOP_EGG:
case RI_STOP_N_SWOP_KEY:
case RITYPE_SNS_EGG:
case RITYPE_SNS_KEY:
if (Rando::Logic::GetTotalSnsItemsCollected() >= 7) {
gcparade_beginFinalParade();
}
Expand Down Expand Up @@ -355,10 +355,11 @@ void CustomObject::ObjectCollectedEX(Prop* prop) {
CustomObject::CheckObtainedEX((RandoCheckId)prop->actorProp.marker->randoCheckId);

if (shouldRemoveEX) {
CustomObject::ResolveCustomActorCollisionEX((RandoCheckId)prop->actorProp.marker->randoCheckId);
RandoSaveCheck randoSaveCheck = RANDO_SAVE_CHECKS[(RandoCheckId)prop->actorProp.marker->randoCheckId];

CustomObject::ResolveCustomActorCollisionEX(randoSaveCheck.randoCheckId);

if (Rando::Logic::GetShuffledObject((RandoCheckId)prop->actorProp.marker->randoCheckId).randoItemId ==
RI_MUSIC_NOTE) {
if (Rando::StaticData::GetActorIdByRandoItemId(randoSaveCheck.randoItemId) == ACTOR_51_MUSIC_NOTE) {
marker_despawn(prop->actorProp.marker);
}
}
Expand Down
4 changes: 3 additions & 1 deletion src/port/Rando/CustomObject/CustomObjectSettings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,9 @@ void ApplyCustomActorPhysics(RandoCheckId randoCheckId, Actor* actor, bool isJin
BundlePhysics physicsData;

if ((randoCheckId >= RC_MM_NOTE_HUT_BUNDLE_1 && randoCheckId <= RC_MM_NOTE_HUT_BUNDLE_5) ||
randoCheckId == RC_MM_JINJO_GREEN || randoCheckId == RC_MM_JIGGY_HUTS) {
randoCheckId == RC_MM_JINJO_GREEN || randoCheckId == RC_MM_JIGGY_HUTS ||
(randoCheckId >= RC_MM_BLUE_EGG_HUT_BUNDLE_1 && randoCheckId <= RC_MM_BLUE_EGG_HUT_BUNDLE_5) ||
randoCheckId == RC_MM_EXTRA_LIFE_HUT) {
physicsData = GetPhysicsByCheckId(RC_MM_NOTE_HUT_BUNDLE_1);
} else {
physicsData = isJinjoJiggy ? jinjoJiggySpawnPhysics : GetPhysicsByCheckId(randoCheckId);
Expand Down
20 changes: 16 additions & 4 deletions src/port/Rando/LighthouseMenuRando.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ void LighthouseMenu::AddMenuRando() {
AddSidebarEntry("Rando", "Shuffle Options", 2);
path = { "Rando", "Shuffle Options", SECTION_COLUMN_1 };

AddWidget(path, "Shuffle Collectables", WIDGET_SEPARATOR_TEXT);
AddWidget(path, "Base Shuffles", WIDGET_SEPARATOR_TEXT);

AddWidget(path, "Shuffle Empty Honeycombs", WIDGET_CVAR_CHECKBOX)
.CVar(Rando::StaticData::Options[RO_SHUFFLE_EMPTY_HONEYCOMBS].cvar)
Expand All @@ -115,16 +115,28 @@ void LighthouseMenu::AddMenuRando() {
AddWidget(path, "Shuffle Jinjos", WIDGET_CVAR_CHECKBOX)
.CVar(Rando::StaticData::Options[RO_SHUFFLE_JINJOS].cvar)
.Options(CheckboxOptions().Tooltip("Shuffles Jinjos into the Pool."));
AddWidget(path, "Shuffle Molehills", WIDGET_CVAR_CHECKBOX)
.CVar(Rando::StaticData::Options[RO_SHUFFLE_MOLEHILLS].cvar)
.Options(CheckboxOptions().Tooltip("Shuffles which abilities each Molehill unlocks."));
AddWidget(path, "Shuffle Mumbo Tokens", WIDGET_CVAR_CHECKBOX)
.CVar(Rando::StaticData::Options[RO_SHUFFLE_MUMBO_TOKENS].cvar)
.Options(CheckboxOptions().Tooltip("Shuffles Mumbo Tokens into the Pool."));
AddWidget(path, "Shuffle Music Notes", WIDGET_CVAR_CHECKBOX)
.CVar(Rando::StaticData::Options[RO_SHUFFLE_MUSIC_NOTES].cvar)
.Options(CheckboxOptions().Tooltip("Shuffles Music Notes into the Pool."));

AddWidget(path, "Advanced Shuffles", WIDGET_SEPARATOR_TEXT);

AddWidget(path, "Shuffle Beehive Contents", WIDGET_CVAR_CHECKBOX)
.CVar(Rando::StaticData::Options[RO_SHUFFLE_BEEHIVE_HONEYCOMBS].cvar)
.Options(CheckboxOptions().Tooltip("Shuffles Contents of Beehives into the Pool."));
AddWidget(path, "Shuffle Blue Eggs", WIDGET_CVAR_CHECKBOX)
.CVar(Rando::StaticData::Options[RO_SHUFFLE_BLUE_EGGS].cvar)
.Options(CheckboxOptions().Tooltip("Shuffles Blue Eggs into the Pool."));
AddWidget(path, "Shuffle Extra Lives", WIDGET_CVAR_CHECKBOX)
.CVar(Rando::StaticData::Options[RO_SHUFFLE_EXTRA_LIVES].cvar)
.Options(CheckboxOptions().Tooltip("Shuffles Extra Lives into the Pool."));
AddWidget(path, "Shuffle Molehills", WIDGET_CVAR_CHECKBOX)
.CVar(Rando::StaticData::Options[RO_SHUFFLE_MOLEHILLS].cvar)
.Options(CheckboxOptions().Tooltip("Shuffles which abilities each Molehill unlocks."));

path.column = SECTION_COLUMN_2;

AddWidget(path, "Win Conditions", WIDGET_SEPARATOR_TEXT);
Expand Down
30 changes: 21 additions & 9 deletions src/port/Rando/Logic/GeneratePools.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,11 +46,26 @@ void GenerateShufflePool(SaveData* saveData) {
shuffledPool.clear();

for (auto& [randoCheckId, randoStaticCheck] : Rando::StaticData::Checks) {
if (randoStaticCheck.randoCheckType == RCTYPE_BLUE_EGG &&
CVarGetInteger(Rando::StaticData::Options[RO_SHUFFLE_BLUE_EGGS].cvar, 0) == RO_GENERIC_OFF) {
continue;
}

if (randoStaticCheck.randoCheckType == RCTYPE_EMPTY_HONEYCOMB &&
CVarGetInteger(Rando::StaticData::Options[RO_SHUFFLE_EMPTY_HONEYCOMBS].cvar, 0) == RO_GENERIC_OFF) {
continue;
}

if (randoStaticCheck.randoCheckType == RCTYPE_EXTRA_LIFE &&
CVarGetInteger(Rando::StaticData::Options[RO_SHUFFLE_EXTRA_LIVES].cvar, 0) == RO_GENERIC_OFF) {
continue;
}

if (randoStaticCheck.randoCheckType == RCTYPE_HONEYCOMB &&
CVarGetInteger(Rando::StaticData::Options[RO_SHUFFLE_BEEHIVE_HONEYCOMBS].cvar, 0) == RO_GENERIC_OFF) {
continue;
}

if (randoStaticCheck.randoCheckType == RCTYPE_JIGGY &&
CVarGetInteger(Rando::StaticData::Options[RO_SHUFFLE_JIGGIES].cvar, 0) == RO_GENERIC_OFF) {
continue;
Expand All @@ -64,8 +79,8 @@ void GenerateShufflePool(SaveData* saveData) {
if (randoStaticCheck.randoCheckType == RCTYPE_MOLEHILL) {
if (CVarGetInteger(Rando::StaticData::Options[RO_SHUFFLE_MOLEHILLS].cvar, 0) == RO_GENERIC_ON) {
abilityCheckPool.push_back(randoCheckId);
abilityItemPool.push_back(
{ (actor_e)randoStaticCheck.actorId, randoStaticCheck.collectionId, randoCheckId });
abilityItemPool.push_back({ Rando::StaticData::GetActorIdByRandoItemId(randoStaticCheck.randoItemId),
randoStaticCheck.collectionId, randoCheckId });
}
continue;
}
Expand All @@ -86,7 +101,8 @@ void GenerateShufflePool(SaveData* saveData) {
}

checkPool.push_back(randoCheckId);
itemPool.push_back({ (actor_e)randoStaticCheck.actorId, randoStaticCheck.collectionId, randoCheckId });
itemPool.push_back({ Rando::StaticData::GetActorIdByRandoItemId(randoStaticCheck.randoItemId),
randoStaticCheck.collectionId, randoCheckId });
}

if (!itemPool.empty()) {
Expand All @@ -111,16 +127,14 @@ void GenerateShufflePool(SaveData* saveData) {
RandoSaveCheck randoShuffleEntry = {
.name = Rando::StaticData::Checks[checkPool[i]].name,
.randoCheckId = checkPool[i],
.randoItemId = Rando::StaticData::GetRandoItemByActorId(std::get<0>(itemPool[i])),
.shuffledCheckId = std::get<2>(itemPool[i]),
.randoItemId = Rando::StaticData::Checks[std::get<2>(itemPool[i])].randoItemId,
.randoCollectionId = std::get<1>(itemPool[i]),
.isShuffled = checkPool[i] == RC_UNKNOWN ? false : true,
.obtained = false,
.skipped = false,
};

shuffledPool.push_back(randoShuffleEntry);

RANDO_SAVE_CHECKS[checkPool[i]] = randoShuffleEntry;
}

Expand All @@ -129,8 +143,7 @@ void GenerateShufflePool(SaveData* saveData) {
RandoSaveCheck randoShuffleEntry = {
.name = Rando::StaticData::Checks[abilityCheckPool[a]].name,
.randoCheckId = abilityCheckPool[a],
.randoItemId = Rando::StaticData::GetRandoItemByActorId(std::get<0>(abilityItemPool[a])),
.shuffledCheckId = std::get<2>(abilityItemPool[a]),
.randoItemId = Rando::StaticData::Checks[std::get<2>(abilityItemPool[a])].randoItemId,
.randoCollectionId = std::get<1>(abilityItemPool[a]),
.isShuffled = true,
.obtained = false,
Expand Down Expand Up @@ -162,7 +175,6 @@ void GeneratePoolFromSaveData(SaveData* saveData) {
.name = Rando::StaticData::Checks[(RandoCheckId)i].name,
.randoCheckId = randoSaveCheck.randoCheckId,
.randoItemId = randoSaveCheck.randoItemId,
.shuffledCheckId = randoSaveCheck.shuffledCheckId,
.randoCollectionId = randoSaveCheck.randoCollectionId,
.isShuffled = randoSaveCheck.isShuffled,
.obtained = randoSaveCheck.obtained,
Expand Down
4 changes: 2 additions & 2 deletions src/port/Rando/Logic/GenerateSaveData.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -124,8 +124,8 @@ void Rando::Logic::InitializeSaveData(SaveData* saveData) {
for (auto& [randoCheckId, randoStaticCheck] : Rando::StaticData::Checks) {
RandoSaveCheck randoSaveCheck = {
.name = randoStaticCheck.name,
.randoItemId = Rando::StaticData::GetRandoItemByActorId((actor_e)randoStaticCheck.actorId),
.shuffledCheckId = randoCheckId,
.randoItemId = randoStaticCheck.randoItemId,
// .randoItemId = Rando::StaticData::GetRandoItemByActorId((actor_e)randoStaticCheck.actorId),
.randoCollectionId = randoStaticCheck.collectionId,
.isShuffled = false,
.obtained = false,
Expand Down
Loading
Loading