diff --git a/autogen/lua_definitions/structs.lua b/autogen/lua_definitions/structs.lua index a96535a9c..362e7bc01 100644 --- a/autogen/lua_definitions/structs.lua +++ b/autogen/lua_definitions/structs.lua @@ -622,6 +622,7 @@ --- @field public exitCastleArea integer --- @field public exitCastleLevel LevelNum --- @field public exitCastleWarpNode integer +--- @field public fixCollisionBugs integer --- @field public metalCapDuration integer --- @field public metalCapDurationCotmc integer --- @field public pssSlideStarIndex integer @@ -1608,7 +1609,6 @@ --- @class ServerSettings --- @field public bubbleDeath integer --- @field public enableCheats integer ---- @field public fixCollisionBugs integer --- @field public headlessServer integer --- @field public playerInteractions PlayerInteractions --- @field public playerKnockbackStrength integer diff --git a/docs/lua/structs.md b/docs/lua/structs.md index f48f902a2..3647c654a 100644 --- a/docs/lua/structs.md +++ b/docs/lua/structs.md @@ -903,6 +903,7 @@ | exitCastleArea | `integer` | | | exitCastleLevel | [enum LevelNum](constants.md#enum-LevelNum) | | | exitCastleWarpNode | `integer` | | +| fixCollisionBugs | `integer` | | | metalCapDuration | `integer` | | | metalCapDurationCotmc | `integer` | | | pssSlideStarIndex | `integer` | | @@ -2023,7 +2024,6 @@ | ----- | ---- | ------ | | bubbleDeath | `integer` | | | enableCheats | `integer` | | -| fixCollisionBugs | `integer` | | | headlessServer | `integer` | | | playerInteractions | [enum PlayerInteractions](constants.md#enum-PlayerInteractions) | | | playerKnockbackStrength | `integer` | | diff --git a/mods/sm74/main.lua b/mods/sm74/main.lua index 54a4824a2..92b105982 100644 --- a/mods/sm74/main.lua +++ b/mods/sm74/main.lua @@ -29,7 +29,7 @@ gBehaviorValues.dialogs.KoopaQuickThiWinDialog = DIALOG_031 -- force server settings -- --------------------------- -gServerSettings.fixCollisionBugs = 1 +gLevelValues.fixCollisionBugs = 1 -------------- -- movtexs -- diff --git a/src/engine/surface_collision.c b/src/engine/surface_collision.c index 1f7447845..d3d7e15c0 100644 --- a/src/engine/surface_collision.c +++ b/src/engine/surface_collision.c @@ -9,6 +9,7 @@ #include "surface_load.h" #include "math_util.h" #include "game/game_init.h" +#include "game/hardcoded.h" #include "pc/utils/misc.h" #include "pc/network/network.h" @@ -133,7 +134,7 @@ static s32 find_wall_collisions_from_list(struct SurfaceNode *surfaceNode, continue; } - if (gServerSettings.fixCollisionBugs) { + if (gLevelValues.fixCollisionBugs) { // Check AABB to exclude walls before doing expensive triangle check f32 minX = MIN(MIN(surf->vertex1[0], surf->vertex2[0]), surf->vertex3[0]) - radius; f32 minZ = MIN(MIN(surf->vertex1[2], surf->vertex2[2]), surf->vertex3[2]) - radius; @@ -271,8 +272,8 @@ static s32 find_wall_collisions_from_list(struct SurfaceNode *surfaceNode, //! (Wall Overlaps) Because this doesn't update the x and z local variables, // multiple walls can push mario more than is required. - // - if (gServerSettings.fixCollisionBugs) { + // + if (gLevelValues.fixCollisionBugs) { data->x = cPos[0] + cNorm[0] * radius; data->z = cPos[2] + cNorm[2] * radius; x = data->x; @@ -378,7 +379,7 @@ static struct Surface *find_ceil_from_list(struct SurfaceNode *surfaceNode, s32 ceil = NULL; // set pheight to highest value - if (gServerSettings.fixCollisionBugs) { + if (gLevelValues.fixCollisionBugs) { *pheight = CELL_HEIGHT_LIMIT; } @@ -432,7 +433,7 @@ static struct Surface *find_ceil_from_list(struct SurfaceNode *surfaceNode, s32 height = -(x * nx + nz * z + oo) / ny; // Reject ceilings below previously found ceiling - if (gServerSettings.fixCollisionBugs && (height > *pheight)) { + if (gLevelValues.fixCollisionBugs && (height > *pheight)) { continue; } @@ -440,7 +441,7 @@ static struct Surface *find_ceil_from_list(struct SurfaceNode *surfaceNode, s32 //! (Exposed Ceilings) Because any point above a ceiling counts // as interacting with a ceiling, ceilings far below can cause // "invisible walls" that are really just exposed ceilings. - // + // if (y - (height - -78.0f) > 0.0f) { continue; } @@ -448,7 +449,7 @@ static struct Surface *find_ceil_from_list(struct SurfaceNode *surfaceNode, s32 *pheight = height; ceil = surf; - if (!gServerSettings.fixCollisionBugs) { + if (!gLevelValues.fixCollisionBugs) { break; } } @@ -456,7 +457,7 @@ static struct Surface *find_ceil_from_list(struct SurfaceNode *surfaceNode, s32 //! (Surface Cucking) Since only the first ceil is returned and not the lowest, // lower ceilings can be "cucked" by higher ceilings. - // + // return ceil; } @@ -579,7 +580,7 @@ static struct Surface *find_floor_from_list(struct SurfaceNode *surfaceNode, s32 s32 interpolate; // set pheight to lowest value - if (gServerSettings.fixCollisionBugs) { + if (gLevelValues.fixCollisionBugs) { *pheight = FLOOR_LOWER_LIMIT; } @@ -681,7 +682,7 @@ static struct Surface *find_floor_from_list(struct SurfaceNode *surfaceNode, s32 height = -(x * nx + nz * z + oo) / ny; // Find highest floor - if (gServerSettings.fixCollisionBugs && (height < *pheight)) { + if (gLevelValues.fixCollisionBugs && (height < *pheight)) { continue; } @@ -706,14 +707,14 @@ static struct Surface *find_floor_from_list(struct SurfaceNode *surfaceNode, s32 floor = surf; - if (!gServerSettings.fixCollisionBugs) { + if (!gLevelValues.fixCollisionBugs) { break; } } //! (Surface Cucking) Since only the first floor is returned and not the highest, // higher floors can be "cucked" by lower floors. - // + // return floor; } diff --git a/src/engine/surface_load.c b/src/engine/surface_load.c index aba1fd9ef..367858fb9 100644 --- a/src/engine/surface_load.c +++ b/src/engine/surface_load.c @@ -17,6 +17,7 @@ #include "game/game_init.h" #include "engine/math_util.h" #include "game/level_update.h" +#include "game/hardcoded.h" #include "pc/network/network.h" #include "pc/lua/smlua_hooks.h" @@ -153,9 +154,9 @@ static void add_surface_to_cell(s16 dynamic, s16 cellX, s16 cellZ, struct Surfac // many functions only use the first triangle in surface order that fits, // missing higher surfaces. // upperY would be a better sort method. - // + // - surfacePriority = gServerSettings.fixCollisionBugs + surfacePriority = gLevelValues.fixCollisionBugs ? (surface->upperY * sortDir) : (surface->vertex1[1] * sortDir); diff --git a/src/game/hardcoded.c b/src/game/hardcoded.c index c57069a6b..27bd8d8e1 100644 --- a/src/game/hardcoded.c +++ b/src/game/hardcoded.c @@ -41,6 +41,7 @@ extern Trajectory sThiTinyMetalBallTraj[]; //////////// struct LevelValues gDefaultLevelValues = { + .fixCollisionBugs = 0, .entryLevel = LEVEL_CASTLE_GROUNDS, .exitCastleLevel = LEVEL_CASTLE, .exitCastleArea = 1, diff --git a/src/game/hardcoded.h b/src/game/hardcoded.h index 75f3d543e..0b35b770e 100644 --- a/src/game/hardcoded.h +++ b/src/game/hardcoded.h @@ -37,6 +37,7 @@ struct StarPositions { }; struct LevelValues { + u8 fixCollisionBugs; enum LevelNum entryLevel; enum LevelNum exitCastleLevel; s16 exitCastleArea; diff --git a/src/game/interaction.c b/src/game/interaction.c index 0504c3210..4b54ded5e 100644 --- a/src/game/interaction.c +++ b/src/game/interaction.c @@ -736,10 +736,10 @@ void push_mario_out_of_object(struct MarioState *m, struct Object *o, f32 paddin if (floor != NULL) { //! Doesn't update Mario's referenced floor (allows oob death when // an object pushes you into a steep slope while in a ground action) - // + // m->pos[0] = newMarioX; m->pos[2] = newMarioZ; - if (gServerSettings.fixCollisionBugs) { + if (gLevelValues.fixCollisionBugs) { m->floorHeight = find_floor(m->pos[0], m->pos[1], m->pos[2], &m->floor); } } diff --git a/src/game/mario.c b/src/game/mario.c index d1c22e42c..118895a07 100644 --- a/src/game/mario.c +++ b/src/game/mario.c @@ -622,7 +622,7 @@ f32 vec3f_find_ceil(Vec3f pos, f32 height, struct Surface **ceil) { */ // Prevent exposed ceilings f32 vec3f_mario_ceil(Vec3f pos, f32 height, struct Surface **ceil) { - if (gServerSettings.fixCollisionBugs) { + if (gLevelValues.fixCollisionBugs) { height = MAX(height + 80.0f, pos[1] - 2); return find_ceil(pos[0], height, pos[2], ceil); } else { @@ -2275,7 +2275,7 @@ void mario_update_wall(struct MarioState* m, struct WallCollisionData* wcd) { ? wcd->walls[wcd->numWalls - 1] : NULL; - if (gServerSettings.fixCollisionBugs && wcd->normalCount > 0) { + if (gLevelValues.fixCollisionBugs && wcd->normalCount > 0) { vec3f_set(m->wallNormal, wcd->normalAddition[0] / wcd->normalCount, wcd->normalAddition[1] / wcd->normalCount, diff --git a/src/game/mario_step.c b/src/game/mario_step.c index f28a8cac6..bf8106b76 100644 --- a/src/game/mario_step.c +++ b/src/game/mario_step.c @@ -9,6 +9,7 @@ #include "interaction.h" #include "mario_step.h" #include "pc/lua/smlua.h" +#include "game/hardcoded.h" static s16 sMovingSandSpeeds[] = { 12, 8, 4, 0 }; @@ -307,7 +308,7 @@ static s32 perform_ground_quarter_step(struct MarioState *m, Vec3f nextPos) { if (upperWcd.numWalls > 0) { for (u8 i = 0; i < upperWcd.numWalls; i++) { - if (!gServerSettings.fixCollisionBugs) { + if (!gLevelValues.fixCollisionBugs) { i = (upperWcd.numWalls - 1); } struct Surface* wall = upperWcd.walls[i]; @@ -492,7 +493,7 @@ s32 perform_air_quarter_step(struct MarioState *m, Vec3f intendedPos, u32 stepAr // misalignment, you can activate these conditions in unexpected situations if ((stepArg & AIR_STEP_CHECK_LEDGE_GRAB) && upperWcd.numWalls == 0 && lowerWcd.numWalls > 0) { for (u8 i = 0; i < lowerWcd.numWalls; i++) { - if (!gServerSettings.fixCollisionBugs) { + if (!gLevelValues.fixCollisionBugs) { i = (lowerWcd.numWalls - 1); } struct Surface* wall = lowerWcd.walls[i]; @@ -515,7 +516,7 @@ s32 perform_air_quarter_step(struct MarioState *m, Vec3f intendedPos, u32 stepAr mario_update_wall(m, &upperWcd); for (u8 i = 0; i < upperWcd.numWalls; i++) { - if (!gServerSettings.fixCollisionBugs) { + if (!gLevelValues.fixCollisionBugs) { i = (upperWcd.numWalls - 1); } @@ -537,7 +538,7 @@ s32 perform_air_quarter_step(struct MarioState *m, Vec3f intendedPos, u32 stepAr mario_update_wall(m, &lowerWcd); for (u8 i = 0; i < lowerWcd.numWalls; i++) { - if (!gServerSettings.fixCollisionBugs) { + if (!gLevelValues.fixCollisionBugs) { i = (lowerWcd.numWalls - 1); } diff --git a/src/game/obj_behaviors.c b/src/game/obj_behaviors.c index c1da125d6..14b90e200 100644 --- a/src/game/obj_behaviors.c +++ b/src/game/obj_behaviors.c @@ -170,7 +170,7 @@ s8 obj_find_wall(f32 objNewX, f32 objY, f32 objNewZ, f32 objVelX, f32 objVelZ) { o->oPosY = hitbox.y; o->oPosZ = hitbox.z; - if (gServerSettings.fixCollisionBugs && hitbox.normalCount > 0) { + if (gLevelValues.fixCollisionBugs && hitbox.normalCount > 0) { wall_nX = hitbox.normalAddition[0] / hitbox.normalCount; wall_nY = hitbox.normalAddition[1] / hitbox.normalCount; wall_nZ = hitbox.normalAddition[2] / hitbox.normalCount; diff --git a/src/pc/configfile.c b/src/pc/configfile.c index 11cb6905a..e72ec1952 100644 --- a/src/pc/configfile.c +++ b/src/pc/configfile.c @@ -116,7 +116,6 @@ bool configSkipIntro = 0; bool configShareLives = 0; bool configEnableCheats = 0; bool configBubbleDeath = true; -bool configFixCollBugs = true; unsigned int configAmountofPlayers = 16; bool configHUD = true; #ifdef DISCORDRPC @@ -207,7 +206,6 @@ static const struct ConfigOption options[] = { {.name = "frame_limit" , .type = CONFIG_TYPE_UINT , .uintValue = &configFrameLimit}, {.name = "amount_of_players", .type = CONFIG_TYPE_UINT , .uintValue = &configAmountofPlayers}, {.name = "bubble_death", .type = CONFIG_TYPE_BOOL , .boolValue = &configBubbleDeath}, - {.name = "fix_collision_bugs", .type = CONFIG_TYPE_BOOL , .boolValue = &configFixCollBugs}, {.name = "coop_draw_distance", .type = CONFIG_TYPE_UINT , .uintValue = &configDrawDistance}, {.name = "coop_host_port", .type = CONFIG_TYPE_UINT , .uintValue = &configHostPort}, {.name = "coop_host_save_slot", .type = CONFIG_TYPE_UINT , .uintValue = &configHostSaveSlot}, diff --git a/src/pc/configfile.h b/src/pc/configfile.h index 8ad9fff0e..022edbee4 100644 --- a/src/pc/configfile.h +++ b/src/pc/configfile.h @@ -74,7 +74,6 @@ extern bool configSkipIntro; extern bool configShareLives; extern bool configEnableCheats; extern bool configBubbleDeath; -extern bool configFixCollBugs; extern unsigned int configAmountofPlayers; #ifdef DISCORDRPC extern bool configDiscordRPC; diff --git a/src/pc/djui/djui_panel_host_settings.c b/src/pc/djui/djui_panel_host_settings.c index 13dfacc5f..d155ec549 100644 --- a/src/pc/djui/djui_panel_host_settings.c +++ b/src/pc/djui/djui_panel_host_settings.c @@ -43,7 +43,7 @@ static void djui_panel_host_player_text_change(struct DjuiBase* caller) { } void djui_panel_host_settings_create(struct DjuiBase* caller) { - f32 bodyHeight = 32 * 9 + 64 * 1 + 16 * 9; + f32 bodyHeight = 32 * 8 + 64 * 1 + 16 * 8; struct DjuiBase* defaultBase = NULL; struct DjuiThreePanel* panel = djui_panel_menu_create(bodyHeight, "\\#ff0800\\S\\#1be700\\E\\#00b3ff\\T\\#ffef00\\T\\#ff0800\\I\\#1be700\\N\\#00b3ff\\G\\#ffef00\\S"); @@ -84,10 +84,6 @@ void djui_panel_host_settings_create(struct DjuiBase* caller) { djui_base_set_size_type(&checkbox5->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); djui_base_set_size(&checkbox5->base, 1.0f, 32); - struct DjuiCheckbox* checkbox6 = djui_checkbox_create(&body->base, "Fix collision bugs", &configFixCollBugs); - djui_base_set_size_type(&checkbox6->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); - djui_base_set_size(&checkbox6->base, 1.0f, 32); - struct DjuiRect* rect1 = djui_rect_create(&body->base); djui_base_set_size_type(&rect1->base, DJUI_SVT_RELATIVE, DJUI_SVT_ABSOLUTE); djui_base_set_size(&rect1->base, 1.0f, 32); diff --git a/src/pc/lua/smlua_cobject_autogen.c b/src/pc/lua/smlua_cobject_autogen.c index 04ab0033b..ee878116d 100644 --- a/src/pc/lua/smlua_cobject_autogen.c +++ b/src/pc/lua/smlua_cobject_autogen.c @@ -720,13 +720,14 @@ static struct LuaObjectField sLakituStateFields[LUA_LAKITU_STATE_FIELD_COUNT] = { "yaw", LVT_S16, offsetof(struct LakituState, yaw), false, LOT_NONE }, }; -#define LUA_LEVEL_VALUES_FIELD_COUNT 15 +#define LUA_LEVEL_VALUES_FIELD_COUNT 16 static struct LuaObjectField sLevelValuesFields[LUA_LEVEL_VALUES_FIELD_COUNT] = { { "coinsRequiredForCoinStar", LVT_S16, offsetof(struct LevelValues, coinsRequiredForCoinStar), false, LOT_NONE }, { "entryLevel", LVT_S32, offsetof(struct LevelValues, entryLevel), false, LOT_NONE }, { "exitCastleArea", LVT_S16, offsetof(struct LevelValues, exitCastleArea), false, LOT_NONE }, { "exitCastleLevel", LVT_S32, offsetof(struct LevelValues, exitCastleLevel), false, LOT_NONE }, { "exitCastleWarpNode", LVT_U8, offsetof(struct LevelValues, exitCastleWarpNode), false, LOT_NONE }, + { "fixCollisionBugs", LVT_U8, offsetof(struct LevelValues, fixCollisionBugs), false, LOT_NONE }, { "metalCapDuration", LVT_U16, offsetof(struct LevelValues, metalCapDuration), false, LOT_NONE }, { "metalCapDurationCotmc", LVT_U16, offsetof(struct LevelValues, metalCapDurationCotmc), false, LOT_NONE }, { "pssSlideStarIndex", LVT_U8, offsetof(struct LevelValues, pssSlideStarIndex), false, LOT_NONE }, @@ -1767,11 +1768,10 @@ static struct LuaObjectField sRayIntersectionInfoFields[LUA_RAY_INTERSECTION_INF { "surface", LVT_COBJECT_P, offsetof(struct RayIntersectionInfo, surface), false, LOT_SURFACE }, }; -#define LUA_SERVER_SETTINGS_FIELD_COUNT 9 +#define LUA_SERVER_SETTINGS_FIELD_COUNT 8 static struct LuaObjectField sServerSettingsFields[LUA_SERVER_SETTINGS_FIELD_COUNT] = { { "bubbleDeath", LVT_U8, offsetof(struct ServerSettings, bubbleDeath), false, LOT_NONE }, { "enableCheats", LVT_U8, offsetof(struct ServerSettings, enableCheats), false, LOT_NONE }, - { "fixCollisionBugs", LVT_U8, offsetof(struct ServerSettings, fixCollisionBugs), false, LOT_NONE }, { "headlessServer", LVT_U8, offsetof(struct ServerSettings, headlessServer), false, LOT_NONE }, { "playerInteractions", LVT_S32, offsetof(struct ServerSettings, playerInteractions), false, LOT_NONE }, { "playerKnockbackStrength", LVT_U8, offsetof(struct ServerSettings, playerKnockbackStrength), false, LOT_NONE }, diff --git a/src/pc/network/network.c b/src/pc/network/network.c index 622946821..3b341938d 100644 --- a/src/pc/network/network.c +++ b/src/pc/network/network.c @@ -5,7 +5,6 @@ #include "object_constants.h" #include "behavior_table.h" #include "src/game/hardcoded.h" -#include "src/game/rendering_graph_node.h" #ifdef DISCORD_SDK #include "discord/discord.h" #endif @@ -20,6 +19,11 @@ #include "pc/crash_handler.h" #include "pc/debuglog.h" +// fix warnings when including rendering_graph_node +#undef near +#undef far +#include "src/game/rendering_graph_node.h" + // Mario 64 specific externs extern s16 sCurrPlayMode; extern s16 gCurrCourseNum, gCurrActStarNum, gCurrLevelNum, gCurrAreaIndex; @@ -57,7 +61,6 @@ struct ServerSettings gServerSettings = { .enableCheats = 0, .bubbleDeath = 1, .headlessServer = 0, - .fixCollisionBugs = 1, }; void network_set_system(enum NetworkSystemType nsType) { @@ -93,7 +96,6 @@ bool network_init(enum NetworkType inNetworkType) { gServerSettings.shareLives = configShareLives; gServerSettings.enableCheats = configEnableCheats; gServerSettings.bubbleDeath = configBubbleDeath; - gServerSettings.fixCollisionBugs = configFixCollBugs; #if defined(RAPI_DUMMY) || defined(WAPI_DUMMY) gServerSettings.headlessServer = (inNetworkType == NT_SERVER); #else diff --git a/src/pc/network/network.h b/src/pc/network/network.h index 859dfce5a..b6a5aab9a 100644 --- a/src/pc/network/network.h +++ b/src/pc/network/network.h @@ -69,7 +69,6 @@ struct ServerSettings { u8 enableCheats; u8 bubbleDeath; u8 headlessServer; - u8 fixCollisionBugs; }; // Networking-specific externs diff --git a/src/pc/network/packets/packet_join.c b/src/pc/network/packets/packet_join.c index 688b1c56c..cb2594d7e 100644 --- a/src/pc/network/packets/packet_join.c +++ b/src/pc/network/packets/packet_join.c @@ -107,7 +107,6 @@ void network_send_join(struct Packet* joinRequestPacket) { packet_write(&p, &gServerSettings.shareLives, sizeof(u8)); packet_write(&p, &gServerSettings.enableCheats, sizeof(u8)); packet_write(&p, &gServerSettings.bubbleDeath, sizeof(u8)); - packet_write(&p, &gServerSettings.fixCollisionBugs, sizeof(u8)); packet_write(&p, &gServerSettings.headlessServer, sizeof(u8)); packet_write(&p, eeprom, sizeof(u8) * 512); @@ -171,7 +170,6 @@ void network_receive_join(struct Packet* p) { packet_read(p, &gServerSettings.shareLives, sizeof(u8)); packet_read(p, &gServerSettings.enableCheats, sizeof(u8)); packet_read(p, &gServerSettings.bubbleDeath, sizeof(u8)); - packet_read(p, &gServerSettings.fixCollisionBugs, sizeof(u8)); packet_read(p, &gServerSettings.headlessServer, sizeof(u8)); packet_read(p, eeprom, sizeof(u8) * 512); packet_read(p, &modCount, sizeof(u8));