merged master crash screen changes

This commit is contained in:
someone2639
2021-09-19 11:30:22 -04:00
5 changed files with 205 additions and 154 deletions

View File

@@ -399,7 +399,7 @@ const BehaviorScript bhvPurpleParticle[] = {
const BehaviorScript bhvGiantPole[] = { const BehaviorScript bhvGiantPole[] = {
BEGIN(OBJ_LIST_POLELIKE), BEGIN(OBJ_LIST_POLELIKE),
OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), OR_LONG(oFlags, (OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)),
SET_INT(oInteractType, INTERACT_POLE), SET_INT(oInteractType, INTERACT_POLE),
SET_HITBOX(/*Radius*/ 80, /*Height*/ 2100), SET_HITBOX(/*Radius*/ 80, /*Height*/ 2100),
SET_HOME(), SET_HOME(),
@@ -698,7 +698,7 @@ const BehaviorScript bhvUnused05A8[] = {
const BehaviorScript bhvRotatingPlatform[] = { const BehaviorScript bhvRotatingPlatform[] = {
BEGIN(OBJ_LIST_SURFACE), BEGIN(OBJ_LIST_SURFACE),
OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), OR_LONG(oFlags, (OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_DONT_CALC_COLL_DIST | OBJ_FLAG_UCODE_LARGE)),
SET_HOME(), SET_HOME(),
BEGIN_LOOP(), BEGIN_LOOP(),
CALL_NATIVE(bhv_rotating_platform_loop), CALL_NATIVE(bhv_rotating_platform_loop),
@@ -708,7 +708,7 @@ const BehaviorScript bhvRotatingPlatform[] = {
const BehaviorScript bhvTower[] = { const BehaviorScript bhvTower[] = {
BEGIN(OBJ_LIST_SURFACE), BEGIN(OBJ_LIST_SURFACE),
OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), OR_LONG(oFlags, (OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)),
LOAD_COLLISION_DATA(wf_seg7_collision_tower), LOAD_COLLISION_DATA(wf_seg7_collision_tower),
SET_FLOAT(oCollisionDistance, 3000), SET_FLOAT(oCollisionDistance, 3000),
SET_FLOAT(oDrawingDistance, 20000), SET_FLOAT(oDrawingDistance, 20000),
@@ -748,7 +748,7 @@ const BehaviorScript bhvWfBreakableWallLeft[] = {
const BehaviorScript bhvKickableBoard[] = { const BehaviorScript bhvKickableBoard[] = {
BEGIN(OBJ_LIST_SURFACE), BEGIN(OBJ_LIST_SURFACE),
OR_INT(oFlags, (OBJ_FLAG_COMPUTE_ANGLE_TO_MARIO | OBJ_FLAG_ACTIVE_FROM_AFAR | OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), OR_LONG(oFlags, (OBJ_FLAG_COMPUTE_ANGLE_TO_MARIO | OBJ_FLAG_ACTIVE_FROM_AFAR | OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)),
LOAD_COLLISION_DATA(wf_seg7_collision_kickable_board), LOAD_COLLISION_DATA(wf_seg7_collision_kickable_board),
SET_HITBOX(/*Radius*/ 100, /*Height*/ 1200), SET_HITBOX(/*Radius*/ 100, /*Height*/ 1200),
SET_HURTBOX(/*Radius*/ 1, /*Height*/ 1), SET_HURTBOX(/*Radius*/ 1, /*Height*/ 1),
@@ -778,7 +778,7 @@ const BehaviorScript bhvRotatingCounterClockwise[] = {
const BehaviorScript bhvWfRotatingWoodenPlatform[] = { const BehaviorScript bhvWfRotatingWoodenPlatform[] = {
BEGIN(OBJ_LIST_SURFACE), BEGIN(OBJ_LIST_SURFACE),
OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), OR_LONG(oFlags, (OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)),
LOAD_COLLISION_DATA(wf_seg7_collision_clocklike_rotation), LOAD_COLLISION_DATA(wf_seg7_collision_clocklike_rotation),
BEGIN_LOOP(), BEGIN_LOOP(),
CALL_NATIVE(bhv_wf_rotating_wooden_platform_loop), CALL_NATIVE(bhv_wf_rotating_wooden_platform_loop),
@@ -1210,7 +1210,7 @@ const BehaviorScript bhvRrElevatorPlatform[] = {
const BehaviorScript bhvHmcElevatorPlatform[] = { const BehaviorScript bhvHmcElevatorPlatform[] = {
BEGIN(OBJ_LIST_SURFACE), BEGIN(OBJ_LIST_SURFACE),
OR_INT(oFlags, (OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), OR_LONG(oFlags, (OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)),
LOAD_COLLISION_DATA(hmc_seg7_collision_elevator), LOAD_COLLISION_DATA(hmc_seg7_collision_elevator),
SET_HOME(), SET_HOME(),
CALL_NATIVE(bhv_elevator_init), CALL_NATIVE(bhv_elevator_init),
@@ -1286,7 +1286,6 @@ const BehaviorScript bhvMistCircParticleSpawner[] = {
}; };
const BehaviorScript bhvDirtParticleSpawner[] = { const BehaviorScript bhvDirtParticleSpawner[] = {
BEGIN(OBJ_LIST_DEFAULT),
BEGIN(OBJ_LIST_DEFAULT), BEGIN(OBJ_LIST_DEFAULT),
OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE),
CALL_NATIVE(bhv_ground_sand_init), CALL_NATIVE(bhv_ground_sand_init),
@@ -1380,7 +1379,7 @@ const BehaviorScript bhvUkikiCage[] = {
const BehaviorScript bhvBitfsSinkingPlatforms[] = { const BehaviorScript bhvBitfsSinkingPlatforms[] = {
BEGIN(OBJ_LIST_SURFACE), BEGIN(OBJ_LIST_SURFACE),
OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), OR_LONG(oFlags, (OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)),
LOAD_COLLISION_DATA(bitfs_seg7_collision_sinking_platform), LOAD_COLLISION_DATA(bitfs_seg7_collision_sinking_platform),
SET_HOME(), SET_HOME(),
BEGIN_LOOP(), BEGIN_LOOP(),
@@ -1391,7 +1390,7 @@ const BehaviorScript bhvBitfsSinkingPlatforms[] = {
const BehaviorScript bhvBitfsSinkingCagePlatform[] = { const BehaviorScript bhvBitfsSinkingCagePlatform[] = {
BEGIN(OBJ_LIST_SURFACE), BEGIN(OBJ_LIST_SURFACE),
OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), OR_LONG(oFlags, (OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)),
LOAD_COLLISION_DATA(bitfs_seg7_collision_sinking_cage_platform), LOAD_COLLISION_DATA(bitfs_seg7_collision_sinking_cage_platform),
SET_HOME(), SET_HOME(),
SPAWN_CHILD(/*Model*/ MODEL_BITFS_BLUE_POLE, /*Behavior*/ bhvDddMovingPole), SPAWN_CHILD(/*Model*/ MODEL_BITFS_BLUE_POLE, /*Behavior*/ bhvDddMovingPole),
@@ -1403,7 +1402,7 @@ const BehaviorScript bhvBitfsSinkingCagePlatform[] = {
const BehaviorScript bhvDddMovingPole[] = { const BehaviorScript bhvDddMovingPole[] = {
BEGIN(OBJ_LIST_POLELIKE), BEGIN(OBJ_LIST_POLELIKE),
OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), OR_LONG(oFlags, (OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)),
SET_INT(oInteractType, INTERACT_POLE), SET_INT(oInteractType, INTERACT_POLE),
SET_HITBOX(/*Radius*/ 80, /*Height*/ 710), SET_HITBOX(/*Radius*/ 80, /*Height*/ 710),
SET_INT(oIntangibleTimer, 0), SET_INT(oIntangibleTimer, 0),
@@ -1427,7 +1426,7 @@ const BehaviorScript bhvBitfsTiltingInvertedPyramid[] = {
const BehaviorScript bhvSquishablePlatform[] = { const BehaviorScript bhvSquishablePlatform[] = {
BEGIN(OBJ_LIST_SURFACE), BEGIN(OBJ_LIST_SURFACE),
OR_INT(oFlags, (OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), OR_LONG(oFlags, (OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)),
LOAD_COLLISION_DATA(bitfs_seg7_collision_squishable_platform), LOAD_COLLISION_DATA(bitfs_seg7_collision_squishable_platform),
SET_FLOAT(oCollisionDistance, 10000), SET_FLOAT(oCollisionDistance, 10000),
CALL_NATIVE(bhv_platform_normals_init), CALL_NATIVE(bhv_platform_normals_init),
@@ -1544,7 +1543,7 @@ const BehaviorScript bhvBlackSmokeMario[] = {
BEGIN(OBJ_LIST_UNIMPORTANT), BEGIN(OBJ_LIST_UNIMPORTANT),
OR_INT(oFlags, (OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW | OBJ_FLAG_MOVE_XZ_USING_FVEL | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), OR_INT(oFlags, (OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW | OBJ_FLAG_MOVE_XZ_USING_FVEL | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)),
BILLBOARD(), BILLBOARD(),
SET_INT(oAnimState, 4), SET_INT(oAnimState, 4), //! burn_smoke_geo has no GEO_SWITCH_ANIM_STATE.
SET_FLOAT(oGraphYOffset, 50), SET_FLOAT(oGraphYOffset, 50),
BEGIN_REPEAT(8), BEGIN_REPEAT(8),
CALL_NATIVE(bhv_black_smoke_mario_loop), CALL_NATIVE(bhv_black_smoke_mario_loop),
@@ -1776,7 +1775,7 @@ const BehaviorScript bhvHeaveHo[] = {
SET_OBJ_PHYSICS(/*Wall hitbox radius*/ 200, /*Gravity*/ -400, /*Bounciness*/ -50, /*Drag strength*/ 1000, /*Friction*/ 1000, /*Buoyancy*/ 600, /*Unused*/ 0, 0), SET_OBJ_PHYSICS(/*Wall hitbox radius*/ 200, /*Gravity*/ -400, /*Bounciness*/ -50, /*Drag strength*/ 1000, /*Friction*/ 1000, /*Buoyancy*/ 600, /*Unused*/ 0, 0),
SPAWN_OBJ(/*Model*/ MODEL_NONE, /*Behavior*/ bhvHeaveHoThrowMario), SPAWN_OBJ(/*Model*/ MODEL_NONE, /*Behavior*/ bhvHeaveHoThrowMario),
SET_INT(oInteractType, INTERACT_GRABBABLE), SET_INT(oInteractType, INTERACT_GRABBABLE),
SET_INT(oInteractionSubtype, INT_SUBTYPE_NOT_GRABBABLE | INT_SUBTYPE_GRABS_MARIO), SET_INT(oInteractionSubtype, (INT_SUBTYPE_NOT_GRABBABLE | INT_SUBTYPE_GRABS_MARIO)),
SET_HITBOX(/*Radius*/ 120, /*Height*/ 100), SET_HITBOX(/*Radius*/ 120, /*Height*/ 100),
SET_HOME(), SET_HOME(),
SET_INT(oIntangibleTimer, 0), SET_INT(oIntangibleTimer, 0),
@@ -2003,7 +2002,7 @@ const BehaviorScript bhvBowserFlameSpawn[] = {
const BehaviorScript bhvTiltingBowserLavaPlatform[] = { const BehaviorScript bhvTiltingBowserLavaPlatform[] = {
BEGIN(OBJ_LIST_SURFACE), BEGIN(OBJ_LIST_SURFACE),
OR_LONG(oFlags, (OBJ_FLAG_COMPUTE_ANGLE_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), OR_LONG(oFlags, (OBJ_FLAG_COMPUTE_ANGLE_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_DONT_CALC_COLL_DIST | OBJ_FLAG_UCODE_LARGE)),
LOAD_COLLISION_DATA(bowser_2_seg7_collision_tilting_platform), LOAD_COLLISION_DATA(bowser_2_seg7_collision_tilting_platform),
SET_FLOAT(oDrawingDistance, 20000), SET_FLOAT(oDrawingDistance, 20000),
SET_FLOAT(oCollisionDistance, 20000), SET_FLOAT(oCollisionDistance, 20000),
@@ -2017,7 +2016,7 @@ const BehaviorScript bhvTiltingBowserLavaPlatform[] = {
const BehaviorScript bhvFallingBowserPlatform[] = { const BehaviorScript bhvFallingBowserPlatform[] = {
BEGIN(OBJ_LIST_SURFACE), BEGIN(OBJ_LIST_SURFACE),
OR_LONG(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE), OR_LONG(oFlags, (OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_DONT_CALC_COLL_DIST | OBJ_FLAG_UCODE_LARGE)),
SET_FLOAT(oDrawingDistance, 20000), SET_FLOAT(oDrawingDistance, 20000),
SET_FLOAT(oCollisionDistance, 20000), SET_FLOAT(oCollisionDistance, 20000),
SET_HOME(), SET_HOME(),
@@ -2190,7 +2189,7 @@ const BehaviorScript bhvWaterLevelPillar[] = {
const BehaviorScript bhvDddWarp[] = { const BehaviorScript bhvDddWarp[] = {
BEGIN(OBJ_LIST_SURFACE), BEGIN(OBJ_LIST_SURFACE),
OR_LONG(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE), OR_INT(oFlags, (OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)),
SET_FLOAT(oCollisionDistance, 30000), SET_FLOAT(oCollisionDistance, 30000),
BEGIN_LOOP(), BEGIN_LOOP(),
CALL_NATIVE(bhv_ddd_warp_loop), CALL_NATIVE(bhv_ddd_warp_loop),
@@ -2348,7 +2347,7 @@ const BehaviorScript bhvVolcanoFlames[] = {
const BehaviorScript bhvLllRotatingHexagonalRing[] = { const BehaviorScript bhvLllRotatingHexagonalRing[] = {
BEGIN(OBJ_LIST_SURFACE), BEGIN(OBJ_LIST_SURFACE),
OR_INT(oFlags, (OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), OR_LONG(oFlags, (OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)),
LOAD_COLLISION_DATA(lll_seg7_collision_rotating_platform), LOAD_COLLISION_DATA(lll_seg7_collision_rotating_platform),
BEGIN_LOOP(), BEGIN_LOOP(),
CALL_NATIVE(bhv_lll_rotating_hexagonal_ring_loop), CALL_NATIVE(bhv_lll_rotating_hexagonal_ring_loop),
@@ -2358,7 +2357,7 @@ const BehaviorScript bhvLllRotatingHexagonalRing[] = {
const BehaviorScript bhvLllSinkingRectangularPlatform[] = { const BehaviorScript bhvLllSinkingRectangularPlatform[] = {
BEGIN(OBJ_LIST_SURFACE), BEGIN(OBJ_LIST_SURFACE),
OR_INT(oFlags, (OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), OR_LONG(oFlags, (OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)),
LOAD_COLLISION_DATA(lll_seg7_collision_slow_tilting_platform), LOAD_COLLISION_DATA(lll_seg7_collision_slow_tilting_platform),
SET_FLOAT(oCollisionDistance, 2000), SET_FLOAT(oCollisionDistance, 2000),
SET_HOME(), SET_HOME(),
@@ -2370,7 +2369,7 @@ const BehaviorScript bhvLllSinkingRectangularPlatform[] = {
const BehaviorScript bhvLllSinkingSquarePlatforms[] = { const BehaviorScript bhvLllSinkingSquarePlatforms[] = {
BEGIN(OBJ_LIST_SURFACE), BEGIN(OBJ_LIST_SURFACE),
OR_INT(oFlags, (OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), OR_LONG(oFlags, (OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)),
LOAD_COLLISION_DATA(lll_seg7_collision_sinking_pyramids), LOAD_COLLISION_DATA(lll_seg7_collision_sinking_pyramids),
ADD_FLOAT(oPosY, 5), ADD_FLOAT(oPosY, 5),
SET_FLOAT(oCollisionDistance, 2000), SET_FLOAT(oCollisionDistance, 2000),
@@ -2462,7 +2461,7 @@ const BehaviorScript bhvLllHexagonalMesh[] = {
const BehaviorScript bhvLllBowserPuzzlePiece[] = { const BehaviorScript bhvLllBowserPuzzlePiece[] = {
BEGIN(OBJ_LIST_SURFACE), BEGIN(OBJ_LIST_SURFACE),
OR_INT(oFlags, (OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), OR_LONG(oFlags, (OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_DONT_CALC_COLL_DIST | OBJ_FLAG_UCODE_LARGE)),
LOAD_COLLISION_DATA(lll_seg7_collision_puzzle_piece), LOAD_COLLISION_DATA(lll_seg7_collision_puzzle_piece),
SET_HOME(), SET_HOME(),
SET_FLOAT(oCollisionDistance, 3000), SET_FLOAT(oCollisionDistance, 3000),
@@ -2707,7 +2706,7 @@ const BehaviorScript bhvJrbSlidingBox[] = {
const BehaviorScript bhvShipPart3[] = { const BehaviorScript bhvShipPart3[] = {
BEGIN(OBJ_LIST_DEFAULT), BEGIN(OBJ_LIST_DEFAULT),
OR_LONG(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE), OR_LONG(oFlags, (OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)),
SET_HOME(), SET_HOME(),
BEGIN_LOOP(), BEGIN_LOOP(),
CALL_NATIVE(bhv_ship_part_3_loop), CALL_NATIVE(bhv_ship_part_3_loop),
@@ -2716,7 +2715,7 @@ const BehaviorScript bhvShipPart3[] = {
const BehaviorScript bhvInSunkenShip3[] = { const BehaviorScript bhvInSunkenShip3[] = {
BEGIN(OBJ_LIST_SURFACE), BEGIN(OBJ_LIST_SURFACE),
OR_LONG(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE), OR_LONG(oFlags, (OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)),
LOAD_COLLISION_DATA(jrb_seg7_collision_in_sunken_ship_3), LOAD_COLLISION_DATA(jrb_seg7_collision_in_sunken_ship_3),
SET_HOME(), SET_HOME(),
SET_FLOAT(oCollisionDistance, 4000), SET_FLOAT(oCollisionDistance, 4000),
@@ -2763,7 +2762,7 @@ const BehaviorScript bhvInSunkenShip2[] = {
BEGIN(OBJ_LIST_SURFACE), BEGIN(OBJ_LIST_SURFACE),
LOAD_COLLISION_DATA(jrb_seg7_collision_in_sunken_ship_2), LOAD_COLLISION_DATA(jrb_seg7_collision_in_sunken_ship_2),
// Sunken ship - common: // Sunken ship - common:
OR_LONG(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE), OR_LONG(oFlags, (OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)),
SET_FLOAT(oCollisionDistance, 4000), SET_FLOAT(oCollisionDistance, 4000),
CALL(bhvSunkenShipSetRotation), CALL(bhvSunkenShipSetRotation),
BEGIN_LOOP(), BEGIN_LOOP(),
@@ -3154,7 +3153,7 @@ UNUSED static const BehaviorScript unused_1[] = {
const BehaviorScript bhvStaticObject[] = { const BehaviorScript bhvStaticObject[] = {
BEGIN(OBJ_LIST_DEFAULT), BEGIN(OBJ_LIST_DEFAULT),
OR_LONG(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE), OR_LONG(oFlags, (OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)),
BREAK(), BREAK(),
}; };
@@ -3310,11 +3309,9 @@ const BehaviorScript bhvWaterDroplet[] = {
const BehaviorScript bhvWaterDropletSplash[] = { const BehaviorScript bhvWaterDropletSplash[] = {
BEGIN(OBJ_LIST_DEFAULT), BEGIN(OBJ_LIST_DEFAULT),
OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE),
#ifndef VERSION_JP
SET_INT(oFaceAnglePitch, 0), SET_INT(oFaceAnglePitch, 0),
SET_INT(oFaceAngleYaw, 0), SET_INT(oFaceAngleYaw, 0),
SET_INT(oFaceAngleRoll, 0), SET_INT(oFaceAngleRoll, 0),
#endif
CALL_NATIVE(bhv_water_droplet_splash_init), CALL_NATIVE(bhv_water_droplet_splash_init),
ADD_FLOAT(oPosY, 5), ADD_FLOAT(oPosY, 5),
SET_INT(oAnimState, -1), SET_INT(oAnimState, -1),
@@ -3328,16 +3325,9 @@ const BehaviorScript bhvWaterDropletSplash[] = {
const BehaviorScript bhvBubbleSplash[] = { const BehaviorScript bhvBubbleSplash[] = {
BEGIN(OBJ_LIST_DEFAULT), BEGIN(OBJ_LIST_DEFAULT),
OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE),
#ifdef VERSION_JP
SET_FLOAT(oFaceAnglePitch, 0),
SET_FLOAT(oFaceAngleYaw, 0),
SET_FLOAT(oFaceAngleRoll, 0),
#endif
#ifndef VERSION_JP
SET_INT(oFaceAnglePitch, 0), SET_INT(oFaceAnglePitch, 0),
SET_INT(oFaceAngleYaw, 0), SET_INT(oFaceAngleYaw, 0),
SET_INT(oFaceAngleRoll, 0), SET_INT(oFaceAngleRoll, 0),
#endif
SET_INT(oAnimState, -1), SET_INT(oAnimState, -1),
CALL_NATIVE(bhv_bubble_splash_init), CALL_NATIVE(bhv_bubble_splash_init),
BEGIN_REPEAT(6), BEGIN_REPEAT(6),
@@ -3350,18 +3340,9 @@ const BehaviorScript bhvBubbleSplash[] = {
const BehaviorScript bhvIdleWaterWave[] = { const BehaviorScript bhvIdleWaterWave[] = {
BEGIN(OBJ_LIST_DEFAULT), BEGIN(OBJ_LIST_DEFAULT),
OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE),
#ifdef VERSION_JP
SET_FLOAT(oFaceAnglePitch, 0),
SET_FLOAT(oFaceAngleYaw, 0),
SET_FLOAT(oFaceAngleRoll, 0),
#endif
#ifndef VERSION_JP
SET_INT(oFaceAnglePitch, 0), SET_INT(oFaceAnglePitch, 0),
SET_INT(oFaceAngleYaw, 0), SET_INT(oFaceAngleYaw, 0),
SET_INT(oFaceAngleRoll, 0), SET_INT(oFaceAngleRoll, 0),
#endif
SET_INT(oAnimState, -1),
ADD_INT(oAnimState, 1),
BEGIN_LOOP(), BEGIN_LOOP(),
CALL_NATIVE(bhv_idle_water_wave_loop), CALL_NATIVE(bhv_idle_water_wave_loop),
ADD_INT(oAnimState, 1), ADD_INT(oAnimState, 1),
@@ -3377,16 +3358,9 @@ const BehaviorScript bhvIdleWaterWave[] = {
const BehaviorScript bhvObjectWaterSplash[] = { const BehaviorScript bhvObjectWaterSplash[] = {
BEGIN(OBJ_LIST_UNIMPORTANT), BEGIN(OBJ_LIST_UNIMPORTANT),
OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE),
#ifdef VERSION_JP
SET_FLOAT(oFaceAnglePitch, 0),
SET_FLOAT(oFaceAngleYaw, 0),
SET_FLOAT(oFaceAngleRoll, 0),
#endif
#ifndef VERSION_JP
SET_INT(oFaceAnglePitch, 0), SET_INT(oFaceAnglePitch, 0),
SET_INT(oFaceAngleYaw, 0), SET_INT(oFaceAngleYaw, 0),
SET_INT(oFaceAngleRoll, 0), SET_INT(oFaceAngleRoll, 0),
#endif
SET_INT(oAnimState, -1), SET_INT(oAnimState, -1),
BEGIN_REPEAT(6), BEGIN_REPEAT(6),
ADD_INT(oAnimState, 1), ADD_INT(oAnimState, 1),
@@ -3437,9 +3411,9 @@ const BehaviorScript bhvWaveTrail[] = {
OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE),
PARENT_BIT_CLEAR(oActiveParticleFlags, ACTIVE_PARTICLE_WAVE_TRAIL), PARENT_BIT_CLEAR(oActiveParticleFlags, ACTIVE_PARTICLE_WAVE_TRAIL),
// Wave trail - common: // Wave trail - common:
SET_FLOAT(oFaceAnglePitch, 0), SET_INT(oFaceAnglePitch, 0),
SET_FLOAT(oFaceAngleYaw, 0), SET_INT(oFaceAngleYaw, 0),
SET_FLOAT(oFaceAngleRoll, 0), SET_INT(oFaceAngleRoll, 0),
SET_INT(oAnimState, -1), SET_INT(oAnimState, -1),
BEGIN_REPEAT(8), BEGIN_REPEAT(8),
ADD_INT(oAnimState, 1), ADD_INT(oAnimState, 1),
@@ -3463,7 +3437,7 @@ const BehaviorScript bhvTinyStrongWindParticle[] = {
// Strong wind particles generated by the Snowman and Fwoosh that blow Mario back and knock his cap off. // Strong wind particles generated by the Snowman and Fwoosh that blow Mario back and knock his cap off.
const BehaviorScript bhvStrongWindParticle[] = { const BehaviorScript bhvStrongWindParticle[] = {
BEGIN(OBJ_LIST_POLELIKE), BEGIN(OBJ_LIST_POLELIKE), //?
OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE),
BILLBOARD(), BILLBOARD(),
BEGIN_LOOP(), BEGIN_LOOP(),
@@ -3613,7 +3587,7 @@ const BehaviorScript bhvRandomAnimatedTexture[] = {
const BehaviorScript bhvYellowBackgroundInMenu[] = { const BehaviorScript bhvYellowBackgroundInMenu[] = {
BEGIN(OBJ_LIST_LEVEL), BEGIN(OBJ_LIST_LEVEL),
OR_LONG(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE), OR_LONG(oFlags, (OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)),
CALL_NATIVE(beh_yellow_background_menu_init), CALL_NATIVE(beh_yellow_background_menu_init),
BEGIN_LOOP(), BEGIN_LOOP(),
SET_INT(oIntangibleTimer, 0), SET_INT(oIntangibleTimer, 0),
@@ -3963,12 +3937,10 @@ const BehaviorScript bhvObjectBubble[] = {
const BehaviorScript bhvObjectWaterWave[] = { const BehaviorScript bhvObjectWaterWave[] = {
BEGIN(OBJ_LIST_UNIMPORTANT), BEGIN(OBJ_LIST_UNIMPORTANT),
OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE),
SET_FLOAT(oFaceAnglePitch, 0), SET_INT(oFaceAnglePitch, 0),
SET_FLOAT(oFaceAngleYaw, 0), SET_INT(oFaceAngleYaw, 0),
SET_FLOAT(oFaceAngleRoll, 0), SET_INT(oFaceAngleRoll, 0),
SET_INT(oAnimState, -1),
CALL_NATIVE(bhv_object_water_wave_init), CALL_NATIVE(bhv_object_water_wave_init),
ADD_INT(oAnimState, 1),
DELAY(6), DELAY(6),
BEGIN_LOOP(), BEGIN_LOOP(),
CALL_NATIVE(bhv_object_water_wave_loop), CALL_NATIVE(bhv_object_water_wave_loop),
@@ -4268,7 +4240,7 @@ const BehaviorScript bhvLargeBomp[] = {
const BehaviorScript bhvWfSlidingPlatform[] = { const BehaviorScript bhvWfSlidingPlatform[] = {
BEGIN(OBJ_LIST_SURFACE), BEGIN(OBJ_LIST_SURFACE),
OR_INT(oFlags, (OBJ_FLAG_MOVE_XZ_USING_FVEL | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), OR_LONG(oFlags, (OBJ_FLAG_MOVE_XZ_USING_FVEL | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)),
LOAD_COLLISION_DATA(wf_seg7_collision_sliding_brick_platform), LOAD_COLLISION_DATA(wf_seg7_collision_sliding_brick_platform),
CALL_NATIVE(bhv_wf_sliding_platform_init), CALL_NATIVE(bhv_wf_sliding_platform_init),
BEGIN_LOOP(), BEGIN_LOOP(),
@@ -4367,7 +4339,7 @@ const BehaviorScript bhvThiBowlingBallSpawner[] = {
const BehaviorScript bhvRrCruiserWing[] = { const BehaviorScript bhvRrCruiserWing[] = {
BEGIN(OBJ_LIST_DEFAULT), BEGIN(OBJ_LIST_DEFAULT),
OR_LONG(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE), OR_LONG(oFlags, (OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)),
CALL_NATIVE(bhv_rr_cruiser_wing_init), CALL_NATIVE(bhv_rr_cruiser_wing_init),
BEGIN_LOOP(), BEGIN_LOOP(),
CALL_NATIVE(bhv_rr_cruiser_wing_loop), CALL_NATIVE(bhv_rr_cruiser_wing_loop),
@@ -4398,7 +4370,7 @@ const BehaviorScript bhvSslMovingPyramidWall[] = {
const BehaviorScript bhvPyramidElevator[] = { const BehaviorScript bhvPyramidElevator[] = {
BEGIN(OBJ_LIST_SURFACE), BEGIN(OBJ_LIST_SURFACE),
OR_LONG(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE), OR_LONG(oFlags, (OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)),
LOAD_COLLISION_DATA(ssl_seg7_collision_pyramid_elevator), LOAD_COLLISION_DATA(ssl_seg7_collision_pyramid_elevator),
SET_HOME(), SET_HOME(),
SET_FLOAT(oCollisionDistance, 20000), SET_FLOAT(oCollisionDistance, 20000),
@@ -4420,7 +4392,7 @@ const BehaviorScript bhvPyramidElevatorTrajectoryMarkerBall[] = {
const BehaviorScript bhvPyramidTop[] = { const BehaviorScript bhvPyramidTop[] = {
BEGIN(OBJ_LIST_SURFACE), BEGIN(OBJ_LIST_SURFACE),
OR_LONG(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE), OR_LONG(oFlags, (OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)),
LOAD_COLLISION_DATA(ssl_seg7_collision_pyramid_top), LOAD_COLLISION_DATA(ssl_seg7_collision_pyramid_top),
SET_HOME(), SET_HOME(),
SET_FLOAT(oCollisionDistance, 20000), SET_FLOAT(oCollisionDistance, 20000),
@@ -4676,7 +4648,7 @@ const BehaviorScript bhvHiddenStarTrigger[] = {
const BehaviorScript bhvTtmRollingLog[] = { const BehaviorScript bhvTtmRollingLog[] = {
BEGIN(OBJ_LIST_SURFACE), BEGIN(OBJ_LIST_SURFACE),
OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), OR_LONG(oFlags, (OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)),
LOAD_COLLISION_DATA(ttm_seg7_collision_pitoune_2), LOAD_COLLISION_DATA(ttm_seg7_collision_pitoune_2),
SET_HOME(), SET_HOME(),
SET_FLOAT(oCollisionDistance, 2000), SET_FLOAT(oCollisionDistance, 2000),
@@ -4700,7 +4672,7 @@ const BehaviorScript bhvLllVolcanoFallingTrap[] = {
const BehaviorScript bhvLllRollingLog[] = { const BehaviorScript bhvLllRollingLog[] = {
BEGIN(OBJ_LIST_SURFACE), BEGIN(OBJ_LIST_SURFACE),
OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), OR_LONG(oFlags, (OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)),
LOAD_COLLISION_DATA(lll_seg7_collision_pitoune), LOAD_COLLISION_DATA(lll_seg7_collision_pitoune),
SET_HOME(), SET_HOME(),
SET_FLOAT(oCollisionDistance, 2000), SET_FLOAT(oCollisionDistance, 2000),
@@ -4882,7 +4854,7 @@ const BehaviorScript bhvSnowMoundSpawn[] = {
const BehaviorScript bhvWdwSquareFloatingPlatform[] = { const BehaviorScript bhvWdwSquareFloatingPlatform[] = {
BEGIN(OBJ_LIST_SURFACE), BEGIN(OBJ_LIST_SURFACE),
OR_INT(oFlags, (OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), OR_LONG(oFlags, (OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)),
LOAD_COLLISION_DATA(wdw_seg7_collision_square_floating_platform), LOAD_COLLISION_DATA(wdw_seg7_collision_square_floating_platform),
SET_FLOAT(oFloatingPlatformUnkFC, 64), SET_FLOAT(oFloatingPlatformUnkFC, 64),
SET_HOME(), SET_HOME(),
@@ -4894,7 +4866,7 @@ const BehaviorScript bhvWdwSquareFloatingPlatform[] = {
const BehaviorScript bhvWdwRectangularFloatingPlatform[] = { const BehaviorScript bhvWdwRectangularFloatingPlatform[] = {
BEGIN(OBJ_LIST_SURFACE), BEGIN(OBJ_LIST_SURFACE),
OR_INT(oFlags, (OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), OR_LONG(oFlags, (OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)),
LOAD_COLLISION_DATA(wdw_seg7_collision_rect_floating_platform), LOAD_COLLISION_DATA(wdw_seg7_collision_rect_floating_platform),
SET_FLOAT(oFloatingPlatformUnkFC, 64), SET_FLOAT(oFloatingPlatformUnkFC, 64),
SET_HOME(), SET_HOME(),
@@ -4906,7 +4878,7 @@ const BehaviorScript bhvWdwRectangularFloatingPlatform[] = {
const BehaviorScript bhvJrbFloatingPlatform[] = { const BehaviorScript bhvJrbFloatingPlatform[] = {
BEGIN(OBJ_LIST_SURFACE), BEGIN(OBJ_LIST_SURFACE),
OR_INT(oFlags, (OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), OR_LONG(oFlags, (OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)),
LOAD_COLLISION_DATA(jrb_seg7_collision_floating_platform), LOAD_COLLISION_DATA(jrb_seg7_collision_floating_platform),
SET_FLOAT(oFloatingPlatformUnkFC, 64), SET_FLOAT(oFloatingPlatformUnkFC, 64),
SET_HOME(), SET_HOME(),
@@ -5238,7 +5210,7 @@ const BehaviorScript bhvWoodenPost[] = {
const BehaviorScript bhvChainChompGate[] = { const BehaviorScript bhvChainChompGate[] = {
BEGIN(OBJ_LIST_SURFACE), BEGIN(OBJ_LIST_SURFACE),
LOAD_COLLISION_DATA(bob_seg7_collision_chain_chomp_gate), LOAD_COLLISION_DATA(bob_seg7_collision_chain_chomp_gate),
OR_INT(oFlags, (OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), OR_LONG(oFlags, (OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)),
CALL_NATIVE(bhv_chain_chomp_gate_init), CALL_NATIVE(bhv_chain_chomp_gate_init),
BEGIN_LOOP(), BEGIN_LOOP(),
CALL_NATIVE(bhv_chain_chomp_gate_update), CALL_NATIVE(bhv_chain_chomp_gate_update),
@@ -5431,7 +5403,7 @@ const BehaviorScript bhvWaterBombSpawner[] = {
const BehaviorScript bhvWaterBomb[] = { const BehaviorScript bhvWaterBomb[] = {
BEGIN(OBJ_LIST_GENACTOR), BEGIN(OBJ_LIST_GENACTOR),
OR_LONG(oFlags, (OBJ_FLAG_COMPUTE_ANGLE_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), OR_INT(oFlags, (OBJ_FLAG_COMPUTE_ANGLE_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)),
SET_OBJ_PHYSICS(/*Wall hitbox radius*/ 120, /*Gravity*/ -400, /*Bounciness*/ 0, /*Drag strength*/ 1000, /*Friction*/ 1000, /*Buoyancy*/ 200, /*Unused*/ 0, 0), SET_OBJ_PHYSICS(/*Wall hitbox radius*/ 120, /*Gravity*/ -400, /*Bounciness*/ 0, /*Drag strength*/ 1000, /*Friction*/ 1000, /*Buoyancy*/ 200, /*Unused*/ 0, 0),
BEGIN_LOOP(), BEGIN_LOOP(),
CALL_NATIVE(bhv_water_bomb_update), CALL_NATIVE(bhv_water_bomb_update),
@@ -5449,7 +5421,7 @@ const BehaviorScript bhvWaterBombShadow[] = {
const BehaviorScript bhvTTCRotatingSolid[] = { const BehaviorScript bhvTTCRotatingSolid[] = {
BEGIN(OBJ_LIST_SURFACE), BEGIN(OBJ_LIST_SURFACE),
OR_INT(oFlags, (OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), OR_LONG(oFlags, (OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)),
SET_HOME(), SET_HOME(),
SET_FLOAT(oCollisionDistance, 450), SET_FLOAT(oCollisionDistance, 450),
CALL_NATIVE(bhv_ttc_rotating_solid_init), CALL_NATIVE(bhv_ttc_rotating_solid_init),
@@ -5543,7 +5515,7 @@ const BehaviorScript bhvTTCElevator[] = {
const BehaviorScript bhvTTC2DRotator[] = { const BehaviorScript bhvTTC2DRotator[] = {
BEGIN(OBJ_LIST_SURFACE), BEGIN(OBJ_LIST_SURFACE),
LOAD_COLLISION_DATA(ttc_seg7_collision_clock_main_rotation), LOAD_COLLISION_DATA(ttc_seg7_collision_clock_main_rotation),
OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), OR_LONG(oFlags, (OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)),
SET_FLOAT(oCollisionDistance, 1800), SET_FLOAT(oCollisionDistance, 1800),
CALL_NATIVE(bhv_ttc_2d_rotator_init), CALL_NATIVE(bhv_ttc_2d_rotator_init),
BEGIN_LOOP(), BEGIN_LOOP(),
@@ -5594,7 +5566,7 @@ const BehaviorScript bhvMrBlizzardSnowball[] = {
const BehaviorScript bhvSlidingPlatform2[] = { const BehaviorScript bhvSlidingPlatform2[] = {
BEGIN(OBJ_LIST_SURFACE), BEGIN(OBJ_LIST_SURFACE),
OR_INT(oFlags, (OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE)), OR_LONG(oFlags, (OBJ_FLAG_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)),
SET_HOME(), SET_HOME(),
CALL_NATIVE(bhv_sliding_plat_2_init), CALL_NATIVE(bhv_sliding_plat_2_init),
BEGIN_LOOP(), BEGIN_LOOP(),
@@ -5605,7 +5577,7 @@ const BehaviorScript bhvSlidingPlatform2[] = {
const BehaviorScript bhvOctagonalPlatformRotating[] = { const BehaviorScript bhvOctagonalPlatformRotating[] = {
BEGIN(OBJ_LIST_SURFACE), BEGIN(OBJ_LIST_SURFACE),
OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), OR_LONG(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE),
CALL_NATIVE(bhv_rotating_octagonal_plat_init), CALL_NATIVE(bhv_rotating_octagonal_plat_init),
BEGIN_LOOP(), BEGIN_LOOP(),
CALL_NATIVE(bhv_rotating_octagonal_plat_loop), CALL_NATIVE(bhv_rotating_octagonal_plat_loop),
@@ -5985,7 +5957,7 @@ const BehaviorScript bhvSkeeterWave[] = {
const BehaviorScript bhvSwingPlatform[] = { const BehaviorScript bhvSwingPlatform[] = {
BEGIN(OBJ_LIST_SURFACE), BEGIN(OBJ_LIST_SURFACE),
LOAD_COLLISION_DATA(rr_seg7_collision_pendulum), LOAD_COLLISION_DATA(rr_seg7_collision_pendulum),
OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), OR_LONG(oFlags, (OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)),
SET_FLOAT(oCollisionDistance, 2000), SET_FLOAT(oCollisionDistance, 2000),
CALL_NATIVE(bhv_swing_platform_init), CALL_NATIVE(bhv_swing_platform_init),
BEGIN_LOOP(), BEGIN_LOOP(),
@@ -6070,7 +6042,7 @@ const BehaviorScript bhvBeginningLakitu[] = {
OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE), OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE),
LOAD_ANIMATIONS(oAnimations, lakitu_seg6_anims_060058F8), LOAD_ANIMATIONS(oAnimations, lakitu_seg6_anims_060058F8),
ANIMATE(0), ANIMATE(0),
SET_FLOAT(oOpacity, 0), SET_INT(oOpacity, 0),
BEGIN_LOOP(), BEGIN_LOOP(),
CALL_NATIVE(bhv_intro_lakitu_loop), CALL_NATIVE(bhv_intro_lakitu_loop),
END_LOOP(), END_LOOP(),
@@ -6113,5 +6085,3 @@ const BehaviorScript bhvIntroScene[] = {
CALL_NATIVE(bhv_intro_scene_loop), CALL_NATIVE(bhv_intro_scene_loop),
END_LOOP(), END_LOOP(),
}; };

View File

@@ -76,6 +76,8 @@
#define HANGING_SPEED 12.f #define HANGING_SPEED 12.f
// Makes Mario face the direction of the analog stick directly while hanging from a ceiling, without doing "semicircles" // Makes Mario face the direction of the analog stick directly while hanging from a ceiling, without doing "semicircles"
#define TIGHTER_HANGING_CONTROLS #define TIGHTER_HANGING_CONTROLS
// Fixes Mario's turn radius by making it dependent on forward speed.
#define FIX_GROUND_TURN_RADIUS
// Makes Mario turn around instantly when moving on the ground // Makes Mario turn around instantly when moving on the ground
//#define SUPER_RESPONSIVE_CONTROLS //#define SUPER_RESPONSIVE_CONTROLS
// Disables fall damage // Disables fall damage

View File

@@ -7,11 +7,19 @@
#include "puppyprint.h" #include "puppyprint.h"
#include "audio/external.h" #include "audio/external.h"
#include "farcall.h" #include "farcall.h"
#include "game_init.h"
#include "main.h"
#include "sm64.h" #include "sm64.h"
#include "printf.h" #include "printf.h"
enum crashPages {
PAGE_STACK,
PAGE_LOG,
PAGE_COUNT
};
u8 gCrashScreenCharToGlyph[128] = { u8 gCrashScreenCharToGlyph[128] = {
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 41, -1, -1, -1, 43, -1, -1, 37, 38, -1, 42, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 41, -1, -1, -1, 43, -1, -1, 37, 38, -1, 42,
@@ -25,6 +33,9 @@ u32 gCrashScreenFont[7 * 9 + 1] = {
#include "textures/crash_custom/crash_screen_font.ia1.inc.c" #include "textures/crash_custom/crash_screen_font.ia1.inc.c"
}; };
u8 crashPage = 0;
u8 updateBuffer = TRUE;
char *gCauseDesc[18] = { char *gCauseDesc[18] = {
"Interrupt", "Interrupt",
@@ -76,7 +87,7 @@ void crash_screen_draw_rect(s32 x, s32 y, s32 w, s32 h) {
for (i = 0; i < h; i++) { for (i = 0; i < h; i++) {
for (j = 0; j < w; j++) { for (j = 0; j < w; j++) {
// 0xe738 = 0b1110011100111000 // 0xe738 = 0b1110011100111000
*ptr = ((*ptr & 0xe738) >> 2) | 1; *ptr = ((*ptr & 0xE738) >> 2) | 1;
ptr++; ptr++;
} }
ptr += gCrashScreen.width - w; ptr += gCrashScreen.width - w;
@@ -98,7 +109,7 @@ void crash_screen_draw_glyph(s32 x, s32 y, s32 glyph) {
rowMask = *data++; rowMask = *data++;
for (j = 0; j < 6; j++) { for (j = 0; j < 6; j++) {
*ptr++ = (bit & rowMask) ? 0xffff : 1; *ptr++ = (bit & rowMask) ? 0xFFFF : 1;
bit >>= 1; bit >>= 1;
} }
ptr += gCrashScreen.width - 6; ptr += gCrashScreen.width - 6;
@@ -153,8 +164,8 @@ void crash_screen_print_float_reg(s32 x, s32 y, s32 regNum, void *addr) {
s32 exponent; s32 exponent;
bits = *(u32 *) addr; bits = *(u32 *) addr;
exponent = ((bits & 0x7f800000U) >> 0x17) - 0x7f; exponent = ((bits & 0x7f800000U) >> 0x17) - 0x7F;
if ((exponent >= -0x7e && exponent <= 0x7f) || bits == 0) { if ((exponent >= -0x7E && exponent <= 0x7F) || bits == 0) {
crash_screen_print(x, y, "F%02d:%.3e", regNum, *(f32 *) addr); crash_screen_print(x, y, "F%02d:%.3e", regNum, *(f32 *) addr);
} else { } else {
crash_screen_print(x, y, "F%02d:%08XD", regNum, *(u32 *) addr); crash_screen_print(x, y, "F%02d:%08XD", regNum, *(u32 *) addr);
@@ -176,55 +187,30 @@ void crash_screen_print_fpcsr(u32 fpcsr) {
} }
} }
void draw_crash_screen(OSThread *thread) { void draw_crash_stack(OSThread *thread, s32 cause)
s16 cause; {
__OSThreadContext *tc = &thread->context; __OSThreadContext *tc = &thread->context;
cause = (tc->cause >> 2) & 0x1f;
if (cause == 23) // EXC_WATCH
{
cause = 16;
}
if (cause == 31) // EXC_VCED
{
cause = 17;
}
osWritebackDCacheAll();
crash_screen_sleep(500);
crash_screen_draw_rect(25, 20, 270, 25); crash_screen_draw_rect(25, 20, 270, 25);
crash_screen_print(30, 25, "THREAD:%d (%s)", thread->id, gCauseDesc[cause]); crash_screen_print(30, 25, "THREAD:%d (%s)", thread->id, gCauseDesc[cause]);
#if !PUPPYPRINT_DEBUG
crash_screen_print(30, 35, "PC:%08XH SR:%08XH VA:%08XH", tc->pc, tc->sr, tc->badvaddr); crash_screen_print(30, 35, "PC:%08XH SR:%08XH VA:%08XH", tc->pc, tc->sr, tc->badvaddr);
#else osWritebackDCacheAll();
crash_screen_print(30, 35, "PC:%08XH SR:%08XH RA:%08XH", tc->pc, tc->sr, (u32) tc->ra);
#endif
crash_screen_draw_rect(25, 45, 270, 185); crash_screen_draw_rect(25, 45, 270, 185);
#if !PUPPYPRINT_DEBUG
if ((u32)parse_map == 0x80345678) { if ((u32)parse_map == 0x80345678) {
crash_screen_print(30, 50, "AT:%08XH V0:%08XH V1:%08XH", (u32) tc->at, (u32) tc->v0, crash_screen_print(30, 50, "AT:%08XH V0:%08XH V1:%08XH", (u32) tc->at, (u32) tc->v0,
(u32) tc->v1); (u32) tc->v1);
} else { } else {
crash_screen_print(30, 50, "CRASH AT: %s", parse_map(tc->pc)); crash_screen_print(30, 50, "CRASH AT: %s", parse_map(tc->pc));
} }
// crash_screen_print(30, 50, "AT:%08XH V0:%08XH V1:%08XH", (u32) tc->at, (u32) tc->v0, // crash_screen_print(30, 50, "AT:%08XH V0:%08XH V1:%08XH", (u32) tc->at, (u32) tc->v0, (u32) tc->v1);
// (u32) tc->v1); crash_screen_print(30, 60, "A0:%08XH A1:%08XH A2:%08XH", (u32) tc->a0, (u32) tc->a1, (u32) tc->a2);
crash_screen_print(30, 60, "A0:%08XH A1:%08XH A2:%08XH", (u32) tc->a0, (u32) tc->a1, crash_screen_print(30, 70, "A3:%08XH T0:%08XH T1:%08XH", (u32) tc->a3, (u32) tc->t0, (u32) tc->t1);
(u32) tc->a2); crash_screen_print(30, 80, "T2:%08XH T3:%08XH T4:%08XH", (u32) tc->t2, (u32) tc->t3, (u32) tc->t4);
crash_screen_print(30, 70, "A3:%08XH T0:%08XH T1:%08XH", (u32) tc->a3, (u32) tc->t0, crash_screen_print(30, 90, "T5:%08XH T6:%08XH T7:%08XH", (u32) tc->t5, (u32) tc->t6, (u32) tc->t7);
(u32) tc->t1); crash_screen_print(30, 100, "S0:%08XH S1:%08XH S2:%08XH", (u32) tc->s0, (u32) tc->s1, (u32) tc->s2);
crash_screen_print(30, 80, "T2:%08XH T3:%08XH T4:%08XH", (u32) tc->t2, (u32) tc->t3, crash_screen_print(30, 110, "S3:%08XH S4:%08XH S5:%08XH", (u32) tc->s3, (u32) tc->s4, (u32) tc->s5);
(u32) tc->t4); crash_screen_print(30, 120, "S6:%08XH S7:%08XH T8:%08XH", (u32) tc->s6, (u32) tc->s7, (u32) tc->t8);
crash_screen_print(30, 90, "T5:%08XH T6:%08XH T7:%08XH", (u32) tc->t5, (u32) tc->t6, crash_screen_print(30, 130, "T9:%08XH GP:%08XH SP:%08XH", (u32) tc->t9, (u32) tc->gp, (u32) tc->sp);
(u32) tc->t7);
crash_screen_print(30, 100, "S0:%08XH S1:%08XH S2:%08XH", (u32) tc->s0, (u32) tc->s1,
(u32) tc->s2);
crash_screen_print(30, 110, "S3:%08XH S4:%08XH S5:%08XH", (u32) tc->s3, (u32) tc->s4,
(u32) tc->s5);
crash_screen_print(30, 120, "S6:%08XH S7:%08XH T8:%08XH", (u32) tc->s6, (u32) tc->s7,
(u32) tc->t8);
crash_screen_print(30, 130, "T9:%08XH GP:%08XH SP:%08XH", (u32) tc->t9, (u32) tc->gp,
(u32) tc->sp);
crash_screen_print(30, 140, "S8:%08XH RA:%08XH", (u32) tc->s8, (u32) tc->ra); crash_screen_print(30, 140, "S8:%08XH RA:%08XH", (u32) tc->s8, (u32) tc->ra);
crash_screen_print_fpcsr(tc->fpcsr); crash_screen_print_fpcsr(tc->fpcsr);
@@ -245,18 +231,75 @@ void draw_crash_screen(OSThread *thread) {
crash_screen_print_float_reg(120, 210, 26, &tc->fp26.f.f_even); crash_screen_print_float_reg(120, 210, 26, &tc->fp26.f.f_even);
crash_screen_print_float_reg(210, 210, 28, &tc->fp28.f.f_even); crash_screen_print_float_reg(210, 210, 28, &tc->fp28.f.f_even);
crash_screen_print_float_reg(30, 220, 30, &tc->fp30.f.f_even); crash_screen_print_float_reg(30, 220, 30, &tc->fp30.f.f_even);
#else }
void draw_crash_log(OSThread *thread, s32 cause)
{
#if PUPPYPRINT_DEBUG
s32 i; s32 i;
#define LINE_HEIGHT 60 + ((LOG_BUFFER_SIZE-1)*10)
crash_screen_draw_rect(25, 20, 270, 210);
osWritebackDCacheAll();
#define LINE_HEIGHT 25 + ((LOG_BUFFER_SIZE-1)*10)
for (i = 0; i < LOG_BUFFER_SIZE; i++) for (i = 0; i < LOG_BUFFER_SIZE; i++)
{ {
crash_screen_print(30, (LINE_HEIGHT)-(i*10), consoleLogTable[i]); crash_screen_print(30, (LINE_HEIGHT)-(i*10), consoleLogTable[i]);
} }
#undef LINE_HEIGHT #undef LINE_HEIGHT
#endif #endif
osWritebackDCacheAll(); }
osViBlack(FALSE);
osViSwapBuffer(gCrashScreen.framebuffer);
void draw_crash_screen(OSThread *thread)
{
s32 cause;
__OSThreadContext *tc = &thread->context;
cause = (tc->cause >> 2) & 0x1F;
if (cause == 23) // EXC_WATCH
{
cause = 16;
}
if (cause == 31) // EXC_VCED
{
cause = 17;
}
if (gPlayer1Controller->buttonPressed & R_TRIG)
{
crashPage++;
updateBuffer = TRUE;
}
if (gPlayer1Controller->buttonPressed & L_TRIG || gPlayer1Controller->buttonPressed & Z_TRIG)
{
crashPage--;
updateBuffer = TRUE;
}
#if !PUPPYPRINT_DEBUG
if (crashPage == PAGE_LOG)
crashPage++;
#endif
if (crashPage >= PAGE_COUNT)
crashPage = 0;
if (crashPage == 255)
crashPage = PAGE_COUNT-1;
if (updateBuffer)
{
crash_screen_print(15, 10, "Page:%d L/Z: Left R: Right", crashPage);
switch (crashPage)
{
case PAGE_STACK: draw_crash_stack(thread, cause); break;
case PAGE_LOG: draw_crash_log(thread, cause); break;
}
osWritebackDCacheAll();
osViBlack(FALSE);
osViSwapBuffer(gCrashScreen.framebuffer);
updateBuffer = FALSE;
}
} }
OSThread *get_crashed_thread(void) { OSThread *get_crashed_thread(void) {
@@ -276,6 +319,7 @@ OSThread *get_crashed_thread(void) {
extern u16 sRenderedFramebuffer; extern u16 sRenderedFramebuffer;
extern void audio_signal_game_loop_tick(void); extern void audio_signal_game_loop_tick(void);
extern void stop_sounds_in_continuous_banks(void); extern void stop_sounds_in_continuous_banks(void);
extern void read_controller_inputs(s32 threadID);
extern struct SequenceQueueItem sBackgroundMusicQueue[6]; extern struct SequenceQueueItem sBackgroundMusicQueue[6];
void thread2_crash_screen(UNUSED void *arg) { void thread2_crash_screen(UNUSED void *arg) {
@@ -284,17 +328,8 @@ void thread2_crash_screen(UNUSED void *arg) {
osSetEventMesg(OS_EVENT_CPU_BREAK, &gCrashScreen.mesgQueue, (OSMesg) 1); osSetEventMesg(OS_EVENT_CPU_BREAK, &gCrashScreen.mesgQueue, (OSMesg) 1);
osSetEventMesg(OS_EVENT_FAULT, &gCrashScreen.mesgQueue, (OSMesg) 2); osSetEventMesg(OS_EVENT_FAULT, &gCrashScreen.mesgQueue, (OSMesg) 2);
do { goto finished;
#if PUPPYPRINT_DEBUG reset:
OSTime first = osGetTime();
#endif
osRecvMesg(&gCrashScreen.mesgQueue, &mesg, 1);
thread = get_crashed_thread();
gCrashScreen.framebuffer = (u16 *) gFrameBuffers[sRenderedFramebuffer];
#if PUPPYPRINT_DEBUG
profiler_update(faultTime, first);
#endif
} while (thread == NULL);
if ((u32) map_data_init != 0x80345678) { if ((u32) map_data_init != 0x80345678) {
map_data_init(); map_data_init();
} }
@@ -302,19 +337,41 @@ void thread2_crash_screen(UNUSED void *arg) {
stop_sounds_in_continuous_banks(); stop_sounds_in_continuous_banks();
stop_background_music(sBackgroundMusicQueue[0].seqId); stop_background_music(sBackgroundMusicQueue[0].seqId);
audio_signal_game_loop_tick(); audio_signal_game_loop_tick();
draw_crash_screen(thread); crash_screen_sleep(200);
play_sound(SOUND_MARIO_WAAAOOOW, gGlobalSoundSource); play_sound(SOUND_MARIO_WAAAOOOW, gGlobalSoundSource);
audio_signal_game_loop_tick(); audio_signal_game_loop_tick();
for (;;) { crash_screen_sleep(200);
finished:
while (TRUE)
{
#if PUPPYPRINT_DEBUG
OSTime first = osGetTime();
#endif
if (thread == NULL)
{
osRecvMesg(&gCrashScreen.mesgQueue, &mesg, 1);
thread = get_crashed_thread();
gCrashScreen.framebuffer = (u16 *) gFrameBuffers[sRenderedFramebuffer];
if (thread)
goto reset;
}
else
{
if (gControllerBits) {
#if ENABLE_RUMBLE
block_until_rumble_pak_free();
#endif
osContStartReadData(&gSIEventMesgQueue);
}
read_controller_inputs(2);
draw_crash_screen(thread);
}
#if PUPPYPRINT_DEBUG
profiler_update(faultTime, first);
#endif
} }
} }
void crash_screen_set_framebuffer(u16 *framebuffer, u16 width, u16 height) {
gCrashScreen.framebuffer = framebuffer;
gCrashScreen.width = width;
gCrashScreen.height = height;
}
void crash_screen_init(void) { void crash_screen_init(void) {
gCrashScreen.framebuffer = (u16 *) gFrameBuffers[sRenderedFramebuffer]; gCrashScreen.framebuffer = (u16 *) gFrameBuffers[sRenderedFramebuffer];
gCrashScreen.width = SCREEN_WIDTH; gCrashScreen.width = SCREEN_WIDTH;

View File

@@ -577,12 +577,13 @@ void run_demo_inputs(void) {
/** /**
* Update the controller struct with available inputs if present. * Update the controller struct with available inputs if present.
*/ */
void read_controller_inputs(void) { void read_controller_inputs(s32 threadID) {
s32 i; s32 i;
// If any controllers are plugged in, update the controller information. // If any controllers are plugged in, update the controller information.
if (gControllerBits) { if (gControllerBits) {
osRecvMesg(&gSIEventMesgQueue, &gMainReceivedMesg, OS_MESG_BLOCK); if (threadID == 5)
osRecvMesg(&gSIEventMesgQueue, &gMainReceivedMesg, OS_MESG_BLOCK);
osContGetReadData(&gControllerPads[0]); osContGetReadData(&gControllerPads[0]);
#if ENABLE_RUMBLE #if ENABLE_RUMBLE
release_rumble_pak_control(); release_rumble_pak_control();
@@ -765,7 +766,7 @@ void thread5_game_loop(UNUSED void *arg) {
audio_game_loop_tick(); audio_game_loop_tick();
select_gfx_pool(); select_gfx_pool();
read_controller_inputs(); read_controller_inputs(5);
addr = level_script_execute(addr); addr = level_script_execute(addr);
#if PUPPYPRINT_DEBUG == 0 && defined(VISUAL_DEBUG) #if PUPPYPRINT_DEBUG == 0 && defined(VISUAL_DEBUG)
debug_box_input(); debug_box_input();

View File

@@ -434,6 +434,11 @@ s32 update_decelerating_speed(struct MarioState *m) {
return stopped; return stopped;
} }
s32 analog_stick_held_back(struct MarioState *m) {
s16 intendedDYaw = m->intendedYaw - m->faceAngle[1];
return intendedDYaw < -0x471C || intendedDYaw > 0x471C;
}
void update_walking_speed(struct MarioState *m) { void update_walking_speed(struct MarioState *m) {
f32 maxTargetSpeed; f32 maxTargetSpeed;
f32 targetSpeed; f32 targetSpeed;
@@ -461,9 +466,30 @@ void update_walking_speed(struct MarioState *m) {
if (m->forwardVel > 48.0f) { if (m->forwardVel > 48.0f) {
m->forwardVel = 48.0f; m->forwardVel = 48.0f;
} }
#ifdef SUPER_RESPONSIVE_CONTROLS #ifdef FIX_GROUND_TURN_RADIUS
m->faceAngle[1] = m->intendedYaw; if ((m->forwardVel < 0.0f) && (m->heldObj == NULL) && !(m->action & ACT_FLAG_SHORT_HITBOX)) {
m->faceAngle[1] += 0x8000;
m->forwardVel *= -1.0f;
}
if (analog_stick_held_back(m) && (m->heldObj == NULL) && !(m->action & ACT_FLAG_SHORT_HITBOX)) {
set_mario_action(m, ACT_TURNING_AROUND, 0);
if (m->forwardVel < 10.0f) {
m->faceAngle[1] = m->intendedYaw;
}
} else {
s16 turnRange = (0xFFF - (m->forwardVel * 0x20));
if (turnRange < 0x800) {
turnRange = 0x800;
set_mario_action(m, ACT_TURNING_AROUND, 0);
} else if (turnRange > 0xFFF) {
turnRange = 0xFFF;
}
m->faceAngle[1] =
m->intendedYaw - approach_s32((s16)(m->intendedYaw - m->faceAngle[1]), 0, 0x800, 0x800);
}
#elif SUPER_RESPONSIVE_CONTROLS
m->faceAngle[1] = m->intendedYaw;
#else #else
m->faceAngle[1] = m->faceAngle[1] =
m->intendedYaw - approach_s32((s16)(m->intendedYaw - m->faceAngle[1]), 0, 0x800, 0x800); m->intendedYaw - approach_s32((s16)(m->intendedYaw - m->faceAngle[1]), 0, 0x800, 0x800);
@@ -484,11 +510,6 @@ s32 should_begin_sliding(struct MarioState *m) {
return FALSE; return FALSE;
} }
s32 analog_stick_held_back(struct MarioState *m) {
s16 intendedDYaw = m->intendedYaw - m->faceAngle[1];
return intendedDYaw < -0x471C || intendedDYaw > 0x471C;
}
s32 check_ground_dive_or_punch(struct MarioState *m) { s32 check_ground_dive_or_punch(struct MarioState *m) {
UNUSED s32 unused; UNUSED s32 unused;