mirror of
https://github.com/ACreTeam/ac-decomp
synced 2026-06-15 05:40:57 -04:00
Merge pull request #70 from Cuyler36/ac_structure
Implement & link ac_structure.c
This commit is contained in:
@@ -200,6 +200,11 @@ m_random_field/mRF_MakePerfectBit.c:
|
||||
.text: [0x8050B1AC, 0x8050B1D4]
|
||||
m_random_field/mRF_GetRandomStepMode.c:
|
||||
.text: [0x8050B284, 0x8050B2C0]
|
||||
ac_structure.c:
|
||||
.text: [0x805BCA00, 0x805BD06C]
|
||||
.rodata: [0x8064AC30, 0x8064AC38]
|
||||
.data: [0x806C6C00, 0x806C6ED0]
|
||||
.bss: [0x813280F0, 0x8133DEB0]
|
||||
m_select.c:
|
||||
.text: [0x80627F88, 0x80629CA8]
|
||||
.rodata: [0x8064D1B0, 0x8064D1B8]
|
||||
|
||||
+104
-1
@@ -3,18 +3,121 @@
|
||||
|
||||
#include "types.h"
|
||||
#include "m_actor.h"
|
||||
#include "m_actor_dlftbls.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef ACTOR* (*aSTR_SETUP_ACTOR_PROC)(GAME_PLAY*, mActor_name_t, int, f32, f32);
|
||||
#define aSTR_ACTOR_TBL_COUNT 9
|
||||
#define aSTR_OVERLAY_SIZE 0x2400
|
||||
|
||||
enum structure_type {
|
||||
aSTR_TYPE_HOUSE1,
|
||||
aSTR_TYPE_HOUSE2,
|
||||
aSTR_TYPE_HOUSE3,
|
||||
aSTR_TYPE_HOUSE4,
|
||||
aSTR_TYPE_HOUSE5,
|
||||
aSTR_TYPE_MYHOME,
|
||||
aSTR_TYPE_6,
|
||||
aSTR_TYPE_7,
|
||||
aSTR_TYPE_SHOP1,
|
||||
aSTR_TYPE_SHOP2,
|
||||
aSTR_TYPE_SHOP3,
|
||||
aSTR_TYPE_SHOP4,
|
||||
aSTR_TYPE_POST_OFFICE,
|
||||
aSTR_TYPE_STATION1,
|
||||
aSTR_TYPE_STATION2,
|
||||
aSTR_TYPE_STATION3,
|
||||
aSTR_TYPE_TRAIN0,
|
||||
aSTR_TYPE_TRAIN1,
|
||||
aSTR_TYPE_POLICE_BOX,
|
||||
aSTR_TYPE_FALLS,
|
||||
aSTR_TYPE_FALLSESW,
|
||||
aSTR_TYPE_SIGN,
|
||||
aSTR_TYPE_SHRINE,
|
||||
aSTR_TYPE_BRSHOP,
|
||||
aSTR_TYPE_BUGGY,
|
||||
aSTR_TYPE_S_CAR,
|
||||
aSTR_TYPE_KAMAKURA, // also used for camping tent
|
||||
aSTR_TYPE_GOZA,
|
||||
aSTR_TYPE_RADIO,
|
||||
aSTR_TYPE_YATAI,
|
||||
aSTR_TYPE_TUKIMI,
|
||||
aSTR_TYPE_TUKIMI2,
|
||||
aSTR_TYPE_MIKUJI,
|
||||
aSTR_TYPE_COUNT,
|
||||
aSTR_TYPE_COUNT02,
|
||||
aSTR_TYPE_SPORTSFAIR_A,
|
||||
aSTR_TYPE_SPORTSFAIR_B,
|
||||
aSTR_TYPE_TURI,
|
||||
aSTR_TYPE_TURI2,
|
||||
aSTR_TYPE_KOINOBORI,
|
||||
aSTR_TYPE_DUMP,
|
||||
aSTR_TYPE_WINDMILL,
|
||||
aSTR_TYPE_LOTUS,
|
||||
aSTR_TYPE_MIKANBOX,
|
||||
aSTR_TYPE_DOUZOU,
|
||||
aSTR_TYPE_TOUDAI,
|
||||
aSTR_TYPE_GHOG,
|
||||
aSTR_TYPE_HTABLE,
|
||||
aSTR_TYPE_MUSEUM,
|
||||
aSTR_TYPE_BRIDGE_A,
|
||||
aSTR_TYPE_50,
|
||||
aSTR_TYPE_NEEDLEWORK_SHOP,
|
||||
aSTR_TYPE_FLAG,
|
||||
aSTR_TYPE_BOAT,
|
||||
aSTR_TYPE_COTTAGE_MY,
|
||||
aSTR_TYPE_COTTAGE_NPC,
|
||||
|
||||
aSTR_TYPE_NUM
|
||||
};
|
||||
|
||||
typedef struct actor_structure_control_s STRUCTURE_CONTROL_ACTOR;
|
||||
typedef struct actor_structure_s STRUCTURE_ACTOR;
|
||||
|
||||
typedef STRUCTURE_ACTOR* (*aSTR_SETUP_ACTOR_PROC)(GAME*, mActor_name_t, s16, f32, f32);
|
||||
typedef void (*aSTR_GET_OVERLAY_AREA_PROC)(ACTOR_DLFTBL*);
|
||||
typedef void (*aSTR_FREE_OVERLAY_AREA_PROC)(ACTOR_DLFTBL*);
|
||||
typedef STRUCTURE_ACTOR* (*aSTR_GET_ACTOR_AREA_PROC)();
|
||||
typedef void (*aSTR_FREE_ACTOR_AREA_PROC)(STRUCTURE_ACTOR*);
|
||||
typedef u16* (*aSTR_GET_PAL_SEGMENT_PROC)(s16);
|
||||
|
||||
struct actor_structure_s {
|
||||
ACTOR actor_class;
|
||||
u8 _174[0x2B0 - 0x174];
|
||||
int request_type;
|
||||
u8 _2B4[0x2DC - 0x2B4];
|
||||
};
|
||||
|
||||
typedef struct actor_overlay_info_s {
|
||||
u8* overlay_p;
|
||||
int used;
|
||||
} aSTR_Overlay_info_c;
|
||||
|
||||
// TODO: finish clip
|
||||
typedef struct actor_structure_clip_s {
|
||||
aSTR_SETUP_ACTOR_PROC setup_actor_proc;
|
||||
aSTR_GET_OVERLAY_AREA_PROC get_overlay_area_proc;
|
||||
aSTR_FREE_OVERLAY_AREA_PROC free_overlay_area_proc;
|
||||
aSTR_GET_ACTOR_AREA_PROC get_actor_area_proc;
|
||||
aSTR_FREE_ACTOR_AREA_PROC free_actor_area_proc;
|
||||
|
||||
STRUCTURE_ACTOR* structure_actor_tbl[aSTR_ACTOR_TBL_COUNT];
|
||||
int structure_actor_used_tbl[aSTR_ACTOR_TBL_COUNT];
|
||||
|
||||
aSTR_Overlay_info_c overlay_area[aSTR_ACTOR_TBL_COUNT];
|
||||
|
||||
aSTR_GET_PAL_SEGMENT_PROC get_pal_segment_proc;
|
||||
} aSTR_Clip_c;
|
||||
|
||||
struct actor_structure_control_s {
|
||||
ACTOR actor_class;
|
||||
int _174;
|
||||
mActor_name_t str_door_name;
|
||||
u8 reset;
|
||||
};
|
||||
|
||||
extern ACTOR_PROFILE Structure_Profile;
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
@@ -15,6 +15,7 @@ extern "C" {
|
||||
#endif
|
||||
|
||||
typedef void (*mActor_proc)(ACTOR*, GAME*);
|
||||
#define NONE_ACTOR_PROC ((mActor_proc)&none_proc1)
|
||||
|
||||
#define ACTOR_STATE_NONE 0
|
||||
#define ACTOR_STATE_NO_MOVE_WHILE_CULLED (1 << 4)
|
||||
@@ -398,6 +399,7 @@ extern ACTOR* Actor_info_fgName_search(Actor_info* actor_info, mActor_name_t fg_
|
||||
extern void Actor_world_to_eye(ACTOR* actor, f32 eye_height);
|
||||
extern void Shape_Info_init(ACTOR* actor, f32 y_ofs, mActor_shadow_proc shadow_proc, f32 shadow_sizeX, f32 shadow_sizeZ);
|
||||
extern void Actor_position_moveF(ACTOR* actor);
|
||||
extern ACTOR* Actor_info_make_actor(Actor_info* actor_info, GAME* game, s16 profile, f32 x, f32 y, f32 z, short rot_x, short rot_y, short rot_z, s8 block_x, s8 block_z, s16 mvactor_list_no, mActor_name_t actor_name, s16 arg, s8 npc_idx, int data_bank);
|
||||
|
||||
extern void mAc_ActorShadowCircle(ACTOR* actor, LightsN* lightsN, GAME_PLAY* play);
|
||||
extern void mAc_ActorShadowEllipse(ACTOR* actor, LightsN* lightsN, GAME_PLAY* play);
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef struct actor_dfltbl_s {
|
||||
typedef struct actor_dlftbl_s {
|
||||
u32 rom_start; // unused in AC
|
||||
u32 rom_end; // unused in AC
|
||||
u8* ram_start; // used only with a check, but never set in AC
|
||||
@@ -19,10 +19,10 @@ typedef struct actor_dfltbl_s {
|
||||
u16 flags; // related to memory pinning but functionally useless in AC since alloc_buf is never allocated
|
||||
s8 num_actors; // number of this type of actor that currently exist
|
||||
s8 unk2; // unused in AC
|
||||
} ACTOR_DFLTBL;
|
||||
} ACTOR_DLFTBL;
|
||||
|
||||
extern int actor_dlftbls_num;
|
||||
extern ACTOR_DFLTBL actor_dlftbls[];
|
||||
extern ACTOR_DLFTBL actor_dlftbls[];
|
||||
|
||||
extern void actor_dlftbls_init();
|
||||
extern void actor_dlftbls_cleanup();
|
||||
|
||||
@@ -50,6 +50,7 @@ enum field_type2 {
|
||||
|
||||
enum field_room {
|
||||
/* TODO: others */
|
||||
mFI_FIELD_FG = mFI_TO_FIELD_ID(mFI_FIELDTYPE_FG, 0),
|
||||
|
||||
mFI_FIELD_PLAYER0_ROOM = mFI_TO_FIELD_ID(mFI_FIELDTYPE_PLAYER_ROOM, 0),
|
||||
mFI_FIELD_PLAYER1_ROOM,
|
||||
|
||||
+88
-3
@@ -59,6 +59,9 @@ extern int mNT_check_unknown(mActor_name_t item_no);
|
||||
#define ITEM_NAME_GET_CAT(n) (((n) & 0x0F00) >> 8)
|
||||
#define ITEM_NAME_GET_INDEX(n) ((mActor_name_t)(n) & 0xFF)
|
||||
|
||||
#define NPC_HOUSE_ID_TO_NPC_ID(house) (house + 0x9000)
|
||||
#define NPC_ID_TO_NPC_HOUSE_ID(npc) (npc - 0x9000)
|
||||
|
||||
#define ITEM_IS_FTR(n) \
|
||||
(ITEM_NAME_GET_TYPE(n) == NAME_TYPE_FTR0 || ITEM_NAME_GET_TYPE(n) == NAME_TYPE_FTR1)
|
||||
|
||||
@@ -468,14 +471,96 @@ extern int mNT_check_unknown(mActor_name_t item_no);
|
||||
|
||||
#define EXIT_DOOR 0x4080
|
||||
|
||||
#define NPC_HOUSE_START 0x5000
|
||||
#define NPC_HOUSE000 NPC_HOUSE_START
|
||||
//
|
||||
#define NPC_HOUSE_END 0x50EE
|
||||
|
||||
#define STRUCTURE_START 0x5800
|
||||
#define HOUSE0 (STRUCTURE_START)
|
||||
#define HOUSE1 (HOUSE0 + 1)
|
||||
#define HOUSE2 (HOUSE1 + 1)
|
||||
#define HOUSE3 (HOUSE2 + 1)
|
||||
#define TRAIN_STATION 0x5809
|
||||
#define TRAIN0 0x580A
|
||||
#define TRAIN1 0x580B
|
||||
#define SHOP0 (HOUSE3 + 1)
|
||||
#define SHOP1 (SHOP0 + 1)
|
||||
#define SHOP2 (SHOP1 + 1)
|
||||
#define SHOP3 (SHOP2 + 1)
|
||||
#define POST_OFFICE (SHOP3 + 1)
|
||||
#define TRAIN_STATION (POST_OFFICE + 1)
|
||||
#define TRAIN0 (TRAIN_STATION + 1)
|
||||
#define TRAIN1 (TRAIN0 + 1)
|
||||
#define POLICE_STATION (TRAIN1 + 1)
|
||||
#define WATERFALL_SOUTH (POLICE_STATION + 1)
|
||||
#define WATERFALL_EAST (WATERFALL_SOUTH + 1)
|
||||
#define WATERFALL_WEST (WATERFALL_EAST + 1)
|
||||
#define SIGN00 (WATERFALL_WEST + 1)
|
||||
#define SIGN01 (SIGN00 + 1)
|
||||
#define SIGN02 (SIGN01 + 1)
|
||||
#define SIGN03 (SIGN02 + 1)
|
||||
#define SIGN04 (SIGN03 + 1)
|
||||
#define SIGN05 (SIGN04 + 1)
|
||||
#define SIGN06 (SIGN05 + 1)
|
||||
#define SIGN07 (SIGN06 + 1)
|
||||
#define SIGN08 (SIGN07 + 1)
|
||||
#define SIGN09 (SIGN08 + 1)
|
||||
#define SIGN10 (SIGN09 + 1)
|
||||
#define SIGN11 (SIGN10 + 1)
|
||||
#define SIGN12 (SIGN11 + 1)
|
||||
#define SIGN13 (SIGN12 + 1)
|
||||
#define SIGN14 (SIGN13 + 1)
|
||||
#define SIGN15 (SIGN14 + 1)
|
||||
#define SIGN16 (SIGN15 + 1)
|
||||
#define SIGN17 (SIGN16 + 1)
|
||||
#define SIGN18 (SIGN17 + 1)
|
||||
#define SIGN19 (SIGN18 + 1)
|
||||
#define SIGN20 (SIGN19 + 1)
|
||||
#define WISHING_WELL (SIGN20 + 1)
|
||||
#define BROKER_TENT (WISHING_WELL + 1)
|
||||
#define FORTUNE_TENT (BROKER_TENT + 1)
|
||||
#define DESIGNER_CAR (FORTUNE_TENT + 1)
|
||||
#define KAMAKURA (DESIGNER_CAR + 1)
|
||||
#define SAKURA_TABLE0 (KAMAKURA + 1)
|
||||
#define SAKURA_TABLE1 (SAKURA_TABLE0 + 1)
|
||||
#define AEROBICS_RADIO (SAKURA_TABLE1 + 1)
|
||||
#define FIREWORKS_STALL0 (AEROBICS_RADIO + 1)
|
||||
#define FIREWORKS_STALL1 (FIREWORKS_STALL0 + 1)
|
||||
#define NEWYEAR_SHRINE0 (FIREWORKS_STALL1 + 1)
|
||||
#define NEWYEAR_SHRINE1 (NEWYEAR_SHRINE0 + 1)
|
||||
#define NEWYEAR_TABLE (NEWYEAR_SHRINE1 + 1)
|
||||
#define NEWYEAR_COUNTDOWN0 (NEWYEAR_TABLE + 1)
|
||||
#define NEWYEAR_COUNTDOWN1 (NEWYEAR_COUNTDOWN0 + 1)
|
||||
#define SPORTSFAIR_BALLS_RED (NEWYEAR_COUNTDOWN1 + 1)
|
||||
#define SPORTSFAIR_BALLS_WHITE (SPORTSFAIR_BALLS_RED + 1)
|
||||
#define SPORTSFAIR_BASKET_RED (SPORTSFAIR_BALLS_WHITE + 1)
|
||||
#define SPORTSFAIR_BASKET_WHITE (SPORTSFAIR_BASKET_RED + 1)
|
||||
#define FISHCHECK_STAND0 (SPORTSFAIR_BASKET_WHITE + 1)
|
||||
#define FISHCHECK_STAND1 (FISHCHECK_STAND0 + 1)
|
||||
#define KOINOBORI_WINDSOCK (FISHCHECK_STAND1 + 1)
|
||||
#define DUMP (KOINOBORI_WINDSOCK + 1)
|
||||
#define WINDMILL0 (DUMP + 1)
|
||||
#define WINDMILL1 (WINDMILL0 + 1)
|
||||
#define WINDMILL2 (WINDMILL1 + 1)
|
||||
#define WINDMILL3 (WINDMILL2 + 1)
|
||||
#define WINDMILL4 (WINDMILL3 + 1)
|
||||
#define LOTUS (WINDMILL4 + 1)
|
||||
#define MIKANBOX (LOTUS + 1)
|
||||
#define DOUZOU (MIKANBOX + 1) // train station statue
|
||||
#define TOUDAI (DOUZOU + 1) // lighthouse
|
||||
#define GHOG (TOUDAI + 1)
|
||||
#define HTABLE0 (GHOG + 1)
|
||||
#define HTABLE1 (HTABLE0 + 1)
|
||||
#define HTABLE2 (HTABLE1 + 1)
|
||||
#define TENT (HTABLE2 + 1)
|
||||
#define MUSEUM (TENT + 1)
|
||||
#define BRIDGE_A0 (MUSEUM + 1)
|
||||
#define BRIDGE_A1 (BRIDGE_A0 + 1)
|
||||
#define NEEDLEWORK_SHOP (BRIDGE_A1 + 1)
|
||||
#define FLAG (NEEDLEWORK_SHOP + 1)
|
||||
#define BOAT (FLAG + 1)
|
||||
#define COTTAGE_MY (BOAT + 1)
|
||||
#define COTTAGE_NPC (COTTAGE_MY + 1)
|
||||
#define PORT_SIGN (COTTAGE_NPC + 1)
|
||||
#define STRUCTURE_END (PORT_SIGN + 1)
|
||||
|
||||
#define ETC_START 0x8000
|
||||
#define ETC_AIRPLANE ETC_START
|
||||
|
||||
+1
-1
@@ -4,6 +4,6 @@
|
||||
#include "types.h"
|
||||
#include "dolphin/vi.h"
|
||||
|
||||
void viBlack(BOOL);
|
||||
extern void viBlack(int black);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,354 @@
|
||||
#include "ac_structure.h"
|
||||
|
||||
#include "m_play.h"
|
||||
#include "m_name_table.h"
|
||||
#include "m_malloc.h"
|
||||
#include "m_common_data.h"
|
||||
|
||||
static void aSTR_actor_ct(ACTOR* actor, GAME* game);
|
||||
static void aSTR_actor_dt(ACTOR* actor, GAME* game);
|
||||
static void aSTR_actor_move(ACTOR* actor, GAME* game);
|
||||
|
||||
ACTOR_PROFILE Structure_Profile = {
|
||||
mAc_PROFILE_STRUCTURE,
|
||||
ACTOR_PART_CONTROL,
|
||||
ACTOR_STATE_NO_MOVE_WHILE_CULLED | ACTOR_STATE_NO_DRAW_WHILE_CULLED,
|
||||
EMPTY_NO,
|
||||
ACTOR_OBJ_BANK_3,
|
||||
sizeof(STRUCTURE_CONTROL_ACTOR),
|
||||
|
||||
&aSTR_actor_ct,
|
||||
&aSTR_actor_dt,
|
||||
&aSTR_actor_move,
|
||||
NONE_ACTOR_PROC,
|
||||
NULL
|
||||
};
|
||||
|
||||
static u8 aSTR_overlay[aSTR_ACTOR_TBL_COUNT][aSTR_OVERLAY_SIZE];
|
||||
static STRUCTURE_ACTOR aSTR_actor_cl[aSTR_ACTOR_TBL_COUNT];
|
||||
|
||||
static void aSTR_init_clip_area();
|
||||
static void aSTR_free_clip_area();
|
||||
|
||||
static void aSTR_actor_ct(ACTOR* actor, GAME* game) {
|
||||
STRUCTURE_CONTROL_ACTOR* structure = (STRUCTURE_CONTROL_ACTOR*)actor;
|
||||
|
||||
aSTR_init_clip_area();
|
||||
structure->str_door_name = Common_Get(door_data).door_actor_name;
|
||||
structure->reset = Common_Get(door_data).exit_type;
|
||||
}
|
||||
|
||||
static void aSTR_actor_dt(ACTOR* actor, GAME* game) {
|
||||
aSTR_free_clip_area();
|
||||
}
|
||||
|
||||
static int request[2]; // TODO: fix ordering by using separate TUs
|
||||
static void aSTR_check_door_data(STRUCTURE_CONTROL_ACTOR* actor, GAME* game) {
|
||||
//static int request[2] = { 4, 5 };
|
||||
|
||||
GAME_PLAY* play = (GAME_PLAY*)game;
|
||||
|
||||
if (ITEM_NAME_GET_TYPE(actor->str_door_name) == NAME_TYPE_STRUCT) {
|
||||
STRUCTURE_ACTOR* str_actor = (STRUCTURE_ACTOR*)Actor_info_fgName_search(&play->actor_info, actor->str_door_name, ACTOR_PART_ITEM);
|
||||
|
||||
if (str_actor != NULL && str_actor->request_type == 0) {
|
||||
str_actor->request_type = request[actor->reset == TRUE];
|
||||
actor->str_door_name = EMPTY_NO;
|
||||
}
|
||||
}
|
||||
else {
|
||||
actor->str_door_name = EMPTY_NO;
|
||||
}
|
||||
}
|
||||
|
||||
static void aSTR_actor_move(ACTOR* actor, GAME* game) {
|
||||
STRUCTURE_CONTROL_ACTOR* structure = (STRUCTURE_CONTROL_ACTOR*)actor;
|
||||
switch (mFI_GetFieldId()) {
|
||||
case mFI_FIELD_FG:
|
||||
aSTR_check_door_data(structure, game);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
extern u16* structure_pal_adrs_nowinter[];
|
||||
extern u16* structure_pal_adrs_winter[];
|
||||
|
||||
static u16* aSTR_get_pal_segment(s16 structure_type) {
|
||||
static u16** pal_adrs_table[2] = { structure_pal_adrs_nowinter, structure_pal_adrs_winter };
|
||||
|
||||
int winter = Common_Get(time).season == mTM_SEASON_WINTER;
|
||||
return pal_adrs_table[winter][structure_type];
|
||||
}
|
||||
|
||||
typedef struct structure_setup_info_s {
|
||||
s16 profile;
|
||||
s16 structure_type; // aSTR_TYPE_*
|
||||
s16 pal_no;
|
||||
s16 pad;
|
||||
} aSTR_setup_info;
|
||||
|
||||
static STRUCTURE_ACTOR* aSTR_setupActor_proc(GAME* game, mActor_name_t structure_name, s16 arg, f32 x, f32 z) {
|
||||
static aSTR_setup_info setupInfo_table[] = {
|
||||
{ mAc_PROFILE_MYHOUSE, 5, 25, 0 },
|
||||
{ mAc_PROFILE_MYHOUSE, 5, 26, 0 },
|
||||
{ mAc_PROFILE_MYHOUSE, 5, 27, 0 },
|
||||
{ mAc_PROFILE_MYHOUSE, 5, 28, 0 },
|
||||
{ mAc_PROFILE_SHOP, 8, 37, 0 },
|
||||
{ mAc_PROFILE_CONVENI, 9, 38, 0 },
|
||||
{ mAc_PROFILE_SUPER, 10, 39, 0 },
|
||||
{ mAc_PROFILE_DEPART, 11, 40, 0 },
|
||||
{ mAc_PROFILE_POST_OFFICE, 12, 41, 0 },
|
||||
{ mAc_PROFILE_STATION, 13, 42, 0 },
|
||||
{ mAc_PROFILE_TRAIN0, 16, 57, 0 },
|
||||
{ mAc_PROFILE_TRAIN1, 17, 58, 0 },
|
||||
{ mAc_PROFILE_POLICE_BOX, 18, 59, 0 },
|
||||
{ mAc_PROFILE_FALLS, 19, 60, 0 },
|
||||
{ mAc_PROFILE_FALLSESW, 20, 61, 0 },
|
||||
{ mAc_PROFILE_FALLSESW, 20, 61, 0 },
|
||||
{ mAc_PROFILE_RESERVE, 21, 62, 0 },
|
||||
{ mAc_PROFILE_RESERVE, 21, 62, 0 },
|
||||
{ mAc_PROFILE_RESERVE, 21, 62, 0 },
|
||||
{ mAc_PROFILE_RESERVE, 21, 62, 0 },
|
||||
{ mAc_PROFILE_RESERVE, 21, 62, 0 },
|
||||
{ mAc_PROFILE_RESERVE, 21, 62, 0 },
|
||||
{ mAc_PROFILE_RESERVE, 21, 62, 0 },
|
||||
{ mAc_PROFILE_RESERVE, 21, 62, 0 },
|
||||
{ mAc_PROFILE_RESERVE, 21, 62, 0 },
|
||||
{ mAc_PROFILE_RESERVE, 21, 62, 0 },
|
||||
{ mAc_PROFILE_RESERVE, 21, 62, 0 },
|
||||
{ mAc_PROFILE_RESERVE, 21, 62, 0 },
|
||||
{ mAc_PROFILE_RESERVE, 21, 62, 0 },
|
||||
{ mAc_PROFILE_RESERVE, 21, 62, 0 },
|
||||
{ mAc_PROFILE_RESERVE, 21, 62, 0 },
|
||||
{ mAc_PROFILE_RESERVE, 21, 62, 0 },
|
||||
{ mAc_PROFILE_RESERVE, 21, 62, 0 },
|
||||
{ mAc_PROFILE_RESERVE, 21, 62, 0 },
|
||||
{ mAc_PROFILE_RESERVE, 21, 62, 0 },
|
||||
{ mAc_PROFILE_RESERVE, 21, 62, 0 },
|
||||
{ mAc_PROFILE_RESERVE, 21, 62, 0 },
|
||||
{ mAc_PROFILE_SHRINE, 22, 63, 0 },
|
||||
{ mAc_PROFILE_BRSHOP, 23, 64, 0 },
|
||||
{ mAc_PROFILE_BUGGY, 24, 65, 0 },
|
||||
{ mAc_PROFILE_S_CAR, 25, 66, 0 },
|
||||
{ mAc_PROFILE_KAMAKURA, 26, 67, 0 },
|
||||
{ mAc_PROFILE_GOZA, 27, 68, 0 },
|
||||
{ mAc_PROFILE_GOZA, 27, 68, 0 },
|
||||
{ mAc_PROFILE_RADIO, 28, 69, 0 },
|
||||
{ mAc_PROFILE_YATAI, 29, 70, 0 },
|
||||
{ mAc_PROFILE_YATAI, 29, 70, 0 },
|
||||
{ mAc_PROFILE_TUKIMI, 30, 71, 0 },
|
||||
{ mAc_PROFILE_TUKIMI, 31, 72, 0 },
|
||||
{ mAc_PROFILE_MIKUJI, 32, 73, 0 },
|
||||
{ mAc_PROFILE_COUNT, 33, 74, 0 },
|
||||
{ mAc_PROFILE_COUNT02, 34, 75, 0 },
|
||||
{ mAc_PROFILE_TAMA, 35, 76, 0 },
|
||||
{ mAc_PROFILE_TAMA, 36, 77, 0 },
|
||||
{ mAc_PROFILE_KAGO, 35, 76, 0 },
|
||||
{ mAc_PROFILE_KAGO, 36, 77, 0 },
|
||||
{ mAc_PROFILE_TURI, 37, 78, 0 },
|
||||
{ mAc_PROFILE_TURI, 38, 79, 0 },
|
||||
{ mAc_PROFILE_KOINOBORI, 39, 80, 0 },
|
||||
{ mAc_PROFILE_DUMP, 40, 81, 0 },
|
||||
{ mAc_PROFILE_WINDMILL, 41, 82, 0 },
|
||||
{ mAc_PROFILE_WINDMILL, 41, 83, 0 },
|
||||
{ mAc_PROFILE_WINDMILL, 41, 84, 0 },
|
||||
{ mAc_PROFILE_WINDMILL, 41, 85, 0 },
|
||||
{ mAc_PROFILE_WINDMILL, 41, 86, 0 },
|
||||
{ mAc_PROFILE_LOTUS, 42, 87, 0 },
|
||||
{ mAc_PROFILE_MIKANBOX, 43, 88, 0 },
|
||||
{ mAc_PROFILE_DOUZOU, 44, 89, 0 },
|
||||
{ mAc_PROFILE_TOUDAI, 45, 90, 0 },
|
||||
{ mAc_PROFILE_GHOG, 46, 91, 0 },
|
||||
{ mAc_PROFILE_HTABLE, 47, 91, 0 },
|
||||
{ mAc_PROFILE_HTABLE, 47, 91, 0 },
|
||||
{ mAc_PROFILE_HTABLE, 47, 91, 0 },
|
||||
{ mAc_PROFILE_TENT, 26, 67, 0 },
|
||||
{ mAc_PROFILE_MUSEUM, 48, 91, 0 },
|
||||
{ mAc_PROFILE_BRIDGE_A, 49, 92, 0 },
|
||||
{ mAc_PROFILE_BRIDGE_A, 49, 92, 0 },
|
||||
{ mAc_PROFILE_NEEDLEWORK_SHOP, 51, 93, 0 },
|
||||
{ mAc_PROFILE_FLAG, 52, 94, 0 },
|
||||
{ mAc_PROFILE_BOAT, 53, 95, 0 },
|
||||
{ mAc_PROFILE_COTTAGE_MY, 54, 96, 0 },
|
||||
{ mAc_PROFILE_COTTAGE_NPC, 55, 97, 0 },
|
||||
{ mAc_PROFILE_RESERVE, 21, 62, 0 },
|
||||
};
|
||||
|
||||
STRUCTURE_ACTOR* str_actor;
|
||||
GAME_PLAY* play = (GAME_PLAY*)game;
|
||||
s16 profile;
|
||||
xyz_t pos;
|
||||
|
||||
if (structure_name < NPC_HOUSE_END) {
|
||||
mNpc_SearchAnimalinfo(Save_Get(animals), NPC_HOUSE_ID_TO_NPC_ID(structure_name), ANIMAL_NUM_MAX);
|
||||
profile = mAc_PROFILE_HOUSE;
|
||||
}
|
||||
else if (structure_name >= HOUSE0 && structure_name < SHOP0) {
|
||||
int idx = structure_name - STRUCTURE_START;
|
||||
profile = setupInfo_table[idx].profile;
|
||||
}
|
||||
else if (structure_name >= TRAIN_STATION && structure_name < TRAIN0) {
|
||||
profile = mAc_PROFILE_STATION;
|
||||
}
|
||||
else {
|
||||
int idx = structure_name - STRUCTURE_START;
|
||||
profile = setupInfo_table[idx].profile;
|
||||
}
|
||||
|
||||
pos.x = x;
|
||||
pos.z = z;
|
||||
pos.y = mCoBG_GetBgY_OnlyCenter_FromWpos2(pos, 0.0f);
|
||||
|
||||
str_actor = (STRUCTURE_ACTOR*)Actor_info_make_actor(&play->actor_info, game, profile, pos.x, pos.y, pos.z, 0, 0, 0, play->block_table.block_x, play->block_table.block_z, -1, structure_name, arg, -1, -1);
|
||||
if (str_actor != NULL) {
|
||||
mFI_SetFG_common(RSV_NO, pos, FALSE);
|
||||
}
|
||||
|
||||
return str_actor;
|
||||
}
|
||||
|
||||
static int aSTR_get_overlay_free_area_idx() {
|
||||
aSTR_Clip_c* clip = Common_Get(clip).structure_clip;
|
||||
aSTR_Overlay_info_c* overlay_info = clip->overlay_area;
|
||||
int res = -1;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < aSTR_ACTOR_TBL_COUNT; i++) {
|
||||
if (overlay_info->used == FALSE) {
|
||||
res = i;
|
||||
break;
|
||||
}
|
||||
overlay_info++;
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
static void aSTR_get_overlay_area_proc(ACTOR_DLFTBL* dlftbl) {
|
||||
int overlay_idx = aSTR_get_overlay_free_area_idx();
|
||||
|
||||
if (overlay_idx != -1) {
|
||||
aSTR_Overlay_info_c* overlay_info = Common_Get(clip).structure_clip->overlay_area + overlay_idx;
|
||||
aSTR_Overlay_info_c* overlay2_info;
|
||||
dlftbl->alloc_buf = overlay_info->overlay_p;
|
||||
|
||||
overlay2_info = Common_Get(clip).structure_clip->overlay_area + overlay_idx;
|
||||
overlay2_info->used = TRUE;
|
||||
}
|
||||
else {
|
||||
dlftbl->alloc_buf = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static void aSTR_free_overlay_area_proc(ACTOR_DLFTBL* dlftbl) {
|
||||
aSTR_Clip_c* clip = Common_Get(clip).structure_clip;
|
||||
aSTR_Overlay_info_c* overlay_info = clip->overlay_area;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < aSTR_ACTOR_TBL_COUNT; i++) {
|
||||
if (overlay_info->overlay_p == dlftbl->alloc_buf) {
|
||||
overlay_info->used = FALSE;
|
||||
dlftbl->alloc_buf = NULL;
|
||||
break;
|
||||
}
|
||||
overlay_info++;
|
||||
}
|
||||
}
|
||||
|
||||
static STRUCTURE_ACTOR* aSTR_get_actor_area_proc() {
|
||||
aSTR_Clip_c* clip = Common_Get(clip).structure_clip;
|
||||
STRUCTURE_ACTOR** str_tbl = clip->structure_actor_tbl;
|
||||
int* str_used_tbl = clip->structure_actor_used_tbl;
|
||||
|
||||
STRUCTURE_ACTOR* res = NULL;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < aSTR_ACTOR_TBL_COUNT; i++) {
|
||||
if (*str_tbl != NULL && *str_used_tbl == FALSE) {
|
||||
*str_used_tbl = TRUE;
|
||||
res = *str_tbl;
|
||||
break;
|
||||
}
|
||||
str_tbl++;
|
||||
str_used_tbl++;
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
static void aSTR_free_actor_area_proc(STRUCTURE_ACTOR* str_actor) {
|
||||
aSTR_Clip_c* clip = Common_Get(clip).structure_clip;
|
||||
STRUCTURE_ACTOR** str_tbl = clip->structure_actor_tbl;
|
||||
int* str_used_tbl = clip->structure_actor_used_tbl;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < aSTR_ACTOR_TBL_COUNT; i++) {
|
||||
if (*str_tbl == str_actor) {
|
||||
*str_used_tbl = FALSE;
|
||||
break;
|
||||
}
|
||||
str_tbl++;
|
||||
str_used_tbl++;
|
||||
}
|
||||
}
|
||||
|
||||
static void aSTR_init_clip_area() {
|
||||
if (Common_Get(clip).structure_clip == NULL) {
|
||||
int i;
|
||||
|
||||
Common_Set(clip.structure_clip, (aSTR_Clip_c*)zelda_malloc(sizeof(aSTR_Clip_c)));
|
||||
|
||||
Common_Get(clip).structure_clip->setup_actor_proc = &aSTR_setupActor_proc;
|
||||
Common_Get(clip).structure_clip->get_overlay_area_proc = &aSTR_get_overlay_area_proc;
|
||||
Common_Get(clip).structure_clip->free_overlay_area_proc = &aSTR_free_overlay_area_proc;
|
||||
Common_Get(clip).structure_clip->get_actor_area_proc = &aSTR_get_actor_area_proc;
|
||||
Common_Get(clip).structure_clip->free_actor_area_proc = &aSTR_free_actor_area_proc;
|
||||
Common_Get(clip).structure_clip->get_pal_segment_proc = &aSTR_get_pal_segment;
|
||||
|
||||
{
|
||||
STRUCTURE_ACTOR** str_tbl = Common_Get(clip).structure_clip->structure_actor_tbl;
|
||||
int* str_used_tbl = Common_Get(clip).structure_clip->structure_actor_used_tbl;
|
||||
aSTR_Overlay_info_c* overlay_info = Common_Get(clip).structure_clip->overlay_area;
|
||||
for (i = 0; i < aSTR_ACTOR_TBL_COUNT; i++) {
|
||||
*str_tbl = &aSTR_actor_cl[i];
|
||||
*str_used_tbl = FALSE;
|
||||
|
||||
str_tbl++;
|
||||
str_used_tbl++;
|
||||
|
||||
overlay_info->overlay_p = aSTR_overlay[i];
|
||||
overlay_info->used = FALSE;
|
||||
|
||||
overlay_info++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void aSTR_free_clip_area() {
|
||||
aSTR_Clip_c* clip = Common_Get(clip).structure_clip;
|
||||
|
||||
if (clip != NULL) {
|
||||
STRUCTURE_ACTOR** str_tbl = clip->structure_actor_tbl;
|
||||
aSTR_Overlay_info_c* overlay_info = clip->overlay_area;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < aSTR_ACTOR_TBL_COUNT; i++) {
|
||||
if (*str_tbl != NULL) {
|
||||
*str_tbl = NULL;
|
||||
}
|
||||
|
||||
if (overlay_info->overlay_p != NULL) {
|
||||
overlay_info->overlay_p = NULL;
|
||||
}
|
||||
|
||||
str_tbl++;
|
||||
overlay_info++;
|
||||
}
|
||||
|
||||
zelda_free(Common_Get(clip).structure_clip);
|
||||
Common_Set(clip.structure_clip, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
static int request[2] = { 4, 5 }; // TODO: remove when separated TUs are implemented and aSTR_check_door_data is corrected
|
||||
@@ -253,7 +253,7 @@
|
||||
{0,0,NULL,NULL,NULL,NULL,0,0,0,0}
|
||||
|
||||
|
||||
ACTOR_DFLTBL actor_dlftbls[] = {
|
||||
ACTOR_DLFTBL actor_dlftbls[] = {
|
||||
MAKE_ACTOR_DLF(Player),
|
||||
MAKE_ACTOR_DLF(BgItem),
|
||||
MAKE_ACTOR_DLF(Sample),
|
||||
|
||||
+3
-3
@@ -1,5 +1,5 @@
|
||||
#include "sys_vimgr.h"
|
||||
|
||||
void viBlack(BOOL black){
|
||||
VISetBlack(black);
|
||||
}
|
||||
extern void viBlack(int black) {
|
||||
VISetBlack(black);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user