Merge pull request #349 from kichikuou/parts

Implement two PartsFuncs, and minor fixes
This commit is contained in:
Nunuhara Cabbage
2026-06-11 17:22:02 -07:00
committed by GitHub
7 changed files with 78 additions and 11 deletions
+2
View File
@@ -131,6 +131,7 @@ void PE_set_active_controller(int controller_no);
int PE_get_active_controller(void);
int PE_get_system_controller(void);
void PE_parts_set_want_save(int parts_no, bool want_save);
bool PE_save_thumbnail(struct string *filename, int reduction_factor);
bool PE_init_parts_movie(int parts_no, int width, int height, int bg_r, int bg_g, int bg_b, int state);
int PE_get_movie_sprite(int parts_no, int state);
float PE_parts_get_absolute_x(int parts_no);
@@ -247,6 +248,7 @@ void PE_SeekEndMotion(void);
void PE_UpdateMotionTime(int time, bool skip);
bool PE_IsMotion(void);
int PE_GetMotionEndTime(void);
void PE_PauseMotion(bool pause);
// text.c
bool PE_SetText(int parts_no, struct string *text, int state);
+2 -2
View File
@@ -111,8 +111,8 @@ HLL_WARN_UNIMPLEMENTED(0, int, ChipmunkSpriteEngine, SP_SetBrightness, int sp_n
HLL_WARN_UNIMPLEMENTED(0, int, ChipmunkSpriteEngine, SP_GetBrightness, int sp_no);
static bool keep_previous_view = true;
HLL_WARN_UNIMPLEMENTED((keep_previous_view = on, true), bool, ChipmunkSpriteEngine, KeepPreviousView_SetMode, bool on);
HLL_WARN_UNIMPLEMENTED(keep_previous_view, bool, ChipmunkSpriteEngine, KeepPreviousView_GetMode);
HLL_QUIET_UNIMPLEMENTED((keep_previous_view = on, true), bool, ChipmunkSpriteEngine, KeepPreviousView_SetMode, bool on);
HLL_QUIET_UNIMPLEMENTED(keep_previous_view, bool, ChipmunkSpriteEngine, KeepPreviousView_GetMode);
HLL_QUIET_UNIMPLEMENTED(false, bool, ChipmunkSpriteEngine, KeepPreviousView);
static void ChipmunkSpriteEngine_Sleep(void)
+9
View File
@@ -260,10 +260,19 @@ static int PartsEngine_PartsFunc(int func_id, struct page **array_int,
REQUIRE_INTS(1);
ints[0].i = PE_get_system_controller();
return 1;
case 3: // void PauseMotion(bool pause)
REQUIRE_INTS(1);
PE_PauseMotion(!!ints[0].i);
return 1;
case 4: // void SetWantSave(int parts_no, bool want_save)
REQUIRE_INTS(2);
PE_parts_set_want_save(ints[0].i, !!ints[1].i);
return 1;
case 6: // bool SaveThumbnail(string filename, int reduction_factor)
REQUIRE_INTS(2);
REQUIRE_STRINGS(1);
ints[1].i = PE_save_thumbnail(heap_get_string(strings[0].i), ints[0].i);
return 1;
case 40: // float PARTS_GetAbsoluteX(int number)
REQUIRE_INTS(1);
REQUIRE_FLOATS(1);
+1
View File
@@ -1031,6 +1031,7 @@ int sact_TRANS_Begin(int type)
int sact_TRANS_Update(float rate)
{
sprite_call_plugins();
if (scene_is_dirty)
scene_render();
return effect_update(rate);
+2 -2
View File
@@ -188,8 +188,8 @@ float StoatSpriteEngine_FPS_Get(void)
HLL_WARN_UNIMPLEMENTED( , void, StoatSpriteEngine, VIEW_SetOffsetPos, int x, int y);
static bool keep_previous_view = true;
HLL_WARN_UNIMPLEMENTED((keep_previous_view = on, true), bool, StoatSpriteEngine, KeepPreviousView_SetMode, bool on);
HLL_WARN_UNIMPLEMENTED(keep_previous_view, bool, StoatSpriteEngine, KeepPreviousView_GetMode);
HLL_QUIET_UNIMPLEMENTED((keep_previous_view = on, true), bool, StoatSpriteEngine, KeepPreviousView_SetMode, bool on);
HLL_QUIET_UNIMPLEMENTED(keep_previous_view, bool, StoatSpriteEngine, KeepPreviousView_GetMode);
/*
* NOTE: The multisprite "type" alters the behavior of the multisprite functions.
+23
View File
@@ -38,6 +38,8 @@ static struct parts_motion_list global_motion_list =
// true after call to BeginMotion until the motion ends or EndMotion is called
static bool is_motion = false;
// true while the motion is paused (time does not advance)
static bool is_motion_paused = false;
// the elapsed time of the current motion
static int motion_t = 0;
// the end time of the current motion
@@ -498,6 +500,7 @@ void PE_BeginMotion(void)
// FIXME: starting a motion seems to clear non-default states
motion_t = 0;
is_motion = true;
is_motion_paused = false;
parts_init_all_motion();
}
@@ -508,6 +511,7 @@ void PE_EndMotion(void)
motion_t = 0;
motion_end_t = 0;
is_motion = false;
is_motion_paused = false;
parts_fini_all_motion();
}
@@ -531,6 +535,8 @@ void PE_SeekEndMotion(void)
void PE_UpdateMotionTime(int time, possibly_unused bool skip)
{
// TODO: use skip
if (is_motion_paused)
return;
PE_SetMotionTime(motion_t + time);
}
@@ -543,3 +549,20 @@ int PE_GetMotionEndTime(void)
{
return motion_end_t;
}
void PE_PauseMotion(bool pause)
{
if (parts_began_click)
return;
if (!is_motion)
return;
if (is_motion_paused == pause)
return;
is_motion_paused = pause;
// While paused, the per-frame advance stops updating the whole-screen
// vibration offset. Reset it to the origin so the screen doesn't stay
// stuck at the last shake position.
if (pause)
parts_set_global_pos((Point){ 0, 0 });
}
+39 -7
View File
@@ -40,7 +40,6 @@ struct parts_controller_stack ctrl_stack;
bool parts_multi_controller;
static void ctrl_stack_init(void);
static void ctrl_stack_fini(void);
#define PARTS_PARAMS_INITIALIZER (struct parts_params) { \
.z = 1, \
@@ -1062,7 +1061,7 @@ void PE_Reset(void)
{
PE_ReleaseAllParts();
PE_ReleaseMessage();
ctrl_stack_fini();
ctrl_stack_init();
sact_ModuleFini();
}
@@ -1955,6 +1954,44 @@ bool PE_SetThumbnailMode(bool mode)
return true;
}
bool PE_save_thumbnail(struct string *filename, int reduction_factor)
{
if (reduction_factor < 1)
reduction_factor = 1;
Texture *src = gfx_main_surface();
int w = src->w / reduction_factor;
int h = src->h / reduction_factor;
// Downscale by repeatedly halving until we are within a factor of two of
// the target size, then do the final stretch. This avoids the aliasing
// that a single bilinear minification would otherwise produce.
Texture tmp, *cur = src;
bool have_tmp = false;
while (cur->w / 2 > w && cur->h / 2 > h) {
Texture next;
gfx_init_texture_blank(&next, cur->w / 2, cur->h / 2);
gfx_copy_stretch_with_alpha_map(&next, 0, 0, next.w, next.h, cur, 0, 0, cur->w, cur->h);
if (have_tmp)
gfx_delete_texture(&tmp);
tmp = next;
cur = &tmp;
have_tmp = true;
}
Texture dst;
gfx_init_texture_blank(&dst, w, h);
gfx_copy_stretch_with_alpha_map(&dst, 0, 0, w, h, cur, 0, 0, cur->w, cur->h);
if (have_tmp)
gfx_delete_texture(&tmp);
char *path = savedir_path(filename->text);
int r = gfx_save_texture(&dst, path, ALCG_QNT);
free(path);
gfx_delete_texture(&dst);
return !!r;
}
void PE_SetInputState(int parts_no, int state)
{
if (!parts_state_valid(--state)) {
@@ -2072,11 +2109,6 @@ static void ctrl_stack_init(void)
PE_AddController(-1);
}
static void ctrl_stack_fini(void)
{
memset(&ctrl_stack, 0, sizeof(ctrl_stack));
}
// Adds a new controller to the stack and makes it active. The `index`
// parameter specifies the position in the stack at which to insert the new
// controller; -1 means "insert directly after the currently active