PartsEngine: Implement PartsFunc 40-42 (PARTS_GetAbsolute[XYZ])

This commit is contained in:
kichikuou
2026-04-20 07:59:03 +09:00
parent e5087f0757
commit 28c8c277c9
3 changed files with 39 additions and 0 deletions
+3
View File
@@ -129,6 +129,9 @@ int PE_get_active_controller(void);
int PE_get_system_controller(void);
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);
float PE_parts_get_absolute_y(int parts_no);
int PE_parts_get_absolute_z(int parts_no);
// construction.c
bool PE_AddCreateToPartsConstructionProcess(int parts_no, int w, int h, int state);
+18
View File
@@ -110,9 +110,13 @@ static int PartsEngine_PartsFunc(int func_id, struct page **array_int,
{
int nr_ints = (array_int && *array_int) ? (*array_int)->nr_vars : 0;
union vm_value *ints = nr_ints ? (*array_int)->values : NULL;
int nr_floats = (array_float && *array_float) ? (*array_float)->nr_vars : 0;
union vm_value *floats = nr_floats ? (*array_float)->values : NULL;
#define REQUIRE_INTS(n) \
if (nr_ints != (n)) VM_ERROR("Invalid arguments for PartsFunc %d: expected %d ints, got %d", func_id, (n), nr_ints)
#define REQUIRE_FLOATS(n) \
if (nr_floats < (n)) VM_ERROR("Invalid arguments for PartsFunc %d: expected %d floats, got %d", func_id, (n), nr_floats)
switch (func_id) {
case 0: // void SetActiveLayer(int layer)
@@ -127,6 +131,20 @@ static int PartsEngine_PartsFunc(int func_id, struct page **array_int,
REQUIRE_INTS(1);
ints[0].i = PE_get_system_controller();
return 1;
case 40: // float PARTS_GetAbsoluteX(int number)
REQUIRE_INTS(1);
REQUIRE_FLOATS(1);
floats[0].f = PE_parts_get_absolute_x(ints[0].i);
return 1;
case 41: // float PARTS_GetAbsoluteY(int number)
REQUIRE_INTS(1);
REQUIRE_FLOATS(1);
floats[0].f = PE_parts_get_absolute_y(ints[0].i);
return 1;
case 42: // int PARTS_GetAbsoluteZ(int number)
REQUIRE_INTS(2);
ints[1].i = PE_parts_get_absolute_z(ints[0].i);
return 1;
case 103: // void GetPartsCGSurfaceArea(int parts_no, int *x, int *y, int *w, int *h, int state)
REQUIRE_INTS(6);
PE_GetPartsCGSurfaceArea(ints[0].i, &ints[1].i, &ints[2].i, &ints[3].i, &ints[4].i, ints[5].i);
+18
View File
@@ -2101,6 +2101,24 @@ int PE_get_system_controller(void)
return PARTS_CONTROLLER_SYSTEM_OVERLAY;
}
float PE_parts_get_absolute_x(int parts_no)
{
struct parts *parts = parts_try_get(parts_no);
return parts ? (float)parts->global.pos.x : 0.0f;
}
float PE_parts_get_absolute_y(int parts_no)
{
struct parts *parts = parts_try_get(parts_no);
return parts ? (float)parts->global.pos.y : 0.0f;
}
int PE_parts_get_absolute_z(int parts_no)
{
struct parts *parts = parts_try_get(parts_no);
return parts ? parts->global.z : 0;
}
bool PE_init_parts_movie(int parts_no, int width, int height, int bg_r, int bg_g, int bg_b, int state)
{
if (!parts_state_valid(--state))