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; }