From bc65a40eb4a625905aba926b2f6672d63a3ceb48 Mon Sep 17 00:00:00 2001 From: Nunuhara Cabbage Date: Wed, 31 Jul 2024 12:46:15 -0700 Subject: [PATCH] parts: only render on PE_Update/PE_UpdateParts Also, fix an issue in Rance 01 where a bad frame would be displayed when loading a save (this is a bug present in the original game). --- src/parts/parts.c | 4 ++-- src/parts/parts_internal.h | 2 ++ src/parts/render.c | 25 +++++++++++++++++++++++-- src/parts/save.c | 3 +-- 4 files changed, 28 insertions(+), 6 deletions(-) diff --git a/src/parts/parts.c b/src/parts/parts.c index f528079..26127f2 100644 --- a/src/parts/parts.c +++ b/src/parts/parts.c @@ -957,7 +957,7 @@ void PE_Update(int passed_time, bool message_window_show) audio_update(); parts_update_animation(passed_time); PE_UpdateInputState(passed_time); - parts_engine_dirty(); + parts_render_update(passed_time); } void PE_UpdateParts(int passed_time, possibly_unused bool is_skip, bool message_window_show) @@ -965,7 +965,7 @@ void PE_UpdateParts(int passed_time, possibly_unused bool is_skip, bool message_ parts_message_window_show = message_window_show; audio_update(); parts_update_animation(passed_time); - parts_engine_dirty(); + parts_render_update(passed_time); } void PE_SetDelegateIndex(int parts_no, int delegate_index) diff --git a/src/parts/parts_internal.h b/src/parts/parts_internal.h index 21af4d9..4300954 100644 --- a/src/parts/parts_internal.h +++ b/src/parts/parts_internal.h @@ -360,7 +360,9 @@ struct string *parts_text_get(struct parts_text *t); // render.c void parts_render_init(void); +void parts_render_update(int passed_time); void parts_engine_dirty(void); +void parts_engine_clean(void); void parts_dirty(struct parts *parts); void parts_render(struct parts *parts); void parts_render_family(struct parts *parts); diff --git a/src/parts/render.c b/src/parts/render.c index 0ffe3ac..95d31d4 100644 --- a/src/parts/render.c +++ b/src/parts/render.c @@ -262,14 +262,35 @@ void parts_engine_render(possibly_unused struct sprite *_) } } +static bool pe_dirty = false; + +void parts_render_update(int passed_time) +{ + // XXX: hack for Rance 01 load issue + // There is a bug in Rance 01 where a single bad frame is displayed after + // loading a save. When this happens, the game passes a negative time delta + // to PE_Update. We fix this issue by ignoring such calls. + if (passed_time < 0) + return; + if (pe_dirty) { + scene_sprite_dirty(&goat_sprite); + pe_dirty = false; + } +} + void parts_engine_dirty(void) { - scene_sprite_dirty(&goat_sprite); + pe_dirty = true; +} + +void parts_engine_clean(void) +{ + pe_dirty = false; } void parts_dirty(possibly_unused struct parts *parts) { - parts_engine_dirty(); + pe_dirty = true; } void parts_render_init(void) diff --git a/src/parts/save.c b/src/parts/save.c index 75e09f4..150de05 100644 --- a/src/parts/save.c +++ b/src/parts/save.c @@ -642,7 +642,6 @@ bool PE_Load(struct page **buffer) load_parts(&r, version); } - PE_UpdateComponent(0); - + parts_engine_clean(); return true; }