mirror of
https://github.com/coop-deluxe/sm64coopdx.git
synced 2025-10-30 08:01:01 +00:00
239 lines
14 KiB
C
239 lines
14 KiB
C
#include "types.h"
|
|
|
|
#include "engine/surface_collision.h"
|
|
#include "include/surface_terrains.h"
|
|
#include "game/mario_step.h"
|
|
#include "game/area.h"
|
|
#include "engine/surface_load.h"
|
|
|
|
#include "pc/lua/smlua.h"
|
|
#include "smlua_collision_utils.h"
|
|
#include "pc/debuglog.h"
|
|
|
|
// actors
|
|
#include "actors/common0.h"
|
|
#include "actors/common1.h"
|
|
#include "actors/custom0.h"
|
|
#include "actors/group1.h"
|
|
#include "actors/group2.h"
|
|
#include "actors/group3.h"
|
|
#include "actors/group4.h"
|
|
#include "actors/group5.h"
|
|
#include "actors/group6.h"
|
|
#include "actors/group7.h"
|
|
#include "actors/group8.h"
|
|
#include "actors/group9.h"
|
|
#include "actors/group10.h"
|
|
#include "actors/group11.h"
|
|
#include "actors/group12.h"
|
|
#include "actors/group13.h"
|
|
#include "actors/group14.h"
|
|
#include "actors/group15.h"
|
|
#include "actors/group16.h"
|
|
#include "actors/group17.h"
|
|
#include "actors/zcustom0.h"
|
|
|
|
// levels
|
|
#include "levels/bbh/header.h"
|
|
#include "levels/castle_inside/header.h"
|
|
#include "levels/hmc/header.h"
|
|
#include "levels/ssl/header.h"
|
|
#include "levels/bob/header.h"
|
|
#include "levels/sl/header.h"
|
|
#include "levels/wdw/header.h"
|
|
#include "levels/jrb/header.h"
|
|
#include "levels/thi/header.h"
|
|
#include "levels/ttc/header.h"
|
|
#include "levels/rr/header.h"
|
|
#include "levels/castle_grounds/header.h"
|
|
#include "levels/bitdw/header.h"
|
|
#include "levels/lll/header.h"
|
|
#include "levels/sa/header.h"
|
|
#include "levels/bitfs/header.h"
|
|
#include "levels/ddd/header.h"
|
|
#include "levels/wf/header.h"
|
|
#include "levels/bowser_2/header.h"
|
|
#include "levels/ttm/header.h"
|
|
|
|
struct GlobalObjectCollisionData gGlobalObjectCollisionData = {
|
|
.bbh_seg7_collision_coffin = (Collision*) bbh_seg7_collision_coffin,
|
|
.bbh_seg7_collision_haunted_bookshelf = (Collision*) bbh_seg7_collision_haunted_bookshelf,
|
|
.bbh_seg7_collision_merry_go_round = (Collision*) bbh_seg7_collision_merry_go_round,
|
|
.bbh_seg7_collision_mesh_elevator = (Collision*) bbh_seg7_collision_mesh_elevator,
|
|
.bbh_seg7_collision_staircase_step = (Collision*) bbh_seg7_collision_staircase_step,
|
|
.bbh_seg7_collision_tilt_floor_platform = (Collision*) bbh_seg7_collision_tilt_floor_platform,
|
|
.bitdw_seg7_collision_moving_pyramid = (Collision*) bitdw_seg7_collision_moving_pyramid,
|
|
.bitfs_seg7_collision_inverted_pyramid = (Collision*) bitfs_seg7_collision_inverted_pyramid,
|
|
.bitfs_seg7_collision_sinking_cage_platform = (Collision*) bitfs_seg7_collision_sinking_cage_platform,
|
|
.bitfs_seg7_collision_sinking_platform = (Collision*) bitfs_seg7_collision_sinking_platform,
|
|
.bitfs_seg7_collision_squishable_platform = (Collision*) bitfs_seg7_collision_squishable_platform,
|
|
.blue_coin_switch_seg8_collision_08000E98 = (Collision*) blue_coin_switch_seg8_collision_08000E98,
|
|
.bob_seg7_collision_chain_chomp_gate = (Collision*) bob_seg7_collision_chain_chomp_gate,
|
|
.bowser_2_seg7_collision_tilting_platform = (Collision*) bowser_2_seg7_collision_tilting_platform,
|
|
.breakable_box_seg8_collision_08012D70 = (Collision*) breakable_box_seg8_collision_08012D70,
|
|
.cannon_lid_seg8_collision_08004950 = (Collision*) cannon_lid_seg8_collision_08004950,
|
|
.capswitch_collision_050033D0 = (Collision*) capswitch_collision_050033D0,
|
|
.capswitch_collision_05003448 = (Collision*) capswitch_collision_05003448,
|
|
.castle_grounds_seg7_collision_cannon_grill = (Collision*) castle_grounds_seg7_collision_cannon_grill,
|
|
.castle_grounds_seg7_collision_moat_grills = (Collision*) castle_grounds_seg7_collision_moat_grills,
|
|
.checkerboard_platform_seg8_collision_0800D710 = (Collision*) checkerboard_platform_seg8_collision_0800D710,
|
|
.ddd_seg7_collision_bowser_sub_door = (Collision*) ddd_seg7_collision_bowser_sub_door,
|
|
.ddd_seg7_collision_submarine = (Collision*) ddd_seg7_collision_submarine,
|
|
.door_seg3_collision_0301CE78 = (Collision*) door_seg3_collision_0301CE78,
|
|
.dorrie_seg6_collision_0600F644 = (Collision*) dorrie_seg6_collision_0600F644,
|
|
.dorrie_seg6_collision_0600FBB8 = (Collision*) dorrie_seg6_collision_0600FBB8,
|
|
.exclamation_box_outline_seg8_collision_08025F78 = (Collision*) exclamation_box_outline_seg8_collision_08025F78,
|
|
.hmc_seg7_collision_controllable_platform = (Collision*) hmc_seg7_collision_controllable_platform,
|
|
.hmc_seg7_collision_controllable_platform_sub = (Collision*) hmc_seg7_collision_controllable_platform_sub,
|
|
.hmc_seg7_collision_elevator = (Collision*) hmc_seg7_collision_elevator,
|
|
.inside_castle_seg7_collision_floor_trap = (Collision*) inside_castle_seg7_collision_floor_trap,
|
|
.inside_castle_seg7_collision_star_door = (Collision*) inside_castle_seg7_collision_star_door,
|
|
.inside_castle_seg7_collision_water_level_pillar = (Collision*) inside_castle_seg7_collision_water_level_pillar,
|
|
.jrb_seg7_collision_floating_box = (Collision*) jrb_seg7_collision_floating_box,
|
|
.jrb_seg7_collision_floating_platform = (Collision*) jrb_seg7_collision_floating_platform,
|
|
.jrb_seg7_collision_in_sunken_ship_2 = (Collision*) jrb_seg7_collision_in_sunken_ship_2,
|
|
.jrb_seg7_collision_in_sunken_ship_3 = (Collision*) jrb_seg7_collision_in_sunken_ship_3,
|
|
.jrb_seg7_collision_in_sunken_ship = (Collision*) jrb_seg7_collision_in_sunken_ship,
|
|
.jrb_seg7_collision_pillar_base = (Collision*) jrb_seg7_collision_pillar_base,
|
|
.jrb_seg7_collision_rock_solid = (Collision*) jrb_seg7_collision_rock_solid,
|
|
.lll_hexagonal_mesh_seg3_collision_0301CECC = (Collision*) lll_hexagonal_mesh_seg3_collision_0301CECC,
|
|
.lll_seg7_collision_drawbridge = (Collision*) lll_seg7_collision_drawbridge,
|
|
.lll_seg7_collision_falling_wall = (Collision*) lll_seg7_collision_falling_wall,
|
|
.lll_seg7_collision_floating_block = (Collision*) lll_seg7_collision_floating_block,
|
|
.lll_seg7_collision_hexagonal_platform = (Collision*) lll_seg7_collision_hexagonal_platform,
|
|
.lll_seg7_collision_inverted_pyramid = (Collision*) lll_seg7_collision_inverted_pyramid,
|
|
.lll_seg7_collision_octagonal_moving_platform = (Collision*) lll_seg7_collision_octagonal_moving_platform,
|
|
.lll_seg7_collision_pitoune = (Collision*) lll_seg7_collision_pitoune,
|
|
.lll_seg7_collision_puzzle_piece = (Collision*) lll_seg7_collision_puzzle_piece,
|
|
.lll_seg7_collision_rotating_fire_bars = (Collision*) lll_seg7_collision_rotating_fire_bars,
|
|
.lll_seg7_collision_rotating_platform = (Collision*) lll_seg7_collision_rotating_platform,
|
|
.lll_seg7_collision_sinking_pyramids = (Collision*) lll_seg7_collision_sinking_pyramids,
|
|
.lll_seg7_collision_slow_tilting_platform = (Collision*) lll_seg7_collision_slow_tilting_platform,
|
|
.lll_seg7_collision_wood_piece = (Collision*) lll_seg7_collision_wood_piece,
|
|
.metal_box_seg8_collision_08024C28 = (Collision*) metal_box_seg8_collision_08024C28,
|
|
.penguin_seg5_collision_05008B88 = (Collision*) penguin_seg5_collision_05008B88,
|
|
.poundable_pole_collision_06002490 = (Collision*) poundable_pole_collision_06002490,
|
|
.purple_switch_seg8_collision_0800C7A8 = (Collision*) purple_switch_seg8_collision_0800C7A8,
|
|
.rr_seg7_collision_donut_platform = (Collision*) rr_seg7_collision_donut_platform,
|
|
.rr_seg7_collision_elevator_platform = (Collision*) rr_seg7_collision_elevator_platform,
|
|
.rr_seg7_collision_pendulum = (Collision*) rr_seg7_collision_pendulum,
|
|
.rr_seg7_collision_rotating_platform_with_fire = (Collision*) rr_seg7_collision_rotating_platform_with_fire,
|
|
.sl_seg7_collision_pound_explodes = (Collision*) sl_seg7_collision_pound_explodes,
|
|
.sl_seg7_collision_sliding_snow_mound = (Collision*) sl_seg7_collision_sliding_snow_mound,
|
|
.springboard_collision_05001A28 = (Collision*) springboard_collision_05001A28,
|
|
.ssl_seg7_collision_0702808C = (Collision*) ssl_seg7_collision_0702808C,
|
|
.ssl_seg7_collision_grindel = (Collision*) ssl_seg7_collision_grindel,
|
|
.ssl_seg7_collision_pyramid_elevator = (Collision*) ssl_seg7_collision_pyramid_elevator,
|
|
.ssl_seg7_collision_pyramid_top = (Collision*) ssl_seg7_collision_pyramid_top,
|
|
.ssl_seg7_collision_spindel = (Collision*) ssl_seg7_collision_spindel,
|
|
.ssl_seg7_collision_tox_box = (Collision*) ssl_seg7_collision_tox_box,
|
|
.thi_seg7_collision_top_trap = (Collision*) thi_seg7_collision_top_trap,
|
|
.thwomp_seg5_collision_0500B7D0 = (Collision*) thwomp_seg5_collision_0500B7D0,
|
|
.thwomp_seg5_collision_0500B92C = (Collision*) thwomp_seg5_collision_0500B92C,
|
|
.ttc_seg7_collision_clock_main_rotation = (Collision*) ttc_seg7_collision_clock_main_rotation,
|
|
.ttc_seg7_collision_clock_pendulum = (Collision*) ttc_seg7_collision_clock_pendulum,
|
|
.ttc_seg7_collision_clock_platform = (Collision*) ttc_seg7_collision_clock_platform,
|
|
.ttc_seg7_collision_rotating_clock_platform2 = (Collision*) ttc_seg7_collision_rotating_clock_platform2,
|
|
.ttc_seg7_collision_sliding_surface = (Collision*) ttc_seg7_collision_sliding_surface,
|
|
.ttm_seg7_collision_pitoune_2 = (Collision*) ttm_seg7_collision_pitoune_2,
|
|
.ttm_seg7_collision_podium_warp = (Collision*) ttm_seg7_collision_podium_warp,
|
|
.ttm_seg7_collision_ukiki_cage = (Collision*) ttm_seg7_collision_ukiki_cage,
|
|
.unknown_seg8_collision_080262F8 = (Collision*) unknown_seg8_collision_080262F8,
|
|
.warp_pipe_seg3_collision_03009AC8 = (Collision*) warp_pipe_seg3_collision_03009AC8,
|
|
.wdw_seg7_collision_arrow_lift = (Collision*) wdw_seg7_collision_arrow_lift,
|
|
.wdw_seg7_collision_express_elevator_platform = (Collision*) wdw_seg7_collision_express_elevator_platform,
|
|
.wdw_seg7_collision_rect_floating_platform = (Collision*) wdw_seg7_collision_rect_floating_platform,
|
|
.wdw_seg7_collision_square_floating_platform = (Collision*) wdw_seg7_collision_square_floating_platform,
|
|
.wf_seg7_collision_breakable_wall_2 = (Collision*) wf_seg7_collision_breakable_wall_2,
|
|
.wf_seg7_collision_breakable_wall = (Collision*) wf_seg7_collision_breakable_wall,
|
|
.wf_seg7_collision_bullet_bill_cannon = (Collision*) wf_seg7_collision_bullet_bill_cannon,
|
|
.wf_seg7_collision_clocklike_rotation = (Collision*) wf_seg7_collision_clocklike_rotation,
|
|
.wf_seg7_collision_kickable_board = (Collision*) wf_seg7_collision_kickable_board,
|
|
.wf_seg7_collision_large_bomp = (Collision*) wf_seg7_collision_large_bomp,
|
|
.wf_seg7_collision_platform = (Collision*) wf_seg7_collision_platform,
|
|
.wf_seg7_collision_sliding_brick_platform = (Collision*) wf_seg7_collision_sliding_brick_platform,
|
|
.wf_seg7_collision_small_bomp = (Collision*) wf_seg7_collision_small_bomp,
|
|
.wf_seg7_collision_tower = (Collision*) wf_seg7_collision_tower,
|
|
.wf_seg7_collision_tower_door = (Collision*) wf_seg7_collision_tower_door,
|
|
.whomp_seg6_collision_06020A0C = (Collision*) whomp_seg6_collision_06020A0C,
|
|
.wooden_signpost_seg3_collision_0302DD80 = (Collision*) wooden_signpost_seg3_collision_0302DD80,
|
|
};
|
|
|
|
struct RayIntersectionInfo* collision_find_surface_on_ray(f32 startX, f32 startY, f32 startZ, f32 dirX, f32 dirY, f32 dirZ, f32 precision) {
|
|
static struct RayIntersectionInfo info = { 0 };
|
|
Vec3f orig = { startX, startY, startZ };
|
|
Vec3f dir = { dirX, dirY, dirZ };
|
|
find_surface_on_ray(orig, dir, &info.surface, info.hitPos, precision);
|
|
return &info;
|
|
}
|
|
|
|
struct Surface* collision_find_floor(f32 x, f32 y, f32 z) {
|
|
static struct Surface *surface;
|
|
find_floor(x, y, z, &surface);
|
|
return surface;
|
|
}
|
|
|
|
struct Surface* collision_find_ceil(f32 x, f32 y, f32 z) {
|
|
static struct Surface *surface;
|
|
find_ceil(x, y, z, &surface);
|
|
return surface;
|
|
}
|
|
|
|
struct Surface* get_water_surface_pseudo_floor(void) {
|
|
return &gWaterSurfacePseudoFloor;
|
|
}
|
|
|
|
Collision* smlua_collision_util_get(const char* name) {
|
|
return dynos_collision_get(name);
|
|
}
|
|
|
|
struct WallCollisionData* collision_get_temp_wall_collision_data(void) {
|
|
static struct WallCollisionData sTmpWcd = { 0 };
|
|
memset(&sTmpWcd, 0, sizeof(struct WallCollisionData));
|
|
return &sTmpWcd;
|
|
}
|
|
|
|
struct Surface* get_surface_from_wcd_index(struct WallCollisionData* wcd, s8 index) {
|
|
if (index < 0 || index >= 4) { return NULL; }
|
|
return wcd->walls[index];
|
|
}
|
|
|
|
Collision *smlua_collision_util_get_current_terrain_collision(void) {
|
|
if (gCurrentArea && gCurrentArea->terrainData) {
|
|
return (Collision*) gCurrentArea->terrainData;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
Collision *smlua_collision_util_get_level_collision(u32 level, u16 area) {
|
|
return dynos_level_get_collision(level, area);
|
|
}
|
|
|
|
void smlua_collision_util_find_surface_types(Collision* data) {
|
|
lua_State* L = gLuaState;
|
|
|
|
if (data && *data++ == COL_INIT()) {
|
|
lua_newtable(L);
|
|
s32 t = lua_gettop(gLuaState);
|
|
|
|
// Skip collision vertices
|
|
s32 numVertices = *data++;
|
|
data += 3 * numVertices;
|
|
|
|
// Process surface types
|
|
for (u16 i = 0; true; ++i) {
|
|
s16 surfaceType = *data++;
|
|
if (surfaceType == COL_TRI_STOP()) { break; }
|
|
s32 numTriangles = *data++;
|
|
data += (3 + surface_has_force(surfaceType)) * numTriangles;
|
|
|
|
lua_pushinteger(L, i);
|
|
lua_pushinteger(L, surfaceType);
|
|
lua_settable(L, t);
|
|
}
|
|
return;
|
|
}
|
|
|
|
// Couldn't find anything
|
|
lua_pushnil(L);
|
|
}
|