diff --git a/include/parts.h b/include/parts.h index 06618b0..1523ce7 100644 --- a/include/parts.h +++ b/include/parts.h @@ -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); diff --git a/src/hll/PartsEngine.c b/src/hll/PartsEngine.c index 53e5ffa..80d6b02 100644 --- a/src/hll/PartsEngine.c +++ b/src/hll/PartsEngine.c @@ -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); diff --git a/src/parts/parts.c b/src/parts/parts.c index c2b179d..2e7a67a 100644 --- a/src/parts/parts.c +++ b/src/parts/parts.c @@ -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))