diff --git a/config/rel_slices.yml b/config/rel_slices.yml index 93f02d75..e6bf3851 100644 --- a/config/rel_slices.yml +++ b/config/rel_slices.yml @@ -90,6 +90,9 @@ m_museum.c: .rodata: [0x80642938, 0x80642950] .data: [0x8065A280, 0x8065A308] .bss: [0x81298A00, 0x81298B40] +m_museum_display.c: + .text: [0x803C74C0, 0x803C8090] + .data: [0x8065A308, 0x8065A3F8] m_mushroom.c: .text: [0x803C8090, 0x803C90A8] .rodata: [0x80642950, 0x80642960] diff --git a/include/m_museum_display.h b/include/m_museum_display.h index 394a8b97..80f4e3d1 100644 --- a/include/m_museum_display.h +++ b/include/m_museum_display.h @@ -28,15 +28,51 @@ enum { mMmd_DISPLAY_NUM }; +enum { + mMmd_DONATOR_NONE, + mMmd_DONATOR_PLAYER1, + mMmd_DONATOR_PLAYER2, + mMmd_DONATOR_PLAYER3, + mMmd_DONATOR_PLAYER4, + mMmd_DONATOR_DELETED_PLAYER, + + mMmd_DONATOR_NUM +}; + +enum { + mMmd_CATEGORY_FOSSIL, + mMmd_CATEGORY_ART, + mMmd_CATEGORY_INSECT, + mMmd_CATEGORY_FISH, + + mMmd_CATEGORY_NUM +}; + /* 4 bits per donatable item */ #define mMmd_BIT_INFO(info, category, index) \ - (((info).category[(index) / 2] >> (((index) & 1) << 2)) & 0x0F) + (((info).category##_bit[(index) >> 1] >> (((index) & 1) << 2)) & 0x0F) #define mMmd_ART_BIT(info, index) mMmd_BIT_INFO(info, art, index) #define mMmd_INSECT_BIT(info, index) mMmd_BIT_INFO(info, insect, index) #define mMmd_FISH_BIT(info, index) mMmd_BIT_INFO(info, fish, index) #define mMmd_FOSSIL_BIT(info, index) mMmd_BIT_INFO(info, fossil, index) +#define mMmd_BIT_CLR(info, category, index) \ + ((info).category##_bit[(index) >> 1] &= ~(0b1111 << (((index) & 1) * 4))) + +#define mMmd_FOSSIL_CLR(info, index) mMmd_BIT_CLR(info, fossil, index) +#define mMmd_ART_CLR(info, index) mMmd_BIT_CLR(info, art, index) +#define mMmd_INSECT_CLR(info, index) mMmd_BIT_CLR(info, insect, index) +#define mMmd_FISH_CLR(info, index) mMmd_BIT_CLR(info, fish, index) + +#define mMmd_BIT_SET(info, category, index, value) \ + ((info).category##_bit[(index) >> 1] |= (((value) & 0b1111) << (((index) & 1)) * 4)) + +#define mMmd_FOSSIL_SET(info, index, value) mMmd_BIT_SET(info, fossil, index, value) +#define mMmd_ART_SET(info, index, value) mMmd_BIT_SET(info, art, index, value) +#define mMmd_INSECT_SET(info, index, value) mMmd_BIT_SET(info, insect, index, value) +#define mMmd_FISH_SET(info, index, value) mMmd_BIT_SET(info, fish, index, value) + /* sizeof(mMmd_info_c) == 0x3F */ typedef struct museum_display_info_s { /* 0x00 */ u8 fossil_bit[mMmd_FOSSIL_BIT_NUM]; @@ -45,8 +81,18 @@ typedef struct museum_display_info_s { /* 0x2A */ u8 insect_bit[mMmd_INSECT_BIT_NUM]; } mMmd_info_c; -extern int mMmd_GetDisplayInfo(mActor_name_t item); +extern int mMmd_FossilInfo(int fossil_no); +extern int mMmd_ArtInfo(int art_no); +extern int mMmd_InsectInfo(int insect_no); +extern int mMmd_FishInfo(int fish_no); +extern void mMmd_SetFossil(int fossil_no); +extern void mMmd_SetArt(int art_no); +extern void mMmd_SetInsect(int insect_no); +extern void mMmd_SetFish(int fish_no); +extern mMmd_GetDisplayInfo(mActor_name_t item); extern int mMmd_RequestMuseumDisplay(mActor_name_t item); +extern void mMmd_MakeMuseumDisplayData(); +extern void mMmd_DeletePresentedByPlayer(u8 player_no); extern int mMmd_CountDisplayedFossil(); extern int mMmd_CountDisplayedArt(); extern int mMmd_CountDisplayedInsect(); diff --git a/include/m_name_table.h b/include/m_name_table.h index 3fef1daa..7608ace2 100644 --- a/include/m_name_table.h +++ b/include/m_name_table.h @@ -338,6 +338,13 @@ extern int mNT_check_unknown(mActor_name_t item_no); #define FTR_BIRTHDAY_CAKE_NORTH 0x11FE #define FTR_BIRTHDAY_CAKE_WEST 0x11FF +#define FTR_PAINTING0 0x12AC // famous painting + +#define FTR_PAINTING14 0x12E4 // worthy painting +#define FTR_PAINTING14_EAST 0x12E5 +#define FTR_PAINTING14_NORTH 0x12E6 +#define FTR_PAINTING14_WEST 0x12E7 + #define FTR_DRACAENA 0x13B0 #define FTR_DRACAENA_EAST 0x13B1 #define FTR_DRACAENA_NORTH 0x13B2 @@ -381,6 +388,16 @@ extern int mNT_check_unknown(mActor_name_t item_no); #define FTR_DINO_TRILOBITE_WEST 0x1F4F +#define FTR_DINO_DISP_TRICERA 0x1F7C +#define FTR_DINO_DISP_TREX 0x1F80 +#define FTR_DINO_DISP_BRONTO 0x1F84 +#define FTR_DINO_DISP_PTERA 0x1F88 +#define FTR_DINO_DISP_PLESIO 0x1F8C +#define FTR_DINO_DISP_MAMMOTH 0x1F90 +#define FTR_DINO_DISP_STEGO 0x1F94 +#define FTR_DINO_DISP_STEGO2 0x1F98 +#define FTR_FOSSIL 0x1F9C + #define FTR_PIGGY_BANK 0x1FAC #define FTR_TISSUE 0x1FB0 @@ -532,6 +549,49 @@ extern int mNT_check_unknown(mActor_name_t item_no); #define ITM_LEAF_FAN 0x225B #define ITM_TOOL_END (ITM_LEAF_FAN + 1) +#define ITM_FISH_START 0x2300 +#define ITM_FISH00 (ITM_FISH_START + 0) +#define ITM_FISH01 (ITM_FISH_START + 1) +#define ITM_FISH02 (ITM_FISH_START + 2) +#define ITM_FISH03 (ITM_FISH_START + 3) +#define ITM_FISH04 (ITM_FISH_START + 4) +#define ITM_FISH05 (ITM_FISH_START + 5) +#define ITM_FISH06 (ITM_FISH_START + 6) +#define ITM_FISH07 (ITM_FISH_START + 7) +#define ITM_FISH08 (ITM_FISH_START + 8) +#define ITM_FISH09 (ITM_FISH_START + 9) +#define ITM_FISH10 (ITM_FISH_START + 10) +#define ITM_FISH11 (ITM_FISH_START + 11) +#define ITM_FISH12 (ITM_FISH_START + 12) +#define ITM_FISH13 (ITM_FISH_START + 13) +#define ITM_FISH14 (ITM_FISH_START + 14) +#define ITM_FISH15 (ITM_FISH_START + 15) +#define ITM_FISH16 (ITM_FISH_START + 16) +#define ITM_FISH17 (ITM_FISH_START + 17) +#define ITM_FISH18 (ITM_FISH_START + 18) +#define ITM_FISH19 (ITM_FISH_START + 19) +#define ITM_FISH20 (ITM_FISH_START + 20) +#define ITM_FISH21 (ITM_FISH_START + 21) +#define ITM_FISH22 (ITM_FISH_START + 22) +#define ITM_FISH23 (ITM_FISH_START + 23) +#define ITM_FISH24 (ITM_FISH_START + 24) +#define ITM_FISH25 (ITM_FISH_START + 25) +#define ITM_FISH26 (ITM_FISH_START + 26) +#define ITM_FISH27 (ITM_FISH_START + 27) +#define ITM_FISH28 (ITM_FISH_START + 28) +#define ITM_FISH29 (ITM_FISH_START + 29) +#define ITM_FISH30 (ITM_FISH_START + 30) +#define ITM_FISH31 (ITM_FISH_START + 31) +#define ITM_FISH32 (ITM_FISH_START + 32) +#define ITM_FISH33 (ITM_FISH_START + 33) +#define ITM_FISH34 (ITM_FISH_START + 34) +#define ITM_FISH35 (ITM_FISH_START + 35) +#define ITM_FISH36 (ITM_FISH_START + 36) +#define ITM_FISH37 (ITM_FISH_START + 37) +#define ITM_FISH38 (ITM_FISH_START + 38) +#define ITM_FISH39 (ITM_FISH_START + 39) +#define ITM_FISH_END (ITM_FISH_START + 40) + #define ITM_CLOTH_START 0x2400 #define ITM_CLOTH000 (ITM_CLOTH_START + 0) #define ITM_CLOTH001 (ITM_CLOTH_START + 1) @@ -879,6 +939,54 @@ extern int mNT_check_unknown(mActor_name_t item_no); #define ITM_TICKET_START 0x2C00 +#define ITM_INSECT_START 0x2D00 +#define ITM_INSECT00 (ITM_INSECT_START + 0) +#define ITM_INSECT01 (ITM_INSECT_START + 1) +#define ITM_INSECT02 (ITM_INSECT_START + 2) +#define ITM_INSECT03 (ITM_INSECT_START + 3) +#define ITM_INSECT04 (ITM_INSECT_START + 4) +#define ITM_INSECT05 (ITM_INSECT_START + 5) +#define ITM_INSECT06 (ITM_INSECT_START + 6) +#define ITM_INSECT07 (ITM_INSECT_START + 7) +#define ITM_INSECT08 (ITM_INSECT_START + 8) +#define ITM_INSECT09 (ITM_INSECT_START + 9) +#define ITM_INSECT10 (ITM_INSECT_START + 10) +#define ITM_INSECT11 (ITM_INSECT_START + 11) +#define ITM_INSECT12 (ITM_INSECT_START + 12) +#define ITM_INSECT13 (ITM_INSECT_START + 13) +#define ITM_INSECT14 (ITM_INSECT_START + 14) +#define ITM_INSECT15 (ITM_INSECT_START + 15) +#define ITM_INSECT16 (ITM_INSECT_START + 16) +#define ITM_INSECT17 (ITM_INSECT_START + 17) +#define ITM_INSECT18 (ITM_INSECT_START + 18) +#define ITM_INSECT19 (ITM_INSECT_START + 19) +#define ITM_INSECT20 (ITM_INSECT_START + 20) +#define ITM_INSECT21 (ITM_INSECT_START + 21) +#define ITM_INSECT22 (ITM_INSECT_START + 22) +#define ITM_INSECT23 (ITM_INSECT_START + 23) +#define ITM_INSECT24 (ITM_INSECT_START + 24) +#define ITM_INSECT25 (ITM_INSECT_START + 25) +#define ITM_INSECT26 (ITM_INSECT_START + 26) +#define ITM_INSECT27 (ITM_INSECT_START + 27) +#define ITM_INSECT28 (ITM_INSECT_START + 28) +#define ITM_INSECT29 (ITM_INSECT_START + 29) +#define ITM_INSECT30 (ITM_INSECT_START + 30) +#define ITM_INSECT31 (ITM_INSECT_START + 31) +#define ITM_INSECT32 (ITM_INSECT_START + 32) +#define ITM_INSECT33 (ITM_INSECT_START + 33) +#define ITM_INSECT34 (ITM_INSECT_START + 34) +#define ITM_INSECT35 (ITM_INSECT_START + 35) +#define ITM_INSECT36 (ITM_INSECT_START + 36) +#define ITM_INSECT37 (ITM_INSECT_START + 37) +#define ITM_INSECT38 (ITM_INSECT_START + 38) +#define ITM_INSECT39 (ITM_INSECT_START + 39) +#define ITM_SPIRIT0 (ITM_INSECT_START + 40) +#define ITM_SPIRIT1 (ITM_INSECT_START + 41) +#define ITM_SPIRIT2 (ITM_INSECT_START + 42) +#define ITM_SPIRIT3 (ITM_INSECT_START + 43) +#define ITM_SPIRIT4 (ITM_INSECT_START + 44) +#define ITM_INSECT_END (ITM_INSECT_START + 45) + #define ITM_KABU_10 0x2F00 #define ITM_KABU_50 0x2F01 #define ITM_KABU_100 0x2F02 diff --git a/include/m_room_type.h b/include/m_room_type.h index abb72659..67e56356 100644 --- a/include/m_room_type.h +++ b/include/m_room_type.h @@ -59,6 +59,15 @@ enum birth_type { mRmTp_BIRTH_TYPE_NUM }; +enum { + mRmTp_DIRECT_SOUTH, + mRmTp_DIRECT_EAST, + mRmTp_DIRECT_NORTH, + mRmTp_DIRECT_WEST, + + mRmTp_DIRECT_NUM +}; + typedef struct room_type_place_info_one_s { int exists; int ut_x; @@ -72,6 +81,9 @@ typedef struct room_type_place_info_s { #define FTR_NUM 1266 #define FTR_GET_ROTATION(f) ((f) & 3) +#define FTR_IDX_2_NO(f) ((f) >> 2) +#define FTR_NO_2_IDX(f) ((f) << 2) +#define FTR_NO_ROT_2_IDX(f, rot) (FTR_NO_2_IDX(f) | ((rot) & 3)) // TEMPORARY. Should be generated with .decl files #define ITEM0_NO_START 0x0000 diff --git a/rel/m_museum_display.c b/rel/m_museum_display.c new file mode 100644 index 00000000..ce2a909f --- /dev/null +++ b/rel/m_museum_display.c @@ -0,0 +1,440 @@ +#include "m_museum_display.h" + +#include "m_name_table.h" +#include "m_room_type.h" +#include "m_scene.h" +#include "m_common_data.h" + +extern int mMmd_FossilInfo(int fossil_no) { + int valid = FALSE; + + if (fossil_no >= 0 && fossil_no < mMmd_FOSSIL_NUM) { + valid = TRUE; + } + + if (valid) { + return mMmd_FOSSIL_BIT(Save_Get(museum_display), fossil_no); + } + + return 0; +} + +extern int mMmd_ArtInfo(int art_no) { + int valid = FALSE; + + if (art_no >= 0 && art_no < mMmd_ART_NUM) { + valid = TRUE; + } + + if (valid) { + return mMmd_ART_BIT(Save_Get(museum_display), art_no); + } + + return 0; +} + +extern int mMmd_InsectInfo(int insect_no) { + int valid = FALSE; + + if (insect_no >= 0 && insect_no < mMmd_INSECT_NUM) { + valid = TRUE; + } + + if (valid) { + return mMmd_INSECT_BIT(Save_Get(museum_display), insect_no); + } + + return 0; +} + +extern int mMmd_FishInfo(int fish_no) { + int valid = FALSE; + + if (fish_no >= 0 && fish_no < mMmd_FISH_NUM) { + valid = TRUE; + } + + if (valid) { + return mMmd_FISH_BIT(Save_Get(museum_display), fish_no); + } + + return 0; +} + +extern void mMmd_SetFossil(int fossil_no) { + if (fossil_no >= 0 && fossil_no < mMmd_FOSSIL_NUM && mLd_PlayerManKindCheck() == FALSE) { + mMmd_FOSSIL_CLR(Save_Get(museum_display), fossil_no); + mMmd_FOSSIL_SET(Save_Get(museum_display), fossil_no, Common_Get(player_no) + 1); + } +} + +extern void mMmd_SetArt(int art_no) { + if (art_no >= 0 && art_no < mMmd_ART_NUM && mLd_PlayerManKindCheck() == FALSE) { + mMmd_ART_CLR(Save_Get(museum_display), art_no); + mMmd_ART_SET(Save_Get(museum_display), art_no, Common_Get(player_no) + 1); + } +} + +extern void mMmd_SetInsect(int insect_no) { + if (insect_no >= 0 && insect_no < mMmd_INSECT_NUM && mLd_PlayerManKindCheck() == FALSE) { + mMmd_INSECT_CLR(Save_Get(museum_display), insect_no); + mMmd_INSECT_SET(Save_Get(museum_display), insect_no, Common_Get(player_no) + 1); + } +} + +extern void mMmd_SetFish(int fish_no) { + if (fish_no >= 0 && fish_no < mMmd_FISH_NUM && mLd_PlayerManKindCheck() == FALSE) { + mMmd_FISH_CLR(Save_Get(museum_display), fish_no); + mMmd_FISH_SET(Save_Get(museum_display), fish_no, Common_Get(player_no) + 1); + } +} + +extern mMmd_GetDisplayInfo(mActor_name_t item) { + if (item >= FTR_DINO_TRICERA_SKULL && item <= FTR_DINO_TRILOBITE_WEST) { + int fossil_idx; + int valid = FALSE; + + /* ??? why check this again */ + if (item >= FTR_DINO_TRICERA_SKULL && item <= FTR_DINO_TRILOBITE_WEST) { + valid = TRUE; + } + + fossil_idx = valid != FALSE ? FTR_IDX_2_NO(item - FTR_DINO_TRICERA_SKULL) : 0; + if (mMmd_FossilInfo(fossil_idx) >= mMmd_DONATOR_PLAYER1 && mMmd_FossilInfo(fossil_idx) <= mMmd_DONATOR_DELETED_PLAYER) { + return mMmd_DISPLAY_ALREADY_DONATED; + } + else { + return mMmd_DISPLAY_CAN_DONATE; + } + } + else if (item >= FTR_PAINTING0 && item <= FTR_PAINTING14_WEST) { + int painting_idx; + int valid = FALSE; + + /* ??? why check this again */ + if (item >= FTR_PAINTING0 && item <= FTR_PAINTING14_WEST) { + valid = TRUE; + } + + painting_idx = valid != FALSE ? FTR_IDX_2_NO(item - FTR_PAINTING0) : 0; + if (mMmd_ArtInfo(painting_idx) >= mMmd_DONATOR_PLAYER1 && mMmd_ArtInfo(painting_idx) <= mMmd_DONATOR_DELETED_PLAYER) { + return mMmd_DISPLAY_ALREADY_DONATED; + } + else { + return mMmd_DISPLAY_CAN_DONATE; + } + } + else if (item >= ITM_INSECT00 && item < ITM_SPIRIT0) { + int insect_idx; + int valid = FALSE; + + /* ??? why check this again */ + if (item >= ITM_INSECT00 && item < ITM_SPIRIT0) { + valid = TRUE; + } + + insect_idx = valid != FALSE ? item - ITM_INSECT_START : 0; + if (mMmd_InsectInfo(insect_idx) >= mMmd_DONATOR_PLAYER1 && mMmd_InsectInfo(insect_idx) <= mMmd_DONATOR_DELETED_PLAYER) { + return mMmd_DISPLAY_ALREADY_DONATED; + } + else { + return mMmd_DISPLAY_CAN_DONATE; + } + } + else if (item >= ITM_FISH00 && item <= ITM_FISH_END) { + int fish_idx; + int valid = FALSE; + + /* ??? why check this again */ + if (item >= ITM_FISH00 && item <= ITM_FISH_END) { + valid = TRUE; + } + + fish_idx = valid != FALSE ? item - ITM_FISH_START : 0; + if (mMmd_FishInfo(fish_idx) >= mMmd_DONATOR_PLAYER1 && mMmd_FishInfo(fish_idx) <= mMmd_DONATOR_DELETED_PLAYER) { + return mMmd_DISPLAY_ALREADY_DONATED; + } + else { + return mMmd_DISPLAY_CAN_DONATE; + } + } + + return mMmd_DISPLAY_CANNOT_DONATE; +} + +extern int mMmd_RequestMuseumDisplay(mActor_name_t item) { + if (mLd_PlayerManKindCheck() == FALSE) { + if (item >= FTR_DINO_TRICERA_SKULL && item <= FTR_DINO_TRILOBITE_WEST) { + int fossil_idx; + int valid = FALSE; + + /* ??? why check this again */ + if (item >= FTR_DINO_TRICERA_SKULL && item <= FTR_DINO_TRILOBITE_WEST) { + valid = TRUE; + } + + fossil_idx = valid != FALSE ? FTR_IDX_2_NO(item - FTR_DINO_TRICERA_SKULL) : 0; + if (mMmd_FossilInfo(fossil_idx) < mMmd_DONATOR_PLAYER1 || mMmd_FossilInfo(fossil_idx) > mMmd_DONATOR_DELETED_PLAYER) { + mMmd_SetFossil(fossil_idx); + return TRUE; + } + } + else if (item >= FTR_PAINTING0 && item <= FTR_PAINTING14_WEST) { + int painting_idx; + int valid = FALSE; + + /* ??? why check this again */ + if (item >= FTR_PAINTING0 && item <= FTR_PAINTING14_WEST) { + valid = TRUE; + } + + painting_idx = valid != FALSE ? FTR_IDX_2_NO(item - FTR_PAINTING0) : 0; + if (mMmd_ArtInfo(painting_idx) < mMmd_DONATOR_PLAYER1 || mMmd_ArtInfo(painting_idx) > mMmd_DONATOR_DELETED_PLAYER) { + mMmd_SetArt(painting_idx); + return TRUE; + } + } + else if (item >= ITM_INSECT00 && item < ITM_SPIRIT0) { + int insect_idx; + int valid = FALSE; + + /* ??? why check this again */ + if (item >= ITM_INSECT00 && item < ITM_SPIRIT0) { + valid = TRUE; + } + + insect_idx = valid != FALSE ? item - ITM_INSECT_START : 0; + if (mMmd_InsectInfo(insect_idx) < mMmd_DONATOR_PLAYER1 || mMmd_InsectInfo(insect_idx) > mMmd_DONATOR_DELETED_PLAYER) { + mMmd_SetInsect(insect_idx); + return TRUE; + } + } + else if (item >= ITM_FISH00 && item <= ITM_FISH_END) { + int fish_idx; + int valid = FALSE; + + /* ??? why check this again */ + if (item >= ITM_FISH00 && item <= ITM_FISH_END) { + valid = TRUE; + } + + fish_idx = valid != FALSE ? item - ITM_FISH_START : 0; + if (mMmd_FishInfo(fish_idx) < mMmd_DONATOR_PLAYER1 || mMmd_FishInfo(fish_idx) > mMmd_DONATOR_DELETED_PLAYER) { + mMmd_SetFish(fish_idx); + return TRUE; + } + } + } + + return FALSE; +} + +typedef struct museum_display_fossil_data_s { + u8 ut; + mActor_name_t item; + int rotation; +} mMmd_fossil_data_c; + +#define mMmd_UT(x, z) ((((z) & 0xF) << 4) | ((x) & 0xF)) + +static mMmd_fossil_data_c mMmd_museum_fossil_data[mMmd_FOSSIL_NUM] = { + { mMmd_UT(5, 2), FTR_DINO_DISP_TRICERA, mRmTp_DIRECT_NORTH }, /* tricera skull */ + { mMmd_UT(1, 2), FTR_DINO_DISP_TRICERA, mRmTp_DIRECT_NORTH }, /* tricera tail */ + { mMmd_UT(3, 2), FTR_DINO_DISP_TRICERA, mRmTp_DIRECT_NORTH }, /* tricera torso */ + + { mMmd_UT(9, 2), FTR_DINO_DISP_TREX, mRmTp_DIRECT_SOUTH }, /* T-rex skull */ + { mMmd_UT(13, 2), FTR_DINO_DISP_TREX, mRmTp_DIRECT_SOUTH }, /* T-rex tail */ + { mMmd_UT(11, 2), FTR_DINO_DISP_TREX, mRmTp_DIRECT_SOUTH }, /* T-rex torso */ + + { mMmd_UT(5, 10), FTR_DINO_DISP_BRONTO, mRmTp_DIRECT_NORTH }, /* apato skull */ + { mMmd_UT(1, 10), FTR_DINO_DISP_BRONTO, mRmTp_DIRECT_NORTH }, /* apato tail */ + { mMmd_UT(3, 10), FTR_DINO_DISP_BRONTO, mRmTp_DIRECT_NORTH }, /* apato torso */ + + { mMmd_UT(10, 6), FTR_DINO_DISP_STEGO, mRmTp_DIRECT_EAST }, /* stego skull */ + { mMmd_UT(13, 5), FTR_DINO_DISP_STEGO2, mRmTp_DIRECT_SOUTH }, /* stego tail */ + { mMmd_UT(11, 5), FTR_DINO_DISP_STEGO2, mRmTp_DIRECT_SOUTH }, /* stego torso */ + + { mMmd_UT(6, 6), FTR_DINO_DISP_PTERA, mRmTp_DIRECT_SOUTH }, /* ptera skull */ + { mMmd_UT(6, 5), FTR_DINO_DISP_PTERA, mRmTp_DIRECT_SOUTH }, /* ptera right wing */ + { mMmd_UT(6, 7), FTR_DINO_DISP_PTERA, mRmTp_DIRECT_SOUTH }, /* ptera left wing */ + + { mMmd_UT(9, 10), FTR_DINO_DISP_PLESIO, mRmTp_DIRECT_SOUTH }, /* plesio skull */ + { mMmd_UT(11, 10), FTR_DINO_DISP_PLESIO, mRmTp_DIRECT_SOUTH }, /* plesio neck */ + { mMmd_UT(13, 10), FTR_DINO_DISP_PLESIO, mRmTp_DIRECT_SOUTH }, /* plesio torso */ + + { mMmd_UT(2, 7), FTR_DINO_DISP_MAMMOTH, mRmTp_DIRECT_EAST }, /* mammoth skull */ + { mMmd_UT(2, 5), FTR_DINO_DISP_MAMMOTH, mRmTp_DIRECT_EAST }, /* mammoth torso */ + + { mMmd_UT(6, 8), FTR_FOSSIL, mRmTp_DIRECT_SOUTH }, /* amber */ + { mMmd_UT(7, 8), FTR_FOSSIL, mRmTp_DIRECT_SOUTH }, /* dinosaur track */ + { mMmd_UT(8, 8), FTR_FOSSIL, mRmTp_DIRECT_SOUTH }, /* ammonite */ + { mMmd_UT(9, 8), FTR_FOSSIL, mRmTp_DIRECT_SOUTH }, /* dinosaur egg */ + { mMmd_UT(10, 8), FTR_FOSSIL, mRmTp_DIRECT_SOUTH } /* trilobite */ +}; + +static void mMmd_MuseumFossilProcess_MakeFgData() { + mMmd_fossil_data_c* fossil_data = mMmd_museum_fossil_data; + mActor_name_t* fossil_fg = mFI_BkNumtoUtFGTop(0, 0); + int fossil_ut; + int rotation; + int fossil_idx; + int item; + + if (fossil_fg != NULL) { + for (fossil_idx = 0; fossil_idx < mMmd_FOSSIL_NUM; fossil_idx++) { + rotation = fossil_data[fossil_idx].rotation & 3; + fossil_ut = fossil_data[fossil_idx].ut; + + if (mMmd_FossilInfo(fossil_idx)) { + int valid = FALSE; + + if (fossil_idx >= 0 && fossil_idx < mMmd_FOSSIL_NUM) { + valid = TRUE; + } + + /* TODO: this might be a fake match */ + item = FTR_DINO_TRICERA_SKULL; + if (valid) { + mActor_name_t fossil_ftr_idx = FTR_DINO_TRICERA_SKULL + (mActor_name_t)FTR_NO_2_IDX(fossil_idx); + item = fossil_ftr_idx; + } + //item = (valid != FALSE ? (mActor_name_t)(FTR_DINO_TRICERA_SKULL + (mActor_name_t)FTR_NO_2_IDX(fossil_idx)) : FTR_DINO_TRICERA_SKULL); + fossil_fg[fossil_ut] = (mActor_name_t)item + rotation; + } + else { + fossil_fg[fossil_ut] = fossil_data[fossil_idx].item + rotation; + } + } + } +} + +static void mMmd_dummy_process() { } + +typedef void (*mMmd_DISPLAY_PROC)(); + +typedef struct museum_display_scene_process_s { + int scene_no; + mMmd_DISPLAY_PROC display_proc; +} mMmd_scene_process_c; + +static mMmd_scene_process_c mMmd_scene_process_data[mMmd_CATEGORY_NUM + 1] = { + { SCENE_MUSEUM_ROOM_PAINTING, &mMmd_dummy_process }, + { SCENE_MUSEUM_ROOM_FOSSIL, &mMmd_MuseumFossilProcess_MakeFgData }, + { SCENE_MUSEUM_ROOM_INSECT, &mMmd_dummy_process }, + { SCENE_MUSEUM_ROOM_FISH, &mMmd_dummy_process }, + { -1, NULL } +}; + +extern void mMmd_MakeMuseumDisplayData() { + int scene_no = Save_Get(scene_no); + int i = 0; + + while (mMmd_scene_process_data[i].scene_no != -1) { + if (scene_no == mMmd_scene_process_data[i].scene_no) { + (*mMmd_scene_process_data[i].display_proc)(); + break; + } + + i++; + } +} + +extern void mMmd_DeletePresentedByPlayer(u8 player_no) { + int search_no = player_no + 1; + + if (player_no < PLAYER_NUM) { + int i; + + for (i = 0; i < mMmd_ART_NUM; i++) { + int donator = mMmd_ArtInfo(i); + if (donator == search_no) { + mMmd_ART_CLR(Save_Get(museum_display), i); + mMmd_ART_SET(Save_Get(museum_display), i, mMmd_DONATOR_DELETED_PLAYER); + } + } + + for (i = 0; i < mMmd_FOSSIL_NUM; i++) { + int donator = mMmd_FossilInfo(i); + if (donator == search_no) { + mMmd_FOSSIL_CLR(Save_Get(museum_display), i); + mMmd_FOSSIL_SET(Save_Get(museum_display), i, mMmd_DONATOR_DELETED_PLAYER); + } + } + + for (i = 0; i < mMmd_INSECT_NUM; i++) { + int donator = mMmd_InsectInfo(i); + if (donator == search_no) { + mMmd_INSECT_CLR(Save_Get(museum_display), i); + mMmd_INSECT_SET(Save_Get(museum_display), i, mMmd_DONATOR_DELETED_PLAYER); + } + } + + for (i = 0; i < mMmd_FISH_NUM; i++) { + int donator = mMmd_FishInfo(i); + if (donator == search_no) { + mMmd_FISH_CLR(Save_Get(museum_display), i); + mMmd_FISH_SET(Save_Get(museum_display), i, mMmd_DONATOR_DELETED_PLAYER); + } + } + } +} + +extern int mMmd_CountDisplayedFossil() { + int i; + int displayed = 0; + + for (i = 0; i < mMmd_FOSSIL_NUM; i++) { + int donator = mMmd_FossilInfo(i); + + if (donator >= mMmd_DONATOR_PLAYER1 && donator <= mMmd_DONATOR_DELETED_PLAYER) { + displayed++; + } + } + + return displayed; +} + +extern int mMmd_CountDisplayedArt() { + int i; + int displayed = 0; + + for (i = 0; i < mMmd_ART_NUM; i++) { + int donator = mMmd_ArtInfo(i); + + if (donator >= mMmd_DONATOR_PLAYER1 && donator <= mMmd_DONATOR_DELETED_PLAYER) { + displayed++; + } + } + + return displayed; +} + +extern int mMmd_CountDisplayedInsect() { + int i; + int displayed = 0; + + for (i = 0; i < mMmd_INSECT_NUM; i++) { + int donator = mMmd_InsectInfo(i); + + if (donator >= mMmd_DONATOR_PLAYER1 && donator <= mMmd_DONATOR_DELETED_PLAYER) { + displayed++; + } + } + + return displayed; +} + +extern int mMmd_CountDisplayedFish() { + int i; + int displayed = 0; + + for (i = 0; i < mMmd_FISH_NUM; i++) { + int donator = mMmd_FishInfo(i); + + if (donator >= mMmd_DONATOR_PLAYER1 && donator <= mMmd_DONATOR_DELETED_PLAYER) { + displayed++; + } + } + + return displayed; +}