From 5877788a8c6a55dbfc98ea28f997edd3ee743c35 Mon Sep 17 00:00:00 2001 From: Cuyler36 Date: Tue, 27 Feb 2024 21:03:56 -0500 Subject: [PATCH] Implement & link ac_museum_fossil --- config/rel_slices.yml | 5 + include/ac_museum_fossil.h | 7 +- include/m_room_type.h | 190 ++++++++++++++++++------------------- src/ac_museum_fossil.c | 133 ++++++++++++++++++++++++++ src/m_room_type.c | 2 +- 5 files changed, 240 insertions(+), 97 deletions(-) create mode 100644 src/ac_museum_fossil.c diff --git a/config/rel_slices.yml b/config/rel_slices.yml index b1748a4d..5c87b574 100644 --- a/config/rel_slices.yml +++ b/config/rel_slices.yml @@ -426,6 +426,11 @@ ac_haniwa.c: .text: [0x80427624, 0x80428F64] .rodata: [0x806440B8, 0x806440F8] .data: [0x80683D08, 0x80683E98] +ac_museum_fossil.c: + .text: [0x8042EDC0, 0x8042F170] + .rodata: [0x806442A0, 0x806442D0] + .data: [0x80684D48, 0x80684E38] + .bss: [0x812FBE60, 0x812FBE70] ac_museum_picture.c: .text: [0x8042F170, 0x8042F7FC] .rodata: [0x806442D0, 0x80644330] diff --git a/include/ac_museum_fossil.h b/include/ac_museum_fossil.h index 6003b2d7..2adabd65 100644 --- a/include/ac_museum_fossil.h +++ b/include/ac_museum_fossil.h @@ -8,6 +8,12 @@ extern "C" { #endif +typedef struct museum_fossil_actor_s { + ACTOR actor_class; + s16 target_angle; + int msg_no; +} MUSEUM_FOSSIL_ACTOR; + extern ACTOR_PROFILE Museum_Fossil_Profile; #ifdef __cplusplus @@ -15,4 +21,3 @@ extern ACTOR_PROFILE Museum_Fossil_Profile; #endif #endif - diff --git a/include/m_room_type.h b/include/m_room_type.h index cea7f798..90f89746 100644 --- a/include/m_room_type.h +++ b/include/m_room_type.h @@ -9,95 +9,95 @@ #define mRmTp_FTR_UNIT_MAX 4 enum { - mRmTp_FTRSIZE_1x1, /* x */ - mRmTp_FTRSIZE_1x2, /* yy OR y */ - /* y */ - mRmTp_FTRSIZE_2x2, /* zz */ - /* zz */ - mRmTp_FTRSIZE_NUM + mRmTp_FTRSIZE_1x1, /* x */ + mRmTp_FTRSIZE_1x2, /* yy OR y */ + /* y */ + mRmTp_FTRSIZE_2x2, /* zz */ + /* zz */ + mRmTp_FTRSIZE_NUM }; enum birth_type { - mRmTp_BIRTH_TYPE_GRP_A = 0, - mRmTp_BIRTH_TYPE_GRP_B = 1, - mRmTp_BIRTH_TYPE_GRP_C = 2, - mRmTp_BIRTH_TYPE_EVENT = 3, - mRmTp_BIRTH_TYPE_BIRTHDAY = 4, - mRmTp_BIRTH_TYPE_HALLOWEEN = 5, - mRmTp_BIRTH_TYPE_HANIWA = 6, - mRmTp_BIRTH_TYPE_LOTTERY = 7, - mRmTp_BIRTH_TYPE_FTR_CLOTH = 8, - mRmTp_BIRTH_TYPE_FTR_UMBRELLA = 9, - mRmTp_BIRTH_TYPE_FTR_INSECT = 10, - mRmTp_BIRTH_TYPE_FTR_FISH = 11, - mRmTp_BIRTH_TYPE_SINGLE_FOSSIL = 12, - mRmTp_BIRTH_TYPE_MULTI_FOSSIL = 13, - mRmTp_BIRTH_TYPE_XMAS = 14, - mRmTp_BIRTH_TYPE_SANTA = 15, - mRmTp_BIRTH_TYPE_UNOBTAINABLE = 16, - mRmTp_BIRTH_TYPE_SNOWMAN = 17, - mRmTp_BIRTH_TYPE_HALLOWEEN_TRICK = 18, - mRmTp_BIRTH_TYPE_POST_OFFICE = 19, - mRmTp_BIRTH_TYPE_MARK_ROOM = 20, - mRmTp_BIRTH_TYPE_SONCHO = 21, - mRmTp_BIRTH_TYPE_JONASON = 22, - mRmTp_BIRTH_TYPE_UNUSED_23 = 23, - mRmTp_BIRTH_TYPE_FAMICOM_EREADER = 24, - mRmTp_BIRTH_TYPE_ISLAND = 25, - mRmTp_BIRTH_TYPE_FAMICOM_ISLAND = 26, - mRmTp_BIRTH_TYPE_MY_ORIGINAL = 27, - mRmTp_BIRTH_TYPE_FAMICOM_CODE = 28, - mRmTp_BIRTH_TYPE_MUSEUM = 29, - mRmTp_BIRTH_TYPE_SONCHO_LIGHTHOUSE_QUEST = 30, - mRmTp_BIRTH_TYPE_FTR_DIARY = 31, - mRmTp_BIRTH_TYPE_GROUNDHOG = 32, - mRmTp_BIRTH_TYPE_KAMAKURA = 33, - mRmTp_BIRTH_TYPE_NINTENDO_CODE = 34, - mRmTp_BIRTH_TYPE_HARVEST_FESTIVAL = 35, - mRmTp_BIRTH_TYPE_UNUSED_36 = 36, - mRmTp_BIRTH_TYPE_SUMMER_CAMPER = 37, + mRmTp_BIRTH_TYPE_GRP_A = 0, + mRmTp_BIRTH_TYPE_GRP_B = 1, + mRmTp_BIRTH_TYPE_GRP_C = 2, + mRmTp_BIRTH_TYPE_EVENT = 3, + mRmTp_BIRTH_TYPE_BIRTHDAY = 4, + mRmTp_BIRTH_TYPE_HALLOWEEN = 5, + mRmTp_BIRTH_TYPE_HANIWA = 6, + mRmTp_BIRTH_TYPE_LOTTERY = 7, + mRmTp_BIRTH_TYPE_FTR_CLOTH = 8, + mRmTp_BIRTH_TYPE_FTR_UMBRELLA = 9, + mRmTp_BIRTH_TYPE_FTR_INSECT = 10, + mRmTp_BIRTH_TYPE_FTR_FISH = 11, + mRmTp_BIRTH_TYPE_SINGLE_FOSSIL = 12, + mRmTp_BIRTH_TYPE_MULTI_FOSSIL = 13, + mRmTp_BIRTH_TYPE_XMAS = 14, + mRmTp_BIRTH_TYPE_SANTA = 15, + mRmTp_BIRTH_TYPE_UNOBTAINABLE = 16, + mRmTp_BIRTH_TYPE_SNOWMAN = 17, + mRmTp_BIRTH_TYPE_HALLOWEEN_TRICK = 18, + mRmTp_BIRTH_TYPE_POST_OFFICE = 19, + mRmTp_BIRTH_TYPE_MARK_ROOM = 20, + mRmTp_BIRTH_TYPE_SONCHO = 21, + mRmTp_BIRTH_TYPE_JONASON = 22, + mRmTp_BIRTH_TYPE_UNUSED_23 = 23, + mRmTp_BIRTH_TYPE_FAMICOM_EREADER = 24, + mRmTp_BIRTH_TYPE_ISLAND = 25, + mRmTp_BIRTH_TYPE_FAMICOM_ISLAND = 26, + mRmTp_BIRTH_TYPE_MY_ORIGINAL = 27, + mRmTp_BIRTH_TYPE_FAMICOM_CODE = 28, + mRmTp_BIRTH_TYPE_MUSEUM = 29, + mRmTp_BIRTH_TYPE_SONCHO_LIGHTHOUSE_QUEST = 30, + mRmTp_BIRTH_TYPE_FTR_DIARY = 31, + mRmTp_BIRTH_TYPE_GROUNDHOG = 32, + mRmTp_BIRTH_TYPE_KAMAKURA = 33, + mRmTp_BIRTH_TYPE_NINTENDO_CODE = 34, + mRmTp_BIRTH_TYPE_HARVEST_FESTIVAL = 35, + mRmTp_BIRTH_TYPE_UNUSED_36 = 36, + mRmTp_BIRTH_TYPE_SUMMER_CAMPER = 37, - mRmTp_BIRTH_TYPE_NUM + mRmTp_BIRTH_TYPE_NUM }; enum { - mRmTp_DIRECT_SOUTH, - mRmTp_DIRECT_EAST, - mRmTp_DIRECT_NORTH, - mRmTp_DIRECT_WEST, + mRmTp_DIRECT_SOUTH, + mRmTp_DIRECT_EAST, + mRmTp_DIRECT_NORTH, + mRmTp_DIRECT_WEST, - mRmTp_DIRECT_NUM + mRmTp_DIRECT_NUM }; enum { - mRmTp_FTR_SE_NONE, - mRmTp_FTR_SE_SOFT_CHAIR, - mRmTp_FTR_SE_HARD_CHAIR, - mRmTp_FTR_SE_BUBU_CHAIR, - mRmTp_FTR_SE_TOILET_CHAIR, + mRmTp_FTR_SE_NONE, + mRmTp_FTR_SE_SOFT_CHAIR, + mRmTp_FTR_SE_HARD_CHAIR, + mRmTp_FTR_SE_BUBU_CHAIR, + mRmTp_FTR_SE_TOILET_CHAIR, - mRmTp_FTR_SE_NUM + mRmTp_FTR_SE_NUM }; enum { - mRmTp_CHAIR_ACTION_SIT, - mRmTp_CHAIR_ACTION_STAND, + mRmTp_CHAIR_ACTION_SIT, + mRmTp_CHAIR_ACTION_STAND, - mRmTp_CHAIR_ACTION_NUM + mRmTp_CHAIR_ACTION_NUM }; typedef struct room_type_place_info_one_s { - int exists; - int ut_x; - int ut_z; + int exists; + int ut_x; + int ut_z; } mRmTp_FtrPlaceInfoOne_t; #define FTR_NUM 1266 -#define FTR_GET_ROTATION(f) ((f) & 3) +#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)) +#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 @@ -106,41 +106,41 @@ typedef struct room_type_place_info_one_s { #define FTR0_NO_START 0x1000 #define ITEM1_NO_START 0x2000 -#define ITEM1_0_NO_START ITEM0_1_NO_START // paper -#define ITEM1_1_NO_START ITEM1_NO_START + 0x100 // money -#define ITEM1_2_NO_START ITEM1_NO_START + 0x200 // tools -#define ITEM1_3_NO_START ITEM1_NO_START + 0x300 // fish -#define ITEM1_4_NO_START ITEM1_NO_START + 0x400 // clothing -#define ITEM1_5_NO_START ITEM1_NO_START + 0x500 // etc -#define ITEM1_6_NO_START ITEM1_NO_START + 0x600 // carpets -#define ITEM1_7_NO_START ITEM1_NO_START + 0x700 // wallpaper -#define ITEM1_8_NO_START ITEM1_NO_START + 0x800 // food -#define ITEM1_9_NO_START ITEM1_NO_START + 0x900 // seeds -#define ITEM1_A_NO_START ITEM1_NO_START + 0xA00 // mini disks -#define ITEM1_B_NO_START ITEM1_NO_START + 0xB00 // diaries -#define ITEM1_C_NO_START ITEM1_NO_START + 0xC00 // tickets -#define ITEM1_D_NO_START ITEM1_NO_START + 0xD00 // insects -#define ITEM1_E_NO_START ITEM1_NO_START + 0xE00 // hukubukuro -#define ITEM1_F_NO_START ITEM1_NO_START + 0xF00 // kabu +#define ITEM1_0_NO_START ITEM0_1_NO_START // paper +#define ITEM1_1_NO_START ITEM1_NO_START + 0x100 // money +#define ITEM1_2_NO_START ITEM1_NO_START + 0x200 // tools +#define ITEM1_3_NO_START ITEM1_NO_START + 0x300 // fish +#define ITEM1_4_NO_START ITEM1_NO_START + 0x400 // clothing +#define ITEM1_5_NO_START ITEM1_NO_START + 0x500 // etc +#define ITEM1_6_NO_START ITEM1_NO_START + 0x600 // carpets +#define ITEM1_7_NO_START ITEM1_NO_START + 0x700 // wallpaper +#define ITEM1_8_NO_START ITEM1_NO_START + 0x800 // food +#define ITEM1_9_NO_START ITEM1_NO_START + 0x900 // seeds +#define ITEM1_A_NO_START ITEM1_NO_START + 0xA00 // mini disks +#define ITEM1_B_NO_START ITEM1_NO_START + 0xB00 // diaries +#define ITEM1_C_NO_START ITEM1_NO_START + 0xC00 // tickets +#define ITEM1_D_NO_START ITEM1_NO_START + 0xD00 // insects +#define ITEM1_E_NO_START ITEM1_NO_START + 0xE00 // hukubukuro +#define ITEM1_F_NO_START ITEM1_NO_START + 0xF00 // kabu #define FTR1_NO_START 0x3000 enum { - mRmTp_LIGHT_SWITCH_HOUSE0_MAIN_UPPER, - mRmTp_LIGHT_SWITCH_HOUSE0_BASEMENT, - mRmTp_LIGHT_SWITCH_HOUSE1_MAIN_UPPER, - mRmTp_LIGHT_SWITCH_HOUSE1_BASEMENT, - mRmTp_LIGHT_SWITCH_HOUSE2_MAIN_UPPER, - mRmTp_LIGHT_SWITCH_HOUSE2_BASEMENT, - mRmTp_LIGHT_SWITCH_HOUSE3_MAIN_UPPER, - mRmTp_LIGHT_SWITCH_HOUSE3_BASEMENT, - mRmTp_LIGHT_SWITCH_COTTAGE_MY, - mRmTp_LIGHT_SWITCH_9, - mRmTp_LIGHT_SWITCH_NPC, - mRmTp_LIGHT_SWITCH_LIGHTHOUSE, - mRmTp_LIGHT_SWITCH_TENT, + mRmTp_LIGHT_SWITCH_HOUSE0_MAIN_UPPER, + mRmTp_LIGHT_SWITCH_HOUSE0_BASEMENT, + mRmTp_LIGHT_SWITCH_HOUSE1_MAIN_UPPER, + mRmTp_LIGHT_SWITCH_HOUSE1_BASEMENT, + mRmTp_LIGHT_SWITCH_HOUSE2_MAIN_UPPER, + mRmTp_LIGHT_SWITCH_HOUSE2_BASEMENT, + mRmTp_LIGHT_SWITCH_HOUSE3_MAIN_UPPER, + mRmTp_LIGHT_SWITCH_HOUSE3_BASEMENT, + mRmTp_LIGHT_SWITCH_COTTAGE_MY, + mRmTp_LIGHT_SWITCH_9, + mRmTp_LIGHT_SWITCH_NPC, + mRmTp_LIGHT_SWITCH_LIGHTHOUSE, + mRmTp_LIGHT_SWITCH_TENT, - mRmTp_LIGHT_SWITCH_NUM + mRmTp_LIGHT_SWITCH_NUM }; extern int mRmTp_ItemNo2FtrSize(mActor_name_t item_no); @@ -160,7 +160,7 @@ extern mActor_name_t mRmTp_GetPlayerRoomCollisionIdx(mActor_name_t field_id, mAc extern int mRmTp_FurnitureIdx2FurnitureKind(int ftr_idx); extern void mRmTp_CopyWallData(u8* dst, int wall_no); extern void mRmTp_CopyFloorData(u8* dst, int floor_no); -extern int mRmTp_CheckTalkAble(s16* rot, xyz_t* pos, f32 max_dist, int required_dir, GAME_PLAY* play); +extern int mRmTp_CheckTalkAble(s16* rot, xyz_t* pos, int required_dir, f32 max_dist, GAME_PLAY* play); extern int mRmTp_CheckWallIsMyOriginalInThisScene(); extern int mRmTp_CheckFloorIsMyOriginalInThisScene(); extern int mRmTp_GetEntranceBasePosition(xyz_t* pos); diff --git a/src/ac_museum_fossil.c b/src/ac_museum_fossil.c new file mode 100644 index 00000000..3e3aba65 --- /dev/null +++ b/src/ac_museum_fossil.c @@ -0,0 +1,133 @@ +#include "ac_museum_fossil.h" + +#include "m_camera2.h" +#include "m_demo.h" +#include "m_name_table.h" +#include "m_museum_display.h" +#include "m_name_table.h" +#include "sys_matrix.h" +#include "m_player_lib.h" +#include "m_room_type.h" +#include "m_msg.h" +#include "m_common_data.h" + +typedef struct { + s16 x; + s16 z; +} aMF_pos_c; + +typedef struct { + aMF_pos_c pos; + int direct; +} aMF_fossil_data_c; + +static void Museum_Fossil_Actor_ct(ACTOR* actorx, GAME* game); +static void Museum_Fossil_Actor_dt(ACTOR* actorx, GAME* game); +static void Museum_Fossil_Actor_move(ACTOR* actorx, GAME* game); +static void Museum_Fossil_Actor_draw(ACTOR* actorx, GAME* game); + +ACTOR_PROFILE Museum_Fossil_Profile = { + mAc_PROFILE_MUSEUM_FOSSIL, + ACTOR_PART_BG, + ACTOR_STATE_CAN_MOVE_IN_DEMO_SCENES | ACTOR_STATE_NO_DRAW_WHILE_CULLED | ACTOR_STATE_NO_MOVE_WHILE_CULLED, + EMPTY_NO, + ACTOR_OBJ_BANK_KEEP, + sizeof(MUSEUM_FOSSIL_ACTOR), + &Museum_Fossil_Actor_ct, + &Museum_Fossil_Actor_dt, + &Museum_Fossil_Actor_move, + &Museum_Fossil_Actor_draw, + NULL, +}; + +static aMF_fossil_data_c aMF_fossil_data_table[mMmd_FOSSIL_NUM] = { + { 6, 3, mRmTp_DIRECT_SOUTH }, { 2, 3, mRmTp_DIRECT_SOUTH }, { 4, 3, mRmTp_DIRECT_SOUTH }, + { 9, 3, mRmTp_DIRECT_SOUTH }, { 13, 3, mRmTp_DIRECT_SOUTH }, { 11, 3, mRmTp_DIRECT_SOUTH }, + { 6, 11, mRmTp_DIRECT_SOUTH }, { 2, 11, mRmTp_DIRECT_SOUTH }, { 4, 11, mRmTp_DIRECT_SOUTH }, + { 10, 6, mRmTp_DIRECT_SOUTH }, { 13, 6, mRmTp_DIRECT_SOUTH }, { 11, 6, mRmTp_DIRECT_SOUTH }, + { 6, 6, mRmTp_DIRECT_WEST }, { 6, 5, mRmTp_DIRECT_WEST }, { 6, 7, mRmTp_DIRECT_WEST }, + { 9, 11, mRmTp_DIRECT_SOUTH }, { 11, 11, mRmTp_DIRECT_SOUTH }, { 13, 11, mRmTp_DIRECT_SOUTH }, + { 3, 8, mRmTp_DIRECT_EAST }, { 3, 6, mRmTp_DIRECT_EAST }, { 6, 8, mRmTp_DIRECT_SOUTH }, + { 7, 8, mRmTp_DIRECT_SOUTH }, { 8, 8, mRmTp_DIRECT_SOUTH }, { 9, 8, mRmTp_DIRECT_SOUTH }, + { 10, 8, mRmTp_DIRECT_SOUTH }, +}; + +static void Museum_Fossil_Actor_ct(ACTOR* actorx, GAME* game) { + // nothing +} + +static void Museum_Fossil_Actor_dt(ACTOR* actorx, GAME* game) { + // nothing +} + +static void Museum_Fossil_Actor_draw(ACTOR* actorx, GAME* game) { + // nothing +} + +static void aMF_SetTalkInfo(ACTOR* actorx) { + static rgba_t aMP_window_color = { 255, 255, 205, 255 }; + MUSEUM_FOSSIL_ACTOR* museum_fossil = (MUSEUM_FOSSIL_ACTOR*)actorx; + + mDemo_Set_msg_num(museum_fossil->msg_no); + mDemo_Set_talk_display_name(FALSE); + mDemo_Set_ListenAble(); + mDemo_Set_camera(CAMERA2_PROCESS_NORMAL); + mDemo_Set_use_zoom_sound(TRUE); + mDemo_Set_talk_window_color(&aMP_window_color); + mMsg_Set_continue_msg_num(mMsg_Get_base_window_p(), -1); +} + +static void Museum_Fossil_Actor_move(ACTOR* actorx, GAME* game) { + static u8 item_name[mIN_ITEM_NAME_LEN]; + MUSEUM_FOSSIL_ACTOR* museum_fossil = (MUSEUM_FOSSIL_ACTOR*)actorx; + + if (mDemo_Check(mDemo_TYPE_SPEAK, actorx)) { + PLAYER_ACTOR* player = GET_PLAYER_ACTOR((GAME_PLAY*)game); + s_xyz angle = player->actor_class.shape_info.rotation; + + add_calc_short_angle2(&angle.y, museum_fossil->target_angle, 1.0f - sqrtf(0.7), 0x800, 0); + GET_PLAYER_ACTOR_NOW()->Set_force_position_angle_proc(gamePT, NULL, &angle, mPlayer_FORCE_POSITION_ANGLE_ROTY); + } else if (chkTrigger(BUTTON_A) && mDemo_Get_talk_actor() == NULL) { + xyz_t pos; + s16 angle; + int i; + + for (i = 0; i < mMmd_FOSSIL_NUM; i++) { + int donator = mMmd_FossilInfo(i); + int res; + + pos.x = (aMF_fossil_data_table[i].pos.x & 0xF) * 40.0f + 20.0f; + pos.z = (aMF_fossil_data_table[i].pos.z & 0xF) * 40.0f + 20.0f; + pos.y = 40.0f; + + res = mRmTp_CheckTalkAble(&angle, &pos, aMF_fossil_data_table[i].direct, 42.5f, (GAME_PLAY*)game); + if (res != FALSE) { + museum_fossil->msg_no = (donator == mMmd_DONATOR_NONE) + ? 0x2FA1 + : ((donator == mMmd_DONATOR_DELETED_PLAYER) ? 0x2FA0 : 0x2F9F); + museum_fossil->target_angle = angle; + if (mDemo_Request(mDemo_TYPE_SPEAK, actorx, &aMF_SetTalkInfo)) { + if (mMmd_IS_DONATED(donator)) { + mActor_name_t item = (i >= 0 && i < mMmd_FOSSIL_NUM) + ? (mActor_name_t)(FTR_DINO_START + (mActor_name_t)(i << 2)) + : FTR_DINO_START; + + /* Copy the art item's name */ + mIN_copy_name_str(item_name, item); + mMsg_Set_item_str_art(mMsg_Get_base_window_p(), mMsg_ITEM_STR0, item_name, mIN_ITEM_NAME_LEN, + mIN_get_item_article(item)); + + /* If the donator still lives in town we need to copy their name */ + if (mMmd_DONATOR_EXISTS(donator)) { + mMsg_Set_free_str(mMsg_Get_base_window_p(), mMsg_FREE_STR0, + Save_Get(private[mMmd_DONATOR_PLR_IDX(donator)]).player_ID.player_name, + PLAYER_NAME_LEN); + } + } + + break; + } + } + } + } +} diff --git a/src/m_room_type.c b/src/m_room_type.c index 5c1815ff..a212fe11 100644 --- a/src/m_room_type.c +++ b/src/m_room_type.c @@ -2154,7 +2154,7 @@ extern void mRmTp_CopyFloorData(u8* dst, int floor_no) { } } -extern int mRmTp_CheckTalkAble(s16* rot, xyz_t* pos, f32 max_dist, int required_dir, GAME_PLAY* play) { +extern int mRmTp_CheckTalkAble(s16* rot, xyz_t* pos, int required_dir, f32 max_dist, GAME_PLAY* play) { static int direct_table[16] = { mRmTp_DIRECT_NORTH, -1, -1, mRmTp_DIRECT_WEST, mRmTp_DIRECT_WEST, -1, -1, mRmTp_DIRECT_SOUTH, mRmTp_DIRECT_SOUTH, -1, -1, mRmTp_DIRECT_EAST,