parts: implement SetPartsMessageWindowShowLink

The interface to this feature is strange. The message window visibility
state is passed to Update/UpdateParts every frame rather than being a
part of the global parts state. I've implemented it using global state,
which might be subtly wrong in some way, but it seems to work as
expected in Rance 01.
This commit is contained in:
Nunuhara Cabbage
2024-07-25 20:49:30 -07:00
parent 12f3b5d241
commit 0330006b89
5 changed files with 25 additions and 8 deletions
+1
View File
@@ -349,6 +349,7 @@ cJSON *parts_to_json(struct parts *parts, bool verbose)
if (parts->linked_from >= 0)
cJSON_AddNumberToObject(obj, "linked_from", parts->linked_from);
cJSON_AddNumberToObject(obj, "draw_filter", parts->draw_filter);
cJSON_AddBoolToObject(obj, "message_window", parts->message_window);
cJSON_AddItemToObjectCS(obj, "motions", motions = cJSON_CreateArray());
struct parts_motion *motion;
+10 -4
View File
@@ -837,8 +837,11 @@ void PE_UpdateComponent(possibly_unused int passed_time)
}
}
void PE_Update(int passed_time, possibly_unused bool message_window_show)
bool parts_message_window_show = true;
void PE_Update(int passed_time, bool message_window_show)
{
parts_message_window_show = message_window_show;
PE_UpdateComponent(passed_time);
audio_update();
parts_update_animation(passed_time);
@@ -846,8 +849,9 @@ void PE_Update(int passed_time, possibly_unused bool message_window_show)
parts_engine_dirty();
}
void PE_UpdateParts(int passed_time, possibly_unused bool is_skip, possibly_unused bool message_window_show)
void PE_UpdateParts(int passed_time, possibly_unused bool is_skip, bool message_window_show)
{
parts_message_window_show = message_window_show;
audio_update();
parts_update_animation(passed_time);
parts_engine_dirty();
@@ -1487,12 +1491,14 @@ void PE_SetParentPartsNumber(int parts_no, int parent_parts_no)
bool PE_SetPartsGroupNumber(possibly_unused int PartsNumber, possibly_unused int GroupNumber)
{
// TODO
WARNING("PE_SetPartsGroupNumber(%d, %d)", PartsNumber, GroupNumber);
return true;
}
void PE_SetPartsMessageWindowShowLink(possibly_unused int parts_no, possibly_unused bool message_window_show_link)
void PE_SetPartsMessageWindowShowLink(possibly_unused int parts_no, bool message_window_show_link)
{
// TODO
struct parts *parts = parts_get(parts_no);
parts->message_window = message_window_show_link;
}
bool PE_GetPartsMessageWindowShowLink(int PartsNumber);
+2
View File
@@ -287,6 +287,7 @@ struct parts {
int linked_to;
int linked_from;
int draw_filter;
bool message_window;
TAILQ_HEAD(, parts_motion) motion;
};
@@ -315,6 +316,7 @@ void parts_set_state(struct parts *parts, enum parts_state_type state);
void parts_release(int parts_no);
void parts_release_all(void);
void parts_set_surface_area(struct parts *parts, struct parts_common *common, int x, int y, int w, int h);
extern bool parts_message_window_show;
// for save.c
void parts_list_resort(struct parts *parts);
+2
View File
@@ -202,6 +202,8 @@ void parts_render(struct parts *parts)
{
if (!parts->global.show)
return;
if (parts->message_window && !parts_message_window_show)
return;
if (parts->linked_to >= 0) {
struct parts *link_parts = parts_get(parts->linked_to);
struct parts_state *link_state = &link_parts->states[link_parts->state];
+10 -4
View File
@@ -22,6 +22,8 @@
#include "parts_internal.h"
#include "../hll/iarray.h"
#define CURRENT_SAVE_VERSION 1
static void save_parts_params(struct iarray_writer *w, struct parts_params *params)
{
iarray_write(w, params->z);
@@ -483,6 +485,7 @@ static void save_parts(struct iarray_writer *w, struct parts *parts)
iarray_write(w, parts->linked_to);
iarray_write(w, parts->linked_from);
iarray_write(w, parts->draw_filter);
iarray_write(w, parts->message_window);
unsigned motion_count_pos = iarray_writer_pos(w);
iarray_write(w, 0); // size of motion list
@@ -497,7 +500,7 @@ static void save_parts(struct iarray_writer *w, struct parts *parts)
iarray_write_at(w, motion_count_pos, motion_count);
}
static void load_parts(struct iarray_reader *r)
static void load_parts(struct iarray_reader *r, int version)
{
int no = iarray_read(r);
struct parts *parts = parts_get(no);
@@ -518,6 +521,8 @@ static void load_parts(struct iarray_reader *r)
parts->linked_to = iarray_read(r);
parts->linked_from = iarray_read(r);
parts->draw_filter = iarray_read(r);
if (version > 0)
parts->message_window = iarray_read(r);
int motion_count = iarray_read(r);
for (int i = 0; i < motion_count; i++) {
@@ -535,7 +540,7 @@ static bool parts_engine_save(struct page **buffer, bool save_hidden)
struct iarray_writer w;
iarray_init_writer(&w, "XPE");
iarray_write(&w, 0); // version
iarray_write(&w, CURRENT_SAVE_VERSION);
// TODO: first_free from GetFreeNumber?
unsigned count_pos = iarray_writer_pos(&w);
iarray_write(&w, 0); // size of parts list
@@ -583,7 +588,8 @@ bool PE_Load(struct page **buffer)
WARNING("unrecognized savedata magic");
return false;
}
if (iarray_read(&r) != 0) {
int version = iarray_read(&r);
if (version > CURRENT_SAVE_VERSION) {
WARNING("unrecognized savedata version");
return false;
}
@@ -597,7 +603,7 @@ bool PE_Load(struct page **buffer)
parts_release_all();
for (int i = 0; i < nr_parts; i++) {
load_parts(&r);
load_parts(&r, version);
}
return true;