2019-08-25 04:46:40 +00:00
|
|
|
// tower_platform.c.inc
|
|
|
|
|
|
|
|
void bhv_wf_solid_tower_platform_loop(void) {
|
2020-08-12 06:03:13 +00:00
|
|
|
if (o->parentObj->oAction == 1) {
|
|
|
|
cur_obj_become_tangible();
|
|
|
|
o->header.gfx.node.flags &= ~GRAPH_RENDER_INVISIBLE;
|
|
|
|
} else if (o->parentObj->oAction > 1) {
|
|
|
|
cur_obj_become_intangible();
|
|
|
|
o->header.gfx.node.flags |= GRAPH_RENDER_INVISIBLE;
|
|
|
|
}
|
2019-08-25 04:46:40 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void bhv_wf_elevator_tower_platform_loop(void) {
|
2020-08-12 06:03:13 +00:00
|
|
|
if (o->oSyncID == 0) {
|
|
|
|
network_init_object(o, SYNC_DISTANCE_ONLY_EVENTS);
|
|
|
|
network_init_object_field(o, &o->oAction);
|
|
|
|
network_init_object_field(o, &o->oPosY);
|
|
|
|
network_init_object_field(o, &o->oTimer);
|
|
|
|
}
|
|
|
|
|
2019-08-25 04:46:40 +00:00
|
|
|
switch (o->oAction) {
|
|
|
|
case 0:
|
2020-08-12 06:03:13 +00:00
|
|
|
if (gMarioObject->platform == o) {
|
2019-08-25 04:46:40 +00:00
|
|
|
o->oAction++;
|
2020-08-12 06:03:13 +00:00
|
|
|
network_send_object(o);
|
|
|
|
}
|
2019-08-25 04:46:40 +00:00
|
|
|
break;
|
|
|
|
case 1:
|
2020-03-02 03:42:52 +00:00
|
|
|
cur_obj_play_sound_1(SOUND_ENV_ELEVATOR1);
|
2019-08-25 04:46:40 +00:00
|
|
|
if (o->oTimer > 140)
|
|
|
|
o->oAction++;
|
|
|
|
else
|
|
|
|
o->oPosY += 5.0f;
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
if (o->oTimer > 60)
|
|
|
|
o->oAction++;
|
|
|
|
break;
|
|
|
|
case 3:
|
2020-03-02 03:42:52 +00:00
|
|
|
cur_obj_play_sound_1(SOUND_ENV_ELEVATOR1);
|
2019-08-25 04:46:40 +00:00
|
|
|
if (o->oTimer > 140)
|
|
|
|
o->oAction = 0;
|
|
|
|
else
|
|
|
|
o->oPosY -= 5.0f;
|
|
|
|
break;
|
|
|
|
}
|
2020-08-12 06:03:13 +00:00
|
|
|
|
|
|
|
if (o->parentObj->oAction == 1) {
|
|
|
|
cur_obj_become_tangible();
|
|
|
|
o->header.gfx.node.flags &= ~GRAPH_RENDER_INVISIBLE;
|
|
|
|
} else if (o->parentObj->oAction > 1) {
|
|
|
|
cur_obj_become_intangible();
|
|
|
|
o->header.gfx.node.flags |= GRAPH_RENDER_INVISIBLE;
|
|
|
|
}
|
2019-08-25 04:46:40 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void bhv_wf_sliding_tower_platform_loop(void) {
|
2020-08-12 06:03:13 +00:00
|
|
|
if (o->oSyncID == 0) {
|
|
|
|
network_init_object(o, SYNC_DISTANCE_ONLY_EVENTS);
|
|
|
|
network_init_object_field(o, &o->oAction);
|
|
|
|
network_init_object_field(o, &o->oForwardVel);
|
|
|
|
network_init_object_field(o, &o->oPosX);
|
|
|
|
network_init_object_field(o, &o->oPosZ);
|
|
|
|
network_init_object_field(o, &o->oTimer);
|
|
|
|
}
|
|
|
|
|
2019-08-25 04:46:40 +00:00
|
|
|
s32 sp24 = o->oPlatformUnk110 / o->oPlatformUnk10C;
|
|
|
|
switch (o->oAction) {
|
|
|
|
case 0:
|
|
|
|
o->oForwardVel = -o->oPlatformUnk10C;
|
2020-08-12 06:03:13 +00:00
|
|
|
if (network_owns_object(o) && o->oTimer > sp24) {
|
|
|
|
o->oAction++;
|
|
|
|
network_send_object(o);
|
|
|
|
}
|
|
|
|
if (!network_owns_object(o) && o->oTimer > sp24) { o->oForwardVel = 0; }
|
2019-08-25 04:46:40 +00:00
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
if (o->oTimer > sp24)
|
|
|
|
o->oAction = 0;
|
|
|
|
o->oForwardVel = o->oPlatformUnk10C;
|
|
|
|
break;
|
|
|
|
}
|
2020-03-02 03:42:52 +00:00
|
|
|
cur_obj_compute_vel_xz();
|
2019-08-25 04:46:40 +00:00
|
|
|
o->oPosX += o->oVelX;
|
|
|
|
o->oPosZ += o->oVelZ;
|
2020-08-12 06:03:13 +00:00
|
|
|
|
|
|
|
if (o->parentObj->oAction == 1) {
|
|
|
|
cur_obj_become_tangible();
|
|
|
|
o->header.gfx.node.flags &= ~GRAPH_RENDER_INVISIBLE;
|
|
|
|
} else if (o->parentObj->oAction > 1) {
|
|
|
|
cur_obj_become_intangible();
|
|
|
|
o->header.gfx.node.flags |= GRAPH_RENDER_INVISIBLE;
|
|
|
|
}
|
2019-08-25 04:46:40 +00:00
|
|
|
}
|
|
|
|
|
2020-04-03 18:57:26 +00:00
|
|
|
void spawn_and_init_wf_platforms(s16 a, const BehaviorScript *bhv) {
|
2019-08-25 04:46:40 +00:00
|
|
|
s16 yaw;
|
2020-04-03 18:57:26 +00:00
|
|
|
struct Object *platform = spawn_object(o, a, bhv);
|
2019-08-25 04:46:40 +00:00
|
|
|
yaw = o->oPlatformSpawnerUnkF4 * o->oPlatformSpawnerUnkFC + o->oPlatformSpawnerUnkF8;
|
|
|
|
platform->oMoveAngleYaw = yaw;
|
|
|
|
platform->oPosX += o->oPlatformSpawnerUnk100 * sins(yaw);
|
|
|
|
platform->oPosY += 100 * o->oPlatformSpawnerUnkF4;
|
|
|
|
platform->oPosZ += o->oPlatformSpawnerUnk100 * coss(yaw);
|
|
|
|
platform->oPlatformUnk110 = o->oPlatformSpawnerUnk104;
|
|
|
|
platform->oPlatformUnk10C = o->oPlatformSpawnerUnk108;
|
|
|
|
o->oPlatformSpawnerUnkF4++;
|
|
|
|
}
|
|
|
|
|
2020-03-02 03:42:52 +00:00
|
|
|
void spawn_wf_platform_group(void) {
|
2019-08-25 04:46:40 +00:00
|
|
|
UNUSED s32 unused = 8;
|
|
|
|
o->oPlatformSpawnerUnkF4 = 0;
|
|
|
|
o->oPlatformSpawnerUnkF8 = 0;
|
|
|
|
o->oPlatformSpawnerUnkFC = 0x2000;
|
|
|
|
o->oPlatformSpawnerUnk100 = 704.0f;
|
|
|
|
o->oPlatformSpawnerUnk104 = 380.0f;
|
|
|
|
o->oPlatformSpawnerUnk108 = 3.0f;
|
2020-03-02 03:42:52 +00:00
|
|
|
spawn_and_init_wf_platforms(MODEL_WF_TOWER_SQUARE_PLATORM, bhvWfSolidTowerPlatform);
|
|
|
|
spawn_and_init_wf_platforms(MODEL_WF_TOWER_SQUARE_PLATORM, bhvWfSlidingTowerPlatform);
|
|
|
|
spawn_and_init_wf_platforms(MODEL_WF_TOWER_SQUARE_PLATORM, bhvWfSolidTowerPlatform);
|
|
|
|
spawn_and_init_wf_platforms(MODEL_WF_TOWER_SQUARE_PLATORM, bhvWfSlidingTowerPlatform);
|
|
|
|
spawn_and_init_wf_platforms(MODEL_WF_TOWER_SQUARE_PLATORM, bhvWfSolidTowerPlatform);
|
|
|
|
spawn_and_init_wf_platforms(MODEL_WF_TOWER_SQUARE_PLATORM, bhvWfSlidingTowerPlatform);
|
|
|
|
spawn_and_init_wf_platforms(MODEL_WF_TOWER_SQUARE_PLATORM, bhvWfSolidTowerPlatform);
|
|
|
|
spawn_and_init_wf_platforms(MODEL_WF_TOWER_SQUARE_PLATORM_ELEVATOR, bhvWfElevatorTowerPlatform);
|
2019-08-25 04:46:40 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void bhv_tower_platform_group_loop(void) {
|
2020-08-12 06:03:13 +00:00
|
|
|
static u8 spawnedPlatforms = FALSE;
|
|
|
|
if (!spawnedPlatforms) { spawn_wf_platform_group(); spawnedPlatforms = TRUE; }
|
|
|
|
|
|
|
|
u8 anyPlayerInRange = FALSE;
|
|
|
|
for (int i = 0; i < MAX_PLAYERS; i++) {
|
|
|
|
if (gMarioStates[i].marioObj->oPosY > o->oHomeY - 1000.0f) { anyPlayerInRange = TRUE; }
|
|
|
|
}
|
|
|
|
|
2019-08-25 04:46:40 +00:00
|
|
|
switch (o->oAction) {
|
|
|
|
case 0:
|
2020-08-12 06:03:13 +00:00
|
|
|
if (anyPlayerInRange) { o->oAction++; }
|
2019-08-25 04:46:40 +00:00
|
|
|
break;
|
|
|
|
case 1:
|
2020-08-12 06:03:13 +00:00
|
|
|
if (!anyPlayerInRange) { o->oAction++; }
|
2019-08-25 04:46:40 +00:00
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
case 3:
|
2020-08-12 06:03:13 +00:00
|
|
|
case 4:
|
|
|
|
o->oAction++;
|
|
|
|
break;
|
|
|
|
case 5:
|
2019-08-25 04:46:40 +00:00
|
|
|
o->oAction = 0;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|