Add flags for collision object/collision check

This commit is contained in:
Cuyler36
2025-06-10 23:12:22 -04:00
parent 623abef0c3
commit f13e592af9
6 changed files with 213 additions and 398 deletions
+25 -1
View File
@@ -18,7 +18,31 @@ enum collision_type {
ClObj_TYPE_NUM
};
#define ClObj_FLAG_COLLIDED (1 << 1)
#define CollisionCheck_FLAG_SKIP (1 << 0)
#define ClObj_GROUP_PLAYER (1 << 3) // 0x08
#define ClObj_GROUP_2 (1 << 4) // 0x10
#define ClObj_GROUP_3 (1 << 5) // 0x20
#define ClObj_GROUP_ALL (ClObj_GROUP_PLAYER | ClObj_GROUP_2 | ClObj_GROUP_3) // 0x38
#define ClObj_FLAG_CHECK (1 << 0) // 0x01
#define ClObj_FLAG_COLLIDED (1 << 1) // 0x02
#define ClObj_FLAG_DONT_UPDATE_POS (1 << 2) // 0x04
#define ClObj_FLAG_COLLIDE_PLAYER ClObj_GROUP_PLAYER
#define ClObj_FLAG_COLLIDE_GROUP_2 ClObj_GROUP_2
#define ClObj_FLAG_COLLIDE_GROUP_3 ClObj_GROUP_3
#define ClObj_FLAG_COLLISION_PRIORITY (1 << 6)
#define ClObj_FLAG_7 (1 << 7)
#define ClObj_FLAG2_PLAYER_WAS_HIT (1 << 0) // 0x01
#define ClObj_FLAG2_OCC_CHECK (1 << 1) // 0x02
#define ClObj_FLAG2_TRIS_HIT (1 << 2) // 0x04
#define ClObj_FLAG2_IS_PLAYER ClObj_GROUP_PLAYER
#define ClObj_FLAG2_IS_GROUP_2 ClObj_GROUP_2
#define ClObj_FLAG2_IS_GROUP_3 ClObj_GROUP_3
#define ClObjElem_FLAG_CHECK (1 << 0)
#define ClObjElem_FLAG_HIT (1 << 1)
#define ClObj_DID_COLLIDE(obj) ((obj).collision_flags0 & ClObj_FLAG_COLLIDED)
+1 -1
View File
@@ -13,7 +13,7 @@ static void aLOT_wait(STRUCTURE_ACTOR* actorx, GAME_PLAY* play) {
lotus = (LOTUS_ACTOR*)actorx;
comeback_status = mPlib_Check_UKI_COMEBACK_STATUS();
if (comeback_status == FALSE && (pipeinfo.collision_obj.collision_flags0 & 2) != 0 &&
if (comeback_status == FALSE && ClObj_DID_COLLIDE(pipeinfo.collision_obj) &&
pipeinfo.collision_obj.collided_actor != NULL && pipeinfo.collision_obj.collided_actor->id == mAc_PROFILE_UKI) {
lotus->structure_class.keyframe.frame_control.speed = 2.0f;
aLOT_setup_action(lotus, aLOT_ACTION_SHAKE);
+1 -1
View File
@@ -567,7 +567,7 @@ static int aNPC_avoid_obstacle(NPC_ACTOR* nactorx, GAME_PLAY* play) {
if ((nactorx->think.interrupt_flags & aNPC_THINK_INTERRUPT_OBSTACLE) != 0) {
if (ClObj_DID_COLLIDE(nactorx->collision.pipe.collision_obj)) {
if ((nactorx->collision.pipe.collision_obj.collision_flags1 & 1)) {
if ((nactorx->collision.pipe.collision_obj.collision_flags1 & ClObj_FLAG2_PLAYER_WAS_HIT)) {
s16 d_angle = nactorx->actor_class.player_angle_y - nactorx->actor_class.shape_info.rotation.y;
if (ABS(d_angle) < DEG2SHORT_ANGLE2(45.0f)) {
+3 -3
View File
@@ -691,7 +691,7 @@ static void aNSC_set_buy_sum_str(mActor_name_t item, u32 p2) {
static int aNSC_decide_next_move_act(NPC_SHOP_COMMON_ACTOR* shop_common, GAME_PLAY* play) {
int res;
ACTOR* player;
if ((shop_common->npc_class.collision.pipe.collision_obj.collision_flags0 & 0x2) != 0) {
if (ClObj_DID_COLLIDE(shop_common->npc_class.collision.pipe.collision_obj)) {
return aNSC_ACTION_WAIT;
} else {
player = GET_PLAYER_ACTOR_ACTOR(play);
@@ -736,11 +736,11 @@ static int aNSC_decide_next_move_act(NPC_SHOP_COMMON_ACTOR* shop_common, GAME_PL
if (player == NULL) {
res = shop_common->action;
} else if ((shop_common->npc_class.collision.pipe.collision_obj.collision_flags0 & 0x2) != 0 &&
} else if (ClObj_DID_COLLIDE(shop_common->npc_class.collision.pipe.collision_obj) &&
shop_common->npc_class.collision.pipe.collision_obj.collided_actor == player) {
res = aNSC_ACTION_WAIT;
} else if (talk_actor != NULL && talk_actor != (ACTOR*)shop_common && mDemo_Check_ListenAble() == TRUE &&
((shop_common->npc_class.collision.pipe.collision_obj.collision_flags0 & 2) != 0 ||
(ClObj_DID_COLLIDE(shop_common->npc_class.collision.pipe.collision_obj) ||
shop_common->action == aNSC_ACTION_WAIT)) {
res = aNSC_ACTION_WAIT;
} else if (player->world.position.z < 120.0f && (shop_common->zone == 2 || shop_common->zone == 3)) {
+181 -390
View File
File diff suppressed because it is too large Load Diff
+2 -2
View File
@@ -2045,14 +2045,14 @@ static int Player_actor_Check_OBJtoLine_forItem_axe(ACTOR* actorx) {
PLAYER_ACTOR* player = (PLAYER_ACTOR*)actorx;
ClObjTris_c* axe_tris_p = &player->item_axe_tris;
return axe_tris_p->collision_obj.collision_flags1 & (1 << 2);
return axe_tris_p->collision_obj.collision_flags1 & ClObj_FLAG2_TRIS_HIT;
}
static int Player_actor_Check_OBJtoLine_forItem_net(ACTOR* actorx, ACTOR** hit_actor) {
PLAYER_ACTOR* player = (PLAYER_ACTOR*)actorx;
ClObjTris_c* net_tris_p = &player->item_net_tris;
if ((net_tris_p->collision_obj.collision_flags1 & (1 << 2)) == 0) {
if ((net_tris_p->collision_obj.collision_flags1 & ClObj_FLAG2_TRIS_HIT) == 0) {
*hit_actor = NULL;
return FALSE;
} else {