Added adjustable draw distance for objects

This commit is contained in:
MysterD 2021-08-30 18:22:36 -07:00
parent f18007cd34
commit 92692378b4
28 changed files with 275 additions and 443 deletions

View file

@ -1075,15 +1075,11 @@ cur_obj_update_begin:;
} else if ((objFlags & OBJ_FLAG_COMPUTE_DIST_TO_MARIO) && gCurrentObject->collisionData == NULL) { } else if ((objFlags & OBJ_FLAG_COMPUTE_DIST_TO_MARIO) && gCurrentObject->collisionData == NULL) {
if (!(objFlags & OBJ_FLAG_ACTIVE_FROM_AFAR)) { if (!(objFlags & OBJ_FLAG_ACTIVE_FROM_AFAR)) {
// If the object has a render distance, check if it should be shown. // If the object has a render distance, check if it should be shown.
#ifndef NODRAWINGDISTANCE if (distanceFromMario > gCurrentObject->oDrawingDistance * draw_distance_scalar()) {
if (distanceFromMario > gCurrentObject->oDrawingDistance) {
// Out of render distance, hide the object. // Out of render distance, hide the object.
gCurrentObject->header.gfx.node.flags &= ~GRAPH_RENDER_ACTIVE; gCurrentObject->header.gfx.node.flags &= ~GRAPH_RENDER_ACTIVE;
gCurrentObject->activeFlags |= ACTIVE_FLAG_FAR_AWAY; gCurrentObject->activeFlags |= ACTIVE_FLAG_FAR_AWAY;
} else if (gCurrentObject->oHeldState == HELD_FREE) { } else if (gCurrentObject->oHeldState == HELD_FREE) {
#else
if (distanceFromMario <= gCurrentObject->oDrawingDistance && gCurrentObject->oHeldState == HELD_FREE) {
#endif
// In render distance (and not being held), show the object. // In render distance (and not being held), show the object.
gCurrentObject->header.gfx.node.flags |= GRAPH_RENDER_ACTIVE; gCurrentObject->header.gfx.node.flags |= GRAPH_RENDER_ACTIVE;
gCurrentObject->activeFlags &= ~ACTIVE_FLAG_FAR_AWAY; gCurrentObject->activeFlags &= ~ACTIVE_FLAG_FAR_AWAY;
@ -1123,3 +1119,14 @@ f32 position_based_random_float_position(void) {
u8 cur_obj_is_last_nat_update_per_frame(void) { u8 cur_obj_is_last_nat_update_per_frame(void) {
return (gCurrentObject->areaTimer == (gNetworkAreaTimer - 1)); return (gCurrentObject->areaTimer == (gNetworkAreaTimer - 1));
} }
f32 draw_distance_scalar(void) {
switch (configDrawDistance) {
case 0: return 0.5f;
case 1: return 1.0f;
case 2: return 1.5f;
case 3: return 3.0f;
case 4: return 10.0f;
default: return 999.0f;
}
}

View file

@ -26,10 +26,10 @@ s32 random_sign(void);
void stub_behavior_script_2(void); void stub_behavior_script_2(void);
void cur_obj_update(void); void cur_obj_update(void);
void cur_obj_fake_update(void);
u16 position_based_random_u16(void); u16 position_based_random_u16(void);
f32 position_based_random_float_position(void); f32 position_based_random_float_position(void);
u8 cur_obj_is_last_nat_update_per_frame(void); u8 cur_obj_is_last_nat_update_per_frame(void);
f32 draw_distance_scalar(void);
#endif // BEHAVIOR_SCRIPT_H #endif // BEHAVIOR_SCRIPT_H

View file

@ -795,18 +795,10 @@ void load_object_collision_model(void) {
} }
} }
#ifndef NODRAWINGDISTANCE f32 marioDist = dist_between_objects(gCurrentObject, gMarioStates[0].marioObj);
u8 anyPlayerInDrawRange = FALSE; if (marioDist < gCurrentObject->oDrawingDistance * draw_distance_scalar()) {
for (int i = 0; i < MAX_PLAYERS; i++) {
f32 dist = dist_between_objects(gCurrentObject, gMarioStates[i].marioObj);
if (dist < gCurrentObject->oDrawingDistance) { anyPlayerInDrawRange = TRUE; }
}
if (anyPlayerInDrawRange) {
#endif
gCurrentObject->header.gfx.node.flags |= GRAPH_RENDER_ACTIVE; gCurrentObject->header.gfx.node.flags |= GRAPH_RENDER_ACTIVE;
#ifndef NODRAWINGDISTANCE
} else { } else {
gCurrentObject->header.gfx.node.flags &= ~GRAPH_RENDER_ACTIVE; gCurrentObject->header.gfx.node.flags &= ~GRAPH_RENDER_ACTIVE;
} }
#endif
} }

View file

@ -8,25 +8,12 @@
void bub_spawner_act_0(void) { void bub_spawner_act_0(void) {
s32 i; s32 i;
s32 sp18 = o->oBirdChirpChirpUnkF4; s32 sp18 = o->oBirdChirpChirpUnkF4;
#ifndef NODRAWINGDISTANCE for (i = 0; i < sp18; i++)
struct Object* player = nearest_player_to_object(o); spawn_object(o, MODEL_BUB, bhvBub);
int distanceToPlayer = dist_between_objects(o, player); o->oAction = 1;
if (distanceToPlayer < 1500.0f) {
#endif
for (i = 0; i < sp18; i++)
spawn_object(o, MODEL_BUB, bhvBub);
o->oAction = 1;
#ifndef NODRAWINGDISTANCE
}
#endif
} }
void bub_spawner_act_1(void) { void bub_spawner_act_1(void) {
#ifndef NODRAWINGDISTANCE
struct Object* player = nearest_player_to_object(o);
if (player->oPosY - o->oPosY > 2000.0f)
o->oAction = 2;
#endif
} }
void bub_spawner_act_2(void) { void bub_spawner_act_2(void) {

View file

@ -53,41 +53,33 @@ static void chain_chomp_act_uninitialized(void) {
struct ChainSegment *segments; struct ChainSegment *segments;
s32 i; s32 i;
#ifndef NODRAWINGDISTANCE segments = mem_pool_alloc(gObjectMemoryPool, 5 * sizeof(struct ChainSegment));
struct Object* player = nearest_player_to_object(o); if (segments != NULL) {
int distanceToPlayer = dist_between_objects(o, player); // Each segment represents the offset of a chain part to the pivot.
if (distanceToPlayer < 3000.0f) { // Segment 0 connects the pivot to the chain chomp itself. Segment
#endif // 1 connects the pivot to the chain part next to the chain chomp
segments = mem_pool_alloc(gObjectMemoryPool, 5 * sizeof(struct ChainSegment)); // (chain part 1), etc.
if (segments != NULL) { o->oChainChompSegments = segments;
// Each segment represents the offset of a chain part to the pivot. for (i = 0; i <= 4; i++) {
// Segment 0 connects the pivot to the chain chomp itself. Segment chain_segment_init(&segments[i]);
// 1 connects the pivot to the chain part next to the chain chomp }
// (chain part 1), etc.
o->oChainChompSegments = segments; cur_obj_set_pos_to_home();
for (i = 0; i <= 4; i++) {
chain_segment_init(&segments[i]); // Spawn the pivot and set to parent
} if ((o->parentObj =
spawn_object(o, CHAIN_CHOMP_CHAIN_PART_BP_PIVOT, bhvChainChompChainPart))
cur_obj_set_pos_to_home(); != NULL) {
// Spawn the non-pivot chain parts, starting from the chain
// Spawn the pivot and set to parent // chomp and moving toward the pivot
if ((o->parentObj = for (i = 1; i <= 4; i++) {
spawn_object(o, CHAIN_CHOMP_CHAIN_PART_BP_PIVOT, bhvChainChompChainPart)) spawn_object_relative(i, 0, 0, 0, o, MODEL_METALLIC_BALL, bhvChainChompChainPart);
!= NULL) { }
// Spawn the non-pivot chain parts, starting from the chain
// chomp and moving toward the pivot o->oAction = CHAIN_CHOMP_ACT_MOVE;
for (i = 1; i <= 4; i++) { cur_obj_unhide();
spawn_object_relative(i, 0, 0, 0, o, MODEL_METALLIC_BALL, bhvChainChompChainPart);
}
o->oAction = CHAIN_CHOMP_ACT_MOVE;
cur_obj_unhide();
}
} }
#ifndef NODRAWINGDISTANCE
} }
#endif
} }
/** /**
@ -358,100 +350,90 @@ static void chain_chomp_act_move(void) {
f32 maxDistToPivot; f32 maxDistToPivot;
// Unload chain if mario is far enough // Unload chain if mario is far enough
#ifndef NODRAWINGDISTANCE cur_obj_update_floor_and_walls();
struct Object* player = nearest_player_to_object(o);
int distanceToPlayer = dist_between_objects(o, player);
if (o->oChainChompReleaseStatus == CHAIN_CHOMP_NOT_RELEASED && distanceToPlayer > 4000.0f) {
o->oAction = CHAIN_CHOMP_ACT_UNLOAD_CHAIN;
o->oForwardVel = o->oVelY = 0.0f;
} else {
#endif
cur_obj_update_floor_and_walls();
switch (o->oChainChompReleaseStatus) { switch (o->oChainChompReleaseStatus) {
case CHAIN_CHOMP_NOT_RELEASED: case CHAIN_CHOMP_NOT_RELEASED:
switch (o->oSubAction) { switch (o->oSubAction) {
case CHAIN_CHOMP_SUB_ACT_TURN: case CHAIN_CHOMP_SUB_ACT_TURN:
chain_chomp_sub_act_turn(); chain_chomp_sub_act_turn();
break; break;
case CHAIN_CHOMP_SUB_ACT_LUNGE: case CHAIN_CHOMP_SUB_ACT_LUNGE:
chain_chomp_sub_act_lunge(); chain_chomp_sub_act_lunge();
break; break;
}
break;
case CHAIN_CHOMP_RELEASED_TRIGGER_CUTSCENE:
chain_chomp_released_trigger_cutscene();
break;
case CHAIN_CHOMP_RELEASED_LUNGE_AROUND:
chain_chomp_released_lunge_around();
break;
case CHAIN_CHOMP_RELEASED_BREAK_GATE:
chain_chomp_released_break_gate();
break;
case CHAIN_CHOMP_RELEASED_JUMP_AWAY:
chain_chomp_released_jump_away();
break;
case CHAIN_CHOMP_RELEASED_END_CUTSCENE:
chain_chomp_released_end_cutscene();
break;
}
cur_obj_move_standard(78);
// Segment 0 connects the pivot to the chain chomp itself
o->oChainChompSegments[0].posX = o->oPosX - o->parentObj->oPosX;
o->oChainChompSegments[0].posY = o->oPosY - o->parentObj->oPosY;
o->oChainChompSegments[0].posZ = o->oPosZ - o->parentObj->oPosZ;
o->oChainChompDistToPivot =
sqrtf(o->oChainChompSegments[0].posX * o->oChainChompSegments[0].posX
+ o->oChainChompSegments[0].posY * o->oChainChompSegments[0].posY
+ o->oChainChompSegments[0].posZ * o->oChainChompSegments[0].posZ);
// If the chain is fully stretched
maxDistToPivot = o->oChainChompMaxDistFromPivotPerChainPart * 5;
if (o->oChainChompDistToPivot > maxDistToPivot) {
f32 ratio = maxDistToPivot / o->oChainChompDistToPivot;
o->oChainChompDistToPivot = maxDistToPivot;
o->oChainChompSegments[0].posX *= ratio;
o->oChainChompSegments[0].posY *= ratio;
o->oChainChompSegments[0].posZ *= ratio;
if (o->oChainChompReleaseStatus == CHAIN_CHOMP_NOT_RELEASED) {
// Restrict chain chomp position
o->oPosX = o->parentObj->oPosX + o->oChainChompSegments[0].posX;
o->oPosY = o->parentObj->oPosY + o->oChainChompSegments[0].posY;
o->oPosZ = o->parentObj->oPosZ + o->oChainChompSegments[0].posZ;
o->oChainChompRestrictedByChain = TRUE;
} else {
// Move pivot like the chain chomp is pulling it along
f32 oldPivotY = o->parentObj->oPosY;
o->parentObj->oPosX = o->oPosX - o->oChainChompSegments[0].posX;
o->parentObj->oPosY = o->oPosY - o->oChainChompSegments[0].posY;
o->parentObj->oVelY = o->parentObj->oPosY - oldPivotY;
o->parentObj->oPosZ = o->oPosZ - o->oChainChompSegments[0].posZ;
} }
} else { break;
o->oChainChompRestrictedByChain = FALSE; case CHAIN_CHOMP_RELEASED_TRIGGER_CUTSCENE:
} chain_chomp_released_trigger_cutscene();
break;
chain_chomp_update_chain_segments(); case CHAIN_CHOMP_RELEASED_LUNGE_AROUND:
chain_chomp_released_lunge_around();
// Begin a lunge if mario tries to attack break;
if (obj_check_attacks(&sChainChompHitbox, o->oAction)) { case CHAIN_CHOMP_RELEASED_BREAK_GATE:
o->oSubAction = CHAIN_CHOMP_SUB_ACT_LUNGE; chain_chomp_released_break_gate();
o->oChainChompMaxDistFromPivotPerChainPart = 900.0f / 5; break;
o->oForwardVel = 0.0f; case CHAIN_CHOMP_RELEASED_JUMP_AWAY:
o->oVelY = 300.0f; chain_chomp_released_jump_away();
o->oGravity = -4.0f; break;
o->oChainChompTargetPitch = -0x3000; case CHAIN_CHOMP_RELEASED_END_CUTSCENE:
} chain_chomp_released_end_cutscene();
#ifndef NODRAWINGDISTANCE break;
} }
#endif
cur_obj_move_standard(78);
// Segment 0 connects the pivot to the chain chomp itself
o->oChainChompSegments[0].posX = o->oPosX - o->parentObj->oPosX;
o->oChainChompSegments[0].posY = o->oPosY - o->parentObj->oPosY;
o->oChainChompSegments[0].posZ = o->oPosZ - o->parentObj->oPosZ;
o->oChainChompDistToPivot =
sqrtf(o->oChainChompSegments[0].posX * o->oChainChompSegments[0].posX
+ o->oChainChompSegments[0].posY * o->oChainChompSegments[0].posY
+ o->oChainChompSegments[0].posZ * o->oChainChompSegments[0].posZ);
// If the chain is fully stretched
maxDistToPivot = o->oChainChompMaxDistFromPivotPerChainPart * 5;
if (o->oChainChompDistToPivot > maxDistToPivot) {
f32 ratio = maxDistToPivot / o->oChainChompDistToPivot;
o->oChainChompDistToPivot = maxDistToPivot;
o->oChainChompSegments[0].posX *= ratio;
o->oChainChompSegments[0].posY *= ratio;
o->oChainChompSegments[0].posZ *= ratio;
if (o->oChainChompReleaseStatus == CHAIN_CHOMP_NOT_RELEASED) {
// Restrict chain chomp position
o->oPosX = o->parentObj->oPosX + o->oChainChompSegments[0].posX;
o->oPosY = o->parentObj->oPosY + o->oChainChompSegments[0].posY;
o->oPosZ = o->parentObj->oPosZ + o->oChainChompSegments[0].posZ;
o->oChainChompRestrictedByChain = TRUE;
} else {
// Move pivot like the chain chomp is pulling it along
f32 oldPivotY = o->parentObj->oPosY;
o->parentObj->oPosX = o->oPosX - o->oChainChompSegments[0].posX;
o->parentObj->oPosY = o->oPosY - o->oChainChompSegments[0].posY;
o->parentObj->oVelY = o->parentObj->oPosY - oldPivotY;
o->parentObj->oPosZ = o->oPosZ - o->oChainChompSegments[0].posZ;
}
} else {
o->oChainChompRestrictedByChain = FALSE;
}
chain_chomp_update_chain_segments();
// Begin a lunge if mario tries to attack
if (obj_check_attacks(&sChainChompHitbox, o->oAction)) {
o->oSubAction = CHAIN_CHOMP_SUB_ACT_LUNGE;
o->oChainChompMaxDistFromPivotPerChainPart = 900.0f / 5;
o->oForwardVel = 0.0f;
o->oVelY = 300.0f;
o->oGravity = -4.0f;
o->oChainChompTargetPitch = -0x3000;
}
if (o->oChainChompReleaseStatus != CHAIN_CHOMP_NOT_RELEASED) { if (o->oChainChompReleaseStatus != CHAIN_CHOMP_NOT_RELEASED) {
cur_obj_become_intangible(); cur_obj_become_intangible();
} }

View file

@ -47,16 +47,8 @@ static void cloud_act_spawn_parts(void) {
* Wait for mario to approach, then unhide and enter the spawn parts action. * Wait for mario to approach, then unhide and enter the spawn parts action.
*/ */
static void cloud_act_fwoosh_hidden(void) { static void cloud_act_fwoosh_hidden(void) {
#ifndef NODRAWINGDISTANCE cur_obj_unhide();
struct Object* player = nearest_player_to_object(o); o->oAction = CLOUD_ACT_SPAWN_PARTS;
int distanceToPlayer = dist_between_objects(o, player);
if (distanceToPlayer < 2000.0f) {
#endif
cur_obj_unhide();
o->oAction = CLOUD_ACT_SPAWN_PARTS;
#ifndef NODRAWINGDISTANCE
}
#endif
} }
/** /**
@ -77,48 +69,40 @@ static void cloud_fwoosh_update(void) {
struct Object* player = nearest_player_to_object(o); struct Object* player = nearest_player_to_object(o);
int distanceToPlayer = dist_between_objects(o, player); int distanceToPlayer = dist_between_objects(o, player);
#ifndef NODRAWINGDISTANCE if (o->oCloudBlowing) {
if (distanceToPlayer > 2500.0f) { o->header.gfx.scale[0] += o->oCloudGrowSpeed;
o->oAction = CLOUD_ACT_UNLOAD;
} else {
#endif
if (o->oCloudBlowing) {
o->header.gfx.scale[0] += o->oCloudGrowSpeed;
if ((o->oCloudGrowSpeed -= 0.005f) < -0.16f) { if ((o->oCloudGrowSpeed -= 0.005f) < -0.16f) {
// Stop blowing once we are shrinking faster than -0.16 // Stop blowing once we are shrinking faster than -0.16
o->oCloudBlowing = o->oTimer = 0; o->oCloudBlowing = o->oTimer = 0;
} else if (o->oCloudGrowSpeed < -0.1f) { } else if (o->oCloudGrowSpeed < -0.1f) {
// Start blowing once we start shrinking faster than -0.1 // Start blowing once we start shrinking faster than -0.1
cur_obj_play_sound_1(SOUND_AIR_BLOW_WIND); cur_obj_play_sound_1(SOUND_AIR_BLOW_WIND);
cur_obj_spawn_strong_wind_particles(12, 3.0f, 0.0f, -50.0f, 120.0f); cur_obj_spawn_strong_wind_particles(12, 3.0f, 0.0f, -50.0f, 120.0f);
} else { } else {
cur_obj_play_sound_1(SOUND_ENV_WIND1); cur_obj_play_sound_1(SOUND_ENV_WIND1);
}
} else {
// Return to normal size
approach_f32_ptr(&o->header.gfx.scale[0], 3.0f, 0.012f);
o->oCloudFwooshMovementRadius += 0xC8;
// If mario stays nearby for 100 frames, begin blowing
if (distanceToPlayer < 1000.0f) {
if (o->oTimer > 100) {
o->oCloudBlowing = TRUE;
o->oCloudGrowSpeed = 0.14f;
} }
} else { } else {
// Return to normal size o->oTimer = 0;
approach_f32_ptr(&o->header.gfx.scale[0], 3.0f, 0.012f);
o->oCloudFwooshMovementRadius += 0xC8;
// If mario stays nearby for 100 frames, begin blowing
if (distanceToPlayer < 1000.0f) {
if (o->oTimer > 100) {
o->oCloudBlowing = TRUE;
o->oCloudGrowSpeed = 0.14f;
}
} else {
o->oTimer = 0;
}
o->oCloudCenterX = o->oHomeX + 100.0f * coss(o->oCloudFwooshMovementRadius);
o->oPosZ = o->oHomeZ + 100.0f * sins(o->oCloudFwooshMovementRadius);
o->oCloudCenterY = o->oHomeY;
} }
cur_obj_scale(o->header.gfx.scale[0]); o->oCloudCenterX = o->oHomeX + 100.0f * coss(o->oCloudFwooshMovementRadius);
#ifndef NODRAWINGDISTANCE o->oPosZ = o->oHomeZ + 100.0f * sins(o->oCloudFwooshMovementRadius);
o->oCloudCenterY = o->oHomeY;
} }
#endif
cur_obj_scale(o->header.gfx.scale[0]);
} }
/** /**

View file

@ -186,23 +186,13 @@ void bhv_coin_formation_loop(void) {
s32 bitIndex; s32 bitIndex;
switch (o->oAction) { switch (o->oAction) {
case 0: case 0:
#ifndef NODRAWINGDISTANCE for (bitIndex = 0; bitIndex < 8; bitIndex++) {
if (o->oDistanceToMario < 2000.0f) { if (!(o->oCoinUnkF4 & (1 << bitIndex)))
#endif spawn_coin_in_formation(bitIndex, o->oBehParams2ndByte);
for (bitIndex = 0; bitIndex < 8; bitIndex++) {
if (!(o->oCoinUnkF4 & (1 << bitIndex)))
spawn_coin_in_formation(bitIndex, o->oBehParams2ndByte);
}
o->oAction++;
#ifndef NODRAWINGDISTANCE
} }
#endif o->oAction++;
break; break;
case 1: case 1:
#ifndef NODRAWINGDISTANCE
if (o->oDistanceToMario > 2100.0f)
o->oAction++;
#endif
break; break;
case 2: case 2:
o->oAction = 0; o->oAction = 0;

View file

@ -24,18 +24,10 @@ static struct ObjectHitbox sEnemyLakituHitbox = {
* Wait for mario to approach, then spawn the cloud and become visible. * Wait for mario to approach, then spawn the cloud and become visible.
*/ */
static void enemy_lakitu_act_uninitialized(void) { static void enemy_lakitu_act_uninitialized(void) {
#ifndef NODRAWINGDISTANCE spawn_object_relative_with_scale(CLOUD_BP_LAKITU_CLOUD, 0, 0, 0, 2.0f, o, MODEL_MIST, bhvCloud);
struct Object* player = nearest_player_to_object(o);
int distanceToPlayer = dist_between_objects(o, player);
if (distanceToPlayer < 2000.0f) {
#endif
spawn_object_relative_with_scale(CLOUD_BP_LAKITU_CLOUD, 0, 0, 0, 2.0f, o, MODEL_MIST, bhvCloud);
cur_obj_unhide(); cur_obj_unhide();
o->oAction = ENEMY_LAKITU_ACT_MAIN; o->oAction = ENEMY_LAKITU_ACT_MAIN;
#ifndef NODRAWINGDISTANCE
}
#endif
} }
/** /**

View file

@ -12,29 +12,28 @@ void fish_act_spawn(void) {
s32 i; s32 i;
s32 schoolQuantity; s32 schoolQuantity;
s16 model; s16 model;
f32 minDistToMario;
const struct Animation * const*fishAnimation; const struct Animation * const*fishAnimation;
struct Object *fishObject; struct Object *fishObject;
switch (o->oBehParams2ndByte) { switch (o->oBehParams2ndByte) {
// Blue fish with a quanitiy of twenty. // Blue fish with a quanitiy of twenty.
case 0: case 0:
model = MODEL_FISH; schoolQuantity = 20; minDistToMario = 1500.0f; fishAnimation = blue_fish_seg3_anims_0301C2B0; model = MODEL_FISH; schoolQuantity = 20; fishAnimation = blue_fish_seg3_anims_0301C2B0;
break; break;
// Blue fish with a quanitiy of five. // Blue fish with a quanitiy of five.
case 1: case 1:
model = MODEL_FISH; schoolQuantity = 5; minDistToMario = 1500.0f; fishAnimation = blue_fish_seg3_anims_0301C2B0; model = MODEL_FISH; schoolQuantity = 5; fishAnimation = blue_fish_seg3_anims_0301C2B0;
break; break;
// Cyan fish with a quanitiy of twenty. // Cyan fish with a quanitiy of twenty.
case 2: case 2:
model = MODEL_CYAN_FISH; schoolQuantity = 20; minDistToMario = 1500.0f; fishAnimation = cyan_fish_seg6_anims_0600E264; model = MODEL_CYAN_FISH; schoolQuantity = 20; fishAnimation = cyan_fish_seg6_anims_0600E264;
break; break;
// Cyan fish with a quanitiy of five. // Cyan fish with a quanitiy of five.
case 3: case 3:
model = MODEL_CYAN_FISH; schoolQuantity = 5; minDistToMario = 1500.0f; fishAnimation = cyan_fish_seg6_anims_0600E264; model = MODEL_CYAN_FISH; schoolQuantity = 5; fishAnimation = cyan_fish_seg6_anims_0600E264;
break; break;
} }
/** /**
@ -42,24 +41,13 @@ void fish_act_spawn(void) {
* If the current level is Secret Aquarium, ignore this requirement. * If the current level is Secret Aquarium, ignore this requirement.
* Fish moves at random with a max-range of 700.0f. * Fish moves at random with a max-range of 700.0f.
*/ */
#ifndef NODRAWINGDISTANCE for (i = 0; i < schoolQuantity; i++) {
struct Object* player = nearest_player_to_object(o); fishObject = spawn_object(o, model, bhvFish);
int distanceToPlayer = dist_between_objects(o, player); fishObject->oBehParams2ndByte = o->oBehParams2ndByte;
if (distanceToPlayer < minDistToMario || gCurrLevelNum == LEVEL_SA) { obj_init_animation_with_sound(fishObject, fishAnimation, 0);
#else obj_translate_xyz_random(fishObject, 700.0f);
// get rid of warning
minDistToMario = minDistToMario;
#endif
for (i = 0; i < schoolQuantity; i++) {
fishObject = spawn_object(o, model, bhvFish);
fishObject->oBehParams2ndByte = o->oBehParams2ndByte;
obj_init_animation_with_sound(fishObject, fishAnimation, 0);
obj_translate_xyz_random(fishObject, 700.0f);
}
o->oAction = FISH_ACT_ACTIVE;
#ifndef NODRAWINGDISTANCE
} }
#endif o->oAction = FISH_ACT_ACTIVE;
} }
/** /**
@ -67,14 +55,15 @@ void fish_act_spawn(void) {
* Y coordinate is greater than 2000.0f then spawn another fish. * Y coordinate is greater than 2000.0f then spawn another fish.
*/ */
void fish_act_respawn(void) { void fish_act_respawn(void) {
#ifndef NODRAWINGDISTANCE // TODO: should this be re-enabled?
/*#ifndef NODRAWINGDISTANCE
if (gCurrLevelNum != LEVEL_SA) { if (gCurrLevelNum != LEVEL_SA) {
struct Object* player = nearest_player_to_object(o); struct Object* player = nearest_player_to_object(o);
if (player->oPosY - o->oPosY > 2000.0f) { if (player->oPosY - o->oPosY > 2000.0f) {
o->oAction = FISH_ACT_RESPAWN; o->oAction = FISH_ACT_RESPAWN;
} }
} }
#endif #endif*/
} }
/** /**

View file

@ -78,35 +78,25 @@ void bhv_goomba_triplet_spawner_update(void) {
// If mario is close enough and the goombas aren't currently loaded, then // If mario is close enough and the goombas aren't currently loaded, then
// spawn them // spawn them
if (o->oAction == GOOMBA_TRIPLET_SPAWNER_ACT_UNLOADED) { if (o->oAction == GOOMBA_TRIPLET_SPAWNER_ACT_UNLOADED) {
#ifndef NODRAWINGDISTANCE // The spawner is capable of spawning more than 3 goombas, but this
if (dist_between_objects(o, player) < 3000.0f) { // is not used in the game
#endif dAngle =
// The spawner is capable of spawning more than 3 goombas, but this 0x10000
// is not used in the game / (((o->oBehParams2ndByte & GOOMBA_TRIPLET_SPAWNER_BP_EXTRA_GOOMBAS_MASK) >> 2) + 3);
dAngle =
0x10000
/ (((o->oBehParams2ndByte & GOOMBA_TRIPLET_SPAWNER_BP_EXTRA_GOOMBAS_MASK) >> 2) + 3);
for (angle = 0, goombaFlag = 1 << 8; angle < 0xFFFF; angle += dAngle, goombaFlag <<= 1) { for (angle = 0, goombaFlag = 1 << 8; angle < 0xFFFF; angle += dAngle, goombaFlag <<= 1) {
// Only spawn goombas which haven't been killed yet // Only spawn goombas which haven't been killed yet
if (!(o->oBehParams & goombaFlag)) { if (!(o->oBehParams & goombaFlag)) {
dx = 500.0f * coss(angle); dx = 500.0f * coss(angle);
dz = 500.0f * sins(angle); dz = 500.0f * sins(angle);
spawn_object_relative((o->oBehParams2ndByte & GOOMBA_TRIPLET_SPAWNER_BP_SIZE_MASK) spawn_object_relative((o->oBehParams2ndByte & GOOMBA_TRIPLET_SPAWNER_BP_SIZE_MASK)
| (goombaFlag >> 6), | (goombaFlag >> 6),
dx, 0, dz, o, MODEL_GOOMBA, bhvGoomba); dx, 0, dz, o, MODEL_GOOMBA, bhvGoomba);
}
} }
o->oAction += 1;
#ifndef NODRAWINGDISTANCE
} }
} else if (dist_between_objects(o, player) > 4000.0f) {
// If mario is too far away, enter the unloaded action. The goombas o->oAction += 1;
// will detect this and unload themselves
o->oAction = GOOMBA_TRIPLET_SPAWNER_ACT_UNLOADED;
#endif
} }
} }

View file

@ -77,13 +77,7 @@ void heave_ho_act_3(void) {
} }
void heave_ho_act_0(void) { void heave_ho_act_0(void) {
#ifndef NODRAWINGDISTANCE
struct Object* player = nearest_player_to_object(o);
int distanceToPlayer = dist_between_objects(o, player);
if (find_water_level(o->oPosX, o->oPosZ) < o->oPosY && distanceToPlayer < 4000.0f) {
#else
if (find_water_level(o->oPosX, o->oPosZ) < (o->oPosY - 50.0f)) { if (find_water_level(o->oPosX, o->oPosZ) < (o->oPosY - 50.0f)) {
#endif
cur_obj_set_pos_to_home(); cur_obj_set_pos_to_home();
cur_obj_become_tangible(); cur_obj_become_tangible();
cur_obj_unhide(); cur_obj_unhide();

View file

@ -350,16 +350,11 @@ void king_bobomb_move(void) {
cur_obj_move_using_fvel_and_gravity(); cur_obj_move_using_fvel_and_gravity();
cur_obj_call_action_function(sKingBobombActions); cur_obj_call_action_function(sKingBobombActions);
exec_anim_sound_state(sKingBobombSoundStates); exec_anim_sound_state(sKingBobombSoundStates);
#ifndef NODRAWINGDISTANCE int distanceToPlayer = dist_between_objects(o, gMarioStates[0].marioObj);
struct Object* player = nearest_player_to_object(o); if (distanceToPlayer < 5000.0f * draw_distance_scalar())
int distanceToPlayer = dist_between_objects(o, player);
if (distanceToPlayer < 5000.0f)
#endif
cur_obj_enable_rendering(); cur_obj_enable_rendering();
#ifndef NODRAWINGDISTANCE
else else
cur_obj_disable_rendering(); cur_obj_disable_rendering();
#endif
} }
u8 king_bobomb_ignore_if_true(void) { u8 king_bobomb_ignore_if_true(void) {

View file

@ -19,24 +19,14 @@ void bhv_lll_floating_wood_bridge_loop(void) {
s32 i; s32 i;
switch (o->oAction) { switch (o->oAction) {
case 0: case 0:
#ifndef NODRAWINGDISTANCE for (i = 1; i < 4; i++) {
if (o->oDistanceToMario < 2500.0f) { sp3C = spawn_object_relative(0, (i - 2) * 300, 0, 0, o, MODEL_LLL_WOOD_BRIDGE,
#endif bhvLllWoodPiece);
for (i = 1; i < 4; i++) { sp3C->oLllWoodPieceOscillationTimer = i * 4096;
sp3C = spawn_object_relative(0, (i - 2) * 300, 0, 0, o, MODEL_LLL_WOOD_BRIDGE,
bhvLllWoodPiece);
sp3C->oLllWoodPieceOscillationTimer = i * 4096;
}
o->oAction = 1;
#ifndef NODRAWINGDISTANCE
} }
#endif o->oAction = 1;
break; break;
case 1: case 1:
#ifndef NODRAWINGDISTANCE
if (o->oDistanceToMario > 2600.0f)
o->oAction = 2;
#endif
break; break;
case 2: case 2:
o->oAction = 0; o->oAction = 0;

View file

@ -30,10 +30,7 @@ void fire_bar_spawn_flames(s16 a0) {
} }
void fire_bar_act_0(void) { void fire_bar_act_0(void) {
#ifndef NODRAWINGDISTANCE o->oAction = 1;
if (o->oDistanceToMario < 3000.0f)
#endif
o->oAction = 1;
} }
void fire_bar_act_1(void) { void fire_bar_act_1(void) {
@ -47,10 +44,6 @@ void fire_bar_act_1(void) {
void fire_bar_act_2(void) { void fire_bar_act_2(void) {
o->oAngleVelYaw = -0x100; o->oAngleVelYaw = -0x100;
o->oMoveAngleYaw += o->oAngleVelYaw; o->oMoveAngleYaw += o->oAngleVelYaw;
#ifndef NODRAWINGDISTANCE
if (o->oDistanceToMario > 3200.0f)
o->oAction = 3;
#endif
} }
void fire_bar_act_3(void) { void fire_bar_act_3(void) {

View file

@ -369,15 +369,14 @@ void bhv_piranha_plant_loop(void) {
cur_obj_set_hurtbox_radius_and_height(150.0f, 100.0f); cur_obj_set_hurtbox_radius_and_height(150.0f, 100.0f);
cur_obj_call_action_function(TablePiranhaPlantActions); cur_obj_call_action_function(TablePiranhaPlantActions);
#ifndef NODRAWINGDISTANCE
// In WF, hide all Piranha Plants once high enough up. // In WF, hide all Piranha Plants once high enough up.
if (gCurrLevelNum == LEVEL_WF) { if (gCurrLevelNum == LEVEL_WF) {
struct Object* player = nearest_player_to_object(o); struct Object* player = gMarioStates[0].marioObj;
if (player->oPosY > 3400.0f) f32 scalar = max(draw_distance_scalar(), 1.0f);
if (player->oPosY > 3400.0f * scalar)
cur_obj_hide(); cur_obj_hide();
else else
cur_obj_unhide(); cur_obj_unhide();
} }
#endif
o->oInteractStatus = 0; o->oInteractStatus = 0;
} }

View file

@ -171,30 +171,25 @@ static void pokey_act_uninitialized(void) {
s32 i; s32 i;
s16 partModel; s16 partModel;
#ifndef NODRAWINGDISTANCE partModel = MODEL_POKEY_HEAD;
if (o->oDistanceToMario < 2000.0f) {
#endif
partModel = MODEL_POKEY_HEAD;
for (i = 0; i < 5; i++) { for (i = 0; i < 5; i++) {
// Spawn body parts at y offsets 480, 360, 240, 120, 0 // Spawn body parts at y offsets 480, 360, 240, 120, 0
// behavior param 0 = head, 4 = lowest body part // behavior param 0 = head, 4 = lowest body part
bodyPart = spawn_object_relative(i, 0, -i * 120 + 480, 0, o, partModel, bhvPokeyBodyPart); bodyPart = spawn_object_relative(i, 0, -i * 120 + 480, 0, o, partModel, bhvPokeyBodyPart);
if (bodyPart != NULL) { if (bodyPart != NULL) {
obj_scale(bodyPart, 3.0f); obj_scale(bodyPart, 3.0f);
}
partModel = MODEL_POKEY_BODY_PART;
} }
o->oPokeyAliveBodyPartFlags = 0x1F; partModel = MODEL_POKEY_BODY_PART;
o->oPokeyNumAliveBodyParts = 5;
o->oPokeyBottomBodyPartSize = 1.0f;
o->oAction = POKEY_ACT_WANDER;
#ifndef NODRAWINGDISTANCE
} }
#endif
o->oPokeyAliveBodyPartFlags = 0x1F;
o->oPokeyNumAliveBodyParts = 5;
o->oPokeyBottomBodyPartSize = 1.0f;
o->oAction = POKEY_ACT_WANDER;
if (!network_sync_object_initialized(o)) { if (!network_sync_object_initialized(o)) {
struct SyncObject* so = network_init_object(o, 4000.0f); struct SyncObject* so = network_init_object(o, 4000.0f);
network_init_object_field(o, &o->oPokeyAliveBodyPartFlags); network_init_object_field(o, &o->oPokeyAliveBodyPartFlags);
@ -224,11 +219,6 @@ static void pokey_act_wander(void) {
if (o->oPokeyNumAliveBodyParts == 0) { if (o->oPokeyNumAliveBodyParts == 0) {
obj_mark_for_deletion(o); obj_mark_for_deletion(o);
#ifndef NODRAWINGDISTANCE
} else if (o->oDistanceToMario > 2500.0f) {
o->oAction = POKEY_ACT_UNLOAD_PARTS;
o->oForwardVel = 0.0f;
#endif
} else { } else {
treat_far_home_as_mario(1000.0f); treat_far_home_as_mario(1000.0f);
cur_obj_update_floor_and_walls(); cur_obj_update_floor_and_walls();

View file

@ -108,9 +108,7 @@ void bhv_sl_walking_penguin_loop(void) {
} }
cur_obj_move_standard(-78); cur_obj_move_standard(-78);
#ifndef NODRAWINGDISTANCE if (!cur_obj_hide_if_mario_far_away_y(1000.0f))
if (!cur_obj_hide_if_mario_far_away_y(1000.0f))
#endif
play_penguin_walking_sound(PENGUIN_WALK_BIG); play_penguin_walking_sound(PENGUIN_WALK_BIG);
// Adjust the position to get a point better lined up with the visual model, for stopping the wind. // Adjust the position to get a point better lined up with the visual model, for stopping the wind.

View file

@ -210,11 +210,7 @@ void bhv_snufit_loop(void) {
*/ */
void bhv_snufit_balls_loop(void) { void bhv_snufit_balls_loop(void) {
// If far from Mario or in a different room, despawn. // If far from Mario or in a different room, despawn.
if ((o->activeFlags & ACTIVE_FLAG_IN_DIFFERENT_ROOM) if (o->activeFlags & ACTIVE_FLAG_IN_DIFFERENT_ROOM) {
#ifndef NODRAWINGDISTANCE
|| (o->oTimer != 0 && o->oDistanceToMario > 1500.0f)
#endif
){
obj_mark_for_deletion(o); obj_mark_for_deletion(o);
} }

View file

@ -54,39 +54,31 @@ static void triplet_butterfly_act_init(void) {
} }
static void triplet_butterfly_act_wander(void) { static void triplet_butterfly_act_wander(void) {
#ifndef NODRAWINGDISTANCE approach_f32_ptr(&o->oTripletButterflySpeed, 8.0f, 0.5f);
if (o->oDistanceToMario > 1500.0f) { if (o->oTimer < 60) {
obj_mark_for_deletion(o); o->oTripletButterflyTargetYaw = cur_obj_angle_to_home();
} else { } else {
#endif o->oTripletButterflyTargetYaw = (s32) o->oTripletButterflyBaseYaw;
approach_f32_ptr(&o->oTripletButterflySpeed, 8.0f, 0.5f);
if (o->oTimer < 60) {
o->oTripletButterflyTargetYaw = cur_obj_angle_to_home();
} else {
o->oTripletButterflyTargetYaw = (s32) o->oTripletButterflyBaseYaw;
if (o->oTimer > 110 && o->oDistanceToMario < 200.0f if (o->oTimer > 110 && o->oDistanceToMario < 200.0f
&& o->oTripletButterflyType > TRIPLET_BUTTERFLY_TYPE_NORMAL) { && o->oTripletButterflyType > TRIPLET_BUTTERFLY_TYPE_NORMAL) {
o->oAction = TRIPLET_BUTTERFLY_ACT_ACTIVATE; o->oAction = TRIPLET_BUTTERFLY_ACT_ACTIVATE;
o->oTripletButterflySpeed = 0.0f; o->oTripletButterflySpeed = 0.0f;
}
} }
if (o->oHomeY < o->oFloorHeight) {
o->oHomeY = o->oFloorHeight;
}
if (o->oPosY < o->oHomeY + random_linear_offset(50, 50)) {
o->oTripletButterflyTargetPitch = -0x2000;
} else {
o->oTripletButterflyTargetPitch = 0x2000;
}
obj_move_pitch_approach(o->oTripletButterflyTargetPitch, 400);
cur_obj_rotate_yaw_toward(o->oTripletButterflyTargetYaw, random_linear_offset(400, 800));
#ifndef NODRAWINGDISTANCE
} }
#endif
if (o->oHomeY < o->oFloorHeight) {
o->oHomeY = o->oFloorHeight;
}
if (o->oPosY < o->oHomeY + random_linear_offset(50, 50)) {
o->oTripletButterflyTargetPitch = -0x2000;
} else {
o->oTripletButterflyTargetPitch = 0x2000;
}
obj_move_pitch_approach(o->oTripletButterflyTargetPitch, 400);
cur_obj_rotate_yaw_toward(o->oTripletButterflyTargetYaw, random_linear_offset(400, 800));
} }
static void triplet_butterfly_act_activate(void) { static void triplet_butterfly_act_activate(void) {

View file

@ -38,31 +38,15 @@ void bhv_bubble_cannon_barrel_loop(void) {
} }
void water_bomb_cannon_act_0(void) { void water_bomb_cannon_act_0(void) {
#ifndef NODRAWINGDISTANCE spawn_object(o, MODEL_CANNON_BARREL, bhvCannonBarrelBubbles);
struct Object* player = nearest_player_to_object(o); cur_obj_unhide();
int distanceToPlayer = dist_between_objects(o, player);
if (distanceToPlayer < 2000.0f) {
#endif
spawn_object(o, MODEL_CANNON_BARREL, bhvCannonBarrelBubbles);
cur_obj_unhide();
o->oAction = 1; o->oAction = 1;
o->oMoveAnglePitch = o->oWaterCannonUnkFC = 0x1C00; o->oMoveAnglePitch = o->oWaterCannonUnkFC = 0x1C00;
#ifndef NODRAWINGDISTANCE
}
#endif
} }
void water_bomb_cannon_act_1(void) { void water_bomb_cannon_act_1(void) {
#ifndef NODRAWINGDISTANCE
struct Object* player = nearest_player_to_object(o);
int distanceToPlayer = dist_between_objects(o, player);
if (distanceToPlayer > 2500.0f) {
o->oAction = 2;
} else if (o->oBehParams2ndByte == 0) {
#else
if (o->oBehParams2ndByte == 0) { if (o->oBehParams2ndByte == 0) {
#endif
if (o->oWaterCannonUnkF4 != 0) { if (o->oWaterCannonUnkF4 != 0) {
o->oWaterCannonUnkF4 -= 1; o->oWaterCannonUnkF4 -= 1;
} else { } else {

View file

@ -44,31 +44,27 @@ void bhv_whirlpool_loop(void) {
o->oWhirlpoolTimeout = 30; o->oWhirlpoolTimeout = 30;
} }
#ifndef NODRAWINGDISTANCE f32 marioDist = dist_between_objects(o, gMarioStates[0].marioObj);
if (o->oDistanceToMario < 5000.0f) { if (marioDist < 5000.0f * draw_distance_scalar()) {
#endif
o->header.gfx.node.flags &= ~GRAPH_RENDER_INVISIBLE; o->header.gfx.node.flags &= ~GRAPH_RENDER_INVISIBLE;
// not sure if actually an array
gEnvFxBubbleConfig[ENVFX_STATE_PARTICLECOUNT] = 60;
gEnvFxBubbleConfig[ENVFX_STATE_SRC_X] = o->oPosX;
gEnvFxBubbleConfig[ENVFX_STATE_SRC_Z] = o->oPosZ;
gEnvFxBubbleConfig[ENVFX_STATE_DEST_X] = o->oPosX;
gEnvFxBubbleConfig[ENVFX_STATE_DEST_Y] = o->oPosY;
gEnvFxBubbleConfig[ENVFX_STATE_DEST_Z] = o->oPosZ;
gEnvFxBubbleConfig[ENVFX_STATE_SRC_Y] = o->oPosY + 800.0f;
gEnvFxBubbleConfig[ENVFX_STATE_PITCH] = o->oWhirlpoolInitFacePitch;
gEnvFxBubbleConfig[ENVFX_STATE_YAW] = o->oWhirlpoolInitFaceRoll;
whirpool_orient_graph();
o->oFaceAngleYaw += 0x1F40;
#ifndef NODRAWINGDISTANCE
} else { } else {
o->header.gfx.node.flags |= GRAPH_RENDER_INVISIBLE; o->header.gfx.node.flags |= GRAPH_RENDER_INVISIBLE;
gEnvFxBubbleConfig[ENVFX_STATE_PARTICLECOUNT] = 0;
} }
#endif
// not sure if actually an array
gEnvFxBubbleConfig[ENVFX_STATE_PARTICLECOUNT] = 60;
gEnvFxBubbleConfig[ENVFX_STATE_SRC_X] = o->oPosX;
gEnvFxBubbleConfig[ENVFX_STATE_SRC_Z] = o->oPosZ;
gEnvFxBubbleConfig[ENVFX_STATE_DEST_X] = o->oPosX;
gEnvFxBubbleConfig[ENVFX_STATE_DEST_Y] = o->oPosY;
gEnvFxBubbleConfig[ENVFX_STATE_DEST_Z] = o->oPosZ;
gEnvFxBubbleConfig[ENVFX_STATE_SRC_Y] = o->oPosY + 800.0f;
gEnvFxBubbleConfig[ENVFX_STATE_PITCH] = o->oWhirlpoolInitFacePitch;
gEnvFxBubbleConfig[ENVFX_STATE_YAW] = o->oWhirlpoolInitFaceRoll;
whirpool_orient_graph();
o->oFaceAngleYaw += 0x1F40;
cur_obj_play_sound_1(SOUND_ENV_WATER); cur_obj_play_sound_1(SOUND_ENV_WATER);
@ -76,7 +72,8 @@ void bhv_whirlpool_loop(void) {
} }
void bhv_jet_stream_loop(void) { void bhv_jet_stream_loop(void) {
if (o->oDistanceToMario < 5000.0f) { f32 marioDist = dist_between_objects(o, gMarioStates[0].marioObj);
if (marioDist < 5000.0f) {
gEnvFxBubbleConfig[ENVFX_STATE_PARTICLECOUNT] = 60; gEnvFxBubbleConfig[ENVFX_STATE_PARTICLECOUNT] = 60;
gEnvFxBubbleConfig[ENVFX_STATE_SRC_X] = o->oPosX; gEnvFxBubbleConfig[ENVFX_STATE_SRC_X] = o->oPosX;
gEnvFxBubbleConfig[ENVFX_STATE_SRC_Y] = o->oPosY; gEnvFxBubbleConfig[ENVFX_STATE_SRC_Y] = o->oPosY;

View file

@ -280,14 +280,12 @@ void bhv_whomp_loop(void) {
cur_obj_call_action_function(sWhompActions); cur_obj_call_action_function(sWhompActions);
cur_obj_move_standard(-20); cur_obj_move_standard(-20);
if (o->oAction != 9) { if (o->oAction != 9) {
#ifndef NODRAWINGDISTANCE
// o->oBehParams2ndByte here seems to be a flag // o->oBehParams2ndByte here seems to be a flag
// indicating whether this is a normal or king whomp // indicating whether this is a normal or king whomp
if (o->oBehParams2ndByte != 0) if (o->oBehParams2ndByte != 0)
cur_obj_hide_if_mario_far_away_y(2000.0f); cur_obj_hide_if_mario_far_away_y(2000.0f);
else else
cur_obj_hide_if_mario_far_away_y(1000.0f); cur_obj_hide_if_mario_far_away_y(1000.0f);
#endif
load_object_collision_model(); load_object_collision_model();
} }
} }

View file

@ -585,20 +585,13 @@ s32 is_point_close_to_object(struct Object *obj, f32 x, f32 y, f32 z, s32 dist)
/** /**
* Sets an object as visible if within a certain distance of Mario's graphical position. * Sets an object as visible if within a certain distance of Mario's graphical position.
*/ */
void set_object_visibility(struct Object *obj, UNUSED s32 dist) { void set_object_visibility(struct Object *obj, s32 dist) {
#ifndef NODRAWINGDISTANCE int distanceToPlayer = dist_between_objects(obj, gMarioStates[0].marioObj);
f32 objX = obj->oPosX; if (distanceToPlayer < dist * draw_distance_scalar()) {
f32 objY = obj->oPosY;
f32 objZ = obj->oPosZ;
if (is_point_within_radius_of_mario(objX, objY, objZ, dist) == TRUE) {
#endif
obj->header.gfx.node.flags &= ~GRAPH_RENDER_INVISIBLE; obj->header.gfx.node.flags &= ~GRAPH_RENDER_INVISIBLE;
#ifndef NODRAWINGDISTANCE
} else { } else {
obj->header.gfx.node.flags |= GRAPH_RENDER_INVISIBLE; obj->header.gfx.node.flags |= GRAPH_RENDER_INVISIBLE;
} }
#endif
} }
/** /**

View file

@ -2638,12 +2638,9 @@ void cur_obj_if_hit_wall_bounce_away(void) {
} }
s32 cur_obj_hide_if_mario_far_away_y(f32 distY) { s32 cur_obj_hide_if_mario_far_away_y(f32 distY) {
for (int i = 0; i < MAX_PLAYERS; i++) { if (absf(o->oPosY - gMarioStates[0].marioObj->oPosY) < distY * draw_distance_scalar()) {
if (!is_player_active(&gMarioStates[i])) { continue; } cur_obj_unhide();
if (absf(o->oPosY - gMarioStates[i].marioObj->oPosY) < distY) { return FALSE;
cur_obj_unhide();
return FALSE;
}
} }
cur_obj_hide(); cur_obj_hide();
return TRUE; return TRUE;

View file

@ -23,12 +23,7 @@
/** /**
* The maximum number of objects that can be loaded at once. * The maximum number of objects that can be loaded at once.
*/ */
#ifdef NODRAWINGDISTANCE
#define OBJECT_POOL_CAPACITY 960 #define OBJECT_POOL_CAPACITY 960
#else
#define OBJECT_POOL_CAPACITY 240
#endif
/** /**
* Every object is categorized into an object list, which controls the order * Every object is categorized into an object list, which controls the order

View file

@ -111,6 +111,7 @@ char configPlayerName[MAX_PLAYER_STRING] = "";
unsigned int configPlayerModel = 0; unsigned int configPlayerModel = 0;
unsigned int configPlayerPalette = 0; unsigned int configPlayerPalette = 0;
unsigned int config60Fps = 1; unsigned int config60Fps = 1;
unsigned int configDrawDistance = 5;
static const struct ConfigOption options[] = { static const struct ConfigOption options[] = {
{.name = "fullscreen", .type = CONFIG_TYPE_BOOL, .boolValue = &configWindow.fullscreen}, {.name = "fullscreen", .type = CONFIG_TYPE_BOOL, .boolValue = &configWindow.fullscreen},
@ -175,6 +176,7 @@ static const struct ConfigOption options[] = {
{.name = "coop_player_model", .type = CONFIG_TYPE_UINT , .uintValue = &configPlayerModel}, {.name = "coop_player_model", .type = CONFIG_TYPE_UINT , .uintValue = &configPlayerModel},
{.name = "coop_player_palette", .type = CONFIG_TYPE_UINT , .uintValue = &configPlayerPalette}, {.name = "coop_player_palette", .type = CONFIG_TYPE_UINT , .uintValue = &configPlayerPalette},
{.name = "coop_60fps", .type = CONFIG_TYPE_UINT , .uintValue = &config60Fps}, {.name = "coop_60fps", .type = CONFIG_TYPE_UINT , .uintValue = &config60Fps},
{.name = "coop_draw_distance", .type = CONFIG_TYPE_UINT , .uintValue = &configDrawDistance},
}; };
// Reads an entire line from a file (excluding the newline character) and returns an allocated string // Reads an entire line from a file (excluding the newline character) and returns an allocated string

View file

@ -78,6 +78,7 @@ extern char configPlayerName[];
extern unsigned int configPlayerModel; extern unsigned int configPlayerModel;
extern unsigned int configPlayerPalette; extern unsigned int configPlayerPalette;
extern unsigned int config60Fps; extern unsigned int config60Fps;
extern unsigned int configDrawDistance;
void configfile_load(const char *filename); void configfile_load(const char *filename);
void configfile_save(const char *filename); void configfile_save(const char *filename);

View file

@ -7,7 +7,7 @@ static void djui_panel_display_apply(UNUSED struct DjuiBase* caller) {
} }
void djui_panel_display_create(struct DjuiBase* caller) { void djui_panel_display_create(struct DjuiBase* caller) {
f32 bodyHeight = 32 * 6 + 64 * 1 + 16 * 5; f32 bodyHeight = 32 * 7 + 64 * 1 + 16 * 6;
struct DjuiBase* defaultBase = NULL; struct DjuiBase* defaultBase = NULL;
struct DjuiThreePanel* panel = djui_panel_menu_create(bodyHeight, "\\#ff0800\\D\\#1be700\\I\\#00b3ff\\S\\#ffef00\\P\\#ff0800\\L\\#1be700\\A\\#00b3ff\\Y"); struct DjuiThreePanel* panel = djui_panel_menu_create(bodyHeight, "\\#ff0800\\D\\#1be700\\I\\#00b3ff\\S\\#ffef00\\P\\#ff0800\\L\\#1be700\\A\\#00b3ff\\Y");
@ -39,6 +39,11 @@ void djui_panel_display_create(struct DjuiBase* caller) {
djui_base_set_size_type(&selectionbox2->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); djui_base_set_size_type(&selectionbox2->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE);
djui_base_set_size(&selectionbox2->base, 1.0f, 32); djui_base_set_size(&selectionbox2->base, 1.0f, 32);
char* drawDistanceChoices[6] = { "0.5x", "1x", "1.5x", "3x", "10x", "100x" };
struct DjuiSelectionbox* selectionbox3 = djui_selectionbox_create(&body->base, "Draw Distance", drawDistanceChoices, 6, &configDrawDistance);
djui_base_set_size_type(&selectionbox3->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE);
djui_base_set_size(&selectionbox3->base, 1.0f, 32);
struct DjuiButton* button6 = djui_button_create(&body->base, "Back"); struct DjuiButton* button6 = djui_button_create(&body->base, "Back");
djui_base_set_size_type(&button6->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); djui_base_set_size_type(&button6->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE);
djui_base_set_size(&button6->base, 1.0f, 64); djui_base_set_size(&button6->base, 1.0f, 64);