diff --git a/include/audio.h b/include/audio.h index 4e02db3..a7105f6 100644 --- a/include/audio.h +++ b/include/audio.h @@ -20,7 +20,7 @@ #include void audio_init(void); -void audio_fini(void); +void audio_reset(void); void audio_update(void); bool audio_play_sound(int sound_no); diff --git a/include/parts.h b/include/parts.h index de95b57..71ad136 100644 --- a/include/parts.h +++ b/include/parts.h @@ -24,6 +24,7 @@ struct string; // parts.c bool PE_Init(void); +void PE_Reset(void); void PE_Update(int passed_time, bool message_window_show); void PE_UpdateComponent(int passed_time); void PE_UpdateParts(int passed_time, bool is_skip, bool message_window_show); diff --git a/src/audio.c b/src/audio.c index 377b962..b92029a 100644 --- a/src/audio.c +++ b/src/audio.c @@ -54,6 +54,19 @@ void audio_init(void) audio_initialized = true; } +void audio_reset(void) +{ + for (int i = 0; i < wav.nr_slots; i++) { + wav_unprepare(i); + } + for (int i = 0; i < bgm.nr_slots; i++) { + bgm_unprepare(i); + } + for (int i = 0; i < NR_ANONYMOUS_CHANNELS; i++) { + anonymous_channels[i] = -1; + } +} + void audio_update(void) { for (int i = 0; i < NR_ANONYMOUS_CHANNELS; i++) { diff --git a/src/hll/ChipmunkSpriteEngine.c b/src/hll/ChipmunkSpriteEngine.c index 2cb2c26..ecce459 100644 --- a/src/hll/ChipmunkSpriteEngine.c +++ b/src/hll/ChipmunkSpriteEngine.c @@ -35,6 +35,7 @@ static void ChipmunkSpriteEngine_PreLink(void); static void ChipmunkSpriteEngine_ModuleFini(void) { sact_ModuleFini(); + CharSpriteManager_Clear(); } static int ChipmunkSpriteEngine_Init(possibly_unused void *imain_system) diff --git a/src/hll/GUIEngine.c b/src/hll/GUIEngine.c index 9cdd06f..7e7021c 100644 --- a/src/hll/GUIEngine.c +++ b/src/hll/GUIEngine.c @@ -33,6 +33,7 @@ static void GUIEngine_ModuleInit(void) static void GUIEngine_ModuleFini(void) { + PE_Reset(); } bool GUIEngine_Save(struct page **buffer) diff --git a/src/hll/GoatGUIEngine.c b/src/hll/GoatGUIEngine.c index ac20f70..6cd6f90 100644 --- a/src/hll/GoatGUIEngine.c +++ b/src/hll/GoatGUIEngine.c @@ -27,6 +27,7 @@ static void GoatGUIEngine_PreLink(void); HLL_LIBRARY(GoatGUIEngine, HLL_EXPORT(_PreLink, GoatGUIEngine_PreLink), + HLL_EXPORT(_ModuleFini, PE_Reset), HLL_EXPORT(Init, PE_Init), HLL_EXPORT(Update, PE_Update), HLL_EXPORT(SetPartsCG, PE_SetPartsCG), diff --git a/src/hll/PartsEngine.c b/src/hll/PartsEngine.c index db2a87a..a5b16ec 100644 --- a/src/hll/PartsEngine.c +++ b/src/hll/PartsEngine.c @@ -24,6 +24,7 @@ static void PartsEngine_ModuleInit(void) static void PartsEngine_ModuleFini(void) { + PE_Reset(); } void PartsEngine_Update(int passed_time, bool is_skip, bool message_window_show) diff --git a/src/hll/SACT2.c b/src/hll/SACT2.c index 59f37b8..d5c0d26 100644 --- a/src/hll/SACT2.c +++ b/src/hll/SACT2.c @@ -131,6 +131,7 @@ static int sact_Init(possibly_unused void *imain_system, int cg_cache_size) void sact_ModuleFini(void) { sact_SP_DeleteAll(); + audio_reset(); } //int SACT2_Error(struct string *err); diff --git a/src/hll/StoatSpriteEngine.c b/src/hll/StoatSpriteEngine.c index 471e742..c4b0c4e 100644 --- a/src/hll/StoatSpriteEngine.c +++ b/src/hll/StoatSpriteEngine.c @@ -321,6 +321,7 @@ static void StoatSpriteEngine_ModuleFini(void) { sact_ModuleFini(); multisprite_clear(); + CharSpriteManager_Clear(); } static void multisprite_update_pos(struct multisprite *ms) diff --git a/src/parts/parts.c b/src/parts/parts.c index 3d22051..18da6f7 100644 --- a/src/parts/parts.c +++ b/src/parts/parts.c @@ -738,6 +738,12 @@ bool PE_Init(void) return true; } +void PE_Reset(void) +{ + PE_ReleaseAllParts(); + sact_ModuleFini(); +} + static bool parts_has_dirty_parent(struct parts *parts) { for (struct parts *parent = parts->parent; parent; parent = parent->parent) {