Zelda64Recomp/patches/actor_data.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;
}