hook up game mode service

This commit is contained in:
TakaRikka
2026-08-20 00:22:01 -07:00
parent 5d5c3d5c5f
commit c86d6918d6
3 changed files with 75 additions and 23 deletions
+9 -10
View File
@@ -16,11 +16,14 @@ IMPORT_SERVICE(ConfigService, svc_config);
IMPORT_SERVICE(SaveService, svc_save);
IMPORT_SERVICE(StageService, svc_stage);
IMPORT_SERVICE(ItemService, svc_item);
IMPORT_SERVICE(FlowService, svc_flow);
IMPORT_SERVICE(MessageService, svc_message);
IMPORT_SERVICE(GameModeService, svc_game_mode);
extern "C" {
MOD_EXPORT ModResult mod_initialize(ModError* error) {
ModResult result = randomizer::session::initialize({
ModResult result = randomizer::session::initialize({
mod_ctx,
svc_host,
svc_log,
@@ -31,16 +34,14 @@ MOD_EXPORT ModResult mod_initialize(ModError* error) {
svc_save,
svc_stage,
svc_item,
svc_flow,
svc_message,
svc_game_mode,
});
if (result != MOD_OK) {
return mods::set_error(error, result, "failed to initialize session");
}
result = randomizer::hooks::initialize();
if (result != MOD_OK) {
return mods::set_error(error, result, "failed to initialize hooks");
}
result = randomizer::ui::initialize();
if (result != MOD_OK) {
return mods::set_error(error, result, "failed to initialize ui");
@@ -51,14 +52,12 @@ MOD_EXPORT ModResult mod_initialize(ModError* error) {
}
MOD_EXPORT ModResult mod_update(ModError*) {
randomizer::ui::update();
randomizer::session::update();
// we register update function with game mode service, so no need to do anything here
return MOD_OK;
}
MOD_EXPORT ModResult mod_shutdown(ModError*) {
randomizer::session::deactivateSeed();
randomizer::hooks::uninstall();
randomizer::session::shutdown();
svc_log->info(mod_ctx, "randomizer unloaded");
return MOD_OK;
}
+59 -13
View File
@@ -3,6 +3,8 @@
#include <mods/svc/log.hpp>
#include "randomizer_context.hpp"
#include "hooks.hpp"
#include "ui/ui.hpp"
#include "flags.h"
#include "item_ids.h"
#include "tools.h"
@@ -337,31 +339,38 @@ void registerStartingLocation() {
dComIfGp_setNextStage("F_SP103", 1, 1, -1);
}
void onNewSave(ModContext*, uint32_t, void*) {
void shutdown() {
deactivateSeed();
hooks::uninstall();
svc_mng.save->unobserve_saves(mod_ctx, s_save_observer);
}
ModResult onNewSave(void*, ModError*) {
const std::string hash = g_pending_seed_hash;
if (hash.empty())
return;
return MOD_ERROR;
if (!activateSeed(hash.c_str()))
return;
return MOD_ERROR;
svc_mng.save->set_blob(svc_mng.mod_ctx, kSeedHashBlobName, hash.data(), hash.size());
setupRandomizerFile();
return MOD_OK;
}
void onSaveLoaded(ModContext*, uint32_t, void*) {
ModResult onSaveLoaded(void*, ModError*) {
size_t size = 0;
if (svc_mng.save->get_blob(mod_ctx, kSeedHashBlobName, nullptr, &size) != MOD_OK || size == 0) {
mods::log::error("seed_hash not found!");
deactivateSeed();
return;
return MOD_ERROR;
}
std::string hash(size, '\0');
if (svc_mng.save->get_blob(mod_ctx, kSeedHashBlobName, hash.data(), &size) != MOD_OK) {
mods::log::error("failed to get seed_hash!");
deactivateSeed();
return;
return MOD_ERROR;
}
if (randomizer_GetContext().mHash != hash) {
@@ -370,6 +379,7 @@ void onSaveLoaded(ModContext*, uint32_t, void*) {
}
loadAncientDocumentNum();
return MOD_OK;
}
void onSaveWritten(ModContext*, uint32_t, void*) {
@@ -377,20 +387,56 @@ void onSaveWritten(ModContext*, uint32_t, void*) {
svc_mng.save->set_blob(svc_mng.mod_ctx, kSeedHashBlobName, hash.data(), hash.size());
}
ModResult initialize(const ServiceManager& services) {
svc_mng = services;
ModResult onGameModeActivated(void*, ModError* error) {
ModResult result = hooks::initialize();
if (result != MOD_OK) {
return mods::set_error(error, result, "failed to initialize hooks");
}
ModResult rt = svc_mng.save->observe_saves(
result = svc_mng.save->observe_saves(
svc_mng.mod_ctx,
onNewSave,
onSaveLoaded,
nullptr,
nullptr,
onSaveWritten,
nullptr,
&s_save_observer);
if (rt != MOD_OK) {
return rt;
if (result != MOD_OK) {
return mods::set_error(error, result, "failed to initialize save observation");
}
mods::log::info("randomizer game mode activated");
return MOD_OK;
}
ModResult onGameModeDeactivated(void*, ModError* error) {
shutdown();
mods::log::info("randomizer game mode deactivated");
return MOD_OK;
}
ModResult onGameModeUpdate(void*, ModError* error) {
ui::update();
session::update();
return MOD_OK;
}
ModResult initialize(const ServiceManager& services) {
svc_mng = services;
const GameModeDesc gameModeDesc = {
.struct_size = sizeof(GameModeDesc),
.game_mode_id = "randomizer",
.full_name = "Randomizer",
.save_name = "randomizer",
.user_data = nullptr,
.on_activated = onGameModeActivated,
.on_deactivated = onGameModeDeactivated,
.on_save_loaded = onSaveLoaded,
.on_new_save = onNewSave,
.on_tick = onGameModeUpdate,
};
svc_mng.game_mode->register_game_mode(mod_ctx, &gameModeDesc);
return MOD_OK;
}
+7
View File
@@ -9,6 +9,9 @@
#include "mods/svc/save.h"
#include "mods/svc/stage.h"
#include "mods/svc/item.h"
#include "mods/svc/flow.h"
#include "mods/svc/message.h"
#include "mods/svc/game_mode.h"
#include <string>
@@ -24,6 +27,9 @@ struct ServiceManager {
const SaveService* save;
const StageService* stage;
const ItemService* item;
const FlowService* flow;
const MessageService* message;
const GameModeService* game_mode;
};
extern ServiceManager svc_mng;
@@ -31,6 +37,7 @@ extern std::string g_pending_seed_hash;
ModResult initialize(const ServiceManager& services);
void update();
void shutdown();
void deactivateSeed();
void setupRandomizerFile();