mirror of
https://github.com/ACreTeam/ac-decomp
synced 2026-05-27 15:42:46 -04:00
Merge branch 'master' into m_camera2
This commit is contained in:
+24
-4
@@ -25,11 +25,19 @@ m_actor_dlftbls.c:
|
||||
.text: [0x8037619C, 0x803761BC]
|
||||
.data: [0x8064D628, 0x8064F4E8]
|
||||
.bss: [0x8125A828, 0x8125A830]
|
||||
m_actor_shadow.c:
|
||||
.text: [0x803761BC, 0x80377114]
|
||||
.rodata: [0x80641328, 0x80641388]
|
||||
.data: [0x8064F4E8, 0x8064F548]
|
||||
m_banti.c:
|
||||
.text: [0x80377114, 0x80378858]
|
||||
.rodata: [0x80641388, 0x806413E0]
|
||||
.data: [0x8064F548, 0x8064F658]
|
||||
.bss: [0x8125A830, 0x8125AC80]
|
||||
m_bg_item.c:
|
||||
.text: [0x80378858, 0x803789F8]
|
||||
.rodata: [0x806413E0, 0x806413F0]
|
||||
.bss: [0x81263080, 0x81263088]
|
||||
m_calendar.c:
|
||||
.text: [0x8037D190, 0x8037DA54]
|
||||
m_camera2.c:
|
||||
@@ -38,6 +46,11 @@ m_camera2.c:
|
||||
.data: [0x8064F818, 0x8064F860]
|
||||
m_cockroach.c:
|
||||
.text: [0x80385430, 0x80385A80]
|
||||
m_collision_obj.c:
|
||||
.text: [0x80394518, 0x80395B24]
|
||||
.rodata: [0x80641CE8, 0x80641D20]
|
||||
.data: [0x80651208,0x806512D8]
|
||||
.bss: [0x812663D0, 0x81266400]
|
||||
m_common_data.c:
|
||||
.text: [0x80395B24, 0x80395BE8]
|
||||
m_controller.c:
|
||||
@@ -339,6 +352,13 @@ first_game.c:
|
||||
.text: [0x80629CA8, 0x80629D4C]
|
||||
sys_romcheck.c:
|
||||
.text: [0x80629D4C, 0x80629D8C]
|
||||
sys_dynamic.c:
|
||||
.bss: [0x813413F8, 0x81361820]
|
||||
m_play.c:
|
||||
.text: [0x80629D8C,0x8062B630]
|
||||
.rodata: [0x8064D1B8, 0x8064D1C0]
|
||||
.data: [0x806D46D0, 0x806D4958]
|
||||
.bss: [0x81361820, 0x8148DA60]
|
||||
second_game.c:
|
||||
.text: [0x8062B630, 0x8062B848]
|
||||
.bss: [0x8148DA60, 0x8148DA68]
|
||||
@@ -354,6 +374,10 @@ save_menu.c:
|
||||
.text: [0x8062CA5C, 0x8062D39C]
|
||||
.rodata: [0x8064D1F8, 0x8064D318]
|
||||
.data: [0x806D4B80, 0x806D4B98]
|
||||
famicom_emu.c:
|
||||
.text: [0x8062D39C, 0x8062D8FC]
|
||||
.data: [0x806D4B98, 0x806D4CB0]
|
||||
.bss: [0x8148DA68, 0x8148DA78]
|
||||
m_prenmi.c:
|
||||
.text: [0x8062D8FC, 0x8062DC04]
|
||||
.rodata: [0x8064D318, 0x8064D340]
|
||||
@@ -362,10 +386,6 @@ audio.c:
|
||||
.rodata: [0x8064D340, 0x8064D360]
|
||||
.data: [0x806D4CB0,0x806D4D40]
|
||||
.bss: [0x8148DA78,0x8148DA7C]
|
||||
sys_dynamic.c:
|
||||
.bss: [0x813413F8, 0x81361820]
|
||||
# ac_aprilfool_control/aPC_actor_dt.c: common_data is pure bs,
|
||||
# .text: [0x805153f0, 0x8051542C]
|
||||
|
||||
# dataobject.obj files
|
||||
data/titledemo/pact0.c:
|
||||
|
||||
@@ -3338,6 +3338,7 @@ global:
|
||||
0x801ef128: FREE_SEQP_QUEUE
|
||||
0x801ef580: commentImageBuffer
|
||||
0x801f4dc4: famicomCommon
|
||||
0x801f4dc0: save_game_image
|
||||
0x801f4e7c: famicomCommonSave
|
||||
0x801f683c: nesrom_filename_ptrs
|
||||
0x801f6840: nesrom_filename_strbuf
|
||||
|
||||
@@ -68,10 +68,19 @@ typedef struct famicom_common_s {
|
||||
/* 0xB4 */ int _b4;
|
||||
} FamicomCommon;
|
||||
|
||||
|
||||
extern void* my_malloc_current;
|
||||
extern u8 save_game_image;
|
||||
|
||||
typedef u8 (*FAMICOM_GETSAVECHAN_PROC)(int* player_no, int* slot_card_result);
|
||||
extern void famicom_setCallback_getSaveChan(FAMICOM_GETSAVECHAN_PROC getSaveChan_proc);
|
||||
extern int famicom_mount_archive();
|
||||
extern int famicom_mount_archive_end_check();
|
||||
extern int famicom_rom_load_check();
|
||||
extern int famicom_1frame();
|
||||
extern int famicom_init(int, void*, u8);
|
||||
extern int famicom_cleanup();
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -27,6 +27,11 @@ typedef struct prerender_s {
|
||||
u8 _24[0x24];
|
||||
} PreRender;
|
||||
|
||||
extern void PreRender_setup_savebuf(PreRender* render, int arg1, int arg2, int arg3, int arg4, int arg5);
|
||||
extern void PreRender_init(PreRender* render);
|
||||
extern void PreRender_setup_renderbuf(PreRender* render, int arg1, int arg2, void* arg3, void* arg4);
|
||||
extern void PreRender_cleanup(PreRender* render);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
+3
-3
@@ -73,7 +73,7 @@ extern void sAdo_BgmCrossfadeStart(u8 b);
|
||||
|
||||
extern void sAdo_SubGameStart();
|
||||
extern void sAdo_SubGameEnd();
|
||||
extern u8 sAdo_SubGameOK();
|
||||
extern int sAdo_SubGameOK();
|
||||
|
||||
extern void sAdo_Tenki(u8 mode);
|
||||
|
||||
@@ -91,8 +91,8 @@ extern void sAdo_OngenTrgStartSpeed(f32 speed, u16 s1, xyz_t* pos);
|
||||
extern void sAdo_TrgSeEcho(u8 b);
|
||||
extern void sAdo_LevSeEcho(u8 b);
|
||||
|
||||
extern void sAdo_BgmFadeoutCheck();
|
||||
extern void sAdo_SeFadeoutCheck();
|
||||
extern u8 sAdo_BgmFadeoutCheck();
|
||||
extern u8 sAdo_SeFadeoutCheck();
|
||||
|
||||
extern void sAdo_RoomType(u8 type);
|
||||
extern void sAdo_Museum(u8 type);
|
||||
|
||||
+12
-2
@@ -13,8 +13,18 @@ typedef struct game_famicom_emu_s {
|
||||
/* 0x00 */ GAME game;
|
||||
} GAME_FAMICOM_EMU;
|
||||
|
||||
extern void famicom_emu_init(GAME_FAMICOM_EMU* famicom_emu);
|
||||
extern void famicom_emu_cleanup(GAME_FAMICOM_EMU* famicom_emu);
|
||||
extern void* my_malloc_func[];
|
||||
|
||||
void my_alloc_cleanup();
|
||||
void my_zelda_getmemblocksize(void *);
|
||||
void my_zelda_gettotalfreesize();
|
||||
void* my_zelda_malloc_align(size_t, u32);
|
||||
void my_zelda_free(void *);
|
||||
void famicom_emu_main(GAME *);
|
||||
void famicom_emu_init(GAME_FAMICOM_EMU *);
|
||||
void famicom_emu_cleanup(GAME *);
|
||||
int famicom_gba_getImage(u32, int *);
|
||||
void famicom_gba_removeImage(void *);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -36,7 +36,7 @@ extern void Na_MDPlayerPos(u16,u16,u16,int, f32);
|
||||
extern void Na_BGMVolume(f32,u16);
|
||||
extern void Na_SubGameStart();
|
||||
extern void Na_SubGameEnd();
|
||||
extern int Na_SubGameOK();
|
||||
extern u8 Na_SubGameOK();
|
||||
extern void Na_Tenki(u8);
|
||||
extern void Na_KishaStatusTrg(u8);
|
||||
extern void Na_KishaStatusLevel(f32 speed, u32 ongenNum1, u16 angle1, f32 distance1, u32 ongenNum2, u16 angle2, f32 distance2);
|
||||
|
||||
@@ -2,12 +2,25 @@
|
||||
#define JSYSWRAP_H
|
||||
|
||||
#include "types.h"
|
||||
#include "dolphin/gx.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
extern void JW_JUTReport(int pos_x, int pos_y, int show_count, const char* fmt, ...);
|
||||
extern void JC_JFWDisplay_startFadeOut(void*, int);
|
||||
extern void* JC_JFWDisplay_getManager();
|
||||
extern void JC_JFWDisplay_clearEfb(void*, GXColor*);
|
||||
extern GXRenderModeObj* JC_JFWDisplay_getRenderMode(void*);
|
||||
extern void* JC_JFWDisplay_changeToSingleXfb(void*, int);
|
||||
|
||||
extern void JC_JFWDisplay_startFadeIn(void*, int);
|
||||
extern void JC_JFWDisplay_changeToDoubleXfb(void*);
|
||||
extern u32 JC__JKRGetResource(char*);
|
||||
extern int JC__JKRGetMemBlockSize(int, u32);
|
||||
|
||||
extern void JC__JKRRemoveResource(void*);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
#ifndef SPRINTF_H
|
||||
#define SPRINTF_H
|
||||
|
||||
s32 sprintf(char* dst, const char* fmt, ...);
|
||||
|
||||
#endif
|
||||
+16
-2
@@ -339,6 +339,22 @@ typedef struct actor_shape_info_s {
|
||||
/* 0x2F */ u8 unused_2F[0x48-0x2F];
|
||||
} Shape_Info;
|
||||
|
||||
typedef struct actor_shadow_s{
|
||||
/* 0x00 */ xyz_t position;
|
||||
/* 0x0C */ f32 groundY;
|
||||
/* 0x10 */ f32 unk10;
|
||||
/* 0x14 */ f32 unk14;
|
||||
/* 0x18 */ f32 unk18;
|
||||
/* 0x1C */ f32 unk1C;
|
||||
/* 0x20 */ s16 unk20;
|
||||
/* 0x22 */ s16 unk22;
|
||||
/* 0x24 */ s16 unk24;
|
||||
/* 0x26 */ s16 unk26;
|
||||
/* 0x28 */ char pad28[0xC];
|
||||
/* 0x34 */ int unk34;
|
||||
/* 0x38 */ int kind;
|
||||
}Shadow_Info;
|
||||
|
||||
/* sizeof(struct actor_s) == 0x174 */
|
||||
struct actor_s {
|
||||
/* 0x000 */ s16 id; /* unique actor type ID */
|
||||
@@ -446,8 +462,6 @@ extern Hilite* HiliteReflect_xlu_init(xyz_t* pos, xyz_t* eye, xyz_t* light_direc
|
||||
extern void Setpos_HiliteReflect_init(xyz_t* pos, GAME_PLAY* play);
|
||||
extern void Setpos_HiliteReflect_xlu_init(xyz_t* pos, GAME_PLAY* play);
|
||||
|
||||
extern void mAc_ActorShadowCircle(ACTOR* actor, LightsN* lightsN, GAME_PLAY* play);
|
||||
extern void mAc_ActorShadowEllipse(ACTOR* actor, LightsN* lightsN, GAME_PLAY* play);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
#ifndef M_ACTOR_SHADOW_H
|
||||
#define M_ACTOR_SHADOW_H
|
||||
|
||||
#include "types.h"
|
||||
#include "m_actor.h"
|
||||
|
||||
int mActorShadow_OperateScrollLimit(int, int, int);
|
||||
Gfx* mActorShadow_TileScroll2(u32 *, u32 *, int, int, int, int, int, int, u32 *, u32 *, int, int, int, int, int, int, GAME *);
|
||||
void mActorShadow_AdjustRate(f32 *);
|
||||
void mActorShadow_GetTimeAngleY_TimeAlpha(Shadow_Info *, GAME_PLAY *);
|
||||
void mActorShadow_GetGroundAverageAngle(Shadow_Info *);
|
||||
void mActorShadow_GetDistanceRate(Shadow_Info *, f32);
|
||||
f32 mActorShadow_GetAbsBigger(f32, f32);
|
||||
void mActorShadow_RadiusScaleRate(ACTOR *, Shadow_Info *);
|
||||
void mActorShadow_GetShadowTopPos_GetSlideS(Shadow_Info *);
|
||||
Gfx* mActorShadow_SetTexScroll(ACTOR *, Shadow_Info *, GAME *);
|
||||
void mActorShadow_GetLastAlphaScale(f32 *, u8 *, ACTOR *, Shadow_Info *);
|
||||
void mActorShadow_DrawActorShadow(ACTOR *, Shadow_Info *, GAME_PLAY *, int, xyz_t, f32);
|
||||
void mActorShadow_GetShadowPosition(ACTOR *, xyz_t *);
|
||||
int mActorShadow_GetShadowKind(void);
|
||||
f32 mAc_GetShadowGroundY_NoneForce(const Shadow_Info *);
|
||||
f32 mAc_GetShadowGroundY_Force(const Shadow_Info *);
|
||||
void mAc_DecideShadowRadius_IamNotFish(Shadow_Info *, ACTOR *, f32 *);
|
||||
void mAc_DecideShadowRadius_IamFish(Shadow_Info *, ACTOR *, f32 *);
|
||||
void mAc_ActorShadowDraw_ShadowDrawFlagOff(ACTOR *, GAME_PLAY *, int, xyz_t, f32);
|
||||
void mAc_ActorShadowDraw_ShadowDrawFlagOn(ACTOR *, GAME_PLAY *, int, xyz_t, f32);
|
||||
void mAc_ActorShadowDraw(ACTOR *, GAME_PLAY *, int, xyz_t, f32);
|
||||
void mActorShadow_SetForceShadowPos(ACTOR *, xyz_t *);
|
||||
void mActorShadow_UnSetForceShadowPos(ACTOR *);
|
||||
void mAc_NormalActorShadow(ACTOR *, GAME_PLAY *, f32);
|
||||
void mAc_UnagiActorShadow(ACTOR *, GAME_PLAY *, xyz_t);
|
||||
void mAc_ActorShadowCircle(ACTOR *, LightsN *, GAME_PLAY *);
|
||||
void mAc_ActorShadowEllipse(ACTOR *, LightsN *, GAME_PLAY *);
|
||||
|
||||
#endif
|
||||
@@ -2,14 +2,22 @@
|
||||
#define M_BG_ITEM_H
|
||||
|
||||
#include "types.h"
|
||||
#include "m_actor.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
extern ACTOR* mBI_search_bg_item(Actor_info* info);
|
||||
extern void mBI_make_bg_item(GAME_PLAY* play);
|
||||
extern void mBI_change_bg_item(GAME_PLAY* play);
|
||||
extern void mBI_ct();
|
||||
extern void mBI_move(GAME_PLAY* play);
|
||||
|
||||
typedef void (*BI_PROC)(GAME_PLAY*);
|
||||
|
||||
extern BI_PROC mBI_make_proc;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -327,7 +327,6 @@ typedef struct camera_s {
|
||||
xyz_t offset_center;
|
||||
} Camera2;
|
||||
|
||||
|
||||
extern s16 getCamera2AngleY(GAME_PLAY* play);
|
||||
extern int Camera2_change_priority(GAME_PLAY* play, int priority);
|
||||
extern xyz_t* Camera2_getEyePos_p();
|
||||
|
||||
@@ -16,6 +16,7 @@ extern void mCD_init_card();
|
||||
extern void mCD_PrintErrInfo(gfxprint_t* gfxprint);
|
||||
extern void mCD_InitAll();
|
||||
extern void mCD_LoadLand();
|
||||
extern void mCD_toNextLand();
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -106,6 +106,7 @@ extern u32 mCoBG_Wpos2BgAttribute_Original(xyz_t wpos);
|
||||
extern u32 mCoBG_Wpos2Attribute(xyz_t wpos, char* is_diggable);
|
||||
extern int mCoBG_CheckWaterAttribute(u32 attribute);
|
||||
extern f32 mCoBG_GetBgY_AngleS_FromWpos(s_xyz* angle_to_ground, xyz_t wpos, f32 offset_y);
|
||||
extern f32 mCoBG_GetShadowBgY_AngleS_FromWpos(f32, s_xyz*, xyz_t);
|
||||
extern int mCoBG_CheckWaterAttribute_OutOfSea(u32 attribute);
|
||||
extern int mCoBG_CheckHole_OrgAttr(u32 attribute);
|
||||
extern f32 mCoBG_GetBgY_OnlyCenter_FromWpos2(xyz_t wpos, f32 foot_dist);
|
||||
@@ -119,6 +120,12 @@ extern u32 mCoBG_UtNum2BgAttr(int ut_x, int ut_z);
|
||||
extern f32 mCoBG_UtNum2UtCenterY(int ut_x, int ut_z);
|
||||
extern int mCoBG_CheckCliffAttr(u32 attribute);
|
||||
|
||||
extern void mCoBG_InitMoveBgData();
|
||||
extern void mCoBG_InitBlockBgCheckMode();
|
||||
extern void mCoBG_InitDecalCircle();
|
||||
|
||||
extern void mCoBG_CalcTimerDecalCircle();
|
||||
|
||||
extern f32 mCoBG_GetWaterHeight_File(xyz_t wpos, char* file, int line);
|
||||
#define mCoBG_GetWaterHeight(wpos) mCoBG_GetWaterHeight_File(wpos, __FILE__, __LINE__)
|
||||
|
||||
|
||||
+127
-9
@@ -2,7 +2,7 @@
|
||||
#define M_COLLISION_OBJ_H
|
||||
|
||||
#include "types.h"
|
||||
#include "m_actor.h"
|
||||
#include "m_actor_type.h"
|
||||
#include "sys_math3d.h"
|
||||
#include "m_play_h.h"
|
||||
|
||||
@@ -18,6 +18,15 @@ enum collision_type {
|
||||
ClObj_TYPE_NUM
|
||||
};
|
||||
|
||||
enum weight{
|
||||
MASS_IMMOVABLE,
|
||||
MASS_HEAVY,
|
||||
MASS_NORMAL
|
||||
};
|
||||
|
||||
#define MASSTYPE_IMMOVABLE 0XFF
|
||||
#define MASSTYPE_HEAVY 0XFE
|
||||
|
||||
typedef struct collision_obj_s {
|
||||
ACTOR* owner_actor; // actor which owns this collision object
|
||||
ACTOR* collided_actor; // actor which the owner collided with or NULL
|
||||
@@ -64,6 +73,55 @@ typedef struct collision_obj_pipe_data_s {
|
||||
ClObjPipeAttrData_c attribute_data;
|
||||
} ClObjPipeData_c;
|
||||
|
||||
typedef struct collision_check_tris_element_attr_data_s{
|
||||
xyz_t vtx[3];
|
||||
}ClObjTrisElemAttrData_c;
|
||||
|
||||
typedef struct collision_check_tris_element_data_s{
|
||||
ClObjElemData_c element;
|
||||
ClObjTrisElemAttrData_c data;
|
||||
}ClObjTrisElemData_c;
|
||||
|
||||
typedef struct collision_check_tris_element_s{
|
||||
Math3D_triangle_c tri;
|
||||
xyz_t t;
|
||||
}ClObjTrisElemAttr_c;
|
||||
|
||||
typedef struct collision_tris_elem_s{
|
||||
ClObjElem_c element;
|
||||
ClObjTrisElemAttr_c attribute;
|
||||
}ClObjTrisElem_c;
|
||||
|
||||
typedef struct collision_tris_s {
|
||||
ClObj_c collision_obj;
|
||||
int count;
|
||||
ClObjTrisElem_c* elements;
|
||||
} ClObjTris_c;
|
||||
|
||||
typedef struct ClObjTris_Init {
|
||||
ClObjData_c data;
|
||||
int count;
|
||||
ClObjTrisElemData_c* elem_data;
|
||||
} ClObjTrisData_c;
|
||||
|
||||
typedef struct collision_obj_joint_sphere_elem_attribute_s{
|
||||
Math3D_sphere_c s1;
|
||||
Math3D_sphere_c s2;
|
||||
f32 unk8;
|
||||
u8 unk14;
|
||||
}ClObjJntSphElemAttr_c;
|
||||
|
||||
typedef struct collision_joint_sphere_elem_s{
|
||||
ClObjElem_c element;
|
||||
ClObjJntSphElemAttr_c attribute;
|
||||
}ClObjJntSphElem_c;
|
||||
|
||||
typedef struct collision_joint_sphere_s {
|
||||
ClObj_c collision_obj;
|
||||
int count;
|
||||
ClObjJntSphElem_c* elements;
|
||||
}ClObjJntSph_c;
|
||||
|
||||
#define Cl_COLLIDER_NUM 50
|
||||
typedef struct collision_check_s {
|
||||
u16 flags;
|
||||
@@ -95,14 +153,74 @@ typedef struct status_data_s {
|
||||
u8 weight;
|
||||
} StatusData_c;
|
||||
|
||||
extern void ClObjPipe_ct(GAME_PLAY* play, ClObjPipe_c* pipe);
|
||||
extern void ClObjPipe_dt(GAME_PLAY* play, ClObjPipe_c* pipe);
|
||||
extern void ClObjPipe_set5(GAME_PLAY* play, ClObjPipe_c* pipe, ACTOR* owner, ClObjPipeData_c* data);
|
||||
extern void CollisionCheck_Uty_ActorWorldPosSetPipeC(ACTOR* actor, ClObjPipe_c* col_pipe);
|
||||
extern int CollisionCheck_setOC(GAME_PLAY* play, CollisionCheck_c* collision_check, ClObj_c* col_obj);
|
||||
extern void CollisionCheck_Status_set3(Status_c* status, StatusData_c* data);
|
||||
extern void CollisionCheck_Status_ct(Status_c* status);
|
||||
extern void CollisionCheck_Status_Clear(Status_c* status);
|
||||
typedef struct mco_work_s {
|
||||
int count;
|
||||
ClObj_c* colliders[10];
|
||||
} McoWork;
|
||||
|
||||
extern McoWork mco_work;
|
||||
|
||||
|
||||
typedef void (*CollisionOCFunction)(GAME_PLAY*, CollisionCheck_c*, ClObj_c*,ClObj_c*);
|
||||
typedef int (*CollisionOCClear)(GAME_PLAY*, ClObj_c*);
|
||||
typedef int (*CollisionClearFunction)(GAME_PLAY*, ClObj_c*);
|
||||
|
||||
extern void CollisionCheck_workTrisElemCenter(ClObjTrisElem_c *, xyz_t *);
|
||||
extern int ClObj_ct(GAME_PLAY *, ClObj_c *);
|
||||
extern int ClObj_dt(GAME_PLAY *, ClObj_c *);
|
||||
extern int ClObj_set4(GAME_PLAY *, ClObj_c *, ACTOR *, ClObjData_c *);
|
||||
extern void ClObj_OCClear(GAME_PLAY *, ClObj_c *);
|
||||
extern int ClObjElem_ct(ClObjElem_c *);
|
||||
extern int ClObjElem_set(ClObjElem_c *, ClObjElemData_c *);
|
||||
extern void ClObjElem_OCClear(GAME_PLAY *, ClObjElem_c *);
|
||||
extern int ClObjJntSphElem_OCClear(GAME_PLAY *, ClObjJntSphElem_c *);
|
||||
extern int ClObjJntSph_OCClear(GAME_PLAY *, ClObj_c *);
|
||||
extern int ClObjPipeAttr_ct(GAME_PLAY *, ClObjPipeAttr_c *);
|
||||
extern int ClObjPipeAttr_dt(GAME_PLAY *, ClObjPipeAttr_c *);
|
||||
extern int ClObjPipeAttr_set(GAME_PLAY *, ClObjPipeAttr_c *, ClObjPipeAttr_c *);
|
||||
extern int ClObjPipe_ct(GAME_PLAY *, ClObjPipe_c *);
|
||||
extern int ClObjPipe_dt(GAME_PLAY *, ClObjPipe_c *);
|
||||
extern int ClObjPipe_set5(GAME_PLAY *, ClObjPipe_c *, ACTOR *, ClObjPipeData_c *);
|
||||
extern int ClObjPipe_OCClear(GAME_PLAY *, ClObj_c *);
|
||||
extern int ClObjTrisElemAttr_ct(GAME_PLAY *, ClObjTrisElemAttr_c *);
|
||||
extern int ClObjTrisElemAttr_dt(GAME_PLAY *, ClObjTrisElemAttr_c *);
|
||||
extern int ClObjTrisElemAttr_set(GAME_PLAY *, ClObjTrisElemAttr_c *, ClObjTrisElemAttrData_c *);
|
||||
extern int ClObjTrisElem_ct(GAME_PLAY *, ClObjTrisElem_c *);
|
||||
extern int ClObjTrisElem_dt(GAME_PLAY *, ClObjTrisElem_c *);
|
||||
extern int ClObjTrisElem_set(GAME_PLAY *, ClObjTrisElem_c *, ClObjTrisElemData_c *);
|
||||
extern int ClObjTrisElem_OCClear(GAME_PLAY *, ClObjTrisElem_c *);
|
||||
extern int ClObjTris_ct(GAME_PLAY *, ClObjTris_c *);
|
||||
extern int ClObjTris_dt_nzf(GAME_PLAY *, ClObjTris_c *);
|
||||
extern int ClObjTris_set5_nzm(GAME_PLAY *, ClObjTris_c *, ACTOR *, ClObjTrisData_c *, ClObjTrisElem_c *);
|
||||
extern int ClObjTris_OCClear(GAME_PLAY *, ClObj_c *);
|
||||
extern void CollisionCheck_ct(GAME_PLAY *, CollisionCheck_c *);
|
||||
extern void CollisionCheck_dt(GAME_PLAY *, CollisionCheck_c *);
|
||||
extern void CollisionCheck_clear(GAME_PLAY *, CollisionCheck_c *);
|
||||
extern int CollisionCheck_setOC(GAME_PLAY *, CollisionCheck_c *, ClObj_c *);
|
||||
extern int get_type(u8);
|
||||
extern void CollisionCheck_setOC_HitInfo(ClObj_c *, ClObjElem_c *, xyz_t *, ClObj_c *, ClObjElem_c *, xyz_t *, f32);
|
||||
extern void CollisionCheck_OC_JntSph_Vs_JntSph(GAME_PLAY *, CollisionCheck_c *, ClObj_c *, ClObj_c *);
|
||||
extern void CollisionCheck_OC_JntSph_Vs_Pipe(GAME_PLAY *, CollisionCheck_c *, ClObj_c *, ClObj_c *);
|
||||
extern void CollisionCheck_OC_Pipe_Vs_JntSph(GAME_PLAY *, CollisionCheck_c *, ClObj_c *, ClObj_c *);
|
||||
extern void CollisionCheck_OC_Pipe_Vs_Pipe(GAME_PLAY *, CollisionCheck_c *, ClObj_c *, ClObj_c *);
|
||||
extern int CollisionCheck_Check1ClObjNoOC(ClObj_c *);
|
||||
extern int CollisionCheck_Check2ClObjNoOC(ClObj_c *, ClObj_c *);
|
||||
extern void CollisionCheck_OC(GAME_PLAY *, CollisionCheck_c *);
|
||||
extern void CollisionCheck_setOCC_HitInfo(GAME_PLAY *, ClObj_c *, ClObjTrisElem_c *, xyz_t *, ClObj_c *, ClObjElem_c *, xyz_t *, xyz_t *);
|
||||
extern void CollisionCheck_OCC_Tris_Vs_JntSph(GAME_PLAY *, CollisionCheck_c *, ClObjTris_c *, ClObjJntSph_c *);
|
||||
extern void CollisionCheck_OCC_Tris_Vs_Pipe(GAME_PLAY *, CollisionCheck_c *, ClObjTris_c *, ClObjPipe_c *);
|
||||
extern int CollisionCheck_Check1ClObjNoOCC(ClObj_c *);
|
||||
extern void CollisionCheck_OCC(GAME_PLAY *, CollisionCheck_c *);
|
||||
extern int ClObjTrisElem_OCCClear(GAME_PLAY *, ClObjTrisElem_c *);
|
||||
extern int ClObj_OCCClear(GAME_PLAY *, ClObj_c *);
|
||||
extern int ClObjTris_OCCClear(GAME_PLAY *, ClObj_c *);
|
||||
extern int CollisionCheck_setOCC(GAME_PLAY *, CollisionCheck_c *, ClObj_c *);
|
||||
extern void CollisionCheck_Status_ct(Status_c *);
|
||||
extern void CollisionCheck_Status_Clear(Status_c *);
|
||||
extern void CollisionCheck_Status_set3(Status_c *, StatusData_c *);
|
||||
extern int CollisionCheck_Uty_ActorWorldPosSetPipeC(ACTOR *, ClObjPipe_c *);
|
||||
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -200,7 +200,12 @@ typedef struct common_data_s {
|
||||
/* 0x028592 */ s16 demo_profiles[mDemo_CLIP_TYPE_NUM - 1];
|
||||
/* 0x028596 */ u8 _28596[0x285C0 - 0x28596];
|
||||
/* 0x0285C0 */ s8 player_decoy_flag;
|
||||
/* 0x0285C1 */ u8 _285C1[0x028838 - 0x0285C1];
|
||||
/* 0x0285C1 */ u8 _285C1[0x0285C6 - 0x0285C1];
|
||||
/* 0x0285C6 */ u8 event_id;
|
||||
/* 0x0285C7 */ u8 _285C3[0x0287F8 - 0x0285C7];
|
||||
/* 0x0287F8 */ s8 current_famicom_rom;
|
||||
/* 0x0287F9 */ s8 famicom_287F9;
|
||||
/* 0x0287FA */ u8 _287FA[0x28838 - 0x0287FA];
|
||||
/* 0x028838 */ s8 player_bee_swell_flag;
|
||||
/* 0x028839 */ s8 player_bee_chase_flag;
|
||||
/* 0x02883A */ u8 goki_shocked_flag;
|
||||
@@ -247,7 +252,8 @@ typedef struct common_data_s {
|
||||
/* 0x02DB40 */ u8 auto_nwrite_set; /* when true, saved nwrite time will be utilized. Seems to be used to keep same date for fishing tourney stuff. */
|
||||
/* 0x02DB42 */ u16 select_last_select_no;
|
||||
/* 0x02DB44 */ u16 select_last_top_no;
|
||||
/* 0x02DB46 */ u8 tmp3[0x2DBB0 - 0x2DB46];
|
||||
/* 0x02DB46 */ u8 tmp3[0x2DBAC - 0x2DB46];
|
||||
/* 0X02DBAC */ int famicom_2DBAC;
|
||||
/* 0x02DBB0 */ s16 can_look_goki_count;
|
||||
/* 0x02DBB4 */ f32 rainbow_opacity; /* current opacity of rainbow (0.0f - 1.0f) */
|
||||
/* 0x02DBB8 */ u32 event_flags[7]; /* TODO: make array size a definition/enum */
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
#ifndef M_DEBUG_DISPLAY_H
|
||||
#define M_DEBUG_DISPLAY_H
|
||||
|
||||
#include "types.h"
|
||||
#include "m_play.h"
|
||||
|
||||
|
||||
extern void Debug_Display_output(GAME_PLAY*);
|
||||
extern void Debug_Display_init();
|
||||
|
||||
#endif
|
||||
@@ -60,6 +60,8 @@ enum demo_clip_type {
|
||||
mDemo_CLIP_TYPE_NUM
|
||||
};
|
||||
|
||||
extern void mDemo_Init(GAME_PLAY*);
|
||||
extern void mDemo_Main(GAME_PLAY*);
|
||||
extern int mDemo_Request(int type, ACTOR* actor, mDemo_REQUEST_PROC request_proc);
|
||||
extern void mDemo_Set_msg_num(int msg_num);
|
||||
extern int mDemo_Check(int type, ACTOR* actor);
|
||||
@@ -75,6 +77,7 @@ extern void mDemo_Set_talk_display_name(u8 value);
|
||||
extern void mDemo_Set_camera(u8 value);
|
||||
extern void mDemo_Set_talk_window_color(rgba_t* color);
|
||||
extern int mDemo_CheckDemo();
|
||||
extern void mDemo_stock_clear();
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
+5
-1
@@ -242,7 +242,7 @@ extern s8* mEv_get_common_area(int type, s8 id);
|
||||
extern s8* mEv_get_save_area(int type, s8 id);
|
||||
extern int mEv_ArbeitPlayer(u32 player_no);
|
||||
extern u16 mEv_get_special_event_type();
|
||||
mEv_ClearEventSaveInfo(mEv_event_save_c* event_save_data);
|
||||
extern int mEv_ClearEventSaveInfo(mEv_event_save_c* event_save_data);
|
||||
|
||||
extern int mEv_weekday2day(lbRTC_month_t month, int week_type, lbRTC_weekday_t weekday);
|
||||
extern void mEv_ClearEventInfo();
|
||||
@@ -250,12 +250,16 @@ extern void mEv_ClearEventInfo();
|
||||
extern void mEv_init(Event_c* event);
|
||||
extern void mEv_2nd_init(Event_c* event);
|
||||
|
||||
extern void mEv_run(Event_c* event);
|
||||
extern void mEv_finish(Event_c* event);
|
||||
|
||||
extern int mEv_CheckTitleDemo();
|
||||
extern void mEv_SetTitleDemo(int titledemo_no);
|
||||
|
||||
extern void mEv_debug_print4f(gfxprint_t* gfxprint);
|
||||
extern void mEv_sp_debug_print4f(gfxprint_t* gfxprint);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
+8
-8
@@ -17,16 +17,16 @@ typedef struct {
|
||||
/* 0x98 */ Mtx modelView2;
|
||||
/* 0xD8 */ Gfx* gfx; // "gfxtbl"
|
||||
/* 0xDC */ u16* zBuffer;
|
||||
} fbdemo; // size = 0xE0
|
||||
} fbdemo_c; // size = 0xE0
|
||||
|
||||
|
||||
extern void fbdemo_init_gfx(fbdemo*);
|
||||
extern void fbdemo_init_data(fbdemo*);
|
||||
extern void fbdemo_cleanup(fbdemo*);
|
||||
extern fbdemo* fbdemo_init(fbdemo*, int, int);
|
||||
extern void fbdemo_update(fbdemo*);
|
||||
extern void fbdemo_draw(fbdemo*, Gfx**);
|
||||
extern void fbdemo_move(fbdemo*);
|
||||
extern void fbdemo_init_gfx(fbdemo_c*);
|
||||
extern void fbdemo_init_data(fbdemo_c*);
|
||||
extern void fbdemo_cleanup(fbdemo_c*);
|
||||
extern fbdemo_c* fbdemo_init(fbdemo_c*, int, int);
|
||||
extern void fbdemo_update(fbdemo_c*);
|
||||
extern void fbdemo_draw(fbdemo_c*, Gfx**);
|
||||
extern void fbdemo_move(fbdemo_c*);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -18,6 +18,7 @@ typedef struct {
|
||||
|
||||
extern fbdemo_fade* fbdemo_fade_init(fbdemo_fade*);
|
||||
extern void fbdemo_fade_move(fbdemo_fade*, int);
|
||||
extern void fbdemo_fade_draw(fbdemo_fade* this, Gfx** gfxP);
|
||||
extern void fbdemo_fade_startup(fbdemo_fade*);
|
||||
extern void fbdemo_fade_settype(fbdemo_fade*, int);
|
||||
extern void fbdemo_fade_setcolor_rgba8888(fbdemo_fade* this, u32 color);
|
||||
|
||||
@@ -26,5 +26,4 @@ extern s8 fbdemo_triforce_is_finish(fbdemo_triforce*);
|
||||
extern void fbdemo_triforce_settype(fbdemo_triforce*, int);
|
||||
extern void fbdemo_triforce_setcolor_rgba8888(void);
|
||||
|
||||
|
||||
#endif
|
||||
@@ -5,6 +5,7 @@
|
||||
#include "m_actor_type.h"
|
||||
#include "libforest/gbi_extensions.h"
|
||||
#include "game_h.h"
|
||||
#include "m_play.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
@@ -91,6 +92,8 @@ typedef struct field_info_s {
|
||||
extern u8* g_block_type_p;
|
||||
extern int* g_block_kind_p;
|
||||
|
||||
extern void mFM_FieldInit(GAME_PLAY*);
|
||||
extern void mFM_Field_dt();
|
||||
extern void mFM_DecideBgTexIdx(u8* bg_tex_idx);
|
||||
extern void mFM_InitFgCombiSaveData(GAME* game);
|
||||
extern mActor_name_t mFM_GetReserveName(int block_x, int block_z);
|
||||
|
||||
+1
-1
@@ -20,7 +20,7 @@ enum {
|
||||
|
||||
extern int fuusen_DEBUG_mode_flag;
|
||||
|
||||
extern void Balloon_init();
|
||||
extern void Balloon_init(GAME_PLAY*);
|
||||
extern void Balloon_make_fuusen(GAME_PLAY* play);
|
||||
extern void Balloon_chk_make_fuusen(GAME_PLAY* play);
|
||||
extern void Balloon_move(GAME_PLAY* play);
|
||||
|
||||
+9
-2
@@ -3,6 +3,7 @@
|
||||
|
||||
#include "types.h"
|
||||
#include "m_lights.h"
|
||||
#include "game.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
@@ -38,12 +39,18 @@ typedef struct kankyo_s {
|
||||
/* 0x00 */ Lights sun_light;
|
||||
/* 0x0E */ u8 pad[0x9A - 0x0E];
|
||||
/* 0x9A */ u8 ambientColor[3];
|
||||
/* 0x9E */ u8 pad2[0xC8 - 0x9E];
|
||||
/* 0x9E */ u8 pad2[0xC0 - 0x9E];
|
||||
/* 0xC0 */ f32 unkC0;
|
||||
/* 0xC4 */ u8 unkC4;
|
||||
/* 0xC8 */ Nature nature;
|
||||
} Kankyo;
|
||||
|
||||
extern void Global_kankyo_ct(GAME_PLAY*, Kankyo*);
|
||||
extern int mEnv_NowWeather();
|
||||
|
||||
extern int mEnv_WindMove();
|
||||
extern void mEnv_ManagePointLight(GAME_PLAY*, Kankyo*, Global_light*);
|
||||
extern void Global_kankyo_set(GAME_PLAY*, Kankyo*, Global_light*);
|
||||
extern void mEnv_GetShadowPrimColor_Light(u8*,u8*,u8*,GAME*);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -218,6 +218,10 @@ struct message_window_s {
|
||||
extern int mMsg_Get_Length_String(u8* buf, size_t buf_size);
|
||||
extern mMsg_Window_c* mMsg_Get_base_window_p();
|
||||
extern void mMsg_Set_free_str(mMsg_Window_c* msg, int free_str_no, u8* str, int str_size);
|
||||
extern void mMsg_ct(GAME_PLAY*);
|
||||
extern void mMsg_dt(GAME_PLAY*);
|
||||
extern void mMsg_Main(GAME_PLAY*);
|
||||
extern void mMsg_Draw(GAME_PLAY*);
|
||||
extern void mMsg_debug_draw(gfxprint_t* gfxprint);
|
||||
extern void mMsg_aram_init();
|
||||
extern void mMsg_aram_init2();
|
||||
|
||||
@@ -17,6 +17,8 @@ typedef struct notice_board_post_s {
|
||||
/* 0xC0 */ lbRTC_time_c post_time; /* date-time of post */
|
||||
} mNtc_board_post_c;
|
||||
|
||||
extern void mNtc_set_auto_nwrite_data();
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
+48
-8
@@ -16,12 +16,14 @@
|
||||
#include "m_collision_obj.h"
|
||||
#include "m_play_h.h"
|
||||
#include "m_scene.h"
|
||||
#include "PreRender.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef int (*DRAW_CHK_PROC)(ACTOR*, GAME_PLAY*);
|
||||
typedef void (*PLAY_WIPE_PROC)(GAME_PLAY*);
|
||||
|
||||
/* sizeof(struct game_play_s) == 0x2600 */
|
||||
struct game_play_s {
|
||||
@@ -30,7 +32,8 @@ struct game_play_s {
|
||||
/* 0x00E0 */ s16 scene_id;
|
||||
/* 0x00E4 */ mFI_block_tbl_c block_table;
|
||||
/* 0x00F4 */ mFI_block_tbl_c last_block_table;
|
||||
/* 0x0104 */ u8 _0104[0x0110 - 0x0104];
|
||||
/* 0x0104 */ u8 _0104[0x010C - 0x0104];
|
||||
/* 0x010C */ Scene_status_c* current_scene_data;
|
||||
/* 0x0110 */ Object_Exchange_c object_exchange;
|
||||
/* 0x1A68 */ View view;
|
||||
/* 0x1B88 */ Camera2 camera;
|
||||
@@ -39,12 +42,16 @@ struct game_play_s {
|
||||
/* 0x1DA0 */ pause_t pause;
|
||||
/* 0x1DA8 */ Actor_info actor_info;
|
||||
/* 0x1DEC */ Submenu submenu;
|
||||
/* 0x1FA4 */ u8 _1FA4[0x2008 - 0x1FA4];
|
||||
/* 0x1FA4 */ s8 unk1FA4;
|
||||
/* 0x1FA8 */ u8 _1FA4[0x1FB8 - 0x1FA8];
|
||||
/* 0x1FB8 */ PreRender prerender;
|
||||
/* 0x2000 */ Door_data_c* door_data;
|
||||
/* 0x2004 */ int _2004;
|
||||
/* 0x2008 */ int next_scene_no;
|
||||
/* 0x200C */ MtxF projection_matrix;
|
||||
/* 0x204C */ MtxF mtx_204C;
|
||||
/* 0x208C */ int _208C;
|
||||
/* 0x2090 */ u32 game_frame;
|
||||
/* 0x204C */ MtxF billboard_matrix;
|
||||
/* 0x208C */ Mtx* _208C;
|
||||
/* 0x2090 */ u32 game_frame;
|
||||
/* 0x2094 */ u8 _2094;
|
||||
/* 0x2095 */ u8 actor_data_num;
|
||||
/* 0x2096 */ u8 ctrl_actor_data_num;
|
||||
@@ -63,12 +70,45 @@ struct game_play_s {
|
||||
/* 0x2318 */ fbdemo_fade color_fade;
|
||||
/* 0x2328 */ CollisionCheck_c collision_check;
|
||||
/* 0x23F8 */ DRAW_CHK_PROC draw_chk_proc; // only used by mikanbox actor
|
||||
/* 0x23FC */ u8 _23FC[0x2600 - 0x23FC];
|
||||
/* 0x23FC */ u32 fade_color_value;
|
||||
/* 0x2400 */ Scene_status_c* scene_data_2400;
|
||||
/* 0x2404 */ u8 _2400[0x2600 - 0x2404];
|
||||
};
|
||||
|
||||
extern fbdemo_c fbdemo;
|
||||
|
||||
extern void play_init(GAME_PLAY* play);
|
||||
extern void play_cleanup(GAME_PLAY* play);
|
||||
extern void Game_play_Reset_destiny();
|
||||
extern void event_title_flag_on();
|
||||
extern void event_title_flag_off();
|
||||
extern void Game_play_camera_proc(GAME_PLAY *);
|
||||
extern void Game_play_fbdemo_wipe_destroy(GAME_PLAY *);
|
||||
extern void Game_play_fbdemo_wipe_create_sub(GAME_PLAY *);
|
||||
extern void Game_play_fbdemo_wipe_create(GAME_PLAY *);
|
||||
extern void Game_play_fbdemo_wipe_init(GAME_PLAY *);
|
||||
extern void Game_play_fbdemo_fade_in_move_end(GAME_PLAY *);
|
||||
extern void Game_play_fbdemo_fade_out_start_emu_move_end(GAME_PLAY *);
|
||||
extern void Game_play_fbdemo_fade_out_game_end_move_end(GAME_PLAY *);
|
||||
extern void Game_play_change_scene_move_end(GAME_PLAY *);
|
||||
extern void Game_play_fbdemo_wipe_move(GAME_PLAY *);
|
||||
extern void Game_play_fbdemo_wipe_proc(GAME_PLAY *);
|
||||
extern Gfx* game_play_set_fog(GAME_PLAY *, Gfx *);
|
||||
extern void Game_play_fbdemo_proc(GAME_PLAY *);
|
||||
extern void play_cleanup(GAME *);
|
||||
extern void VR_Box_ct(GAME_PLAY *);
|
||||
extern void play_init(GAME *);
|
||||
extern void Game_play_move_fbdemo_not_move(GAME_PLAY *);
|
||||
extern void Game_play_move(GAME_PLAY *);
|
||||
extern void setupFog(GAME_PLAY *, GRAPH *);
|
||||
extern void setupViewer(GAME_PLAY *);
|
||||
extern void setupViewMatrix(GAME_PLAY *, GRAPH *, GRAPH *);
|
||||
extern void copy_efb_to_texture(Gfx **, void *);
|
||||
extern int makeBumpTexture(GAME_PLAY *, GRAPH *, GRAPH *);
|
||||
extern void draw_version(GRAPH *);
|
||||
extern void Game_play_draw(GAME *);
|
||||
extern void play_main(GAME *);
|
||||
extern void Gameplay_Scene_Init(GAME_PLAY *);
|
||||
extern u8 mPl_SceneNo2SoundRoomType(int);
|
||||
extern void Gameplay_Scene_Read(GAME_PLAY *, s16);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -9,9 +9,11 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
extern void mPlib_Object_Exchange_keep_Player_dt(GAME_PLAY*);
|
||||
extern PLAYER_ACTOR* get_player_actor_withoutCheck(GAME_PLAY* play);
|
||||
extern void mPlib_SetData1_controller_data_for_title_demo(f32 stick_x, f32 stick_y, int btn_a, int btn_b);
|
||||
extern void mPlib_SetData2_controller_data_for_title_demo(mActor_name_t tool);
|
||||
extern void mPlib_Clear_controller_data_for_title_demo();
|
||||
extern void mPlib_request_main_invade_type1(GAME_PLAY* play);
|
||||
extern mActor_name_t mPlib_Get_itemNo_forWindow();
|
||||
extern int mPlib_check_able_change_camera_normal_index();
|
||||
|
||||
+66
-1
@@ -2,8 +2,8 @@
|
||||
#define M_SCENE_H
|
||||
|
||||
#include "types.h"
|
||||
#include "m_scene_table.h"
|
||||
#include "m_lib.h"
|
||||
#include "famicom_emu.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
@@ -39,8 +39,73 @@ typedef struct object_exchange_s {
|
||||
u8 _1934[0x1958-0x1934];
|
||||
} Object_Exchange_c;
|
||||
|
||||
typedef struct scene_status_s{
|
||||
u8 unk0[0x13];
|
||||
u8 unk13;
|
||||
}Scene_status_c;
|
||||
|
||||
extern Scene_status_c test01_info;
|
||||
extern Scene_status_c test02_info;
|
||||
extern Scene_status_c test03_info;
|
||||
extern Scene_status_c water_test_info;
|
||||
extern Scene_status_c test_step01_info;
|
||||
extern Scene_status_c test04_info;
|
||||
extern Scene_status_c npc_room01_info;
|
||||
extern Scene_status_c test_fd_npc_land_info;
|
||||
extern Scene_status_c field_tool_field_info;
|
||||
extern Scene_status_c shop01_info;
|
||||
extern Scene_status_c BG_TEST01_info;
|
||||
extern Scene_status_c BG_TEST01_XLU_info;
|
||||
extern Scene_status_c broker_shop_info;
|
||||
extern Scene_status_c fg_tool_in_info;
|
||||
extern Scene_status_c post_office_info;
|
||||
extern Scene_status_c start_demo1_info;
|
||||
extern Scene_status_c start_demo2_info;
|
||||
extern Scene_status_c police_box_info;
|
||||
extern Scene_status_c buggy_info;
|
||||
extern Scene_status_c player_select_info;
|
||||
extern Scene_status_c player_room_s_info;
|
||||
extern Scene_status_c player_room_m_info;
|
||||
extern Scene_status_c player_room_l_info;
|
||||
extern Scene_status_c shop02_info;
|
||||
extern Scene_status_c shop03_info;
|
||||
extern Scene_status_c shop04_1f_info;
|
||||
extern Scene_status_c test05_info;
|
||||
extern Scene_status_c PLAYER_SELECT2_info;
|
||||
extern Scene_status_c PLAYER_SELECT3_info;
|
||||
extern Scene_status_c shop04_2f_info;
|
||||
extern Scene_status_c event_notification_info;
|
||||
extern Scene_status_c kamakura_info;
|
||||
extern Scene_status_c field_tool_field_info;
|
||||
extern Scene_status_c title_demo_info;
|
||||
extern Scene_status_c PLAYER_SELECT4_info;
|
||||
extern Scene_status_c museum_entrance_info;
|
||||
extern Scene_status_c museum_picture_info;
|
||||
extern Scene_status_c museum_fossil_info;
|
||||
extern Scene_status_c museum_insect_info;
|
||||
extern Scene_status_c museum_fish_info;
|
||||
extern Scene_status_c player_room_ll1_info;
|
||||
extern Scene_status_c player_room_ll2_info;
|
||||
extern Scene_status_c p_room_bm_s_info;
|
||||
extern Scene_status_c p_room_bm_m_info;
|
||||
extern Scene_status_c p_room_bm_l_info;
|
||||
extern Scene_status_c p_room_bm_ll1_info;
|
||||
extern Scene_status_c NEEDLEWORK_info;
|
||||
extern Scene_status_c player_room_island_info;
|
||||
extern Scene_status_c npc_room_island_info;
|
||||
extern Scene_status_c start_demo3_info;
|
||||
extern Scene_status_c lighthouse_info;
|
||||
extern Scene_status_c tent_info;
|
||||
|
||||
extern int mSc_bank_regist_check(Object_Exchange_c* exchange, s16 bank_id);
|
||||
extern void mSc_regist_initial_exchange_bank(GAME_PLAY* play);
|
||||
extern void mSc_dmacopy_data_bank(Object_Exchange_c*);
|
||||
extern void mSc_data_bank_ct(GAME_PLAY*, Object_Exchange_c*);
|
||||
extern void Door_info_ct(Door_data_c**);
|
||||
extern void Scene_ct(GAME_PLAY*, void*);
|
||||
extern void mSc_decide_exchange_bank(Object_Exchange_c*);
|
||||
extern void return_emu_game(GAME*);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#define M_SCENE_TABLE_H
|
||||
|
||||
#include "types.h"
|
||||
#include "m_scene.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
@@ -78,6 +79,9 @@ enum scene_table {
|
||||
SCENE_NUM
|
||||
};
|
||||
|
||||
|
||||
extern Scene_status_c scene_data_status[SCENE_NUM];
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -104,6 +104,13 @@ struct submenu_s {
|
||||
};
|
||||
|
||||
extern void mSM_open_submenu(Submenu* submenu, int menu_type, int arg0, int arg1);
|
||||
extern void mSM_submenu_dt(Submenu*);
|
||||
extern void mSM_submenu_ovlptr_cleanup(Submenu*);
|
||||
extern void mSM_submenu_ovlptr_init(GAME_PLAY*);
|
||||
extern void mSM_submenu_ct(Submenu*);
|
||||
extern void mSM_submenu_ctrl(GAME_PLAY*);
|
||||
extern void mSM_submenu_move(Submenu*);
|
||||
extern void mSM_submenu_draw(Submenu*, GAME_PLAY*);
|
||||
extern int mSM_CHECK_ALL_FISH_GET();
|
||||
extern int mSM_CHECK_ALL_INSECT_GET();
|
||||
|
||||
|
||||
@@ -25,6 +25,7 @@ extern u16 pact4_head_table[];
|
||||
|
||||
extern int mTD_demono_get();
|
||||
extern void title_demo_move(GAME_PLAY* play);
|
||||
extern void mTD_player_keydata_init(GAME_PLAY* play);
|
||||
extern void mTD_rtc_set();
|
||||
extern void mTD_rtc_reserve();
|
||||
extern int mTD_get_titledemo_no();
|
||||
|
||||
+33
-76
@@ -1,5 +1,4 @@
|
||||
# PowerPC Register Constants
|
||||
# General Purpose Registers (GPRs)
|
||||
/* Register name macros */
|
||||
.set r0, 0
|
||||
.set r1, 1
|
||||
.set r2, 2
|
||||
@@ -32,8 +31,6 @@
|
||||
.set r29, 29
|
||||
.set r30, 30
|
||||
.set r31, 31
|
||||
|
||||
# Floating Point Registers (FPRs)
|
||||
.set f0, 0
|
||||
.set f1, 1
|
||||
.set f2, 2
|
||||
@@ -66,8 +63,6 @@
|
||||
.set f29, 29
|
||||
.set f30, 30
|
||||
.set f31, 31
|
||||
|
||||
# Graphics Quantization Registers (GQRs)
|
||||
.set qr0, 0
|
||||
.set qr1, 1
|
||||
.set qr2, 2
|
||||
@@ -76,73 +71,35 @@
|
||||
.set qr5, 5
|
||||
.set qr6, 6
|
||||
.set qr7, 7
|
||||
|
||||
# Special Purpose Registers (SPRs)
|
||||
.set XER, 1
|
||||
.set LR, 8
|
||||
.set CTR, 9
|
||||
.set DSISR, 18
|
||||
.set DAR, 19
|
||||
.set DEC, 22
|
||||
.set SDR1, 25
|
||||
.set SRR0, 26
|
||||
.set SRR1, 27
|
||||
.set SPRG0, 272
|
||||
.set SPRG1, 273
|
||||
.set SPRG2, 274
|
||||
.set SPRG3, 275
|
||||
.set EAR, 282
|
||||
.set PVR, 287
|
||||
.set IBAT0U, 528
|
||||
.set IBAT0L, 529
|
||||
.set IBAT1U, 530
|
||||
.set IBAT1L, 531
|
||||
.set IBAT2U, 532
|
||||
.set IBAT2L, 533
|
||||
.set IBAT3U, 534
|
||||
.set IBAT3L, 535
|
||||
.set DBAT0U, 536
|
||||
.set DBAT0L, 537
|
||||
.set DBAT1U, 538
|
||||
.set DBAT1L, 539
|
||||
.set DBAT2U, 540
|
||||
.set DBAT2L, 541
|
||||
.set DBAT3U, 542
|
||||
.set DBAT3L, 543
|
||||
.set GQR0, 912
|
||||
.set GQR1, 913
|
||||
.set GQR2, 914
|
||||
.set GQR3, 915
|
||||
.set GQR4, 916
|
||||
.set GQR5, 917
|
||||
.set GQR6, 918
|
||||
.set GQR7, 919
|
||||
.set HID2, 920
|
||||
.set WPAR, 921
|
||||
.set DMA_U, 922
|
||||
.set DMA_L, 923
|
||||
.set UMMCR0, 936
|
||||
.set UPMC1, 937
|
||||
.set UPMC2, 938
|
||||
.set USIA, 939
|
||||
.set UMMCR1, 940
|
||||
.set UPMC3, 941
|
||||
.set UPMC4, 942
|
||||
.set USDA, 943
|
||||
.set MMCR0, 952
|
||||
.set PMC1, 953
|
||||
.set PMC2, 954
|
||||
.set SIA, 955
|
||||
.set MMCR1, 956
|
||||
.set PMC3, 957
|
||||
.set PMC4, 958
|
||||
.set SDA, 959
|
||||
.set HID0, 1008
|
||||
.set HID1, 1009
|
||||
.set IABR, 1010
|
||||
.set DABR, 1013
|
||||
.set L2CR, 1017
|
||||
.set ICTC, 1019
|
||||
.set THRM1, 1020
|
||||
.set THRM2, 1021
|
||||
.set THRM3, 1022
|
||||
.set cr0lt, 0
|
||||
.set cr0gt, 1
|
||||
.set cr0eq, 2
|
||||
.set cr0un, 3
|
||||
.set cr1lt, 4
|
||||
.set cr1gt, 5
|
||||
.set cr1eq, 6
|
||||
.set cr1un, 7
|
||||
.set cr2lt, 8
|
||||
.set cr2gt, 9
|
||||
.set cr2eq, 10
|
||||
.set cr2un, 11
|
||||
.set cr3lt, 12
|
||||
.set cr3gt, 13
|
||||
.set cr3eq, 14
|
||||
.set cr3un, 15
|
||||
.set cr4lt, 16
|
||||
.set cr4gt, 17
|
||||
.set cr4eq, 18
|
||||
.set cr4un, 19
|
||||
.set cr5lt, 20
|
||||
.set cr5gt, 21
|
||||
.set cr5eq, 22
|
||||
.set cr5un, 23
|
||||
.set cr6lt, 24
|
||||
.set cr6gt, 25
|
||||
.set cr6eq, 26
|
||||
.set cr6un, 27
|
||||
.set cr7lt, 28
|
||||
.set cr7gt, 29
|
||||
.set cr7eq, 30
|
||||
.set cr7un, 31
|
||||
|
||||
@@ -15,6 +15,21 @@ typedef struct math_3d_pipe_s {
|
||||
s_xyz center;
|
||||
} Math3D_pipe_c;
|
||||
|
||||
typedef struct math_3d_sphere_s{
|
||||
s_xyz center;
|
||||
s16 radius;
|
||||
}Math3D_sphere_c;
|
||||
|
||||
typedef struct math_3d_plane_s {
|
||||
xyz_t normal;
|
||||
f32 originDist;
|
||||
} Math3D_plane_c; // size = 0x10
|
||||
|
||||
typedef struct math_3d_triangle_s {
|
||||
xyz_t vtx[3];
|
||||
Math3D_plane_c plane;
|
||||
} Math3D_triangle_c; // size = 0x34
|
||||
|
||||
extern f32 Math3DVecLength(xyz_t* vec);
|
||||
extern void sMath_RotateX(xyz_t* pos, f32 rad);
|
||||
extern void sMath_RotateY(xyz_t* pos, f32 rad);
|
||||
@@ -22,6 +37,12 @@ extern void sMath_RotateZ(xyz_t* pos, f32 rad);
|
||||
extern f32 Math3d_normalizeXyz_t(xyz_t* vec);
|
||||
extern f32 Math3DLength(xyz_t* v0, xyz_t* v1);
|
||||
extern void Math3DInDivPos2(xyz_t* v0, xyz_t* v1, xyz_t* v2, f32 percent);
|
||||
extern void Math3DPlane(xyz_t* va, xyz_t* vb, xyz_t* vc, f32* nox, f32* noy, f32* noz, f32* odist);
|
||||
extern int Math3D_sphereCrossSphere_cl(Math3D_sphere_c* a, Math3D_sphere_c* b, f32* in);
|
||||
extern int Math3D_sphereVsPipe_cl(Math3D_sphere_c* s, Math3D_pipe_c* c, f32* in);
|
||||
extern int Math3D_pipeVsPipe_cl(Math3D_pipe_c* a, Math3D_pipe_c* b , f32* d);
|
||||
extern int Math3D_sphereCrossTriangle3_cp(Math3D_sphere_c* s, Math3D_triangle_c* tri, xyz_t* ip);
|
||||
extern int Math3D_pipeCrossTriangle_cp(Math3D_pipe_c* c,Math3D_triangle_c* tri, xyz_t* in);
|
||||
|
||||
extern xyz_t ZeroVec;
|
||||
extern s_xyz ZeroSVec;
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
#ifndef VERSION_H
|
||||
#define VERSION_H
|
||||
|
||||
#include "types.h"
|
||||
|
||||
extern char __Creator__[];
|
||||
extern char __DateTime__[];
|
||||
|
||||
#endif
|
||||
@@ -10,6 +10,7 @@
|
||||
#include "m_controller.h"
|
||||
#include "m_name_table.h"
|
||||
#include "m_common_data.h"
|
||||
#include "m_actor_shadow.h"
|
||||
|
||||
static void Airplane_Actor_ct(ACTOR* actor, GAME* game);
|
||||
static void Airplane_Actor_dt(ACTOR* actor, GAME* game);
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
#include "m_time.h"
|
||||
#include "m_titledemo.h"
|
||||
#include "m_event.h"
|
||||
#include "m_scene_table.h"
|
||||
|
||||
extern void flash_rom_and_player_info_clear() {
|
||||
Save* save = Common_GetPointer(save);
|
||||
|
||||
+3
-3
@@ -281,7 +281,7 @@ extern void sAdo_SubGameEnd(){
|
||||
Na_SubGameEnd();
|
||||
}
|
||||
|
||||
extern u8 sAdo_SubGameOK(){
|
||||
extern int sAdo_SubGameOK(){
|
||||
|
||||
return Na_SubGameOK();
|
||||
}
|
||||
@@ -341,12 +341,12 @@ extern void sAdo_LevSeEcho(u8 b){
|
||||
Na_LevSeEcho(b);
|
||||
}
|
||||
|
||||
extern void sAdo_BgmFadeoutCheck(){
|
||||
extern u8 sAdo_BgmFadeoutCheck(){
|
||||
|
||||
Na_BgmFadeoutCheck();
|
||||
}
|
||||
|
||||
extern void sAdo_SeFadeoutCheck(){
|
||||
extern u8 sAdo_SeFadeoutCheck(){
|
||||
|
||||
Na_SeFadeoutCheck();
|
||||
}
|
||||
|
||||
@@ -0,0 +1,256 @@
|
||||
|
||||
#include "famicom_emu.h"
|
||||
|
||||
#include "m_malloc.h"
|
||||
#include "_mem.h"
|
||||
#include "dolphin/gx.h"
|
||||
#include "Famicom/famicom.h"
|
||||
#include "m_scene.h"
|
||||
#include "jsyswrap.h"
|
||||
#include "m_common_data.h"
|
||||
#include "m_debug.h"
|
||||
#include "libc64/sprintf.h"
|
||||
|
||||
int famicom_done;
|
||||
int famicom_done_countdown;
|
||||
void* freeXfbBase;
|
||||
u32 freeXfbSize;
|
||||
|
||||
void* my_malloc_func[] = {
|
||||
my_zelda_malloc_align,
|
||||
my_zelda_free,
|
||||
my_zelda_getmemblocksize,
|
||||
my_zelda_gettotalfreesize,
|
||||
};
|
||||
|
||||
|
||||
|
||||
void my_alloc_init(GAME_FAMICOM_EMU* famicom, void* start, size_t size){
|
||||
|
||||
u32 freebytes;
|
||||
u32 alloc;
|
||||
u32 aligned;
|
||||
u32 tsize;
|
||||
|
||||
freebytes = game_getFreeBytes(&famicom->game);
|
||||
alloc = (u32)THA_alloc16(&famicom->game.tha, freebytes);
|
||||
aligned = ALIGN_NEXT(alloc, 16);
|
||||
tsize = aligned - alloc;
|
||||
|
||||
zelda_InitArena((void*)aligned, freebytes - tsize);
|
||||
|
||||
if((start != NULL) && (size != 0)){
|
||||
|
||||
zelda_AddBlockArena(start, size);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void my_alloc_cleanup(){
|
||||
|
||||
zelda_CleanupArena();
|
||||
}
|
||||
|
||||
void my_zelda_getmemblocksize(void* ptr){
|
||||
|
||||
zelda_GetMemBlockSize(ptr);
|
||||
}
|
||||
|
||||
void my_zelda_gettotalfreesize(){
|
||||
|
||||
zelda_GetTotalFreeSize();
|
||||
}
|
||||
|
||||
void* my_zelda_malloc_align(size_t size, u32 align){
|
||||
|
||||
void* aligned = zelda_malloc_align(size, align);
|
||||
|
||||
if(aligned != NULL){
|
||||
|
||||
memset(aligned, 0xFF, size);
|
||||
}
|
||||
return aligned;
|
||||
}
|
||||
|
||||
void my_zelda_free(void* ptr){
|
||||
|
||||
zelda_free(ptr);
|
||||
}
|
||||
#pragma pool_data off
|
||||
|
||||
void famicom_emu_main(GAME* famicom){
|
||||
static GXColor black_color = {0,0,0,0};
|
||||
GXColor t;
|
||||
int i;
|
||||
int padid;
|
||||
pad_t* current_pad;
|
||||
u32 combo;
|
||||
void* manager;
|
||||
|
||||
if(famicom_done == 0){
|
||||
if(famicom_rom_load_check() < 0){
|
||||
Common_Set(famicom_2DBAC, Common_Get(famicom_2DBAC) | 1);
|
||||
famicom_done = 1;
|
||||
famicom_done_countdown = 0;
|
||||
}
|
||||
else{
|
||||
for(padid = 0,i = 4; i != 0; i--, padid++){
|
||||
|
||||
current_pad = &gamePT->pads[padid];
|
||||
combo = current_pad->now.button | current_pad->on.button;
|
||||
|
||||
if(combo == (BUTTON_Z | BUTTON_R | BUTTON_L) || (combo == 0xF0)){
|
||||
|
||||
famicom_done = 1;
|
||||
famicom_done_countdown = 60;
|
||||
JC_JFWDisplay_startFadeOut(JC_JFWDisplay_getManager(), famicom_done_countdown);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (famicom_done != 0) {
|
||||
if ( famicom_done_countdown == 0) {
|
||||
return_emu_game(famicom);
|
||||
} else {
|
||||
famicom_done_countdown -= 1;
|
||||
}
|
||||
}
|
||||
|
||||
JW_BeginFrame();
|
||||
famicom->disable_display = 1;
|
||||
|
||||
if(famicom_done == 0){
|
||||
|
||||
famicom_1frame();
|
||||
}
|
||||
else{
|
||||
manager = JC_JFWDisplay_getManager();
|
||||
t = black_color;
|
||||
JC_JFWDisplay_clearEfb(manager, &t);
|
||||
}
|
||||
JW_EndFrame();
|
||||
}
|
||||
|
||||
#pragma pool_data on
|
||||
|
||||
|
||||
void famicom_emu_init(GAME_FAMICOM_EMU* famicom){
|
||||
|
||||
int rom_id;
|
||||
u8 player;
|
||||
int debug;
|
||||
void* manager;
|
||||
GXRenderModeObj* render;
|
||||
|
||||
famicom_done = 0;
|
||||
famicom_done_countdown = 0;
|
||||
game_resize_hyral(&famicom->game, 0);
|
||||
Common_Set(famicom_287F9, 0);
|
||||
|
||||
rom_id = Common_Get(current_famicom_rom);
|
||||
player = Common_Get(player_no);
|
||||
save_game_image = (GETREG(HREG, 4) == 1);
|
||||
debug = GETREG(HREG,3);
|
||||
|
||||
if((rom_id > 0) && ( debug != 0)){
|
||||
rom_id = debug & (-debug & ~debug) >> 0x1f;
|
||||
}
|
||||
|
||||
famicom->game.exec = famicom_emu_main;
|
||||
famicom->game.cleanup = famicom_emu_cleanup;
|
||||
|
||||
|
||||
while(sAdo_SubGameOK() == 0){
|
||||
VIWaitForRetrace();
|
||||
sAdo_GameFrame();
|
||||
}
|
||||
|
||||
manager = JC_JFWDisplay_getManager();
|
||||
render = JC_JFWDisplay_getRenderMode(manager);
|
||||
freeXfbBase = JC_JFWDisplay_changeToSingleXfb(manager, 1);
|
||||
freeXfbSize = render->efbHeight * render->viXOrigin * sizeof(u16);
|
||||
|
||||
my_alloc_init(famicom, freeXfbBase, freeXfbSize);
|
||||
|
||||
if(famicom_init(rom_id, my_malloc_func, player) != 0){
|
||||
Common_Set(famicom_2DBAC, Common_Get(famicom_2DBAC) | 1);
|
||||
return_emu_game(&famicom->game);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void famicom_emu_cleanup(GAME*){
|
||||
|
||||
JC_JFWDisplay_startFadeIn(JC_JFWDisplay_getManager(), 1);
|
||||
|
||||
if(famicom_cleanup() != 0){
|
||||
|
||||
Common_Set(famicom_2DBAC, Common_Get(famicom_2DBAC) | 2);
|
||||
}
|
||||
|
||||
my_alloc_cleanup();
|
||||
|
||||
if(freeXfbBase != NULL){
|
||||
|
||||
JC_JFWDisplay_changeToDoubleXfb(JC_JFWDisplay_getManager());
|
||||
freeXfbBase = NULL;
|
||||
freeXfbSize = 0;
|
||||
}
|
||||
sAdo_SubGameEnd();
|
||||
}
|
||||
|
||||
int famicom_gba_getImage(u32 rom_id, int* ptr){
|
||||
static char* names[] = {
|
||||
"cluclu",
|
||||
"usa_balloon",
|
||||
"donkey",
|
||||
"usa_jr_math",
|
||||
"pinball",
|
||||
"tennis",
|
||||
"usa_golf",
|
||||
NULL,
|
||||
"usa_baseball",
|
||||
NULL,
|
||||
"usa_donkey3",
|
||||
"donkeyjr",
|
||||
"soccer",
|
||||
"exbike",
|
||||
NULL,
|
||||
"usa_icecl",
|
||||
"mario",
|
||||
"smario",
|
||||
NULL
|
||||
};
|
||||
|
||||
char buf[256];
|
||||
u32 resource;
|
||||
int block;
|
||||
char* rom;
|
||||
|
||||
|
||||
if(rom_id > 0x13){
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
rom = names[(rom_id == 0) ? 0 : rom_id -1];
|
||||
|
||||
if(rom == NULL){
|
||||
return 0;
|
||||
}
|
||||
else{
|
||||
sprintf(buf, "/FAMICOM/GBA/jb_%s.bin.szs", rom);
|
||||
resource = JC__JKRGetResource(buf);
|
||||
if((resource != 0) && (ptr != NULL)){
|
||||
block = JC__JKRGetMemBlockSize(0, resource);
|
||||
*ptr = block;
|
||||
}
|
||||
}
|
||||
return resource;
|
||||
}
|
||||
|
||||
void famicom_gba_removeImage(void* p){
|
||||
|
||||
JC__JKRRemoveResource(p);
|
||||
}
|
||||
+1
-1
@@ -323,7 +323,7 @@ extern void Actor_info_ct(GAME* game, Actor_info* actor_info, Actor_data* player
|
||||
bzero(actor_info, sizeof(Actor_info));
|
||||
actor_dlftbls_init();
|
||||
|
||||
Matrix_copy_MtxF(&play->mtx_204C, &MtxF_clear);
|
||||
Matrix_copy_MtxF(&play->billboard_matrix, &MtxF_clear);
|
||||
Matrix_copy_MtxF(&play->projection_matrix, &MtxF_clear);
|
||||
|
||||
/* Reset the actor dlf table info */
|
||||
|
||||
@@ -0,0 +1,411 @@
|
||||
#include "m_actor_shadow.h"
|
||||
|
||||
#include "m_collision_bg.h"
|
||||
#include "m_common_data.h"
|
||||
#include "m_rcp.h"
|
||||
#include "sys_matrix.h"
|
||||
#include "m_lib.h"
|
||||
#include "m_lights.h"
|
||||
|
||||
|
||||
extern Gfx ef_shadow_out_modelT[];
|
||||
extern Gfx ef_shadow_in_modelT[];
|
||||
|
||||
|
||||
int mActorShadow_OperateScrollLimit(int value, int step, int limit) {
|
||||
if (step != 0) {
|
||||
if (step > 0) {
|
||||
value += step;
|
||||
if (value > limit) {
|
||||
value = limit;
|
||||
}
|
||||
} else if (step < 0) {
|
||||
value += step;
|
||||
if (value < limit) {
|
||||
value = limit;
|
||||
}
|
||||
}
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
Gfx* mActorShadow_TileScroll2(u32* x1, u32* y1, int step1, int step2, int limit1, int limit2, int width1,
|
||||
int height1, u32* x2, u32* y2, int step3, int step4, int limit3, int limit4,
|
||||
int width2, int height2, GAME* game){
|
||||
|
||||
|
||||
*x1 = mActorShadow_OperateScrollLimit(*x1, step1, limit1);
|
||||
*y1 = mActorShadow_OperateScrollLimit(*y1, step2, limit2);
|
||||
*x2 = mActorShadow_OperateScrollLimit(*x2, step3, limit3);
|
||||
*y2 = mActorShadow_OperateScrollLimit(*y2, step4, limit4);
|
||||
|
||||
return two_tex_scroll(game->graph, 0, *x1, *y1, width1, height1, 1, *x2, *y2, width2, height2);
|
||||
}
|
||||
|
||||
|
||||
void mActorShadow_AdjustRate(f32* rate) {
|
||||
if (*rate < 0.0f) {
|
||||
*rate = 0.0f;
|
||||
} else if (*rate > 1.0f) {
|
||||
*rate = 1.0f;
|
||||
}
|
||||
}
|
||||
|
||||
void mActorShadow_GetTimeAngleY_TimeAlpha(Shadow_Info* shadow, GAME_PLAY* play){
|
||||
f32 timef;
|
||||
int timesec = Common_Get(time.now_sec);
|
||||
shadow->unk1C = play->kankyo.unkC4;
|
||||
|
||||
// Between 4 a.m and 8 p.m
|
||||
if((timesec >= 14400) && ( timesec < 72000)){
|
||||
timef = (timesec - 14400) / 57600.0f;
|
||||
} //Between 12 a.m and 4 a.m
|
||||
else if (timesec < 14400){
|
||||
timef = 0.5f + timesec / 28800.0f;
|
||||
} // Between 8 p.m and 12 a.m
|
||||
else{
|
||||
timef = (timesec - 72000)/ 28800.0f;
|
||||
}
|
||||
|
||||
shadow->unk26 = 0x8000 - ((s16)(16384.0f * timef) + 0x6000);
|
||||
}
|
||||
|
||||
|
||||
void mActorShadow_GetGroundAverageAngle(Shadow_Info* shadow){
|
||||
static xyz_t angle_range_table[4] = {
|
||||
{ 10.0f, 0.0f, 10.0f },
|
||||
{ 10.0f, 0.0f, -10.0f },
|
||||
{ -10.0f, 0.0f, 10.0f },
|
||||
{ -10.0f, 0.0f, -10.0f },
|
||||
};
|
||||
|
||||
int x = 0;
|
||||
int y = 0;
|
||||
int z = 0;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 4; i++) {
|
||||
xyz_t pos = shadow->position;
|
||||
s_xyz sangle = {0, 0, 0};
|
||||
|
||||
pos.x += angle_range_table[i].x;
|
||||
pos.y += angle_range_table[i].y;
|
||||
pos.z += angle_range_table[i].z;
|
||||
|
||||
mCoBG_GetBgY_AngleS_FromWpos(&sangle, pos, 0.0f);
|
||||
|
||||
x += sangle.x;
|
||||
y += sangle.y;
|
||||
z += sangle.z;
|
||||
}
|
||||
|
||||
shadow->unk20 = x >> 2;
|
||||
shadow->unk22 = y >> 2;
|
||||
shadow->unk24 = z >> 2;
|
||||
}
|
||||
|
||||
void mActorShadow_GetDistanceRate(Shadow_Info* shadow, f32 rate) {
|
||||
f32 xcalc;
|
||||
f32 disty = shadow->position.y - shadow->groundY;
|
||||
|
||||
disty = disty >= 0.0f ? disty : -disty;
|
||||
xcalc = rate + 100.0f;
|
||||
|
||||
if (disty > xcalc){
|
||||
shadow->unk14 = 0.600000023842f;
|
||||
shadow->unk18 = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
xcalc = (xcalc - disty) / xcalc;
|
||||
shadow->unk14 = xcalc * 0.399999976158f + 0.6f;
|
||||
shadow->unk18 = xcalc;
|
||||
}
|
||||
f32 mActorShadow_GetAbsBigger(f32 a, f32 b) {
|
||||
a = a >= 0.0f ? a : -a;
|
||||
b = b >= 0.0f ? b : -b;
|
||||
|
||||
if(a > b){
|
||||
return a;
|
||||
}
|
||||
return b;
|
||||
}
|
||||
|
||||
void mActorShadow_RadiusScaleRate(ACTOR* actor, Shadow_Info* shadow) {
|
||||
f32 abs_bigger = mActorShadow_GetAbsBigger(actor->shape_info.shadow_size_x, actor->shape_info.shadow_size_z);
|
||||
shadow->unk10 = (abs_bigger / 19.0f) * 0.018f;
|
||||
}
|
||||
|
||||
void mActorShadow_GetShadowTopPos_GetSlideS(Shadow_Info* shadow) {
|
||||
|
||||
xyz_t wpos;
|
||||
xyz_t base;
|
||||
f32 bg_y;
|
||||
int res;
|
||||
|
||||
if (shadow->kind == 0) {
|
||||
base.x = 0.0f;
|
||||
base.y = 0.0f;
|
||||
base.z = -40.0f;
|
||||
sMath_RotateY(&base, shadow->unk26 * (9.58738019108e-05f));
|
||||
wpos.x = shadow->position.x + base.x;
|
||||
wpos.y = shadow->position.y + base.y;
|
||||
wpos.z = shadow->position.z + base.z;
|
||||
res = 0;
|
||||
bg_y = mCoBG_GetShadowBgY_AngleS_FromWpos(0.0f, NULL, wpos);
|
||||
if ((shadow->position.y - bg_y) > 20.0f) {
|
||||
shadow->unk34 = 28;
|
||||
return;
|
||||
}
|
||||
}
|
||||
shadow->unk34 = 0;
|
||||
}
|
||||
|
||||
Gfx* mActorShadow_SetTexScroll(ACTOR* actor, Shadow_Info* shadow, GAME* game){
|
||||
|
||||
u32 y1 = 0;
|
||||
u32 x1 = 0;
|
||||
u32 y2 = 0;
|
||||
int step;
|
||||
|
||||
if(actor->shape_info.unk_20 < shadow->unk34){
|
||||
step = 0xD;
|
||||
}
|
||||
else if(actor->shape_info.unk_20 > shadow->unk34){
|
||||
step = -0xD;
|
||||
}
|
||||
else{
|
||||
step = 0;
|
||||
}
|
||||
|
||||
mActorShadow_TileScroll2(&x1, &y1, 0, 0, 0, 0, 0x20, 0x10, (u32*)&actor->shape_info.unk_20, &y2, step, 0, shadow->unk34, 0, 0x20, 0x10, game);
|
||||
}
|
||||
|
||||
|
||||
void mActorShadow_GetLastAlphaScale(f32* scale, u8* alpha, ACTOR* actor, Shadow_Info* shadow) {
|
||||
|
||||
f32 alph = shadow->unk1C * shadow->unk18 * actor->shape_info.shadow_alpha_change_rate * 0.75f;
|
||||
|
||||
*scale = shadow->unk10 * shadow->unk14 * actor->shape_info.shadow_size_change_rate;
|
||||
|
||||
if (shadow->kind == 1) {
|
||||
alph *= 0.7f;
|
||||
}
|
||||
*alpha = alph;
|
||||
}
|
||||
|
||||
|
||||
void mActorShadow_DrawActorShadow(ACTOR* actor, Shadow_Info* shadow, GAME_PLAY* play, int id, xyz_t ofs, f32 rad) {
|
||||
f32 x, y, z;
|
||||
f32 y_adjust;
|
||||
f32 scale;
|
||||
u8 alpha;
|
||||
u8 r, g, b;
|
||||
int scene;
|
||||
Gfx* texscroll;
|
||||
GRAPH* graph;
|
||||
GAME* game = (GAME*)play;
|
||||
|
||||
|
||||
scene = Save_Get(scene_no);
|
||||
|
||||
mActorShadow_GetLastAlphaScale(&scale, &alpha, actor, shadow);
|
||||
graph = game->graph;
|
||||
_texture_z_light_fog_prim_shadow(graph);
|
||||
|
||||
OPEN_DISP(graph);
|
||||
|
||||
y_adjust = (scene == 19 || scene == 27 || scene == 28 || scene == 34) ? 0.5f :
|
||||
((scene == 15 || scene == 16 || scene == 49) ? 0.6f : 2.0f);
|
||||
|
||||
switch (actor->shape_info.force_shadow_position) {
|
||||
case 1:
|
||||
x = actor->shape_info.shadow_position->x + ofs.x;
|
||||
y = actor->shape_info.shadow_position->y + y_adjust + ofs.y;
|
||||
z = actor->shape_info.shadow_position->z + ofs.z;
|
||||
Matrix_translate(x, y, z, 0);
|
||||
break;
|
||||
default:
|
||||
x = shadow->position.x + ofs.x;
|
||||
y = shadow->groundY + y_adjust + ofs.y;
|
||||
z = shadow->position.z + ofs.z;
|
||||
Matrix_translate(x, y, z, 0);
|
||||
break;
|
||||
}
|
||||
|
||||
switch (actor->shape_info.force_shadow_position) {
|
||||
case 1:
|
||||
Matrix_RotateZ(0, 1);
|
||||
Matrix_RotateX(0, 1);
|
||||
break;
|
||||
default:
|
||||
Matrix_RotateZ(shadow->unk24, 1);
|
||||
Matrix_RotateX(shadow->unk20, 1);
|
||||
break;
|
||||
}
|
||||
|
||||
if ((shadow->kind == 0) && (id == 0)) {
|
||||
Matrix_RotateY(shadow->unk26, 1);
|
||||
}
|
||||
|
||||
switch (id) {
|
||||
case 1:
|
||||
Matrix_scale(shadow->unk10, shadow->unk10, rad, 1);
|
||||
break;
|
||||
default:
|
||||
switch (actor->shape_info.force_shadow_position) {
|
||||
case 1:
|
||||
Matrix_scale(shadow->unk10, shadow->unk10, shadow->unk10, 1);
|
||||
break;
|
||||
default:
|
||||
Matrix_scale(scale, scale, scale, 1);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
gSPMatrix(NEXT_SHADOW_DISP, _Matrix_to_Mtx_new(game->graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
|
||||
mEnv_GetShadowPrimColor_Light(&r, &g, &b, game);
|
||||
gDPSetPrimColor(NEXT_SHADOW_DISP, 0, 0xFF, r, g, b, (u8)alpha);
|
||||
|
||||
if ((shadow->kind == 0) && (id == 0)) {
|
||||
texscroll = mActorShadow_SetTexScroll(actor, shadow, game);
|
||||
if (texscroll != NULL) {
|
||||
gSPSegment(NEXT_SHADOW_DISP, 0x08, texscroll);
|
||||
gSPDisplayList(NEXT_SHADOW_DISP, ef_shadow_out_modelT);
|
||||
}
|
||||
} else {
|
||||
gSPDisplayList(NEXT_SHADOW_DISP, ef_shadow_in_modelT);
|
||||
}
|
||||
|
||||
CLOSE_DISP(graph);
|
||||
|
||||
}
|
||||
|
||||
void mActorShadow_GetShadowPosition(ACTOR* actor, xyz_t* position){
|
||||
|
||||
if(actor->shape_info.shadow_position != NULL){
|
||||
*position = *actor->shape_info.shadow_position;
|
||||
}
|
||||
else {
|
||||
*position = actor->world.position;
|
||||
}
|
||||
}
|
||||
|
||||
int mActorShadow_GetShadowKind(void) {
|
||||
if (!(mFI_GetFieldId() & 0xF000)) {
|
||||
return 0;
|
||||
} else {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
f32 mAc_GetShadowGroundY_NoneForce(const Shadow_Info* shadow){
|
||||
f32 res = mCoBG_GetShadowBgY_AngleS_FromWpos(0.0f, NULL, shadow->position);
|
||||
return res;
|
||||
}
|
||||
|
||||
f32 mAc_GetShadowGroundY_Force(const Shadow_Info* shadow){
|
||||
return mCoBG_GetBgY_OnlyCenter_FromWpos2(shadow->position, 0.0f);
|
||||
}
|
||||
|
||||
void mAc_DecideShadowRadius_IamNotFish(Shadow_Info* shadow, ACTOR* actor, f32* radius) {
|
||||
mActorShadow_RadiusScaleRate(actor, shadow);
|
||||
*radius = 0.01f;
|
||||
}
|
||||
|
||||
void mAc_DecideShadowRadius_IamFish(Shadow_Info* shadow, ACTOR* actor, f32* radius) {
|
||||
shadow->unk10 = (actor->shape_info.shadow_size_x / 19.0f) * 0.018f;
|
||||
*radius = (actor->shape_info.shadow_size_z / 19.0f) * 0.018f;
|
||||
}
|
||||
|
||||
void mAc_ActorShadowDraw_ShadowDrawFlagOff(ACTOR* actor, GAME_PLAY* play, int arg2, xyz_t arg3, f32 arg6){
|
||||
|
||||
}
|
||||
|
||||
void mAc_ActorShadowDraw_ShadowDrawFlagOn(ACTOR* actor, GAME_PLAY* play, int proc, xyz_t pos, f32 rate){
|
||||
static void (*set_raius_proc[])(Shadow_Info*, ACTOR*, f32*) = {
|
||||
mAc_DecideShadowRadius_IamNotFish,
|
||||
mAc_DecideShadowRadius_IamFish,
|
||||
};
|
||||
static f32 (*get_ground_y_proc[])(const Shadow_Info*) = {
|
||||
mAc_GetShadowGroundY_NoneForce,
|
||||
mAc_GetShadowGroundY_Force,
|
||||
};
|
||||
|
||||
Shadow_Info shadow;
|
||||
f32 rad = 0.01f;
|
||||
u8 ground_y_proc;
|
||||
bzero(&shadow, sizeof(Shadow_Info));
|
||||
|
||||
shadow.kind = mActorShadow_GetShadowKind();
|
||||
mActorShadow_GetShadowPosition(actor, &shadow.position);
|
||||
mActorShadow_AdjustRate(&actor->shape_info.shadow_size_change_rate);
|
||||
mActorShadow_AdjustRate(&actor->shape_info.shadow_alpha_change_rate);
|
||||
|
||||
ground_y_proc = actor->shape_info.force_shadow_position & 1;
|
||||
shadow.groundY = get_ground_y_proc[ground_y_proc](&shadow);
|
||||
|
||||
mActorShadow_GetTimeAngleY_TimeAlpha(&shadow, play);
|
||||
mActorShadow_GetGroundAverageAngle(&shadow);
|
||||
mActorShadow_GetDistanceRate(&shadow, rate);
|
||||
set_raius_proc[proc & 1](&shadow, actor, &rad);
|
||||
mActorShadow_GetShadowTopPos_GetSlideS(&shadow);
|
||||
mActorShadow_DrawActorShadow(actor, &shadow, play, proc, pos, rad);
|
||||
actor->shape_info.force_shadow_position = 0;
|
||||
}
|
||||
|
||||
void mAc_ActorShadowDraw(ACTOR* actor, GAME_PLAY* play, int arg2, xyz_t arg3, f32 arg6) {
|
||||
|
||||
static void (*shadwo_draw_proc[])(ACTOR* actor, GAME_PLAY* play, int arg2, xyz_t arg3, f32 arg6) = {
|
||||
mAc_ActorShadowDraw_ShadowDrawFlagOff,
|
||||
mAc_ActorShadowDraw_ShadowDrawFlagOn,
|
||||
};
|
||||
|
||||
if (actor->id == 0x4A) {
|
||||
mActorShadow_UnSetForceShadowPos(actor);
|
||||
actor->shape_info.shadow_position = &actor->world.position;
|
||||
}
|
||||
|
||||
shadwo_draw_proc[actor->shape_info.draw_shadow & 1](actor, play, arg2, arg3, arg6);
|
||||
actor->shape_info.shadow_position = &actor->world.position;
|
||||
}
|
||||
|
||||
xyz_t mActorShadow_offset0 = { 0.0f, 0.0f, 0.0f };
|
||||
|
||||
|
||||
void mActorShadow_SetForceShadowPos(ACTOR* actor, xyz_t* pos) {
|
||||
actor->shape_info.force_shadow_position = 1;
|
||||
actor->shape_info.shadow_position = pos;
|
||||
}
|
||||
|
||||
void mActorShadow_UnSetForceShadowPos(ACTOR* actor) {
|
||||
actor->shape_info.force_shadow_position = 0;
|
||||
actor->shape_info.shadow_position = &actor->world.position;
|
||||
}
|
||||
|
||||
|
||||
void mAc_NormalActorShadow(ACTOR* actor, GAME_PLAY* play, f32 rad){
|
||||
mAc_ActorShadowDraw(actor, play, 0, mActorShadow_offset0, rad);
|
||||
}
|
||||
|
||||
void mAc_UnagiActorShadow(ACTOR* actor, GAME_PLAY* play, xyz_t pos){
|
||||
mAc_ActorShadowDraw(actor, play, 1, pos, 1.0f);
|
||||
}
|
||||
|
||||
void mAc_ActorShadowCircle(ACTOR* actor, LightsN* lights, GAME_PLAY* play){
|
||||
mAc_ActorShadowDraw(actor, play, 0, mActorShadow_offset0, 1.0f);
|
||||
}
|
||||
|
||||
void mAc_ActorShadowEllipse(ACTOR* actor, LightsN* lights, GAME_PLAY* play){
|
||||
|
||||
static xyz_t tunekiti_offset = { 0.0f, 1.0f, 0.0f };
|
||||
|
||||
if(actor->id == 0x79){
|
||||
mAc_ActorShadowDraw(actor, play, 0, tunekiti_offset, 1.0f);
|
||||
|
||||
}
|
||||
else{
|
||||
mAc_ActorShadowDraw(actor, play, 0, mActorShadow_offset0, 1.0f);
|
||||
}
|
||||
}
|
||||
@@ -9,6 +9,7 @@
|
||||
#include "m_collision_bg.h"
|
||||
#include "zurumode.h"
|
||||
#include "m_common_data.h"
|
||||
#include "m_scene_table.h"
|
||||
|
||||
static mActor_name_t l_tree_max_table[mAGrw_FRUIT_NUM] = {
|
||||
TREE_APPLE_FRUIT,
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
#include "m_house.h"
|
||||
#include "m_snowman.h"
|
||||
#include "m_shop.h"
|
||||
#include "m_scene_table.h"
|
||||
|
||||
#ifdef MUST_MATCH
|
||||
#include "ppcdis.h"
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
#include "m_bg_item.h"
|
||||
|
||||
#include "m_common_data.h"
|
||||
#include "m_name_table.h"
|
||||
|
||||
BI_PROC mBI_make_proc;
|
||||
|
||||
|
||||
ACTOR* mBI_search_bg_item(Actor_info* info){
|
||||
static const s16 name_data[] = {
|
||||
0x4f, 0x1, 0x50,0x51
|
||||
};
|
||||
|
||||
int i;
|
||||
for( i = 0; i < 4; i++){
|
||||
if(Actor_info_name_search(info,name_data[i], ACTOR_PART_ITEM) != 0){
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void mBI_make_bg_item(GAME_PLAY* play){
|
||||
|
||||
|
||||
if(mBI_search_bg_item(&play->actor_info) == NULL){
|
||||
|
||||
Actor_info_make_actor(&play->actor_info, &play->game, Common_Get(bg_item_profile),0,
|
||||
0.0f,0.0f,0,0,0 ,-1, -1,-1, EMPTY_NO,-1,-1,-1);
|
||||
mBI_make_proc = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void mBI_change_bg_item(GAME_PLAY* play){
|
||||
|
||||
ACTOR* actor = mBI_search_bg_item(&play->actor_info);
|
||||
|
||||
if(actor != NULL){
|
||||
Actor_delete(actor);
|
||||
mBI_make_proc = mBI_make_bg_item;
|
||||
Common_Set(bg_item_profile, Common_Get(time.bgitem_profile));
|
||||
}
|
||||
}
|
||||
|
||||
void mBI_ct(){
|
||||
|
||||
mBI_make_proc = NULL;
|
||||
|
||||
}
|
||||
|
||||
void mBI_move(GAME_PLAY* play){
|
||||
|
||||
if(mBI_make_proc != NULL){
|
||||
mBI_make_proc(play);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,984 @@
|
||||
#include "m_collision_obj.h"
|
||||
#include "m_actor.h"
|
||||
|
||||
McoWork mco_work;
|
||||
|
||||
|
||||
void CollisionCheck_workTrisElemCenter(ClObjTrisElem_c* tri, xyz_t* vec)
|
||||
{
|
||||
|
||||
vec->x = (tri->attribute.tri.vtx[0].x + tri->attribute.tri.vtx[1].x + tri->attribute.tri.vtx[2].x) * (1.0f / 3.0f);
|
||||
vec->y = (tri->attribute.tri.vtx[0].y + tri->attribute.tri.vtx[1].y +
|
||||
tri->attribute.tri.vtx[2].y) *
|
||||
(1.0f / 3.0f);
|
||||
vec->z = (tri->attribute.tri.vtx[0].z + tri->attribute.tri.vtx[1].z +
|
||||
tri->attribute.tri.vtx[2].z) *
|
||||
(1.0f / 3.0f);
|
||||
}
|
||||
|
||||
int ClObj_ct(GAME_PLAY* play, ClObj_c* cl)
|
||||
{
|
||||
static ClObj_c clobj_default = {NULL, NULL, 0, 0, 3};
|
||||
|
||||
*cl = clobj_default;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int ClObj_dt(GAME_PLAY*, ClObj_c*)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
int ClObj_set4(GAME_PLAY*, ClObj_c* cl, ACTOR* actor, ClObjData_c* data)
|
||||
{
|
||||
|
||||
cl->owner_actor = actor;
|
||||
cl->collision_flags0 = data->collision_flags0;
|
||||
cl->collision_flags1 = data->collision_flags1;
|
||||
cl->collision_type = data->type;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
void ClObj_OCClear(GAME_PLAY *, ClObj_c* cl)
|
||||
{
|
||||
|
||||
cl->collision_flags0 &= ~2;
|
||||
cl->collided_actor = NULL;
|
||||
cl->collision_flags1 &= 0xFE;
|
||||
}
|
||||
|
||||
int ClObjElem_ct(ClObjElem_c* elem)
|
||||
{
|
||||
|
||||
elem->flags = 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int ClObjElem_set(ClObjElem_c* elem, ClObjElemData_c* data)
|
||||
{
|
||||
|
||||
elem->flags = data->flags;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
void ClObjElem_OCClear(GAME_PLAY*, ClObjElem_c* elem)
|
||||
{
|
||||
|
||||
elem->flags &= ~2;
|
||||
}
|
||||
|
||||
int ClObjJntSphElem_OCClear(GAME_PLAY* play, ClObjJntSphElem_c* col)
|
||||
{
|
||||
|
||||
ClObjElem_OCClear(play, &col->element);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int ClObjJntSph_OCClear(GAME_PLAY* play, ClObj_c* cl)
|
||||
{
|
||||
|
||||
ClObjJntSph_c* jntsph = (ClObjJntSph_c*)cl;
|
||||
ClObjJntSphElem_c* elem;
|
||||
|
||||
ClObj_OCClear(play, &jntsph->collision_obj);
|
||||
|
||||
for (elem = jntsph->elements; elem < &jntsph->elements[jntsph->count]; elem++)
|
||||
{
|
||||
ClObjJntSphElem_OCClear(play, elem);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int ClObjPipeAttr_ct(GAME_PLAY* play, ClObjPipeAttr_c* attribute)
|
||||
{
|
||||
|
||||
static ClObjPipeAttr_c default_pipe_attr = {0, 0, 0};
|
||||
|
||||
*attribute = default_pipe_attr;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int ClObjPipeAttr_dt(GAME_PLAY*, ClObjPipeAttr_c*)
|
||||
{
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int ClObjPipeAttr_set(GAME_PLAY* play, ClObjPipeAttr_c* dst, ClObjPipeAttr_c* src)
|
||||
{
|
||||
|
||||
*dst = *src;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int ClObjPipe_ct(GAME_PLAY* play, ClObjPipe_c* pipe)
|
||||
{
|
||||
|
||||
ClObj_ct(play, &pipe->collision_obj);
|
||||
ClObjElem_ct(&pipe->element);
|
||||
ClObjPipeAttr_ct(play, &pipe->attribute);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int ClObjPipe_dt(GAME_PLAY* play, ClObjPipe_c* pipe)
|
||||
{
|
||||
|
||||
ClObj_dt(play, &pipe->collision_obj);
|
||||
ClObjPipeAttr_dt(play, &pipe->attribute);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int ClObjPipe_set5(GAME_PLAY* play, ClObjPipe_c* pipe, ACTOR* owner, ClObjPipeData_c* data)
|
||||
{
|
||||
|
||||
ClObj_set4(play, &pipe->collision_obj, owner, &data->collision_data);
|
||||
ClObjElem_set(&pipe->element, &data->element_data);
|
||||
ClObjPipeAttr_set(play, &pipe->attribute, (ClObjPipeAttr_c *)&data->attribute_data);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int ClObjPipe_OCClear(GAME_PLAY* play, ClObj_c* cl)
|
||||
{
|
||||
|
||||
ClObjPipe_c* pipe = (ClObjPipe_c *)cl;
|
||||
|
||||
ClObj_OCClear(play, &pipe->collision_obj);
|
||||
ClObjElem_OCClear(play, &pipe->element);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int ClObjTrisElemAttr_ct(GAME_PLAY *play, ClObjTrisElemAttr_c *tris)
|
||||
{
|
||||
|
||||
static ClObjTrisElemAttr_c default_clobjtriselem_attr = {
|
||||
0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f};
|
||||
|
||||
*tris = default_clobjtriselem_attr;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int ClObjTrisElemAttr_dt(GAME_PLAY *play, ClObjTrisElemAttr_c *tris)
|
||||
{
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int ClObjTrisElemAttr_set(GAME_PLAY* play, ClObjTrisElemAttr_c* tris, ClObjTrisElemAttrData_c* data)
|
||||
{
|
||||
|
||||
xyz_t* dst;
|
||||
xyz_t* src;
|
||||
f32 nox, noy, noz, odist;
|
||||
|
||||
for (dst = tris->tri.vtx, src = data->vtx; dst < &tris->tri.vtx[3]; dst++, src++)
|
||||
{
|
||||
*dst = *src;
|
||||
}
|
||||
|
||||
Math3DPlane(&data->vtx[0], &data->vtx[1], &data->vtx[2], &nox, &noy, &noz, &odist);
|
||||
tris->tri.plane.normal.x = nox;
|
||||
tris->tri.plane.normal.y = noy;
|
||||
tris->tri.plane.normal.z = noz;
|
||||
tris->tri.plane.originDist = odist;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int ClObjTrisElem_ct(GAME_PLAY* play, ClObjTrisElem_c* tris)
|
||||
{
|
||||
|
||||
ClObjElem_ct(&tris->element);
|
||||
ClObjTrisElemAttr_ct(play, &tris->attribute);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int ClObjTrisElem_dt(GAME_PLAY* play, ClObjTrisElem_c* tris)
|
||||
{
|
||||
|
||||
ClObjTrisElemAttr_dt(play, &tris->attribute);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int ClObjTrisElem_set(GAME_PLAY* play, ClObjTrisElem_c* tris, ClObjTrisElemData_c* data)
|
||||
{
|
||||
|
||||
ClObjElem_set(&tris->element, &data->element);
|
||||
ClObjTrisElemAttr_set(play, &tris->attribute, &data->data);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int ClObjTrisElem_OCClear(GAME_PLAY* play, ClObjTrisElem_c* tris)
|
||||
{
|
||||
|
||||
ClObjElem_OCClear(play, &tris->element);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int ClObjTris_ct(GAME_PLAY* play, ClObjTris_c* tris)
|
||||
{
|
||||
|
||||
ClObj_ct(play, &tris->collision_obj);
|
||||
tris->count = 0;
|
||||
tris->elements = NULL;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int ClObjTris_dt_nzf(GAME_PLAY *play, ClObjTris_c *tris)
|
||||
{
|
||||
|
||||
ClObjTrisElem_c *element;
|
||||
|
||||
ClObj_dt(play, &tris->collision_obj);
|
||||
|
||||
for (element = tris->elements; element < &tris->elements[tris->count]; element++)
|
||||
{
|
||||
ClObjTrisElem_dt(play, element);
|
||||
}
|
||||
tris->count = 0;
|
||||
tris->elements = NULL;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int ClObjTris_set5_nzm(GAME_PLAY* play, ClObjTris_c* tris, ACTOR* actor, ClObjTrisData_c* data,
|
||||
ClObjTrisElem_c *elem)
|
||||
{
|
||||
|
||||
ClObjTrisElem_c* element;
|
||||
ClObjTrisElemData_c* elementData;
|
||||
|
||||
ClObj_set4(play, &tris->collision_obj, actor, &data->data);
|
||||
|
||||
tris->count = data->count;
|
||||
tris->elements = elem;
|
||||
|
||||
for (element = tris->elements, elementData = data->elem_data;
|
||||
element < &tris->elements[tris->count]; element++, elementData++)
|
||||
{
|
||||
ClObjTrisElem_ct(play, element);
|
||||
ClObjTrisElem_set(play, element, elementData);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int ClObjTris_OCClear(GAME_PLAY* play, ClObj_c* cl)
|
||||
{
|
||||
ClObjTris_c* tris = (ClObjTris_c*)cl;
|
||||
ClObjTrisElem_c* element;
|
||||
|
||||
ClObj_OCClear(play, &tris->collision_obj);
|
||||
|
||||
for (element = tris->elements; element < &tris->elements[tris->count]; element++)
|
||||
{
|
||||
ClObjTrisElem_OCClear(play, element);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
void CollisionCheck_ct(GAME_PLAY* play, CollisionCheck_c* col)
|
||||
{
|
||||
|
||||
col->flags = 0;
|
||||
CollisionCheck_clear(play, col);
|
||||
}
|
||||
|
||||
void CollisionCheck_dt(GAME_PLAY* play, CollisionCheck_c* col)
|
||||
{
|
||||
}
|
||||
|
||||
void CollisionCheck_clear(GAME_PLAY* play, CollisionCheck_c* col)
|
||||
{
|
||||
|
||||
ClObj_c** clp;
|
||||
|
||||
if (col->flags & 1)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
col->collider_num = 0;
|
||||
|
||||
for (clp = col->collider_table; clp < &col->collider_table[Cl_COLLIDER_NUM]; clp++)
|
||||
{
|
||||
*clp = NULL;
|
||||
}
|
||||
|
||||
mco_work.count = 0;
|
||||
|
||||
for (clp = mco_work.colliders; clp < &mco_work.colliders[10]; clp++)
|
||||
{
|
||||
*clp = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
CollisionClearFunction OCClearFunctionTable[ClObj_TYPE_NUM] = {
|
||||
ClObjJntSph_OCClear,ClObjPipe_OCClear,ClObjTris_OCClear
|
||||
};
|
||||
|
||||
CollisionOCFunction oc_collision_function[ClObj_TYPE_NUM][ClObj_TYPE_NUM] = {
|
||||
{CollisionCheck_OC_JntSph_Vs_JntSph, CollisionCheck_OC_JntSph_Vs_Pipe, NULL},
|
||||
{CollisionCheck_OC_Pipe_Vs_JntSph, CollisionCheck_OC_Pipe_Vs_Pipe, NULL},
|
||||
{NULL, NULL, NULL}};
|
||||
|
||||
CollisionOCFunction occ_collision_function[ClObj_TYPE_NUM][ClObj_TYPE_NUM] = {
|
||||
{NULL, NULL, NULL},
|
||||
{NULL, NULL, NULL},
|
||||
{(CollisionOCFunction)CollisionCheck_OCC_Tris_Vs_JntSph, (CollisionOCFunction)CollisionCheck_OCC_Tris_Vs_Pipe, NULL}
|
||||
};
|
||||
|
||||
CollisionOCClear OCCClearFunctionTable[ClObj_TYPE_NUM] = {
|
||||
NULL, NULL, ClObjTris_OCCClear};
|
||||
|
||||
|
||||
int CollisionCheck_setOC(GAME_PLAY* play, CollisionCheck_c* col, ClObj_c* cl)
|
||||
{
|
||||
|
||||
int ret;
|
||||
|
||||
if (_Game_play_isPause(play) == 1)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
OCClearFunctionTable[cl->collision_type](play, cl);
|
||||
|
||||
if ((cl->owner_actor != NULL) && (cl->owner_actor->mv_proc == NULL))
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (col->collider_num >= Cl_COLLIDER_NUM)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (col->flags & 1)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
ret = col->collider_num;
|
||||
col->collider_table[col->collider_num] = cl;
|
||||
col->collider_num++;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int get_type(u8 type)
|
||||
{
|
||||
|
||||
if (type == MASSTYPE_IMMOVABLE)
|
||||
{
|
||||
return MASS_IMMOVABLE;
|
||||
}
|
||||
|
||||
if (type == MASSTYPE_HEAVY)
|
||||
{
|
||||
return MASS_HEAVY;
|
||||
}
|
||||
|
||||
return MASS_NORMAL;
|
||||
}
|
||||
|
||||
void CollisionCheck_setOC_HitInfo(ClObj_c* col1, ClObjElem_c* colelem1, xyz_t* pos1, ClObj_c* col2,
|
||||
ClObjElem_c* colelem2, xyz_t* pos2, f32 diff)
|
||||
{
|
||||
|
||||
ACTOR* actor1;
|
||||
ACTOR* actor2;
|
||||
int type1;
|
||||
int type2;
|
||||
|
||||
f32 xdiff;
|
||||
f32 zdiff;
|
||||
f32 xzdist;
|
||||
|
||||
f32 weight1;
|
||||
f32 weight2;
|
||||
f32 minweight;
|
||||
f32 comweight;
|
||||
|
||||
f32 coldis1;
|
||||
f32 coldis2;
|
||||
|
||||
actor1 = col1->owner_actor;
|
||||
actor2 = col2->owner_actor;
|
||||
|
||||
col1->collided_actor = actor2;
|
||||
col1->collision_flags0 |= 2;
|
||||
colelem1->flags |= 2;
|
||||
|
||||
if (col2->collision_flags1 & 8)
|
||||
{
|
||||
col1->collision_flags1 |= 1;
|
||||
}
|
||||
|
||||
col2->collided_actor = actor1;
|
||||
col2->collision_flags0 |= 2;
|
||||
colelem2->flags |= 2;
|
||||
|
||||
if (col1->collision_flags1 & 8)
|
||||
{
|
||||
col2->collision_flags1 |= 1;
|
||||
}
|
||||
|
||||
if ((actor1 == NULL) || (actor2 == NULL))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if ((col1->collision_flags0 & 4) || (col2->collision_flags0 & 4))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
type1 = get_type(actor1->status_data.weight);
|
||||
type2 = get_type(actor2->status_data.weight);
|
||||
|
||||
weight1 = actor1->status_data.weight;
|
||||
weight2 = actor2->status_data.weight;
|
||||
|
||||
comweight = weight1 + weight2;
|
||||
|
||||
if (fabsf(comweight) < 0.008f)
|
||||
{
|
||||
weight1 = weight2 = 1.0f;
|
||||
comweight = 2.0f;
|
||||
}
|
||||
|
||||
minweight = 1.0f / comweight;
|
||||
|
||||
xdiff = pos2->x - pos1->x;
|
||||
zdiff = pos2->z - pos1->z;
|
||||
|
||||
xzdist = sqrtf((xdiff * xdiff) + (zdiff * zdiff));
|
||||
|
||||
if (type1 == 0)
|
||||
{
|
||||
if (type2 == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
coldis1 = 0.0f;
|
||||
coldis2 = 1.0f;
|
||||
}
|
||||
else if (type1 == 1)
|
||||
{
|
||||
if (type2 == 0)
|
||||
{
|
||||
coldis1 = 1.0f;
|
||||
coldis2 = 0.0f;
|
||||
}
|
||||
else if (type2 == 1)
|
||||
{
|
||||
coldis1 = 0.5f;
|
||||
coldis2 = 0.5f;
|
||||
}
|
||||
else
|
||||
{
|
||||
coldis1 = 0.0f;
|
||||
coldis2 = 1.0f;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (type2 == 2)
|
||||
{
|
||||
coldis1 = weight2 * minweight;
|
||||
coldis2 = weight1 * minweight;
|
||||
}
|
||||
else
|
||||
{
|
||||
coldis1 = 1.0f;
|
||||
coldis2 = 0.0f;
|
||||
}
|
||||
}
|
||||
|
||||
if (col1->collision_flags0 & 0x40)
|
||||
{
|
||||
coldis1 = 0.0f;
|
||||
coldis2 = 1.0f;
|
||||
actor2->speed = 0.0f;
|
||||
}
|
||||
else if (col2->collision_flags0 & 0x40)
|
||||
{
|
||||
coldis1 = 1.0f;
|
||||
coldis2 = 0.0f;
|
||||
actor1->speed = 0.0f;
|
||||
}
|
||||
|
||||
if (!(fabsf(xzdist) < 0.008f))
|
||||
{
|
||||
|
||||
xdiff *= diff / xzdist;
|
||||
zdiff *= diff / xzdist;
|
||||
|
||||
actor1->status_data.collision_vec.x += -xdiff * coldis1;
|
||||
actor1->status_data.collision_vec.z += -zdiff * coldis1;
|
||||
|
||||
actor2->status_data.collision_vec.x += xdiff * coldis2;
|
||||
actor2->status_data.collision_vec.z += zdiff * coldis2;
|
||||
}
|
||||
else if (diff != 0)
|
||||
{
|
||||
actor1->status_data.collision_vec.x += -diff * coldis1;
|
||||
actor2->status_data.collision_vec.x += diff * coldis2;
|
||||
}
|
||||
else
|
||||
{
|
||||
actor1->status_data.collision_vec.x -= coldis1;
|
||||
actor2->status_data.collision_vec.x += coldis2;
|
||||
}
|
||||
}
|
||||
|
||||
void CollisionCheck_OC_JntSph_Vs_JntSph(GAME_PLAY* play, CollisionCheck_c* check, ClObj_c* col1,
|
||||
ClObj_c* col2)
|
||||
{
|
||||
|
||||
ClObjJntSph_c* jntsph1 = (ClObjJntSph_c*)col1;
|
||||
ClObjJntSph_c* jntsph2 = (ClObjJntSph_c*)col2;
|
||||
|
||||
ClObjJntSphElem_c* elem1;
|
||||
ClObjJntSphElem_c* elem2;
|
||||
|
||||
if ((jntsph1->count <= 0) || (jntsph1->elements == NULL) || (jntsph2->count <= 0) || (jntsph2->elements == NULL))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
for (elem1 = jntsph1->elements; elem1 < &jntsph1->elements[jntsph1->count]; elem1++)
|
||||
{
|
||||
|
||||
if ((elem1->element.flags & 1))
|
||||
{
|
||||
|
||||
for (elem2 = jntsph2->elements; elem2 < &jntsph2->elements[jntsph2->count]; elem2++)
|
||||
{
|
||||
|
||||
f32 in;
|
||||
|
||||
if ((elem2->element.flags & 1))
|
||||
{
|
||||
|
||||
if (Math3D_sphereCrossSphere_cl(&elem1->attribute.s2, &elem2->attribute.s2, &in) == 1)
|
||||
{
|
||||
|
||||
xyz_t pos1;
|
||||
xyz_t pos2;
|
||||
|
||||
xyz_t_move_s_xyz(&pos1, &elem1->attribute.s2.center);
|
||||
xyz_t_move_s_xyz(&pos2, &elem2->attribute.s2.center);
|
||||
CollisionCheck_setOC_HitInfo(&jntsph1->collision_obj, &elem1->element, &pos1,
|
||||
&jntsph2->collision_obj, &elem2->element, &pos2, in);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CollisionCheck_OC_JntSph_Vs_Pipe(GAME_PLAY* play, CollisionCheck_c* check, ClObj_c* col1,
|
||||
ClObj_c* col2)
|
||||
{
|
||||
|
||||
ClObjJntSph_c* jntsph = (ClObjJntSph_c*)col1;
|
||||
ClObjPipe_c* pipe = (ClObjPipe_c*)col2;
|
||||
ClObjJntSphElem_c* elem;
|
||||
f32 in;
|
||||
xyz_t sphpos;
|
||||
xyz_t pipepos;
|
||||
|
||||
if ((jntsph->count > 0) && (jntsph->elements) != NULL)
|
||||
{
|
||||
|
||||
if (!(jntsph->collision_obj.collision_flags0 & 1) || !(pipe->collision_obj.collision_flags0 & 1) ||
|
||||
!(pipe->element.flags & 1))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
for (elem = jntsph->elements; elem < &jntsph->elements[jntsph->count]; elem++)
|
||||
{
|
||||
|
||||
if (!(elem->element.flags & 1))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (Math3D_sphereVsPipe_cl(&elem->attribute.s2, &pipe->attribute.pipe, &in) == 1)
|
||||
{
|
||||
|
||||
xyz_t_move_s_xyz(&sphpos, &elem->attribute.s2.center);
|
||||
xyz_t_move_s_xyz(&pipepos, &pipe->attribute.pipe.center);
|
||||
CollisionCheck_setOC_HitInfo(&jntsph->collision_obj, &elem->element, &sphpos,
|
||||
&pipe->collision_obj, &pipe->element, &pipepos, in);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CollisionCheck_OC_Pipe_Vs_JntSph(GAME_PLAY* play, CollisionCheck_c* colcheck, ClObj_c* col1,
|
||||
ClObj_c* col2)
|
||||
{
|
||||
|
||||
CollisionCheck_OC_JntSph_Vs_Pipe(play, colcheck, col2, col1);
|
||||
}
|
||||
|
||||
void CollisionCheck_OC_Pipe_Vs_Pipe(GAME_PLAY* play, CollisionCheck_c* colcheck, ClObj_c* col1,
|
||||
ClObj_c* col2)
|
||||
{
|
||||
|
||||
ClObjPipe_c* pipe1 = (ClObjPipe_c*)col1;
|
||||
ClObjPipe_c* pipe2 = (ClObjPipe_c*)col2;
|
||||
f32 in;
|
||||
xyz_t pipepos1;
|
||||
xyz_t pipepos2;
|
||||
|
||||
if (!(pipe1->collision_obj.collision_flags0 & 1) || !(pipe2->collision_obj.collision_flags0 & 1) || !(pipe1->element.flags & 1) || !(pipe2->element.flags & 1))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (Math3D_pipeVsPipe_cl(&pipe1->attribute.pipe, &pipe2->attribute.pipe, &in) != 1)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
xyz_t_move_s_xyz(&pipepos1, &pipe1->attribute.pipe.center);
|
||||
xyz_t_move_s_xyz(&pipepos2, &pipe2->attribute.pipe.center);
|
||||
|
||||
CollisionCheck_setOC_HitInfo(&pipe1->collision_obj, &pipe1->element, &pipepos1,
|
||||
&pipe2->collision_obj, &pipe2->element, &pipepos2, in);
|
||||
}
|
||||
|
||||
int CollisionCheck_Check1ClObjNoOC(ClObj_c* col)
|
||||
{
|
||||
|
||||
return col->collision_flags0 & 1 ^ 1;
|
||||
}
|
||||
|
||||
int CollisionCheck_Check2ClObjNoOC(ClObj_c* col1, ClObj_c* col2)
|
||||
{
|
||||
|
||||
if (!(col1->collision_flags0 & col2->collision_flags1 & 0x38) ||
|
||||
!(col1->collision_flags1 & col2->collision_flags0 & 0x38))
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (col1->owner_actor == col2->owner_actor)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void CollisionCheck_OC(GAME_PLAY* play, CollisionCheck_c* colcheck)
|
||||
{
|
||||
|
||||
ClObj_c** col1p;
|
||||
ClObj_c** col2p;
|
||||
CollisionOCFunction current;
|
||||
|
||||
for (col1p = colcheck->collider_table; col1p < &colcheck->collider_table[colcheck->collider_num]; col1p++)
|
||||
{
|
||||
|
||||
if (((*col1p) == NULL) || (CollisionCheck_Check1ClObjNoOC(*col1p) == 1))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
for (col2p = col1p + 1; col2p < &colcheck->collider_table[colcheck->collider_num]; col2p++)
|
||||
{
|
||||
|
||||
if ((*col2p == NULL) || (CollisionCheck_Check1ClObjNoOC(*col2p) == 1) ||
|
||||
(CollisionCheck_Check2ClObjNoOC(*col1p, *col2p) == 1))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
current = oc_collision_function[(*col1p)->collision_type][(*col2p)->collision_type];
|
||||
|
||||
if (current == NULL)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
current(play, colcheck, *col1p, *col2p);
|
||||
}
|
||||
}
|
||||
CollisionCheck_OCC(play, colcheck);
|
||||
}
|
||||
|
||||
void CollisionCheck_setOCC_HitInfo(GAME_PLAY* play, ClObj_c* col1, ClObjTrisElem_c* elem1, xyz_t* pos1,
|
||||
ClObj_c* col2, ClObjElem_c* elem2, xyz_t* pos2, xyz_t* pos3)
|
||||
{
|
||||
|
||||
col1->collided_actor = col2->owner_actor;
|
||||
col1->collision_flags1 |= 4;
|
||||
|
||||
elem1->attribute.t.x = pos3->x;
|
||||
elem1->attribute.t.y = pos3->y;
|
||||
elem1->attribute.t.z = pos3->z;
|
||||
}
|
||||
|
||||
|
||||
void CollisionCheck_OCC_Tris_Vs_JntSph(GAME_PLAY* play, CollisionCheck_c* colcheck, ClObjTris_c* tris,
|
||||
ClObjJntSph_c* jntsph)
|
||||
{
|
||||
|
||||
ClObjTrisElem_c* triselem;
|
||||
ClObjJntSphElem_c* jntsphelem;
|
||||
xyz_t pos;
|
||||
xyz_t sphpos;
|
||||
xyz_t trispos;
|
||||
|
||||
if ((tris->count <= 0) || (tris->elements == NULL) ||
|
||||
(jntsph->count <= 0) || (jntsph->elements == NULL))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
for (jntsphelem = jntsph->elements; jntsphelem < &jntsph->elements[jntsph->count]; jntsphelem++)
|
||||
{
|
||||
|
||||
if ((jntsphelem->element.flags & 1))
|
||||
{
|
||||
|
||||
for (triselem = tris->elements; triselem < &tris->elements[tris->count]; triselem++)
|
||||
{
|
||||
|
||||
if (Math3D_sphereCrossTriangle3_cp(&jntsphelem->attribute.s2, &triselem->attribute.tri, &pos) != 0)
|
||||
{
|
||||
|
||||
xyz_t_move_s_xyz(&sphpos, &jntsphelem->attribute.s2.center);
|
||||
CollisionCheck_workTrisElemCenter(triselem, &trispos);
|
||||
CollisionCheck_setOCC_HitInfo(play, &tris->collision_obj, triselem, &trispos, &jntsph->collision_obj, &jntsphelem->element,
|
||||
&sphpos, &pos);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void CollisionCheck_OCC_Tris_Vs_Pipe(GAME_PLAY* play, CollisionCheck_c* colcheck, ClObjTris_c* tris, ClObjPipe_c* pipe)
|
||||
{
|
||||
|
||||
ClObjTrisElem_c* triselem;
|
||||
xyz_t pos;
|
||||
xyz_t pipepos;
|
||||
xyz_t trispos;
|
||||
|
||||
if ((pipe->attribute.pipe.radius > 0) && (pipe->attribute.pipe.height > 0) && (pipe->element.flags & 1))
|
||||
{
|
||||
|
||||
if ((tris->count <= 0) || (tris->elements == NULL))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
for (triselem = tris->elements; triselem < &tris->elements[tris->count]; triselem++)
|
||||
{
|
||||
|
||||
if (Math3D_pipeCrossTriangle_cp(&pipe->attribute.pipe, &triselem->attribute.tri, &pos) != 0)
|
||||
{
|
||||
|
||||
CollisionCheck_workTrisElemCenter(triselem, &trispos);
|
||||
xyz_t_move_s_xyz(&pipepos, &pipe->attribute.pipe.center);
|
||||
CollisionCheck_setOCC_HitInfo(play, &tris->collision_obj, triselem, &trispos, &pipe->collision_obj, &pipe->element, &pipepos, &pos);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int CollisionCheck_Check1ClObjNoOCC(ClObj_c* col)
|
||||
{
|
||||
|
||||
return col->collision_flags1 >> 1 & 1 ^ 1;
|
||||
}
|
||||
|
||||
void CollisionCheck_OCC(GAME_PLAY* play, CollisionCheck_c* colcheck)
|
||||
{
|
||||
|
||||
|
||||
ClObj_c** col1p;
|
||||
ClObj_c** col2p;
|
||||
CollisionOCFunction current;
|
||||
|
||||
if (mco_work.count == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
for (col1p = mco_work.colliders; col1p < &mco_work.colliders[mco_work.count]; col1p++)
|
||||
{
|
||||
|
||||
if (((*col1p) == NULL) || (CollisionCheck_Check1ClObjNoOCC(*col1p) == 1))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
for (col2p = colcheck->collider_table; col2p < &colcheck->collider_table[colcheck->collider_num]; col2p++)
|
||||
{
|
||||
|
||||
if ((*col2p) == NULL)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if ((*col1p)->owner_actor == (*col2p)->owner_actor)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
current = occ_collision_function[(*col1p)->collision_type][(*col2p)->collision_type];
|
||||
|
||||
if (current == NULL)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
current(play, colcheck, *col1p, *col2p);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int ClObjTrisElem_OCCClear(GAME_PLAY* play, ClObjTrisElem_c* triselem)
|
||||
{
|
||||
|
||||
triselem->attribute.t.x = 0.0f;
|
||||
triselem->attribute.t.y = 0.0f;
|
||||
triselem->attribute.t.z = 0.0f;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int ClObj_OCCClear(GAME_PLAY* play, ClObj_c* col)
|
||||
{
|
||||
|
||||
col->collided_actor = NULL;
|
||||
col->collision_flags1 &= ~4;
|
||||
}
|
||||
|
||||
int ClObjTris_OCCClear(GAME_PLAY* play, ClObj_c* col)
|
||||
{
|
||||
|
||||
ClObjTris_c* tris = (ClObjTris_c*)col;
|
||||
ClObjTrisElem_c* triselem;
|
||||
|
||||
ClObj_OCCClear(play, &tris->collision_obj);
|
||||
|
||||
for (triselem = tris->elements; triselem < &tris->elements[tris->count]; triselem++)
|
||||
{
|
||||
|
||||
ClObjTrisElem_OCCClear(play, triselem);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int CollisionCheck_setOCC(GAME_PLAY* play, CollisionCheck_c* colcheck, ClObj_c* col)
|
||||
{
|
||||
|
||||
int ret;
|
||||
|
||||
if (_Game_play_isPause(play) == 1)
|
||||
{
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ((col->collision_type == 0) || (col->collision_type == 1))
|
||||
{
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
OCCClearFunctionTable[col->collision_type](play, col);
|
||||
|
||||
if ((col->owner_actor != NULL) && (col->owner_actor->mv_proc == NULL))
|
||||
{
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (mco_work.count >= 10)
|
||||
{
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (colcheck->flags & 1)
|
||||
{
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
ret = mco_work.count;
|
||||
mco_work.colliders[mco_work.count] = col;
|
||||
mco_work.count++;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void CollisionCheck_Status_ct(Status_c* status)
|
||||
{
|
||||
|
||||
static Status_c status_org = {{0.0f, 0.0f, 0.0f}, 10, 10, 0, 50, 8, 0, 0, 0};
|
||||
|
||||
*status = status_org;
|
||||
}
|
||||
|
||||
void CollisionCheck_Status_Clear(Status_c* status)
|
||||
{
|
||||
|
||||
status->damage = 0;
|
||||
status->damage_effect = 0;
|
||||
status->at_hit_effect = 0;
|
||||
status->ac_hit_effect = 0;
|
||||
status->collision_vec.z = 0.0f;
|
||||
status->collision_vec.y = 0.0f;
|
||||
status->collision_vec.x = 0.0f;
|
||||
}
|
||||
|
||||
void CollisionCheck_Status_set3(Status_c* status, StatusData_c* data)
|
||||
{
|
||||
|
||||
status->hp = data->health;
|
||||
status->radius = data->radius;
|
||||
status->height = data->height;
|
||||
status->offset = data->offset;
|
||||
status->weight = data->weight;
|
||||
}
|
||||
|
||||
int CollisionCheck_Uty_ActorWorldPosSetPipeC(ACTOR* actor, ClObjPipe_c* pipe)
|
||||
{
|
||||
|
||||
pipe->attribute.pipe.center.x = actor->world.position.x;
|
||||
pipe->attribute.pipe.center.y = actor->world.position.y;
|
||||
pipe->attribute.pipe.center.z = actor->world.position.z;
|
||||
}
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
#include "m_common_data.h"
|
||||
#include "m_private.h"
|
||||
#include "lb_rtc.h"
|
||||
#include "m_scene.h"
|
||||
#include "m_scene_table.h"
|
||||
#include "m_malloc.h"
|
||||
#include "libjsys/jsyswrapper.h"
|
||||
|
||||
|
||||
+8
-7
@@ -3,6 +3,7 @@
|
||||
#include "libc64/malloc.h"
|
||||
#include "libc64/sleep.h"
|
||||
#include "libultra/gu.h"
|
||||
#include "m_play.h"
|
||||
|
||||
Gfx fbdemo_gfx_init[] = {
|
||||
gsDPPipeSync(),
|
||||
@@ -19,7 +20,7 @@ Gfx fbdemo_gfx_init[] = {
|
||||
gsSPEndDisplayList(),
|
||||
};
|
||||
|
||||
extern void fbdemo_init_gfx(fbdemo* this) {
|
||||
extern void fbdemo_init_gfx(fbdemo_c* this) {
|
||||
int col;
|
||||
int col2;
|
||||
int colTex;
|
||||
@@ -87,7 +88,7 @@ extern void fbdemo_init_gfx(fbdemo* this) {
|
||||
gSPEndDisplayList(gfx++);
|
||||
}
|
||||
|
||||
extern void fbdemo_init_data(fbdemo* this) {
|
||||
extern void fbdemo_init_data(fbdemo_c* this) {
|
||||
int col;
|
||||
int row;
|
||||
|
||||
@@ -99,7 +100,7 @@ extern void fbdemo_init_data(fbdemo* this) {
|
||||
}
|
||||
}
|
||||
|
||||
extern void fbdemo_cleanup(fbdemo* this) {
|
||||
extern void fbdemo_cleanup(fbdemo_c* this) {
|
||||
msleep(100);
|
||||
|
||||
if (this->vtxData != NULL) {
|
||||
@@ -120,7 +121,7 @@ extern void fbdemo_cleanup(fbdemo* this) {
|
||||
}
|
||||
}
|
||||
|
||||
extern fbdemo* fbdemo_init(fbdemo* this, int cols, int rows) {
|
||||
extern fbdemo_c* fbdemo_init(fbdemo_c* this, int cols, int rows) {
|
||||
s32 gridsize;
|
||||
|
||||
bzero(this, sizeof(fbdemo));
|
||||
@@ -168,7 +169,7 @@ extern fbdemo* fbdemo_init(fbdemo* this, int cols, int rows) {
|
||||
return this;
|
||||
}
|
||||
|
||||
extern void fbdemo_update(fbdemo* this) {
|
||||
extern void fbdemo_update(fbdemo_c* this) {
|
||||
int col;
|
||||
int row;
|
||||
Vtx* vtx;
|
||||
@@ -186,7 +187,7 @@ extern void fbdemo_update(fbdemo* this) {
|
||||
}
|
||||
}
|
||||
|
||||
void fbdemo_draw(fbdemo* this, Gfx** gfxP) {
|
||||
void fbdemo_draw(fbdemo_c* this, Gfx** gfxP) {
|
||||
Gfx* gfx = *gfxP;
|
||||
|
||||
gSPDisplayList(gfx++, fbdemo_gfx_init);
|
||||
@@ -204,4 +205,4 @@ void fbdemo_draw(fbdemo* this, Gfx** gfxP) {
|
||||
*gfxP = gfx;
|
||||
}
|
||||
|
||||
extern void fbdemo_move(fbdemo* this) {}
|
||||
extern void fbdemo_move(fbdemo_c* this) {}
|
||||
|
||||
+1
-1
@@ -9,7 +9,7 @@
|
||||
|
||||
int fuusen_DEBUG_mode_flag;
|
||||
|
||||
extern void Balloon_init() {
|
||||
extern void Balloon_init(GAME_PLAY*) {
|
||||
Common_Set(balloon_state, Balloon_STATE_DEAD);
|
||||
Common_Set(balloon_last_spawn_min, 0);
|
||||
Common_Set(balloon_spawn_percent, 0.05f);
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
#include "m_name_table.h"
|
||||
#include "m_room_type.h"
|
||||
#include "m_scene.h"
|
||||
#include "m_scene_table.h"
|
||||
#include "m_common_data.h"
|
||||
|
||||
extern int mMmd_FossilInfo(int fossil_no) {
|
||||
|
||||
+1018
File diff suppressed because it is too large
Load Diff
@@ -14,6 +14,7 @@
|
||||
#include "m_play.h"
|
||||
#include "libultra/libultra.h"
|
||||
#include "m_common_data.h"
|
||||
#include "m_scene_table.h"
|
||||
|
||||
static int mPO_keep_contents(Mail_c* mail) {
|
||||
int res = FALSE;
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
#include "m_collision_bg.h"
|
||||
#include "m_field_info.h"
|
||||
#include "m_common_data.h"
|
||||
#include "m_scene.h"
|
||||
#include "m_scene_table.h"
|
||||
|
||||
extern void mRF_MakeRandomField(mFM_combination_c* combi_table, mFM_combo_info_c* combo_info, int combo_count, GAME* game) {
|
||||
mRF_MakeRandomField_ovl(combi_table, combo_info, combo_count, game);
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@
|
||||
#include "m_kabu_manager.h"
|
||||
#include "m_font.h"
|
||||
#include "m_time.h"
|
||||
#include "m_scene.h"
|
||||
#include "m_scene_table.h"
|
||||
#include "m_controller.h"
|
||||
#include "m_kankyo.h"
|
||||
#include "audio.h"
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#include "m_font.h"
|
||||
#include "m_field_info.h"
|
||||
#include "m_field_make.h"
|
||||
#include "m_scene.h"
|
||||
#include "m_scene_table.h"
|
||||
#include "libultra/libultra.h"
|
||||
#include "m_cockroach.h"
|
||||
#include "m_melody.h"
|
||||
|
||||
+1
-1
@@ -40,7 +40,7 @@ extern int mTD_demono_get() {
|
||||
return S_now_demono;
|
||||
}
|
||||
|
||||
static void mTD_player_keydata_init(GAME_PLAY* play) {
|
||||
extern void mTD_player_keydata_init(GAME_PLAY* play) {
|
||||
PLAYER_ACTOR* player = get_player_actor_withoutCheck(play);
|
||||
|
||||
if (mEv_CheckTitleDemo() > 0) {
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
#include "m_trademark.h"
|
||||
|
||||
#include "m_scene.h"
|
||||
#include "m_scene_table.h"
|
||||
#include "m_name_table.h"
|
||||
#include "m_npc.h"
|
||||
#include "m_kankyo.h"
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
#include "m_room_type.h"
|
||||
#include "m_msg.h"
|
||||
#include "audio.h"
|
||||
#include "m_scene.h"
|
||||
#include "m_scene_table.h"
|
||||
#include "m_private.h"
|
||||
|
||||
typedef struct watch_my_step_s {
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
#include "libc64/sprintf.h"
|
||||
|
||||
#include "libultra/xprintf.h"
|
||||
#include "_mem.h"
|
||||
|
||||
|
||||
static void* proutPrintf(void* dst, const char* fmt, size_t size) {
|
||||
return (void*)((u8*)memcpy(dst, fmt, size) + size);
|
||||
}
|
||||
|
||||
+3
-3
@@ -1,10 +1,10 @@
|
||||
#include "types.h"
|
||||
#include "version.h"
|
||||
|
||||
u8 __Creator__[] = {
|
||||
char __Creator__[] = {
|
||||
#include "assets/__Creator__.inc"
|
||||
};
|
||||
|
||||
u8 __DateTime__[] = {
|
||||
char __DateTime__[] = {
|
||||
#include "assets/__DateTime__.inc"
|
||||
};
|
||||
|
||||
|
||||
+1
-1
Submodule tools/ppcdis updated: ef5a43f0e0...b49c7feb30
Reference in New Issue
Block a user