mirror of
https://github.com/encounter/ac-decomp.git
synced 2026-03-30 10:57:04 -07:00
304 lines
9.7 KiB
C
304 lines
9.7 KiB
C
#ifndef M_SCENE_H
|
|
#define M_SCENE_H
|
|
|
|
#include "types.h"
|
|
#include "m_actor.h"
|
|
#include "m_lib.h"
|
|
#include "famicom_emu.h"
|
|
#include "m_scene_table.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#define mSc_ARENA_SIZE 0xA000
|
|
|
|
enum {
|
|
mSc_DIRECT_SOUTH,
|
|
mSc_DIRECT_SOUTH_EAST,
|
|
mSc_DIRECT_EAST,
|
|
mSc_DIRECT_NORTH_EAST,
|
|
mSc_DIRECT_NORTH,
|
|
mSc_DIRECT_NORTH_WEST,
|
|
mSc_DIRECT_WEST,
|
|
mSc_DIRECT_SOUTH_WEST,
|
|
|
|
mSc_DIRECT_NUM
|
|
};
|
|
|
|
enum {
|
|
mSc_ITEM_TYPE_BGITEM,
|
|
mSc_ITEM_TYPE_DUMMY,
|
|
mSc_ITEM_TYPE_BGPOLICEITEM,
|
|
mSc_ITEM_TYPE_BGPOSTITEM,
|
|
|
|
mSc_ITEM_TYPE_NUM
|
|
};
|
|
|
|
enum {
|
|
mSc_ROOM_TYPE_OUTDOORS,
|
|
mSc_ROOM_TYPE_MY_ROOM,
|
|
mSc_ROOM_TYPE_NPC_ROOM,
|
|
mSc_ROOM_TYPE_MISC_ROOM,
|
|
|
|
mSc_ROOM_TYPE_NUM
|
|
};
|
|
|
|
typedef struct door_data_s {
|
|
/* 0x00 */ int next_scene_id;
|
|
/* 0x04 */ u8 exit_orientation;
|
|
/* 0x05 */ u8 exit_type; // 0 = normal, 1 = restart game?
|
|
/* 0x06 */ u16 extra_data;
|
|
/* 0x08 */ s_xyz exit_position;
|
|
/* 0x0E */ mActor_name_t door_actor_name;
|
|
/* 0x10 */ u8 wipe_type;
|
|
/* 0x11 */ u8 pad[3]; // possibly necessary due to struct copy
|
|
} Door_data_c;
|
|
|
|
#define mSc_OBJECT_BANK_NUM 70
|
|
|
|
typedef struct object_bank_s {
|
|
s16 bank_id;
|
|
char* ram_start;
|
|
char* dma_start;
|
|
u32 rom_addr;
|
|
size_t size;
|
|
u32 _14;
|
|
int _18;
|
|
int _1C;
|
|
int _20;
|
|
int _24;
|
|
int _28;
|
|
OSMessageQueue* msg_queue_p;
|
|
OSMessage _30_msg;
|
|
OSMessageQueue dma_controller_msg_queue;
|
|
OSMessage dma_controller_msg;
|
|
s16 num_exist;
|
|
u8 part_id;
|
|
u8 state;
|
|
} Object_Bank_c;
|
|
|
|
typedef struct object_exchange_s {
|
|
Object_Bank_c banks[mSc_OBJECT_BANK_NUM];
|
|
int bank_idx;
|
|
int keep_id;
|
|
int exchange_id;
|
|
char* next_bank_ram_address;
|
|
char* max_ram_address;
|
|
char* start_address_save[2];
|
|
char* end_address_save[2];
|
|
char* _194C;
|
|
int selected_partition;
|
|
int _1954;
|
|
} Object_Exchange_c;
|
|
|
|
enum {
|
|
mSc_SCENE_DATA_TYPE_PLAYER_PTR,
|
|
mSc_SCENE_DATA_TYPE_CTRL_ACTOR_PTR,
|
|
mSc_SCENE_DATA_TYPE_ACTOR_PTR,
|
|
mSc_SCENE_DATA_TYPE_OBJECT_EXCHANGE_BANK_PTR,
|
|
mSc_SCENE_DATA_TYPE_DOOR_DATA_PTR,
|
|
mSc_SCENE_DATA_TYPE_FIELD_CT,
|
|
mSc_SCENE_DATA_TYPE_MY_ROOM_CT,
|
|
mSc_SCENE_DATA_TYPE_ARRANGE_ROOM_CT,
|
|
mSc_SCENE_DATA_TYPE_ARRANGE_FURNITURE_CT,
|
|
mSc_SCENE_DATA_TYPE_SOUND,
|
|
mSc_SCENE_DATA_TYPE_END,
|
|
|
|
mSc_SCENE_DATA_TYPE_NUM
|
|
};
|
|
|
|
typedef struct {
|
|
/* 0x00 */ u8 type;
|
|
/* 0x01 */ u8 num_actors;
|
|
/* 0x04 */ Actor_data* data_p;
|
|
} Scene_Word_Data_Actor_c;
|
|
|
|
typedef struct {
|
|
/* 0x00 */ u8 type;
|
|
/* 0x01 */ u8 num_ctrl_actors;
|
|
/* 0x04 */ s16* ctrl_actor_profile_p;
|
|
} Scene_Word_Data_Ctrl_Actor_c;
|
|
|
|
typedef struct {
|
|
/* 0x00 */ u8 type;
|
|
/* 0x01 */ u8 num_banks;
|
|
/* 0x04 */ s16* banks_p;
|
|
} Scene_Word_Data_Object_Bank_c;
|
|
|
|
typedef struct {
|
|
/* 0x00 */ u8 type;
|
|
/* 0x01 */ u8 num_doors;
|
|
/* 0x04 */ Door_data_c* door_data_p;
|
|
} Scene_Word_Data_Door_Data_c;
|
|
|
|
typedef struct {
|
|
/* 0x00 */ u8 type;
|
|
/* 0x01 */ u8 item_type;
|
|
/* 0x02 */ u8 bg_num;
|
|
/* 0x04 */ u16 bg_disp_size;
|
|
/* 0x06 */ u8 room_type;
|
|
/* 0x07 */ u8 draw_type;
|
|
} Scene_Word_Data_FieldCt_c;
|
|
|
|
typedef struct {
|
|
/* 0x00 */ u8 type;
|
|
/* 0x01 */ u8 arrange_ftr_num;
|
|
} Scene_Word_Data_ArrangeFurniture_ct_c;
|
|
|
|
typedef struct {
|
|
/* 0x00 */ u8 type;
|
|
/* 0x01 */ u8 param0;
|
|
/* 0x02 */ u8 param1;
|
|
/* 0x03 */ u8 param2;
|
|
/* 0x04 */ u32 param3;
|
|
} Scene_Word_Data_Misc_c;
|
|
|
|
typedef union scene_word_u {
|
|
Scene_Word_Data_Misc_c misc; /* MY_ROOM_CT, ARRANGE_ROOM_CT, ARRANGE_FURNITURE_CT, SOUND */
|
|
Scene_Word_Data_Actor_c actor; /* PLAYER_PTR, ACTOR_PTR */
|
|
Scene_Word_Data_Ctrl_Actor_c control_actor;
|
|
Scene_Word_Data_Object_Bank_c object_bank;
|
|
Scene_Word_Data_Door_Data_c door_data;
|
|
Scene_Word_Data_FieldCt_c field_ct;
|
|
Scene_Word_Data_ArrangeFurniture_ct_c arrange_ftr_ct;
|
|
} Scene_Word_u;
|
|
|
|
#define mSc_DATA_PLAYER(actor_data_p) \
|
|
{ \
|
|
mSc_SCENE_DATA_TYPE_PLAYER_PTR, 1, 0, 0, (u32)actor_data_p, \
|
|
}
|
|
|
|
#define mSc_DATA_CTRL_ACTORS(n_actors, ctrl_actor_list_p) \
|
|
{ \
|
|
mSc_SCENE_DATA_TYPE_CTRL_ACTOR_PTR, n_actors, 0, 0, (u32)ctrl_actor_list_p, \
|
|
}
|
|
|
|
#define mSc_DATA_ACTORS(n_actors, actor_data_p) \
|
|
{ \
|
|
mSc_SCENE_DATA_TYPE_ACTOR_PTR, n_actors, 0, 0, (u32)actor_data_p, \
|
|
}
|
|
|
|
#define mSc_DATA_OBJ_BANK(n_banks, bank_list_p) \
|
|
{ \
|
|
mSc_SCENE_DATA_TYPE_OBJECT_EXCHANGE_BANK_PTR, n_banks, 0, 0, (u32)bank_list_p, \
|
|
}
|
|
|
|
#define mSc_DATA_DOOR_DATA(n_doors, door_data_list_p) \
|
|
{ \
|
|
mSc_SCENE_DATA_TYPE_DOOR_DATA_PTR, n_doors, 0, 0, (u32)door_data_list_p, \
|
|
}
|
|
|
|
#define mSc_DATA_FIELDCT(item_type, bg_num, bg_disp_size, room_type, draw_type) \
|
|
{ \
|
|
mSc_SCENE_DATA_TYPE_FIELD_CT, \
|
|
item_type, \
|
|
bg_num, \
|
|
0, \
|
|
((((u32)bg_disp_size & 0xFFFF) << 16) | ((room_type & 0xFF) << 8) | (draw_type & 0xFF)), \
|
|
}
|
|
|
|
#define mSc_DATA_MY_ROOM_CT() \
|
|
{ \
|
|
mSc_SCENE_DATA_TYPE_MY_ROOM_CT, 0, 0, 0, 0, \
|
|
}
|
|
|
|
#define mSc_DATA_ARRANGE_ROOM_CT() \
|
|
{ \
|
|
mSc_SCENE_DATA_TYPE_ARRANGE_ROOM_CT, 0, 0, 0, 0, \
|
|
}
|
|
|
|
#define mSc_DATA_ARRANGE_FTR(ftr_num) \
|
|
{ \
|
|
mSc_SCENE_DATA_TYPE_ARRANGE_FURNITURE_CT, ftr_num, 0, 0, 0, \
|
|
}
|
|
|
|
#define mSc_DATA_SOUND(p0, p1) \
|
|
{ \
|
|
mSc_SCENE_DATA_TYPE_SOUND, p0, p1, 0, 0, \
|
|
}
|
|
|
|
#define mSc_DATA_END() \
|
|
{ \
|
|
mSc_SCENE_DATA_TYPE_END, 0, 0, 0, 0, \
|
|
}
|
|
|
|
typedef struct door_info_s {
|
|
/* 0x00 */ u8 num_doors;
|
|
/* 0x04 */ Door_data_c* door_data_p;
|
|
} Door_info_c;
|
|
|
|
extern Scene_Word_u test01_info[];
|
|
extern Scene_Word_u test02_info[];
|
|
extern Scene_Word_u test03_info[];
|
|
extern Scene_Word_u water_test_info[];
|
|
extern Scene_Word_u test_step01_info[];
|
|
extern Scene_Word_u test04_info[];
|
|
extern Scene_Word_u npc_room01_info[];
|
|
extern Scene_Word_u test_fd_npc_land_info[];
|
|
extern Scene_Word_u field_tool_field_info[];
|
|
extern Scene_Word_u shop01_info[];
|
|
extern Scene_Word_u BG_TEST01_info[];
|
|
extern Scene_Word_u BG_TEST01_XLU_info[];
|
|
extern Scene_Word_u broker_shop_info[];
|
|
extern Scene_Word_u fg_tool_in_info[];
|
|
extern Scene_Word_u post_office_info[];
|
|
extern Scene_Word_u start_demo1_info[];
|
|
extern Scene_Word_u start_demo2_info[];
|
|
extern Scene_Word_u police_box_info[];
|
|
extern Scene_Word_u buggy_info[];
|
|
extern Scene_Word_u player_select_info[];
|
|
extern Scene_Word_u player_room_s_info[];
|
|
extern Scene_Word_u player_room_m_info[];
|
|
extern Scene_Word_u player_room_l_info[];
|
|
extern Scene_Word_u shop02_info[];
|
|
extern Scene_Word_u shop03_info[];
|
|
extern Scene_Word_u shop04_1f_info[];
|
|
extern Scene_Word_u test05_info[];
|
|
extern Scene_Word_u PLAYER_SELECT2_info[];
|
|
extern Scene_Word_u PLAYER_SELECT3_info[];
|
|
extern Scene_Word_u shop04_2f_info[];
|
|
extern Scene_Word_u event_notification_info[];
|
|
extern Scene_Word_u kamakura_info[];
|
|
extern Scene_Word_u field_tool_field_info[];
|
|
extern Scene_Word_u title_demo_info[];
|
|
extern Scene_Word_u PLAYER_SELECT4_info[];
|
|
extern Scene_Word_u museum_entrance_info[];
|
|
extern Scene_Word_u museum_picture_info[];
|
|
extern Scene_Word_u museum_fossil_info[];
|
|
extern Scene_Word_u museum_insect_info[];
|
|
extern Scene_Word_u museum_fish_info[];
|
|
extern Scene_Word_u player_room_ll1_info[];
|
|
extern Scene_Word_u player_room_ll2_info[];
|
|
extern Scene_Word_u p_room_bm_s_info[];
|
|
extern Scene_Word_u p_room_bm_m_info[];
|
|
extern Scene_Word_u p_room_bm_l_info[];
|
|
extern Scene_Word_u p_room_bm_ll1_info[];
|
|
extern Scene_Word_u NEEDLEWORK_info[];
|
|
extern Scene_Word_u player_room_island_info[];
|
|
extern Scene_Word_u npc_room_island_info[];
|
|
extern Scene_Word_u start_demo3_info[];
|
|
extern Scene_Word_u lighthouse_info[];
|
|
extern Scene_Word_u tent_info[];
|
|
|
|
extern char* mSc_secure_exchange_keep_bank(Object_Exchange_c* exchange, s16 bank_id, size_t size);
|
|
extern void mSc_background_dmacopy_controller(Object_Bank_c* bank);
|
|
extern void mSc_dmacopy_data_bank(Object_Exchange_c* exchange);
|
|
extern int mSc_bank_regist_check(Object_Exchange_c* exchange, s16 bank_id);
|
|
extern void mSc_regist_initial_exchange_bank(GAME_PLAY* play);
|
|
extern void mSc_dmacopy_all_exchange_bank(Object_Exchange_c* exchange);
|
|
extern void mSc_data_bank_ct(GAME_PLAY* play, Object_Exchange_c* exchange);
|
|
extern void mSc_decide_exchange_bank(Object_Exchange_c* exchange);
|
|
extern void Scene_ct(GAME_PLAY* play, Scene_Word_u* scene_data);
|
|
extern void Door_info_ct(Door_info_c* door_info);
|
|
extern int goto_other_scene(GAME_PLAY* play, Door_data_c* door_data, int update_player_mode);
|
|
extern int goto_next_scene(GAME_PLAY* play, int next_idx, int update_player_mode);
|
|
extern int goto_emu_game(GAME* game, s16 famicom_rom_id);
|
|
extern void return_emu_game(GAME* game);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|