20#include <egg/math/Vector.hh>
25#define KCL_ATTRIBUTE_TYPE(x) ((x)&0x1f)
28#define KCL_TYPE_BIT(x) (1 << (x))
30#define KCL_ATTRIBUTE_TYPE_BIT(x) KCL_TYPE_BIT(KCL_ATTRIBUTE_TYPE(x))
70#define KCL_SOFT_WALL_MASK 0x8000
71#define KCL_ANY 0xffffffff
72#define KCL_NONE 0x00000000
75#define KCL_TYPE_DIRECTIONAL \
76 (KCL_TYPE_BIT(COL_TYPE_FALL_BOUNDARY) | KCL_TYPE_BIT(COL_TYPE_SOUND_TRIGGER) | \
77 KCL_TYPE_BIT(COL_TYPE_FORCE_RECALCULATE_ROUTE) | \
78 KCL_TYPE_BIT(COL_TYPE_EFFECT_TRIGGER) | KCL_TYPE_BIT(COL_TYPE_CANNON_TRIGGER))
81#define KCL_TYPE_SOLID_SURFACE \
83 (~KCL_TYPE_BIT(COL_TYPE_FALL_BOUNDARY) & ~KCL_TYPE_BIT(COL_TYPE_CANNON_TRIGGER) & \
84 ~KCL_TYPE_BIT(COL_TYPE_FORCE_RECALCULATE_ROUTE) & \
85 ~KCL_TYPE_BIT(COL_TYPE_SOUND_TRIGGER) & ~KCL_TYPE_BIT(COL_TYPE_WEAK_WALL) & \
86 ~KCL_TYPE_BIT(COL_TYPE_EFFECT_TRIGGER) & \
87 ~KCL_TYPE_BIT(COL_TYPE_ITEM_STATE_MODIFIER)))
90#define KCL_TYPE_FLOOR \
91 (KCL_TYPE_BIT(COL_TYPE_ROAD) | KCL_TYPE_BIT(COL_TYPE_SLIPPERY_ROAD) | \
92 KCL_TYPE_BIT(COL_TYPE_WEAK_OFF_ROAD) | KCL_TYPE_BIT(COL_TYPE_OFF_ROAD) | \
93 KCL_TYPE_BIT(COL_TYPE_HEAVY_OFF_ROAD) | KCL_TYPE_BIT(COL_TYPE_SLIPPERY_ROAD_2) | \
94 KCL_TYPE_BIT(COL_TYPE_BOOST_PAD) | KCL_TYPE_BIT(COL_TYPE_BOOST_RAMP) | \
95 KCL_TYPE_BIT(COL_TYPE_JUMP_PAD) | KCL_TYPE_BIT(COL_TYPE_ITEM_ROAD) | \
96 KCL_TYPE_BIT(COL_TYPE_SOLID_OOB) | KCL_TYPE_BIT(COL_TYPE_MOVING_WATER) | \
97 KCL_TYPE_BIT(COL_TYPE_HALFPIPE_RAMP) | KCL_TYPE_BIT(COL_TYPE_MOVING_ROAD) | \
98 KCL_TYPE_BIT(COL_TYPE_STICKY_ROAD) | KCL_TYPE_BIT(COL_TYPE_ROAD2) | \
99 KCL_TYPE_BIT(COL_TYPE_ROTATING_ROAD))
102#define KCL_TYPE_DRIVER_FLOOR (KCL_TYPE_FLOOR & ~KCL_TYPE_BIT(COL_TYPE_ITEM_ROAD))
105#define KCL_TYPE_WALL \
106 (KCL_TYPE_BIT(COL_TYPE_WALL) | KCL_TYPE_BIT(COL_TYPE_INVISIBLE_WALL) | \
107 KCL_TYPE_BIT(COL_TYPE_ITEM_WALL) | KCL_TYPE_BIT(COL_TYPE_WALL_2) | \
108 KCL_TYPE_BIT(COL_TYPE_PLAYER_WALL) | KCL_TYPE_BIT(COL_TYPE_HALFPIPE_INVISIBLE_WALL) | \
109 KCL_TYPE_BIT(COL_TYPE_SPECIAL_WALL) | KCL_TYPE_BIT(COL_TYPE_INVISIBLE_WALL2))
112#define KCL_TYPE_DRIVER_WALL \
113 (KCL_TYPE_WALL & ~KCL_TYPE_BIT(COL_TYPE_ITEM_WALL) & \
114 ~KCL_TYPE_BIT(COL_TYPE_HALFPIPE_INVISIBLE_WALL))
117#define KCL_TYPE_DRIVER_WALL_NO_INVISIBLE_WALL \
118 (KCL_TYPE_DRIVER_WALL & ~KCL_TYPE_BIT(COL_TYPE_INVISIBLE_WALL))
121#define KCL_TYPE_DRIVER_WALL_NO_INVISIBLE_WALL2 \
122 (KCL_TYPE_DRIVER_WALL & ~KCL_TYPE_BIT(COL_TYPE_INVISIBLE_WALL2))
125#define KCL_TYPE_4010D000 \
126 (KCL_TYPE_DRIVER_WALL_NO_INVISIBLE_WALL & ~KCL_TYPE_BIT(COL_TYPE_INVISIBLE_WALL2) | \
127 KCL_TYPE_BIT(COL_TYPE_ITEM_WALL))
130#define KCL_TYPE_VEHICLE_INTERACTABLE \
131 (~KCL_TYPE_BIT(COL_TYPE_ITEM_ROAD) & ~KCL_TYPE_BIT(COL_TYPE_ITEM_WALL) & \
132 ~KCL_TYPE_BIT(COL_TYPE_HALFPIPE_INVISIBLE_WALL))
135#define KCL_TYPE_VEHICLE_COLLIDEABLE \
136 (KCL_TYPE_VEHICLE_INTERACTABLE & ~KCL_TYPE_BIT(COL_TYPE_SOUND_TRIGGER) & \
137 ~KCL_TYPE_BIT(COL_TYPE_EFFECT_TRIGGER) & ~KCL_TYPE_BIT(COL_TYPE_FALL_BOUNDARY) & \
138 ~KCL_TYPE_BIT(COL_TYPE_CANNON_TRIGGER) & \
139 ~KCL_TYPE_BIT(COL_TYPE_FORCE_RECALCULATE_ROUTE))
142#define KCL_TYPE_NON_DIRECTIONAL \
143 (KCL_TYPE_VEHICLE_COLLIDEABLE & ~KCL_TYPE_BIT(COL_TYPE_ITEM_STATE_MODIFIER) & \
144 ~KCL_TYPE_BIT(COL_TYPE_WEAK_WALL))
147#define KCL_TYPE_DRIVER_SOLID_SURFACE \
148 (KCL_TYPE_VEHICLE_COLLIDEABLE | KCL_TYPE_BIT(COL_TYPE_CANNON_TRIGGER))
151#define KCL_TYPE_B0E82DFF \
152 (KCL_TYPE_DRIVER_FLOOR | KCL_TYPE_BIT(COL_TYPE_HALFPIPE_INVISIBLE_WALL) | \
153 KCL_TYPE_BIT(COL_TYPE_INVISIBLE_WALL) | \
154 KCL_TYPE_BIT(COL_TYPE_INVISIBLE_WALL2) & ~KCL_TYPE_BIT(COL_TYPE_ITEM_ROAD))
156#define KCL_TYPE_64EBDFFF \
157 (KCL_TYPE_FLOOR | KCL_TYPE_BIT(COL_TYPE_SPECIAL_WALL) | \
158 KCL_TYPE_BIT(COL_TYPE_EFFECT_TRIGGER) | KCL_TYPE_BIT(COL_TYPE_CANNON_TRIGGER) | \
159 KCL_TYPE_BIT(COL_TYPE_FALL_BOUNDARY) | KCL_TYPE_BIT(COL_TYPE_WALL_2) | \
160 KCL_TYPE_BIT(COL_TYPE_ITEM_WALL) | KCL_TYPE_BIT(COL_TYPE_WALL))
162STATIC_ASSERT(KCL_TYPE_64EBDFFF == 0x64EBDFFF);
165#define KCL_TYPE_INVISIBLE_WALL \
166 (KCL_TYPE_BIT(COL_TYPE_INVISIBLE_WALL) | KCL_TYPE_BIT(COL_TYPE_INVISIBLE_WALL2))
169#define KCL_TYPE_ANY_INVISIBLE_WALL \
170 (KCL_TYPE_INVISIBLE_WALL | KCL_TYPE_BIT(COL_TYPE_HALFPIPE_INVISIBLE_WALL))
@ COL_TYPE_OFF_ROAD
Moderate off-road slowdown.
@ COL_TYPE_MOVING_WATER
Koopa Cape and DS Yoshi Falls.
@ COL_TYPE_STICKY_ROAD
Player sticks if within 200 units (rBC stairs).
@ COL_TYPE_BOOST_RAMP
Trickable. Variant affects boost duration.
@ COL_TYPE_ITEM_WALL
Wall that is only solid for items.
@ COL_TYPE_FORCE_RECALCULATE_ROUTE
Forces CPU pathing recalculation.
@ COL_TYPE_INVISIBLE_WALL
Solid wall that is (typically) invisible.
@ COL_TYPE_WALL
Default wall.
@ COL_TYPE_SOUND_TRIGGER
Triggers for changing sound effects per-course.
@ COL_TYPE_WEAK_OFF_ROAD
Slight off-road slowdown.
@ COL_TYPE_INVISIBLE_WALL2
Identical to COL_TYPE_INVISIBLE_WALL.
@ COL_TYPE_ITEM_STATE_MODIFIER
Stops items when leaving curved TF conveyers.
@ COL_TYPE_WALL_2
Difference to COL_TYPE_WALL is unknown.
@ COL_TYPE_ROAD2
COL_TYPE_ROAD but with more variants.
@ COL_TYPE_HALFPIPE_RAMP
Bowser's Castle half-pipe ramps.
@ COL_TYPE_HALFPIPE_INVISIBLE_WALL
Invisible wall after a half-pipe jump, like in BC.
@ COL_TYPE_WEAK_WALL
Pushes player away only at low speeds.
@ COL_TYPE_SPECIAL_WALL
Various other wall types, determined by variant.
@ COL_TYPE_SLIPPERY_ROAD_2
N64 Sherbet Land.
@ COL_TYPE_ROAD
Default road.
@ COL_TYPE_ITEM_ROAD
Road that is only solid for items.
@ COL_TYPE_FALL_BOUNDARY
Non-solid out-of-bounds trigger.
@ COL_TYPE_SLIPPERY_ROAD
Like Dry Dry Ruins.
@ COL_TYPE_BOOST_PAD
Boost panel.
@ COL_TYPE_ROTATING_ROAD
Chain Chomp Roulette.
@ COL_TYPE_PLAYER_WALL
Allows items to pass through but not players.
@ COL_TYPE_CANNON_TRIGGER
Launches player to a destination "cannon point".
@ COL_TYPE_SOLID_OOB
Solid out-of-bounds trigger.
@ COL_TYPE_JUMP_PAD
Like GBA Shy Guy Beach.
@ COL_TYPE_MOVING_ROAD
TF conveyers and CM escalators.
@ COL_TYPE_EFFECT_TRIGGER
Activates various effects based on variant.
@ COL_TYPE_HEAVY_OFF_ROAD
Heavy off-road slowdown.