mirror of
https://github.com/Mr-Wiseguy/Zelda64Recomp.git
synced 2025-03-04 18:55:21 +01:00
92 lines
3.0 KiB
C
92 lines
3.0 KiB
C
#include "patches.h"
|
|
#include "extended_actors.h"
|
|
#include "transform_ids.h"
|
|
#include "mem_funcs.h"
|
|
|
|
// Use 32 bits of compiler-inserted padding to hold the actor's slot.
|
|
// 0x22 between halfDaysBits and world
|
|
#define actorIdByte0(actor) ((u8*)(actor))[0x22]
|
|
// 0x23 between halfDaysBits and world
|
|
#define actorIdByte1(actor) ((u8*)(actor))[0x23]
|
|
// 0x3A between audioFlags and focus
|
|
#define actorIdByte2(actor) ((u8*)(actor))[0x3A]
|
|
// 0x3B between audioFlags and focus
|
|
#define actorIdByte3(actor) ((u8*)(actor))[0x3B]
|
|
|
|
u32 actor_get_slot(Actor* actor) {
|
|
return (actorIdByte0(actor) << 24) | (actorIdByte1(actor) << 16) | (actorIdByte2(actor) << 8) | (actorIdByte3(actor) << 0);
|
|
}
|
|
|
|
void actor_set_slot(Actor* actor, ActorExtensionId slot) {
|
|
u32 b0 = (slot >> 24) & 0xFF;
|
|
u32 b1 = (slot >> 16) & 0xFF;
|
|
u32 b2 = (slot >> 8) & 0xFF;
|
|
u32 b3 = (slot >> 0) & 0xFF;
|
|
|
|
actorIdByte0(actor) = b0;
|
|
actorIdByte1(actor) = b1;
|
|
actorIdByte2(actor) = b2;
|
|
actorIdByte3(actor) = b3;
|
|
}
|
|
|
|
RECOMP_EXPORT ActorExtensionId z64recomp_extend_actor(s16 actor_id, u32 size) {
|
|
return recomp_register_actor_extension(actor_id, size);
|
|
}
|
|
|
|
RECOMP_EXPORT ActorExtensionId z64recomp_extend_actor_all(u32 size) {
|
|
return recomp_register_actor_extension_generic(size);
|
|
}
|
|
|
|
RECOMP_EXPORT void* z64recomp_get_extended_actor_data(Actor* actor, ActorExtensionId extension) {
|
|
return recomp_get_actor_data(actor_get_slot(actor), extension, actor->id);
|
|
}
|
|
|
|
RECOMP_EXPORT u32 z64recomp_get_actor_spawn_index(Actor* actor) {
|
|
return recomp_get_actor_spawn_index(actor_get_slot(actor));
|
|
}
|
|
|
|
RECOMP_EXPORT u32 actor_transform_id(Actor* actor) {
|
|
u32 spawn_index = z64recomp_get_actor_spawn_index(actor);
|
|
|
|
return (spawn_index * ACTOR_TRANSFORM_ID_COUNT) + ACTOR_TRANSFORM_ID_START;
|
|
}
|
|
|
|
typedef enum {
|
|
ACTOR_TRANSFORM_FLAG_INTERPOLATION_SKIPPED = 1 << 0,
|
|
ACTOR_CUSTOM_FLAG_1 = 1 << 1,
|
|
} CustomActorFlags;
|
|
|
|
typedef struct {
|
|
CustomActorFlags flags;
|
|
} BaseActorExtensionData;
|
|
|
|
ActorExtensionId base_actor_extension_handle;
|
|
|
|
void register_base_actor_extensions() {
|
|
base_actor_extension_handle = z64recomp_extend_actor_all(sizeof(BaseActorExtensionData));
|
|
}
|
|
|
|
BaseActorExtensionData* get_base_extension_data(Actor* actor) {
|
|
return (BaseActorExtensionData*)z64recomp_get_extended_actor_data(actor, base_actor_extension_handle);
|
|
}
|
|
|
|
RECOMP_EXPORT u32 actor_get_interpolation_skipped(Actor* actor) {
|
|
return (get_base_extension_data(actor)->flags & ACTOR_TRANSFORM_FLAG_INTERPOLATION_SKIPPED) != 0;
|
|
}
|
|
|
|
RECOMP_EXPORT void actor_set_interpolation_skipped(Actor* actor) {
|
|
get_base_extension_data(actor)->flags |= ACTOR_TRANSFORM_FLAG_INTERPOLATION_SKIPPED;
|
|
}
|
|
|
|
RECOMP_EXPORT void actor_clear_interpolation_skipped(Actor* actor) {
|
|
get_base_extension_data(actor)->flags &= ~ACTOR_TRANSFORM_FLAG_INTERPOLATION_SKIPPED;
|
|
}
|
|
|
|
void actor_set_custom_flag_1(Actor* actor) {
|
|
get_base_extension_data(actor)->flags |= ACTOR_CUSTOM_FLAG_1;
|
|
}
|
|
|
|
bool actor_get_custom_flag_1(Actor* actor) {
|
|
return (get_base_extension_data(actor)->flags & ACTOR_CUSTOM_FLAG_1) != 0;
|
|
}
|