m_random_field OK (#241)

* 25 functions OK

* 10 functions OK

* Add block type and block kind enums/defines

* Formatting/style pass

* Move `FieldMakeBlockType` to `m_field_make`

* Remove unused/duplicate defines

* Split data out for `m_quest` and `m_random_field`; rename data symbols

* Generate `m_random_field.c` and rename function symbols.

* mRF_BlockTypeDirect2GateType, mRF_BlockTypeDirect2GateData OK

* mRF_Type2BlockInfo, mRF_Info2BlockType, mRF_GateType2GateCount, mRF_SearchPond, mRF_Attr2BeastRoadAttr, mRF_CheckBeastRoad OK

* mFI_GetUnitCol OK; mRF_PrintDebug and mRF_BlockInf2CheckBeastRoad OK (pending data import).

* Fix `m_random_field` code split; all newly included functions OK

* Fix mRF_Malloc return type; formatting pass

* Name m_random_field_ovl

* Rename data symbols (m_random_field_ovl).

* Rename symbols (all functions named)

* Import data

* Declare overlay segment; rename symbols

* mRF_MakeRandomField OK (all functions matching).

* Extract asset `data_combi_table`

* Clean up mRF_MakeRandomField; document m_field_make.h

* Rename mCoBG_unkStruct->unk6 as unitAttribute

* Misc cleanup and formatting.

* Rename additional data symbols (m_random_field_ovl).

* Formatting pass

* Improve documentation of BackgroundAttribute enum.

* Formatting pass; add omitted attribute.
This commit is contained in:
kuchenmitsahne
2025-06-04 19:38:23 -04:00
committed by GitHub
parent 8c6ae625ae
commit a4d5910cdb
20 changed files with 1316 additions and 187 deletions
+113 -28
View File
@@ -8,7 +8,87 @@
struct Actor;
struct PosRot;
enum BackgroundAttribute { mCoBG_ATTRIBUTE_0, mCOBG_ATTRIBUTE_NONE = 100 };
// TODO: focus further investigation on attributes WATER, 30, HOLE, WAVE, 59-63, and NONE
enum BackgroundAttribute {
/* 000 */ mCoBG_ATTRIBUTE_GRASS0,
/* 001 */ mCoBG_ATTRIBUTE_GRASS1,
/* 002 */ mCoBG_ATTRIBUTE_GRASS2,
/* 003 */ mCoBG_ATTRIBUTE_GRASS3,
/* 004 */ mCoBG_ATTRIBUTE_SOIL0,
/* 005 */ mCoBG_ATTRIBUTE_SOIL1,
/* 006 */ mCoBG_ATTRIBUTE_SOIL2,
/* 007 */ mCoBG_ATTRIBUTE_STONE, // stone path (not individual rocks)
/* 008 */ mCoBG_ATTRIBUTE_FLOOR, // seems to occupy all units in bottom row
/* 009 */ mCoBG_ATTRIBUTE_BUSH,
/* 010 */ mCoBG_ATTRIBUTE_HOLE, // unconfirmed (from ac-decomp)
/* 011 */ mCoBG_ATTRIBUTE_WAVE, // unconfirmed (from ac-decomp)
/* 012 */ mCoBG_ATTRIBUTE_WATER, // only used in small pond?
/* 013 */ mCoBG_ATTRIBUTE_WATERFALL,
/* 014 */ mCoBG_ATTRIBUTE_RIVER_N,
/* 015 */ mCoBG_ATTRIBUTE_RIVER_NW,
/* 016 */ mCoBG_ATTRIBUTE_RIVER_W,
/* 017 */ mCoBG_ATTRIBUTE_RIVER_SW,
/* 018 */ mCoBG_ATTRIBUTE_RIVER_S,
/* 019 */ mCoBG_ATTRIBUTE_RIVER_SE,
/* 020 */ mCoBG_ATTRIBUTE_RIVER_E,
/* 021 */ mCoBG_ATTRIBUTE_RIVER_NE,
/* 022 */ mCoBG_ATTRIBUTE_SAND,
/* 023 */ mCoBG_ATTRIBUTE_WOOD, // fences (train tracks/dump), large signs, bridge edges
/* 024 */ mCoBG_ATTRIBUTE_SEA, // only seems to appear in row with beach
/* 025 */ mCoBG_ATTRIBUTE_SHALLOW0_NW, // shallower diagonal sea shallows, sea to SE
/* 026 */ mCoBG_ATTRIBUTE_SHALLOW0_NE, // shallower diagonal sea shallows, sea to SW
/* 027 */ mCoBG_ATTRIBUTE_BRIDGE_NW, // diagonal bridge, river to NW
/* 028 */ mCoBG_ATTRIBUTE_BRIDGE_END, // "bridge" unit that ends above water (i.e. a pier)
/* 029 */ mCoBG_ATTRIBUTE_BRIDGE_SE, // diagonal bridge, river to SE
/* 030 */ mCoBG_ATTRIBUTE_30,
/* 031 */ mCoBG_ATTRIBUTE_BRIDGE_C, // diagonal bridge's central unit
/* 032 */ mCoBG_ATTRIBUTE_BRIDGE_N, // horizontal bridge, river/tracks to north (stone?)
/* 033 */ mCoBG_ATTRIBUTE_BRIDGE_E, // vertical bridge/steps, river/grass to east
/* 034 */ mCoBG_ATTRIBUTE_BRIDGE_W, // vertical bridge/steps, river/grass to west
/* 035 */ mCoBG_ATTRIBUTE_BRIDGE_S, // horizontal bridge, river to south
/* 036 */ mCoBG_ATTRIBUTE_SHALLOW1_S, // deeper horizontal sea shallows, sea to south
/* 037 */ mCoBG_ATTRIBUTE_SHALLOW1_NW, // deeper diagonal sea shallows, sea to SE
/* 038 */ mCoBG_ATTRIBUTE_SHALLOW1_NE, // deeper diagonal sea shallows, sea to SW
/* 039 */ mCoBG_ATTRIBUTE_BANK_SE, // diagonal riverbank, river to NW
/* 040 */ mCoBG_ATTRIBUTE_BANK_NE, // diagonal riverbank, river to SW
/* 041 */ mCoBG_ATTRIBUTE_BANK_NW, // diagonal riverbank, river to SE
/* 042 */ mCoBG_ATTRIBUTE_BANK_SW, // diagonal riverbank, river to NE
/* 043 */ mCoBG_ATTRIBUTE_BANK_N, // horizontal riverbank, river to north
/* 044 */ mCoBG_ATTRIBUTE_BANK_W, // vertical riverbank, river to east
/* 045 */ mCoBG_ATTRIBUTE_BANK_E, // vertical riverbank, river to west
/* 046 */ mCoBG_ATTRIBUTE_BANK_S, // horizontal riverbank, river to south
/* 047 */ mCoBG_ATTRIBUTE_CLIFF_S, // vertical cliff edge, valley to north (only in south tunnel wall?)
/* 048 */ mCoBG_ATTRIBUTE_CLIFF_W, // vertical cliff edge, valley to west
/* 049 */ mCoBG_ATTRIBUTE_CLIFF_E, // vertical cliff edge, valley to west
/* 050 */ mCoBG_ATTRIBUTE_CLIFF_N, // horizontal cliff edge, valley to south (also appears in north tunnel wall)
/* 051 */ mCoBG_ATTRIBUTE_TUNNEL_E_S, // east tunnel entrance, south corner
/* 052 */ mCoBG_ATTRIBUTE_TUNNEL_E_N, // east tunnel entrance, north corner
/* 053 */ mCoBG_ATTRIBUTE_TUNNEL_W_N, // west tunnel entrance, north corner
/* 054 */ mCoBG_ATTRIBUTE_TUNNEL_W_S, // west tunnel entrance, south corner
/* 055 */ mCoBG_ATTRIBUTE_CLIFF_SE, // diagonal cliff edge, valley to NW
/* 056 */ mCoBG_ATTRIBUTE_CLIFF_NE, // diagonal cliff edge, valley to SW
/* 057 */ mCoBG_ATTRIBUTE_CLIFF_NW, // diagonal cliff edge, valley to SE
/* 058 */ mCoBG_ATTRIBUTE_CLIFF_SW, // diagonal cliff edge, valley to NE
/* 059 */ mCoBG_ATTRIBUTE_BANK_WN, // corner riverbank, river/pond to north and west (need more data)
/* 060 */ mCoBG_ATTRIBUTE_BANK_UNK, // corner riverbank, unsure (found at beach on mini cliff with SAND to west,
// BANK_NE to east, BANK_E to north, SHALLOW1_NW to south)
/* 061 */ mCoBG_ATTRIBUTE_61,
/* 062 */ mCoBG_ATTRIBUTE_62,
/* 063 */ mCoBG_ATTRIBUTE_63, // appears very sparingly at soil-grass boundaries
/* 100 */ mCoBG_ATTRIBUTE_NONE = 100, // unconfirmed (from ac-decomp)
};
// offset table
typedef struct mCoBG_unkStruct2 {
@@ -21,16 +101,18 @@ typedef struct mCoBG_unkStruct2 {
/* 0x06 */ s8 unk6;
} mCoBG_unkStruct2; // size = 0x7
// clang-format off
// collision bg data
typedef struct mCoBG_unkStruct {
/* 0x0 */ u32 unk0:1; // [31] shape
/* 0x0 */ u32 unk1:5; // [30:25] center
/* 0x0 */ u32 unk2:5; // [25:20] top_left
/* 0x0 */ u32 unk3:5; // [20:15] bot_left
/* 0x0 */ u32 unk4:5; // [15:10] top_right
/* 0x0 */ u32 unk5:5; // [10:5] bot_right
/* 0x0 */ u32 unk6:6; // [5:0] unit_attribute
/* 0x0 */ u32 unk0 : 1; // [31] shape
/* 0x0 */ u32 unk1 : 5; // [30:25] center
/* 0x0 */ u32 unk2 : 5; // [25:20] top_left
/* 0x0 */ u32 unk3 : 5; // [20:15] bot_left
/* 0x0 */ u32 unk4 : 5; // [15:10] top_right
/* 0x0 */ u32 unk5 : 5; // [10:5] bot_right
/* 0x0 */ u32 unitAttribute : 6; // [5:0] unit_attribute
} mCoBG_unkStruct; // size = 0x4
// clang-format on
typedef union mCoBG_unkStructUnion {
mCoBG_unkStruct data;
@@ -62,30 +144,32 @@ typedef struct mCoBG_WallInfo {
* | ________ ________ ________ ___X____ | 0x1B | unk12
* | ________ ________ ________ ____XXXX | 0x1C | unk13
*/
// clang-format off
typedef struct mCoBG_CheckResult {
u32 onGround : 1; // on_ground
u32 unk1 : 5; // hit_attribute_wall
u32 hitWall : 5; // hit_wall
u32 unk3 : 3; // hit_wall_count
u32 unk4 : 1; // unk_flag0
u32 unk5 : 6; // unit_attribute
u32 unk6 : 1; // is_on_move_bg_obj
u32 inWater : 1; // is_in_water
u32 unk8 : 1; // unk_flag1
u32 unk9 : 1; // unk_flag2
u32 unk10 : 1; // unk_flag3
u32 unk11 : 1; // unk_flag4
u32 unk12 : 1; // unk_flag5
u32 unk13 : 4; // unk_flag6
u32 onGround : 1; // on_ground
u32 unk1 : 5; // hit_attribute_wall
u32 hitWall : 5; // hit_wall
u32 unk3 : 3; // hit_wall_count
u32 unk4 : 1; // unk_flag0
u32 unk5 : 6; // unit_attribute
u32 unk6 : 1; // is_on_move_bg_obj
u32 inWater : 1; // is_in_water
u32 unk8 : 1; // unk_flag1
u32 unk9 : 1; // unk_flag2
u32 unk10 : 1; // unk_flag3
u32 unk11 : 1; // unk_flag4
u32 unk12 : 1; // unk_flag5
u32 unk13 : 4; // unk_flag6
} mCoBG_CheckResult;
// clang-format on
typedef struct mCoBG_Check{
typedef struct mCoBG_Check {
/* 0x00 */ u8 unk0[0x11];
/* 0x14 */ mCoBG_CheckResult colResult;
/* 0x18 */ u8 unk18[0xC];
/* 0x24 */ mCoBG_WallInfo wallInfo[2];
/* 0x2C */ s16 unk2C;
}mCoBG_Check; // size = 0x30
} mCoBG_Check; // size = 0x30
// void func_80067430_jp();
// void func_800674B0_jp();
@@ -172,9 +256,10 @@ typedef struct mCoBG_Check{
// void func_8006B5C0_jp();
// void func_8006B664_jp();
// void func_8006B92C_jp();
s32 mCoBG_RegistMoveBg(s8 *arg0, struct PosRot *arg1, xyz_t *arg2, s16 *arg3, f32 arg4, s32 arg5, s32 arg6, s32 arg7, s32 arg8, s32 arg9, s32 argA, f32 argB);
s32 mCoBG_RegistMoveBg(s8* arg0, struct PosRot* arg1, xyz_t* arg2, s16* arg3, f32 arg4, s32 arg5, s32 arg6, s32 arg7,
s32 arg8, s32 arg9, s32 argA, f32 argB);
// void func_8006BAA8_jp();
void mCoBG_CrossOffMoveBg(s32 arg0, struct Actor *actor);
void mCoBG_CrossOffMoveBg(s32 arg0, struct Actor* actor);
void func_8006BB64_jp(void);
// void func_8006BB9C_jp();
// void func_8006BBE8_jp();
@@ -245,7 +330,7 @@ void func_8006C8D0_jp(void);
// void func_80071064_jp();
// void func_800713CC_jp();
// void func_80071460_jp();
f32 mCoBG_GetShadowBgY_AngleS_FromWpos(s_xyz*, xyz_t,f32);
f32 mCoBG_GetShadowBgY_AngleS_FromWpos(s_xyz*, xyz_t, f32);
// void func_800715B4_jp();
// void func_80071604_jp();
// void func_80071728_jp();
@@ -259,7 +344,7 @@ void mCoBG_GetBgNorm_FromWpos(xyz_t*, xyz_t);
// void func_800721C8_jp();
// void func_800721E4_jp();
// void func_80072238_jp();
// void func_80072264_jp();
s32 mCoBG_Attribute2CheckPlant(u32 attribute, const xyz_t* wpos); // void func_80072264_jp();
// void func_80072340_jp();
// void func_80072398_jp();
// void func_800723C4_jp();
+8
View File
@@ -19,6 +19,14 @@
#include "m_scene.h"
#include "m_demo.h"
#define COMMON_GET(name) (common_data.name)
#define COMMON_GET_POINTER(name) (&common_data.name)
#define COMMON_SET(name, value) (common_data.name = (value))
#define SAVE_GET(name) (COMMON_GET(save.name))
#define SAVE_GET_POINTER(name) (COMMON_GET_POINTER(save.name))
#define SAVE_SET(name, value) (COMMON_SET(save.name, value))
typedef enum Season {
/* 0 */ SPRING,
/* 1 */ SUMMER,
+14 -3
View File
@@ -40,6 +40,7 @@ struct Game;
#define FI_BK_WORLDSIZE_HALF_X_F (FI_BK_WORLDSIZE_X_F / 2.0f)
#define FI_BK_WORLDSIZE_HALF_Z_F (FI_BK_WORLDSIZE_Z_F / 2.0f)
#define mFI_NUM_SOUND_SOURCES 6
typedef enum FieldType {
/* 0 */ FI_FIELDTYPE_FG,
@@ -49,10 +50,10 @@ typedef enum FieldType {
/* 4 */ FI_FIELDTYPE_NPC_ROOM,
/* 5 */ FI_FIELDTYPE_DEMO,
/* 6 */ FI_FIELDTYPE_PLAYER_ROOM,
/* 7 */ FI_FIELDTYPE_NUM
} FieldType;
#define FI_TO_FIELD_ID(type, index) (((type) << 12) | (index))
#define FI_GET_TYPE(id) ((id) & 0xF000)
@@ -83,6 +84,16 @@ typedef enum FieldDirection {
/* 5 */ FI_MOVEDIR_MAX
} FieldDirection;
// TODO: confirm 0 through 2 (POND and NUM confirmed)
typedef enum FieldSoundSource {
/* 0 */ mFI_SOUND_SOURCE_NONE,
/* 1 */ mFI_SOUND_SOURCE_RIVER,
/* 2 */ mFI_SOUND_SOURCE_OCEAN,
/* 3 */ mFI_SOUND_SOURCE_POND,
/* 4 */ mFI_SOUND_SOURCE_NUM
} FieldSoundSource;
#define FI_GET_PLAYER_ROOM_NO(fieldId) (((fieldId)-FI_FIELD_PLAYER0_ROOM) & 3)
#define FI_IS_PLAYER_ROOM(fieldId) \
((fieldId) == FI_FIELD_PLAYER0_ROOM || (fieldId) == FI_FIELD_PLAYER1_ROOM || \
@@ -151,10 +162,10 @@ mCoBG_unkStructUnion* mFI_UtNum2UtCol(s32 utX, s32 utZ);
// void func_80089698_jp();
// void func_80089704_jp();
// void func_800897D0_jp();
// void func_80089888_jp();
mCoBG_unkStructUnion* mFI_GetUnitCol(xyz_t wpos);
// void func_800898F4_jp();
// void func_800899CC_jp();
// void func_80089A34_jp();
struct FieldMakeBGSoundSource* mFI_GetSoundSourcePBlockNum(s32 blockX, s32 blockZ);
// void func_80089AAC_jp();
// void func_80089B1C_jp();
// void func_80089B94_jp();
+40 -6
View File
@@ -4,6 +4,8 @@
#include "ultra64.h"
#include "unk.h"
#include "m_collision_bg.h"
#include "m_field_info.h"
#include "other_types.h"
struct Game;
@@ -20,6 +22,10 @@ struct Game;
#define UT_Z_NUM UT_BASE_NUM /* Spaces per block (acre) in z direction */
#define UT_TOTAL_NUM (UT_X_NUM * UT_Z_NUM)
#define mFM_SOUND_SOURCE_NUM 6
#define mFM_MOVE_ACTOR_NUM 16
#define mFM_HANIWA_STEP_NUM 4
/*
* Naming convention for `RIVER`/`POOL`: directions indicated are flow of river
* (e.g. `RIVER_SOUTH` indicates a river that flows south through entire block,
@@ -124,10 +130,21 @@ typedef enum FieldMakeBlockType {
extern u8* g_block_type_p;
extern u32* g_block_kind_p; // s32 in ac-decomp--if problems arise, try changing type
typedef struct FieldMakeCombination {
/* 0x0 */ u16 combinationType : 14; /* acre type index into `data_combi_table` */
/* 0x0 */ u16 height : 2; /* 0, 1, 2, or 3 (unused) */
} FieldMakeCombination; // size = 0x2
typedef struct Foreground {
/* 0x000 */ u16 items[UT_Z_NUM][UT_X_NUM];
} Foreground; // size = 0x200
typedef struct FieldMakeComboInfo {
/* 0x00 */ u16 bgId; // perhaps should be `bgName`?
/* 0x02 */ u16 fgId; // perhaps should be `fgName`?
/* 0x05 */ u8 blockType;
} FieldMakeComboInfo; // size = 0x6
typedef struct FieldMakeMoveActor {
/* 0x0 */ u16 nameId;
/* 0x2 */ s8 utX;
@@ -142,19 +159,36 @@ typedef struct FieldMakeFGData {
/* 0x202 */ UNK_TYPE1 unk_202[4];
} FieldMakeFGData; // size = 0x206
typedef struct FieldMakeBGSoundSource {
/* 0x0 */ s16 kind;
/* 0x4 */ xyz_t pos;
} FieldMakeBGSoundSource; // size = 0x10
typedef struct FieldMakeFGInfo {
/* 0x00 */ u16 fgId;
/* 0x04 */ u16* itemsPtr;
/* 0x08 */ UNK_TYPE1 unk_08[0x8C];
/* 0x08 */ UNK_PTR unk_08; // ac-decomp: u16* deposit_p
/* 0x0C */ FieldMakeMoveActor moveActors[mFM_MOVE_ACTOR_NUM];
/* 0x8C */ UNK_TYPE2 unk_08C; // ac-decomp: u16 move_actor_bit_data
/* 0x8E */ u8 haniwaStep[mFM_HANIWA_STEP_NUM];
} FieldMakeFGInfo; // size = 0x94
// TODO: come up with better names to disambiguate the union `bgId` (which contains height data)
// from the plain u16 `bgId` used in `FieldMakeComboInfo`
typedef struct FieldMakeBGInfo {
/* 0x000 */ UNK_TYPE1 unk_000[0x14];
/* 0x000 */ FieldMakeCombination bgId; // stores `bgName` + height of corresponding block type from `data_combi_table`
/* 0x004 */ UNK_PTR unk_004; // ac-decomp: Gfx* opaque_gfx
/* 0x008 */ UNK_PTR unk_008; // ac-decomp: Gfx* translucent_gfx
/* 0x00C */ UNK_PTR unk_00C; // ac-decomp: EvwAnimeData* animation
/* 0x010 */ UNK_TYPE1 unk_010; // ac-decomp: s8 animation_count
/* 0x011 */ u8 blockType;
/* 0x014 */ u32 blockKind;
/* 0x018 */ UNK_TYPE1 unk_018[0x08];
/* 0x018 */ RomOffset romStartAddr;
/* 0x01C */ s32 romSize;
/* 0x020 */ mCoBG_unkStructUnion collision[UT_Z_NUM][UT_X_NUM];
/* 0x420 */ UNK_TYPE1 unk_024[0x160];
} FieldMakeBGInfo; // size >= 0x57d
/* 0x420 */ u8 unk_420[UT_Z_NUM][UT_X_NUM]; // ac-decomp: u8 keep_h (holds `center` bitfield from corresponding `collision` entries)
/* 0x520 */ FieldMakeBGSoundSource soundSource[mFM_SOUND_SOURCE_NUM];
} FieldMakeBGInfo; // size = 0x580
typedef struct FieldMakeBlockInfo {
/* 0x000 */ FieldMakeBGInfo bgInfo;
@@ -164,7 +198,7 @@ typedef struct FieldMakeBlockInfo {
typedef struct FieldMakeInfo {
/* 0x000 */ u16 fieldId;
/* 0x002 */ UNK_TYPE1 unk_000[0x146];
/* 0x148 */ FieldMakeBlockInfo* blockInfo;
/* 0x148 */ FieldMakeBlockInfo* blockInfo; // length: BLOCK_TOTAL_NUM
/* 0x14C */ UNK_TYPE1 unk_14C[0x1A];
/* 0x166 */ u8 blockXMax;
/* 0x167 */ u8 blockZMax;
+29 -15
View File
@@ -2,6 +2,9 @@
#define M_RANDOM_FIELD_H
#include "ultra64.h"
#include "m_collision_bg.h"
#include "game.h"
#include "m_field_make.h"
#define RANDOM_FIELD_DIRECT_ERROR 100
@@ -14,6 +17,17 @@ typedef enum RandomFieldDirection {
/* 4 */ RANDOM_FIELD_DIRECT_NUM
} RandomFieldDirection;
typedef enum RandomFieldGateType {
/* 0 */ mRF_GATE_NONE,
/* 1 */ mRF_GATE1_TYPE0,
/* 2 */ mRF_GATE1_TYPE1,
/* 3 */ mRF_GATE2_TYPE0,
/* 4 */ mRF_GATE2_TYPE1,
/* 5 */ mRF_GATE3_TYPE0,
/* 6 */ mRF_GATE_TYPE_NUM
} RandomFieldGateType;
typedef struct RandomFieldGate {
/* 0x00 */ s32 ut0;
/* 0x04 */ s32 ut1;
@@ -53,20 +67,20 @@ typedef struct RandomFieldGate {
#define mRF_BLOCKKIND_CLIFF6 (1 << 30) // Bottom part of cliff that juts out, valley on left
#define mRF_BLOCKKIND_31 (1 << 31) // Not used in `mRF_block_info`
// void func_800BCBA0_jp();
// void func_800BCBDC_jp();
// void func_800BCC20_jp();
// void func_800BCC30_jp();
// void func_800BCC40_jp();
// void func_800BCCFC_jp();
s32 mRF_Type2BlockInfo(u8 type);
// void func_800BCDFC_jp();
// void func_800BCE80_jp();
// void func_800BCEA4_jp();
// void func_800BCF64_jp();
// void func_800BCFA4_jp();
RandomFieldGate* mRF_BlockTypeDirect2GateData(s32*, u8, s32);
// void func_800BD02C_jp();
// void func_800BD1E4_jp();
// void* mRF_Malloc(Game* game, size_t size);
// void mRF_Free(Game* game, void* ptr);
s32* mRF_StepNo(void);
s32* mRF_TryCnt(void);
// void mRF_PrintDebug(gfxprint* gfxprint);
void mRF_MakeRandomField(FieldMakeCombination* combi_table, FieldMakeComboInfo* combi_info, s32 combi_count, Game* game);
u32 mRF_Type2BlockInfo(u8 blockType);
// u8 mRF_Info2BlockType(u32 blockInfo);
// s32 mRF_GateType2GateCount(s32 gateType);
s32 mRF_SearchPond(s32* utX, s32* utZ, s32 blockX, s32 blockZ);
// s32 mRF_Attr2BeastRoadAttr(s32 attribute);
// s32 mRF_BlockTypeDirect2GateType(u8 blockType, s32 direct);
RandomFieldGate* mRF_BlockTypeDirect2GateData(s32* gateCount, u8 blockType, s32 direct);
// s32 mRF_BlockInf2CheckBeastRoad(u8 blockType, mCoBG_unkStructUnion* collisionData);
void mRF_CheckBeastRoad();
#endif
+2
View File
@@ -96,6 +96,8 @@ DECLARE_SEGMENT(ovl__0079F810);
DECLARE_SEGMENT(ovl__007A10E0);
DECLARE_SEGMENT(catalog_ovl);
DECLARE_SEGMENT(m_random_field_ovl);
DECLARE_SEGMENT(ac_set_ovl_insect);
DECLARE_SEGMENT(ac_set_ovl_gyoei);
+3 -3
View File
@@ -116,8 +116,8 @@ DEFINE_DMA_ENTRY(ovl__00814FA0, "ovl__00814FA0")
DEFINE_DMA_ENTRY(ovl__00814FA0_reloc, "ovl__00814FA0_reloc")
DEFINE_DMA_ENTRY(ovl__00815B70, "ovl__00815B70")
DEFINE_DMA_ENTRY(ovl__00815B70_reloc, "ovl__00815B70_reloc")
DEFINE_DMA_ENTRY(ovl__0081AA60, "ovl__0081AA60")
DEFINE_DMA_ENTRY(ovl__0081AA60_reloc, "ovl__0081AA60_reloc")
DEFINE_DMA_ENTRY(m_random_field_ovl, "m_random_field_ovl")
DEFINE_DMA_ENTRY(m_random_field_ovl_reloc, "m_random_field_ovl_reloc")
DEFINE_DMA_ENTRY(ovl__0081D9D0, "ovl__0081D9D0")
DEFINE_DMA_ENTRY(ovl__0081D9D0_reloc, "ovl__0081D9D0_reloc")
DEFINE_DMA_ENTRY(ac_set_ovl_insect, "ac_set_ovl_insect")
@@ -2288,7 +2288,7 @@ DEFINE_DMA_ENTRY(segment_01148000, "segment_01148000")
DEFINE_DMA_ENTRY(segment_0114A000, "segment_0114A000")
DEFINE_DMA_ENTRY(segment_01188000, "segment_01188000")
DEFINE_DMA_ENTRY(segment_011AB000, "segment_011AB000")
DEFINE_DMA_ENTRY(segment_011E2000, "segment_011E2000")
DEFINE_DMA_ENTRY(data_combi, "data_combi")
DEFINE_DMA_ENTRY(segment_011E3000, "segment_011E3000")
DEFINE_DMA_ENTRY(segment_011E4000, "segment_011E4000")
DEFINE_DMA_ENTRY(segment_011E5000, "segment_011E5000")
+2
View File
@@ -31,6 +31,8 @@ D_E4D10 = 0xE4D10; // ignore:true
D_13D9A0 = 0x13D9A0; // ignore:true
D_675720 = 0x675720; // ignore:true
D_73F4D0 = 0x73F4D0; // ignore:true
D_81AA60 = 0x81AA60; // ignore:true
D_81D540 = 0x81D540; // ignore:true
__osBbIsBb = 0x80000388; // ignore:true
@@ -1270,6 +1270,8 @@ act_house_goki_model_2 = 0x6000188; // segment:act_house_goki rom:0x1147188
act_house_goki_pal = 0x6000250; // segment:act_house_goki rom:0x1147250
act_house_goki_tex = 0x6000270; // segment:act_house_goki rom:0x1147270
data_combi_table = 0x6000000; // segment:data_combi rom:0x11E2000 size:0x684
act_bee_v = 0x6000000; // segment:act_bee rom:0x11F4000 size:0x3A0
act_bee_C_model = 0x60003A0; // segment:act_bee rom:0x11F43A0
act_bee_B_model = 0x60004B8; // segment:act_bee rom:0x11F44B8
@@ -1350,3 +1352,4 @@ int_sum_clchest03_door_model = 0x6000D30; // segment:int_sum_clchest03 rom:0x15D
int_sum_clchest03_base_model = 0x6000DF0; // segment:int_sum_clchest03 rom:0x15D0DF0
cKF_je_r_int_sum_clchest03_tbl = 0x6000F38; // segment:int_sum_clchest03 rom:0x15D0F38
cKF_bs_r_int_sum_clchest03 = 0x6000F5C; // segment:int_sum_clchest03 rom:0x15D0F5C
+51 -51
View File
@@ -776,7 +776,7 @@ func_80071DB4_jp = 0x80071DB4; // type:func
func_800721C8_jp = 0x800721C8; // type:func
func_800721E4_jp = 0x800721E4; // type:func
func_80072238_jp = 0x80072238; // type:func
func_80072264_jp = 0x80072264; // type:func
mCoBG_Attribute2CheckPlant = 0x80072264; // type:func
func_80072340_jp = 0x80072340; // type:func
func_80072398_jp = 0x80072398; // type:func
func_800723C4_jp = 0x800723C4; // type:func
@@ -1358,10 +1358,10 @@ mFI_UtNum2UtCol = 0x800895B8; // type:func
func_80089698_jp = 0x80089698; // type:func
func_80089704_jp = 0x80089704; // type:func
func_800897D0_jp = 0x800897D0; // type:func
func_80089888_jp = 0x80089888; // type:func
mFI_GetUnitCol = 0x80089888; // type:func
func_800898F4_jp = 0x800898F4; // type:func
func_800899CC_jp = 0x800899CC; // type:func
func_80089A34_jp = 0x80089A34; // type:func
mFI_GetSoundSourcePBlockNum = 0x80089A34; // type:func
func_80089AAC_jp = 0x80089AAC; // type:func
func_80089B1C_jp = 0x80089B1C; // type:func
func_80089B94_jp = 0x80089B94; // type:func
@@ -2857,21 +2857,21 @@ func_800BC6B0_jp = 0x800BC6B0; // type:func
func_800BC724_jp = 0x800BC724; // type:func
func_800BC830_jp = 0x800BC830; // type:func
mQst_PrintQuestInfo = 0x800BC938; // type:func
func_800BCBA0_jp = 0x800BCBA0; // type:func
func_800BCBDC_jp = 0x800BCBDC; // type:func
func_800BCC20_jp = 0x800BCC20; // type:func
func_800BCC30_jp = 0x800BCC30; // type:func
func_800BCC40_jp = 0x800BCC40; // type:func
func_800BCCFC_jp = 0x800BCCFC; // type:func
mRF_Malloc = 0x800BCBA0; // type:func
mRF_Free = 0x800BCBDC; // type:func
mRF_StepNo = 0x800BCC20; // type:func
mRF_TryCnt = 0x800BCC30; // type:func
mRF_PrintDebug = 0x800BCC40; // type:func
mRF_MakeRandomField = 0x800BCCFC; // type:func
mRF_Type2BlockInfo = 0x800BCDCC; // type:func
func_800BCDFC_jp = 0x800BCDFC; // type:func
func_800BCE80_jp = 0x800BCE80; // type:func
func_800BCEA4_jp = 0x800BCEA4; // type:func
func_800BCF64_jp = 0x800BCF64; // type:func
func_800BCFA4_jp = 0x800BCFA4; // type:func
mRF_Info2BlockType = 0x800BCDFC; // type:func
mRF_GateType2GateCount = 0x800BCE80; // type:func
mRF_SearchPond = 0x800BCEA4; // type:func
mRF_Attr2BeastRoadAttr = 0x800BCF64; // type:func
mRF_BlockTypeDirect2GateType = 0x800BCFA4; // type:func
mRF_BlockTypeDirect2GateData = 0x800BCFC8; // type:func
func_800BD02C_jp = 0x800BD02C; // type:func
func_800BD1E4_jp = 0x800BD1E4; // type:func
mRF_BlockInf2CheckBeastRoad = 0x800BD02C; // type:func
mRF_CheckBeastRoad = 0x800BD1E4; // type:func
gfx_set_fog_position = 0x800BD2B0; // type:func
gfx_set_fog_nosync = 0x800BD37C; // type:func
func_800BD3EC_jp = 0x800BD3EC; // type:func
@@ -4842,42 +4842,42 @@ D_8010C650_jp = 0x8010C650; // type:u8
D_8010C65C_jp = 0x8010C65C; //
D_8010C66C_jp = 0x8010C66C; // type:u16
D_8010C670_jp = 0x8010C670; // type:u16
D_8010C680_jp = 0x8010C680; //
D_8010C684_jp = 0x8010C684; //
D_8010C694_jp = 0x8010C694; //
D_8010C69C_jp = 0x8010C69C; // type:u8
D_8010C6A4_jp = 0x8010C6A4; //
D_8010C6B0_jp = 0x8010C6B0; //
l_delivery_limit = 0x8010C680; // type:u8
l_errand_limit = 0x8010C684; // type:u8
l_contest_limit = 0x8010C694; // type:u8
l_contest_fin_limit = 0x8010C69C; // type:u8
l_limit_table = 0x8010C6A4; //
l_limit_table_max = 0x8010C6B0; //
D_8010C6B8_jp = 0x8010C6B8; //
D_8010C6C0_jp = 0x8010C6C0; //
D_8010C6C4_jp = 0x8010C6C4; //
D_8010C6C8_jp = 0x8010C6C8; //
D_8010C6CC_jp = 0x8010C6CC; //
D_8010C6F8_jp = 0x8010C6F8; //
D_8010C848_jp = 0x8010C848; // type:u8
D_8010C850_jp = 0x8010C850; //
D_8010C858_jp = 0x8010C858; //
D_8010C860_jp = 0x8010C860; //
D_8010C868_jp = 0x8010C868; //
D_8010C870_jp = 0x8010C870; //
D_8010C878_jp = 0x8010C878; //
D_8010C880_jp = 0x8010C880; //
D_8010C888_jp = 0x8010C888; //
D_8010C890_jp = 0x8010C890; //
D_8010C8A0_jp = 0x8010C8A0; //
D_8010C8B0_jp = 0x8010C8B0; //
D_8010C8C0_jp = 0x8010C8C0; //
D_8010C8D0_jp = 0x8010C8D0; //
D_8010C8E0_jp = 0x8010C8E0; //
D_8010C8F0_jp = 0x8010C8F0; //
D_8010C900_jp = 0x8010C900; //
D_8010C910_jp = 0x8010C910; //
D_8010C928_jp = 0x8010C928; //
D_8010C940_jp = 0x8010C940; //
D_8010C958_jp = 0x8010C958; //
D_8010C970_jp = 0x8010C970; //
D_8010C9D0_jp = 0x8010C9D0; // type:u8
D_8010CB20_jp = 0x8010CB20; //
mRF_AllocatedBuf = 0x8010C6C0; //
stepNo = 0x8010C6C4; //
tryCnt = 0x8010C6C8; //
mRF_DebugMsg = 0x8010C6CC; //
mRF_block_info = 0x8010C6F8; //
gate_count_table = 0x8010C848; // type:u8 size:0x6
gate1_type0_up = 0x8010C850; //
gate1_type0_lt = 0x8010C858; //
gate1_type0_dn = 0x8010C860; //
gate1_type0_rt = 0x8010C868; //
gate1_type1_up = 0x8010C870; //
gate1_type1_lt = 0x8010C878; //
gate1_type1_dn = 0x8010C880; //
gate1_type1_rt = 0x8010C888; //
gate2_type0_up = 0x8010C890; //
gate2_type0_lt = 0x8010C8A0; //
gate2_type0_dn = 0x8010C8B0; //
gate2_type0_rt = 0x8010C8C0; //
gate2_type1_up = 0x8010C8D0; //
gate2_type1_lt = 0x8010C8E0; //
gate2_type1_dn = 0x8010C8F0; //
gate2_type1_rt = 0x8010C900; //
gate3_type0_up = 0x8010C910; //
gate3_type0_lt = 0x8010C928; //
gate3_type0_dn = 0x8010C940; //
gate3_type0_rt = 0x8010C958; //
mRF_gate_correct_info = 0x8010C970; //
mRF_gate_info2 = 0x8010C9D0; // type:u8
wpos = 0x8010CB20; // type:f32 size:0xC allow_duplicates:true
z_gsCPModeSet_Data = 0x8010CB30; // type:Gfx size:0x2D0
RSP_RDP_clear_data = 0x8010CE00; // type:Gfx size:0x60
fade_gfx = 0x8010CE60; // type:Gfx size:0x30
+56 -58
View File
@@ -6654,7 +6654,7 @@ B_80921EB8_jp = 0x80921EB8; // type:s8
// .text
func_80922800_jp = 0x80922800; // type:func
mRF_GetRandom = 0x80922800; // type:func
func_80922840_jp = 0x80922840; // type:func
func_80922854_jp = 0x80922854; // type:func
func_8092288C_jp = 0x8092288C; // type:func
@@ -6698,62 +6698,61 @@ func_80924C9C_jp = 0x80924C9C; // type:func
func_80924DB0_jp = 0x80924DB0; // type:func
func_80924DF4_jp = 0x80924DF4; // type:func
func_80924E6C_jp = 0x80924E6C; // type:func
func_80924EEC_jp = 0x80924EEC; // type:func
mRF_MakeRandomField_ovl = 0x80924EEC; // type:func
// .data
D_80925080_jp = 0x80925080; //
D_809250B8_jp = 0x809250B8; //
D_809250BC_jp = 0x809250BC; //
D_809250C4_jp = 0x809250C4; //
D_809250C8_jp = 0x809250C8; //
D_809250D0_jp = 0x809250D0; //
D_809250D4_jp = 0x809250D4; //
D_809250DC_jp = 0x809250DC; //
D_809250E8_jp = 0x809250E8; // type:u8
D_809250F0_jp = 0x809250F0; //
D_809250F4_jp = 0x809250F4; //
D_809250FC_jp = 0x809250FC; //
D_80925100_jp = 0x80925100; //
D_80925108_jp = 0x80925108; //
D_8092510C_jp = 0x8092510C; //
D_80925114_jp = 0x80925114; //
D_80925118_jp = 0x80925118; //
D_80925120_jp = 0x80925120; //
D_80925124_jp = 0x80925124; //
D_8092512C_jp = 0x8092512C; //
D_80925130_jp = 0x80925130; //
D_80925138_jp = 0x80925138; //
D_8092513C_jp = 0x8092513C; //
D_80925144_jp = 0x80925144; //
D_80925160_jp = 0x80925160; // type:u8
D_80925168_jp = 0x80925168; //
D_8092516C_jp = 0x8092516C; //
D_80925174_jp = 0x80925174; //
D_80925178_jp = 0x80925178; //
D_80925180_jp = 0x80925180; //
D_80925184_jp = 0x80925184; //
D_8092518C_jp = 0x8092518C; //
D_80925190_jp = 0x80925190; //
D_80925198_jp = 0x80925198; //
D_8092519C_jp = 0x8092519C; //
D_809251A4_jp = 0x809251A4; //
D_809251A8_jp = 0x809251A8; //
D_809251B0_jp = 0x809251B0; //
D_809251B4_jp = 0x809251B4; //
D_809251BC_jp = 0x809251BC; //
D_809251C0_jp = 0x809251C0; //
D_809251D8_jp = 0x809251D8; //
D_809251E8_jp = 0x809251E8; //
D_809251F8_jp = 0x809251F8; //
D_80925240_jp = 0x80925240; //
D_80925248_jp = 0x80925248; //
D_80925250_jp = 0x80925250; //
D_80925258_jp = 0x80925258; //
D_8092527C_jp = 0x8092527C; //
D_8092528C_jp = 0x8092528C; // type:u8
D_8092528D_jp = 0x8092528D; // type:u8
D_80925294_jp = 0x80925294; // type:u16
l_base_blocks = 0x80925080; // type:u8
l_cliff_startA_factor = 0x809250B8; // type:u8 size:0x2
l_cliff_startA = 0x809250BC; //
l_cliff_startB_factor = 0x809250C4; // type:u8 size:0x3
l_cliff_startB = 0x809250C8; //
l_cliff_startC_factor = 0x809250D0; // type:u8 size:0x2
l_cliff_startC = 0x809250D4; //
l_cliff_start_table = 0x809250DC; //
l_cliff_next_direct = 0x809250E8; // type:u8 size:0x7
l_cliff1_next = 0x809250F0; // type:u8 size:0x3
l_cliff1_next_class = 0x809250F4; //
l_cliff2_next = 0x809250FC; // type:u8 size:0x2
l_cliff2_next_class = 0x80925100; //
l_cliff3_next = 0x80925108; // type:u8 size:0x2
l_cliff3_next_class = 0x8092510C; //
l_cliff4_next = 0x80925114; // type:u8 size:0x3
l_cliff4_next_class = 0x80925118; //
l_cliff5_next = 0x80925120; // type:u8 size:0x2
l_cliff5_next_class = 0x80925124; //
l_cliff6_next = 0x8092512C; // type:u8 size:0x2
l_cliff6_next_class = 0x80925130; //
l_cliff7_next = 0x80925138; // type:u8 size:0x3
l_cliff7_next_class = 0x8092513C; //
l_cliff_next_data = 0x80925144; //
l_river_next_direct = 0x80925160; //
l_river1_next = 0x80925168; // type:u8 size:0x3
l_river1_next_class = 0x8092516C; //
l_river2_next = 0x80925174; // type:u8 size:0x2
l_river2_next_class = 0x80925178; //
l_river3_next = 0x80925180; // type:u8 size:0x2
l_river3_next_class = 0x80925184; //
l_river4_next = 0x8092518C; // type:u8 size:0x2
l_river4_next_class = 0x80925190; //
l_river5_next = 0x80925198; // type:u8 size:0x3
l_river5_next_class = 0x8092519C; //
l_river6_next = 0x809251A4; // type:u8 size:0x2
l_river6_next_class = 0x809251A8; //
l_river7_next = 0x809251B0; // type:u8 size:0x3
l_river7_next_class = 0x809251B4; //
l_river_next_data = 0x809251BC; // size:0x1C
x_offset = 0x809251D8; //
z_offset = 0x809251E8; //
blockGroup = 0x809251F8; //
river1_album_data = 0x80925240; // type:u8 size:0x7
river2_album_data = 0x80925248; // type:u8 size:0x7
river3_album_data = 0x80925250; // type:u8 size:0x7
river_no_album_data = 0x80925258; // type:u8 size:0x7
river_cliff_album_data = 0x80925260; //
startX_table = 0x8092527C; //
cross_data = 0x8092528C; // type:u8 size:0x7
init_cmb = 0x80925294; // type:u16 size:0x2
// .rodata
@@ -6762,15 +6761,14 @@ jtbl_809252BC_jp = 0x809252BC; // type:jtbl
// .bss
B_809252E0_jp = 0x809252E0; //
B_80925318_jp = 0x80925318; //
keep_blocks = 0x809252E0; //
challenge_flag = 0x80925318; //
B_80925350_jp = 0x80925350; // type:s16
B_809253C0_jp = 0x809253C0; // type:s16
B_80925430_jp = 0x80925430; //
B_80925468_jp = 0x80925468; //
B_809254A0_jp = 0x809254A0; //
B_809254D8_jp = 0x809254D8; // type:s16
B_80925548_jp = 0x80925548; //
l_use_data = 0x809254D8; // type:s16 size:0x70
D_80925550_jp = 0x80925550; //
// .text
+15 -5
View File
@@ -6,7 +6,7 @@
s32 mFI_BlockCheck(s32 blockX, s32 blockZ);
// mCoBG_unkStructUnion l_edge_ut = { { 0, 31, 31, 31, 31, 31, mCoBG_ATTRIBUTE_0 } };
// mCoBG_unkStructUnion l_edge_ut = { { 0, 31, 31, 31, 31, 31, mCoBG_ATTRIBUTE_GRASS0 } };
extern mCoBG_unkStructUnion l_edge_ut;
extern FieldMakeInfo* g_fdinfo;
@@ -511,13 +511,23 @@ mCoBG_unkStructUnion* mFI_UtNum2UtCol(s32 utX, s32 utZ) {
#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_field_info/func_800897D0_jp.s")
#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_field_info/func_80089888_jp.s")
mCoBG_unkStructUnion* mFI_GetUnitCol(xyz_t wpos) {
s32 utX;
s32 utZ;
s32 validWpos = mFI_Wpos2UtNum(&utX, &utZ, wpos);
if (!validWpos) {
return &l_edge_ut;
} else {
return mFI_UtNum2UtCol(utX, utZ);
}
}
#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_field_info/func_800898F4_jp.s")
#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_field_info/func_800899CC_jp.s")
#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_field_info/func_80089A34_jp.s")
#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_field_info/mFI_GetSoundSourcePBlockNum.s")
#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_field_info/func_80089AAC_jp.s")
@@ -749,7 +759,7 @@ s32 mFI_GetWaveUtinBlock(s32* arg0, s32* arg1, s32 arg2, s32 arg3) {
for (i = 0; i < 0x100; i++) {
if (func_80076358_jp(var_s1->data.unk6) == 1) {
if (func_80076358_jp(var_s1->data.unitAttribute) == 1) {
var_s3 += 1;
}
@@ -762,7 +772,7 @@ s32 mFI_GetWaveUtinBlock(s32* arg0, s32* arg1, s32 arg2, s32 arg3) {
for (i = 0; i < 0x100; i++) {
if (func_80076358_jp(var_s1->data.unk6) == 1) {
if (func_80076358_jp(var_s1->data.unitAttribute) == 1) {
if (var_s2 <= 0) {
arg0[0] = i & 0xF;
+4 -3
View File
@@ -3563,7 +3563,8 @@ s32 mNpc_CheckNpcSet(s32 bx, s32 bz, s32 ut_x, s32 ut_z) {
s32 res = FALSE;
if (collision != NULL && items != NULL) {
res = mNpc_CheckNpcSet_fgcol(items[ut_z * UT_X_NUM + ut_x], collision[ut_z * UT_X_NUM + ut_x].data.unk6);
res =
mNpc_CheckNpcSet_fgcol(items[ut_z * UT_X_NUM + ut_x], collision[ut_z * UT_X_NUM + ut_x].data.unitAttribute);
}
return res;
@@ -3595,7 +3596,7 @@ s32 mNpc_GetMakeUtNuminBlock_hard_area(s32* utX, s32* utZ, s32 bx, s32 bz, s32 r
for (i = restrictArea; i < UT_Z_NUM - restrictArea; i++) {
for (j = restrictArea; j < UT_X_NUM - restrictArea; j++) {
idx = i * UT_X_NUM + j;
if (mNpc_CheckNpcSet_fgcol_hard(items[idx], col[idx].data.unk6) == TRUE) {
if (mNpc_CheckNpcSet_fgcol_hard(items[idx], col[idx].data.unitAttribute) == TRUE) {
if (col[idx].data.unk1 == col[idx].data.unk2 && col[idx].data.unk1 == col[idx].data.unk3 &&
col[idx].data.unk1 == col[idx].data.unk4 && col[idx].data.unk1 == col[idx].data.unk5) {
nowUtX = 8 - j;
@@ -3645,7 +3646,7 @@ s32 mNpc_GetMakeUtNuminBlock_area(s32* utX, s32* utZ, s32 bx, s32 bz, s32 restri
if (fgTop != NULL && col != NULL) {
for (i = restrictArea; i < UT_Z_NUM - restrictArea; i++) {
for (j = restrictArea; j < UT_X_NUM - restrictArea; j++) {
if (mNpc_CheckNpcSet_fgcol(fgTop[i * UT_X_NUM + j], col[i * UT_X_NUM + j].data.unk6) == TRUE) {
if (mNpc_CheckNpcSet_fgcol(fgTop[i * UT_X_NUM + j], col[i * UT_X_NUM + j].data.unitAttribute) == TRUE) {
*fgPtr |= 1 << j;
candidates++;
}
+883
View File
@@ -0,0 +1,883 @@
#include "global.h"
#include "m_common_data.h"
#include "m_random_field.h"
#include "m_field_make.h"
#include "m_field_info.h"
#include "m_scene_table.h"
#include "m_malloc.h"
#include "gamealloc.h"
#include "game.h"
#include "ovlmgr.h"
#include "segment_symbols.h"
// Original name unknown. Pointer to malloc'd memory in mRF_MakeRandomField
UNK_PTR mRF_AllocatedBuf = NULL;
// Original name unknown.
void* mRF_Malloc(Game* game, size_t size) {
if (game != NULL) {
return gamealloc_malloc(&game->alloc, size);
}
return zelda_malloc(size);
}
// Original name unknown.
void mRF_Free(Game* game, void* ptr) {
if (ptr != NULL) {
if (game != NULL) {
gamealloc_free(&game->alloc, ptr);
return;
}
zelda_free(ptr);
}
}
// Original name unknown
s32 stepNo = 0;
// Get pointer to stepNo
s32* mRF_StepNo(void) {
return &stepNo;
}
// Original name unknown
s32 tryCnt = 0;
// Get pointer to tryCnt
s32* mRF_TryCnt(void) {
return &tryCnt;
}
// Original name unknown
const char* mRF_DebugMsg[] = { "BGFGショキカ", "カワガケセイセイ", "ウミセイセイ", "ハシサカセイセイ", "コウバンヒロバセイセイ", "ミセユウビンキョクセイセイ",
"イケセイセ", "ベースセッテイ", "ウミニカワセイセイ", "ブロックセンタク", "ランダムカンリョウ" };
void mRF_PrintDebug(gfxprint* gfxprint) {
gfxprint_color(gfxprint, 200, 200, 250, 255);
gfxprint_locate8x8(gfxprint, 3, 21);
gfxprint_printf(gfxprint, "RandomTry %d", tryCnt);
gfxprint_color(gfxprint, 200, 200, 250, 255);
gfxprint_locate8x8(gfxprint, 3, 22);
gfxprint_printf(gfxprint, "RandomStep %s", mRF_DebugMsg[stepNo]);
}
#if 1
// clang-format off
// Provided indices correspond to block type, not struct size
u32 mRF_block_info[mFM_BLOCK_TYPE_NUM] = {
/* 0x00 */ mRF_BLOCKKIND_BORDER,
/* 0x01 */ mRF_BLOCKKIND_BORDER,
/* 0x02 */ mRF_BLOCKKIND_BORDER,
/* 0x03 */ mRF_BLOCKKIND_BORDER,
/* 0x04 */ mRF_BLOCKKIND_BORDER,
/* 0x05 */ mRF_BLOCKKIND_BORDER,
/* 0x06 */ mRF_BLOCKKIND_BORDER,
/* 0x07 */ mRF_BLOCKKIND_BORDER,
/* 0x08 */ mRF_BLOCKKIND_BORDER,
/* 0x09 */ mRF_BLOCKKIND_RAILROAD | mRF_BLOCKKIND_TUNNEL,
/* 0x0A */ mRF_BLOCKKIND_RAILROAD | mRF_BLOCKKIND_TUNNEL,
/* 0x0B */ mRF_BLOCKKIND_STATION | mRF_BLOCKKIND_RAILROAD,
/* 0x0C */ mRF_BLOCKKIND_RAILROAD | mRF_BLOCKKIND_DUMP,
/* 0x0D */ mRF_BLOCKKIND_RIVER | mRF_BLOCKKIND_RAILROAD,
/* 0x0E */ mRF_BLOCKKIND_PLAYER,
/* 0x0F */ mRF_BLOCKKIND_CLIFF | mRF_BLOCKKIND_CLIFF0,
/* 0x10 */ mRF_BLOCKKIND_CLIFF | mRF_BLOCKKIND_CLIFF1,
/* 0x11 */ mRF_BLOCKKIND_CLIFF | mRF_BLOCKKIND_CLIFF2,
/* 0x12 */ mRF_BLOCKKIND_CLIFF | mRF_BLOCKKIND_CLIFF3,
/* 0x13 */ mRF_BLOCKKIND_CLIFF | mRF_BLOCKKIND_CLIFF4,
/* 0x14 */ mRF_BLOCKKIND_CLIFF | mRF_BLOCKKIND_CLIFF5,
/* 0x15 */ mRF_BLOCKKIND_CLIFF | mRF_BLOCKKIND_CLIFF6,
/* 0x16 */ mRF_BLOCKKIND_CLIFF | mRF_BLOCKKIND_RIVER | mRF_BLOCKKIND_WATERFALL | mRF_BLOCKKIND_RIVER0 | mRF_BLOCKKIND_CLIFF0,
/* 0x17 */ mRF_BLOCKKIND_CLIFF | mRF_BLOCKKIND_RIVER | mRF_BLOCKKIND_WATERFALL | mRF_BLOCKKIND_RIVER1 | mRF_BLOCKKIND_CLIFF0,
/* 0x18 */ mRF_BLOCKKIND_CLIFF | mRF_BLOCKKIND_RIVER | mRF_BLOCKKIND_RIVER0 | mRF_BLOCKKIND_CLIFF2,
/* 0x19 */ mRF_BLOCKKIND_CLIFF | mRF_BLOCKKIND_RIVER | mRF_BLOCKKIND_RIVER0 | mRF_BLOCKKIND_CLIFF3,
/* 0x1A */ mRF_BLOCKKIND_CLIFF | mRF_BLOCKKIND_RIVER | mRF_BLOCKKIND_WATERFALL | mRF_BLOCKKIND_RIVER0 | mRF_BLOCKKIND_CLIFF4,
/* 0x1B */ mRF_BLOCKKIND_CLIFF | mRF_BLOCKKIND_RIVER | mRF_BLOCKKIND_RIVER0 | mRF_BLOCKKIND_CLIFF5,
/* 0x1C */ mRF_BLOCKKIND_CLIFF | mRF_BLOCKKIND_RIVER | mRF_BLOCKKIND_RIVER0 | mRF_BLOCKKIND_CLIFF6,
/* 0x1D */ mRF_BLOCKKIND_CLIFF | mRF_BLOCKKIND_RIVER | mRF_BLOCKKIND_RIVER1 | mRF_BLOCKKIND_CLIFF0,
/* 0x1E */ mRF_BLOCKKIND_CLIFF | mRF_BLOCKKIND_RIVER | mRF_BLOCKKIND_WATERFALL | mRF_BLOCKKIND_RIVER1 | mRF_BLOCKKIND_CLIFF1,
/* 0x1F */ mRF_BLOCKKIND_CLIFF | mRF_BLOCKKIND_RIVER | mRF_BLOCKKIND_WATERFALL | mRF_BLOCKKIND_RIVER1 | mRF_BLOCKKIND_CLIFF2,
/* 0x20 */ mRF_BLOCKKIND_CLIFF | mRF_BLOCKKIND_RIVER | mRF_BLOCKKIND_RIVER1 | mRF_BLOCKKIND_CLIFF3,
/* 0x21 */ mRF_BLOCKKIND_CLIFF | mRF_BLOCKKIND_RIVER | mRF_BLOCKKIND_RIVER1 | mRF_BLOCKKIND_CLIFF4,
/* 0x22 */ mRF_BLOCKKIND_CLIFF | mRF_BLOCKKIND_RIVER | mRF_BLOCKKIND_RIVER2 | mRF_BLOCKKIND_CLIFF0,
/* 0x23 */ mRF_BLOCKKIND_CLIFF | mRF_BLOCKKIND_RIVER | mRF_BLOCKKIND_RIVER2 | mRF_BLOCKKIND_CLIFF3,
/* 0x24 */ mRF_BLOCKKIND_CLIFF | mRF_BLOCKKIND_RIVER | mRF_BLOCKKIND_RIVER2 | mRF_BLOCKKIND_CLIFF4,
/* 0x25 */ mRF_BLOCKKIND_CLIFF | mRF_BLOCKKIND_RIVER | mRF_BLOCKKIND_WATERFALL | mRF_BLOCKKIND_RIVER2 | mRF_BLOCKKIND_CLIFF5,
/* 0x26 */ mRF_BLOCKKIND_CLIFF | mRF_BLOCKKIND_RIVER | mRF_BLOCKKIND_WATERFALL | mRF_BLOCKKIND_RIVER2 | mRF_BLOCKKIND_CLIFF6,
/* 0x27 */ mRF_BLOCKKIND_NONE,
/* 0x28 */ mRF_BLOCKKIND_RIVER | mRF_BLOCKKIND_RIVER0,
/* 0x29 */ mRF_BLOCKKIND_RIVER | mRF_BLOCKKIND_RIVER1,
/* 0x2A */ mRF_BLOCKKIND_RIVER | mRF_BLOCKKIND_RIVER2,
/* 0x2B */ mRF_BLOCKKIND_RIVER | mRF_BLOCKKIND_RIVER3,
/* 0x2C */ mRF_BLOCKKIND_RIVER | mRF_BLOCKKIND_RIVER4,
/* 0x2D */ mRF_BLOCKKIND_RIVER | mRF_BLOCKKIND_RIVER5,
/* 0x2E */ mRF_BLOCKKIND_RIVER | mRF_BLOCKKIND_RIVER6,
/* 0x2F */ mRF_BLOCKKIND_RIVER | mRF_BLOCKKIND_BRIDGE | mRF_BLOCKKIND_RIVER0,
/* 0x30 */ mRF_BLOCKKIND_RIVER | mRF_BLOCKKIND_BRIDGE | mRF_BLOCKKIND_RIVER1,
/* 0x31 */ mRF_BLOCKKIND_RIVER | mRF_BLOCKKIND_BRIDGE | mRF_BLOCKKIND_RIVER2,
/* 0x32 */ mRF_BLOCKKIND_RIVER | mRF_BLOCKKIND_BRIDGE | mRF_BLOCKKIND_RIVER3,
/* 0x33 */ mRF_BLOCKKIND_RIVER | mRF_BLOCKKIND_BRIDGE | mRF_BLOCKKIND_RIVER4,
/* 0x34 */ mRF_BLOCKKIND_RIVER | mRF_BLOCKKIND_BRIDGE | mRF_BLOCKKIND_RIVER5,
/* 0x35 */ mRF_BLOCKKIND_RIVER | mRF_BLOCKKIND_BRIDGE | mRF_BLOCKKIND_RIVER6,
/* 0x36 */ mRF_BLOCKKIND_CLIFF | mRF_BLOCKKIND_SLOPE | mRF_BLOCKKIND_CLIFF0,
/* 0x37 */ mRF_BLOCKKIND_CLIFF | mRF_BLOCKKIND_SLOPE | mRF_BLOCKKIND_CLIFF1,
/* 0x38 */ mRF_BLOCKKIND_CLIFF | mRF_BLOCKKIND_SLOPE | mRF_BLOCKKIND_CLIFF2,
/* 0x39 */ mRF_BLOCKKIND_CLIFF | mRF_BLOCKKIND_SLOPE | mRF_BLOCKKIND_CLIFF3,
/* 0x3A */ mRF_BLOCKKIND_CLIFF | mRF_BLOCKKIND_SLOPE | mRF_BLOCKKIND_CLIFF4,
/* 0x3B */ mRF_BLOCKKIND_CLIFF | mRF_BLOCKKIND_SLOPE | mRF_BLOCKKIND_CLIFF5,
/* 0x3C */ mRF_BLOCKKIND_CLIFF | mRF_BLOCKKIND_SLOPE | mRF_BLOCKKIND_CLIFF6,
/* 0x3D */ mRF_BLOCKKIND_CLIFF | mRF_BLOCKKIND_BORDER,
/* 0x3E */ mRF_BLOCKKIND_CLIFF | mRF_BLOCKKIND_BORDER,
/* 0x3F */ mRF_BLOCKKIND_MARINE,
/* 0x40 */ mRF_BLOCKKIND_RIVER | mRF_BLOCKKIND_MARINE | mRF_BLOCKKIND_CLIFF0,
/* 0x41 */ mRF_BLOCKKIND_SHOP,
/* 0x42 */ mRF_BLOCKKIND_SHRINE,
/* 0x43 */ mRF_BLOCKKIND_POSTOFFICE,
/* 0x44 */ mRF_BLOCKKIND_POLICE,
/* 0x45 */ mRF_BLOCKKIND_RIVER | mRF_BLOCKKIND_POOL | mRF_BLOCKKIND_RIVER0,
/* 0x46 */ mRF_BLOCKKIND_RIVER | mRF_BLOCKKIND_POOL | mRF_BLOCKKIND_RIVER1,
/* 0x47 */ mRF_BLOCKKIND_RIVER | mRF_BLOCKKIND_POOL | mRF_BLOCKKIND_RIVER2,
/* 0x48 */ mRF_BLOCKKIND_RIVER | mRF_BLOCKKIND_POOL | mRF_BLOCKKIND_RIVER3,
/* 0x49 */ mRF_BLOCKKIND_RIVER | mRF_BLOCKKIND_POOL | mRF_BLOCKKIND_RIVER4,
/* 0x4A */ mRF_BLOCKKIND_RIVER | mRF_BLOCKKIND_POOL | mRF_BLOCKKIND_RIVER5,
/* 0x4B */ mRF_BLOCKKIND_RIVER | mRF_BLOCKKIND_POOL | mRF_BLOCKKIND_RIVER6,
/* 0x4C */ mRF_BLOCKKIND_BORDER,
/* 0x4D */ mRF_BLOCKKIND_RIVER | mRF_BLOCKKIND_BORDER | mRF_BLOCKKIND_RIVER0,
/* 0x4E */ mRF_BLOCKKIND_CLIFF | mRF_BLOCKKIND_BORDER | mRF_BLOCKKIND_CLIFF0,
/* 0x4F */ mRF_BLOCKKIND_RAILROAD | mRF_BLOCKKIND_BORDER,
/* 0x50 */ mRF_BLOCKKIND_MARINE | mRF_BLOCKKIND_BORDER,
/* 0x51 */ mRF_BLOCKKIND_MARINE | mRF_BLOCKKIND_BORDER,
/* 0x52 */ mRF_BLOCKKIND_RIVER | mRF_BLOCKKIND_BRIDGE | mRF_BLOCKKIND_MARINE | mRF_BLOCKKIND_RIVER0,
/* 0x53 */ mRF_BLOCKKIND_NONE,
};
u8 gate_count_table[mRF_GATE_TYPE_NUM] = { 0, 1, 1, 2, 2, 3 };
#define GATE_UT(z, x) ((((z)&0xF) << 4) | ((x)&0xF))
#define GATE(z0, x0, z1, x1) \
{ GATE_UT(z0, x0), GATE_UT(z1, x1) }
RandomFieldGate gate1_type0_up[1] = { GATE(0, 7, 1, 7) };
RandomFieldGate gate1_type0_lt[1] = { GATE(7, 0, 7, 1) };
RandomFieldGate gate1_type0_dn[1] = { GATE(15, 7, 14, 7) };
RandomFieldGate gate1_type0_rt[1] = { GATE(7, 15, 7, 14) };
RandomFieldGate gate1_type1_up[1] = { GATE(0, 7, 1, 7) };
RandomFieldGate gate1_type1_lt[1] = { GATE(9, 0, 9, 1) };
RandomFieldGate gate1_type1_dn[1] = { GATE(15, 7, 14, 7) };
RandomFieldGate gate1_type1_rt[1] = { GATE(9, 15, 9, 14) };
RandomFieldGate gate2_type0_up[2] = { GATE(0, 5, 1, 5), GATE(0, 12, 1, 12) };
RandomFieldGate gate2_type0_lt[2] = { GATE(5, 0, 5, 1), GATE(12, 0, 12, 1) };
RandomFieldGate gate2_type0_dn[2] = { GATE(15, 5, 14, 5), GATE(15, 12, 14, 12) };
RandomFieldGate gate2_type0_rt[2] = { GATE(5, 15, 5, 14), GATE(12, 15, 12, 14) };
RandomFieldGate gate2_type1_up[2] = { GATE(0, 2, 1, 2), GATE(0, 11, 1, 11) };
RandomFieldGate gate2_type1_lt[2] = { GATE(2, 0, 2, 1), GATE(11, 0, 11, 1) };
RandomFieldGate gate2_type1_dn[2] = { GATE(15, 2, 14, 2), GATE(15, 11, 14, 11) };
RandomFieldGate gate2_type1_rt[2] = { GATE(2, 15, 2, 14), GATE(11, 15, 11, 14) };
RandomFieldGate gate3_type0_up[3] = { GATE(0, 2, 1, 2), GATE(0, 8, 1, 8), GATE(0, 12, 1, 12) };
RandomFieldGate gate3_type0_lt[3] = { GATE(2, 0, 2, 1), GATE(8, 0, 8, 1), GATE(12, 0, 12, 1) };
RandomFieldGate gate3_type0_dn[3] = { GATE(15, 2, 14, 2), GATE(15, 8, 14, 8), GATE(15, 12, 14, 12) };
RandomFieldGate gate3_type0_rt[3] = { GATE(2, 15, 2, 14), GATE(8, 15, 8, 14), GATE(12, 15, 12, 14) };
RandomFieldGate* mRF_gate_correct_info[mRF_GATE_TYPE_NUM][RANDOM_FIELD_DIRECT_NUM] = {
{ NULL, NULL, NULL, NULL },
{ gate1_type0_up, gate1_type0_lt, gate1_type0_dn, gate1_type0_rt },
{ gate1_type1_up, gate1_type1_lt, gate1_type1_dn, gate1_type1_rt },
{ gate2_type0_up, gate2_type0_lt, gate2_type0_dn, gate2_type0_rt },
{ gate2_type1_up, gate2_type1_lt, gate2_type1_dn, gate2_type1_rt },
{ gate3_type0_up, gate3_type0_lt, gate3_type0_dn, gate3_type0_rt },
};
// Order of gate types for each block is north, west, south, east.
// Provided indices correspond to block type, not struct size
u8 mRF_gate_info2[mFM_BLOCK_TYPE_NUM][RANDOM_FIELD_DIRECT_NUM] = {
/* 0x00 */ {
mRF_GATE_NONE,
mRF_GATE_NONE,
mRF_GATE_NONE,
mRF_GATE_NONE
},
/* 0x01 */ {
mRF_GATE_NONE,
mRF_GATE_NONE,
mRF_GATE_NONE,
mRF_GATE_NONE
},
/* 0x02 */ {
mRF_GATE_NONE,
mRF_GATE_NONE,
mRF_GATE_NONE,
mRF_GATE_NONE
},
/* 0x03 */ {
mRF_GATE_NONE,
mRF_GATE_NONE,
mRF_GATE_NONE,
mRF_GATE_NONE
},
/* 0x04 */ {
mRF_GATE_NONE,
mRF_GATE_NONE,
mRF_GATE_NONE,
mRF_GATE_NONE
},
/* 0x05 */ {
mRF_GATE_NONE,
mRF_GATE_NONE,
mRF_GATE_NONE,
mRF_GATE_NONE
},
/* 0x06 */ {
mRF_GATE_NONE,
mRF_GATE_NONE,
mRF_GATE_NONE,
mRF_GATE_NONE
},
/* 0x07 */ {
mRF_GATE_NONE,
mRF_GATE_NONE,
mRF_GATE_NONE,
mRF_GATE_NONE
},
/* 0x08 */ {
mRF_GATE_NONE,
mRF_GATE_NONE,
mRF_GATE_NONE,
mRF_GATE_NONE
},
/* 0x09 */ {
mRF_GATE_NONE,
mRF_GATE_NONE,
mRF_GATE_NONE,
mRF_GATE_NONE
},
/* 0x0A */ {
mRF_GATE_NONE,
mRF_GATE_NONE,
mRF_GATE_NONE,
mRF_GATE_NONE
},
/* 0x0B */ {
mRF_GATE_NONE,
mRF_GATE1_TYPE1,
mRF_GATE1_TYPE0,
mRF_GATE1_TYPE1
},
/* 0x0C */ {
mRF_GATE_NONE,
mRF_GATE1_TYPE1,
mRF_GATE1_TYPE0,
mRF_GATE1_TYPE1
},
/* 0x0D */ {
mRF_GATE_NONE,
mRF_GATE1_TYPE1,
mRF_GATE2_TYPE1,
mRF_GATE1_TYPE1
},
/* 0x0E */ {
mRF_GATE1_TYPE0,
mRF_GATE1_TYPE0,
mRF_GATE1_TYPE0,
mRF_GATE1_TYPE0
},
/* 0x0F */ {
mRF_GATE1_TYPE0,
mRF_GATE2_TYPE0,
mRF_GATE1_TYPE0,
mRF_GATE2_TYPE0
},
/* 0x10 */ {
mRF_GATE2_TYPE0,
mRF_GATE2_TYPE0,
mRF_GATE1_TYPE0,
mRF_GATE1_TYPE0
},
/* 0x11 */ {
mRF_GATE2_TYPE0,
mRF_GATE1_TYPE0,
mRF_GATE2_TYPE0,
mRF_GATE1_TYPE0
},
/* 0x12 */ {
mRF_GATE1_TYPE0,
mRF_GATE1_TYPE0,
mRF_GATE2_TYPE0,
mRF_GATE2_TYPE0
},
/* 0x13 */ {
mRF_GATE1_TYPE0,
mRF_GATE2_TYPE0,
mRF_GATE2_TYPE0,
mRF_GATE1_TYPE0
},
/* 0x14 */ {
mRF_GATE2_TYPE0,
mRF_GATE1_TYPE0,
mRF_GATE2_TYPE0,
mRF_GATE1_TYPE0
},
/* 0x15 */ {
mRF_GATE2_TYPE0,
mRF_GATE1_TYPE0,
mRF_GATE1_TYPE0,
mRF_GATE2_TYPE0
},
/* 0x16 */ {
mRF_GATE2_TYPE1,
mRF_GATE2_TYPE0,
mRF_GATE2_TYPE1,
mRF_GATE2_TYPE0
},
/* 0x17 */ {
mRF_GATE3_TYPE0,
mRF_GATE2_TYPE0,
mRF_GATE2_TYPE1,
mRF_GATE1_TYPE0
},
/* 0x18 */ {
mRF_GATE3_TYPE0,
mRF_GATE1_TYPE0,
mRF_GATE3_TYPE0,
mRF_GATE1_TYPE0
},
/* 0x19 */ {
mRF_GATE2_TYPE1,
mRF_GATE1_TYPE0,
mRF_GATE3_TYPE0,
mRF_GATE2_TYPE0
},
/* 0x1A */ {
mRF_GATE2_TYPE1,
mRF_GATE2_TYPE0,
mRF_GATE3_TYPE0,
mRF_GATE1_TYPE0
},
/* 0x1B */ {
mRF_GATE3_TYPE0,
mRF_GATE1_TYPE0,
mRF_GATE3_TYPE0,
mRF_GATE1_TYPE0
},
/* 0x1C */ {
mRF_GATE3_TYPE0,
mRF_GATE1_TYPE0,
mRF_GATE2_TYPE1,
mRF_GATE2_TYPE0
},
/* 0x1D */ {
mRF_GATE1_TYPE0,
mRF_GATE3_TYPE0,
mRF_GATE1_TYPE0,
mRF_GATE3_TYPE0
},
/* 0x1E */ {
mRF_GATE2_TYPE0,
mRF_GATE3_TYPE0,
mRF_GATE1_TYPE0,
mRF_GATE2_TYPE1
},
/* 0x1F */ {
mRF_GATE2_TYPE0,
mRF_GATE2_TYPE1,
mRF_GATE2_TYPE0,
mRF_GATE2_TYPE1
},
/* 0x20 */ {
mRF_GATE1_TYPE0,
mRF_GATE2_TYPE1,
mRF_GATE2_TYPE0,
mRF_GATE3_TYPE0
},
/* 0x21 */ {
mRF_GATE1_TYPE0,
mRF_GATE3_TYPE0,
mRF_GATE2_TYPE0,
mRF_GATE2_TYPE1
},
/* 0x22 */ {
mRF_GATE1_TYPE0,
mRF_GATE3_TYPE0,
mRF_GATE1_TYPE0,
mRF_GATE3_TYPE0
},
/* 0x23 */ {
mRF_GATE1_TYPE0,
mRF_GATE2_TYPE1,
mRF_GATE2_TYPE0,
mRF_GATE3_TYPE0
},
/* 0x24 */ {
mRF_GATE1_TYPE0,
mRF_GATE3_TYPE0,
mRF_GATE2_TYPE0,
mRF_GATE2_TYPE1
},
/* 0x25 */ {
mRF_GATE2_TYPE0,
mRF_GATE2_TYPE1,
mRF_GATE2_TYPE0,
mRF_GATE2_TYPE1
},
/* 0x26 */ {
mRF_GATE2_TYPE0,
mRF_GATE2_TYPE1,
mRF_GATE1_TYPE0,
mRF_GATE3_TYPE0
},
/* 0x27 */ {
mRF_GATE1_TYPE0,
mRF_GATE1_TYPE0,
mRF_GATE1_TYPE0,
mRF_GATE1_TYPE0
},
/* 0x28 */ {
mRF_GATE2_TYPE1,
mRF_GATE1_TYPE0,
mRF_GATE2_TYPE1,
mRF_GATE1_TYPE0
},
/* 0x29 */ {
mRF_GATE1_TYPE0,
mRF_GATE2_TYPE1,
mRF_GATE1_TYPE0,
mRF_GATE2_TYPE1
},
/* 0x2A */ {
mRF_GATE1_TYPE0,
mRF_GATE2_TYPE1,
mRF_GATE1_TYPE0,
mRF_GATE2_TYPE1
},
/* 0x2B */ {
mRF_GATE2_TYPE1,
mRF_GATE1_TYPE0,
mRF_GATE1_TYPE0,
mRF_GATE2_TYPE1
},
/* 0x2C */ {
mRF_GATE1_TYPE0,
mRF_GATE2_TYPE1,
mRF_GATE2_TYPE1,
mRF_GATE1_TYPE0
},
/* 0x2D */ {
mRF_GATE2_TYPE1,
mRF_GATE2_TYPE1,
mRF_GATE1_TYPE0,
mRF_GATE1_TYPE0
},
/* 0x2E */ {
mRF_GATE1_TYPE0,
mRF_GATE1_TYPE0,
mRF_GATE2_TYPE1,
mRF_GATE2_TYPE1
},
/* 0x2F */ {
mRF_GATE2_TYPE1,
mRF_GATE1_TYPE0,
mRF_GATE2_TYPE1,
mRF_GATE1_TYPE0
},
/* 0x30 */ {
mRF_GATE1_TYPE0,
mRF_GATE2_TYPE1,
mRF_GATE1_TYPE0,
mRF_GATE2_TYPE1
},
/* 0x31 */ {
mRF_GATE1_TYPE0,
mRF_GATE2_TYPE1,
mRF_GATE1_TYPE0,
mRF_GATE2_TYPE1
},
/* 0x32 */ {
mRF_GATE2_TYPE1,
mRF_GATE1_TYPE0,
mRF_GATE1_TYPE0,
mRF_GATE2_TYPE1
},
/* 0x33 */ {
mRF_GATE1_TYPE0,
mRF_GATE2_TYPE1,
mRF_GATE2_TYPE1,
mRF_GATE1_TYPE0
},
/* 0x34 */ {
mRF_GATE2_TYPE1,
mRF_GATE2_TYPE1,
mRF_GATE1_TYPE0,
mRF_GATE1_TYPE0
},
/* 0x35 */ {
mRF_GATE1_TYPE0,
mRF_GATE1_TYPE0,
mRF_GATE2_TYPE1,
mRF_GATE2_TYPE1
},
/* 0x36 */ {
mRF_GATE1_TYPE0,
mRF_GATE2_TYPE0,
mRF_GATE1_TYPE0,
mRF_GATE2_TYPE0
},
/* 0x37 */ {
mRF_GATE2_TYPE0,
mRF_GATE2_TYPE0,
mRF_GATE1_TYPE0,
mRF_GATE1_TYPE0
},
/* 0x38 */ {
mRF_GATE2_TYPE0,
mRF_GATE1_TYPE0,
mRF_GATE2_TYPE0,
mRF_GATE1_TYPE0
},
/* 0x39 */ {
mRF_GATE1_TYPE0,
mRF_GATE1_TYPE0,
mRF_GATE2_TYPE0,
mRF_GATE2_TYPE0
},
/* 0x3A */ {
mRF_GATE1_TYPE0,
mRF_GATE2_TYPE0,
mRF_GATE2_TYPE0,
mRF_GATE1_TYPE0
},
/* 0x3B */ {
mRF_GATE2_TYPE0,
mRF_GATE1_TYPE0,
mRF_GATE2_TYPE0,
mRF_GATE1_TYPE0
},
/* 0x3C */ {
mRF_GATE2_TYPE0,
mRF_GATE1_TYPE0,
mRF_GATE1_TYPE0,
mRF_GATE2_TYPE0
},
/* 0x3D */ {
mRF_GATE_NONE,
mRF_GATE_NONE,
mRF_GATE_NONE,
mRF_GATE_NONE
},
/* 0x3E */ {
mRF_GATE_NONE,
mRF_GATE_NONE,
mRF_GATE_NONE,
mRF_GATE_NONE
},
/* 0x3F */ {
mRF_GATE1_TYPE0,
mRF_GATE1_TYPE0,
mRF_GATE_NONE,
mRF_GATE1_TYPE0
},
/* 0x40 */ {
mRF_GATE2_TYPE1,
mRF_GATE1_TYPE0,
mRF_GATE_NONE,
mRF_GATE1_TYPE0
},
/* 0x41 */ {
mRF_GATE1_TYPE0,
mRF_GATE1_TYPE1,
mRF_GATE1_TYPE0,
mRF_GATE1_TYPE1
},
/* 0x42 */ {
mRF_GATE1_TYPE0,
mRF_GATE1_TYPE0,
mRF_GATE1_TYPE0,
mRF_GATE1_TYPE0
},
/* 0x43 */ {
mRF_GATE1_TYPE0,
mRF_GATE1_TYPE1,
mRF_GATE1_TYPE0,
mRF_GATE1_TYPE1
},
/* 0x44 */ {
mRF_GATE1_TYPE0,
mRF_GATE1_TYPE0,
mRF_GATE1_TYPE0,
mRF_GATE1_TYPE0
},
/* 0x45 */ {
mRF_GATE2_TYPE1,
mRF_GATE1_TYPE0,
mRF_GATE2_TYPE1,
mRF_GATE1_TYPE0
},
/* 0x46 */ {
mRF_GATE1_TYPE0,
mRF_GATE2_TYPE1,
mRF_GATE1_TYPE0,
mRF_GATE2_TYPE1
},
/* 0x47 */ {
mRF_GATE1_TYPE0,
mRF_GATE2_TYPE1,
mRF_GATE1_TYPE0,
mRF_GATE2_TYPE1
},
/* 0x48 */ {
mRF_GATE2_TYPE1,
mRF_GATE1_TYPE0,
mRF_GATE1_TYPE0,
mRF_GATE2_TYPE1
},
/* 0x49 */ {
mRF_GATE1_TYPE0,
mRF_GATE2_TYPE1,
mRF_GATE2_TYPE1,
mRF_GATE1_TYPE0
},
/* 0x4A */ {
mRF_GATE2_TYPE1,
mRF_GATE2_TYPE1,
mRF_GATE1_TYPE0,
mRF_GATE1_TYPE0
},
/* 0x4B */ {
mRF_GATE1_TYPE0,
mRF_GATE1_TYPE0,
mRF_GATE2_TYPE1,
mRF_GATE2_TYPE1
},
/* 0x4C */ {
mRF_GATE_NONE,
mRF_GATE_NONE,
mRF_GATE_NONE,
mRF_GATE_NONE
},
/* 0x4D */ {
mRF_GATE_NONE,
mRF_GATE_NONE,
mRF_GATE_NONE,
mRF_GATE_NONE
},
/* 0x4E */ {
mRF_GATE_NONE,
mRF_GATE_NONE,
mRF_GATE_NONE,
mRF_GATE_NONE
},
/* 0x4F */ {
mRF_GATE_NONE,
mRF_GATE_NONE,
mRF_GATE_NONE,
mRF_GATE_NONE
},
/* 0x50 */ {
mRF_GATE_NONE,
mRF_GATE_NONE,
mRF_GATE_NONE,
mRF_GATE_NONE
},
/* 0x51 */ {
mRF_GATE_NONE,
mRF_GATE_NONE,
mRF_GATE_NONE,
mRF_GATE_NONE
},
/* 0x52 */ {
mRF_GATE2_TYPE1,
mRF_GATE1_TYPE0,
mRF_GATE_NONE,
mRF_GATE1_TYPE0
},
/* 0x53 */ {
mRF_GATE_NONE,
mRF_GATE_NONE,
mRF_GATE_NONE,
mRF_GATE_NONE
}
};
// clang-format on
#endif
extern void mRF_MakeRandomField_ovl(FieldMakeCombination* combi_table, FieldMakeComboInfo* combi_info, s32 combi_count,
Game* game);
typedef void (*MakeRandomFieldOvlFunc)(FieldMakeCombination* combi_table, FieldMakeComboInfo* combi_info,
s32 combi_count);
void mRF_MakeRandomField(FieldMakeCombination* combi_table, FieldMakeComboInfo* combi_info, s32 combi_count,
Game* game) {
MakeRandomFieldOvlFunc functionPtr;
size_t bufferSize = SEGMENT_VRAM_SIZE(m_random_field_ovl);
mRF_AllocatedBuf = mRF_Malloc(game, bufferSize);
stepNo = 0;
tryCnt = 0;
if (mRF_AllocatedBuf != NULL) {
ovlmgr_Load(SEGMENT_ROM_START(m_random_field_ovl), SEGMENT_ROM_END(m_random_field_ovl),
SEGMENT_VRAM_START(m_random_field_ovl), SEGMENT_VRAM_END(m_random_field_ovl), mRF_AllocatedBuf);
functionPtr = (MakeRandomFieldOvlFunc)SEGMENT_VRAM_RESOLVE_ADDR(m_random_field_ovl, mRF_AllocatedBuf,
mRF_MakeRandomField_ovl);
functionPtr(combi_table, combi_info, combi_count);
mRF_Free(game, mRF_AllocatedBuf);
}
}
u32 mRF_Type2BlockInfo(u8 blockType) {
if (blockType < mFM_BLOCK_TYPE_NUM) {
return mRF_block_info[blockType];
}
return mRF_BLOCKKIND_NONE;
}
/* @unused */
u8 mRF_Info2BlockType(u32 blockInfo) {
s32 blockType = 0;
for (blockType = 0; blockType < mFM_BLOCK_TYPE_NUM; blockType += 1) {
if (blockInfo == mRF_block_info[blockType]) {
return (u8)blockType;
}
}
return mFM_BLOCK_TYPE_NONE;
}
s32 mRF_GateType2GateCount(s32 gateType) {
if (gateType < mRF_GATE_TYPE_NUM) {
return gate_count_table[gateType];
}
return 0;
}
s32 mRF_SearchPond(s32* utX, s32* utZ, s32 blockX, s32 blockZ) {
FieldMakeBGSoundSource* soundSourceInfo = mFI_GetSoundSourcePBlockNum(blockX, blockZ);
if (soundSourceInfo != NULL) {
s32 i;
for (i = 0; i < mFI_NUM_SOUND_SOURCES; i++, soundSourceInfo++) {
if (soundSourceInfo->kind == mFI_SOUND_SOURCE_POND) {
if (mFI_Wpos2UtNum(utX, utZ, soundSourceInfo->pos)) {
return TRUE;
}
}
}
}
return FALSE;
}
s32 mRF_Attr2BeastRoadAttr(s32 attribute) {
switch (attribute) {
case mCoBG_ATTRIBUTE_GRASS0:
case mCoBG_ATTRIBUTE_GRASS1:
return mCoBG_ATTRIBUTE_GRASS2;
case mCoBG_ATTRIBUTE_SOIL0:
case mCoBG_ATTRIBUTE_SOIL1:
return mCoBG_ATTRIBUTE_SOIL2;
default:
return attribute;
}
}
s32 mRF_BlockTypeDirect2GateType(u8 block_type, s32 direct) {
return mRF_gate_info2[block_type][direct];
}
RandomFieldGate* mRF_BlockTypeDirect2GateData(s32* gateCount, u8 blockType, s32 direct) {
s32 type = mRF_BlockTypeDirect2GateType(blockType, direct);
s32 count = mRF_GateType2GateCount(type);
*gateCount = count;
return mRF_gate_correct_info[type][direct];
}
s32 mRF_BlockInf2CheckBeastRoad(u8 blockType, mCoBG_unkStructUnion* collisionData) {
// fairly specific variable declaration order required for match
s32 colUt;
s32 gateCount;
s32 i;
s32 j;
u32 attrib;
mCoBG_unkStructUnion* col;
RandomFieldGate* gateP;
s32 changedAttributeCount = 0;
xyz_t wpos = { 0.0f, 0.0f, 0.0f };
for (i = 0; i < RANDOM_FIELD_DIRECT_NUM; i++) {
gateP = mRF_BlockTypeDirect2GateData(&gateCount, blockType, i);
if (gateP != NULL) {
for (j = 0; j < gateCount; j++) {
/* process first unit */
{
colUt = gateP[j].ut0;
col = collisionData + (u8)colUt;
attrib = col->data.unitAttribute;
mFI_UtNum2CenterWpos(&wpos, colUt & 0xF, (colUt >> 4) & 0xF);
/* only bother updating the unit attribute if the unit can grow collideable plants in it */
if (mCoBG_Attribute2CheckPlant(attrib, &wpos) > 0) {
col->data.unitAttribute = mRF_Attr2BeastRoadAttr(attrib);
changedAttributeCount++;
}
}
/* process second unit */
{
colUt = gateP[j].ut1;
col = collisionData + (u8)colUt;
attrib = col->data.unitAttribute;
mFI_UtNum2CenterWpos(&wpos, colUt & 0xF, (colUt >> 4) & 0xF);
/* only bother updating the unit attribute if the unit can grow collideable plants in it */
if (mCoBG_Attribute2CheckPlant(attrib, &wpos) > 0) {
col->data.unitAttribute = mRF_Attr2BeastRoadAttr(attrib);
changedAttributeCount++;
}
}
}
}
}
// Note that although these return values are required to match,
// they don't appear to be used by calling code.
if (changedAttributeCount != 0) {
return 0;
}
return 1;
}
void mRF_CheckBeastRoad() {
if (SAVE_GET(sceneNo) == SCENE_FG) {
s32 blockXMax = mFI_GetBlockXMax() - 1;
s32 blockZMax = mFI_GetBlockZMax() - 1;
s32 blockX;
s32 blockZ;
for (blockZ = 1; blockZ < blockZMax; blockZ++) {
for (blockX = 1; blockX < blockXMax; blockX++) {
mCoBG_unkStructUnion* collisionData = mFI_GetBkNum2ColTop(blockX, blockZ);
u8 type = mFI_BkNum2BlockType(blockX, blockZ);
mRF_BlockInf2CheckBeastRoad(type, collisionData);
}
}
}
}
+6
View File
@@ -0,0 +1,6 @@
#include "data_combi.h"
#include "assets/jp/combi/data_combi_table.inc.c"
// TODO: // Determine whether define is needed at all; it is not included in this segment,
// but present in DnM+ as `data_combi_table_number`.
#define DATA_COMBI_TABLE_NUMBER = ARRAY_COUNT(data_combi_table);
+8
View File
@@ -0,0 +1,8 @@
#ifndef OBJECT_DATA_COMBI_H
#define OBJECT_DATA_COMBI_H
#include "m_field_make.h"
extern FieldMakeComboInfo data_combi_table[];
#endif
+52
View File
@@ -0,0 +1,52 @@
import math
import struct
from typing import Optional
from splat.util import options, log
from splat.segtypes.common.codesubsegment import CommonSegCodeSubsegment
class N64SegCombi(CommonSegCodeSubsegment):
def __init__(self, rom_start, rom_end, type, name, vram_start, args, yaml):
super().__init__(rom_start, rom_end, type, name, vram_start, args=args, yaml=yaml),
self.file_text: Optional[str] = None
self.data_only = isinstance(yaml, dict) and yaml.get("data_only", False)
def scan(self, rom_bytes: bytes):
data = rom_bytes[self.rom_start : self.rom_end]
symbol = self.create_symbol(addr=self.vram_start, in_segment=True, type="data", define=True)
entry_len = 6
count = len(data) // entry_len
lines = []
if (len(data)) % entry_len != 0:
log.error(f"Error: combi segment {self.name} length ({len(data)}) is not a multiple of {entry_len}!")
if not self.data_only:
lines.append(options.opts.generated_c_preamble)
lines.append("")
lines.append("// Combination types are used as indices into this table.")
lines.append("// Combination type can be derived from an acre ID by (acreID >> 2)")
lines.append("// (the two least significant bits of an acre ID store its height)")
lines.append(f"FieldMakeComboInfo {symbol.name}[{count}] = {{")
index_digits = math.ceil(math.log(count, 16))
for index, FieldMakeComboInfo in enumerate(struct.iter_unpack(">HHBB", data)):
bgId, fgId, blockType, pad = FieldMakeComboInfo
lines.append(f" /* 0x{index:0{index_digits}X} */ {{ 0x{bgId:04X}, 0x{fgId:04X}, 0x{blockType:02X} }},")
if not self.data_only:
lines.append(f"}}; // size = 0x{count * 6:X}")
# lines.append("")
# lines.append(f"s32 {symbol.name}_number = {count};")
lines.append("")
self.file_text = "\n".join(lines)
def split(self, rom_bytes: bytes):
path = options.opts.asset_path / self.dir / f"{self.name}.inc.c"
if self.file_text and path:
path.parent.mkdir(parents=True, exist_ok=True)
with open(path, "w", newline="\n") as f:
f.write(self.file_text)
+14 -3
View File
@@ -7034,12 +7034,23 @@
align: 0x1000
- [0x11E1A20]
- name: segment_011E2000
type: bin
- name: data_combi
dir: combi
type: code
start: 0x11E2000
# vram:
vram: 0x06000000
exclusive_ram_id: segment_06
compress: True
align: 0x1000
symbol_name_format: $VRAM_$ROM
subsegments:
- [auto, c, data_combi]
- start: 0x11E2000
type: .data
name: data_combi
subsegments:
- [0x11E2000, combi, data_combi_table]
- [0x11E2684]
- [0x11E2690]
- name: segment_011E3000
+4 -3
View File
@@ -71,7 +71,7 @@
- [0x6DA460, asm, code/6DA460]
- [0x6DB420, c, code/m_private]
- [0x6DE300, asm, code/6DE300]
- [0x6E08E0, asm, code/m_random_field]
- [0x6E0840, c, code/m_random_field]
- [0x6E0F50, c, code/m_rcp]
- [0x6E2300, c, code/m_room_type]
- [0x6E30B0, c, code/m_scene_ftr]
@@ -184,7 +184,8 @@
- [0x72F980, .data, code/m_player_call]
- [0x72F9B0, data, code/72F9B0]
- [0x7302C0, .data, code/m_private]
- [0x730320, data, code/730320]
- [0x730320, data, code/m_quest]
- [0x730360, .data, code/m_random_field]
- [0x7307D0, .data, code/m_rcp]
- [0x730B60, .data, code/m_room_type]
- [0x731740, data, code/731740]
@@ -257,7 +258,7 @@
- [0x73B0F0, rodata, code/73B0F0]
- [0x73B130, .rodata, code/m_private]
- [0x73B210, rodata, code/73B210]
- [0x73B250, rodata, code/73B250]
- [0x73B250, .rodata, code/m_random_field]
- [0x73B360, .rodata, code/m_room_type]
- [0x73B3E0, .rodata, code/m_scene_ftr]
- [0x73B400, rodata, code/m_shop]
+9 -9
View File
@@ -1070,7 +1070,7 @@
subsegments:
- [0x81A1A0, data, overlays/other_ovl/ovl__00815B70/ovl__00815B70_reloc]
- name: ovl__0081AA60
- name: m_random_field_ovl
type: code
start: 0x81AA60
vram: 0x80922800
@@ -1078,24 +1078,24 @@
compress: True
bss_size: 0x270
subsegments:
- [0x81AA60, asm, overlays/other_ovl/ovl__0081AA60/ovl__0081AA60]
- [0x81D2E0, data, overlays/other_ovl/ovl__0081AA60/ovl__0081AA60]
- [0x81D500, rodata, overlays/other_ovl/ovl__0081AA60/ovl__0081AA60]
- { start: 0x81D540, type: bss, vram: 0x809252E0, name: overlays/other_ovl/ovl__0081AA60/ovl__0081AA60 }
- name: ovl__0081AA60_reloc
- [0x81AA60, asm, overlays/other_ovl/m_random_field_ovl/m_random_field_ovl]
- [0x81D2E0, data, overlays/other_ovl/m_random_field_ovl/m_random_field_ovl]
- [0x81D500, rodata, overlays/other_ovl/m_random_field_ovl/m_random_field_ovl]
- { start: 0x81D540, type: bss, vram: 0x809252E0, name: overlays/other_ovl/m_random_field_ovl/m_random_field_ovl }
- name: m_random_field_ovl_reloc
type: code
start: 0x81D540
vram: 0x80925550
follows_vram: ovl__0081AA60
follows_vram: m_random_field_ovl
compress: True
subsegments:
- [0x81D540, data, overlays/other_ovl/ovl__0081AA60/ovl__0081AA60_reloc]
- [0x81D540, data, overlays/other_ovl/m_random_field_ovl/m_random_field_ovl_reloc]
- name: ovl__0081D9D0
type: code
start: 0x81D9D0
vram: 0x809259E0
follows_vram: ovl__0081AA60_reloc
follows_vram: m_random_field_ovl_reloc
compress: True
bss_size: 0x4E0
subsegments: