From 808106ae2f305d4f7f96a782fe1c9144c27832c3 Mon Sep 17 00:00:00 2001 From: thecozies Date: Mon, 20 Sep 2021 10:06:33 -0500 Subject: [PATCH 01/97] Added GEO_BONE geolayout command --- include/geo_commands.h | 18 +++++++++ src/engine/geo_layout.c | 33 +++++++++++++++- src/engine/geo_layout.h | 1 + src/engine/graph_node.c | 22 +++++++++++ src/engine/graph_node.h | 12 ++++++ src/game/rendering_graph_node.c | 67 +++++++++++++++++++++++++++++++++ 6 files changed, 152 insertions(+), 1 deletion(-) diff --git a/include/geo_commands.h b/include/geo_commands.h index 432ec1fd..319c47e7 100644 --- a/include/geo_commands.h +++ b/include/geo_commands.h @@ -429,4 +429,22 @@ #define GEO_CULLING_RADIUS(cullingRadius) \ CMD_BBH(0x20, 0x00, cullingRadius) +#define GEO_BONE_ID 0xFF + +/** + * 0x21: Create a scene graph node that is rotated by the object's animation + an initial rotation. + * u8 drawingLayer + * s16 xTranslation + * s16 yTranslation + * s16 zTranslation + * s16 xRotation + * s16 yRotation + * s16 zRotation + * u32 displayList: dislay list segmented address + */ +#define GEO_BONE(layer, tx, ty, tz, rx, ry, rz, displayList) \ + CMD_BBH(GEO_BONE_ID, layer, 0x0000), \ + CMD_HHHHHH(tx, ty, tz, rx, ry, rz), \ + CMD_PTR(displayList) + #endif // GEO_COMMANDS_H diff --git a/src/engine/geo_layout.c b/src/engine/geo_layout.c index d071d1a6..98284db3 100644 --- a/src/engine/geo_layout.c +++ b/src/engine/geo_layout.c @@ -767,6 +767,30 @@ void geo_layout_cmd_node_culling_radius(void) { gGeoLayoutCommand += 0x04 << CMD_SIZE_SHIFT; } +/* + Create a scene graph node that is rotated by the object's animation + an initial rotation. +*/ +void geo_layout_cmd_bone(void) { + struct GraphNodeBone *graphNode; + Vec3s translation; + Vec3s rotation; + s32 drawingLayer = cur_geo_cmd_u8(0x01); + void *displayList; + s16 *cmdPos = (s16 *) gGeoLayoutCommand; + + cmdPos = read_vec3s(translation, &cmdPos[2]); + cmdPos = read_vec3s(rotation, &cmdPos[0]); + displayList = *(void **) &cmdPos[0]; + cmdPos += 2 << CMD_SIZE_SHIFT; + + graphNode = + init_graph_node_bone(gGraphNodePool, NULL, drawingLayer, displayList, translation, rotation); + + register_scene_graph_node(&graphNode->node); + + gGeoLayoutCommand = (u8 *) cmdPos; +} + struct GraphNode *process_geo_layout(struct AllocOnlyPool *pool, void *segptr) { // set by register_scene_graph_node when gCurGraphNodeIndex is 0 // and gCurRootGraphNode is NULL @@ -788,7 +812,14 @@ struct GraphNode *process_geo_layout(struct AllocOnlyPool *pool, void *segptr) { gGeoLayoutStack[1] = 0; while (gGeoLayoutCommand != NULL) { - GeoLayoutJumpTable[gGeoLayoutCommand[0x00]](); + // Custom geo commands can be a part of the switch-case, otherwise use GeoLayoutJumpTable + switch (gGeoLayoutCommand[0x00]) { + case GEO_BONE_ID: + geo_layout_cmd_bone(); + break; + default: + GeoLayoutJumpTable[gGeoLayoutCommand[0x00]](); + } } return gCurRootGraphNode; diff --git a/src/engine/geo_layout.h b/src/engine/geo_layout.h index 6211e141..a0818c61 100644 --- a/src/engine/geo_layout.h +++ b/src/engine/geo_layout.h @@ -81,6 +81,7 @@ void geo_layout_cmd_nop(void); void geo_layout_cmd_copy_view(void); void geo_layout_cmd_node_held_obj(void); void geo_layout_cmd_node_culling_radius(void); +void geo_layout_cmd_bone(void); struct GraphNode *process_geo_layout(struct AllocOnlyPool *a0, void *segptr); diff --git a/src/engine/graph_node.c b/src/engine/graph_node.c index 8edf7f8f..03593dec 100644 --- a/src/engine/graph_node.c +++ b/src/engine/graph_node.c @@ -365,6 +365,28 @@ struct GraphNodeAnimatedPart *init_graph_node_animated_part(struct AllocOnlyPool return graphNode; } +/** + * Allocates and returns a newly created bone node with initial rotation/translation + */ +struct GraphNodeBone *init_graph_node_bone(struct AllocOnlyPool *pool, + struct GraphNodeBone *graphNode, + s32 drawingLayer, void *displayList, + Vec3s translation, Vec3s rotation) { + if (pool != NULL) { + graphNode = alloc_only_pool_alloc(pool, sizeof(struct GraphNodeBone)); + } + + if (graphNode != NULL) { + init_scene_graph_node_links(&graphNode->node, GRAPH_NODE_TYPE_BONE); + vec3s_copy(graphNode->translation, translation); + vec3s_copy(graphNode->rotation, rotation); + graphNode->node.flags = (drawingLayer << 8) | (graphNode->node.flags & 0xFF); + graphNode->displayList = displayList; + } + + return graphNode; +} + /** * Allocates and returns a newly created billboard node */ diff --git a/src/engine/graph_node.h b/src/engine/graph_node.h index e20064c3..5a3f770c 100644 --- a/src/engine/graph_node.h +++ b/src/engine/graph_node.h @@ -5,6 +5,7 @@ #include #include "types.h" +#include "geo_commands.h" #include "game/memory.h" #define GRAPH_RENDER_ACTIVE (1 << 0) @@ -34,6 +35,7 @@ #define GRAPH_NODE_TYPE_ROTATION 0x017 #define GRAPH_NODE_TYPE_OBJECT 0x018 #define GRAPH_NODE_TYPE_ANIMATED_PART 0x019 +#define GRAPH_NODE_TYPE_BONE GEO_BONE_ID #define GRAPH_NODE_TYPE_BILLBOARD 0x01A #define GRAPH_NODE_TYPE_DISPLAY_LIST 0x01B #define GRAPH_NODE_TYPE_SCALE 0x01C @@ -242,6 +244,14 @@ struct GraphNodeAnimatedPart /*0x18*/ Vec3s translation; }; +struct GraphNodeBone +{ + struct GraphNode node; + void *displayList; + Vec3s translation; + Vec3s rotation; +}; + /** A GraphNode that draws a display list rotated in a way to always face the * camera. Note that if the entire object is a billboard (like a coin or 1-up) * then it simply sets the billboard flag for the entire object, this node is @@ -390,6 +400,8 @@ struct GraphNodeObject *init_graph_node_object(struct AllocOnlyPool *pool, struc struct GraphNodeCullingRadius *init_graph_node_culling_radius(struct AllocOnlyPool *pool, struct GraphNodeCullingRadius *graphNode, s16 radius); struct GraphNodeAnimatedPart *init_graph_node_animated_part(struct AllocOnlyPool *pool, struct GraphNodeAnimatedPart *graphNode, s32 drawingLayer, void *displayList, Vec3s translation); +struct GraphNodeBone *init_graph_node_bone(struct AllocOnlyPool *pool, struct GraphNodeBone *graphNode, + s32 drawingLayer, void *displayList, Vec3s translation, Vec3s rotation); struct GraphNodeBillboard *init_graph_node_billboard(struct AllocOnlyPool *pool, struct GraphNodeBillboard *graphNode, s32 drawingLayer, void *displayList, Vec3s translation); struct GraphNodeDisplayList *init_graph_node_display_list(struct AllocOnlyPool *pool, struct GraphNodeDisplayList *graphNode, diff --git a/src/game/rendering_graph_node.c b/src/game/rendering_graph_node.c index 9cdab49b..42c236fd 100644 --- a/src/game/rendering_graph_node.c +++ b/src/game/rendering_graph_node.c @@ -598,6 +598,70 @@ static void geo_process_animated_part(struct GraphNodeAnimatedPart *node) { gMatStackIndex--; } +/** + * Render an animated part that has an initial rotation value + */ +static void geo_process_bone(struct GraphNodeBone *node) { + Mat4 matrix; + Vec3s rotation; + Vec3f translation; + Mtx *matrixPtr = alloc_display_list(sizeof(*matrixPtr)); + + vec3s_copy(rotation, node->rotation); + vec3f_set(translation, node->translation[0], node->translation[1], node->translation[2]); + if (gCurAnimType == ANIM_TYPE_TRANSLATION) { + translation[0] += gCurAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)] + * gCurAnimTranslationMultiplier; + translation[1] += gCurAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)] + * gCurAnimTranslationMultiplier; + translation[2] += gCurAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)] + * gCurAnimTranslationMultiplier; + gCurAnimType = ANIM_TYPE_ROTATION; + } else { + if (gCurAnimType == ANIM_TYPE_LATERAL_TRANSLATION) { + translation[0] += + gCurAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)] + * gCurAnimTranslationMultiplier; + gCurrAnimAttribute += 2; + translation[2] += + gCurAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)] + * gCurAnimTranslationMultiplier; + gCurAnimType = ANIM_TYPE_ROTATION; + } else { + if (gCurAnimType == ANIM_TYPE_VERTICAL_TRANSLATION) { + gCurrAnimAttribute += 2; + translation[1] += + gCurAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)] + * gCurAnimTranslationMultiplier; + gCurrAnimAttribute += 2; + gCurAnimType = ANIM_TYPE_ROTATION; + } else if (gCurAnimType == ANIM_TYPE_NO_TRANSLATION) { + gCurrAnimAttribute += 6; + gCurAnimType = ANIM_TYPE_ROTATION; + } + } + } + + if (gCurAnimType == ANIM_TYPE_ROTATION) { + rotation[0] += gCurAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)]; + rotation[1] += gCurAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)]; + rotation[2] += gCurAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)]; + } + + mtxf_rotate_xyz_and_translate(matrix, translation, rotation); + mtxf_mul(gMatStack[gMatStackIndex + 1], matrix, gMatStack[gMatStackIndex]); + gMatStackIndex++; + mtxf_to_mtx(matrixPtr, gMatStack[gMatStackIndex]); + gMatStackFixed[gMatStackIndex] = matrixPtr; + if (node->displayList != NULL) { + geo_append_display_list(node->displayList, node->node.flags >> 8); + } + if (node->node.children != NULL) { + geo_process_node_and_siblings(node->node.children); + } + gMatStackIndex--; +} + /** * Initialize the animation-related global variables for the currently drawn * object's animation. @@ -1021,6 +1085,9 @@ void geo_process_node_and_siblings(struct GraphNode *firstNode) { case GRAPH_NODE_TYPE_HELD_OBJ: geo_process_held_object((struct GraphNodeHeldObject *) curGraphNode); break; + case GRAPH_NODE_TYPE_BONE: + geo_process_bone((struct GraphNodeBone *) curGraphNode); + break; default: geo_try_process_children((struct GraphNode *) curGraphNode); break; From 39f92391f800190091d581ff8caac98760655758 Mon Sep 17 00:00:00 2001 From: Fazana <52551480+FazanaJ@users.noreply.github.com> Date: Mon, 27 Sep 2021 13:16:04 +0100 Subject: [PATCH 02/97] Matrix optimisation Courtesy of Kaze, creator of all existing romhacks --- src/engine/math_util.c | 46 +++++ src/engine/math_util.h | 1 + src/game/rendering_graph_node.c | 279 +++++++++------------------ textures/segment2/custom_text.i4.png | Bin 2646 -> 1870 bytes 4 files changed, 138 insertions(+), 188 deletions(-) diff --git a/src/engine/math_util.c b/src/engine/math_util.c index 9969bf33..0dc5d8f5 100644 --- a/src/engine/math_util.c +++ b/src/engine/math_util.c @@ -148,6 +148,52 @@ void mtxf_translate(Mat4 dest, Vec3f b) { vec3f_copy(dest[3], b); } +void mtxf_rot_trans_mul(Vec3s rot, Vec3f trans, Mat4 dest, Mat4 src) { + register f32 sx = sins(rot[0]); + register f32 cx = coss(rot[0]); + + register f32 sy = sins(rot[1]); + register f32 cy = coss(rot[1]); + + register f32 sz = sins(rot[2]); + register f32 cz = coss(rot[2]); + register f32 entry0; + register f32 entry1; + register f32 entry2; + + entry0 = cy * cz; + entry1 = cy * sz; + entry2 = -sy; + dest[0][0] = entry0 * src[0][0] + entry1 * src[1][0] + entry2 * src[2][0]; + dest[0][1] = entry0 * src[0][1] + entry1 * src[1][1] + entry2 * src[2][1]; + dest[0][2] = entry0 * src[0][2] + entry1 * src[1][2] + entry2 * src[2][2]; + + entry1 = sx * sy; + entry0 = entry1 * cz - cx * sz; + entry1 = entry1 * sz + cx * cz; + entry2 = sx * cy; + dest[1][0] = entry0 * src[0][0] + entry1 * src[1][0] + entry2 * src[2][0]; + dest[1][1] = entry0 * src[0][1] + entry1 * src[1][1] + entry2 * src[2][1]; + dest[1][2] = entry0 * src[0][2] + entry1 * src[1][2] + entry2 * src[2][2]; + + entry1 = cx * sy; + entry0 = entry1 * cz + sx * sz; + entry1 = entry1 * sz - sx * cz; + entry2 = cx * cy; + dest[2][0] = entry0 * src[0][0] + entry1 * src[1][0] + entry2 * src[2][0]; + dest[2][1] = entry0 * src[0][1] + entry1 * src[1][1] + entry2 * src[2][1]; + dest[2][2] = entry0 * src[0][2] + entry1 * src[1][2] + entry2 * src[2][2]; + + entry0 = trans[0]; + entry1 = trans[1]; + entry2 = trans[2]; + dest[3][0] = entry0 * src[0][0] + entry1 * src[1][0] + entry2 * src[2][0] + src[3][0]; + dest[3][1] = entry0 * src[0][1] + entry1 * src[1][1] + entry2 * src[2][1] + src[3][1]; + dest[3][2] = entry0 * src[0][2] + entry1 * src[1][2] + entry2 * src[2][2] + src[3][2]; + dest[0][3] = dest[1][3] = dest[2][3] = 0; + ((u32 *) dest)[15] = 0x3F800000; +} + /** * Set mtx to a look-at matrix for the camera. The resulting transformation * transforms the world as if there exists a camera at position 'from' pointed diff --git a/src/engine/math_util.h b/src/engine/math_util.h index bf572c98..17a605c6 100644 --- a/src/engine/math_util.h +++ b/src/engine/math_util.h @@ -417,5 +417,6 @@ f32 atan2f(f32 a, f32 b); void spline_get_weights(Vec4f result, f32 t, UNUSED s32 c); void anim_spline_init(Vec4s *keyFrames); s32 anim_spline_poll(Vec3f result); +void mtxf_rot_trans_mul(Vec3s rot, Vec3f trans, Mat4 dest, Mat4 src); #endif // MATH_UTIL_H diff --git a/src/game/rendering_graph_node.c b/src/game/rendering_graph_node.c index 2ed12a49..e7660c44 100644 --- a/src/game/rendering_graph_node.c +++ b/src/game/rendering_graph_node.c @@ -202,7 +202,7 @@ void reset_clipping(void) 3. It does this, because layers 5-7 are non zbuffered, and just doing 0-7 of ZEX, then 0-7 of REJ would make the ZEX 0-4 render on top of Rej's 5-7. */ -static void geo_process_master_list_sub(struct GraphNodeMasterList *node) { +void geo_process_master_list_sub(struct GraphNodeMasterList *node) { struct DisplayListNode *currList; s32 startLayer, endLayer, currLayer = LAYER_FORCE; s32 headsIndex = LIST_HEADS_REJ; @@ -318,7 +318,7 @@ static void geo_process_master_list_sub(struct GraphNodeMasterList *node) { * parameter. Look at the RenderModeContainer struct to see the corresponding * render modes of layers. */ -static void geo_append_display_list(void *displayList, s32 layer) { +void geo_append_display_list(void *displayList, s32 layer) { s32 index = 0; #ifdef F3DEX_GBI_2 gSPLookAt(gDisplayListHead++, &lookAt); @@ -355,10 +355,26 @@ static void geo_append_display_list(void *displayList, s32 layer) { } } +void incrementMatStack() { + Mtx *mtx = alloc_display_list(sizeof(*mtx)); + gMatStackIndex++; + mtxf_to_mtx(mtx, gMatStack[gMatStackIndex]); + gMatStackFixed[gMatStackIndex] = mtx; +} +void appendDLandReturn(struct GraphNodeDisplayList *node) { + if (node->displayList != NULL) { + geo_append_display_list(node->displayList, node->node.flags >> 8); + } + if (node->node.children != NULL) { + geo_process_node_and_siblings(node->node.children); + } + gMatStackIndex--; +} + /** * Process the master list node. */ -static void geo_process_master_list(struct GraphNodeMasterList *node) { +void geo_process_master_list(struct GraphNodeMasterList *node) { s32 i; if (gCurGraphNodeMasterList == NULL && node->node.children != NULL) { @@ -376,7 +392,7 @@ static void geo_process_master_list(struct GraphNodeMasterList *node) { /** * Process an orthographic projection node. */ -static void geo_process_ortho_projection(struct GraphNodeOrthoProjection *node) { +void geo_process_ortho_projection(struct GraphNodeOrthoProjection *node) { if (node->node.children != NULL) { Mtx *mtx = alloc_display_list(sizeof(*mtx)); f32 left = (gCurGraphNodeRoot->x - gCurGraphNodeRoot->width ) / 2.0f * node->scale; @@ -395,7 +411,7 @@ static void geo_process_ortho_projection(struct GraphNodeOrthoProjection *node) /** * Process a perspective projection node. */ -static void geo_process_perspective(struct GraphNodePerspective *node) { +void geo_process_perspective(struct GraphNodePerspective *node) { if (node->fnNode.func != NULL) { node->fnNode.func(GEO_CONTEXT_RENDER, &node->fnNode.node, gMatStack[gMatStackIndex]); } @@ -433,7 +449,7 @@ static void geo_process_perspective(struct GraphNodePerspective *node) { * of this node are only processed if that distance is within the render * range of this node. */ -static void geo_process_level_of_detail(struct GraphNodeLevelOfDetail *node) { +void geo_process_level_of_detail(struct GraphNodeLevelOfDetail *node) { #ifdef AUTO_LOD f32 distanceFromCam = (gIsConsole ? -gMatStack[gMatStackIndex][3][2] : 50); #else @@ -452,7 +468,7 @@ static void geo_process_level_of_detail(struct GraphNodeLevelOfDetail *node) { * if it is 0, and among the node's children, only the selected child is * processed next. */ -static void geo_process_switch(struct GraphNodeSwitchCase *node) { +void geo_process_switch(struct GraphNodeSwitchCase *node) { struct GraphNode *selectedChild = node->fnNode.node.children; s32 i; @@ -467,7 +483,7 @@ static void geo_process_switch(struct GraphNodeSwitchCase *node) { } } -static void make_roll_matrix(Mtx *mtx, s32 angle) { +void make_roll_matrix(Mtx *mtx, s32 angle) { Mat4 temp; mtxf_identity(temp); temp[0][0] = coss(angle); @@ -480,7 +496,7 @@ static void make_roll_matrix(Mtx *mtx, s32 angle) { /** * Process a camera node. */ -static void geo_process_camera(struct GraphNodeCamera *node) { +void geo_process_camera(struct GraphNodeCamera *node) { Mat4 cameraTransform; Mtx *rollMtx = alloc_display_list(sizeof(*rollMtx)); Mtx *mtx = alloc_display_list(sizeof(*mtx)); @@ -494,9 +510,7 @@ static void geo_process_camera(struct GraphNodeCamera *node) { mtxf_lookat(cameraTransform, node->pos, node->focus, node->roll); mtxf_mul(gMatStack[gMatStackIndex + 1], cameraTransform, gMatStack[gMatStackIndex]); - gMatStackIndex++; - mtxf_to_mtx(mtx, gMatStack[gMatStackIndex]); - gMatStackFixed[gMatStackIndex] = mtx; + incrementMatStack(); if (node->fnNode.node.children != 0) { gCurGraphNodeCamera = node; node->matrixPtr = &gMatStack[gMatStackIndex]; @@ -512,24 +526,15 @@ static void geo_process_camera(struct GraphNodeCamera *node) { * the float and fixed point matrix stacks. * For the rest it acts as a normal display list node. */ -static void geo_process_translation_rotation(struct GraphNodeTranslationRotation *node) { +void geo_process_translation_rotation(struct GraphNodeTranslationRotation *node) { Mat4 mtxf; Vec3f translation; - Mtx *mtx = alloc_display_list(sizeof(*mtx)); vec3_copy(translation, node->translation); mtxf_rotate_zxy_and_translate(mtxf, translation, node->rotation); mtxf_mul(gMatStack[gMatStackIndex + 1], mtxf, gMatStack[gMatStackIndex]); - gMatStackIndex++; - mtxf_to_mtx(mtx, gMatStack[gMatStackIndex]); - gMatStackFixed[gMatStackIndex] = mtx; - if (node->displayList != NULL) { - geo_append_display_list(node->displayList, GET_GRAPH_NODE_LAYER(node->node.flags)); - } - if (node->node.children != NULL) { - geo_process_node_and_siblings(node->node.children); - } - gMatStackIndex--; + incrementMatStack(); + appendDLandReturn(((struct GraphNodeDisplayList *)node)); } /** @@ -537,24 +542,15 @@ static void geo_process_translation_rotation(struct GraphNodeTranslationRotation * translation is created and pushed on both the float and fixed point matrix stacks. * For the rest it acts as a normal display list node. */ -static void geo_process_translation(struct GraphNodeTranslation *node) { +void geo_process_translation(struct GraphNodeTranslation *node) { Mat4 mtxf; Vec3f translation; - Mtx *mtx = alloc_display_list(sizeof(*mtx)); vec3_copy(translation, node->translation); mtxf_rotate_zxy_and_translate(mtxf, translation, gVec3sZero); mtxf_mul(gMatStack[gMatStackIndex + 1], mtxf, gMatStack[gMatStackIndex]); - gMatStackIndex++; - mtxf_to_mtx(mtx, gMatStack[gMatStackIndex]); - gMatStackFixed[gMatStackIndex] = mtx; - if (node->displayList != NULL) { - geo_append_display_list(node->displayList, GET_GRAPH_NODE_LAYER(node->node.flags)); - } - if (node->node.children != NULL) { - geo_process_node_and_siblings(node->node.children); - } - gMatStackIndex--; + incrementMatStack(); + appendDLandReturn(((struct GraphNodeDisplayList *)node)); } /** @@ -562,22 +558,13 @@ static void geo_process_translation(struct GraphNodeTranslation *node) { * rotation is created and pushed on both the float and fixed point matrix stacks. * For the rest it acts as a normal display list node. */ -static void geo_process_rotation(struct GraphNodeRotation *node) { +void geo_process_rotation(struct GraphNodeRotation *node) { Mat4 mtxf; - Mtx *mtx = alloc_display_list(sizeof(*mtx)); mtxf_rotate_zxy_and_translate(mtxf, gVec3fZero, node->rotation); mtxf_mul(gMatStack[gMatStackIndex + 1], mtxf, gMatStack[gMatStackIndex]); - gMatStackIndex++; - mtxf_to_mtx(mtx, gMatStack[gMatStackIndex]); - gMatStackFixed[gMatStackIndex] = mtx; - if (node->displayList != NULL) { - geo_append_display_list(node->displayList, GET_GRAPH_NODE_LAYER(node->node.flags)); - } - if (node->node.children != NULL) { - geo_process_node_and_siblings(node->node.children); - } - gMatStackIndex--; + incrementMatStack(); + appendDLandReturn(((struct GraphNodeDisplayList *)node)); } /** @@ -585,22 +572,13 @@ static void geo_process_rotation(struct GraphNodeRotation *node) { * scale is created and pushed on both the float and fixed point matrix stacks. * For the rest it acts as a normal display list node. */ -static void geo_process_scale(struct GraphNodeScale *node) { +void geo_process_scale(struct GraphNodeScale *node) { Vec3f scaleVec; - Mtx *mtx = alloc_display_list(sizeof(*mtx)); vec3f_set(scaleVec, node->scale, node->scale, node->scale); mtxf_scale_vec3f(gMatStack[gMatStackIndex + 1], gMatStack[gMatStackIndex], scaleVec); - gMatStackIndex++; - mtxf_to_mtx(mtx, gMatStack[gMatStackIndex]); - gMatStackFixed[gMatStackIndex] = mtx; - if (node->displayList != NULL) { - geo_append_display_list(node->displayList, GET_GRAPH_NODE_LAYER(node->node.flags)); - } - if (node->node.children != NULL) { - geo_process_node_and_siblings(node->node.children); - } - gMatStackIndex--; + incrementMatStack(); + appendDLandReturn(((struct GraphNodeDisplayList *)node)); } /** @@ -609,31 +587,20 @@ static void geo_process_scale(struct GraphNodeScale *node) { * point matrix stacks. * For the rest it acts as a normal display list node. */ -static void geo_process_billboard(struct GraphNodeBillboard *node) { +void geo_process_billboard(struct GraphNodeBillboard *node) { Vec3f translation; - Mtx *mtx = alloc_display_list(sizeof(*mtx)); - gMatStackIndex++; vec3_copy(translation, node->translation); - mtxf_billboard(gMatStack[gMatStackIndex], gMatStack[gMatStackIndex - 1], translation, - gCurGraphNodeCamera->roll); + mtxf_billboard(gMatStack[gMatStackIndex+1], gMatStack[gMatStackIndex], translation, gCurGraphNodeCamera->roll); + if (gCurGraphNodeHeldObject != NULL) { - mtxf_scale_vec3f(gMatStack[gMatStackIndex], gMatStack[gMatStackIndex], - gCurGraphNodeHeldObject->objNode->header.gfx.scale); + mtxf_scale_vec3f(gMatStack[gMatStackIndex+1], gMatStack[gMatStackIndex+1], gCurGraphNodeHeldObject->objNode->header.gfx.scale); } else if (gCurGraphNodeObject != NULL) { - mtxf_scale_vec3f(gMatStack[gMatStackIndex], gMatStack[gMatStackIndex], - gCurGraphNodeObject->scale); + mtxf_scale_vec3f(gMatStack[gMatStackIndex+1], gMatStack[gMatStackIndex+1], gCurGraphNodeObject->scale); } - mtxf_to_mtx(mtx, gMatStack[gMatStackIndex]); - gMatStackFixed[gMatStackIndex] = mtx; - if (node->displayList != NULL) { - geo_append_display_list(node->displayList, GET_GRAPH_NODE_LAYER(node->node.flags)); - } - if (node->node.children != NULL) { - geo_process_node_and_siblings(node->node.children); - } - gMatStackIndex--; + incrementMatStack(); + appendDLandReturn(((struct GraphNodeDisplayList *)node)); } /** @@ -641,20 +608,16 @@ static void geo_process_billboard(struct GraphNodeBillboard *node) { * a transformation on the stack, so all transformations are inherited from the * parent node. It processes its children if it has them. */ -static void geo_process_display_list(struct GraphNodeDisplayList *node) { - if (node->displayList != NULL) { - geo_append_display_list(node->displayList, GET_GRAPH_NODE_LAYER(node->node.flags)); - } - if (node->node.children != NULL) { - geo_process_node_and_siblings(node->node.children); - } +void geo_process_display_list(struct GraphNodeDisplayList *node) { + appendDLandReturn(((struct GraphNodeDisplayList *)node)); + gMatStackIndex++; } /** * Process a generated list. Instead of storing a pointer to a display list, * the list is generated on the fly by a function. */ -static void geo_process_generated_list(struct GraphNodeGenerated *node) { +void geo_process_generated_list(struct GraphNodeGenerated *node) { if (node->fnNode.func != NULL) { Gfx *list = node->fnNode.func(GEO_CONTEXT_RENDER, &node->fnNode.node, (struct AllocOnlyPool *) gMatStack[gMatStackIndex]); @@ -673,7 +636,7 @@ static void geo_process_generated_list(struct GraphNodeGenerated *node) { * the function of the node. If that function is null or returns null, a black * rectangle is drawn instead. */ -static void geo_process_background(struct GraphNodeBackground *node) { +void geo_process_background(struct GraphNodeBackground *node) { Gfx *list = NULL; if (node->fnNode.func != NULL) { @@ -710,38 +673,26 @@ static void geo_process_background(struct GraphNodeBackground *node) { * Render an animated part. The current animation state is not part of the node * but set in global variables. If an animated part is skipped, everything afterwards desyncs. */ -static void geo_process_animated_part(struct GraphNodeAnimatedPart *node) { - Mat4 matrix; - Vec3s rotation; - Vec3f translation; - Mtx *matrixPtr = alloc_display_list(sizeof(*matrixPtr)); +void geo_process_animated_part(struct GraphNodeAnimatedPart *node) { + Vec3s rotation = {0, 0, 0}; + Vec3f translation = {node->translation[0], node->translation[1], node->translation[2]}; - vec3s_copy(rotation, gVec3sZero); vec3f_set(translation, node->translation[0], node->translation[1], node->translation[2]); if (gCurAnimType == ANIM_TYPE_TRANSLATION) { - translation[0] += gCurAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)] - * gCurAnimTranslationMultiplier; - translation[1] += gCurAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)] - * gCurAnimTranslationMultiplier; - translation[2] += gCurAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)] - * gCurAnimTranslationMultiplier; + translation[0] += gCurAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)] * gCurAnimTranslationMultiplier; + translation[1] += gCurAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)] * gCurAnimTranslationMultiplier; + translation[2] += gCurAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)] * gCurAnimTranslationMultiplier; gCurAnimType = ANIM_TYPE_ROTATION; } else { if (gCurAnimType == ANIM_TYPE_LATERAL_TRANSLATION) { - translation[0] += - gCurAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)] - * gCurAnimTranslationMultiplier; + translation[0] += gCurAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)] * gCurAnimTranslationMultiplier; gCurrAnimAttribute += 2; - translation[2] += - gCurAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)] - * gCurAnimTranslationMultiplier; + translation[2] += gCurAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)] * gCurAnimTranslationMultiplier; gCurAnimType = ANIM_TYPE_ROTATION; } else { if (gCurAnimType == ANIM_TYPE_VERTICAL_TRANSLATION) { gCurrAnimAttribute += 2; - translation[1] += - gCurAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)] - * gCurAnimTranslationMultiplier; + translation[1] += gCurAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)] * gCurAnimTranslationMultiplier; gCurrAnimAttribute += 2; gCurAnimType = ANIM_TYPE_ROTATION; } else if (gCurAnimType == ANIM_TYPE_NO_TRANSLATION) { @@ -750,61 +701,38 @@ static void geo_process_animated_part(struct GraphNodeAnimatedPart *node) { } } } - if (gCurAnimType == ANIM_TYPE_ROTATION) { rotation[0] = gCurAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)]; rotation[1] = gCurAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)]; rotation[2] = gCurAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)]; } - mtxf_rotate_xyz_and_translate(matrix, translation, rotation); - mtxf_mul(gMatStack[gMatStackIndex + 1], matrix, gMatStack[gMatStackIndex]); - gMatStackIndex++; - mtxf_to_mtx(matrixPtr, gMatStack[gMatStackIndex]); - gMatStackFixed[gMatStackIndex] = matrixPtr; - if (node->displayList != NULL) { - geo_append_display_list(node->displayList, GET_GRAPH_NODE_LAYER(node->node.flags)); - } - if (node->node.children != NULL) { - geo_process_node_and_siblings(node->node.children); - } - gMatStackIndex--; + mtxf_rot_trans_mul(rotation, translation, gMatStack[gMatStackIndex + 1], gMatStack[gMatStackIndex]); + incrementMatStack(); + appendDLandReturn(((struct GraphNodeDisplayList *)node)); } /** * Render an animated part that has an initial rotation value */ -static void geo_process_bone(struct GraphNodeBone *node) { - Mat4 matrix; - Vec3s rotation; - Vec3f translation; - Mtx *matrixPtr = alloc_display_list(sizeof(*matrixPtr)); +void geo_process_bone(struct GraphNodeBone *node) { + Vec3s rotation = {0, 0, 0}; + Vec3f translation = {node->translation[0], node->translation[1], node->translation[2]}; - vec3s_copy(rotation, node->rotation); - vec3f_set(translation, node->translation[0], node->translation[1], node->translation[2]); if (gCurAnimType == ANIM_TYPE_TRANSLATION) { - translation[0] += gCurAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)] - * gCurAnimTranslationMultiplier; - translation[1] += gCurAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)] - * gCurAnimTranslationMultiplier; - translation[2] += gCurAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)] - * gCurAnimTranslationMultiplier; + translation[0] += gCurAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)] * gCurAnimTranslationMultiplier; + translation[1] += gCurAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)] * gCurAnimTranslationMultiplier; + translation[2] += gCurAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)] * gCurAnimTranslationMultiplier; gCurAnimType = ANIM_TYPE_ROTATION; } else { if (gCurAnimType == ANIM_TYPE_LATERAL_TRANSLATION) { - translation[0] += - gCurAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)] - * gCurAnimTranslationMultiplier; + translation[0] += gCurAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)] * gCurAnimTranslationMultiplier; gCurrAnimAttribute += 2; - translation[2] += - gCurAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)] - * gCurAnimTranslationMultiplier; + translation[2] += gCurAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)] * gCurAnimTranslationMultiplier; gCurAnimType = ANIM_TYPE_ROTATION; } else { if (gCurAnimType == ANIM_TYPE_VERTICAL_TRANSLATION) { gCurrAnimAttribute += 2; - translation[1] += - gCurAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)] - * gCurAnimTranslationMultiplier; + translation[1] += gCurAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)] * gCurAnimTranslationMultiplier; gCurrAnimAttribute += 2; gCurAnimType = ANIM_TYPE_ROTATION; } else if (gCurAnimType == ANIM_TYPE_NO_TRANSLATION) { @@ -813,25 +741,14 @@ static void geo_process_bone(struct GraphNodeBone *node) { } } } - if (gCurAnimType == ANIM_TYPE_ROTATION) { - rotation[0] += gCurAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)]; - rotation[1] += gCurAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)]; - rotation[2] += gCurAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)]; + rotation[0] = gCurAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)]; + rotation[1] = gCurAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)]; + rotation[2] = gCurAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)]; } - - mtxf_rotate_xyz_and_translate(matrix, translation, rotation); - mtxf_mul(gMatStack[gMatStackIndex + 1], matrix, gMatStack[gMatStackIndex]); - gMatStackIndex++; - mtxf_to_mtx(matrixPtr, gMatStack[gMatStackIndex]); - gMatStackFixed[gMatStackIndex] = matrixPtr; - if (node->displayList != NULL) { - geo_append_display_list(node->displayList, GET_GRAPH_NODE_LAYER(node->node.flags)); - } - if (node->node.children != NULL) { - geo_process_node_and_siblings(node->node.children); - } - gMatStackIndex--; + mtxf_rot_trans_mul(rotation, translation, gMatStack[gMatStackIndex + 1], gMatStack[gMatStackIndex]); + incrementMatStack(); + appendDLandReturn(((struct GraphNodeDisplayList *)node)); } /** @@ -872,7 +789,7 @@ void geo_set_animation_globals(struct AnimInfo *node, s32 hasAnimation) { * translation of the first animated component and rotated according to * the floor below it. */ -static void geo_process_shadow(struct GraphNodeShadow *node) { +void geo_process_shadow(struct GraphNodeShadow *node) { Gfx *shadowList; Mat4 mtxf; Vec3f shadowPos; @@ -882,7 +799,6 @@ static void geo_process_shadow(struct GraphNodeShadow *node) { f32 sinAng; f32 cosAng; struct GraphNode *geo; - Mtx *mtx; if (gCurGraphNodeCamera != NULL && gCurGraphNodeObject != NULL) { if (gCurGraphNodeHeldObject != NULL) { @@ -924,12 +840,9 @@ static void geo_process_shadow(struct GraphNodeShadow *node) { shadowList = create_shadow_below_xyz(shadowPos[0], shadowPos[1], shadowPos[2], shadowScale, node->shadowSolidity, node->shadowType); if (shadowList != NULL) { - mtx = alloc_display_list(sizeof(*mtx)); - gMatStackIndex++; mtxf_translate(mtxf, shadowPos); - mtxf_mul(gMatStack[gMatStackIndex], mtxf, *gCurGraphNodeCamera->matrixPtr); - mtxf_to_mtx(mtx, gMatStack[gMatStackIndex]); - gMatStackFixed[gMatStackIndex] = mtx; + mtxf_mul(gMatStack[gMatStackIndex+1], mtxf, *gCurGraphNodeCamera->matrixPtr); + incrementMatStack(); geo_append_display_list((void *) VIRTUAL_TO_PHYSICAL(shadowList), ((gShadowAboveWaterOrLava || gShadowAboveCustomWater || gMarioOnIceOrCarpet) ? LAYER_TRANSPARENT : LAYER_TRANSPARENT_DECAL)); gMatStackIndex--; } @@ -970,7 +883,7 @@ static void geo_process_shadow(struct GraphNodeShadow *node) { * * Since (0,0,0) is unaffected by rotation, columns 0, 1 and 2 are ignored. */ -static s32 obj_is_in_view(struct GraphNodeObject *node, Mat4 matrix) { +s32 obj_is_in_view(struct GraphNodeObject *node, Mat4 matrix) { s32 cullingRadius; s32 halfFov; // half of the fov in in-game angle units instead of degrees struct GraphNode *geo; @@ -1026,17 +939,15 @@ static s32 obj_is_in_view(struct GraphNodeObject *node, Mat4 matrix) { /** * Process an object node. */ -static void geo_process_object(struct Object *node) { +void geo_process_object(struct Object *node) { Mat4 mtxf; s32 hasAnimation = (node->header.gfx.node.flags & GRAPH_RENDER_HAS_ANIMATION) != 0; if (node->header.gfx.areaIndex == gCurGraphNodeRoot->areaIndex) { if (node->header.gfx.throwMatrix != NULL) { - mtxf_mul(gMatStack[gMatStackIndex + 1], *node->header.gfx.throwMatrix, - gMatStack[gMatStackIndex]); + mtxf_mul(gMatStack[gMatStackIndex + 1], *node->header.gfx.throwMatrix, gMatStack[gMatStackIndex]); } else if (node->header.gfx.node.flags & GRAPH_RENDER_BILLBOARD) { - mtxf_billboard(gMatStack[gMatStackIndex + 1], gMatStack[gMatStackIndex], - node->header.gfx.pos, gCurGraphNodeCamera->roll); + mtxf_billboard(gMatStack[gMatStackIndex + 1], gMatStack[gMatStackIndex], node->header.gfx.pos, gCurGraphNodeCamera->roll); } else { mtxf_rotate_zxy_and_translate(mtxf, node->header.gfx.pos, node->header.gfx.angle); mtxf_mul(gMatStack[gMatStackIndex + 1], mtxf, gMatStack[gMatStackIndex]); @@ -1044,19 +955,16 @@ static void geo_process_object(struct Object *node) { mtxf_scale_vec3f(gMatStack[gMatStackIndex + 1], gMatStack[gMatStackIndex + 1], node->header.gfx.scale); node->header.gfx.throwMatrix = &gMatStack[++gMatStackIndex]; - node->header.gfx.cameraToObject[0] = gMatStack[gMatStackIndex][3][0]; - node->header.gfx.cameraToObject[1] = gMatStack[gMatStackIndex][3][1]; - node->header.gfx.cameraToObject[2] = gMatStack[gMatStackIndex][3][2]; + vec3_copy(node->header.gfx.cameraToObject, gMatStack[gMatStackIndex][3]); // FIXME: correct types if (node->header.gfx.animInfo.curAnim != NULL) { geo_set_animation_globals(&node->header.gfx.animInfo, hasAnimation); } if (obj_is_in_view(&node->header.gfx, gMatStack[gMatStackIndex])) { - Mtx *mtx = alloc_display_list(sizeof(*mtx)); - mtxf_to_mtx(mtx, gMatStack[gMatStackIndex]); - gMatStackFixed[gMatStackIndex] = mtx; + gMatStackIndex--; + incrementMatStack(); if (node->header.gfx.sharedChild != NULL) { #ifdef VISUAL_DEBUG if (hitboxView) { @@ -1102,7 +1010,7 @@ static void geo_process_object(struct Object *node) { * the subtree rooted at 'sharedChild' and processes the subtree, after which the * actual children are be processed. (in practice they are null though) */ -static void geo_process_object_parent(struct GraphNodeObjectParent *node) { +void geo_process_object_parent(struct GraphNodeObjectParent *node) { if (node->sharedChild != NULL) { node->sharedChild->parent = (struct GraphNode *) node; geo_process_node_and_siblings(node->sharedChild); @@ -1119,7 +1027,6 @@ static void geo_process_object_parent(struct GraphNodeObjectParent *node) { void geo_process_held_object(struct GraphNodeHeldObject *node) { Mat4 mat; Vec3f translation; - Mtx *mtx = alloc_display_list(sizeof(*mtx)); #ifdef F3DEX_GBI_2 gSPLookAt(gDisplayListHead++, &lookAt); @@ -1141,15 +1048,11 @@ void geo_process_held_object(struct GraphNodeHeldObject *node) { gMatStack[gMatStackIndex + 1][3][1] = gMatStack[gMatStackIndex][3][1]; gMatStack[gMatStackIndex + 1][3][2] = gMatStack[gMatStackIndex][3][2]; mtxf_mul(gMatStack[gMatStackIndex + 1], mat, gMatStack[gMatStackIndex + 1]); - mtxf_scale_vec3f(gMatStack[gMatStackIndex + 1], gMatStack[gMatStackIndex + 1], - node->objNode->header.gfx.scale); + mtxf_scale_vec3f(gMatStack[gMatStackIndex + 1], gMatStack[gMatStackIndex + 1], node->objNode->header.gfx.scale); if (node->fnNode.func != NULL) { - node->fnNode.func(GEO_CONTEXT_HELD_OBJ, &node->fnNode.node, - (struct AllocOnlyPool *) gMatStack[gMatStackIndex + 1]); + node->fnNode.func(GEO_CONTEXT_HELD_OBJ, &node->fnNode.node, (struct AllocOnlyPool *) gMatStack[gMatStackIndex + 1]); } - gMatStackIndex++; - mtxf_to_mtx(mtx, gMatStack[gMatStackIndex]); - gMatStackFixed[gMatStackIndex] = mtx; + incrementMatStack(); gGeoTempState.type = gCurAnimType; gGeoTempState.enabled = gCurAnimEnabled; gGeoTempState.frame = gCurrAnimFrame; diff --git a/textures/segment2/custom_text.i4.png b/textures/segment2/custom_text.i4.png index 02dd2d17c379a8fdf962e199cb20fe2e2fc1645a..0227ef1b415075ff334f6ca6624efde5b96313fa 100644 GIT binary patch delta 1856 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 From c69a7e12339768f3bb1d14b8e6f76c868db6e346 Mon Sep 17 00:00:00 2001 From: Fazana <52551480+FazanaJ@users.noreply.github.com> Date: Mon, 27 Sep 2021 14:14:23 +0100 Subject: [PATCH 03/97] shadow --- src/game/object_list_processor.c | 1 + src/game/rendering_graph_node.h | 1 + src/game/shadow.c | 38 +++++++++++++++++++++++++++----- 3 files changed, 34 insertions(+), 6 deletions(-) diff --git a/src/game/object_list_processor.c b/src/game/object_list_processor.c index 2bf5710c..d4cbb6d4 100644 --- a/src/game/object_list_processor.c +++ b/src/game/object_list_processor.c @@ -509,6 +509,7 @@ void spawn_objects_from_info(UNUSED s32 unused, struct SpawnInfo *spawnInfo) { object->oMoveAnglePitch = spawnInfo->startAngle[0]; object->oMoveAngleYaw = spawnInfo->startAngle[1]; object->oMoveAngleRoll = spawnInfo->startAngle[2]; + object->oFloorHeight = find_floor(object->oPosX, object->oPosY, object->oPosZ, &object->oFloor); } spawnInfo = spawnInfo->next; diff --git a/src/game/rendering_graph_node.h b/src/game/rendering_graph_node.h index d096a30a..f574a65e 100644 --- a/src/game/rendering_graph_node.h +++ b/src/game/rendering_graph_node.h @@ -11,6 +11,7 @@ extern struct GraphNodePerspective *gCurGraphNodeCamFrustum; extern struct GraphNodeCamera *gCurGraphNodeCamera; extern struct GraphNodeObject *gCurGraphNodeObject; extern struct GraphNodeHeldObject *gCurGraphNodeHeldObject; +#define gCurGraphNodeObjectNode ((struct Object *)gCurGraphNodeObject) extern u16 gAreaUpdateCounter; extern f32 gWorldScale; diff --git a/src/game/shadow.c b/src/game/shadow.c index ac41789c..79bb07ca 100644 --- a/src/game/shadow.c +++ b/src/game/shadow.c @@ -159,7 +159,7 @@ f32 disable_shadow_with_distance(f32 shadowScale, f32 distFromFloor) { /** * Dim a shadow when its parent object is further from the ground. */ -u8 dim_shadow_with_distance(u8 solidity, f32 distFromFloor) { +s32 dim_shadow_with_distance(u8 solidity, f32 distFromFloor) { f32 ret; if (solidity < 121) { @@ -197,7 +197,7 @@ f32 get_water_level_below_shadow(struct Shadow *s, struct Surface **waterFloor) * @param overwriteSolidity Flag for whether the existing shadow solidity should * be dimmed based on its distance to the floor */ -s8 init_shadow(struct Shadow *s, f32 xPos, f32 yPos, f32 zPos, s16 shadowScale, u8 overwriteSolidity) { +s32 init_shadow(struct Shadow *s, f32 xPos, f32 yPos, f32 zPos, s16 shadowScale, u8 overwriteSolidity) { f32 waterLevel = FLOOR_LOWER_LIMIT_SHADOW; f32 floorSteepness; struct Surface *floor; @@ -207,7 +207,16 @@ s8 init_shadow(struct Shadow *s, f32 xPos, f32 yPos, f32 zPos, s16 shadowScale, s->parentY = yPos; s->parentZ = zPos; - s->floorHeight = find_floor(s->parentX, s->parentY, s->parentZ, &floor); + + if (gCurGraphNodeObjectNode->oFloor != NULL) + { + s->floorHeight = gCurGraphNodeObjectNode->oFloorHeight; + floor = gCurGraphNodeObjectNode->oFloor; + } + else + { + s->floorHeight = find_floor(s->parentX, s->parentY, s->parentZ, &floor); + } waterLevel = get_water_level_below_shadow(s, &waterFloor); @@ -531,7 +540,7 @@ void linearly_interpolate_solidity_negative(struct Shadow *s, u8 initialSolidity /** * Change a shadow's solidity based on the player's current animation frame. */ -s8 correct_shadow_solidity_for_animations(s32 isLuigi, u8 initialSolidity, struct Shadow *shadow) { +s32 correct_shadow_solidity_for_animations(s32 isLuigi, u8 initialSolidity, struct Shadow *shadow) { struct Object *player; s8 ret; s16 animFrame; @@ -711,9 +720,18 @@ Gfx *create_shadow_circle_assuming_flat_ground(f32 xPos, f32 yPos, f32 zPos, s16 Vtx *verts; Gfx *displayList; f32 distBelowFloor; - f32 floorHeight = find_floor_height(xPos, yPos, zPos); + f32 floorHeight; f32 radius = shadowScale / 2; + if (gCurGraphNodeObjectNode->oFloor != NULL) + { + floorHeight = gCurGraphNodeObjectNode->oFloorHeight; + } + else + { + floorHeight = find_floor_height(xPos, yPos, zPos); + } + if (floorHeight < FLOOR_LOWER_LIMIT_SHADOW) { return NULL; } else { @@ -770,7 +788,15 @@ Gfx *create_shadow_rectangle(f32 halfWidth, f32 halfLength, f32 relY, u8 solidit */ s32 get_shadow_height_solidity(f32 xPos, f32 yPos, f32 zPos, f32 *shadowHeight, u8 *solidity) { f32 waterLevel; - *shadowHeight = find_floor_height(xPos, yPos, zPos); + + if (gCurGraphNodeObjectNode->oFloor != NULL) + { + *shadowHeight = gCurGraphNodeObjectNode->oFloorHeight; + } + else + { + *shadowHeight = find_floor_height(xPos, yPos, zPos); + } if (*shadowHeight < FLOOR_LOWER_LIMIT_SHADOW) { return 1; From abb6fd286d71b9dfa0681d8ff24a5e06f07e0b2a Mon Sep 17 00:00:00 2001 From: Fazana <52551480+FazanaJ@users.noreply.github.com> Date: Mon, 27 Sep 2021 17:21:23 +0100 Subject: [PATCH 04/97] Farclip failsafe --- src/game/rendering_graph_node.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/game/rendering_graph_node.c b/src/game/rendering_graph_node.c index e7660c44..451da73d 100644 --- a/src/game/rendering_graph_node.c +++ b/src/game/rendering_graph_node.c @@ -417,6 +417,8 @@ void geo_process_perspective(struct GraphNodePerspective *node) { } if (node->fnNode.node.children != NULL) { u16 perspNorm; + f32 farClip = node->far; + f32 farClipDelta = farClip; Mtx *mtx = alloc_display_list(sizeof(*mtx)); #ifdef WIDE if (gConfig.widescreen && (gCurrLevelNum != 0x01)){ @@ -434,7 +436,14 @@ void geo_process_perspective(struct GraphNodePerspective *node) { } else { gWorldScale = 1.0f; } - guPerspective(mtx, &perspNorm, node->fov, sAspectRatio, ((node->far / 300) / gWorldScale), (node->far / gWorldScale), 1.0f); + farClip = CLAMP(farClip / gWorldScale, 4096, 61440); + if (farClip / farClipDelta != 1) + { + farClipDelta /= farClip; + gWorldScale *= farClipDelta; + } + + guPerspective(mtx, &perspNorm, node->fov, sAspectRatio, ((farClip / 300) / gWorldScale), (farClip / gWorldScale), 1.0f); gSPPerspNormalize(gDisplayListHead++, perspNorm); gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(mtx), (G_MTX_PROJECTION | G_MTX_LOAD | G_MTX_NOPUSH)); gCurGraphNodeCamFrustum = node; From e71ba07b22074e437b52a43b9be00a36a9cc2eaa Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Mon, 27 Sep 2021 10:21:25 -0700 Subject: [PATCH 05/97] Add some fields to MarioState --- include/object_constants.h | 1 + include/types.h | 22 ++- src/game/mario.c | 294 ++++++++++++----------------- src/game/mario.h | 6 +- src/game/mario_actions_automatic.c | 11 +- src/game/mario_actions_moving.c | 10 +- src/game/mario_actions_submerged.c | 9 +- src/game/mario_step.c | 47 ++--- src/game/object_list_processor.c | 2 +- src/game/rendering_graph_node.c | 3 +- 10 files changed, 168 insertions(+), 237 deletions(-) diff --git a/include/object_constants.h b/include/object_constants.h index fdc789e4..c95c6eb2 100644 --- a/include/object_constants.h +++ b/include/object_constants.h @@ -97,6 +97,7 @@ OBJ_MOVE_UNDERWATER_ON_GROUND) /* oActiveParticleFlags */ +#define ACTIVE_PARTICLE_NONE (0 << 0) // 0x00000000 #define ACTIVE_PARTICLE_DUST (1 << 0) // 0x00000001 #define ACTIVE_PARTICLE_UNUSED_1 (1 << 1) // 0x00000002 #define ACTIVE_PARTICLE_UNUSED_2 (1 << 2) // 0x00000004 diff --git a/include/types.h b/include/types.h index 4037586a..5d22ebeb 100644 --- a/include/types.h +++ b/include/types.h @@ -348,7 +348,7 @@ struct MarioState /*0x68*/ struct Surface *floor; /*0x6C*/ f32 ceilHeight; /*0x70*/ f32 floorHeight; - /*0x74*/ s16 floorAngle; + /*0x74*/ s16 floorYaw; /*0x76*/ s16 waterLevel; /*0x78*/ struct Object *interactObj; /*0x7C*/ struct Object *heldObj; @@ -364,14 +364,14 @@ struct MarioState /*0xA4*/ u32 collidedObjInteractTypes; /*0xA8*/ s16 numCoins; /*0xAA*/ s16 numStars; - /*0xAC*/ s8 numKeys; // Unused key mechanic - /*0xAD*/ s8 numLives; + /*0xAC*/ s8 numKeys; // Unused key mechanic + /*0xAD*/ s8 numLives; /*0xAE*/ s16 health; /*0xB0*/ s16 animYTrans; - /*0xB2*/ u8 hurtCounter; - /*0xB3*/ u8 healCounter; - /*0xB4*/ u8 squishTimer; - /*0xB5*/ u8 fadeWarpOpacity; + /*0xB2*/ u8 hurtCounter; + /*0xB3*/ u8 healCounter; + /*0xB4*/ u8 squishTimer; + /*0xB5*/ u8 fadeWarpOpacity; /*0xB6*/ u16 capTimer; /*0xB8*/ s16 prevNumStarsForDialog; /*0xBC*/ f32 peakHeight; @@ -381,6 +381,14 @@ struct MarioState s16 breath; u8 breathCounter; #endif + Vec3f lastSafePos; + Vec3f prevPos; + f32 lateralSpeed; + f32 moveSpeed; + Angle movePitch; + Angle moveYaw; + Angle ceilYaw; + Angle wallYaw; }; #endif // TYPES_H diff --git a/src/game/mario.c b/src/game/mario.c index 73711bf4..2d6f7474 100644 --- a/src/game/mario.c +++ b/src/game/mario.c @@ -178,8 +178,7 @@ s32 is_anim_past_frame(struct MarioState *m, s16 animFrame) { * and returns the animation's flags. */ s16 find_mario_anim_flags_and_translation(struct Object *obj, s32 yaw, Vec3s translation) { - f32 dx; - f32 dz; + f32 dx, dz; struct Animation *curAnim = (void *) obj->header.gfx.animInfo.curAnim; s16 animFrame = geo_update_animation_frame(&obj->header.gfx.animInfo, NULL); @@ -193,7 +192,7 @@ s16 find_mario_anim_flags_and_translation(struct Object *obj, s32 yaw, Vec3s tra translation[1] = *(animValues + (retrieve_animation_index(animFrame, &animIndex))) / 4.0f; dz = *(animValues + (retrieve_animation_index(animFrame, &animIndex))) / 4.0f; - translation[0] = (dx * c) + (dz * s); + translation[0] = ( dx * c) + (dz * s); translation[2] = (-dx * s) + (dz * c); return curAnim->flags; @@ -524,9 +523,7 @@ s32 mario_facing_downhill(struct MarioState *m, s32 turnYaw) { if (turnYaw && m->forwardVel < 0.0f) { faceAngleYaw += 0x8000; } - - faceAngleYaw = m->floorAngle - faceAngleYaw; - + faceAngleYaw = m->floorYaw - faceAngleYaw; return (-0x4000 < faceAngleYaw) && (faceAngleYaw < 0x4000); } @@ -536,28 +533,15 @@ s32 mario_facing_downhill(struct MarioState *m, s32 turnYaw) { u32 mario_floor_is_slippery(struct MarioState *m) { f32 normY; - if ((m->area->terrainType & TERRAIN_MASK) == TERRAIN_SLIDE - && m->floor->normal.y < 0.9998477f //~cos(1 deg) - ) { + if ((m->area->terrainType & TERRAIN_MASK) == TERRAIN_SLIDE && m->floor->normal.y < 0.9998477f) { //~cos(1 deg) return TRUE; } switch (mario_get_floor_class(m)) { - case SURFACE_VERY_SLIPPERY: - normY = 0.9848077f; //~cos(10 deg) - break; - - case SURFACE_SLIPPERY: - normY = 0.9396926f; //~cos(20 deg) - break; - - default: - normY = 0.7880108f; //~cos(38 deg) - break; - - case SURFACE_NOT_SLIPPERY: - normY = 0.0f; - break; + case SURFACE_VERY_SLIPPERY: normY = 0.9848077f; break; //~cos(10 deg) + case SURFACE_SLIPPERY: normY = 0.9396926f; break; //~cos(20 deg) + default: normY = 0.7880108f; break; //~cos(38 deg) + case SURFACE_NOT_SLIPPERY: normY = 0.0f; break; } return m->floor->normal.y <= normY; @@ -575,21 +559,10 @@ s32 mario_floor_is_slope(struct MarioState *m) { } switch (mario_get_floor_class(m)) { - case SURFACE_VERY_SLIPPERY: - normY = 0.9961947f; // ~cos(5 deg) - break; - - case SURFACE_SLIPPERY: - normY = 0.9848077f; // ~cos(10 deg) - break; - - default: - normY = 0.9659258f; // ~cos(15 deg) - break; - - case SURFACE_NOT_SLIPPERY: - normY = 0.9396926f; // ~cos(20 deg) - break; + case SURFACE_VERY_SLIPPERY: normY = 0.9961947f; break; // ~cos(5 deg) + case SURFACE_SLIPPERY: normY = 0.9848077f; break; // ~cos(10 deg) + default: normY = 0.9659258f; break; // ~cos(15 deg) + case SURFACE_NOT_SLIPPERY: normY = 0.9396926f; break; // ~cos(20 deg) } return m->floor->normal.y <= normY; @@ -613,21 +586,10 @@ s32 mario_floor_is_steep(struct MarioState *m) { // This does not matter in vanilla game practice. if (!mario_facing_downhill(m, FALSE)) { switch (mario_get_floor_class(m)) { - case SURFACE_VERY_SLIPPERY: - normY = 0.9659258f; // ~cos(15 deg) - break; - - case SURFACE_SLIPPERY: - normY = 0.9396926f; // ~cos(20 deg) - break; - - default: - normY = 0.8660254f; // ~cos(30 deg) - break; - - case SURFACE_NOT_SLIPPERY: - normY = 0.8660254f; // ~cos(30 deg) - break; + case SURFACE_VERY_SLIPPERY: normY = 0.9659258f; break; // ~cos(15 deg) + case SURFACE_SLIPPERY: normY = 0.9396926f; break; // ~cos(20 deg) + default: normY = 0.8660254f; break; // ~cos(30 deg) + case SURFACE_NOT_SLIPPERY: normY = 0.8660254f; break; // ~cos(30 deg) } result = m->floor->normal.y <= normY; @@ -641,14 +603,11 @@ s32 mario_floor_is_steep(struct MarioState *m) { */ f32 find_floor_height_relative_polar(struct MarioState *m, s16 angleFromMario, f32 distFromMario) { struct Surface *floor; - f32 floorY; f32 y = sins(m->faceAngle[1] + angleFromMario) * distFromMario; f32 x = coss(m->faceAngle[1] + angleFromMario) * distFromMario; - floorY = find_floor(m->pos[0] + y, m->pos[1] + 100.0f, m->pos[2] + x, &floor); - - return floorY; + return find_floor(m->pos[0] + y, m->pos[1] + 100.0f, m->pos[2] + x, &floor); } /** @@ -668,19 +627,21 @@ s16 find_floor_slope(struct MarioState *m, s16 yawOffset) { backwardFloorY = get_surface_height_at_location((m->pos[0] - x), (m->pos[2] - z), floor); } else { forwardFloorY = find_floor((m->pos[0] + x), (m->pos[1] + 100.0f), (m->pos[2] + z), &floor); + if (floor == NULL) forwardFloorY = m->floorHeight; // handle OOB slopes backwardFloorY = find_floor((m->pos[0] - x), (m->pos[1] + 100.0f), (m->pos[2] - z), &floor); + if (floor == NULL) backwardFloorY = m->floorHeight; // handle OOB slopes } #else forwardFloorY = find_floor((m->pos[0] + x), (m->pos[1] + 100.0f), (m->pos[2] + z), &floor); + if (floor == NULL) forwardFloorY = m->floorHeight; // handle OOB slopes backwardFloorY = find_floor((m->pos[0] - x), (m->pos[1] + 100.0f), (m->pos[2] - z), &floor); + if (floor == NULL) backwardFloorY = m->floorHeight; // handle OOB slopes #endif - //! If Mario is near OOB, these floorY's can sometimes be -11000. - // This will cause these to be off and give improper slopes. forwardYDelta = forwardFloorY - m->pos[1]; backwardYDelta = m->pos[1] - backwardFloorY; - if (forwardYDelta * forwardYDelta < backwardYDelta * backwardYDelta) { + if (sqr(forwardYDelta) < sqr(backwardYDelta)) { result = atan2s(5.0f, forwardYDelta); } else { result = atan2s(5.0f, backwardYDelta); @@ -689,6 +650,32 @@ s16 find_floor_slope(struct MarioState *m, s16 yawOffset) { return result; } +Bool32 set_mario_wall(struct MarioState *m, struct Surface *wall) { + if (m->wall != wall) { + m->wall = wall; + if (m->wall != NULL) m->wallYaw = SURFACE_YAW(wall); + } + return (m->wall != NULL); +} + +Bool32 set_mario_ceil(struct MarioState *m, struct Surface *ceil, f32 ceilHeight) { + if (m->ceil != ceil) { + m->ceil = ceil; + if (m->ceil != NULL) m->ceilYaw = SURFACE_YAW(ceil); + } + m->ceilHeight = ceilHeight; + return (m->ceil != NULL); +} + +Bool32 set_mario_floor(struct MarioState *m, struct Surface *floor, f32 floorHeight) { + if (m->floor != floor) { + m->floor = floor; + if (m->floor != NULL) m->floorYaw = SURFACE_YAW(floor); + } + m->floorHeight = floorHeight; + return (m->floor != NULL); +} + /** * Adjusts Mario's camera and sound based on his action status. */ @@ -720,8 +707,8 @@ void set_steep_jump_action(struct MarioState *m) { if (m->forwardVel > 0.0f) { //! ((s16)0x8000) has undefined behavior. Therefore, this downcast has - // undefined behavior if m->floorAngle >= 0. - s16 angleTemp = m->floorAngle + 0x8000; + // undefined behavior if m->floorYaw >= 0. + s16 angleTemp = m->floorYaw + 0x8000; s16 faceAngleTemp = m->faceAngle[1] - angleTemp; f32 y = sins(faceAngleTemp) * m->forwardVel; @@ -955,21 +942,10 @@ static u32 set_mario_action_cutscene(struct MarioState *m, u32 action, UNUSED u3 */ u32 set_mario_action(struct MarioState *m, u32 action, u32 actionArg) { switch (action & ACT_GROUP_MASK) { - case ACT_GROUP_MOVING: - action = set_mario_action_moving(m, action, actionArg); - break; - - case ACT_GROUP_AIRBORNE: - action = set_mario_action_airborne(m, action, actionArg); - break; - - case ACT_GROUP_SUBMERGED: - action = set_mario_action_submerged(m, action, actionArg); - break; - - case ACT_GROUP_CUTSCENE: - action = set_mario_action_cutscene(m, action, actionArg); - break; + case ACT_GROUP_MOVING: action = set_mario_action_moving (m, action, actionArg); break; + case ACT_GROUP_AIRBORNE: action = set_mario_action_airborne (m, action, actionArg); break; + case ACT_GROUP_SUBMERGED: action = set_mario_action_submerged(m, action, actionArg); break; + case ACT_GROUP_CUTSCENE: action = set_mario_action_cutscene (m, action, actionArg); break; } // Resets the sound played flags, meaning Mario can play those sound types again. @@ -1111,19 +1087,10 @@ s32 check_common_action_exits(struct MarioState *m) { * object holding actions. A holding variant of the above function. */ s32 check_common_hold_action_exits(struct MarioState *m) { - if (m->input & INPUT_A_PRESSED) { - return set_mario_action(m, ACT_HOLD_JUMP, 0); - } - if (m->input & INPUT_OFF_FLOOR) { - return set_mario_action(m, ACT_HOLD_FREEFALL, 0); - } - if (m->input & INPUT_NONZERO_ANALOG) { - return set_mario_action(m, ACT_HOLD_WALKING, 0); - } - if (m->input & INPUT_ABOVE_SLIDE) { - return set_mario_action(m, ACT_HOLD_BEGIN_SLIDING, 0); - } - + if (m->input & INPUT_A_PRESSED ) return set_mario_action(m, ACT_HOLD_JUMP, 0); + if (m->input & INPUT_OFF_FLOOR ) return set_mario_action(m, ACT_HOLD_FREEFALL, 0); + if (m->input & INPUT_NONZERO_ANALOG) return set_mario_action(m, ACT_HOLD_WALKING, 0); + if (m->input & INPUT_ABOVE_SLIDE ) return set_mario_action(m, ACT_HOLD_BEGIN_SLIDING, 0); return FALSE; } @@ -1149,7 +1116,7 @@ s32 transition_submerged_to_walking(struct MarioState *m) { s32 transition_submerged_to_airborne(struct MarioState *m) { set_camera_mode(m->area->camera, m->area->camera->defMode, 1); - vec3s_set(m->angleVel, 0, 0, 0); + vec3_zero(m->angleVel); if (m->heldObj == NULL) { if (m->input & INPUT_A_DOWN) return set_mario_action(m, ACT_DIVE, 0); @@ -1173,7 +1140,7 @@ s32 set_water_plunge_action(struct MarioState *m) { m->faceAngle[2] = 0; - vec3s_set(m->angleVel, 0, 0, 0); + vec3_zero(m->angleVel); if (!(m->action & ACT_FLAG_DIVING)) { m->faceAngle[0] = 0; @@ -1307,6 +1274,11 @@ void update_mario_joystick_inputs(struct MarioState *m) { } } +Bool32 analog_stick_held_back(struct MarioState *m) { + s16 intendedDYaw = (m->intendedYaw - m->faceAngle[1]); + return ((intendedDYaw < -0x471C) || (intendedDYaw > 0x471C)); +} + /** * Resolves wall collisions, and updates a variety of inputs. */ @@ -1333,7 +1305,7 @@ void update_mario_geometry_inputs(struct MarioState *m) { m->waterLevel = find_water_level(m->pos[0], m->pos[2]); if (m->floor != NULL) { - m->floorAngle = atan2s(m->floor->normal.z, m->floor->normal.x); + m->floorYaw = atan2s(m->floor->normal.z, m->floor->normal.x); m->terrainSoundAddend = mario_get_terrain_sound_addend(m); if ((m->pos[1] > m->waterLevel - 40) && mario_floor_is_slippery(m)) { @@ -1375,13 +1347,12 @@ void update_mario_inputs(struct MarioState *m) { m->collidedObjInteractTypes = m->marioObj->collidedObjInteractTypes; m->flags &= 0xFFFFFF; - #ifdef PUPPYCAM - if (gPuppyCam.mode3Flags & PUPPYCAM_MODE3_ENTER_FIRST_PERSON || (gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_FREE && gPuppyCam.debugFlags & PUPPYDEBUG_LOCK_CONTROLS)) - { +#ifdef PUPPYCAM + if (gPuppyCam.mode3Flags & PUPPYCAM_MODE3_ENTER_FIRST_PERSON || (gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_FREE && gPuppyCam.debugFlags & PUPPYDEBUG_LOCK_CONTROLS)) { m->input = INPUT_FIRST_PERSON; return; } - #endif +#endif update_mario_button_inputs(m); update_mario_joystick_inputs(m); @@ -1460,7 +1431,6 @@ void set_submerged_cam_preset_and_spawn_bubbles(struct MarioState *m) { */ void update_mario_health(struct MarioState *m) { s32 terrainIsSnow; - if (m->health >= 0x100) { // When already healing or hurting Mario, Mario's HP is not changed any more here. if (((u32) m->healCounter | (u32) m->hurtCounter) == 0) { @@ -1497,12 +1467,8 @@ void update_mario_health(struct MarioState *m) { m->hurtCounter--; } - if (m->health > 0x880) { - m->health = 0x880; - } - if (m->health < 0x100) { - m->health = 0xFF; - } + if (m->health > 0x880) m->health = 0x880; + if (m->health < 0x100) m->health = 0xFF; #ifndef BREATH_METER // Play a noise to alert the player when Mario is close to drowning. if (((m->action & ACT_GROUP_MASK) == ACT_GROUP_SUBMERGED) && (m->health < 0x300)) { @@ -1548,6 +1514,7 @@ void update_mario_breath(struct MarioState *m) { } if (m->breath > 0x880) m->breath = 0x880; if (m->breath < 0x100) { + // If breath is "zero", set health to "zero" m->breath = 0xFF; m->health = 0xFF; } @@ -1598,13 +1565,12 @@ void sink_mario_in_quicksand(struct MarioState *m) { } /** - * Is a binary representation of the frames to flicker Mario's cap when the timer - * is running out. - * + * Is a binary representation of the frames to flicker Mario's cap when the timer is running out. + * 0x4444449249255555 * Equals [1000]^5 . [100]^8 . [10]^9 . [1] in binary, which is * 100010001000100010001001001001001001001001001010101010101010101. */ -u64 sCapFlickerFrames = 0x4444449249255555; +u64 sCapFlickerFrames = 0b100010001000100010001001001001001001001001001010101010101010101; /** * Updates the cap flags mainly based on the cap timer. @@ -1739,97 +1705,79 @@ void queue_rumble_particles(void) { #endif /** - * Main function for executing Mario's behavior. + * Main function for executing Mario's behavior. Returns particleFlags. */ -s32 execute_mario_action(UNUSED struct Object *o) { +s32 execute_mario_action(struct MarioState *m) { s32 inLoop = TRUE; - - if (gMarioState->action) { - gMarioState->marioObj->header.gfx.node.flags &= ~GRAPH_RENDER_INVISIBLE; - mario_reset_bodystate(gMarioState); - update_mario_inputs(gMarioState); + // Updates once per frame: + vec3f_get_dist_and_lateral_dist_and_angle(m->prevPos, m->pos, &m->moveSpeed, &m->lateralSpeed, &m->movePitch, &m->moveYaw); + vec3_copy(m->prevPos, m->pos); + if (m->action) { + m->marioObj->header.gfx.node.flags &= ~GRAPH_RENDER_INVISIBLE; + mario_reset_bodystate(m); + update_mario_inputs(m); #ifdef PUPPYCAM if (!(gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_FREE)) #endif - mario_handle_special_floors(gMarioState); - mario_process_interactions(gMarioState); + mario_handle_special_floors(m); + mario_process_interactions(m); // If Mario is OOB, stop executing actions. - if (gMarioState->floor == NULL) { - return 0; + if (m->floor == NULL) { + return ACTIVE_PARTICLE_NONE; } // The function can loop through many action shifts in one frame, // which can lead to unexpected sub-frame behavior. Could potentially hang // if a loop of actions were found, but there has not been a situation found. while (inLoop) { - switch (gMarioState->action & ACT_GROUP_MASK) { - case ACT_GROUP_STATIONARY: - inLoop = mario_execute_stationary_action(gMarioState); - break; - - case ACT_GROUP_MOVING: - inLoop = mario_execute_moving_action(gMarioState); - break; - - case ACT_GROUP_AIRBORNE: - inLoop = mario_execute_airborne_action(gMarioState); - break; - - case ACT_GROUP_SUBMERGED: - inLoop = mario_execute_submerged_action(gMarioState); - break; - - case ACT_GROUP_CUTSCENE: - inLoop = mario_execute_cutscene_action(gMarioState); - break; - - case ACT_GROUP_AUTOMATIC: - inLoop = mario_execute_automatic_action(gMarioState); - break; - - case ACT_GROUP_OBJECT: - inLoop = mario_execute_object_action(gMarioState); - break; + switch (m->action & ACT_GROUP_MASK) { + case ACT_GROUP_STATIONARY: inLoop = mario_execute_stationary_action(m); break; + case ACT_GROUP_MOVING: inLoop = mario_execute_moving_action (m); break; + case ACT_GROUP_AIRBORNE: inLoop = mario_execute_airborne_action (m); break; + case ACT_GROUP_SUBMERGED: inLoop = mario_execute_submerged_action (m); break; + case ACT_GROUP_CUTSCENE: inLoop = mario_execute_cutscene_action (m); break; + case ACT_GROUP_AUTOMATIC: inLoop = mario_execute_automatic_action (m); break; + case ACT_GROUP_OBJECT: inLoop = mario_execute_object_action (m); break; } } - sink_mario_in_quicksand(gMarioState); - squish_mario_model(gMarioState); - set_submerged_cam_preset_and_spawn_bubbles(gMarioState); - update_mario_health(gMarioState); + sink_mario_in_quicksand(m); + squish_mario_model(m); + set_submerged_cam_preset_and_spawn_bubbles(m); + update_mario_health(m); #ifdef BREATH_METER - update_mario_breath(gMarioState); + update_mario_breath(m); #endif - update_mario_info_for_cam(gMarioState); - mario_update_hitbox_and_cap_model(gMarioState); + update_mario_info_for_cam(m); + mario_update_hitbox_and_cap_model(m); // Both of the wind handling portions play wind audio only in // non-Japanese releases. - if (gMarioState->floor->type == SURFACE_HORIZONTAL_WIND) { - spawn_wind_particles(0, (gMarioState->floor->force << 8)); + if (m->floor->type == SURFACE_HORIZONTAL_WIND) { + spawn_wind_particles(0, (m->floor->force << 8)); #ifndef VERSION_JP - play_sound(SOUND_ENV_WIND2, gMarioState->marioObj->header.gfx.cameraToObject); + play_sound(SOUND_ENV_WIND2, m->marioObj->header.gfx.cameraToObject); #endif } - if (gMarioState->floor->type == SURFACE_VERTICAL_WIND) { + if (m->floor->type == SURFACE_VERTICAL_WIND) { spawn_wind_particles(1, 0); #ifndef VERSION_JP - play_sound(SOUND_ENV_WIND2, gMarioState->marioObj->header.gfx.cameraToObject); + play_sound(SOUND_ENV_WIND2, m->marioObj->header.gfx.cameraToObject); #endif } play_infinite_stairs_music(); - gMarioState->marioObj->oInteractStatus = 0; + m->marioObj->oInteractStatus = 0; #if ENABLE_RUMBLE queue_rumble_particles(); #endif - return gMarioState->particleFlags; + return m->particleFlags; } - return 0; + return ACTIVE_PARTICLE_NONE; } /************************************************** @@ -1873,6 +1821,7 @@ void init_mario(void) { vec3_copy(gMarioState->faceAngle, gMarioSpawnInfo->startAngle); vec3_zero(gMarioState->angleVel); vec3_copy(gMarioState->pos, gMarioSpawnInfo->startPos); + vec3_copy(gMarioState->prevPos, gMarioState->pos); vec3_zero(gMarioState->vel); gMarioState->floorHeight = find_floor(gMarioState->pos[0], gMarioState->pos[1], gMarioState->pos[2], &gMarioState->floor); @@ -1882,33 +1831,22 @@ void init_mario(void) { gMarioState->marioObj->header.gfx.pos[1] = gMarioState->pos[1]; - gMarioState->action = - (gMarioState->pos[1] <= (gMarioState->waterLevel - 100)) ? ACT_WATER_IDLE : ACT_IDLE; + gMarioState->action = (gMarioState->pos[1] <= (gMarioState->waterLevel - 100)) ? ACT_WATER_IDLE : ACT_IDLE; mario_reset_bodystate(gMarioState); update_mario_info_for_cam(gMarioState); gMarioState->marioBodyState->punchState = 0; - gMarioState->marioObj->oPosX = gMarioState->pos[0]; - gMarioState->marioObj->oPosY = gMarioState->pos[1]; - gMarioState->marioObj->oPosZ = gMarioState->pos[2]; - - gMarioState->marioObj->oMoveAnglePitch = gMarioState->faceAngle[0]; - gMarioState->marioObj->oMoveAngleYaw = gMarioState->faceAngle[1]; - gMarioState->marioObj->oMoveAngleRoll = gMarioState->faceAngle[2]; + vec3_copy(&gMarioState->marioObj->oPosVec, gMarioState->pos); + vec3_copy(&gMarioState->marioObj->oMoveAngleVec, gMarioState->faceAngle); vec3f_copy(gMarioState->marioObj->header.gfx.pos, gMarioState->pos); vec3s_set(gMarioState->marioObj->header.gfx.angle, 0, gMarioState->faceAngle[1], 0); if (save_file_get_cap_pos(capPos)) { capObject = spawn_object(gMarioState->marioObj, MODEL_MARIOS_CAP, bhvNormalCap); - - capObject->oPosX = capPos[0]; - capObject->oPosY = capPos[1]; - capObject->oPosZ = capPos[2]; - + vec3_copy(&capObject->oPosVec, capPos); capObject->oForwardVel = 0; - capObject->oMoveAngleYaw = 0; } } diff --git a/src/game/mario.h b/src/game/mario.h index b991b7e6..ae547b89 100644 --- a/src/game/mario.h +++ b/src/game/mario.h @@ -34,6 +34,10 @@ s32 mario_floor_is_slope(struct MarioState *m); s32 mario_floor_is_steep(struct MarioState *m); f32 find_floor_height_relative_polar(struct MarioState *m, s16 angleFromMario, f32 distFromMario); s16 find_floor_slope(struct MarioState *m, s16 yawOffset); +Bool32 set_mario_wall(struct MarioState *m, struct Surface *wall); +Bool32 set_mario_ceil(struct MarioState *m, struct Surface *ceil, f32 ceilHeight); +Bool32 set_mario_floor(struct MarioState *m, struct Surface *floor, f32 floorHeight); +Bool32 analog_stick_held_back(struct MarioState *m); void update_mario_sound_and_camera(struct MarioState *m); void set_steep_jump_action(struct MarioState *m); u32 set_mario_action(struct MarioState *m, u32 action, u32 actionArg); @@ -46,7 +50,7 @@ s32 check_common_hold_action_exits(struct MarioState *m); s32 transition_submerged_to_walking(struct MarioState *m); s32 transition_submerged_to_airborne(struct MarioState *m); s32 set_water_plunge_action(struct MarioState *m); -s32 execute_mario_action(UNUSED struct Object *o); +s32 execute_mario_action(struct MarioState *m); void init_mario(void); void init_mario_from_save_file(void); diff --git a/src/game/mario_actions_automatic.c b/src/game/mario_actions_automatic.c index 2baa0912..0e75239d 100644 --- a/src/game/mario_actions_automatic.c +++ b/src/game/mario_actions_automatic.c @@ -290,7 +290,7 @@ s32 perform_hanging_step(struct MarioState *m, Vec3f nextPos) { struct WallCollisionData wallCollisionData; resolve_and_return_wall_collisions(nextPos, 50.0f, 50.0f, &wallCollisionData); - m->wall = wallCollisionData.numWalls == 0 ? NULL : wallCollisionData.walls[0]; + set_mario_wall(m, wallCollisionData.numWalls == 0 ? NULL : wallCollisionData.walls[0]); floorHeight = find_floor(nextPos[0], nextPos[1], nextPos[2], &floor); ceilHeight = find_ceil(nextPos[0], nextPos[1] + 3.0f, nextPos[2], &ceil); @@ -319,10 +319,8 @@ s32 perform_hanging_step(struct MarioState *m, Vec3f nextPos) { nextPos[1] = m->ceilHeight - 160.0f; vec3f_copy(m->pos, nextPos); - m->floor = floor; - m->floorHeight = floorHeight; - m->ceil = ceil; - m->ceilHeight = ceilHeight; + set_mario_floor(m, floor, floorHeight); + set_mario_ceil(m, ceil, ceilHeight); return HANG_NONE; } @@ -830,8 +828,7 @@ s32 act_tornado_twirling(struct MarioState *m) { floorHeight = find_floor(nextPos[0], nextPos[1], nextPos[2], &floor); if (floor != NULL) { - m->floor = floor; - m->floorHeight = floorHeight; + set_mario_floor(m, floor, floorHeight); vec3f_copy(m->pos, nextPos); } else { if (nextPos[1] >= m->floorHeight) { diff --git a/src/game/mario_actions_moving.c b/src/game/mario_actions_moving.c index fbad6e02..8f7fcf45 100644 --- a/src/game/mario_actions_moving.c +++ b/src/game/mario_actions_moving.c @@ -291,7 +291,7 @@ void apply_slope_accel(struct MarioState *m) { struct Surface *floor = m->floor; f32 steepness = sqrtf(sqr(floor->normal.x) + sqr(floor->normal.z)); - s16 floorDYaw = m->floorAngle - m->faceAngle[1]; + s16 floorDYaw = m->floorYaw - m->faceAngle[1]; if (mario_floor_is_slope(m)) { s16 slopeClass = 0; @@ -356,8 +356,7 @@ void update_shell_speed(struct MarioState *m) { f32 targetSpeed; if (m->floorHeight < m->waterLevel) { - m->floorHeight = m->waterLevel; - m->floor = &gWaterSurfacePseudoFloor; + set_mario_floor(m, &gWaterSurfacePseudoFloor, m->waterLevel); m->floor->originOffset = m->waterLevel; //! Negative origin offset } @@ -434,11 +433,6 @@ s32 update_decelerating_speed(struct MarioState *m) { 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) { f32 maxTargetSpeed; diff --git a/src/game/mario_actions_submerged.c b/src/game/mario_actions_submerged.c index d1bc44e1..d0a15374 100644 --- a/src/game/mario_actions_submerged.c +++ b/src/game/mario_actions_submerged.c @@ -87,8 +87,7 @@ static u32 perform_water_full_step(struct MarioState *m, Vec3f nextPos) { if (nextPos[1] >= floorHeight) { if (ceilHeight - nextPos[1] >= 160.0f) { vec3f_copy(m->pos, nextPos); - m->floor = floor; - m->floorHeight = floorHeight; + set_mario_floor(m, floor, floorHeight); if (wall != NULL) { return WATER_STEP_HIT_WALL; @@ -103,8 +102,7 @@ static u32 perform_water_full_step(struct MarioState *m, Vec3f nextPos) { //! Water ceiling downwarp vec3f_set(m->pos, nextPos[0], ceilHeight - 160.0f, nextPos[2]); - m->floor = floor; - m->floorHeight = floorHeight; + set_mario_floor(m, floor, floorHeight); return WATER_STEP_HIT_CEILING; } else { if (ceilHeight - floorHeight < 160.0f) { @@ -112,8 +110,7 @@ static u32 perform_water_full_step(struct MarioState *m, Vec3f nextPos) { } vec3f_set(m->pos, nextPos[0], floorHeight, nextPos[2]); - m->floor = floor; - m->floorHeight = floorHeight; + set_mario_floor(m, floor, floorHeight); return WATER_STEP_HIT_FLOOR; } } diff --git a/src/game/mario_step.c b/src/game/mario_step.c index 7be63e66..c3ddeb9b 100644 --- a/src/game/mario_step.c +++ b/src/game/mario_step.c @@ -159,14 +159,14 @@ u32 mario_update_quicksand(struct MarioState *m, f32 sinkingSpeed) { } u32 mario_push_off_steep_floor(struct MarioState *m, u32 action, u32 actionArg) { - s16 floorDYaw = m->floorAngle - m->faceAngle[1]; + s16 floorDYaw = m->floorYaw - m->faceAngle[1]; if (floorDYaw > -0x4000 && floorDYaw < 0x4000) { m->forwardVel = 16.0f; - m->faceAngle[1] = m->floorAngle; + m->faceAngle[1] = m->floorYaw; } else { m->forwardVel = -16.0f; - m->faceAngle[1] = m->floorAngle + 0x8000; + m->faceAngle[1] = m->floorYaw + 0x8000; } return set_mario_action(m, action, actionArg); @@ -296,8 +296,7 @@ static s32 perform_ground_quarter_step(struct MarioState *m, Vec3f nextPos) { } vec3f_copy(m->pos, nextPos); - m->floor = floor; - m->floorHeight = floorHeight; + set_mario_floor(m, floor, floorHeight); return GROUND_STEP_LEFT_GROUND; } @@ -306,8 +305,8 @@ static s32 perform_ground_quarter_step(struct MarioState *m, Vec3f nextPos) { } vec3f_set(m->pos, nextPos[0], floorHeight, nextPos[2]); - m->floor = floor; - m->floorHeight = floorHeight; + if (!SURFACE_IS_QUICKSAND(floor->type) && (floor->type != SURFACE_BURNING)) vec3_copy(m->lastSafePos, m->pos); + set_mario_floor(m, floor, floorHeight); if (m->wall != NULL) { oldWallDYaw = atan2s(m->wall->normal.z, m->wall->normal.x) - m->faceAngle[1]; @@ -320,7 +319,7 @@ static s32 perform_ground_quarter_step(struct MarioState *m, Vec3f nextPos) { absWallDYaw = wallDYaw < 0 ? -wallDYaw : wallDYaw; if (absWallDYaw > oldWallDYaw) { oldWallDYaw = absWallDYaw; - m->wall = upperWall.walls[i]; + set_mario_wall(m, upperWall.walls[i]); } if (wallDYaw >= 0x2AAA && wallDYaw <= 0x5555) { @@ -417,7 +416,7 @@ s32 bonk_or_hit_lava_wall(struct MarioState *m, struct WallCollisionData *wallDa if (wallData->walls[i] != NULL) { wallDYaw = atan2s(wallData->walls[i]->normal.z, wallData->walls[i]->normal.x) - m->faceAngle[1]; if (wallData->walls[i]->type == SURFACE_BURNING) { - m->wall = wallData->walls[i]; + set_mario_wall(m, wallData->walls[i]); return AIR_STEP_HIT_LAVA_WALL; } @@ -425,7 +424,7 @@ s32 bonk_or_hit_lava_wall(struct MarioState *m, struct WallCollisionData *wallDa absWallDYaw = wallDYaw < 0 ? -wallDYaw : wallDYaw; if (absWallDYaw > oldWallDYaw) { oldWallDYaw = absWallDYaw; - m->wall = wallData->walls[i]; + set_mario_wall(m, wallData->walls[i]); if (wallDYaw < -0x6000 || wallDYaw > 0x6000) { m->flags |= MARIO_AIR_HIT_WALL; @@ -494,8 +493,7 @@ s32 perform_air_quarter_step(struct MarioState *m, Vec3f intendedPos, u32 stepAr if (ceilHeight - floorHeight > 160.0f) { m->pos[0] = nextPos[0]; m->pos[2] = nextPos[2]; - m->floor = floor; - m->floorHeight = floorHeight; + set_mario_floor(m, floor, floorHeight); } //! When ceilHeight - floorHeight <= 160, the step result says that @@ -536,36 +534,31 @@ 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) && upperWall.numWalls == 0) { - for (i = 0; i < lowerWall.numWalls; i++) - if ((grabbedWall = check_ledge_grab(m, grabbedWall, lowerWall.walls[i], intendedPos, nextPos, ledgePos, &ledgeFloor))) + for (i = 0; i < lowerWall.numWalls; i++) { + if ((grabbedWall = check_ledge_grab(m, grabbedWall, lowerWall.walls[i], intendedPos, nextPos, ledgePos, &ledgeFloor))) { stepResult = AIR_STEP_GRABBED_LEDGE; - if (stepResult == AIR_STEP_GRABBED_LEDGE) - { + } + } + if (stepResult == AIR_STEP_GRABBED_LEDGE) { vec3f_copy(m->pos, ledgePos); - m->floor = ledgeFloor; - m->floorHeight = ledgePos[1]; - - m->floorAngle = atan2s(ledgeFloor->normal.z, ledgeFloor->normal.x); - + set_mario_floor(m, floor, ledgePos[1]); m->faceAngle[0] = 0; m->faceAngle[1] = atan2s(grabbedWall->normal.z, grabbedWall->normal.x) + 0x8000; } else { vec3f_copy(m->pos, nextPos); - m->floor = floor; - m->floorHeight = floorHeight; + set_mario_floor(m, floor, floorHeight); } return stepResult; } vec3f_copy(m->pos, nextPos); - m->floor = floor; - m->floorHeight = floorHeight; + set_mario_floor(m, floor, floorHeight); stepResult = bonk_or_hit_lava_wall(m, &upperWall); - if (stepResult != AIR_STEP_NONE) + if (stepResult != AIR_STEP_NONE) { return stepResult; - + } return bonk_or_hit_lava_wall(m, &lowerWall); } diff --git a/src/game/object_list_processor.c b/src/game/object_list_processor.c index d4cbb6d4..a584b709 100644 --- a/src/game/object_list_processor.c +++ b/src/game/object_list_processor.c @@ -267,7 +267,7 @@ void bhv_mario_update(void) { u32 particleFlags = 0; s32 i; - particleFlags = execute_mario_action(gCurrentObject); + particleFlags = execute_mario_action(gMarioState); gCurrentObject->oMarioParticleFlags = particleFlags; // Mario code updates MarioState's versions of position etc, so we need diff --git a/src/game/rendering_graph_node.c b/src/game/rendering_graph_node.c index 451da73d..a6ae802d 100644 --- a/src/game/rendering_graph_node.c +++ b/src/game/rendering_graph_node.c @@ -437,8 +437,7 @@ void geo_process_perspective(struct GraphNodePerspective *node) { gWorldScale = 1.0f; } farClip = CLAMP(farClip / gWorldScale, 4096, 61440); - if (farClip / farClipDelta != 1) - { + if (farClip / farClipDelta != 1) { farClipDelta /= farClip; gWorldScale *= farClipDelta; } From 6155b6416a14ca9795ee4fb821c1a98305f855b0 Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Mon, 27 Sep 2021 12:28:47 -0700 Subject: [PATCH 06/97] Some cleanup & fixes --- actors/bowser_flame/model.inc.c | 28 +- actors/common1.h | 2 +- actors/impact_smoke/model.inc.c | 16 +- actors/koopa/model.inc.c | 4 +- bin/title_screen_bg.c | 2 +- haveyourcake2.patch | 4 +- include/textures.h | 468 ++++++++++---------- levels/bbh/header.h | 2 +- levels/castle_inside/header.h | 6 +- levels/hmc/header.h | 4 +- levels/intro/leveldata.c | 4 +- levels/menu/header.h | 4 +- levels/ssl/header.h | 4 +- levels/ttc/header.h | 2 +- src/engine/level_script.h | 2 +- src/game/area.h | 2 +- src/game/behaviors/camera_lakitu.inc.c | 6 +- src/game/behaviors/chain_chomp.inc.c | 14 +- src/game/behaviors/intro_lakitu.inc.c | 49 +- src/game/behaviors/lll_hexagonal_ring.inc.c | 3 +- src/game/behaviors/tweester.inc.c | 9 +- src/game/behaviors/water_objs.inc.c | 27 +- src/game/camera.c | 331 +++++--------- src/game/camera.h | 12 +- src/game/debug_box.c | 53 +-- src/game/ingame_menu.c | 28 +- src/game/mario_actions_automatic.c | 8 +- src/game/mario_misc.c | 7 +- src/game/moving_texture.c | 170 +++---- src/game/obj_behaviors.c | 2 +- src/game/obj_behaviors_2.c | 94 +--- src/game/object_helpers.c | 5 +- src/game/object_list_processor.c | 43 +- src/game/paintings.c | 34 +- src/game/print.c | 128 ++---- src/game/puppycam2.h | 170 +++---- src/game/puppylights.h | 22 +- src/game/puppyprint.h | 16 +- src/game/rendering_graph_node.c | 22 +- src/game/segment7.h | 28 +- src/game/skybox.c | 4 +- src/game/sound_init.c | 1 - src/goddard/draw_objects.c | 51 ++- src/menu/intro_geo.c | 4 +- tools/skyconv.c | 2 +- 45 files changed, 782 insertions(+), 1115 deletions(-) diff --git a/actors/bowser_flame/model.inc.c b/actors/bowser_flame/model.inc.c index ae62573d..15c50d0a 100644 --- a/actors/bowser_flame/model.inc.c +++ b/actors/bowser_flame/model.inc.c @@ -120,7 +120,7 @@ const Gfx flame_seg6_dl_0601C108[] = { gsDPLoadTextureBlock(flame_seg6_texture_06000000, G_IM_FMT_RGBA, G_IM_SIZ_16b, 64, 32, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), gsSPVertex(flame_seg6_vertex_0601C000, 8, 0), gsSPDisplayList(flame_seg6_dl_0601C0B0), - gsDPLoadTextureBlock((u8*)flame_seg6_texture_06000000 + 0x1000, G_IM_FMT_RGBA, G_IM_SIZ_16b, 64, 32, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), + gsDPLoadTextureBlock((Texture*)flame_seg6_texture_06000000 + 0x1000, G_IM_FMT_RGBA, G_IM_SIZ_16b, 64, 32, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), gsSPDisplayList(flame_seg6_dl_0601C0C8), gsSPDisplayList(flame_seg6_dl_0601C0E0), gsSPEndDisplayList(), @@ -132,7 +132,7 @@ const Gfx flame_seg6_dl_0601C1A8[] = { gsDPLoadTextureBlock(flame_seg6_texture_06002000, G_IM_FMT_RGBA, G_IM_SIZ_16b, 64, 32, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), gsSPVertex(flame_seg6_vertex_0601C000, 8, 0), gsSPDisplayList(flame_seg6_dl_0601C0B0), - gsDPLoadTextureBlock((u8*)flame_seg6_texture_06002000 + 0x1000, G_IM_FMT_RGBA, G_IM_SIZ_16b, 64, 32, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), + gsDPLoadTextureBlock((Texture*)flame_seg6_texture_06002000 + 0x1000, G_IM_FMT_RGBA, G_IM_SIZ_16b, 64, 32, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), gsSPDisplayList(flame_seg6_dl_0601C0C8), gsSPDisplayList(flame_seg6_dl_0601C0E0), gsSPEndDisplayList(), @@ -144,7 +144,7 @@ const Gfx flame_seg6_dl_0601C248[] = { gsDPLoadTextureBlock(flame_seg6_texture_06004000, G_IM_FMT_RGBA, G_IM_SIZ_16b, 64, 32, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), gsSPVertex(flame_seg6_vertex_0601C000, 8, 0), gsSPDisplayList(flame_seg6_dl_0601C0B0), - gsDPLoadTextureBlock((u8*)flame_seg6_texture_06004000 + 0x1000, G_IM_FMT_RGBA, G_IM_SIZ_16b, 64, 32, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), + gsDPLoadTextureBlock((Texture*)flame_seg6_texture_06004000 + 0x1000, G_IM_FMT_RGBA, G_IM_SIZ_16b, 64, 32, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), gsSPDisplayList(flame_seg6_dl_0601C0C8), gsSPDisplayList(flame_seg6_dl_0601C0E0), gsSPEndDisplayList(), @@ -156,7 +156,7 @@ const Gfx flame_seg6_dl_0601C2E8[] = { gsDPLoadTextureBlock(flame_seg6_texture_06006000, G_IM_FMT_RGBA, G_IM_SIZ_16b, 64, 32, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), gsSPVertex(flame_seg6_vertex_0601C000, 8, 0), gsSPDisplayList(flame_seg6_dl_0601C0B0), - gsDPLoadTextureBlock((u8*)flame_seg6_texture_06006000 + 0x1000, G_IM_FMT_RGBA, G_IM_SIZ_16b, 64, 32, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), + gsDPLoadTextureBlock((Texture*)flame_seg6_texture_06006000 + 0x1000, G_IM_FMT_RGBA, G_IM_SIZ_16b, 64, 32, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), gsSPDisplayList(flame_seg6_dl_0601C0C8), gsSPDisplayList(flame_seg6_dl_0601C0E0), gsSPEndDisplayList(), @@ -168,7 +168,7 @@ const Gfx flame_seg6_dl_0601C388[] = { gsDPLoadTextureBlock(flame_seg6_texture_06008000, G_IM_FMT_RGBA, G_IM_SIZ_16b, 64, 32, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), gsSPVertex(flame_seg6_vertex_0601C000, 8, 0), gsSPDisplayList(flame_seg6_dl_0601C0B0), - gsDPLoadTextureBlock((u8*)flame_seg6_texture_06008000 + 0x1000, G_IM_FMT_RGBA, G_IM_SIZ_16b, 64, 32, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), + gsDPLoadTextureBlock((Texture*)flame_seg6_texture_06008000 + 0x1000, G_IM_FMT_RGBA, G_IM_SIZ_16b, 64, 32, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), gsSPDisplayList(flame_seg6_dl_0601C0C8), gsSPDisplayList(flame_seg6_dl_0601C0E0), gsSPEndDisplayList(), @@ -180,7 +180,7 @@ const Gfx flame_seg6_dl_0601C428[] = { gsDPLoadTextureBlock(flame_seg6_texture_0600A000, G_IM_FMT_RGBA, G_IM_SIZ_16b, 64, 32, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), gsSPVertex(flame_seg6_vertex_0601C000, 8, 0), gsSPDisplayList(flame_seg6_dl_0601C0B0), - gsDPLoadTextureBlock((u8*)flame_seg6_texture_0600A000 + 0x1000, G_IM_FMT_RGBA, G_IM_SIZ_16b, 64, 32, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), + gsDPLoadTextureBlock((Texture*)flame_seg6_texture_0600A000 + 0x1000, G_IM_FMT_RGBA, G_IM_SIZ_16b, 64, 32, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), gsSPDisplayList(flame_seg6_dl_0601C0C8), gsSPDisplayList(flame_seg6_dl_0601C0E0), gsSPEndDisplayList(), @@ -192,7 +192,7 @@ const Gfx flame_seg6_dl_0601C4C8[] = { gsDPLoadTextureBlock(flame_seg6_texture_0600C000, G_IM_FMT_RGBA, G_IM_SIZ_16b, 64, 32, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), gsSPVertex(flame_seg6_vertex_0601C000, 8, 0), gsSPDisplayList(flame_seg6_dl_0601C0B0), - gsDPLoadTextureBlock((u8*)flame_seg6_texture_0600C000 + 0x1000, G_IM_FMT_RGBA, G_IM_SIZ_16b, 64, 32, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), + gsDPLoadTextureBlock((Texture*)flame_seg6_texture_0600C000 + 0x1000, G_IM_FMT_RGBA, G_IM_SIZ_16b, 64, 32, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), gsSPDisplayList(flame_seg6_dl_0601C0C8), gsSPDisplayList(flame_seg6_dl_0601C0E0), gsSPEndDisplayList(), @@ -204,7 +204,7 @@ const Gfx flame_seg6_dl_0601C568[] = { gsDPLoadTextureBlock(flame_seg6_texture_0600E000, G_IM_FMT_RGBA, G_IM_SIZ_16b, 64, 32, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), gsSPVertex(flame_seg6_vertex_0601C000, 8, 0), gsSPDisplayList(flame_seg6_dl_0601C0B0), - gsDPLoadTextureBlock((u8*)flame_seg6_texture_0600E000 + 0x1000, G_IM_FMT_RGBA, G_IM_SIZ_16b, 64, 32, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), + gsDPLoadTextureBlock((Texture*)flame_seg6_texture_0600E000 + 0x1000, G_IM_FMT_RGBA, G_IM_SIZ_16b, 64, 32, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), gsSPDisplayList(flame_seg6_dl_0601C0C8), gsSPDisplayList(flame_seg6_dl_0601C0E0), gsSPEndDisplayList(), @@ -216,7 +216,7 @@ const Gfx flame_seg6_dl_0601C608[] = { gsDPLoadTextureBlock(flame_seg6_texture_06010000, G_IM_FMT_RGBA, G_IM_SIZ_16b, 64, 32, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), gsSPVertex(flame_seg6_vertex_0601C000, 8, 0), gsSPDisplayList(flame_seg6_dl_0601C0B0), - gsDPLoadTextureBlock((u8*)flame_seg6_texture_06010000 + 0x1000, G_IM_FMT_RGBA, G_IM_SIZ_16b, 64, 32, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), + gsDPLoadTextureBlock((Texture*)flame_seg6_texture_06010000 + 0x1000, G_IM_FMT_RGBA, G_IM_SIZ_16b, 64, 32, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), gsSPDisplayList(flame_seg6_dl_0601C0C8), gsSPDisplayList(flame_seg6_dl_0601C0E0), gsSPEndDisplayList(), @@ -228,7 +228,7 @@ const Gfx flame_seg6_dl_0601C6A8[] = { gsDPLoadTextureBlock(flame_seg6_texture_06012000, G_IM_FMT_RGBA, G_IM_SIZ_16b, 64, 32, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), gsSPVertex(flame_seg6_vertex_0601C000, 8, 0), gsSPDisplayList(flame_seg6_dl_0601C0B0), - gsDPLoadTextureBlock((u8*)flame_seg6_texture_06012000 + 0x1000, G_IM_FMT_RGBA, G_IM_SIZ_16b, 64, 32, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), + gsDPLoadTextureBlock((Texture*)flame_seg6_texture_06012000 + 0x1000, G_IM_FMT_RGBA, G_IM_SIZ_16b, 64, 32, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), gsSPDisplayList(flame_seg6_dl_0601C0C8), gsSPDisplayList(flame_seg6_dl_0601C0E0), gsSPEndDisplayList(), @@ -240,7 +240,7 @@ const Gfx flame_seg6_dl_0601C748[] = { gsDPLoadTextureBlock(flame_seg6_texture_06014000, G_IM_FMT_RGBA, G_IM_SIZ_16b, 64, 32, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), gsSPVertex(flame_seg6_vertex_0601C000, 8, 0), gsSPDisplayList(flame_seg6_dl_0601C0B0), - gsDPLoadTextureBlock((u8*)flame_seg6_texture_06014000 + 0x1000, G_IM_FMT_RGBA, G_IM_SIZ_16b, 64, 32, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), + gsDPLoadTextureBlock((Texture*)flame_seg6_texture_06014000 + 0x1000, G_IM_FMT_RGBA, G_IM_SIZ_16b, 64, 32, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), gsSPDisplayList(flame_seg6_dl_0601C0C8), gsSPDisplayList(flame_seg6_dl_0601C0E0), gsSPEndDisplayList(), @@ -252,7 +252,7 @@ const Gfx flame_seg6_dl_0601C7E8[] = { gsDPLoadTextureBlock(flame_seg6_texture_06016000, G_IM_FMT_RGBA, G_IM_SIZ_16b, 64, 32, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), gsSPVertex(flame_seg6_vertex_0601C000, 8, 0), gsSPDisplayList(flame_seg6_dl_0601C0B0), - gsDPLoadTextureBlock((u8*)flame_seg6_texture_06016000 + 0x1000, G_IM_FMT_RGBA, G_IM_SIZ_16b, 64, 32, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), + gsDPLoadTextureBlock((Texture*)flame_seg6_texture_06016000 + 0x1000, G_IM_FMT_RGBA, G_IM_SIZ_16b, 64, 32, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), gsSPDisplayList(flame_seg6_dl_0601C0C8), gsSPDisplayList(flame_seg6_dl_0601C0E0), gsSPEndDisplayList(), @@ -264,7 +264,7 @@ const Gfx flame_seg6_dl_0601C888[] = { gsDPLoadTextureBlock(flame_seg6_texture_06018000, G_IM_FMT_RGBA, G_IM_SIZ_16b, 64, 32, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), gsSPVertex(flame_seg6_vertex_0601C000, 8, 0), gsSPDisplayList(flame_seg6_dl_0601C0B0), - gsDPLoadTextureBlock((u8*)flame_seg6_texture_06018000 + 0x1000, G_IM_FMT_RGBA, G_IM_SIZ_16b, 64, 32, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), + gsDPLoadTextureBlock((Texture*)flame_seg6_texture_06018000 + 0x1000, G_IM_FMT_RGBA, G_IM_SIZ_16b, 64, 32, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), gsSPDisplayList(flame_seg6_dl_0601C0C8), gsSPDisplayList(flame_seg6_dl_0601C0E0), gsSPEndDisplayList(), @@ -276,7 +276,7 @@ const Gfx flame_seg6_dl_0601C928[] = { gsDPLoadTextureBlock(flame_seg6_texture_0601A000, G_IM_FMT_RGBA, G_IM_SIZ_16b, 64, 32, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), gsSPVertex(flame_seg6_vertex_0601C000, 8, 0), gsSPDisplayList(flame_seg6_dl_0601C0B0), - gsDPLoadTextureBlock((u8*)flame_seg6_texture_0601A000 + 0x1000, G_IM_FMT_RGBA, G_IM_SIZ_16b, 64, 32, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), + gsDPLoadTextureBlock((Texture*)flame_seg6_texture_0601A000 + 0x1000, G_IM_FMT_RGBA, G_IM_SIZ_16b, 64, 32, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), gsSPDisplayList(flame_seg6_dl_0601C0C8), gsSPDisplayList(flame_seg6_dl_0601C0E0), gsSPEndDisplayList(), diff --git a/actors/common1.h b/actors/common1.h index badf9808..e7a993cb 100644 --- a/actors/common1.h +++ b/actors/common1.h @@ -191,7 +191,7 @@ extern const GeoLayout number_geo[]; extern const Gfx pebble_seg3_dl_0301CB00[]; // power_meter -extern const u8 *const power_meter_health_segments_lut[]; +extern const Texture *const power_meter_health_segments_lut[]; extern const Gfx dl_power_meter_base[]; extern const Gfx dl_power_meter_health_segments_begin[]; extern const Gfx dl_power_meter_health_segments_end[]; diff --git a/actors/impact_smoke/model.inc.c b/actors/impact_smoke/model.inc.c index cf44016d..2c4b4ff9 100644 --- a/actors/impact_smoke/model.inc.c +++ b/actors/impact_smoke/model.inc.c @@ -3,22 +3,22 @@ // TODO: These 64x64 textures are referenced as two different texture addresses in the DLs // 0x0605AA28 -ALIGNED8 static const u8 impact_smoke_seg6_texture_0605AA28[] = { +ALIGNED8 static const Texture impact_smoke_seg6_texture_0605AA28[] = { #include "actors/impact_smoke/impact_smoke_0.ia16.inc.c" }; // 0x0605CA28 -ALIGNED8 static const u8 impact_smoke_seg6_texture_0605CA28[] = { +ALIGNED8 static const Texture impact_smoke_seg6_texture_0605CA28[] = { #include "actors/impact_smoke/impact_smoke_1.ia16.inc.c" }; // 0x0605EA28 -ALIGNED8 static const u8 impact_smoke_seg6_texture_0605EA28[] = { +ALIGNED8 static const Texture impact_smoke_seg6_texture_0605EA28[] = { #include "actors/impact_smoke/impact_smoke_2.ia16.inc.c" }; // 0x06060A28 -ALIGNED8 static const u8 impact_smoke_seg6_texture_06060A28[] = { +ALIGNED8 static const Texture impact_smoke_seg6_texture_06060A28[] = { #include "actors/impact_smoke/impact_smoke_3.ia16.inc.c" }; @@ -71,7 +71,7 @@ const Gfx impact_smoke_seg6_dl_06062B38[] = { gsDPLoadTextureBlock(impact_smoke_seg6_texture_0605AA28, G_IM_FMT_IA, G_IM_SIZ_16b, 64, 32, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), gsSPVertex(impact_smoke_seg6_vertex_06062A28, 8, 0), gsSPDisplayList(impact_smoke_seg6_dl_06062AD8), - gsDPLoadTextureBlock((u8*)impact_smoke_seg6_texture_0605AA28 + 0x1000, G_IM_FMT_IA, G_IM_SIZ_16b, 64, 32, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), + gsDPLoadTextureBlock((Texture*)impact_smoke_seg6_texture_0605AA28 + 0x1000, G_IM_FMT_IA, G_IM_SIZ_16b, 64, 32, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), gsSPDisplayList(impact_smoke_seg6_dl_06062AF0), gsSPDisplayList(impact_smoke_seg6_dl_06062B08), gsSPEndDisplayList(), @@ -83,7 +83,7 @@ const Gfx impact_smoke_seg6_dl_06062BD8[] = { gsDPLoadTextureBlock(impact_smoke_seg6_texture_0605CA28, G_IM_FMT_IA, G_IM_SIZ_16b, 64, 32, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), gsSPVertex(impact_smoke_seg6_vertex_06062A28, 8, 0), gsSPDisplayList(impact_smoke_seg6_dl_06062AD8), - gsDPLoadTextureBlock((u8*)impact_smoke_seg6_texture_0605CA28 + 0x1000, G_IM_FMT_IA, G_IM_SIZ_16b, 64, 32, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), + gsDPLoadTextureBlock((Texture*)impact_smoke_seg6_texture_0605CA28 + 0x1000, G_IM_FMT_IA, G_IM_SIZ_16b, 64, 32, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), gsSPDisplayList(impact_smoke_seg6_dl_06062AF0), gsSPDisplayList(impact_smoke_seg6_dl_06062B08), gsSPEndDisplayList(), @@ -95,7 +95,7 @@ const Gfx impact_smoke_seg6_dl_06062C78[] = { gsDPLoadTextureBlock(impact_smoke_seg6_texture_0605EA28, G_IM_FMT_IA, G_IM_SIZ_16b, 64, 32, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), gsSPVertex(impact_smoke_seg6_vertex_06062A28, 8, 0), gsSPDisplayList(impact_smoke_seg6_dl_06062AD8), - gsDPLoadTextureBlock((u8*)impact_smoke_seg6_texture_0605EA28 + 0x1000, G_IM_FMT_IA, G_IM_SIZ_16b, 64, 32, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), + gsDPLoadTextureBlock((Texture*)impact_smoke_seg6_texture_0605EA28 + 0x1000, G_IM_FMT_IA, G_IM_SIZ_16b, 64, 32, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), gsSPDisplayList(impact_smoke_seg6_dl_06062AF0), gsSPDisplayList(impact_smoke_seg6_dl_06062B08), gsSPEndDisplayList(), @@ -107,7 +107,7 @@ const Gfx impact_smoke_seg6_dl_06062D18[] = { gsDPLoadTextureBlock(impact_smoke_seg6_texture_06060A28, G_IM_FMT_IA, G_IM_SIZ_16b, 64, 32, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), gsSPVertex(impact_smoke_seg6_vertex_06062A28, 8, 0), gsSPDisplayList(impact_smoke_seg6_dl_06062AD8), - gsDPLoadTextureBlock((u8*)impact_smoke_seg6_texture_06060A28 + 0x1000, G_IM_FMT_IA, G_IM_SIZ_16b, 64, 32, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), + gsDPLoadTextureBlock((Texture*)impact_smoke_seg6_texture_06060A28 + 0x1000, G_IM_FMT_IA, G_IM_SIZ_16b, 64, 32, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), gsSPDisplayList(impact_smoke_seg6_dl_06062AF0), gsSPDisplayList(impact_smoke_seg6_dl_06062B08), gsSPEndDisplayList(), diff --git a/actors/koopa/model.inc.c b/actors/koopa/model.inc.c index 0332069d..9b2da641 100644 --- a/actors/koopa/model.inc.c +++ b/actors/koopa/model.inc.c @@ -2078,8 +2078,8 @@ const Gfx koopa_seg6_dl_0600C498[] = { gsSP2Triangles( 0, 1, 2, 0x0, 3, 4, 5, 0x0), gsSP1Triangle( 6, 7, 8, 0x0), #ifdef KOOPA_KEEP_PINK_SHORTS - gsSPLight((u8*)koopa_seg6_texture_06002648 + 0x20, 1), // this malformed light results in a - gsSPLight((u8*)koopa_seg6_texture_06002648 + 0x18, 2), // koopa appearing to wear pink shorts. + gsSPLight((Texture*)koopa_seg6_texture_06002648 + 0x20, 1), // this malformed light results in a + gsSPLight((Texture*)koopa_seg6_texture_06002648 + 0x18, 2), // koopa appearing to wear pink shorts. #endif gsSPVertex(koopa_seg6_vertex_0600B5F0, 15, 0), gsSP2Triangles( 0, 1, 2, 0x0, 3, 4, 5, 0x0), diff --git a/bin/title_screen_bg.c b/bin/title_screen_bg.c index f7ee7d59..c52684bb 100644 --- a/bin/title_screen_bg.c +++ b/bin/title_screen_bg.c @@ -142,7 +142,7 @@ const Gfx title_screen_bg_dl_face_easter_egg_end[] = { #endif #if ENABLE_RUMBLE -ALIGNED8 static const u8 title_texture_rumble_pak[] = { +ALIGNED8 static const Texture title_texture_rumble_pak[] = { #include "textures/title_screen_bg/title_screen_bg.06648.rgba16.inc.c" }; diff --git a/haveyourcake2.patch b/haveyourcake2.patch index bf211006..4e529d20 100644 --- a/haveyourcake2.patch +++ b/haveyourcake2.patch @@ -739,9 +739,9 @@ index b515373..1fdf027 100644 } int numTiles = TABLE_DIMENSIONS[type].cols * TABLE_DIMENSIONS[type].rows; -+ fprintf(cFile, "ALIGNED8 static const u8 cake_end_texture_%sdata[] = {\n", euSuffx); ++ fprintf(cFile, "ALIGNED8 static const Texture cake_end_texture_%sdata[] = {\n", euSuffx); for (int i = 0; i < numTiles; ++i) { -- fprintf(cFile, "ALIGNED8 static const u8 cake_end_texture_%s%d[] = {\n", euSuffx, i); +- fprintf(cFile, "ALIGNED8 static const Texture cake_end_texture_%s%d[] = {\n", euSuffx, i); print_raw_data(cFile, &tiles[i]); - fputs("};\n\n", cFile); + fputc('\n', cFile); diff --git a/include/textures.h b/include/textures.h index 4df137cb..c64ccdd9 100644 --- a/include/textures.h +++ b/include/textures.h @@ -5,262 +5,262 @@ #include // cave -extern const u8 cave_09000000[]; -extern const u8 cave_09001000[]; -extern const u8 cave_09001800[]; -extern const u8 cave_09002800[]; -extern const u8 cave_09003000[]; -extern const u8 cave_09003800[]; -extern const u8 cave_09004800[]; -extern const u8 cave_09005800[]; -extern const u8 cave_09006800[]; -extern const u8 cave_09007000[]; -extern const u8 cave_09007800[]; -extern const u8 cave_09008800[]; -extern const u8 cave_09009800[]; -extern const u8 cave_0900A000[]; -extern const u8 cave_0900A800[]; -extern const u8 cave_0900B800[]; -extern const u8 cave_0900C000[]; +extern const Texture cave_09000000[]; +extern const Texture cave_09001000[]; +extern const Texture cave_09001800[]; +extern const Texture cave_09002800[]; +extern const Texture cave_09003000[]; +extern const Texture cave_09003800[]; +extern const Texture cave_09004800[]; +extern const Texture cave_09005800[]; +extern const Texture cave_09006800[]; +extern const Texture cave_09007000[]; +extern const Texture cave_09007800[]; +extern const Texture cave_09008800[]; +extern const Texture cave_09009800[]; +extern const Texture cave_0900A000[]; +extern const Texture cave_0900A800[]; +extern const Texture cave_0900B800[]; +extern const Texture cave_0900C000[]; // fire -extern const u8 fire_09000000[]; -extern const u8 fire_09000800[]; -extern const u8 fire_09001000[]; -extern const u8 fire_09001800[]; -extern const u8 fire_09002000[]; -extern const u8 fire_09002800[]; -extern const u8 fire_09003000[]; -extern const u8 fire_09003800[]; -extern const u8 fire_09004000[]; -extern const u8 fire_09004800[]; -extern const u8 fire_09005000[]; -extern const u8 fire_09005800[]; -extern const u8 fire_09006000[]; -extern const u8 fire_09006800[]; -extern const u8 fire_09007000[]; -extern const u8 fire_09007800[]; -extern const u8 fire_09008000[]; -extern const u8 fire_09008800[]; -extern const u8 fire_09009000[]; -extern const u8 fire_09009800[]; -extern const u8 fire_0900A000[]; -extern const u8 fire_0900A800[]; -extern const u8 fire_0900B000[]; -extern const u8 fire_0900B800[]; +extern const Texture fire_09000000[]; +extern const Texture fire_09000800[]; +extern const Texture fire_09001000[]; +extern const Texture fire_09001800[]; +extern const Texture fire_09002000[]; +extern const Texture fire_09002800[]; +extern const Texture fire_09003000[]; +extern const Texture fire_09003800[]; +extern const Texture fire_09004000[]; +extern const Texture fire_09004800[]; +extern const Texture fire_09005000[]; +extern const Texture fire_09005800[]; +extern const Texture fire_09006000[]; +extern const Texture fire_09006800[]; +extern const Texture fire_09007000[]; +extern const Texture fire_09007800[]; +extern const Texture fire_09008000[]; +extern const Texture fire_09008800[]; +extern const Texture fire_09009000[]; +extern const Texture fire_09009800[]; +extern const Texture fire_0900A000[]; +extern const Texture fire_0900A800[]; +extern const Texture fire_0900B000[]; +extern const Texture fire_0900B800[]; // generic -extern const u8 generic_09000000[]; -extern const u8 generic_09000800[]; -extern const u8 generic_09001000[]; -extern const u8 generic_09001800[]; -extern const u8 generic_09002000[]; -extern const u8 generic_09002800[]; -extern const u8 generic_09003000[]; -extern const u8 generic_09003800[]; -extern const u8 generic_09004000[]; -extern const u8 generic_09004800[]; -extern const u8 generic_09005000[]; -extern const u8 generic_09005800[]; -extern const u8 generic_09006000[]; -extern const u8 generic_09007000[]; -extern const u8 generic_09007800[]; -extern const u8 generic_09008000[]; -extern const u8 generic_09008800[]; -extern const u8 generic_09009000[]; -extern const u8 generic_09009800[]; -extern const u8 generic_0900A000[]; -extern const u8 generic_0900A800[]; -extern const u8 generic_0900B000[]; +extern const Texture generic_09000000[]; +extern const Texture generic_09000800[]; +extern const Texture generic_09001000[]; +extern const Texture generic_09001800[]; +extern const Texture generic_09002000[]; +extern const Texture generic_09002800[]; +extern const Texture generic_09003000[]; +extern const Texture generic_09003800[]; +extern const Texture generic_09004000[]; +extern const Texture generic_09004800[]; +extern const Texture generic_09005000[]; +extern const Texture generic_09005800[]; +extern const Texture generic_09006000[]; +extern const Texture generic_09007000[]; +extern const Texture generic_09007800[]; +extern const Texture generic_09008000[]; +extern const Texture generic_09008800[]; +extern const Texture generic_09009000[]; +extern const Texture generic_09009800[]; +extern const Texture generic_0900A000[]; +extern const Texture generic_0900A800[]; +extern const Texture generic_0900B000[]; // grass -extern const u8 grass_09000000[]; -extern const u8 grass_09000800[]; -extern const u8 grass_09001000[]; -extern const u8 grass_09001800[]; -extern const u8 grass_09002000[]; -extern const u8 grass_09002800[]; -extern const u8 grass_09003000[]; -extern const u8 grass_09003800[]; -extern const u8 grass_09004000[]; -extern const u8 grass_09004800[]; -extern const u8 grass_09005000[]; -extern const u8 grass_09005800[]; -extern const u8 grass_09006000[]; -extern const u8 grass_09006800[]; -extern const u8 grass_09007000[]; -extern const u8 grass_09007800[]; -extern const u8 grass_09008000[]; -extern const u8 grass_09008800[]; -extern const u8 grass_09009000[]; -extern const u8 grass_09009800[]; -extern const u8 grass_0900A000[]; -extern const u8 grass_0900A800[]; -extern const u8 grass_0900B000[]; -extern const u8 grass_0900B800[]; +extern const Texture grass_09000000[]; +extern const Texture grass_09000800[]; +extern const Texture grass_09001000[]; +extern const Texture grass_09001800[]; +extern const Texture grass_09002000[]; +extern const Texture grass_09002800[]; +extern const Texture grass_09003000[]; +extern const Texture grass_09003800[]; +extern const Texture grass_09004000[]; +extern const Texture grass_09004800[]; +extern const Texture grass_09005000[]; +extern const Texture grass_09005800[]; +extern const Texture grass_09006000[]; +extern const Texture grass_09006800[]; +extern const Texture grass_09007000[]; +extern const Texture grass_09007800[]; +extern const Texture grass_09008000[]; +extern const Texture grass_09008800[]; +extern const Texture grass_09009000[]; +extern const Texture grass_09009800[]; +extern const Texture grass_0900A000[]; +extern const Texture grass_0900A800[]; +extern const Texture grass_0900B000[]; +extern const Texture grass_0900B800[]; // inside -extern const u8 inside_09000000[]; -extern const u8 inside_09001000[]; -extern const u8 inside_09002000[]; -extern const u8 inside_09003000[]; -extern const u8 inside_09003800[]; -extern const u8 inside_09004000[]; -extern const u8 inside_09004800[]; -extern const u8 inside_09005000[]; -extern const u8 inside_09005800[]; -extern const u8 inside_09006000[]; -extern const u8 inside_09007000[]; -extern const u8 inside_09008000[]; -extern const u8 inside_09008800[]; -extern const u8 inside_09009000[]; -extern const u8 inside_0900A000[]; -extern const u8 inside_0900B000[]; -extern const u8 inside_0900B800[]; +extern const Texture inside_09000000[]; +extern const Texture inside_09001000[]; +extern const Texture inside_09002000[]; +extern const Texture inside_09003000[]; +extern const Texture inside_09003800[]; +extern const Texture inside_09004000[]; +extern const Texture inside_09004800[]; +extern const Texture inside_09005000[]; +extern const Texture inside_09005800[]; +extern const Texture inside_09006000[]; +extern const Texture inside_09007000[]; +extern const Texture inside_09008000[]; +extern const Texture inside_09008800[]; +extern const Texture inside_09009000[]; +extern const Texture inside_0900A000[]; +extern const Texture inside_0900B000[]; +extern const Texture inside_0900B800[]; // machine -extern const u8 machine_09000000[]; -extern const u8 machine_09000800[]; -extern const u8 machine_09001000[]; -extern const u8 machine_09001800[]; -extern const u8 machine_09002000[]; -extern const u8 machine_09002800[]; -extern const u8 machine_09003000[]; -extern const u8 machine_09003800[]; -extern const u8 machine_09004000[]; -extern const u8 machine_09005000[]; -extern const u8 machine_09005800[]; -extern const u8 machine_09006000[]; -extern const u8 machine_09006800[]; -extern const u8 machine_09007000[]; -extern const u8 machine_09007800[]; -extern const u8 machine_09008000[]; -extern const u8 machine_09008400[]; +extern const Texture machine_09000000[]; +extern const Texture machine_09000800[]; +extern const Texture machine_09001000[]; +extern const Texture machine_09001800[]; +extern const Texture machine_09002000[]; +extern const Texture machine_09002800[]; +extern const Texture machine_09003000[]; +extern const Texture machine_09003800[]; +extern const Texture machine_09004000[]; +extern const Texture machine_09005000[]; +extern const Texture machine_09005800[]; +extern const Texture machine_09006000[]; +extern const Texture machine_09006800[]; +extern const Texture machine_09007000[]; +extern const Texture machine_09007800[]; +extern const Texture machine_09008000[]; +extern const Texture machine_09008400[]; // mountain -extern const u8 mountain_09000000[]; -extern const u8 mountain_09000800[]; -extern const u8 mountain_09001800[]; -extern const u8 mountain_09002800[]; -extern const u8 mountain_09003000[]; -extern const u8 mountain_09003800[]; -extern const u8 mountain_09004000[]; -extern const u8 mountain_09004800[]; -extern const u8 mountain_09005000[]; -extern const u8 mountain_09005800[]; -extern const u8 mountain_09006800[]; -extern const u8 mountain_09007000[]; -extern const u8 mountain_09007800[]; -extern const u8 mountain_09008000[]; -extern const u8 mountain_09008800[]; -extern const u8 mountain_09009800[]; -extern const u8 mountain_0900A000[]; -extern const u8 mountain_0900A800[]; -extern const u8 mountain_0900B000[]; -extern const u8 mountain_0900B800[]; -extern const u8 mountain_0900C000[]; +extern const Texture mountain_09000000[]; +extern const Texture mountain_09000800[]; +extern const Texture mountain_09001800[]; +extern const Texture mountain_09002800[]; +extern const Texture mountain_09003000[]; +extern const Texture mountain_09003800[]; +extern const Texture mountain_09004000[]; +extern const Texture mountain_09004800[]; +extern const Texture mountain_09005000[]; +extern const Texture mountain_09005800[]; +extern const Texture mountain_09006800[]; +extern const Texture mountain_09007000[]; +extern const Texture mountain_09007800[]; +extern const Texture mountain_09008000[]; +extern const Texture mountain_09008800[]; +extern const Texture mountain_09009800[]; +extern const Texture mountain_0900A000[]; +extern const Texture mountain_0900A800[]; +extern const Texture mountain_0900B000[]; +extern const Texture mountain_0900B800[]; +extern const Texture mountain_0900C000[]; // outside -extern const u8 outside_09000000[]; -extern const u8 outside_09000800[]; -extern const u8 outside_09001000[]; -extern const u8 outside_09002000[]; -extern const u8 outside_09003000[]; -extern const u8 outside_09003800[]; -extern const u8 outside_09004000[]; -extern const u8 outside_09004800[]; -extern const u8 outside_09005800[]; -extern const u8 outside_09006000[]; -extern const u8 outside_09006800[]; -extern const u8 outside_09007800[]; -extern const u8 outside_09008000[]; -extern const u8 outside_09008800[]; -extern const u8 outside_09009000[]; -extern const u8 outside_09009800[]; -extern const u8 outside_0900A000[]; -extern const u8 outside_0900A800[]; -extern const u8 outside_0900B000[]; -extern const u8 outside_0900B400[]; -extern const u8 outside_0900BC00[]; +extern const Texture outside_09000000[]; +extern const Texture outside_09000800[]; +extern const Texture outside_09001000[]; +extern const Texture outside_09002000[]; +extern const Texture outside_09003000[]; +extern const Texture outside_09003800[]; +extern const Texture outside_09004000[]; +extern const Texture outside_09004800[]; +extern const Texture outside_09005800[]; +extern const Texture outside_09006000[]; +extern const Texture outside_09006800[]; +extern const Texture outside_09007800[]; +extern const Texture outside_09008000[]; +extern const Texture outside_09008800[]; +extern const Texture outside_09009000[]; +extern const Texture outside_09009800[]; +extern const Texture outside_0900A000[]; +extern const Texture outside_0900A800[]; +extern const Texture outside_0900B000[]; +extern const Texture outside_0900B400[]; +extern const Texture outside_0900BC00[]; // sky -extern const u8 sky_09000000[]; -extern const u8 sky_09000800[]; -extern const u8 sky_09001000[]; -extern const u8 sky_09001800[]; -extern const u8 sky_09002000[]; -extern const u8 sky_09003000[]; -extern const u8 sky_09003800[]; -extern const u8 sky_09004800[]; -extern const u8 sky_09005000[]; -extern const u8 sky_09005800[]; -extern const u8 sky_09006000[]; -extern const u8 texture_metal_hole[]; -extern const u8 sky_09007000[]; -extern const u8 sky_09007800[]; -extern const u8 sky_09008000[]; +extern const Texture sky_09000000[]; +extern const Texture sky_09000800[]; +extern const Texture sky_09001000[]; +extern const Texture sky_09001800[]; +extern const Texture sky_09002000[]; +extern const Texture sky_09003000[]; +extern const Texture sky_09003800[]; +extern const Texture sky_09004800[]; +extern const Texture sky_09005000[]; +extern const Texture sky_09005800[]; +extern const Texture sky_09006000[]; +extern const Texture texture_metal_hole[]; +extern const Texture sky_09007000[]; +extern const Texture sky_09007800[]; +extern const Texture sky_09008000[]; // snow -extern const u8 snow_09000000[]; -extern const u8 snow_09000800[]; -extern const u8 snow_09001000[]; -extern const u8 snow_09002000[]; -extern const u8 snow_09002800[]; -extern const u8 snow_09003000[]; -extern const u8 snow_09003800[]; -extern const u8 snow_09004000[]; -extern const u8 snow_09004800[]; -extern const u8 snow_09005000[]; -extern const u8 snow_09005800[]; -extern const u8 snow_09006000[]; -extern const u8 snow_09006800[]; -extern const u8 snow_09007000[]; -extern const u8 snow_09008000[]; -extern const u8 snow_09008800[]; -extern const u8 snow_09009000[]; -extern const u8 snow_09009800[]; +extern const Texture snow_09000000[]; +extern const Texture snow_09000800[]; +extern const Texture snow_09001000[]; +extern const Texture snow_09002000[]; +extern const Texture snow_09002800[]; +extern const Texture snow_09003000[]; +extern const Texture snow_09003800[]; +extern const Texture snow_09004000[]; +extern const Texture snow_09004800[]; +extern const Texture snow_09005000[]; +extern const Texture snow_09005800[]; +extern const Texture snow_09006000[]; +extern const Texture snow_09006800[]; +extern const Texture snow_09007000[]; +extern const Texture snow_09008000[]; +extern const Texture snow_09008800[]; +extern const Texture snow_09009000[]; +extern const Texture snow_09009800[]; // spooky -extern const u8 spooky_09000000[]; -extern const u8 spooky_09000800[]; -extern const u8 spooky_09001000[]; -extern const u8 spooky_09001800[]; -extern const u8 spooky_09002800[]; -extern const u8 spooky_09003800[]; -extern const u8 spooky_09004800[]; -extern const u8 spooky_09005000[]; -extern const u8 spooky_09006000[]; -extern const u8 spooky_09006800[]; -extern const u8 spooky_09007000[]; -extern const u8 spooky_09008000[]; -extern const u8 spooky_09008800[]; -extern const u8 spooky_09009000[]; -extern const u8 spooky_0900A000[]; -extern const u8 spooky_0900A800[]; -extern const u8 spooky_0900B000[]; -extern const u8 spooky_0900B800[]; +extern const Texture spooky_09000000[]; +extern const Texture spooky_09000800[]; +extern const Texture spooky_09001000[]; +extern const Texture spooky_09001800[]; +extern const Texture spooky_09002800[]; +extern const Texture spooky_09003800[]; +extern const Texture spooky_09004800[]; +extern const Texture spooky_09005000[]; +extern const Texture spooky_09006000[]; +extern const Texture spooky_09006800[]; +extern const Texture spooky_09007000[]; +extern const Texture spooky_09008000[]; +extern const Texture spooky_09008800[]; +extern const Texture spooky_09009000[]; +extern const Texture spooky_0900A000[]; +extern const Texture spooky_0900A800[]; +extern const Texture spooky_0900B000[]; +extern const Texture spooky_0900B800[]; // water -extern const u8 water_09000000[]; -extern const u8 water_09000800[]; -extern const u8 water_09001800[]; -extern const u8 water_09002800[]; -extern const u8 water_09003800[]; -extern const u8 water_09004800[]; -extern const u8 water_09005800[]; -extern const u8 water_09006000[]; -extern const u8 water_09006800[]; -extern const u8 water_09007800[]; -extern const u8 water_09008800[]; -extern const u8 water_09009000[]; -extern const u8 water_0900A000[]; -extern const u8 water_0900A800[]; -extern const u8 water_0900B800[]; +extern const Texture water_09000000[]; +extern const Texture water_09000800[]; +extern const Texture water_09001800[]; +extern const Texture water_09002800[]; +extern const Texture water_09003800[]; +extern const Texture water_09004800[]; +extern const Texture water_09005800[]; +extern const Texture water_09006000[]; +extern const Texture water_09006800[]; +extern const Texture water_09007800[]; +extern const Texture water_09008800[]; +extern const Texture water_09009000[]; +extern const Texture water_0900A000[]; +extern const Texture water_0900A800[]; +extern const Texture water_0900B800[]; // effect -extern const u8 *const flower_bubbles_textures_ptr_0B002008[]; -extern const u8 *const lava_bubble_ptr_0B006020[]; -extern const u8 *const bubble_ptr_0B006848[]; +extern const Texture *const flower_bubbles_textures_ptr_0B002008[]; +extern const Texture *const lava_bubble_ptr_0B006020[]; +extern const Texture *const bubble_ptr_0B006848[]; extern const Gfx tiny_bubble_dl_0B006A50[]; extern const Gfx tiny_bubble_dl_0B006AB0[]; extern const Gfx tiny_bubble_dl_0B006CD8[]; @@ -275,7 +275,7 @@ extern const Gfx title_screen_bg_dl_0A000148[]; extern const Gfx title_screen_bg_dl_0A000160[]; extern const Gfx title_screen_bg_dl_0A000178[]; extern const Gfx title_screen_bg_dl_end[]; -extern const u8 *const mario_title_texture_table[]; -extern const u8 *const game_over_texture_table[]; +extern const Texture *const mario_title_texture_table[]; +extern const Texture *const game_over_texture_table[]; #endif // TEXTURES_H diff --git a/levels/bbh/header.h b/levels/bbh/header.h index 74f49d83..de769e94 100644 --- a/levels/bbh/header.h +++ b/levels/bbh/header.h @@ -96,7 +96,7 @@ extern const Gfx bbh_seg7_dl_0701FFE8[]; extern const Gfx bbh_seg7_dl_070202F0[]; extern const Gfx bbh_seg7_dl_070206F0[]; extern const Collision bbh_seg7_collision_level[]; -extern const u8 bbh_seg7_rooms[]; +extern const RoomData bbh_seg7_rooms[]; extern const MacroObject bbh_seg7_macro_objs[]; extern const Collision bbh_seg7_collision_staircase_step[]; extern const Collision bbh_seg7_collision_tilt_floor_platform[]; diff --git a/levels/castle_inside/header.h b/levels/castle_inside/header.h index dfd63923..043e3383 100644 --- a/levels/castle_inside/header.h +++ b/levels/castle_inside/header.h @@ -141,9 +141,9 @@ extern const Collision inside_castle_seg7_collision_ddd_warp_2[]; extern const MacroObject inside_castle_seg7_area_1_macro_objs[]; extern const MacroObject inside_castle_seg7_area_2_macro_objs[]; extern const MacroObject inside_castle_seg7_area_3_macro_objs[]; -extern const u8 inside_castle_seg7_area_1_rooms[]; -extern const u8 inside_castle_seg7_area_2_rooms[]; -extern const u8 inside_castle_seg7_area_3_rooms[]; +extern const RoomData inside_castle_seg7_area_1_rooms[]; +extern const RoomData inside_castle_seg7_area_2_rooms[]; +extern const RoomData inside_castle_seg7_area_3_rooms[]; extern const Collision inside_castle_seg7_collision_floor_trap[]; extern const Collision inside_castle_seg7_collision_star_door[]; extern const Collision inside_castle_seg7_collision_water_level_pillar[]; diff --git a/levels/hmc/header.h b/levels/hmc/header.h index bc534cbc..fa913c11 100644 --- a/levels/hmc/header.h +++ b/levels/hmc/header.h @@ -74,11 +74,11 @@ extern const Gfx hmc_seg7_dl_07023E10[]; extern const Gfx hmc_seg7_dl_07024110[]; extern const Gfx hmc_seg7_dl_07024268[]; extern const Gfx hmc_seg7_dl_070242A0[]; -extern const u8 *const hmc_seg7_painting_textures_07025518[]; +extern const Texture *const hmc_seg7_painting_textures_07025518[]; extern struct Painting cotmc_painting; extern const Collision hmc_seg7_collision_level[]; extern const MacroObject hmc_seg7_macro_objs[]; -extern const u8 hmc_seg7_rooms[]; +extern const RoomData hmc_seg7_rooms[]; extern const Collision hmc_seg7_collision_elevator[]; extern const Collision hmc_seg7_collision_0702B65C[]; extern const Collision hmc_seg7_collision_controllable_platform[]; diff --git a/levels/intro/leveldata.c b/levels/intro/leveldata.c index 5f61dfe7..a817c293 100644 --- a/levels/intro/leveldata.c +++ b/levels/intro/leveldata.c @@ -3348,11 +3348,11 @@ ALIGNED8 static const Texture intro_seg7_texture_0700B4A0[] = { #if defined(VERSION_EU) // 0x0700C4A0 - 0x0700D4A0 -ALIGNED8 static const u8 intro_seg7_texture_0700C4A0[] = { +ALIGNED8 static const Texture intro_seg7_texture_0700C4A0[] = { #include "levels/intro/3_eu_tm.rgba16.inc.c" }; #elif defined(VERSION_SH) -ALIGNED8 static const u8 intro_seg7_texture_0700C4A0[] = { +ALIGNED8 static const Texture intro_seg7_texture_0700C4A0[] = { #include "levels/intro/3_sh_tm.rgba16.inc.c" }; #else diff --git a/levels/menu/header.h b/levels/menu/header.h index 59bfb341..e73f9650 100644 --- a/levels/menu/header.h +++ b/levels/menu/header.h @@ -30,8 +30,8 @@ extern const Gfx dl_menu_sound_button[]; extern const Gfx dl_menu_generic_button[]; extern const Gfx dl_menu_idle_hand[]; extern const Gfx dl_menu_grabbing_hand[]; -extern const u8 *const menu_hud_lut[]; -extern const u8 *const menu_font_lut[]; +extern const Texture *const menu_hud_lut[]; +extern const Texture *const menu_font_lut[]; extern const Gfx dl_menu_ia8_text_begin[]; extern const Gfx dl_menu_ia8_text_end[]; extern const Gfx dl_menu_rgba16_wood_course[]; diff --git a/levels/ssl/header.h b/levels/ssl/header.h index a38845cd..cf1b0c85 100644 --- a/levels/ssl/header.h +++ b/levels/ssl/header.h @@ -18,8 +18,8 @@ extern const GeoLayout ssl_geo_0007CC[]; extern const GeoLayout ssl_geo_00088C[]; // leveldata -extern const u8 ssl_pyramid_sand[]; -extern const u8 ssl_quicksand[]; +extern const Texture ssl_pyramid_sand[]; +extern const Texture ssl_quicksand[]; extern const Gfx ssl_dl_quicksand_pit_begin[]; extern const Gfx ssl_dl_quicksand_pit_end[]; extern const Gfx ssl_dl_pyramid_quicksand_pit_begin[]; diff --git a/levels/ttc/header.h b/levels/ttc/header.h index 30edd607..241d3685 100644 --- a/levels/ttc/header.h +++ b/levels/ttc/header.h @@ -55,7 +55,7 @@ extern const Collision ttc_seg7_collision_clock_platform[]; extern const Collision ttc_seg7_collision_clock_main_rotation[]; extern const Collision ttc_seg7_collision_rotating_clock_platform2[]; extern const MacroObject ttc_seg7_macro_objs[]; -extern const u8 ttc_yellow_triangle[]; +extern const Texture ttc_yellow_triangle[]; extern const Gfx ttc_dl_surface_treadmill_begin[]; extern const Gfx ttc_dl_surface_treadmill_end[]; extern Movtex ttc_movtex_tris_big_surface_treadmill[]; diff --git a/src/engine/level_script.h b/src/engine/level_script.h index d41a91c8..e7abe672 100644 --- a/src/engine/level_script.h +++ b/src/engine/level_script.h @@ -5,7 +5,7 @@ struct LevelCommand; -extern u8 level_script_entry[]; +extern LevelScript level_script_entry[]; struct LevelCommand *level_script_execute(struct LevelCommand *cmd); diff --git a/src/game/area.h b/src/game/area.h index c8f073c4..5ee2edad 100644 --- a/src/game/area.h +++ b/src/game/area.h @@ -67,7 +67,7 @@ struct Area /*0x02*/ u16 terrainType; // default terrain of the level (set from level script cmd 0x31) /*0x04*/ struct GraphNodeRoot *graphNode; // geometry layout data /*0x08*/ s16 *terrainData; // collision data (set from level script cmd 0x2E) - /*0x0C*/ s8 *surfaceRooms; // (set from level script cmd 0x2F) + /*0x0C*/ RoomData *surfaceRooms; // (set from level script cmd 0x2F) /*0x10*/ s16 *macroObjects; // Macro Objects Ptr (set from level script cmd 0x39) /*0x14*/ struct ObjectWarpNode *warpNodes; /*0x18*/ struct WarpNode *paintingWarpNodes; diff --git a/src/game/behaviors/camera_lakitu.inc.c b/src/game/behaviors/camera_lakitu.inc.c index 3d2ed702..a848a2ce 100644 --- a/src/game/behaviors/camera_lakitu.inc.c +++ b/src/game/behaviors/camera_lakitu.inc.c @@ -150,8 +150,8 @@ void bhv_camera_lakitu_update(void) { break; } } else { - f32 val0C = (f32) 0x875C3D / 0x800 - gLakituState.curPos[0]; - if (gLakituState.curPos[0] < 1700.0f || val0C < 0.0f) { + f32 mirroredX = CASTLE_MIRROR_X - gLakituState.curPos[0]; + if (gLakituState.curPos[0] < 1700.0f || mirroredX < 0.0f) { cur_obj_hide(); } else { cur_obj_unhide(); @@ -167,7 +167,7 @@ void bhv_camera_lakitu_update(void) { o->oFaceAnglePitch = atan2s(cur_obj_lateral_dist_to_home(), o->oPosY - gLakituState.curFocus[1]); - o->oPosX = (f32) 0x875C3D / 0x800 + val0C; + o->oPosX = CASTLE_MIRROR_X + mirroredX; } } } diff --git a/src/game/behaviors/chain_chomp.inc.c b/src/game/behaviors/chain_chomp.inc.c index 74543a3c..38e97cbc 100644 --- a/src/game/behaviors/chain_chomp.inc.c +++ b/src/game/behaviors/chain_chomp.inc.c @@ -210,20 +210,20 @@ static void chain_chomp_sub_act_lunge(void) { obj_face_pitch_approach(o->oChainChompTargetPitch, 0x400); if (o->oForwardVel != 0.0f) { - f32 val04; + // f32 val04; if (o->oChainChompRestrictedByChain == TRUE) { o->oForwardVel = o->oVelY = 0.0f; o->oChainChompSignedMaxDistBetweenChainParts = 30.0f; } - // TODO: What is this - if ((val04 = 900.0f - o->oChainChompDistToPivot) > 220.0f) { - val04 = 220.0f; - } + // // TODO: What is this + // if ((val04 = 900.0f - o->oChainChompDistToPivot) > 220.0f) { + // val04 = 220.0f; + // } - o->oChainChompMaxDistBetweenChainParts = - val04 / 220.0f * o->oChainChompMaxDistFromPivotPerChainPart; + // o->oChainChompMaxDistBetweenChainParts = + // val04 / 220.0f * o->oChainChompMaxDistFromPivotPerChainPart; o->oTimer = 0; } else { // Turn toward pivot diff --git a/src/game/behaviors/intro_lakitu.inc.c b/src/game/behaviors/intro_lakitu.inc.c index 6fdf20b7..4593f7c5 100644 --- a/src/game/behaviors/intro_lakitu.inc.c +++ b/src/game/behaviors/intro_lakitu.inc.c @@ -24,13 +24,11 @@ void intro_lakitu_set_offset_from_camera(struct Object *o, Vec3f offset) { } void intro_lakitu_set_focus(struct Object *o, Vec3f newFocus) { - Vec3f origin; f32 dist; s16 pitch, yaw; // newFocus is an offset from lakitu's origin, not a point in the world. - vec3f_set(origin, 0.f, 0.f, 0.f); - vec3f_get_dist_and_angle(origin, newFocus, &dist, &pitch, &yaw); + vec3f_get_dist_and_angle(gVec3fZero, newFocus, &dist, &pitch, &yaw); o->oFaceAnglePitch = pitch; o->oFaceAngleYaw = yaw; } @@ -57,6 +55,7 @@ s32 intro_lakitu_set_pos_and_focus(struct Object *o, struct CutsceneSplinePoint void bhv_intro_lakitu_loop(void) { Vec3f offset, fromPoint, toPoint; + s16 yawToCam; switch (gCurrentObject->oAction) { case 0: @@ -94,18 +93,10 @@ void bhv_intro_lakitu_loop(void) { cur_obj_play_sound_2(SOUND_ACTION_INTRO_UNK45E); break; #endif - case 73: - gCurrentObject->oAnimState += 1; - break; - case 74: - gCurrentObject->oAnimState -= 1; - break; - case 82: - gCurrentObject->oAnimState += 1; - break; - case 84: - gCurrentObject->oAnimState -= 1; - break; + case 73: gCurrentObject->oAnimState++; break; + case 74: gCurrentObject->oAnimState--; break; + case 82: gCurrentObject->oAnimState++; break; + case 84: gCurrentObject->oAnimState--; break; } #ifdef VERSION_EU if (gCurrentObject->oTimer == 446) @@ -163,14 +154,14 @@ void bhv_intro_lakitu_loop(void) { #else #define TIMER 98 #endif - if (gCurrentObject->oTimer == TIMER) { obj_mark_for_deletion(gCurrentObject); obj_mark_for_deletion(gCurrentObject->oIntroLakituCloud); } #ifndef VERSION_JP - if (gCurrentObject->oTimer == 14) + if (gCurrentObject->oTimer == 14) { cur_obj_play_sound_2(SOUND_ACTION_INTRO_UNK45F); + } #endif break; case 100: @@ -188,13 +179,11 @@ void bhv_intro_lakitu_loop(void) { case 101: object_pos_to_vec3f(toPoint, gCurrentObject); if (gCurrentObject->oTimer > 60) { - gCurrentObject->oForwardVel = - approach_f32_asymptotic(gCurrentObject->oForwardVel, -10.f, 0.05f); + gCurrentObject->oForwardVel = approach_f32_asymptotic(gCurrentObject->oForwardVel, -10.f, 0.05f); gCurrentObject->oMoveAngleYaw += 0x78; gCurrentObject->oMoveAnglePitch += 0x40; - gCurrentObject->oFaceAngleYaw = camera_approach_s16_symmetric( - gCurrentObject->oFaceAngleYaw, (s16) calculate_yaw(toPoint, gCamera->pos), - 0x200); + vec3f_get_yaw(toPoint, gCamera->pos, &yawToCam); + gCurrentObject->oFaceAngleYaw = camera_approach_s16_symmetric(gCurrentObject->oFaceAngleYaw, yawToCam, 0x200); } if (gCurrentObject->oTimer > 105) { gCurrentObject->oAction += 1; @@ -206,15 +195,13 @@ void bhv_intro_lakitu_loop(void) { case 102: object_pos_to_vec3f(toPoint, gCurrentObject); - gCurrentObject->oForwardVel = - approach_f32_asymptotic(gCurrentObject->oForwardVel, 60.f, 0.05f); - gCurrentObject->oFaceAngleYaw = camera_approach_s16_symmetric( - gCurrentObject->oFaceAngleYaw, (s16) calculate_yaw(toPoint, gCamera->pos), 0x200); - if (gCurrentObject->oTimer < 62) - gCurrentObject->oMoveAngleYaw = - approach_s16_asymptotic(gCurrentObject->oMoveAngleYaw, 0x1800, 0x1E); - gCurrentObject->oMoveAnglePitch = - camera_approach_s16_symmetric(gCurrentObject->oMoveAnglePitch, -0x2000, 0x5A); + gCurrentObject->oForwardVel = approach_f32_asymptotic(gCurrentObject->oForwardVel, 60.f, 0.05f); + vec3f_get_yaw(toPoint, gCamera->pos, &yawToCam); + gCurrentObject->oFaceAngleYaw = camera_approach_s16_symmetric(gCurrentObject->oFaceAngleYaw, yawToCam, 0x200); + if (gCurrentObject->oTimer < 62) { + gCurrentObject->oMoveAngleYaw = approach_s16_asymptotic(gCurrentObject->oMoveAngleYaw, 0x1800, 0x1E); + } + gCurrentObject->oMoveAnglePitch = camera_approach_s16_symmetric(gCurrentObject->oMoveAnglePitch, -0x2000, 0x5A); gCurrentObject->oFaceAnglePitch = 0; cur_obj_set_pos_via_transform(); break; diff --git a/src/game/behaviors/lll_hexagonal_ring.inc.c b/src/game/behaviors/lll_hexagonal_ring.inc.c index 014da42b..dddc0d29 100644 --- a/src/game/behaviors/lll_hexagonal_ring.inc.c +++ b/src/game/behaviors/lll_hexagonal_ring.inc.c @@ -2,13 +2,12 @@ void hexagonal_ring_spawn_flames(void) { struct Object *flameObj; - f32 size; flameObj = spawn_object(o, MODEL_RED_FLAME, bhvVolcanoFlames); flameObj->oPosY += 550.0f; flameObj->oMoveAngleYaw = random_u16() << 0x10 >> 0x10; flameObj->oForwardVel = random_float() * 40.0f + 20.0f; flameObj->oVelY = random_float() * 50.0f + 10.0f; - size = random_float() * 6.0 + 3.0; + f32 size = random_float() * 6.0f + 3.0f; obj_scale_xyz(flameObj, size, size, size); if (random_float() < 0.1) cur_obj_play_sound_2(SOUND_GENERAL_VOLCANO_EXPLOSION); diff --git a/src/game/behaviors/tweester.inc.c b/src/game/behaviors/tweester.inc.c index 7abcbb7c..dda8c525 100644 --- a/src/game/behaviors/tweester.inc.c +++ b/src/game/behaviors/tweester.inc.c @@ -25,12 +25,9 @@ void tweester_scale_and_move(f32 preScale) { s16 dYaw = 0x2C00; f32 scale = preScale * 0.4; - o->header.gfx.scale[0] - = (( coss(o->oTweesterScaleTimer) + 1.0) * 0.5 * 0.3 + 1.0) * scale; - o->header.gfx.scale[1] - = ((-coss(o->oTweesterScaleTimer) + 1.0) * 0.5 * 0.5 + 0.5) * scale; - o->header.gfx.scale[2] - = (( coss(o->oTweesterScaleTimer) + 1.0) * 0.5 * 0.3 + 1.0) * scale; + o->header.gfx.scale[0] = (( coss(o->oTweesterScaleTimer) + 1.0f) * 0.5f * 0.3f + 1.0f) * scale; + o->header.gfx.scale[1] = ((-coss(o->oTweesterScaleTimer) + 1.0f) * 0.5f * 0.5f + 0.5f) * scale; + o->header.gfx.scale[2] = (( coss(o->oTweesterScaleTimer) + 1.0f) * 0.5f * 0.3f + 1.0f) * scale; o->oTweesterScaleTimer += 0x200; o->oForwardVel = 14.0f; diff --git a/src/game/behaviors/water_objs.inc.c b/src/game/behaviors/water_objs.inc.c index 4746cb84..b432b431 100644 --- a/src/game/behaviors/water_objs.inc.c +++ b/src/game/behaviors/water_objs.inc.c @@ -9,8 +9,8 @@ void bhv_water_air_bubble_init(void) { void bhv_water_air_bubble_loop(void) { s32 i; - o->header.gfx.scale[0] = sins(o->oWaterObjScaleXAngle) * 0.5 + 4.0; - o->header.gfx.scale[1] = -sins(o->oWaterObjScaleXAngle) * 0.5 + 4.0; + o->header.gfx.scale[0] = sins(o->oWaterObjScaleXAngle) * 0.5f + 4.0f; + o->header.gfx.scale[1] = -sins(o->oWaterObjScaleXAngle) * 0.5f + 4.0f; o->oWaterObjScaleXAngle += 0x400; if (o->oTimer < 30) { cur_obj_become_intangible(); @@ -45,20 +45,20 @@ void scale_bubble_random(void) { } void bhv_bubble_maybe_loop(void) { - o->oPosY += random_float() * 3.0f + 6.0f; + o->oPosY += random_float() * 3.0f + 6.0f; o->oPosX += random_float() * 10.0f - 5.0f; o->oPosZ += random_float() * 10.0f - 5.0f; - o->header.gfx.scale[0] = sins(o->oWaterObjScaleXAngle) * 0.2 + 1.0; + o->header.gfx.scale[0] = sins(o->oWaterObjScaleXAngle) * 0.2f + 1.0f; o->oWaterObjScaleXAngle += o->oWaterObjScaleXAngleVel; - o->header.gfx.scale[1] = sins(o->oWaterObjScaleYAngle) * 0.2 + 1.0; + o->header.gfx.scale[1] = sins(o->oWaterObjScaleYAngle) * 0.2f + 1.0f; o->oWaterObjScaleYAngle += o->oWaterObjScaleYAngleVel; } void bhv_small_water_wave_loop(void) { f32 waterLevel = find_water_level(o->oPosX, o->oPosZ); - o->header.gfx.scale[0] = sins(o->oWaterObjScaleXAngle) * 0.2 + 1.0; + o->header.gfx.scale[0] = sins(o->oWaterObjScaleXAngle) * 0.2f + 1.0f; o->oWaterObjScaleXAngle += o->oWaterObjScaleXAngleVel; - o->header.gfx.scale[1] = sins(o->oWaterObjScaleYAngle) * 0.2 + 1.0; + o->header.gfx.scale[1] = sins(o->oWaterObjScaleYAngle) * 0.2f + 1.0f; o->oWaterObjScaleYAngle += o->oWaterObjScaleYAngleVel; if (o->oPosY > waterLevel) { o->activeFlags = ACTIVE_FLAG_DEACTIVATED; @@ -71,9 +71,9 @@ void bhv_small_water_wave_loop(void) { } void scale_bubble_sin(void) { - o->header.gfx.scale[0] = sins(o->oWaterObjScaleXAngle) * 0.5 + 2.0; + o->header.gfx.scale[0] = sins(o->oWaterObjScaleXAngle) * 0.5f + 2.0f; o->oWaterObjScaleXAngle += o->oWaterObjScaleXAngleVel; - o->header.gfx.scale[1] = sins(o->oWaterObjScaleYAngle) * 0.5 + 2.0; + o->header.gfx.scale[1] = sins(o->oWaterObjScaleYAngle) * 0.5f + 2.0f; o->oWaterObjScaleYAngle += o->oWaterObjScaleYAngleVel; } @@ -102,13 +102,16 @@ void bhv_small_bubbles_loop(void) { } void bhv_fish_group_loop(void) { - if (gMarioCurrentRoom == 15 || gMarioCurrentRoom == 7) - if (gGlobalTimer & 1) + if (gMarioCurrentRoom == 15 || gMarioCurrentRoom == 7) { + if (gGlobalTimer & 1) { spawn_object(o, MODEL_WHITE_PARTICLE_SMALL, bhvSmallParticleBubbles); + } + } } void bhv_water_waves_init(void) { s32 i; - for (i = 0; i < 3; i++) + for (i = 0; i < 3; i++) { spawn_object(o, MODEL_WHITE_PARTICLE_SMALL, bhvSmallParticle); + } } diff --git a/src/game/camera.c b/src/game/camera.c index da7aff8c..3f9f871b 100644 --- a/src/game/camera.c +++ b/src/game/camera.c @@ -894,9 +894,11 @@ void radial_camera_move(struct Camera *c) { s32 avoidStatus; f32 areaDistX = sMarioCamState->pos[0] - c->areaCenX; f32 areaDistZ = sMarioCamState->pos[2] - c->areaCenZ; + s16 yawOffset; // How much the camera's yaw changed - s16 yawOffset = calculate_yaw(sMarioCamState->pos, c->pos) - atan2s(areaDistZ, areaDistX); + vec3f_get_yaw(sMarioCamState->pos, c->pos, &yawOffset); + yawOffset -= atan2s(areaDistZ, areaDistX); if (yawOffset > maxAreaYaw) { yawOffset = maxAreaYaw; @@ -1324,14 +1326,14 @@ s32 update_parallel_tracking_camera(struct Camera *c, Vec3f focus, Vec3f pos) { // Check if the camera should go to the next path if (sParTrackPath[sParTrackIndex + 1].startOfPath != 0) { // get Mario's distance to the next path - calculate_angles(sParTrackPath[sParTrackIndex + 1].pos, sParTrackPath[sParTrackIndex + 2].pos, &nextPitch, &nextYaw); + vec3f_get_angle(sParTrackPath[sParTrackIndex + 1].pos, sParTrackPath[sParTrackIndex + 2].pos, &nextPitch, &nextYaw); vec3f_set_dist_and_angle(sParTrackPath[sParTrackIndex + 1].pos, nextPathPos, 400.f, nextPitch, nextYaw); - distToPrev = calc_abs_dist_squared(marioPos, nextPathPos); + vec3f_get_dist_squared(marioPos, nextPathPos, &distToPrev); // get Mario's distance to the previous path - calculate_angles(sParTrackPath[sParTrackIndex + 1].pos, sParTrackPath[sParTrackIndex].pos, &prevPitch, &prevYaw); + vec3f_get_angle(sParTrackPath[sParTrackIndex + 1].pos, sParTrackPath[sParTrackIndex].pos, &prevPitch, &prevYaw); vec3f_set_dist_and_angle(sParTrackPath[sParTrackIndex + 1].pos, prevPathPos, 400.f, prevPitch, prevYaw); - distToNext = calc_abs_dist_squared(marioPos, prevPathPos); + vec3f_get_dist_squared(marioPos, prevPathPos, &distToNext); if (distToPrev < distToNext) { sParTrackIndex++; sStatusFlags |= CAM_FLAG_CHANGED_PARTRACK_INDEX; @@ -1341,14 +1343,14 @@ s32 update_parallel_tracking_camera(struct Camera *c, Vec3f focus, Vec3f pos) { // Check if the camera should go to the previous path if (sParTrackIndex != 0) { // get Mario's distance to the next path - calculate_angles((*(sParTrackPath + sParTrackIndex)).pos, (*(sParTrackPath + sParTrackIndex + 1)).pos, &nextPitch, &nextYaw); + vec3f_get_angle((*(sParTrackPath + sParTrackIndex)).pos, (*(sParTrackPath + sParTrackIndex + 1)).pos, &nextPitch, &nextYaw); vec3f_set_dist_and_angle(sParTrackPath[sParTrackIndex].pos, nextPathPos, 700.f, nextPitch, nextYaw); - distToPrev = calc_abs_dist_squared(marioPos, nextPathPos); + vec3f_get_dist_squared(marioPos, nextPathPos, &distToPrev); // get Mario's distance to the previous path - calculate_angles((*(sParTrackPath + sParTrackIndex)).pos, (*(sParTrackPath + sParTrackIndex - 1)).pos, &prevPitch, &prevYaw); + vec3f_get_angle((*(sParTrackPath + sParTrackIndex)).pos, (*(sParTrackPath + sParTrackIndex - 1)).pos, &prevPitch, &prevYaw); vec3f_set_dist_and_angle(sParTrackPath[sParTrackIndex].pos, prevPathPos, 700.f, prevPitch, prevYaw); - distToNext = calc_abs_dist_squared(marioPos, prevPathPos); + vec3f_get_dist_squared(marioPos, prevPathPos, &distToNext); if (distToPrev > distToNext) { sParTrackIndex--; sStatusFlags |= CAM_FLAG_CHANGED_PARTRACK_INDEX; @@ -1487,7 +1489,9 @@ s32 update_boss_fight_camera(struct Camera *c, Vec3f focus, Vec3f pos) { heldState = 0; } - focusDistance = calc_abs_dist(sMarioCamState->pos, secondFocus) * 1.6f; + vec3f_get_dist(sMarioCamState->pos, secondFocus, &focusDistance); + focusDistance *= 1.6f; + if (focusDistance < 800.f) { focusDistance = 800.f; } @@ -1875,8 +1879,7 @@ s16 update_slide_camera(struct Camera *c) { vec3f_set_dist_and_angle(c->focus, c->pos, distCamToFocus, camPitch, camYaw); } } - - camYaw = calculate_yaw(c->focus, c->pos); + vec3f_get_yaw(c->focus, c->pos, &camYaw); return camYaw; } @@ -1983,26 +1986,18 @@ s16 update_default_camera(struct Camera *c) { // Determine how fast to rotate the camera if (sCSideButtonYaw == 0) { - if (c->mode == CAMERA_MODE_FREE_ROAM) { - nextYawVel = 0xC0; - } else { - nextYawVel = 0x100; - } + nextYawVel = ((c->mode == CAMERA_MODE_FREE_ROAM) ? 0xC0 : 0x100); if ((gPlayer1Controller->stickX != 0.f || gPlayer1Controller->stickY != 0.f) != 0) { nextYawVel = 0x20; } } else { - if (sCSideButtonYaw < 0) { - yaw += 0x200; - } - if (sCSideButtonYaw > 0) { - yaw -= 0x200; - } + if (sCSideButtonYaw < 0) yaw += 0x200; + if (sCSideButtonYaw > 0) yaw -= 0x200; camera_approach_s16_symmetric_bool(&sCSideButtonYaw, 0, 0x100); nextYawVel = 0; } sYawSpeed = 0x400; - xzDist = calc_hor_dist(sMarioCamState->pos, c->pos); + vec3f_get_lateral_dist(sMarioCamState->pos, c->pos, &xzDist); if (sStatusFlags & CAM_FLAG_BEHIND_MARIO_POST_DOOR) { if (xzDist >= 250) { @@ -2162,7 +2157,8 @@ s16 update_default_camera(struct Camera *c) { // Make Lakitu fly above the gas gasHeight = find_poison_gas_level(cPos[0], cPos[2]); if (gasHeight != FLOOR_LOWER_LIMIT) { - if ((gasHeight += 130.f) > c->pos[1]) { + gasHeight += 130.f; + if (gasHeight > c->pos[1]) { c->pos[1] = gasHeight; } } @@ -2248,23 +2244,14 @@ void mode_mario_camera(struct Camera *c) { * Rotates the camera around the spiral staircase. */ s32 update_spiral_stairs_camera(struct Camera *c, Vec3f focus, Vec3f pos) { - /// The returned yaw - s16 camYaw; - // unused - s16 focPitch; /// The focus (Mario)'s yaw around the stairs s16 focYaw; - // unused - s16 posPitch; /// The camera's yaw around the stairs s16 posYaw; Vec3f cPos; Vec3f checkPos; struct Surface *floor; - // unused - f32 dist; - f32 focusHeight; - f32 floorHeight; + f32 focusHeight, floorHeight; f32 focY; handle_c_button_movement(c); @@ -2278,8 +2265,8 @@ s32 update_spiral_stairs_camera(struct Camera *c, Vec3f focus, Vec3f pos) { focus[2] = sMarioCamState->pos[2]; vec3f_copy(cPos, pos); - vec3f_get_dist_and_angle(sFixedModeBasePosition, focus, &dist, &focPitch, &focYaw); - vec3f_get_dist_and_angle(sFixedModeBasePosition, cPos, &dist, &posPitch, &posYaw); + vec3f_get_yaw(sFixedModeBasePosition, focus, &focYaw); + vec3f_get_yaw(sFixedModeBasePosition, cPos, &posYaw); sSpiralStairsYawOffset = posYaw - focYaw; // posYaw will change if Mario is more than 90 degrees around the stairs, relative to the camera @@ -2295,9 +2282,9 @@ s32 update_spiral_stairs_camera(struct Camera *c, Vec3f focus, Vec3f pos) { vec3f_set_dist_and_angle(sFixedModeBasePosition, cPos, 300.f, 0, posYaw); // Move the camera's y coord up/down the staircase - checkPos[0] = focus[0] + (cPos[0] - focus[0]) * 0.7f; - checkPos[1] = focus[1] + (cPos[1] - focus[1]) * 0.7f + 300.f; - checkPos[2] = focus[2] + (cPos[2] - focus[2]) * 0.7f; + checkPos[0] = focus[0] + ((cPos[0] - focus[0]) * 0.7f); + checkPos[1] = focus[1] + ((cPos[1] - focus[1]) * 0.7f) + 300.f; + checkPos[2] = focus[2] + ((cPos[2] - focus[2]) * 0.7f); floorHeight = find_floor(checkPos[0], checkPos[1] + 50.f, checkPos[2], &floor); if (floorHeight != FLOOR_LOWER_LIMIT) { @@ -2310,9 +2297,8 @@ s32 update_spiral_stairs_camera(struct Camera *c, Vec3f focus, Vec3f pos) { camera_approach_f32_symmetric_bool(&focus[1], focY, 30.f); pos[0] = cPos[0]; pos[2] = cPos[2]; - camYaw = calculate_yaw(focus, pos); - - return camYaw; + vec3f_get_yaw(focus, pos, &posYaw); + return posYaw; } /** @@ -2393,15 +2379,8 @@ s32 exit_c_up(struct Camera *c) { s16 curPitch; s16 curYaw; s16 checkYaw = 0; - Vec3f storePos; // unused - Vec3f storeFoc; // unused if ((gCameraMovementFlags & CAM_MOVE_C_UP_MODE) && !(gCameraMovementFlags & CAM_MOVE_STARTED_EXITING_C_UP)) { - // Copy the stored pos and focus. This is unused. - vec3f_copy(storePos, sCameraStoreCUp.pos); - vec3f_add(storePos, sMarioCamState->pos); - vec3f_copy(storeFoc, sCameraStoreCUp.focus); - vec3f_add(storeFoc, sMarioCamState->pos); vec3f_copy(checkFoc, c->focus); checkFoc[0] = sMarioCamState->pos[0]; @@ -2954,7 +2933,7 @@ void update_camera(struct Camera *c) { gLakituState.posHSpeed = 0.f; gLakituState.posVSpeed = 0.f; - c->nextYaw = calculate_yaw(gLakituState.focus, gLakituState.pos); + vec3f_get_yaw(gLakituState.focus, gLakituState.pos, &c->nextYaw); c->yaw = c->nextYaw; gCameraMovementFlags &= ~CAM_MOVE_FIX_IN_PLACE; } else { @@ -3224,7 +3203,7 @@ void init_camera(struct Camera *c) { set_fixed_cam_axis_sa_lobby(c->mode); } store_lakitu_cam_info_for_c_up(c); - gLakituState.yaw = calculate_yaw(c->focus, c->pos); + vec3f_get_yaw(c->focus, c->pos, &gLakituState.yaw); gLakituState.nextYaw = gLakituState.yaw; c->yaw = gLakituState.yaw; c->nextYaw = gLakituState.yaw; @@ -3251,8 +3230,6 @@ void init_camera(struct Camera *c) { * modulo-4's the result, because each 8-bit mask only has 4 area bits for each level */ void zoom_out_if_paused_and_outside(struct GraphNodeCamera *camera) { - UNUSED f32 dist; - UNUSED s16 pitch; s16 yaw; s32 areaMaskIndex = gCurrLevelArea / 32; s32 areaBit = 1 << (((gCurrLevelArea & 0x10) / 4) + (((gCurrLevelArea & 0xF) - 1) & 3)); @@ -3268,7 +3245,7 @@ void zoom_out_if_paused_and_outside(struct GraphNodeCamera *camera) { camera->focus[0] = gCamera->areaCenX; camera->focus[1] = (sMarioCamState->pos[1] + gCamera->areaCenY) / 2; camera->focus[2] = gCamera->areaCenZ; - vec3f_get_dist_and_angle(camera->focus, sMarioCamState->pos, &dist, &pitch, &yaw); + vec3f_get_yaw(camera->focus, sMarioCamState->pos, &yaw); vec3f_set_dist_and_angle(sMarioCamState->pos, camera->pos, 6000.f, 0x1000, yaw); if (gCurrLevelNum != LEVEL_THI) { find_in_bounds_yaw_wdw_bob_thi(camera->pos, camera->focus, 0); @@ -3346,16 +3323,14 @@ void vec3f_to_object_pos(struct Object *o, Vec3f src) { */ void evaluate_cubic_spline(f32 u, Vec3f Q, Vec3f a0, Vec3f a1, Vec3f a2, Vec3f a3) { f32 B[4]; - - if (u > 1.f) { - u = 1.f; - } - - B[0] = (1.f - u) * (1.f - u) * (1.f - u) / 6.f; - B[1] = u * u * u / 2.f - u * u + 0.6666667f; - B[2] = -u * u * u / 2.f + u * u / 2.f + u / 2.f + 0.16666667f; - B[3] = u * u * u / 6.f; - + if (u > 1.0f) u = 1.0f; + register f32 nu = (1.0f - u); + register f32 su = sqr(u); + register f32 hcu = (cube(u) / 2.0f); + B[0] = (cube(nu) / 6.0f); + B[1] = (( hcu ) - su + (2.0f / 3.0f)); + B[2] = ((-hcu ) + (su / 2.0f) + (u / 2.0f) + (5.0f / 3.0f)); + B[3] = ( hcu / 3.0f); Q[0] = B[0] * a0[0] + B[1] * a1[0] + B[2] * a2[0] + B[3] * a3[0]; Q[1] = B[0] * a0[1] + B[1] * a1[1] + B[2] * a2[1] + B[3] * a3[1]; Q[2] = B[0] * a0[2] + B[1] * a1[2] + B[2] * a2[2] + B[3] * a3[2]; @@ -3501,34 +3476,13 @@ s32 set_cam_angle(s32 mode) { */ void set_handheld_shake(u8 mode) { switch (mode) { - // They're not in numerical order because that would be too simple... - case HAND_CAM_SHAKE_CUTSCENE: // Lowest increment - sHandheldShakeMag = 0x600; - sHandheldShakeInc = 0.04f; - break; - case HAND_CAM_SHAKE_LOW: // Lowest magnitude - sHandheldShakeMag = 0x300; - sHandheldShakeInc = 0.06f; - break; - case HAND_CAM_SHAKE_HIGH: // Highest mag and inc - sHandheldShakeMag = 0x1000; - sHandheldShakeInc = 0.1f; - break; - case HAND_CAM_SHAKE_UNUSED: // Never used - sHandheldShakeMag = 0x600; - sHandheldShakeInc = 0.07f; - break; - case HAND_CAM_SHAKE_HANG_OWL: // exactly the same as UNUSED... - sHandheldShakeMag = 0x600; - sHandheldShakeInc = 0.07f; - break; - case HAND_CAM_SHAKE_STAR_DANCE: // Slightly steadier than HANG_OWL and UNUSED - sHandheldShakeMag = 0x400; - sHandheldShakeInc = 0.07f; - break; - default: - sHandheldShakeMag = 0x0; - sHandheldShakeInc = 0.f; + case HAND_CAM_SHAKE_CUTSCENE: sHandheldShakeMag = 0x600; sHandheldShakeInc = 0.04f; break; // Lowest increment + case HAND_CAM_SHAKE_UNUSED: sHandheldShakeMag = 0x600; sHandheldShakeInc = 0.07f; break; // Never used + case HAND_CAM_SHAKE_HANG_OWL: sHandheldShakeMag = 0x600; sHandheldShakeInc = 0.07f; break; // exactly the same as UNUSED... + case HAND_CAM_SHAKE_HIGH: sHandheldShakeMag = 0x1000; sHandheldShakeInc = 0.1f; break; // Highest mag and inc + case HAND_CAM_SHAKE_STAR_DANCE: sHandheldShakeMag = 0x400; sHandheldShakeInc = 0.07f; break; // Slightly steadier than HANG_OWL and UNUSED + case HAND_CAM_SHAKE_LOW: sHandheldShakeMag = 0x300; sHandheldShakeInc = 0.06f; break; // Lowest magnitude + default: sHandheldShakeMag = 0x0; sHandheldShakeInc = 0.f; } } @@ -3686,7 +3640,7 @@ s32 collide_with_walls(Vec3f pos, f32 offsetY, f32 radius) { normZ = wall->normal.z; originOffset = wall->originOffset; offset = normX * newPos[i][0] + normY * newPos[i][1] + normZ * newPos[i][2] + originOffset; - offsetAbsolute = ABS2(offset); + offsetAbsolute = ABS(offset); if (offsetAbsolute < radius) { newPos[i][0] += normX * (radius - offset); newPos[i][2] += normZ * (radius - offset); @@ -3713,9 +3667,10 @@ void clamp_pitch(Vec3f from, Vec3f to, s16 maxPitch, s16 minPitch) { } s32 is_within_100_units_of_mario(f32 posX, f32 posY, f32 posZ) { - Vec3f pos; - vec3f_set(pos, posX, posY, posZ); - return (calc_abs_dist_squared(sMarioCamState->pos, pos) < sqr(100.f)); + Vec3f pos = { posX, posY, posZ }; + f32 dist; + vec3f_get_dist_squared(sMarioCamState->pos, pos, &dist); + return (dist < sqr(100.f)); } s32 set_or_approach_f32_asymptotic(f32 *dst, f32 goal, f32 scale) { @@ -3866,7 +3821,7 @@ s16 reduce_by_dist_from_camera(s16 value, f32 maxDist, f32 posX, f32 posY, f32 p pos[2] = posZ; vec3f_get_dist_and_angle(gLakituState.goalPos, pos, &dist, &pitch, &yaw); if (dist < maxDist) { - calculate_angles(gLakituState.goalPos, gLakituState.goalFocus, &goalPitch, &goalYaw); + vec3f_get_angle(gLakituState.goalPos, gLakituState.goalFocus, &goalPitch, &goalYaw); pitch -= goalPitch; yaw -= goalYaw; dist -= 2000.f; @@ -3889,20 +3844,11 @@ s16 reduce_by_dist_from_camera(s16 value, f32 maxDist, f32 posX, f32 posY, f32 p s32 clamp_positions_and_find_yaw(Vec3f pos, Vec3f origin, f32 xMax, f32 xMin, f32 zMax, f32 zMin) { s16 yaw = gCamera->nextYaw; - - if (pos[0] >= xMax) { - pos[0] = xMax; - } - if (pos[0] <= xMin) { - pos[0] = xMin; - } - if (pos[2] >= zMax) { - pos[2] = zMax; - } - if (pos[2] <= zMin) { - pos[2] = zMin; - } - yaw = calculate_yaw(origin, pos); + if (pos[0] >= xMax) pos[0] = xMax; + if (pos[0] <= xMin) pos[0] = xMin; + if (pos[2] >= zMax) pos[2] = zMax; + if (pos[2] <= zMin) pos[2] = zMin; + vec3f_get_yaw(origin, pos, &yaw); return yaw; } @@ -3917,9 +3863,7 @@ s32 clamp_positions_and_find_yaw(Vec3f pos, Vec3f origin, f32 xMax, f32 xMin, f3 * developers just add 180 degrees to the result. */ s32 calc_avoid_yaw(s16 yawFromMario, s16 wallYaw) { - s16 yawDiff = wallYaw - yawFromMario + DEGREES(90); - - if (yawDiff < 0) { + if ((s16)(wallYaw - yawFromMario + DEGREES(90)) < 0) { // Deflect to the right yawFromMario = wallYaw; } else { @@ -3962,22 +3906,14 @@ s32 is_surf_within_bounding_box(struct Surface *surf, f32 xMax, f32 yMax, f32 zM sz[2] = surf->vertex3[2]; for (i = 0; i < 3; i++) { - j = i + 1; - if (j >= 3) { - j = 0; - } + j = (i + 1); + if (j >= 3) j = 0; dx = ABS(sx[i] - sx[j]); - if (dx > dxMax) { - dxMax = dx; - } + if (dx > dxMax) dxMax = dx; dy = ABS(sy[i] - sy[j]); - if (dy > dyMax) { - dyMax = dy; - } + if (dy > dyMax) dyMax = dy; dz = ABS(sz[i] - sz[j]); - if (dz > dzMax) { - dzMax = dz; - } + if (dz > dzMax) dzMax = dz; } if (yMax != -1.f) { if (dyMax < yMax) { @@ -4071,56 +4007,6 @@ s32 is_pos_in_bounds(Vec3f pos, Vec3f center, Vec3f bounds, s16 boundsYaw) { -bounds[2] < rel[2] && rel[2] < bounds[2]); } -s16 calculate_pitch(Vec3f from, Vec3f to) { - f32 dx = to[0] - from[0]; - f32 dy = to[1] - from[1]; - f32 dz = to[2] - from[2]; - return atan2s(sqrtf(sqr(dx) + sqr(dz)), dy); -} - -s16 calculate_yaw(Vec3f from, Vec3f to) { - f32 dx = to[0] - from[0]; - f32 dz = to[2] - from[2]; - return atan2s(dz, dx); -} - -/** - * Calculates the pitch and yaw between two vectors. - */ -void calculate_angles(Vec3f from, Vec3f to, s16 *pitch, s16 *yaw) { - f32 dx = to[0] - from[0]; - f32 dy = to[1] - from[1]; - f32 dz = to[2] - from[2]; - *pitch = atan2s(sqrtf(sqr(dx) + sqr(dz)), dy); - *yaw = atan2s(dz, dx); -} - -/** - * Finds the distance between two vectors. - */ -f32 calc_abs_dist(Vec3f a, Vec3f b) { - register f32 distX = b[0] - a[0]; - register f32 distY = b[1] - a[1]; - register f32 distZ = b[2] - a[2]; - return sqrtf(sqr(distX) + sqr(distY) + sqr(distZ)); -} - -f32 calc_abs_dist_squared(Vec3f a, Vec3f b) { - register f32 distX = b[0] - a[0]; - register f32 distY = b[1] - a[1]; - register f32 distZ = b[2] - a[2]; - return (sqr(distX) + sqr(distY) + sqr(distZ)); -} - -/** - * Finds the horizontal distance between two vectors. - */ -f32 calc_hor_dist(Vec3f a, Vec3f b) { - register f32 distX = b[0] - a[0]; - register f32 distZ = b[2] - a[2]; - return sqrtf(sqr(distX) + sqr(distZ)); -} - /** * Rotates a vector in the horizontal plane and copies it to a new vector. */ @@ -4268,6 +4154,7 @@ void shake_camera_roll(s16 *roll) { s32 offset_yaw_outward_radial(struct Camera *c, s16 areaYaw) { s16 yawGoal = DEGREES(60); s16 yaw = sModeOffsetYaw; + f32 distFromAreaCenter; Vec3f areaCenter; s16 dYaw; switch (gCurrLevelArea) { @@ -4275,7 +4162,8 @@ s32 offset_yaw_outward_radial(struct Camera *c, s16 areaYaw) { areaCenter[0] = c->areaCenX; areaCenter[1] = sMarioCamState->pos[1]; areaCenter[2] = c->areaCenZ; - if (sqr(800.f) > calc_abs_dist_squared(areaCenter, sMarioCamState->pos)) { + vec3f_get_dist_squared(areaCenter, sMarioCamState->pos, &distFromAreaCenter); + if (sqr(800.f) > distFromAreaCenter) { yawGoal = 0x3800; } break; @@ -4837,18 +4725,13 @@ void determine_pushing_or_pulling_door(s16 *rotation) { */ s16 next_lakitu_state(Vec3f newPos, Vec3f newFoc, Vec3f curPos, Vec3f curFoc, Vec3f oldPos, Vec3f oldFoc, s16 yaw) { - s16 yawVelocity; - s16 pitchVelocity; + s16 pitchVelocity, yawVelocity; f32 distVelocity; f32 goalDist; - s16 goalPitch; - s16 goalYaw; + s16 goalPitch, goalYaw; f32 distTimer = sModeTransition.framesLeft; s16 angleTimer = sModeTransition.framesLeft; - Vec3f nextPos; - Vec3f nextFoc; - Vec3f startPos; - Vec3f startFoc; + Vec3f startPos, nextPos, startFoc, nextFoc; s32 i; f32 floorHeight; struct Surface *floor; @@ -4866,10 +4749,8 @@ s16 next_lakitu_state(Vec3f newPos, Vec3f newFoc, Vec3f curPos, Vec3f curFoc, } - vec3f_get_dist_and_angle(curFoc, startFoc, &sModeTransition.focDist, &sModeTransition.focPitch, - &sModeTransition.focYaw); - vec3f_get_dist_and_angle(curFoc, startPos, &sModeTransition.posDist, &sModeTransition.posPitch, - &sModeTransition.posYaw); + vec3f_get_dist_and_angle(curFoc, startFoc, &sModeTransition.focDist, &sModeTransition.focPitch, &sModeTransition.focYaw); + vec3f_get_dist_and_angle(curFoc, startPos, &sModeTransition.posDist, &sModeTransition.posPitch, &sModeTransition.posYaw); sStatusFlags &= ~CAM_FLAG_START_TRANSITION; } @@ -4910,7 +4791,7 @@ s16 next_lakitu_state(Vec3f newPos, Vec3f newFoc, Vec3f curPos, Vec3f curFoc, f32_find_wall_collision(&newPos[0], &newPos[1], &newPos[2], 0.f, 100.f); } sModeTransition.framesLeft--; - yaw = calculate_yaw(newFoc, newPos); + vec3f_get_yaw(newFoc, newPos, &yaw); } else { sModeTransition.posDist = 0.f; sModeTransition.posPitch = 0; @@ -4986,13 +4867,15 @@ void set_camera_mode_close_cam(u8 *mode) { */ void set_camera_mode_radial(struct Camera *c, s16 transitionTime) { Vec3f focus; - s16 yaw; + s16 yawToMario, yawToCam, yaw; focus[0] = c->areaCenX; focus[1] = sMarioCamState->pos[1]; focus[2] = c->areaCenZ; if (c->mode != CAMERA_MODE_RADIAL) { - yaw = calculate_yaw(focus, sMarioCamState->pos) - calculate_yaw(c->focus, c->pos) + DEGREES(90); + vec3f_get_yaw(focus, sMarioCamState->pos, &yawToMario); + vec3f_get_yaw(c->focus, c->pos, &yawToCam); + yaw = yawToMario - yawToCam + DEGREES(90); if (yaw > 0) { transition_to_camera_mode(c, CAMERA_MODE_RADIAL, transitionTime); } else { @@ -5930,7 +5813,6 @@ s16 camera_course_processing(struct Camera *c) { // Camera trigger's bounding box Vec3f center, bounds; u32 insideBounds = FALSE; - UNUSED struct CameraTrigger unused; u8 oldMode = c->mode; if (c->mode == CAMERA_MODE_C_UP) { @@ -5978,8 +5860,7 @@ s16 camera_course_processing(struct Camera *c) { } } } - - b += 1; + b++; } } @@ -6053,18 +5934,14 @@ s16 camera_course_processing(struct Camera *c) { break; case AREA_WDW_MAIN: - switch (sMarioGeometry.currFloorType) { - case SURFACE_INSTANT_WARP_1B: - c->defMode = CAMERA_MODE_RADIAL; - break; + if (sMarioGeometry.currFloorType == SURFACE_INSTANT_WARP_1B) { + c->defMode = CAMERA_MODE_RADIAL; } break; case AREA_WDW_TOWN: - switch (sMarioGeometry.currFloorType) { - case SURFACE_INSTANT_WARP_1C: - c->defMode = CAMERA_MODE_CLOSE; - break; + if (sMarioGeometry.currFloorType == SURFACE_INSTANT_WARP_1C) { + c->defMode = CAMERA_MODE_CLOSE; } break; @@ -6346,7 +6223,7 @@ s16 cutscene_object(u8 cutscene, struct Object *o) { * Update the camera's yaw and nextYaw. This is called from cutscenes to ignore the camera mode's yaw. */ void update_camera_yaw(struct Camera *c) { - c->nextYaw = calculate_yaw(c->focus, c->pos); + vec3f_get_yaw(c->focus, c->pos, &c->nextYaw); c->yaw = c->nextYaw; } @@ -6584,7 +6461,7 @@ void rotate_and_move_vec3f(Vec3f to, Vec3f from, f32 incDist, s16 incPitch, s16 void set_flag_post_door(struct Camera *c) { sStatusFlags |= CAM_FLAG_BEHIND_MARIO_POST_DOOR; - sCameraYawAfterDoorCutscene = calculate_yaw(c->focus, c->pos); + vec3f_get_yaw(c->focus, c->pos, &sCameraYawAfterDoorCutscene); } void cutscene_soften_music(UNUSED struct Camera *c) { @@ -7255,23 +7132,15 @@ void cutscene_dance_fly_away_start(struct Camera *c) { if (c->mode == CAMERA_MODE_RADIAL) { vec3f_set(areaCenter, c->areaCenX, c->areaCenY, c->areaCenZ); - c->yaw = calculate_yaw(areaCenter, c->pos); + vec3f_get_yaw(areaCenter, c->pos, &c->yaw); c->nextYaw = c->yaw; } // Restrict the camera yaw in tight spaces - if ((gLastCompletedStarNum == 6) && (gCurrCourseNum == COURSE_CCM)) { - star_dance_bound_yaw(c, 0x5600, 0x800); - } - if ((gLastCompletedStarNum == 2) && (gCurrCourseNum == COURSE_TTM)) { - star_dance_bound_yaw(c, 0x0, 0x800); - } - if ((gLastCompletedStarNum == 1) && (gCurrCourseNum == COURSE_SL)) { - star_dance_bound_yaw(c, 0x2000, 0x800); - } - if ((gLastCompletedStarNum == 3) && (gCurrCourseNum == COURSE_RR)) { - star_dance_bound_yaw(c, 0x0, 0x800); - } + if ((gLastCompletedStarNum == 6) && (gCurrCourseNum == COURSE_CCM)) star_dance_bound_yaw(c, 0x5600, 0x800); + if ((gLastCompletedStarNum == 2) && (gCurrCourseNum == COURSE_TTM)) star_dance_bound_yaw(c, 0x0, 0x800); + if ((gLastCompletedStarNum == 1) && (gCurrCourseNum == COURSE_SL )) star_dance_bound_yaw(c, 0x2000, 0x800); + if ((gLastCompletedStarNum == 3) && (gCurrCourseNum == COURSE_RR )) star_dance_bound_yaw(c, 0x0, 0x800); } void cutscene_dance_fly_away_approach_mario(struct Camera *c) { @@ -7727,8 +7596,8 @@ void cutscene_red_coin_star_warp(struct Camera *c) { vec3f_set(sCutsceneVars[1].point, o->oHomeX, o->oHomeY, o->oHomeZ); vec3f_get_dist_and_angle(sCutsceneVars[1].point, c->pos, &dist, &pitch, &yaw); - posYaw = calculate_yaw(sCutsceneVars[1].point, c->pos); - yaw = calculate_yaw(sCutsceneVars[1].point, sMarioCamState->pos); + vec3f_get_yaw(sCutsceneVars[1].point, c->pos, &posYaw); + vec3f_get_yaw(sCutsceneVars[1].point, sMarioCamState->pos, &yaw); if (ABS(yaw - posYaw + DEGREES(90)) < ABS(yaw - posYaw - DEGREES(90))) { yaw += DEGREES(90); @@ -7869,7 +7738,9 @@ void cannon_approach_prev(f32 *value, f32 target) { * Fly or warp back to the previous pos and focus, stored in sCameraStoreCutscene. */ void cutscene_prepare_cannon_fly_back(struct Camera *c) { - if (calc_abs_dist_squared(c->pos, sCameraStoreCutscene.pos) < sqr(8000.f)) { + f32 distToPrevPos; + vec3f_get_dist_squared(c->pos, sCameraStoreCutscene.pos, &distToPrevPos); + if (distToPrevPos < sqr(8000.f)) { cannon_approach_prev(&c->pos[0], sCameraStoreCutscene.pos[0]); cannon_approach_prev(&c->pos[1], sCameraStoreCutscene.pos[1]); cannon_approach_prev(&c->pos[2], sCameraStoreCutscene.pos[2]); @@ -8262,9 +8133,8 @@ void cutscene_dialog_start(struct Camera *c) { // Store gCutsceneFocus's position and yaw object_pos_to_vec3f(sCutsceneVars[9].point, gCutsceneFocus); sCutsceneVars[9].point[1] += gCutsceneFocus->hitboxHeight + 200.f; - sCutsceneVars[9].angle[1] = calculate_yaw(sCutsceneVars[8].point, sCutsceneVars[9].point); - - yaw = calculate_yaw(sMarioCamState->pos, gLakituState.curPos); + vec3f_get_yaw(sCutsceneVars[8].point, sCutsceneVars[9].point, &sCutsceneVars[9].angle[1]); + vec3f_get_yaw(sMarioCamState->pos, gLakituState.curPos, &yaw); if ((yaw - sCutsceneVars[9].angle[1]) & 0x8000) { sCutsceneVars[9].angle[1] -= 0x6000; } else { @@ -8283,7 +8153,7 @@ void cutscene_dialog_move_mario_shoulder(struct Camera *c) { scale_along_line(focus, sCutsceneVars[9].point, sMarioCamState->pos, 0.7f); vec3f_get_dist_and_angle(c->pos, focus, &dist, &pitch, &yaw); - pitch = calculate_pitch(c->pos, sCutsceneVars[9].point); + vec3f_get_pitch(c->pos, sCutsceneVars[9].point, &pitch); vec3f_set_dist_and_angle(c->pos, pos, dist, pitch, yaw); focus[1] = focus[1] + (sCutsceneVars[9].point[1] - focus[1]) * 0.1f; @@ -8299,8 +8169,8 @@ void cutscene_dialog_move_mario_shoulder(struct Camera *c) { vec3f_set_dist_and_angle(sCutsceneVars[8].point, pos, dist, pitch, yaw); // Move up if Mario is below the focus object, down is Mario is above - pos[1] = sCutsceneVars[8].point[1] - + sins(calculate_pitch(sCutsceneVars[9].point, sCutsceneVars[8].point)) * 100.f; + vec3f_get_pitch(sCutsceneVars[9].point, sCutsceneVars[8].point, &pitch); + pos[1] = sCutsceneVars[8].point[1] + (sins(pitch) * 100.f); approach_f32_asymptotic_bool(&c->pos[1], pos[1], 0.05f); c->pos[0] = pos[0]; @@ -8640,8 +8510,9 @@ void cutscene_non_painting_death(struct Camera *c) { * because cvar1 rotates until is reaches 0, so it's important that it's a multiple of 0x100. */ void cutscene_cap_switch_press_start(struct Camera *c) { + s16 yaw; store_info_star(c); - s16 yaw = calculate_yaw(sMarioCamState->pos, c->pos); + vec3f_get_yaw(sMarioCamState->pos, c->pos, &yaw); sCutsceneVars[3].angle[1] = 0x1200; // Basically the amount of rotation to get from behind Mario to in front of Mario sCutsceneVars[1].angle[1] = (yaw - (sMarioCamState->faceAngle[1] + sCutsceneVars[3].angle[1])) & 0xFF00; diff --git a/src/game/camera.h b/src/game/camera.h index 0695f808..b4bf74e6 100644 --- a/src/game/camera.h +++ b/src/game/camera.h @@ -11,14 +11,16 @@ #include "level_table.h" +// X position of the mirror +// 0x875C3D = 8870973, 0x800 = 2048, 8870973 / 2048 = ~4331.52978515625 +#define CASTLE_MIRROR_X ((f32)0x875C3D / 0x800) + /** * @file camera.h * Constants, defines, and structs used by the camera system. * @see camera.c */ -#define ABS2(x) ((x) >= 0.f ? (x) : -(x)) - /** * Converts an angle in degrees to sm64's s16 angle units. For example, DEGREES(90) == 0x4000 * This should be used mainly to make camera code clearer at first glance. @@ -709,12 +711,6 @@ void random_vec3s(Vec3s dst, s16 xRange, s16 yRange, s16 zRange); s32 clamp_positions_and_find_yaw(Vec3f pos, Vec3f origin, f32 xMax, f32 xMin, f32 zMax, f32 zMin); s32 is_range_behind_surface(Vec3f from, Vec3f to, struct Surface *surf, s16 range, s16 surfType); void scale_along_line(Vec3f dest, Vec3f from, Vec3f to, f32 scale); -s16 calculate_pitch(Vec3f from, Vec3f to); -s16 calculate_yaw(Vec3f from, Vec3f to); -void calculate_angles(Vec3f from, Vec3f to, s16 *pitch, s16 *yaw); -f32 calc_abs_dist(Vec3f a, Vec3f b); -f32 calc_abs_dist_squared(Vec3f a, Vec3f b); -f32 calc_hor_dist(Vec3f a, Vec3f b); void rotate_in_xz(Vec3f dst, Vec3f src, s16 yaw); void rotate_in_yz(Vec3f dst, Vec3f src, s16 pitch); void set_camera_pitch_shake(s16 mag, s16 decay, s16 inc); diff --git a/src/game/debug_box.c b/src/game/debug_box.c index 5272b553..42fe79ec 100644 --- a/src/game/debug_box.c +++ b/src/game/debug_box.c @@ -100,8 +100,8 @@ Gfx dl_debug_cylinder_verts[] = { gsSPEndDisplayList(), }; -u8 hitboxView = 0; -u8 surfaceView = 0; +u8 hitboxView = FALSE; +u8 surfaceView = FALSE; /** * Internal struct containing box info @@ -189,22 +189,15 @@ static const Gfx dl_visual_surface[] = { u8 viewCycle = 0; -//Puppyprint will call this from elsewhere. -void debug_box_input(void) -{ - if (gPlayer1Controller->buttonPressed & R_JPAD) - { +// Puppyprint will call this from elsewhere. +void debug_box_input(void) { + if (gPlayer1Controller->buttonPressed & R_JPAD) { viewCycle++; - if (viewCycle > 3) + if (viewCycle > 3) { viewCycle = 0; - - hitboxView = 0; - surfaceView = 0; - - if (viewCycle == 1 || viewCycle == 3) - hitboxView = 1; - if (viewCycle == 2 || viewCycle == 3) - surfaceView = 1; + } + hitboxView = (viewCycle == 1 || viewCycle == 3); + surfaceView = (viewCycle == 2 || viewCycle == 3); } } @@ -213,8 +206,7 @@ s32 gVisualOffset; extern s32 gSurfaceNodesAllocated; extern s32 gSurfacesAllocated; -void iterate_surfaces_visual(s32 x, s32 z, Vtx *verts) -{ +void iterate_surfaces_visual(s32 x, s32 z, Vtx *verts) { struct SurfaceNode *node; struct Surface *surf; s32 cellX, cellZ; @@ -231,22 +223,19 @@ void iterate_surfaces_visual(s32 x, s32 z, Vtx *verts) cellX = ((x + LEVEL_BOUNDARY_MAX) / CELL_SIZE) & NUM_CELLS_INDEX; cellZ = ((z + LEVEL_BOUNDARY_MAX) / CELL_SIZE) & NUM_CELLS_INDEX; - for (i = 0; i < 8; i++) - { - switch (i) - { - case 0: node = gDynamicSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_WALLS].next; col[0] = 0x00; col[1] = 0xFF; col[2] = 0x00; break; - case 1: node = gStaticSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_WALLS].next; col[0] = 0x00; col[1] = 0xFF; col[2] = 0x00; break; - case 2: node = gDynamicSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_FLOORS].next; col[0] = 0x00; col[1] = 0x00; col[2] = 0xFF; break; - case 3: node = gStaticSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_FLOORS].next; col[0] = 0x00; col[1] = 0x00; col[2] = 0xFF; break; - case 4: node = gDynamicSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_CEILS].next; col[0] = 0xFF; col[1] = 0x00; col[2] = 0x00; break; - case 5: node = gStaticSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_CEILS].next; col[0] = 0xFF; col[1] = 0x00; col[2] = 0x00; break; - case 6: node = gDynamicSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_WATER].next; col[0] = 0xFF; col[1] = 0xFF; col[2] = 0x00; break; - case 7: node = gStaticSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_WATER].next; col[0] = 0xFF; col[1] = 0xFF; col[2] = 0x00; break; + for (i = 0; i < 8; i++) { + switch (i) { + case 0: node = gDynamicSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_WALLS ].next; col[0] = 0x00; col[1] = 0xFF; col[2] = 0x00; break; + case 1: node = gStaticSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_WALLS ].next; col[0] = 0x00; col[1] = 0xFF; col[2] = 0x00; break; + case 2: node = gDynamicSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_FLOORS].next; col[0] = 0x00; col[1] = 0x00; col[2] = 0xFF; break; + case 3: node = gStaticSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_FLOORS].next; col[0] = 0x00; col[1] = 0x00; col[2] = 0xFF; break; + case 4: node = gDynamicSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_CEILS ].next; col[0] = 0xFF; col[1] = 0x00; col[2] = 0x00; break; + case 5: node = gStaticSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_CEILS ].next; col[0] = 0xFF; col[1] = 0x00; col[2] = 0x00; break; + case 6: node = gDynamicSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_WATER ].next; col[0] = 0xFF; col[1] = 0xFF; col[2] = 0x00; break; + case 7: node = gStaticSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_WATER ].next; col[0] = 0xFF; col[1] = 0xFF; col[2] = 0x00; break; } - while (node != NULL) - { + while (node != NULL) { surf = node->surface; node = node->next; diff --git a/src/game/ingame_menu.c b/src/game/ingame_menu.c index ebb18b3a..491f7ba3 100644 --- a/src/game/ingame_menu.c +++ b/src/game/ingame_menu.c @@ -221,10 +221,10 @@ void create_dl_ortho_matrix(void) { #if !defined(VERSION_JP) && !defined(VERSION_SH) UNUSED #endif -static u8 *alloc_ia8_text_from_i1(u16 *in, s16 width, s16 height) { +static Texture *alloc_ia8_text_from_i1(u16 *in, s16 width, s16 height) { //! Texture type for *in? s32 inPos; u16 bitMask; - u8 *out; + Texture *out; s16 outPos = 0; out = alloc_display_list((u32) width * (u32) height); @@ -251,15 +251,15 @@ static u8 *alloc_ia8_text_from_i1(u16 *in, s16 width, s16 height) { return out; } -u8 *alloc_ia4_tex_from_i1(u8 *in, s16 width, s16 height) { +Texture *alloc_ia4_tex_from_i1(Texture *in, s16 width, s16 height) { u32 size = (u32) width * (u32) height; - u8 *out; + Texture *out; s32 inPos; s16 outPos; u8 bitMask; outPos = 0; - out = (u8 *) alloc_display_list(size); + out = (Texture *) alloc_display_list(size); if (out == NULL) { return NULL; @@ -555,21 +555,11 @@ void handle_menu_scrolling(s8 scrollDirection, s8 *currentIndex, s8 minIndex, s8 u8 index = 0; if (scrollDirection == MENU_SCROLL_VERTICAL) { - if (gPlayer3Controller->rawStickY > 60) { - index++; - } - - if (gPlayer3Controller->rawStickY < -60) { - index += 2; - } + if (gPlayer3Controller->rawStickY > 60) index++; + if (gPlayer3Controller->rawStickY < -60) index += 2; } else if (scrollDirection == MENU_SCROLL_HORIZONTAL) { - if (gPlayer3Controller->rawStickX > 60) { - index += 2; - } - - if (gPlayer3Controller->rawStickX < -60) { - index++; - } + if (gPlayer3Controller->rawStickX > 60) index += 2; + if (gPlayer3Controller->rawStickX < -60) index++; } if (((index ^ gMenuHoldKeyIndex) & index) == 2) { diff --git a/src/game/mario_actions_automatic.c b/src/game/mario_actions_automatic.c index 0e75239d..96340613 100644 --- a/src/game/mario_actions_automatic.c +++ b/src/game/mario_actions_automatic.c @@ -148,13 +148,7 @@ s32 act_holding_pole(struct MarioState *m) { m->faceAngle[1] += marioObj->oMarioPoleYawVel; marioObj->oMarioPolePos -= marioObj->oMarioPoleYawVel / 0x100; - if (m->usedObj->behavior == segmented_to_virtual(bhvTree)) { - //! The Shifting Sand Land palm tree check is done climbing up in - // add_tree_leaf_particles, but not here, when climbing down. - if (m->pos[1] - m->floorHeight > 100.0f) { - m->particleFlags |= PARTICLE_LEAF; - } - } + add_tree_leaf_particles(m); play_climbing_sounds(m, 2); #if ENABLE_RUMBLE reset_rumble_timers_slip(); diff --git a/src/game/mario_misc.c b/src/game/mario_misc.c index 6e268766..8e6f720a 100644 --- a/src/game/mario_misc.c +++ b/src/game/mario_misc.c @@ -589,9 +589,6 @@ Gfx *geo_switch_mario_hand_grab_pos(s32 callContext, struct GraphNode *b, Mat4 * return NULL; } -// X position of the mirror -#define MIRROR_X 4331.53 - /** * Geo node that creates a clone of Mario's geo node and updates it to becomes * a mirror image of the player. @@ -620,8 +617,8 @@ Gfx *geo_render_mirror_mario(s32 callContext, struct GraphNode *node, UNUSED Mat vec3f_copy(gMirrorMario.scale, mario->header.gfx.scale); gMirrorMario.animInfo = mario->header.gfx.animInfo; - mirroredX = MIRROR_X - gMirrorMario.pos[0]; - gMirrorMario.pos[0] = mirroredX + MIRROR_X; + mirroredX = CASTLE_MIRROR_X - gMirrorMario.pos[0]; + gMirrorMario.pos[0] = mirroredX + CASTLE_MIRROR_X; gMirrorMario.angle[1] = -gMirrorMario.angle[1]; gMirrorMario.scale[0] *= -1.0f; ((struct GraphNode *) &gMirrorMario)->flags |= GRAPH_RENDER_ACTIVE; diff --git a/src/game/moving_texture.c b/src/game/moving_texture.c index 7e99d473..9a5adf55 100644 --- a/src/game/moving_texture.c +++ b/src/game/moving_texture.c @@ -109,8 +109,8 @@ s16 gMovtexCounterPrev = 0; // Vertex colors for rectangles. Used to give mist a tint #define MOVTEX_VTX_COLOR_DEFAULT 0 // no tint (white vertex colors) -#define MOVTEX_VTX_COLOR_YELLOW 1 // used for Hazy Maze Cave toxic haze -#define MOVTEX_VTX_COLOR_RED 2 // used for Shifting Sand Land around the Tox box maze +#define MOVTEX_VTX_COLOR_YELLOW 1 // used for Hazy Maze Cave toxic haze +#define MOVTEX_VTX_COLOR_RED 2 // used for Shifting Sand Land around the Tox box maze s8 gMovtexVtxColor = MOVTEX_VTX_COLOR_DEFAULT; @@ -120,71 +120,71 @@ float gPaintingMarioYEntry = 0.0f; /// Variable to ensure the initial Wet-Dry World water level is set only once s32 gWdwWaterLevelSet = FALSE; -extern u8 ssl_quicksand[]; -extern u8 ssl_pyramid_sand[]; -extern u8 ttc_yellow_triangle[]; +extern Texture ssl_quicksand[]; +extern Texture ssl_pyramid_sand[]; +extern Texture ttc_yellow_triangle[]; /** * An array for converting a movtex texture id to a pointer that can * be passed to gDPSetTextureImage. */ -u8 *gMovtexIdToTexture[] = { texture_waterbox_water, texture_waterbox_mist, - texture_waterbox_jrb_water, texture_waterbox_unknown_water, - texture_waterbox_lava, ssl_quicksand, - ssl_pyramid_sand, ttc_yellow_triangle }; +Texture *gMovtexIdToTexture[] = { texture_waterbox_water, texture_waterbox_mist, + texture_waterbox_jrb_water, texture_waterbox_unknown_water, + texture_waterbox_lava, ssl_quicksand, + ssl_pyramid_sand, ttc_yellow_triangle }; -extern Gfx castle_grounds_dl_waterfall[]; -extern s16 castle_grounds_movtex_tris_waterfall[]; -extern s16 ssl_movtex_tris_pyramid_sand_pathway_front[]; -extern Gfx ssl_dl_pyramid_sand_pathway_begin[]; -extern Gfx ssl_dl_pyramid_sand_pathway_end[]; -extern Gfx ssl_dl_pyramid_sand_pathway_front_end[]; -extern s16 ssl_movtex_tris_pyramid_sand_pathway_floor[]; -extern Gfx ssl_dl_pyramid_sand_pathway_floor_begin[]; -extern Gfx ssl_dl_pyramid_sand_pathway_floor_end[]; -extern s16 ssl_movtex_tris_pyramid_sand_pathway_side[]; -extern Gfx ssl_dl_pyramid_sand_pathway_side_end[]; -extern s16 bitfs_movtex_tris_lava_first_section[]; -extern Gfx bitfs_dl_lava_sections[]; -extern s16 bitfs_movtex_tris_lava_second_section[]; -extern s16 bitfs_movtex_tris_lava_floor[]; -extern Gfx bitfs_dl_lava_floor[]; -extern s16 lll_movtex_tris_lava_floor[]; -extern Gfx lll_dl_lava_floor[]; -extern s16 lll_movtex_tris_lavafall_volcano[]; -extern Gfx lll_dl_lavafall_volcano[]; -extern s16 cotmc_movtex_tris_water[]; -extern Gfx cotmc_dl_water_begin[]; -extern Gfx cotmc_dl_water_end[]; -extern Gfx cotmc_dl_water[]; -extern s16 ttm_movtex_tris_begin_waterfall[]; -extern Gfx ttm_dl_waterfall[]; -extern s16 ttm_movtex_tris_end_waterfall[]; -extern s16 ttm_movtex_tris_begin_puddle_waterfall[]; -extern Gfx ttm_dl_bottom_waterfall[]; -extern s16 ttm_movtex_tris_end_puddle_waterfall[]; -extern s16 ttm_movtex_tris_puddle_waterfall[]; -extern Gfx ttm_dl_puddle_waterfall[]; -extern s16 ssl_movtex_tris_pyramid_quicksand[]; -extern Gfx ssl_dl_quicksand_begin[]; -extern Gfx ssl_dl_quicksand_end[]; -extern Gfx ssl_dl_pyramid_quicksand[]; -extern s16 ssl_movtex_tris_pyramid_corners_quicksand[]; -extern Gfx ssl_dl_pyramid_corners_quicksand[]; -extern s16 ssl_movtex_tris_sides_quicksand[]; -extern Gfx ssl_dl_sides_quicksand[]; -extern s16 ttc_movtex_tris_big_surface_treadmill[]; -extern Gfx ttc_dl_surface_treadmill_begin[]; -extern Gfx ttc_dl_surface_treadmill_end[]; -extern Gfx ttc_dl_surface_treadmill[]; -extern s16 ttc_movtex_tris_small_surface_treadmill[]; -extern s16 ssl_movtex_tris_quicksand_pit[]; -extern Gfx ssl_dl_quicksand_pit_begin[]; -extern Gfx ssl_dl_quicksand_pit_end[]; -extern Gfx ssl_dl_quicksand_pit[]; -extern s16 ssl_movtex_tris_pyramid_quicksand_pit[]; -extern Gfx ssl_dl_pyramid_quicksand_pit_begin[]; -extern Gfx ssl_dl_pyramid_quicksand_pit_end[]; +extern Gfx castle_grounds_dl_waterfall[]; +extern Movtex castle_grounds_movtex_tris_waterfall[]; +extern Movtex ssl_movtex_tris_pyramid_sand_pathway_front[]; +extern Gfx ssl_dl_pyramid_sand_pathway_begin[]; +extern Gfx ssl_dl_pyramid_sand_pathway_end[]; +extern Gfx ssl_dl_pyramid_sand_pathway_front_end[]; +extern Movtex ssl_movtex_tris_pyramid_sand_pathway_floor[]; +extern Gfx ssl_dl_pyramid_sand_pathway_floor_begin[]; +extern Gfx ssl_dl_pyramid_sand_pathway_floor_end[]; +extern Movtex ssl_movtex_tris_pyramid_sand_pathway_side[]; +extern Gfx ssl_dl_pyramid_sand_pathway_side_end[]; +extern Movtex bitfs_movtex_tris_lava_first_section[]; +extern Gfx bitfs_dl_lava_sections[]; +extern Movtex bitfs_movtex_tris_lava_second_section[]; +extern Movtex bitfs_movtex_tris_lava_floor[]; +extern Gfx bitfs_dl_lava_floor[]; +extern Movtex lll_movtex_tris_lava_floor[]; +extern Gfx lll_dl_lava_floor[]; +extern Movtex lll_movtex_tris_lavafall_volcano[]; +extern Gfx lll_dl_lavafall_volcano[]; +extern Movtex cotmc_movtex_tris_water[]; +extern Gfx cotmc_dl_water_begin[]; +extern Gfx cotmc_dl_water_end[]; +extern Gfx cotmc_dl_water[]; +extern Movtex ttm_movtex_tris_begin_waterfall[]; +extern Gfx ttm_dl_waterfall[]; +extern Movtex ttm_movtex_tris_end_waterfall[]; +extern Movtex ttm_movtex_tris_begin_puddle_waterfall[]; +extern Gfx ttm_dl_bottom_waterfall[]; +extern Movtex ttm_movtex_tris_end_puddle_waterfall[]; +extern Movtex ttm_movtex_tris_puddle_waterfall[]; +extern Gfx ttm_dl_puddle_waterfall[]; +extern Movtex ssl_movtex_tris_pyramid_quicksand[]; +extern Gfx ssl_dl_quicksand_begin[]; +extern Gfx ssl_dl_quicksand_end[]; +extern Gfx ssl_dl_pyramid_quicksand[]; +extern Movtex ssl_movtex_tris_pyramid_corners_quicksand[]; +extern Gfx ssl_dl_pyramid_corners_quicksand[]; +extern Movtex ssl_movtex_tris_sides_quicksand[]; +extern Gfx ssl_dl_sides_quicksand[]; +extern Movtex ttc_movtex_tris_big_surface_treadmill[]; +extern Gfx ttc_dl_surface_treadmill_begin[]; +extern Gfx ttc_dl_surface_treadmill_end[]; +extern Gfx ttc_dl_surface_treadmill[]; +extern Movtex ttc_movtex_tris_small_surface_treadmill[]; +extern Movtex ssl_movtex_tris_quicksand_pit[]; +extern Gfx ssl_dl_quicksand_pit_begin[]; +extern Gfx ssl_dl_quicksand_pit_end[]; +extern Gfx ssl_dl_quicksand_pit[]; +extern Movtex ssl_movtex_tris_pyramid_quicksand_pit[]; +extern Gfx ssl_dl_pyramid_quicksand_pit_begin[]; +extern Gfx ssl_dl_pyramid_quicksand_pit_end[]; /** * MovtexObjects that have no color attributes per vertex (though the mesh @@ -509,30 +509,30 @@ Gfx *movtex_gen_quads_id(s16 id, s16 y, void *movetexQuadsSegmented) { return NULL; } -extern u8 bbh_movtex_merry_go_round_water_entrance[]; -extern u8 bbh_movtex_merry_go_round_water_side[]; -extern u8 ccm_movtex_penguin_puddle_water[]; -extern u8 inside_castle_movtex_green_room_water[]; -extern u8 inside_castle_movtex_moat_water[]; -extern u8 hmc_movtex_dorrie_pool_water[]; -extern u8 hmc_movtex_toxic_maze_mist[]; -extern u8 ssl_movtex_puddle_water[]; -extern u8 ssl_movtex_toxbox_quicksand_mist[]; -extern u8 sl_movtex_water[]; -extern u8 wdw_movtex_area1_water[]; -extern u8 wdw_movtex_area2_water[]; -extern u8 jrb_movtex_water[]; -extern u8 jrb_movtex_intial_mist[]; -extern u8 jrb_movtex_sinked_boat_water[]; -extern u8 thi_movtex_area1_water[]; -extern u8 thi_movtex_area2_water[]; -extern u8 castle_grounds_movtex_water[]; -extern u8 lll_movtex_volcano_floor_lava[]; -extern u8 ddd_movtex_area1_water[]; -extern u8 ddd_movtex_area2_water[]; -extern u8 wf_movtex_water[]; -extern u8 castle_courtyard_movtex_star_statue_water[]; -extern u8 ttm_movtex_puddle[]; +extern Movtex bbh_movtex_merry_go_round_water_entrance[]; +extern Movtex bbh_movtex_merry_go_round_water_side[]; +extern Movtex ccm_movtex_penguin_puddle_water[]; +extern Movtex inside_castle_movtex_green_room_water[]; +extern Movtex inside_castle_movtex_moat_water[]; +extern Movtex hmc_movtex_dorrie_pool_water[]; +extern Movtex hmc_movtex_toxic_maze_mist[]; +extern Movtex ssl_movtex_puddle_water[]; +extern Movtex ssl_movtex_toxbox_quicksand_mist[]; +extern Movtex sl_movtex_water[]; +extern Movtex wdw_movtex_area1_water[]; +extern Movtex wdw_movtex_area2_water[]; +extern Movtex jrb_movtex_water[]; +extern Movtex jrb_movtex_intial_mist[]; +extern Movtex jrb_movtex_sinked_boat_water[]; +extern Movtex thi_movtex_area1_water[]; +extern Movtex thi_movtex_area2_water[]; +extern Movtex castle_grounds_movtex_water[]; +extern Movtex lll_movtex_volcano_floor_lava[]; +extern Movtex ddd_movtex_area1_water[]; +extern Movtex ddd_movtex_area2_water[]; +extern Movtex wf_movtex_water[]; +extern Movtex castle_courtyard_movtex_star_statue_water[]; +extern Movtex ttm_movtex_puddle[]; /** * Find the quadCollection for a given quad collection id. diff --git a/src/game/obj_behaviors.c b/src/game/obj_behaviors.c index 64ec80da..ec1a72c4 100644 --- a/src/game/obj_behaviors.c +++ b/src/game/obj_behaviors.c @@ -710,7 +710,7 @@ void obj_check_floor_death(s16 collisionFlags, struct Surface *floor) { case SURFACE_BURNING: o->oAction = OBJ_ACT_LAVA_DEATH; break; - //! @BUG Doesn't check for the vertical wind death floor. + case SURFACE_VERTICAL_WIND: // fall through case SURFACE_DEATH_PLANE: o->oAction = OBJ_ACT_DEATH_PLANE_DEATH; break; diff --git a/src/game/obj_behaviors_2.c b/src/game/obj_behaviors_2.c index ddd945b0..63c61322 100644 --- a/src/game/obj_behaviors_2.c +++ b/src/game/obj_behaviors_2.c @@ -47,7 +47,9 @@ #include "spawn_sound.h" #include "puppylights.h" -#define POS_OP_SAVE_POSITION 0 +//! TODO: remove static + +#define POS_OP_SAVE_POSITION 0 #define POS_OP_COMPUTE_VELOCITY 1 #define POS_OP_RESTORE_POSITION 2 @@ -56,9 +58,6 @@ /* BSS (declared to force order) */ extern s32 sNumActiveFirePiranhaPlants; extern s32 sNumKilledFirePiranhaPlants; -extern f32 sObjSavedPosX; -extern f32 sObjSavedPosY; -extern f32 sObjSavedPosZ; extern struct Object *sMontyMoleHoleList; extern s32 sMontyMoleKillStreak; extern f32 sMontyMoleLastKilledPosX; @@ -71,20 +70,13 @@ extern struct Object *sMasterTreadmill; */ struct Object *sMasterTreadmill; - -f32 sObjSavedPosX; -f32 sObjSavedPosY; -f32 sObjSavedPosZ; +Vec3f sObjSavedPos; void wiggler_jumped_on_attack_handler(void); void huge_goomba_weakly_attacked(void); static s32 obj_is_rendering_enabled(void) { - if (o->header.gfx.node.flags & GRAPH_RENDER_ACTIVE) { - return TRUE; - } else { - return FALSE; - } + return (o->header.gfx.node.flags & GRAPH_RENDER_ACTIVE); } static s16 obj_get_pitch_from_vel(void) { @@ -117,34 +109,16 @@ static void obj_set_dist_from_home(f32 distFromHome) { } static s32 obj_is_near_to_and_facing_mario(f32 maxDist, s16 maxAngleDiff) { - if (o->oDistanceToMario < maxDist - && abs_angle_diff(o->oMoveAngleYaw, o->oAngleToMario) < maxAngleDiff) { - return TRUE; - } - return FALSE; + return (o->oDistanceToMario < maxDist && abs_angle_diff(o->oMoveAngleYaw, o->oAngleToMario) < maxAngleDiff); } //! Although having no return value, this function //! must be u32 to match other functions on -O2. static void obj_perform_position_op(s32 op) { switch (op) { - case POS_OP_SAVE_POSITION: - sObjSavedPosX = o->oPosX; - sObjSavedPosY = o->oPosY; - sObjSavedPosZ = o->oPosZ; - break; - - case POS_OP_COMPUTE_VELOCITY: - o->oVelX = o->oPosX - sObjSavedPosX; - o->oVelY = o->oPosY - sObjSavedPosY; - o->oVelZ = o->oPosZ - sObjSavedPosZ; - break; - - case POS_OP_RESTORE_POSITION: - o->oPosX = sObjSavedPosX; - o->oPosY = sObjSavedPosY; - o->oPosZ = sObjSavedPosZ; - break; + case POS_OP_SAVE_POSITION: vec3_copy(sObjSavedPos, &o->oPosVec); break; + case POS_OP_COMPUTE_VELOCITY: vec3_diff(&o->oVelVec, &o->oPosVec, sObjSavedPos); break; + case POS_OP_RESTORE_POSITION: vec3_copy(&o->oPosVec, sObjSavedPos); break; } } @@ -154,9 +128,7 @@ static void platform_on_track_update_pos_or_spawn_ball(s32 ballIndex, f32 x, f32 struct Waypoint *nextWaypoint; struct Waypoint *prevWaypoint; f32 amountToMove; - f32 dx; - f32 dy; - f32 dz; + f32 dx, dy, dz; f32 distToNextWaypoint; if (ballIndex == 0 || ((u16)(o->oBehParams >> 16) & 0x0080)) { @@ -229,15 +201,10 @@ static void platform_on_track_update_pos_or_spawn_ball(s32 ballIndex, f32 x, f32 } o->oPlatformOnTrackPrevWaypoint = prevWaypoint; } - - o->oPosX = x; - o->oPosY = y; - o->oPosZ = z; - + vec3_set(&o->oPosVec, x, y, z); obj_perform_position_op(POS_OP_COMPUTE_VELOCITY); - o->oPlatformOnTrackPitch = - atan2s(sqrtf(o->oVelX * o->oVelX + o->oVelZ * o->oVelZ), -o->oVelY); + o->oPlatformOnTrackPitch = atan2s(sqrtf(sqr(o->oVelX) + sqr(o->oVelZ)), -o->oVelY); o->oPlatformOnTrackYaw = atan2s(o->oVelZ, o->oVelX); } } @@ -315,7 +282,6 @@ static s32 clamp_s16(s16 *value, s16 minimum, s16 maximum) { } else { return FALSE; } - return TRUE; } @@ -327,7 +293,6 @@ static s32 clamp_f32(f32 *value, f32 minimum, f32 maximum) { } else { return FALSE; } - return TRUE; } @@ -403,42 +368,22 @@ static s32 obj_y_vel_approach(f32 target, f32 delta) { static s32 obj_move_pitch_approach(s16 target, s16 delta) { o->oMoveAnglePitch = approach_s16_symmetric(o->oMoveAnglePitch, target, delta); - - if ((s16) o->oMoveAnglePitch == target) { - return TRUE; - } - - return FALSE; + return ((s16) o->oMoveAnglePitch == target); } static s32 obj_face_pitch_approach(s16 targetPitch, s16 deltaPitch) { o->oFaceAnglePitch = approach_s16_symmetric(o->oFaceAnglePitch, targetPitch, deltaPitch); - - if ((s16) o->oFaceAnglePitch == targetPitch) { - return TRUE; - } - - return FALSE; + return ((s16) o->oFaceAnglePitch == targetPitch); } static s32 obj_face_yaw_approach(s16 targetYaw, s16 deltaYaw) { o->oFaceAngleYaw = approach_s16_symmetric(o->oFaceAngleYaw, targetYaw, deltaYaw); - - if ((s16) o->oFaceAngleYaw == targetYaw) { - return TRUE; - } - - return FALSE; + return ((s16) o->oFaceAngleYaw == targetYaw); } static s32 obj_face_roll_approach(s16 targetRoll, s16 deltaRoll) { o->oFaceAngleRoll = approach_s16_symmetric(o->oFaceAngleRoll, targetRoll, deltaRoll); - - if ((s16) o->oFaceAngleRoll == targetRoll) { - return TRUE; - } - - return FALSE; + return ((s16) o->oFaceAngleRoll == targetRoll); } static s32 obj_smooth_turn(s16 *angleVel, s32 *angle, s16 targetAngle, f32 targetSpeedProportion, @@ -585,12 +530,7 @@ static s32 obj_bounce_off_walls_edges_objects(s32 *targetYaw) { static s32 obj_resolve_collisions_and_turn(s16 targetYaw, s16 turnSpeed) { obj_resolve_object_collisions(NULL); - - if (cur_obj_rotate_yaw_toward(targetYaw, turnSpeed)) { - return FALSE; - } else { - return TRUE; - } + return (!cur_obj_rotate_yaw_toward(targetYaw, turnSpeed)); } static void obj_die_if_health_non_positive(void) { diff --git a/src/game/object_helpers.c b/src/game/object_helpers.c index 4d96afc5..472c30c8 100644 --- a/src/game/object_helpers.c +++ b/src/game/object_helpers.c @@ -1606,9 +1606,8 @@ static void cur_obj_update_floor(void) { if (floor != NULL) { if (floor->type == SURFACE_BURNING) { o->oMoveFlags |= OBJ_MOVE_ABOVE_LAVA; - } - else if (floor->type == SURFACE_DEATH_PLANE) { - //! This misses SURFACE_VERTICAL_WIND (and maybe SURFACE_WARP) + } else if ((floor->type == SURFACE_DEATH_PLANE) || (floor->type == SURFACE_VERTICAL_WIND)) { + //! This maybe misses SURFACE_WARP o->oMoveFlags |= OBJ_MOVE_ABOVE_DEATH_BARRIER; } diff --git a/src/game/object_list_processor.c b/src/game/object_list_processor.c index a584b709..02b5fefd 100644 --- a/src/game/object_list_processor.c +++ b/src/game/object_list_processor.c @@ -9,6 +9,7 @@ #include "engine/graph_node.h" #include "engine/surface_collision.h" #include "engine/surface_load.h" +#include "engine/math_util.h" #include "interaction.h" #include "level_update.h" #include "mario.h" @@ -224,28 +225,13 @@ void copy_mario_state_to_object(void) { s32 i = 0; // L is real if (gCurrentObject != gMarioObject) { - i += 1; + i++; } - - gCurrentObject->oVelX = gMarioStates[i].vel[0]; - gCurrentObject->oVelY = gMarioStates[i].vel[1]; - gCurrentObject->oVelZ = gMarioStates[i].vel[2]; - - gCurrentObject->oPosX = gMarioStates[i].pos[0]; - gCurrentObject->oPosY = gMarioStates[i].pos[1]; - gCurrentObject->oPosZ = gMarioStates[i].pos[2]; - - gCurrentObject->oMoveAnglePitch = gCurrentObject->header.gfx.angle[0]; - gCurrentObject->oMoveAngleYaw = gCurrentObject->header.gfx.angle[1]; - gCurrentObject->oMoveAngleRoll = gCurrentObject->header.gfx.angle[2]; - - gCurrentObject->oFaceAnglePitch = gCurrentObject->header.gfx.angle[0]; - gCurrentObject->oFaceAngleYaw = gCurrentObject->header.gfx.angle[1]; - gCurrentObject->oFaceAngleRoll = gCurrentObject->header.gfx.angle[2]; - - gCurrentObject->oAngleVelPitch = gMarioStates[i].angleVel[0]; - gCurrentObject->oAngleVelYaw = gMarioStates[i].angleVel[1]; - gCurrentObject->oAngleVelRoll = gMarioStates[i].angleVel[2]; + vec3_copy(&gCurrentObject->oVelVec, gMarioStates[i].vel); + vec3_copy(&gCurrentObject->oPosVec, gMarioStates[i].pos); + vec3_copy(&gCurrentObject->oMoveAngleVec, gCurrentObject->header.gfx.angle); + vec3_copy(&gCurrentObject->oFaceAngleVec, gCurrentObject->header.gfx.angle); + vec3_copy(&gCurrentObject->oAngleVelVec, gMarioStates[i].angleVel); } /** @@ -497,18 +483,9 @@ void spawn_objects_from_info(UNUSED s32 unused, struct SpawnInfo *spawnInfo) { } geo_obj_init_spawninfo(&object->header.gfx, spawnInfo); - - object->oPosX = spawnInfo->startPos[0]; - object->oPosY = spawnInfo->startPos[1]; - object->oPosZ = spawnInfo->startPos[2]; - - object->oFaceAnglePitch = spawnInfo->startAngle[0]; - object->oFaceAngleYaw = spawnInfo->startAngle[1]; - object->oFaceAngleRoll = spawnInfo->startAngle[2]; - - object->oMoveAnglePitch = spawnInfo->startAngle[0]; - object->oMoveAngleYaw = spawnInfo->startAngle[1]; - object->oMoveAngleRoll = spawnInfo->startAngle[2]; + vec3_copy(&object->oPosVec, spawnInfo->startPos); + vec3_copy(&object->oFaceAngleVec, spawnInfo->startAngle); + vec3_copy(&object->oMoveAngleVec, spawnInfo->startAngle); object->oFloorHeight = find_floor(object->oPosX, object->oPosY, object->oPosZ, &object->oFloor); } diff --git a/src/game/paintings.c b/src/game/paintings.c index 3ed2543b..9c2b0152 100644 --- a/src/game/paintings.c +++ b/src/game/paintings.c @@ -4,6 +4,7 @@ #include "area.h" #include "engine/graph_node.h" #include "engine/surface_collision.h" +#include "engine/math_util.h" #include "game_init.h" #include "geo_misc.h" #include "levels/castle_inside/header.h" @@ -575,16 +576,12 @@ void painting_update_floors(struct Painting *painting) { void painting_update_ripple_state(struct Painting *painting) { if (gPaintingUpdateCounter != gLastPaintingUpdateCounter) { painting->currRippleMag *= painting->rippleDecay; - - //! After ~6.47 days, paintings with RIPPLE_TRIGGER_CONTINUOUS will increment this to - //! 16777216 (1 << 24), at which point it will freeze (due to floating-point - //! imprecision?) and the painting will stop rippling. This happens to HMC, DDD, and - //! CotMC. - painting->rippleTimer += 1.0; + if (painting->rippleTimer >= ((1 << 24) - 1.0f)) painting->rippleTimer = 0.0f; + painting->rippleTimer += 1.0f; } if (painting->rippleTrigger == RIPPLE_TRIGGER_PROXIMITY) { // if the painting is barely rippling, make it stop rippling - if (painting->currRippleMag <= 1.0) { + if (painting->currRippleMag <= 1.0f) { painting->state = PAINTING_IDLE; gRipplingPainting = NULL; } @@ -621,14 +618,13 @@ s16 calculate_ripple_at_point(struct Painting *painting, f32 posX, f32 posY) { f32 rippleX = painting->rippleX; f32 rippleY = painting->rippleY; - f32 distanceToOrigin; - f32 rippleDistance; - posX *= painting->size / PAINTING_SIZE; posY *= painting->size / PAINTING_SIZE; - distanceToOrigin = sqrtf((posX - rippleX) * (posX - rippleX) + (posY - rippleY) * (posY - rippleY)); + f32 dx = (posX - rippleX); + f32 dy = (posY - rippleY); + f32 distanceToOrigin = sqrtf(sqr(dx) + sqr(dy)); // A larger dispersionFactor makes the ripple spread slower - rippleDistance = distanceToOrigin / dispersionFactor; + f32 rippleDistance = distanceToOrigin / dispersionFactor; if (rippleTimer < rippleDistance) { // if the ripple hasn't reached the point yet, make the point magnitude 0 return 0; @@ -647,12 +643,10 @@ s16 calculate_ripple_at_point(struct Painting *painting, f32 posX, f32 posY) { * else return 0 */ s16 ripple_if_movable(struct Painting *painting, s16 movable, s16 posX, s16 posY) { - s16 rippleZ = 0; - if (movable) { - rippleZ = calculate_ripple_at_point(painting, posX, posY); + return calculate_ripple_at_point(painting, posX, posY); } - return rippleZ; + return 0; } /** @@ -769,8 +763,7 @@ s8 normalize_component(f32 comp) { */ void painting_average_vertex_normals(s16 *neighborTris, s16 numVtx) { s16 tri; - s16 i; - s16 j; + s16 i, j; s16 neighbors; s16 entry = 0; @@ -795,7 +788,7 @@ void painting_average_vertex_normals(s16 *neighborTris, s16 numVtx) { nx /= neighbors; ny /= neighbors; nz /= neighbors; - nlen = sqrtf(nx * nx + ny * ny + nz * nz); + nlen = sqrtf(sqr(nx) + sqr(ny) + sqr(nz)); if (nlen == 0.0) { gPaintingMesh[i].norm[0] = 0; @@ -822,8 +815,7 @@ Gfx *render_painting(u8 *img, s16 tWidth, s16 tHeight, s16 *textureMap, s16 mapV s16 triGroup; s16 mapping; s16 meshVtx; - s16 tx; - s16 ty; + s16 tx, ty; // We can fit 15 (16 / 3) vertices in the RSP's vertex buffer. // Group triangles by 5, with one remainder group. diff --git a/src/game/print.c b/src/game/print.c index dcad8d40..de346548 100644 --- a/src/game/print.c +++ b/src/game/print.c @@ -106,8 +106,7 @@ void format_integer(s32 n, s32 base, char *dest, s32 *totalLength, u8 width, s8 n -= digit * powBase; } - } else // n is zero. - { + } else { // n is zero. numDigits = 1; if (width > numDigits) { for (len = 0; len < width - numDigits; len++) dest[len] = pad; @@ -134,11 +133,13 @@ void parse_width_field(const char *str, s32 *srcIndex, u8 *width, s8 *zeroPad) { } // Read width digits up until the 'd' or 'x' format specifier. - while (str[*srcIndex] != 'd' && str[*srcIndex] != 'x') { + while ((str[*srcIndex] != 'b') + && (str[*srcIndex] != 'o') + && (str[*srcIndex] != 'd') + && (str[*srcIndex] != 'x')) { digits[digitsLen] = str[*srcIndex] - '0'; - if (digits[digitsLen] < 0 || digits[digitsLen] >= 10) // not a valid digit - { + if (digits[digitsLen] < 0 || digits[digitsLen] >= 10) { // not a valid digit *width = 0; return; } @@ -192,15 +193,16 @@ void print_text_fmt_int(s32 x, s32 y, const char *str, s32 n) { parse_width_field(str, &srcIndex, &width, &zeroPad); - if (str[srcIndex] != 'd' && str[srcIndex] != 'x') { + if ((str[srcIndex] != 'b') + && (str[srcIndex] != 'o') + && (str[srcIndex] != 'd') + && (str[srcIndex] != 'x')) { break; } - if (str[srcIndex] == 'd') { - base = 10; - } - if (str[srcIndex] == 'x') { - base = 16; - } + if (str[srcIndex] == 'b') base = 2; + if (str[srcIndex] == 'o') base = 8; + if (str[srcIndex] == 'd') base = 10; + if (str[srcIndex] == 'x') base = 16; srcIndex++; @@ -283,66 +285,21 @@ void print_text_centered(s32 x, s32 y, const char *str) { * Converts a char into the proper colorful glyph for the char. */ s8 char_to_glyph_index(char c) { - if (c >= 'A' && c <= 'Z') { - return c - 55; - } - - if (c >= 'a' && c <= 'z') { - return c - 87; - } - - if (c >= '0' && c <= '9') { - return c - 48; - } - - if (c == ' ') { - return GLYPH_SPACE; - } - - if (c == '!') { - return GLYPH_EXCLAMATION_PNT; // !, JP only - } - - if (c == '#') { - return GLYPH_TWO_EXCLAMATION; // !!, JP only - } - - if (c == '?') { - return GLYPH_QUESTION_MARK; // ?, JP only - } - - if (c == '&') { - return GLYPH_AMPERSAND; // &, JP only - } - - if (c == '%') { - return GLYPH_PERCENT; // %, JP only - } - - if (c == '*') { - return GLYPH_MULTIPLY; // x - } - - if (c == '+') { - return GLYPH_COIN; // coin - } - - if (c == ',') { - return GLYPH_MARIO_HEAD; // Imagine I drew Mario's head - } - - if (c == '-') { - return GLYPH_STAR; // star - } - - if (c == '.') { - return GLYPH_PERIOD; // large shaded dot, JP only - } - - if (c == '/') { - return GLYPH_BETA_KEY; // beta key, JP only. Reused for Ü in EU. - } - + if (c >= 'A' && c <= 'Z') return c - 55; + if (c >= 'a' && c <= 'z') return c - 87; + if (c >= '0' && c <= '9') return c - 48; + if (c == ' ') return GLYPH_SPACE; + if (c == '!') return GLYPH_EXCLAMATION_PNT; // !, JP only + if (c == '#') return GLYPH_TWO_EXCLAMATION; // !!, JP only + if (c == '?') return GLYPH_QUESTION_MARK; // ?, JP only + if (c == '&') return GLYPH_AMPERSAND; // &, JP only + if (c == '%') return GLYPH_PERCENT; // %, JP only + if (c == '*') return GLYPH_MULTIPLY; // x + if (c == '+') return GLYPH_COIN; // coin + if (c == ',') return GLYPH_MARIO_HEAD; // Imagine I drew Mario's head + if (c == '-') return GLYPH_STAR; // star + if (c == '.') return GLYPH_PERIOD; // large shaded dot, JP only + if (c == '/') return GLYPH_BETA_KEY; // beta key, JP only. Reused for Ü in EU. return GLYPH_SPACE; } @@ -350,7 +307,7 @@ s8 char_to_glyph_index(char c) { * Adds an individual glyph to be rendered. */ void add_glyph_texture(s8 glyphIndex) { - const u8 *const *glyphs = segmented_to_virtual(main_hud_lut); + const Texture *const *glyphs = segmented_to_virtual(main_hud_lut); gDPPipeSync(gDisplayListHead++); gDPSetTextureImage(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, glyphs[glyphIndex]); @@ -362,21 +319,10 @@ void add_glyph_texture(s8 glyphIndex) { * Clips textrect into the boundaries defined. */ void clip_to_bounds(s32 *x, s32 *y) { - if (*x < TEXRECT_MIN_X) { - *x = TEXRECT_MIN_X; - } - - if (*x > TEXRECT_MAX_X) { - *x = TEXRECT_MAX_X; - } - - if (*y < TEXRECT_MIN_Y) { - *y = TEXRECT_MIN_Y; - } - - if (*y > TEXRECT_MAX_Y) { - *y = TEXRECT_MAX_Y; - } + if (*x < TEXRECT_MIN_X) *x = TEXRECT_MIN_X; + if (*x > TEXRECT_MAX_X) *x = TEXRECT_MAX_X; + if (*y < TEXRECT_MIN_Y) *y = TEXRECT_MIN_Y; + if (*y > TEXRECT_MAX_Y) *y = TEXRECT_MAX_Y; } #endif @@ -386,8 +332,7 @@ void clip_to_bounds(s32 *x, s32 *y) { void render_textrect(s32 x, s32 y, s32 pos) { s32 rectBaseX = x + pos * 12; s32 rectBaseY = 224 - y; - s32 rectX; - s32 rectY; + s32 rectX, rectY; #ifndef WIDESCREEN // For widescreen we must allow drawing outside the usual area @@ -404,8 +349,7 @@ void render_textrect(s32 x, s32 y, s32 pos) { * a for loop. */ void render_text_labels(void) { - s32 i; - s32 j; + s32 i, j; s8 glyphIndex; Mtx *mtx; diff --git a/src/game/puppycam2.h b/src/game/puppycam2.h index 158f5f5e..f81b72f0 100644 --- a/src/game/puppycam2.h +++ b/src/game/puppycam2.h @@ -6,8 +6,8 @@ //How many times to store the terrain pitch. This stores it over 10 frames to help smooth over changes in curvature. #define NUM_PITCH_ITERATIONS 10 -#define PUPPYCAM_FLAGS_CUTSCENE 0x0001 -#define PUPPYCAM_FLAGS_SMOOTH 0x0002 +#define PUPPYCAM_FLAGS_CUTSCENE (1 << 0) // 0x0001 +#define PUPPYCAM_FLAGS_SMOOTH (1 << 1) // 0x0002 #define PUPPY_ERROR_POOL_FULL 0x1 @@ -17,19 +17,19 @@ #define PUPPYCAM_BEHAVIOUR_TEMPORARY 0x0 #define PUPPYCAM_BEHAVIOUR_PERMANENT 0x1 -#define PUPPYVOLUME_SHAPE_BOX 0x0 -#define PUPPYVOLUME_SHAPE_CYLINDER 0x1 +#define PUPPYVOLUME_SHAPE_BOX 0x0 +#define PUPPYVOLUME_SHAPE_CYLINDER 0x1 -#define PUPPYCAM_MODE3_ZOOMED_IN 0x1 -#define PUPPYCAM_MODE3_ZOOMED_MED 0x2 -#define PUPPYCAM_MODE3_ZOOMED_OUT 0x4 -#define PUPPYCAM_MODE3_ENTER_FIRST_PERSON 0x8 +#define PUPPYCAM_MODE3_ZOOMED_IN (1 << 0) // 0x1 +#define PUPPYCAM_MODE3_ZOOMED_MED (1 << 1) // 0x2 +#define PUPPYCAM_MODE3_ZOOMED_OUT (1 << 2) // 0x4 +#define PUPPYCAM_MODE3_ENTER_FIRST_PERSON (1 << 3) // 0x8 -#define PUPPYSPLINE_NONE 1 //Will not write to focus at all. -#define PUPPYSPLINE_FOLLOW 2 //Focus will follow a separate spline, but will mirror the speed and progress of the pos. +#define PUPPYSPLINE_NONE (1 << 0) // 0x1 // Will not write to focus at all. +#define PUPPYSPLINE_FOLLOW (1 << 1) // 0x2 // Focus will follow a separate spline, but will mirror the speed and progress of the pos. -#define PUPPYDEBUG_LOCK_CONTROLS 0x1 -#define PUPPYDEBUG_TRACK_MARIO 0x2 +#define PUPPYDEBUG_LOCK_CONTROLS (1 << 0) // 0x1 +#define PUPPYDEBUG_TRACK_MARIO (1 << 1) // 0x2 #include "include/command_macros_base.h" @@ -55,54 +55,54 @@ struct gPuppyOptions struct gPuppyStruct { - s16 yaw; //Horizontal Direction the game reads as the active value. - s16 yawTarget; //Horizontal Direction that yaw tries to be. - f32 yawAcceleration; //Horizontal Direction that sets yawTarget. - s16 pitch; //Vertical Direction the game reads as the active value. - s16 pitchTarget; //Vertical Direction that pitch tries to be. - f32 pitchAcceleration; //Vertical Direction that sets pitchTarget. - s16 zoom; //How far the camera is currently zoomed out - u8 zoomSet; //The current setting of which zoompoint to set the target to. - s16 zoomTarget; //The value that zoom tries to be. - s16 zoomPoints[3]; //An array containing distances. - s16 targetFloorHeight; //Mario's current floor height - s16 lastTargetFloorHeight; //Mirror's mario's floor height when his velocity is not above 0. - Vec3s pos; //Where the camera is - Vec3s focus; //Where the camera's looking - Vec3s pan; //An offset of the camera's focus - s32 intendedFlags; //The flagset the camera tries to be when it's not held hostage. - s32 flags; //Behaviour flags that affect different properties of the camera's behaviour - Vec3s shake; //How much the camera's shaking - u8 shakeFrames; //How long the camera's shaking for - f32 shakeForce; //How violently the camera's shaking - s32 framesSinceC[2]; //Counts the number of frames since the last C left or right press, to track double presses. - s16 collisionDistance; //Tries to be zoom, but will be overwritten by collision detection - struct Object *targetObj; //The object that the focus will base its positioning off. Usually Mario. - struct Object *targetObj2; //This is the second focus point that the camera will focus on. It'll focus between them. - s16 povHeight; //An offset of the focus object's Y value. - s16 floorY[2]; //Floor offsets, to allow a grace period before following Mario into the air. - u8 opacity; //A value set by collision distance, to fade Mario out if you're too close. - s8 stick2[2];//The value that's set and read for analogue stick. - u8 stickN[2]; //This is set when the stick is neutral. It's to prevent rapidfire input. - u8 enabled : 1; //A boolean that decides whether to use vanilla camera or puppy camera. - s16 swimPitch; //Pitch adjustment that's applied when swimming. All pitch adjustment is clamped. - s16 edgePitch; //Pitch adjustment that's applied when stood near an edge. All pitch adjustment is clamped. - s16 moveZoom; //A small zoom value that's added on top of the regular zoom when moving. It's pretty subtle, but gives the feeling of a bit of speed. - u8 mode3Flags; //A flagset for classic mode. - u8 moveFlagAdd; //A bit that multiplies movement rate of axes when moving, to centre them faster. - s16 targetDist[2]; //Used with secondary view targets to smooth out the between status. - s16 intendedTerrainPitch; //The pitch that the game wants the game to tilt towards, following the terrain. - s16 terrainPitch; //The pitch the game tilts towards, when following terrain inclines. - u8 debugFlags; //Behaviour flags during free view. + s16 yaw; // Horizontal Direction the game reads as the active value. + s16 yawTarget; // Horizontal Direction that yaw tries to be. + f32 yawAcceleration; // Horizontal Direction that sets yawTarget. + s16 pitch; // Vertical Direction the game reads as the active value. + s16 pitchTarget; // Vertical Direction that pitch tries to be. + f32 pitchAcceleration; // Vertical Direction that sets pitchTarget. + s16 zoom; // How far the camera is currently zoomed out + u8 zoomSet; // The current setting of which zoompoint to set the target to. + s16 zoomTarget; // The value that zoom tries to be. + s16 zoomPoints[3]; // An array containing distances. + s16 targetFloorHeight; // Mario's current floor height + s16 lastTargetFloorHeight; // Mirror's mario's floor height when his velocity is not above 0. + Vec3s pos; // Where the camera is + Vec3s focus; // Where the camera's looking + Vec3s pan; // An offset of the camera's focus + s32 intendedFlags; // The flagset the camera tries to be when it's not held hostage. + s32 flags; // Behaviour flags that affect different properties of the camera's behaviour + Vec3s shake; // How much the camera's shaking + u8 shakeFrames; // How long the camera's shaking for + f32 shakeForce; // How violently the camera's shaking + s32 framesSinceC[2]; // Counts the number of frames since the last C left or right press, to track double presses. + s16 collisionDistance; // Tries to be zoom, but will be overwritten by collision detection + struct Object *targetObj; // The object that the focus will base its positioning off. Usually Mario. + struct Object *targetObj2; // This is the second focus point that the camera will focus on. It'll focus between them. + s16 povHeight; // An offset of the focus object's Y value. + s16 floorY[2]; // Floor offsets, to allow a grace period before following Mario into the air. + u8 opacity; // A value set by collision distance, to fade Mario out if you're too close. + s8 stick2[2]; // The value that's set and read for analogue stick. + u8 stickN[2]; // This is set when the stick is neutral. It's to prevent rapidfire input. + u8 enabled : TRUE; // A boolean that decides whether to use vanilla camera or puppy camera. + s16 swimPitch; // Pitch adjustment that's applied when swimming. All pitch adjustment is clamped. + s16 edgePitch; // Pitch adjustment that's applied when stood near an edge. All pitch adjustment is clamped. + s16 moveZoom; // A small zoom value that's added on top of the regular zoom when moving. It's pretty subtle, but gives the feeling of a bit of speed. + u8 mode3Flags; // A flagset for classic mode. + u8 moveFlagAdd; // A bit that multiplies movement rate of axes when moving, to centre them faster. + s16 targetDist[2]; // Used with secondary view targets to smooth out the between status. + s16 intendedTerrainPitch; // The pitch that the game wants the game to tilt towards, following the terrain. + s16 terrainPitch; // The pitch the game tilts towards, when following terrain inclines. + u8 debugFlags; // Behaviour flags during free view. - u8 cutscene; //A boolean that decides whether a cutscene is active + u8 cutscene; // A boolean that decides whether a cutscene is active s32 (*sceneFunc)(); - u8 sceneInput; //A boolean that decides whether the controller updates during the scene. - s32 sceneTimer; //The cutscene timer that goes up during a cutscene. - Vec3s scenePos; //Where the camera is during a cutscene - Vec3s sceneFocus; //Where the camera looks during a cutscene - u16 splineIndex; //Determines which point of the spline it's at. - f32 splineProgress; //Determines how far along the index the spline is. + u8 sceneInput; // A boolean that decides whether the controller updates during the scene. + s32 sceneTimer; // The cutscene timer that goes up during a cutscene. + Vec3s scenePos; // Where the camera is during a cutscene + Vec3s sceneFocus; // Where the camera looks during a cutscene + u16 splineIndex; // Determines which point of the spline it's at. + f32 splineProgress; // Determines how far along the index the spline is. struct gPuppyOptions options; @@ -121,22 +121,22 @@ struct sPuppyAngles //Structurally, it's exactly the same as CutsceneSplinePoint struct sPuppySpline { - s8 index; //The index of the spline. Ends with -1 - u8 speed; //The amount of frames it takes to get through this index. - Vec3s pos; //The vector pos of the spline index itself. + s8 index; // The index of the spline. Ends with -1 + u8 speed; // The amount of frames it takes to get through this index. + Vec3s pos; // The vector pos of the spline index itself. }; //A bounding volume for activating puppycamera scripts and angles. struct sPuppyVolume { - Vec3s pos; //The set position of the volume - Vec3s radius; //Where it extends. - s16 rot; //The rotational angle of the volume. - s32 (*func)(); //a pointer to a function. Optional. - struct sPuppyAngles *angles; //A pointer to a gPuppyAngles struct. Optional - s32 flagsAdd; //Adds behaviour flags. - s32 flagsRemove; //Removes behaviour flags. - u8 flagPersistance; //Decides if adding or removing the flags is temporary or permanent. + Vec3s pos; // The set position of the volume + Vec3s radius; // Where it extends. + s16 rot; // The rotational angle of the volume. + s32 (*func)(); // a pointer to a function. Optional. + struct sPuppyAngles *angles; // A pointer to a gPuppyAngles struct. Optional + s32 flagsAdd; // Adds behaviour flags. + s32 flagsRemove; // Removes behaviour flags. + u8 flagPersistance; // Decides if adding or removing the flags is temporary or permanent. u8 shape; s16 room; u8 area; @@ -144,27 +144,27 @@ struct sPuppyVolume enum gPuppyCamBeh { - PUPPYCAM_BEHAVIOUR_X_MOVEMENT = 0x0001, - PUPPYCAM_BEHAVIOUR_Y_MOVEMENT = 0x0002, - PUPPYCAM_BEHAVIOUR_Z_MOVEMENT = 0x0004, + PUPPYCAM_BEHAVIOUR_X_MOVEMENT = (1 << 0), // 0x0001 + PUPPYCAM_BEHAVIOUR_Y_MOVEMENT = (1 << 1), // 0x0002 + PUPPYCAM_BEHAVIOUR_Z_MOVEMENT = (1 << 2), // 0x0004 - PUPPYCAM_BEHAVIOUR_YAW_ROTATION = 0x0008, - PUPPYCAM_BEHAVIOUR_PITCH_ROTATION = 0x0010, - PUPPYCAM_BEHAVIOUR_ZOOM_CHANGE = 0x0020, + PUPPYCAM_BEHAVIOUR_YAW_ROTATION = (1 << 3), // 0x0008 + PUPPYCAM_BEHAVIOUR_PITCH_ROTATION = (1 << 4), // 0x0010 + PUPPYCAM_BEHAVIOUR_ZOOM_CHANGE = (1 << 5), // 0x0020 - PUPPYCAM_BEHAVIOUR_INPUT_NORMAL = 0x0040, - PUPPYCAM_BEHAVIOUR_INPUT_8DIR = 0x0080, - PUPPYCAM_BEHAVIOUR_INPUT_4DIR = 0x0100, - PUPPYCAM_BEHAVIOUR_INPUT_2D = 0x0200, + PUPPYCAM_BEHAVIOUR_INPUT_NORMAL = (1 << 6), // 0x0040 + PUPPYCAM_BEHAVIOUR_INPUT_8DIR = (1 << 7), // 0x0080 + PUPPYCAM_BEHAVIOUR_INPUT_4DIR = (1 << 8), // 0x0100 + PUPPYCAM_BEHAVIOUR_INPUT_2D = (1 << 9), // 0x0200 - PUPPYCAM_BEHAVIOUR_SLIDE_CORRECTION = 0x0400, - PUPPYCAM_BEHAVIOUR_TURN_HELPER = 0x0800, - PUPPYCAM_BEHAVIOUR_HEIGHT_HELPER = 0x1000, - PUPPYCAM_BEHAVIOUR_PANSHIFT = 0x2000, + PUPPYCAM_BEHAVIOUR_SLIDE_CORRECTION = (1 << 10), // 0x0400 + PUPPYCAM_BEHAVIOUR_TURN_HELPER = (1 << 11), // 0x0800 + PUPPYCAM_BEHAVIOUR_HEIGHT_HELPER = (1 << 12), // 0x1000 + PUPPYCAM_BEHAVIOUR_PANSHIFT = (1 << 13), // 0x2000 - PUPPYCAM_BEHAVIOUR_COLLISION = 0x4000, + PUPPYCAM_BEHAVIOUR_COLLISION = (1 << 14), // 0x4000 - PUPPYCAM_BEHAVIOUR_FREE = 0x8000, + PUPPYCAM_BEHAVIOUR_FREE = (1 << 15), // 0x8000 PUPPYCAM_BEHAVIOUR_DEFAULT = PUPPYCAM_BEHAVIOUR_X_MOVEMENT | PUPPYCAM_BEHAVIOUR_Y_MOVEMENT | PUPPYCAM_BEHAVIOUR_Z_MOVEMENT | PUPPYCAM_BEHAVIOUR_YAW_ROTATION | PUPPYCAM_BEHAVIOUR_PITCH_ROTATION | PUPPYCAM_BEHAVIOUR_ZOOM_CHANGE | diff --git a/src/game/puppylights.h b/src/game/puppylights.h index c8a642a7..bd0bcbcf 100644 --- a/src/game/puppylights.h +++ b/src/game/puppylights.h @@ -5,20 +5,20 @@ #include "types.h" #include "command_macros_base.h" -//The maximum number of lights that can be loaded at once. Any further lights that attempt to be created past this will simply not spawn. +// The maximum number of lights that can be loaded at once. Any further lights that attempt to be created past this will simply not spawn. #define MAX_LIGHTS 32 -//The maximum number of dynamic lights available at one time. +// The maximum number of dynamic lights available at one time. #define MAX_LIGHTS_DYNAMIC 8 -//Two shapes. Choose your destiny. -#define PUPPYLIGHT_SHAPE_CUBE 0x1 -#define PUPPYLIGHT_SHAPE_CYLINDER 0x2 -#define PUPPYLIGHT_DYNAMIC 0x4 -#define PUPPYLIGHT_DIRECTIONAL 0x8 -#define PUPPYLIGHT_SHADOW 0x10 -#define PUPPYLIGHT_WET 0x20 -#define PUPPYLIGHT_DELETE 0x40 -#define PUPPYLIGHT_IGNORE_Y 0x80 +// Two shapes. Choose your destiny. +#define PUPPYLIGHT_SHAPE_CUBE (1 << 0) // 0x01 +#define PUPPYLIGHT_SHAPE_CYLINDER (1 << 1) // 0x02 +#define PUPPYLIGHT_DYNAMIC (1 << 2) // 0x04 +#define PUPPYLIGHT_DIRECTIONAL (1 << 3) // 0x08 +#define PUPPYLIGHT_SHADOW (1 << 4) // 0x10 +#define PUPPYLIGHT_WET (1 << 5) // 0x20 +#define PUPPYLIGHT_DELETE (1 << 6) // 0x40 +#define PUPPYLIGHT_IGNORE_Y (1 << 7) // 0x80 #define LIGHTFLAG_DIRECTIONAL_OFFSET 0x1 diff --git a/src/game/puppyprint.h b/src/game/puppyprint.h index cb54e509..19523668 100644 --- a/src/game/puppyprint.h +++ b/src/game/puppyprint.h @@ -3,19 +3,19 @@ #ifdef PUPPYPRINT -//This is how many indexes of timers are saved at once. higher creates a smoother average, but naturally uses more RAM. 15's fine. -#define NUM_PERF_ITERATIONS 15 +// This is how many indexes of timers are saved at once. higher creates a smoother average, but naturally uses more RAM. 15's fine. +#define NUM_PERF_ITERATIONS 15 #define NUM_BENCH_ITERATIONS 150 -#define LOG_BUFFER_SIZE 16 +#define LOG_BUFFER_SIZE 16 -#define BENCHMARK_GAME 1 -#define BENCHMARK_AUDIO 2 +#define BENCHMARK_GAME 1 +#define BENCHMARK_AUDIO 2 #define BENCHMARK_GRAPHICS 3 -#define PRINT_TEXT_ALIGN_LEFT 0 +#define PRINT_TEXT_ALIGN_LEFT 0 #define PRINT_TEXT_ALIGN_CENTRE 1 -#define PRINT_TEXT_ALIGN_RIGHT 2 -#define PRINT_ALL -1 +#define PRINT_TEXT_ALIGN_RIGHT 2 +#define PRINT_ALL -1 extern Texture small_font[]; extern s8 perfIteration; diff --git a/src/game/rendering_graph_node.c b/src/game/rendering_graph_node.c index a6ae802d..d1a859f6 100644 --- a/src/game/rendering_graph_node.c +++ b/src/game/rendering_graph_node.c @@ -287,9 +287,7 @@ void geo_process_master_list_sub(struct GraphNodeMasterList *node) { gSPClearGeometryMode(gDisplayListHead++, G_ZBUFFER); } #ifdef VISUAL_DEBUG - if (hitboxView) { - render_debug_boxes(DEBUG_UCODE_REJ); - } + if (hitboxView) render_debug_boxes(DEBUG_UCODE_REJ); #endif gSPLoadUcodeL(gDisplayListHead++, gspF3DZEX2_PosLight_fifo); init_rcp(KEEP_ZBUFFER); @@ -298,12 +296,8 @@ void geo_process_master_list_sub(struct GraphNodeMasterList *node) { #endif #ifdef VISUAL_DEBUG - if (hitboxView) { - render_debug_boxes(DEBUG_UCODE_DEFAULT | DEBUG_BOX_CLEAR); - } - if (surfaceView) { - visual_surface_loop(); - } + if ( hitboxView) render_debug_boxes(DEBUG_UCODE_DEFAULT | DEBUG_BOX_CLEAR); + if (surfaceView) visual_surface_loop(); #endif } #if SILHOUETTE @@ -326,7 +320,7 @@ void geo_append_display_list(void *displayList, s32 layer) { #if defined(F3DZEX_GBI_2) || (SILHOUETTE > 0) if (gCurGraphNodeObject != NULL) { #ifdef F3DZEX_GBI_2 - if (gCurGraphNodeObject->node.flags & GRAPH_RENDER_UCODE_REJ && ucodeTestSwitch) { + if ((gCurGraphNodeObject->node.flags & GRAPH_RENDER_UCODE_REJ) && ucodeTestSwitch) { index = 1; } #endif @@ -395,10 +389,10 @@ void geo_process_master_list(struct GraphNodeMasterList *node) { void geo_process_ortho_projection(struct GraphNodeOrthoProjection *node) { if (node->node.children != NULL) { Mtx *mtx = alloc_display_list(sizeof(*mtx)); - f32 left = (gCurGraphNodeRoot->x - gCurGraphNodeRoot->width ) / 2.0f * node->scale; - f32 right = (gCurGraphNodeRoot->x + gCurGraphNodeRoot->width ) / 2.0f * node->scale; - f32 top = (gCurGraphNodeRoot->y - gCurGraphNodeRoot->height) / 2.0f * node->scale; - f32 bottom = (gCurGraphNodeRoot->y + gCurGraphNodeRoot->height) / 2.0f * node->scale; + f32 left = (((gCurGraphNodeRoot->x - gCurGraphNodeRoot->width ) / 2.0f) * node->scale); + f32 right = (((gCurGraphNodeRoot->x + gCurGraphNodeRoot->width ) / 2.0f) * node->scale); + f32 top = (((gCurGraphNodeRoot->y - gCurGraphNodeRoot->height) / 2.0f) * node->scale); + f32 bottom = (((gCurGraphNodeRoot->y + gCurGraphNodeRoot->height) / 2.0f) * node->scale); guOrtho(mtx, left, right, bottom, top, -2.0f, 2.0f, 1.0f); gSPPerspNormalize(gDisplayListHead++, 0xFFFF); diff --git a/src/game/segment7.h b/src/game/segment7.h index c552be2e..72dccc3d 100644 --- a/src/game/segment7.h +++ b/src/game/segment7.h @@ -5,22 +5,22 @@ #include // from main menu segment 7 -extern u8 dl_menu_idle_hand[]; -extern u8 dl_menu_grabbing_hand[]; -extern u8 menu_hud_lut[]; -extern u8 menu_font_lut[]; -extern u8 dl_menu_ia8_text_begin[]; -extern u8 dl_menu_ia8_text_end[]; -extern u8 dl_menu_rgba16_wood_course[]; +extern Gfx dl_menu_idle_hand[]; +extern Gfx dl_menu_grabbing_hand[]; +extern Texture menu_hud_lut[]; +extern Texture menu_font_lut[]; +extern Gfx dl_menu_ia8_text_begin[]; +extern Gfx dl_menu_ia8_text_end[]; +extern Gfx dl_menu_rgba16_wood_course[]; #ifdef VERSION_EU -extern u8 dl_menu_rgba16_wood_course_end[]; -extern u8 dl_menu_texture_course_upper[]; -extern u8 dl_menu_texture_niveau_upper[]; -extern u8 dl_menu_texture_kurs_upper[]; +extern Gfx dl_menu_rgba16_wood_course_end[]; +extern Gfx dl_menu_texture_course_upper[]; +extern Gfx dl_menu_texture_niveau_upper[]; +extern Gfx dl_menu_texture_kurs_upper[]; -extern const u8 eu_course_strings_en_table[]; -extern const u8 eu_course_strings_fr_table[]; -extern const u8 eu_course_strings_de_table[]; +extern const Gfx eu_course_strings_en_table[]; +extern const Gfx eu_course_strings_fr_table[]; +extern const Gfx eu_course_strings_de_table[]; #endif // from intro_segment7 diff --git a/src/game/skybox.c b/src/game/skybox.c index 7875fea7..370f60fa 100644 --- a/src/game/skybox.c +++ b/src/game/skybox.c @@ -60,7 +60,7 @@ struct Skybox { struct Skybox sSkyBoxInfo[2]; -typedef const u8 *const SkyboxTexture[80 * SKYBOX_SIZE]; +typedef const Texture *const SkyboxTexture[80 * SKYBOX_SIZE]; extern SkyboxTexture bbh_skybox_ptrlist; extern SkyboxTexture bidw_skybox_ptrlist; @@ -223,7 +223,7 @@ void draw_skybox_tile_grid(Gfx **dlist, s8 background, s8 player, s8 colorIndex) for (row = 0; row < (3 * SKYBOX_SIZE); row++) { for (col = 0; col < (3 * SKYBOX_SIZE); col++) { s32 tileIndex = sSkyBoxInfo[player].upperLeftTile + row * SKYBOX_COLS + col; - const u8 *const texture = + const Texture *const texture = (*(SkyboxTexture *) segmented_to_virtual(sSkyboxTextures[background]))[tileIndex]; Vtx *vertices = make_skybox_rect(tileIndex, colorIndex); diff --git a/src/game/sound_init.c b/src/game/sound_init.c index 36492986..d8d50d2a 100644 --- a/src/game/sound_init.c +++ b/src/game/sound_init.c @@ -32,7 +32,6 @@ static u16 sCurrentMusic = MUSIC_NONE; static u16 sCurrentShellMusic = MUSIC_NONE; static u16 sCurrentCapMusic = MUSIC_NONE; static u8 sPlayingInfiniteStairs = FALSE; -UNUSED static u8 unused8032C6D8[16] = { 0 }; static s16 sSoundMenuModeToSoundMode[] = { SOUND_MODE_STEREO, SOUND_MODE_MONO, SOUND_MODE_HEADSET }; // Only the 20th array element is used. static u32 sMenuSoundsExtra[] = { diff --git a/src/goddard/draw_objects.c b/src/goddard/draw_objects.c index 360f1e0f..9ec05102 100644 --- a/src/goddard/draw_objects.c +++ b/src/goddard/draw_objects.c @@ -46,25 +46,24 @@ struct BetaVtx { }; // data -static struct GdColour sClrWhite = { 1.0, 1.0, 1.0 }; // @ 801A8070 -static struct GdColour sClrRed = { 1.0, 0.0, 0.0 }; // @ 801A807C -static struct GdColour sClrGreen = { 0.0, 1.0, 0.0 }; // @ 801A8088 -static struct GdColour sClrBlue = { 0.0, 0.0, 1.0 }; // @ 801A8094 -static struct GdColour sClrErrDarkBlue = { 0.0, 0.0, 6.0 }; // @ 801A80A0 -static struct GdColour sClrPink = { 1.0, 0.0, 1.0 }; // @ 801A80AC -static struct GdColour sClrBlack = { 0.0, 0.0, 0.0 }; // @ 801A80B8 -static struct GdColour sClrGrey = { 0.6, 0.6, 0.6 }; // @ 801A80C4 -static struct GdColour sClrDarkGrey = { 0.4, 0.4, 0.4 }; // @ 801A80D0 -static struct GdColour sClrYellow = { 1.0, 1.0, 0.0 }; // @ 801A80DC -static struct GdColour sLightColours[1] = { { 1.0, 1.0, 0.0 } }; // @ 801A80E8 -static struct GdColour *sSelectedColour = &sClrRed; // @ 801A80F4 -struct ObjCamera *gViewUpdateCamera = NULL; // @ 801A80F8 -static s32 sUnreadShapeFlag = 0; // @ 801A8100 -struct GdColour *sColourPalette[5] = { // @ 801A8104 +static struct GdColour sClrWhite = { 1.0f, 1.0f, 1.0f }; +static struct GdColour sClrRed = { 1.0f, 0.0f, 0.0f }; +static struct GdColour sClrGreen = { 0.0f, 1.0f, 0.0f }; +static struct GdColour sClrBlue = { 0.0f, 0.0f, 1.0f }; +static struct GdColour sClrErrDarkBlue = { 0.0f, 0.0f, 6.0f }; +static struct GdColour sClrPink = { 1.0f, 0.0f, 1.0f }; +static struct GdColour sClrBlack = { 0.0f, 0.0f, 0.0f }; +static struct GdColour sClrGrey = { 0.6f, 0.6f, 0.6f }; +static struct GdColour sClrDarkGrey = { 0.4f, 0.4f, 0.4f }; +static struct GdColour sClrYellow = { 1.0f, 1.0f, 0.0f }; +static struct GdColour sLightColours = { 1.0f, 1.0f, 0.0f }; +static struct GdColour *sSelectedColour = &sClrRed; +struct ObjCamera *gViewUpdateCamera = NULL; +static s32 sUnreadShapeFlag = 0; +struct GdColour *sColourPalette[5] = { &sClrWhite, &sClrYellow, &sClrRed, &sClrBlack, &sClrBlack }; struct GdColour *sWhiteBlack[2] = { - //@ 801A8118 &sClrWhite, &sClrBlack, }; @@ -260,9 +259,9 @@ void draw_light(struct ObjLight *light) { return; } - sLightColours[0].r = light->colour.r; - sLightColours[0].g = light->colour.g; - sLightColours[0].b = light->colour.b; + sLightColours.r = light->colour.r; + sLightColours.g = light->colour.g; + sLightColours.b = light->colour.b; if (light->flags & LIGHT_UNK02) { gd_set_identity_mat4(&sp54); @@ -386,7 +385,7 @@ struct GdColour *gd_get_colour(s32 idx) { return &sClrPink; break; case -1: - return &sLightColours[0]; + return &sLightColours; break; default: return NULL; @@ -834,14 +833,14 @@ void draw_particle(struct GdObj *obj) { white = sColourPalette[0]; black = sWhiteBlack[1]; brightness = ptc->timeout / 10.0; - sLightColours[0].r = (white->r - black->r) * brightness + black->r; - sLightColours[0].g = (white->g - black->g) * brightness + black->g; - sLightColours[0].b = (white->b - black->b) * brightness + black->b; + sLightColours.r = (white->r - black->r) * brightness + black->r; + sLightColours.g = (white->g - black->g) * brightness + black->g; + sLightColours.b = (white->b - black->b) * brightness + black->b; ; // needed to match } else { - sLightColours[0].r = 0.0f; - sLightColours[0].g = 0.0f; - sLightColours[0].b = 0.0f; + sLightColours.r = 0.0f; + sLightColours.g = 0.0f; + sLightColours.b = 0.0f; } if (ptc->timeout > 0) { diff --git a/src/menu/intro_geo.c b/src/menu/intro_geo.c index 934e89b3..7d2f463d 100644 --- a/src/menu/intro_geo.c +++ b/src/menu/intro_geo.c @@ -145,12 +145,12 @@ static Gfx *intro_backdrop_one_image(s32 index, s8 *backgroundTable) { }; // table that points to either the "Super Mario 64" or "Game Over" tables - static const u8 *const *textureTables[] = { mario_title_texture_table, game_over_texture_table }; + static const Texture *const *textureTables[] = { mario_title_texture_table, game_over_texture_table }; Mtx *mtx = alloc_display_list(sizeof(*mtx)); Gfx *displayList = alloc_display_list(36 * sizeof(*displayList)); Gfx *displayListIter = displayList; - const u8 *const *vIntroBgTable = segmented_to_virtual(textureTables[backgroundTable[index]]); + const Texture *const *vIntroBgTable = segmented_to_virtual(textureTables[backgroundTable[index]]); s32 i; guTranslate(mtx, xCoords[index], yCoords[index], 0.0f); diff --git a/tools/skyconv.c b/tools/skyconv.c index f04ffcff..48b1d8db 100644 --- a/tools/skyconv.c +++ b/tools/skyconv.c @@ -357,7 +357,7 @@ static void write_cake_c() { fputs("};\n\n", cFile); } } else { - fprintf(cFile, "ALIGNED8 static const u8 cake_end_texture_data[] = {\n"); + fprintf(cFile, "ALIGNED8 static const Texture cake_end_texture_data[] = {\n"); for (int i = 0; i < numTiles; ++i) { print_raw_data(cFile, &tiles[i]); fputc(',', cFile); From d0a9834f396dafc1f8c9e7cbeedc1d8b66e3f2a2 Mon Sep 17 00:00:00 2001 From: Fazana <52551480+FazanaJ@users.noreply.github.com> Date: Mon, 27 Sep 2021 21:17:10 +0100 Subject: [PATCH 07/97] E --- include/config.h | 2 +- src/game/shadow.c | 10 +--------- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/include/config.h b/include/config.h index 7665ea0c..ce8e5278 100644 --- a/include/config.h +++ b/include/config.h @@ -170,7 +170,7 @@ #define KOOPA_KEEP_PINK_SHORTS // Lightweight directional lighting engine by Fazana. Intended for giving proximity and positional pointlights to small objects. // NOTE: Stil breaks occasionally, and PUPPYLIGHT_NODE doesn't work in areas that aren't area 1. -//#define PUPPYLIGHTS +#define PUPPYLIGHTS // -- AUDIO SETTINGS -- // Fixes the castle music sometimes triggering after getting a dialog diff --git a/src/game/shadow.c b/src/game/shadow.c index 79bb07ca..087d26a9 100644 --- a/src/game/shadow.c +++ b/src/game/shadow.c @@ -208,15 +208,7 @@ s32 init_shadow(struct Shadow *s, f32 xPos, f32 yPos, f32 zPos, s16 shadowScale, s->parentZ = zPos; - if (gCurGraphNodeObjectNode->oFloor != NULL) - { - s->floorHeight = gCurGraphNodeObjectNode->oFloorHeight; - floor = gCurGraphNodeObjectNode->oFloor; - } - else - { - s->floorHeight = find_floor(s->parentX, s->parentY, s->parentZ, &floor); - } + s->floorHeight = find_floor(s->parentX, s->parentY, s->parentZ, &floor); waterLevel = get_water_level_below_shadow(s, &waterFloor); From f0bd8a1fa599655412504da159e1d2c0b767a548 Mon Sep 17 00:00:00 2001 From: Fazana <52551480+FazanaJ@users.noreply.github.com> Date: Mon, 27 Sep 2021 21:21:20 +0100 Subject: [PATCH 08/97] I hate github I hate github I hate github I hate github I hate github I hate github --- include/config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/config.h b/include/config.h index ce8e5278..7665ea0c 100644 --- a/include/config.h +++ b/include/config.h @@ -170,7 +170,7 @@ #define KOOPA_KEEP_PINK_SHORTS // Lightweight directional lighting engine by Fazana. Intended for giving proximity and positional pointlights to small objects. // NOTE: Stil breaks occasionally, and PUPPYLIGHT_NODE doesn't work in areas that aren't area 1. -#define PUPPYLIGHTS +//#define PUPPYLIGHTS // -- AUDIO SETTINGS -- // Fixes the castle music sometimes triggering after getting a dialog From ea0fd25a73226d930687fdf2b106937dcec5d41d Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Mon, 27 Sep 2021 13:35:55 -0700 Subject: [PATCH 09/97] Some more cleanup --- enhancements/crash.patch | 1 - enhancements/mem_error_screen.patch | 2 +- enhancements/reonucam3.patch | 4 +- src/audio/effects.c | 2 +- src/audio/external.c | 4 - src/audio/load_sh.c | 4 +- src/engine/surface_load.c | 10 +- src/game/behaviors/activated_bf_plat.inc.c | 2 +- .../behaviors/animated_floor_switch.inc.c | 2 +- src/game/behaviors/bubba.inc.c | 2 +- src/game/behaviors/chain_chomp.inc.c | 4 +- src/game/behaviors/clam.inc.c | 2 +- src/game/behaviors/coffin.inc.c | 2 +- src/game/behaviors/end_birds_1.inc.c | 2 +- src/game/behaviors/end_birds_2.inc.c | 2 +- src/game/behaviors/enemy_lakitu.inc.c | 8 +- src/game/behaviors/eyerok.inc.c | 18 +- src/game/behaviors/fire_piranha_plant.inc.c | 6 +- src/game/behaviors/fly_guy.inc.c | 4 +- .../behaviors/flying_bookend_switch.inc.c | 2 +- src/game/behaviors/goomba.inc.c | 4 +- src/game/behaviors/haunted_chair.inc.c | 2 +- src/game/behaviors/intro_lakitu.inc.c | 17 +- src/game/behaviors/intro_peach.inc.c | 6 +- src/game/behaviors/klepto.inc.c | 4 +- src/game/behaviors/koopa.inc.c | 19 +- src/game/behaviors/monty_mole.inc.c | 2 +- src/game/behaviors/mr_blizzard.inc.c | 2 +- src/game/behaviors/mr_i.inc.c | 2 +- src/game/behaviors/pokey.inc.c | 22 +- src/game/behaviors/recovery_heart.inc.c | 2 +- src/game/behaviors/shock_wave.inc.c | 2 +- src/game/behaviors/skeeter.inc.c | 4 +- src/game/behaviors/snufit.inc.c | 2 +- src/game/behaviors/spiny.inc.c | 6 +- src/game/behaviors/swoop.inc.c | 2 +- src/game/behaviors/thi_top.inc.c | 2 +- src/game/behaviors/ttc_2d_rotator.inc.c | 2 +- src/game/behaviors/ttc_moving_bar.inc.c | 4 +- src/game/behaviors/ttc_pendulum.inc.c | 2 +- src/game/behaviors/water_bomb.inc.c | 8 +- src/game/behaviors/water_bomb_cannon.inc.c | 4 +- src/game/behaviors/wiggler.inc.c | 4 +- src/game/camera.c | 26 +- src/game/debug.c | 18 +- src/game/debug_course.c | 7 - src/game/debug_course.h | 6 - src/game/envfx_bubbles.c | 4 +- src/game/interaction.c | 38 +- src/game/level_update.c | 12 +- src/game/mario.c | 15 +- src/game/mario_actions_airborne.c | 2 +- src/game/mario_misc.c | 6 +- src/game/obj_behaviors_2.c | 7 +- src/game/object_list_processor.c | 6 +- src/game/puppycam2.c | 1379 +++++++---------- src/game/spawn_object.c | 3 +- src/goddard/renderer.c | 2 +- src/goddard/shape_helper.c | 2 +- src/menu/file_select.c | 2 +- 60 files changed, 731 insertions(+), 1011 deletions(-) delete mode 100644 src/game/debug_course.c delete mode 100644 src/game/debug_course.h diff --git a/enhancements/crash.patch b/enhancements/crash.patch index e3935d6b..7aa90c0b 100644 --- a/enhancements/crash.patch +++ b/enhancements/crash.patch @@ -182,7 +182,6 @@ index 7d9b5b4a..c7bb81b9 100755 BUILD_DIR/asm/decompress.o(.text); + BUILD_DIR/asm/crash.o(.text); BUILD_DIR/src/game/camera.o(.text); - BUILD_DIR/src/game/debug_course.o(.text); BUILD_DIR/src/game/object_list_processor.o(.text); diff --git a/src/game/crash.c b/src/game/crash.c new file mode 100644 diff --git a/enhancements/mem_error_screen.patch b/enhancements/mem_error_screen.patch index c6c76eef..d2a21024 100644 --- a/enhancements/mem_error_screen.patch +++ b/enhancements/mem_error_screen.patch @@ -258,7 +258,7 @@ index 00000000..f432927c + dl_ia_text_end); // Reset back to default render settings. + gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW); + } else { -+ gDelayForErrorMessage += 1; ++ gDelayForErrorMessage++; + } + } + diff --git a/enhancements/reonucam3.patch b/enhancements/reonucam3.patch index efc6aec6..739c253d 100644 --- a/enhancements/reonucam3.patch +++ b/enhancements/reonucam3.patch @@ -394,14 +394,14 @@ index 6cbfd8e1..01dd4de8 100644 + + if (gPlayer1Controller->buttonPressed & R_JPAD) { + if (gCameraSpeed < 4) { -+ gCameraSpeed += 1; ++ gCameraSpeed++; + } else { + gCameraSpeed = 0; + } + save_file_set_camera_speed(gCameraSpeed); + } else if (gPlayer1Controller->buttonPressed & L_JPAD) { + if (gCameraSpeed > 0) { -+ gCameraSpeed -= 1; ++ gCameraSpeed--; + } else { + gCameraSpeed = 4; + } diff --git a/src/audio/effects.c b/src/audio/effects.c index f18af4af..5bfc7c29 100644 --- a/src/audio/effects.c +++ b/src/audio/effects.c @@ -511,7 +511,7 @@ s32 adsr_update(struct AdsrState *adsr) { } case ADSR_STATE_SUSTAIN: - adsr->delay -= 1; + adsr->delay--; if (adsr->delay == 0) { adsr->state = ADSR_STATE_RELEASE; } diff --git a/src/audio/external.c b/src/audio/external.c index ecc12247..7fd7f231 100644 --- a/src/audio/external.c +++ b/src/audio/external.c @@ -1281,9 +1281,6 @@ static u8 get_sound_reverb(UNUSED u8 bank, UNUSED u8 soundIndex, u8 channelIndex return reverb; } -static void noop_8031EEC8(void) { -} - /** * Called from the game loop thread to inform the audio thread that a new game * frame has started. @@ -1295,7 +1292,6 @@ void audio_signal_game_loop_tick(void) { #if defined(VERSION_EU) || defined(VERSION_SH) maybe_tick_game_sound(); #endif - noop_8031EEC8(); } /** diff --git a/src/audio/load_sh.c b/src/audio/load_sh.c index 5a0e293a..b5577c7d 100644 --- a/src/audio/load_sh.c +++ b/src/audio/load_sh.c @@ -1488,7 +1488,7 @@ void func_sh_802f5310(s32 bankId, struct AudioBank *mem, struct PatchStruct *pat if (D_SH_8034F68C != 0 && sp4C == 0) { temp_s0 = D_SH_8034EC88[D_SH_8034F68C - 1].sample; temp = (temp_s0->size >> 12); - temp += 1; + temp++; count = (uintptr_t) temp_s0->sampleAddr; func_sh_802f4cb4( count, @@ -1540,7 +1540,7 @@ next: sampleAddr = sample->sampleAddr; size = sample->size; unk = size >> 0xC; - unk += 1; + unk++; added = ((sampleAddr + size) + sample->medium); if (added != D_SH_8034EC88[D_SH_8034F68C - 1].endAndMediumIdentification) { D_SH_8034EC88[D_SH_8034F68C - 1].isFree = TRUE; diff --git a/src/engine/surface_load.c b/src/engine/surface_load.c index 9705ac18..83fed388 100644 --- a/src/engine/surface_load.c +++ b/src/engine/surface_load.c @@ -173,7 +173,7 @@ static s32 lower_cell_index(s32 coord) { //! Some wall checks are larger than the buffer, meaning wall checks can // miss walls that are near a cell border. if (coord % CELL_SIZE < 50) { - index -= 1; + index--; } if (index < 0) { @@ -205,7 +205,7 @@ static s32 upper_cell_index(s32 coord) { //! Some wall checks are larger than the buffer, meaning wall checks can // miss walls that are near a cell border. if (coord % CELL_SIZE > CELL_SIZE - 50) { - index += 1; + index++; } if (index > NUM_CELLS_INDEX) { @@ -372,12 +372,12 @@ static void load_static_surfaces(TerrainData **data, TerrainData *vertexData, s3 s32 flags = surf_has_no_cam_collision(surfaceType); numSurfaces = *(*data); - *data += 1; + (*data)++; for (i = 0; i < numSurfaces; i++) { if (*surfaceRooms != NULL) { room = *(*surfaceRooms); - *surfaceRooms += 1; + (*surfaceRooms)++; } surface = read_surface_data(vertexData, data); @@ -404,7 +404,7 @@ static void load_static_surfaces(TerrainData **data, TerrainData *vertexData, s3 #else *data += 3; if (hasForce) { - *data += 1; + (*data)++; } #endif } diff --git a/src/game/behaviors/activated_bf_plat.inc.c b/src/game/behaviors/activated_bf_plat.inc.c index e58205fd..5ed32c98 100644 --- a/src/game/behaviors/activated_bf_plat.inc.c +++ b/src/game/behaviors/activated_bf_plat.inc.c @@ -76,7 +76,7 @@ void bhv_activated_back_and_forth_platform_update(void) { // and one more frame of "lag" after it finally reaches 0 here, // Mario actually has to wait 22 frames before the platform starts moving. if (o->oActivatedBackAndForthPlatformCountdown != 0) { - o->oActivatedBackAndForthPlatformCountdown -= 1; + o->oActivatedBackAndForthPlatformCountdown--; } else { // After the wait period is over, we start moving, by adding the velocity // to the positional offset. diff --git a/src/game/behaviors/animated_floor_switch.inc.c b/src/game/behaviors/animated_floor_switch.inc.c index 7cbe323c..a8577d17 100644 --- a/src/game/behaviors/animated_floor_switch.inc.c +++ b/src/game/behaviors/animated_floor_switch.inc.c @@ -63,7 +63,7 @@ void bhv_animates_on_floor_switch_press_loop(void) { } if (o->oFloorSwitchPressAnimationDoubleFrame < 9) { - o->oFloorSwitchPressAnimationDoubleFrame += 1; + o->oFloorSwitchPressAnimationDoubleFrame++; } } else if ((o->oFloorSwitchPressAnimationDoubleFrame -= 2) < 0) { o->oFloorSwitchPressAnimationDoubleFrame = 0; diff --git a/src/game/behaviors/bubba.inc.c b/src/game/behaviors/bubba.inc.c index d51a4b40..afd4c46f 100644 --- a/src/game/behaviors/bubba.inc.c +++ b/src/game/behaviors/bubba.inc.c @@ -36,7 +36,7 @@ void bubba_act_0(void) { } else if (o->oTimer > 30 && o->oDistanceToMario < 2000.0f) { o->oAction = 1; } else if (o->oBubbaRandomTimer != 0) { - o->oBubbaRandomTimer -= 1; + o->oBubbaRandomTimer--; } else { o->oBubbaTargetYaw = obj_random_fixed_turn(0x2000); o->oBubbaRandomTimer = random_linear_offset(100, 100); diff --git a/src/game/behaviors/chain_chomp.inc.c b/src/game/behaviors/chain_chomp.inc.c index 38e97cbc..a4a70ebb 100644 --- a/src/game/behaviors/chain_chomp.inc.c +++ b/src/game/behaviors/chain_chomp.inc.c @@ -190,7 +190,7 @@ static void chain_chomp_sub_act_turn(void) { o->oChainChompTargetPitch = obj_get_pitch_from_vel(); } } else { - o->oTimer -= 1; + o->oTimer--; } } else { o->oForwardVel = 0.0f; @@ -276,7 +276,7 @@ static void chain_chomp_released_lunge_around(void) { if (o->oChainChompNumLunges == 0) { if (cur_obj_rotate_yaw_toward(o->oAngleToMario, 0x320)) { if (o->oTimer > 60) { - o->oChainChompNumLunges += 1; + o->oChainChompNumLunges++; // enable wall collision o->oWallHitboxRadius = 200.0f; } diff --git a/src/game/behaviors/clam.inc.c b/src/game/behaviors/clam.inc.c index b9ef5038..8679b4b2 100644 --- a/src/game/behaviors/clam.inc.c +++ b/src/game/behaviors/clam.inc.c @@ -24,7 +24,7 @@ void clam_act_0(void) { cur_obj_play_sound_2(SOUND_GENERAL_CLAM_SHELL2); o->oAction = 1; } else if (o->oClamShakeTimer != 0) { - o->oClamShakeTimer -= 1; + o->oClamShakeTimer--; cur_obj_shake_y(3.0f); } } diff --git a/src/game/behaviors/coffin.inc.c b/src/game/behaviors/coffin.inc.c index 5926bff8..8bc95a1f 100644 --- a/src/game/behaviors/coffin.inc.c +++ b/src/game/behaviors/coffin.inc.c @@ -49,7 +49,7 @@ void bhv_coffin_spawner_loop(void) { } } - o->oAction += 1; + o->oAction++; } } else if (o->activeFlags & ACTIVE_FLAG_IN_DIFFERENT_ROOM) { o->oAction = COFFIN_SPAWNER_ACT_COFFINS_UNLOADED; diff --git a/src/game/behaviors/end_birds_1.inc.c b/src/game/behaviors/end_birds_1.inc.c index 38deec59..cb39e98a 100644 --- a/src/game/behaviors/end_birds_1.inc.c +++ b/src/game/behaviors/end_birds_1.inc.c @@ -9,7 +9,7 @@ void bhv_end_birds_1_loop(void) { gCurrentObject->oIntroLakituEndBirds1DestX = -554.f; gCurrentObject->oIntroLakituEndBirds1DestY = 3044.f; gCurrentObject->oIntroLakituEndBirds1DestZ = -1314.f; - gCurrentObject->oAction += 1; + gCurrentObject->oAction = 1; break; case 1: vec3f_set(pos, gCurrentObject->oIntroLakituEndBirds1DestX, gCurrentObject->oIntroLakituEndBirds1DestY, diff --git a/src/game/behaviors/end_birds_2.inc.c b/src/game/behaviors/end_birds_2.inc.c index 44fdd0f2..8f5ef9dd 100644 --- a/src/game/behaviors/end_birds_2.inc.c +++ b/src/game/behaviors/end_birds_2.inc.c @@ -10,7 +10,7 @@ void bhv_end_birds_2_loop(void) { switch (gCurrentObject->oAction) { case 0: cur_obj_scale(0.7f); - gCurrentObject->oAction += 1; + gCurrentObject->oAction = 1; break; case 1: vec3f_get_dist_and_angle(gCamera->pos, gCamera->focus, &dist, &pitch, &yaw); diff --git a/src/game/behaviors/enemy_lakitu.inc.c b/src/game/behaviors/enemy_lakitu.inc.c index 056c3f13..670697e7 100644 --- a/src/game/behaviors/enemy_lakitu.inc.c +++ b/src/game/behaviors/enemy_lakitu.inc.c @@ -77,7 +77,7 @@ static void enemy_lakitu_update_speed_and_angle(void) { // Turn toward mario except right after throwing a spiny if (o->oEnemyLakituFaceForwardCountdown != 0) { - o->oEnemyLakituFaceForwardCountdown -= 1; + o->oEnemyLakituFaceForwardCountdown--; } else { obj_face_yaw_approach(o->oAngleToMario, 0x600); } @@ -96,7 +96,7 @@ static void enemy_lakitu_sub_act_no_spiny(void) { cur_obj_init_animation_with_sound(1); if (o->oEnemyLakituSpinyCooldown != 0) { - o->oEnemyLakituSpinyCooldown -= 1; + o->oEnemyLakituSpinyCooldown--; } else if (o->oEnemyLakituNumSpinies < 3 && o->oDistanceToMario < 800.0f && abs_angle_diff(o->oAngleToMario, o->oFaceAngleYaw) < 0x4000) { struct Object *spiny = spawn_object(o, MODEL_SPINY_BALL, bhvSpiny); @@ -105,7 +105,7 @@ static void enemy_lakitu_sub_act_no_spiny(void) { spiny->oAction = SPINY_ACT_HELD_BY_LAKITU; obj_init_animation_with_sound(spiny, spiny_egg_seg5_anims_050157E4, 0); - o->oEnemyLakituNumSpinies += 1; + o->oEnemyLakituNumSpinies++; o->oSubAction = ENEMY_LAKITU_SUB_ACT_HOLD_SPINY; o->oEnemyLakituSpinyCooldown = 30; } @@ -120,7 +120,7 @@ static void enemy_lakitu_sub_act_hold_spiny(void) { cur_obj_init_anim_extend(3); if (o->oEnemyLakituSpinyCooldown != 0) { - o->oEnemyLakituSpinyCooldown -= 1; + o->oEnemyLakituSpinyCooldown--; } // TODO: Check if anything interesting happens if we bypass this with speed else if (o->oDistanceToMario > o->oDrawingDistance - 100.0f diff --git a/src/game/behaviors/eyerok.inc.c b/src/game/behaviors/eyerok.inc.c index eb7f7c73..33b49610 100644 --- a/src/game/behaviors/eyerok.inc.c +++ b/src/game/behaviors/eyerok.inc.c @@ -44,7 +44,7 @@ static void eyerok_boss_act_wake_up(void) { if (o->oTimer > 5) { if (o->oSubAction == 0) { seq_player_lower_volume(SEQ_PLAYER_LEVEL, 60, 40); - o->oSubAction += 1; + o->oSubAction++; } if (o->oEyerokBossOffsetFromHome == 0.0f && mario_ready_to_speak() != 0) { @@ -79,18 +79,18 @@ static void eyerok_boss_act_fight(void) { o->oEyerokBossAttackCountdown = 1; } } else { - o->oEyerokBossAttackCountdown -= 1; + o->oEyerokBossAttackCountdown--; } if (o->oEyerokBossAttackCountdown != 0 && o->oEyerokBossAttackCountdown != 1) { - o->oEyerokBossAttackPhase += 1; + o->oEyerokBossAttackPhase++; if ((o->oEyerokBossActiveHand = o->oEyerokBossAttackPhase & 0x1) == 0) { o->oEyerokBossActiveHand = -1; } } } } else { - o->oEyerokBossAttackPhase += 1; + o->oEyerokBossAttackPhase++; if (eyerok_check_mario_relative_z(400)) { o->oEyerokBossAttackCountdown = -8; @@ -120,7 +120,7 @@ static void eyerok_boss_act_die(void) { if (cur_obj_update_dialog_with_cutscene(MARIO_DIALOG_LOOK_UP, DIALOG_FLAG_NONE, CUTSCENE_DIALOG, DIALOG_118)) { spawn_default_star(0.0f, -900.0f, -3700.0f); } else { - o->oTimer -= 1; + o->oTimer--; } } else if (o->oTimer > 120) { stop_background_music(SEQUENCE_ARGS(4, SEQ_EVENT_BOSS)); @@ -156,7 +156,7 @@ static s32 eyerok_hand_check_attacked(void) { o->oAction = EYEROK_HAND_ACT_ATTACKED; o->oVelY = 30.0f; } else { - o->parentObj->oEyerokBossNumHands -= 1; + o->parentObj->oEyerokBossNumHands--; o->oAction = EYEROK_HAND_ACT_DIE; o->oVelY = 50.0f; } @@ -183,7 +183,7 @@ static void eyerok_hand_act_sleep(void) { if (o->parentObj->oAction != EYEROK_BOSS_ACT_SLEEP && ++o->oEyerokHandWakeUpTimer > -3 * o->oBehParams2ndByte) { if (cur_obj_check_if_near_animation_end()) { - o->parentObj->oEyerokBossNumHands += 1; + o->parentObj->oEyerokBossNumHands++; o->oAction = EYEROK_HAND_ACT_IDLE; o->collisionData = segmented_to_virtual(&ssl_seg7_collision_07028274); } else { @@ -268,14 +268,14 @@ static void eyerok_hand_act_show_eye(void) { if (!eyerok_hand_check_attacked()) { if (o->parentObj->oEyerokBossActiveHand == 0) { if (o->oAnimState < 3) { - o->oAnimState += 1; + o->oAnimState++; } else if (cur_obj_check_if_near_animation_end()) { o->oAction = EYEROK_HAND_ACT_CLOSE; } } else { if (o->oEyerokHandEyeShownTimer--) { if (o->oEyerokHandAnimStateIndex != 0) { - o->oEyerokHandAnimStateIndex -= 1; + o->oEyerokHandAnimStateIndex--; } o->oAnimState = sEyerokAnimStatesList[o->oEyerokHandAnimStateIndex]; } else { diff --git a/src/game/behaviors/fire_piranha_plant.inc.c b/src/game/behaviors/fire_piranha_plant.inc.c index 19df9db0..4f9aedcf 100644 --- a/src/game/behaviors/fire_piranha_plant.inc.c +++ b/src/game/behaviors/fire_piranha_plant.inc.c @@ -56,7 +56,7 @@ static void fire_piranha_plant_act_hide(void) { 0.04f * o->oFirePiranhaPlantNeutralScale)) { cur_obj_become_intangible(); if (o->oFirePiranhaPlantActive) { - sNumActiveFirePiranhaPlants -= 1; + sNumActiveFirePiranhaPlants--; o->oFirePiranhaPlantActive = FALSE; if ((u16)(o->oBehParams >> 16) != 0 && o->oHealth == 0) { @@ -72,7 +72,7 @@ static void fire_piranha_plant_act_hide(void) { cur_obj_play_sound_2(SOUND_OBJ_PIRANHA_PLANT_APPEAR); o->oFirePiranhaPlantActive = TRUE; - sNumActiveFirePiranhaPlants += 1; + sNumActiveFirePiranhaPlants++; cur_obj_unhide(); o->oAction = FIRE_PIRANHA_PLANT_ACT_GROW; @@ -127,7 +127,7 @@ void bhv_fire_piranha_plant_update(void) { if (obj_check_attacks(&sFirePiranhaPlantHitbox, o->oAction)) { if (--o->oHealth < 0) { if (o->oFirePiranhaPlantActive) { - sNumActiveFirePiranhaPlants -= 1; + sNumActiveFirePiranhaPlants--; } } else { cur_obj_init_animation_with_sound(2); diff --git a/src/game/behaviors/fly_guy.inc.c b/src/game/behaviors/fly_guy.inc.c index 4ae1f844..c7e24e8a 100644 --- a/src/game/behaviors/fly_guy.inc.c +++ b/src/game/behaviors/fly_guy.inc.c @@ -45,7 +45,7 @@ static void fly_guy_act_idle(void) { o->oAction = FLY_GUY_ACT_APPROACH_MARIO; } else { o->oFlyGuyUnusedJitter = o->oMoveAngleYaw + sFlyGuyJitterAmounts[o->oFlyGuyIdleTimer]; - o->oFlyGuyIdleTimer += 1; + o->oFlyGuyIdleTimer++; } } } @@ -190,7 +190,7 @@ void bhv_fly_guy_update(void) { } // Oscillate up and down - o->oFlyGuyOscTimer += 1; + o->oFlyGuyOscTimer++; o->oPosY += coss(0x400 * o->oFlyGuyOscTimer) * 1.5f; switch (o->oAction) { diff --git a/src/game/behaviors/flying_bookend_switch.inc.c b/src/game/behaviors/flying_bookend_switch.inc.c index 76418346..d401e453 100644 --- a/src/game/behaviors/flying_bookend_switch.inc.c +++ b/src/game/behaviors/flying_bookend_switch.inc.c @@ -270,7 +270,7 @@ void bhv_book_switch_loop(void) { if (o->oAction != 0) { if (o->parentObj->oBookSwitchManagerNumCorrectChoices == o->oBehParams2ndByte) { play_sound(SOUND_GENERAL2_RIGHT_ANSWER, gGlobalSoundSource); - o->parentObj->oBookSwitchManagerNumCorrectChoices += 1; + o->parentObj->oBookSwitchManagerNumCorrectChoices++; } else { rand01 = random_u16() & 0x1; z = gMarioObject->oPosZ + 1.5f * gMarioStates[0].vel[2]; diff --git a/src/game/behaviors/goomba.inc.c b/src/game/behaviors/goomba.inc.c index c1155eca..42583c27 100644 --- a/src/game/behaviors/goomba.inc.c +++ b/src/game/behaviors/goomba.inc.c @@ -95,7 +95,7 @@ void bhv_goomba_triplet_spawner_update(void) { } } - o->oAction += 1; + o->oAction++; } } else if (o->oDistanceToMario > 4000.0f) { // If mario is too far away, enter the unloaded action. The goombas @@ -194,7 +194,7 @@ static void goomba_act_walk(void) { o->oGoombaRelativeSpeed = 4.0f / 3.0f; if (o->oGoombaWalkTimer != 0) { - o->oGoombaWalkTimer -= 1; + o->oGoombaWalkTimer--; } else { if (random_u16() & 3) { o->oGoombaTargetYaw = obj_random_fixed_turn(0x2000); diff --git a/src/game/behaviors/haunted_chair.inc.c b/src/game/behaviors/haunted_chair.inc.c index 4b6a6120..29d8cb47 100644 --- a/src/game/behaviors/haunted_chair.inc.c +++ b/src/game/behaviors/haunted_chair.inc.c @@ -59,7 +59,7 @@ void haunted_chair_act_0(void) { } } else if (o->oHauntedChairSpinTimer != 0) { if (o->oDistanceToMario < 500.0f) { - o->oHauntedChairSpinTimer -= 1; + o->oHauntedChairSpinTimer--; } o->oTimer = 0.0f; } else { diff --git a/src/game/behaviors/intro_lakitu.inc.c b/src/game/behaviors/intro_lakitu.inc.c index 4593f7c5..97428e7c 100644 --- a/src/game/behaviors/intro_lakitu.inc.c +++ b/src/game/behaviors/intro_lakitu.inc.c @@ -45,7 +45,7 @@ s32 intro_lakitu_set_pos_and_focus(struct Object *o, struct CutsceneSplinePoint if ((move_point_along_spline(newFocus, offset, &splineSegment, &(o->oIntroLakituSplineSegmentProgress)) == 1) || (move_point_along_spline(newOffset, focus, &splineSegment, &(o->oIntroLakituSplineSegmentProgress)) == 1)) - splineFinished += 1; + splineFinished++; o->oIntroLakituSplineSegment = splineSegment; intro_lakitu_set_offset_from_camera(o, newOffset); @@ -64,10 +64,11 @@ void bhv_intro_lakitu_loop(void) { gCurrentObject->oIntroLakituSplineSegmentProgress = 0.f; gCurrentObject->oIntroLakituCloud = spawn_object_relative_with_scale(1, 0, 0, 0, 2.f, gCurrentObject, MODEL_MIST, bhvCloud); - if (gCamera->cutscene == CUTSCENE_END_WAVING) + if (gCamera->cutscene == CUTSCENE_END_WAVING) { gCurrentObject->oAction = 100; - else - gCurrentObject->oAction += 1; + } else { + gCurrentObject->oAction = 1; + } break; case 1: @@ -82,7 +83,7 @@ void bhv_intro_lakitu_loop(void) { if (intro_lakitu_set_pos_and_focus(gCurrentObject, gIntroLakituStartToPipeOffsetFromCamera, gIntroLakituStartToPipeFocus) == 1) - gCurrentObject->oAction += 1; + gCurrentObject->oAction = 2; switch (gCurrentObject->oTimer) { #if defined(VERSION_US) || defined(VERSION_SH) @@ -111,7 +112,7 @@ void bhv_intro_lakitu_loop(void) { #else if (gCutsceneTimer > 720) { #endif - gCurrentObject->oAction += 1; + gCurrentObject->oAction = 3; gCurrentObject->oIntroLakituDistToBirdsX = 1400.f; gCurrentObject->oIntroLakituDistToBirdsZ = -4096.f; gCurrentObject->oIntroLakituEndBirds1DestZ = 2048.f; @@ -173,7 +174,7 @@ void bhv_intro_lakitu_loop(void) { gCurrentObject->oMoveAngleYaw = 0x9000; gCurrentObject->oFaceAnglePitch = gCurrentObject->oMoveAnglePitch / 2; gCurrentObject->oFaceAngleYaw = gCurrentObject->oMoveAngleYaw; - gCurrentObject->oAction += 1; + gCurrentObject->oAction++; break; case 101: @@ -186,7 +187,7 @@ void bhv_intro_lakitu_loop(void) { gCurrentObject->oFaceAngleYaw = camera_approach_s16_symmetric(gCurrentObject->oFaceAngleYaw, yawToCam, 0x200); } if (gCurrentObject->oTimer > 105) { - gCurrentObject->oAction += 1; + gCurrentObject->oAction++; gCurrentObject->oMoveAnglePitch = 0xE00; } gCurrentObject->oFaceAnglePitch = 0; diff --git a/src/game/behaviors/intro_peach.inc.c b/src/game/behaviors/intro_peach.inc.c index 37b40301..3a234657 100644 --- a/src/game/behaviors/intro_peach.inc.c +++ b/src/game/behaviors/intro_peach.inc.c @@ -21,7 +21,7 @@ void intro_peach_set_pos_and_opacity(struct Object *o, f32 targetOpacity, f32 in void bhv_intro_peach_loop(void) { switch (gCurrentObject->oAction) { case 0: - gCurrentObject->oAction += 1; + gCurrentObject->oAction = 1; gCurrentObject->oFaceAnglePitch = 0x400; gCurrentObject->oFaceAngleYaw = 0x7500; gCurrentObject->oFaceAngleRoll = -0x3700; @@ -35,13 +35,13 @@ void bhv_intro_peach_loop(void) { intro_peach_set_pos_and_opacity(gCurrentObject, 0.f, 0.f); if (gCurrentObject->oTimer > 20) - gCurrentObject->oAction += 1; + gCurrentObject->oAction = 2; break; case 2: intro_peach_set_pos_and_opacity(gCurrentObject, 255.f, 3.f); if ((gCurrentObject->oTimer > 100) && (get_dialog_id() == DIALOG_NONE)) - gCurrentObject->oAction += 1; + gCurrentObject->oAction = 3; break; case 3: intro_peach_set_pos_and_opacity(gCurrentObject, 0.f, 8.f); diff --git a/src/game/behaviors/klepto.inc.c b/src/game/behaviors/klepto.inc.c index c7051475..a2adb846 100644 --- a/src/game/behaviors/klepto.inc.c +++ b/src/game/behaviors/klepto.inc.c @@ -63,7 +63,7 @@ static void klepto_anim_dive(void) { obj_move_pitch_approach(o->oKleptoPitchToTarget, 600); if (klepto_set_and_check_if_anim_at_end() != 0) { if (o->oKleptoDiveTimer != 0) { - o->oKleptoDiveTimer += 1; + o->oKleptoDiveTimer++; } else if (o->oKleptoPitchToTarget > -100) { o->oKleptoDiveTimer = random_linear_offset(60, 60); } @@ -234,7 +234,7 @@ static void klepto_act_dive_at_mario(void) { o->oKleptoYawToTarget = o->oAngleToMario; if (dy < 160.0f) { - o->oSubAction += 1; + o->oSubAction++; } } diff --git a/src/game/behaviors/koopa.inc.c b/src/game/behaviors/koopa.inc.c index 9440dfda..66376f64 100644 --- a/src/game/behaviors/koopa.inc.c +++ b/src/game/behaviors/koopa.inc.c @@ -133,7 +133,7 @@ static void koopa_walk_start(void) { obj_forward_vel_approach(3.0f * o->oKoopaAgility, 0.3f * o->oKoopaAgility); if (cur_obj_init_anim_and_check_if_end(11)) { - o->oSubAction += 1; + o->oSubAction++; o->oKoopaCountdown = random_linear_offset(30, 100); } } @@ -146,9 +146,9 @@ static void koopa_walk(void) { koopa_play_footstep_sound(2, 17); if (o->oKoopaCountdown != 0) { - o->oKoopaCountdown -= 1; + o->oKoopaCountdown--; } else if (cur_obj_check_if_near_animation_end()) { - o->oSubAction += 1; + o->oSubAction++; } } @@ -244,7 +244,7 @@ static void koopa_shelled_act_lying(void) { cur_obj_init_anim_extend(5); koopa_dive_update_speed(0.3f); } else if (o->oKoopaCountdown != 0) { - o->oKoopaCountdown -= 1; + o->oKoopaCountdown--; cur_obj_extend_animation_if_at_end(); } else if (cur_obj_init_anim_and_check_if_end(6)) { o->oAction = KOOPA_SHELLED_ACT_STOPPED; @@ -350,7 +350,7 @@ static void koopa_unshelled_act_run(void) { obj_bounce_off_walls_edges_objects(&o->oKoopaTargetYaw))) { // Otherwise run around randomly if (o->oKoopaUnshelledTimeUntilTurn != 0) { - o->oKoopaUnshelledTimeUntilTurn -= 1; + o->oKoopaUnshelledTimeUntilTurn--; } else { o->oKoopaTargetYaw = obj_random_fixed_turn(0x2000); } @@ -424,7 +424,7 @@ static void koopa_unshelled_act_dive(void) { } koopa_dive_update_speed(0.5f); } else if (o->oKoopaCountdown != 0) { - o->oKoopaCountdown -= 1; + o->oKoopaCountdown--; cur_obj_extend_animation_if_at_end(); } else if (cur_obj_init_anim_and_check_if_end(6)) { o->oAction = KOOPA_UNSHELLED_ACT_RUN; @@ -498,7 +498,7 @@ static void koopa_the_quick_act_wait_before_race(void) { koopa_shelled_act_stopped(); if (o->oKoopaTheQuickInitTextboxCooldown != 0) { - o->oKoopaTheQuickInitTextboxCooldown -= 1; + o->oKoopaTheQuickInitTextboxCooldown--; } else if (cur_obj_can_mario_activate_textbox_2(400.0f, 400.0f)) { //! The next action doesn't execute until next frame, giving mario one // frame where he can jump, and thus no longer be ready to speak. @@ -657,11 +657,10 @@ static void koopa_the_quick_act_race(void) { break; case KOOPA_THE_QUICK_SUB_ACT_JUMP: - // We could perform a goomba double jump if we could deactivate - // ktq + // We could perform a goomba double jump if we could deactivate ktq if (o->oMoveFlags & OBJ_MOVE_MASK_ON_GROUND) { if (cur_obj_init_anim_and_check_if_end(13)) { - o->oSubAction -= 1; + o->oSubAction--; } koopa_the_quick_detect_bowling_ball(); diff --git a/src/game/behaviors/monty_mole.inc.c b/src/game/behaviors/monty_mole.inc.c index 3276cefd..a538a8f7 100644 --- a/src/game/behaviors/monty_mole.inc.c +++ b/src/game/behaviors/monty_mole.inc.c @@ -104,7 +104,7 @@ void bhv_monty_mole_hole_update(void) { sMontyMoleHoleList = link_objects_with_behavior(bhvMontyMoleHole); sMontyMoleKillStreak = 0; } else if (o->oMontyMoleHoleCooldown > 0) { - o->oMontyMoleHoleCooldown -= 1; + o->oMontyMoleHoleCooldown--; } } diff --git a/src/game/behaviors/mr_blizzard.inc.c b/src/game/behaviors/mr_blizzard.inc.c index c761d34e..62d3f46e 100644 --- a/src/game/behaviors/mr_blizzard.inc.c +++ b/src/game/behaviors/mr_blizzard.inc.c @@ -116,7 +116,7 @@ static void mr_blizzard_act_rise_from_ground(void) { // If the timer is not 0, decrement by 1 until it reaches 0. if (o->oMrBlizzardTimer != 0) { - o->oMrBlizzardTimer -= 1; + o->oMrBlizzardTimer--; } else if ((o->oMrBlizzardGraphYOffset += o->oMrBlizzardGraphYVel) > 24.0f) { // Increments GraphYOffset by GraphYVel until it is greater than 24, // moving Mr. Blizzard's graphical position upward each frame. diff --git a/src/game/behaviors/mr_i.inc.c b/src/game/behaviors/mr_i.inc.c index e4a3f177..4483d119 100644 --- a/src/game/behaviors/mr_i.inc.c +++ b/src/game/behaviors/mr_i.inc.c @@ -156,7 +156,7 @@ void mr_i_act_2(void) { o->oMrISpinAngle = 120; if (o->oMrISpinAmount > 1 << 16) o->oAction = 3; - o->oMrISpinAngle -= 1; + o->oMrISpinAngle--; if (!o->oMrISpinAngle) { o->oMrISpinAngle = 120; o->oMrISpinAmount = 0; diff --git a/src/game/behaviors/pokey.inc.c b/src/game/behaviors/pokey.inc.c index df5d11f5..fc29ff56 100644 --- a/src/game/behaviors/pokey.inc.c +++ b/src/game/behaviors/pokey.inc.c @@ -58,15 +58,12 @@ void bhv_pokey_body_part_update(void) { // index by killing two body parts on the frame before a new part // spawns, but one of the body parts shifts upward immediately, // so not very interesting - if (o->oBehParams2ndByte > 1 - && !(o->parentObj->oPokeyAliveBodyPartFlags & (1 << (o->oBehParams2ndByte - 1)))) { - o->parentObj->oPokeyAliveBodyPartFlags = - o->parentObj->oPokeyAliveBodyPartFlags | 1 << (o->oBehParams2ndByte - 1); + if (o->oBehParams2ndByte > 1 && !(o->parentObj->oPokeyAliveBodyPartFlags & (1 << (o->oBehParams2ndByte - 1)))) { + o->parentObj->oPokeyAliveBodyPartFlags |= (1 << (o->oBehParams2ndByte - 1)); - o->parentObj->oPokeyAliveBodyPartFlags = - o->parentObj->oPokeyAliveBodyPartFlags & ((1 << o->oBehParams2ndByte) ^ ~0); + o->parentObj->oPokeyAliveBodyPartFlags &= ((1 << o->oBehParams2ndByte) ^ ~0); - o->oBehParams2ndByte -= 1; + o->oBehParams2ndByte--; } // Set the bottom body part size, and gradually increase it. @@ -109,7 +106,7 @@ void bhv_pokey_body_part_update(void) { // then die after a delay. if (obj_handle_attacks(&sPokeyBodyPartHitbox, o->oAction, sPokeyBodyPartAttackHandlers)) { - o->parentObj->oPokeyNumAliveBodyParts -= 1; + o->parentObj->oPokeyNumAliveBodyParts--; if (o->oBehParams2ndByte == 0) { o->parentObj->oPokeyHeadWasKilled = TRUE; // Last minute change to blue coins - not sure why they didn't @@ -123,7 +120,7 @@ void bhv_pokey_body_part_update(void) { cur_obj_become_intangible(); if (--o->oPokeyBodyPartDeathDelayAfterHeadKilled < 0) { - o->parentObj->oPokeyNumAliveBodyParts -= 1; + o->parentObj->oPokeyNumAliveBodyParts--; obj_die_if_health_non_positive(); } } else { @@ -208,9 +205,8 @@ static void pokey_act_wander(void) { MODEL_POKEY_BODY_PART, bhvPokeyBodyPart); if (bodyPart != NULL) { - o->oPokeyAliveBodyPartFlags = - o->oPokeyAliveBodyPartFlags | (1 << o->oPokeyNumAliveBodyParts); - o->oPokeyNumAliveBodyParts += 1; + o->oPokeyAliveBodyPartFlags |= (1 << o->oPokeyNumAliveBodyParts); + o->oPokeyNumAliveBodyParts++; o->oPokeyBottomBodyPartSize = 0.0f; obj_scale(bodyPart, 0.0f); @@ -234,7 +230,7 @@ static void pokey_act_wander(void) { if (!(o->oPokeyTurningAwayFromWall = obj_bounce_off_walls_edges_objects(&o->oPokeyTargetYaw))) { if (o->oPokeyChangeTargetTimer != 0) { - o->oPokeyChangeTargetTimer -= 1; + o->oPokeyChangeTargetTimer--; } else if (o->oDistanceToMario > 2000.0f) { o->oPokeyTargetYaw = obj_random_fixed_turn(0x2000); o->oPokeyChangeTargetTimer = random_linear_offset(30, 50); diff --git a/src/game/behaviors/recovery_heart.inc.c b/src/game/behaviors/recovery_heart.inc.c index 32f1de05..167011dc 100644 --- a/src/game/behaviors/recovery_heart.inc.c +++ b/src/game/behaviors/recovery_heart.inc.c @@ -16,7 +16,7 @@ void bhv_recovery_heart_loop(void) { if (obj_check_if_collided_with_object(o, gMarioObject)) { if (o->oSpinningHeartPlayedSound == 0) { cur_obj_play_sound_2(SOUND_GENERAL_HEART_SPIN); - o->oSpinningHeartPlayedSound += 1; + o->oSpinningHeartPlayedSound++; } o->oAngleVelYaw = (s32)(200.0f * gMarioStates[0].forwardVel) + 1000; diff --git a/src/game/behaviors/shock_wave.inc.c b/src/game/behaviors/shock_wave.inc.c index 9665f997..fc291726 100644 --- a/src/game/behaviors/shock_wave.inc.c +++ b/src/game/behaviors/shock_wave.inc.c @@ -16,7 +16,7 @@ void bhv_bowser_shock_wave_loop(void) { cur_obj_scale(o->oBowserShockWaveScale); // Slightly reduce opacity each 3 frames if (gGlobalTimer % 3) - o->oOpacity -= 1; + o->oOpacity--; // Reduce opacity faster after 70 frames have passed if (o->oTimer > fadeFrames) o->oOpacity -= 5; diff --git a/src/game/behaviors/skeeter.inc.c b/src/game/behaviors/skeeter.inc.c index f44c749d..0fc3cc6e 100644 --- a/src/game/behaviors/skeeter.inc.c +++ b/src/game/behaviors/skeeter.inc.c @@ -48,7 +48,7 @@ static void skeeter_act_idle(void) { && obj_smooth_turn(&o->oSkeeterAngleVel, &o->oMoveAngleYaw, o->oSkeeterTargetAngle, 0.02f, 5, 50, 200)) { if (o->oSkeeterWaitTime != 0) { - o->oSkeeterWaitTime -= 1; + o->oSkeeterWaitTime--; } else if (cur_obj_check_if_near_animation_end()) { cur_obj_play_sound_2(SOUND_OBJ_WALKING_WATER); o->oAction = SKEETER_ACT_LUNGE; @@ -116,7 +116,7 @@ static void skeeter_act_walk(void) { } else { o->oSkeeterTargetForwardVel = 10.0f; if (o->oSkeeterWaitTime != 0) { - o->oSkeeterWaitTime -= 1; + o->oSkeeterWaitTime--; } else if (cur_obj_check_if_near_animation_end() != 0) { if (random_u16() & 0x0003) { o->oSkeeterTargetAngle = obj_random_fixed_turn(0x2000); diff --git a/src/game/behaviors/snufit.inc.c b/src/game/behaviors/snufit.inc.c index 128527f2..1ea35cd1 100644 --- a/src/game/behaviors/snufit.inc.c +++ b/src/game/behaviors/snufit.inc.c @@ -105,7 +105,7 @@ void snufit_act_shoot(void) { if ((u16) o->oSnufitBodyScalePeriod == 0x8000 && o->oSnufitBodyBaseScale == 167) { o->oAction = SNUFIT_ACT_IDLE; } else if (o->oSnufitBullets < 3 && o->oTimer >= 3) { - o->oSnufitBullets += 1; + o->oSnufitBullets++; cur_obj_play_sound_2(SOUND_OBJ_SNUFIT_SHOOT); spawn_object_relative(0, 0, -20, 40, o, MODEL_BOWLING_BALL, bhvSnufitBalls); o->oSnufitRecoil = -30; diff --git a/src/game/behaviors/spiny.inc.c b/src/game/behaviors/spiny.inc.c index 46c0d838..76339013 100644 --- a/src/game/behaviors/spiny.inc.c +++ b/src/game/behaviors/spiny.inc.c @@ -46,7 +46,7 @@ static s32 spiny_check_active(void) { // behave similar to a regular goomba. // It can also be used on a bob-omb respawner to change its model // to a butterfly or fish. - o->parentObj->oEnemyLakituNumSpinies -= 1; + o->parentObj->oEnemyLakituNumSpinies--; obj_mark_for_deletion(o); return FALSE; } @@ -85,7 +85,7 @@ static void spiny_act_walk(void) { obj_bounce_off_walls_edges_objects(&o->oSpinyTargetYaw))) { // Walk and occasionally randomly change direction if (o->oSpinyTimeUntilTurn != 0) { - o->oSpinyTimeUntilTurn -= 1; + o->oSpinyTimeUntilTurn--; } else { o->oSpinyTargetYaw = o->oMoveAngleYaw + (s16) random_sign() * 0x2000; o->oSpinyTimeUntilTurn = random_linear_offset(100, 100); @@ -171,7 +171,7 @@ static void spiny_act_thrown_by_lakitu(void) { if (obj_check_attacks(&sSpinyHitbox, o->oAction)) { if (o->parentObj != o) { - o->parentObj->oEnemyLakituNumSpinies -= 1; + o->parentObj->oEnemyLakituNumSpinies--; } } } diff --git a/src/game/behaviors/swoop.inc.c b/src/game/behaviors/swoop.inc.c index 8e628cf4..84f0473d 100644 --- a/src/game/behaviors/swoop.inc.c +++ b/src/game/behaviors/swoop.inc.c @@ -61,7 +61,7 @@ static void swoop_act_move(void) { o->oFaceAngleRoll = 0; } else { if (o->oSwoopBonkCountdown != 0) { - o->oSwoopBonkCountdown -= 1; + o->oSwoopBonkCountdown--; } else if (o->oVelY != 0.0f) { // If we're not done swooping, turn toward mario. When between // 0 and 200 units above mario, increase speed and stop swooping diff --git a/src/game/behaviors/thi_top.inc.c b/src/game/behaviors/thi_top.inc.c index 727020d0..fe30463a 100644 --- a/src/game/behaviors/thi_top.inc.c +++ b/src/game/behaviors/thi_top.inc.c @@ -31,7 +31,7 @@ void bhv_thi_tiny_island_top_loop(void) { } else { gTHIWaterDrained |= 1; play_puzzle_jingle(); - o->oAction += 1; + o->oAction++; } } } else { diff --git a/src/game/behaviors/ttc_2d_rotator.inc.c b/src/game/behaviors/ttc_2d_rotator.inc.c index 46c7603e..0124bee1 100644 --- a/src/game/behaviors/ttc_2d_rotator.inc.c +++ b/src/game/behaviors/ttc_2d_rotator.inc.c @@ -51,7 +51,7 @@ void bhv_ttc_2d_rotator_update(void) { s32 startYaw = o->oFaceAngleYaw; if (o->oTTC2DRotatorRandomDirTimer != 0) { - o->oTTC2DRotatorRandomDirTimer -= 1; + o->oTTC2DRotatorRandomDirTimer--; } // Wait until rotated to target yaw diff --git a/src/game/behaviors/ttc_moving_bar.inc.c b/src/game/behaviors/ttc_moving_bar.inc.c index e54e3c42..2bee2193 100644 --- a/src/game/behaviors/ttc_moving_bar.inc.c +++ b/src/game/behaviors/ttc_moving_bar.inc.c @@ -43,7 +43,7 @@ static void ttc_moving_bar_act_wait(void) { // This is zero except on the first cycle, and is used to desync the // bars from each other at the very beginning if (o->oTTCMovingBarStoppedTimer != 0) { - o->oTTCMovingBarStoppedTimer -= 1; + o->oTTCMovingBarStoppedTimer--; } else { if (gTTCSpeedSetting == TTC_SPEED_RANDOM) { // Set the delay for the next cycle @@ -70,7 +70,7 @@ static void ttc_moving_bar_act_pull_back(void) { if ((o->oTTCMovingBarSpeed += 0.73f) > 0.0f) { // Possibly pause after pulling back if (o->oTTCMovingBarStoppedTimer != 0) { - o->oTTCMovingBarStoppedTimer -= 1; + o->oTTCMovingBarStoppedTimer--; o->oTTCMovingBarSpeed = 0.0f; } else { // Begin extending diff --git a/src/game/behaviors/ttc_pendulum.inc.c b/src/game/behaviors/ttc_pendulum.inc.c index 569b4f15..a096c124 100644 --- a/src/game/behaviors/ttc_pendulum.inc.c +++ b/src/game/behaviors/ttc_pendulum.inc.c @@ -42,7 +42,7 @@ void bhv_ttc_pendulum_update(void) { // Stay still for a while if (o->oTTCPendulumDelay != 0) { - o->oTTCPendulumDelay -= 1; + o->oTTCPendulumDelay--; } else { // Accelerate in the direction that moves angle to zero if (o->oTTCPendulumAngle * o->oTTCPendulumAccelDir > 0.0f) { diff --git a/src/game/behaviors/water_bomb.inc.c b/src/game/behaviors/water_bomb.inc.c index 41333803..b4383672 100644 --- a/src/game/behaviors/water_bomb.inc.c +++ b/src/game/behaviors/water_bomb.inc.c @@ -39,7 +39,7 @@ void bhv_water_bomb_spawner_update(void) { if (!o->oWaterBombSpawnerBombActive && latDistToMario < spawnerRadius && gMarioObject->oPosY - o->oPosY < 1000.0f) { if (o->oWaterBombSpawnerTimeToSpawn != 0) { - o->oWaterBombSpawnerTimeToSpawn -= 1; + o->oWaterBombSpawnerTimeToSpawn--; } else { struct Object *waterBomb = spawn_object_relative(0, 0, 2000, 0, o, MODEL_WATER_BOMB, bhvWaterBomb); @@ -50,10 +50,8 @@ void bhv_water_bomb_spawner_update(void) { waterBomb->oAction = WATER_BOMB_ACT_INIT; - waterBomb->oPosX = - gMarioObject->oPosX + waterBombDistToMario * sins(gMarioObject->oMoveAngleYaw); - waterBomb->oPosZ = - gMarioObject->oPosZ + waterBombDistToMario * coss(gMarioObject->oMoveAngleYaw); + waterBomb->oPosX = gMarioObject->oPosX + waterBombDistToMario * sins(gMarioObject->oMoveAngleYaw); + waterBomb->oPosZ = gMarioObject->oPosZ + waterBombDistToMario * coss(gMarioObject->oMoveAngleYaw); spawn_object(waterBomb, MODEL_WATER_BOMB_SHADOW, bhvWaterBombShadow); diff --git a/src/game/behaviors/water_bomb_cannon.inc.c b/src/game/behaviors/water_bomb_cannon.inc.c index a606d48d..8e884452 100644 --- a/src/game/behaviors/water_bomb_cannon.inc.c +++ b/src/game/behaviors/water_bomb_cannon.inc.c @@ -52,14 +52,14 @@ void water_bomb_cannon_act_1(void) { o->oAction = 2; } else if (o->oBehParams2ndByte == 0) { if (o->oWaterCannonIdleTimer != 0) { - o->oWaterCannonIdleTimer -= 1; + o->oWaterCannonIdleTimer--; } else { obj_move_pitch_approach(o->oWaterCannonTargetMovePitch, 0x80); obj_face_yaw_approach(o->oWaterCannonTargetFaceYaw, 0x100); if ((s16) o->oFaceAngleYaw == (s16) o->oWaterCannonTargetFaceYaw) { if (o->oWaterCannonRotationTimer != 0) { - o->oWaterCannonRotationTimer -= 1; + o->oWaterCannonRotationTimer--; } else { cur_obj_play_sound_2(SOUND_OBJ_CANNON4); o->oWaterCannonIdleTimer = 70; diff --git a/src/game/behaviors/wiggler.inc.c b/src/game/behaviors/wiggler.inc.c index 718245af..410297ec 100644 --- a/src/game/behaviors/wiggler.inc.c +++ b/src/game/behaviors/wiggler.inc.c @@ -234,7 +234,7 @@ static void wiggler_act_walk(void) { obj_forward_vel_approach(sWigglerSpeeds[o->oHealth - 1], 1.0f); if (o->oWigglerWalkAwayFromWallTimer != 0) { - o->oWigglerWalkAwayFromWallTimer -= 1; + o->oWigglerWalkAwayFromWallTimer--; } else { if (o->oDistanceToMario >= 25000.0f) { // If >1200 away from home, turn to home @@ -250,7 +250,7 @@ static void wiggler_act_walk(void) { if (o->oHealth < 4) { o->oWigglerTargetYaw = o->oAngleToMario; } else if (o->oWigglerTimeUntilRandomTurn != 0) { - o->oWigglerTimeUntilRandomTurn -= 1; + o->oWigglerTimeUntilRandomTurn--; } else { o->oWigglerTargetYaw = o->oMoveAngleYaw + 0x4000 * (s16) random_sign(); o->oWigglerTimeUntilRandomTurn = random_linear_offset(30, 50); diff --git a/src/game/camera.c b/src/game/camera.c index 3f9f871b..d21c8f20 100644 --- a/src/game/camera.c +++ b/src/game/camera.c @@ -3396,7 +3396,7 @@ s32 move_point_along_spline(Vec3f p, struct CutsceneSplinePoint spline[], s16 *s *splineSegment = 0; finished = 1; } - *progress -= 1; + (*progress)--; } return finished; } @@ -5397,17 +5397,17 @@ u32 surface_type_modes(struct Camera *c) { switch (sMarioGeometry.currFloorType) { case SURFACE_CLOSE_CAMERA: transition_to_camera_mode(c, CAMERA_MODE_CLOSE, 90); - modeChanged += 1; + modeChanged++; break; case SURFACE_CAMERA_FREE_ROAM: transition_to_camera_mode(c, CAMERA_MODE_FREE_ROAM, 90); - modeChanged += 1; + modeChanged++; break; case SURFACE_NO_CAM_COL_SLIPPERY: transition_to_camera_mode(c, CAMERA_MODE_CLOSE, 90); - modeChanged += 1; + modeChanged++; break; } return modeChanged; @@ -6255,12 +6255,12 @@ void copy_spline_segment(struct CutsceneSplinePoint dst[], struct CutsceneSpline s32 i = 0; init_spline_point(&dst[i], src[j].index, src[j].speed, src[j].point); - i += 1; + i++; do { do { init_spline_point(&dst[i], src[j].index, src[j].speed, src[j].point); - i += 1; - j += 1; + i++; + j++; } while (src[j].index != -1); } while (j > 16); @@ -6940,12 +6940,6 @@ void cutscene_dance_rotate_move_towards_mario(struct Camera *c) { rotate_and_move_vec3f(c->pos, sMarioCamState->pos, 20.f, 0, 0); } -/** - * Speculated to be dance-related due to its proximity to the other dance functions - */ -UNUSED static void cutscene_dance_unused(UNUSED struct Camera *c) { -} - /** * Slowly turn to the point 100 units in front of Mario */ @@ -8270,7 +8264,7 @@ void cutscene_read_message(struct Camera *c) { // Do nothing until message is gone. case 0: if (get_dialog_id() != DIALOG_NONE) { - sCutsceneVars[0].angle[0] += 1; + sCutsceneVars[0].angle[0]++; set_time_stop_flags(TIME_STOP_ENABLED | TIME_STOP_DIALOG); } break; @@ -10305,12 +10299,12 @@ void play_cutscene(struct Camera *c) { if ((cutsceneDuration != 0) && !(gCutsceneTimer & CUTSCENE_STOP)) { if (gCutsceneTimer < CUTSCENE_LOOP) { - gCutsceneTimer += 1; + gCutsceneTimer++; } //! Because gCutsceneTimer is often set to 0x7FFF (CUTSCENE_LOOP), this conditional can only //! check for == due to overflow if (gCutsceneTimer == cutsceneDuration) { - sCutsceneShot += 1; + sCutsceneShot++; gCutsceneTimer = 0; } } else { diff --git a/src/game/debug.c b/src/game/debug.c index 58e38d72..53502e88 100644 --- a/src/game/debug.c +++ b/src/game/debug.c @@ -96,7 +96,7 @@ void print_text_array_info(s16 *printState, const char *str, s32 number) { || (printState[DEBUG_PSTATE_MAX_X_CURSOR] < printState[DEBUG_PSTATE_Y_CURSOR])) { print_text(printState[DEBUG_PSTATE_X_CURSOR], printState[DEBUG_PSTATE_Y_CURSOR], "DPRINT OVER"); - printState[DEBUG_PSTATE_DISABLED] += 1; // why not just = TRUE... + printState[DEBUG_PSTATE_DISABLED] = TRUE; } else { print_text_fmt_int(printState[DEBUG_PSTATE_X_CURSOR], printState[DEBUG_PSTATE_Y_CURSOR], str, number); @@ -201,7 +201,7 @@ void print_string_array_info(const char **strArr) { s32 i; if (!sDebugStringArrPrinted) { - sDebugStringArrPrinted += 1; // again, why not = TRUE... + sDebugStringArrPrinted = TRUE; for (i = 0; i < 8; i++) { // sDebugPage is assumed to be 4 or 5 here. print_debug_top_down_mapinfo(strArr[i], gDebugInfo[sDebugPage][i]); @@ -240,7 +240,7 @@ void update_debug_dpadmask(void) { } else { sDebugInfoDPadMask = 0; } - sDebugInfoDPadUpdID += 1; + sDebugInfoDPadUpdID++; if (sDebugInfoDPadUpdID >= 8) { sDebugInfoDPadUpdID = 6; // rapidly set to 6 from 8 as long as dPadMask is being set. } @@ -249,7 +249,7 @@ void update_debug_dpadmask(void) { void debug_unknown_level_select_check(void) { if (!sDebugLvSelectCheckFlag) { - sDebugLvSelectCheckFlag += 1; // again, just do = TRUE... + sDebugLvSelectCheckFlag = TRUE; if (!gDebugLevelSelect) { gDebugInfoFlags = DEBUG_INFO_NOFLAGS; @@ -291,7 +291,7 @@ UNUSED static void check_debug_button_seq(void) { } else { if ((s16)(cButtonMask = (gPlayer1Controller->buttonPressed & C_BUTTONS))) { if (buttonArr[sDebugInfoButtonSeqID] == cButtonMask) { - sDebugInfoButtonSeqID += 1; + sDebugInfoButtonSeqID++; if (buttonArr[sDebugInfoButtonSeqID] == -1) { if (gDebugInfoFlags == DEBUG_INFO_FLAG_ALL) { gDebugInfoFlags = DEBUG_INFO_FLAG_LSELECT; @@ -314,11 +314,11 @@ UNUSED static void try_change_debug_page(void) { if (gDebugInfoFlags & DEBUG_INFO_FLAG_DPRINT) { if ((gPlayer1Controller->buttonPressed & L_JPAD) && (gPlayer1Controller->buttonDown & (L_TRIG | R_TRIG))) { - sDebugPage += 1; + sDebugPage++; } if ((gPlayer1Controller->buttonPressed & R_JPAD) && (gPlayer1Controller->buttonDown & (L_TRIG | R_TRIG))) { - sDebugPage -= 1; + sDebugPage--; } if (sDebugPage >= (DEBUG_PAGE_MAX + 1)) { sDebugPage = DEBUG_PAGE_MIN; @@ -351,14 +351,14 @@ void try_modify_debug_controls(void) { } if (sDebugInfoDPadMask & U_JPAD) { - sDebugSysCursor -= 1; + sDebugSysCursor--; if (sDebugSysCursor < 0) { sDebugSysCursor = 0; } } if (sDebugInfoDPadMask & D_JPAD) { - sDebugSysCursor += 1; + sDebugSysCursor++; if (sDebugSysCursor >= 8) { sDebugSysCursor = 7; } diff --git a/src/game/debug_course.c b/src/game/debug_course.c deleted file mode 100644 index f3fcc46c..00000000 --- a/src/game/debug_course.c +++ /dev/null @@ -1,7 +0,0 @@ -#include "debug_course.h" - -// This is a seperate file according to Europe/Shindou -// versions. It is unknown what this file was for. - -void nop_change_course(void) { -} diff --git a/src/game/debug_course.h b/src/game/debug_course.h deleted file mode 100644 index 8d094e09..00000000 --- a/src/game/debug_course.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef DEBUG_COURSE_H -#define DEBUG_COURSE_H - -void nop_change_course(void); - -#endif // DEBUG_COURSE_H diff --git a/src/game/envfx_bubbles.c b/src/game/envfx_bubbles.c index 18a30e09..de7eb6b5 100644 --- a/src/game/envfx_bubbles.c +++ b/src/game/envfx_bubbles.c @@ -83,7 +83,7 @@ void envfx_update_flower(Vec3s centerPos) { (gEnvFxBuffer + i)->isAlive = 1; (gEnvFxBuffer + i)->animFrame = random_float() * 5.0f; } else if ((timer & 0x03) == 0) { - (gEnvFxBuffer + i)->animFrame += 1; + (gEnvFxBuffer + i)->animFrame++; if ((gEnvFxBuffer + i)->animFrame > 5) { (gEnvFxBuffer + i)->animFrame = 0; } @@ -154,7 +154,7 @@ void envfx_update_lava(Vec3s centerPos) { envfx_set_lava_bubble_position(i, centerPos); (gEnvFxBuffer + i)->isAlive = 1; } else if ((timer & 0x01) == 0) { - (gEnvFxBuffer + i)->animFrame += 1; + (gEnvFxBuffer + i)->animFrame++; if ((gEnvFxBuffer + i)->animFrame > 8) { (gEnvFxBuffer + i)->isAlive = 0; (gEnvFxBuffer + i)->animFrame = 0; diff --git a/src/game/interaction.c b/src/game/interaction.c index 723e490b..d8ae718e 100644 --- a/src/game/interaction.c +++ b/src/game/interaction.c @@ -1440,8 +1440,8 @@ u32 interact_koopa_shell(struct MarioState *m, UNUSED u32 interactType, struct O if (interaction == INT_HIT_FROM_ABOVE || m->action == ACT_WALKING || m->action == ACT_HOLD_WALKING) { m->interactObj = obj; - m->usedObj = obj; - m->riddenObj = obj; + m->usedObj = obj; + m->riddenObj = obj; attack_object(obj, interaction); update_mario_sound_and_camera(m); @@ -1503,9 +1503,9 @@ u32 interact_pole(struct MarioState *m, UNUSED u32 interactType, struct Object * #endif m->interactObj = obj; - m->usedObj = obj; - m->vel[1] = 0.0f; - m->forwardVel = 0.0f; + m->usedObj = obj; + m->vel[1] = 0.0f; + m->forwardVel = 0.0f; marioObj->oMarioPoleUnk108 = 0; marioObj->oMarioPoleYawVel = 0; @@ -1651,22 +1651,10 @@ u32 mario_can_talk(struct MarioState *m, u32 arg) { return FALSE; } -#ifdef VERSION_JP -#define READ_MASK (INPUT_B_PRESSED) -#else -#define READ_MASK (INPUT_B_PRESSED | INPUT_A_PRESSED) -#endif - -#ifdef VERSION_JP -#define SIGN_RANGE 0x38E3 -#else -#define SIGN_RANGE 0x4000 -#endif - u32 check_read_sign(struct MarioState *m, struct Object *obj) { - if ((m->input & READ_MASK) && mario_can_talk(m, 0) && object_facing_mario(m, obj, SIGN_RANGE)) { + if ((m->input & (INPUT_B_PRESSED | INPUT_A_PRESSED)) && mario_can_talk(m, 0) && object_facing_mario(m, obj, 0x4000)) { s16 facingDYaw = (s16)(obj->oMoveAngleYaw + 0x8000) - m->faceAngle[1]; - if (facingDYaw >= -SIGN_RANGE && facingDYaw <= SIGN_RANGE) { + if (facingDYaw >= -0x4000 && facingDYaw <= 0x4000) { f32 targetX = obj->oPosX + 105.0f * sins(obj->oMoveAngleYaw); f32 targetZ = obj->oPosZ + 105.0f * coss(obj->oMoveAngleYaw); @@ -1684,7 +1672,7 @@ u32 check_read_sign(struct MarioState *m, struct Object *obj) { } u32 check_npc_talk(struct MarioState *m, struct Object *obj) { - if ((m->input & READ_MASK) && mario_can_talk(m, 1)) { + if ((m->input & (INPUT_B_PRESSED | INPUT_A_PRESSED)) && mario_can_talk(m, 1)) { s16 facingDYaw = mario_obj_angle_to_object(m, obj) - m->faceAngle[1]; if (facingDYaw >= -0x4000 && facingDYaw <= 0x4000) { obj->oInteractStatus = INT_STATUS_INTERACTED; @@ -1765,7 +1753,7 @@ void mario_process_interactions(struct MarioState *m) { } if (m->invincTimer > 0 && !sDelayInvincTimer) { - m->invincTimer -= 1; + m->invincTimer--; } //! If the kick/punch flags are set and an object collision changes Mario's @@ -1847,12 +1835,8 @@ void mario_handle_special_floors(struct MarioState *m) { break; } - if (!(m->action & ACT_FLAG_AIR) && !(m->action & ACT_FLAG_SWIMMING)) { - switch (floorType) { - case SURFACE_BURNING: - check_lava_boost(m); - break; - } + if (!(m->action & ACT_FLAG_AIR) && !(m->action & ACT_FLAG_SWIMMING) && (floorType == SURFACE_BURNING)) { + check_lava_boost(m); } } } diff --git a/src/game/level_update.c b/src/game/level_update.c index 895868c6..318625df 100644 --- a/src/game/level_update.c +++ b/src/game/level_update.c @@ -19,7 +19,6 @@ #include "ingame_menu.h" #include "obj_behaviors.h" #include "save_file.h" -#include "debug_course.h" #if MULTILANG #include "memory.h" #include "eu_translation.h" @@ -874,7 +873,7 @@ void initiate_delayed_warp(void) { case WARP_OP_CREDITS_NEXT: sound_banks_disable(SEQ_PLAYER_SFX, SOUND_BANKS_ALL); - gCurrCreditsEntry += 1; + gCurrCreditsEntry++; gCurrActNum = gCurrCreditsEntry->actNum & 0x07; if ((gCurrCreditsEntry + 1)->levelNum == LEVEL_NONE) { destWarpNode = WARP_NODE_CREDITS_END; @@ -915,7 +914,7 @@ void update_hud_values(void) { } if (gHudDisplay.coins < gMarioState->numCoins) { - if (gGlobalTimer & 0x00000001) { + if (gGlobalTimer & 0x1) { u32 coinSound; if (gMarioState->action & (ACT_FLAG_SWIMMING | ACT_FLAG_METAL_WATER)) { coinSound = SOUND_GENERAL_COIN_WATER; @@ -923,7 +922,7 @@ void update_hud_values(void) { coinSound = SOUND_GENERAL_COIN; } - gHudDisplay.coins += 1; + gHudDisplay.coins++; play_sound(coinSound, gMarioState->marioObj->header.gfx.cameraToObject); } } @@ -998,7 +997,7 @@ s32 play_mode_normal(void) { check_instant_warp(); if (sTimerRunning && gHudDisplay.timer < 17999) { - gHudDisplay.timer += 1; + gHudDisplay.timer++; } area_update_objects(); @@ -1098,7 +1097,7 @@ s32 play_mode_change_area(void) { } if (sTransitionTimer > 0) { - sTransitionTimer -= 1; + sTransitionTimer--; } if (sTransitionTimer == 0) { @@ -1341,7 +1340,6 @@ s32 lvl_set_current_level(UNUSED s16 arg0, s32 levelNum) { if (gSavedCourseNum != gCurrCourseNum) { gSavedCourseNum = gCurrCourseNum; - nop_change_course(); disable_warp_checkpoint(); } diff --git a/src/game/mario.c b/src/game/mario.c index 2d6f7474..273de3b1 100644 --- a/src/game/mario.c +++ b/src/game/mario.c @@ -1167,11 +1167,10 @@ void squish_mario_model(struct MarioState *m) { if (m->squishTimer != 0xFF) { // If no longer squished, scale back to default. if (m->squishTimer == 0) { - vec3f_set(m->marioObj->header.gfx.scale, 1.0f, 1.0f, 1.0f); - } + vec3_same(m->marioObj->header.gfx.scale, 1.0f); // If timer is less than 16, rubber-band Mario's size scale up and down. - else if (m->squishTimer <= 16) { - m->squishTimer -= 1; + } else if (m->squishTimer <= 16) { + m->squishTimer--; m->marioObj->header.gfx.scale[1] = 1.0f - ((sSquishScaleOverTime[15 - m->squishTimer] * 0.6f) / 100.0f); @@ -1180,7 +1179,7 @@ void squish_mario_model(struct MarioState *m) { m->marioObj->header.gfx.scale[2] = m->marioObj->header.gfx.scale[0]; } else { - m->squishTimer -= 1; + m->squishTimer--; vec3f_set(m->marioObj->header.gfx.scale, 1.4f, 0.4f, 1.4f); } @@ -1243,13 +1242,13 @@ void update_mario_button_inputs(struct MarioState *m) { if (m->input & INPUT_A_PRESSED) { m->framesSinceA = 0; } else if (m->framesSinceA < 0xFF) { - m->framesSinceA += 1; + m->framesSinceA++; } if (m->input & INPUT_B_PRESSED) { m->framesSinceB = 0; } else if (m->framesSinceB < 0xFF) { - m->framesSinceB += 1; + m->framesSinceB++; } } @@ -1585,7 +1584,7 @@ u32 update_and_return_cap_flags(struct MarioState *m) { if ((m->capTimer <= 60) || ((action != ACT_READING_AUTOMATIC_DIALOG) && (action != ACT_READING_NPC_DIALOG) && (action != ACT_READING_SIGN) && (action != ACT_IN_CANNON))) { - m->capTimer -= 1; + m->capTimer--; } if (m->capTimer == 0) { diff --git a/src/game/mario_actions_airborne.c b/src/game/mario_actions_airborne.c index 473ccc43..f935135e 100644 --- a/src/game/mario_actions_airborne.c +++ b/src/game/mario_actions_airborne.c @@ -1545,7 +1545,7 @@ s32 act_lava_boost(struct MarioState *m) { if (m->actionState < 2 && m->vel[1] < 0.0f) { m->vel[1] = -m->vel[1] * 0.4f; mario_set_forward_vel(m, m->forwardVel * 0.5f); - m->actionState += 1; + m->actionState++; } else { set_mario_action(m, ACT_LAVA_BOOST_LAND, 0); } diff --git a/src/game/mario_misc.c b/src/game/mario_misc.c index 8e6f720a..5740afdd 100644 --- a/src/game/mario_misc.c +++ b/src/game/mario_misc.c @@ -477,12 +477,10 @@ Gfx *geo_mario_hand_foot_scaler(s32 callContext, struct GraphNode *node, UNUSED scaleNode->scale = 1.0f; if (asGenerated->parameter == bodyState->punchState >> 6) { if (sMarioAttackAnimCounter != gAreaUpdateCounter && (bodyState->punchState & 0x3F) > 0) { - bodyState->punchState -= 1; + bodyState->punchState--; sMarioAttackAnimCounter = gAreaUpdateCounter; } - scaleNode->scale = - gMarioAttackScaleAnimation[asGenerated->parameter * 6 + (bodyState->punchState & 0x3F)] - / 10.0f; + scaleNode->scale = gMarioAttackScaleAnimation[asGenerated->parameter * 6 + (bodyState->punchState & 0x3F)] / 10.0f; } } return NULL; diff --git a/src/game/obj_behaviors_2.c b/src/game/obj_behaviors_2.c index 63c61322..dab8f3a7 100644 --- a/src/game/obj_behaviors_2.c +++ b/src/game/obj_behaviors_2.c @@ -146,7 +146,7 @@ static void platform_on_track_update_pos_or_spawn_ball(s32 ballIndex, f32 x, f32 do { prevWaypoint = nextWaypoint; - nextWaypoint += 1; + nextWaypoint++; if (nextWaypoint->flags == WAYPOINT_FLAGS_END) { if (ballIndex == 0) { o->oPlatformOnTrackPrevWaypointFlags = WAYPOINT_FLAGS_END; @@ -470,10 +470,9 @@ static s32 oscillate_toward(s32 *value, f32 *vel, s32 target, f32 velCloseToZero return FALSE; } -static void obj_update_blinking(s32 *blinkTimer, s16 baseCycleLength, s16 cycleLengthRange, - s16 blinkLength) { +static void obj_update_blinking(s32 *blinkTimer, s16 baseCycleLength, s16 cycleLengthRange, s16 blinkLength) { if (*blinkTimer != 0) { - *blinkTimer -= 1; + (*blinkTimer)--; } else { *blinkTimer = random_linear_offset(baseCycleLength, cycleLengthRange); } diff --git a/src/game/object_list_processor.c b/src/game/object_list_processor.c index 02b5fefd..62c21907 100644 --- a/src/game/object_list_processor.c +++ b/src/game/object_list_processor.c @@ -285,7 +285,7 @@ s32 update_objects_starting_at(struct ObjectNode *objList, struct ObjectNode *fi cur_obj_update(); firstObj = firstObj->next; - count += 1; + count++; } return count; @@ -543,7 +543,7 @@ void update_non_terrain_objects(void) { s32 i = 2; while ((listIndex = sObjectListUpdateOrder[i]) != -1) { gObjectCounter += update_objects_in_list(&gObjectLists[listIndex]); - i += 1; + i++; } } @@ -556,7 +556,7 @@ void unload_deactivated_objects(void) { s32 i = 0; while ((listIndex = sObjectListUpdateOrder[i]) != -1) { unload_deactivated_objects_in_list(&gObjectLists[listIndex]); - i += 1; + i++; } // TIME_STOP_UNKNOWN_0 was most likely intended to be used to track whether diff --git a/src/game/puppycam2.c b/src/game/puppycam2.c index 057248b6..c53b0397 100644 --- a/src/game/puppycam2.c +++ b/src/game/puppycam2.c @@ -54,7 +54,7 @@ struct MemoryPool *gPuppyMemoryPool; s32 gPuppyError = 0; #if defined(VERSION_EU) -static unsigned char gPCOptionStringsFR[][64] = {{NC_ANALOGUE_FR}, {NC_CAMX_FR}, {NC_CAMY_FR}, {NC_INVERTX_FR}, {NC_INVERTY_FR}, {NC_CAMC_FR}, {NC_SCHEME_FR}, {NC_WIDE_FR}, {OPTION_LANGUAGE_FR}}; +static unsigned char gPCOptionStringsFR[][64] = {{NC_ANALOGUE_FR}, {NC_CAMX_FR}, {NC_CAMY_FR}, {NC_INVERTX_FR}, {NC_INVERTY_FR}, {NC_CAMC_FR}, {NC_SCHEME_FR}, {NC_WIDE_FR}, {OPTION_LANGUAGE_FR}}; static unsigned char gPCOptionStringsDE[][64] = {{NC_ANALOGUE_DE}, {NC_CAMX_DE}, {NC_CAMY_DE}, {NC_INVERTX_DE}, {NC_INVERTY_DE}, {NC_CAMC_DE}, {NC_SCHEME_DE}, {NC_WIDE_DE}, {OPTION_LANGUAGE_DE}}; static unsigned char gPCFlagStringsFR[][64] = {{OPTION_DISABLED_FR}, {OPTION_ENABLED_FR}, {OPTION_SCHEME1_FR}, {OPTION_SCHEME2_FR}, {OPTION_SCHEME3_FR}, {TEXT_ENGLISH}, {TEXT_FRENCH}, {TEXT_GERMAN},}; static unsigned char gPCFlagStringsDE[][64] = {{OPTION_DISABLED_DE}, {OPTION_ENABLED_DE}, {OPTION_SCHEME1_DE}, {OPTION_SCHEME2_DE}, {OPTION_SCHEME3_DE}, {TEXT_ENGLISH}, {TEXT_FRENCH}, {TEXT_GERMAN},}; @@ -83,12 +83,12 @@ struct gPCOptionStruct }; static const struct gPCOptionStruct gPCOptions[] = { //If the min and max are 0 and 1, then the value text is used, otherwise it's ignored. - #ifdef WIDE +#ifdef WIDE {/*Option Name*/ 7, /*Option Variable*/ &gConfig.widescreen, /*Option Value Text Start*/ 0, /*Option Minimum*/ FALSE, /*Option Maximum*/ TRUE}, - #endif - #if MULTILANG +#endif +#if MULTILANG {/*Option Name*/ 8, /*Option Variable*/ &gInGameLanguage, /*Option Value Text Start*/ 4, /*Option Minimum*/ 1, /*Option Maximum*/ 3}, - #endif +#endif {/*Option Name*/ 0, /*Option Variable*/ &gPuppyCam.options.analogue, /*Option Value Text Start*/ 0, /*Option Minimum*/ FALSE, /*Option Maximum*/ TRUE}, {/*Option Name*/ 6, /*Option Variable*/ &gPuppyCam.options.inputType, /*Option Value Text Start*/ 2, /*Option Minimum*/ 0, /*Option Maximum*/ 2}, {/*Option Name*/ 1, /*Option Variable*/ &gPuppyCam.options.sensitivityX, /*Option Value Text Start*/ 255, /*Option Minimum*/ 10, /*Option Maximum*/ 500}, @@ -100,97 +100,87 @@ static const struct gPCOptionStruct gPCOptions[] = { //If the min and max are 0 u8 gPCOptionCap = sizeof(gPCOptions) / sizeof(struct gPCOptionStruct); //How many options there are in newcam_uptions. -s16 LENSIN(s16 length, s16 direction) -{ +s16 LENSIN(s16 length, s16 direction) { return (length * sins(direction)); } -s16 LENCOS(s16 length, s16 direction) -{ +s16 LENCOS(s16 length, s16 direction) { return (length * coss(direction)); } -static void puppycam_analogue_stick(void) -{ - #ifdef TARGET_N64 - if (!gPuppyCam.options.analogue) +static void puppycam_analogue_stick(void) { +#ifdef TARGET_N64 + if (!gPuppyCam.options.analogue) { return; - - //I make the X axis negative, so that the movement reflects the Cbuttons. + } + // I make the X axis negative, so that the movement reflects the Cbuttons. gPuppyCam.stick2[0] = -gPlayer2Controller->rawStickX; - gPuppyCam.stick2[1] = gPlayer2Controller->rawStickY; + gPuppyCam.stick2[1] = gPlayer2Controller->rawStickY; - if (ABS(gPuppyCam.stick2[0]) < DEADZONE) - { + if (ABS(gPuppyCam.stick2[0]) < DEADZONE) { gPuppyCam.stick2[0] = 0; gPuppyCam.stickN[0] = 0; } - if (ABS(gPuppyCam.stick2[1]) < DEADZONE) - { + if (ABS(gPuppyCam.stick2[1]) < DEADZONE) { gPuppyCam.stick2[1] = 0; gPuppyCam.stickN[1] = 0; } - #endif +#endif } -void puppycam_default_config(void) -{ - gPuppyCam.options.invertX = 1; - gPuppyCam.options.invertY = 1; - gPuppyCam.options.sensitivityX = 100; - gPuppyCam.options.sensitivityY = 100; +void puppycam_default_config(void) { + gPuppyCam.options.invertX = 1; + gPuppyCam.options.invertY = 1; + gPuppyCam.options.sensitivityX = 100; + gPuppyCam.options.sensitivityY = 100; gPuppyCam.options.turnAggression = 50; - gPuppyCam.options.analogue = 0; - gPuppyCam.options.inputType = 1; + gPuppyCam.options.analogue = 0; + gPuppyCam.options.inputType = 1; } -//Initial setup. Ran at the beginning of the game and never again. -void puppycam_boot(void) -{ +// Initial setup. Ran at the beginning of the game and never again. +void puppycam_boot(void) { gPuppyCam.zoomPoints[0] = 600; gPuppyCam.zoomPoints[1] = 1000; gPuppyCam.zoomPoints[2] = 1500; - gPuppyCam.povHeight = 125; - gPuppyCam.stick2[0] = 0; - gPuppyCam.stick2[1] = 0; - gPuppyCam.stickN[0] = 0; - gPuppyCam.stickN[1] = 0; - gPuppyMemoryPool = mem_pool_init(MAX_PUPPYCAM_VOLUMES * sizeof(struct sPuppyVolume), MEMORY_POOL_LEFT); - gPuppyVolumeCount = 0; - gPuppyCam.enabled = 1; + gPuppyCam.povHeight = 125; + gPuppyCam.stick2[0] = 0; + gPuppyCam.stick2[1] = 0; + gPuppyCam.stickN[0] = 0; + gPuppyCam.stickN[1] = 0; + gPuppyMemoryPool = mem_pool_init(MAX_PUPPYCAM_VOLUMES * sizeof(struct sPuppyVolume), MEMORY_POOL_LEFT); + gPuppyVolumeCount = 0; + gPuppyCam.enabled = 1; puppycam_get_save(); } -//Called when an instant warp is done. -void puppycam_warp(f32 displacementX, f32 displacementY, f32 displacementZ) -{ - gPuppyCam.pos[0] += displacementX; - gPuppyCam.pos[1] += displacementY; - gPuppyCam.pos[2] += displacementZ; - gPuppyCam.targetFloorHeight += displacementY; +// Called when an instant warp is done. +void puppycam_warp(f32 displacementX, f32 displacementY, f32 displacementZ) { + gPuppyCam.pos[0] += displacementX; + gPuppyCam.pos[1] += displacementY; + gPuppyCam.pos[2] += displacementZ; + gPuppyCam.targetFloorHeight += displacementY; gPuppyCam.lastTargetFloorHeight += displacementY; - gPuppyCam.floorY[0] += displacementY; - gPuppyCam.floorY[1] += displacementY; + gPuppyCam.floorY[0] += displacementY; + gPuppyCam.floorY[1] += displacementY; } #if MULTILANG -static void newcam_set_language(void) -{ - switch (gInGameLanguage-1) - { - case 0: +static void newcam_set_language(void) { + switch (gInGameLanguage - 1) { + case LANGUAGE_ENGLISH: gPCOptionStringsPtr = &gPCOptionStringsEN; - gPCFlagStringsPtr = &gPCFlagStringsEN; + gPCFlagStringsPtr = &gPCFlagStringsEN; gPCToggleStringsPtr = &gPCToggleStringsEN; break; - case 1: + case LANGUAGE_FRENCH: gPCOptionStringsPtr = &gPCOptionStringsFR; - gPCFlagStringsPtr = &gPCFlagStringsFR; + gPCFlagStringsPtr = &gPCFlagStringsFR; gPCToggleStringsPtr = &gPCToggleStringsFR; break; - case 2: + case LANGUAGE_GERMAN: gPCOptionStringsPtr = &gPCOptionStringsDE; - gPCFlagStringsPtr = &gPCFlagStringsDE; + gPCFlagStringsPtr = &gPCFlagStringsDE; gPCToggleStringsPtr = &gPCToggleStringsDE; break; } @@ -200,9 +190,9 @@ static void newcam_set_language(void) ///CUTSCENE void puppycam_activate_cutscene(s32 (*scene)(), s32 lockinput) { - gPuppyCam.cutscene = 1; + gPuppyCam.cutscene = 1; gPuppyCam.sceneTimer = 0; - gPuppyCam.sceneFunc = scene; + gPuppyCam.sceneFunc = scene; gPuppyCam.sceneInput = lockinput; } @@ -226,32 +216,34 @@ static void puppycam_evaluate_spline(f32 progress, Vec3s cameraPos, Vec3f spline cameraPos[2] = tempP[0] * spline1[2] + tempP[1] * spline2[2] + tempP[2] * spline3[2] + tempP[3] * spline4[2]; } -s32 puppycam_move_spline(struct sPuppySpline splinePos[], struct sPuppySpline splineFocus[], s32 mode, s32 index) -{ +s32 puppycam_move_spline(struct sPuppySpline splinePos[], struct sPuppySpline splineFocus[], s32 mode, s32 index) { Vec3f tempPoints[4]; f32 tempProgress[2] = {0.0f, 0.0f}; f32 progChange = 0.0f; s32 i; Vec3f prevPos; - if (gPuppyCam.splineIndex == 65000) + if (gPuppyCam.splineIndex == 65000) { gPuppyCam.splineIndex = index; - - if (splinePos[gPuppyCam.splineIndex].index == -1 || splinePos[gPuppyCam.splineIndex + 1].index == -1 || splinePos[gPuppyCam.splineIndex + 2].index == -1) + } + if (splinePos[gPuppyCam.splineIndex].index == -1 || splinePos[gPuppyCam.splineIndex + 1].index == -1 || splinePos[gPuppyCam.splineIndex + 2].index == -1) { return 1; - if (mode == PUPPYSPLINE_FOLLOW) - if (splineFocus[gPuppyCam.splineIndex].index == -1 || splineFocus[gPuppyCam.splineIndex + 1].index == -1 || splineFocus[gPuppyCam.splineIndex + 2].index == -1) + } + if (mode == PUPPYSPLINE_FOLLOW) { + if (splineFocus[gPuppyCam.splineIndex].index == -1 || splineFocus[gPuppyCam.splineIndex + 1].index == -1 || splineFocus[gPuppyCam.splineIndex + 2].index == -1) { return 1; - + } + } vec3f_set(prevPos, gPuppyCam.pos[0], gPuppyCam.pos[1], gPuppyCam.pos[2]); - for (i = 0; i < 4; i++) + for (i = 0; i < 4; i++) { vec3f_set(tempPoints[i], splinePos[gPuppyCam.splineIndex + i].pos[0], splinePos[gPuppyCam.splineIndex + i].pos[1], splinePos[gPuppyCam.splineIndex + i].pos[2]); + } puppycam_evaluate_spline(gPuppyCam.splineProgress, gPuppyCam.pos, tempPoints[0], tempPoints[1], tempPoints[2], tempPoints[3]); - if (mode == PUPPYSPLINE_FOLLOW) - { - for (i = 0; i < 4; i++) + if (mode == PUPPYSPLINE_FOLLOW) { + for (i = 0; i < 4; i++) { vec3f_set(tempPoints[i], splineFocus[gPuppyCam.splineIndex + i].pos[0], splineFocus[gPuppyCam.splineIndex + i].pos[1], splineFocus[gPuppyCam.splineIndex + i].pos[2]); + } puppycam_evaluate_spline(gPuppyCam.splineProgress, gPuppyCam.focus, tempPoints[0], tempPoints[1], tempPoints[2], tempPoints[3]); } @@ -265,11 +257,9 @@ s32 puppycam_move_spline(struct sPuppySpline splinePos[], struct sPuppySpline sp gPuppyCam.splineProgress += progChange; - if (gPuppyCam.splineProgress >= 1.0f) - { + if (gPuppyCam.splineProgress >= 1.0f) { gPuppyCam.splineIndex++; - if (splinePos[gPuppyCam.splineIndex+3].index == -1) - { + if (splinePos[gPuppyCam.splineIndex + 3].index == -1) { gPuppyCam.splineIndex = 0; gPuppyCam.splineProgress = 0; return 1; @@ -280,17 +270,14 @@ s32 puppycam_move_spline(struct sPuppySpline splinePos[], struct sPuppySpline sp return 0; } -static void puppycam_process_cutscene(void) -{ - if (gPuppyCam.cutscene) - { - if ((gPuppyCam.sceneFunc)() == 1) - { - gPuppyCam.cutscene = 0; - gPuppyCam.sceneInput = 0; - gPuppyCam.flags = gPuppyCam.intendedFlags; - } - gPuppyCam.sceneTimer++; +static void puppycam_process_cutscene(void) { + if (gPuppyCam.cutscene) { + if ((gPuppyCam.sceneFunc)() == 1) { + gPuppyCam.cutscene = 0; + gPuppyCam.sceneInput = 0; + gPuppyCam.flags = gPuppyCam.intendedFlags; + } + gPuppyCam.sceneTimer++; } } @@ -298,83 +285,68 @@ static void puppycam_process_cutscene(void) #define BLANK 0, 0, 0, ENVIRONMENT, 0, 0, 0, ENVIRONMENT -static void puppycam_display_box(s32 x1, s32 y1, s32 x2, s32 y2, u8 r, u8 g, u8 b, u8 a) -{ +static void puppycam_display_box(s32 x1, s32 y1, s32 x2, s32 y2, u8 r, u8 g, u8 b, u8 a) { gDPSetCombineMode(gDisplayListHead++, BLANK, BLANK); - gDPSetCycleType(gDisplayListHead++, G_CYC_1CYCLE); - if (a !=255) - { + gDPSetCycleType( gDisplayListHead++, G_CYC_1CYCLE); + if (a !=255) { gDPSetRenderMode(gDisplayListHead++, G_RM_XLU_SURF, G_RM_XLU_SURF2); - } - else - { + } else { gDPSetRenderMode(gDisplayListHead++, G_RM_OPA_SURF, G_RM_OPA_SURF); } - gDPSetEnvColor(gDisplayListHead++, r, g, b, a); - gDPFillRectangle(gDisplayListHead++, x1, y1, x2, y2); - gDPPipeSync(gDisplayListHead++); - gDPSetEnvColor(gDisplayListHead++,255,255,255,255); - gDPSetCycleType(gDisplayListHead++, G_CYC_1CYCLE); - gSPDisplayList(gDisplayListHead++,dl_hud_img_end); + gDPSetEnvColor( gDisplayListHead++, r, g, b, a); + gDPFillRectangle( gDisplayListHead++, x1, y1, x2, y2); + gDPPipeSync( gDisplayListHead++); + gDPSetEnvColor( gDisplayListHead++, 255, 255, 255, 255); + gDPSetCycleType( gDisplayListHead++, G_CYC_1CYCLE); + gSPDisplayList( gDisplayListHead++,dl_hud_img_end); } //I actually took the time to redo this, properly. Lmao. Please don't bully me over this anymore :( -void puppycam_change_setting(s8 toggle) -{ - if (gPlayer1Controller->buttonDown & A_BUTTON) - toggle*= 5; - if (gPlayer1Controller->buttonDown & B_BUTTON) - toggle*= 10; +void puppycam_change_setting(s8 toggle) { + if (gPlayer1Controller->buttonDown & A_BUTTON) toggle *= 5; + if (gPlayer1Controller->buttonDown & B_BUTTON) toggle *= 10; - if (gPCOptions[gPCOptionSelected].gPCOptionMin == FALSE && gPCOptions[gPCOptionSelected].gPCOptionMax == TRUE) - { + if (gPCOptions[gPCOptionSelected].gPCOptionMin == FALSE && gPCOptions[gPCOptionSelected].gPCOptionMax == TRUE) { *gPCOptions[gPCOptionSelected].gPCOptionVar ^= 1; - } - else + } else { *gPCOptions[gPCOptionSelected].gPCOptionVar += toggle; - //Forgive me father, for I have sinned. I guess if you wanted a selling point for a 21:9 monitor though, "I can view this line in puppycam's code without scrolling!" can be added to it. + } + // Forgive me father, for I have sinned. I guess if you wanted a selling point for a 21:9 monitor though, "I can view this line in puppycam's code without scrolling!" can be added to it. *gPCOptions[gPCOptionSelected].gPCOptionVar = CLAMP(*gPCOptions[gPCOptionSelected].gPCOptionVar, gPCOptions[gPCOptionSelected].gPCOptionMin, gPCOptions[gPCOptionSelected].gPCOptionMax); - #if defined(VERSION_EU) +#if defined(VERSION_EU) newcam_set_language(); - #endif +#endif } -void puppycam_print_text(s32 x, s32 y, unsigned char *str, s32 col) -{ - s32 textX; - textX = get_str_x_pos_from_center(x,str,10.0f); +void puppycam_print_text(s32 x, s32 y, unsigned char *str, s32 col) { + s32 textX = get_str_x_pos_from_center(x, str, 10.0f); gDPSetEnvColor(gDisplayListHead++, 0, 0, 0, 255); - print_generic_string(textX+1,y-1,str); - if (col != 0) - { + print_generic_string(textX + 1, y - 1,str); + if (col != 0) { gDPSetEnvColor(gDisplayListHead++, 255, 255, 255, 255); - } - else - { - gDPSetEnvColor(gDisplayListHead++, 255, 32, 32, 255); + } else { + gDPSetEnvColor(gDisplayListHead++, 255, 32, 32, 255); } print_generic_string(textX,y,str); } -//Options menu -void puppycam_display_options() -{ +// Options menu +void puppycam_display_options() { s32 i = 0; unsigned char newstring[32]; s32 scroll; s32 scrollpos; u32 var; // should be s16, but gives a build warning otherwise? // s32 vr; - s32 maxvar; - s32 minvar; + s32 minvar, maxvar; f32 newcam_sinpos; - puppycam_display_box(47,83,281,84,0x0,0x0,0x0, 0xFF); - puppycam_display_box(47,218,281,219,0x0,0x0,0x0, 0xFF); - puppycam_display_box(47,83,48,219,0x0,0x0,0x0, 0xFF); - puppycam_display_box(280,83,281,219,0x0,0x0,0x0, 0xFF); - puppycam_display_box(271,83,272,219,0x0,0x0,0x0, 0xFF); + puppycam_display_box( 47, 83, 281, 84, 0x00, 0x00, 0x00, 0xFF); + puppycam_display_box( 47, 218, 281, 219, 0x00, 0x00, 0x00, 0xFF); + puppycam_display_box( 47, 83, 48, 219, 0x00, 0x00, 0x00, 0xFF); + puppycam_display_box(280, 83, 281, 219, 0x00, 0x00, 0x00, 0xFF); + puppycam_display_box(271, 83, 272, 219, 0x00, 0x00, 0x00, 0xFF); puppycam_display_box(48,84,272,218,0x0,0x0,0x0, 0x50); gSPDisplayList(gDisplayListHead++, dl_rgba16_text_begin); @@ -382,51 +354,45 @@ void puppycam_display_options() print_hud_lut_string(HUD_LUT_GLOBAL, 112, 40, (*gPCToggleStringsPtr)[2]); gSPDisplayList(gDisplayListHead++, dl_rgba16_text_end); - if (gPCOptionCap>4) - { - puppycam_display_box(272,84,280,218,0x80,0x80,0x80, 0xFF); - scrollpos = (62)*((f32)gPCOptionScroll/(gPCOptionCap-4)); - puppycam_display_box(272,84+scrollpos,280,156+scrollpos,0xFF,0xFF,0xFF, 0xFF); + if (gPCOptionCap > 4) { + puppycam_display_box(272, 84, 280, 218, 0x80, 0x80, 0x80, 0xFF); + scrollpos = (62) * ((f32)gPCOptionScroll / (gPCOptionCap - 4)); + puppycam_display_box(272, 84 + scrollpos, 280, 156 + scrollpos, 0xFF, 0xFF, 0xFF, 0xFF); } gSPDisplayList(gDisplayListHead++, dl_ia_text_begin); gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 0, 80, SCREEN_WIDTH, SCREEN_HEIGHT); - for (i = 0; i < gPCOptionCap; i++) - { - scroll = 140-(32*i)+(gPCOptionScroll*32); - if (scroll <= 140 && scroll > 32) - { + for (i = 0; i < gPCOptionCap; i++) { + scroll = 140 - (32 * i) + (gPCOptionScroll * 32); + if (scroll <= 140 && scroll > 32) { puppycam_print_text(160,scroll,(*gPCOptionStringsPtr)[gPCOptions[i].gPCOptionName],gPCOptionSelected-i); - if (gPCOptions[i].gPCOptionStart != 255) - { + if (gPCOptions[i].gPCOptionStart != 255) { var = *gPCOptions[i].gPCOptionVar+gPCOptions[i].gPCOptionStart; - if (var < sizeof(gPCFlagStringsEN)) //Failsafe for if it somehow indexes an out of bounds array. - puppycam_print_text(160,scroll-12,(*gPCFlagStringsPtr)[var],gPCOptionSelected-i); - } - else - { + if (var < sizeof(gPCFlagStringsEN)) { // Failsafe for if it somehow indexes an out of bounds array. + puppycam_print_text(160, scroll - 12, (*gPCFlagStringsPtr)[var], gPCOptionSelected - i); + } + } else { int_to_str(*gPCOptions[i].gPCOptionVar,newstring); puppycam_print_text(160,scroll-12,newstring,gPCOptionSelected-i); - puppycam_display_box(96,111+(32*i)-(gPCOptionScroll*32),224,117+(32*i)-(gPCOptionScroll*32),0x80,0x80,0x80, 0xFF); + puppycam_display_box(96, 111 + (32 * i) - (gPCOptionScroll * 32), 224, 117 + (32 * i) - (gPCOptionScroll * 32), 0x80, 0x80, 0x80, 0xFF); maxvar = gPCOptions[i].gPCOptionMax - gPCOptions[i].gPCOptionMin; minvar = *gPCOptions[i].gPCOptionVar - gPCOptions[i].gPCOptionMin; - puppycam_display_box(96,111+(32*i)-(gPCOptionScroll*32),96+(((f32)minvar/maxvar)*128),117+(32*i)-(gPCOptionScroll*32),0xFF,0xFF,0xFF, 0xFF); - puppycam_display_box(94+(((f32)minvar/maxvar)*128),109+(32*i)-(gPCOptionScroll*32),98+(((f32)minvar/maxvar)*128),119+(32*i)-(gPCOptionScroll*32),0xFF,0x0,0x0, 0xFF); + puppycam_display_box(96, 111 + (32 * i) - (gPCOptionScroll * 32), 96 + (((f32)minvar / maxvar) * 128), 117 + (32 * i) - (gPCOptionScroll * 32), 0xFF, 0xFF, 0xFF, 0xFF); + puppycam_display_box(94 + (((f32)minvar / maxvar) * 128), 109 + (32 * i) - (gPCOptionScroll * 32), 98 + (((f32)minvar / maxvar) * 128), 119 + (32 * i) - (gPCOptionScroll * 32), 0xFF, 0x00, 0x00, 0xFF); gSPDisplayList(gDisplayListHead++, dl_ia_text_begin); } } } - newcam_sinpos = sins(gGlobalTimer*5000)*4; + newcam_sinpos = sins(gGlobalTimer * 5000) * 4; gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); gDPSetEnvColor(gDisplayListHead++, 255, 255, 255, 255); - print_generic_string(80-newcam_sinpos, 132-(32*(gPCOptionSelected-gPCOptionScroll)), (*gPCToggleStringsPtr)[3]); - print_generic_string(232+newcam_sinpos, 132-(32*(gPCOptionSelected-gPCOptionScroll)), (*gPCToggleStringsPtr)[4]); + print_generic_string( 80 - newcam_sinpos, 132 - (32 * (gPCOptionSelected - gPCOptionScroll)), (*gPCToggleStringsPtr)[3]); + print_generic_string(232 + newcam_sinpos, 132 - (32 * (gPCOptionSelected - gPCOptionScroll)), (*gPCToggleStringsPtr)[4]); gSPDisplayList(gDisplayListHead++, dl_ia_text_end); } //This has been separated for interesting reasons. Don't question it. -void puppycam_render_option_text(void) -{ +void puppycam_render_option_text(void) { gSPDisplayList(gDisplayListHead++, dl_ia_text_begin); puppycam_print_text(278,212,(*gPCToggleStringsPtr)[gPCOptionOpen],1); gSPDisplayList(gDisplayListHead++, dl_ia_text_end); @@ -434,359 +400,284 @@ void puppycam_render_option_text(void) extern struct SaveBuffer gSaveBuffer; -void puppycam_check_pause_buttons() -{ - if (gPlayer1Controller->buttonPressed & R_TRIG) - { +void puppycam_check_pause_buttons(void) { + if (gPlayer1Controller->buttonPressed & R_TRIG) { play_sound(SOUND_MENU_CHANGE_SELECT, gGlobalSoundSource); - if (gPCOptionOpen == 0) - { + if (gPCOptionOpen == 0) { gPCOptionOpen = 1; - #if MULTILANG +#if MULTILANG newcam_set_language(); eu_set_language(gInGameLanguage-1); - #endif - } - else - { +#endif + } else { gPCOptionOpen = 0; - #if MULTILANG +#if MULTILANG load_language_text(); - #endif +#endif puppycam_set_save(); } } - if (gPCOptionOpen) - { - if (ABS(gPlayer1Controller->rawStickY) > 60 || gPlayer1Controller->buttonDown & U_JPAD || gPlayer1Controller->buttonDown & D_JPAD) - { - gPCOptionTimer -= 1; - if (gPCOptionTimer <= 0) - { - switch (gPCOptionIndex) - { - case 0: gPCOptionIndex++; gPCOptionTimer += 10; break; - default: gPCOptionTimer += 5; break; + if (gPCOptionOpen) { + if (ABS(gPlayer1Controller->rawStickY) > 60 || gPlayer1Controller->buttonDown & U_JPAD || gPlayer1Controller->buttonDown & D_JPAD) { + gPCOptionTimer--; + if (gPCOptionTimer <= 0) { + if (gPCOptionIndex == 0) { + gPCOptionIndex++; + gPCOptionTimer += 10; + } else { + gPCOptionTimer += 5; } play_sound(SOUND_MENU_CHANGE_SELECT, gGlobalSoundSource); - if (gPlayer1Controller->rawStickY >= 60 || gPlayer1Controller->buttonDown & U_JPAD) - { + if (gPlayer1Controller->rawStickY >= 60 || gPlayer1Controller->buttonDown & U_JPAD) { gPCOptionSelected--; - if (gPCOptionSelected < 0) - gPCOptionSelected = gPCOptionCap-1; - } - else - if (gPlayer1Controller->rawStickY <= -60 || gPlayer1Controller->buttonDown & D_JPAD) - { + if (gPCOptionSelected < 0) { + gPCOptionSelected = gPCOptionCap - 1; + } + } else if (gPlayer1Controller->rawStickY <= -60 || gPlayer1Controller->buttonDown & D_JPAD) { gPCOptionSelected++; - if (gPCOptionSelected >= gPCOptionCap) + if (gPCOptionSelected >= gPCOptionCap) { gPCOptionSelected = 0; + } } } - } - else - if (ABS(gPlayer1Controller->rawStickX) > 60 || gPlayer1Controller->buttonDown & L_JPAD || gPlayer1Controller->buttonDown & R_JPAD) - { - gPCOptionTimer -= 1; - if (gPCOptionTimer <= 0) - { - switch (gPCOptionIndex) - { + } else if (ABS(gPlayer1Controller->rawStickX) > 60 || gPlayer1Controller->buttonDown & L_JPAD || gPlayer1Controller->buttonDown & R_JPAD) { + gPCOptionTimer--; + if (gPCOptionTimer <= 0) { + switch (gPCOptionIndex) { case 0: gPCOptionIndex++; gPCOptionTimer += 10; break; default: gPCOptionTimer += 5; break; } play_sound(SOUND_MENU_CHANGE_SELECT, gGlobalSoundSource); - if (gPlayer1Controller->rawStickX >= 60 || gPlayer1Controller->buttonDown & R_JPAD) + if (gPlayer1Controller->rawStickX >= 60 || gPlayer1Controller->buttonDown & R_JPAD) { puppycam_change_setting(1); - else - if (gPlayer1Controller->rawStickX <= -60 || gPlayer1Controller->buttonDown & L_JPAD) + } else if (gPlayer1Controller->rawStickX <= -60 || gPlayer1Controller->buttonDown & L_JPAD) puppycam_change_setting(-1); + } } - } - else - { + } else { gPCOptionTimer = 0; gPCOptionIndex = 0; } - - while (gPCOptionScroll - gPCOptionSelected < -3 && gPCOptionSelected > gPCOptionScroll) - gPCOptionScroll +=1; - while (gPCOptionScroll + gPCOptionSelected > 0 && gPCOptionSelected < gPCOptionScroll) - gPCOptionScroll -=1; + while (gPCOptionScroll - gPCOptionSelected < -3 && gPCOptionSelected > gPCOptionScroll) gPCOptionScroll++; + while (gPCOptionScroll + gPCOptionSelected > 0 && gPCOptionSelected < gPCOptionScroll) gPCOptionScroll--; } } ///CORE -//Just a function that sets a bunch of camera values to 0. It's a function because it's got shared functionality. -void puppycam_reset_values(void) -{ - gPuppyCam.swimPitch = 0; - gPuppyCam.edgePitch = 0; - gPuppyCam.moveZoom = 0; - gPuppyCam.floorY[0] = 0; - gPuppyCam.floorY[1] = 0; - gPuppyCam.terrainPitch = 0; - gPuppyCam.splineIndex = 0; +// Just a function that sets a bunch of camera values to 0. It's a function because it's got shared functionality. +void puppycam_reset_values(void) { + gPuppyCam.swimPitch = 0; + gPuppyCam.edgePitch = 0; + gPuppyCam.moveZoom = 0; + gPuppyCam.floorY[0] = 0; + gPuppyCam.floorY[1] = 0; + gPuppyCam.terrainPitch = 0; + gPuppyCam.splineIndex = 0; gPuppyCam.splineProgress = 0; } -//Set up values. Runs on level load. -void puppycam_init(void) -{ - if (gMarioState->marioObj) +// Set up values. Runs on level load. +void puppycam_init(void) { + if (gMarioState->marioObj) { gPuppyCam.targetObj = gMarioState->marioObj; + } gPuppyCam.targetObj2 = NULL; gPuppyCam.intendedFlags = PUPPYCAM_BEHAVIOUR_DEFAULT; - if (gCurrLevelNum == LEVEL_PSS || (gCurrLevelNum == LEVEL_TTM && gCurrAreaIndex == 2) || (gCurrLevelNum == LEVEL_CCM && gCurrAreaIndex == 2)) + if (gCurrLevelNum == LEVEL_PSS || (gCurrLevelNum == LEVEL_TTM && gCurrAreaIndex == 2) || (gCurrLevelNum == LEVEL_CCM && gCurrAreaIndex == 2)) { gPuppyCam.intendedFlags |= PUPPYCAM_BEHAVIOUR_SLIDE_CORRECTION; - gPuppyCam.flags = gPuppyCam.intendedFlags; - gPuppyCam.zoom = gPuppyCam.zoomPoints[1]; - gPuppyCam.zoomSet = 1; - gPuppyCam.zoomTarget = gPuppyCam.zoom; - gPuppyCam.yaw = gMarioState->faceAngle[1]+0x8000; - gPuppyCam.yawTarget = gPuppyCam.yaw; - gPuppyCam.pitch = 0x3800; - gPuppyCam.pitchTarget = gPuppyCam.pitch; - gPuppyCam.yawAcceleration = 0; - gPuppyCam.pitchAcceleration = 0; - gPuppyCam.shakeFrames = 0; - gPuppyCam.shake[0] = 0; - gPuppyCam.shake[1] = 0; - gPuppyCam.shake[2] = 0; - gPuppyCam.pos[0] = 0; - gPuppyCam.pos[1] = 0; - gPuppyCam.pos[2] = 0; - gPuppyCam.focus[0] = 0; - gPuppyCam.focus[1] = 0; - gPuppyCam.focus[2] = 0; - gPuppyCam.pan[0] = 0; - gPuppyCam.pan[1] = 0; //gMarioState->pos[1]; - gPuppyCam.pan[2] = 0; - gPuppyCam.targetFloorHeight = gPuppyCam.pan[1]; + } + gPuppyCam.flags = gPuppyCam.intendedFlags; + gPuppyCam.zoom = gPuppyCam.zoomPoints[1]; + gPuppyCam.zoomSet = 1; + gPuppyCam.zoomTarget = gPuppyCam.zoom; + gPuppyCam.yaw = gMarioState->faceAngle[1] + 0x8000; + gPuppyCam.yawTarget = gPuppyCam.yaw; + gPuppyCam.pitch = 0x3800; + gPuppyCam.pitchTarget = gPuppyCam.pitch; + gPuppyCam.yawAcceleration = 0; + gPuppyCam.pitchAcceleration = 0; + gPuppyCam.shakeFrames = 0; + vec3_zero(gPuppyCam.shake); + vec3_zero(gPuppyCam.pos); + vec3_zero(gPuppyCam.focus); + vec3_zero(gPuppyCam.pan); // gMarioState->pos[1]; + gPuppyCam.targetFloorHeight = gPuppyCam.pan[1]; gPuppyCam.lastTargetFloorHeight = gMarioState->pos[1]; - gPuppyCam.opacity = 255; - gPuppyCam.framesSinceC[0] = 10; //This just exists to stop input type B being stupid. - gPuppyCam.framesSinceC[1] = 10; //This just exists to stop input type B being stupid. - gPuppyCam.mode3Flags = PUPPYCAM_MODE3_ZOOMED_MED; - gPuppyCam.debugFlags = PUPPYDEBUG_LOCK_CONTROLS; + gPuppyCam.opacity = 255; + gPuppyCam.framesSinceC[0] = 10; // This just exists to stop input type B being stupid. + gPuppyCam.framesSinceC[1] = 10; // This just exists to stop input type B being stupid. + gPuppyCam.mode3Flags = PUPPYCAM_MODE3_ZOOMED_MED; + gPuppyCam.debugFlags = PUPPYDEBUG_LOCK_CONTROLS; puppycam_reset_values(); } -void puppycam_input_pitch(void) -{ - if (gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_PITCH_ROTATION) - { - //Handles vertical inputs. - if (gPlayer1Controller->buttonDown & U_CBUTTONS || gPuppyCam.stick2[1] != 0) - gPuppyCam.pitchAcceleration -= 50*(gPuppyCam.options.sensitivityY/100.f); - else - if (gPlayer1Controller->buttonDown & D_CBUTTONS || gPuppyCam.stick2[1] != 0) - gPuppyCam.pitchAcceleration += 50*(gPuppyCam.options.sensitivityY/100.f); - else +void puppycam_input_pitch(void) { + if (gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_PITCH_ROTATION) { + // Handles vertical inputs. + if (gPlayer1Controller->buttonDown & U_CBUTTONS || gPuppyCam.stick2[1] != 0) { + gPuppyCam.pitchAcceleration -= 50 * (gPuppyCam.options.sensitivityY / 100.f); + } else if (gPlayer1Controller->buttonDown & D_CBUTTONS || gPuppyCam.stick2[1] != 0) { + gPuppyCam.pitchAcceleration += 50 * (gPuppyCam.options.sensitivityY / 100.f); + } else { gPuppyCam.pitchAcceleration = 0; - + } gPuppyCam.pitchAcceleration = CLAMP(gPuppyCam.pitchAcceleration, -100, 100); - //When Mario's moving, his pitch is clamped pretty aggressively, so this exists so you can shift your view up and down momentarily at an actually usable range, rather than the otherwise baby range. - if (gMarioState->action & ACT_FLAG_MOVING && (gPuppyCam.pitch >= 0x3800 || gPuppyCam.pitch <= 0x2000)) + // When Mario's moving, his pitch is clamped pretty aggressively, so this exists so you can shift your view up and down momentarily at an actually usable range, rather than the otherwise baby range. + if (gMarioState->action & ACT_FLAG_MOVING && (gPuppyCam.pitch >= 0x3800 || gPuppyCam.pitch <= 0x2000)) { gPuppyCam.moveFlagAdd = 8; + } } } -void puppycam_input_zoom(void) -{ - //Handles R button zooming. - if (gPlayer1Controller->buttonPressed & R_TRIG && gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_ZOOM_CHANGE) - { +void puppycam_input_zoom(void) { + // Handles R button zooming. + if (gPlayer1Controller->buttonPressed & R_TRIG && gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_ZOOM_CHANGE) { gPuppyCam.zoomSet++; - if (gPuppyCam.zoomSet >= 3) + if (gPuppyCam.zoomSet >= 3) { gPuppyCam.zoomSet = 0; - + } gPuppyCam.zoomTarget = gPuppyCam.zoomPoints[gPuppyCam.zoomSet]; play_sound(SOUND_MENU_CLICK_CHANGE_VIEW,gGlobalSoundSource); } } -void puppycam_input_centre(void) -{ - if (gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_FREE) +void puppycam_input_centre(void) { + if (gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_FREE) { return; + } s32 inputDefault = L_TRIG; - if (gPuppyCam.options.inputType == 2) + if (gPuppyCam.options.inputType == 2) { inputDefault = R_TRIG; - //Handles L button centering. + } + // Handles L button centering. if (gPlayer1Controller->buttonPressed & inputDefault && gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_YAW_ROTATION && - !(gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_INPUT_8DIR) && !(gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_INPUT_4DIR) && !(gPlayer1Controller->buttonDown & U_JPAD)) - { - gPuppyCam.yawTarget = gMarioState->faceAngle[1]+0x8000; + !(gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_INPUT_8DIR) && !(gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_INPUT_4DIR) && !(gPlayer1Controller->buttonDown & U_JPAD)) { + gPuppyCam.yawTarget = gMarioState->faceAngle[1] + 0x8000; play_sound(SOUND_MENU_CLICK_CHANGE_VIEW,gGlobalSoundSource); } } -//The default control scheme. Hold the button down to turn the camera, and double tap to turn quickly. -static void puppycam_input_hold_preset1(f32 ivX) -{ - if (!gPuppyCam.options.analogue && gPlayer1Controller->buttonPressed & L_CBUTTONS && gPuppyCam.framesSinceC[0] <= 5) - { - gPuppyCam.yawTarget -= 0x4000*ivX; +// The default control scheme. Hold the button down to turn the camera, and double tap to turn quickly. +static void puppycam_input_hold_preset1(f32 ivX) { + if (!gPuppyCam.options.analogue && gPlayer1Controller->buttonPressed & L_CBUTTONS && gPuppyCam.framesSinceC[0] <= 5) { + gPuppyCam.yawTarget -= 0x4000 * ivX; play_sound(SOUND_MENU_CAMERA_ZOOM_IN, gGlobalSoundSource); - } - else - if (!gPuppyCam.options.analogue && gPlayer1Controller->buttonPressed & R_CBUTTONS && gPuppyCam.framesSinceC[1] <= 5) - { - gPuppyCam.yawTarget += 0x4000*ivX; + } else if (!gPuppyCam.options.analogue && gPlayer1Controller->buttonPressed & R_CBUTTONS && gPuppyCam.framesSinceC[1] <= 5) { + gPuppyCam.yawTarget += 0x4000 * ivX; play_sound(SOUND_MENU_CAMERA_ZOOM_IN, gGlobalSoundSource); } - if ((gPlayer1Controller->buttonDown & L_CBUTTONS && !gPuppyCam.options.analogue) || gPuppyCam.stick2[0] != 0) - { - gPuppyCam.yawAcceleration -= 75*(gPuppyCam.options.sensitivityX/100.f); + if ((gPlayer1Controller->buttonDown & L_CBUTTONS && !gPuppyCam.options.analogue) || gPuppyCam.stick2[0] != 0) { + gPuppyCam.yawAcceleration -= 75 * (gPuppyCam.options.sensitivityX / 100.f); gPuppyCam.framesSinceC[0] = 0; - } - else - if ((gPlayer1Controller->buttonDown & R_CBUTTONS && !gPuppyCam.options.analogue) || gPuppyCam.stick2[0] != 0) - { - gPuppyCam.yawAcceleration += 75*(gPuppyCam.options.sensitivityX/100.f); + } else if ((gPlayer1Controller->buttonDown & R_CBUTTONS && !gPuppyCam.options.analogue) || gPuppyCam.stick2[0] != 0) { + gPuppyCam.yawAcceleration += 75*(gPuppyCam.options.sensitivityX / 100.f); gPuppyCam.framesSinceC[1] = 0; - } - else + } else { gPuppyCam.yawAcceleration = 0; + } } -//An alternative control scheme, hold the button down to turn the camera, or press it once to turn it quickly. -static void puppycam_input_hold_preset2(f32 ivX) -{ - //These set the initial button press. - if (gPlayer1Controller->buttonPressed & L_CBUTTONS) - { - gPuppyCam.framesSinceC[0] = 0; - } - - if (gPlayer1Controller->buttonPressed & R_CBUTTONS) - { - gPuppyCam.framesSinceC[1] = 0; - } - - //These handle when you release the button - if ((!(gPlayer1Controller->buttonDown & L_CBUTTONS)) && gPuppyCam.framesSinceC[0] <= 5) - { - gPuppyCam.yawTarget -= 0x3000*ivX; +// An alternative control scheme, hold the button down to turn the camera, or press it once to turn it quickly. +static void puppycam_input_hold_preset2(f32 ivX) { + // These set the initial button press. + if (gPlayer1Controller->buttonPressed & L_CBUTTONS) gPuppyCam.framesSinceC[0] = 0; + if (gPlayer1Controller->buttonPressed & R_CBUTTONS) gPuppyCam.framesSinceC[1] = 0; + // These handle when you release the button + if ((!(gPlayer1Controller->buttonDown & L_CBUTTONS)) && gPuppyCam.framesSinceC[0] <= 5) { + gPuppyCam.yawTarget -= 0x3000 * ivX; play_sound(SOUND_MENU_CAMERA_ZOOM_IN, gGlobalSoundSource); gPuppyCam.framesSinceC[0] = 6; } - if ((!(gPlayer1Controller->buttonDown & R_CBUTTONS)) && gPuppyCam.framesSinceC[1] <= 5) - { - gPuppyCam.yawTarget += 0x3000*ivX; + if ((!(gPlayer1Controller->buttonDown & R_CBUTTONS)) && gPuppyCam.framesSinceC[1] <= 5) { + gPuppyCam.yawTarget += 0x3000 * ivX; play_sound(SOUND_MENU_CAMERA_ZOOM_IN, gGlobalSoundSource); gPuppyCam.framesSinceC[1] = 6; } - //Handles continuous movement as normal, as long as the button's held. - if (gPlayer1Controller->buttonDown & L_CBUTTONS) - { - gPuppyCam.yawAcceleration -= 75*(gPuppyCam.options.sensitivityX/100.f); - } - else - if (gPlayer1Controller->buttonDown & R_CBUTTONS) - { - gPuppyCam.yawAcceleration += 75*(gPuppyCam.options.sensitivityX/100.f); - } - else + // Handles continuous movement as normal, as long as the button's held. + if (gPlayer1Controller->buttonDown & L_CBUTTONS) { + gPuppyCam.yawAcceleration -= 75 * (gPuppyCam.options.sensitivityX / 100.f); + } else if (gPlayer1Controller->buttonDown & R_CBUTTONS) { + gPuppyCam.yawAcceleration += 75 * (gPuppyCam.options.sensitivityX / 100.f); + } else { gPuppyCam.yawAcceleration = 0; + } } -//Another alternative control scheme. This one aims to mimic the parallel camera scheme down to the last bit from the original game. -static void puppycam_input_hold_preset3(void) -{ +// Another alternative control scheme. This one aims to mimic the parallel camera scheme down to the last bit from the original game. +static void puppycam_input_hold_preset3(void) { f32 stickMag[2] = {gPlayer1Controller->rawStickX*0.65f, gPlayer1Controller->rawStickY*0.2f}; - //Just in case it happens to be nonzero. + // Just in case it happens to be nonzero. gPuppyCam.yawAcceleration = 0; //In theory this shouldn't be necessary, but it's nice to cover all bases. - if (!(gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_YAW_ROTATION)) + if (!(gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_YAW_ROTATION)) { return; - - if (gPuppyCam.mode3Flags & PUPPYCAM_MODE3_ZOOMED_IN) - { + } + if (gPuppyCam.mode3Flags & PUPPYCAM_MODE3_ZOOMED_IN) { gPuppyCam.flags &= ~PUPPYCAM_BEHAVIOUR_COLLISION; - //Handles continuous movement as normal, as long as the button's held. - if (ABS(gPlayer1Controller->rawStickX) > DEADZONE) - { - gPuppyCam.yawAcceleration -= (gPuppyCam.options.sensitivityX/100.f)*stickMag[0]; - } - else + // Handles continuous movement as normal, as long as the button's held. + if (ABS(gPlayer1Controller->rawStickX) > DEADZONE) { + gPuppyCam.yawAcceleration -= (gPuppyCam.options.sensitivityX / 100.f) * stickMag[0]; + } else { gPuppyCam.yawAcceleration = 0; - - if (ABS(gPlayer1Controller->rawStickY) > DEADZONE) - { - gPuppyCam.pitchAcceleration -= (gPuppyCam.options.sensitivityY/100.f)*stickMag[1]; } - else + if (ABS(gPlayer1Controller->rawStickY) > DEADZONE) { + gPuppyCam.pitchAcceleration -= (gPuppyCam.options.sensitivityY / 100.f) * stickMag[1]; + } else { gPuppyCam.pitchAcceleration = approach_f32_asymptotic(gPuppyCam.pitchAcceleration, 0, DECELERATION); - } - else - { - if (gPlayer1Controller->buttonPressed & L_TRIG) - { - if (gPuppyCam.yawTarget % 0x2000) + } + } else { + if (gPlayer1Controller->buttonPressed & L_TRIG) { + if (gPuppyCam.yawTarget % 0x2000) { gPuppyCam.yawTarget += 0x2000 - gPuppyCam.yawTarget % 0x2000; + } } - if (gPuppyCam.mode3Flags & PUPPYCAM_MODE3_ZOOMED_MED) - gPuppyCam.pitchTarget = approach_s32(gPuppyCam.pitchTarget, 0x3800, 0x200, 0x200); - if (gPuppyCam.mode3Flags & PUPPYCAM_MODE3_ZOOMED_OUT) - gPuppyCam.pitchTarget = approach_s32(gPuppyCam.pitchTarget, 0x3000, 0x200, 0x200); + if (gPuppyCam.mode3Flags & PUPPYCAM_MODE3_ZOOMED_MED) gPuppyCam.pitchTarget = approach_s32(gPuppyCam.pitchTarget, 0x3800, 0x200, 0x200); + if (gPuppyCam.mode3Flags & PUPPYCAM_MODE3_ZOOMED_OUT) gPuppyCam.pitchTarget = approach_s32(gPuppyCam.pitchTarget, 0x3000, 0x200, 0x200); - if ((gPlayer1Controller->buttonPressed & L_CBUTTONS && !gPuppyCam.options.analogue) || (gPuppyCam.stick2[0] > DEADZONE && !gPuppyCam.stickN[0])) - { - gPuppyCam.stickN[0] = 1; + if ((gPlayer1Controller->buttonPressed & L_CBUTTONS && !gPuppyCam.options.analogue) || (gPuppyCam.stick2[0] > DEADZONE && !gPuppyCam.stickN[0])) { + gPuppyCam.stickN[0] = 1; gPuppyCam.yawTarget -= 0x2000; play_sound(SOUND_MENU_CAMERA_TURN,gGlobalSoundSource); } - if ((gPlayer1Controller->buttonPressed & R_CBUTTONS && !gPuppyCam.options.analogue) || (gPuppyCam.stick2[0] < -DEADZONE && !gPuppyCam.stickN[0])) - { - gPuppyCam.stickN[0] = 1; + if ((gPlayer1Controller->buttonPressed & R_CBUTTONS && !gPuppyCam.options.analogue) || (gPuppyCam.stick2[0] < -DEADZONE && !gPuppyCam.stickN[0])) { + gPuppyCam.stickN[0] = 1; gPuppyCam.yawTarget += 0x2000; play_sound(SOUND_MENU_CAMERA_TURN,gGlobalSoundSource); } } - //Handles zooming in. Works just like vanilla. - if ((gPlayer1Controller->buttonPressed & U_CBUTTONS && !gPuppyCam.options.analogue) || (gPuppyCam.stick2[1] > DEADZONE && !gPuppyCam.stickN[1])) - { - if ((gPuppyCam.mode3Flags & PUPPYCAM_MODE3_ZOOMED_MED) && !(gMarioState->action & ACT_FLAG_AIR) && !(gMarioState->action & ACT_FLAG_SWIMMING)) - { - gPuppyCam.stickN[1] = 1; + // Handles zooming in. Works just like vanilla. + if ((gPlayer1Controller->buttonPressed & U_CBUTTONS && !gPuppyCam.options.analogue) || (gPuppyCam.stick2[1] > DEADZONE && !gPuppyCam.stickN[1])) { + if ((gPuppyCam.mode3Flags & PUPPYCAM_MODE3_ZOOMED_MED) && !(gMarioState->action & ACT_FLAG_AIR) && !(gMarioState->action & ACT_FLAG_SWIMMING)) { + gPuppyCam.stickN[1] = 1; gPuppyCam.mode3Flags |= PUPPYCAM_MODE3_ZOOMED_IN; gPuppyCam.mode3Flags &= ~PUPPYCAM_MODE3_ZOOMED_MED; - gPuppyCam.zoomTarget = 200; + gPuppyCam.zoomTarget = 200; gPuppyCam.mode3Flags |= PUPPYCAM_MODE3_ENTER_FIRST_PERSON; play_sound(SOUND_MENU_CAMERA_ZOOM_IN, gGlobalSoundSource); - } - else - if (gPuppyCam.mode3Flags & PUPPYCAM_MODE3_ZOOMED_OUT) - { - gPuppyCam.stickN[1] = 1; + } else if (gPuppyCam.mode3Flags & PUPPYCAM_MODE3_ZOOMED_OUT) { + gPuppyCam.stickN[1] = 1; gPuppyCam.mode3Flags |= PUPPYCAM_MODE3_ZOOMED_MED; gPuppyCam.mode3Flags &= ~PUPPYCAM_MODE3_ZOOMED_OUT; - gPuppyCam.zoomTarget = gPuppyCam.zoomPoints[1]; + gPuppyCam.zoomTarget = gPuppyCam.zoomPoints[1]; play_sound(SOUND_MENU_CAMERA_ZOOM_IN, gGlobalSoundSource); } - } - else //Otherwise handle zooming out. - if ((gPlayer1Controller->buttonPressed & D_CBUTTONS && !gPuppyCam.options.analogue) || (gPuppyCam.stick2[1] < -DEADZONE && !gPuppyCam.stickN[1])) - { - if (gPuppyCam.mode3Flags & PUPPYCAM_MODE3_ZOOMED_MED) - { + } else if ((gPlayer1Controller->buttonPressed & D_CBUTTONS && !gPuppyCam.options.analogue) || (gPuppyCam.stick2[1] < -DEADZONE && !gPuppyCam.stickN[1])) { // Otherwise handle zooming out. + if (gPuppyCam.mode3Flags & PUPPYCAM_MODE3_ZOOMED_MED) { gPuppyCam.stickN[1] = 1; gPuppyCam.mode3Flags |= PUPPYCAM_MODE3_ZOOMED_OUT; gPuppyCam.mode3Flags &= ~PUPPYCAM_MODE3_ZOOMED_MED; @@ -796,14 +687,12 @@ static void puppycam_input_hold_preset3(void) } } if ((gPlayer1Controller->buttonPressed & D_CBUTTONS && !gPuppyCam.options.analogue) || (gPuppyCam.stick2[1] < -DEADZONE && !gPuppyCam.stickN[1]) || - gPlayer1Controller->buttonPressed & B_BUTTON || gPlayer1Controller->buttonPressed & A_BUTTON) - { - if (gPuppyCam.mode3Flags & PUPPYCAM_MODE3_ZOOMED_IN) - { - gPuppyCam.stickN[1] = 1; + gPlayer1Controller->buttonPressed & B_BUTTON || gPlayer1Controller->buttonPressed & A_BUTTON) { + if (gPuppyCam.mode3Flags & PUPPYCAM_MODE3_ZOOMED_IN) { + gPuppyCam.stickN[1] = 1; gPuppyCam.mode3Flags |= PUPPYCAM_MODE3_ZOOMED_MED; gPuppyCam.mode3Flags &= ~PUPPYCAM_MODE3_ZOOMED_IN; - gPuppyCam.zoomTarget = gPuppyCam.zoomPoints[1]; + gPuppyCam.zoomTarget = gPuppyCam.zoomPoints[1]; gPuppyCam.mode3Flags &= ~PUPPYCAM_MODE3_ENTER_FIRST_PERSON; play_sound(SOUND_MENU_CAMERA_ZOOM_OUT, gGlobalSoundSource); @@ -811,38 +700,32 @@ static void puppycam_input_hold_preset3(void) } } -//Handles C Button inputs for modes that have held inputs, rather than presses. -static void puppycam_input_hold(void) -{ +// Handles C Button inputs for modes that have held inputs, rather than presses. +static void puppycam_input_hold(void) { f32 ivX = ((gPuppyCam.options.invertX*2)-1)*(gPuppyCam.options.sensitivityX/100.f); f32 ivY = ((gPuppyCam.options.invertY*2)-1)*(gPuppyCam.options.sensitivityY/100.f); s8 stickMag[2] = {100, 100}; - if (gPuppyCam.intendedFlags & PUPPYCAM_BEHAVIOUR_FREE) + if (gPuppyCam.intendedFlags & PUPPYCAM_BEHAVIOUR_FREE) { gPuppyCam.flags = PUPPYCAM_BEHAVIOUR_FREE | PUPPYCAM_BEHAVIOUR_YAW_ROTATION | PUPPYCAM_BEHAVIOUR_PITCH_ROTATION; - - //Analogue Camera stuff. If it fails to find an input, then it just sets stickmag to 100, which after calculations means the value goes unchanged. - if (gPuppyCam.options.analogue && gPuppyCam.options.inputType != 2) - { - stickMag[0] = gPuppyCam.stick2[0]*1.25f; - stickMag[1] = gPuppyCam.stick2[1]*1.25f; + } + // Analogue Camera stuff. If it fails to find an input, then it just sets stickmag to 100, which after calculations means the value goes unchanged. + if (gPuppyCam.options.analogue && gPuppyCam.options.inputType != 2) { + stickMag[0] = gPuppyCam.stick2[0] * 1.25f; + stickMag[1] = gPuppyCam.stick2[1] * 1.25f; } //In theory this shouldn't be necessary, but it's nice to cover all bases. - if (!(gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_YAW_ROTATION)) + if (!(gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_YAW_ROTATION)) { return; - - if ((!gPuppyCam.options.analogue || gPuppyCam.options.inputType == 2) && !(gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_FREE)) - { - switch (gPuppyCam.options.inputType) - { - default: puppycam_input_hold_preset1(ivX); puppycam_input_pitch(); puppycam_input_zoom(); puppycam_input_centre(); break; - case 1: puppycam_input_hold_preset2(ivX); puppycam_input_pitch(); puppycam_input_zoom(); puppycam_input_centre(); break; - case 2: puppycam_input_hold_preset3(); puppycam_input_centre(); break; - } } - else - { + if ((!gPuppyCam.options.analogue || gPuppyCam.options.inputType == 2) && !(gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_FREE)) { + switch (gPuppyCam.options.inputType) { + default: puppycam_input_hold_preset1(ivX); puppycam_input_pitch(); puppycam_input_zoom(); puppycam_input_centre(); break; + case 1: puppycam_input_hold_preset2(ivX); puppycam_input_pitch(); puppycam_input_zoom(); puppycam_input_centre(); break; + case 2: puppycam_input_hold_preset3(); puppycam_input_centre(); break; + } + } else { puppycam_input_hold_preset1(ivX); puppycam_input_pitch(); puppycam_input_zoom(); @@ -854,168 +737,146 @@ static void puppycam_input_hold(void) gPuppyCam.yawAcceleration = CLAMP(gPuppyCam.yawAcceleration, -100, 100); - gPuppyCam.yawTarget += (12*gPuppyCam.yawAcceleration*ivX)*(stickMag[0]*0.01f); - gPuppyCam.pitchTarget += ((4+gPuppyCam.moveFlagAdd)*gPuppyCam.pitchAcceleration*ivY)*(stickMag[1]*0.01f); + gPuppyCam.yawTarget += (12 * gPuppyCam.yawAcceleration * ivX) * (stickMag[0] * 0.01f); + gPuppyCam.pitchTarget += ((4 + gPuppyCam.moveFlagAdd) * gPuppyCam.pitchAcceleration * ivY) * (stickMag[1] * 0.01f); } -//Handles C Button inputs for modes that have pressed inputs, rather than held. -static void puppycam_input_press(void) -{ - f32 ivX = ((gPuppyCam.options.invertX*2)-1)*(gPuppyCam.options.sensitivityX/100.f); - f32 ivY = ((gPuppyCam.options.invertY*2)-1)*(gPuppyCam.options.sensitivityY/100.f); +// Handles C Button inputs for modes that have pressed inputs, rather than held. +static void puppycam_input_press(void) { + f32 ivX = ((gPuppyCam.options.invertX * 2) - 1) * (gPuppyCam.options.sensitivityX / 100.f); + f32 ivY = ((gPuppyCam.options.invertY * 2) - 1) * (gPuppyCam.options.sensitivityY / 100.f); s8 stickMag = 0; - //Analogue Camera stuff. If it fails to find an input, then it just sets stickmag to 100, which after calculations means the value goes unchanged. - if (gPuppyCam.options.analogue) - stickMag = gPuppyCam.stick2[0]*1.25f; - else + // Analogue Camera stuff. If it fails to find an input, then it just sets stickmag to 100, which after calculations means the value goes unchanged. + if (gPuppyCam.options.analogue) { + stickMag = gPuppyCam.stick2[0] * 1.25f; + } else { stickMag = 100; - - //Just in case it happens to be nonzero. + } + // Just in case it happens to be nonzero. gPuppyCam.yawAcceleration = 0; - //In theory this shouldn't be necessary, but it's nice to cover all bases. - if (!(gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_YAW_ROTATION)) + // In theory this shouldn't be necessary, but it's nice to cover all bases. + if (!(gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_YAW_ROTATION)) { return; - - if ((gPlayer1Controller->buttonPressed & L_CBUTTONS && !gPuppyCam.options.analogue) || (gPuppyCam.stickN[0] == 0 && gPuppyCam.stick2[0] < -DEADZONE)) - { + } + if ((gPlayer1Controller->buttonPressed & L_CBUTTONS && !gPuppyCam.options.analogue) || (gPuppyCam.stickN[0] == 0 && gPuppyCam.stick2[0] < -DEADZONE)) { gPuppyCam.stickN[0] = 1; - if (gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_INPUT_8DIR) - gPuppyCam.yawTarget -= 0x2000*ivX; - else - gPuppyCam.yawTarget -= 0x4000*ivX; + if (gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_INPUT_8DIR) { + gPuppyCam.yawTarget -= 0x2000 * ivX; + } else { + gPuppyCam.yawTarget -= 0x4000 * ivX; + } play_sound(SOUND_MENU_CAMERA_ZOOM_IN,gGlobalSoundSource); } - if ((gPlayer1Controller->buttonPressed & R_CBUTTONS && !gPuppyCam.options.analogue) || (gPuppyCam.stickN[0] == 0 && gPuppyCam.stick2[0] > DEADZONE)) - { + if ((gPlayer1Controller->buttonPressed & R_CBUTTONS && !gPuppyCam.options.analogue) || (gPuppyCam.stickN[0] == 0 && gPuppyCam.stick2[0] > DEADZONE)) { gPuppyCam.stickN[0] = 1; - if (gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_INPUT_8DIR) - gPuppyCam.yawTarget += 0x2000*ivX; - else - gPuppyCam.yawTarget += 0x4000*ivX; + if (gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_INPUT_8DIR) { + gPuppyCam.yawTarget += 0x2000 * ivX; + } else { + gPuppyCam.yawTarget += 0x4000 * ivX; + } play_sound(SOUND_MENU_CAMERA_ZOOM_IN,gGlobalSoundSource); } puppycam_input_pitch(); puppycam_input_zoom(); puppycam_input_centre(); - gPuppyCam.pitchTarget += ((4+gPuppyCam.moveFlagAdd)*gPuppyCam.pitchAcceleration*ivY)*(stickMag*0.01f); + gPuppyCam.pitchTarget += ((4 + gPuppyCam.moveFlagAdd) * gPuppyCam.pitchAcceleration * ivY) * (stickMag * 0.01f); } -void puppycam_debug_view(void) -{ - if (gPuppyCam.debugFlags & PUPPYDEBUG_LOCK_CONTROLS) - { - if (ABS(gPlayer1Controller->rawStickX) > DEADZONE) - { - gPuppyCam.pos[0] += (gPlayer1Controller->rawStickX/4) * -sins(gPuppyCam.yawTarget); - gPuppyCam.pos[2] += (gPlayer1Controller->rawStickX/4) * coss(gPuppyCam.yawTarget); +void puppycam_debug_view(void) { + if (gPuppyCam.debugFlags & PUPPYDEBUG_LOCK_CONTROLS) { + if (ABS(gPlayer1Controller->rawStickX) > DEADZONE) { + gPuppyCam.pos[0] += (gPlayer1Controller->rawStickX / 4) * -sins(gPuppyCam.yawTarget); + gPuppyCam.pos[2] += (gPlayer1Controller->rawStickX / 4) * coss(gPuppyCam.yawTarget); } - if (ABS(gPlayer1Controller->rawStickY) > DEADZONE) - { - gPuppyCam.pos[0] += (gPlayer1Controller->rawStickY/4) * coss(gPuppyCam.yawTarget); - gPuppyCam.pos[1] += (gPlayer1Controller->rawStickY/4) * sins(gPuppyCam.pitchTarget); - gPuppyCam.pos[2] += (gPlayer1Controller->rawStickY/4) * sins(gPuppyCam.yawTarget); + if (ABS(gPlayer1Controller->rawStickY) > DEADZONE) { + gPuppyCam.pos[0] += (gPlayer1Controller->rawStickY / 4) * coss(gPuppyCam.yawTarget); + gPuppyCam.pos[1] += (gPlayer1Controller->rawStickY / 4) * sins(gPuppyCam.pitchTarget); + gPuppyCam.pos[2] += (gPlayer1Controller->rawStickY / 4) * sins(gPuppyCam.yawTarget); } - if (gPlayer1Controller->buttonDown & Z_TRIG || gPlayer1Controller->buttonDown & L_TRIG) + if (gPlayer1Controller->buttonDown & Z_TRIG || gPlayer1Controller->buttonDown & L_TRIG) { gPuppyCam.pos[1] -= 20; - if (gPlayer1Controller->buttonDown & R_TRIG) + } + if (gPlayer1Controller->buttonDown & R_TRIG) { gPuppyCam.pos[1] += 20; - - gPuppyCam.focus[0] = gPuppyCam.pos[0] + (100 *coss(gPuppyCam.yawTarget)); - gPuppyCam.focus[1] = gPuppyCam.pos[1] + (100 *sins(gPuppyCam.pitchTarget)); - gPuppyCam.focus[2] = gPuppyCam.pos[2] + (100 *sins(gPuppyCam.yawTarget)); - } - else - { - if (gPuppyCam.debugFlags & PUPPYDEBUG_TRACK_MARIO) - { - gPuppyCam.focus[0] = gPuppyCam.targetObj->oPosX; - gPuppyCam.focus[1] = gPuppyCam.targetObj->oPosY; - gPuppyCam.focus[2] = gPuppyCam.targetObj->oPosZ; + } + gPuppyCam.focus[0] = gPuppyCam.pos[0] + (100 * coss(gPuppyCam.yawTarget)); + gPuppyCam.focus[1] = gPuppyCam.pos[1] + (100 * sins(gPuppyCam.pitchTarget)); + gPuppyCam.focus[2] = gPuppyCam.pos[2] + (100 * sins(gPuppyCam.yawTarget)); + } else { + if (gPuppyCam.debugFlags & PUPPYDEBUG_TRACK_MARIO) { + vec3_copy(gPuppyCam.focus, &gPuppyCam.targetObj->oPosVec); } - gPuppyCam.yawTarget = atan2s(gPuppyCam.pos[2] - gPuppyCam.focus[2], gPuppyCam.pos[0] - gPuppyCam.focus[0]); + gPuppyCam.yawTarget = atan2s(gPuppyCam.pos[2] - gPuppyCam.focus[2], gPuppyCam.pos[0] - gPuppyCam.focus[0]); gPuppyCam.pitchTarget = atan2s(gPuppyCam.pos[1] - gPuppyCam.focus[1], 100); } - gPuppyCam.yaw = gPuppyCam.yawTarget; + gPuppyCam.yaw = gPuppyCam.yawTarget; gPuppyCam.pitch = gPuppyCam.pitchTarget; - if (gPlayer1Controller->buttonPressed & A_BUTTON && gPuppyCam.debugFlags & PUPPYDEBUG_LOCK_CONTROLS) - { + if (gPlayer1Controller->buttonPressed & A_BUTTON && gPuppyCam.debugFlags & PUPPYDEBUG_LOCK_CONTROLS) { vec3f_set(gMarioState->pos, gPuppyCam.pos[0], gPuppyCam.pos[1], gPuppyCam.pos[2]); } - if (gPlayer1Controller->buttonPressed & B_BUTTON) - { - if (gPuppyCam.debugFlags & PUPPYDEBUG_LOCK_CONTROLS) + if (gPlayer1Controller->buttonPressed & B_BUTTON) { + if (gPuppyCam.debugFlags & PUPPYDEBUG_LOCK_CONTROLS) { gPuppyCam.debugFlags &= ~PUPPYDEBUG_LOCK_CONTROLS; - else + } else { gPuppyCam.debugFlags |= PUPPYDEBUG_LOCK_CONTROLS; + } } - if (gPlayer1Controller->buttonPressed & R_TRIG && !(gPuppyCam.debugFlags & PUPPYDEBUG_LOCK_CONTROLS)) - { - if (gPuppyCam.debugFlags & PUPPYDEBUG_TRACK_MARIO) + if (gPlayer1Controller->buttonPressed & R_TRIG && !(gPuppyCam.debugFlags & PUPPYDEBUG_LOCK_CONTROLS)) { + if (gPuppyCam.debugFlags & PUPPYDEBUG_TRACK_MARIO) { gPuppyCam.debugFlags &= ~PUPPYDEBUG_TRACK_MARIO; - else + } else { gPuppyCam.debugFlags |= PUPPYDEBUG_TRACK_MARIO; + } } } -static void puppycam_view_panning(void) -{ +static void puppycam_view_panning(void) { f32 panFloor, panMulti; s32 expectedPanX, expectedPanZ; s32 height = gPuppyCam.targetObj->oPosY; s32 panEx = (gPuppyCam.zoomTarget >= 1000) * 160; //Removes the basic panning when idling if the zoom level is at the closest. f32 slideSpeed = 1; - panMulti = CLAMP(gPuppyCam.zoom/(f32)gPuppyCam.zoomPoints[2], 0.f, 1.f); - if (gPuppyCam.options.inputType == 2) + panMulti = CLAMP(gPuppyCam.zoom / (f32)gPuppyCam.zoomPoints[2], 0.f, 1.f); + if (gPuppyCam.options.inputType == 2) { panMulti /= 2; - - if (gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_PANSHIFT && gMarioState->action != ACT_HOLDING_BOWSER && gMarioState->action != ACT_SLEEPING && gMarioState->action != ACT_START_SLEEPING) - { - if (gMarioState->action & ACT_FLAG_BUTT_OR_STOMACH_SLIDE) + } + if (gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_PANSHIFT && gMarioState->action != ACT_HOLDING_BOWSER && gMarioState->action != ACT_SLEEPING && gMarioState->action != ACT_START_SLEEPING) { + if (gMarioState->action & ACT_FLAG_BUTT_OR_STOMACH_SLIDE) { slideSpeed = 10; - - expectedPanX = LENSIN(panEx+(200*(gMarioState->forwardVel/320.f)), gMarioState->faceAngle[1])*panMulti; - expectedPanZ = LENCOS(panEx+(200*(gMarioState->forwardVel/320.f)), gMarioState->faceAngle[1])*panMulti; + } + expectedPanX = LENSIN(panEx + (200 * (gMarioState->forwardVel / 320.f)), gMarioState->faceAngle[1]) * panMulti; + expectedPanZ = LENCOS(panEx + (200 * (gMarioState->forwardVel / 320.f)), gMarioState->faceAngle[1]) * panMulti; gPuppyCam.pan[0] = approach_f32_asymptotic(gPuppyCam.pan[0], expectedPanX, 0.02f*slideSpeed); gPuppyCam.pan[2] = approach_f32_asymptotic(gPuppyCam.pan[2], expectedPanZ, 0.02f*slideSpeed); - if (gMarioState->vel[1] == 0.0f) - { - panFloor = CLAMP(find_floor_height((s16)(gPuppyCam.targetObj->oPosX+expectedPanX),(s16)(gPuppyCam.targetObj->oPosY + 200), - (s16)(gPuppyCam.targetObj->oPosZ+expectedPanZ)),gPuppyCam.targetObj->oPosY-50,gPuppyCam.targetObj->oPosY+50); - //If the floor is lower than 150 units below Mario, then ignore the Y value and tilt the camera instead. - if (panFloor <= gPuppyCam.targetObj->oPosY-150) - { + if (gMarioState->vel[1] == 0.0f) { + panFloor = CLAMP(find_floor_height((s16)(gPuppyCam.targetObj->oPosX+expectedPanX), (s16)(gPuppyCam.targetObj->oPosY + 200), + (s16)(gPuppyCam.targetObj->oPosZ+expectedPanZ)), gPuppyCam.targetObj->oPosY - 50,gPuppyCam.targetObj->oPosY + 50); + // If the floor is lower than 150 units below Mario, then ignore the Y value and tilt the camera instead. + if (panFloor <= gPuppyCam.targetObj->oPosY - 150) { panFloor = gPuppyCam.targetObj->oPosY; gPuppyCam.edgePitch = approach_s32(gPuppyCam.edgePitch, -0x2000, 0x80, 0x80); - } - else - { + } else { gPuppyCam.edgePitch = approach_s32(gPuppyCam.edgePitch, 0, 0x100, 0x100); } - - gPuppyCam.pan[1] = approach_f32_asymptotic(gPuppyCam.pan[1], panFloor-height, 0.025f); - } - else + gPuppyCam.pan[1] = approach_f32_asymptotic(gPuppyCam.pan[1], panFloor - height, 0.025f); + } else { gPuppyCam.pan[1] = approach_f32_asymptotic(gPuppyCam.pan[1], 0, 0.05f); - } - else - { - gPuppyCam.pan[0] = 0; - gPuppyCam.pan[1] = 0; - gPuppyCam.pan[2] = 0; + } + } else { + vec3_zero(gPuppyCam.pan); } } -void puppycam_terrain_angle(void) -{ +void puppycam_terrain_angle(void) { f32 adjustSpeed; s32 floor2 = find_floor_height(gPuppyCam.pos[0], gPuppyCam.pos[1]+100, gPuppyCam.pos[2]); s32 ceil = 20000;//find_ceil(gPuppyCam.pos[0], gPuppyCam.pos[1]+100, gPuppyCam.pos[2]); @@ -1023,47 +884,41 @@ void puppycam_terrain_angle(void) s16 floorPitch; s32 gotTheOkay = FALSE; - if (gMarioState->action & ACT_FLAG_SWIMMING || !(gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_HEIGHT_HELPER)) - { + if (gMarioState->action & ACT_FLAG_SWIMMING || !(gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_HEIGHT_HELPER)) { gPuppyCam.intendedTerrainPitch = 0; adjustSpeed = 0.25f; farFromSurface = TRUE; - } - else - { - f32 x, z, floorHeight; + } else { adjustSpeed = CLAMP(MAX(gMarioState->forwardVel/480.0f, gPuppyCam.yawAcceleration/100.0f), 0.05f, 1.0f); - x = gPuppyCam.targetObj->oPosX - (10 * sins(gPuppyCam.yaw)); - z = gPuppyCam.targetObj->oPosZ - (10 * coss(gPuppyCam.yaw)); + f32 x = gPuppyCam.targetObj->oPosX - (10 * sins(gPuppyCam.yaw)); + f32 z = gPuppyCam.targetObj->oPosZ - (10 * coss(gPuppyCam.yaw)); - floorHeight = find_floor_height(x, gPuppyCam.targetObj->oPosY+100, z); + f32 floorHeight = find_floor_height(x, gPuppyCam.targetObj->oPosY+100, z); - if (ABS(gMarioState->floorHeight - floorHeight) > 350) - { + if (ABS(gMarioState->floorHeight - floorHeight) > 350) { gPuppyCam.intendedTerrainPitch = 0; - } - else - { + } else { floorPitch = -atan2s(30.0f, gMarioState->floorHeight - floorHeight); gPuppyCam.intendedTerrainPitch = approach_f32_asymptotic(gPuppyCam.intendedTerrainPitch, floorPitch, adjustSpeed); gotTheOkay = TRUE; } - //Ensures that the camera is below and above floors and ceilings. It ignores this rule for each if the camera's headed upwards anyway. + // Ensures that the camera is below and above floors and ceilings. It ignores this rule for each if the camera's headed upwards anyway. farFromSurface = ((gPuppyCam.pos[1] > floor2 + 50 || gPuppyCam.intendedTerrainPitch < gPuppyCam.terrainPitch) && (gPuppyCam.pos[1] < ceil - 50 || gPuppyCam.intendedTerrainPitch > gPuppyCam.terrainPitch)); - //If the camera is too close to a vertical obstruction, it'll make the intended pitch much further away, making it swivel faster. - if (!farFromSurface && gotTheOkay) + // If the camera is too close to a vertical obstruction, it'll make the intended pitch much further away, making it swivel faster. + if (!farFromSurface && gotTheOkay) { gPuppyCam.intendedTerrainPitch = approach_f32_asymptotic(gPuppyCam.intendedTerrainPitch, floorPitch, adjustSpeed*3); + } } - if (farFromSurface) + if (farFromSurface) { gPuppyCam.terrainPitch = approach_f32_asymptotic(gPuppyCam.terrainPitch, gPuppyCam.intendedTerrainPitch, adjustSpeed); + } } -const struct sPuppyAngles puppyAnglesNull = -{ +const struct sPuppyAngles puppyAnglesNull = { {PUPPY_NULL, PUPPY_NULL, PUPPY_NULL}, {PUPPY_NULL, PUPPY_NULL, PUPPY_NULL}, PUPPY_NULL, @@ -1071,61 +926,54 @@ const struct sPuppyAngles puppyAnglesNull = PUPPY_NULL, }; -//Checks the bounding box of a puppycam volume. If it's inside, then set the pointer to the current index. -static s32 puppycam_check_volume_bounds(struct sPuppyVolume *volume, s32 index) -{ +// Checks the bounding box of a puppycam volume. If it's inside, then set the pointer to the current index. +static s32 puppycam_check_volume_bounds(struct sPuppyVolume *volume, s32 index) { s32 rel[3]; s32 pos[2]; f32 distCheck; - if (sPuppyVolumeStack[index]->room != gMarioCurrentRoom && sPuppyVolumeStack[index]->room != -1) + if (sPuppyVolumeStack[index]->room != gMarioCurrentRoom && sPuppyVolumeStack[index]->room != -1) { return FALSE; - - if (sPuppyVolumeStack[index]->shape == PUPPYVOLUME_SHAPE_BOX) - { - //Fetch the relative position. to the triggeree. + } + if (sPuppyVolumeStack[index]->shape == PUPPYVOLUME_SHAPE_BOX) { + // Fetch the relative position. to the triggeree. rel[0] = sPuppyVolumeStack[index]->pos[0] - gPuppyCam.targetObj->oPosX; rel[1] = sPuppyVolumeStack[index]->pos[1] - gPuppyCam.targetObj->oPosY; rel[2] = sPuppyVolumeStack[index]->pos[2] - gPuppyCam.targetObj->oPosZ; - //Use the dark, forbidden arts of trig to rotate the volume. + // Use the dark, forbidden arts of trig to rotate the volume. pos[0] = rel[2] * sins(sPuppyVolumeStack[index]->rot) + rel[0] * coss(sPuppyVolumeStack[index]->rot); pos[1] = rel[2] * coss(sPuppyVolumeStack[index]->rot) - rel[0] * sins(sPuppyVolumeStack[index]->rot); #ifdef VISUAL_DEBUG Vec3f debugPos[2]; - vec3f_set(debugPos[0], sPuppyVolumeStack[index]->pos[0], sPuppyVolumeStack[index]->pos[1], sPuppyVolumeStack[index]->pos[2]); + vec3f_set(debugPos[0], sPuppyVolumeStack[index]->pos[0], sPuppyVolumeStack[index]->pos[1], sPuppyVolumeStack[index]->pos[2]); vec3f_set(debugPos[1], sPuppyVolumeStack[index]->radius[0], sPuppyVolumeStack[index]->radius[1], sPuppyVolumeStack[index]->radius[2]); debug_box_color(0x0000FF00); debug_box_rot(debugPos[0], debugPos[1], sPuppyVolumeStack[index]->rot, DEBUG_SHAPE_BOX | DEBUG_UCODE_DEFAULT); #endif - //Now compare values. + // Now compare values. if (-sPuppyVolumeStack[index]->radius[0] < pos[0] && pos[0] < sPuppyVolumeStack[index]->radius[0] && -sPuppyVolumeStack[index]->radius[1] < rel[1] && rel[1] < sPuppyVolumeStack[index]->radius[1] && - -sPuppyVolumeStack[index]->radius[2] < pos[1] && pos[1] < sPuppyVolumeStack[index]->radius[2]) - { + -sPuppyVolumeStack[index]->radius[2] < pos[1] && pos[1] < sPuppyVolumeStack[index]->radius[2]) { *volume = *sPuppyVolumeStack[index]; return TRUE; } - } - else - if (sPuppyVolumeStack[index]->shape == PUPPYVOLUME_SHAPE_CYLINDER) - { + } else if (sPuppyVolumeStack[index]->shape == PUPPYVOLUME_SHAPE_CYLINDER) { // s16 dir; f32 dist; rel[0] = sPuppyVolumeStack[index]->pos[0] - gPuppyCam.targetObj->oPosX; rel[1] = sPuppyVolumeStack[index]->pos[1] - gPuppyCam.targetObj->oPosY; rel[2] = sPuppyVolumeStack[index]->pos[2] - gPuppyCam.targetObj->oPosZ; - dist = sqrtf((rel[0] * rel[0]) + (rel[2] * rel[2])); - #ifdef VISUAL_DEBUG + dist = sqrtf(sqr(rel[0]) + sqr(rel[2])); +#ifdef VISUAL_DEBUG Vec3f debugPos[2]; - vec3f_set(debugPos[0], sPuppyVolumeStack[index]->pos[0], sPuppyVolumeStack[index]->pos[1], sPuppyVolumeStack[index]->pos[2]); + vec3f_set(debugPos[0], sPuppyVolumeStack[index]->pos[0], sPuppyVolumeStack[index]->pos[1], sPuppyVolumeStack[index]->pos[2]); vec3f_set(debugPos[1], sPuppyVolumeStack[index]->radius[0], sPuppyVolumeStack[index]->radius[1], sPuppyVolumeStack[index]->radius[2]); debug_box_color(0x0000FF00); debug_box_rot(debugPos[0], debugPos[1], sPuppyVolumeStack[index]->rot, DEBUG_SHAPE_CYLINDER | DEBUG_UCODE_DEFAULT); - #endif +#endif distCheck = (dist < sPuppyVolumeStack[index]->radius[0]); - if (-sPuppyVolumeStack[index]->radius[1] < rel[1] && rel[1] < sPuppyVolumeStack[index]->radius[1] && distCheck) - { + if (-sPuppyVolumeStack[index]->radius[1] < rel[1] && rel[1] < sPuppyVolumeStack[index]->radius[1] && distCheck) { *volume = *sPuppyVolumeStack[index]; return TRUE; } @@ -1135,70 +983,65 @@ static s32 puppycam_check_volume_bounds(struct sPuppyVolume *volume, s32 index) return FALSE; } -//Handles wall adjustment when wall kicking. -void puppycam_wall_angle(void) -{ +// Handles wall adjustment when wall kicking. +void puppycam_wall_angle(void) { struct Surface *wall; struct WallCollisionData cData; s16 wallYaw; - if (!(gMarioState->action & ACT_WALL_KICK_AIR) || ((gMarioState->action & ACT_FLAG_AIR) && ABS(gMarioState->forwardVel) < 16.0f) || !(gMarioState->action & ACT_FLAG_AIR)) + if (!(gMarioState->action & ACT_WALL_KICK_AIR) || ((gMarioState->action & ACT_FLAG_AIR) && ABS(gMarioState->forwardVel) < 16.0f) || !(gMarioState->action & ACT_FLAG_AIR)) { return; - + } cData.x = gPuppyCam.targetObj->oPosX; cData.y = gPuppyCam.targetObj->oPosY; cData.z = gPuppyCam.targetObj->oPosZ; cData.radius = 150.0f; cData.offsetY = 0; - if (find_wall_collisions(&cData)) + if (find_wall_collisions(&cData)) { wall = cData.walls[cData.numWalls - 1]; - else + } else { return; + } wallYaw = atan2s(wall->normal.z, wall->normal.x) + 0x4000; wallYaw -= gPuppyCam.yawTarget; - if (wallYaw % 0x4000) + if (wallYaw % 0x4000) { wallYaw += 0x4000 - wallYaw % 0x4000; - + } gPuppyCam.yawTarget = approach_s32(gPuppyCam.yawTarget, wallYaw, 0x200, 0x200); } -void puppycam_projection_behaviours(void) -{ +void puppycam_projection_behaviours(void) { f32 turnRate = 1; - //This will only be executed if Mario's the target. If it's not, it'll reset the - if (gPuppyCam.targetObj == gMarioState->marioObj) - { + // This will only be executed if Mario's the target. If it's not, it'll reset the + if (gPuppyCam.targetObj == gMarioState->marioObj) { if (gPuppyCam.options.turnAggression > 0 && gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_TURN_HELPER && !(gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_INPUT_8DIR) && - gMarioState->vel[1] == 0.0f && !(gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_INPUT_4DIR) && gPuppyCam.options.inputType != 2) - {//Holy hell this is getting spicy. - //With turn aggression enabled, or if Mario's sliding, adjust the camera view behind mario. - if (gPuppyCam.options.turnAggression > 0 || gMarioState->action & ACT_FLAG_BUTT_OR_STOMACH_SLIDE) - { - if (gMarioState->action & ACT_FLAG_BUTT_OR_STOMACH_SLIDE) - turnRate = 4; //If he's sliding, do it 4x as fast. - //The deal here, is if Mario's moving, or he's sliding and the camera's within 90 degrees behind him, it'll auto focus behind him, with an intensity based on the camera's centre speed. - //It also scales with forward velocity, so it's a gradual effect as he speeds up. + gMarioState->vel[1] == 0.0f && !(gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_INPUT_4DIR) && gPuppyCam.options.inputType != 2) { // Holy hell this is getting spicy. + // With turn aggression enabled, or if Mario's sliding, adjust the camera view behind mario. + if (gPuppyCam.options.turnAggression > 0 || gMarioState->action & ACT_FLAG_BUTT_OR_STOMACH_SLIDE) { + if (gMarioState->action & ACT_FLAG_BUTT_OR_STOMACH_SLIDE) { + turnRate = 4; // If he's sliding, do it 4x as fast. + } + // The deal here, is if Mario's moving, or he's sliding and the camera's within 90 degrees behind him, it'll auto focus behind him, with an intensity based on the camera's centre speed. + // It also scales with forward velocity, so it's a gradual effect as he speeds up. if ((ABS(gPlayer1Controller->rawStickX) > 20 && !(gMarioState->action & ACT_FLAG_BUTT_OR_STOMACH_SLIDE)) || (gMarioState->action & ACT_FLAG_BUTT_OR_STOMACH_SLIDE && (s16)ABS(((gPuppyCam.yaw + 0x8000) % 0xFFFF - 0x8000) - ((gMarioState->faceAngle[1]) % 0xFFFF - 0x8000)) < 0x3000 )) gPuppyCam.yawTarget = approach_angle(gPuppyCam.yawTarget, (gMarioState->faceAngle[1] + 0x8000), ((gPuppyCam.options.turnAggression * 10) * ABS(gMarioState->forwardVel / 32) * ABS(gPlayer1Controller->rawStickX / 80.0f) * turnRate)); } - } - else - { //If none of the above is true, it'll attempt to do this instead. - //If the camera's in these modes, snap the yaw to prevent desync. - if (gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_INPUT_8DIR) - { - if (gPuppyCam.yawTarget % 0x2000) + } else { //If none of the above is true, it'll attempt to do this instead. + // If the camera's in these modes, snap the yaw to prevent desync. + if (gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_INPUT_8DIR) { + if (gPuppyCam.yawTarget % 0x2000) { gPuppyCam.yawTarget += 0x2000 - gPuppyCam.yawTarget % 0x2000; + } } - if (gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_INPUT_4DIR) - { - if (gPuppyCam.yawTarget % 0x4000) + if (gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_INPUT_4DIR) { + if (gPuppyCam.yawTarget % 0x4000) { gPuppyCam.yawTarget += 0x4000 - gPuppyCam.yawTarget % 0x4000; + } } } @@ -1209,232 +1052,185 @@ void puppycam_projection_behaviours(void) , CLAMP((absf(gMarioState->vel[1]) - 17.f) / 200.f, 0, 0.1f) + CLAMP((absf(gPuppyCam.targetFloorHeight - gPuppyCam.lastTargetFloorHeight) - 30.f) / 300.f, 0, 0.1f)); - if (gMarioState->action == ACT_SLEEPING || gMarioState->action == ACT_START_SLEEPING) + if (gMarioState->action == ACT_SLEEPING || gMarioState->action == ACT_START_SLEEPING) { gPuppyCam.zoom = approach_f32_asymptotic(gPuppyCam.zoom,gPuppyCam.zoomPoints[0],0.01f); - else - if (gMarioState->action & ACT_FLAG_SWIMMING && gMarioState->waterLevel-100 - gMarioState->pos[1] > 5) - { - //When moving underwater, the camera will zoom in on Mayro. + } else if (gMarioState->action & ACT_FLAG_SWIMMING && gMarioState->waterLevel-100 - gMarioState->pos[1] > 5) { + // When moving underwater, the camera will zoom in on Mayro. gPuppyCam.zoom = approach_f32_asymptotic(gPuppyCam.zoom, MAX(gPuppyCam.zoomTarget/1.5f, gPuppyCam.zoomPoints[0]), 0.2f); - } - else + } else { gPuppyCam.zoom = approach_f32_asymptotic(gPuppyCam.zoom,gPuppyCam.zoomTarget,0.2f); - - //Attempts at automatic adjustment that only apply when moving or jumping. - if (gMarioState->action & ACT_FLAG_MOVING || gMarioState->action & ACT_FLAG_AIR || (gMarioState->action & ACT_FLAG_SWIMMING && !gMarioState->waterLevel-100 - gMarioState->pos[1] > 5 && gMarioState->forwardVel != 0.0f)) - { - //Clamp the height when moving. You can still look up and down to a reasonable degree but it readjusts itself the second you let go. - if (gPuppyCam.pitchTarget > 0x3800) - gPuppyCam.pitchTarget = approach_f32_asymptotic(gPuppyCam.pitchTarget, 0x3800, 0.2f); - - if (gPuppyCam.pitchTarget < 0x2000) - gPuppyCam.pitchTarget = approach_f32_asymptotic(gPuppyCam.pitchTarget, 0x2000, 0.2f); + } + // Attempts at automatic adjustment that only apply when moving or jumping. + if (gMarioState->action & ACT_FLAG_MOVING || gMarioState->action & ACT_FLAG_AIR || (gMarioState->action & ACT_FLAG_SWIMMING && !gMarioState->waterLevel-100 - gMarioState->pos[1] > 5 && gMarioState->forwardVel != 0.0f)) { + // Clamp the height when moving. You can still look up and down to a reasonable degree but it readjusts itself the second you let go. + if (gPuppyCam.pitchTarget > 0x3800) gPuppyCam.pitchTarget = approach_f32_asymptotic(gPuppyCam.pitchTarget, 0x3800, 0.2f); + if (gPuppyCam.pitchTarget < 0x2000) gPuppyCam.pitchTarget = approach_f32_asymptotic(gPuppyCam.pitchTarget, 0x2000, 0.2f); } - //Applies a light outward zoom to the camera when moving. Sets it back to 0 when not moving. - if (gMarioState->forwardVel > 0) - { + // Applies a light outward zoom to the camera when moving. Sets it back to 0 when not moving. + if (gMarioState->forwardVel > 0) { gPuppyCam.moveZoom = approach_f32(gPuppyCam.moveZoom, 100.0f*(gMarioState->forwardVel/32.0f), gMarioState->forwardVel/10, gMarioState->forwardVel/10); - } - else - { + } else { gPuppyCam.moveZoom = approach_f32(gPuppyCam.moveZoom, 0, 5, 5); } - //Zooms the camera in further when underwater. - if (gPuppyCam.pitch > 0x38C0 && ABS(gPuppyCam.swimPitch) < 100) - { - gPuppyCam.zoom = approach_f32_asymptotic((f32)gPuppyCam.zoom, 250.0f, CLAMP((f32)((gPuppyCam.pitch-0x38C0)/3072.0f), 0.0f, 1.0f)); + // Zooms the camera in further when underwater. + if (gPuppyCam.pitch > 0x38C0 && ABS(gPuppyCam.swimPitch) < 100) { + gPuppyCam.zoom = approach_f32_asymptotic((f32)gPuppyCam.zoom, 250.0f, CLAMP((f32)((gPuppyCam.pitch - 0x38C0) / 3072.0f), 0.0f, 1.0f)); } - if (!(gMarioState->action & ACT_FLAG_SWIMMING)) - { + if (!(gMarioState->action & ACT_FLAG_SWIMMING)) { gPuppyCam.floorY[0] = softClamp(gPuppyCam.targetObj->oPosY - gPuppyCam.lastTargetFloorHeight, -180, 300); gPuppyCam.floorY[1] = softClamp(gPuppyCam.targetObj->oPosY - gPuppyCam.lastTargetFloorHeight, -180, 350); gPuppyCam.swimPitch = approach_f32_asymptotic(gPuppyCam.swimPitch,0,0.2f); - } - else - { + } else { gPuppyCam.floorY[0] = 0; gPuppyCam.floorY[1] = 0; gPuppyCam.targetFloorHeight = gPuppyCam.targetObj->oPosY; gPuppyCam.lastTargetFloorHeight = gPuppyCam.targetObj->oPosY; gPuppyCam.yawTarget = approach_angle(gPuppyCam.yawTarget, (gMarioState->faceAngle[1] + 0x8000), (1000 * (gMarioState->forwardVel / 32))); - if (gMarioState->waterLevel-100 - gMarioState->pos[1] > 5 && gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_PITCH_ROTATION) - gPuppyCam.swimPitch = approach_f32_asymptotic(gPuppyCam.swimPitch,gMarioState->faceAngle[0]/10,0.05f); - else - gPuppyCam.swimPitch = approach_f32_asymptotic(gPuppyCam.swimPitch,0,0.2f); + if (gMarioState->waterLevel - 100 - gMarioState->pos[1] > 5 && gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_PITCH_ROTATION) { + gPuppyCam.swimPitch = approach_f32_asymptotic(gPuppyCam.swimPitch,gMarioState->faceAngle[0] / 10, 0.05f); + } else { + gPuppyCam.swimPitch = approach_f32_asymptotic(gPuppyCam.swimPitch, 0, 0.2f); + } } - //This sets the view offset from Mario. It accentuates a bit further when moving. + // This sets the view offset from Mario. It accentuates a bit further when moving. puppycam_view_panning(); - //This sets a pseudo tilt offset based on the floor heights in front and behind mario. + // This sets a pseudo tilt offset based on the floor heights in front and behind mario. puppycam_terrain_angle(); - //This will shift the intended yaw when wall kicking, to align with the wall being kicked. - //puppycam_wall_angle(); - } - else - { + // This will shift the intended yaw when wall kicking, to align with the wall being kicked. + // puppycam_wall_angle(); + } else { puppycam_reset_values(); } } -void puppycam_shake(UNUSED s16 x, UNUSED s16 y, UNUSED s16 z) -{ +void puppycam_shake(UNUSED s16 x, UNUSED s16 y, UNUSED s16 z) { } -///This is the highest level of the basic steps that go into the code. Anything above is called from these following functions. +/// This is the highest level of the basic steps that go into the code. Anything above is called from these following functions. -//The centrepiece behind the input side of PuppyCam. The C buttons branch off. -static void puppycam_input_core(void) -{ +// The centrepiece behind the input side of PuppyCam. The C buttons branch off. +static void puppycam_input_core(void) { puppycam_analogue_stick(); gPuppyCam.moveFlagAdd = 0; - //Decide which input for left and right C buttons to use based on behaviour type. - if (gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_INPUT_NORMAL || gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_FREE) + // Decide which input for left and right C buttons to use based on behaviour type. + if (gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_INPUT_NORMAL || gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_FREE) { puppycam_input_hold(); - else - if (gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_INPUT_8DIR || gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_INPUT_4DIR) + } else if (gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_INPUT_8DIR || gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_INPUT_4DIR) { puppycam_input_press(); + } } -//Calculates the base position the camera should be, before any modification. -static void puppycam_projection(void) -{ +// Calculates the base position the camera should be, before any modification. +static void puppycam_projection(void) { Vec3s targetPos, targetPos2, targetPos3; s16 pitchTotal; - s32 panD = (gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_PANSHIFT)/8192; + s32 panD = (gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_PANSHIFT) / 8192; - if (gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_FREE) - { + if (gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_FREE) { puppycam_reset_values(); puppycam_debug_view(); return; } - //Extra behaviours that get tacked onto the projection. Will be completely ignored if there is no target object. + // Extra behaviours that get tacked onto the projection. Will be completely ignored if there is no target object. puppycam_projection_behaviours(); - //These are what the base rotations aspire to be. - gPuppyCam.pitch = CLAMP(gPuppyCam.pitch,0x1000,0x7000); - gPuppyCam.pitchTarget = CLAMP(gPuppyCam.pitchTarget,0x1000,0x7000); - //These are the base rotations going to be used. - gPuppyCam.yaw = gPuppyCam.yawTarget - approach_f32_asymptotic((s16)(gPuppyCam.yawTarget - gPuppyCam.yaw), 0, 0.3335f); + // These are what the base rotations aspire to be. + gPuppyCam.pitch = CLAMP(gPuppyCam.pitch, 0x1000, 0x7000); + gPuppyCam.pitchTarget = CLAMP(gPuppyCam.pitchTarget, 0x1000, 0x7000); + // These are the base rotations going to be used. + gPuppyCam.yaw = gPuppyCam.yawTarget - approach_f32_asymptotic((s16)(gPuppyCam.yawTarget - gPuppyCam.yaw ), 0, 0.3335f); gPuppyCam.pitch = gPuppyCam.pitchTarget - approach_f32_asymptotic((s16)(gPuppyCam.pitchTarget - gPuppyCam.pitch), 0, 0.3335f); - //This adds the pitch effect when underwater, which is capped so it doesn't get out of control. If you're not swimming, swimpitch is 0, so it's normal. + // This adds the pitch effect when underwater, which is capped so it doesn't get out of control. If you're not swimming, swimpitch is 0, so it's normal. pitchTotal = CLAMP(gPuppyCam.pitch+(gPuppyCam.swimPitch*10)+gPuppyCam.edgePitch + gPuppyCam.terrainPitch, 800, 0x7800); - if (gPuppyCam.targetObj) - { + if (gPuppyCam.targetObj) { vec3s_set(targetPos, gPuppyCam.targetObj->oPosX, gPuppyCam.targetObj->oPosY, gPuppyCam.targetObj->oPosZ); vec3s_copy(targetPos3, targetPos); - if (gPuppyCam.targetObj2) - { + if (gPuppyCam.targetObj2) { vec3s_set(targetPos2, gPuppyCam.targetObj2->oPosX, gPuppyCam.targetObj2->oPosY, gPuppyCam.targetObj2->oPosZ); targetPos3[0] = (s16)approach_f32_asymptotic(targetPos[0], targetPos2[0], 0.5f); targetPos3[1] = (s16)approach_f32_asymptotic(targetPos[1], targetPos2[1], 0.5f); targetPos3[2] = (s16)approach_f32_asymptotic(targetPos[2], targetPos2[2], 0.5f); gPuppyCam.targetDist[0] = approach_f32_asymptotic(gPuppyCam.targetDist[0],(ABS(LENCOS(sqrtf(((targetPos[0]-targetPos2[0])*(targetPos[0]-targetPos2[0]))+((targetPos[2]-targetPos2[2])*(targetPos[2]-targetPos2[2]))), (s16)ABS(((gPuppyCam.yaw + 0x8000) % 0xFFFF - 0x8000) - (atan2s(targetPos[2]-targetPos2[2], targetPos[0]-targetPos2[0])) % 0xFFFF - 0x8000)+0x4000))), 0.2f); - } - else - { + } else { gPuppyCam.targetDist[0] = approach_f32_asymptotic(gPuppyCam.targetDist[0], 0, 0.2f); } gPuppyCam.targetDist[1] = gPuppyCam.targetDist[0] + gPuppyCam.zoom+gPuppyCam.moveZoom; - if (gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_X_MOVEMENT) - gPuppyCam.focus[0] = targetPos3[0] + gPuppyCam.shake[0] + (gPuppyCam.pan[0]*gPuppyCam.targetDist[1]/gPuppyCam.zoomPoints[2])*panD; - if (gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_Y_MOVEMENT) - gPuppyCam.focus[1] = targetPos3[1] + gPuppyCam.shake[1] + (gPuppyCam.pan[1]*gPuppyCam.targetDist[1]/gPuppyCam.zoomPoints[2]) + gPuppyCam.povHeight - gPuppyCam.floorY[0] + (gPuppyCam.swimPitch/10); - if (gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_Z_MOVEMENT) - gPuppyCam.focus[2] = targetPos3[2] + gPuppyCam.shake[2] + (gPuppyCam.pan[2]*gPuppyCam.targetDist[1]/gPuppyCam.zoomPoints[2])*panD; + if (gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_X_MOVEMENT) gPuppyCam.focus[0] = targetPos3[0] + gPuppyCam.shake[0] + (gPuppyCam.pan[0] * gPuppyCam.targetDist[1] / gPuppyCam.zoomPoints[2]) * panD; + if (gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_Y_MOVEMENT) gPuppyCam.focus[1] = targetPos3[1] + gPuppyCam.shake[1] + (gPuppyCam.pan[1] * gPuppyCam.targetDist[1] / gPuppyCam.zoomPoints[2]) + gPuppyCam.povHeight - gPuppyCam.floorY[0] + (gPuppyCam.swimPitch / 10); + if (gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_Z_MOVEMENT) gPuppyCam.focus[2] = targetPos3[2] + gPuppyCam.shake[2] + (gPuppyCam.pan[2] * gPuppyCam.targetDist[1] / gPuppyCam.zoomPoints[2]) * panD; - if (gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_X_MOVEMENT) - gPuppyCam.pos[0] = gPuppyCam.targetObj->oPosX + LENSIN(LENSIN(gPuppyCam.targetDist[1],pitchTotal),gPuppyCam.yaw) + gPuppyCam.shake[0]; - if (gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_Y_MOVEMENT) - gPuppyCam.pos[1] = gPuppyCam.targetObj->oPosY + gPuppyCam.povHeight + LENCOS(gPuppyCam.targetDist[1],pitchTotal) + gPuppyCam.shake[1] - gPuppyCam.floorY[1]; - if (gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_Z_MOVEMENT) - gPuppyCam.pos[2] = gPuppyCam.targetObj->oPosZ + LENCOS(LENSIN(gPuppyCam.targetDist[1],pitchTotal),gPuppyCam.yaw) + gPuppyCam.shake[2]; + if (gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_X_MOVEMENT) gPuppyCam.pos[0] = gPuppyCam.targetObj->oPosX + LENSIN(LENSIN(gPuppyCam.targetDist[1], pitchTotal), gPuppyCam.yaw) + gPuppyCam.shake[0]; + if (gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_Y_MOVEMENT) gPuppyCam.pos[1] = gPuppyCam.targetObj->oPosY + gPuppyCam.povHeight + LENCOS(gPuppyCam.targetDist[1], pitchTotal) + gPuppyCam.shake[1] - gPuppyCam.floorY[1]; + if (gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_Z_MOVEMENT) gPuppyCam.pos[2] = gPuppyCam.targetObj->oPosZ + LENCOS(LENSIN(gPuppyCam.targetDist[1], pitchTotal), gPuppyCam.yaw) + gPuppyCam.shake[2]; } } -//Calls any scripts to affect the camera, if applicable. -static void puppycam_script(void) -{ +// Calls any scripts to affect the camera, if applicable. +static void puppycam_script(void) { u16 i = 0; struct sPuppyVolume volume; - if (gPuppyVolumeCount == 0 || !gPuppyCam.targetObj) + if (gPuppyVolumeCount == 0 || !gPuppyCam.targetObj) { return; + } + for (i = 0; i < gPuppyVolumeCount; i++) { + if (puppycam_check_volume_bounds(&volume, i)) { + // First applies pos and focus, for the most basic of volumes. + if (volume.angles != NULL) { + if (volume.angles->pos[0] != PUPPY_NULL) gPuppyCam.pos[0] = volume.angles->pos[0]; + if (volume.angles->pos[1] != PUPPY_NULL) gPuppyCam.pos[1] = volume.angles->pos[1]; + if (volume.angles->pos[2] != PUPPY_NULL) gPuppyCam.pos[2] = volume.angles->pos[2]; - for (i = 0; i < gPuppyVolumeCount; i++) - { - if (puppycam_check_volume_bounds(&volume, i)) - { - //First applies pos and focus, for the most basic of volumes. - if (volume.angles != NULL) - { - if (volume.angles->pos[0] != PUPPY_NULL) - gPuppyCam.pos[0] = volume.angles->pos[0]; - if (volume.angles->pos[1] != PUPPY_NULL) - gPuppyCam.pos[1] = volume.angles->pos[1]; - if (volume.angles->pos[2] != PUPPY_NULL) - gPuppyCam.pos[2] = volume.angles->pos[2]; + if (volume.angles->focus[0] != PUPPY_NULL) gPuppyCam.focus[0] = volume.angles->focus[0]; + if (volume.angles->focus[1] != PUPPY_NULL) gPuppyCam.focus[1] = volume.angles->focus[1]; + if (volume.angles->focus[2] != PUPPY_NULL) gPuppyCam.focus[2] = volume.angles->focus[2]; - if (volume.angles->focus[0] != PUPPY_NULL) - gPuppyCam.focus[0] = volume.angles->focus[0]; - if (volume.angles->focus[1] != PUPPY_NULL) - gPuppyCam.focus[1] = volume.angles->focus[1]; - if (volume.angles->focus[2] != PUPPY_NULL) - gPuppyCam.focus[2] = volume.angles->focus[2]; - - if (volume.angles->yaw != PUPPY_NULL) - { + if (volume.angles->yaw != PUPPY_NULL) { gPuppyCam.yawTarget = volume.angles->yaw; - gPuppyCam.yaw = volume.angles->yaw; + gPuppyCam.yaw = volume.angles->yaw; gPuppyCam.flags &= ~PUPPYCAM_BEHAVIOUR_YAW_ROTATION; } - if (volume.angles->pitch != PUPPY_NULL) - { + if (volume.angles->pitch != PUPPY_NULL) { gPuppyCam.pitchTarget = volume.angles->pitch; - gPuppyCam.pitch = volume.angles->pitch; + gPuppyCam.pitch = volume.angles->pitch; gPuppyCam.flags &= ~PUPPYCAM_BEHAVIOUR_PITCH_ROTATION; } - if (volume.angles->zoom != PUPPY_NULL) - { + if (volume.angles->zoom != PUPPY_NULL) { gPuppyCam.zoomTarget = volume.angles->zoom; - gPuppyCam.zoom = gPuppyCam.zoomTarget; + gPuppyCam.zoom = gPuppyCam.zoomTarget; gPuppyCam.flags &= ~PUPPYCAM_BEHAVIOUR_ZOOM_CHANGE; } } - //Adds and removes behaviour flags, as set. - if (volume.flagsRemove) - gPuppyCam.flags &= ~volume.flagsRemove; - if (volume.flagsAdd) - gPuppyCam.flags |= volume.flagsAdd; - if (volume.flagPersistance == PUPPYCAM_BEHAVIOUR_PERMANENT) - { - //Adds and removes behaviour flags, as set. - if (volume.flagsRemove) - gPuppyCam.intendedFlags &= ~volume.flagsRemove; - if (volume.flagsAdd) - gPuppyCam.intendedFlags |= volume.flagsAdd; + // Adds and removes behaviour flags, as set. + if (volume.flagsRemove) gPuppyCam.flags &= ~volume.flagsRemove; + if (volume.flagsAdd ) gPuppyCam.flags |= volume.flagsAdd; + if (volume.flagPersistance == PUPPYCAM_BEHAVIOUR_PERMANENT) { + // Adds and removes behaviour flags, as set. + if (volume.flagsRemove) gPuppyCam.intendedFlags &= ~volume.flagsRemove; + if (volume.flagsAdd ) gPuppyCam.intendedFlags |= volume.flagsAdd; } - //Last and probably least, check if there's a function attached, and call it, if so. + // Last and probably least, check if there's a function attached, and call it, if so. if (volume.func) { (volume.func)(); } @@ -1443,35 +1239,32 @@ static void puppycam_script(void) } //Handles collision detection using ray casting. -static void puppycam_collision(void) -{ +static void puppycam_collision(void) { struct WallCollisionData wall0, wall1; struct Surface *surf[2]; Vec3f camdir[2]; Vec3f hitpos[2]; Vec3f target[2]; - s16 pitchTotal = CLAMP(gPuppyCam.pitch+(gPuppyCam.swimPitch*10) + gPuppyCam.edgePitch + gPuppyCam.terrainPitch, 800, 0x7800); + s16 pitchTotal = CLAMP(gPuppyCam.pitch+(gPuppyCam.swimPitch * 10) + gPuppyCam.edgePitch + gPuppyCam.terrainPitch, 800, 0x7800); s32 dist[2]; - if (gPuppyCam.targetObj == NULL) + if (gPuppyCam.targetObj == NULL) { return; - - //The ray, starting from the top + } + // The ray, starting from the top target[0][0] = gPuppyCam.targetObj->oPosX; target[0][1] = gPuppyCam.targetObj->oPosY + (gPuppyCam.povHeight) - CLAMP(gPuppyCam.targetObj->oPosY - gPuppyCam.targetFloorHeight, 0, 300); target[0][2] = gPuppyCam.targetObj->oPosZ; - //The ray, starting from the bottom + // The ray, starting from the bottom target[1][0] = gPuppyCam.targetObj->oPosX; - target[1][1] = gPuppyCam.targetObj->oPosY + (gPuppyCam.povHeight *0.4f); + target[1][1] = gPuppyCam.targetObj->oPosY + (gPuppyCam.povHeight * 0.4f); target[1][2] = gPuppyCam.targetObj->oPosZ; camdir[0][0] = LENSIN(LENSIN(gPuppyCam.zoomTarget,pitchTotal),gPuppyCam.yaw) + gPuppyCam.shake[0]; camdir[0][1] = LENCOS(gPuppyCam.zoomTarget,pitchTotal) + gPuppyCam.shake[1]; camdir[0][2] = LENCOS(LENSIN(gPuppyCam.zoomTarget,pitchTotal),gPuppyCam.yaw) + gPuppyCam.shake[2]; - camdir[1][0] = camdir[0][0]; - camdir[1][1] = camdir[0][1]; - camdir[1][2] = camdir[0][2]; + vec3_copy(camdir[1], camdir[0]); find_surface_on_ray(target[0], camdir[0], &surf[0], hitpos[0], RAYCAST_FIND_FLOOR | RAYCAST_FIND_CEIL | RAYCAST_FIND_WALL); find_surface_on_ray(target[1], camdir[1], &surf[1], hitpos[1], RAYCAST_FIND_FLOOR | RAYCAST_FIND_CEIL | RAYCAST_FIND_WALL); @@ -1482,97 +1275,80 @@ static void puppycam_collision(void) gPuppyCam.collisionDistance = gPuppyCam.zoomTarget; - if (surf[0] && surf[1]) - { + if (surf[0] && surf[1]) { gPuppyCam.collisionDistance = sqrtf(MAX(dist[0], dist[1])); - if (gPuppyCam.zoom > gPuppyCam.collisionDistance) - { + if (gPuppyCam.zoom > gPuppyCam.collisionDistance) { gPuppyCam.zoom = MIN(gPuppyCam.collisionDistance, gPuppyCam.zoomTarget); - if (gPuppyCam.zoom - gPuppyCam.zoomTarget < 5) - { - if (dist[0] >= dist[1]) - { - gPuppyCam.pos[0] = hitpos[0][0]; - gPuppyCam.pos[1] = hitpos[0][1]; - gPuppyCam.pos[2] = hitpos[0][2]; - } - else - { + if (gPuppyCam.zoom - gPuppyCam.zoomTarget < 5) { + if (dist[0] >= dist[1]) { + vec3_copy(gPuppyCam.pos, hitpos[0]); + } else { gPuppyCam.pos[0] = hitpos[1][0]; - gPuppyCam.pos[1] = hitpos[1][1] + (gPuppyCam.povHeight*0.6f); + gPuppyCam.pos[1] = hitpos[1][1] + (gPuppyCam.povHeight * 0.6f); gPuppyCam.pos[2] = hitpos[1][2]; } } } } - #define START_DIST 500 - #define END_DIST 250 - gPuppyCam.opacity = CLAMP((f32)(((gPuppyCam.zoom-END_DIST)/255.0f)*(START_DIST-END_DIST)), 0, 255); + #define END_DIST 250 + gPuppyCam.opacity = CLAMP((f32)(((gPuppyCam.zoom - END_DIST) / 255.0f) * (START_DIST - END_DIST)), 0, 255); } extern Vec3f sOldPosition; extern Vec3f sOldFocus; extern struct PlayerGeometry sMarioGeometry; -//Applies the PuppyCam values to the actual game's camera, giving the final product. -static void puppycam_apply(void) -{ - vec3f_set(gLakituState.pos, (f32)gPuppyCam.pos[0], (f32)gPuppyCam.pos[1], (f32)gPuppyCam.pos[2]); - vec3f_set(gLakituState.goalPos, (f32)gPuppyCam.pos[0], (f32)gPuppyCam.pos[1], (f32)gPuppyCam.pos[2]); - vec3f_set(gLakituState.curPos, (f32)gPuppyCam.pos[0], (f32)gPuppyCam.pos[1], (f32)gPuppyCam.pos[2]); - vec3f_set(gCamera->pos, (f32)gPuppyCam.pos[0], (f32)gPuppyCam.pos[1], (f32)gPuppyCam.pos[2]); - vec3f_set(sOldPosition, (f32)gPuppyCam.pos[0], (f32)gPuppyCam.pos[1], (f32)gPuppyCam.pos[2]); +// Applies the PuppyCam values to the actual game's camera, giving the final product. +static void puppycam_apply(void) { + vec3f_set(gLakituState.pos, (f32)gPuppyCam.pos[0], (f32)gPuppyCam.pos[1], (f32)gPuppyCam.pos[2]); + vec3f_set(gLakituState.goalPos, (f32)gPuppyCam.pos[0], (f32)gPuppyCam.pos[1], (f32)gPuppyCam.pos[2]); + vec3f_set(gLakituState.curPos, (f32)gPuppyCam.pos[0], (f32)gPuppyCam.pos[1], (f32)gPuppyCam.pos[2]); + vec3f_set(gCamera->pos, (f32)gPuppyCam.pos[0], (f32)gPuppyCam.pos[1], (f32)gPuppyCam.pos[2]); + vec3f_set(sOldPosition, (f32)gPuppyCam.pos[0], (f32)gPuppyCam.pos[1], (f32)gPuppyCam.pos[2]); - vec3f_set(gLakituState.focus, (f32)gPuppyCam.focus[0], (f32)gPuppyCam.focus[1], (f32)gPuppyCam.focus[2]); + vec3f_set(gLakituState.focus, (f32)gPuppyCam.focus[0], (f32)gPuppyCam.focus[1], (f32)gPuppyCam.focus[2]); vec3f_set(gLakituState.goalFocus, (f32)gPuppyCam.focus[0], (f32)gPuppyCam.focus[1], (f32)gPuppyCam.focus[2]); - vec3f_set(gLakituState.curFocus, (f32)gPuppyCam.focus[0], (f32)gPuppyCam.focus[1], (f32)gPuppyCam.focus[2]); - vec3f_set(gCamera->focus, (f32)gPuppyCam.focus[0], (f32)gPuppyCam.focus[1], (f32)gPuppyCam.focus[2]); - vec3f_set(sOldFocus, (f32)gPuppyCam.focus[0], (f32)gPuppyCam.focus[1], (f32)gPuppyCam.focus[2]); + vec3f_set(gLakituState.curFocus, (f32)gPuppyCam.focus[0], (f32)gPuppyCam.focus[1], (f32)gPuppyCam.focus[2]); + vec3f_set(gCamera->focus, (f32)gPuppyCam.focus[0], (f32)gPuppyCam.focus[1], (f32)gPuppyCam.focus[2]); + vec3f_set(sOldFocus, (f32)gPuppyCam.focus[0], (f32)gPuppyCam.focus[1], (f32)gPuppyCam.focus[2]); - gCamera->yaw = gPuppyCam.yaw; - gCamera->nextYaw = gPuppyCam.yaw; + gCamera->yaw = gPuppyCam.yaw; + gCamera->nextYaw = gPuppyCam.yaw; - gLakituState.yaw = gPuppyCam.yaw; + gLakituState.yaw = gPuppyCam.yaw; gLakituState.nextYaw = gPuppyCam.yaw; - gLakituState.oldYaw = gPuppyCam.yaw; + gLakituState.oldYaw = gPuppyCam.yaw; - gLakituState.mode = gCamera->mode; + gLakituState.mode = gCamera->mode; gLakituState.defMode = gCamera->defMode; - gLakituState.roll = approach_s32(gLakituState.roll, 0, 0x80, 0x80); + gLakituState.roll = approach_s32(gLakituState.roll, 0, 0x80, 0x80); - //Commented out simply because vanilla SM64 has this always set sometimes, and relies on certain camera modes to apply secondary foci. - //Uncomment to have fun with certain angles. - /*if (gSecondCameraFocus != NULL) - { + // Commented out simply because vanilla SM64 has this always set sometimes, and relies on certain camera modes to apply secondary foci. + // Uncomment to have fun with certain angles. + /*if (gSecondCameraFocus != NULL) { gPuppyCam.targetObj2 = gSecondCameraFocus; - } - else - { + } else { gPuppyCam.targetObj2 = NULL; }*/ - if (gMarioState->floor != NULL) - { - sMarioGeometry.currFloor = gMarioState->floor; + if (gMarioState->floor != NULL) { + sMarioGeometry.currFloor = gMarioState->floor; sMarioGeometry.currFloorHeight = gMarioState->floorHeight; - sMarioGeometry.currFloorType = gMarioState->floor->type; + sMarioGeometry.currFloorType = gMarioState->floor->type; } - if (gMarioState->ceil != NULL) - { - sMarioGeometry.currCeil = gMarioState->ceil; - sMarioGeometry.currCeilHeight = gMarioState->ceilHeight; - sMarioGeometry.currCeilType = gMarioState->ceil->type; + if (gMarioState->ceil != NULL) { + sMarioGeometry.currCeil = gMarioState->ceil; + sMarioGeometry.currCeilHeight = gMarioState->ceilHeight; + sMarioGeometry.currCeilType = gMarioState->ceil->type; } } -//The basic loop sequence, which is called outside. -void puppycam_loop(void) -{ - if (!gPuppyCam.cutscene && sDelayedWarpOp == 0) - { - //Sets this before going through any possible modifications. +// The basic loop sequence, which is called outside. +void puppycam_loop(void) { + if (!gPuppyCam.cutscene && sDelayedWarpOp == 0) { + // Sets this before going through any possible modifications. gPuppyCam.flags = gPuppyCam.intendedFlags; puppycam_input_core(); puppycam_projection(); @@ -1581,10 +1357,7 @@ void puppycam_loop(void) puppycam_collision(); else gPuppyCam.opacity = 255; - } - else - if (gPuppyCam.cutscene) - { + } else if (gPuppyCam.cutscene) { gPuppyCam.opacity = 255; puppycam_process_cutscene(); } diff --git a/src/game/spawn_object.c b/src/game/spawn_object.c index 6a60b716..351cddcc 100644 --- a/src/game/spawn_object.c +++ b/src/game/spawn_object.c @@ -220,8 +220,7 @@ struct Object *allocate_object(struct ObjectNode *objList) { // If no unimportant object exists, then the object pool is exhausted. if (unimportantObj == NULL) { // We've met with a terrible fate. - while (TRUE) { - } + while (TRUE) {} } else { // If an unimportant object does exist, unload it and take its slot. unload_object(unimportantObj); diff --git a/src/goddard/renderer.c b/src/goddard/renderer.c index 5de01758..84044e6c 100644 --- a/src/goddard/renderer.c +++ b/src/goddard/renderer.c @@ -3018,7 +3018,7 @@ void Unknown801A5D90(struct ObjGroup *arg0) { sp23C = FALSE; for (;;) { - trackerNum += 1; + trackerNum++; mt = get_memtracker_by_index(trackerNum); if (mt->name != NULL) { diff --git a/src/goddard/shape_helper.c b/src/goddard/shape_helper.c index 744da1d4..8fa835c0 100644 --- a/src/goddard/shape_helper.c +++ b/src/goddard/shape_helper.c @@ -1181,7 +1181,7 @@ void animate_mario_head_normal(struct ObjAnimator *self) { if (self->frame == 810.0f) { self->frame = 750.0f; - self->nods -= 1; + self->nods--; if (self->nods == 0) { state = 3; } diff --git a/src/menu/file_select.c b/src/menu/file_select.c index f8da9958..dad6024d 100644 --- a/src/menu/file_select.c +++ b/src/menu/file_select.c @@ -2319,7 +2319,7 @@ void print_file_select_strings(void) { sTextBaseAlpha += 10; } if (sMainMenuTimer < 1000) { - sMainMenuTimer += 1; + sMainMenuTimer++; } } From 3f4728e33778cb46fb602412f7a1238e55d8b984 Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Mon, 27 Sep 2021 14:00:10 -0700 Subject: [PATCH 10/97] Configurable wall kick angle in degrees --- include/config.h | 4 +- src/engine/math_util.c | 6 ++ src/engine/math_util.h | 6 ++ src/game/camera.h | 6 -- src/game/mario_step.c | 115 +++++++++++++++----------------------- src/game/object_helpers.c | 14 ----- src/game/object_helpers.h | 1 - 7 files changed, 59 insertions(+), 93 deletions(-) diff --git a/include/config.h b/include/config.h index 7665ea0c..9d8b9189 100644 --- a/include/config.h +++ b/include/config.h @@ -93,8 +93,8 @@ #define HANGING_FIX // The last frame that will be considered a firsty when wallkicking #define FIRSTY_LAST_FRAME 1 -// 46 degree walkicks -//#define WALLKICKS_46_DEGREES +// The maximum angle the player can wall kick, in degrees. 0..90 +#define WALL_KICK_DEGREES 45 // Disable BLJs and crush SimpleFlips's dreams //#define DISABLE_BLJ diff --git a/src/engine/math_util.c b/src/engine/math_util.c index 0dc5d8f5..80c3c101 100644 --- a/src/engine/math_util.c +++ b/src/engine/math_util.c @@ -869,6 +869,12 @@ s32 approach_s16_asymptotic(s16 current, s16 target, s16 divisor) { return current; } +s16 abs_angle_diff(s16 a0, s16 a1) { + s16 diff = (a1 - a0); + if (diff == -0x8000) diff = -0x7FFF; + return ABSI(diff); +} + /** * Helper function for atan2s. Does a look up of the arctangent of y/x assuming * the resulting angle is in range [0, 0x2000] (1/8 of a circle). diff --git a/src/engine/math_util.h b/src/engine/math_util.h index 17a605c6..41c403e2 100644 --- a/src/engine/math_util.h +++ b/src/engine/math_util.h @@ -5,6 +5,11 @@ #include "types.h" +/** + * Converts an angle in degrees to sm64's s16 angle units. For example, DEGREES(90) == 0x4000 + * This should be used mainly to make camera code clearer at first glance. + */ +#define DEGREES(x) ((x) * 0x10000 / 360) /* * The sine and cosine tables overlap, but "#define gCosineTable (gSineTable + @@ -412,6 +417,7 @@ s32 approach_f32_asymptotic_bool(f32 *current, f32 target, f32 multiplier); f32 approach_f32_asymptotic(f32 current, f32 target, f32 multiplier); s32 approach_s16_asymptotic_bool(s16 *current, s16 target, s16 divisor); s32 approach_s16_asymptotic(s16 current, s16 target, s16 divisor); +s16 abs_angle_diff(s16 a0, s16 a1); s16 atan2s(f32 y, f32 x); f32 atan2f(f32 a, f32 b); void spline_get_weights(Vec4f result, f32 t, UNUSED s32 c); diff --git a/src/game/camera.h b/src/game/camera.h index b4bf74e6..122fb35d 100644 --- a/src/game/camera.h +++ b/src/game/camera.h @@ -21,12 +21,6 @@ * @see camera.c */ -/** - * Converts an angle in degrees to sm64's s16 angle units. For example, DEGREES(90) == 0x4000 - * This should be used mainly to make camera code clearer at first glance. - */ -#define DEGREES(x) ((x) * 0x10000 / 360) - #define LEVEL_AREA_INDEX(levelNum, areaNum) (((levelNum) << 4) + (areaNum)) /** diff --git a/src/game/mario_step.c b/src/game/mario_step.c index c3ddeb9b..3a2d5002 100644 --- a/src/game/mario_step.c +++ b/src/game/mario_step.c @@ -63,13 +63,15 @@ void transfer_bully_speed(struct BullyCollisionData *obj1, struct BullyCollision f32 projectedV1 = ( rx * obj1->velX + rz * obj1->velZ) / rzx; f32 projectedV2 = (-rx * obj2->velX - rz * obj2->velZ) / rzx; - // Kill speed along r. Convert one object's speed along r and transfer it to - // the other object. - obj2->velX += obj2->conversionRatio * projectedV1 * rx - projectedV2 * -rx; - obj2->velZ += obj2->conversionRatio * projectedV1 * rz - projectedV2 * -rz; - - obj1->velX += -projectedV1 * rx + obj1->conversionRatio * projectedV2 * -rx; - obj1->velZ += -projectedV1 * rz + obj1->conversionRatio * projectedV2 * -rz; + // Kill speed along r. Convert one object's speed along r and transfer it to the other object. + f32 p1x = projectedV1 * rx; + f32 p1z = projectedV1 * rz; + f32 p2x = projectedV2 * -rx; + f32 p2z = projectedV2 * -rz; + obj2->velX += (obj2->conversionRatio * p1x) - p2x; + obj2->velZ += (obj2->conversionRatio * p1z) - p2z; + obj1->velX += -p1x + (obj1->conversionRatio * p2x); + obj1->velZ += -p1z + (obj1->conversionRatio * p2z); //! Bully battery } @@ -259,26 +261,20 @@ s32 stationary_ground_step(struct MarioState *m) { } static s32 perform_ground_quarter_step(struct MarioState *m, Vec3f nextPos) { - struct WallCollisionData lowerWall; - struct WallCollisionData upperWall; - struct Surface *ceil; - struct Surface *floor; - f32 ceilHeight; - f32 floorHeight; - f32 waterLevel; + struct WallCollisionData lowerWall, upperWall; + struct Surface *ceil, *floor; s16 i; s16 wallDYaw; s32 oldWallDYaw; - s32 absWallDYaw; resolve_and_return_wall_collisions(nextPos, 30.0f, 24.0f, &lowerWall); resolve_and_return_wall_collisions(nextPos, 60.0f, 50.0f, &upperWall); - floorHeight = find_floor(nextPos[0], nextPos[1], nextPos[2], &floor); - ceilHeight = find_ceil(nextPos[0], nextPos[1] + 3.0f, nextPos[2], &ceil); + f32 floorHeight = find_floor(nextPos[0], nextPos[1], nextPos[2], &floor); + f32 ceilHeight = find_ceil(nextPos[0], nextPos[1] + 3.0f, nextPos[2], &ceil); - waterLevel = find_water_level(nextPos[0], nextPos[2]); + f32 waterLevel = find_water_level(nextPos[0], nextPos[2]); if (floor == NULL) { return GROUND_STEP_HIT_WALL_STOP_QSTEPS; @@ -310,24 +306,20 @@ static s32 perform_ground_quarter_step(struct MarioState *m, Vec3f nextPos) { if (m->wall != NULL) { oldWallDYaw = atan2s(m->wall->normal.z, m->wall->normal.x) - m->faceAngle[1]; - oldWallDYaw = oldWallDYaw < 0 ? -oldWallDYaw : oldWallDYaw; + oldWallDYaw = ABSI(oldWallDYaw); } else { - oldWallDYaw = 0; + oldWallDYaw = 0x0; } for (i = 0; i < upperWall.numWalls; i++) { - wallDYaw = atan2s(upperWall.walls[i]->normal.z, upperWall.walls[i]->normal.x) - m->faceAngle[1]; - absWallDYaw = wallDYaw < 0 ? -wallDYaw : wallDYaw; - if (absWallDYaw > oldWallDYaw) { - oldWallDYaw = absWallDYaw; + wallDYaw = abs_angle_diff(atan2s(upperWall.walls[i]->normal.z, upperWall.walls[i]->normal.x), m->faceAngle[1]); + if (wallDYaw > oldWallDYaw) { + oldWallDYaw = wallDYaw; set_mario_wall(m, upperWall.walls[i]); } if (wallDYaw >= 0x2AAA && wallDYaw <= 0x5555) { continue; } - if (wallDYaw <= -0x2AAA && wallDYaw >= -0x5555) { - continue; - } return GROUND_STEP_HIT_WALL_CONTINUE_QSTEPS; } @@ -364,8 +356,7 @@ s32 perform_ground_step(struct MarioState *m) { } struct Surface *check_ledge_grab(struct MarioState *m, struct Surface *grabbedWall, struct Surface *wall, Vec3f intendedPos, Vec3f nextPos, Vec3f ledgePos, struct Surface **ledgeFloor) { - f32 displacementX; - f32 displacementZ; + f32 displacementX, displacementZ; if (m->vel[1] > 0) { return FALSE; @@ -401,38 +392,32 @@ s32 bonk_or_hit_lava_wall(struct MarioState *m, struct WallCollisionData *wallDa s16 i; s16 wallDYaw; s32 oldWallDYaw; - s32 absWallDYaw; - s32 result; - result = AIR_STEP_NONE; + s32 result = AIR_STEP_NONE; if (m->wall != NULL) { oldWallDYaw = atan2s(m->wall->normal.z, m->wall->normal.x) - m->faceAngle[1]; - oldWallDYaw = oldWallDYaw < 0 ? -oldWallDYaw : oldWallDYaw; + oldWallDYaw = ABSI(oldWallDYaw); + } else { + oldWallDYaw = 0x0; } - else - oldWallDYaw = 0; - for (i = 0; i < wallData->numWalls; i++) { if (wallData->walls[i] != NULL) { - wallDYaw = atan2s(wallData->walls[i]->normal.z, wallData->walls[i]->normal.x) - m->faceAngle[1]; if (wallData->walls[i]->type == SURFACE_BURNING) { set_mario_wall(m, wallData->walls[i]); return AIR_STEP_HIT_LAVA_WALL; } // Update wall reference (bonked wall) only if the new wall has a better facing angle - absWallDYaw = wallDYaw < 0 ? -wallDYaw : wallDYaw; - if (absWallDYaw > oldWallDYaw) { - oldWallDYaw = absWallDYaw; + wallDYaw = abs_angle_diff(atan2s(wallData->walls[i]->normal.z, wallData->walls[i]->normal.x), m->faceAngle[1]); + if (wallDYaw > oldWallDYaw) { + oldWallDYaw = wallDYaw; set_mario_wall(m, wallData->walls[i]); - if (wallDYaw < -0x6000 || wallDYaw > 0x6000) { + if (wallDYaw > DEGREES(180 - WALL_KICK_DEGREES)) { m->flags |= MARIO_AIR_HIT_WALL; result = AIR_STEP_HIT_WALL; } } - - } } return result; @@ -440,34 +425,24 @@ s32 bonk_or_hit_lava_wall(struct MarioState *m, struct WallCollisionData *wallDa s32 perform_air_quarter_step(struct MarioState *m, Vec3f intendedPos, u32 stepArg) { s16 i; - s32 stepResult; + s32 stepResult = AIR_STEP_NONE; - Vec3f nextPos; - Vec3f ledgePos; - struct WallCollisionData upperWall; - struct WallCollisionData lowerWall; - struct Surface *ceil; - struct Surface *floor; - struct Surface *grabbedWall; - struct Surface *ledgeFloor; - f32 ceilHeight; - f32 floorHeight; - f32 waterLevel; - - grabbedWall = NULL; - stepResult = AIR_STEP_NONE; + Vec3f nextPos, ledgePos; + struct WallCollisionData upperWall, lowerWall; + struct Surface *ceil, *floor, *ledgeFloor; + struct Surface *grabbedWall = NULL; vec3f_copy(nextPos, intendedPos); resolve_and_return_wall_collisions(nextPos, 150.0f, 50.0f, &upperWall); resolve_and_return_wall_collisions(nextPos, 30.0f, 50.0f, &lowerWall); - floorHeight = find_floor(nextPos[0], nextPos[1], nextPos[2], &floor); - ceilHeight = find_ceil(nextPos[0], nextPos[1] + 3.0f, nextPos[2], &ceil); + f32 floorHeight = find_floor(nextPos[0], nextPos[1], nextPos[2], &floor); + f32 ceilHeight = find_ceil(nextPos[0], nextPos[1] + 3.0f, nextPos[2], &ceil); - waterLevel = find_water_level(nextPos[0], nextPos[2]); + f32 waterLevel = find_water_level(nextPos[0], nextPos[2]); - //m->wall = NULL; + // m->wall = NULL; //! The water pseudo floor is not referenced when your intended qstep is // out of bounds, so it won't detect you as landing. @@ -508,12 +483,12 @@ s32 perform_air_quarter_step(struct MarioState *m, Vec3f intendedPos, u32 stepAr m->vel[1] = 0.0f; //! Uses referenced ceiling instead of ceil (ceiling hang upwarp) - #ifdef HANGING_FIX +#ifdef HANGING_FIX if (m->ceil != NULL && m->ceil->type == SURFACE_HANGABLE) { - #else +#else if ((stepArg & AIR_STEP_CHECK_HANG) && m->ceil != NULL && m->ceil->type == SURFACE_HANGABLE) { - #endif +#endif return AIR_STEP_GRABBED_CEILING; } @@ -712,12 +687,12 @@ s32 perform_air_step(struct MarioState *m, u32 stepArg) { vec3s_set(m->marioObj->header.gfx.angle, 0, m->faceAngle[1], 0); /*if (stepResult == AIR_STEP_HIT_WALL && m->wall != NULL) { - wallDYaw = atan2s(m->wall->normal.z, m->wall->normal.x) - m->faceAngle[1]; - if ((stepArg & AIR_STEP_CHECK_BONK) && (wallDYaw < -0x6000 || wallDYaw > 0x6000)) - { - if (m->forwardVel > 16.0f) - mario_bonk_reflection(m, (stepArg & AIR_STEP_BONK_NEGATE_SPEED), m->wall); + wallDYaw = abs_angle_diff(atan2s(m->wall->normal.z, m->wall->normal.x), m->faceAngle[1]); + if ((stepArg & AIR_STEP_CHECK_BONK) && (wallDYaw > DEGREES(180 - WALL_KICK_DEGREES))) { + if (m->forwardVel > 16.0f) { + mario_bonk_reflection(m, (stepArg & AIR_STEP_BONK_NEGATE_SPEED), m->wall); } + } }*/ return stepResult; diff --git a/src/game/object_helpers.c b/src/game/object_helpers.c index 472c30c8..d0a37817 100644 --- a/src/game/object_helpers.c +++ b/src/game/object_helpers.c @@ -1268,20 +1268,6 @@ void cur_obj_unused_resolve_wall_collisions(f32 offsetY, f32 radius) { } } -s16 abs_angle_diff(s16 x0, s16 x1) { - s16 diff = x1 - x0; - - if (diff == -0x8000) { - diff = -0x7FFF; - } - - if (diff < 0) { - diff = -diff; - } - - return diff; -} - void cur_obj_move_xz_using_fvel_and_yaw(void) { o->oVelX = o->oForwardVel * sins(o->oMoveAngleYaw); o->oVelZ = o->oForwardVel * coss(o->oMoveAngleYaw); diff --git a/src/game/object_helpers.h b/src/game/object_helpers.h index 72fcbb9b..0b79ce2c 100644 --- a/src/game/object_helpers.h +++ b/src/game/object_helpers.h @@ -153,7 +153,6 @@ struct Surface *cur_obj_update_floor_height_and_get_floor(void); void cur_obj_apply_drag_xz(f32 dragStrength); void cur_obj_move_y(f32 gravity, f32 bounciness, f32 buoyancy); void cur_obj_unused_resolve_wall_collisions(f32 offsetY, f32 radius); -s16 abs_angle_diff(s16 x0, s16 x1); void cur_obj_move_xz_using_fvel_and_yaw(void); void cur_obj_move_y_with_terminal_vel(void); void cur_obj_compute_vel_xz(void); From a5c1aef42b3a204a33b316e92e9a81407415ab57 Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Mon, 27 Sep 2021 15:01:44 -0700 Subject: [PATCH 11/97] Convert some doubles to floats + remove some unused Goddard functions --- src/game/behavior_actions.c | 2 +- src/game/behaviors/amp.inc.c | 10 +- src/game/behaviors/beta_holdable_object.inc.c | 10 +- src/game/behaviors/beta_trampoline.inc.c | 5 +- src/game/behaviors/bobomb.inc.c | 36 +-- src/game/behaviors/bomp.inc.c | 4 +- src/game/behaviors/boo.inc.c | 8 +- src/game/behaviors/boulder.inc.c | 2 +- src/game/behaviors/bouncing_fireball.inc.c | 2 +- src/game/behaviors/bowling_ball.inc.c | 6 +- src/game/behaviors/bowser.inc.c | 31 ++- src/game/behaviors/bowser_bomb.inc.c | 17 +- src/game/behaviors/bowser_flame.inc.c | 31 +-- src/game/behaviors/bowser_key_cutscene.inc.c | 6 +- src/game/behaviors/bub.inc.c | 2 +- src/game/behaviors/bullet_bill.inc.c | 2 +- src/game/behaviors/bully.inc.c | 33 ++- src/game/behaviors/cap.inc.c | 2 +- src/game/behaviors/celebration_star.inc.c | 4 +- src/game/behaviors/coin.inc.c | 6 +- .../behaviors/controllable_platform.inc.c | 4 +- src/game/behaviors/corkbox.inc.c | 4 +- src/game/behaviors/exclamation_box.inc.c | 8 +- src/game/behaviors/explosion.inc.c | 2 +- .../behaviors/falling_rising_platform.inc.c | 8 +- src/game/behaviors/fish.inc.c | 4 +- src/game/behaviors/flame_mario.inc.c | 4 +- src/game/behaviors/flamethrower.inc.c | 6 +- src/game/behaviors/floating_platform.inc.c | 7 +- src/game/behaviors/heave_ho.inc.c | 4 +- src/game/behaviors/hoot.inc.c | 34 +-- src/game/behaviors/jrb_ship.inc.c | 2 +- src/game/behaviors/koopa_shell.inc.c | 5 +- src/game/behaviors/lll_hexagonal_ring.inc.c | 2 +- src/game/behaviors/manta_ray.inc.c | 15 +- src/game/behaviors/moving_coin.inc.c | 14 +- src/game/behaviors/mr_i.inc.c | 10 +- src/game/behaviors/mushroom_1up.inc.c | 4 +- src/game/behaviors/orange_number.inc.c | 2 +- src/game/behaviors/piranha_bubbles.inc.c | 4 +- src/game/behaviors/piranha_plant.inc.c | 10 +- src/game/behaviors/purple_switch.inc.c | 2 +- src/game/behaviors/seaweed.inc.c | 24 +- src/game/behaviors/snowman.inc.c | 6 +- src/game/behaviors/spindel.inc.c | 2 +- .../behaviors/tilting_inverted_pyramid.inc.c | 2 +- src/game/behaviors/tree_particles.inc.c | 10 +- src/game/behaviors/tweester.inc.c | 4 +- src/game/behaviors/ukiki.inc.c | 2 +- src/game/behaviors/warp.inc.c | 29 +-- src/game/behaviors/water_mist_particle.inc.c | 5 +- src/game/behaviors/water_objs.inc.c | 2 +- src/game/behaviors/water_ring.inc.c | 18 +- .../behaviors/water_splashes_and_waves.inc.c | 4 +- src/game/behaviors/white_puff_explode.inc.c | 4 +- src/game/behaviors/yoshi.inc.c | 4 +- src/game/camera.c | 4 +- src/game/geo_misc.c | 2 +- src/game/hud.c | 4 +- src/game/ingame_menu.c | 25 +- src/game/mario_actions_airborne.c | 2 +- src/game/mario_actions_cutscene.c | 4 +- src/game/mario_actions_moving.c | 2 +- src/game/moving_texture.c | 6 +- src/game/obj_behaviors.c | 73 +++--- src/game/paintings.c | 12 +- src/game/screen_transition.c | 6 +- src/game/shadow.c | 57 ++--- src/game/skybox.c | 9 +- src/goddard/debug_utils.c | 8 +- src/goddard/draw_objects.c | 193 ++------------- src/goddard/dynlist_proc.c | 47 ++-- src/goddard/gd_math.c | 12 +- src/goddard/joints.c | 227 +++--------------- src/goddard/joints.h | 1 - src/goddard/objects.c | 18 +- src/goddard/old_menu.c | 18 +- src/goddard/particles.c | 69 ++---- src/goddard/renderer.c | 24 +- src/goddard/shape_helper.c | 194 +-------------- src/goddard/skin.c | 29 ++- src/menu/file_select.c | 38 +-- src/menu/star_select.c | 14 +- 83 files changed, 490 insertions(+), 1098 deletions(-) diff --git a/src/game/behavior_actions.c b/src/game/behavior_actions.c index 5f02c811..60f770e9 100644 --- a/src/game/behavior_actions.c +++ b/src/game/behavior_actions.c @@ -114,7 +114,7 @@ struct SpawnParticlesInfo sMistParticles = { 2, 20, MODEL_MIST, 0, 40, 5, 30, 20 // generate_wind_puffs/dust (something like that) void spawn_mist_particles_variable(s32 count, s32 offsetY, f32 size) { sMistParticles.sizeBase = size; - sMistParticles.sizeRange = size / 20.0; + sMistParticles.sizeRange = size / 20.0f; sMistParticles.offsetY = offsetY; if (count == 0) { sMistParticles.count = 20; diff --git a/src/game/behaviors/amp.inc.c b/src/game/behaviors/amp.inc.c index 89a22b7c..f9bb9bed 100644 --- a/src/game/behaviors/amp.inc.c +++ b/src/game/behaviors/amp.inc.c @@ -21,12 +21,10 @@ static struct ObjectHitbox sAmpHitbox = { * Homing amp initialization function. */ void bhv_homing_amp_init(void) { - o->oHomeX = o->oPosX; - o->oHomeY = o->oPosY; - o->oHomeZ = o->oPosZ; + vec3_copy(&o->oHomeVec, &o->oPosVec); o->oGravity = 0; - o->oFriction = 1.0; - o->oBuoyancy = 1.0; + o->oFriction = 1.0f; + o->oBuoyancy = 1.0f; o->oHomingAmpAvgY = o->oHomeY; // Homing amps start at 1/10th their normal size. @@ -81,7 +79,7 @@ static void homing_amp_appear_loop(void) { // evaluates to 0.1, which is the same as it was before. After 30 frames, it ends at // a scale factor of 0.97. The amp remains at 97% of its real height for 60 more frames. if (o->oTimer < 30) { - cur_obj_scale(0.1 + 0.9 * (f32)(o->oTimer / 30.0f)); + cur_obj_scale(0.1f + 0.9f * (f32)(o->oTimer / 30.0f)); } else { o->oAnimState = 1; } diff --git a/src/game/behaviors/beta_holdable_object.inc.c b/src/game/behaviors/beta_holdable_object.inc.c index b4ec61f9..7b688a0c 100644 --- a/src/game/behaviors/beta_holdable_object.inc.c +++ b/src/game/behaviors/beta_holdable_object.inc.c @@ -11,9 +11,9 @@ * Just sets various physics constants for the object. */ void bhv_beta_holdable_object_init(void) { - o->oGravity = 2.5; - o->oFriction = 0.8; - o->oBuoyancy = 1.3; + o->oGravity = 2.5f; + o->oFriction = 0.8f; + o->oBuoyancy = 1.3f; } /** @@ -46,8 +46,8 @@ static void beta_holdable_object_throw(void) { o->oFlags &= ~OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW; // Set initial velocity - o->oForwardVel = 40.0; - o->oVelY = 20.0; + o->oForwardVel = 40.0f; + o->oVelY = 20.0f; } /** diff --git a/src/game/behaviors/beta_trampoline.inc.c b/src/game/behaviors/beta_trampoline.inc.c index f9c248f5..31aa3336 100644 --- a/src/game/behaviors/beta_trampoline.inc.c +++ b/src/game/behaviors/beta_trampoline.inc.c @@ -28,9 +28,8 @@ void bhv_beta_trampoline_spring_loop(void) { // scale the spring by (the displacement)/10 + 1. // For this to work correctly, the arbitrary value of 10 // must be replaced with 150 (the height of the trampoline). - // Note that all of the numbers in this if/else block are doubles. if ((yDisplacement = o->oPosY - o->oHomeY) >= 0) { - yScale = yDisplacement / 10.0 + 1.0; + yScale = yDisplacement / 150.0f + 1.0f; } else { // Otherwise (if the trampoline is compressed), // scale by 1 - (the displacement)/500. @@ -38,7 +37,7 @@ void bhv_beta_trampoline_spring_loop(void) { // must be replaced with 150 (the height of the trampoline), // as with the above code. yDisplacement = -yDisplacement; - yScale = 1.0 - yDisplacement / 500.0; + yScale = 1.0f - yDisplacement / 150.0f; } // Scale the spring diff --git a/src/game/behaviors/bobomb.inc.c b/src/game/behaviors/bobomb.inc.c index 6c60e5d2..d184b93f 100644 --- a/src/game/behaviors/bobomb.inc.c +++ b/src/game/behaviors/bobomb.inc.c @@ -13,9 +13,9 @@ static struct ObjectHitbox sBobombHitbox = { }; void bhv_bobomb_init(void) { - o->oGravity = 2.5; - o->oFriction = 0.8; - o->oBuoyancy = 1.3; + o->oGravity = 2.5f; + o->oFriction = 0.8f; + o->oBuoyancy = 1.3f; o->oInteractionSubtype = INT_SUBTYPE_KICKABLE; } @@ -30,7 +30,7 @@ void bobomb_spawn_coin(void) { void bobomb_act_explode(void) { struct Object *explosion; if (o->oTimer < 5) - cur_obj_scale(1.0 + (f32) o->oTimer / 5.0); + cur_obj_scale(1.0f + (f32) o->oTimer / 5.0f); else { explosion = spawn_object(o, MODEL_EXPLOSION, bhvExplosion); explosion->oGraphYOffset += 100.0f; @@ -49,9 +49,9 @@ void bobomb_check_interactions(void) { if ((o->oInteractStatus & INT_STATUS_MARIO_KNOCKBACK_DMG) != 0) { o->oMoveAngleYaw = gMarioObject->header.gfx.angle[1]; - o->oForwardVel = 25.0; - o->oVelY = 30.0; - o->oAction = BOBOMB_ACT_LAUNCHED; + o->oForwardVel = 25.0f; + o->oVelY = 30.0f; + o->oAction = BOBOMB_ACT_LAUNCHED; } if ((o->oInteractStatus & INT_STATUS_TOUCHED_BOB_OMB) != 0) @@ -67,7 +67,7 @@ void bobomb_check_interactions(void) { void bobomb_act_patrol(void) { s16 collisionFlags; - o->oForwardVel = 5.0; + o->oForwardVel = 5.0f; collisionFlags = object_step(); if ((obj_return_home_if_safe(o, o->oHomeX, o->oHomeY, o->oHomeZ, 400) == 1) @@ -82,7 +82,7 @@ void bobomb_act_chase_mario(void) { s16 animFrame, collisionFlags; animFrame = ++o->header.gfx.animInfo.animFrame; - o->oForwardVel = 20.0; + o->oForwardVel = 20.0f; collisionFlags = object_step(); @@ -171,7 +171,7 @@ void bobomb_free_loop(void) { void bobomb_held_loop(void) { o->header.gfx.node.flags |= GRAPH_RENDER_INVISIBLE; cur_obj_init_animation(1); - cur_obj_set_pos_relative(gMarioObject, 0, 60.0f, 100.0); + cur_obj_set_pos_relative(gMarioObject, 0, 60.0f, 100.0f); o->oBobombFuseLit = 1; if (o->oBobombFuseTimer >= 151) { @@ -197,11 +197,11 @@ void bobomb_thrown_loop(void) { cur_obj_enable_rendering_2(); o->header.gfx.node.flags &= ~GRAPH_RENDER_INVISIBLE; - o->oHeldState = 0; - o->oFlags &= ~OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW; /* bit 3 */ - o->oForwardVel = 25.0; - o->oVelY = 20.0; - o->oAction = BOBOMB_ACT_LAUNCHED; + o->oHeldState = 0; + o->oFlags &= ~OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW; /* bit 3 */ + o->oForwardVel = 25.0f; + o->oVelY = 20.0f; + o->oAction = BOBOMB_ACT_LAUNCHED; } // sp18 = blinkTimer @@ -273,9 +273,9 @@ void bhv_bobomb_fuse_smoke_init(void) { } void bhv_bobomb_buddy_init(void) { - o->oGravity = 2.5; - o->oFriction = 0.8; - o->oBuoyancy = 1.3; + o->oGravity = 2.5f; + o->oFriction = 0.8f; + o->oBuoyancy = 1.3f; o->oInteractionSubtype = INT_SUBTYPE_NPC; } diff --git a/src/game/behaviors/bomp.inc.c b/src/game/behaviors/bomp.inc.c index 26b38931..3a0282ac 100644 --- a/src/game/behaviors/bomp.inc.c +++ b/src/game/behaviors/bomp.inc.c @@ -21,7 +21,7 @@ void bhv_small_bomp_loop(void) { o->oForwardVel = 0; } - if (o->oTimer == 15.0) { + if (o->oTimer == 15) { o->oAction = BOMP_ACT_EXTEND; o->oForwardVel = 40.0f; cur_obj_play_sound_2(SOUND_OBJ_UNKNOWN2); @@ -77,7 +77,7 @@ void bhv_large_bomp_loop(void) { o->oForwardVel = 0; } - if (o->oTimer == 15.0) { + if (o->oTimer == 15) { o->oAction = BOMP_ACT_EXTEND; o->oForwardVel = 10.0f; cur_obj_play_sound_2(SOUND_OBJ_UNKNOWN2); diff --git a/src/game/behaviors/boo.inc.c b/src/game/behaviors/boo.inc.c index 90a3c0c6..7ca36a0a 100644 --- a/src/game/behaviors/boo.inc.c +++ b/src/game/behaviors/boo.inc.c @@ -126,7 +126,7 @@ static void boo_approach_target_opacity_and_update_scale(void) { } } - scale = (o->oOpacity/255.0f * 0.4 + 0.6) * o->oBooBaseScale; + scale = (o->oOpacity / 255.0f * 0.4f + 0.6f) * o->oBooBaseScale; obj_scale(o, scale); // why no cur_obj_scale? was cur_obj_scale written later? } @@ -134,8 +134,8 @@ static void boo_oscillate(s32 ignoreOpacity) { o->oFaceAnglePitch = sins(o->oBooOscillationTimer) * 0x400; if (o->oOpacity == 0xFF || ignoreOpacity == TRUE) { - o->header.gfx.scale[0] = sins(o->oBooOscillationTimer) * 0.08 + o->oBooBaseScale; - o->header.gfx.scale[1] = -sins(o->oBooOscillationTimer) * 0.08 + o->oBooBaseScale; + o->header.gfx.scale[0] = sins(o->oBooOscillationTimer) * 0.08f + o->oBooBaseScale; + o->header.gfx.scale[1] = -sins(o->oBooOscillationTimer) * 0.08f + o->oBooBaseScale; o->header.gfx.scale[2] = o->header.gfx.scale[0]; o->oGravity = sins(o->oBooOscillationTimer) * o->oBooBaseScale; o->oBooOscillationTimer += 0x400; @@ -615,7 +615,7 @@ static void big_boo_act_3(void) { } else { if (o->oTimer == 0) { spawn_mist_particles(); - o->oBooBaseScale -= 0.5; + o->oBooBaseScale -= 0.5f; } if (big_boo_update_during_nonlethal_hit(40.0f)) { diff --git a/src/game/behaviors/boulder.inc.c b/src/game/behaviors/boulder.inc.c index 11517816..ac818b73 100644 --- a/src/game/behaviors/boulder.inc.c +++ b/src/game/behaviors/boulder.inc.c @@ -17,7 +17,7 @@ void boulder_act_1(void) { spawn_mist_particles(); } - if (o->oForwardVel > 70.0) + if (o->oForwardVel > 70.0f) o->oForwardVel = 70.0f; if (o->oPosY < -1000.0f) diff --git a/src/game/behaviors/bouncing_fireball.inc.c b/src/game/behaviors/bouncing_fireball.inc.c index 59ded5c9..85a81462 100644 --- a/src/game/behaviors/bouncing_fireball.inc.c +++ b/src/game/behaviors/bouncing_fireball.inc.c @@ -37,7 +37,7 @@ void bhv_bouncing_fireball_spawner_loop(void) { break; case 1: flameObj = spawn_object(o, MODEL_RED_FLAME, bhvBouncingFireballFlame); - scale = (10 - o->oTimer) * 0.5; + scale = (10 - o->oTimer) * 0.5f; obj_scale_xyz(flameObj, scale, scale, scale); if (o->oTimer == 0) obj_become_tangible(flameObj); diff --git a/src/game/behaviors/bowling_ball.inc.c b/src/game/behaviors/bowling_ball.inc.c index 14668ec1..2df8d4a6 100644 --- a/src/game/behaviors/bowling_ball.inc.c +++ b/src/game/behaviors/bowling_ball.inc.c @@ -88,8 +88,8 @@ void bhv_bowling_ball_roll_loop(void) { o->oBowlingBallTargetYaw = o->oPathedTargetYaw; o->oMoveAngleYaw = approach_s16_symmetric(o->oMoveAngleYaw, o->oBowlingBallTargetYaw, 0x400); - if (o->oForwardVel > 70.0) { - o->oForwardVel = 70.0; + if (o->oForwardVel > 70.0f) { + o->oForwardVel = 70.0f; } bowling_ball_set_hitbox(); @@ -212,7 +212,7 @@ void bhv_thi_bowling_ball_spawner_loop(void) { if ((o->oTimer % 64) == 0) { if (is_point_within_radius_of_mario(o->oPosX, o->oPosY, o->oPosZ, 12000)) { - if ((s32)(random_float() * 1.5) == 0) { + if ((s32)(random_float() * 1.5f) == 0) { bowlingBall = spawn_object(o, MODEL_BOWLING_BALL, bhvBowlingBall); bowlingBall->oBehParams2ndByte = o->oBehParams2ndByte; } diff --git a/src/game/behaviors/bowser.inc.c b/src/game/behaviors/bowser.inc.c index ee599086..884dc87f 100644 --- a/src/game/behaviors/bowser.inc.c +++ b/src/game/behaviors/bowser.inc.c @@ -333,7 +333,7 @@ void bowser_bitdw_actions(void) { // dancing after the introduction #ifndef VERSION_JP if (!gCurrDemoInput) { // demo check because entry exits post JP - if (rand < 0.1) { + if (rand < 0.1f) { o->oAction = BOWSER_ACT_DANCE; // 10% chance } else { o->oAction = BOWSER_ACT_WALK_TO_MARIO; // common @@ -342,7 +342,7 @@ void bowser_bitdw_actions(void) { o->oAction = BOWSER_ACT_WALK_TO_MARIO; } #else - if (rand < 0.1) { + if (rand < 0.1f) { o->oAction = BOWSER_ACT_DANCE; // 10% chance } else { o->oAction = BOWSER_ACT_WALK_TO_MARIO; // common @@ -361,15 +361,14 @@ void bowser_bitfs_actions(void) { if (o->oBowserIsReacting == FALSE) { if (o->oBowserStatus & BOWSER_STATUS_ANGLE_MARIO) { if (o->oDistanceToMario < 1300.0f) { // nearby - if (rand < 0.5) { // 50% chance + if (rand < 0.5f) { // 50% chance o->oAction = BOWSER_ACT_TELEPORT; } else { o->oAction = BOWSER_ACT_SPIT_FIRE_ONTO_FLOOR; } } else { // far away o->oAction = BOWSER_ACT_CHARGE_MARIO; - if (500.0f < o->oBowserDistToCentre && o->oBowserDistToCentre < 1500.0f - && rand < 0.5) { // 50% chance + if (500.0f < o->oBowserDistToCentre && o->oBowserDistToCentre < 1500.0f && rand < 0.5f) { // 50% chance o->oAction = BOWSER_ACT_BIG_JUMP; } } @@ -392,14 +391,14 @@ void bowser_bits_action_list(void) { f32 rand = random_float(); if (o->oBowserStatus & BOWSER_STATUS_ANGLE_MARIO) { if (o->oDistanceToMario < 1000.0f) { // nearby - if (rand < 0.4) { + if (rand < 0.4f) { o->oAction = BOWSER_ACT_SPIT_FIRE_ONTO_FLOOR; // 40% chance - } else if (rand < 0.8) { + } else if (rand < 0.8f) { o->oAction = BOWSER_ACT_SPIT_FIRE_INTO_SKY; // 80% chance } else { o->oAction = BOWSER_ACT_BREATH_FIRE; } // far away - } else if (rand < 0.5) { + } else if (rand < 0.5f) { o->oAction = BOWSER_ACT_BIG_JUMP; // 50% chance } else { o->oAction = BOWSER_ACT_CHARGE_MARIO; @@ -1186,21 +1185,21 @@ s32 bowser_dead_wait_for_mario(void) { s32 bowser_dead_twirl_up(void) { s32 ret = FALSE; // Set angle rotation once he has low X scale value - if (o->header.gfx.scale[0] < 0.8) { + if (o->header.gfx.scale[0] < 0.8f) { o->oAngleVelYaw += 0x80; } // Slowly scale down his X and Z value - if (o->header.gfx.scale[0] > 0.2) { - o->header.gfx.scale[0] = o->header.gfx.scale[0] - 0.02; - o->header.gfx.scale[2] = o->header.gfx.scale[2] - 0.02; + if (o->header.gfx.scale[0] > 0.2f) { + o->header.gfx.scale[0] = o->header.gfx.scale[0] - 0.02f; + o->header.gfx.scale[2] = o->header.gfx.scale[2] - 0.02f; } else { // Now scale down his Y value (and send Bowser up) - o->header.gfx.scale[1] = o->header.gfx.scale[1] - 0.01; + o->header.gfx.scale[1] = o->header.gfx.scale[1] - 0.01f; o->oVelY = 20.0f; o->oGravity = 0.0f; } // At half Y scale value, he is high enough, so we are done - if (o->header.gfx.scale[1] < 0.5) { + if (o->header.gfx.scale[1] < 0.5f) { ret = TRUE; } // Copy angle rotation to moving rotation @@ -1615,14 +1614,14 @@ void bowser_thrown_dropped_update(void) { // Set throw action and vel values cur_obj_get_thrown_or_placed(1.0f, 1.0f, BOWSER_ACT_THROWN); // Set swing speed based of angle - swingSpd = o->oBowserHeldAngleVelYaw / 3000.0 * 70.0f; + swingSpd = o->oBowserHeldAngleVelYaw / 3000.0f * 70.0f; // If less than 0, reduce speed if (swingSpd < 0.0f) { swingSpd = -swingSpd; } // If more than 90, increase speed if (swingSpd > 90.0f) { - swingSpd *= 2.5; + swingSpd *= 2.5f; } // Set distance speed when throwing o->oForwardVel = coss(o->oBowserHeldAnglePitch) * swingSpd; diff --git a/src/game/behaviors/bowser_bomb.inc.c b/src/game/behaviors/bowser_bomb.inc.c index e1e560ae..cc59fd86 100644 --- a/src/game/behaviors/bowser_bomb.inc.c +++ b/src/game/behaviors/bowser_bomb.inc.c @@ -21,7 +21,7 @@ void bhv_bowser_bomb_loop(void) { void bhv_bowser_bomb_explosion_loop(void) { struct Object *mineSmoke; - cur_obj_scale((f32) o->oTimer / 14.0f * 9.0 + 1.0); + cur_obj_scale((f32) o->oTimer / 14.0f * 9.0f + 1.0f); if ((o->oTimer % 4 == 0) && (o->oTimer < 20)) { mineSmoke = spawn_object(o, MODEL_BOWSER_SMOKE, bhvBowserBombSmoke); mineSmoke->oPosX += random_float() * 600.0f - 400.0f; @@ -29,23 +29,26 @@ void bhv_bowser_bomb_explosion_loop(void) { mineSmoke->oVelY += random_float() * 10.0f; } - if (o->oTimer % 2 == 0) + if (o->oTimer % 2 == 0) { o->oAnimState++; - if (o->oTimer == 28) + } + if (o->oTimer == 28) { o->activeFlags = ACTIVE_FLAG_DEACTIVATED; + } } void bhv_bowser_bomb_smoke_loop(void) { - cur_obj_scale((f32) o->oTimer / 14.0f * 9.0 + 1.0); + cur_obj_scale((f32) o->oTimer / 14.0f * 9.0f + 1.0f); if (o->oTimer % 2 == 0) o->oAnimState++; o->oOpacity -= 10; - if (o->oOpacity < 10) + if (o->oOpacity < 10) { o->oOpacity = 0; - + } o->oPosY += o->oVelY; - if (o->oTimer == 28) + if (o->oTimer == 28) { o->activeFlags = ACTIVE_FLAG_DEACTIVATED; + } } diff --git a/src/game/behaviors/bowser_flame.inc.c b/src/game/behaviors/bowser_flame.inc.c index 9927390f..f709ef18 100644 --- a/src/game/behaviors/bowser_flame.inc.c +++ b/src/game/behaviors/bowser_flame.inc.c @@ -25,35 +25,20 @@ struct ObjectHitbox sBowserFlameHitbox = { void bowser_flame_despawn(void) { obj_mark_for_deletion(o); spawn_object_with_scale(o, MODEL_NONE, bhvBlackSmokeUpward, 1.0f); - if (random_float() < 0.1) { + if (random_float() < 0.1f) { spawn_object(o, MODEL_YELLOW_COIN, bhvTemporaryYellowCoin); } } s32 bowser_flame_should_despawn(s32 maxTime) { - if (maxTime < o->oTimer) { - return TRUE; - } - // Flames should despawn if they fall off the arena. - if (o->oFloorType == SURFACE_BURNING) { - return TRUE; - } - if (o->oFloorType == SURFACE_DEATH_PLANE) { - return TRUE; - } - - return FALSE; + return ((maxTime < o->oTimer) || (o->oFloorType == SURFACE_BURNING) || (o->oFloorType == SURFACE_DEATH_PLANE)); } void bhv_flame_bowser_init(void) { o->oAnimState = (s32)(random_float() * 10.0f); o->oMoveAngleYaw = random_u16(); - if (random_float() < 0.2) { - o->oVelY = 80.0f; - } else { - o->oVelY = 20.0f; - } + o->oVelY = ((random_float() < 0.2f) ? 80.0f : 20.0f); o->oForwardVel = 10.0f; o->oGravity = -1.0f; o->oFlameScale = random_float() + 1.0f; @@ -97,7 +82,7 @@ void bhv_flame_bowser_loop(void) { } else { cur_obj_become_tangible(); if (o->oTimer > o->oFlameScale * 10 + 5.0f) { - o->oFlameScale -= 0.15; + o->oFlameScale -= 0.15f; if (o->oFlameScale <= 0) { bowser_flame_despawn(); } @@ -117,7 +102,7 @@ void bhv_flame_moving_forward_growing_init(void) { void bhv_flame_moving_forward_growing_loop(void) { obj_set_hitbox(o, &sGrowingBowserFlameHitbox); - o->oFlameScale = o->oFlameScale + 0.5; + o->oFlameScale = o->oFlameScale + 0.5f; cur_obj_scale(o->oFlameScale); if (o->oMoveAnglePitch > 0x800) { o->oMoveAnglePitch -= 0x200; @@ -176,7 +161,7 @@ void bhv_blue_bowser_flame_init(void) { o->oVelY = 7.0f; o->oForwardVel = 35.0f; o->oFlameScale = 3.0f; - o->oFlameUnusedRand = random_float() * 0.5; + o->oFlameUnusedRand = random_float() * 0.5f; o->oGravity = 1.0f; o->oFlameSpeedTimerOffset = (s32)(random_float() * 64.0f); } @@ -185,7 +170,7 @@ void bhv_blue_bowser_flame_loop(void) { s32 i; obj_set_hitbox(o, &sGrowingBowserFlameHitbox); if (o->oFlameScale < 16.0f) { - o->oFlameScale = o->oFlameScale + 0.5; + o->oFlameScale = o->oFlameScale + 0.5f; } cur_obj_scale(o->oFlameScale); cur_obj_update_floor_and_walls(); @@ -252,7 +237,7 @@ void bhv_blue_flames_group_loop(void) { flame->oMoveAngleYaw += i * 0x5555; flame->header.gfx.scale[0] = o->oBlueFlameNextScale; } - o->oBlueFlameNextScale -= 0.5; + o->oBlueFlameNextScale -= 0.5f; } } else { obj_mark_for_deletion(o); diff --git a/src/game/behaviors/bowser_key_cutscene.inc.c b/src/game/behaviors/bowser_key_cutscene.inc.c index 0b17f9e2..96c074c7 100644 --- a/src/game/behaviors/bowser_key_cutscene.inc.c +++ b/src/game/behaviors/bowser_key_cutscene.inc.c @@ -18,7 +18,7 @@ void bhv_bowser_key_unlock_door_loop(void) { else if (animTimer < 49) o->oBowserKeyScale = 0.2f; else if (animTimer < 58) - o->oBowserKeyScale = (animTimer - 53) * 0.11875f + 0.2; // 0.11875? + o->oBowserKeyScale = (animTimer - 53) * 0.11875f + 0.2f; // 0.11875f? else if (animTimer < 59) o->oBowserKeyScale = 1.1f; else if (animTimer < 60) @@ -35,11 +35,11 @@ void bhv_bowser_key_course_exit_loop(void) { if (animTimer < 38) o->oBowserKeyScale = 0.2f; else if (animTimer < 52) - o->oBowserKeyScale = (animTimer - 42) * 0.042857f + 0.2; // TODO 3/70? + o->oBowserKeyScale = (animTimer - 42) * (3.0f / 70.0f) + 0.2f; else if (animTimer < 94) o->oBowserKeyScale = 0.8f; else if (animTimer < 101) - o->oBowserKeyScale = (101 - animTimer) * 0.085714f + 0.2; // TODO 6/70? + o->oBowserKeyScale = (101 - animTimer) * (6.0f / 70.0f) + 0.2f; else o->oBowserKeyScale = 0.2f; if (o->oTimer > 138) diff --git a/src/game/behaviors/bub.inc.c b/src/game/behaviors/bub.inc.c index 8ee5f28f..716e843d 100644 --- a/src/game/behaviors/bub.inc.c +++ b/src/game/behaviors/bub.inc.c @@ -71,7 +71,7 @@ void bub_act_1(void) { o->oAngleToMario = cur_obj_angle_to_home(); cur_obj_rotate_yaw_toward(o->oAngleToMario, 0x100); if (o->oDistanceToMario < 200.0f) - if (o->oCheepCheepRandomSwimAway < 0.5) + if (o->oCheepCheepRandomSwimAway < 0.5f) o->oAction = 2; if (o->oInteractStatus & INT_STATUS_INTERACTED) o->oAction = 2; diff --git a/src/game/behaviors/bullet_bill.inc.c b/src/game/behaviors/bullet_bill.inc.c index 4b6dea5a..a97af5ba 100644 --- a/src/game/behaviors/bullet_bill.inc.c +++ b/src/game/behaviors/bullet_bill.inc.c @@ -2,7 +2,7 @@ // bullet bill smoke void bhv_white_puff_smoke_init(void) { - cur_obj_scale(random_float() * 2 + 2.0); + cur_obj_scale(random_float() * 2.0f + 2.0f); } void bhv_bullet_bill_init(void) { diff --git a/src/game/behaviors/bully.inc.c b/src/game/behaviors/bully.inc.c index 8437120f..cde35386 100644 --- a/src/game/behaviors/bully.inc.c +++ b/src/game/behaviors/bully.inc.c @@ -30,23 +30,20 @@ void bhv_small_bully_init(void) { o->oHomeX = o->oPosX; o->oHomeZ = o->oPosZ; o->oBehParams2ndByte = BULLY_BP_SIZE_SMALL; - o->oGravity = 4.0; - o->oFriction = 0.91; - o->oBuoyancy = 1.3; + o->oGravity = 4.0f; + o->oFriction = 0.91f; + o->oBuoyancy = 1.3f; obj_set_hitbox(o, &sSmallBullyHitbox); } void bhv_big_bully_init(void) { cur_obj_init_animation(0); - - o->oHomeX = o->oPosX; - o->oHomeY = o->oPosY; - o->oHomeZ = o->oPosZ; + vec3_copy(&o->oHomeVec, &o->oPosVec); o->oBehParams2ndByte = BULLY_BP_SIZE_BIG; - o->oGravity = 5.0; - o->oFriction = 0.93; - o->oBuoyancy = 1.3; + o->oGravity = 5.0f; + o->oFriction = 0.93f; + o->oBuoyancy = 1.3f; obj_set_hitbox(o, &sBigBullyHitbox); } @@ -72,14 +69,14 @@ void bully_act_chase_mario(void) { f32 homeZ = o->oHomeZ; if (o->oTimer < 10) { - o->oForwardVel = 3.0; + o->oForwardVel = 3.0f; obj_turn_toward_object(o, gMarioObject, 16, 4096); } else if (o->oBehParams2ndByte == BULLY_BP_SIZE_SMALL) { - o->oForwardVel = 20.0; + o->oForwardVel = 20.0f; if (o->oTimer >= 31) o->oTimer = 0; } else { - o->oForwardVel = 30.0; + o->oForwardVel = 30.0f; if (o->oTimer >= 36) o->oTimer = 0; } @@ -91,8 +88,8 @@ void bully_act_chase_mario(void) { } void bully_act_knockback(void) { - if (o->oForwardVel < 10.0 && (s32) o->oVelY == 0) { - o->oForwardVel = 1.0; + if (o->oForwardVel < 10.0f && (s32) o->oVelY == 0) { + o->oForwardVel = 1.0f; o->oBullyKBTimerAndMinionKOCounter++; o->oFlags |= OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW; /* bit 3 */ o->oMoveAngleYaw = o->oFaceAngleYaw; @@ -113,7 +110,7 @@ void bully_act_back_up(void) { o->oMoveAngleYaw += 0x8000; } - o->oForwardVel = 5.0; + o->oForwardVel = 5.0f; //! bully_backup_check() happens after this function, and has the potential to reset // the bully's action to BULLY_ACT_BACK_UP. Because the back up action is only @@ -223,7 +220,7 @@ void bhv_bully_loop(void) { switch (o->oAction) { case BULLY_ACT_PATROL: - o->oForwardVel = 5.0; + o->oForwardVel = 5.0f; if (obj_return_home_if_safe(o, o->oHomeX, o->oPosY, o->oHomeZ, 800) == 1) { o->oAction = BULLY_ACT_CHASE_MARIO; @@ -297,7 +294,7 @@ void bhv_big_bully_with_minions_loop(void) { switch (o->oAction) { case BULLY_ACT_PATROL: - o->oForwardVel = 5.0; + o->oForwardVel = 5.0f; if (obj_return_home_if_safe(o, o->oHomeX, o->oPosY, o->oHomeZ, 1000) == 1) { o->oAction = BULLY_ACT_CHASE_MARIO; diff --git a/src/game/behaviors/cap.inc.c b/src/game/behaviors/cap.inc.c index 909c26a7..90482275 100644 --- a/src/game/behaviors/cap.inc.c +++ b/src/game/behaviors/cap.inc.c @@ -110,7 +110,7 @@ void bhv_wing_cap_init(void) { void cap_scale_vertically(void) { o->oCapScaleAngle += 0x2000; - o->header.gfx.scale[1] = coss(o->oCapScaleAngle) * 0.3 + 0.7; + o->header.gfx.scale[1] = coss(o->oCapScaleAngle) * 0.3f + 0.7f; if (o->oCapScaleAngle == 0x10000) { o->oCapScaleAngle = 0; o->oCapDoScaleVertically = 2; diff --git a/src/game/behaviors/celebration_star.inc.c b/src/game/behaviors/celebration_star.inc.c index b7b57dbe..27978d77 100644 --- a/src/game/behaviors/celebration_star.inc.c +++ b/src/game/behaviors/celebration_star.inc.c @@ -41,9 +41,9 @@ void celeb_star_act_face_camera(void) { if (o->oTimer < 10) { if (o->oCelebStarIsBowserKey == 0) { - cur_obj_scale((f32) o->oTimer / 10.0); + cur_obj_scale((f32) o->oTimer / 10.0f); } else { - cur_obj_scale((f32) o->oTimer / 30.0); + cur_obj_scale((f32) o->oTimer / 30.0f); } o->oFaceAngleYaw += 0x1000; } else { diff --git a/src/game/behaviors/coin.inc.c b/src/game/behaviors/coin.inc.c index ddedaee4..7436c13f 100644 --- a/src/game/behaviors/coin.inc.c +++ b/src/game/behaviors/coin.inc.c @@ -68,7 +68,7 @@ void bhv_coin_loop(void) { o->oSubAction = 1; if (o->oSubAction == 1) { o->oBounciness = 0; - if (floor->normal.y < 0.9) { + if (floor->normal.y < 0.9f) { targetYaw = atan2s(floor->normal.z, floor->normal.x); cur_obj_rotate_yaw_toward(targetYaw, 0x400); } @@ -138,7 +138,7 @@ void spawn_coin_in_formation(s32 index, s32 shape) { break; case 1: snapToGround = FALSE; - pos[1] = 160 * index * 0.8; // 128 * index + pos[1] = 160 * index * 0.8f; // 128 * index if (index > 4) spawnCoin = FALSE; break; @@ -218,7 +218,7 @@ void coin_inside_boo_act_0(void) { cur_obj_become_intangible(); if (o->oTimer == 0 && gCurrLevelNum == LEVEL_BBH) { cur_obj_set_model(MODEL_BLUE_COIN); - cur_obj_scale(0.7); + cur_obj_scale(0.7f); } obj_copy_pos(o, parent); if (parent->oBooDeathStatus == BOO_DEATH_STATUS_DYING) { diff --git a/src/game/behaviors/controllable_platform.inc.c b/src/game/behaviors/controllable_platform.inc.c index 376bddd3..8e1b1e17 100644 --- a/src/game/behaviors/controllable_platform.inc.c +++ b/src/game/behaviors/controllable_platform.inc.c @@ -116,10 +116,10 @@ void controllable_platform_check_walls(s8 nextDirection, s8 wallDisplacement[3], void controllable_platform_shake_on_wall_hit(void) { if (o->oControllablePlatformWallHitDirection == 1 || o->oControllablePlatformWallHitDirection == 2) { - o->oFaceAnglePitch = sins(o->oTimer * 0x1000) * 182.04444 * 10.0; + o->oFaceAnglePitch = sins(o->oTimer * 0x1000) * 182.04444 * 10.0f; o->oPosY = o->oControllablePlatformInitPosY + sins(o->oTimer * 0x2000) * 20.0f; } else { - o->oFaceAngleRoll = sins(o->oTimer * 0x1000) * 182.04444 * 10.0; + o->oFaceAngleRoll = sins(o->oTimer * 0x1000) * 182.04444 * 10.0f; o->oPosY = o->oControllablePlatformInitPosY + sins(o->oTimer * 0x2000) * 20.0f; } diff --git a/src/game/behaviors/corkbox.inc.c b/src/game/behaviors/corkbox.inc.c index e9316513..507d00b6 100644 --- a/src/game/behaviors/corkbox.inc.c +++ b/src/game/behaviors/corkbox.inc.c @@ -19,10 +19,10 @@ void bhv_bobomb_explosion_bubble_init(void) { void bhv_bobomb_explosion_bubble_loop(void) { f32 waterY = gMarioStates[0].waterLevel; - o->header.gfx.scale[0] = sins(o->oBobombExpBubGfxScaleFacX) * 0.5 + 2.0; + o->header.gfx.scale[0] = sins(o->oBobombExpBubGfxScaleFacX) * 0.5f + 2.0f; o->oBobombExpBubGfxScaleFacX += o->oBobombExpBubGfxExpRateX; - o->header.gfx.scale[1] = sins(o->oBobombExpBubGfxScaleFacY) * 0.5 + 2.0; + o->header.gfx.scale[1] = sins(o->oBobombExpBubGfxScaleFacY) * 0.5f + 2.0f; o->oBobombExpBubGfxScaleFacY += o->oBobombExpBubGfxExpRateY; if (o->oPosY > waterY) { diff --git a/src/game/behaviors/exclamation_box.inc.c b/src/game/behaviors/exclamation_box.inc.c index a241543e..547b4fcd 100644 --- a/src/game/behaviors/exclamation_box.inc.c +++ b/src/game/behaviors/exclamation_box.inc.c @@ -91,12 +91,12 @@ void exclamation_box_act_3(void) { o->oVelY = 0.0f; o->oGravity = 0.0f; } - o->oExclamationBoxVerticalScale = (sins(o->oExclamationBoxScaleAngle) + 1.0) * 0.3 + 0.0; - o->oExclamationBoxHorizontalScale = (-sins(o->oExclamationBoxScaleAngle) + 1.0) * 0.5 + 1.0; - o->oGraphYOffset = (-sins(o->oExclamationBoxScaleAngle) + 1.0) * 26.0; + o->oExclamationBoxVerticalScale = ( sins(o->oExclamationBoxScaleAngle) + 1.0f) * 0.3f + 0.0f; + o->oExclamationBoxHorizontalScale = (-sins(o->oExclamationBoxScaleAngle) + 1.0f) * 0.5f + 1.0f; + o->oGraphYOffset = (-sins(o->oExclamationBoxScaleAngle) + 1.0f) * 26.0f; o->oExclamationBoxScaleAngle += 0x1000; o->header.gfx.scale[0] = o->oExclamationBoxHorizontalScale * 2.0f; - o->header.gfx.scale[1] = o->oExclamationBoxVerticalScale * 2.0f; + o->header.gfx.scale[1] = o->oExclamationBoxVerticalScale * 2.0f; o->header.gfx.scale[2] = o->oExclamationBoxHorizontalScale * 2.0f; if (o->oTimer == 7) o->oAction = 4; diff --git a/src/game/behaviors/explosion.inc.c b/src/game/behaviors/explosion.inc.c index 75428d56..9ccbd263 100644 --- a/src/game/behaviors/explosion.inc.c +++ b/src/game/behaviors/explosion.inc.c @@ -22,5 +22,5 @@ void bhv_explosion_loop(void) { o->oOpacity -= 14; - cur_obj_scale((f32) o->oTimer / 9.0f + 1.0); + cur_obj_scale((f32) o->oTimer / 9.0f + 1.0f); } diff --git a/src/game/behaviors/falling_rising_platform.inc.c b/src/game/behaviors/falling_rising_platform.inc.c index 6701027d..d4728729 100644 --- a/src/game/behaviors/falling_rising_platform.inc.c +++ b/src/game/behaviors/falling_rising_platform.inc.c @@ -1,7 +1,7 @@ // falling_rising_platform.c.inc void bhv_squishable_platform_loop(void) { - o->header.gfx.scale[1] = (sins(o->oBitfsPlatformTimer) + 1.0) * 0.3 + 0.4; + o->header.gfx.scale[1] = (sins(o->oBitfsPlatformTimer) + 1.0f) * 0.3f + 0.4f; o->oBitfsPlatformTimer += 0x80; #ifdef AUTO_COLLISION_DISTANCE o->oFlags &= ~OBJ_FLAG_DONT_CALC_COLL_DIST; @@ -20,10 +20,12 @@ void bhv_ddd_moving_pole_loop(void) { void bhv_bitfs_sinking_cage_platform_loop(void) { if (o->oBehParams2ndByte != 0) { - if (o->oTimer == 0) + if (o->oTimer == 0) { o->oPosY -= 300.0f; + } o->oPosY += sins(o->oBitfsPlatformTimer) * 7.0f; - } else + } else { o->oPosY -= sins(o->oBitfsPlatformTimer) * 3.0f; + } o->oBitfsPlatformTimer += 0x100; } diff --git a/src/game/behaviors/fish.inc.c b/src/game/behaviors/fish.inc.c index 4a064b70..bad68ecf 100644 --- a/src/game/behaviors/fish.inc.c +++ b/src/game/behaviors/fish.inc.c @@ -177,7 +177,7 @@ static void fish_act_flee(void) { // Accelerate over time. if (o->oForwardVel < o->oFishGoalVel) { - o->oForwardVel = o->oForwardVel + 0.5; + o->oForwardVel = o->oForwardVel + 0.5f; } o->oFishGoalY = gMarioObject->oPosY + o->oFishHeightOffset; @@ -216,7 +216,7 @@ static void fish_act_init(void) { cur_obj_init_animation_with_accel_and_sound(0, 1.0f); o->header.gfx.animInfo.animFrame = (s16)(random_float() * 28.0f); o->oFishDepthDistance = random_float() * 300.0f; - cur_obj_scale(random_float() * 0.4 + 0.8); + cur_obj_scale(random_float() * 0.4f + 0.8f); o->oAction = FISH_ACT_ROAM; } diff --git a/src/game/behaviors/flame_mario.inc.c b/src/game/behaviors/flame_mario.inc.c index c82ff13f..ea8ae257 100644 --- a/src/game/behaviors/flame_mario.inc.c +++ b/src/game/behaviors/flame_mario.inc.c @@ -6,7 +6,7 @@ void bhv_black_smoke_upward_loop(void) { void bhv_black_smoke_bowser_loop(void) { if (o->oTimer == 0) { - o->oForwardVel = random_float() * 2 + 0.5; + o->oForwardVel = random_float() * 2 + 0.5f; o->oMoveAngleYaw = random_u16(); o->oVelY = 8; o->oFlameScale = o->header.gfx.scale[0]; @@ -18,7 +18,7 @@ void bhv_black_smoke_bowser_loop(void) { void bhv_black_smoke_mario_loop(void) { if (o->oTimer == 0) { cur_obj_set_pos_relative(gMarioObject, 0, 0, -30.0f); - o->oForwardVel = random_float() * 2 + 0.5; + o->oForwardVel = random_float() * 2 + 0.5f; o->oMoveAngleYaw = (gMarioObject->oMoveAngleYaw + 0x7000) + random_float() * 8192.0f; o->oVelY = 8; } diff --git a/src/game/behaviors/flamethrower.inc.c b/src/game/behaviors/flamethrower.inc.c index adcb23b8..8c4e600f 100644 --- a/src/game/behaviors/flamethrower.inc.c +++ b/src/game/behaviors/flamethrower.inc.c @@ -8,9 +8,9 @@ void bhv_flamethrower_flame_loop(void) { obj_translate_xyz_random(o, 10.0f); } if (o->oBehParams2ndByte == 2) - size = o->oTimer * (o->oForwardVel - 6.0f) / 100.0 + 2.0; + size = o->oTimer * (o->oForwardVel - 6.0f) / 100.0f + 2.0f; else - size = o->oTimer * (o->oForwardVel - 20.0) / 100.0 + 1.0; + size = o->oTimer * (o->oForwardVel - 20.0f) / 100.0f + 1.0f; if (o->oBehParams2ndByte == 3) { o->hitboxHeight = 200.0f; o->hitboxDownOffset = 150.0f; @@ -20,7 +20,7 @@ void bhv_flamethrower_flame_loop(void) { o->oVelY = 0; o->oPosY = o->oFloorHeight + 25.0f * size; } - remainingTime = o->parentObj->oFlameThowerTimeRemaining / 1.2; + remainingTime = o->parentObj->oFlameThowerTimeRemaining / 1.2f; } else remainingTime = o->parentObj->oFlameThowerTimeRemaining; cur_obj_scale(size); diff --git a/src/game/behaviors/floating_platform.inc.c b/src/game/behaviors/floating_platform.inc.c index 1d9c986f..7e54f819 100644 --- a/src/game/behaviors/floating_platform.inc.c +++ b/src/game/behaviors/floating_platform.inc.c @@ -31,7 +31,7 @@ void floating_platform_act_0(void) { } else { o->oFaceAnglePitch /= 2; o->oFaceAngleRoll /= 2; - o->oFloatingPlatformMarioWeightWobbleOffset -= 5.0; + o->oFloatingPlatformMarioWeightWobbleOffset -= 5.0f; o->oVelY = 10.0f; if (o->oFloatingPlatformMarioWeightWobbleOffset < 0.0f) o->oFloatingPlatformMarioWeightWobbleOffset = 0.0f; @@ -45,10 +45,7 @@ void floating_platform_act_0(void) { void bhv_floating_platform_loop(void) { o->oHomeY = floating_platform_find_home_y(); - if (o->oFloatingPlatformIsOnFloor == 0) - o->oAction = 0; - else - o->oAction = 1; + o->oAction = (o->oFloatingPlatformIsOnFloor ? 1 : 0); switch (o->oAction) { case 0: diff --git a/src/game/behaviors/heave_ho.inc.c b/src/game/behaviors/heave_ho.inc.c index a7eb869a..c20ae418 100644 --- a/src/game/behaviors/heave_ho.inc.c +++ b/src/game/behaviors/heave_ho.inc.c @@ -46,8 +46,8 @@ void heave_ho_act_2(void) { o->oAngleToMario = cur_obj_angle_to_home(); if (o->oTimer > 150) { o->oHeaveHoTimedSpeed = (302 - o->oTimer) / 152.0f; - if (o->oHeaveHoTimedSpeed < 0.1) { - o->oHeaveHoTimedSpeed = 0.1; + if (o->oHeaveHoTimedSpeed < 0.1f) { + o->oHeaveHoTimedSpeed = 0.1f; o->oAction = 1; } } else diff --git a/src/game/behaviors/hoot.inc.c b/src/game/behaviors/hoot.inc.c index 83dd55cb..a77383b9 100644 --- a/src/game/behaviors/hoot.inc.c +++ b/src/game/behaviors/hoot.inc.c @@ -18,21 +18,21 @@ f32 hoot_find_next_floor(f32 dist) { } void hoot_floor_bounce(void) { - f32 floorY; - - floorY = hoot_find_next_floor(375.0f); - if (floorY + 75.0f > o->oPosY) - o->oMoveAnglePitch -= 3640.8888; - + f32 floorY = hoot_find_next_floor(375.0f); + if (floorY + 75.0f > o->oPosY) { + o->oMoveAnglePitch -= DEGREES(20); + } floorY = hoot_find_next_floor(200.0f); - if (floorY + 125.0f > o->oPosY) - o->oMoveAnglePitch -= 7281.7776; - + if (floorY + 125.0f > o->oPosY) { + o->oMoveAnglePitch -= DEGREES(40); + } floorY = hoot_find_next_floor(0.0f); - if (floorY + 125.0f > o->oPosY) + if (floorY + 125.0f > o->oPosY) { o->oPosY = floorY + 125.0f; - if (o->oMoveAnglePitch < -21845.3328) - o->oMoveAnglePitch = -21845; + } + if (o->oMoveAnglePitch < -DEGREES(120)) { + o->oMoveAnglePitch = -DEGREES(120); + } } void hoot_free_step(s16 fastOscY, s32 speed) { @@ -51,9 +51,9 @@ void hoot_free_step(s16 fastOscY, s32 speed) { o->oPosX += o->oVelX; if (fastOscY == 0) - o->oPosY -= o->oVelY + coss((s32)(animFrame * 3276.8)) * 50.0f / 4; + o->oPosY -= o->oVelY + coss((s32)(animFrame * 3276.8f)) * 50.0f / 4; else - o->oPosY -= o->oVelY + coss((s32)(animFrame * 6553.6)) * 50.0f / 4; + o->oPosY -= o->oVelY + coss((s32)(animFrame * 6553.6f)) * 50.0f / 4; o->oPosZ += o->oVelZ; find_floor(o->oPosX, o->oPosY, o->oPosZ, &floor); @@ -89,7 +89,7 @@ void hoot_carry_step(s32 speed, UNUSED f32 xPrev, UNUSED f32 zPrev) { o->oVelZ = coss(yaw) * hSpeed; o->oPosX += o->oVelX; - o->oPosY -= o->oVelY + coss((s32)(animFrame * 6553.6)) * 50.0f / 4; + o->oPosY -= o->oVelY + coss((s32)(animFrame * 6553.6f)) * 50.0f / 4; o->oPosZ += o->oVelZ; if (animFrame == 0) @@ -104,8 +104,8 @@ void hoot_surface_collision(f32 xPrev, UNUSED f32 yPrev, f32 zPrev) { hitbox.x = o->oPosX; hitbox.y = o->oPosY; hitbox.z = o->oPosZ; - hitbox.offsetY = 10.0; - hitbox.radius = 50.0; + hitbox.offsetY = 10.0f; + hitbox.radius = 50.0f; if (find_wall_collisions(&hitbox) != 0) { o->oPosX = hitbox.x; diff --git a/src/game/behaviors/jrb_ship.inc.c b/src/game/behaviors/jrb_ship.inc.c index 43ad25b7..a88606a1 100644 --- a/src/game/behaviors/jrb_ship.inc.c +++ b/src/game/behaviors/jrb_ship.inc.c @@ -16,7 +16,7 @@ void bhv_sunken_ship_part_loop(void) { if (o->oDistanceToMario > 10000.0f) o->oOpacity = 140; else - o->oOpacity = o->oDistanceToMario * 140.0f / 10000.0; + o->oOpacity = o->oDistanceToMario * 140.0f / 10000.0f; cur_obj_disable_rendering(); } diff --git a/src/game/behaviors/koopa_shell.inc.c b/src/game/behaviors/koopa_shell.inc.c index 8b9d4254..2719ed99 100644 --- a/src/game/behaviors/koopa_shell.inc.c +++ b/src/game/behaviors/koopa_shell.inc.c @@ -39,14 +39,15 @@ void bhv_koopa_shell_flame_loop(void) { cur_obj_move_using_fvel_and_gravity(); if (o->oFloorHeight > o->oPosY || o->oTimer > 10) obj_mark_for_deletion(o); - o->oKoopaShellFlameScale += -0.3; + o->oKoopaShellFlameScale += -0.3f; cur_obj_scale(o->oKoopaShellFlameScale); } void bhv_koopa_shell_flame_spawn(void) { s32 i; - for (i = 0; i < 2; i++) + for (i = 0; i < 2; i++) { spawn_object(o, MODEL_RED_FLAME, bhvKoopaShellFlame); + } } void koopa_shell_spawn_sparkles(f32 a) { diff --git a/src/game/behaviors/lll_hexagonal_ring.inc.c b/src/game/behaviors/lll_hexagonal_ring.inc.c index dddc0d29..02bb9c3f 100644 --- a/src/game/behaviors/lll_hexagonal_ring.inc.c +++ b/src/game/behaviors/lll_hexagonal_ring.inc.c @@ -9,7 +9,7 @@ void hexagonal_ring_spawn_flames(void) { flameObj->oVelY = random_float() * 50.0f + 10.0f; f32 size = random_float() * 6.0f + 3.0f; obj_scale_xyz(flameObj, size, size, size); - if (random_float() < 0.1) + if (random_float() < 0.1f) cur_obj_play_sound_2(SOUND_GENERAL_VOLCANO_EXPLOSION); } diff --git a/src/game/behaviors/manta_ray.inc.c b/src/game/behaviors/manta_ray.inc.c index d8d1a677..b0588946 100644 --- a/src/game/behaviors/manta_ray.inc.c +++ b/src/game/behaviors/manta_ray.inc.c @@ -41,12 +41,9 @@ void bhv_manta_ray_init(void) { } static void manta_ray_move(void) { - s16 animFrame; - s32 pathStatus = 0; - - animFrame = o->header.gfx.animInfo.animFrame; + s16 animFrame = o->header.gfx.animInfo.animFrame; gCurrentObject->oPathedStartWaypoint = (struct Waypoint *) sMantaRayTraj; - pathStatus = cur_obj_follow_path(pathStatus); + s32 pathStatus = cur_obj_follow_path(pathStatus); o->oMantaTargetYaw = o->oPathedTargetYaw; o->oMantaTargetPitch = o->oPathedTargetPitch; o->oForwardVel = 10.0f; @@ -56,13 +53,13 @@ static void manta_ray_move(void) { // This causes the ray to tilt as it turns. if ((s16) o->oMantaTargetYaw != (s16) o->oMoveAngleYaw) { - o->oMoveAngleRoll -= 91; - if (o->oMoveAngleRoll < -5461.3332) { + o->oMoveAngleRoll -= 0x5B; + if (o->oMoveAngleRoll < -DEGREES(30)) { o->oMoveAngleRoll = -0x4000 / 3; } } else { - o->oMoveAngleRoll += 91; - if (o->oMoveAngleRoll > 5461.3332) { + o->oMoveAngleRoll += 0x5B; + if (o->oMoveAngleRoll > DEGREES(30)) { o->oMoveAngleRoll = 0x4000 / 3; } } diff --git a/src/game/behaviors/moving_coin.inc.c b/src/game/behaviors/moving_coin.inc.c index c561f5cf..b6939f80 100644 --- a/src/game/behaviors/moving_coin.inc.c +++ b/src/game/behaviors/moving_coin.inc.c @@ -118,9 +118,9 @@ void bhv_moving_blue_coin_loop(void) { if (!(collisionFlags & OBJ_COL_FLAG_NO_Y_VEL)) cur_obj_play_sound_2(SOUND_GENERAL_COIN_DROP); /* bit 3 */ } else - o->oForwardVel *= 0.98; + o->oForwardVel *= 0.98f; - if (o->oForwardVel > 75.0) + if (o->oForwardVel > 75.0f) o->oForwardVel = 75.0f; obj_flicker_and_disappear(o, 600); @@ -135,9 +135,9 @@ void bhv_moving_blue_coin_loop(void) { } void bhv_blue_coin_sliding_jumping_init(void) { - o->oGravity = 3.0; - o->oFriction = 0.98; - o->oBuoyancy = 1.5; + o->oGravity = 3.0f; + o->oFriction = 0.98f; + o->oBuoyancy = 1.5f; obj_set_hitbox(o, &sMovingBlueCoinHitbox); } @@ -145,7 +145,7 @@ void bhv_blue_coin_sliding_jumping_init(void) { void blue_coin_sliding_away_from_mario(void) { s16 collisionFlags; - o->oForwardVel = 15.0; + o->oForwardVel = 15.0f; o->oMoveAngleYaw = o->oAngleToMario + 0x8000; if (coin_step(&collisionFlags) != 0) @@ -222,7 +222,7 @@ void bhv_blue_coin_jumping_loop(void) { case 0: if (o->oTimer == 0) { cur_obj_become_intangible(); - o->oVelY = 50.0; + o->oVelY = 50.0f; } object_step(); diff --git a/src/game/behaviors/mr_i.inc.c b/src/game/behaviors/mr_i.inc.c index 4483d119..184521aa 100644 --- a/src/game/behaviors/mr_i.inc.c +++ b/src/game/behaviors/mr_i.inc.c @@ -88,16 +88,16 @@ void mr_i_act_3(void) { o->oMoveAngleYaw += direction * coss(0x4000 * spinAmount); if (startYaw < 0 && o->oMoveAngleYaw >= 0) cur_obj_play_sound_2(SOUND_OBJ2_MRI_SPINNING); - o->oMoveAnglePitch = (1.0 - coss(0x4000 * spinAmount)) * -0x4000; + o->oMoveAnglePitch = (1.0f - coss(0x4000 * spinAmount)) * -0x4000; cur_obj_shake_y(4.0f); } else if (o->oTimer < 96) { if (o->oTimer == 64) cur_obj_play_sound_2(SOUND_OBJ_MRI_DEATH); shakeY = (f32)(o->oTimer - 63) / 32; o->oMoveAngleYaw += direction * coss(0x4000 * spinAmount); - o->oMoveAnglePitch = (1.0 - coss(0x4000 * spinAmount)) * -0x4000; + o->oMoveAnglePitch = (1.0f - coss(0x4000 * spinAmount)) * -0x4000; cur_obj_shake_y((s32)((1.0f - shakeY) * 4)); // trucating the f32? - baseScale = coss(0x4000 * shakeY) * 0.4 + 0.6; + baseScale = coss(0x4000 * shakeY) * 0.4f + 0.6f; cur_obj_scale(baseScale * scaleModifier); } else if (o->oTimer < 104) { // do nothing @@ -105,7 +105,7 @@ void mr_i_act_3(void) { if (o->oTimer == 104) { cur_obj_become_intangible(); spawn_mist_particles(); - o->oMrISize = scaleModifier * 0.6; + o->oMrISize = scaleModifier * 0.6f; if (o->oBehParams2ndByte) { o->oPosY += 100.0f; spawn_default_star(1370, 2000.0f, -320.0f); @@ -113,7 +113,7 @@ void mr_i_act_3(void) { } else cur_obj_spawn_loot_blue_coin(); } - o->oMrISize -= 0.2 * scaleModifier; + o->oMrISize -= 0.2f * scaleModifier; if (o->oMrISize < 0) o->oMrISize = 0; cur_obj_scale(o->oMrISize); diff --git a/src/game/behaviors/mushroom_1up.inc.c b/src/game/behaviors/mushroom_1up.inc.c index a7f006f6..900993bb 100644 --- a/src/game/behaviors/mushroom_1up.inc.c +++ b/src/game/behaviors/mushroom_1up.inc.c @@ -141,10 +141,10 @@ void sliding_1up_move(void) { o->oForwardVel += 25.0f; o->oVelY = 0; } else { - o->oForwardVel *= 0.98; + o->oForwardVel *= 0.98f; } - if (o->oForwardVel > 40.0) + if (o->oForwardVel > 40.0f) o->oForwardVel = 40.0f; if (!is_point_within_radius_of_mario(o->oPosX, o->oPosY, o->oPosZ, 5000)) diff --git a/src/game/behaviors/orange_number.inc.c b/src/game/behaviors/orange_number.inc.c index 8029fe53..6b619c45 100644 --- a/src/game/behaviors/orange_number.inc.c +++ b/src/game/behaviors/orange_number.inc.c @@ -10,7 +10,7 @@ void bhv_orange_number_loop(void) { o->oPosY += o->oVelY; o->oVelY -= 2.0f; if (o->oVelY < -21.0f) - o->oVelY = 14.0; + o->oVelY = 14.0f; if (o->oTimer == 35) { sparkleObj = spawn_object(o, MODEL_SPARKLES, bhvCoinSparklesSpawner); diff --git a/src/game/behaviors/piranha_bubbles.inc.c b/src/game/behaviors/piranha_bubbles.inc.c index a6d54d44..5b61038a 100644 --- a/src/game/behaviors/piranha_bubbles.inc.c +++ b/src/game/behaviors/piranha_bubbles.inc.c @@ -65,7 +65,7 @@ void bhv_piranha_plant_bubble_loop(void) { // Note that the bubble always starts this loop at its largest. if (frame < doneShrinkingFrame) { // Shrink from 5.0f to 1.0f. - scale = coss(frame / doneShrinkingFrame * 0x4000) * 4.0f + 1.0; + scale = coss(frame / doneShrinkingFrame * 0x4000) * 4.0f + 1.0f; } else if (frame > beginGrowingFrame) { // Grow from 1.0f to 5.0f. scale = sins(( @@ -73,7 +73,7 @@ void bhv_piranha_plant_bubble_loop(void) { (frame - (lastFrame / 2.0f + 4.0f)) / beginGrowingFrame) * 0x4000) * 4.0f - + 1.0; + + 1.0f; } else { // Stay at 1.0f for a few frames. scale = 1.0f; diff --git a/src/game/behaviors/piranha_plant.inc.c b/src/game/behaviors/piranha_plant.inc.c index 6a8f692a..371bf557 100644 --- a/src/game/behaviors/piranha_plant.inc.c +++ b/src/game/behaviors/piranha_plant.inc.c @@ -160,8 +160,8 @@ void piranha_plant_act_shrink_and_die(void) { * programmers meant to type `else if`. */ if (o->oPiranhaPlantScale > 0.0f) { - // Shrink by 0.04 per frame. - o->oPiranhaPlantScale = o->oPiranhaPlantScale - 0.04; + // Shrink by 0.04f per frame. + o->oPiranhaPlantScale = o->oPiranhaPlantScale - 0.04f; } else { o->oPiranhaPlantScale = 0.0f; cur_obj_spawn_loot_blue_coin(); @@ -198,9 +198,9 @@ void piranha_plant_act_respawn(void) { * sets the Piranha Plant's scale to 0, therefore the Piranha Plant will * grow from the ground unconditionally when in this state. */ - if (o->oPiranhaPlantScale < 1.0) { - // Grow by 0.02 per frame. - o->oPiranhaPlantScale += 0.02; + if (o->oPiranhaPlantScale < 1.0f) { + // Grow by 0.02f per frame. + o->oPiranhaPlantScale += 0.02f; } else { o->oPiranhaPlantScale = 1.0f; o->oAction = PIRANHA_PLANT_ACT_IDLE; diff --git a/src/game/behaviors/purple_switch.inc.c b/src/game/behaviors/purple_switch.inc.c index e6606b4a..ca22f816 100644 --- a/src/game/behaviors/purple_switch.inc.c +++ b/src/game/behaviors/purple_switch.inc.c @@ -16,7 +16,7 @@ void bhv_purple_switch_loop(void) { cur_obj_set_model(MODEL_PURPLE_SWITCH); cur_obj_scale(1.5f); if (gMarioObject->platform == o && !(gMarioStates[0].action & MARIO_NO_PURPLE_SWITCH)) { - if (lateral_dist_between_objects(o, gMarioObject) < 127.5) { + if (lateral_dist_between_objects(o, gMarioObject) < 127.5f) { o->oAction = PURPLE_SWITCH_PRESSED; } } diff --git a/src/game/behaviors/seaweed.inc.c b/src/game/behaviors/seaweed.inc.c index 4a9528d2..dedf90fd 100644 --- a/src/game/behaviors/seaweed.inc.c +++ b/src/game/behaviors/seaweed.inc.c @@ -11,35 +11,35 @@ void bhv_seaweed_bundle_init(void) { seaweed->oFaceAngleYaw = 14523; seaweed->oFaceAnglePitch = 5500; seaweed->oFaceAngleRoll = 9600; - seaweed->header.gfx.scale[0] = 1.0; - seaweed->header.gfx.scale[1] = 1.0; - seaweed->header.gfx.scale[2] = 1.0; + seaweed->header.gfx.scale[0] = 1.0f; + seaweed->header.gfx.scale[1] = 1.0f; + seaweed->header.gfx.scale[2] = 1.0f; //! gfx.animFrame uninitialized seaweed = spawn_object(o, MODEL_SEAWEED, bhvSeaweed); seaweed->oFaceAngleYaw = 41800; seaweed->oFaceAnglePitch = 6102; seaweed->oFaceAngleRoll = 0; - seaweed->header.gfx.scale[0] = 0.8; - seaweed->header.gfx.scale[1] = 0.9; - seaweed->header.gfx.scale[2] = 0.8; + seaweed->header.gfx.scale[0] = 0.8f; + seaweed->header.gfx.scale[1] = 0.9f; + seaweed->header.gfx.scale[2] = 0.8f; seaweed->header.gfx.animInfo.animFrame = random_float() * 80.0f; seaweed = spawn_object(o, MODEL_SEAWEED, bhvSeaweed); seaweed->oFaceAngleYaw = 40500; seaweed->oFaceAnglePitch = 8700; seaweed->oFaceAngleRoll = 4100; - seaweed->header.gfx.scale[0] = 0.8; - seaweed->header.gfx.scale[1] = 0.8; - seaweed->header.gfx.scale[2] = 0.8; + seaweed->header.gfx.scale[0] = 0.8f; + seaweed->header.gfx.scale[1] = 0.8f; + seaweed->header.gfx.scale[2] = 0.8f; seaweed->header.gfx.animInfo.animFrame = random_float() * 80.0f; seaweed = spawn_object(o, MODEL_SEAWEED, bhvSeaweed); seaweed->oFaceAngleYaw = 57236; seaweed->oFaceAnglePitch = 9500; seaweed->oFaceAngleRoll = 0; - seaweed->header.gfx.scale[0] = 1.2; - seaweed->header.gfx.scale[1] = 1.2; - seaweed->header.gfx.scale[2] = 1.2; + seaweed->header.gfx.scale[0] = 1.2f; + seaweed->header.gfx.scale[1] = 1.2f; + seaweed->header.gfx.scale[2] = 1.2f; seaweed->header.gfx.animInfo.animFrame = random_float() * 80.0f; } diff --git a/src/game/behaviors/snowman.inc.c b/src/game/behaviors/snowman.inc.c index a2989bf4..9560bdf0 100644 --- a/src/game/behaviors/snowman.inc.c +++ b/src/game/behaviors/snowman.inc.c @@ -46,7 +46,7 @@ void adjust_rolling_face_pitch(f32 f12) { o->oFaceAnglePitch += (s16)(o->oForwardVel * (100.0f / f12)); o->oSnowmansBottomRollingFacePitch += o->oForwardVel * 1e-4; - if (o->oSnowmansBottomRollingFacePitch > 1.0) + if (o->oSnowmansBottomRollingFacePitch > 1.0f) o->oSnowmansBottomRollingFacePitch = 1.0f; } @@ -59,7 +59,7 @@ void snowmans_bottom_act_1(void) { o->oSnowmansBottomTargetYaw = o->oPathedTargetYaw; o->oMoveAngleYaw = approach_s16_symmetric(o->oMoveAngleYaw, o->oSnowmansBottomTargetYaw, 0x400); - if (o->oForwardVel > 70.0) + if (o->oForwardVel > 70.0f) o->oForwardVel = 70.0f; if (pathResult == -1) { @@ -75,7 +75,7 @@ void snowmans_bottom_act_1(void) { void snowmans_bottom_act_2(void) { object_step_without_floor_orient(); - if (o->oForwardVel > 70.0) + if (o->oForwardVel > 70.0f) o->oForwardVel = 70.0f; o->oMoveAngleYaw = approach_s16_symmetric(o->oMoveAngleYaw, o->oSnowmansBottomTargetYaw, 0x400); diff --git a/src/game/behaviors/spindel.inc.c b/src/game/behaviors/spindel.inc.c index 6ca17abc..32c38791 100644 --- a/src/game/behaviors/spindel.inc.c +++ b/src/game/behaviors/spindel.inc.c @@ -67,7 +67,7 @@ void bhv_spindel_loop(void) { cur_obj_play_sound_2(SOUND_GENERAL2_SPINDEL_ROLL); } - homeYOffset = sins(o->oMoveAnglePitch * 4) * 23.0; + homeYOffset = sins(o->oMoveAnglePitch * 4) * 23.0f; if (homeYOffset < 0.0f) homeYOffset *= -1.0f; diff --git a/src/game/behaviors/tilting_inverted_pyramid.inc.c b/src/game/behaviors/tilting_inverted_pyramid.inc.c index 4e07cf11..da5e16ce 100644 --- a/src/game/behaviors/tilting_inverted_pyramid.inc.c +++ b/src/game/behaviors/tilting_inverted_pyramid.inc.c @@ -97,7 +97,7 @@ void bhv_tilting_inverted_pyramid_loop(void) { //! Always true since dy = 500, making d >= 500. if (d != 0.0f) { // Normalizing - d = 1.0 / d; + d = 1.0f / d; dx *= d; dy *= d; dz *= d; diff --git a/src/game/behaviors/tree_particles.inc.c b/src/game/behaviors/tree_particles.inc.c index 8c13cc09..c8a2e684 100644 --- a/src/game/behaviors/tree_particles.inc.c +++ b/src/game/behaviors/tree_particles.inc.c @@ -4,8 +4,8 @@ void bhv_tree_snow_or_leaf_loop(void) { cur_obj_update_floor_height(); if (o->oTimer == 0) { - o->oAngleVelPitch = (random_float() - 0.5) * 0x1000; - o->oAngleVelRoll = (random_float() - 0.5) * 0x1000; + o->oAngleVelPitch = (random_float() - 0.5f) * 0x1000; + o->oAngleVelRoll = (random_float() - 0.5f) * 0x1000; o->oTreeSnowOrLeafSidewardVel = 4; o->oTreeSnowOrLeafSidewardAngleVel = random_float() * 0x400 + 0x600; } @@ -23,7 +23,7 @@ void bhv_tree_snow_or_leaf_loop(void) { if (o->oVelY < -8.0f) o->oVelY = -8.0f; if (o->oForwardVel > 0) - o->oForwardVel -= 0.3; + o->oForwardVel -= 0.3f; else o->oForwardVel = 0; o->oPosX += sins(o->oMoveAngleYaw) * sins(o->oTreeSnowOrLeafSidewardAngle) * o->oTreeSnowOrLeafSidewardVel; @@ -40,7 +40,7 @@ void bhv_snow_leaf_particle_spawn_init(void) { // Whether a tree uses snow particles or not is decided via the model IDs instead of the course number nearestTree = cur_obj_nearest_object_with_behavior(bhvTree); if (nearestTree->header.gfx.sharedChild == gLoadedGraphNodes[MODEL_CCM_SNOW_TREE] || nearestTree->header.gfx.sharedChild == gLoadedGraphNodes[MODEL_SL_SNOW_TREE]) { - if (random_float() < 0.5) { + if (random_float() < 0.5f) { obj = spawn_object(o, MODEL_WHITE_PARTICLE_DL, bhvTreeSnow); scale = random_float(); obj_scale_xyz(obj, scale, scale, scale); @@ -49,7 +49,7 @@ void bhv_snow_leaf_particle_spawn_init(void) { obj->oVelY = random_float() * 15.0f; } } else { - if (random_float() < 0.3) { + if (random_float() < 0.3f) { obj = spawn_object(o, MODEL_LEAVES, bhvTreeLeaf); scale = random_float() * 3.0f; obj_scale_xyz(obj, scale, scale, scale); diff --git a/src/game/behaviors/tweester.inc.c b/src/game/behaviors/tweester.inc.c index dda8c525..d1c7b158 100644 --- a/src/game/behaviors/tweester.inc.c +++ b/src/game/behaviors/tweester.inc.c @@ -23,7 +23,7 @@ struct ObjectHitbox sTweesterHitbox = { */ void tweester_scale_and_move(f32 preScale) { s16 dYaw = 0x2C00; - f32 scale = preScale * 0.4; + f32 scale = preScale * 0.4f; o->header.gfx.scale[0] = (( coss(o->oTweesterScaleTimer) + 1.0f) * 0.5f * 0.3f + 1.0f) * scale; o->header.gfx.scale[1] = ((-coss(o->oTweesterScaleTimer) + 1.0f) * 0.5f * 0.5f + 0.5f) * scale; @@ -140,7 +140,7 @@ void bhv_tweester_sand_particle_loop(void) { o->oForwardVel += 15.0f; o->oPosY += 22.0f; - cur_obj_scale(random_float() + 1.0); + cur_obj_scale(random_float() + 1.0f); if (o->oTimer == 0) { obj_translate_xz_random(o, 100.0f); diff --git a/src/game/behaviors/ukiki.inc.c b/src/game/behaviors/ukiki.inc.c index 0e94dadd..9e430762 100644 --- a/src/game/behaviors/ukiki.inc.c +++ b/src/game/behaviors/ukiki.inc.c @@ -562,7 +562,7 @@ void cap_ukiki_held_loop(void) { if (mario_lose_cap_to_enemy(2)) { o->oUkikiTextState = UKIKI_TEXT_STEAL_CAP; o->oUkikiHasCap |= UKIKI_CAP_ON; - } else {} + } break; case UKIKI_TEXT_STEAL_CAP: diff --git a/src/game/behaviors/warp.inc.c b/src/game/behaviors/warp.inc.c index 107af849..32d8c5af 100644 --- a/src/game/behaviors/warp.inc.c +++ b/src/game/behaviors/warp.inc.c @@ -1,31 +1,32 @@ // warp.c.inc void bhv_warp_loop(void) { - u16 sp6; + u16 radius; if (o->oTimer == 0) { - sp6 = (o->oBehParams >> 24) & 0xFF; - if (sp6 == 0) + radius = (o->oBehParams >> 24) & 0xFF; + if (radius == 0) { o->hitboxRadius = 50.0f; - else if (sp6 == 0xFF) + } else if (radius == 0xFF) { o->hitboxRadius = 10000.0f; - else - o->hitboxRadius = sp6 * 10.0; + } else { + o->hitboxRadius = radius * 10.0f; + } o->hitboxHeight = 50.0f; } o->oInteractStatus = 0; } -void bhv_fading_warp_loop() // identical to the above function except for o->hitboxRadius -{ - u16 sp6; +void bhv_fading_warp_loop() { // identical to the above function except for o->hitboxRadius + u16 radius; if (o->oTimer == 0) { - sp6 = (o->oBehParams >> 24) & 0xFF; - if (sp6 == 0) + radius = (o->oBehParams >> 24) & 0xFF; + if (radius == 0) { o->hitboxRadius = 85.0f; - else if (sp6 == 0xFF) + } else if (radius == 0xFF) { o->hitboxRadius = 10000.0f; - else - o->hitboxRadius = sp6 * 10.0; + } else { + o->hitboxRadius = radius * 10.0f; + } o->hitboxHeight = 50.0f; } o->oInteractStatus = 0; diff --git a/src/game/behaviors/water_mist_particle.inc.c b/src/game/behaviors/water_mist_particle.inc.c index 9b384aa7..cad1c07b 100644 --- a/src/game/behaviors/water_mist_particle.inc.c +++ b/src/game/behaviors/water_mist_particle.inc.c @@ -14,8 +14,9 @@ void bhv_water_mist_loop(void) { } cur_obj_move_using_fvel_and_gravity(); o->oOpacity -= 42; - scale = (254 - o->oOpacity) / 254.0 * 1.0 + 0.5; // seen this before + scale = (254 - o->oOpacity) / 254.0f * 1.0f + 0.5f; // seen this before cur_obj_scale(scale); - if (o->oOpacity < 2) + if (o->oOpacity < 2) { obj_mark_for_deletion(o); + } } diff --git a/src/game/behaviors/water_objs.inc.c b/src/game/behaviors/water_objs.inc.c index b432b431..bb39a2d5 100644 --- a/src/game/behaviors/water_objs.inc.c +++ b/src/game/behaviors/water_objs.inc.c @@ -41,7 +41,7 @@ void bhv_bubble_wave_init(void) { } void scale_bubble_random(void) { - cur_obj_scale(random_float() + 1.0); + cur_obj_scale(random_float() + 1.0f); } void bhv_bubble_maybe_loop(void) { diff --git a/src/game/behaviors/water_ring.inc.c b/src/game/behaviors/water_ring.inc.c index 6f272172..89edc5af 100644 --- a/src/game/behaviors/water_ring.inc.c +++ b/src/game/behaviors/water_ring.inc.c @@ -47,7 +47,7 @@ void water_ring_check_collection(f32 avgScale, struct Object *ringManager) { if (!is_point_close_to_object(o, gMarioObject->header.gfx.pos[0], gMarioObject->header.gfx.pos[1] + 80.0f, gMarioObject->header.gfx.pos[2], - (avgScale + 0.2) * 120.0)) { + (avgScale + 0.2f) * 120.0f)) { o->oWaterRingMarioDistInFront = marioDistInFront; return; } @@ -81,16 +81,16 @@ void water_ring_check_collection(f32 avgScale, struct Object *ringManager) { } void water_ring_set_scale(f32 avgScale) { - o->header.gfx.scale[0] = sins(o->oWaterRingScalePhaseX) * 0.1 + avgScale; - o->header.gfx.scale[1] = sins(o->oWaterRingScalePhaseY) * 0.5 + avgScale; - o->header.gfx.scale[2] = sins(o->oWaterRingScalePhaseZ) * 0.1 + avgScale; + o->header.gfx.scale[0] = sins(o->oWaterRingScalePhaseX) * 0.1f + avgScale; + o->header.gfx.scale[1] = sins(o->oWaterRingScalePhaseY) * 0.5f + avgScale; + o->header.gfx.scale[2] = sins(o->oWaterRingScalePhaseZ) * 0.1f + avgScale; o->oWaterRingScalePhaseX += 0x1700; o->oWaterRingScalePhaseY += 0x1700; o->oWaterRingScalePhaseZ += 0x1700; } void water_ring_act_collected(void) { - f32 avgScale = (f32) o->oTimer * 0.2 + o->oWaterRingAvgScale; + f32 avgScale = (f32) o->oTimer * 0.2f + o->oWaterRingAvgScale; if (o->oTimer >= 21) o->activeFlags = ACTIVE_FLAG_DEACTIVATED; @@ -103,7 +103,7 @@ void water_ring_act_collected(void) { } void water_ring_act_not_collected(void) { - f32 avgScale = (f32) o->oTimer / 225.0 * 3.0 + 0.5; + f32 avgScale = (f32) o->oTimer / 225.0f * 3.0f + 0.5f; //! In this case ringSpawner and ringManager are the same object, // because the Jet Stream Ring Spawner is its own parent object. @@ -194,12 +194,12 @@ void bhv_manta_ray_water_ring_init(void) { } void manta_water_ring_act_not_collected(void) { - f32 avgScale = (f32) o->oTimer / 50.0f * 1.3 + 0.1; + f32 avgScale = (f32) o->oTimer / 50.0f * 1.3f + 0.1f; struct Object *ringSpawner = o->parentObj; struct Object *ringManager = ringSpawner->parentObj; - if (avgScale > 1.3) - avgScale = 1.3; + if (avgScale > 1.3f) + avgScale = 1.3f; if (o->oTimer >= 151) { o->oOpacity -= 2; diff --git a/src/game/behaviors/water_splashes_and_waves.inc.c b/src/game/behaviors/water_splashes_and_waves.inc.c index da54d595..2a7b02fe 100644 --- a/src/game/behaviors/water_splashes_and_waves.inc.c +++ b/src/game/behaviors/water_splashes_and_waves.inc.c @@ -92,7 +92,7 @@ void bhv_idle_water_wave_loop(void) { } void bhv_water_droplet_splash_init(void) { - cur_obj_scale(random_float() + 1.5); + cur_obj_scale(random_float() + 1.5f); } void bhv_bubble_splash_init(void) { @@ -123,7 +123,7 @@ void bhv_wave_trail_shrink(void) { o->oWaveTrailSize = o->header.gfx.scale[0]; if (o->oAnimState > 3) { - o->oWaveTrailSize = o->oWaveTrailSize - 0.1; // Shrink the wave + o->oWaveTrailSize = o->oWaveTrailSize - 0.1f; // Shrink the wave if (o->oWaveTrailSize < 0.0f) o->oWaveTrailSize = 0.0f; o->header.gfx.scale[0] = o->oWaveTrailSize; diff --git a/src/game/behaviors/white_puff_explode.inc.c b/src/game/behaviors/white_puff_explode.inc.c index 9ff322ff..acd00351 100644 --- a/src/game/behaviors/white_puff_explode.inc.c +++ b/src/game/behaviors/white_puff_explode.inc.c @@ -29,9 +29,9 @@ void bhv_white_puff_exploding_loop(void) { if (o->oOpacity < 2) obj_mark_for_deletion(o); if (o->oWhitePuffSlowFade) - scale = o->oWhitePuffScaleX * ((254 - o->oOpacity) / 254.0); + scale = o->oWhitePuffScaleX * ((254 - o->oOpacity) / 254.0f); else - scale = o->oWhitePuffScaleX * (o->oOpacity / 254.0); + scale = o->oWhitePuffScaleX * (o->oOpacity / 254.0f); cur_obj_scale(scale); } } diff --git a/src/game/behaviors/yoshi.inc.c b/src/game/behaviors/yoshi.inc.c index ec77889e..e70313d5 100644 --- a/src/game/behaviors/yoshi.inc.c +++ b/src/game/behaviors/yoshi.inc.c @@ -43,7 +43,7 @@ void yoshi_idle_loop(void) { s16 chosenHome; if (o->oTimer > 90) { - chosenHome = random_float() * 3.99; + chosenHome = random_float() * 3.99f; if (o->oYoshiChosenHome == chosenHome) { return; @@ -119,7 +119,7 @@ void yoshi_walk_and_jump_off_roof_loop(void) { void yoshi_finish_jumping_and_despawn_loop(void) { cur_obj_extend_animation_if_at_end(); obj_move_xyz_using_fvel_and_yaw(o); - o->oVelY -= 2.0; + o->oVelY -= 2.0f; if (o->oPosY < 2100.0f) { set_mario_npc_dialog(MARIO_DIALOG_STOP); gObjCutsceneDone = TRUE; diff --git a/src/game/camera.c b/src/game/camera.c index d21c8f20..ef946406 100644 --- a/src/game/camera.c +++ b/src/game/camera.c @@ -520,8 +520,8 @@ void set_camera_shake_from_hit(s16 shake) { break; case SHAKE_HIT_FROM_BELOW: - gLakituState.focHSpeed = 0.07; - gLakituState.posHSpeed = 0.07; + gLakituState.focHSpeed = 0.07f; + gLakituState.posHSpeed = 0.07f; break; case SHAKE_SHOCK: diff --git a/src/game/geo_misc.c b/src/game/geo_misc.c index 85194329..cb6afa7d 100644 --- a/src/game/geo_misc.c +++ b/src/game/geo_misc.c @@ -179,7 +179,7 @@ Gfx *geo_exec_flying_carpet_create(s32 callContext, struct GraphNode *node, UNUS curGraphNodeObject = (struct Object *) gCurGraphNodeObject; if (gMarioObject->platform == curGraphNodeObject) { gFlyingCarpetState = FLYING_CARPET_MOVING_WITH_MARIO; - } else if (curGraphNodeObject->oForwardVel != 0.0) { + } else if (curGraphNodeObject->oForwardVel != 0.0f) { gFlyingCarpetState = FLYING_CARPET_MOVING_WITHOUT_MARIO; } else { gFlyingCarpetState = FLYING_CARPET_IDLE; diff --git a/src/game/hud.c b/src/game/hud.c index 71ebb376..c0403142 100644 --- a/src/game/hud.c +++ b/src/game/hud.c @@ -190,7 +190,7 @@ void animate_power_meter_emphasized(void) { s16 hudDisplayFlags = gHudDisplay.flags; if (!(hudDisplayFlags & HUD_DISPLAY_FLAG_EMPHASIZE_POWER)) { - if (sPowerMeterVisibleTimer == 45.0) { + if (sPowerMeterVisibleTimer == 45.0f) { sPowerMeterHUD.animation = POWER_METER_DEEMPHASIZING; } } else { @@ -240,7 +240,7 @@ void handle_power_meter_actions(s16 numHealthWedges) { sPowerMeterVisibleTimer = 0; } // After health is full, hide power meter - if (numHealthWedges == 8 && sPowerMeterVisibleTimer > 45.0) { + if (numHealthWedges == 8 && sPowerMeterVisibleTimer > 45.0f) { sPowerMeterHUD.animation = POWER_METER_HIDING; } // Update to match health value diff --git a/src/game/ingame_menu.c b/src/game/ingame_menu.c index 491f7ba3..42bf6e14 100644 --- a/src/game/ingame_menu.c +++ b/src/game/ingame_menu.c @@ -601,7 +601,7 @@ s16 get_str_x_pos_from_center(s16 centerPos, u8 *str, UNUSED f32 scale) { } // return the x position of where the string starts as half the string's // length from the position of the provided center. - return (s16)(centerPos - (s16)(spacesWidth / 2.0)); + return (s16)(centerPos - (s16)(spacesWidth / 2.0f)); } @@ -732,17 +732,13 @@ void reset_dialog_render_state(void) { gDialogResponse = DIALOG_RESPONSE_NONE; } -#define X_VAL1 -7.0f -#define Y_VAL1 5.0 -#define Y_VAL2 5.0f - void render_dialog_box_type(struct DialogEntry *dialog, s8 linesPerBox) { create_dl_translation_matrix(MENU_MTX_NOPUSH, dialog->leftOffset, dialog->width, 0); switch (gDialogBoxType) { case DIALOG_TYPE_ROTATE: // Renders a dialog black box with zoom and rotation if (gDialogBoxState == DIALOG_STATE_OPENING || gDialogBoxState == DIALOG_STATE_CLOSING) { - create_dl_scale_matrix(MENU_MTX_NOPUSH, 1.0 / gDialogBoxScale, 1.0 / gDialogBoxScale, 1.0f); + create_dl_scale_matrix(MENU_MTX_NOPUSH, 1.0f / gDialogBoxScale, 1.0f / gDialogBoxScale, 1.0f); // convert the speed into angle create_dl_rotation_matrix(MENU_MTX_NOPUSH, gDialogBoxOpenTimer * 4.0f, 0, 0, 1.0f); } @@ -750,16 +746,15 @@ void render_dialog_box_type(struct DialogEntry *dialog, s8 linesPerBox) { break; case DIALOG_TYPE_ZOOM: // Renders a dialog white box with zoom if (gDialogBoxState == DIALOG_STATE_OPENING || gDialogBoxState == DIALOG_STATE_CLOSING) { - create_dl_translation_matrix(MENU_MTX_NOPUSH, 65.0 - (65.0 / gDialogBoxScale), - (40.0 / gDialogBoxScale) - 40, 0); - create_dl_scale_matrix(MENU_MTX_NOPUSH, 1.0 / gDialogBoxScale, 1.0 / gDialogBoxScale, 1.0f); + create_dl_translation_matrix(MENU_MTX_NOPUSH, 65.0f - (65.0f / gDialogBoxScale), (40.0f / gDialogBoxScale) - 40, 0); + create_dl_scale_matrix(MENU_MTX_NOPUSH, 1.0f / gDialogBoxScale, 1.0f / gDialogBoxScale, 1.0f); } gDPSetEnvColor(gDisplayListHead++, 255, 255, 255, 150); break; } - create_dl_translation_matrix(MENU_MTX_PUSH, X_VAL1, Y_VAL1, 0); - create_dl_scale_matrix(MENU_MTX_NOPUSH, 1.1f, ((f32) linesPerBox / Y_VAL2) + 0.1, 1.0f); + create_dl_translation_matrix(MENU_MTX_PUSH, -7.0f, 5.0f, 0); + create_dl_scale_matrix(MENU_MTX_NOPUSH, 1.1f, ((f32) linesPerBox / 5.0f) + 0.1f, 1.0f); gSPDisplayList(gDisplayListHead++, dl_draw_text_bg_box); gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW); @@ -1156,11 +1151,11 @@ void render_dialog_entries(void) { } if (gDialogBoxType == DIALOG_TYPE_ROTATE) { - gDialogBoxOpenTimer -= 7.5; - gDialogBoxScale -= 1.5; + gDialogBoxOpenTimer -= 7.5f; + gDialogBoxScale -= 1.5f; } else { - gDialogBoxOpenTimer -= 10.0; - gDialogBoxScale -= 2.0; + gDialogBoxOpenTimer -= 10.0f; + gDialogBoxScale -= 2.0f; } if (gDialogBoxOpenTimer == 0.0f) { diff --git a/src/game/mario_actions_airborne.c b/src/game/mario_actions_airborne.c index f935135e..7966975c 100644 --- a/src/game/mario_actions_airborne.c +++ b/src/game/mario_actions_airborne.c @@ -1714,7 +1714,7 @@ s32 act_shot_from_cannon(struct MarioState *m) { set_mario_action(m, ACT_FLYING, 0); } - if ((m->forwardVel -= 0.05) < 10.0f) { + if ((m->forwardVel -= 0.05f) < 10.0f) { mario_set_forward_vel(m, 10.0f); } diff --git a/src/game/mario_actions_cutscene.c b/src/game/mario_actions_cutscene.c index cef67c53..f4352e00 100644 --- a/src/game/mario_actions_cutscene.c +++ b/src/game/mario_actions_cutscene.c @@ -999,7 +999,7 @@ s32 act_spawn_spin_airborne(struct MarioState *m) { mario_set_forward_vel(m, m->forwardVel); // landed on floor, play spawn land animation - if (perform_air_step(m, 0.0) == AIR_STEP_LANDED) { + if (perform_air_step(m, 0.0f) == AIR_STEP_LANDED) { play_mario_landing_sound(m, SOUND_ACTION_TERRAIN_LANDING); set_mario_action(m, ACT_SPAWN_SPIN_LANDING, 0); } @@ -2026,7 +2026,7 @@ static void end_peach_cutscene_mario_landing(struct MarioState *m) { sEndJumboStarObj = spawn_object_abs_with_rot(gCurrentObject, 0, MODEL_STAR, bhvStaticObject, 0, 2528, -1800, 0, 0, 0); - obj_scale(sEndJumboStarObj, 3.0); + obj_scale(sEndJumboStarObj, 3.0f); advance_cutscene_step(m); } } diff --git a/src/game/mario_actions_moving.c b/src/game/mario_actions_moving.c index 8f7fcf45..1253932d 100644 --- a/src/game/mario_actions_moving.c +++ b/src/game/mario_actions_moving.c @@ -1421,7 +1421,7 @@ void common_slide_action(struct MarioState *m, u32 endAction, u32 airAction, s32 s16 wallAngle = atan2s(m->wall->normal.z, m->wall->normal.x); f32 slideSpeed = sqrtf(m->slideVelX * m->slideVelX + m->slideVelZ * m->slideVelZ); - if ((slideSpeed *= 0.9) < 4.0f) { + if ((slideSpeed *= 0.9f) < 4.0f) { slideSpeed = 4.0f; } diff --git a/src/game/moving_texture.c b/src/game/moving_texture.c index 9a5adf55..b04b8fda 100644 --- a/src/game/moving_texture.c +++ b/src/game/moving_texture.c @@ -310,9 +310,9 @@ Gfx *geo_wdw_set_initial_water_level(s32 callContext, UNUSED struct GraphNode *n gWdwWaterLevelSet = FALSE; } else if (callContext == GEO_CONTEXT_RENDER && gEnvironmentRegions != NULL && !gWdwWaterLevelSet) { - if (gPaintingMarioYEntry <= 1382.4) { + if (gPaintingMarioYEntry <= 1382.4f) { wdwWaterHeight = 31; - } else if (gPaintingMarioYEntry >= 1600.0) { + } else if (gPaintingMarioYEntry >= 1600.0f) { wdwWaterHeight = 2816; } else { wdwWaterHeight = 1024; @@ -643,7 +643,7 @@ Gfx *geo_movtex_draw_water_regions(s32 callContext, struct GraphNode *node, UNUS } asGenerated = (struct GraphNodeGenerated *) node; if (asGenerated->parameter == JRB_MOVTEX_INTIAL_MIST) { - if (gLakituState.goalPos[1] < 1024.0) { // if camera under water + if (gLakituState.goalPos[1] < 1024.0f) { // if camera under water return NULL; } if (save_file_get_star_flags(gCurrSaveFileNum - 1, COURSE_JRB - 1) & 1) { // first star in JRB complete diff --git a/src/game/obj_behaviors.c b/src/game/obj_behaviors.c index ec1a72c4..a79263c5 100644 --- a/src/game/obj_behaviors.c +++ b/src/game/obj_behaviors.c @@ -190,7 +190,7 @@ s8 turn_obj_away_from_steep_floor(struct Surface *objFloor, f32 floorY, f32 objV floor_nZ = objFloor->normal.z; // If the floor is steep and we are below it (i.e. walking into it), turn away from the floor. - if (floor_nY < 0.5 && floorY > o->oPosY) { + if (floor_nY < 0.5f && floorY > o->oPosY) { objVelXCopy = objVelX; objVelZCopy = objVelZ; turn_obj_away_from_surface(objVelXCopy, objVelZCopy, floor_nX, floor_nY, floor_nZ, &objYawX, &objYawZ); @@ -241,7 +241,7 @@ void obj_orient_graph(struct Object *obj, f32 normalX, f32 normalY, f32 normalZ) * Determines an object's forward speed multiplier. */ void calc_obj_friction(f32 *objFriction, f32 floor_nY) { - if (floor_nY < 0.2 && o->oFriction < 0.9999) { + if (floor_nY < 0.2f && o->oFriction < 0.9999f) { *objFriction = 0; } else { *objFriction = o->oFriction; @@ -259,21 +259,21 @@ void calc_new_obj_vel_and_pos_y(struct Surface *objFloor, f32 objFloorY, f32 obj // Caps vertical speed with a "terminal velocity". o->oVelY -= o->oGravity; - if (o->oVelY > 75.0) { - o->oVelY = 75.0; + if (o->oVelY > 75.0f) { + o->oVelY = 75.0f; } - if (o->oVelY < -75.0) { - o->oVelY = -75.0; + if (o->oVelY < -75.0f) { + o->oVelY = -75.0f; } o->oPosY += o->oVelY; - //Snap the object up to the floor. + // Snap the object up to the floor. if (o->oPosY < objFloorY) { o->oPosY = objFloorY; // Bounces an object if the ground is hit fast enough. - if (o->oVelY < -17.5) { + if (o->oVelY < -17.5f) { o->oVelY = -(o->oVelY / 2); } else { o->oVelY = 0; @@ -285,19 +285,13 @@ void calc_new_obj_vel_and_pos_y(struct Surface *objFloor, f32 objFloorY, f32 obj obj_orient_graph(o, floor_nX, floor_nY, floor_nZ); // Adds horizontal component of gravity for horizontal speed. - objVelX += floor_nX * (floor_nX * floor_nX + floor_nZ * floor_nZ) - / (floor_nX * floor_nX + floor_nY * floor_nY + floor_nZ * floor_nZ) * o->oGravity - * 2; - objVelZ += floor_nZ * (floor_nX * floor_nX + floor_nZ * floor_nZ) - / (floor_nX * floor_nX + floor_nY * floor_nY + floor_nZ * floor_nZ) * o->oGravity - * 2; + f32 nxz = (sqr(floor_nX) + sqr(floor_nZ)); + f32 nxyz = (nxz + sqr(floor_nY)); + objVelX += floor_nX * (nxz) / (nxyz) * o->oGravity * 2; + objVelZ += floor_nZ * (nxz) / (nxyz) * o->oGravity * 2; - if (objVelX < 0.000001 && objVelX > -0.000001) { - objVelX = 0; - } - if (objVelZ < 0.000001 && objVelZ > -0.000001) { - objVelZ = 0; - } + if (objVelX < 0.000001f && objVelX > -0.000001f) objVelX = 0; + if (objVelZ < 0.000001f && objVelZ > -0.000001f) objVelZ = 0; if (objVelX != 0 || objVelZ != 0) { o->oMoveAngleYaw = atan2s(objVelZ, objVelX); @@ -308,8 +302,7 @@ void calc_new_obj_vel_and_pos_y(struct Surface *objFloor, f32 objFloorY, f32 obj } } -void calc_new_obj_vel_and_pos_y_underwater(struct Surface *objFloor, f32 floorY, f32 objVelX, f32 objVelZ, - f32 waterY) { +void calc_new_obj_vel_and_pos_y_underwater(struct Surface *objFloor, f32 floorY, f32 objVelX, f32 objVelZ, f32 waterY) { f32 floor_nX = objFloor->normal.x; f32 floor_nY = objFloor->normal.y; f32 floor_nZ = objFloor->normal.z; @@ -318,21 +311,21 @@ void calc_new_obj_vel_and_pos_y_underwater(struct Surface *objFloor, f32 floorY, o->oVelY -= netYAccel; // Caps vertical speed with a "terminal velocity". - if (o->oVelY > 75.0) { - o->oVelY = 75.0; + if (o->oVelY > 75.0f) { + o->oVelY = 75.0f; } - if (o->oVelY < -75.0) { - o->oVelY = -75.0; + if (o->oVelY < -75.0f) { + o->oVelY = -75.0f; } o->oPosY += o->oVelY; - //Snap the object up to the floor. + // Snap the object up to the floor. if (o->oPosY < floorY) { o->oPosY = floorY; // Bounces an object if the ground is hit fast enough. - if (o->oVelY < -17.5) { + if (o->oVelY < -17.5f) { o->oVelY = -(o->oVelY / 2); } else { o->oVelY = 0; @@ -340,7 +333,7 @@ void calc_new_obj_vel_and_pos_y_underwater(struct Surface *objFloor, f32 floorY, } // If moving fast near the surface of the water, flip vertical speed? To emulate skipping? - if (o->oForwardVel > 12.5 && (waterY + 30.0f) > o->oPosY && (waterY - 30.0f) < o->oPosY) { + if (o->oForwardVel > 12.5f && (waterY + 30.0f) > o->oPosY && (waterY - 30.0f) < o->oPosY) { o->oVelY = -o->oVelY; } @@ -348,20 +341,16 @@ void calc_new_obj_vel_and_pos_y_underwater(struct Surface *objFloor, f32 floorY, obj_orient_graph(o, floor_nX, floor_nY, floor_nZ); // Adds horizontal component of gravity for horizontal speed. - objVelX += floor_nX * (floor_nX * floor_nX + floor_nZ * floor_nZ) - / (floor_nX * floor_nX + floor_nY * floor_nY + floor_nZ * floor_nZ) * netYAccel * 2; - objVelZ += floor_nZ * (floor_nX * floor_nX + floor_nZ * floor_nZ) - / (floor_nX * floor_nX + floor_nY * floor_nY + floor_nZ * floor_nZ) * netYAccel * 2; + f32 nxz = (sqr(floor_nX) + sqr(floor_nZ)); + f32 nxyz = (nxz + sqr(floor_nY)); + objVelX += floor_nX * (nxz) / (nxyz) * netYAccel * 2; + objVelZ += floor_nZ * (nxz) / (nxyz) * netYAccel * 2; } - if (objVelX < 0.000001 && objVelX > -0.000001) { - objVelX = 0; - } - if (objVelZ < 0.000001 && objVelZ > -0.000001) { - objVelZ = 0; - } + if (objVelX < 0.000001f && objVelX > -0.000001f) objVelX = 0; + if (objVelZ < 0.000001f && objVelZ > -0.000001f) objVelZ = 0; - if (o->oVelY < 0.000001 && o->oVelY > -0.000001) { + if (o->oVelY < 0.000001f && o->oVelY > -0.000001f) { o->oVelY = 0; } @@ -371,8 +360,8 @@ void calc_new_obj_vel_and_pos_y_underwater(struct Surface *objFloor, f32 floorY, // Decreases both vertical velocity and forward velocity. Likely so that skips above // don't loop infinitely. - o->oForwardVel = sqrtf(objVelX * objVelX + objVelZ * objVelZ) * 0.8; - o->oVelY *= 0.8; + o->oForwardVel = sqrtf(sqr(objVelX) + sqr(objVelZ)) * 0.8f; + o->oVelY *= 0.8f; } /** diff --git a/src/game/paintings.c b/src/game/paintings.c index 9c2b0152..a42fb2e8 100644 --- a/src/game/paintings.c +++ b/src/game/paintings.c @@ -230,8 +230,8 @@ f32 painting_mario_y(struct Painting *painting) { f32 painting_mario_z(struct Painting *painting) { f32 relZ = painting->posZ - gPaintingMarioZPos; - if (relZ < 0.0) { - relZ = 0.0; + if (relZ < 0.0f) { + relZ = 0.0f; } else if (relZ > painting->size) { relZ = painting->size; } @@ -289,8 +289,8 @@ f32 painting_nearest_4th(struct Painting *painting) { f32 painting_mario_x(struct Painting *painting) { f32 relX = gPaintingMarioXPos - painting->posX; - if (relX < 0.0) { - relX = 0.0; + if (relX < 0.0f) { + relX = 0.0f; } else if (relX > painting->size) { relX = painting->size; } @@ -309,7 +309,7 @@ f32 painting_ripple_x(struct Painting *painting, s8 xSource) { return painting_mario_x(painting); break; case MIDDLE_X: // concentric rippling may not care about Mario - return painting->size / 2.0; + return painting->size / 2.0f; break; } return 0.0f; @@ -790,7 +790,7 @@ void painting_average_vertex_normals(s16 *neighborTris, s16 numVtx) { nz /= neighbors; nlen = sqrtf(sqr(nx) + sqr(ny) + sqr(nz)); - if (nlen == 0.0) { + if (nlen == 0.0f) { gPaintingMesh[i].norm[0] = 0; gPaintingMesh[i].norm[1] = 0; gPaintingMesh[i].norm[2] = 0; diff --git a/src/game/screen_transition.c b/src/game/screen_transition.c index c94ca042..98083747 100644 --- a/src/game/screen_transition.c +++ b/src/game/screen_transition.c @@ -89,7 +89,7 @@ s16 calc_tex_transition_radius(s8 fadeTimer, s8 transTime, struct WarpTransition f32 radiusTime = sTransitionColorFadeCount[fadeTimer] * texRadius / (f32)(transTime - 1); f32 result = transData->startTexRadius + radiusTime; - return (s16)(result + 0.5); + return (s16)(result + 0.5f); } f32 calc_tex_transition_time(s8 fadeTimer, s8 transTime, struct WarpTransitionData *transData) { @@ -113,13 +113,13 @@ u16 convert_tex_transition_angle_to_pos(struct WarpTransitionData *transData) { s16 center_tex_transition_x(struct WarpTransitionData *transData, f32 texTransTime, u16 texTransPos) { f32 x = transData->startTexX + coss(texTransPos) * texTransTime; - return (s16)(x + 0.5); + return (s16)(x + 0.5f); } s16 center_tex_transition_y(struct WarpTransitionData *transData, f32 texTransTime, u16 texTransPos) { f32 y = transData->startTexY + sins(texTransPos) * texTransTime; - return (s16)(y + 0.5); + return (s16)(y + 0.5f); } void make_tex_transition_vertex(Vtx *verts, s32 n, s8 fadeTimer, struct WarpTransitionData *transData, s16 centerTransX, s16 centerTransY, diff --git a/src/game/shadow.c b/src/game/shadow.c index 087d26a9..ebc75d08 100644 --- a/src/game/shadow.c +++ b/src/game/shadow.c @@ -115,8 +115,10 @@ s16 sSurfaceTypeBelowShadow; */ void rotate_rectangle(f32 *newZ, f32 *newX, f32 oldZ, f32 oldX) { struct Object *obj = (struct Object *) gCurGraphNodeObject; - *newZ = oldZ * coss(obj->oFaceAngleYaw) - oldX * sins(obj->oFaceAngleYaw); - *newX = oldZ * sins(obj->oFaceAngleYaw) + oldX * coss(obj->oFaceAngleYaw); + f32 s = sins(obj->oFaceAngleYaw); + f32 c = coss(obj->oFaceAngleYaw); + *newZ = oldZ * c - oldX * s; + *newX = oldZ * s + oldX * c; } /** @@ -134,12 +136,12 @@ f32 atan2_deg(f32 a, f32 b) { f32 scale_shadow_with_distance(f32 initial, f32 distFromFloor) { f32 newScale; - if (distFromFloor <= 0.0) { + if (distFromFloor <= 0.0f) { newScale = initial; - } else if (distFromFloor >= 600.0) { - newScale = initial * 0.5; + } else if (distFromFloor >= 600.0f) { + newScale = initial * 0.5f; } else { - newScale = initial * (1.0 - (0.5 * distFromFloor / 600.0)); + newScale = initial * (1.0f - (0.5f * distFromFloor / 600.0f)); } return newScale; @@ -149,7 +151,7 @@ f32 scale_shadow_with_distance(f32 initial, f32 distFromFloor) { * Disable a shadow when its parent object is more than 600 units from the ground. */ f32 disable_shadow_with_distance(f32 shadowScale, f32 distFromFloor) { - if (distFromFloor >= 600.0) { + if (distFromFloor >= 600.0f) { return 0.0f; } else { return shadowScale; @@ -164,12 +166,12 @@ s32 dim_shadow_with_distance(u8 solidity, f32 distFromFloor) { if (solidity < 121) { return solidity; - } else if (distFromFloor <= 0.0) { + } else if (distFromFloor <= 0.0f) { return solidity; - } else if (distFromFloor >= 600.0) { + } else if (distFromFloor >= 600.0f) { return 120; } else { - ret = ((120 - solidity) * distFromFloor) / 600.0 + (f32) solidity; + ret = ((120 - solidity) * distFromFloor) / 600.0f + (f32) solidity; return ret; } } @@ -230,16 +232,16 @@ s32 init_shadow(struct Shadow *s, f32 xPos, f32 yPos, f32 zPos, s16 shadowScale, } else { gShadowAboveCustomWater = FALSE; // Assume that the water is flat. - s->floorNormalX = 0; - s->floorNormalY = 1.0; - s->floorNormalZ = 0; + s->floorNormalX = 0.0f; + s->floorNormalY = 1.0f; + s->floorNormalZ = 0.0f; s->floorOriginOffset = -waterLevel; } } else { // Don't draw a shadow if the floor is lower than expected possible, // or if the y-normal is negative (an unexpected result). - if (s->floorHeight < FLOOR_LOWER_LIMIT_SHADOW || floor->normal.y <= 0.0) { + if (s->floorHeight < FLOOR_LOWER_LIMIT_SHADOW || floor->normal.y <= 0.0f) { return 1; } @@ -260,10 +262,10 @@ s32 init_shadow(struct Shadow *s, f32 xPos, f32 yPos, f32 zPos, s16 shadowScale, floorSteepness = sqrtf(s->floorNormalX * s->floorNormalX + s->floorNormalZ * s->floorNormalZ); // This if-statement avoids dividing by 0. - if (floorSteepness == 0.0) { + if (floorSteepness == 0.0f) { s->floorTilt = 0; } else { - s->floorTilt = 90.0 - atan2_deg(floorSteepness, s->floorNormalY); + s->floorTilt = 90.0f - atan2_deg(floorSteepness, s->floorNormalY); } return 0; } @@ -370,8 +372,7 @@ void get_vertex_coords(s8 index, s8 shadowVertexType, s8 *xCoord, s8 *zCoord) { * vertex and 4 vertex cases are identical, and the above-described clamping * behavior is overwritten. */ -void calculate_vertex_xyz(s8 index, struct Shadow s, f32 *xPosVtx, f32 *yPosVtx, f32 *zPosVtx, - s8 shadowVertexType) { +void calculate_vertex_xyz(s8 index, struct Shadow s, f32 *xPosVtx, f32 *yPosVtx, f32 *zPosVtx, s8 shadowVertexType) { f32 tiltedScale = cosf(s.floorTilt * M_PI / 180.0) * s.shadowScale; f32 downwardAngle = s.floorDownwardAngle * M_PI / 180.0; f32 halfScale; @@ -382,8 +383,8 @@ void calculate_vertex_xyz(s8 index, struct Shadow s, f32 *xPosVtx, f32 *yPosVtx, // This makes xCoordUnit and yCoordUnit each one of -1, 0, or 1. get_vertex_coords(index, shadowVertexType, &xCoordUnit, &zCoordUnit); - halfScale = (xCoordUnit * s.shadowScale) / 2.0; - halfTiltedScale = (zCoordUnit * tiltedScale) / 2.0; + halfScale = (xCoordUnit * s.shadowScale) / 2.0f; + halfTiltedScale = (zCoordUnit * tiltedScale) / 2.0f; *xPosVtx = (halfTiltedScale * sinf(downwardAngle)) + (halfScale * cosf(downwardAngle)) + s.parentX; *zPosVtx = (halfTiltedScale * cosf(downwardAngle)) - (halfScale * sinf(downwardAngle)) + s.parentZ; @@ -523,7 +524,7 @@ void linearly_interpolate_solidity_negative(struct Shadow *s, u8 initialSolidity // This is not necessarily a bug, since this function is only used once, // with start == 0. if (curr >= start && end >= curr) { - s->solidity = ((f32) initialSolidity * (1.0 - (f32)(curr - start) / (end - start))); + s->solidity = ((f32) initialSolidity * (1.0f - (f32)(curr - start) / (end - start))); } else { s->solidity = 0; } @@ -584,16 +585,16 @@ s32 correct_shadow_solidity_for_animations(s32 isLuigi, u8 initialSolidity, stru */ void correct_lava_shadow_height(struct Shadow *s) { if (gCurrLevelNum == LEVEL_BITFS && sSurfaceTypeBelowShadow == SURFACE_BURNING) { - if (s->floorHeight < -3000.0) { - s->floorHeight = -3062.0; + if (s->floorHeight < -3000.0f) { + s->floorHeight = -3062.0f; gShadowAboveWaterOrLava = TRUE; - } else if (s->floorHeight > 3400.0) { - s->floorHeight = 3492.0; + } else if (s->floorHeight > 3400.0f) { + s->floorHeight = 3492.0f; gShadowAboveWaterOrLava = TRUE; } } else if (gCurrLevelNum == LEVEL_LLL && gCurrAreaIndex == 1 && sSurfaceTypeBelowShadow == SURFACE_BURNING) { - s->floorHeight = 5.0; + s->floorHeight = 5.0f; gShadowAboveWaterOrLava = TRUE; } } @@ -821,8 +822,8 @@ Gfx *create_shadow_square(f32 xPos, f32 yPos, f32 zPos, s16 shadowScale, u8 soli distFromShadow = yPos - shadowHeight; switch (shadowType) { case SHADOW_SQUARE_PERMANENT: shadowRadius = shadowScale / 2; break; - case SHADOW_SQUARE_SCALABLE: shadowRadius = scale_shadow_with_distance(shadowScale, distFromShadow) / 2.0; break; - case SHADOW_SQUARE_TOGGLABLE: shadowRadius = disable_shadow_with_distance(shadowScale, distFromShadow) / 2.0; break; + case SHADOW_SQUARE_SCALABLE: shadowRadius = scale_shadow_with_distance(shadowScale, distFromShadow) / 2.0f; break; + case SHADOW_SQUARE_TOGGLABLE: shadowRadius = disable_shadow_with_distance(shadowScale, distFromShadow) / 2.0f; break; default: return NULL; } diff --git a/src/game/skybox.c b/src/game/skybox.c index 370f60fa..3bd89d27 100644 --- a/src/game/skybox.c +++ b/src/game/skybox.c @@ -138,10 +138,9 @@ u8 sSkyboxColors[][3] = { s32 calculate_skybox_scaled_x(s8 player, f32 fov) { f32 yaw = sSkyBoxInfo[player].yaw; - //! double literals are used instead of floats - f32 yawScaled = SCREEN_WIDTH * 360.0 * yaw / (fov * 65536.0); + f32 yawScaled = SCREEN_WIDTH * 360.0f * yaw / (fov * 65536.0f); // Round the scaled yaw. Since yaw is a u16, it doesn't need to check for < 0 - s32 scaledX = yawScaled + 0.5; + s32 scaledX = yawScaled + 0.5f; if (scaledX > SKYBOX_WIDTH) { scaledX -= scaledX / SKYBOX_WIDTH * SKYBOX_WIDTH; @@ -157,10 +156,10 @@ s32 calculate_skybox_scaled_x(s8 player, f32 fov) { */ s32 calculate_skybox_scaled_y(s8 player, UNUSED f32 fov) { // Convert pitch to degrees. Pitch is bounded between -90 (looking down) and 90 (looking up). - f32 pitchInDegrees = (f32) sSkyBoxInfo[player].pitch * 360.0 / 65535.0; + f32 pitchInDegrees = (f32) sSkyBoxInfo[player].pitch * 360.0f / 65535.0f; // Scale by 360 / fov - f32 degreesToScale = 360.0f * pitchInDegrees / 90.0; + f32 degreesToScale = 360.0f * pitchInDegrees / 90.0f; s32 roundedY = round_float(degreesToScale); // Since pitch can be negative, and the tile grid starts 1 octant above the camera's focus, add diff --git a/src/goddard/debug_utils.c b/src/goddard/debug_utils.c index 35d0b9be..2d788e06 100644 --- a/src/goddard/debug_utils.c +++ b/src/goddard/debug_utils.c @@ -521,9 +521,7 @@ void imout(void) { * TODO: figure out type of rng generator? */ f32 gd_rand_float(void) { - u32 temp; u32 i; - f32 val; for (i = 0; i < 4; i++) { if (sPrimarySeed & 0x80000000) { @@ -536,14 +534,12 @@ f32 gd_rand_float(void) { /* Seed Switch */ if ((sPrimarySeed ^= gd_get_ostime()) & 1) { - temp = sPrimarySeed; + u32 temp = sPrimarySeed; sPrimarySeed = sSecondarySeed; sSecondarySeed = temp; } - val = (sPrimarySeed & 0xFFFF) / 65535.0; // 65535.0f - - return val; + return (sPrimarySeed & 0xFFFF) / 65535.0f; } /** diff --git a/src/goddard/draw_objects.c b/src/goddard/draw_objects.c index 9ec05102..9ccc8f45 100644 --- a/src/goddard/draw_objects.c +++ b/src/goddard/draw_objects.c @@ -21,7 +21,6 @@ */ // forward declarations -void func_80179B64(struct ObjGroup *group); void update_shaders(struct ObjShape *shape, struct GdVec3f *offset); void draw_shape_faces(struct ObjShape *shape); void register_light(struct ObjLight *light); @@ -106,46 +105,6 @@ void setup_lights(void) { return; } -/** - * @note Not called - */ -void Unknown801781DC(struct ObjZone *zone) { - struct GdVec3f lightPos; // 3c - struct ObjUnk200000 *unk; - f32 sp34; - f32 sp30; - f32 sp2C; - struct ObjLight *light; - register struct ListNode *link = zone->unk30->firstMember; // s0 (24) - struct GdObj *obj; // 20 - - while (link != NULL) { - obj = link->obj; - light = (struct ObjLight *) gGdLightGroup->firstMember->obj; - lightPos.x = light->position.x; - lightPos.y = light->position.y; - lightPos.z = light->position.z; - unk = (struct ObjUnk200000 *) obj; - sp34 = gd_dot_vec3f(&unk->unk34->normal, &unk->unk30->pos); - sp30 = gd_dot_vec3f(&unk->unk34->normal, &lightPos); - lightPos.x -= unk->unk34->normal.x * (sp30 - sp34); - lightPos.y -= unk->unk34->normal.y * (sp30 - sp34); - lightPos.z -= unk->unk34->normal.z * (sp30 - sp34); - unk->unk30->pos.x = lightPos.x; - unk->unk30->pos.y = lightPos.y; - unk->unk30->pos.z = lightPos.z; - sp2C = ABS((sp30 - sp34)); - if (sp2C > 600.0f) { - sp2C = 600.0f; - } - sp2C = 1.0 - sp2C / 600.0; - unk->unk30->normal.x = sp2C * light->colour.r; - unk->unk30->normal.y = sp2C * light->colour.g; - unk->unk30->normal.z = sp2C * light->colour.b; - link = link->next; - } -} - /* 226C6C -> 226FDC */ void draw_shape(struct ObjShape *shape, s32 flag, f32 c, f32 d, f32 e, // "sweep" indices 0-2 x, y, z f32 f, f32 g, f32 h, // translate shape + store offset (unused) @@ -314,28 +273,6 @@ void create_mtl_gddl_if_empty(struct ObjMaterial *mtl) { } } -/** - * A function for checking if an `ObjFace` has bad vertices. These could be either - * unconverted vertex data, or old vertex structures (like `BetaVtx`) - * @note Not called - */ -void check_face_bad_vtx(struct ObjFace *face) { - s32 i; - struct ObjVertex *vtx; - - for (i = 0; i < face->vtxCount; i++) { - vtx = face->vertices[i]; - // These seem to be checks against bad conversions, or an outdated vertex structure..? - if ((uintptr_t) vtx == 39) { - gd_printf("bad1\n"); - return; - } - if ((uintptr_t) vtx->gbiVerts == 0x3F800000) { - fatal_printf("bad2 %x,%d,%d,%d\n", (u32) (uintptr_t) vtx, vtx->scaleFactor, vtx->id, vtx->header.type); - } - } -} - /** * @brief Convert a numeric index into pointer to a struct GdColour * @@ -351,59 +288,22 @@ void check_face_bad_vtx(struct ObjFace *face) { */ struct GdColour *gd_get_colour(s32 idx) { switch (idx) { - case COLOUR_BLACK: - return &sClrBlack; - break; - case COLOUR_WHITE: - return &sClrWhite; - break; - case COLOUR_RED: - return &sClrRed; - break; - case COLOUR_GREEN: - return &sClrGreen; - break; - case COLOUR_BLUE: - return &sClrBlue; - break; - case COLOUR_GRAY: - return &sClrGrey; - break; - case COLOUR_DARK_GRAY: - return &sClrDarkGrey; - break; - case COLOUR_DARK_BLUE: - return &sClrErrDarkBlue; - break; - case COLOUR_BLACK2: - return &sClrBlack; - break; - case COLOUR_YELLOW: - return &sClrYellow; - break; - case COLOUR_PINK: - return &sClrPink; - break; - case -1: - return &sLightColours; - break; - default: - return NULL; + case COLOUR_BLACK: return &sClrBlack; break; + case COLOUR_WHITE: return &sClrWhite; break; + case COLOUR_RED: return &sClrRed; break; + case COLOUR_GREEN: return &sClrGreen; break; + case COLOUR_BLUE: return &sClrBlue; break; + case COLOUR_GRAY: return &sClrGrey; break; + case COLOUR_DARK_GRAY: return &sClrDarkGrey; break; + case COLOUR_DARK_BLUE: return &sClrErrDarkBlue; break; + case COLOUR_BLACK2: return &sClrBlack; break; + case COLOUR_YELLOW: return &sClrYellow; break; + case COLOUR_PINK: return &sClrPink; break; + case -1: return &sLightColours; break; + default: return NULL; } } -/** - * Uncalled function that would render a triangle - * @note Not called - */ -void Unknown80178ECC(f32 v0X, f32 v0Y, f32 v0Z, f32 v1X, f32 v1Y, f32 v1Z) { - f32 difY = v1Y - v0Y; - f32 difX = v1X - v0X; - f32 difZ = v1Z - v0Z; - - gd_dl_make_triangle(v0X, v0Y, v0Z, v1X, v1Y, v1Z, v0X + difY * 0.1, v0Y + difX * 0.1, v0Z + difZ * 0.1); -} - /** * Rendering function for `ObjFace` structures. It has a fair amount * of stub code @@ -485,20 +385,6 @@ void draw_rect_stroke(s32 color, f32 ulx, f32 uly, f32 lrx, f32 lry) { gd_draw_border_rect(ulx, uly, lrx, lry); } -/** - * Uncalled function that calls other orphan stub functions. - * @note Not called - */ -void Unknown801792F0(struct GdObj *obj) { - char objId[32]; - struct GdVec3f objPos; - - format_object_id(objId, obj); - set_cur_dynobj(obj); - d_get_world_pos(&objPos); - func_801A4438(objPos.x, objPos.y, objPos.z); -} - /** * Draws a label */ @@ -610,7 +496,6 @@ void draw_gadget(struct ObjGadget *gdgt) { /* 22803C -> 22829C */ void draw_camera(struct ObjCamera *cam) { struct GdVec3f sp44; - UNUSED f32 sp40 = 0.0f; sp44.x = 0.0f; sp44.y = 0.0f; @@ -635,35 +520,6 @@ void draw_camera(struct ObjCamera *cam) { gd_dl_lookat(cam, cam->worldPos.x, cam->worldPos.y, cam->worldPos.z, sp44.x, sp44.y, sp44.z, cam->unkA4); } -/** - * Forms uncalled recursive loop with func_80179B64(). - * This function seems to turn off the otherwise unused `OBJ_DRAW_UNK01` flag - * for the GdObj.drawFlags - * @note Not called - */ -void Unknown80179ACC(struct GdObj *obj) { - switch (obj->type) { - case OBJ_TYPE_NETS: - if (((struct ObjNet *) obj)->unk1C8 != NULL) { - func_80179B64(((struct ObjNet *) obj)->unk1C8); - } - break; - default: - break; - } - obj->drawFlags &= ~OBJ_DRAW_UNK01; -} - -/** - * Forms uncalled recursive loop with Unknown80179ACC() - * @note Not called - */ -void func_80179B64(struct ObjGroup *group) { - apply_to_obj_types_in_group(OBJ_TYPE_LABELS | OBJ_TYPE_GADGETS | OBJ_TYPE_CAMERAS | OBJ_TYPE_NETS - | OBJ_TYPE_JOINTS | OBJ_TYPE_BONES, - (applyproc_t) Unknown80179ACC, group); -} - /* 22836C -> 228498 */ void world_pos_to_screen_coords(struct GdVec3f *pos, struct ObjCamera *cam, struct ObjView *view) { gd_rotate_and_translate_vec3f(pos, &cam->unkE8); @@ -671,8 +527,8 @@ void world_pos_to_screen_coords(struct GdVec3f *pos, struct ObjCamera *cam, stru return; } - pos->x *= 256.0 / -pos->z; - pos->y *= 256.0 / pos->z; + pos->x *= 256.0f / -pos->z; + pos->y *= 256.0f / pos->z; pos->x += view->lowerRight.x / 2.0f; pos->y += view->lowerRight.y / 2.0f; } @@ -744,8 +600,8 @@ void drawscene(enum SceneType process, struct ObjGroup *interactables, struct Ob sUpdateViewState.view->clipping.x, sUpdateViewState.view->clipping.y); } else { gd_create_ortho_matrix( - -sUpdateViewState.view->lowerRight.x / 2.0, sUpdateViewState.view->lowerRight.x / 2.0, - -sUpdateViewState.view->lowerRight.y / 2.0, sUpdateViewState.view->lowerRight.y / 2.0, + -sUpdateViewState.view->lowerRight.x / 2.0f, sUpdateViewState.view->lowerRight.x / 2.0f, + -sUpdateViewState.view->lowerRight.y / 2.0f, sUpdateViewState.view->lowerRight.y / 2.0f, sUpdateViewState.view->clipping.x, sUpdateViewState.view->clipping.y); } @@ -832,7 +688,7 @@ void draw_particle(struct GdObj *obj) { if (ptc->timeout > 0) { white = sColourPalette[0]; black = sWhiteBlack[1]; - brightness = ptc->timeout / 10.0; + brightness = ptc->timeout / 10.0f; sLightColours.r = (white->r - black->r) * brightness + black->r; sLightColours.g = (white->g - black->g) * brightness + black->g; sLightColours.b = (white->b - black->b) * brightness + black->b; @@ -967,11 +823,11 @@ void Proc8017A980(struct ObjLight *light) { sp24 = light->unk30; if (light->flags & LIGHT_UNK02) { sp20 = -gd_dot_vec3f(&sLightPositionCache[light->id], &light->unk80); - sp1C = 1.0 - light->unk38 / 90.0; + sp1C = 1.0f - light->unk38 / 90.0f; if (sp20 > sp1C) { - sp20 = (sp20 - sp1C) * (1.0 / (1.0 - sp1C)); - if (sp20 > 1.0) { - sp20 = 1.0; + sp20 = (sp20 - sp1C) * (1.0f / (1.0f - sp1C)); + if (sp20 > 1.0f) { + sp20 = 1.0f; } else if (sp20 < 0.0f) { sp20 = 0.0f; } @@ -1236,9 +1092,8 @@ void map_vertices(struct ObjGroup *facegrp, struct ObjGroup *vtxgrp) { * @note Not Called */ void unpick_obj(struct GdObj *obj) { - struct GdObj *why = obj; - if (why->drawFlags & OBJ_IS_GRABBALE) { - why->drawFlags &= ~(OBJ_PICKED | OBJ_HIGHLIGHTED); + if (obj->drawFlags & OBJ_IS_GRABBALE) { + obj->drawFlags &= ~(OBJ_PICKED | OBJ_HIGHLIGHTED); } } diff --git a/src/goddard/dynlist_proc.c b/src/goddard/dynlist_proc.c index 08bb1f44..4ccfa6e9 100644 --- a/src/goddard/dynlist_proc.c +++ b/src/goddard/dynlist_proc.c @@ -57,14 +57,13 @@ struct DynObjInfo { #define DynVecX(dyn) ((dyn)->vec.x) #define DynVecY(dyn) ((dyn)->vec.y) #define DynVecZ(dyn) ((dyn)->vec.z) -///@} // data -static struct DynObjInfo *sGdDynObjList = NULL; // @ 801A8250; info for all loaded/made dynobjs -static struct GdObj *sDynListCurObj = NULL; // @ 801A8254 -static struct GdBoundingBox sNullBoundingBox = { // @ 801A8258 - 0.0, 0.0, 0.0, - 0.0, 0.0, 0.0 +static struct DynObjInfo *sGdDynObjList = NULL; // info for all loaded/made dynobjs +static struct GdObj *sDynListCurObj = NULL; +static struct GdBoundingBox sNullBoundingBox = { + 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f }; static s32 sUseIntegerNames = FALSE; // if TRUE, then all DynNames are specified as integers @@ -632,7 +631,7 @@ struct GdObj *d_makeobj(enum DObjTypes type, DynObjName name) { dobj = &gd_make_vertex(0.0f, 0.0f, 0.0f)->header; break; case D_FACE: - dobj = &make_face_with_colour(1.0, 1.0, 1.0)->header; + dobj = &make_face_with_colour(1.0f, 1.0f, 1.0f)->header; break; case D_PLANE: dobj = &make_plane(FALSE, NULL)->header; @@ -1001,10 +1000,7 @@ void chk_shapegen(struct ObjShape *shape) { oldObjHead = gGdObjectList; for (i = 0; i < facedata->count; i++) { - //! @bug Call to `make_face_with_colour()` compiles incorrectly - //! due to Goddard only declaring the functions, - //! not prototyping the functions - face = make_face_with_colour(1.0, 1.0, 1.0); + face = make_face_with_colour(1.0f, 1.0f, 1.0f); face->mtlId = (s32) facedata->data[i][0]; add_3_vtx_to_face(face, vtxbuf[facedata->data[i][1]], vtxbuf[facedata->data[i][2]], vtxbuf[facedata->data[i][3]]); @@ -1629,7 +1625,6 @@ void d_get_init_rot(struct GdVec3f *dst) { */ void d_set_rel_pos(f32 x, f32 y, f32 z) { struct GdObj *dynobj = sDynListCurObj; // sp34 - UNUSED struct GdVec3f unusedVec; // sp28 if (sDynListCurObj == NULL) { fatal_printf("proc_dynlist(): No current object"); @@ -1642,10 +1637,6 @@ void d_set_rel_pos(f32 x, f32 y, f32 z) { ((struct ObjJoint *) dynobj)->unk3C.z = z; break; case OBJ_TYPE_CAMERAS: - unusedVec.x = x; - unusedVec.y = y; - unusedVec.z = z; - ((struct ObjCamera *) dynobj)->unk40.x = x; ((struct ObjCamera *) dynobj)->unk40.y = y; ((struct ObjCamera *) dynobj)->unk40.z = z; @@ -1654,9 +1645,9 @@ void d_set_rel_pos(f32 x, f32 y, f32 z) { ((struct ObjCamera *) dynobj)->zoomPositions[0].y = y; ((struct ObjCamera *) dynobj)->zoomPositions[0].z = z; - ((struct ObjCamera *) dynobj)->zoomPositions[1].x = x * 1.5; //? 1.5f - ((struct ObjCamera *) dynobj)->zoomPositions[1].y = y * 1.5; //? 1.5f - ((struct ObjCamera *) dynobj)->zoomPositions[1].z = z * 1.5; //? 1.5f + ((struct ObjCamera *) dynobj)->zoomPositions[1].x = x * 1.5f; + ((struct ObjCamera *) dynobj)->zoomPositions[1].y = y * 1.5f; + ((struct ObjCamera *) dynobj)->zoomPositions[1].z = z * 1.5f; ((struct ObjCamera *) dynobj)->zoomPositions[2].x = x * 2.0f; ((struct ObjCamera *) dynobj)->zoomPositions[2].y = y * 2.0f; @@ -2126,9 +2117,9 @@ void d_get_world_pos(struct GdVec3f *dst) { dst->y += ((struct ObjPlane *) sDynListCurObj)->boundingBox.maxY; dst->z += ((struct ObjPlane *) sDynListCurObj)->boundingBox.maxZ; - dst->x *= 0.5; //? 0.5f - dst->y *= 0.5; //? 0.5f - dst->z *= 0.5; //? 0.5f + dst->x *= 0.5f; + dst->y *= 0.5f; + dst->z *= 0.5f; break; case OBJ_TYPE_ZONES: dst->x = ((struct ObjZone *) sDynListCurObj)->boundingBox.minX; @@ -2139,9 +2130,9 @@ void d_get_world_pos(struct GdVec3f *dst) { dst->y += ((struct ObjZone *) sDynListCurObj)->boundingBox.maxY; dst->z += ((struct ObjZone *) sDynListCurObj)->boundingBox.maxZ; - dst->x *= 0.5; //? 0.5f - dst->y *= 0.5; //? 0.5f - dst->z *= 0.5; //? 0.5f + dst->x *= 0.5f; + dst->y *= 0.5f; + dst->z *= 0.5f; break; case OBJ_TYPE_LIGHTS: dst->x = ((struct ObjLight *) sDynListCurObj)->position.x; @@ -3098,11 +3089,9 @@ void d_set_skin_weight(s32 vtxId, f32 percentWeight) { switch (sDynListCurObj->type) { case OBJ_TYPE_JOINTS: - set_skin_weight((struct ObjJoint *) sDynListCurObj, vtxId, NULL, - percentWeight / 100.0); + set_skin_weight((struct ObjJoint *) sDynListCurObj, vtxId, NULL, percentWeight / 100.0f); break; default: - fatal_printf("%s: Object '%s'(%x) does not support this function.", "dSetSkinWeight()", - sDynListCurInfo->name, sDynListCurObj->type); + fatal_printf("%s: Object '%s'(%x) does not support this function.", "dSetSkinWeight()", sDynListCurInfo->name, sDynListCurObj->type); } } diff --git a/src/goddard/gd_math.c b/src/goddard/gd_math.c index 4a31face..c030e584 100644 --- a/src/goddard/gd_math.c +++ b/src/goddard/gd_math.c @@ -55,7 +55,7 @@ void gd_mat4f_lookat(Mat4f *mtx, f32 xFrom, f32 yFrom, f32 zFrom, f32 xTo, f32 y d.x = norm.z; } - invLength = -1.0 / gd_sqrt_f(SQ(d.z) + SQ(d.y) + SQ(d.x)); + invLength = -1.0f / gd_sqrt_f(SQ(d.z) + SQ(d.y) + SQ(d.x)); d.z *= invLength; d.y *= invLength; d.x *= invLength; @@ -64,7 +64,7 @@ void gd_mat4f_lookat(Mat4f *mtx, f32 xFrom, f32 yFrom, f32 zFrom, f32 xTo, f32 y colX.y = xColY * d.z - zColY * d.x; colX.x = zColY * d.y - yColY * d.z; - invLength = 1.0 / gd_sqrt_f(SQ(colX.z) + SQ(colX.y) + SQ(colX.x)); + invLength = 1.0f / gd_sqrt_f(SQ(colX.z) + SQ(colX.y) + SQ(colX.x)); colX.z *= invLength; colX.y *= invLength; @@ -74,7 +74,7 @@ void gd_mat4f_lookat(Mat4f *mtx, f32 xFrom, f32 yFrom, f32 zFrom, f32 xTo, f32 y yColY = d.x * colX.z - d.z * colX.x; xColY = d.z * colX.y - d.y * colX.z; - invLength = 1.0 / gd_sqrt_f(SQ(zColY) + SQ(yColY) + SQ(xColY)); + invLength = 1.0f / gd_sqrt_f(SQ(zColY) + SQ(yColY) + SQ(xColY)); zColY *= invLength; yColY *= invLength; @@ -676,8 +676,8 @@ void UNUSED gd_create_quat_rot_mat(f32 quat[4], UNUSED s32 unused, Mat4f *mtx) { k = 1; } - twoIJ = 2.0 * quat[i] * quat[j]; - two0K = 2.0 * quat[k] * quat[0]; + twoIJ = 2.0f * quat[i] * quat[j]; + two0K = 2.0f * quat[k] * quat[0]; (*mtx)[j][i] = twoIJ - two0K; (*mtx)[i][j] = twoIJ + two0K; @@ -712,7 +712,7 @@ void gd_create_rot_matrix(Mat4f *mtx, struct GdVec3f *vec, f32 s, f32 c) { rev.y = vec->y; rev.x = vec->z; - oneMinusCos = 1.0 - c; + oneMinusCos = 1.0f - c; (*mtx)[0][0] = oneMinusCos * rev.z * rev.z + c; (*mtx)[0][1] = oneMinusCos * rev.z * rev.y + s * rev.x; diff --git a/src/goddard/joints.c b/src/goddard/joints.c index 41885e3b..ededce37 100644 --- a/src/goddard/joints.c +++ b/src/goddard/joints.c @@ -60,9 +60,9 @@ void grabbable_joint_update_func(struct ObjJoint *self) { offset.z = self->mat128[3][2] - self->initPos.z; if (self->header.drawFlags & OBJ_PICKED) { - self->velocity.x = offset.x * -0.25; - self->velocity.y = offset.y * -0.25; - self->velocity.z = offset.z * -0.25; + self->velocity.x = offset.x * -0.25f; + self->velocity.y = offset.y * -0.25f; + self->velocity.z = offset.z * -0.25f; self->flags |= 0x2000; ; // needed to match @@ -70,21 +70,19 @@ void grabbable_joint_update_func(struct ObjJoint *self) { if (gGdCtrl.trgR == FALSE) // R trigger is released { // Set velocity so that the joint approaches its initial position - self->velocity.x -= offset.x * 0.5; //? 0.5f - self->velocity.y -= offset.y * 0.5; //? 0.5f - self->velocity.z -= offset.z * 0.5; //? 0.5f + self->velocity.x -= offset.x * 0.5f; + self->velocity.y -= offset.y * 0.5f; + self->velocity.z -= offset.z * 0.5f; // Decay the velocity - self->velocity.x *= 0.8; //? 0.8f - self->velocity.y *= 0.8; //? 0.8f - self->velocity.z *= 0.8; //? 0.8f + self->velocity.x *= 0.8f; + self->velocity.y *= 0.8f; + self->velocity.z *= 0.8f; // If the joint's velocity has decayed enough and it is very close // to its original position, stop its movement altogether - if (ABS(self->velocity.x) + ABS(self->velocity.y) + ABS(self->velocity.z) < 1.0) - { - if (ABS(offset.x) + ABS(offset.y) + ABS(offset.z) < 1.0) - { + if (ABS(self->velocity.x) + ABS(self->velocity.y) + ABS(self->velocity.z) < 1.0f) { + if (ABS(offset.x) + ABS(offset.y) + ABS(offset.z) < 1.0f) { self->velocity.x = self->velocity.y = self->velocity.z = 0.0f; self->mat128[3][0] -= offset.x; self->mat128[3][1] -= offset.y; @@ -110,8 +108,8 @@ void grabbable_joint_update_func(struct ObjJoint *self) { self->mat128[3][2] += self->velocity.z; if (self->header.drawFlags & OBJ_PICKED) { - gGdCtrl.csrX -= (gGdCtrl.csrX - gGdCtrl.dragStartX) * 0.2; - gGdCtrl.csrY -= (gGdCtrl.csrY - gGdCtrl.dragStartY) * 0.2; + gGdCtrl.csrX -= (gGdCtrl.csrX - gGdCtrl.dragStartX) * 0.2f; + gGdCtrl.csrY -= (gGdCtrl.csrY - gGdCtrl.dragStartY) * 0.2f; } // update position of attached objects @@ -157,9 +155,9 @@ void eye_joint_update_func(struct ObjJoint *self) { sp50.y = -(gGdCtrl.csrY - sp44.y); sp50.z = 0.0f; - sp50.x *= 2.0; //?2.0f - sp50.y *= 2.0; //?2.0f - sp50.z *= 2.0; //?2.0f + sp50.x *= 2.0f; + sp50.y *= 2.0f; + sp50.z *= 2.0f; if (gd_vec3f_magnitude(&sp50) > 30.0f) { gd_normalize_vec3f(&sp50); sp50.x *= 30.0f; @@ -175,29 +173,6 @@ void eye_joint_update_func(struct ObjJoint *self) { } } -/* 23D62C -> 23D748; not called */ -void func_8018EE5C(struct ObjJoint *j1, struct ObjJoint *j2, struct ObjJoint *j3) { - struct GdVec3f vec; - struct ObjJoint *curj; - - if (j3 == NULL) { - return; - } - - vec.z = j3->worldPos.x; - vec.y = j3->worldPos.y; - vec.x = j3->worldPos.z; - - curj = j1; - while (curj != NULL) { - set_joint_vecs(curj, curj->worldPos.x + vec.z, curj->worldPos.y + vec.y, curj->worldPos.z + vec.x); - if (curj == j2) { - break; - } - curj = curj->prevjoint; - } -} - /* 23D748 -> 23D818; orig name: func_8018EF78 */ void set_joint_vecs(struct ObjJoint *j, f32 x, f32 y, f32 z) { j->worldPos.x = x; @@ -300,9 +275,9 @@ void func_8018F328(struct ObjBone *b) { joint2 = (struct ObjJoint *) link->obj; // bone position is average of two connecting joints - b->worldPos.x = (joint1->worldPos.x + joint2->worldPos.x) / 2.0; //?2.0f - b->worldPos.y = (joint1->worldPos.y + joint2->worldPos.y) / 2.0; //?2.0f - b->worldPos.z = (joint1->worldPos.z + joint2->worldPos.z) / 2.0; //?2.0f + b->worldPos.x = (joint1->worldPos.x + joint2->worldPos.x) / 2.0f; + b->worldPos.y = (joint1->worldPos.y + joint2->worldPos.y) / 2.0f; + b->worldPos.z = (joint1->worldPos.z + joint2->worldPos.z) / 2.0f; b->unk58.x = joint2->worldPos.x - joint1->worldPos.x; b->unk58.y = joint2->worldPos.y - joint1->worldPos.y; @@ -342,9 +317,9 @@ void func_8018F520(struct ObjBone *b) { joint2 = (struct ObjJoint *) link->obj; // bone position is average of two connecting joints - b->worldPos.x = (joint1->worldPos.x + joint2->worldPos.x) / 2.0; //? 2.0f; - b->worldPos.y = (joint1->worldPos.y + joint2->worldPos.y) / 2.0; //? 2.0f; - b->worldPos.z = (joint1->worldPos.z + joint2->worldPos.z) / 2.0; //? 2.0f; + b->worldPos.x = (joint1->worldPos.x + joint2->worldPos.x) / 2.0f; + b->worldPos.y = (joint1->worldPos.y + joint2->worldPos.y) / 2.0f; + b->worldPos.z = (joint1->worldPos.z + joint2->worldPos.z) / 2.0f; sp90.x = b->unk58.x; sp90.y = b->unk58.y; @@ -361,7 +336,7 @@ void func_8018F520(struct ObjBone *b) { b->unk64.y = sp90.y; b->unk64.z = sp90.z; - sp68 = 5.4 / b->unkF8; //? 5.4f + sp68 = 5.4f / b->unkF8; sp6C.x *= sp68; sp6C.y *= sp68; sp6C.z *= sp68; @@ -400,9 +375,9 @@ void func_8018F89C(struct ObjBone *b) { link = link->next; spA8 = (struct ObjJoint *) link->obj; - b->worldPos.x = (spAC->worldPos.x + spA8->worldPos.x) / 2.0; //? 2.0f; - b->worldPos.y = (spAC->worldPos.y + spA8->worldPos.y) / 2.0; //? 2.0f; - b->worldPos.z = (spAC->worldPos.z + spA8->worldPos.z) / 2.0; //? 2.0f; + b->worldPos.x = (spAC->worldPos.x + spA8->worldPos.x) / 2.0f; + b->worldPos.y = (spAC->worldPos.y + spA8->worldPos.y) / 2.0f; + b->worldPos.z = (spAC->worldPos.z + spA8->worldPos.z) / 2.0f; gd_mult_mat4f(&b->matB0, &gGdSkinNet->mat128, &mtx); gd_copy_mat4f(&mtx, &b->mat70); @@ -515,15 +490,6 @@ struct ObjBone *make_bone(s32 a0, struct ObjJoint *j1, struct ObjJoint *j2, UNUS return b; } -/* 23E6F8 -> 23E758; not called */ -void func_8018FF28(struct ObjJoint *a0, struct ObjJoint *a1) { - if (a1->flags & 0x1) { - a0->unk84.x -= a1->unk84.x; - a0->unk84.y -= a1->unk84.y; - a0->unk84.z -= a1->unk84.z; - } -} - /* 23E7B8 -> 23E938 */ s32 func_8018FFE8(struct ObjBone **a0, struct ObjJoint **a1, struct ObjJoint *a2, struct ObjJoint *a3) { struct ObjBone *b; // 1C @@ -753,31 +719,6 @@ void func_801909B4(void) { } } -/* 23F1F0 -> 23F324; not called */ -void func_80190A20(void) { - struct ObjJoint *j; // sp3c - struct GdVec3f vec; // sp2C - struct ObjGroup *grp; - struct ListNode *link; - struct ObjBone *b; - - j = gGdJointList; - while (j != NULL) { - if (j->flags & 0x40) { - grp = j->unk1C4; - link = grp->firstMember; - b = (struct ObjBone *) link->obj; - - vec.z = b->unk40.x * 100.0f; - vec.y = b->unk40.y * 100.0f; - vec.x = b->unk40.z * 100.0f; - func_80190574(1, NULL, j, vec.z, vec.y, vec.x); - } - - j = j->nextjoint; - } -} - /* 23F324 -> 23F638 */ void func_80190B54(struct ObjJoint *a0, struct ObjJoint *a1, struct GdVec3f *a2) { // b0 struct GdVec3f spA4; @@ -807,7 +748,7 @@ void func_80190B54(struct ObjJoint *a0, struct ObjJoint *a1, struct GdVec3f *a2) D_801BAAE0.y = spA4.y - (sp8C.y * sp7C); D_801BAAE0.z = spA4.z - (sp8C.z * sp7C); - sp78 = 5.4 / sp7C; //? 5.4f + sp78 = 5.4f / sp7C; D_801BAAD0.x *= sp78; D_801BAAD0.y *= sp78; D_801BAAD0.z *= sp78; @@ -837,29 +778,6 @@ void func_80190B54(struct ObjJoint *a0, struct ObjJoint *a1, struct GdVec3f *a2) D_801BAAD0.z = D_801BAAE0.z; } -/* 23F638 -> 23F70C; not called */ -void func_80190E68(struct GdObj *obj, f32 x, f32 y, f32 z) { - struct ObjJoint *sp44; - struct GdObj *sp40; - struct GdVec3f vec; - - vec.x = x; - vec.y = y; - vec.z = z; - - sp44 = NULL; - sp40 = obj; - while (sp40 != NULL) { - if (sp40->type != OBJ_TYPE_JOINTS) { - break; - } - - func_80190B54(((struct ObjJoint *) sp40), sp44, &vec); - sp44 = ((struct ObjJoint *) sp40); - sp40 = ((struct ObjJoint *) sp40)->attachedToObj; - } -} - /* 23F70C -> 23F978 */ f32 func_80190F3C(struct ObjJoint *a0, f32 a1, f32 a2, f32 a3) { struct ObjJoint *curj; @@ -952,24 +870,6 @@ void func_801913F0(struct ObjJoint *j) { gd_copy_mat4f(&gGdSkinNet->mat128, &j->matE8); } -/* 23FCC8 -> 23FCDC */ -void stub_joints_2(UNUSED struct ObjJoint *j) { -} - -/* 23FCDC -> 23FDD4; not called */ -void func_8019150C(Mat4f *a0, struct GdVec3f *a1) { - struct GdVec3f sp1C; - - sp1C.x = (*a0)[3][0] / 10.0; //? 10.0f - sp1C.y = (*a0)[3][1] / 10.0; //? 10.0f - sp1C.z = (*a0)[3][2] / 10.0; //? 10.0f - - a1->x += sp1C.x; - a1->y += sp1C.y; - a1->z += sp1C.z; - gd_mat4f_mult_vec3f(a1, a0); -} - /* 23FDD4 -> 23FFF4 */ void reset_joint(struct ObjJoint *j) { j->worldPos.x = j->initPos.x; @@ -1012,69 +912,6 @@ void func_80191824(struct ObjJoint *j) { } } -/* 2400C4 -> 2401EC; not called */ -void func_801918F4(struct ObjJoint *j) { - f32 sp4; - - j->velocity.x = j->unk3C.x; - j->velocity.y = j->unk3C.y; - j->velocity.z = j->unk3C.z; - - j->velocity.x -= j->unk30.x; - j->velocity.y -= j->unk30.y; - j->velocity.z -= j->unk30.z; - - j->unk30.x = j->unk3C.x; - j->unk30.y = j->unk3C.y; - j->unk30.z = j->unk3C.z; - - sp4 = -4.0f; - - if (!(j->flags & 0x41)) { - j->velocity.y += sp4 * 0.2; //? 0.2f - - j->unk3C.x += j->velocity.x; - j->unk3C.y += j->velocity.y; - j->unk3C.z += j->velocity.z; - } -} - -/* 2401EC -> 2403C8; not called */ -void func_80191A1C(struct ObjBone *a0) { - f32 sp3C; - f32 sp38 = 0.0f; - struct GdObj *argjoint; - struct GdObj *tempjoint; - struct GdVec3f sp24; - struct GdVec3f sp18; - - if (gGdTempBone == NULL) { - gGdTempBone = a0; - } - sp3C = gd_dot_vec3f(&gGdTempBone->unk40, &a0->unk40); - a0->unk118 = sp3C; - - if ((sp3C -= sp38) < 0.0f) { - tempjoint = gGdTempBone->unk10C->firstMember->obj; - argjoint = a0->unk10C->firstMember->next->obj; - set_cur_dynobj(argjoint); - d_get_rel_pos(&sp24); - set_cur_dynobj(tempjoint); - d_get_rel_pos(&sp18); - - sp24.x -= sp18.x; - sp24.y -= sp18.y; - sp24.z -= sp18.z; - gd_normalize_vec3f(&sp24); - - sp3C = -sp3C * 50.0; //? 50.0f - if (!(((struct ObjJoint *) argjoint)->flags & 0x1)) { - func_80190F3C((struct ObjJoint *) argjoint, sp24.x * sp3C, sp24.y * sp3C, sp24.z * sp3C); - } - } - gGdTempBone = a0; -} - /* 2403C8 -> 240530 */ void func_80191BF8(struct ObjJoint *j) { f32 sp1C; @@ -1086,8 +923,8 @@ void func_80191BF8(struct ObjJoint *j) { if ((sp1C = j->unk3C.y - (D_801A8058 + 30.0f)) < 0.0f && j->velocity.y < 0.0f) { sp1C += j->velocity.y; - sp1C *= 0.8; //? 0.8f - func_80190F3C(j, -j->velocity.x * 0.7, -sp1C, -j->velocity.z * 0.7); + sp1C *= 0.8f; + func_80190F3C(j, -j->velocity.x * 0.7f, -sp1C, -j->velocity.z * 0.7f); } func_80190F3C(j, 0.0f, 0.0f, 0.0f); @@ -1099,9 +936,9 @@ void func_80191D60(struct ObjJoint *j) { j->velocity.y += j->unk3C.y - j->worldPos.y; j->velocity.z += j->unk3C.z - j->worldPos.z; - j->velocity.x *= 0.9; //? 0.9f - j->velocity.y *= 0.9; //? 0.9f - j->velocity.z *= 0.9; //? 0.9f + j->velocity.x *= 0.9f; + j->velocity.y *= 0.9f; + j->velocity.z *= 0.9f; j->worldPos.x += j->velocity.x; j->worldPos.y += j->velocity.y; diff --git a/src/goddard/joints.h b/src/goddard/joints.h index a78c7a7a..bec68ab3 100644 --- a/src/goddard/joints.h +++ b/src/goddard/joints.h @@ -22,7 +22,6 @@ void func_801911A8(struct ObjJoint *j); void func_80191220(struct ObjJoint *j); void func_801913C0(struct ObjJoint *j); void func_801913F0(struct ObjJoint *j); -void stub_joints_2(struct ObjJoint *j); void reset_joint(struct ObjJoint *j); void func_80191824(struct ObjJoint *j); void func_80191E88(struct ObjGroup *grp); diff --git a/src/goddard/objects.c b/src/goddard/objects.c index aecb9936..6370b49b 100644 --- a/src/goddard/objects.c +++ b/src/goddard/objects.c @@ -971,14 +971,14 @@ void func_8017E584(struct ObjNet *a0, struct GdVec3f *a1, struct GdVec3f *a2) { } gd_cross_vec3f(&sp70, a1, &sp94); - sp2C = (f32) gd_sqrt_d((sp94.x * sp94.x) + (sp94.z * sp94.z)); + sp2C = (f32) gd_sqrt_d(SQ(sp94.x) + SQ(sp94.z)); - if (sp2C > 1000.0) { //? 1000.0f + if (sp2C > 1000.0f) { sp2C = 1000.0f; } - sp2C /= 1000.0; //? 1000.0f - sp2C = 1.0 - sp2C; //? 1.0f - sp2C + sp2C /= 1000.0f; + sp2C = 1.0f - sp2C; sp88.x = a2->x * sp2C; sp88.y = a2->y * sp2C; @@ -1009,9 +1009,9 @@ void func_8017E838(struct ObjNet *a0, struct GdVec3f *a1, struct GdVec3f *a2) { sp64.y -= sp18.y; sp64.z -= sp18.z; - sp64.x *= 0.01; //? 0.01f; - sp64.y *= 0.01; //? 0.01f; - sp64.z *= 0.01; //? 0.01f; + sp64.x *= 0.01f; + sp64.y *= 0.01f; + sp64.z *= 0.01f; gd_cross_vec3f(a2, &sp64, &sp70); gd_clamp_vec3f(&sp70, 5.0f); @@ -1617,8 +1617,8 @@ void move_cameras_in_grp(struct ObjGroup *group) { /* @ 22F7DC for 0x36C*/ void func_8018100C(struct ObjLight *light) { if (light->unk40 == 3) { - if (light->unk30 > 0.0) { //? 0.0f - light->unk30 -= 0.2; //? 0.2f + if (light->unk30 > 0.0f) { + light->unk30 -= 0.2f; } if (light->unk30 < 0.0f) { diff --git a/src/goddard/old_menu.c b/src/goddard/old_menu.c index 9b6b25af..efdc22d8 100644 --- a/src/goddard/old_menu.c +++ b/src/goddard/old_menu.c @@ -21,9 +21,6 @@ */ // bss -UNUSED static char sDefSettingsMenuStr[0x100]; -static struct GdVec3f sStaticVec; -UNUSED static struct GdVec3f unusedVec; static struct ObjGadget *sCurGadgetPtr; // forward declarations @@ -45,19 +42,6 @@ void get_objvalue(union ObjVarVal *dst, enum ValPtrType type, void *base, size_t } } -/* 239F78 -> 23A00C */ -void Unknown8018B7A8(void *a0) { - struct GdVec3f sp1C; - - set_cur_dynobj(a0); - d_get_init_pos(&sp1C); - - sp1C.x += sStaticVec.x; - sp1C.y += sStaticVec.y; - sp1C.z += sStaticVec.z; - d_set_world_pos(sp1C.x, sp1C.y, sp1C.z); -} - /* 23A190 -> 23A250 */ struct ObjLabel *make_label(struct ObjValPtr *ptr, char *str, s32 a2, f32 x, f32 y, f32 z) { struct ObjLabel *label = (struct ObjLabel *) make_object(OBJ_TYPE_LABELS); @@ -169,7 +153,7 @@ void reset_gadget(struct ObjGadget *gdgt) { fatal_printf("gadget has zero range (%f -> %f)\n", gdgt->rangeMin, gdgt->rangeMax); } - range = (f32)(1.0 / (gdgt->rangeMax - gdgt->rangeMin)); + range = (1.0f / (gdgt->rangeMax - gdgt->rangeMin)); if (gdgt->valueGrp != NULL) { vp = (struct ObjValPtr *) gdgt->valueGrp->firstMember->obj; diff --git a/src/goddard/particles.c b/src/goddard/particles.c index 782f96d8..d9daac30 100644 --- a/src/goddard/particles.c +++ b/src/goddard/particles.c @@ -46,10 +46,9 @@ void Unknown80181D14(struct ObjFace *face); void func_80181EB0(struct Connection *cxn); void func_80182088(struct Connection *cxn); void move_particle(struct ObjParticle *ptc); -int func_80182778(struct ObjParticle *ptc); +int func_80182778(struct ObjParticle *ptc); void func_80182A08(struct ObjParticle *ptc, struct GdVec3f *b); void func_801838D0(struct ObjParticle *ptc); -void Unknown801835C8(struct ObjParticle *ptc); static void connect_vertices(struct ObjVertex *vtx1, struct ObjVertex *vtx2) { struct Connection *newConn; @@ -78,10 +77,8 @@ static void connect_vertices(struct ObjVertex *vtx1, struct ObjVertex *vtx2) { /* 2304E4 -> 230680 */ void Unknown80181D14(struct ObjFace *face) { - s32 i; - s32 j; - struct ObjVertex *vtx1; - struct ObjVertex *vtx2; + s32 i, j; + struct ObjVertex *vtx1, *vtx2; for (i = 0; i < face->vtxCount - 1; i++) { vtx1 = face->vertices[i]; @@ -109,7 +106,7 @@ void func_80181EB0(struct Connection *cxn) { sp34.x = 0.0f; sp34.y = sp4->pos.y - sp0->pos.y; sp34.z = 0.0f; - sp34.y *= 0.01; + sp34.y *= 0.01f; sp4->unk38.x -= sp34.x; sp4->unk38.y -= sp34.y; sp4->unk38.z -= sp34.z; @@ -150,9 +147,9 @@ void func_80182088(struct Connection *cxn) { vec.x /= mag; vec.y /= mag; vec.z /= mag; - vec.x *= sp24 * 0.1; - vec.y *= sp24 * 0.1; - vec.z *= sp24 * 0.1; + vec.x *= sp24 * 0.1f; + vec.y *= sp24 * 0.1f; + vec.z *= sp24 * 0.1f; sp1C->unk38.x -= vec.x; sp1C->unk38.y -= vec.y; sp1C->unk38.z -= vec.z; @@ -294,10 +291,10 @@ void func_80182A08(struct ObjParticle *ptc, struct GdVec3f *b) { sp20->pos.z = ptc->pos.z; sp20->timeout = 12.0f - gd_rand_float() * 5.0f; do { - sp20->unk38.x = gd_rand_float() * 50.0 - 25.0; - sp20->unk38.y = gd_rand_float() * 50.0 - 25.0; - sp20->unk38.z = gd_rand_float() * 50.0 - 25.0; - } while (gd_vec3f_magnitude(&sp20->unk38) > 30.0); + sp20->unk38.x = gd_rand_float() * 50.0f - 25.0f; + sp20->unk38.y = gd_rand_float() * 50.0f - 25.0f; + sp20->unk38.z = gd_rand_float() * 50.0f - 25.0f; + } while (gd_vec3f_magnitude(&sp20->unk38) > 30.0f); sp20->unk38.x += b->x; sp20->unk38.y += b->y; sp20->unk38.z += b->z; @@ -392,9 +389,9 @@ void move_particle(struct ObjParticle *ptc) { default: break; } - ptc->unk38.x *= 0.9; - ptc->unk38.y *= 0.9; - ptc->unk38.z *= 0.9; + ptc->unk38.x *= 0.9f; + ptc->unk38.y *= 0.9f; + ptc->unk38.z *= 0.9f; if (ptc->unk60 == 3) { switch (ptc->unk64) { case 1: @@ -416,10 +413,10 @@ void move_particle(struct ObjParticle *ptc) { sp2C->pos.z = ptc->pos.z; sp2C->timeout = 20; do { - sp2C->unk38.x = gd_rand_float() * 64.0 - 32.0; - sp2C->unk38.y = gd_rand_float() * 64.0 - 32.0; - sp2C->unk38.z = gd_rand_float() * 64.0 - 32.0; - } while (gd_vec3f_magnitude(&sp2C->unk38) > 32.0); + sp2C->unk38.x = gd_rand_float() * 64.0f - 32.0f; + sp2C->unk38.y = gd_rand_float() * 64.0f - 32.0f; + sp2C->unk38.z = gd_rand_float() * 64.0f - 32.0f; + } while (gd_vec3f_magnitude(&sp2C->unk38) > 32.0f); sp2C->unk30 = gd_rand_float() * 180.0f; sp2C->header.drawFlags &= ~OBJ_INVISIBLE; sp2C->flags |= 8; @@ -455,36 +452,6 @@ void move_particles_in_grp(struct ObjGroup *group) { stop_timer("particles"); } -#define ABS(x) ((x) < 0.0f ? -(x) : (x)) -/* 231D98 -> 232040 */ -void Unknown801835C8(struct ObjParticle *ptc) { - struct GdVec3f sp54; - f32 sp50; - register struct ListNode *link; - - gd_printf("p(%d)=", ptc->attachedObjsGrp->memberCount); - link = ptc->attachedObjsGrp->firstMember; - while (link != NULL) { - // FIXME: types - struct ObjParticle *sp48 = (struct ObjParticle *) link->obj; - - sp54.x = sp48->pos.x - ptc->pos.x; - sp54.y = sp48->pos.y - ptc->pos.y; - sp54.z = sp48->pos.z - ptc->pos.z; - sp50 = 150.0f - (ABS(sp54.x) + ABS(sp54.y) + ABS(sp54.z)); - gd_printf(",%f ", sp50); - sp50 *= 0.00000005; - ptc->pos.x += sp50 * sp54.x; - ptc->pos.y += sp50 * sp54.y; - ptc->pos.z += sp50 * sp54.z; - sp48->pos.x -= sp50 * sp54.x; - sp48->pos.y -= sp50 * sp54.y; - sp48->pos.z -= sp50 * sp54.z; - link = link->next; - } - gd_printf("\n"); -} - /* 2320A0 -> 2320D4; pad to 2320E0 */ void func_801838D0(struct ObjParticle *ptc) { D_801B9E3C = ptc; diff --git a/src/goddard/renderer.c b/src/goddard/renderer.c index 84044e6c..e89ebddb 100644 --- a/src/goddard/renderer.c +++ b/src/goddard/renderer.c @@ -665,7 +665,7 @@ static Gfx gd_dl_rdp_init[] = { gsSPEndDisplayList(), }; -float sGdPerspTimer = 1.0; +float sGdPerspTimer = 1.0f; UNUSED static Gfx gd_texture4_dummy_aligner1[] = { gsDPPipeSync(), @@ -965,16 +965,6 @@ void *gd_malloc_temp(u32 size) { return gd_malloc(size, TEMP_G_MEM_BLOCK); } -/* 24A458 -> 24A4A4 */ -void *Unknown8019BC88(u32 size, u32 count) { - return gd_malloc_perm(size * count); -} - -/* 24A4A4 -> 24A4DC */ -void *Unknown8019BCD4(u32 size) { - return gd_malloc_perm(size); -} - /* 24A4DC -> 24A598 */ void draw_indexed_dl(s32 dlNum, s32 gfxIdx) { Gfx *dl; @@ -1979,8 +1969,8 @@ void gd_dl_hilite(s32 idx, // material GdDl number; offsets into hilite array sp40.y = cam->unkE8[1][2] + arg4->y; sp40.x = cam->unkE8[2][2] + arg4->z; sp3C = sqrtf(SQ(sp40.z) + SQ(sp40.y) + SQ(sp40.x)); - if (sp3C > 0.1) { - sp3C = 1.0 / sp3C; //? 1.0f + if (sp3C > 0.1f) { + sp3C = 1.0f / sp3C; sp40.z *= sp3C; sp40.y *= sp3C; sp40.x *= sp3C; @@ -2362,10 +2352,10 @@ void parse_p1_controller(void) { // deadzone checks if (ABS(gdctrl->stickX) >= 6) { - gdctrl->csrX += gdctrl->stickX * 0.1; + gdctrl->csrX += gdctrl->stickX * 0.1f; } if (ABS(gdctrl->stickY) >= 6) { - gdctrl->csrY -= gdctrl->stickY * 0.1; + gdctrl->csrY -= gdctrl->stickY * 0.1f; } // clamp cursor position within screen view bounds @@ -2549,7 +2539,7 @@ void gd_create_perspective_matrix(f32 fovy, f32 aspect, f32 near, f32 far) { uintptr_t perspecMtx; uintptr_t rotMtx; - sGdPerspTimer += 0.1; + sGdPerspTimer += 0.1f; guPerspective(&DL_CURRENT_MTX(sCurrentGdDl), &perspNorm, fovy, aspect, near, far, 1.0f); gSPPerspNormalize(next_gfx(), perspNorm); @@ -2969,7 +2959,7 @@ void add_debug_view(struct ObjView *view) { union ObjVarVal *cvrt_val_to_kb(union ObjVarVal *dst, union ObjVarVal src) { union ObjVarVal temp; - temp.f = src.f / 1024.0; //? 1024.0f + temp.f = src.f / 1024.0f; return (*dst = temp, dst); } diff --git a/src/goddard/shape_helper.c b/src/goddard/shape_helper.c index 8fa835c0..df18c7ec 100644 --- a/src/goddard/shape_helper.c +++ b/src/goddard/shape_helper.c @@ -29,60 +29,6 @@ struct ObjShape *gShapeSilverSpark = NULL; // @ 801A82F0 struct ObjShape *gShapeRedStar = NULL; // @ 801A82F4 struct ObjShape *gShapeSilverStar = NULL; // @ 801A82F8 -// Not sure what this data is, but it looks like stub animation data - -static struct GdAnimTransform unusedAnimData1[] = { - { {1.0, 1.0, 1.0}, {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0} }, -}; - -UNUSED static struct AnimDataInfo unusedAnim1 = { ARRAY_COUNT(unusedAnimData1), GD_ANIM_SCALE3F_ROT3F_POS3F_2, unusedAnimData1 }; - -static struct GdAnimTransform unusedAnimData2[] = { - { {1.0, 1.0, 1.0}, {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0} }, -}; - -UNUSED static struct AnimDataInfo unusedAnim2 = { ARRAY_COUNT(unusedAnimData2), GD_ANIM_SCALE3F_ROT3F_POS3F_2, unusedAnimData2 }; - -static struct GdAnimTransform unusedAnimData3[] = { - { {1.0, 1.0, 1.0}, {0.0, 0.0, 0.0}, {0.0, 0.0, 0.0} }, -}; - -UNUSED static struct AnimDataInfo unusedAnim3 = { ARRAY_COUNT(unusedAnimData3), GD_ANIM_SCALE3F_ROT3F_POS3F_2, unusedAnimData3 }; - -struct ObjShape *sSimpleShape = NULL; -UNUSED static struct DynList sSimpleDylist[8] = { // unused - BeginList(), - StartGroup("simpleg"), - MakeDynObj(D_NET, "simple"), - SetType(3), - SetShapePtrPtr(&sSimpleShape), - EndGroup("simpleg"), - UseObj("simpleg"), - EndList(), -}; -static struct DynList sDynlist801A84E4[3] = { - BeginList(), - SetFlag(0x1800), - EndList(), -}; -UNUSED static struct DynList sDynlist801A85B3[5] = { - BeginList(), CallList(sDynlist801A84E4), SetFlag(0x400), SetFriction(0.04, 0.01, 0.01), - EndList(), -}; -UNUSED static struct DynList sDynlist801A85A4[4] = { - BeginList(), - CallList(sDynlist801A84E4), - SetFriction(0.04, 0.01, 0.01), - EndList(), -}; -UNUSED static struct DynList sDynlist801A8604[4] = { - BeginList(), - CallList(sDynlist801A84E4), - SetFriction(0.005, 0.005, 0.005), - EndList(), -}; -static f64 D_801A8668 = 0.0; - // bss static struct ObjGroup *sCubeShapeGroup; // @ 801BAB2C static struct ObjShape *sCubeShape; // @ 801BAB3C @@ -101,7 +47,6 @@ static struct GdVec3f sVertexScaleFactor; /// factor for translating vertices in an `ObjShape` when calling `translate_verts_in_shape()` static struct GdVec3f sVertexTranslateOffset; static struct ObjGroup *D_801BAD08; // group of planes from make_netfromshape -static struct GdVec3f sShapeCenter; // printed with "c=" // Forward Declarations struct ObjMaterial *find_or_add_new_mtl(struct ObjGroup *group, s32 a1, f32 r, f32 g, f32 b); @@ -461,23 +406,6 @@ void func_801980E8(f32 *a0) { gd_rot_2d_vec(D_801BAC60.z, &a0[0], &a0[1]); } -/* @ 246924 for 0x30 */ -void Unknown80198154(f32 x, f32 y, f32 z) { - D_801BAC60.x = x; - D_801BAC60.y = y; - D_801BAC60.z = z; -} - -/* @ 246954 for 0x6c */ -void Unknown80198184(struct ObjShape *shape, f32 x, f32 y, f32 z) { - UNUSED struct GdVec3f unusedVec; - unusedVec.x = x; - unusedVec.y = y; - unusedVec.z = z; - - apply_to_obj_types_in_group(OBJ_TYPE_VERTICES, (applyproc_t) func_8019807C, shape->vtxGroup); -} - /* @ 2469C0 for 0xc8 */ void scale_obj_position(struct GdObj *obj) { struct GdVec3f pos; @@ -532,53 +460,6 @@ void translate_verts_in_shape(struct ObjShape *shape, f32 x, f32 y, f32 z) { apply_to_obj_types_in_group(OBJ_TYPE_ALL, (applyproc_t) translate_obj_position, shape->vtxGroup); } -/* @ 246C14 for 0xe0 */ -void Unknown80198444(struct ObjVertex *vtx) { - f64 distance; - - add_obj_pos_to_bounding_box(&vtx->header); - - distance = vtx->pos.x * vtx->pos.x + vtx->pos.y * vtx->pos.y + vtx->pos.z * vtx->pos.z; - - if (distance != 0.0) { - distance = gd_sqrt_d(distance); // sqrtd? - - if (distance > D_801A8668) { - D_801A8668 = distance; - } - } -} - -/* @ 246CF4 for 0xc4 */ -void Unknown80198524(struct ObjVertex *vtx) { - vtx->pos.x -= sShapeCenter.x; - vtx->pos.y -= sShapeCenter.y; - vtx->pos.z -= sShapeCenter.z; - - vtx->pos.x /= D_801A8668; - vtx->pos.y /= D_801A8668; - vtx->pos.z /= D_801A8668; -} - -/* @ 246DB8 for 0x11c */ -void Unknown801985E8(struct ObjShape *shape) { - struct GdBoundingBox bbox; - - D_801A8668 = 0.0; - reset_bounding_box(); - apply_to_obj_types_in_group(OBJ_TYPE_VERTICES, (applyproc_t) Unknown80198444, shape->vtxGroup); - - get_some_bounding_box(&bbox); - - sShapeCenter.x = (f32)((bbox.minX + bbox.maxX) / 2.0); //? 2.0f - sShapeCenter.y = (f32)((bbox.minY + bbox.maxY) / 2.0); //? 2.0f - sShapeCenter.z = (f32)((bbox.minZ + bbox.maxZ) / 2.0); //? 2.0f - - gd_print_vec("c=", &sShapeCenter); - - apply_to_obj_types_in_group(OBJ_TYPE_VERTICES, (applyproc_t) Unknown80198524, shape->vtxGroup); -} - /* @ 246ED4 for 0x4FC; orig name: func_80198704 */ void get_3DG1_shape(struct ObjShape *shape) { struct GdVec3f tempNormal; /* maybe? */ @@ -1038,7 +919,7 @@ struct ObjShape *make_grid_shape(enum ObjTypeFlag gridType, s32 a1, s32 a2, s32 gridShape->faceCount = 0; gridShape->vtxCount = 0; - sp44 = 2.0 / a3; //? 2.0f + sp44 = 2.0f / a3; sp5C = -1.0f; sp6C = 0.0f; sp70 = -1.0f; @@ -1051,8 +932,8 @@ struct ObjShape *make_grid_shape(enum ObjTypeFlag gridType, s32 a1, s32 a2, s32 objBuf[row][col] = gd_make_vertex(sp68, sp6C, sp70); } else if (gridType == OBJ_TYPE_PARTICLES) { objBuf[row][col] = make_particle(0, 0, sp68, sp6C + 2.0f, sp70); - ((struct ObjParticle *) objBuf[row][col])->unk44 = (1.0 + sp68) / 2.0; - ((struct ObjParticle *) objBuf[row][col])->unk48 = (1.0 + sp70) / 2.0; + ((struct ObjParticle *) objBuf[row][col])->unk44 = (1.0f + sp68) / 2.0f; + ((struct ObjParticle *) objBuf[row][col])->unk48 = (1.0f + sp70) / 2.0f; } sp68 += sp44; } @@ -1397,72 +1278,3 @@ void load_shapes2(void) { imout(); } - -/* @ 249368 -> 249594 */ -struct ObjGroup *Unknown8019AB98(UNUSED u32 a0) { - struct ObjLight *light1; - struct ObjLight *light2; - struct GdObj *oldObjHead = gGdObjectList; // obj head node before making lights - - light1 = make_light(0, NULL, 0); - light1->position.x = 100.0f; - light1->position.y = 200.0f; - light1->position.z = 300.0f; - - light1->diffuse.r = 1.0f; - light1->diffuse.g = 0.0f; - light1->diffuse.b = 0.0f; - - light1->unk30 = 1.0f; - - light1->unk68.x = 0.4f; - light1->unk68.y = 0.9f; - - light1->unk80.x = 4.0f; - light1->unk80.y = 4.0f; - light1->unk80.z = 2.0f; - - light2 = make_light(0, NULL, 1); - light2->position.x = 100.0f; - light2->position.y = 200.0f; - light2->position.z = 300.0f; - - light2->diffuse.r = 0.0f; - light2->diffuse.g = 0.0f; - light2->diffuse.b = 1.0f; - - light2->unk30 = 1.0f; - - light2->unk80.x = -4.0f; - light2->unk80.y = 4.0f; - light2->unk80.z = -2.0f; - - gGdLightGroup = make_group_of_type(OBJ_TYPE_LIGHTS, oldObjHead, NULL); - - return gGdLightGroup; -} - -/* @ 249594 for 0x100 */ -struct ObjGroup *Unknown8019ADC4(UNUSED u32 a0) { - UNUSED struct ObjLight *unusedLight; - struct ObjLight *newLight; - struct GdObj *oldObjHead; - - unusedLight = make_light(0, NULL, 0); - oldObjHead = gGdObjectList; - newLight = make_light(0, NULL, 0); - - newLight->position.x = 0.0f; - newLight->position.y = -500.0f; - newLight->position.z = 0.0f; - - newLight->diffuse.r = 1.0f; - newLight->diffuse.g = 0.0f; - newLight->diffuse.b = 0.0f; - - newLight->unk30 = 1.0f; - - gGdLightGroup = make_group_of_type(OBJ_TYPE_LIGHTS, oldObjHead, NULL); - - return gGdLightGroup; -} diff --git a/src/goddard/skin.c b/src/goddard/skin.c index 02964eac..407dad3f 100644 --- a/src/goddard/skin.c +++ b/src/goddard/skin.c @@ -147,7 +147,7 @@ void func_80192528(struct ObjNet *net) { D_801B9E34 = 0.0f; if (net->flags & 0x1) { - net->velocity.y += -4.0; //? 4.0f + net->velocity.y += -4.0f; } net->worldPos.x += net->velocity.x / 1.0f; @@ -164,12 +164,12 @@ void collision_something_801926A4(struct ObjNet *net) { D_801B9E28.z /= D_801B9E34; } - D_801B9E28.x *= 1.0 / gGdCounter.ctr1; // !1.0f - D_801B9E28.y *= 1.0 / gGdCounter.ctr1; // !1.0f - D_801B9E28.z *= 1.0 / gGdCounter.ctr1; // !1.0f - D_801B9E18.x *= 1.0 / gGdCounter.ctr1; // !1.0f - D_801B9E18.y *= 1.0 / gGdCounter.ctr1; // !1.0f - D_801B9E18.z *= 1.0 / gGdCounter.ctr1; // !1.0f + D_801B9E28.x *= 1.0f / gGdCounter.ctr1; + D_801B9E28.y *= 1.0f / gGdCounter.ctr1; + D_801B9E28.z *= 1.0f / gGdCounter.ctr1; + D_801B9E18.x *= 1.0f / gGdCounter.ctr1; + D_801B9E18.y *= 1.0f / gGdCounter.ctr1; + D_801B9E18.z *= 1.0f / gGdCounter.ctr1; func_8017E584(gGdSkinNet, &D_801B9E28, &D_801B9E18); func_8017E838(gGdSkinNet, &D_801B9E28, &D_801B9E18); @@ -178,9 +178,9 @@ void collision_something_801926A4(struct ObjNet *net) { net->torque.x += net->collTorque.x; net->torque.y += net->collTorque.y; net->torque.z += net->collTorque.z; - net->collDisp.x *= 1.0; // 1.0f; - net->collDisp.y *= 1.0; // 1.0f; - net->collDisp.z *= 1.0; // 1.0f; + net->collDisp.x *= 1.0f; + net->collDisp.y *= 1.0f; + net->collDisp.z *= 1.0f; net->velocity.x += net->collDisp.x; net->velocity.y += net->collDisp.y; net->velocity.z += net->collDisp.z; @@ -189,9 +189,9 @@ void collision_something_801926A4(struct ObjNet *net) { net->worldPos.z += net->collDisp.z; func_8017E9EC(net); - net->torque.x *= 0.98; //? 0.98f - net->torque.z *= 0.98; //? 0.98f - net->torque.y *= 0.9; //? 0.9f + net->torque.x *= 0.98f; + net->torque.z *= 0.98f; + net->torque.y *= 0.9f; } /* 24142C -> 24149C; orig name: func_80192C5C */ @@ -249,7 +249,6 @@ void func_80192CCC(struct ObjNet *net) { if ((group = net->unk1C8) != NULL) { apply_to_obj_types_in_group(OBJ_TYPE_JOINTS, (applyproc_t) func_80191220, group); apply_to_obj_types_in_group(OBJ_TYPE_JOINTS, (applyproc_t) func_801913F0, group); - apply_to_obj_types_in_group(OBJ_TYPE_JOINTS, (applyproc_t) stub_joints_2, group); apply_to_obj_types_in_group(OBJ_TYPE_JOINTS, (applyproc_t) func_801911A8, group); } @@ -434,7 +433,7 @@ void func_8019373C(struct ObjNet *net) { net->shapePtr->scaledVtxGroup = make_group(0); for (link = net->shapePtr->vtxGroup->firstMember; link != NULL; link = link->next) { vtx = (struct ObjVertex *) link->obj; - if (vtx->scaleFactor != 1.0) { + if (vtx->scaleFactor != 1.0f) { addto_group(net->shapePtr->scaledVtxGroup, &vtx->header); } } diff --git a/src/menu/file_select.c b/src/menu/file_select.c index dad6024d..1fea9b24 100644 --- a/src/menu/file_select.c +++ b/src/menu/file_select.c @@ -190,9 +190,9 @@ void beh_yellow_background_menu_loop(void) { * depth = 200.0 for main menu, 22.0 for submenus. */ s32 check_clicked_button(s16 x, s16 y, f32 depth) { - f32 a = 52.4213; - f32 newX = ((f32) x * 160.0) / (a * depth); - f32 newY = ((f32) y * 120.0) / (a * 3 / 4 * depth); + f32 a = 52.4213f; + f32 newX = ((f32) x * 160.0f) / (a * depth); + f32 newY = ((f32) y * 120.0f) / (a * 3 / 4 * depth); s16 maxX = newX + 25.0f; s16 minX = newX - 25.0f; s16 maxY = newY + 21.0f; @@ -217,10 +217,10 @@ void bhv_menu_button_growing_from_main_menu(struct Object *button) { if (button->oMenuButtonTimer >= 8 && button->oMenuButtonTimer < 16) { button->oFaceAnglePitch -= 0x800; } - button->oParentRelativePosX -= button->oMenuButtonOrigPosX / 16.0; - button->oParentRelativePosY -= button->oMenuButtonOrigPosY / 16.0; - if (button->oPosZ < button->oMenuButtonOrigPosZ + 17800.0) { - button->oParentRelativePosZ += 1112.5; + button->oParentRelativePosX -= button->oMenuButtonOrigPosX / 16.0f; + button->oParentRelativePosY -= button->oMenuButtonOrigPosY / 16.0f; + if (button->oPosZ < button->oMenuButtonOrigPosZ + 17800.0f) { + button->oParentRelativePosZ += 1112.5f; } button->oMenuButtonTimer++; if (button->oMenuButtonTimer == 16) { @@ -244,10 +244,10 @@ void bhv_menu_button_shrinking_to_main_menu(struct Object *button) { if (button->oMenuButtonTimer >= 8 && button->oMenuButtonTimer < 16) { button->oFaceAnglePitch += 0x800; } - button->oParentRelativePosX += button->oMenuButtonOrigPosX / 16.0; - button->oParentRelativePosY += button->oMenuButtonOrigPosY / 16.0; + button->oParentRelativePosX += button->oMenuButtonOrigPosX / 16.0f; + button->oParentRelativePosY += button->oMenuButtonOrigPosY / 16.0f; if (button->oPosZ > button->oMenuButtonOrigPosZ) { - button->oParentRelativePosZ -= 1112.5; + button->oParentRelativePosZ -= 1112.5f; } button->oMenuButtonTimer++; if (button->oMenuButtonTimer == 16) { @@ -271,9 +271,9 @@ void bhv_menu_button_growing_from_submenu(struct Object *button) { if (button->oMenuButtonTimer >= 8 && button->oMenuButtonTimer < 16) { button->oFaceAnglePitch -= 0x800; } - button->oParentRelativePosX -= button->oMenuButtonOrigPosX / 16.0; - button->oParentRelativePosY -= button->oMenuButtonOrigPosY / 16.0; - button->oParentRelativePosZ -= 116.25; + button->oParentRelativePosX -= button->oMenuButtonOrigPosX / 16.0f; + button->oParentRelativePosY -= button->oMenuButtonOrigPosY / 16.0f; + button->oParentRelativePosZ -= 116.25f; button->oMenuButtonTimer++; if (button->oMenuButtonTimer == 16) { button->oParentRelativePosX = 0.0f; @@ -296,10 +296,10 @@ void bhv_menu_button_shrinking_to_submenu(struct Object *button) { if (button->oMenuButtonTimer >= 8 && button->oMenuButtonTimer < 16) { button->oFaceAnglePitch += 0x800; } - button->oParentRelativePosX += button->oMenuButtonOrigPosX / 16.0; - button->oParentRelativePosY += button->oMenuButtonOrigPosY / 16.0; + button->oParentRelativePosX += button->oMenuButtonOrigPosX / 16.0f; + button->oParentRelativePosY += button->oMenuButtonOrigPosY / 16.0f; if (button->oPosZ > button->oMenuButtonOrigPosZ) { - button->oParentRelativePosZ += 116.25; + button->oParentRelativePosZ += 116.25f; } button->oMenuButtonTimer++; if (button->oMenuButtonTimer == 16) { @@ -342,7 +342,7 @@ void bhv_menu_button_zoom_in_out(struct Object *button) { * Used while selecting a target copy/erase file or yes/no erase confirmation prompt. */ void bhv_menu_button_zoom_in(struct Object *button) { - button->oMenuButtonScale += 0.0022; + button->oMenuButtonScale += 0.0022f; button->oMenuButtonTimer++; if (button->oMenuButtonTimer == 10) { button->oMenuButtonState = MENU_BUTTON_STATE_DEFAULT; @@ -356,7 +356,7 @@ void bhv_menu_button_zoom_in(struct Object *button) { * yes/no erase confirmation prompt to undo the zoom in. */ void bhv_menu_button_zoom_out(struct Object *button) { - button->oMenuButtonScale -= 0.0022; + button->oMenuButtonScale -= 0.0022f; button->oMenuButtonTimer++; if (button->oMenuButtonTimer == 10) { button->oMenuButtonState = MENU_BUTTON_STATE_DEFAULT; @@ -1532,7 +1532,7 @@ void handle_controller_cursor_input(void) { */ void print_menu_cursor(void) { handle_controller_cursor_input(); - create_dl_translation_matrix(MENU_MTX_PUSH, sCursorPos[0] + 160.0f - 5.0, sCursorPos[1] + 120.0f - 25.0, 0.0f); + create_dl_translation_matrix(MENU_MTX_PUSH, sCursorPos[0] + 160.0f - 5.0f, sCursorPos[1] + 120.0f - 25.0f, 0.0f); // Get the right graphic to use for the cursor. if (sCursorClickingTimer == 0) // Idle diff --git a/src/menu/star_select.c b/src/menu/star_select.c index 8a405483..1b0ae8ac 100644 --- a/src/menu/star_select.c +++ b/src/menu/star_select.c @@ -62,17 +62,17 @@ void bhv_act_selector_star_type_loop(void) { switch (gCurrentObject->oStarSelectorType) { // If a star is not selected, don't rotate or change size case STAR_SELECTOR_NOT_SELECTED: - gCurrentObject->oStarSelectorSize -= 0.1; - if (gCurrentObject->oStarSelectorSize < 1.0) { - gCurrentObject->oStarSelectorSize = 1.0; + gCurrentObject->oStarSelectorSize -= 0.1f; + if (gCurrentObject->oStarSelectorSize < 1.0f) { + gCurrentObject->oStarSelectorSize = 1.0f; } gCurrentObject->oFaceAngleYaw = 0; break; // If a star is selected, rotate and slightly increase size case STAR_SELECTOR_SELECTED: - gCurrentObject->oStarSelectorSize += 0.1; - if (gCurrentObject->oStarSelectorSize > 1.3) { - gCurrentObject->oStarSelectorSize = 1.3; + gCurrentObject->oStarSelectorSize += 0.1f; + if (gCurrentObject->oStarSelectorSize > 1.3f) { + gCurrentObject->oStarSelectorSize = 1.3f; } gCurrentObject->oFaceAngleYaw += 0x800; break; @@ -106,7 +106,7 @@ void render_100_coin_star(u8 stars) { bhvActSelectorStarType, 370, 24, -300, 0, 0, 0); #endif - sStarSelectorModels[6]->oStarSelectorSize = 0.8; + sStarSelectorModels[6]->oStarSelectorSize = 0.8f; sStarSelectorModels[6]->oStarSelectorType = STAR_SELECTOR_100_COINS; } } From 1e81412c4b9cf2ff1a29820668ae3fa08b516907 Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Mon, 27 Sep 2021 15:45:28 -0700 Subject: [PATCH 12/97] Combine shadow flags into gShadowFlags --- src/game/behaviors/manta_ray.inc.c | 2 +- src/game/rendering_graph_node.c | 29 ++-- src/game/shadow.c | 215 +++++++++++------------------ src/game/shadow.h | 39 +++--- src/goddard/joints.c | 5 - 5 files changed, 110 insertions(+), 180 deletions(-) diff --git a/src/game/behaviors/manta_ray.inc.c b/src/game/behaviors/manta_ray.inc.c index b0588946..2aa10aa2 100644 --- a/src/game/behaviors/manta_ray.inc.c +++ b/src/game/behaviors/manta_ray.inc.c @@ -43,7 +43,7 @@ void bhv_manta_ray_init(void) { static void manta_ray_move(void) { s16 animFrame = o->header.gfx.animInfo.animFrame; gCurrentObject->oPathedStartWaypoint = (struct Waypoint *) sMantaRayTraj; - s32 pathStatus = cur_obj_follow_path(pathStatus); + cur_obj_follow_path(0); o->oMantaTargetYaw = o->oPathedTargetYaw; o->oMantaTargetPitch = o->oPathedTargetPitch; o->oForwardVel = 10.0f; diff --git a/src/game/rendering_graph_node.c b/src/game/rendering_graph_node.c index d1a859f6..50217784 100644 --- a/src/game/rendering_graph_node.c +++ b/src/game/rendering_graph_node.c @@ -792,27 +792,22 @@ void geo_set_animation_globals(struct AnimInfo *node, s32 hasAnimation) { * the floor below it. */ void geo_process_shadow(struct GraphNodeShadow *node) { - Gfx *shadowList; Mat4 mtxf; Vec3f shadowPos; Vec3f animOffset; - f32 objScale; f32 shadowScale; - f32 sinAng; - f32 cosAng; struct GraphNode *geo; if (gCurGraphNodeCamera != NULL && gCurGraphNodeObject != NULL) { if (gCurGraphNodeHeldObject != NULL) { - get_pos_from_transform_mtx(shadowPos, gMatStack[gMatStackIndex], - *gCurGraphNodeCamera->matrixPtr); + get_pos_from_transform_mtx(shadowPos, gMatStack[gMatStackIndex], *gCurGraphNodeCamera->matrixPtr); shadowScale = node->shadowScale; } else { vec3f_copy(shadowPos, gCurGraphNodeObject->pos); shadowScale = node->shadowScale * gCurGraphNodeObject->scale[0]; } - objScale = 1.0f; + f32 objScale = 1.0f; if (gCurAnimEnabled) { if (gCurAnimType == ANIM_TYPE_TRANSLATION || gCurAnimType == ANIM_TYPE_LATERAL_TRANSLATION) { @@ -820,32 +815,26 @@ void geo_process_shadow(struct GraphNodeShadow *node) { if (geo != NULL && geo->type == GRAPH_NODE_TYPE_SCALE) { objScale = ((struct GraphNodeScale *) geo)->scale; } - animOffset[0] = - gCurAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)] - * gCurAnimTranslationMultiplier * objScale; + animOffset[0] = gCurAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)] * gCurAnimTranslationMultiplier * objScale; animOffset[1] = 0.0f; gCurrAnimAttribute += 2; - animOffset[2] = - gCurAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)] - * gCurAnimTranslationMultiplier * objScale; + animOffset[2] = gCurAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)] * gCurAnimTranslationMultiplier * objScale; gCurrAnimAttribute -= 6; // simple matrix rotation so the shadow offset rotates along with the object - sinAng = sins(gCurGraphNodeObject->angle[1]); - cosAng = coss(gCurGraphNodeObject->angle[1]); + f32 sinAng = sins(gCurGraphNodeObject->angle[1]); + f32 cosAng = coss(gCurGraphNodeObject->angle[1]); - shadowPos[0] += animOffset[0] * cosAng + animOffset[2] * sinAng; + shadowPos[0] += animOffset[0] * cosAng + animOffset[2] * sinAng; shadowPos[2] += -animOffset[0] * sinAng + animOffset[2] * cosAng; } } - - shadowList = create_shadow_below_xyz(shadowPos[0], shadowPos[1], shadowPos[2], shadowScale, - node->shadowSolidity, node->shadowType); + Gfx *shadowList = create_shadow_below_xyz(shadowPos[0], shadowPos[1], shadowPos[2], shadowScale, node->shadowSolidity, node->shadowType); if (shadowList != NULL) { mtxf_translate(mtxf, shadowPos); mtxf_mul(gMatStack[gMatStackIndex+1], mtxf, *gCurGraphNodeCamera->matrixPtr); incrementMatStack(); - geo_append_display_list((void *) VIRTUAL_TO_PHYSICAL(shadowList), ((gShadowAboveWaterOrLava || gShadowAboveCustomWater || gMarioOnIceOrCarpet) ? LAYER_TRANSPARENT : LAYER_TRANSPARENT_DECAL)); + geo_append_display_list((void *) VIRTUAL_TO_PHYSICAL(shadowList), ((gShadowFlags & (SHADOW_FLAG_WATER_BOX | SHADOW_FLAG_WATER_SURFACE | SHADOW_FLAG_ICE_CARPET)) ? LAYER_TRANSPARENT : LAYER_TRANSPARENT_DECAL)); gMatStackIndex--; } } diff --git a/src/game/shadow.c b/src/game/shadow.c index ebc75d08..936a40b1 100644 --- a/src/game/shadow.c +++ b/src/game/shadow.c @@ -101,10 +101,7 @@ shadowRectangle rectangles[2] = { }; // See shadow.h for documentation. -s8 gShadowAboveWaterOrLava; -s8 gShadowAboveCustomWater; -s8 gMarioOnIceOrCarpet; -s8 sMarioOnFlyingCarpet; +s8 gShadowFlags; s16 sSurfaceTypeBelowShadow; /** @@ -185,7 +182,7 @@ f32 get_water_level_below_shadow(struct Shadow *s, struct Surface **waterFloor) if (waterLevel < FLOOR_LOWER_LIMIT_SHADOW) { return 0; } else if (s->parentY >= waterLevel && s->floorHeight <= waterLevel) { - gShadowAboveWaterOrLava = TRUE; + gShadowFlags |= SHADOW_FLAG_WATER_BOX; return waterLevel; } return waterLevel; @@ -200,8 +197,6 @@ f32 get_water_level_below_shadow(struct Shadow *s, struct Surface **waterFloor) * be dimmed based on its distance to the floor */ s32 init_shadow(struct Shadow *s, f32 xPos, f32 yPos, f32 zPos, s16 shadowScale, u8 overwriteSolidity) { - f32 waterLevel = FLOOR_LOWER_LIMIT_SHADOW; - f32 floorSteepness; struct Surface *floor; struct Surface *waterFloor = NULL; @@ -209,16 +204,15 @@ s32 init_shadow(struct Shadow *s, f32 xPos, f32 yPos, f32 zPos, s16 shadowScale, s->parentY = yPos; s->parentZ = zPos; - s->floorHeight = find_floor(s->parentX, s->parentY, s->parentZ, &floor); - waterLevel = get_water_level_below_shadow(s, &waterFloor); + f32 waterLevel = get_water_level_below_shadow(s, &waterFloor); // if (gEnvironmentRegions != 0) { // waterLevel = get_water_level_below_shadow(s); // } - if (gShadowAboveWaterOrLava) { + if (gShadowFlags & SHADOW_FLAG_WATER_BOX) { s->floorHeight = waterLevel; if (waterFloor != NULL) { @@ -226,11 +220,11 @@ s32 init_shadow(struct Shadow *s, f32 xPos, f32 yPos, f32 zPos, s16 shadowScale, s->floorNormalY = waterFloor->normal.y; s->floorNormalZ = waterFloor->normal.z; s->floorOriginOffset = waterFloor->originOffset; - gShadowAboveWaterOrLava = FALSE; - gShadowAboveCustomWater = TRUE; + gShadowFlags &= ~SHADOW_FLAG_WATER_BOX; + gShadowFlags |= SHADOW_FLAG_WATER_SURFACE; s->solidity = 200; } else { - gShadowAboveCustomWater = FALSE; + gShadowFlags &= ~SHADOW_FLAG_WATER_SURFACE; // Assume that the water is flat. s->floorNormalX = 0.0f; s->floorNormalY = 1.0f; @@ -259,7 +253,7 @@ s32 init_shadow(struct Shadow *s, f32 xPos, f32 yPos, f32 zPos, s16 shadowScale, s->floorDownwardAngle = atan2_deg(s->floorNormalZ, s->floorNormalX); - floorSteepness = sqrtf(s->floorNormalX * s->floorNormalX + s->floorNormalZ * s->floorNormalZ); + f32 floorSteepness = sqrtf(sqr(s->floorNormalX) + sqr(s->floorNormalZ)); // This if-statement avoids dividing by 0. if (floorSteepness == 0.0f) { @@ -302,8 +296,7 @@ void get_texture_coords_4_vertices(s8 vertexNum, s16 *textureX, s16 *textureY) { * @param alpha Opacity of the vertex * @param shadowVertexType One of SHADOW_WITH_9_VERTS or SHADOW_WITH_4_VERTS */ -void make_shadow_vertex_at_xyz(Vtx *vertices, s8 index, f32 relX, f32 relY, f32 relZ, u8 alpha, - s8 shadowVertexType) { +void make_shadow_vertex_at_xyz(Vtx *vertices, s8 index, f32 relX, f32 relY, f32 relZ, u8 alpha, s8 shadowVertexType) { s16 vtxX = round_float(relX); s16 vtxY = round_float(relY); s16 vtxZ = round_float(relZ); @@ -320,14 +313,12 @@ void make_shadow_vertex_at_xyz(Vtx *vertices, s8 index, f32 relX, f32 relY, f32 } // Move the shadow up and over slightly while standing on a flying carpet. - if (sMarioOnFlyingCarpet) { + if (gShadowFlags & SHADOW_FLAG_RAISED) { vtxX += 5; vtxY += 5; vtxZ += 5; } - make_vertex(vertices, index, vtxX, vtxY, vtxZ, textureX << 5, textureY << 5, 255, 255, 255, - alpha // shadows are black - ); + make_vertex(vertices, index, vtxX, vtxY, vtxZ, textureX << 5, textureY << 5, 255, 255, 255, alpha); // shadows are black } /** @@ -349,15 +340,10 @@ void get_vertex_coords(s8 index, s8 shadowVertexType, s8 *xCoord, s8 *zCoord) { *xCoord = index % (3 - shadowVertexType) - 1; *zCoord = index / (3 - shadowVertexType) - 1; - // This just corrects the 4-vertex case to have consistent results with the - // 9-vertex case. + // This just corrects the 4-vertex case to have consistent results with the 9-vertex case. if (shadowVertexType == SHADOW_WITH_4_VERTS) { - if (*xCoord == 0) { - *xCoord = 1; - } - if (*zCoord == 0) { - *zCoord = 1; - } + if (*xCoord == 0) *xCoord = 1; + if (*zCoord == 0) *zCoord = 1; } } @@ -375,21 +361,18 @@ void get_vertex_coords(s8 index, s8 shadowVertexType, s8 *xCoord, s8 *zCoord) { void calculate_vertex_xyz(s8 index, struct Shadow s, f32 *xPosVtx, f32 *yPosVtx, f32 *zPosVtx, s8 shadowVertexType) { f32 tiltedScale = cosf(s.floorTilt * M_PI / 180.0) * s.shadowScale; f32 downwardAngle = s.floorDownwardAngle * M_PI / 180.0; - f32 halfScale; - f32 halfTiltedScale; - s8 xCoordUnit; - s8 zCoordUnit; + s8 xCoordUnit, zCoordUnit; // This makes xCoordUnit and yCoordUnit each one of -1, 0, or 1. get_vertex_coords(index, shadowVertexType, &xCoordUnit, &zCoordUnit); - halfScale = (xCoordUnit * s.shadowScale) / 2.0f; - halfTiltedScale = (zCoordUnit * tiltedScale) / 2.0f; + f32 halfScale = (xCoordUnit * s.shadowScale) / 2.0f; + f32 halfTiltedScale = (zCoordUnit * tiltedScale) / 2.0f; *xPosVtx = (halfTiltedScale * sinf(downwardAngle)) + (halfScale * cosf(downwardAngle)) + s.parentX; *zPosVtx = (halfTiltedScale * cosf(downwardAngle)) - (halfScale * sinf(downwardAngle)) + s.parentZ; - if (gShadowAboveWaterOrLava) { + if (gShadowFlags & SHADOW_FLAG_WATER_BOX) { *yPosVtx = s.floorHeight; } else { switch (shadowVertexType) { @@ -428,8 +411,7 @@ s16 floor_local_tilt(struct Shadow s, f32 vtxX, f32 vtxY, f32 vtxZ) { f32 relY = vtxY - s.floorHeight; f32 relZ = vtxZ - s.parentZ; - f32 ret = (relX * s.floorNormalX) + (relY * s.floorNormalY) + (relZ * s.floorNormalZ); - return ret; + return ((relX * s.floorNormalX) + (relY * s.floorNormalY) + (relZ * s.floorNormalZ)); } /** @@ -440,7 +422,7 @@ void make_shadow_vertex(Vtx *vertices, s8 index, struct Shadow s, s8 shadowVerte f32 relX, relY, relZ; u8 solidity = s.solidity; - if (gShadowAboveWaterOrLava) { + if (gShadowFlags & SHADOW_FLAG_WATER_BOX) { solidity = 200; } @@ -460,8 +442,7 @@ void make_shadow_vertex(Vtx *vertices, s8 index, struct Shadow s, s8 shadowVerte * The gShadowAboveWaterOrLava check is redundant, since `floor_local_tilt` * will always be 0 over water or lava (since they are always flat). */ - if (shadowVertexType == SHADOW_WITH_9_VERTS && !gShadowAboveWaterOrLava - && floor_local_tilt(s, xPosVtx, yPosVtx, zPosVtx) != 0) { + if (shadowVertexType == SHADOW_WITH_9_VERTS && !(gShadowFlags & SHADOW_FLAG_WATER_BOX) && floor_local_tilt(s, xPosVtx, yPosVtx, zPosVtx) != 0) { yPosVtx = extrapolate_vertex_y_position(s, xPosVtx, zPosVtx); solidity = 0; } @@ -501,8 +482,7 @@ void add_shadow_to_display_list(Gfx *displayListHead, Vtx *verts, s8 shadowVerte * Linearly interpolate a shadow's solidity between zero and finalSolidity * depending on curr's relation to start and end. */ -void linearly_interpolate_solidity_positive(struct Shadow *s, u8 finalSolidity, s16 curr, s16 start, - s16 end) { +void linearly_interpolate_solidity_positive(struct Shadow *s, u8 finalSolidity, s16 curr, s16 start, s16 end) { if (curr >= 0 && curr < start) { s->solidity = 0; } else if (end < curr) { @@ -517,8 +497,7 @@ void linearly_interpolate_solidity_positive(struct Shadow *s, u8 finalSolidity, * depending on curr's relation to start and end. Note that if curr < start, * the solidity will be zero. */ -void linearly_interpolate_solidity_negative(struct Shadow *s, u8 initialSolidity, s16 curr, s16 start, - s16 end) { +void linearly_interpolate_solidity_negative(struct Shadow *s, u8 initialSolidity, s16 curr, s16 start, s16 end) { // The curr < start case is not handled. Thus, if start != 0, this function // will have the surprising behavior of hiding the shadow until start. // This is not necessarily a bug, since this function is only used once, @@ -538,22 +517,18 @@ s32 correct_shadow_solidity_for_animations(s32 isLuigi, u8 initialSolidity, stru s8 ret; s16 animFrame; - switch (isLuigi) { - case 1: - /** - * This is evidence of a removed second player, likely Luigi. - * This variable lies in memory just after the gMarioObject and - * has the same type of shadow that Mario does. The `isLuigi` - * variable is never 1 in the game. Note that since this was a - * switch-case, not an if-statement, the programmers possibly - * intended there to be even more than 2 characters. - */ - player = gLuigiObject; - break; - case 0: - default: - player = gMarioObject; - break; + if (isLuigi) { + /** + * This is evidence of a removed second player, likely Luigi. + * This variable lies in memory just after the gMarioObject and + * has the same type of shadow that Mario does. The `isLuigi` + * variable is never 1 in the game. Note that since this was a + * switch-case, not an if-statement, the programmers possibly + * intended there to be even more than 2 characters. + */ + player = gLuigiObject; + } else { + player = gMarioObject; } animFrame = player->header.gfx.animInfo.animFrame; @@ -562,7 +537,7 @@ s32 correct_shadow_solidity_for_animations(s32 isLuigi, u8 initialSolidity, stru ret = SHADOW_SOLIDITY_NO_SHADOW; break; case MARIO_ANIM_FAST_LEDGE_GRAB: - linearly_interpolate_solidity_positive(shadow, initialSolidity, animFrame, 5, 14); + linearly_interpolate_solidity_positive(shadow, initialSolidity, animFrame, 5, 14); ret = SHADOW_SOILDITY_ALREADY_SET; break; case MARIO_ANIM_SLOW_LEDGE_GRAB: @@ -570,7 +545,7 @@ s32 correct_shadow_solidity_for_animations(s32 isLuigi, u8 initialSolidity, stru ret = SHADOW_SOILDITY_ALREADY_SET; break; case MARIO_ANIM_CLIMB_DOWN_LEDGE: - linearly_interpolate_solidity_negative(shadow, initialSolidity, animFrame, 0, 5); + linearly_interpolate_solidity_negative(shadow, initialSolidity, animFrame, 0, 5); ret = SHADOW_SOILDITY_ALREADY_SET; break; default: @@ -587,15 +562,14 @@ void correct_lava_shadow_height(struct Shadow *s) { if (gCurrLevelNum == LEVEL_BITFS && sSurfaceTypeBelowShadow == SURFACE_BURNING) { if (s->floorHeight < -3000.0f) { s->floorHeight = -3062.0f; - gShadowAboveWaterOrLava = TRUE; + gShadowFlags |= SHADOW_FLAG_WATER_BOX; } else if (s->floorHeight > 3400.0f) { s->floorHeight = 3492.0f; - gShadowAboveWaterOrLava = TRUE; + gShadowFlags |= SHADOW_FLAG_WATER_BOX; } - } else if (gCurrLevelNum == LEVEL_LLL && gCurrAreaIndex == 1 - && sSurfaceTypeBelowShadow == SURFACE_BURNING) { + } else if (gCurrLevelNum == LEVEL_LLL && gCurrAreaIndex == 1 && sSurfaceTypeBelowShadow == SURFACE_BURNING) { s->floorHeight = 5.0f; - gShadowAboveWaterOrLava = TRUE; + gShadowFlags |= SHADOW_FLAG_WATER_BOX; } } @@ -604,8 +578,6 @@ void correct_lava_shadow_height(struct Shadow *s) { * appropriate animations and other states. */ Gfx *create_shadow_player(f32 xPos, f32 yPos, f32 zPos, s16 shadowScale, u8 solidity, s32 isLuigi) { - Vtx *verts; - Gfx *displayList; struct Shadow shadow; s8 ret = 0; s32 i; @@ -614,11 +586,10 @@ Gfx *create_shadow_player(f32 xPos, f32 yPos, f32 zPos, s16 shadowScale, u8 soli if (gCurrLevelNum == LEVEL_RR && sSurfaceTypeBelowShadow != SURFACE_DEATH_PLANE) { switch (gFlyingCarpetState) { case FLYING_CARPET_MOVING_WITHOUT_MARIO: - gMarioOnIceOrCarpet = 1; - sMarioOnFlyingCarpet = 1; + gShadowFlags |= (SHADOW_FLAG_ICE_CARPET | SHADOW_FLAG_RAISED); break; case FLYING_CARPET_MOVING_WITH_MARIO: - gMarioOnIceOrCarpet = 1; + gShadowFlags = SHADOW_FLAG_ICE_CARPET; break; } } @@ -636,8 +607,8 @@ Gfx *create_shadow_player(f32 xPos, f32 yPos, f32 zPos, s16 shadowScale, u8 soli return NULL; } - verts = alloc_display_list(9 * sizeof(Vtx)); - displayList = alloc_display_list(5 * sizeof(Gfx)); + Vtx *verts = alloc_display_list(9 * sizeof(Vtx)); + Gfx *displayList = alloc_display_list(5 * sizeof(Gfx)); if (verts == NULL || displayList == NULL) { return NULL; } @@ -655,8 +626,6 @@ Gfx *create_shadow_player(f32 xPos, f32 yPos, f32 zPos, s16 shadowScale, u8 soli * Create a circular shadow composed of 9 vertices. */ Gfx *create_shadow_circle_9_verts(f32 xPos, f32 yPos, f32 zPos, s16 shadowScale, u8 solidity) { - Vtx *verts; - Gfx *displayList; struct Shadow shadow; s32 i; @@ -664,8 +633,8 @@ Gfx *create_shadow_circle_9_verts(f32 xPos, f32 yPos, f32 zPos, s16 shadowScale, return NULL; } - verts = alloc_display_list(9 * sizeof(Vtx)); - displayList = alloc_display_list(5 * sizeof(Gfx)); + Vtx *verts = alloc_display_list(9 * sizeof(Vtx)); + Gfx *displayList = alloc_display_list(5 * sizeof(Gfx)); if (verts == NULL || displayList == NULL) { return 0; @@ -681,8 +650,6 @@ Gfx *create_shadow_circle_9_verts(f32 xPos, f32 yPos, f32 zPos, s16 shadowScale, * Create a circular shadow composed of 4 vertices. */ Gfx *create_shadow_circle_4_verts(f32 xPos, f32 yPos, f32 zPos, s16 shadowScale, u8 solidity) { - Vtx *verts; - Gfx *displayList; struct Shadow shadow; s32 i; @@ -690,8 +657,8 @@ Gfx *create_shadow_circle_4_verts(f32 xPos, f32 yPos, f32 zPos, s16 shadowScale, return NULL; } - verts = alloc_display_list(4 * sizeof(Vtx)); - displayList = alloc_display_list(5 * sizeof(Gfx)); + Vtx *verts = alloc_display_list(4 * sizeof(Vtx)); + Gfx *displayList = alloc_display_list(5 * sizeof(Gfx)); if (verts == NULL || displayList == NULL) { return 0; @@ -708,20 +675,14 @@ Gfx *create_shadow_circle_4_verts(f32 xPos, f32 yPos, f32 zPos, s16 shadowScale, * Create a circular shadow composed of 4 vertices and assume that the ground * underneath it is totally flat. */ -Gfx *create_shadow_circle_assuming_flat_ground(f32 xPos, f32 yPos, f32 zPos, s16 shadowScale, - u8 solidity) { - Vtx *verts; - Gfx *displayList; +Gfx *create_shadow_circle_assuming_flat_ground(f32 xPos, f32 yPos, f32 zPos, s16 shadowScale, u8 solidity) { f32 distBelowFloor; f32 floorHeight; f32 radius = shadowScale / 2; - if (gCurGraphNodeObjectNode->oFloor != NULL) - { + if (gCurGraphNodeObjectNode->oFloor != NULL) { floorHeight = gCurGraphNodeObjectNode->oFloorHeight; - } - else - { + } else { floorHeight = find_floor_height(xPos, yPos, zPos); } @@ -731,17 +692,17 @@ Gfx *create_shadow_circle_assuming_flat_ground(f32 xPos, f32 yPos, f32 zPos, s16 distBelowFloor = floorHeight - yPos; } - verts = alloc_display_list(4 * sizeof(Vtx)); - displayList = alloc_display_list(5 * sizeof(Gfx)); + Vtx *verts = alloc_display_list(4 * sizeof(Vtx)); + Gfx *displayList = alloc_display_list(5 * sizeof(Gfx)); if (verts == NULL || displayList == NULL) { return 0; } make_shadow_vertex_at_xyz(verts, 0, -radius, distBelowFloor, -radius, solidity, 1); - make_shadow_vertex_at_xyz(verts, 1, radius, distBelowFloor, -radius, solidity, 1); - make_shadow_vertex_at_xyz(verts, 2, -radius, distBelowFloor, radius, solidity, 1); - make_shadow_vertex_at_xyz(verts, 3, radius, distBelowFloor, radius, solidity, 1); + make_shadow_vertex_at_xyz(verts, 1, radius, distBelowFloor, -radius, solidity, 1); + make_shadow_vertex_at_xyz(verts, 2, -radius, distBelowFloor, radius, solidity, 1); + make_shadow_vertex_at_xyz(verts, 3, radius, distBelowFloor, radius, solidity, 1); add_shadow_to_display_list(displayList, verts, SHADOW_WITH_4_VERTS, SHADOW_SHAPE_CIRCLE); return displayList; @@ -761,15 +722,15 @@ Gfx *create_shadow_rectangle(f32 halfWidth, f32 halfLength, f32 relY, u8 solidit } // Rotate the shadow based on the parent object's face angle. - rotate_rectangle(&frontLeftZ, &frontLeftX, -halfLength, -halfWidth); - rotate_rectangle(&frontRightZ, &frontRightX, -halfLength, halfWidth); - rotate_rectangle(&backLeftZ, &backLeftX, halfLength, -halfWidth); - rotate_rectangle(&backRightZ, &backRightX, halfLength, halfWidth); + rotate_rectangle(&frontLeftZ, &frontLeftX, -halfLength, -halfWidth); + rotate_rectangle(&frontRightZ, &frontRightX, -halfLength, halfWidth); + rotate_rectangle(&backLeftZ, &backLeftX, halfLength, -halfWidth); + rotate_rectangle(&backRightZ, &backRightX, halfLength, halfWidth); - make_shadow_vertex_at_xyz(verts, 0, frontLeftX, relY, frontLeftZ, solidity, 1); + make_shadow_vertex_at_xyz(verts, 0, frontLeftX, relY, frontLeftZ, solidity, 1); make_shadow_vertex_at_xyz(verts, 1, frontRightX, relY, frontRightZ, solidity, 1); - make_shadow_vertex_at_xyz(verts, 2, backLeftX, relY, backLeftZ, solidity, 1); - make_shadow_vertex_at_xyz(verts, 3, backRightX, relY, backRightZ, solidity, 1); + make_shadow_vertex_at_xyz(verts, 2, backLeftX, relY, backLeftZ, solidity, 1); + make_shadow_vertex_at_xyz(verts, 3, backRightX, relY, backRightZ, solidity, 1); add_shadow_to_display_list(displayList, verts, SHADOW_WITH_4_VERTS, SHADOW_SHAPE_SQUARE); return displayList; @@ -780,31 +741,25 @@ Gfx *create_shadow_rectangle(f32 halfWidth, f32 halfLength, f32 relY, u8 solidit * value is 200. Return 0 if a shadow should be drawn, 1 if not. */ s32 get_shadow_height_solidity(f32 xPos, f32 yPos, f32 zPos, f32 *shadowHeight, u8 *solidity) { - f32 waterLevel; - - if (gCurGraphNodeObjectNode->oFloor != NULL) - { + if (gCurGraphNodeObjectNode->oFloor != NULL) { *shadowHeight = gCurGraphNodeObjectNode->oFloorHeight; - } - else - { + } else { *shadowHeight = find_floor_height(xPos, yPos, zPos); } if (*shadowHeight < FLOOR_LOWER_LIMIT_SHADOW) { - return 1; + return TRUE; } else { - waterLevel = find_water_level(xPos, zPos); - + f32 waterLevel = find_water_level(xPos, zPos); if (waterLevel < FLOOR_LOWER_LIMIT_SHADOW) { // Dead if-statement. There may have been an assert here. } else if (yPos >= waterLevel && waterLevel >= *shadowHeight) { - gShadowAboveWaterOrLava = TRUE; + gShadowFlags |= SHADOW_FLAG_WATER_BOX; *shadowHeight = waterLevel; *solidity = 200; } } - return 0; + return FALSE; } /** @@ -812,14 +767,13 @@ s32 get_shadow_height_solidity(f32 xPos, f32 yPos, f32 zPos, f32 *shadowHeight, */ Gfx *create_shadow_square(f32 xPos, f32 yPos, f32 zPos, s16 shadowScale, u8 solidity, s8 shadowType) { f32 shadowHeight; - f32 distFromShadow; f32 shadowRadius; - if (get_shadow_height_solidity(xPos, yPos, zPos, &shadowHeight, &solidity) != 0) { + if (get_shadow_height_solidity(xPos, yPos, zPos, &shadowHeight, &solidity)) { return NULL; } - distFromShadow = yPos - shadowHeight; + f32 distFromShadow = yPos - shadowHeight; switch (shadowType) { case SHADOW_SQUARE_PERMANENT: shadowRadius = shadowScale / 2; break; case SHADOW_SQUARE_SCALABLE: shadowRadius = scale_shadow_with_distance(shadowScale, distFromShadow) / 2.0f; break; @@ -834,19 +788,16 @@ Gfx *create_shadow_square(f32 xPos, f32 yPos, f32 zPos, s16 shadowScale, u8 soli * Create a rectangular shadow whose parameters have been hardcoded in the * `rectangles` array. */ -Gfx *create_shadow_hardcoded_rectangle(f32 xPos, f32 yPos, f32 zPos, UNUSED s16 shadowScale, - u8 solidity, s8 shadowType) { +Gfx *create_shadow_hardcoded_rectangle(f32 xPos, f32 yPos, f32 zPos, UNUSED s16 shadowScale, u8 solidity, s8 shadowType) { f32 shadowHeight; - f32 distFromShadow; - f32 halfWidth; - f32 halfLength; + f32 halfWidth, halfLength; s8 idx = shadowType - SHADOW_RECTANGLE_HARDCODED_OFFSET; - if (get_shadow_height_solidity(xPos, yPos, zPos, &shadowHeight, &solidity) != 0) { + if (get_shadow_height_solidity(xPos, yPos, zPos, &shadowHeight, &solidity)) { return NULL; } - distFromShadow = yPos - shadowHeight; + f32 distFromShadow = yPos - shadowHeight; /** * Note that idx could be negative or otherwise out of the bounds of * the `rectangles` array. In practice, it never is, because this was @@ -856,8 +807,7 @@ Gfx *create_shadow_hardcoded_rectangle(f32 xPos, f32 yPos, f32 zPos, UNUSED s16 halfWidth = scale_shadow_with_distance(rectangles[idx].halfWidth, distFromShadow); halfLength = scale_shadow_with_distance(rectangles[idx].halfLength, distFromShadow); } else { - // This code is never used because the third element of the rectangle - // struct is always TRUE. + // This code is never used because the third element of the rectangle struct is always TRUE. halfWidth = rectangles[idx].halfWidth; halfLength = rectangles[idx].halfLength; } @@ -868,19 +818,14 @@ Gfx *create_shadow_hardcoded_rectangle(f32 xPos, f32 yPos, f32 zPos, UNUSED s16 * Create a shadow at the absolute position given, with the given parameters. * Return a pointer to the display list representing the shadow. */ -Gfx *create_shadow_below_xyz(f32 xPos, f32 yPos, f32 zPos, s16 shadowScale, u8 shadowSolidity, - s8 shadowType) { +Gfx *create_shadow_below_xyz(f32 xPos, f32 yPos, f32 zPos, s16 shadowScale, u8 shadowSolidity, s8 shadowType) { Gfx *displayList = NULL; struct Surface *pfloor; find_floor(xPos, yPos, zPos, &pfloor); - - gShadowAboveWaterOrLava = FALSE; - gShadowAboveCustomWater = FALSE; - gMarioOnIceOrCarpet = 0; - sMarioOnFlyingCarpet = 0; + gShadowFlags = SHADOW_FLAGS_NONE; if (pfloor != NULL) { if (pfloor->type == SURFACE_ICE) { - gMarioOnIceOrCarpet = 1; + gShadowFlags |= SHADOW_FLAG_ICE_CARPET; } sSurfaceTypeBelowShadow = pfloor->type; } diff --git a/src/game/shadow.h b/src/game/shadow.h index 528659a2..e78d72cf 100644 --- a/src/game/shadow.h +++ b/src/game/shadow.h @@ -10,41 +10,42 @@ */ enum ShadowType { - SHADOW_CIRCLE_9_VERTS = 0, - SHADOW_CIRCLE_4_VERTS = 1, - SHADOW_CIRCLE_4_VERTS_FLAT_UNUSED = 2, - SHADOW_SQUARE_PERMANENT = 10, - SHADOW_SQUARE_SCALABLE = 11, - SHADOW_SQUARE_TOGGLABLE = 12, + SHADOW_CIRCLE_9_VERTS = 0, + SHADOW_CIRCLE_4_VERTS = 1, + SHADOW_CIRCLE_4_VERTS_FLAT_UNUSED = 2, + SHADOW_SQUARE_PERMANENT = 10, + SHADOW_SQUARE_SCALABLE = 11, + SHADOW_SQUARE_TOGGLABLE = 12, /** * This defines an offset after which rectangular shadows with custom * widths and heights can be defined. */ SHADOW_RECTANGLE_HARDCODED_OFFSET = 50, - SHADOW_CIRCLE_PLAYER = 99 + SHADOW_CIRCLE_PLAYER = 99 }; +#define SHADOW_FLAGS_NONE (0 << 0) +/** + * Flag for if the current shadow is above water or lava. + */ +#define SHADOW_FLAG_WATER_BOX (1 << 0) +#define SHADOW_FLAG_WATER_SURFACE (1 << 1) +/** + * Flag for if Mario is on ice or a flying carpet. + */ +#define SHADOW_FLAG_ICE_CARPET (1 << 2) /** * Flag for if Mario is on a flying carpet. */ -extern s8 sMarioOnFlyingCarpet; +#define SHADOW_FLAG_RAISED (1 << 3) + +extern s8 gShadowFlags; /** * The surface type below the current shadow. */ extern s16 sSurfaceTypeBelowShadow; -/** - * Flag for if the current shadow is above water or lava. - */ -extern s8 gShadowAboveWaterOrLava; -extern s8 gShadowAboveCustomWater; - -/** - * Flag for if Mario is on ice or a flying carpet. - */ -extern s8 gMarioOnIceOrCarpet; - /** * Given the (x, y, z) location of an object, create a shadow below that object * with the given initial solidity and "shadowType" (described above). diff --git a/src/goddard/joints.c b/src/goddard/joints.c index ededce37..df0950b6 100644 --- a/src/goddard/joints.c +++ b/src/goddard/joints.c @@ -19,10 +19,6 @@ #include "skin.h" #include "skin_movement.h" -// data -static s32 D_801A82D0 = 0; -static struct ObjBone *gGdTempBone = NULL; // @ 801A82D4 - // bss s32 sResetWeightVtxNum; // WTF? why is this not in skin_movement.c? @@ -711,7 +707,6 @@ void func_80190574(s32 a0, struct ObjJoint *a1, struct ObjJoint *a2, f32 x, f32 void func_801909B4(void) { struct ObjJoint *node; - D_801A82D0 = 0; node = gGdJointList; while (node != NULL) { node->unk1C0 = 0; From 62cc178545f90231e14f3a457fa91a28033fe8af Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Mon, 27 Sep 2021 16:41:43 -0700 Subject: [PATCH 13/97] Object constants and new typedefs --- include/object_constants.h | 2598 ++++++++++++----- include/special_presets.h | 2 +- include/types.h | 99 +- src/engine/level_script.c | 8 +- src/game/area.h | 7 + src/game/behavior_actions.c | 6 +- .../behaviors/animated_floor_switch.inc.c | 2 +- src/game/behaviors/arrow_lift.inc.c | 16 +- src/game/behaviors/bub.inc.c | 4 +- src/game/behaviors/camera_lakitu.inc.c | 4 +- src/game/behaviors/coffin.inc.c | 18 +- src/game/behaviors/koopa.inc.c | 13 +- src/game/behaviors/purple_switch.inc.c | 20 +- src/game/behaviors/sl_walking_penguin.inc.c | 2 +- src/game/behaviors/tuxie.inc.c | 9 +- src/game/behaviors/tweester.inc.c | 2 +- src/game/macro_special_objects.c | 6 +- src/game/object_helpers.h | 2 +- src/game/object_list_processor.c | 2 +- src/menu/file_select.c | 318 +- 20 files changed, 2189 insertions(+), 949 deletions(-) diff --git a/include/object_constants.h b/include/object_constants.h index c95c6eb2..23e51fb2 100644 --- a/include/object_constants.h +++ b/include/object_constants.h @@ -199,947 +199,2231 @@ #define MOV_BCOIN_ACT_STOPPED 0x3 #define MOV_BCOIN_ACT_FLICKERING 0x4 -/* Bob-omb */ +/* Yellow Coin */ /* oBehParams2ndByte */ - #define BOBOMB_BP_STYPE_GENERIC 0x0 - #define BOBOMB_BP_STYPE_STATIONARY 0x1 - /* oAction */ - #define BOBOMB_ACT_PATROL 0x0 - #define BOBOMB_ACT_LAUNCHED 0x1 - #define BOBOMB_ACT_CHASE_MARIO 0x2 - #define BOBOMB_ACT_EXPLODE 0x3 + #define YELLOW_COIN_BP_ONE_COIN 0x1 /* Moving Yellow Coin */ /* oAction */ - #define MOV_YCOIN_ACT_IDLE 0 - #define MOV_YCOIN_ACT_BLINKING 1 + #define MOV_YCOIN_ACT_IDLE 0x0 + #define MOV_YCOIN_ACT_BLINKING 0x1 + /* oSubAction */ + +/* Coin Formation */ + /* (oBehParams2ndByte & 0x7) */ + #define COIN_FORMATION_BP_HORIZONTAL_LINE 0x0 + #define COIN_FORMATION_BP_VERTICAL_LINE 0x1 + #define COIN_FORMATION_BP_HORIZONTAL_RING 0x2 + #define COIN_FORMATION_BP_VERTICAL_RING 0x3 + #define COIN_FORMATION_BP_ARROW 0x4 + /* oAction */ + #define COIN_FORMATION_ACT_INACTIVE 0x0 + #define COIN_FORMATION_ACT_ACTIVE 0x1 + #define COIN_FORMATION_ACT_DEACTIVATE 0x2 + +/* Coin Inside Boo */ + /* oAction */ + #define COIN_INSIDE_BOO_ACT_CARRIED 0x0 + #define COIN_INSIDE_BOO_ACT_DROPPED 0x1 + +/* 1-Up Mushroom */ + /* oBehParams2ndByte */ + #define MUSHROOM_BP_REQUIRES_NONE 0x0 + #define MUSHROOM_BP_REQUIRES_BOWSER_1 0x1 + #define MUSHROOM_BP_REQUIRES_BOWSER_2 0x2 + /* oAction */ + #define MUSHROOM_ACT_INIT 0x0 + #define MUSHROOM_ACT_MOVING 0x1 + #define MUSHROOM_ACT_DISAPPEARING 0x2 + #define MUSHROOM_ACT_LOOP_IN_AIR 0x3 + +/* Bob-omb */ + /* oBehParams2ndByte */ + #define BOBOMB_BP_STYPE_GENERIC 0x0 + #define BOBOMB_BP_STYPE_STATIONARY 0x1 + /* oAction */ + #define BOBOMB_ACT_PATROL 0x0 + #define BOBOMB_ACT_LAUNCHED 0x1 + #define BOBOMB_ACT_CHASE_MARIO 0x2 + #define BOBOMB_ACT_EXPLODE 0x3 + /* oAnimState */ + #define BOBOMB_ANIM_STATE_EYES_OPEN OBJ_BLINKING_ANIM_STATE_EYES_OPEN + #define BOBOMB_ANIM_STATE_EYES_CLOSED OBJ_BLINKING_ANIM_STATE_EYES_CLOSED + /* Animations */ + #define BOBOMB_ANIM_WALKING 0x0 + #define BOBOMB_ANIM_HELD 0x1 /* Bob-omb Buddy */ /* oBehParams2ndByte */ - #define BOBOMB_BUDDY_BP_STYPE_GENERIC 0 - #define BOBOMB_BUDDY_BP_STYPE_BOB_GRASS_KBB 1 - #define BOBOMB_BUDDY_BP_STYPE_BOB_CANNON_KBB 2 - #define BOBOMB_BUDDY_BP_STYPE_BOB_GRASS 3 + #define BOBOMB_BUDDY_BP_STYPE_GENERIC 0x0 + #define BOBOMB_BUDDY_BP_STYPE_BOB_GRASS_KBB 0x1 + #define BOBOMB_BUDDY_BP_STYPE_BOB_CANNON_KBB 0x2 + #define BOBOMB_BUDDY_BP_STYPE_BOB_GRASS 0x3 /* oAction */ - #define BOBOMB_BUDDY_ACT_IDLE 0 - #define BOBOMB_BUDDY_ACT_TURN_TO_TALK 2 - #define BOBOMB_BUDDY_ACT_TALK 3 + #define BOBOMB_BUDDY_ACT_IDLE 0x0 + #define BOBOMB_BUDDY_ACT_TURN_TO_TALK 0x2 + #define BOBOMB_BUDDY_ACT_TALK 0x3 /* oBobombBuddyRole */ - #define BOBOMB_BUDDY_ROLE_ADVICE 0 - #define BOBOMB_BUDDY_ROLE_CANNON 1 + #define BOBOMB_BUDDY_ROLE_ADVICE 0x0 + #define BOBOMB_BUDDY_ROLE_CANNON 0x1 /* oBobombBuddyCannonStatus */ - #define BOBOMB_BUDDY_CANNON_UNOPENED 0 - #define BOBOMB_BUDDY_CANNON_OPENING 1 - #define BOBOMB_BUDDY_CANNON_OPENED 2 - #define BOBOMB_BUDDY_CANNON_STOP_TALKING 3 + #define BOBOMB_BUDDY_CANNON_UNOPENED 0x0 + #define BOBOMB_BUDDY_CANNON_OPENING 0x1 + #define BOBOMB_BUDDY_CANNON_OPENED 0x2 + #define BOBOMB_BUDDY_CANNON_STOP_TALKING 0x3 /* oBobombBuddyHasTalkedToMario */ - #define BOBOMB_BUDDY_HAS_NOT_TALKED 0 - #define BOBOMB_BUDDY_HAS_TALKED 2 + #define BOBOMB_BUDDY_HAS_NOT_TALKED 0x0 + #define BOBOMB_BUDDY_HAS_TALKED 0x2 /* Bowser */ - /* Tail oAction */ - #define BOWSER_ACT_TAIL_DEFAULT 0 - #define BOWSER_ACT_TAIL_THROWN 1 - #define BOWSER_ACT_TAIL_TOUCHED_MARIO 2 - /* oAction */ - #define BOWSER_ACT_DEFAULT 0 - #define BOWSER_ACT_THROWN 1 - #define BOWSER_ACT_JUMP_ONTO_STAGE 2 - #define BOWSER_ACT_DANCE 3 - #define BOWSER_ACT_DEAD 4 - #define BOWSER_ACT_WAIT 5 - #define BOWSER_ACT_INTRO_WALK 6 - #define BOWSER_ACT_CHARGE_MARIO 7 - #define BOWSER_ACT_SPIT_FIRE_INTO_SKY 8 - #define BOWSER_ACT_SPIT_FIRE_ONTO_FLOOR 9 - #define BOWSER_ACT_HIT_EDGE 10 - #define BOWSER_ACT_TURN_FROM_EDGE 11 - #define BOWSER_ACT_HIT_MINE 12 - #define BOWSER_ACT_BIG_JUMP 13 - #define BOWSER_ACT_WALK_TO_MARIO 14 - #define BOWSER_ACT_BREATH_FIRE 15 - #define BOWSER_ACT_TELEPORT 16 - #define BOWSER_ACT_QUICK_JUMP 17 - #define BOWSER_ACT_UNUSED_SLOW_WALK 18 - #define BOWSER_ACT_TILT_LAVA_PLATFORM 19 - /* Animations */ - #define BOWSER_ANIM_STAND_UP 0 - #define BOWSER_ANIM_STAND_UP_UNUSED 1 // slightly different - #define BOWSER_ANIM_SHAKING 2 - #define BOWSER_ANIM_GRABBED 3 - #define BOWSER_ANIM_BROKEN 4 // broken animation - #define BOWSER_ANIM_FALL_DOWN 5 // unused - #define BOWSER_ANIM_BREATH 6 - #define BOWSER_ANIM_JUMP 7 // unused, short jump, replaced by start/stop - #define BOWSER_ANIM_JUMP_STOP 8 - #define BOWSER_ANIM_JUMP_START 9 - #define BOWSER_ANIM_DANCE 10 - #define BOWSER_ANIM_BREATH_UP 11 - #define BOWSER_ANIM_IDLE 12 - #define BOWSER_ANIM_SLOW_GAIT 13 - #define BOWSER_ANIM_LOOK_DOWN_STOP_WALK 14 - #define BOWSER_ANIM_LOOK_UP_START_WALK 15 - #define BOWSER_ANIM_FLIP_DOWN 16 - #define BOWSER_ANIM_LAY_DOWN 17 - #define BOWSER_ANIM_RUN_START 18 - #define BOWSER_ANIM_RUN 19 - #define BOWSER_ANIM_RUN_STOP 20 - #define BOWSER_ANIM_RUN_SLIP 21 - #define BOWSER_ANIM_BREATH_QUICK 22 - #define BOWSER_ANIM_EDGE_MOVE 23 - #define BOWSER_ANIM_EDGE_STOP 24 - #define BOWSER_ANIM_FLIP 25 - #define BOWSER_ANIM_STAND_UP_FROM_FLIP 26 /* oBehParams2ndByte */ - #define BOWSER_BP_BITDW 0 - #define BOWSER_BP_BITFS 1 - #define BOWSER_BP_BITS 2 - /* oBowserCamAct */ - #define BOWSER_CAM_ACT_IDLE 0 - #define BOWSER_CAM_ACT_WALK 1 - #define BOWSER_CAM_ACT_END 2 - /* oBowserStatus */ - #define BOWSER_STATUS_ANGLE_MARIO (1 << 1) // 0x00000002 - #define BOWSER_STATUS_ANGLE_CENTRE (1 << 2) // 0x00000004 - #define BOWSER_STATUS_DIST_MARIO (1 << 3) // 0x00000008 - #define BOWSER_STATUS_DIST_CENTRE (1 << 4) // 0x00000010 - #define BOWSER_STATUS_BIG_JUMP (1 << 16) // 0x00010000 - #define BOWSER_STATUS_FIRE_SKY (1 << 17) // 0x00020000 - /* oBowserGrabbedStatus */ - #define BOWSER_GRAB_STATUS_NONE 0 - #define BOWSER_GRAB_STATUS_GRABBED 1 - #define BOWSER_GRAB_STATUS_HOLDING 2 - /* oSubAction */ - #define BOWSER_SUB_ACT_DEAD_FLY_BACK 0 - #define BOWSER_SUB_ACT_DEAD_BOUNCE 1 - #define BOWSER_SUB_ACT_DEAD_WAIT 2 - #define BOWSER_SUB_ACT_DEAD_DEFAULT_END 3 - #define BOWSER_SUB_ACT_DEAD_DEFAULT_END_OVER 4 - #define BOWSER_SUB_ACT_DEAD_FINAL_END 10 - #define BOWSER_SUB_ACT_DEAD_FINAL_END_OVER 11 - - #define BOWSER_SUB_ACT_CHARGE_START 0 - #define BOWSER_SUB_ACT_CHARGE_RUN 1 - #define BOWSER_SUB_ACT_CHARGE_END 2 - #define BOWSER_SUB_ACT_CHARGE_SLIP 3 - - #define BOWSER_SUB_ACT_TELEPORT_START 0 - #define BOWSER_SUB_ACT_TELEPORT_MOVE 1 - #define BOWSER_SUB_ACT_TELEPORT_STOP 2 - - #define BOWSER_SUB_ACT_HIT_MINE_START 0 - #define BOWSER_SUB_ACT_HIT_MINE_FALL 1 - #define BOWSER_SUB_ACT_HIT_MINE_STOP 2 - - #define BOWSER_SUB_ACT_JUMP_ON_STAGE_IDLE 0 - #define BOWSER_SUB_ACT_JUMP_ON_STAGE_START 1 - #define BOWSER_SUB_ACT_JUMP_ON_STAGE_LAND 2 - #define BOWSER_SUB_ACT_JUMP_ON_STAGE_STOP 3 - -/* Bowser Bits Platform*/ + #define BOWSER_BP_BITDW 0x0 + #define BOWSER_BP_BITFS 0x1 + #define BOWSER_BP_BITS 0x2 + /* Tail oAction */ + #define BOWSER_ACT_TAIL_DEFAULT 0x00 + #define BOWSER_ACT_TAIL_THROWN 0x01 + #define BOWSER_ACT_TAIL_TOUCHED_MARIO 0x02 /* oAction */ - #define BOWSER_BITS_PLAT_ACT_START 0 - #define BOWSER_BITS_PLAT_ACT_CHECK 1 - #define BOWSER_BITS_PLAT_ACT_FALL 2 + #define BOWSER_ACT_DEFAULT 0x00 + #define BOWSER_ACT_THROWN 0x01 + #define BOWSER_ACT_JUMP_ONTO_STAGE 0x02 + #define BOWSER_ACT_DANCE 0x03 + #define BOWSER_ACT_DEAD 0x04 + #define BOWSER_ACT_WAIT 0x05 + #define BOWSER_ACT_INTRO_WALK 0x06 + #define BOWSER_ACT_CHARGE_MARIO 0x07 + #define BOWSER_ACT_SPIT_FIRE_INTO_SKY 0x08 + #define BOWSER_ACT_SPIT_FIRE_ONTO_FLOOR 0x09 + #define BOWSER_ACT_HIT_EDGE 0x0A + #define BOWSER_ACT_TURN_FROM_EDGE 0x0B + #define BOWSER_ACT_HIT_MINE 0x0C + #define BOWSER_ACT_BIG_JUMP 0x0D + #define BOWSER_ACT_WALK_TO_MARIO 0x0E + #define BOWSER_ACT_BREATH_FIRE 0x0F + #define BOWSER_ACT_TELEPORT 0x10 + #define BOWSER_ACT_QUICK_JUMP 0x11 + #define BOWSER_ACT_UNUSED_SLOW_WALK 0x12 + #define BOWSER_ACT_TILT_LAVA_PLATFORM 0x13 + /* oAnimState */ + #define BOWSER_ANIM_STATE_OPAQUE TRANSPARENCY_ANIM_STATE_OPAQUE + #define BOWSER_ANIM_STATE_TRANSPARENT TRANSPARENCY_ANIM_STATE_TRANSPARENT + #define BOWSER_ANIM_STATE_INVISIBLE 0x02 + /* Animations */ + #define BOWSER_ANIM_STAND_UP 0x00 + #define BOWSER_ANIM_STAND_UP_UNUSED 0x01 // slightly different + #define BOWSER_ANIM_SHAKING 0x02 + #define BOWSER_ANIM_GRABBED 0x03 + #define BOWSER_ANIM_BROKEN 0x04 // broken animation + #define BOWSER_ANIM_FALL_DOWN 0x05 // unused + #define BOWSER_ANIM_BREATH 0x06 + #define BOWSER_ANIM_JUMP 0x07 // unused, short jump, replaced by start/stop + #define BOWSER_ANIM_JUMP_STOP 0x08 + #define BOWSER_ANIM_JUMP_START 0x09 + #define BOWSER_ANIM_DANCE 0x0A + #define BOWSER_ANIM_BREATH_UP 0x0B + #define BOWSER_ANIM_IDLE 0x0C + #define BOWSER_ANIM_SLOW_GAIT 0x0D + #define BOWSER_ANIM_LOOK_DOWN_STOP_WALK 0x0E + #define BOWSER_ANIM_LOOK_UP_START_WALK 0x0F + #define BOWSER_ANIM_FLIP_DOWN 0x10 + #define BOWSER_ANIM_LAY_DOWN 0x11 + #define BOWSER_ANIM_RUN_START 0x12 + #define BOWSER_ANIM_RUN 0x13 + #define BOWSER_ANIM_RUN_STOP 0x14 + #define BOWSER_ANIM_RUN_SLIP 0x15 + #define BOWSER_ANIM_BREATH_QUICK 0x16 + #define BOWSER_ANIM_EDGE_MOVE 0x17 + #define BOWSER_ANIM_EDGE_STOP 0x18 + #define BOWSER_ANIM_FLIP 0x19 + #define BOWSER_ANIM_STAND_UP_FROM_FLIP 0x1A + /* oBowserCamAct */ + #define BOWSER_CAM_ACT_IDLE 0x0 + #define BOWSER_CAM_ACT_WALK 0x1 + #define BOWSER_CAM_ACT_END 0x2 + /* oBowserStatus */ + #define BOWSER_STATUS_ANGLE_MARIO (1 << 1) // 0x00000002 + #define BOWSER_STATUS_ANGLE_CENTRE (1 << 2) // 0x00000004 + #define BOWSER_STATUS_DIST_MARIO (1 << 3) // 0x00000008 + #define BOWSER_STATUS_DIST_CENTRE (1 << 4) // 0x00000010 + #define BOWSER_STATUS_BIG_JUMP (1 << 16) // 0x00010000 + #define BOWSER_STATUS_FIRE_SKY (1 << 17) // 0x00020000 + /* oBowserGrabbedStatus */ + #define BOWSER_GRAB_STATUS_NONE 0x0 + #define BOWSER_GRAB_STATUS_GRABBED 0x1 + #define BOWSER_GRAB_STATUS_HOLDING 0x2 + /* oSubAction */ + /* BOWSER_ACT_THROWN */ + #define BOWSER_SUB_ACT_THROWN_BOUNCE 0x0 + #define BOWSER_SUB_ACT_THROWN_STOP 0x1 + /* BOWSER_ACT_DEAD */ + #define BOWSER_SUB_ACT_DEAD_FLY_BACK 0x0 + #define BOWSER_SUB_ACT_DEAD_BOUNCE 0x1 + #define BOWSER_SUB_ACT_DEAD_WAIT 0x2 + #define BOWSER_SUB_ACT_DEAD_DEFAULT_END 0x3 + #define BOWSER_SUB_ACT_DEAD_DEFAULT_END_OVER 0x4 + #define BOWSER_SUB_ACT_DEAD_FINAL_END 0xA + #define BOWSER_SUB_ACT_DEAD_FINAL_END_OVER 0xB + /* BOWSER_ACT_INTRO_WALK */ + #define BOWSER_SUB_ACT_INTRO_WALK_LOOK_UP 0x0 + #define BOWSER_SUB_ACT_INTRO_WALK_SLOWLY 0x1 + #define BOWSER_SUB_ACT_INTRO_WALK_STOP 0x2 + /* BOWSER_ACT_CHARGE_MARIO */ + #define BOWSER_SUB_ACT_CHARGE_START 0x0 + #define BOWSER_SUB_ACT_CHARGE_RUN 0x1 + #define BOWSER_SUB_ACT_CHARGE_END 0x2 + #define BOWSER_SUB_ACT_CHARGE_SLIP 0x3 + /* BOWSER_ACT_TELEPORT */ + #define BOWSER_SUB_ACT_TELEPORT_START 0x0 + #define BOWSER_SUB_ACT_TELEPORT_MOVE 0x1 + #define BOWSER_SUB_ACT_TELEPORT_STOP 0x2 + /* BOWSER_ACT_SPIT_FIRE_ONTO_FLOOR */ + #define BOWSER_SUB_ACT_SPIT_FIRE_FLOOR_START 0x0 + #define BOWSER_SUB_ACT_SPIT_FIRE_FLOOR_STOP 0x1 + /* BOWSER_ACT_HIT_EDGE */ + #define BOWSER_SUB_ACT_HIT_EDGE_START 0x0 + #define BOWSER_SUB_ACT_HIT_EDGE_STOP 0x1 + /* BOWSER_ACT_TURN_FROM_EDGE */ + #define BOWSER_SUB_ACT_TURN_FROM_EDGE_START 0x0 + #define BOWSER_SUB_ACT_TURN_FROM_EDGE_STOP 0x1 + #define BOWSER_SUB_ACT_TURN_FROM_EDGE_END 0x2 + /* BOWSER_ACT_HIT_MINE */ + #define BOWSER_SUB_ACT_HIT_MINE_START 0x0 + #define BOWSER_SUB_ACT_HIT_MINE_FALL 0x1 + #define BOWSER_SUB_ACT_HIT_MINE_STOP 0x2 + /* BOWSER_ACT_JUMP_ONTO_STAGE */ + #define BOWSER_SUB_ACT_JUMP_ON_STAGE_IDLE 0x0 + #define BOWSER_SUB_ACT_JUMP_ON_STAGE_START 0x1 + #define BOWSER_SUB_ACT_JUMP_ON_STAGE_LAND 0x2 + #define BOWSER_SUB_ACT_JUMP_ON_STAGE_STOP 0x3 + /* BOWSER_ACT_BIG_JUMP */ + #define BOWSER_SUB_ACT_BIG_JUMP_START 0x0 + #define BOWSER_SUB_ACT_BIG_JUMP_LAND 0x1 + #define BOWSER_SUB_ACT_BIG_JUMP_STOP 0x2 + /* BOWSER_ACT_WALK_TO_MARIO */ + #define BOWSER_SUB_ACT_WALK_TO_MARIO_START 0x0 + #define BOWSER_SUB_ACT_WALK_TO_MARIO_WALKING 0x1 + #define BOWSER_SUB_ACT_WALK_TO_MARIO_STOP 0x2 + /* BOWSER_ACT_QUICK_JUMP */ + #define BOWSER_SUB_ACT_QUICK_JUMP_START 0x0 + #define BOWSER_SUB_ACT_QUICK_JUMP_LAND 0x1 + #define BOWSER_SUB_ACT_QUICK_JUMP_STOP 0x2 + +/* Bowser BITS Platform */ + /* oAction */ + #define BOWSER_BITS_PLAT_ACT_START 0x0 + #define BOWSER_BITS_PLAT_ACT_CHECK 0x1 + #define BOWSER_BITS_PLAT_ACT_FALL 0x2 + /* oSubAction */ + /* BOWSER_BITS_PLAT_ACT_CHECK */ + #define BOWSER_BITS_PLAT_SUB_ACT_CHECK_RESET_TIMER 0x0 + #define BOWSER_BITS_PLAT_SUB_ACT_CHECK_DEBUG_FALL 0x1 + +/* Bowser Flame */ + /* oAction */ + #define BOWSER_FLAME_ACT_FLOATING 0x0 + #define BOWSER_FLAME_ACT_LANDED 0x1 + +/* Blue Bowser Flame */ + /* oBehParams2ndByte */ + #define BOWSER_FLAME_BLUE_BP_SPAWN_RED_FLAMES 0x0 + #define BOWSER_FLAME_BLUE_BP_SPAWN_BLUE_FLAMES 0x1 + +/* Bowser Floating Flame */ + /* oBehParams2ndByte */ + #define BOWSER_FLOATING_FLAME_SPAWN_RED_FLAME 0x0 + #define BOWSER_FLOATING_FLAME_SPAWN_BLUE_FLAME_1 0x1 + #define BOWSER_FLOATING_FLAME_SPAWN_BLUE_FLAME_2 0x2 + +/* Bowser Key */ + /* oAction */ + #define BOWSER_KEY_ACT_BOUNCING 0x0 + #define BOWSER_KEY_ACT_LANDED 0x1 + +/* Bowser Key Cutscene */ + /* Animations */ + #define BOWSER_KEY_CUTSCENE_ANIM_UNLOCK_DOOR 0x0 + #define BOWSER_KEY_CUTSCENE_ANIM_COURSE_EXIT 0x1 /* Fish Spawer */ - /* oAction */ - #define FISH_SPAWNER_ACT_SPAWN 0 - #define FISH_SPAWNER_ACT_IDLE 1 - #define FISH_SPAWNER_ACT_RESPAWN 2 /* oBehParams2ndByte */ - #define FISH_SPAWNER_BP_MANY_BLUE 0 - #define FISH_SPAWNER_BP_FEW_BLUE 1 - #define FISH_SPAWNER_BP_MANY_CYAN 2 - #define FISH_SPAWNER_BP_FEW_CYAN 3 + #define FISH_SPAWNER_BP_MANY_BLUE 0x0 + #define FISH_SPAWNER_BP_FEW_BLUE 0x1 + #define FISH_SPAWNER_BP_MANY_CYAN 0x2 + #define FISH_SPAWNER_BP_FEW_CYAN 0x3 + /* oAction */ + #define FISH_SPAWNER_ACT_SPAWN 0x0 + #define FISH_SPAWNER_ACT_IDLE 0x1 + #define FISH_SPAWNER_ACT_RESPAWN 0x2 /* Fish */ /* oAction */ - #define FISH_ACT_INIT 0 - #define FISH_ACT_ROAM 1 - #define FISH_ACT_FLEE 2 - -/* Blue_Fish */ - /* oAction */ - #define BLUE_FISH_ACT_DIVE 0 - #define BLUE_FISH_ACT_TURN 1 - #define BLUE_FISH_ACT_ASCEND 2 - #define BLUE_FISH_ACT_TURN_BACK 3 + #define FISH_ACT_INIT 0x0 + #define FISH_ACT_ROAM 0x1 + #define FISH_ACT_FLEE 0x2 + /* Animations */ + #define FISH_ANIM_DEFAULT 0x0 +/* Blue Fish Spawner */ /* oAction: bhv_blue_fish_spawn_loop */ - #define BLUE_FISH_ACT_SPAWN 0 - #define BLUE_FISH_ACT_ROOM 1 - #define BLUE_FISH_ACT_DUPLICATE 2 + #define BLUE_FISH_ACT_SPAWN 0x0 + #define BLUE_FISH_ACT_ROOM 0x1 + #define BLUE_FISH_ACT_DUPLICATE 0x2 + +/* Blue Fish */ + /* oAction */ + #define BLUE_FISH_ACT_DIVE 0x0 + #define BLUE_FISH_ACT_TURN 0x1 + #define BLUE_FISH_ACT_ASCEND 0x2 + #define BLUE_FISH_ACT_TURN_BACK 0x3 + /* Animations */ + #define BLUE_FISH_ANIM_DEFAULT 0x0 + +/* Blue Fish */ + /* oAction */ + #define BLUE_FISH_ACT_DIVE 0x0 + #define BLUE_FISH_ACT_TURN 0x1 + #define BLUE_FISH_ACT_ASCEND 0x2 + #define BLUE_FISH_ACT_TURN_BACK 0x3 + /* Animations */ + #define BLUE_FISH_ANIM_DEFAULT 0x0 + +/* Cheep Cheep Spawner */ + /* oAction */ + #define BUB_SPAWNER_ACT_SPAWN_BUBS 0x0 + #define BUB_SPAWNER_ACT_IDLE 0x1 + #define BUB_SPAWNER_ACT_REMOVE_BUBS 0x2 + #define BUB_SPAWNER_ACT_RESET 0x3 + +/* Cheep Cheep */ + /* oAction */ + #define BUB_ACT_INIT 0x0 + #define BUB_ACT_SWIMMING_TOWARDS_MARIO 0x1 + #define BUB_ACT_SWIMMING_AWAY_FROM_MARIO 0x2 + /* Animations */ + #define BUB_ANIM_SWIM 0x0 + +/* Bubba */ + /* oAction */ + #define BUBBA_ACT_IDLE 0x0 + #define BUBBA_ACT_ATTACK 0x1 + /* oAnimState */ + #define BUBBA_ANIM_STATE_CLOSED_MOUTH 0x0 + #define BUBBA_ANIM_STATE_OPEN_MOUTH 0x1 + +/* Seaweed */ + /* Animations */ + #define SEAWEED_ANIM_WAVE 0x0 + +/* Clam */ + /* oAction */ + #define CLAM_ACT_CLOSING 0x0 + #define CLAM_ACT_OPENING 0x1 + /* Animations */ + #define CLAM_ANIM_CLOSING 0x0 + #define CLAM_ANIM_OPENING 0x1 + +/* Purple Switch */ + /* oBehParams2ndByte */ + #define PURPLE_SWITCH_BP_NO_TICK 0x0 + #define PURPLE_SWITCH_BP_ANIMATES 0x1 + #define PURPLE_SWITCH_BP_REVEAL_HIDDEN 0x2 + /* oAction */ + #define PURPLE_SWITCH_ACT_IDLE 0x0 + #define PURPLE_SWITCH_ACT_PRESSED 0x1 + #define PURPLE_SWITCH_ACT_TICKING 0x2 + #define PURPLE_SWITCH_ACT_UNPRESSED 0x3 + #define PURPLE_SWITCH_ACT_WAIT_FOR_MARIO_TO_GET_OFF 0x4 + +/* Animates on Floor Switch */ + /* oBehParams2ndByte */ + #define ANIMATES_ON_FLOOR_SWITCH_BP_BITS_STAIRS 0x0 + #define ANIMATES_ON_FLOOR_SWITCH_BP_BITDW_STAIRS 0x1 + #define ANIMATES_ON_FLOOR_SWITCH_BP_RR_TRIGANGLES 0x2 + +/* Openable Grill */ + /* oBehParams2ndByte */ + #define OPENABLE_GRILL_BP_BOB 0x0 + #define OPENABLE_GRILL_BP_HMC 0x1 + /* oAction */ + #define OEPNABLE_GRILL_ACT_SPAWN 0x0 + #define OEPNABLE_GRILL_IDLE_CLOSED 0x1 + #define OEPNABLE_GRILL_OPENING 0x2 + #define OEPNABLE_GRILL_IDLE_OPEN 0x3 + +/* Openable Grill Door */ + /* oBehParams2ndByte */ + #define OPENABLE_GRILL_DOOR_BP_SIDE_FLIPPED -0x1 + #define OPENABLE_GRILL_DOOR_BP_SIDE_UNFLIPPED 0x1 + /* oAction */ + #define OPENABLE_GRILL_DOOR_ACT_CLOSED 0x0 + #define OPENABLE_GRILL_DOOR_ACT_OPENING 0x1 + #define OPENABLE_GRILL_DOOR_ACT_OPEN 0x2 + +/* Breakable Box */ + /* oBehParams2ndByte */ + #define BREAKABLE_BOX_BP_NO_COINS 0x0 + #define BREAKABLE_BOX_BP_3_COINS 0x1 + #define BREAKABLE_BOX_BP_5_COINS 0x2 + #define BREAKABLE_BOX_BP_LARGE 0x3 + /* oAction */ + #define BREAKABLE_BOX_ACT_HIDDEN 0x0 + #define BREAKABLE_BOX_ACT_ACTIVE 0x1 + #define BREAKABLE_BOX_ACT_BROKEN 0x2 + /* oAnimState */ + #define BREAKABLE_BOX_ANIM_STATE_CRAZY_BOX 0x0 + #define BREAKABLE_BOX_ANIM_STATE_CORK_BOX 0x1 + +/* Small Breakable Box */ + /* oAction */ + #define BREAKABLE_BOX_SMALL_ACT_MOVE 0x0 + +/* Jumping Box */ + /* oAction */ + #define JUMPING_BOX_ACT_IDLE 0x0 + #define JUMPING_BOX_ACT_DROPPED 0x1 + /* oSubAction */ + /* JUMPING_BOX_ACT_IDLE */ + #define JUMPING_BOX_SUB_ACT_IDLE_BOUNCING 0x0 + #define JUMPING_BOX_SUB_ACT_IDLE_RESET_TIMER 0x1 + +/* Exclamation Box */ + /* oBehParams2ndByte, ExclamationBoxContents->id */ + #define EXCLAMATION_BOX_BP_WING_CAP 0x0 + #define EXCLAMATION_BOX_BP_METAL_CAP 0x1 + #define EXCLAMATION_BOX_BP_VANISH_CAP 0x2 + #define EXCLAMATION_BOX_BP_KOOPA_SHELL 0x3 + #define EXCLAMATION_BOX_BP_COINS_1 0x4 + #define EXCLAMATION_BOX_BP_COINS_3 0x5 + #define EXCLAMATION_BOX_BP_COINS_10 0x6 + #define EXCLAMATION_BOX_BP_1UP_WALKING 0x7 + #define EXCLAMATION_BOX_BP_STAR_1 0x8 + #define EXCLAMATION_BOX_BP_1UP_RUNNING_AWAY 0x9 + #define EXCLAMATION_BOX_BP_STAR_2 0xA + #define EXCLAMATION_BOX_BP_STAR_3 0xB + #define EXCLAMATION_BOX_BP_STAR_4 0xC + #define EXCLAMATION_BOX_BP_STAR_5 0xD + #define EXCLAMATION_BOX_BP_STAR_6 0xE + #define EXCLAMATION_BOX_BP_NULL 0x63 + /* oAction */ + #define EXCLAMATION_BOX_ACT_INIT 0x0 + #define EXCLAMATION_BOX_ACT_OUTLINE 0x1 + #define EXCLAMATION_BOX_ACT_ACTIVE 0x2 + #define EXCLAMATION_BOX_ACT_SCALING 0x3 + #define EXCLAMATION_BOX_ACT_EXPLODE 0x4 + #define EXCLAMATION_BOX_ACT_WAIT_FOR_RESPAWN 0x5 + /* oAnimState */ + #define EXCLAMATION_BOX_ANIM_STATE_RED 0x0 + #define EXCLAMATION_BOX_ANIM_STATE_GREEN 0x1 + #define EXCLAMATION_BOX_ANIM_STATE_BLUE 0x2 + #define EXCLAMATION_BOX_ANIM_STATE_YELLOW 0x3 + +/* Cap Switch */ + /* oAction */ + #define CAP_SWITCH_ACT_INIT 0x0 + #define CAP_SWITCH_ACT_IDLE 0x1 + #define CAP_SWITCH_ACT_BEING_PRESSED 0x2 + #define CAP_SWITCH_ACT_DONE 0x3 + +/* Mario Cap */ + /* oAction */ + #define CAP_ACT_MOVE 0x0 + #define CAP_ACT_QUICKSAND 0xA + #define CAP_ACT_MOVING_QUICKSAND 0xB + #define CAP_ACT_INSTANT_QUICKSAND 0xC + #define CAP_ACT_INSTANT_MOVING_QUICKSAND 0xD + +/* Koopa Shell */ + /* oAction */ + #define KOOPA_SHELL_ACT_MARIO_NOT_RIDING 0x0 + #define KOOPA_SHELL_ACT_MARIO_RIDING 0x1 + +/* Koopa Shell Underwater */ + /* oAction */ + #define KOOPA_SHELL_UNDERWATER_ACT_DEFAULT 0x0 /* Cannon Trap Door */ /* oAction */ - #define CANNON_TRAP_DOOR_ACT_CLOSED 0 - #define CANNON_TRAP_DOOR_ACT_CAM_ZOOM 1 - #define CANNON_TRAP_DOOR_ACT_OPENING 2 - #define CANNON_TRAP_DOOR_ACT_OPEN 3 + #define CANNON_TRAP_DOOR_ACT_CLOSED 0x0 + #define CANNON_TRAP_DOOR_ACT_CAM_ZOOM 0x1 + #define CANNON_TRAP_DOOR_ACT_OPENING 0x2 + #define CANNON_TRAP_DOOR_ACT_OPEN 0x3 + +/* Opened Cannon */ + /* oAction */ + #define OPENED_CANNON_ACT_IDLE 0x0 + #define OPENED_CANNON_ACT_READY 0x1 + #define OPENED_CANNON_ACT_SHOOT 0x2 + #define OPENED_CANNON_ACT_RESETTING 0x3 + #define OPENED_CANNON_ACT_RISING 0x4 + #define OPENED_CANNON_ACT_RAISE_BARREL 0x5 + #define OPENED_CANNON_ACT_TURNING_YAW 0x6 + +/* Door */ + /* oAction */ + #define DOOR_ACT_CLOSED 0x0 + #define DOOR_ACT_PULLED 0x1 + #define DOOR_ACT_PUSHED 0x2 + #define DOOR_ACT_WARP_PULLED 0x3 + #define DOOR_ACT_WARP_PUSHED 0x4 + /* Animations */ + #define DOOR_ANIM_CLOSED 0x0 + #define DOOR_ANIM_PULLED 0x1 + #define DOOR_ANIM_PUSHED 0x2 + #define DOOR_ANIM_WARP_PULLED 0x3 + #define DOOR_ANIM_WARP_PUSHED 0x4 + +/* Star Door */ + /* oAction */ + #define STAR_DOOR_ACT_CLOSED 0x0 + #define STAR_DOOR_ACT_OPENING 0x1 + #define STAR_DOOR_ACT_OPEN 0x2 + #define STAR_DOOR_ACT_CLOSING 0x3 + #define STAR_DOOR_ACT_RESET 0x4 + +/* Castle Trap Door */ + /* oAction */ + #define CASTLE_FLOOR_TRAP_ACT_OPEN_DETECT 0x0 + #define CASTLE_FLOOR_TRAP_ACT_OPEN 0x1 + #define CASTLE_FLOOR_TRAP_ACT_CLOSE_DETECT 0x2 + #define CASTLE_FLOOR_TRAP_ACT_CLOSE 0x3 + #define CASTLE_FLOOR_TRAP_ACT_ROTATE 0x4 + +/* Castle Flag */ + /* Animations */ + #define CASTLE_FLAG_ANIM_WAVE 0x0 /* Homing Amp */ /* oAction */ - #define HOMING_AMP_ACT_INACTIVE 0 - #define HOMING_AMP_ACT_APPEAR 1 - #define HOMING_AMP_ACT_CHASE 2 - #define HOMING_AMP_ACT_GIVE_UP 3 - #define HOMING_AMP_ACT_ATTACK_COOLDOWN 4 + #define HOMING_AMP_ACT_INACTIVE 0x0 + #define HOMING_AMP_ACT_APPEAR 0x1 + #define HOMING_AMP_ACT_CHASE 0x2 + #define HOMING_AMP_ACT_GIVE_UP 0x3 + #define HOMING_AMP_ACT_ATTACK_COOLDOWN 0x4 /* Amp */ /* oBehParams2ndByte */ - #define AMP_BP_ROT_RADIUS_200 0 - #define AMP_BP_ROT_RADIUS_300 1 - #define AMP_BP_ROT_RADIUS_400 2 - #define AMP_BP_ROT_RADIUS_0 3 - + #define AMP_BP_ROT_RADIUS_200 0x0 + #define AMP_BP_ROT_RADIUS_300 0x1 + #define AMP_BP_ROT_RADIUS_400 0x2 + #define AMP_BP_ROT_RADIUS_0 0x3 /* oAction */ - #define AMP_ACT_IDLE 2 - #define AMP_ACT_ATTACK_COOLDOWN 4 + #define AMP_ACT_IDLE 0x2 + #define AMP_ACT_ATTACK_COOLDOWN 0x4 + /* oAnimState */ + #define AMP_ANIM_STATE_OFF 0x0 + #define AMP_ANIM_STATE_ON 0x1 + /* Animations */ + #define AMP_ANIM_DEFAULT 0x0 /* Butterfly */ /* oAction */ - #define BUTTERFLY_ACT_RESTING 0 - #define BUTTERFLY_ACT_FOLLOW_MARIO 1 - #define BUTTERFLY_ACT_RETURN_HOME 2 + #define BUTTERFLY_ACT_RESTING 0x0 + #define BUTTERFLY_ACT_FOLLOW_MARIO 0x1 + #define BUTTERFLY_ACT_RETURN_HOME 0x2 + /* Animations */ + #define BUTTERFLY_ANIM_FLYING 0x0 + #define BUTTERFLY_ANIM_RESTING 0x1 /* Hoot */ - /* oHootAvailability */ - #define HOOT_AVAIL_ASLEEP_IN_TREE 0 - #define HOOT_AVAIL_WANTS_TO_TALK 1 - #define HOOT_AVAIL_READY_TO_FLY 2 /* oAction */ - #define HOOT_ACT_ASCENT 0 - #define HOOT_ACT_CARRY 1 - #define HOOT_ACT_TIRED 2 + #define HOOT_ACT_ASCENT 0x0 + #define HOOT_ACT_CARRY 0x1 + #define HOOT_ACT_TIRED 0x2 + /* oHootAvailability */ + #define HOOT_AVAIL_ASLEEP_IN_TREE 0x0 + #define HOOT_AVAIL_WANTS_TO_TALK 0x1 + #define HOOT_AVAIL_READY_TO_FLY 0x2 + /* Animations */ + #define HOOT_ANIM_DEFAULT 0x0 + #define HOOT_ANIM_HOLDING_MARIO 0x1 /* Bully (all variants) */ /* oBehParams2ndByte */ - #define BULLY_BP_SIZE_SMALL 0 - #define BULLY_BP_SIZE_BIG 1 + #define BULLY_BP_SIZE_SMALL 0x0 + #define BULLY_BP_SIZE_BIG 0x1 /* oAction */ - #define BULLY_ACT_PATROL 0 - #define BULLY_ACT_CHASE_MARIO 1 - #define BULLY_ACT_KNOCKBACK 2 - #define BULLY_ACT_BACK_UP 3 - #define BULLY_ACT_INACTIVE 4 - #define BULLY_ACT_ACTIVATE_AND_FALL 5 + #define BULLY_ACT_PATROL 0x0 + #define BULLY_ACT_CHASE_MARIO 0x1 + #define BULLY_ACT_KNOCKBACK 0x2 + #define BULLY_ACT_BACK_UP 0x3 + #define BULLY_ACT_INACTIVE 0x4 + #define BULLY_ACT_ACTIVATE_AND_FALL 0x5 /* oBullySubtype */ - #define BULLY_STYPE_GENERIC 0 - #define BULLY_STYPE_MINION 1 - #define BULLY_STYPE_CHILL 16 + #define BULLY_STYPE_GENERIC 0x00 + #define BULLY_STYPE_MINION 0x01 + #define BULLY_STYPE_CHILL 0x10 + /* Animations */ + #define BULLY_ANIM_WALKING 0x0 + #define BULLY_ANIM_RUNNING 0x1 + #define BULLY_ANIM_UNUSED 0x2 + #define BULLY_ANIM_BOAST 0x3 /* Water Ring (all variants) */ /* oAction */ - #define WATER_RING_ACT_NOT_COLLECTED 0 - #define WATER_RING_ACT_COLLECTED 1 + #define WATER_RING_ACT_NOT_COLLECTED 0x0 + #define WATER_RING_ACT_COLLECTED 0x1 + /* Animations */ + #define WATER_RING_ANIM_WOBBLE 0x0 /* Jet Stream Water Ring Spawner */ /* oAction */ - #define JS_RING_SPAWNER_ACT_ACTIVE 0 - #define JS_RING_SPAWNER_ACT_INACTIVE 1 + #define JS_RING_SPAWNER_ACT_ACTIVE 0x0 + #define JS_RING_SPAWNER_ACT_INACTIVE 0x1 + +/* Hidden Star */ + /* oAction */ + #define HIDDEN_STAR_ACT_INACTIVE 0x0 + #define HIDDEN_STAR_ACT_ACTIVE 0x1 + +/* Spawn Star stay at position cutscene */ + /* oBehParams2ndByte */ + #define SPAWN_STAR_POS_CUTSCENE_BP_SPAWN_AT_MARIO 0x0 + #define SPAWN_STAR_POS_CUTSCENE_BP_SPAWN_AT_HOME 0x1 + /* oAction */ + #define SPAWN_STAR_POS_CUTSCENE_ACT_START 0x0 + #define SPAWN_STAR_POS_CUTSCENE_ACT_BOUNCE 0x1 + #define SPAWN_STAR_POS_CUTSCENE_ACT_END 0x2 + #define SPAWN_STAR_POS_CUTSCENE_ACT_SLOW_STAR_ROTATION 0x3 + +/* Spawn Star arc to position cutscene */ + /* oBehParams2ndByte */ + #define SPAWN_STAR_ARC_CUTSCENE_BP_DEFAULT_STAR 0x0 + #define SPAWN_STAR_ARC_CUTSCENE_BP_HIDDEN_STAR 0x1 + /* oAction */ + #define SPAWN_STAR_ARC_CUTSCENE_ACT_START 0x0 + #define SPAWN_STAR_ARC_CUTSCENE_ACT_GO_TO_HOME 0x1 + #define SPAWN_STAR_ARC_CUTSCENE_ACT_BOUNCE 0x2 + #define SPAWN_STAR_ARC_CUTSCENE_ACT_END 0x3 /* Celebration Star */ /* oAction */ - #define CELEB_STAR_ACT_SPIN_AROUND_MARIO 0 - #define CELEB_STAR_ACT_FACE_CAMERA 1 + #define CELEB_STAR_ACT_SPIN_AROUND_MARIO 0x0 + #define CELEB_STAR_ACT_FACE_CAMERA 0x1 + +/* Grand Star */ + /* oAction */ + #define GRAND_STAR_ACT_APPEAR 0x0 + #define GRAND_STAR_ACT_JUMP 0x1 + #define GRAND_STAR_ACT_WAIT_FOR_INTERACTION 0x2 + /* oSubAction */ + /* GRAND_STAR_ACT_JUMP */ + #define GRAND_STAR_SUB_ACT_START_JUMP 0x0 + #define GRAND_STAR_SUB_ACT_CONTINUE_JUMP 0x1 /* LLL Drawbridge */ /* oAction */ - #define LLL_DRAWBRIDGE_ACT_LOWER 0 - #define LLL_DRAWBRIDGE_ACT_RAISE 1 + #define LLL_DRAWBRIDGE_ACT_LOWER 0x0 + #define LLL_DRAWBRIDGE_ACT_RAISE 0x1 + +/* LLL Volcano Trap */ + /* oAction */ + #define LLL_VOLCANO_TRAP_ACT_WAIT 0x0 + #define LLL_VOLCANO_TRAP_ACT_FALL 0x1 + #define LLL_VOLCANO_TRAP_ACT_LAND 0x2 + #define LLL_VOLCANO_TRAP_ACT_RISE 0x3 + +/* LLL Floating Wood Bridge */ + /* oAction */ + #define LLL_FLOATING_WOOD_ACT_INACTIVE 0x0 + #define LLL_FLOATING_WOOD_ACT_ACTIVE 0x1 + #define LLL_FLOATING_WOOD_ACT_REMOVE_PIECES 0x2 + +/* LLL Hexagonal Ring */ + /* oAction */ + #define LLL_HEXAGONAL_RING_ACT_MARIO_OFF_PLATFORM 0x0 + #define LLL_HEXAGONAL_RING_ACT_MARIO_ON_PLATFORM 0x1 + #define LLL_HEXAGONAL_RING_ACT_SPAWN_FLAMES 0x2 + #define LLL_HEXAGONAL_RING_ACT_MARIO_LEFT_PLATFORM 0x3 + #define LLL_HEXAGONAL_RING_ACT_RESET 0x4 + +/* LLL Octagonal Rotating Mesh */ + /* oAction */ + #define LLL_OCTAGONAL_ROTATING_MESH_ACT_RESET 0x0 + #define LLL_OCTAGONAL_ROTATING_MESH_ACT_MOVE 0x1 + +/* LLL Fire Bar */ + /* oBehParams2ndByte */ + #define LLL_FIRE_BAR_BP_DEFAULT 0x4 + /* oAction */ + #define LLL_FIRE_BAR_ACT_INACTIVE 0x0 + #define LLL_FIRE_BAR_ACT_SPAWN_FLAMES 0x1 + #define LLL_FIRE_BAR_ACT_ACTIVE 0x2 + #define LLL_FIRE_BAR_ACT_REMOVE_FLAMES 0x3 + +/* BITFS Sinking Cage Platform with pole */ + /* oBehParams2ndByte */ + #define SINKING_POLE_PLATFORM_BP_LOW 0x0 + #define SINKING_POLE_PLATFORM_BP_HIGH 0x1 + +/* Tumbling Bridge Platform */ + /* oAction */ + #define TUMBLING_BRIDGE_PLATFORM_ACT_IDLE 0x0 + #define TUMBLING_BRIDGE_PLATFORM_ACT_UNSTABLE 0x1 + #define TUMBLING_BRIDGE_PLATFORM_ACT_FALL 0x2 + #define TUMBLING_BRIDGE_PLATFORM_ACT_END 0x3 + +/* Tumbling Bridge */ + /* oBehParams2ndByte, bridgeID */ + #define TUMBLING_BRIDGE_BP_WF 0x0 + #define TUMBLING_BRIDGE_BP_BBH 0x1 + #define TUMBLING_BRIDGE_BP_LLL 0x2 + #define TUMBLING_BRIDGE_BP_BITFS 0x3 + /* oAction */ + #define TUMBLING_BRIDGE_ACT_FAR 0x0 + #define TUMBLING_BRIDGE_ACT_SPAWN_SECTIONS 0x1 + #define TUMBLING_BRIDGE_ACT_NEAR 0x2 + #define TUMBLING_BRIDGE_ACT_RESET 0x3 /* Bomp (both variants) */ /* oAction */ - #define BOMP_ACT_WAIT 0 - #define BOMP_ACT_POKE_OUT 1 - #define BOMP_ACT_EXTEND 2 - #define BOMP_ACT_RETRACT 3 + #define BOMP_ACT_WAIT 0x0 + #define BOMP_ACT_POKE_OUT 0x1 + #define BOMP_ACT_EXTEND 0x2 + #define BOMP_ACT_RETRACT 0x3 + +/* WF Tower Platform Group */ + /* oAction */ + #define WF_TOWER_PLATFORM_GROUP_ACT_INACTIVE 0x0 + #define WF_TOWER_PLATFORM_GROUP_ACT_SPAWN_PLATFORMS 0x1 + #define WF_TOWER_PLATFORM_GROUP_ACT_ACTIVE 0x2 + #define WF_TOWER_PLATFORM_GROUP_ACT_REMOVE_PLATFORMS 0x3 + +/* WF Tower Sliding Platform */ + /* oAction */ + #define WF_TOWER_SLIDING_PLATFORM_ACT_BACKWARD 0x0 + #define WF_TOWER_SLIDING_PLATFORM_ACT_FORWARD 0x1 + +/* WF Tower Elevator Platform */ + /* oAction */ + #define WF_TOWER_ELEVATOR_PLATFORM_ACT_BOTTOM 0x0 + #define WF_TOWER_ELEVATOR_PLATFORM_ACT_MOVING_UP 0x1 + #define WF_TOWER_ELEVATOR_PLATFORM_ACT_TOP 0x2 + #define WF_TOWER_ELEVATOR_PLATFORM_ACT_MOVING_DOWN 0x3 /* WF Sliding Brick Platform */ /* oBehParams2ndByte */ - #define WF_SLID_BRICK_PTFM_BP_MOV_VEL_10 1 - #define WF_SLID_BRICK_PTFM_BP_MOV_VEL_15 2 - #define WF_SLID_BRICK_PTFM_BP_MOV_VEL_20 3 + #define WF_SLID_BRICK_PTFM_BP_MOV_VEL_10 0x1 + #define WF_SLID_BRICK_PTFM_BP_MOV_VEL_15 0x2 + #define WF_SLID_BRICK_PTFM_BP_MOV_VEL_20 0x3 /* oAction */ - #define WF_SLID_BRICK_PTFM_ACT_WAIT 0 - #define WF_SLID_BRICK_PTFM_ACT_EXTEND 1 - #define WF_SLID_BRICK_PTFM_ACT_RETRACT 2 + #define WF_SLID_BRICK_PTFM_ACT_WAIT 0x0 + #define WF_SLID_BRICK_PTFM_ACT_EXTEND 0x1 + #define WF_SLID_BRICK_PTFM_ACT_RETRACT 0x2 + +/* Sliding Platform */ + #define SLIDING_PLATFORM_TYPE_MASK 0x0380 + #define SLIDING_PLATFORM_LENGTH_MASK 0x003F + #define SLIDING_PLATFORM_DIRECTION_MASK 0x0040 + /* collisionDataIndex */ + #define SLIDING_PLATFORM_BP_BITS_SLIDING_PLATFORM 0x0 + #define SLIDING_PLATFORM_BP_BITS_TWIN_SLIDING_PLATFORMS 0x1 + #define SLIDING_PLATFORM_BP_BITFS_MOVING_SQUARE 0x2 + #define SLIDING_PLATFORM_BP_BITFS_SLIDING_PLATFORM 0x3 + #define SLIDING_PLATFORM_BP_RR_SLIDING_PLATFORM 0x4 + #define SLIDING_PLATFORM_BP_RR_PYRAMID 0x5 + #define SLIDING_PLATFORM_BP_NULL 0x6 + #define SLIDING_PLATFORM_BP_BITDW_SLIDING_PLATFORM 0x7 + +/* BITDW Pyramid Platforms */ + /* oAction */ + #define BITDW_PYRAMID_PLATFORM_ACT_INIT_DIRECTION 0x0 + #define BITDW_PYRAMID_PLATFORM_ACT_MOVE_0 0x1 + #define BITDW_PYRAMID_PLATFORM_ACT_MOVE_90 0x2 + #define BITDW_PYRAMID_PLATFORM_ACT_MOVE_180 0x3 + #define BITDW_PYRAMID_PLATFORM_ACT_MOVE_270 0x4 + +/* Rotating Platform */ + /* oAction */ + #define ROTATING_PLATFORM_ACT_STOPPED 0x0 + #define ROTATING_PLATFORM_ACT_MOVING 0x1 + +/* Seesaw Platform */ + /* oBehParams2ndByte */ + #define SEESAW_PLATFORM_BP_BITDW 0x0 + #define SEESAW_PLATFORM_BP_BITS 0x1 + #define SEESAW_PLATFORM_BP_BITS_W_SHAPED 0x2 + #define SEESAW_PLATFORM_BP_BOB_BRIDGE 0x3 + #define SEESAW_PLATFORM_BP_BITFS 0x4 + #define SEESAW_PLATFORM_BP_RR 0x5 + #define SEESAW_PLATFORM_BP_RR_L_SHAPED 0x6 + #define SEESAW_PLATFORM_BP_VCUTM 0x7 /* Fake Moneybag Coin */ /* oAction */ - #define FAKE_MONEYBAG_COIN_ACT_IDLE 0 - #define FAKE_MONEYBAG_COIN_ACT_TRANSFORM 1 + #define FAKE_MONEYBAG_COIN_ACT_IDLE 0x0 + #define FAKE_MONEYBAG_COIN_ACT_TRANSFORM 0x1 /* Moneybag */ /* oAction */ - #define MONEYBAG_ACT_APPEAR 0 - #define MONEYBAG_ACT_UNUSED_APPEAR 1 - #define MONEYBAG_ACT_MOVE_AROUND 2 - #define MONEYBAG_ACT_RETURN_HOME 3 - #define MONEYBAG_ACT_DISAPPEAR 4 - #define MONEYBAG_ACT_DEATH 5 + #define MONEYBAG_ACT_APPEAR 0x0 + #define MONEYBAG_ACT_UNUSED_APPEAR 0x1 + #define MONEYBAG_ACT_MOVE_AROUND 0x2 + #define MONEYBAG_ACT_RETURN_HOME 0x3 + #define MONEYBAG_ACT_DISAPPEAR 0x4 + #define MONEYBAG_ACT_DEATH 0x5 /* oMoneybagJumpState */ - #define MONEYBAG_JUMP_LANDING 0 - #define MONEYBAG_JUMP_PREPARE 1 - #define MONEYBAG_JUMP_JUMP 2 - #define MONEYBAG_JUMP_JUMP_AND_BOUNCE 3 - #define MONEYBAG_JUMP_WALK_AROUND 4 - #define MONEYBAG_JUMP_WALK_HOME 5 + #define MONEYBAG_JUMP_LANDING 0x0 + #define MONEYBAG_JUMP_PREPARE 0x1 + #define MONEYBAG_JUMP_JUMP 0x2 + #define MONEYBAG_JUMP_JUMP_AND_BOUNCE 0x3 + #define MONEYBAG_JUMP_WALK_AROUND 0x4 + #define MONEYBAG_JUMP_WALK_HOME 0x5 + /* Animations */ + #define MONEYBAG_ANIM_IDLE 0x0 + #define MONEYBAG_ANIM_PREPARE_JUMP 0x1 + #define MONEYBAG_ANIM_JUMP 0x2 + #define MONEYBAG_ANIM_LAND 0x3 + #define MONEYBAG_ANIM_WALK 0x4 /* Bowling Ball */ /* oAction */ - #define BBALL_ACT_INITIALIZE 0 - #define BBALL_ACT_ROLL 1 + #define BBALL_ACT_INITIALIZE 0x0 + #define BBALL_ACT_ROLL 0x1 /* Bowling Ball + Bowling Ball Spawner (all variants) */ /* oBehParams2ndByte */ - #define BBALL_BP_STYPE_BOB_UPPER 0 - #define BBALL_BP_STYPE_TTM 1 - #define BBALL_BP_STYPE_BOB_LOWER 2 - #define BBALL_BP_STYPE_THI_LARGE 3 - #define BBALL_BP_STYPE_THI_SMALL 4 + #define BBALL_BP_STYPE_BOB_UPPER 0x0 + #define BBALL_BP_STYPE_TTM 0x1 + #define BBALL_BP_STYPE_BOB_LOWER 0x2 + #define BBALL_BP_STYPE_THI_LARGE 0x3 + #define BBALL_BP_STYPE_THI_SMALL 0x4 /* Bowling Ball (Free) */ /* oAction */ - #define FREE_BBALL_ACT_IDLE 0 - #define FREE_BBALL_ACT_ROLL 1 - #define FREE_BBALL_ACT_RESET 2 + #define FREE_BBALL_ACT_IDLE 0x0 + #define FREE_BBALL_ACT_ROLL 0x1 + #define FREE_BBALL_ACT_RESET 0x2 + +/* THI Top */ + /* oAction */ + #define THI_TOP_ACT_IDLE 0x0 + #define THI_TOP_ACT_DRAIN_WATER 0x1 /* Beta Chest Lid */ /* oAction */ - #define BETA_CHEST_ACT_IDLE_CLOSED 0 - #define BETA_CHEST_ACT_OPENING 1 - #define BETA_CHEST_ACT_IDLE_OPEN 2 + #define BETA_CHEST_ACT_IDLE_CLOSED 0x0 + #define BETA_CHEST_ACT_OPENING 0x1 + #define BETA_CHEST_ACT_IDLE_OPEN 0x2 + +/* Treasure Chest Top */ + /* oAction */ + #define TREASURE_CHEST_TOP_ACT_CLOSED 0x0 + #define TREASURE_CHEST_TOP_ACT_OPENING 0x1 + #define TREASURE_CHEST_TOP_ACT_OPENED 0x2 + #define TREASURE_CHEST_TOP_ACT_CLOSING 0x3 + +/* Treasure Chest Bottom */ + /* oBehParams2ndByte */ + #define TREASURE_CHEST_BP_1 0x1 + #define TREASURE_CHEST_BP_2 0x2 + #define TREASURE_CHEST_BP_3 0x3 + #define TREASURE_CHEST_BP_4 0x4 + /* oAction */ + #define TREASURE_CHEST_BOTTOM_ACT_CLOSE 0x0 + #define TREASURE_CHEST_BOTTOM_ACT_OPENING 0x1 + #define TREASURE_CHEST_BOTTOM_ACT_OPENED 0x2 + +/* Treasure Chest Manager */ + /* oAction */ + #define TREASURE_CHEST_ACT_SUCCESS_SOUND 0x0 + #define TREASURE_CHEST_ACT_REWARD 0x1 + #define TREASURE_CHEST_ACT_END 0x2 /* BBH Tilting Trap Platform */ /* oAction */ - // Unused in original Japanese version - #define BBH_TILTING_TRAP_PLATFORM_ACT_MARIO_ON 0 - #define BBH_TILTING_TRAP_PLATFORM_ACT_MARIO_OFF 1 + #define BBH_TILTING_TRAP_PLATFORM_ACT_MARIO_ON 0x0 + #define BBH_TILTING_TRAP_PLATFORM_ACT_MARIO_OFF 0x1 + +/* Boo in Castle */ + /* oAction */ + #define BOO_IN_CASTLE_ACT_INIT 0x0 + #define BOO_IN_CASTLE_ACT_IDLE 0x1 + #define BOO_IN_CASTLE_ACT_FLEE 0x2 /* Boo */ + /* oBehParams2ndByte */ + #define BOO_BP_GHOST_HUNT 0x0 + #define BOO_BP_NORMAL 0x1 + #define BOO_BP_MERRY_GO_ROUND 0x2 + /* oAction */ + #define BOO_ACT_STOPPED 0x0 + #define BOO_ACT_CHASING_MARIO 0x1 + #define BOO_ACT_BOUNCED_ON 0x2 + #define BOO_ACT_ATTACKED 0x3 + #define BOO_ACT_DEATH 0x4 + #define BOO_ACT_MERRY_GO_ROUND_WAIT 0x5 /* oBooDeathStatus */ - #define BOO_DEATH_STATUS_ALIVE 0 - #define BOO_DEATH_STATUS_DYING 1 - #define BOO_DEATH_STATUS_DEAD 2 - + #define BOO_DEATH_STATUS_ALIVE 0x0 + #define BOO_DEATH_STATUS_DYING 0x1 + #define BOO_DEATH_STATUS_DEAD 0x2 /* attackStatus */ - #define BOO_NOT_ATTACKED 0 - #define BOO_ATTACKED 1 - #define BOO_BOUNCED_ON -1 + #define BOO_NOT_ATTACKED 0x0 + #define BOO_ATTACKED 0x1 + #define BOO_BOUNCED_ON -0x1 + +/* Big Boo */ + /* oBehParams2ndByte */ + #define BIG_BOO_BP_GHOST_HUNT 0x0 + #define BIG_BOO_BP_MERRY_GO_ROUND 0x1 + #define BIG_BOO_BP_BALCONY 0x2 + +/* Fishing Boo */ + /* oAction */ + #define FISHING_BOO_ACT_0 0x0 + #define FISHING_BOO_ACT_1 0x1 + #define FISHING_BOO_ACT_2 0x2 + #define FISHING_BOO_ACT_3 0x3 + #define FISHING_BOO_ACT_4 0x4 + #define FISHING_BOO_ACT_5 0x5 + #define FISHING_BOO_ACT_6 0x6 + #define FISHING_BOO_ACT_SPAWN_FLAMES 0x7 + #define FISHING_BOO_ACT_8 0x8 + #define FISHING_BOO_ACT_9 0x9 + #define FISHING_BOO_ACT_10 0xA /* Beta Boo Key */ /* oAction */ - #define BETA_BOO_KEY_ACT_IN_BOO 0 - #define BETA_BOO_KEY_ACT_DROPPING 1 - #define BETA_BOO_KEY_ACT_DROPPED 2 + #define BETA_BOO_KEY_ACT_IN_BOO 0x0 + #define BETA_BOO_KEY_ACT_DROPPING 0x1 + #define BETA_BOO_KEY_ACT_DROPPED 0x2 /* Boo Cage */ /* oAction */ - #define BOO_CAGE_ACT_IN_BOO 0 - #define BOO_CAGE_ACT_FALLING 1 - #define BOO_CAGE_ACT_ON_GROUND 2 - #define BOO_CAGE_ACT_MARIO_JUMPING_IN 3 - #define BOO_CAGE_ACT_USELESS 4 + #define BOO_CAGE_ACT_IN_BOO 0x0 + #define BOO_CAGE_ACT_FALLING 0x1 + #define BOO_CAGE_ACT_ON_GROUND 0x2 + #define BOO_CAGE_ACT_MARIO_JUMPING_IN 0x3 + #define BOO_CAGE_ACT_USELESS 0x4 + +/* BBH Staircase */ + /* oBehParams2ndByte */ + #define BOO_STAIRCASE_BP_0 0x0 + #define BOO_STAIRCASE_BP_1 0x1 + #define BOO_STAIRCASE_BP_2 0x2 + /* oAction */ + #define BOO_STAIRCASE_ACT_INIT 0x0 + #define BOO_STAIRCASE_ACT_RISE 0x1 + #define BOO_STAIRCASE_ACT_WOBBLE 0x2 + #define BOO_STAIRCASE_ACT_PLAY_JINGLE 0x3 /* BBH Haunted Bookshelf */ /* oAction */ - #define HAUNTED_BOOKSHELF_ACT_IDLE 0 - #define HAUNTED_BOOKSHELF_ACT_RECEDE 1 + #define HAUNTED_BOOKSHELF_ACT_IDLE 0x0 + #define HAUNTED_BOOKSHELF_ACT_RECEDE 0x1 + +/* BBH Bookshelf Manager */ + /* oAction */ + #define BOOKSHELF_MANAGER_ACT_SPAWN_SWITCHES 0x0 + #define BOOKSHELF_MANAGER_ACT_CHECK_ACTIVATE 0x1 + #define BOOKSHELF_MANAGER_ACT_ACTIVE 0x2 + #define BOOKSHELF_MANAGER_ACT_RECEDE 0x3 + #define BOOKSHELF_MANAGER_ACT_END 0x4 + +/* BBH Book Switch */ + /* oBehParams2ndByte */ + #define BOOK_SWITCH_BP_CHOICE_1 0x0 + #define BOOK_SWITCH_BP_CHOICE_2 0x1 + #define BOOK_SWITCH_BP_CHOICE_3 0x2 + /* oAction */ + #define BOOK_SWITCH_ACT_UNPRESSED 0x0 + #define BOOK_SWITCH_ACT_ACTIVE 0x1 + #define BOOK_SWITCH_ACT_PRESSED 0x2 + +/* Flying Bookend */ + /* oAction */ + #define FLYING_BOOKEND_ACT_INIT 0x0 + #define FLYING_BOOKEND_ACT_GROW 0x1 + #define FLYING_BOOKEND_ACT_TURN_TOWARD_MARIO 0x2 + #define FLYING_BOOKEND_ACT_FLY_FORWARD 0x3 + /* Animations */ + #define FLYING_BOOKEND_ANIM_SPAWN 0x0 + #define FLYING_BOOKEND_ANIM_BITE 0x1 + #define FLYING_BOOKEND_ANIM_GROW 0x2 /* BBH Merry-Go-Round */ + /* oAction */ + #define BBH_MERRY_GO_ROUND_ACT_SPAWN_BOOS 0x0 + #define BBH_MERRY_GO_ROUND_ACT_WAIT 0x1 + #define BBH_MERRY_GO_ROUND_ACT_STOPPED 0x2 /* gMarioCurrentRoom */ - #define BBH_NEAR_MERRY_GO_ROUND_ROOM 10 - #define BBH_DYNAMIC_SURFACE_ROOM 0 - #define BBH_OUTSIDE_ROOM 13 + #define BBH_NEAR_MERRY_GO_ROUND_ROOM 0xA + #define BBH_DYNAMIC_SURFACE_ROOM 0x0 + #define BBH_OUTSIDE_ROOM 0xD /* Coffin Spawner */ /* oAction */ - #define COFFIN_SPAWNER_ACT_COFFINS_UNLOADED 0 + #define COFFIN_SPAWNER_ACT_COFFINS_UNLOADED 0x0 + #define COFFIN_SPAWNER_ACT_COFFINS_LOADED 0x1 /* Coffin */ - /* oAction */ - #define COFFIN_ACT_IDLE 0 - #define COFFIN_ACT_STAND_UP 1 - /* oBehParams2ndByte */ - #define COFFIN_BP_STATIC 0 + #define COFFIN_BP_STATIONARY 0x0 + #define COFFIN_BP_MOVING 0x1 + /* oAction */ + #define COFFIN_ACT_IDLE 0x0 + #define COFFIN_ACT_STAND_UP 0x1 /* WDW Arrow Lift */ /* oAction */ - #define ARROW_LIFT_ACT_IDLE 0 - #define ARROW_LIFT_ACT_MOVING_AWAY 1 - #define ARROW_LIFT_ACT_MOVING_BACK 2 + #define ARROW_LIFT_ACT_IDLE 0x0 + #define ARROW_LIFT_ACT_MOVING_AWAY 0x1 + #define ARROW_LIFT_ACT_MOVING_BACK 0x2 - /* status */ - #define ARROW_LIFT_NOT_DONE_MOVING 0 - #define ARROW_LIFT_DONE_MOVING 1 +/* Toad */ + /* Animations */ + #define TOAD_ANIM_0 0x0 //! anim name + #define TOAD_ANIM_6 0x6 //! anim name + +/* Intro Peach */ + /* oAction */ + #define PEACH_ACT_INIT 0x0 + #define PEACH_ACT_FADE_1 0x1 + #define PEACH_ACT_UNFADE 0x2 + #define PEACH_ACT_FADE_2 0x3 + /* Animations */ + #define PEACH_ANIM_0 0x0 //! anim name + +/* Yoshi */ /* Yoshi */ /* oAction */ - #define YOSHI_ACT_IDLE 0 - #define YOSHI_ACT_WALK 1 - #define YOSHI_ACT_TALK 2 - #define YOSHI_ACT_WALK_JUMP_OFF_ROOF 3 - #define YOSHI_ACT_FINISH_JUMPING_AND_DESPAWN 4 - #define YOSHI_ACT_GIVE_PRESENT 5 - #define YOSHI_ACT_CREDITS 10 - -/* Koopa */ - /* oAction */ - #define KOOPA_UNSHELLED_ACT_RUN 0 - #define KOOPA_UNSHELLED_ACT_DIVE 1 - #define KOOPA_UNSHELLED_ACT_LYING 2 - #define KOOPA_UNSHELLED_ACT_UNUSED3 3 - - #define KOOPA_SHELLED_ACT_STOPPED 0 - #define KOOPA_SHELLED_ACT_WALK 1 - #define KOOPA_SHELLED_ACT_RUN_FROM_MARIO 2 - #define KOOPA_SHELLED_ACT_LYING 3 - #define KOOPA_SHELLED_ACT_DIE 4 - - #define KOOPA_THE_QUICK_ACT_WAIT_BEFORE_RACE 0 - #define KOOPA_THE_QUICK_ACT_UNUSED1 1 - #define KOOPA_THE_QUICK_ACT_SHOW_INIT_TEXT 2 - #define KOOPA_THE_QUICK_ACT_RACE 3 - #define KOOPA_THE_QUICK_ACT_DECELERATE 4 - #define KOOPA_THE_QUICK_ACT_STOP 5 - #define KOOPA_THE_QUICK_ACT_AFTER_RACE 6 - - /* oSubAction */ - #define KOOPA_SHELLED_SUB_ACT_START_WALK 0 - #define KOOPA_SHELLED_SUB_ACT_WALK 1 - #define KOOPA_SHELLED_SUB_ACT_STOP_WALK 2 - - #define KOOPA_THE_QUICK_SUB_ACT_START_RUN 0 - #define KOOPA_THE_QUICK_SUB_ACT_RUN 1 - #define KOOPA_THE_QUICK_SUB_ACT_JUMP 2 - - /* oKoopaTheQuickRaceIndex */ - #define KOOPA_THE_QUICK_BOB_INDEX 0 - #define KOOPA_THE_QUICK_THI_INDEX 1 + #define YOSHI_ACT_IDLE 0x0 + #define YOSHI_ACT_WALK 0x1 + #define YOSHI_ACT_TALK 0x2 + #define YOSHI_ACT_WALK_JUMP_OFF_ROOF 0x3 + #define YOSHI_ACT_FINISH_JUMPING_AND_DESPAWN 0x4 + #define YOSHI_ACT_GIVE_PRESENT 0x5 + #define YOSHI_ACT_CREDITS 0xA + /* Animations */ + #define YOSHI_ANIM_IDLE 0x0 + #define YOSHI_ANIM_WALK 0x1 + #define YOSHI_ANIM_JUMP 0x2 +/* Koopa (General) */ /* oBehParams2ndByte */ - #define KOOPA_BP_UNSHELLED 0 - #define KOOPA_BP_NORMAL 1 - #define KOOPA_BP_KOOPA_THE_QUICK_BASE 2 - #define KOOPA_BP_KOOPA_THE_QUICK_BOB (KOOPA_BP_KOOPA_THE_QUICK_BASE + KOOPA_THE_QUICK_BOB_INDEX) - #define KOOPA_BP_KOOPA_THE_QUICK_THI (KOOPA_BP_KOOPA_THE_QUICK_BASE + KOOPA_THE_QUICK_THI_INDEX) - #define KOOPA_BP_TINY 4 + #define KOOPA_BP_UNSHELLED 0x0 + #define KOOPA_BP_NORMAL 0x1 + #define KOOPA_BP_KOOPA_THE_QUICK_BASE 0x2 + #define KOOPA_BP_KOOPA_THE_QUICK_BOB (KOOPA_BP_KOOPA_THE_QUICK_BASE + KOOPA_THE_QUICK_BOB_INDEX) + #define KOOPA_BP_KOOPA_THE_QUICK_THI (KOOPA_BP_KOOPA_THE_QUICK_BASE + KOOPA_THE_QUICK_THI_INDEX) + #define KOOPA_BP_TINY 0x4 + /* oAnimState */ + #define KOOPA_ANIM_STATE_EYES_OPEN OBJ_BLINKING_ANIM_STATE_EYES_OPEN + #define KOOPA_ANIM_STATE_EYES_CLOSED OBJ_BLINKING_ANIM_STATE_EYES_CLOSED + /* Animations */ + #define KOOPA_ANIM_SHELLED_UNUSED3 0x0 + #define KOOPA_ANIM_SHELLED_RUN_AWAY 0x1 + #define KOOPA_ANIM_UNSHELLED_LYING 0x2 + #define KOOPA_ANIM_UNSHELLED_RUN 0x3 + #define KOOPA_ANIM_UNUSED_4 0x4 + #define KOOPA_ANIM_SHELLED_LYING 0x5 + #define KOOPA_ANIM_STAND_UP 0x6 + #define KOOPA_ANIM_STOPPED 0x7 + #define KOOPA_ANIM_UNUSED_8 0x8 + #define KOOPA_ANIM_WALK 0x9 + #define KOOPA_ANIM_SHELLED_WALK_STOP 0xA + #define KOOPA_ANIM_WALK_START 0xB + #define KOOPA_ANIM_THE_QUICK_JUMP 0xC + #define KOOPA_ANIM_THE_QUICK_LAND 0xD + +/* Unshelled Koopa */ + /* oAction */ + #define KOOPA_UNSHELLED_ACT_RUN 0x0 + #define KOOPA_UNSHELLED_ACT_DIVE 0x1 + #define KOOPA_UNSHELLED_ACT_LYING 0x2 + // #define KOOPA_UNSHELLED_ACT_UNUSED3 0x3 + +/* Shelled Koopa */ + /* oAction */ + #define KOOPA_SHELLED_ACT_STOPPED 0x0 + #define KOOPA_SHELLED_ACT_WALK 0x1 + #define KOOPA_SHELLED_ACT_RUN_FROM_MARIO 0x2 + #define KOOPA_SHELLED_ACT_LYING 0x3 + #define KOOPA_SHELLED_ACT_DIE 0x4 + /* oSubAction */ + /* KOOPA_SHELLED_ACT_WALK */ + #define KOOPA_SHELLED_SUB_ACT_START_WALK 0x0 + #define KOOPA_SHELLED_SUB_ACT_WALK 0x1 + #define KOOPA_SHELLED_SUB_ACT_STOP_WALK 0x2 + +/* Koopa The Quick */ + /* oAction */ + #define KOOPA_THE_QUICK_ACT_WAIT_BEFORE_RACE 0x0 + #define KOOPA_THE_QUICK_ACT_UNUSED1 0x1 + #define KOOPA_THE_QUICK_ACT_SHOW_INIT_TEXT 0x2 + #define KOOPA_THE_QUICK_ACT_RACE 0x3 + #define KOOPA_THE_QUICK_ACT_DECELERATE 0x4 + #define KOOPA_THE_QUICK_ACT_STOP 0x5 + #define KOOPA_THE_QUICK_ACT_AFTER_RACE 0x6 + /* oSubAction */ + /* KOOPA_THE_QUICK_ACT_RACE */ + #define KOOPA_THE_QUICK_SUB_ACT_START_RUN 0x0 + #define KOOPA_THE_QUICK_SUB_ACT_RUN 0x1 + #define KOOPA_THE_QUICK_SUB_ACT_JUMP 0x2 + /* oKoopaTheQuickRaceIndex */ + #define KOOPA_THE_QUICK_BOB_INDEX 0x0 + #define KOOPA_THE_QUICK_THI_INDEX 0x1 + +/* Koopa Flag */ + /* Animations */ + #define KOOPA_FLAG_ANIM_WAVE 0x0 /* Pokey */ /* oAction */ - #define POKEY_ACT_UNINITIALIZED 0 - #define POKEY_ACT_WANDER 1 - #define POKEY_ACT_UNLOAD_PARTS 2 + #define POKEY_ACT_UNINITIALIZED 0x0 + #define POKEY_ACT_WANDER 0x1 + #define POKEY_ACT_UNLOAD_PARTS 0x2 + /* oAnimState */ + #define POKEY_ANIM_STATE_NONSTANDARD_ACTION 0x1 + +/* Pokey Body Part */ + /* oBehParams2ndByte */ + #define POKEY_PART_BP_HEAD 0x0 + #define POKEY_PART_BP_LOWEST POKEY_NUM_PARTS-0x1 /* Swoop */ /* oAction */ - #define SWOOP_ACT_IDLE 0 - #define SWOOP_ACT_MOVE 1 + #define SWOOP_ACT_IDLE 0x0 + #define SWOOP_ACT_MOVE 0x1 + /* Animations */ + #define SWOOP_ANIM_FLY 0x0 + #define SWOOP_ANIM_IDLE 0x1 /* Fly guy */ + /* oBehParams2ndByte */ + #define FLY_GUY_BP_LUNGES 0x0 + #define FLY_GUY_BP_SHOOTS_FIRE 0x1 /* oAction */ - #define FLY_GUY_ACT_IDLE 0 - #define FLY_GUY_ACT_APPROACH_MARIO 1 - #define FLY_GUY_ACT_LUNGE 2 - #define FLY_GUY_ACT_SHOOT_FIRE 3 + #define FLY_GUY_ACT_IDLE 0x0 + #define FLY_GUY_ACT_APPROACH_MARIO 0x1 + #define FLY_GUY_ACT_LUNGE 0x2 + #define FLY_GUY_ACT_SHOOT_FIRE 0x3 + /* Animations */ + #define FLY_GUY_ANIM_FLYING 0x0 /* Goomba triplet spawner */ /* oBehParams2ndByte */ - #define GOOMBA_TRIPLET_SPAWNER_BP_SIZE_MASK 0x00000003 - #define GOOMBA_TRIPLET_SPAWNER_BP_EXTRA_GOOMBAS_MASK 0x000000FC + #define GOOMBA_TRIPLET_SPAWNER_BP_SIZE_MASK 0x00000003 + #define GOOMBA_TRIPLET_SPAWNER_BP_EXTRA_GOOMBAS_MASK 0x000000FC /* oAction */ - #define GOOMBA_TRIPLET_SPAWNER_ACT_UNLOADED 0 - #define GOOMBA_TRIPLET_SPAWNER_ACT_LOADED 1 + #define GOOMBA_TRIPLET_SPAWNER_ACT_UNLOADED 0x0 + #define GOOMBA_TRIPLET_SPAWNER_ACT_LOADED 0x1 /* Goomba */ /* oBehParams2ndByte */ - #define GOOMBA_BP_SIZE_MASK 0x00000003 - #define GOOMBA_SIZE_REGULAR 0 - #define GOOMBA_SIZE_HUGE 1 - #define GOOMBA_SIZE_TINY 2 - #define GOOMBA_BP_TRIPLET_FLAG_MASK 0x000000FC + #define GOOMBA_SIZE_REGULAR 0x0 + #define GOOMBA_SIZE_HUGE 0x1 + #define GOOMBA_SIZE_TINY 0x2 + #define GOOMBA_BP_SIZE_MASK 0x3 + #define GOOMBA_BP_TRIPLET_FLAG_MASK 0x000000FC /* oAction */ - #define GOOMBA_ACT_WALK 0 - #define GOOMBA_ACT_ATTACKED_MARIO 1 - #define GOOMBA_ACT_JUMP 2 + #define GOOMBA_ACT_WALK 0x0 + #define GOOMBA_ACT_ATTACKED_MARIO 0x1 + #define GOOMBA_ACT_JUMP 0x2 + /* oAnimState */ + #define GOOMBA_ANIM_STATE_EYES_OPEN OBJ_BLINKING_ANIM_STATE_EYES_OPEN + #define GOOMBA_ANIM_STATE_EYES_CLOSED OBJ_BLINKING_ANIM_STATE_EYES_CLOSED + /* Animations */ + #define GOOMBA_ANIM_DEFAULT 0x0 /* Chain chomp */ /* oAction */ - #define CHAIN_CHOMP_ACT_UNINITIALIZED 0 - #define CHAIN_CHOMP_ACT_MOVE 1 - #define CHAIN_CHOMP_ACT_UNLOAD_CHAIN 2 - + #define CHAIN_CHOMP_ACT_UNINITIALIZED 0x0 + #define CHAIN_CHOMP_ACT_MOVE 0x1 + #define CHAIN_CHOMP_ACT_UNLOAD_CHAIN 0x2 /* oSubAction */ - #define CHAIN_CHOMP_SUB_ACT_TURN 0 - #define CHAIN_CHOMP_SUB_ACT_LUNGE 1 - + /* CHAIN_CHOMP_ACT_MOVE */ + #define CHAIN_CHOMP_SUB_ACT_TURN 0x0 + #define CHAIN_CHOMP_SUB_ACT_LUNGE 0x1 /* oChainChompReleaseStatus */ - #define CHAIN_CHOMP_NOT_RELEASED 0 - #define CHAIN_CHOMP_RELEASED_TRIGGER_CUTSCENE 1 - #define CHAIN_CHOMP_RELEASED_LUNGE_AROUND 2 - #define CHAIN_CHOMP_RELEASED_BREAK_GATE 3 - #define CHAIN_CHOMP_RELEASED_JUMP_AWAY 4 - #define CHAIN_CHOMP_RELEASED_END_CUTSCENE 5 + #define CHAIN_CHOMP_NOT_RELEASED 0x0 + #define CHAIN_CHOMP_RELEASED_TRIGGER_CUTSCENE 0x1 + #define CHAIN_CHOMP_RELEASED_LUNGE_AROUND 0x2 + #define CHAIN_CHOMP_RELEASED_BREAK_GATE 0x3 + #define CHAIN_CHOMP_RELEASED_JUMP_AWAY 0x4 + #define CHAIN_CHOMP_RELEASED_END_CUTSCENE 0x5 + /* Animations */ + #define CHAIN_CHOMP_ANIM_CHOMPING 0x0 /* Chain chomp chain part */ /* oBehParams2ndByte */ - #define CHAIN_CHOMP_CHAIN_PART_BP_PIVOT 0 + #define CHAIN_CHOMP_CHAIN_PART_BP_PIVOT 0x0 /* Wooden post */ /* oBehParams */ - #define WOODEN_POST_BP_NO_COINS_MASK 0x0000FF00 + #define WOODEN_POST_BP_NO_COINS_MASK 0x0000FF00 /* Wiggler */ /* oAction */ - #define WIGGLER_ACT_UNINITIALIZED 0 - #define WIGGLER_ACT_WALK 1 - #define WIGGLER_ACT_KNOCKBACK 2 - #define WIGGLER_ACT_JUMPED_ON 3 - #define WIGGLER_ACT_SHRINK 4 - #define WIGGLER_ACT_FALL_THROUGH_FLOOR 5 - + #define WIGGLER_ACT_UNINITIALIZED 0x0 + #define WIGGLER_ACT_WALK 0x1 + #define WIGGLER_ACT_KNOCKBACK 0x2 + #define WIGGLER_ACT_JUMPED_ON 0x3 + #define WIGGLER_ACT_SHRINK 0x4 + #define WIGGLER_ACT_FALL_THROUGH_FLOOR 0x5 /* oWigglerTextStatus */ - #define WIGGLER_TEXT_STATUS_AWAIT_DIALOG 0 - #define WIGGLER_TEXT_STATUS_SHOWING_DIALOG 1 - #define WIGGLER_TEXT_STATUS_COMPLETED_DIALOG 2 + #define WIGGLER_TEXT_STATUS_AWAIT_DIALOG 0x0 + #define WIGGLER_TEXT_STATUS_SHOWING_DIALOG 0x1 + #define WIGGLER_TEXT_STATUS_COMPLETED_DIALOG 0x2 + /* Animations */ + #define WIGGLER_ANIM_WALK 0x0 /* Spiny */ /* oAction */ - #define SPINY_ACT_WALK 0 - #define SPINY_ACT_HELD_BY_LAKITU 1 - #define SPINY_ACT_THROWN_BY_LAKITU 2 - #define SPINY_ACT_ATTACKED_MARIO 3 + #define SPINY_ACT_WALK 0x0 + #define SPINY_ACT_HELD_BY_LAKITU 0x1 + #define SPINY_ACT_THROWN_BY_LAKITU 0x2 + #define SPINY_ACT_ATTACKED_MARIO 0x3 + /* Animations */ + #define SPINY_ANIM_DEFAULT 0x0 -/* Evil lakitu */ +/* Enemy lakitu */ /* oAction */ - #define ENEMY_LAKITU_ACT_UNINITIALIZED 0 - #define ENEMY_LAKITU_ACT_MAIN 1 - + #define ENEMY_LAKITU_ACT_UNINITIALIZED 0x0 + #define ENEMY_LAKITU_ACT_MAIN 0x1 /* oSubAction */ - #define ENEMY_LAKITU_SUB_ACT_NO_SPINY 0 - #define ENEMY_LAKITU_SUB_ACT_HOLD_SPINY 1 - #define ENEMY_LAKITU_SUB_ACT_THROW_SPINY 2 + /* ENEMY_LAKITU_ACT_MAIN */ + #define ENEMY_LAKITU_SUB_ACT_NO_SPINY 0x0 + #define ENEMY_LAKITU_SUB_ACT_HOLD_SPINY 0x1 + #define ENEMY_LAKITU_SUB_ACT_THROW_SPINY 0x2 + /* Animations */ + #define ENEMY_LAKITU_ANIM_SPAWN 0x0 + #define ENEMY_LAKITU_ANIM_NO_SPINY 0x1 + #define ENEMY_LAKITU_ANIM_THROW_SPINY 0x2 + #define ENEMY_LAKITU_ANIM_HOLD_SPINY 0x3 /* Cloud */ - /* oAction */ - #define CLOUD_ACT_SPAWN_PARTS 0 - #define CLOUD_ACT_MAIN 1 - #define CLOUD_ACT_UNLOAD 2 - #define CLOUD_ACT_FWOOSH_HIDDEN 3 - /* oBehParams2ndByte */ - #define CLOUD_BP_FWOOSH 0 - #define CLOUD_BP_LAKITU_CLOUD 1 - -/* Camera lakitu */ + #define CLOUD_BP_FWOOSH 0x0 + #define CLOUD_BP_LAKITU_CLOUD 0x1 + #define CLOUD_BP_FWOOSH_FACE 0x5 /* oAction */ - #define CAMERA_LAKITU_INTRO_ACT_TRIGGER_CUTSCENE 0 - #define CAMERA_LAKITU_INTRO_ACT_SPAWN_CLOUD 1 - #define CAMERA_LAKITU_INTRO_ACT_UNK2 2 + #define CLOUD_ACT_SPAWN_PARTS 0x0 + #define CLOUD_ACT_MAIN 0x1 + #define CLOUD_ACT_UNLOAD 0x2 + #define CLOUD_ACT_FWOOSH_HIDDEN 0x3 +/* Intro Lakitu */ + /* oAction */ + #define INTRO_LAKITU_ACT_INIT 0x0 + #define INTRO_LAKITU_ACT_CUTSCENE_INTRO_1 0x1 + #define INTRO_LAKITU_ACT_CUTSCENE_INTRO_2 0x2 + #define INTRO_LAKITU_ACT_CUTSCENE_INTRO_3 0x3 + #define INTRO_LAKITU_ACT_CUTSCENE_END_WAVING_1 0x64 + #define INTRO_LAKITU_ACT_CUTSCENE_END_WAVING_2 0x65 + #define INTRO_LAKITU_ACT_CUTSCENE_END_WAVING_3 0x66 + /* Animations */ + #define INTRO_LAKITU_ACT_DEFAULT 0x0 + +/* Camera Lakitu */ /* oBehParams2ndByte */ - #define CAMERA_LAKITU_BP_FOLLOW_CAMERA 0 - #define CAMERA_LAKITU_BP_INTRO 1 + #define CAMERA_LAKITU_BP_FOLLOW_CAMERA 0x0 + #define CAMERA_LAKITU_BP_INTRO 0x1 + /* oAction */ + #define CAMERA_LAKITU_INTRO_ACT_TRIGGER_CUTSCENE 0x0 + #define CAMERA_LAKITU_INTRO_ACT_SPAWN_CLOUD 0x1 + #define CAMERA_LAKITU_INTRO_ACT_SHOW_DIALOG 0x2 + /* Animations */ + #define CAMERA_LAKITU_ANIM_DEFAULT 0x0 + +/* RR Cruiser Wing */ + /* oBehParams2ndByte */ + #define CRUISER_WING_BP_CLOCKWISE 0x0 + #define CRUISER_WING_BP_COUNTERCLOCKWISE 0x1 /* Manta Ray */ /* oAction */ - #define MANTA_ACT_SPAWN_RINGS 0 - #define MANTA_ACT_NO_RINGS 1 + #define MANTA_ACT_SPAWN_RINGS 0x0 + #define MANTA_ACT_NO_RINGS 0x1 + /* Animations */ + #define MANTA_ANIM_SWIM 0x0 + +/* Sushi Shark */ + /* Animations */ + #define SUSHI_ANIM_SWIM 0x0 /* Monty mole */ - /* oAction */ - #define MONTY_MOLE_ACT_SELECT_HOLE 0 - #define MONTY_MOLE_ACT_RISE_FROM_HOLE 1 - #define MONTY_MOLE_ACT_SPAWN_ROCK 2 - #define MONTY_MOLE_ACT_BEGIN_JUMP_INTO_HOLE 3 - #define MONTY_MOLE_ACT_THROW_ROCK 4 - #define MONTY_MOLE_ACT_JUMP_INTO_HOLE 5 - #define MONTY_MOLE_ACT_HIDE 6 - #define MONTY_MOLE_ACT_JUMP_OUT_OF_HOLE 7 - /* oBehParams2ndByte */ - #define MONTY_MOLE_BP_NO_ROCK 0 + #define MONTY_MOLE_BP_NO_ROCK 0x0 + /* oAction */ + #define MONTY_MOLE_ACT_SELECT_HOLE 0x0 + #define MONTY_MOLE_ACT_RISE_FROM_HOLE 0x1 + #define MONTY_MOLE_ACT_SPAWN_ROCK 0x2 + #define MONTY_MOLE_ACT_BEGIN_JUMP_INTO_HOLE 0x3 + #define MONTY_MOLE_ACT_THROW_ROCK 0x4 + #define MONTY_MOLE_ACT_JUMP_INTO_HOLE 0x5 + #define MONTY_MOLE_ACT_HIDE 0x6 + #define MONTY_MOLE_ACT_JUMP_OUT_OF_HOLE 0x7 + /* Animations */ + #define MONTY_MOLE_ANIM_JUMP_INTO_HOLE 0x0 + #define MONTY_MOLE_ANIM_RISE 0x1 + #define MONTY_MOLE_ANIM_GET_ROCK 0x2 + #define MONTY_MOLE_ANIM_BEGIN_JUMP_INTO_HOLE 0x3 + #define MONTY_MOLE_ANIM_JUMP_OUT_OF_HOLE_DOWN 0x4 + #define MONTY_MOLE_ANIM_UNUSED_5 0x5 + #define MONTY_MOLE_ANIM_UNUSED_6 0x6 + #define MONTY_MOLE_ANIM_UNUSED_7 0x7 + #define MONTY_MOLE_ANIM_THROW_ROCK 0x8 + #define MONTY_MOLE_ANIM_JUMP_OUT_OF_HOLE_UP 0x9 /* Monty mole rock */ /* oAction */ - #define MONTY_MOLE_ROCK_ACT_HELD 0 - #define MONTY_MOLE_ROCK_ACT_MOVE 1 + #define MONTY_MOLE_ROCK_ACT_HELD 0x0 + #define MONTY_MOLE_ROCK_ACT_MOVE 0x1 /* Ukiki */ - /* oAction */ - #define UKIKI_ACT_IDLE 0 - #define UKIKI_ACT_RUN 1 - #define UKIKI_ACT_TURN_TO_MARIO 2 - #define UKIKI_ACT_JUMP 3 - #define UKIKI_ACT_GO_TO_CAGE 4 - #define UKIKI_ACT_WAIT_TO_RESPAWN 5 - #define UKIKI_ACT_UNUSED_TURN 6 - #define UKIKI_ACT_RETURN_HOME 7 - - /* oSubAction */ - #define UKIKI_SUB_ACT_TAUNT_NONE 0 - #define UKIKI_SUB_ACT_TAUNT_ITCH 1 - #define UKIKI_SUB_ACT_TAUNT_SCREECH 2 - #define UKIKI_SUB_ACT_TAUNT_JUMP_CLAP 3 - #define UKIKI_SUB_ACT_TAUNT_HANDSTAND 4 - - #define UKIKI_SUB_ACT_CAGE_RUN_TO_CAGE 0 - #define UKIKI_SUB_ACT_CAGE_WAIT_FOR_MARIO 1 - #define UKIKI_SUB_ACT_CAGE_TALK_TO_MARIO 2 - #define UKIKI_SUB_ACT_CAGE_TURN_TO_CAGE 3 - #define UKIKI_SUB_ACT_CAGE_JUMP_TO_CAGE 4 - #define UKIKI_SUB_ACT_CAGE_LAND_ON_CAGE 5 - #define UKIKI_SUB_ACT_CAGE_SPIN_ON_CAGE 6 - #define UKIKI_SUB_ACT_CAGE_DESPAWN 7 - - /* oUkikiTextState */ - #define UKIKI_TEXT_DEFAULT 0 - #define UKIKI_TEXT_CAGE_TEXTBOX 1 - #define UKIKI_TEXT_GO_TO_CAGE 2 - #define UKIKI_TEXT_STOLE_CAP 3 - #define UKIKI_TEXT_HAS_CAP 4 - #define UKIKI_TEXT_GAVE_CAP_BACK 5 - #define UKIKI_TEXT_DO_NOT_LET_GO 6 - #define UKIKI_TEXT_STEAL_CAP 7 - /* oBehParams2ndByte */ - #define UKIKI_CAGE 0 - #define UKIKI_CAP 1 - + #define UKIKI_CAGE 0x0 + #define UKIKI_CAP 0x1 + /* oAction */ + #define UKIKI_ACT_IDLE 0x0 + #define UKIKI_ACT_RUN 0x1 + #define UKIKI_ACT_TURN_TO_MARIO 0x2 + #define UKIKI_ACT_JUMP 0x3 + #define UKIKI_ACT_GO_TO_CAGE 0x4 + #define UKIKI_ACT_WAIT_TO_RESPAWN 0x5 + #define UKIKI_ACT_UNUSED_TURN 0x6 + #define UKIKI_ACT_RETURN_HOME 0x7 + /* oSubAction */ + /* UKIKI_ACT_IDLE, UKIKI_ACT_WAIT_TO_RESPAWN, UKIKI_ACT_UNUSED_TURN */ + #define UKIKI_SUB_ACT_TAUNT_NONE 0x0 + #define UKIKI_SUB_ACT_TAUNT_ITCH 0x1 + #define UKIKI_SUB_ACT_TAUNT_SCREECH 0x2 + #define UKIKI_SUB_ACT_TAUNT_JUMP_CLAP 0x3 + #define UKIKI_SUB_ACT_TAUNT_HANDSTAND 0x4 + /* UKIKI_ACT_JUMP */ + #define UKIKI_SUB_ACT_JUMP_JUMP 0x0 + #define UKIKI_SUB_ACT_JUMP_LAND 0x1 + /* UKIKI_ACT_GO_TO_CAGE */ + #define UKIKI_SUB_ACT_CAGE_RUN_TO_CAGE 0x0 + #define UKIKI_SUB_ACT_CAGE_WAIT_FOR_MARIO 0x1 + #define UKIKI_SUB_ACT_CAGE_TALK_TO_MARIO 0x2 + #define UKIKI_SUB_ACT_CAGE_TURN_TO_CAGE 0x3 + #define UKIKI_SUB_ACT_CAGE_JUMP_TO_CAGE 0x4 + #define UKIKI_SUB_ACT_CAGE_LAND_ON_CAGE 0x5 + #define UKIKI_SUB_ACT_CAGE_SPIN_ON_CAGE 0x6 + #define UKIKI_SUB_ACT_CAGE_DESPAWN 0x7 + /* oUkikiTextState */ + #define UKIKI_TEXT_DEFAULT 0x0 + #define UKIKI_TEXT_CAGE_TEXTBOX 0x1 + #define UKIKI_TEXT_GO_TO_CAGE 0x2 + #define UKIKI_TEXT_STOLE_CAP 0x3 + #define UKIKI_TEXT_HAS_CAP 0x4 + #define UKIKI_TEXT_GAVE_CAP_BACK 0x5 + #define UKIKI_TEXT_DO_NOT_LET_GO 0x6 + #define UKIKI_TEXT_STEAL_CAP 0x7 /* Animations */ - #define UKIKI_ANIM_RUN 0 - #define UKIKI_ANIM_UNUSED_WALK 1 - #define UKIKI_ANIM_UNUSED_APOSE 2 - #define UKIKI_ANIM_UNUSED_DEATH 3 - #define UKIKI_ANIM_SCREECH 4 - #define UKIKI_ANIM_JUMP_CLAP 5 - #define UKIKI_ANIM_UNUSED_HOP 6 - #define UKIKI_ANIM_LAND 7 - #define UKIKI_ANIM_JUMP 8 - #define UKIKI_ANIM_ITCH 9 - #define UKIKI_ANIM_HANDSTAND 10 - #define UKIKI_ANIM_TURN 11 - #define UKIKI_ANIM_HELD 12 - + #define UKIKI_ANIM_RUN 0x0 + #define UKIKI_ANIM_UNUSED_WALK 0x1 + #define UKIKI_ANIM_UNUSED_APOSE 0x2 + #define UKIKI_ANIM_UNUSED_DEATH 0x3 + #define UKIKI_ANIM_SCREECH 0x4 + #define UKIKI_ANIM_JUMP_CLAP 0x5 + #define UKIKI_ANIM_UNUSED_HOP 0x6 + #define UKIKI_ANIM_LAND 0x7 + #define UKIKI_ANIM_JUMP 0x8 + #define UKIKI_ANIM_ITCH 0x9 + #define UKIKI_ANIM_HANDSTAND 0xA + #define UKIKI_ANIM_TURN 0xB + #define UKIKI_ANIM_HELD 0xC /* oAnimState */ - #define UKIKI_ANIM_STATE_DEFAULT 0 - #define UKIKI_ANIM_STATE_EYE_CLOSED 1 - #define UKIKI_ANIM_STATE_CAP_ON 2 - + #define UKIKI_ANIM_STATE_DEFAULT 0x0 + #define UKIKI_ANIM_STATE_EYE_CLOSED 0x1 + #define UKIKI_ANIM_STATE_CAP_ON 0x2 /* oUkikiHasCap */ - #define UKIKI_CAP_ON 1 + #define UKIKI_CAP_ON 0x1 //! /* Ukiki Cage Star */ /* oAction */ - #define UKIKI_CAGE_STAR_ACT_IN_CAGE 0 - #define UKIKI_CAGE_STAR_ACT_SPAWN_STAR 1 + #define UKIKI_CAGE_STAR_ACT_IN_CAGE 0x0 + #define UKIKI_CAGE_STAR_ACT_SPAWN_STAR 0x1 /* Ukiki Cage */ /* oAction */ - #define UKIKI_CAGE_ACT_WAIT_FOR_UKIKI 0 - #define UKIKI_CAGE_ACT_SPIN 1 - #define UKIKI_CAGE_ACT_FALL 2 - #define UKIKI_CAGE_ACT_HIDE 3 + #define UKIKI_CAGE_ACT_WAIT_FOR_UKIKI 0x0 + #define UKIKI_CAGE_ACT_SPIN 0x1 + #define UKIKI_CAGE_ACT_FALL 0x2 + #define UKIKI_CAGE_ACT_HIDE 0x3 /* Piranha Plant */ /* oAction */ - #define PIRANHA_PLANT_ACT_IDLE 0 - #define PIRANHA_PLANT_ACT_SLEEPING 1 - #define PIRANHA_PLANT_ACT_BITING 2 - #define PIRANHA_PLANT_ACT_WOKEN_UP 3 - #define PIRANHA_PLANT_ACT_STOPPED_BITING 4 - #define PIRANHA_PLANT_ACT_ATTACKED 5 - #define PIRANHA_PLANT_ACT_SHRINK_AND_DIE 6 - #define PIRANHA_PLANT_ACT_WAIT_TO_RESPAWN 7 - #define PIRANHA_PLANT_ACT_RESPAWN 8 + #define PIRANHA_PLANT_ACT_IDLE 0x0 + #define PIRANHA_PLANT_ACT_SLEEPING 0x1 + #define PIRANHA_PLANT_ACT_BITING 0x2 + #define PIRANHA_PLANT_ACT_WOKEN_UP 0x3 + #define PIRANHA_PLANT_ACT_STOPPED_BITING 0x4 + #define PIRANHA_PLANT_ACT_ATTACKED 0x5 + #define PIRANHA_PLANT_ACT_SHRINK_AND_DIE 0x6 + #define PIRANHA_PLANT_ACT_WAIT_TO_RESPAWN 0x7 + #define PIRANHA_PLANT_ACT_RESPAWN 0x8 + /* Animations */ + #define PIRANHA_PLANT_ANIM_BITE 0x0 + #define PIRANHA_PLANT_ANIM_UNUSED_1 0x1 + #define PIRANHA_PLANT_ANIM_FALLING_OVER 0x2 + #define PIRANHA_PLANT_ANIM_UNUSED_3 0x3 + #define PIRANHA_PLANT_ANIM_UNUSED_4 0x4 + #define PIRANHA_PLANT_ANIM_UNUSED_5 0x5 + #define PIRANHA_PLANT_ANIM_STOP_BITING 0x6 + #define PIRANHA_PLANT_ANIM_UNUSED_7 0x7 + #define PIRANHA_PLANT_ANIM_SLEEPING 0x8 -/* Piranha Plant bubble */ - #define PIRANHA_PLANT_BUBBLE_ACT_IDLE 0 - #define PIRANHA_PLANT_BUBBLE_ACT_GROW_SHRINK_LOOP 1 - #define PIRANHA_PLANT_BUBBLE_ACT_BURST 2 +/* Piranha Plant Bubble */ + /* oAction */ + #define PIRANHA_PLANT_BUBBLE_ACT_IDLE 0x0 + #define PIRANHA_PLANT_BUBBLE_ACT_GROW_SHRINK_LOOP 0x1 + #define PIRANHA_PLANT_BUBBLE_ACT_BURST 0x2 + +/* Checkerboard Platform Group */ + /* oBehParams2ndByte */ + #define CHECKERBOARD_PLATFORM_GROUP_BP_SET_DEFAULT 0x00 + #define CHECKERBOARD_PLATFORM_GROUP_BP_DEFAULT_MAX 0x41 + +/* Checkerboard Platform */ + /* oBehParams2ndByte */ + #define CHECKERBOARD_PLATFORM_BP_MOVE_UP 0x0 + #define CHECKERBOARD_PLATFORM_BP_MOVE_DOWN 0x1 + /* oAction */ + #define CHECKERBOARD_PLATFORM_ACT_MOVE_VERTICALLY 0x0 + #define CHECKERBOARD_PLATFORM_ACT_MOVE_UP 0x1 + #define CHECKERBOARD_PLATFORM_ACT_ROTATE_UP 0x2 + #define CHECKERBOARD_PLATFORM_ACT_MOVE_DOWN 0x3 + #define CHECKERBOARD_PLATFORM_ACT_ROTATE_DOWN 0x4 /* Platform on track */ /* oAction */ - #define PLATFORM_ON_TRACK_ACT_INIT 0 - #define PLATFORM_ON_TRACK_ACT_WAIT_FOR_MARIO 1 - #define PLATFORM_ON_TRACK_ACT_MOVE_ALONG_TRACK 2 - #define PLATFORM_ON_TRACK_ACT_PAUSE_BRIEFLY 3 - #define PLATFORM_ON_TRACK_ACT_FALL 4 - + #define PLATFORM_ON_TRACK_ACT_INIT 0x0 + #define PLATFORM_ON_TRACK_ACT_WAIT_FOR_MARIO 0x1 + #define PLATFORM_ON_TRACK_ACT_MOVE_ALONG_TRACK 0x2 + #define PLATFORM_ON_TRACK_ACT_PAUSE_BRIEFLY 0x3 + #define PLATFORM_ON_TRACK_ACT_FALL 0x4 /* oBehParams >> 16 */ - #define PLATFORM_ON_TRACK_BP_MASK_PATH 0xF - #define PLATFORM_ON_TRACK_BP_MASK_TYPE (0x7 << 4) - #define PLATFORM_ON_TRACK_BP_RETURN_TO_START (1 << 8) - #define PLATFORM_ON_TRACK_BP_DONT_DISAPPEAR (1 << 9) - #define PLATFORM_ON_TRACK_BP_DONT_TURN_YAW (1 << 10) - #define PLATFORM_ON_TRACK_BP_DONT_TURN_ROLL (1 << 11) + #define PLATFORM_ON_TRACK_BP_MASK_PATH 0xF + #define PLATFORM_ON_TRACK_BP_MASK_TYPE (0x7 << 4) + #define PLATFORM_ON_TRACK_BP_RETURN_TO_START (1 << 8) + #define PLATFORM_ON_TRACK_BP_DONT_DISAPPEAR (1 << 9) + #define PLATFORM_ON_TRACK_BP_DONT_TURN_YAW (1 << 10) + #define PLATFORM_ON_TRACK_BP_DONT_TURN_ROLL (1 << 11) + /* oPlatformOnTrackType */ + #define PLATFORM_ON_TRACK_TYPE_CARPET 0x0 + #define PLATFORM_ON_TRACK_TYPE_SKI_LIFT 0x1 + #define PLATFORM_ON_TRACK_TYPE_CHECKERED 0x2 + #define PLATFORM_ON_TRACK_TYPE_GRATE 0x3 - #define PLATFORM_ON_TRACK_TYPE_CARPET 0 - #define PLATFORM_ON_TRACK_TYPE_SKI_LIFT 1 - #define PLATFORM_ON_TRACK_TYPE_CHECKERED 2 - #define PLATFORM_ON_TRACK_TYPE_GRATE 3 +/* HMC Controllable Platform */ + /* oBehParams2ndByte / sControllablePlatformDirectionState */ + #define DIRECTION_STATE_STOPPED 0x0 + #define DIRECTION_STATE_SOUTH 0x1 + #define DIRECTION_STATE_NORTH 0x2 + #define DIRECTION_STATE_EAST 0x3 + #define DIRECTION_STATE_WEST 0x4 + #define DIRECTION_STATE_HIT_WALL 0x5 + #define DIRECTION_STATE_DISAPPEARING 0x6 + /* oControllablePlatformWallHitDirection */ + #define MOVE_DIRECTION_NORTH 0x1 + #define MOVE_DIRECTION_SOUTH 0x2 + #define MOVE_DIRECTION_WEST 0x3 + #define MOVE_DIRECTION_EAST 0x4 -/* Purple switch */ - #define PURPLE_SWITCH_IDLE 0 - #define PURPLE_SWITCH_PRESSED 1 - #define PURPLE_SWITCH_TICKING 2 - #define PURPLE_SWITCH_UNPRESSED 3 - #define PURPLE_SWITCH_WAIT_FOR_MARIO_TO_GET_OFF 4 +/* HMC Controllable Platform Button */ + /* oAction */ + #define CONTROLLABLE_PLATFORM_ACT_UNPRESSED 0x0 + #define CONTROLLABLE_PLATFORM_BUTTON_ACT_PRESSED 0x1 + #define CONTROLLABLE_PLATFORM_BUTTON_ACT_CHECK_UNPRESS 0x2 + +/* Elevator */ + /* oBehParams2ndByte */ + #define ELEVATOR_BP_HMC_WORK 0x0 + #define ELEVATOR_BP_HMC_EMERGENCY_EXIT 0x1 + #define ELEVATOR_BP_HMC_NAVIGATING_THE_TOXIC_MAZE 0x2 + #define ELEVATOR_BP_HMC_LAKE 0x3 + #define ELEVATOR_BP_BBH_MESH 0x4 + #define ELEVATOR_BP_RAINBOW_RIDE 0x5 + #define ELEVATOR_BP_UNUSED 0x6 + /* oAction */ + #define ELEVATOR_ACT_IDLE 0x0 + #define ELEVATOR_ACT_MOVING_UP 0x1 + #define ELEVATOR_ACT_MOVING_DOWN 0x2 + #define ELEVATOR_ACT_LANDED 0x3 + #define ELEVATOR_ACT_LANDED_RR 0x4 + /* oElevatorType */ + #define ELEVATOR_TYPE_DEFAULT 0x0 + #define ELEVATOR_TYPE_RR 0x1 + #define ELEVATOR_TYPE_ABOVE_HOME 0x2 // roomless? + +/* WDW Express Elevator */ + /* oAction */ + #define EXPRESS_ELEVATOR_ACT_IDLE 0x0 + #define EXPRESS_ELEVATOR_ACT_MOVING_DOWN 0x1 + #define EXPRESS_ELEVATOR_ACT_PAUSING_AT_BOTTOM 0x2 + #define EXPRESS_ELEVATOR_ACT_MOVING_UP 0x3 + #define EXPRESS_ELEVATOR_ACT_DONE 0x4 /* Pyramid elevator */ - #define PYRAMID_ELEVATOR_IDLE 0 - #define PYRAMID_ELEVATOR_START_MOVING 1 - #define PYRAMID_ELEVATOR_CONSTANT_VELOCITY 2 - #define PYRAMID_ELEVATOR_AT_BOTTOM 3 + /* oAction */ + #define PYRAMID_ELEVATOR_IDLE 0x0 + #define PYRAMID_ELEVATOR_START_MOVING 0x1 + #define PYRAMID_ELEVATOR_CONSTANT_VELOCITY 0x2 + #define PYRAMID_ELEVATOR_AT_BOTTOM 0x3 /* Pyramid top */ - #define PYRAMID_TOP_ACT_CHECK_IF_SOLVED 0 - #define PYRAMID_TOP_ACT_SPINNING 1 - #define PYRAMID_TOP_ACT_EXPLODE 2 + /* oAction */ + #define PYRAMID_TOP_ACT_CHECK_IF_SOLVED 0x0 + #define PYRAMID_TOP_ACT_SPINNING 0x1 + #define PYRAMID_TOP_ACT_EXPLODE 0x2 /* Pyramid wall */ - /* oAction */ - #define PYRAMID_WALL_ACT_MOVING_DOWN 0 - #define PYRAMID_WALL_ACT_MOVING_UP 1 - /* oBehParams2ndByte */ - #define PYRAMID_WALL_BP_POSITION_HIGH 0 - #define PYRAMID_WALL_BP_POSITION_MIDDLE 1 - #define PYRAMID_WALL_BP_POSITION_LOW 2 + #define PYRAMID_WALL_BP_POSITION_HIGH 0x0 + #define PYRAMID_WALL_BP_POSITION_MIDDLE 0x1 + #define PYRAMID_WALL_BP_POSITION_LOW 0x2 + /* oAction */ + #define PYRAMID_WALL_ACT_MOVING_DOWN 0x0 + #define PYRAMID_WALL_ACT_MOVING_UP 0x1 + +/* Tox Box */ + /* oBehParams2ndByte */ + #define TOX_BOX_BP_PATTERN_1 0x0 + #define TOX_BOX_BP_PATTERN_2 0x1 + #define TOX_BOX_BP_PATTERN_3 0x2 + /* oAction */ + #define TOX_BOX_ACT_END -0x1 + #define TOX_BOX_ACT_INIT 0x0 + #define TOX_BOX_ACT_STEP 0x1 + #define TOX_BOX_ACT_WAIT 0x2 + #define TOX_BOX_ACT_MOVE_FORWARD 0x3 + #define TOX_BOX_ACT_MOVE_BACKWARD 0x4 + #define TOX_BOX_ACT_MOVE_DOWN 0x5 + #define TOX_BOX_ACT_MOVE_UP 0x6 /* Penguins (general) */ /* Walking sounds */ - #define PENGUIN_WALK_BABY 0 - #define PENGUIN_WALK_BIG 1 - + #define PENGUIN_SOUND_WALK_BABY 0x0 + #define PENGUIN_SOUND_WALK_BIG 0x1 + /* geo_switch_tuxie_mother_eyes */ + #define PENGUIN_ANIM_STATE_EYES_OPEN 0x0 + #define PENGUIN_ANIM_STATE_EYES_HALF_CLOSED 0x1 + #define PENGUIN_ANIM_STATE_EYES_CLOSED 0x2 + #define PENGUIN_ANIM_STATE_EYES_ANGRY 0x3 + #define PENGUIN_ANIM_STATE_EYES_SAD 0x4 /* Animations */ - #define PENGUIN_ANIM_WALK 0 - #define PENGUIN_ANIM_IDLE 3 + #define PENGUIN_ANIM_WALK 0x0 + #define PENGUIN_ANIM_DIVE_SLIDE 0x1 + #define PENGUIN_ANIM_STAND_UP 0x2 + #define PENGUIN_ANIM_IDLE 0x3 -/* Racing penguin */ +/* Racing Penguin */ + /* oBehParams2ndByte */ + #define RACING_PENGUIN_BP_NORMAL 0x0 + #define RACING_PENGUIN_BP_120_STARS 0x1 /* oAction */ - #define RACING_PENGUIN_ACT_WAIT_FOR_MARIO 0 - #define RACING_PENGUIN_ACT_SHOW_INIT_TEXT 1 - #define RACING_PENGUIN_ACT_PREPARE_FOR_RACE 2 - #define RACING_PENGUIN_ACT_RACE 3 - #define RACING_PENGUIN_ACT_FINISH_RACE 4 - #define RACING_PENGUIN_ACT_SHOW_FINAL_TEXT 5 + #define RACING_PENGUIN_ACT_WAIT_FOR_MARIO 0x0 + #define RACING_PENGUIN_ACT_SHOW_INIT_TEXT 0x1 + #define RACING_PENGUIN_ACT_PREPARE_FOR_RACE 0x2 + #define RACING_PENGUIN_ACT_RACE 0x3 + #define RACING_PENGUIN_ACT_FINISH_RACE 0x4 + #define RACING_PENGUIN_ACT_SHOW_FINAL_TEXT 0x5 -/* SL walking penguin */ +/* Mother Penguin */ /* oAction */ - #define SL_WALKING_PENGUIN_ACT_MOVING_FORWARDS 0 - #define SL_WALKING_PENGUIN_ACT_TURNING_BACK 1 - #define SL_WALKING_PENGUIN_ACT_RETURNING 2 - #define SL_WALKING_PENGUIN_ACT_TURNING_FORWARDS 3 + #define MOTHER_PENGUIN_ACT_IDLE 0x0 + #define MOTHER_PENGUIN_ACT_RECEIVE_BABY 0x1 + #define MOTHER_PENGUIN_ACT_RECEIVED_BABY 0x2 + /* oSubAction */ + /* MOTHER_PENGUIN_ACT_IDLE */ + #define MOTHER_PENGUIN_SUB_ACT_READY_TO_ASK 0x0 + #define MOTHER_PENGUIN_SUB_ACT_ASK_FOR_BABY 0x1 + #define MOTHER_PENGUIN_SUB_ACT_ALREADY_ASKED 0x2 + /* MOTHER_PENGUIN_ACT_RECEIVE_BABY */ + #define MOTHER_PENGUIN_SUB_ACT_RECEIVE_BABY 0x0 + #define MOTHER_PENGUIN_SUB_ACT_CORRECT_BABY 0x1 + #define MOTHER_PENGUIN_SUB_ACT_WRONG_BABY 0x2 + /* MOTHER_PENGUIN_ACT_RECEIVED_BABY */ + #define MOTHER_PENGUIN_SUB_ACT_CHASE_MARIO 0x0 + #define MOTHER_PENGUIN_SUB_ACT_STOP_CHASING_MARIO 0x1 + +/* Small Penguin */ + /* oAction */ + #define SMALL_PENGUIN_ACT_WALKING 0x0 + #define SMALL_PENGUIN_ACT_WALKING_TOWARD_MARIO 0x1 + #define SMALL_PENGUIN_ACT_WALKING_AWAY_FROM_MARIO 0x2 + #define SMALL_PENGUIN_ACT_DIVE_SLIDING 0x3 + #define SMALL_PENGUIN_ACT_DIVE_SLIDING_STOP 0x4 + #define SMALL_PENGUIN_ACT_NEAR_MOTHER 0x5 + +/* SL walking Penguin */ + /* oAction */ + #define SL_WALKING_PENGUIN_ACT_MOVING_FORWARDS 0x0 + #define SL_WALKING_PENGUIN_ACT_TURNING_BACK 0x1 + #define SL_WALKING_PENGUIN_ACT_RETURNING 0x2 + #define SL_WALKING_PENGUIN_ACT_TURNING_FORWARDS 0x3 /* Snowman wind */ /* oSubAction */ - #define SL_SNOWMAN_WIND_ACT_IDLE 0 - #define SL_SNOWMAN_WIND_ACT_TALKING 1 - #define SL_SNOWMAN_WIND_ACT_BLOWING 2 + #define SL_SNOWMAN_WIND_ACT_IDLE 0x0 + #define SL_SNOWMAN_WIND_ACT_TALKING 0x1 + #define SL_SNOWMAN_WIND_ACT_BLOWING 0x2 +/* Snow Mound */ + /* oAction */ + #define SNOW_MOUND_ACT_MOVE 0x0 + #define SNOW_MOUND_ACT_SINK 0x1 + +/* Snowman Head */ + /* oAction */ + #define SNOWMANS_HEAD_ACT_ASK 0x0 + #define SNOWMANS_HEAD_ACT_NONE 0x1 + #define SNOWMANS_HEAD_ACT_JUMPING 0x2 + #define SNOWMANS_HEAD_ACT_LAND 0x3 + #define SNOWMANS_HEAD_ACT_THANK 0x4 + +/* Snowman Bottom */ + /* oAction */ + #define SNOWMANS_BOTTOM_ACT_WAITING 0x0 + #define SNOWMANS_BOTTOM_ACT_FOLLOW_PATH 0x1 + #define SNOWMANS_BOTTOM_ACT_FINAL_STRETCH 0x2 + #define SNOWMANS_BOTTOM_ACT_REACH_END 0x3 + #define SNOWMANS_BOTTOM_ACT_COLLISION 0x4 + +/* Water Bomb Cannon */ + /* oBehParams2ndByte */ + #define WATER_BOMB_CANNON_BP_ACTIVE 0x0 + /* oAction */ + #define WATER_BOMB_CANNON_ACT_HIDDEN 0x0 + #define WATER_BOMB_CANNON_ACT_ACTIVE 0x1 + #define WATER_BOMB_CANNON_ACT_HIDE 0x2 /* Water bomb */ /* oAction */ - #define WATER_BOMB_ACT_SHOT_FROM_CANNON 0 - #define WATER_BOMB_ACT_INIT 1 - #define WATER_BOMB_ACT_DROP 2 - #define WATER_BOMB_ACT_EXPLODE 3 + #define WATER_BOMB_ACT_SHOT_FROM_CANNON 0x0 + #define WATER_BOMB_ACT_INIT 0x1 + #define WATER_BOMB_ACT_DROP 0x2 + #define WATER_BOMB_ACT_EXPLODE 0x3 + +/* TTC Painting Clock Arm */ + /* oAction */ + #define CLOCK_ARM_ACT_CHECK_DEFAULT 0x0 + #define CLOCK_ARM_ACT_MOVING 0x1 + #define CLOCK_ARM_ACT_STOP 0x2 /* TTC rotating solid */ /* oBehParams2ndByte */ - #define TTC_ROTATING_SOLID_BP_CUBE 0 - #define TTC_ROTATING_SOLID_BP_TRIANGULAR_PRISM 1 + #define TTC_ROTATING_SOLID_BP_CUBE 0x0 + #define TTC_ROTATING_SOLID_BP_TRIANGULAR_PRISM 0x1 /* TTC moving bar */ /* oAction */ - #define TTC_MOVING_BAR_ACT_WAIT 0 - #define TTC_MOVING_BAR_ACT_PULL_BACK 1 - #define TTC_MOVING_BAR_ACT_EXTEND 2 - #define TTC_MOVING_BAR_ACT_RETRACT 3 + #define TTC_MOVING_BAR_ACT_WAIT 0x0 + #define TTC_MOVING_BAR_ACT_PULL_BACK 0x1 + #define TTC_MOVING_BAR_ACT_EXTEND 0x2 + #define TTC_MOVING_BAR_ACT_RETRACT 0x3 /* TTC cog */ /* oBehParams2ndByte */ - #define TTC_COG_BP_SHAPE_MASK 0x00000002 - #define TTC_COG_BP_SHAPE_HEXAGON (0 << 1) - #define TTC_COG_BP_SHAPE_TRIANGLE (1 << 1) - #define TTC_COG_BP_DIR_MASK 0x00000001 - #define TTC_COG_BP_DIR_CCW (0 << 0) // TODO: Check these - #define TTC_COG_BP_DIR_CW (1 << 0) + #define TTC_COG_BP_SHAPE_MASK 0x00000002 + #define TTC_COG_BP_SHAPE_HEXAGON (0 << 1) + #define TTC_COG_BP_SHAPE_TRIANGLE (1 << 1) + #define TTC_COG_BP_DIR_MASK 0x00000001 + #define TTC_COG_BP_DIR_CCW (0 << 0) // TODO: Check these + #define TTC_COG_BP_DIR_CW (1 << 0) /* TTC 2D Rotator */ /* oBehParams2ndByte */ - #define TTC_2D_ROTATOR_BP_HAND 0 - #define TTC_2D_ROTATOR_BP_2D_COG 1 + #define TTC_2D_ROTATOR_BP_HAND 0x0 + #define TTC_2D_ROTATOR_BP_2D_COG 0x1 + +/* TTC Treadmill */ + /* oBehParams2ndByte */ + #define TREADMILL_BP_LARGE 0x0 + #define TREADMILL_BP_SMALL 0x1 + #define TREADMILL_BP_SIZE_MASK 0x1 /* Activated Back-and-Forth Platform */ - /* ((u16)(o->oBehParams >> 16) & 0x0300) >> 8 aka platform type */ - #define ACTIVATED_BF_PLAT_TYPE_BITS_ARROW_PLAT 0 - #define ACTIVATED_BF_PLAT_TYPE_BITFS_MESH_PLAT 1 - #define ACTIVATED_BF_PLAT_TYPE_BITFS_ELEVATOR 2 + /* ((u16)(o->oBehParams >> 16) & 0x0300) >> 8 aka platform type */ + #define ACTIVATED_BF_PLAT_TYPE_BITS_ARROW_PLAT 0x0 + #define ACTIVATED_BF_PLAT_TYPE_BITFS_MESH_PLAT 0x1 + #define ACTIVATED_BF_PLAT_TYPE_BITFS_ELEVATOR 0x2 + +/* Unagi */ + /* oBehParams2ndByte */ + #define UNAGI_BP_IN_SHIP 0x0 + #define UNAGI_BP_IN_CAVE 0x1 + #define UNAGI_BP_START_SWIMMING 0x2 + /* oAction */ + #define UNAGI_ACT_SHIP_RESET_PATH 0x0 + #define UNAGI_ACT_SHIP_PATH 0x1 + #define UNAGI_ACT_RETURN_TO_CAVE 0x2 + #define UNAGI_ACT_IN_CAVE 0x3 + #define UNAGI_ACT_CAVE_PATH 0x4 + /* oSubAction */ + /* UNAGI_ACT_SHIP_RESET_PATH */ + #define UNAGI_SUB_ACT_SHIP_RESET_PATH_WAIT_FOR_MARIO 0x0 + #define UNAGI_SUB_ACT_SHIP_RESET_PATH_DO_RESET 0x1 + /* oAnimState */ + #define UNAGI_ANIM_STATE_NO_STAR 0x0 + #define UNAGI_ANIM_STATE_HAS_STAR 0x1 + #define UNAGI_ANIM_STATE_HAS_TRANSPARENT_STAR 0x2 + /* Animations */ + #define UNAGI_ANIM_YAWN 0x0 + #define UNAGI_ANIM_BITE 0x1 + #define UNAGI_ANIM_SWIM 0x2 + #define UNAGI_ANIM_STATIC_STRAIGHT 0x3 + #define UNAGI_ANIM_IDLE_2_1 0x4 + #define UNAGI_ANIM_OPEN_MOUTH 0x5 + #define UNAGI_ANIM_IDLE_2 0x6 + +/* Unagi Sub Object */ + /* oBehParams2ndByte */ + #define UNAGI_PART_BP_BACK -0x4 + #define UNAGI_PART_BP_CONTROL_DISTANCE 0x3 + #define UNAGI_PART_BP_FRONT 0x4 /* Dorrie */ /* oAction */ - #define DORRIE_ACT_MOVE 0 - #define DORRIE_ACT_LOWER_HEAD 1 - #define DORRIE_ACT_RAISE_HEAD 2 + #define DORRIE_ACT_MOVE 0x0 + #define DORRIE_ACT_LOWER_HEAD 0x1 + #define DORRIE_ACT_RAISE_HEAD 0x2 + /* Animations */ + #define DORRIE_ANIM_UNUSED 0x0 + #define DORRIE_ANIM_RAISE_HEAD 0x1 + #define DORRIE_ANIM_LOWER_HEAD 0x2 /* Mad piano */ /* oAction */ - #define MAD_PIANO_ACT_WAIT 0 - #define MAD_PIANO_ACT_ATTACK 1 + #define MAD_PIANO_ACT_WAIT 0x0 + #define MAD_PIANO_ACT_ATTACK 0x1 + /* Animations */ + #define MAD_PIANO_ANIM_SLEEPING 0x0 + #define MAD_PIANO_ANIM_CHOMPING 0x1 + +/* Haunted Chair */ + /* oAction */ + #define HAUNTED_CHAIR_ACT_FALL_OR_SPIN 0x0 + #define HAUNTED_CHAIR_ACT_FLY 0x1 + /* Animations */ + #define HAUNTED_CHAIR_ANIM_DEFAULT 0x0 /* Fire piranha plant */ /* oAction */ - #define FIRE_PIRANHA_PLANT_ACT_HIDE 0 - #define FIRE_PIRANHA_PLANT_ACT_GROW 1 + #define FIRE_PIRANHA_PLANT_ACT_HIDE 0x0 + #define FIRE_PIRANHA_PLANT_ACT_GROW 0x1 + /* Animations */ + #define FIRE_PIRANHA_PLANT_ANIM_SHRINK 0x0 + #define FIRE_PIRANHA_PLANT_ANIM_UNUSED_1 0x1 + #define FIRE_PIRANHA_PLANT_ANIM_ATTACKED 0x2 + #define FIRE_PIRANHA_PLANT_ANIM_UNUSED_3 0x3 + #define FIRE_PIRANHA_PLANT_ANIM_GROW 0x4 /* Fire spitter */ /* oAction */ - #define FIRE_SPITTER_ACT_IDLE 0 - #define FIRE_SPITTER_ACT_SPIT_FIRE 1 + #define FIRE_SPITTER_ACT_IDLE 0x0 + #define FIRE_SPITTER_ACT_SPIT_FIRE 0x1 + +/* Moving Flame */ + /* oBehParams2ndByte */ + #define MOVING_FLAME_BP_1FRAME 0x0 + #define MOVING_FLAME_BP_MOVE 0x1 + +/* Fly Guy Flame */ + /* oBehParams2ndByte */ + #define MOVING_FLAME_PARTICLE_BP_UNK1 0x1 + +/* Flamethrower */ + /* oBehParams2ndByte */ + #define FLAMETHROWER_BP_0 0x0 + #define FLAMETHROWER_BP_BLUE 0x1 + #define FLAMETHROWER_BP_SLOW 0x2 + #define FLAMETHROWER_BP_TALL_HITBOX 0x3 + #define FLAMETHROWER_BP_UPWARDS 0x4 + /* oAction */ + #define FLAMETHROWER_ACT_IDLE 0x0 + #define FLAMETHROWER_ACT_BLOW_FIRE 0x1 + #define FLAMETHROWER_ACT_COOLDOWN 0x2 + +/* Bouncing Fireball Flame */ + /* oAction */ + #define BOUNCING_FLAME_ACT_SPAWNED 0x0 + #define BOUNCING_FLAME_ACT_LANDED 0x1 + +/* Bouncing Fireball */ + /* oAction */ + #define BOUNCING_FIREBALL_SPAWNER_ACT_IDLE 0x0 + #define BOUNCING_FIREBALL_SPAWNER_ACT_SPAWN_FLAME 0x1 + #define BOUNCING_FIREBALL_SPAWNER_ACT_COOLDOWN 0x2 /* Eyerok boss */ /* oAction */ - #define EYEROK_BOSS_ACT_SLEEP 0 - #define EYEROK_BOSS_ACT_WAKE_UP 1 - #define EYEROK_BOSS_ACT_SHOW_INTRO_TEXT 2 - #define EYEROK_BOSS_ACT_FIGHT 3 - #define EYEROK_BOSS_ACT_DIE 4 + #define EYEROK_BOSS_ACT_SLEEP 0x0 + #define EYEROK_BOSS_ACT_WAKE_UP 0x1 + #define EYEROK_BOSS_ACT_SHOW_INTRO_TEXT 0x2 + #define EYEROK_BOSS_ACT_FIGHT 0x3 + #define EYEROK_BOSS_ACT_DIE 0x4 + /* oSubAction */ + /* EYEROK_BOSS_ACT_WAKE_UP */ + #define EYEROK_BOSS_SUB_ACT_WAKE_LOWER_VOLUME 0x0 + #define EYEROK_BOSS_SUB_ACT_WAKE_WAIT_FOR_DIALOG 0x1 /* Eyerok hand */ + /* oBehParams2ndByte */ + #define EYEROK_BP_LEFT_HAND -0x1 + #define EYEROK_BP_RIGHT_HAND 0x1 /* oAction */ - #define EYEROK_HAND_ACT_SLEEP 0 - #define EYEROK_HAND_ACT_IDLE 1 - #define EYEROK_HAND_ACT_OPEN 2 - #define EYEROK_HAND_ACT_SHOW_EYE 3 - #define EYEROK_HAND_ACT_CLOSE 4 - #define EYEROK_HAND_ACT_RETREAT 5 - #define EYEROK_HAND_ACT_TARGET_MARIO 6 - #define EYEROK_HAND_ACT_SMASH 7 - #define EYEROK_HAND_ACT_FIST_PUSH 8 - #define EYEROK_HAND_ACT_FIST_SWEEP 9 - #define EYEROK_HAND_ACT_BEGIN_DOUBLE_POUND 10 // raising for double smash - #define EYEROK_HAND_ACT_DOUBLE_POUND 11 // double smashing - #define EYEROK_HAND_ACT_ATTACKED 12 - #define EYEROK_HAND_ACT_RECOVER 13 - #define EYEROK_HAND_ACT_BECOME_ACTIVE 14 - #define EYEROK_HAND_ACT_DIE 15 + #define EYEROK_HAND_ACT_SLEEP 0x0 + #define EYEROK_HAND_ACT_IDLE 0x1 + #define EYEROK_HAND_ACT_OPEN 0x2 + #define EYEROK_HAND_ACT_SHOW_EYE 0x3 + #define EYEROK_HAND_ACT_CLOSE 0x4 + #define EYEROK_HAND_ACT_RETREAT 0x5 + #define EYEROK_HAND_ACT_TARGET_MARIO 0x6 + #define EYEROK_HAND_ACT_SMASH 0x7 + #define EYEROK_HAND_ACT_FIST_PUSH 0x8 + #define EYEROK_HAND_ACT_FIST_SWEEP 0x9 + #define EYEROK_HAND_ACT_BEGIN_DOUBLE_POUND 0xA // raising for double smash + #define EYEROK_HAND_ACT_DOUBLE_POUND 0xB // double smashing + #define EYEROK_HAND_ACT_ATTACKED 0xC + #define EYEROK_HAND_ACT_RECOVER 0xD + #define EYEROK_HAND_ACT_BECOME_ACTIVE 0xE + #define EYEROK_HAND_ACT_DIE 0xF + /* oAnimState */ + #define EYEROK_HAND_ANIM_STATE_EYE_OPEN 0x0 + #define EYEROK_HAND_ANIM_STATE_EYE_MOSTLY_OPEN 0x1 + #define EYEROK_HAND_ANIM_STATE_EYE_MOSTLY_CLOSED 0x2 + #define EYEROK_HAND_ANIM_STATE_EYE_CLOSED 0x3 + /* oEyerokHandAnimStateIndex */ + #define EYEROK_HAND_ANIM_STATE_INDEX_EYE_OPEN_1 0x0 + #define EYEROK_HAND_ANIM_STATE_INDEX_EYE_CLOSING 0x1 // mostly open + #define EYEROK_HAND_ANIM_STATE_INDEX_EYE_CLOSED 0x2 + #define EYEROK_HAND_ANIM_STATE_INDEX_EYE_OPENING_1 0x3 // mostly closed + #define EYEROK_HAND_ANIM_STATE_INDEX_EYE_OPENING_2 0x4 // mostly open + #define EYEROK_HAND_ANIM_STATE_INDEX_EYE_OPEN_2 0x5 + /* Animations */ + #define EYEROK_HAND_ANIM_RECOVER 0x0 + #define EYEROK_HAND_ANIM_DEATH 0x1 + #define EYEROK_HAND_ANIM_IDLE 0x2 + #define EYEROK_HAND_ANIM_ATTACKED 0x3 + #define EYEROK_HAND_ANIM_OPEN 0x4 + #define EYEROK_HAND_ANIM_SHOW_EYE 0x5 + #define EYEROK_HAND_ANIM_SLEEPING 0x6 + #define EYEROK_HAND_ANIM_CLOSE 0x7 + +/* King Bobomb */ + /* oAction */ + #define KING_BOBOMB_ACT_INACTIVE 0x0 + #define KING_BOBOMB_ACT_ACTIVATE 0x1 + #define KING_BOBOMB_ACT_ACTIVE 0x2 + #define KING_BOBOMB_ACT_GRABBED_MARIO 0x3 + #define KING_BOBOMB_ACT_BEEN_THROWN 0x4 + #define KING_BOBOMB_ACT_RETURN_HOME 0x5 + #define KING_BOBOMB_ACT_HIT_GROUND 0x6 + #define KING_BOBOMB_ACT_DEATH 0x7 + #define KING_BOBOMB_ACT_STOP_MUSIC 0x8 + /* oSubAction */ + /* KING_BOBOMB_ACT_INACTIVE */ + #define KING_BOBOMB_SUB_ACT_INACTIVE_INIT 0x0 + #define KING_BOBOMB_SUB_ACT_INACTIVE_DIALOG 0x1 + /* KING_BOBOMB_ACT_GRABBED_MARIO */ + #define KING_BOBOMB_SUB_ACT_GRABBED_MARIO_GRAB 0x0 + #define KING_BOBOMB_SUB_ACT_GRABBED_MARIO_HOLDING 0x1 + #define KING_BOBOMB_SUB_ACT_GRABBED_MARIO_THROW 0x2 + /* KING_BOBOMB_ACT_BEEN_THROWN */ + #define KING_BOBOMB_SUB_ACT_THROWN_FALL 0x0 + #define KING_BOBOMB_SUB_ACT_THROWN_STAND_UP 0x1 + #define KING_BOBOMB_SUB_ACT_THROWN_END 0x2 + /* KING_BOBOMB_ACT_RETURN_HOME */ + #define KING_BOBOMB_SUB_ACT_RETURN_HOME_JUMP 0x0 + #define KING_BOBOMB_SUB_ACT_RETURN_HOME_LANDING 0x1 + #define KING_BOBOMB_SUB_ACT_RETURN_HOME_LANDING_END 0x2 + #define KING_BOBOMB_SUB_ACT_RETURN_HOME_WAIT_FOR_DIALOG 0x3 + #define KING_BOBOMB_SUB_ACT_RETURN_HOME_DIALOG 0x4 + /* KING_BOBOMB_ACT_HIT_GROUND */ + #define KING_BOBOMB_SUB_ACT_HIT_GROUND_HIT 0x0 + #define KING_BOBOMB_SUB_ACT_HIT_GROUND_STAND_UP 0x1 + #define KING_BOBOMB_SUB_ACT_HIT_GROUND_START_WALKING 0x2 + /* Animations */ + #define KING_BOBOMB_ANIM_GRAB_MARIO 0x0 + #define KING_BOBOMB_ANIM_HOLDING_MARIO 0x1 + #define KING_BOBOMB_ANIM_HIT_GROUND 0x2 + #define KING_BOBOMB_ANIM_UNUSED_3 0x3 + #define KING_BOBOMB_ANIM_STOMP 0x4 + #define KING_BOBOMB_ANIM_IDLE 0x5 + #define KING_BOBOMB_ANIM_HELD 0x6 + #define KING_BOBOMB_ANIM_T_POSE 0x7 + #define KING_BOBOMB_ANIM_JUMP 0x8 + #define KING_BOBOMB_ANIM_THROW_MARIO 0x9 + #define KING_BOBOMB_ANIM_STAND_UP 0xA + #define KING_BOBOMB_ANIM_WALKING 0xB + +/* Chuckya */ + /* oAction */ + #define CHUCKYA_ACT_MOVING 0x0 + #define CHUCKYA_ACT_GRABBED_MARIO 0x1 + #define CHUCKYA_ACT_THROWN 0x2 + #define CHUCKYA_ACT_RELEASE_MARIO 0x3 + /* oSubAction */ + /* CHUCKYA_ACT_MOVING */ + #define CHUCKYA_SUB_ACT_TURN_TOWARD_MARIO 0x0 + #define CHUCKYA_SUB_ACT_ACCELERATE 0x1 + #define CHUCKYA_SUB_ACT_STOP 0x2 + #define CHUCKYA_SUB_ACT_TURN_TOWARD_HOME 0x3 + /* CHUCKYA_ACT_GRABBED_MARIO */ + #define CHUCKYA_SUB_ACT_GRAB_MARIO 0x0 + #define CHUCKYA_SUB_ACT_HOLD_MARIO 0x1 + #define CHUCKYA_SUB_ACT_THROW_MARIO 0x2 + /* oCommonAnchorAction */ + #define COMMON_ANCHOR_ACT_INACTIVE 0x0 + #define COMMON_ANCHOR_ACT_SET_MARIO_GFX_TO_POS 0x1 + #define COMMON_ANCHOR_ACT_THROW_MARIO 0x2 + #define COMMON_ANCHOR_ACT_DROP_MARIO 0x3 + /* Animations */ + #define CHUCKYA_ANIM_GRAB_MARIO 0x0 + #define CHUCKYA_ANIM_THROW_1 0x1 + #define CHUCKYA_ANIM_HELD 0x2 + #define CHUCKYA_ANIM_THROW_2 0x3 + #define CHUCKYA_ANIM_IDLE 0x4 + #define CHUCKYA_ANIM_SPAWN 0x5 + +/* Heave Ho */ + /* oAction */ + #define HEAVE_HO_ACT_INACTIVE 0x0 + #define HEAVE_HO_ACT_WINDING_UP 0x1 + #define HEAVE_HO_ACT_MOVING 0x2 + #define HEAVE_HO_ACT_THROW_MARIO 0x3 + /* Animations */ + #define HEAVE_HO_ANIM_MOVING 0x0 + #define HEAVE_HO_ANIM_THROW 0x1 + #define HEAVE_HO_ANIM_WINDING_UP 0x2 /* Klepto */ + /* oBehParams2ndByte */ + #define KLEPTO_BP_NO_STAR 0x0 + #define KLEPTO_BP_HAS_STAR 0x1 /* oAction */ - #define KLEPTO_ACT_CIRCLE_TARGET_HOLDING 0 - #define KLEPTO_ACT_APPROACH_TARGET_HOLDING 1 - #define KLEPTO_ACT_WAIT_FOR_MARIO 2 - #define KLEPTO_ACT_TURN_TOWARD_MARIO 3 - #define KLEPTO_ACT_DIVE_AT_MARIO 4 - #define KLEPTO_ACT_RESET_POSITION 5 - #define KLEPTO_ACT_STRUCK_BY_MARIO 6 - #define KLEPTO_ACT_RETREAT 7 - + #define KLEPTO_ACT_CIRCLE_TARGET_HOLDING 0x0 + #define KLEPTO_ACT_APPROACH_TARGET_HOLDING 0x1 + #define KLEPTO_ACT_WAIT_FOR_MARIO 0x2 + #define KLEPTO_ACT_TURN_TOWARD_MARIO 0x3 + #define KLEPTO_ACT_DIVE_AT_MARIO 0x4 + #define KLEPTO_ACT_RESET_POSITION 0x5 + #define KLEPTO_ACT_STRUCK_BY_MARIO 0x6 + #define KLEPTO_ACT_RETREAT 0x7 + /* oSubAction */ + /* KLEPTO_ACT_DIVE_AT_MARIO */ + #define KLEPTO_SUB_ACT_DIVE_TURN_PITCH 0x0 + #define KLEPTO_SUB_ACT_DIVE_STOP 0x1 /* oAnimState */ - #define KLEPTO_ANIM_STATE_HOLDING_NOTHING 0 - #define KLEPTO_ANIM_STATE_HOLDING_CAP 1 - #define KLEPTO_ANIM_STATE_HOLDING_STAR 2 + #define KLEPTO_ANIM_STATE_HOLDING_NOTHING 0x0 + #define KLEPTO_ANIM_STATE_HOLDING_CAP 0x1 + #define KLEPTO_ANIM_STATE_HOLDING_STAR 0x2 + #define KLEPTO_ANIM_STATE_HOLDING_TRANSPARENT_STAR 0x3 + /* Animations */ + #define KLEPTO_ANIM_DIVE_0 0x0 + #define KLEPTO_ANIM_STRUCK_BY_MARIO 0x1 + #define KLEPTO_ANIM_DIVE_AT_MARIO_2 0x2 + #define KLEPTO_ANIM_DIVE_AT_MARIO_3 0x3 + #define KLEPTO_ANIM_DIVE_AT_MARIO_4 0x4 + #define KLEPTO_ANIM_DIVE_FLAP_5 0x5 + #define KLEPTO_ANIM_DIVE_FLAP_6 0x6 /* Bird */ - /* oAction */ - #define BIRD_ACT_INACTIVE 0 - #define BIRD_ACT_FLY 1 - /* oBehParams2ndByte */ - #define BIRD_BP_SPAWNED 0 - #define BIRD_BP_SPAWNER 1 + #define BIRD_BP_SPAWNED 0x0 + #define BIRD_BP_SPAWNER 0x1 + /* oAction */ + #define BIRD_ACT_INACTIVE 0x0 + #define BIRD_ACT_FLY 0x1 + /* Animation */ + #define BIRD_ANIM_FLY 0x0 + +/* End Birds */ + /* oAction */ + #define END_BIRDS_ACT_INIT 0x0 + #define END_BIRDS_ACT_ACTIVE 0x1 + /* Animations */ + #define END_BIRDS_ANIM_FLY 0x0 + +/* Birds Sound */ + /* oAction */ + #define SOUND_BIRDS_BP_OBJ2_BIRD_CHIRP1 0x0 + #define SOUND_BIRDS_BP_GENERAL2_BIRD_CHIRP2 0x1 + #define SOUND_BIRDS_BP_OBJ_BIRD_CHIRP3 0x2 + +/* Scuttlebug Spawner */ + /* oAction */ + #define SCUTTLEBUG_SPAWNER_ACT_ACTIVE 0x0 + #define SCUTTLEBUG_SPAWNER_ACT_INACTIVE 0x1 + +/* Scuttlebug */ + /* oSubAction */ + #define SCUTTLEBUG_SUB_ACT_RESET 0x0 + #define SCUTTLEBUG_SUB_ACT_MOVING 0x1 + #define SCUTTLEBUG_SUB_ACT_HIT_WALL 0x2 + #define SCUTTLEBUG_SUB_ACT_ALERT 0x3 + #define SCUTTLEBUG_SUB_ACT_JUMP 0x4 + #define SCUTTLEBUG_SUB_ACT_LAND 0x5 + /* Animations */ + #define SCUTTLEBUG_ANIM_JUMP 0x0 + #define SCUTTLEBUG_ANIM_WALK 0x1 /* Skeeter */ /* oAction */ - #define SKEETER_ACT_IDLE 0 - #define SKEETER_ACT_LUNGE 1 - #define SKEETER_ACT_WALK 2 + #define SKEETER_ACT_IDLE 0x0 + #define SKEETER_ACT_LUNGE 0x1 + #define SKEETER_ACT_WALK 0x2 + /* Animations */ + #define SKEETER_ANIM_WATER_LUNGE 0x0 + #define SKEETER_ANIM_WATER_IDLE 0x1 + #define SKEETER_ANIM_WALK 0x2 + #define SKEETER_ANIM_IDLE 0x3 /* Snufit */ /* oAction */ - #define SNUFIT_ACT_IDLE 0 - #define SNUFIT_ACT_SHOOT 1 + #define SNUFIT_ACT_IDLE 0x0 + #define SNUFIT_ACT_SHOOT 0x1 + +/* Snufit Balls (gottem) */ + /* oAction */ + #define SNUFIT_BALL_ACT_MOVE 0x0 + #define SNUFIT_BALL_ACT_HIT_MARIO 0x1 /* Tweester */ /* oAction */ - #define TWEESTER_ACT_IDLE 0 - #define TWEESTER_ACT_CHASE 1 - #define TWEESTER_ACT_HIDE 2 - + #define TWEESTER_ACT_IDLE 0x0 + #define TWEESTER_ACT_CHASE 0x1 + #define TWEESTER_ACT_HIDE 0x2 /* oSubAction */ - #define TWEESTER_SUB_ACT_WAIT 0 - - #define TWEESTER_SUB_ACT_CHASE 0 + /* TWEESTER_ACT_IDLE */ + #define TWEESTER_SUB_ACT_WAIT 0x0 + #define TWEESTER_SUB_ACT_GROW 0x1 + /* TWEESTER_ACT_CHASE */ + #define TWEESTER_SUB_ACT_CHASE_MARIO 0x0 + #define TWEESTER_SUB_ACT_CHASE_HOME 0x1 /* Triplet butterfly */ - /* oAction */ - #define TRIPLET_BUTTERFLY_ACT_INIT 0 - #define TRIPLET_BUTTERFLY_ACT_WANDER 1 - #define TRIPLET_BUTTERFLY_ACT_ACTIVATE 2 - #define TRIPLET_BUTTERFLY_ACT_EXPLODE 3 - /* oBehParams2ndByte */ - #define TRIPLET_BUTTERFLY_BP_BUTTERFLY_NUM 0x00000003 - #define TRIPLET_BUTTERFLY_BP_NO_BOMBS 0x00000004 - + #define TRIPLET_BUTTERFLY_BP_BUTTERFLY_NUM 0x3 + #define TRIPLET_BUTTERFLY_BP_NO_BOMBS 0x4 + /* oAction */ + #define TRIPLET_BUTTERFLY_ACT_INIT 0x0 + #define TRIPLET_BUTTERFLY_ACT_WANDER 0x1 + #define TRIPLET_BUTTERFLY_ACT_ACTIVATE 0x2 + #define TRIPLET_BUTTERFLY_ACT_EXPLODE 0x3 /* oTripletButterflyType */ - #define TRIPLET_BUTTERFLY_TYPE_NORMAL -1 - #define TRIPLET_BUTTERFLY_TYPE_EXPLODES 0 - #define TRIPLET_BUTTERFLY_TYPE_SPAWN_1UP 1 + #define TRIPLET_BUTTERFLY_TYPE_NORMAL -0x1 + #define TRIPLET_BUTTERFLY_TYPE_EXPLODES 0x0 + #define TRIPLET_BUTTERFLY_TYPE_SPAWN_1UP 0x1 -/* Water level diamond */ + +/* Changing Water Level */ + /* oAction */ + #define WATER_LEVEL_ACT_INIT 0x0 + #define WATER_LEVEL_ACT_IDLE 0x1 + +/* Water Level Diamond */ /* oAction */ // Loading - #define WATER_LEVEL_DIAMOND_ACT_INIT 0 + #define WATER_LEVEL_DIAMOND_ACT_INIT 0x0 // Idling when Mario isn't inside its hitbox - #define WATER_LEVEL_DIAMOND_ACT_IDLE 1 + #define WATER_LEVEL_DIAMOND_ACT_IDLE 0x1 // While the water level is changing - #define WATER_LEVEL_DIAMOND_ACT_CHANGE_WATER_LEVEL 2 + #define WATER_LEVEL_DIAMOND_ACT_CHANGE_WATER_LEVEL 0x2 // After the water level has changed but Mario hasn't left its hitbox yet - #define WATER_LEVEL_DIAMOND_ACT_IDLE_SPINNING 3 + #define WATER_LEVEL_DIAMOND_ACT_IDLE_SPINNING 0x3 + +/* Castle Water Level Pillars */ + /* oAction */ + #define WATER_PILLAR_ACT_UNPOUNDED_IDLE 0x0 + #define WATER_PILLAR_ACT_LOWER_SELF 0x1 + #define WATER_PILLAR_ACT_POUNDED_1 0x2 + #define WATER_PILLAR_ACT_POUNDED_2 0x3 + #define WATER_PILLAR_ACT_DRAIN_WATER 0x4 + #define WATER_PILLAR_ACT_END 0x5 /* Mips */ + /* oBehParams2ndByte */ + #define MIPS_BP_STAR_1 0x0 + #define MIPS_BP_STAR_2 0x1 /* oAction */ - #define MIPS_ACT_WAIT_FOR_NEARBY_MARIO 0 - #define MIPS_ACT_FOLLOW_PATH 1 - #define MIPS_ACT_WAIT_FOR_ANIMATION_DONE 2 - #define MIPS_ACT_FALL_DOWN 3 - #define MIPS_ACT_IDLE 4 - + #define MIPS_ACT_WAIT_FOR_NEARBY_MARIO 0x0 + #define MIPS_ACT_FOLLOW_PATH 0x1 + #define MIPS_ACT_WAIT_FOR_ANIMATION_DONE 0x2 + #define MIPS_ACT_FALL_DOWN 0x3 + #define MIPS_ACT_IDLE 0x4 /* oMipsStarStatus */ - #define MIPS_STAR_STATUS_HAVENT_SPAWNED_STAR 0 - #define MIPS_STAR_STATUS_SHOULD_SPAWN_STAR 1 - #define MIPS_STAR_STATUS_ALREADY_SPAWNED_STAR 2 + #define MIPS_STAR_STATUS_HAVENT_SPAWNED_STAR 0x0 + #define MIPS_STAR_STATUS_SHOULD_SPAWN_STAR 0x1 + #define MIPS_STAR_STATUS_ALREADY_SPAWNED_STAR 0x2 + /* Animations */ + #define MIPS_ANIM_IDLE 0x0 + #define MIPS_ANIM_HOPPING 0x1 + #define MIPS_ANIM_THROWN 0x2 + #define MIPS_ANIM_UNUSED 0x3 + #define MIPS_ANIM_HELD 0x4 /* Falling Pillar */ /* oAction */ - #define FALLING_PILLAR_ACT_IDLE 0 - #define FALLING_PILLAR_ACT_TURNING 1 - #define FALLING_PILLAR_ACT_FALLING 2 + #define FALLING_PILLAR_ACT_IDLE 0x0 + #define FALLING_PILLAR_ACT_TURNING 0x1 + #define FALLING_PILLAR_ACT_FALLING 0x2 /* Bowser Puzzle */ /* oAction */ - #define BOWSER_PUZZLE_ACT_SPAWN_PIECES 0 - #define BOWSER_PUZZLE_ACT_WAIT_FOR_COMPLETE 1 - #define BOWSER_PUZZLE_ACT_DONE 2 + #define BOWSER_PUZZLE_ACT_SPAWN_PIECES 0x0 + #define BOWSER_PUZZLE_ACT_WAIT_FOR_COMPLETE 0x1 + #define BOWSER_PUZZLE_ACT_DONE 0x2 + /* oBowserPuzzleCompletionFlags */ + #define BOWSER_PUZZLE_COMPLETION_FLAGS_NONE 0x0 + #define BOWSER_PUZZLE_COMPLETION_FLAG_MARIO_ON_PLATFORM 0x1 + #define BOWSER_PUZZLE_COMPLETION_FLAG_PUZZLE_COMPLETE 0x2 + +/* Bowser Puzzle Piece */ + /* oAction */ + #define BOWSER_PUZZLE_PIECE_ACT_IDLE 0x0 + #define BOWSER_PUZZLE_PIECE_ACT_LEFT 0x1 + #define BOWSER_PUZZLE_PIECE_ACT_RIGHT 0x2 + #define BOWSER_PUZZLE_PIECE_ACT_UP 0x3 + #define BOWSER_PUZZLE_PIECE_ACT_DOWN 0x4 + +/* Spindrift */ + /* oAction */ + #define SPINDRIFT_ACT_ACTIVE 0x0 + #define SPINDRIFT_ACT_HIT_MARIO 0x1 + /* oAction */ + #define SPINDRIFT_ANIM_DEFAULT 0x0 /* Mr Blizzard */ - /* oAction */ - #define MR_BLIZZARD_ACT_SPAWN_SNOWBALL 0 - #define MR_BLIZZARD_ACT_HIDE_UNHIDE 1 - #define MR_BLIZZARD_ACT_RISE_FROM_GROUND 2 - #define MR_BLIZZARD_ACT_ROTATE 3 - #define MR_BLIZZARD_ACT_THROW_SNOWBALL 4 - #define MR_BLIZZARD_ACT_BURROW 5 - #define MR_BLIZZARD_ACT_DEATH 6 - #define MR_BLIZZARD_ACT_JUMP 7 /* oBehParams2ndByte */ - #define MR_BLIZZARD_STYPE_NO_CAP 0 - #define MR_BLIZZARD_STYPE_JUMPING 1 + #define MR_BLIZZARD_STYPE_NO_CAP 0x0 + #define MR_BLIZZARD_STYPE_JUMPING 0x1 + /* oAction */ + #define MR_BLIZZARD_ACT_SPAWN_SNOWBALL 0x0 + #define MR_BLIZZARD_ACT_HIDE_UNHIDE 0x1 + #define MR_BLIZZARD_ACT_RISE_FROM_GROUND 0x2 + #define MR_BLIZZARD_ACT_ROTATE 0x3 + #define MR_BLIZZARD_ACT_THROW_SNOWBALL 0x4 + #define MR_BLIZZARD_ACT_BURROW 0x5 + #define MR_BLIZZARD_ACT_DEATH 0x6 + #define MR_BLIZZARD_ACT_JUMP 0x7 + /* oAnimState */ + #define MR_BLIZZARD_ANIM_STATE_NO_CAP 0x0 + #define MR_BLIZZARD_ANIM_STATE_HAS_CAP 0x1 + /* Animations */ + #define MR_BLIZZARD_ANIM_SPAWN_SNOWBALL 0x0 + #define MR_BLIZZARD_ANIM_THROW_SNOWBALL 0x1 + +/* Mr Blizzard Snowball */ + /* oAction */ + #define MR_BLIZZARD_SNOWBALL_ACT_INIT 0x0 + #define MR_BLIZZARD_SNOWBALL_ACT_LAUNCH 0x1 + #define MR_BLIZZARD_SNOWBALL_ACT_COLLISION 0x2 + +/* Mr I */ + /* oBehParams2ndByte */ + #define MR_I_BP_NORMAL 0x0 + #define MR_I_BP_LARGE_WITH_STAR 0x1 + /* oAction */ + #define MR_I_BODY_ACT_FAR_AWAY 0x0 + #define MR_I_BODY_ACT_IDLE 0x1 + #define MR_I_BODY_ACT_LOOKING_AT_MARIO 0x2 + #define MR_I_BODY_ACT_SPIN_DEATH 0x3 + +/* Mr I & Piranha Plant Particle */ + /* oAction */ + #define MR_I_PIRANHA_PARTICLE_ACT_MOVE 0x0 + #define MR_I_PIRANHA_PARTICLE_ACT_INTERACTED 0x1 + +/* Bullet Bill */ + /* oAction */ + #define BULLET_BILL_ACT_RESET 0x0 + #define BULLET_BILL_ACT_IDLE 0x1 + #define BULLET_BILL_ACT_CHASING_MARIO 0x2 + #define BULLET_BILL_ACT_HIT 0x3 + +/* Thwomp & Grindel */ + /* oAction */ + #define GRINDEL_THWOMP_ACT_RISING 0x0 + #define GRINDEL_THWOMP_ACT_FLOATING 0x1 + #define GRINDEL_THWOMP_ACT_FALLING 0x2 + #define GRINDEL_THWOMP_ACT_LAND 0x3 + #define GRINDEL_THWOMP_ACT_ON_GROUND 0x4 + +/* Whomp */ + /* oBehParams2ndByte */ + #define WHOMP_BP_NORMAL 0x0 + #define WHOMP_BP_KING 0x1 + /* oAction */ + #define WHOMP_ACT_INIT 0x0 + #define WHOMP_ACT_PATROL 0x1 + #define WHOMP_ACT_KING_CHASE 0x2 + #define WHOMP_ACT_PREPARE_JUMP 0x3 + #define WHOMP_ACT_JUMP 0x4 + #define WHOMP_ACT_LAND 0x5 + #define WHOMP_ACT_ON_GROUND_GENERAL 0x6 + #define WHOMP_ACT_TURN 0x7 + #define WHOMP_ACT_DIE 0x8 + #define WHOMP_ACT_STOP_BOSS_MUSIC 0x9 + /* oSubAction */ + /* WHOMP_ACT_INIT */ + #define WHOMP_SUB_ACT_INIT_IDLE 0x0 + #define WHOMP_SUB_ACT_INIT_DIALOG 0x1 + /* WHOMP_ACT_LAND */ + #define WHOMP_SUB_ACT_LAND_EFFECTS 0x0 + #define WHOMP_SUB_ACT_LAND_ON_GROUND 0x1 + /* WHOMP_ACT_ON_GROUND_GENERAL */ + #define WHOMP_SUB_ACT_GROUND_LYING_DOWN 0x0 + #define WHOMP_SUB_ACT_GROUND_PREPARE_STAND_UP 0x1 + #define WHOMP_SUB_ACT_GROUND_STAND_UP 0xA + /* WHOMP_ACT_TURN */ + #define WHOMP_SUB_ACT_TURN_TURNING 0x0 + #define WHOMP_SUB_ACT_TURN_END 0x1 + /* Animations */ + #define WHOMP_ANIM_WALK 0x0 + #define WHOMP_ANIM_JUMP 0x1 + +/* WF Kickable Board */ + /* oAction */ + #define KICKABLE_BOARD_ACT_IDLE_VERTICAL 0x0 + #define KICKABLE_BOARD_ACT_ROCKING 0x1 + #define KICKABLE_BOARD_ACT_FALLING 0x2 + #define KICKABLE_BOARD_ACT_IDLE_HORIZONTAL 0x3 + /* check_mario_attacking */ + #define WF_ATTACK_NONE 0x0 + #define WF_ATTACK_GROUND 0x1 + #define WF_ATTACK_AIR 0x2 + +/* White Puff Explosion */ + /* oBehParams2ndByte */ + #define WHITE_PUFF_EXPLODE_BP_FAST_FADE 0x2 + #define WHITE_PUFF_EXPLODE_BP_SLOW_FADE 0x3 + +/* Dirt Particle */ + /* oAnimState */ + #define TINY_DIRT_PARTICLE_ANIM_STATE_RED 0x0 + #define TINY_DIRT_PARTICLE_ANIM_STATE_GREEN 0x1 + #define TINY_DIRT_PARTICLE_ANIM_STATE_BLUE 0x2 + #define TINY_DIRT_PARTICLE_ANIM_STATE_DIRT 0x3 + #define TINY_DIRT_PARTICLE_ANIM_STATE_YELLOW 0x4 + #define TINY_DIRT_PARTICLE_ANIM_STATE_BILLBOARD 0x5 + +/* Cartoon Star Particle */ + /* oAnimState */ + #define CARTOON_STAR_PARTICLE_ANIM_STATE_RED 0x0 + #define CARTOON_STAR_PARTICLE_ANIM_STATE_GREEN 0x1 + #define CARTOON_STAR_PARTICLE_ANIM_STATE_BLUE 0x2 + #define CARTOON_STAR_PARTICLE_ANIM_STATE_YELLOW 0x3 + #define CARTOON_STAR_PARTICLE_ANIM_STATE_BILLBOARD 0x4 + +/* Music Touch */ + /* oAction */ + #define MUSIC_TOUCH_ACT_PLAY_SOUND 0x0 + #define MUSIC_TOUCH_ACT_DONE 0x1 + +/* Intro Scene */ + /* gCutsceneObjSpawn */ + #define CUTSCENE_OBJ_NONE 0x0 + #define CUTSCENE_OBJ_BEGINNING_PEACH 0x5 + #define CUTSCENE_OBJ_BEGINNING_LAKITU 0x6 + #define CUTSCENE_OBJ_7_END_BIRDS_1 0x7 + #define CUTSCENE_OBJ_5_END_BIRDS_2 0x8 + #define CUTSCENE_OBJ_2_END_BIRDS_1 0x9 #endif // OBJECT_CONSTANTS_H diff --git a/include/special_presets.h b/include/special_presets.h index a9be6ec2..103e4060 100644 --- a/include/special_presets.h +++ b/include/special_presets.h @@ -17,7 +17,7 @@ struct SpecialPreset /*00*/ u8 preset_id; /*01*/ u8 type; // Determines whether object is 8, 10, 12 or 14 bytes long. /*02*/ u8 defParam; // Default parameter, only used when type is SPTYPE_DEF_PARAM_AND_YROT - /*03*/ ModelID model; + /*03*/ ModelID16 model; /*04*/ const BehaviorScript *behavior; }; diff --git a/include/types.h b/include/types.h index 5d22ebeb..32feca95 100644 --- a/include/types.h +++ b/include/types.h @@ -69,27 +69,104 @@ typedef f32 Mat2[2][2]; typedef f32 Mat3[3][3]; typedef f32 Mat4[4][4]; +// -- Scripts -- typedef uintptr_t GeoLayout; typedef uintptr_t LevelScript; -typedef s16 Movtex; -typedef s16 MacroObject; -typedef COLLISION_DATA_TYPE Collision; //Collision is by default an s16, but it's best to have it match the type of COLLISION_DATA_TYPE -typedef s16 Trajectory; -typedef s16 PaintingData; typedef uintptr_t BehaviorScript; -typedef u8 Texture; -typedef u16 ModelID; -typedef COLLISION_DATA_TYPE TerrainData; -typedef ROOM_DATA_TYPE RoomData; -typedef TerrainData Vec3t[3]; + +// -- Mario/Objects -- +typedef s32 MarioAction; +typedef s32 MarioActionArg; +typedef u32 MarioInteraction; +typedef u32 InteractType; +typedef u32 MarioStep; + +typedef s8 ObjAction8; +typedef s32 ObjAction32; +typedef s16 ColFlags; // -- Angle -- - typedef s16 Angle; typedef u16 UAngle; typedef s32 Angle32; typedef Angle Vec3a[3]; +// -- Collision -- +typedef ROOM_DATA_TYPE RoomData; +typedef COLLISION_DATA_TYPE Collision; // Collision is by default an s16, but it's best to have it match the type of COLLISION_DATA_TYPE +typedef Collision TerrainData; +typedef Collision Vec3t[3]; +typedef Collision SurfaceType; + +typedef f32 Normal; +typedef Normal Vec3n[3]; + +// -- Colors/Textures -- + +// 0.0f to 1.0f +typedef f32 ColorF; +typedef ColorF AlphaF; +typedef ColorF ColorRGBf[3]; +typedef ColorF ColorRGBAf[4]; +typedef ColorF ColorHSVf[3]; +typedef ColorF ColorHSVAf[4]; + +// 0 to 255 +typedef u8 Color; +typedef Color Alpha; +typedef Color ColorRGB[3]; +typedef Color ColorRGBA[4]; +typedef Color ColorHSV[3]; +typedef Color ColorHSVA[4]; + +// Formats: +typedef u32 CompositeColor; // to be casted to one of the following: +typedef u8 I4; // u4 +typedef u8 I8; +typedef u8 IA4; // u4, components u3 & u1 +typedef u8 IA8; +typedef u8 IA16Component; +typedef u16 IA16; +typedef u8 RGBA16Component; // components u5 & u1 +typedef u16 RGBA16; +typedef u32 RGBA16FILL; // RGBA16 but twice, Used for gDPSetFillColor +typedef u8 RGBA32Component; +typedef u32 RGBA32; +typedef u8 CI4; // u4 +typedef u8 CI8; +typedef Color Texture; + +typedef s16 TextureCoord; + +// -- Models -- + +typedef u8 ModelID8; +typedef u16 ModelID16; +typedef u32 ModelID32; + +// -- Animations -- +typedef s16 AnimValue; +typedef u16 AnimIndex; +typedef s16 AnimID16; +typedef s32 AnimID32; +typedef s16 AnimFrame16; +typedef s32 AnimFrame32; +typedef s32 AnimAccel; + +// -- Misc. Data -- + +typedef s16 DialogID16; +typedef s32 DialogID; +typedef s32 DrawingLayer; +typedef s16 PaintingData; +typedef s32 CameraTransitionAngle; +typedef s16 Movtex; +typedef s16 MacroObject; +typedef s16 Trajectory; +typedef u8 CutsceneID; + +typedef u8 uchar; + enum SpTaskState { SPTASK_STATE_NOT_STARTED, SPTASK_STATE_RUNNING, diff --git a/src/engine/level_script.c b/src/engine/level_script.c index c12b5509..bc2df6db 100644 --- a/src/engine/level_script.c +++ b/src/engine/level_script.c @@ -415,7 +415,7 @@ static void level_cmd_end_area(void) { } static void level_cmd_load_model_from_dl(void) { - ModelID model = CMD_GET(ModelID, 0xA); + ModelID16 model = CMD_GET(ModelID16, 0xA); s16 layer = CMD_GET(u16, 0x8); void *dl_ptr = CMD_GET(void *, 4); @@ -428,7 +428,7 @@ static void level_cmd_load_model_from_dl(void) { } static void level_cmd_load_model_from_geo(void) { - ModelID model = CMD_GET(ModelID, 2); + ModelID16 model = CMD_GET(ModelID16, 2); void *geo = CMD_GET(void *, 4); if (model < MODEL_ID_COUNT) { @@ -444,7 +444,7 @@ static void level_cmd_23(void) { f32 f; } arg2; - ModelID model = CMD_GET(s16, 2) & 0x0FFF; + ModelID16 model = CMD_GET(s16, 2) & 0x0FFF; s16 arg0H = ((u16)CMD_GET(s16, 2)) >> 12; void *arg1 = CMD_GET(void *, 4); // load an f32, but using an integer load instruction for some reason (hence the union) @@ -468,7 +468,7 @@ static void level_cmd_init_mario(void) { gMarioSpawnInfo->areaIndex = 0; gMarioSpawnInfo->behaviorArg = CMD_GET(u32, 4); gMarioSpawnInfo->behaviorScript = CMD_GET(void *, 8); - gMarioSpawnInfo->modelNode = gLoadedGraphNodes[CMD_GET(ModelID, 0x2)]; + gMarioSpawnInfo->modelNode = gLoadedGraphNodes[CMD_GET(ModelID16, 0x2)]; gMarioSpawnInfo->next = NULL; sCurrentCmd = CMD_NEXT; diff --git a/src/game/area.h b/src/game/area.h index 5ee2edad..74d08cff 100644 --- a/src/game/area.h +++ b/src/game/area.h @@ -118,6 +118,13 @@ struct WarpTransition /*0x04*/ struct WarpTransitionData data; }; +enum CurrSaveFileNum { + SAVE_FILE_NUM_A = 0x1, + SAVE_FILE_NUM_B, + SAVE_FILE_NUM_C, + SAVE_FILE_NUM_D, +}; + enum MenuOption { MENU_OPT_NONE, MENU_OPT_1, diff --git a/src/game/behavior_actions.c b/src/game/behavior_actions.c index 60f770e9..e3e2bcb1 100644 --- a/src/game/behavior_actions.c +++ b/src/game/behavior_actions.c @@ -59,7 +59,7 @@ struct TumblingBridgeParams { s16 numBridgeSections; s16 bridgeRelativeStartingXorZ; s16 platformWidth; - ModelID model; + ModelID16 model; const void *segAddr; }; @@ -67,7 +67,7 @@ struct ExclamationBoxContents { u8 id; u8 unk1; u8 behParams; - ModelID model; + ModelID16 model; const BehaviorScript *behavior; }; @@ -79,7 +79,7 @@ struct CheckerBoardPlatformInitPosition { struct OpenableGrill { s16 halfWidth; - ModelID modelID; + ModelID16 modelID; const Collision *collision; }; diff --git a/src/game/behaviors/animated_floor_switch.inc.c b/src/game/behaviors/animated_floor_switch.inc.c index a8577d17..27b87a4b 100644 --- a/src/game/behaviors/animated_floor_switch.inc.c +++ b/src/game/behaviors/animated_floor_switch.inc.c @@ -2,7 +2,7 @@ struct FloorSwitchTriggeredAnimationFrame { const void *collisionDataPtr; - ModelID model; + ModelID16 model; }; struct FloorSwitchTriggeredAnimationFrame sFloorSwitchTriggeredAnimationFrames[][5] = { diff --git a/src/game/behaviors/arrow_lift.inc.c b/src/game/behaviors/arrow_lift.inc.c index 127d3576..d867e316 100644 --- a/src/game/behaviors/arrow_lift.inc.c +++ b/src/game/behaviors/arrow_lift.inc.c @@ -13,7 +13,7 @@ * Move the arrow lift away from its original position. */ static s32 arrow_lift_move_away(void) { - s8 status = ARROW_LIFT_NOT_DONE_MOVING; + s8 doneMoving = FALSE; o->oMoveAngleYaw = o->oFaceAngleYaw - 0x4000; o->oVelY = 0; @@ -26,18 +26,18 @@ static s32 arrow_lift_move_away(void) { if (o->oArrowLiftDisplacement > 384) { o->oForwardVel = 0; o->oArrowLiftDisplacement = 384; - status = ARROW_LIFT_DONE_MOVING; + doneMoving = TRUE; } obj_move_xyz_using_fvel_and_yaw(o); - return status; + return doneMoving; } /** * Move the arrow lift back to its original position. */ static s8 arrow_lift_move_back(void) { - s8 status = ARROW_LIFT_NOT_DONE_MOVING; + s8 doneMoving = FALSE; o->oMoveAngleYaw = o->oFaceAngleYaw + 0x4000; o->oVelY = 0; @@ -48,11 +48,11 @@ static s8 arrow_lift_move_back(void) { if (o->oArrowLiftDisplacement < 0) { o->oForwardVel = 0; o->oArrowLiftDisplacement = 0; - status = ARROW_LIFT_DONE_MOVING; + doneMoving = TRUE; } obj_move_xyz_using_fvel_and_yaw(o); - return status; + return doneMoving; } /** @@ -71,7 +71,7 @@ void bhv_arrow_lift_loop(void) { break; case ARROW_LIFT_ACT_MOVING_AWAY: - if (arrow_lift_move_away() == ARROW_LIFT_DONE_MOVING) { + if (arrow_lift_move_away()) { o->oAction = ARROW_LIFT_ACT_MOVING_BACK; } @@ -80,7 +80,7 @@ void bhv_arrow_lift_loop(void) { case ARROW_LIFT_ACT_MOVING_BACK: // Wait 61 frames before moving (after stopping after moving forwards). if (o->oTimer > 60) { - if (arrow_lift_move_back() == ARROW_LIFT_DONE_MOVING) { + if (arrow_lift_move_back()) { o->oAction = ARROW_LIFT_ACT_IDLE; } } diff --git a/src/game/behaviors/bub.inc.c b/src/game/behaviors/bub.inc.c index 716e843d..a54536f8 100644 --- a/src/game/behaviors/bub.inc.c +++ b/src/game/behaviors/bub.inc.c @@ -4,13 +4,13 @@ // value. The later action functions seem to check Y distance to Mario and proceed // to do nothing, which indicates this behavior set is incomplete. -// TODO: Rename these. These have nothing to do with birds. void bub_spawner_act_0(void) { s32 i; s32 amt = o->oCheepCheepSpawnerSpawnAmount; if (o->oDistanceToMario < 1500.0f) { - for (i = 0; i < amt; i++) + for (i = 0; i < amt; i++) { spawn_object(o, MODEL_BUB, bhvBub); + } o->oAction = 1; } } diff --git a/src/game/behaviors/camera_lakitu.inc.c b/src/game/behaviors/camera_lakitu.inc.c index a848a2ce..60b10777 100644 --- a/src/game/behaviors/camera_lakitu.inc.c +++ b/src/game/behaviors/camera_lakitu.inc.c @@ -41,7 +41,7 @@ static void camera_lakitu_intro_act_trigger_cutscene(void) { */ static void camera_lakitu_intro_act_spawn_cloud(void) { if (set_mario_npc_dialog(MARIO_DIALOG_LOOK_UP) == MARIO_DIALOG_STATUS_SPEAK) { - o->oAction = CAMERA_LAKITU_INTRO_ACT_UNK2; + o->oAction = CAMERA_LAKITU_INTRO_ACT_SHOW_DIALOG; o->oPosX = 1800.0f; o->oPosY = 2400.0f; @@ -145,7 +145,7 @@ void bhv_camera_lakitu_update(void) { case CAMERA_LAKITU_INTRO_ACT_SPAWN_CLOUD: camera_lakitu_intro_act_spawn_cloud(); break; - case CAMERA_LAKITU_INTRO_ACT_UNK2: + case CAMERA_LAKITU_INTRO_ACT_SHOW_DIALOG: camera_lakitu_intro_act_show_dialog(); break; } diff --git a/src/game/behaviors/coffin.inc.c b/src/game/behaviors/coffin.inc.c index 8bc95a1f..081a6869 100644 --- a/src/game/behaviors/coffin.inc.c +++ b/src/game/behaviors/coffin.inc.c @@ -57,19 +57,17 @@ void bhv_coffin_spawner_loop(void) { } /** - * The main action for the coffins. Coffins with COFFIN_BP_STATIC skip the behavior, while + * The main action for the coffins. Coffins with COFFIN_BP_STATIONARY skip the behavior, while * the other coffins will enter a standing action when Mario is near. * Also controls laying the coffin down after it has stood up. */ void coffin_act_idle(void) { f32 yawCos; - f32 yawSin; - f32 dx; - f32 dz; - f32 distForwards; - f32 distSideways; + // f32 yawSin; + f32 dx, dz; + f32 distForwards, distSideways; - if (o->oBehParams2ndByte != COFFIN_BP_STATIC) { + if (o->oBehParams2ndByte != COFFIN_BP_STATIONARY) { // Lay down if standing if (o->oFaceAnglePitch != 0) { o->oAngleVelPitch = approach_s16_symmetric(o->oAngleVelPitch, -2000, 200); @@ -91,13 +89,13 @@ void coffin_act_idle(void) { } else { // Yaw never changes and is aligned, so yawCos = 1 or -1, yawSin = 0 yawCos = coss(o->oFaceAngleYaw); - yawSin = sins(o->oFaceAngleYaw); + // yawSin = sins(o->oFaceAngleYaw); dx = gMarioObject->oPosX - o->oPosX; dz = gMarioObject->oPosZ - o->oPosZ; - distForwards = dx * yawCos + dz * yawSin; - distSideways = dz * yawCos - dx * yawSin; + distForwards = dx * yawCos; // + dz * yawSin; + distSideways = dz * yawCos; // - dx * yawSin; // This checks a box around the coffin and if it has been a bit since it stood up. // It also checks in the case Mario is squished, so he doesn't get permanently squished. diff --git a/src/game/behaviors/koopa.inc.c b/src/game/behaviors/koopa.inc.c index 66376f64..14417a76 100644 --- a/src/game/behaviors/koopa.inc.c +++ b/src/game/behaviors/koopa.inc.c @@ -433,13 +433,6 @@ static void koopa_unshelled_act_dive(void) { end:; } -/** - * Unused action function. - */ -static void koopa_unshelled_act_unused3(void) { - cur_obj_init_anim_extend(0); -} - /** * Update function for koopa after losing his shell. */ @@ -455,9 +448,9 @@ static void koopa_unshelled_update(void) { case KOOPA_UNSHELLED_ACT_LYING: koopa_unshelled_act_dive(); break; - case KOOPA_UNSHELLED_ACT_UNUSED3: - koopa_unshelled_act_unused3(); - break; + // case KOOPA_UNSHELLED_ACT_UNUSED3: + // cur_obj_init_anim_extend(KOOPA_ANIM_SHELLED_UNUSED3); + // break; } obj_handle_attacks(&sKoopaHitbox, o->oAction, sKoopaUnshelledAttackHandlers); diff --git a/src/game/behaviors/purple_switch.inc.c b/src/game/behaviors/purple_switch.inc.c index ca22f816..135960aa 100644 --- a/src/game/behaviors/purple_switch.inc.c +++ b/src/game/behaviors/purple_switch.inc.c @@ -12,12 +12,12 @@ void bhv_purple_switch_loop(void) { * Set the switch's model and scale. If Mario is standing near the * switch's middle section, transition to the pressed state. */ - case PURPLE_SWITCH_IDLE: + case PURPLE_SWITCH_ACT_IDLE: cur_obj_set_model(MODEL_PURPLE_SWITCH); cur_obj_scale(1.5f); if (gMarioObject->platform == o && !(gMarioStates[0].action & MARIO_NO_PURPLE_SWITCH)) { if (lateral_dist_between_objects(o, gMarioObject) < 127.5f) { - o->oAction = PURPLE_SWITCH_PRESSED; + o->oAction = PURPLE_SWITCH_ACT_PRESSED; } } break; @@ -25,11 +25,11 @@ void bhv_purple_switch_loop(void) { * Collapse the switch downward, play a sound, and shake the screen. * Immediately transition to the ticking state. */ - case PURPLE_SWITCH_PRESSED: + case PURPLE_SWITCH_ACT_PRESSED: cur_obj_scale_over_time(2, 3, 1.5f, 0.2f); if (o->oTimer == 3) { cur_obj_play_sound_2(SOUND_GENERAL2_PURPLE_SWITCH); - o->oAction = PURPLE_SWITCH_TICKING; + o->oAction = PURPLE_SWITCH_ACT_TICKING; cur_obj_shake_screen(SHAKE_POS_SMALL); #if ENABLE_RUMBLE queue_rumble_data(5, 80); @@ -40,7 +40,7 @@ void bhv_purple_switch_loop(void) { * Play a continuous ticking sound that gets faster when time is almost * up. When time is up, move to a waiting-while-pressed state. */ - case PURPLE_SWITCH_TICKING: + case PURPLE_SWITCH_ACT_TICKING: if (o->oBehParams2ndByte != 0) { if (o->oBehParams2ndByte == 1 && gMarioObject->platform != o) { o->oAction++; @@ -51,7 +51,7 @@ void bhv_purple_switch_loop(void) { play_sound(SOUND_GENERAL2_SWITCH_TICK_SLOW, gGlobalSoundSource); } if (o->oTimer > 400) { - o->oAction = PURPLE_SWITCH_WAIT_FOR_MARIO_TO_GET_OFF; + o->oAction = PURPLE_SWITCH_ACT_WAIT_FOR_MARIO_TO_GET_OFF; } } } @@ -60,10 +60,10 @@ void bhv_purple_switch_loop(void) { * Make the switch look unpressed again, and transition back to the * idle state. */ - case PURPLE_SWITCH_UNPRESSED: + case PURPLE_SWITCH_ACT_UNPRESSED: cur_obj_scale_over_time(2, 3, 0.2f, 1.5f); if (o->oTimer == 3) { - o->oAction = PURPLE_SWITCH_IDLE; + o->oAction = PURPLE_SWITCH_ACT_IDLE; } break; /** @@ -71,9 +71,9 @@ void bhv_purple_switch_loop(void) { * him to get off the switch, and when he does so, transition to the * unpressed state. */ - case PURPLE_SWITCH_WAIT_FOR_MARIO_TO_GET_OFF: + case PURPLE_SWITCH_ACT_WAIT_FOR_MARIO_TO_GET_OFF: if (!cur_obj_is_mario_on_platform()) { - o->oAction = PURPLE_SWITCH_UNPRESSED; + o->oAction = PURPLE_SWITCH_ACT_UNPRESSED; } break; } diff --git a/src/game/behaviors/sl_walking_penguin.inc.c b/src/game/behaviors/sl_walking_penguin.inc.c index acd2ef16..6840ec37 100644 --- a/src/game/behaviors/sl_walking_penguin.inc.c +++ b/src/game/behaviors/sl_walking_penguin.inc.c @@ -98,7 +98,7 @@ void bhv_sl_walking_penguin_loop(void) { cur_obj_move_standard(-78); if (!cur_obj_hide_if_mario_far_away_y(1000.0f)) - play_penguin_walking_sound(PENGUIN_WALK_BIG); + play_penguin_walking_sound(PENGUIN_SOUND_WALK_BIG); // Adjust the position to get a point better lined up with the visual model, for stopping the wind. // The new point is 60 units behind the penguin and 100 units perpedicularly, away from the snowman. diff --git a/src/game/behaviors/tuxie.inc.c b/src/game/behaviors/tuxie.inc.c index f77fb605..b9264134 100644 --- a/src/game/behaviors/tuxie.inc.c +++ b/src/game/behaviors/tuxie.inc.c @@ -3,10 +3,11 @@ void play_penguin_walking_sound(s32 walk) { s32 sound; if (o->oSoundStateID == 0) { - if (walk == PENGUIN_WALK_BABY) + if (walk == PENGUIN_SOUND_WALK_BABY) { sound = SOUND_OBJ_BABY_PENGUIN_WALK; - else // PENGUIN_WALK_BIG + } else { // PENGUIN_SOUND_WALK_BIG sound = SOUND_OBJ_BIG_PENGUIN_WALK; + } set_obj_anim_with_accel_and_sound(1, 11, sound); } } @@ -133,7 +134,7 @@ void bhv_tuxies_mother_loop(void) { cur_obj_update_floor_and_walls(); cur_obj_call_action_function(sTuxiesMotherActions); cur_obj_move_standard(-78); - play_penguin_walking_sound(PENGUIN_WALK_BIG); + play_penguin_walking_sound(PENGUIN_SOUND_WALK_BIG); o->oInteractStatus = 0; } @@ -244,7 +245,7 @@ void small_penguin_free_actions(void) { cur_obj_update_floor_and_walls(); cur_obj_call_action_function(sSmallPenguinActions); cur_obj_move_standard(-78); - play_penguin_walking_sound(PENGUIN_WALK_BABY); + play_penguin_walking_sound(PENGUIN_SOUND_WALK_BABY); } void bhv_small_penguin_loop(void) { diff --git a/src/game/behaviors/tweester.inc.c b/src/game/behaviors/tweester.inc.c index d1c7b158..b6d334ab 100644 --- a/src/game/behaviors/tweester.inc.c +++ b/src/game/behaviors/tweester.inc.c @@ -72,7 +72,7 @@ void tweester_act_chase(void) { cur_obj_play_sound_1(SOUND_ENV_WIND1); if (cur_obj_lateral_dist_from_mario_to_home() < activationRadius - && o->oSubAction == TWEESTER_SUB_ACT_CHASE) { + && o->oSubAction == TWEESTER_SUB_ACT_CHASE_MARIO) { o->oForwardVel = 20.0f; cur_obj_rotate_yaw_toward(o->oAngleToMario, 0x200); diff --git a/src/game/macro_special_objects.c b/src/game/macro_special_objects.c index 3ee3a1cc..f75e82ef 100644 --- a/src/game/macro_special_objects.c +++ b/src/game/macro_special_objects.c @@ -80,7 +80,7 @@ void spawn_macro_abs_special(s32 model, const BehaviorScript *behavior, s16 x, s UNUSED static void spawn_macro_coin_unknown(const BehaviorScript *behavior, s16 a1[]) { struct Object *obj; - ModelID model = bhvYellowCoin == behavior ? MODEL_YELLOW_COIN : MODEL_NONE; + ModelID16 model = bhvYellowCoin == behavior ? MODEL_YELLOW_COIN : MODEL_NONE; obj = spawn_object_abs_with_rot(&gMacroObjectDefaultParent, 0, model, behavior, a1[1], a1[2], a1[3], 0, convert_rotation(a1[0]), 0); @@ -92,7 +92,7 @@ UNUSED static void spawn_macro_coin_unknown(const BehaviorScript *behavior, s16 struct LoadedPreset { /*0x00*/ const BehaviorScript *behavior; /*0x04*/ s16 param; // huh? why does the below function swap these.. just use the struct.. - /*0x06*/ ModelID model; + /*0x06*/ ModelID16 model; }; #define MACRO_OBJ_Y_ROT 0 @@ -237,7 +237,7 @@ void spawn_special_objects(s32 areaIndex, TerrainData **specialObjList) { s16 y; s16 z; s16 extraParams[4]; - ModelID model; + ModelID16 model; u8 type; u8 presetID; u8 defaultParam; diff --git a/src/game/object_helpers.h b/src/game/object_helpers.h index 0b79ce2c..aeef86ce 100644 --- a/src/game/object_helpers.h +++ b/src/game/object_helpers.h @@ -46,7 +46,7 @@ struct SpawnParticlesInfo { /*0x00*/ s8 behParam; /*0x01*/ s8 count; - /*0x02*/ ModelID model; + /*0x02*/ ModelID16 model; /*0x03*/ s8 offsetY; /*0x04*/ s8 forwardVelBase; /*0x05*/ s8 forwardVelRange; diff --git a/src/game/object_list_processor.c b/src/game/object_list_processor.c index 62c21907..70847dd1 100644 --- a/src/game/object_list_processor.c +++ b/src/game/object_list_processor.c @@ -188,7 +188,7 @@ s8 sObjectListUpdateOrder[] = { OBJ_LIST_SPAWNER, struct ParticleProperties { u32 particleFlag; u32 activeParticleFlag; - ModelID model; + ModelID16 model; const BehaviorScript *behavior; }; diff --git a/src/menu/file_select.c b/src/menu/file_select.c index 1fea9b24..d1d359a9 100644 --- a/src/menu/file_select.c +++ b/src/menu/file_select.c @@ -1069,8 +1069,7 @@ void load_score_menu_from_submenu(s16 prevMenuButtonID, struct Object *sourceBut // If the previous button is in default state if (sMainMenuButtons[prevMenuButtonID]->oMenuButtonState == MENU_BUTTON_STATE_DEFAULT) { // Hide buttons of corresponding button menu groups - if (prevMenuButtonID == MENU_BUTTON_SCORE) //! Not possible, this is checking if the score menu was opened from the score menu! - { + if (prevMenuButtonID == MENU_BUTTON_SCORE) { //! Not possible, this is checking if the score menu was opened from the score menu! for (buttonID = MENU_BUTTON_SCORE_MIN; buttonID < MENU_BUTTON_SCORE_MAX; buttonID++) { obj_mark_for_deletion(sMainMenuButtons[buttonID]); } @@ -1114,8 +1113,7 @@ void load_copy_menu_from_submenu(s16 prevMenuButtonID, struct Object *sourceButt obj_mark_for_deletion(sMainMenuButtons[buttonID]); } } - if (prevMenuButtonID == MENU_BUTTON_COPY) //! Not possible, this is checking if the copy menu was opened from the copy menu! - { + if (prevMenuButtonID == MENU_BUTTON_COPY) { //! Not possible, this is checking if the copy menu was opened from the copy menu! for (buttonID = MENU_BUTTON_COPY_MIN; buttonID < MENU_BUTTON_COPY_MAX; buttonID++) { obj_mark_for_deletion(sMainMenuButtons[buttonID]); } @@ -1159,8 +1157,7 @@ void load_erase_menu_from_submenu(s16 prevMenuButtonID, struct Object *sourceBut obj_mark_for_deletion(sMainMenuButtons[buttonID]); } } - if (prevMenuButtonID == MENU_BUTTON_ERASE) //! Not possible, this is checking if the erase menu was opened from the erase menu! - { + if (prevMenuButtonID == MENU_BUTTON_ERASE) { //! Not possible, this is checking if the erase menu was opened from the erase menu! for (buttonID = MENU_BUTTON_ERASE_MIN; buttonID < MENU_BUTTON_ERASE_MAX; buttonID++) { obj_mark_for_deletion(sMainMenuButtons[buttonID]); } @@ -1343,115 +1340,54 @@ void check_main_menu_clicked_buttons(void) { */ void bhv_menu_button_manager_loop(void) { switch (sSelectedButtonID) { - case MENU_BUTTON_NONE: - check_main_menu_clicked_buttons(); - break; - case MENU_BUTTON_PLAY_FILE_A: - load_main_menu_save_file(sMainMenuButtons[MENU_BUTTON_PLAY_FILE_A], 1); - break; - case MENU_BUTTON_PLAY_FILE_B: - load_main_menu_save_file(sMainMenuButtons[MENU_BUTTON_PLAY_FILE_B], 2); - break; - case MENU_BUTTON_PLAY_FILE_C: - load_main_menu_save_file(sMainMenuButtons[MENU_BUTTON_PLAY_FILE_C], 3); - break; - case MENU_BUTTON_PLAY_FILE_D: - load_main_menu_save_file(sMainMenuButtons[MENU_BUTTON_PLAY_FILE_D], 4); - break; - case MENU_BUTTON_SCORE: - check_score_menu_clicked_buttons(sMainMenuButtons[MENU_BUTTON_SCORE]); - break; - case MENU_BUTTON_COPY: - check_copy_menu_clicked_buttons(sMainMenuButtons[MENU_BUTTON_COPY]); - break; - case MENU_BUTTON_ERASE: - check_erase_menu_clicked_buttons(sMainMenuButtons[MENU_BUTTON_ERASE]); - break; + case MENU_BUTTON_NONE: check_main_menu_clicked_buttons(); break; - case MENU_BUTTON_SCORE_FILE_A: - exit_score_file_to_score_menu(sMainMenuButtons[MENU_BUTTON_SCORE_FILE_A], MENU_BUTTON_SCORE); - break; - case MENU_BUTTON_SCORE_FILE_B: - exit_score_file_to_score_menu(sMainMenuButtons[MENU_BUTTON_SCORE_FILE_B], MENU_BUTTON_SCORE); - break; - case MENU_BUTTON_SCORE_FILE_C: - exit_score_file_to_score_menu(sMainMenuButtons[MENU_BUTTON_SCORE_FILE_C], MENU_BUTTON_SCORE); - break; - case MENU_BUTTON_SCORE_FILE_D: - exit_score_file_to_score_menu(sMainMenuButtons[MENU_BUTTON_SCORE_FILE_D], MENU_BUTTON_SCORE); - break; - case MENU_BUTTON_SCORE_RETURN: - return_to_main_menu(MENU_BUTTON_SCORE, sMainMenuButtons[MENU_BUTTON_SCORE_RETURN]); - break; - case MENU_BUTTON_SCORE_COPY_FILE: - load_copy_menu_from_submenu(MENU_BUTTON_SCORE, - sMainMenuButtons[MENU_BUTTON_SCORE_COPY_FILE]); - break; - case MENU_BUTTON_SCORE_ERASE_FILE: - load_erase_menu_from_submenu(MENU_BUTTON_SCORE, - sMainMenuButtons[MENU_BUTTON_SCORE_ERASE_FILE]); - break; + case MENU_BUTTON_PLAY_FILE_A: load_main_menu_save_file(sMainMenuButtons[MENU_BUTTON_PLAY_FILE_A], 1); break; + case MENU_BUTTON_PLAY_FILE_B: load_main_menu_save_file(sMainMenuButtons[MENU_BUTTON_PLAY_FILE_B], 2); break; + case MENU_BUTTON_PLAY_FILE_C: load_main_menu_save_file(sMainMenuButtons[MENU_BUTTON_PLAY_FILE_C], 3); break; + case MENU_BUTTON_PLAY_FILE_D: load_main_menu_save_file(sMainMenuButtons[MENU_BUTTON_PLAY_FILE_D], 4); break; - case MENU_BUTTON_COPY_FILE_A: - break; - case MENU_BUTTON_COPY_FILE_B: - break; - case MENU_BUTTON_COPY_FILE_C: - break; - case MENU_BUTTON_COPY_FILE_D: - break; - case MENU_BUTTON_COPY_RETURN: - return_to_main_menu(MENU_BUTTON_COPY, sMainMenuButtons[MENU_BUTTON_COPY_RETURN]); - break; - case MENU_BUTTON_COPY_CHECK_SCORE: - load_score_menu_from_submenu(MENU_BUTTON_COPY, - sMainMenuButtons[MENU_BUTTON_COPY_CHECK_SCORE]); - break; - case MENU_BUTTON_COPY_ERASE_FILE: - load_erase_menu_from_submenu(MENU_BUTTON_COPY, - sMainMenuButtons[MENU_BUTTON_COPY_ERASE_FILE]); - break; + case MENU_BUTTON_SCORE: check_score_menu_clicked_buttons(sMainMenuButtons[MENU_BUTTON_SCORE]); break; + case MENU_BUTTON_COPY: check_copy_menu_clicked_buttons (sMainMenuButtons[MENU_BUTTON_COPY ]); break; + case MENU_BUTTON_ERASE: check_erase_menu_clicked_buttons(sMainMenuButtons[MENU_BUTTON_ERASE]); break; - case MENU_BUTTON_ERASE_FILE_A: - break; - case MENU_BUTTON_ERASE_FILE_B: - break; - case MENU_BUTTON_ERASE_FILE_C: - break; - case MENU_BUTTON_ERASE_FILE_D: - break; - case MENU_BUTTON_ERASE_RETURN: - return_to_main_menu(MENU_BUTTON_ERASE, sMainMenuButtons[MENU_BUTTON_ERASE_RETURN]); - break; - case MENU_BUTTON_ERASE_CHECK_SCORE: - load_score_menu_from_submenu(MENU_BUTTON_ERASE, - sMainMenuButtons[MENU_BUTTON_ERASE_CHECK_SCORE]); - break; - case MENU_BUTTON_ERASE_COPY_FILE: - load_copy_menu_from_submenu(MENU_BUTTON_ERASE, - sMainMenuButtons[MENU_BUTTON_ERASE_COPY_FILE]); - break; + case MENU_BUTTON_SCORE_FILE_A: exit_score_file_to_score_menu(sMainMenuButtons[MENU_BUTTON_SCORE_FILE_A], MENU_BUTTON_SCORE); break; + case MENU_BUTTON_SCORE_FILE_B: exit_score_file_to_score_menu(sMainMenuButtons[MENU_BUTTON_SCORE_FILE_B], MENU_BUTTON_SCORE); break; + case MENU_BUTTON_SCORE_FILE_C: exit_score_file_to_score_menu(sMainMenuButtons[MENU_BUTTON_SCORE_FILE_C], MENU_BUTTON_SCORE); break; + case MENU_BUTTON_SCORE_FILE_D: exit_score_file_to_score_menu(sMainMenuButtons[MENU_BUTTON_SCORE_FILE_D], MENU_BUTTON_SCORE); break; - case MENU_BUTTON_SOUND_MODE: - check_sound_mode_menu_clicked_buttons(sMainMenuButtons[MENU_BUTTON_SOUND_MODE]); - break; + case MENU_BUTTON_SCORE_RETURN: return_to_main_menu (MENU_BUTTON_SCORE, sMainMenuButtons[MENU_BUTTON_SCORE_RETURN ]); break; + case MENU_BUTTON_SCORE_COPY_FILE: load_copy_menu_from_submenu (MENU_BUTTON_SCORE, sMainMenuButtons[MENU_BUTTON_SCORE_COPY_FILE ]); break; + case MENU_BUTTON_SCORE_ERASE_FILE: load_erase_menu_from_submenu(MENU_BUTTON_SCORE, sMainMenuButtons[MENU_BUTTON_SCORE_ERASE_FILE]); break; - #if MULTILANG - case MENU_BUTTON_LANGUAGE_RETURN: - return_to_main_menu(MENU_BUTTON_SOUND_MODE, sMainMenuButtons[MENU_BUTTON_LANGUAGE_RETURN]); - break; - #endif + case MENU_BUTTON_COPY_FILE_A: break; + case MENU_BUTTON_COPY_FILE_B: break; + case MENU_BUTTON_COPY_FILE_C: break; + case MENU_BUTTON_COPY_FILE_D: break; + + case MENU_BUTTON_COPY_RETURN: return_to_main_menu (MENU_BUTTON_COPY, sMainMenuButtons[MENU_BUTTON_COPY_RETURN ]); break; + case MENU_BUTTON_COPY_CHECK_SCORE: load_score_menu_from_submenu(MENU_BUTTON_COPY, sMainMenuButtons[MENU_BUTTON_COPY_CHECK_SCORE]); break; + case MENU_BUTTON_COPY_ERASE_FILE: load_erase_menu_from_submenu(MENU_BUTTON_COPY, sMainMenuButtons[MENU_BUTTON_COPY_ERASE_FILE ]); break; + + case MENU_BUTTON_ERASE_FILE_A: break; + case MENU_BUTTON_ERASE_FILE_B: break; + case MENU_BUTTON_ERASE_FILE_C: break; + case MENU_BUTTON_ERASE_FILE_D: break; + + case MENU_BUTTON_ERASE_RETURN: return_to_main_menu (MENU_BUTTON_ERASE, sMainMenuButtons[MENU_BUTTON_ERASE_RETURN ]); break; + case MENU_BUTTON_ERASE_CHECK_SCORE: load_score_menu_from_submenu(MENU_BUTTON_ERASE, sMainMenuButtons[MENU_BUTTON_ERASE_CHECK_SCORE]); break; + case MENU_BUTTON_ERASE_COPY_FILE: load_copy_menu_from_submenu (MENU_BUTTON_ERASE, sMainMenuButtons[MENU_BUTTON_ERASE_COPY_FILE ]); break; + + case MENU_BUTTON_SOUND_MODE: check_sound_mode_menu_clicked_buttons(sMainMenuButtons[MENU_BUTTON_SOUND_MODE]); break; + +#if MULTILANG + case MENU_BUTTON_LANGUAGE_RETURN: return_to_main_menu(MENU_BUTTON_SOUND_MODE, sMainMenuButtons[MENU_BUTTON_LANGUAGE_RETURN]); break; +#endif // STEREO, MONO and HEADSET buttons are undefined so they can be selected without // exiting the Options menu, as a result they added a return button - case MENU_BUTTON_STEREO: - return_to_main_menu(MENU_BUTTON_SOUND_MODE, sMainMenuButtons[MENU_BUTTON_STEREO]); - break; - case MENU_BUTTON_MONO: - return_to_main_menu(MENU_BUTTON_SOUND_MODE, sMainMenuButtons[MENU_BUTTON_MONO]); - break; - case MENU_BUTTON_HEADSET: - return_to_main_menu(MENU_BUTTON_SOUND_MODE, sMainMenuButtons[MENU_BUTTON_HEADSET]); - break; + case MENU_BUTTON_STEREO: return_to_main_menu(MENU_BUTTON_SOUND_MODE, sMainMenuButtons[MENU_BUTTON_STEREO ]); break; + case MENU_BUTTON_MONO: return_to_main_menu(MENU_BUTTON_SOUND_MODE, sMainMenuButtons[MENU_BUTTON_MONO ]); break; + case MENU_BUTTON_HEADSET: return_to_main_menu(MENU_BUTTON_SOUND_MODE, sMainMenuButtons[MENU_BUTTON_HEADSET]); break; } sClickPos[0] = -10000; @@ -1494,12 +1430,8 @@ void handle_controller_cursor_input(void) { s16 rawStickY = gPlayer3Controller->rawStickY; // Handle deadzone - if (rawStickY > -2 && rawStickY < 2) { - rawStickY = 0; - } - if (rawStickX > -2 && rawStickX < 2) { - rawStickX = 0; - } + if (rawStickY > -2 && rawStickY < 2) rawStickY = 0; + if (rawStickX > -2 && rawStickX < 2) rawStickX = 0; // Move cursor sCursorPos[0] += rawStickX / 8; @@ -1595,10 +1527,9 @@ s32 update_text_fade_out(void) { void print_save_file_star_count(s8 fileIndex, s16 x, s16 y) { u8 starCountText[4]; s8 offset = 0; - s16 starCount; if (save_file_exists(fileIndex) == TRUE) { - starCount = save_file_get_total_star_count(fileIndex, COURSE_MIN - 1, COURSE_MAX - 1); + s16 starCount = save_file_get_total_star_count(fileIndex, COURSE_MIN - 1, COURSE_MAX - 1); // Print star icon print_hud_lut_string(HUD_LUT_GLOBAL, x, y, starIcon); // If star count is less than 100, print x icon and move @@ -1617,13 +1548,13 @@ void print_save_file_star_count(s8 fileIndex, s16 x, s16 y) { } #define SELECT_FILE_X 93 - #define SCORE_X 52 - #define COPY_X 117 - #define ERASE_X 177 + #define SCORE_X 52 + #define COPY_X 117 + #define ERASE_X 177 #define SOUNDMODE_X1 sSoundTextX - #define SAVEFILE_X1 92 - #define SAVEFILE_X2 209 - #define MARIOTEXT_X1 92 + #define SAVEFILE_X1 92 + #define SAVEFILE_X2 209 + #define MARIOTEXT_X1 92 #define MARIOTEXT_X2 207 /** @@ -2096,7 +2027,7 @@ void print_sound_mode_menu_strings(void) { SOUND_HUD_Y, LANGUAGE_ARRAY(textSoundModes[mode])); } - #if MULTILANG +#if MULTILANG // In EU, print language mode names for (mode = 0, textX = 90; mode < 3; textX += 70, mode++) { if (mode == LANGUAGE_FUNCTION) { @@ -2111,7 +2042,7 @@ void print_sound_mode_menu_strings(void) { gDPSetEnvColor(gDisplayListHead++, 255, 255, 255, sTextBaseAlpha); print_generic_string(182, 29, LANGUAGE_ARRAY(textReturn)); - #endif +#endif gSPDisplayList(gDisplayListHead++, dl_ia_text_end); } @@ -2126,8 +2057,7 @@ void print_score_file_castle_secret_stars(s8 fileIndex, s16 x, s16 y) { // Print "[star] x" print_menu_generic_string(x, y, textStarX); // Print number of castle secret stars - int_to_str(save_file_get_total_star_count(fileIndex, COURSE_BONUS_STAGES - 1, COURSE_MAX - 1), - secretStarsText); + int_to_str(save_file_get_total_star_count(fileIndex, COURSE_BONUS_STAGES - 1, COURSE_MAX - 1), secretStarsText); print_menu_generic_string(x + 16, y, secretStarsText); } @@ -2195,24 +2125,25 @@ void print_score_file_star_score(s8 fileIndex, s16 courseIndex, s16 x, s16 y) { print_menu_generic_string(x, y, starScoreText); } - #define MARIO_X 25 - #define FILE_LETTER_X 95 - #define LEVEL_NUM_PAD 3 + #define MARIO_X 25 + #define FILE_LETTER_X 95 + #define LEVEL_NUM_PAD 3 #define SECRET_STARS_PAD 6 - #define LEVEL_NAME_X 23 - #define STAR_SCORE_X 171 - #define MYSCORE_X 238 - #define HISCORE_X 231 + #define LEVEL_NAME_X 23 + #define STAR_SCORE_X 171 + #define MYSCORE_X 238 + #define HISCORE_X 231 /** * Prints save file score strings that shows when a save file is chosen inside the score menu. */ void print_save_file_scores(s8 fileIndex) { - unsigned char textMario[] = { TEXT_MARIO }; - unsigned char textHiScore[] = { TEXT_HI_SCORE }; - unsigned char textMyScore[] = { TEXT_MY_SCORE }; - unsigned char textFileLetter[] = { TEXT_ZERO }; + u32 i; + unsigned char textMario[] = { TEXT_MARIO }; + unsigned char textHiScore[] = { TEXT_HI_SCORE }; + unsigned char textMyScore[] = { TEXT_MY_SCORE }; + unsigned char textFileLetter[] = { TEXT_ZERO }; void **levelNameTable = segmented_to_virtual(languageTable[gInGameLanguage][1]); textFileLetter[0] = fileIndex + ASCII_TO_DIALOG('A'); // get letter of file selected @@ -2230,31 +2161,11 @@ void print_save_file_scores(s8 fileIndex) { gSPDisplayList(gDisplayListHead++, dl_menu_ia8_text_begin); gDPSetEnvColor(gDisplayListHead++, 255, 255, 255, sTextBaseAlpha); -//! Huge print list, for loops exist for a reason! -#define PRINT_COURSE_SCORES(courseIndex, pad) \ - print_menu_generic_string(LEVEL_NAME_X + (pad * LEVEL_NUM_PAD), 23 + 12 * courseIndex, \ - segmented_to_virtual(levelNameTable[courseIndex - 1])); \ - print_score_file_star_score(fileIndex, courseIndex - 1, STAR_SCORE_X, 23 + 12 * courseIndex); \ - print_score_file_course_coin_score(fileIndex, courseIndex - 1, 213, 23 + 12 * courseIndex); - - // Course values are indexed, from Bob-omb Battlefield to Rainbow Ride - PRINT_COURSE_SCORES(COURSE_BOB, 1) - PRINT_COURSE_SCORES(COURSE_WF, 1) - PRINT_COURSE_SCORES(COURSE_JRB, 1) - PRINT_COURSE_SCORES(COURSE_CCM, 1) - PRINT_COURSE_SCORES(COURSE_BBH, 1) - PRINT_COURSE_SCORES(COURSE_HMC, 1) - PRINT_COURSE_SCORES(COURSE_LLL, 1) - PRINT_COURSE_SCORES(COURSE_SSL, 1) - PRINT_COURSE_SCORES(COURSE_DDD, 1) - PRINT_COURSE_SCORES(COURSE_SL, 0) - PRINT_COURSE_SCORES(COURSE_WDW, 0) - PRINT_COURSE_SCORES(COURSE_TTM, 0) - PRINT_COURSE_SCORES(COURSE_THI, 0) - PRINT_COURSE_SCORES(COURSE_TTC, 0) - PRINT_COURSE_SCORES(COURSE_RR, 0) - -#undef PRINT_COURSE_SCORES + for ((i = 0); (i < COURSE_STAGES_MAX); (i++)) { + print_menu_generic_string((LEVEL_NAME_X + ((i < 9) * LEVEL_NUM_PAD)), (23 + (12 * (i + 1))), segmented_to_virtual(levelNameTable[i])); + print_score_file_star_score( fileIndex, i, STAR_SCORE_X, (23 + (12 * (i + 1)))); + print_score_file_course_coin_score( fileIndex, i, 213, (23 + (12 * (i + 1)))); + } // Print castle secret stars text print_menu_generic_string(LEVEL_NAME_X + SECRET_STARS_PAD, 23 + 12 * 16, @@ -2278,38 +2189,19 @@ void print_save_file_scores(s8 fileIndex) { void print_file_select_strings(void) { create_dl_ortho_matrix(); switch (sSelectedButtonID) { - case MENU_BUTTON_NONE: - print_main_menu_strings(); - break; - case MENU_BUTTON_SCORE: - print_score_menu_strings(); - sScoreFileCoinScoreMode = 0; - break; - case MENU_BUTTON_COPY: - print_copy_menu_strings(); - break; - case MENU_BUTTON_ERASE: - print_erase_menu_strings(); - break; - case MENU_BUTTON_SCORE_FILE_A: - print_save_file_scores(SAVE_FILE_A); - break; - case MENU_BUTTON_SCORE_FILE_B: - print_save_file_scores(SAVE_FILE_B); - break; - case MENU_BUTTON_SCORE_FILE_C: - print_save_file_scores(SAVE_FILE_C); - break; - case MENU_BUTTON_SCORE_FILE_D: - print_save_file_scores(SAVE_FILE_D); - break; - case MENU_BUTTON_SOUND_MODE: - print_sound_mode_menu_strings(); - break; + case MENU_BUTTON_NONE: print_main_menu_strings(); break; + case MENU_BUTTON_SCORE: print_score_menu_strings(); sScoreFileCoinScoreMode = 0; break; + case MENU_BUTTON_COPY: print_copy_menu_strings(); break; + case MENU_BUTTON_ERASE: print_erase_menu_strings(); break; + case MENU_BUTTON_SCORE_FILE_A: print_save_file_scores(SAVE_FILE_A); break; + case MENU_BUTTON_SCORE_FILE_B: print_save_file_scores(SAVE_FILE_B); break; + case MENU_BUTTON_SCORE_FILE_C: print_save_file_scores(SAVE_FILE_C); break; + case MENU_BUTTON_SCORE_FILE_D: print_save_file_scores(SAVE_FILE_D); break; + case MENU_BUTTON_SOUND_MODE: print_sound_mode_menu_strings(); break; } // If all 4 save file exists, define true to sAllFilesExist to prevent more copies in copy menu - if (save_file_exists(SAVE_FILE_A) == TRUE && save_file_exists(SAVE_FILE_B) == TRUE && - save_file_exists(SAVE_FILE_C) == TRUE && save_file_exists(SAVE_FILE_D) == TRUE) { + if (save_file_exists(SAVE_FILE_A) && save_file_exists(SAVE_FILE_B) && + save_file_exists(SAVE_FILE_C) && save_file_exists(SAVE_FILE_D)) { sAllFilesExist = TRUE; } else { sAllFilesExist = FALSE; @@ -2342,39 +2234,27 @@ Gfx *geo_file_select_strings_and_menu_cursor(s32 callContext, UNUSED struct Grap s32 lvl_init_menu_values_and_cursor_pos(UNUSED s32 arg, UNUSED s32 unused) { sSelectedButtonID = MENU_BUTTON_NONE; sCurrentMenuLevel = MENU_LAYER_MAIN; - sTextBaseAlpha = 0; + sTextBaseAlpha = 0; // Place the cursor over the save file that was being played. // gCurrSaveFileNum is 1 by default when the game boots, as such // the cursor will point on Mario A save file. switch (gCurrSaveFileNum) { - case 1: // File A - sCursorPos[0] = -94.0f; - sCursorPos[1] = 46.0f; - break; - case 2: // File B - sCursorPos[0] = 24.0f; - sCursorPos[1] = 46.0f; - break; - case 3: // File C - sCursorPos[0] = -94.0f; - sCursorPos[1] = 5.0f; - break; - case 4: // File D - sCursorPos[0] = 24.0f; - sCursorPos[1] = 5.0f; - break; + case SAVE_FILE_NUM_A: sCursorPos[0] = -94.0f; sCursorPos[1] = 46.0f; break; + case SAVE_FILE_NUM_B: sCursorPos[0] = 24.0f; sCursorPos[1] = 46.0f; break; + case SAVE_FILE_NUM_C: sCursorPos[0] = -94.0f; sCursorPos[1] = 5.0f; break; + case SAVE_FILE_NUM_D: sCursorPos[0] = 24.0f; sCursorPos[1] = 5.0f; break; } - sClickPos[0] = -10000; - sClickPos[1] = -10000; - sCursorClickingTimer = 0; - sSelectedFileNum = 0; - sSelectedFileIndex = MENU_BUTTON_NONE; - sFadeOutText = FALSE; - sStatusMessageID = 0; - sTextFadeAlpha = 0; - sMainMenuTimer = 0; + sClickPos[0] = -10000; + sClickPos[1] = -10000; + sCursorClickingTimer = 0; + sSelectedFileNum = 0; + sSelectedFileIndex = MENU_BUTTON_NONE; + sFadeOutText = FALSE; + sStatusMessageID = 0; + sTextFadeAlpha = 0; + sMainMenuTimer = 0; sEraseYesNoHoverState = MENU_ERASE_HOVER_NONE; - sSoundMode = save_file_get_sound_mode(); + sSoundMode = save_file_get_sound_mode(); return 0; } From 56fa02ec8758b093f13b423019db17cc31280271 Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Mon, 27 Sep 2021 18:03:06 -0700 Subject: [PATCH 14/97] COND_BIT + fix transparent tree layer + asymptitic turn --- actors/tree/geo.inc.c | 8 ++--- include/config.h | 1 + include/types.h | 1 + src/engine/behavior_script.c | 13 ++------ src/engine/geo_layout.c | 12 ++----- src/engine/graph_node.c | 4 +-- src/engine/surface_load.c | 11 ++----- src/game/area.c | 15 ++++----- src/game/area.h | 3 ++ src/game/behaviors/bobomb.inc.c | 5 +-- src/game/behaviors/breakable_box_small.inc.c | 5 +-- src/game/behaviors/flame_mario.inc.c | 4 +-- src/game/behaviors/tree_particles.inc.c | 2 +- .../behaviors/water_splashes_and_waves.inc.c | 5 +-- src/game/interaction.c | 9 ++---- src/game/level_update.c | 18 ++--------- src/game/mario_actions_moving.c | 2 ++ src/game/mario_misc.c | 6 +--- src/game/obj_behaviors.c | 16 ++-------- src/game/object_collision.c | 32 ++++++------------- src/game/object_helpers.c | 8 +---- src/game/object_list_processor.c | 17 ++++------ src/game/puppycam2.c | 12 ++----- src/game/puppylights.c | 7 ++-- src/goddard/draw_objects.c | 3 +- 25 files changed, 68 insertions(+), 151 deletions(-) diff --git a/actors/tree/geo.inc.c b/actors/tree/geo.inc.c index 5d1cecd1..f44b7dc9 100644 --- a/actors/tree/geo.inc.c +++ b/actors/tree/geo.inc.c @@ -9,7 +9,7 @@ const GeoLayout bubbly_tree_geo[] = { #endif GEO_DISPLAY_LIST(LAYER_ALPHA, tree_seg3_dl_bubbly), #ifdef OBJ_OPACITY_BY_CAM_DIST - GEO_DISPLAY_LIST(LAYER_TRANSPARENT, tree_seg3_dl_bubbly), + GEO_DISPLAY_LIST(LAYER_TRANSPARENT_INTER, tree_seg3_dl_bubbly), GEO_CLOSE_NODE(), #endif GEO_CLOSE_NODE(), @@ -27,7 +27,7 @@ const GeoLayout spiky_tree_geo[] = { #endif GEO_DISPLAY_LIST(LAYER_ALPHA, tree_seg3_dl_spiky), #ifdef OBJ_OPACITY_BY_CAM_DIST - GEO_DISPLAY_LIST(LAYER_TRANSPARENT, tree_seg3_dl_spiky), + GEO_DISPLAY_LIST(LAYER_TRANSPARENT_INTER, tree_seg3_dl_spiky), GEO_CLOSE_NODE(), #endif GEO_CLOSE_NODE(), @@ -45,7 +45,7 @@ const GeoLayout snow_tree_geo[] = { #endif GEO_DISPLAY_LIST(LAYER_ALPHA, tree_seg3_dl_snowy_pine), #ifdef OBJ_OPACITY_BY_CAM_DIST - GEO_DISPLAY_LIST(LAYER_TRANSPARENT, tree_seg3_dl_snowy_pine), + GEO_DISPLAY_LIST(LAYER_TRANSPARENT_INTER, tree_seg3_dl_snowy_pine), GEO_CLOSE_NODE(), #endif GEO_CLOSE_NODE(), @@ -63,7 +63,7 @@ const GeoLayout palm_tree_geo[] = { #endif GEO_DISPLAY_LIST(LAYER_ALPHA, tree_seg3_dl_palm), #ifdef OBJ_OPACITY_BY_CAM_DIST - GEO_DISPLAY_LIST(LAYER_TRANSPARENT, tree_seg3_dl_palm), + GEO_DISPLAY_LIST(LAYER_TRANSPARENT_INTER, tree_seg3_dl_palm), GEO_CLOSE_NODE(), #endif GEO_CLOSE_NODE(), diff --git a/include/config.h b/include/config.h index 9d8b9189..2b393dee 100644 --- a/include/config.h +++ b/include/config.h @@ -66,6 +66,7 @@ // 1 is similar to vanilla, but prevents Mario from moving in the wrong direction, and allows finer control with the analog stick. // 2 is similar to mode 1, but a bit further from vanilla, and allows instant turnaround if Mario is moving slower than a certain threshold. // 3 is instant turning to the intended direction regardless of speed and angle. +// 4 is an expeimental asymptotic turn. #define GROUND_TURN_MODE 0 // Improved hanging: // - Doesn't require holding down the A button diff --git a/include/types.h b/include/types.h index 32feca95..13e5c298 100644 --- a/include/types.h +++ b/include/types.h @@ -10,6 +10,7 @@ #define BIT(i) (1 << (i)) #define BITMASK(size) ((BIT(size)) - 1) +#define COND_BIT(cond, dst, flag) { (dst) &= ~(flag); if (cond) (dst) |= (flag); } struct Config { diff --git a/src/engine/behavior_script.c b/src/engine/behavior_script.c index 445e5616..05631ff5 100644 --- a/src/engine/behavior_script.c +++ b/src/engine/behavior_script.c @@ -971,17 +971,8 @@ void cur_obj_update(void) { obj_update_gfx_pos_and_angle(gCurrentObject); } - if (objFlags & OBJ_FLAG_UCODE_LARGE) { - gCurrentObject->header.gfx.node.flags &= ~GRAPH_RENDER_UCODE_REJ; - } else { - gCurrentObject->header.gfx.node.flags |= GRAPH_RENDER_UCODE_REJ; - } - - if (objFlags & OBJ_FLAG_SILHOUETTE) { - gCurrentObject->header.gfx.node.flags |= GRAPH_RENDER_SILHOUETTE; - } else { - gCurrentObject->header.gfx.node.flags &= ~GRAPH_RENDER_SILHOUETTE; - } + COND_BIT((!(objFlags & OBJ_FLAG_UCODE_LARGE)), gCurrentObject->header.gfx.node.flags, GRAPH_RENDER_UCODE_REJ ); + COND_BIT( (objFlags & OBJ_FLAG_SILHOUETTE ), gCurrentObject->header.gfx.node.flags, GRAPH_RENDER_SILHOUETTE); #ifdef OBJ_OPACITY_BY_CAM_DIST if (objFlags & OBJ_FLAG_OPACITY_FROM_CAMERA_DIST) { diff --git a/src/engine/geo_layout.c b/src/engine/geo_layout.c index 7b179750..2f866cd5 100644 --- a/src/engine/geo_layout.c +++ b/src/engine/geo_layout.c @@ -172,15 +172,9 @@ void geo_layout_cmd_update_node_flags(void) { u16 flagBits = cur_geo_cmd_s16(0x02); switch (operation) { - case GEO_CMD_FLAGS_RESET: - gCurGraphNodeList[gCurGraphNodeIndex]->flags = flagBits; - break; - case GEO_CMD_FLAGS_SET: - gCurGraphNodeList[gCurGraphNodeIndex]->flags |= flagBits; - break; - case GEO_CMD_FLAGS_CLEAR: - gCurGraphNodeList[gCurGraphNodeIndex]->flags &= ~flagBits; - break; + case GEO_CMD_FLAGS_RESET: gCurGraphNodeList[gCurGraphNodeIndex]->flags = flagBits; break; + case GEO_CMD_FLAGS_SET: gCurGraphNodeList[gCurGraphNodeIndex]->flags |= flagBits; break; + case GEO_CMD_FLAGS_CLEAR: gCurGraphNodeList[gCurGraphNodeIndex]->flags &= ~flagBits; break; } gGeoLayoutCommand += 0x04 << CMD_SIZE_SHIFT; diff --git a/src/engine/graph_node.c b/src/engine/graph_node.c index 7c8bb45a..1b0790ad 100644 --- a/src/engine/graph_node.c +++ b/src/engine/graph_node.c @@ -722,9 +722,9 @@ void geo_obj_init(struct GraphNodeObject *graphNode, void *sharedChild, Vec3f po graphNode->throwMatrix = NULL; graphNode->animInfo.curAnim = NULL; - graphNode->node.flags |= GRAPH_RENDER_ACTIVE; + graphNode->node.flags |= GRAPH_RENDER_ACTIVE; graphNode->node.flags &= ~GRAPH_RENDER_INVISIBLE; - graphNode->node.flags |= GRAPH_RENDER_HAS_ANIMATION; + graphNode->node.flags |= GRAPH_RENDER_HAS_ANIMATION; graphNode->node.flags &= ~GRAPH_RENDER_BILLBOARD; } diff --git a/src/engine/surface_load.c b/src/engine/surface_load.c index 83fed388..56dafaf4 100644 --- a/src/engine/surface_load.c +++ b/src/engine/surface_load.c @@ -753,13 +753,8 @@ void load_object_collision_model(void) { load_object_surfaces(&collisionData, vertexData); } } - - if (marioDist < gCurrentObject->oDrawingDistance) { - gCurrentObject->header.gfx.node.flags |= GRAPH_RENDER_ACTIVE; - } else { - gCurrentObject->header.gfx.node.flags &= ~GRAPH_RENDER_ACTIVE; - } - #if PUPPYPRINT_DEBUG + COND_BIT((marioDist < gCurrentObject->oDrawingDistance), gCurrentObject->header.gfx.node.flags, GRAPH_RENDER_ACTIVE); +#if PUPPYPRINT_DEBUG collisionTime[perfIteration] += osGetTime()-first; - #endif +#endif } diff --git a/src/game/area.c b/src/game/area.c index d49c962f..ca298033 100644 --- a/src/game/area.c +++ b/src/game/area.c @@ -248,7 +248,7 @@ void unload_area(void) { unload_objects_from_area(0, gCurrentArea->index); geo_call_global_function_nodes(&gCurrentArea->graphNode->node, GEO_CONTEXT_AREA_UNLOAD); - gCurrentArea->flags = 0; + gCurrentArea->flags = AREA_FLAG_UNLOAD; gCurrentArea = NULL; gWarpTransition.isActive = FALSE; } @@ -259,20 +259,19 @@ void load_mario_area(void) { load_area(gMarioSpawnInfo->areaIndex); if (gCurrentArea->index == gMarioSpawnInfo->areaIndex) { - gCurrentArea->flags |= 0x01; + gCurrentArea->flags |= AREA_FLAG_LOAD; spawn_objects_from_info(0, gMarioSpawnInfo); } - if (gAreaSkyboxStart[gCurrAreaIndex-1]) { - load_segment_decompress(0x0A, gAreaSkyboxStart[gCurrAreaIndex-1], gAreaSkyboxEnd[gCurrAreaIndex-1]); + if (gAreaSkyboxStart[gCurrAreaIndex - 1]) { + load_segment_decompress(0x0A, gAreaSkyboxStart[gCurrAreaIndex - 1], gAreaSkyboxEnd[gCurrAreaIndex - 1]); } } void unload_mario_area(void) { - if (gCurrentArea != NULL && (gCurrentArea->flags & 0x01)) { + if (gCurrentArea != NULL && (gCurrentArea->flags & AREA_FLAG_LOAD)) { unload_objects_from_area(0, gMarioSpawnInfo->activeAreaIndex); - - gCurrentArea->flags &= ~0x01; - if (gCurrentArea->flags == 0) { + gCurrentArea->flags &= ~AREA_FLAG_LOAD; + if (gCurrentArea->flags == AREA_FLAG_UNLOAD) { unload_area(); } } diff --git a/src/game/area.h b/src/game/area.h index 74d08cff..950a1a26 100644 --- a/src/game/area.h +++ b/src/game/area.h @@ -60,6 +60,9 @@ struct Whirlpool /*0x03*/ s16 strength; }; +#define AREA_FLAG_UNLOAD 0x0 +#define AREA_FLAG_LOAD 0x1 + struct Area { /*0x00*/ s8 index; diff --git a/src/game/behaviors/bobomb.inc.c b/src/game/behaviors/bobomb.inc.c index d184b93f..ed84d283 100644 --- a/src/game/behaviors/bobomb.inc.c +++ b/src/game/behaviors/bobomb.inc.c @@ -366,10 +366,11 @@ void bobomb_buddy_act_talk(void) { break; case BOBOMB_BUDDY_ROLE_CANNON: - if (gCurrCourseNum == COURSE_BOB) + if (gCurrCourseNum == COURSE_BOB) { bobomb_buddy_cannon_dialog(DIALOG_004, DIALOG_105); - else + } else { bobomb_buddy_cannon_dialog(DIALOG_047, DIALOG_106); + } break; } } diff --git a/src/game/behaviors/breakable_box_small.inc.c b/src/game/behaviors/breakable_box_small.inc.c index 1b30d2a6..608fdad6 100644 --- a/src/game/behaviors/breakable_box_small.inc.c +++ b/src/game/behaviors/breakable_box_small.inc.c @@ -57,10 +57,7 @@ void breakable_box_small_released_loop(void) { // Begin flashing if (o->oBreakableBoxSmallFramesSinceReleased > 810) { - if (o->oBreakableBoxSmallFramesSinceReleased & 1) - o->header.gfx.node.flags |= GRAPH_RENDER_INVISIBLE; - else - o->header.gfx.node.flags &= ~GRAPH_RENDER_INVISIBLE; + COND_BIT((o->oBreakableBoxSmallFramesSinceReleased & 0X1), o->header.gfx.node.flags, GRAPH_RENDER_INVISIBLE); } // Despawn, and create a corkbox respawner diff --git a/src/game/behaviors/flame_mario.inc.c b/src/game/behaviors/flame_mario.inc.c index ea8ae257..b8f32877 100644 --- a/src/game/behaviors/flame_mario.inc.c +++ b/src/game/behaviors/flame_mario.inc.c @@ -33,8 +33,8 @@ void bhv_flame_mario_loop(void) { spawn_object(o, MODEL_BURN_SMOKE, bhvBlackSmokeMario); gMarioObject->prevObj = o; // weird? obj_set_parent_relative_pos(o, 40, -120, 0); - if (!(gMarioObject->oMarioParticleFlags & 0x800)) { - o->parentObj->oActiveParticleFlags &= ~0x800; + if (!(gMarioObject->oMarioParticleFlags & ACTIVE_PARTICLE_FIRE)) { + o->parentObj->oActiveParticleFlags &= ~ACTIVE_PARTICLE_FIRE; obj_mark_for_deletion(o); gMarioObject->prevObj = NULL; } diff --git a/src/game/behaviors/tree_particles.inc.c b/src/game/behaviors/tree_particles.inc.c index c8a2e684..8cfa2868 100644 --- a/src/game/behaviors/tree_particles.inc.c +++ b/src/game/behaviors/tree_particles.inc.c @@ -36,7 +36,7 @@ void bhv_snow_leaf_particle_spawn_init(void) { struct Object *obj; // Either snow or leaf struct Object *nearestTree = NULL; f32 scale; - gMarioObject->oActiveParticleFlags &= ~0x2000; + gMarioObject->oActiveParticleFlags &= ~ACTIVE_PARTICLE_LEAF; // Whether a tree uses snow particles or not is decided via the model IDs instead of the course number nearestTree = cur_obj_nearest_object_with_behavior(bhvTree); if (nearestTree->header.gfx.sharedChild == gLoadedGraphNodes[MODEL_CCM_SNOW_TREE] || nearestTree->header.gfx.sharedChild == gLoadedGraphNodes[MODEL_SL_SNOW_TREE]) { diff --git a/src/game/behaviors/water_splashes_and_waves.inc.c b/src/game/behaviors/water_splashes_and_waves.inc.c index 2a7b02fe..73cdb52c 100644 --- a/src/game/behaviors/water_splashes_and_waves.inc.c +++ b/src/game/behaviors/water_splashes_and_waves.inc.c @@ -60,10 +60,7 @@ void bhv_water_droplet_loop(void) { f32 waterLevel = find_water_level(o->oPosX, o->oPosZ); if (o->oTimer == 0) { - if (cur_obj_has_model(MODEL_FISH)) - o->header.gfx.node.flags &= ~GRAPH_RENDER_BILLBOARD; - else - o->header.gfx.node.flags |= GRAPH_RENDER_BILLBOARD; + COND_BIT((!cur_obj_has_model(MODEL_FISH)), o->header.gfx.node.flags, GRAPH_RENDER_BILLBOARD); o->oFaceAngleYaw = random_u16(); } // Apply gravity diff --git a/src/game/interaction.c b/src/game/interaction.c index d8ae718e..902ef299 100644 --- a/src/game/interaction.c +++ b/src/game/interaction.c @@ -364,22 +364,19 @@ void mario_blow_off_cap(struct MarioState *m, f32 capSpeed) { } u32 mario_lose_cap_to_enemy(u32 enemyType) { - u32 wasWearingCap = FALSE; - if (does_mario_have_normal_cap_on_head(gMarioState)) { save_file_set_flags(enemyType == 1 ? SAVE_FLAG_CAP_ON_KLEPTO : SAVE_FLAG_CAP_ON_UKIKI); gMarioState->flags &= ~(MARIO_NORMAL_CAP | MARIO_CAP_ON_HEAD); - wasWearingCap = TRUE; + return TRUE; } - - return wasWearingCap; + return FALSE; } void mario_retrieve_cap(void) { mario_drop_held_object(gMarioState); save_file_clear_flags(SAVE_FLAG_CAP_ON_KLEPTO | SAVE_FLAG_CAP_ON_UKIKI); gMarioState->flags &= ~MARIO_CAP_ON_HEAD; - gMarioState->flags |= MARIO_NORMAL_CAP | MARIO_CAP_IN_HAND; + gMarioState->flags |= (MARIO_NORMAL_CAP | MARIO_CAP_IN_HAND); } u32 able_to_grab_object(struct MarioState *m, UNUSED struct Object *obj) { diff --git a/src/game/level_update.c b/src/game/level_update.c index 318625df..cc76124b 100644 --- a/src/game/level_update.c +++ b/src/game/level_update.c @@ -907,11 +907,7 @@ void update_hud_values(void) { #ifdef BREATH_METER s16 numBreathWedges = ((gMarioState->breath > 0) ? (gMarioState->breath >> 8) : 0); #endif - if (gCurrCourseNum >= COURSE_MIN) { - gHudDisplay.flags |= HUD_DISPLAY_FLAG_COIN_COUNT; - } else { - gHudDisplay.flags &= ~HUD_DISPLAY_FLAG_COIN_COUNT; - } + COND_BIT((gCurrCourseNum >= COURSE_MIN), gHudDisplay.flags, HUD_DISPLAY_FLAG_COIN_COUNT); if (gHudDisplay.coins < gMarioState->numCoins) { if (gGlobalTimer & 0x1) { @@ -947,18 +943,10 @@ void update_hud_values(void) { play_sound(SOUND_MENU_POWER_METER, gGlobalSoundSource); } gHudDisplay.wedges = numHealthWedges; - if (gMarioState->hurtCounter > 0) { - gHudDisplay.flags |= HUD_DISPLAY_FLAG_EMPHASIZE_POWER; - } else { - gHudDisplay.flags &= ~HUD_DISPLAY_FLAG_EMPHASIZE_POWER; - } + COND_BIT((gMarioState->hurtCounter > 0), gHudDisplay.flags, HUD_DISPLAY_FLAG_EMPHASIZE_POWER); #ifdef BREATH_METER gHudDisplay.breath = numBreathWedges; - if (gMarioState->breath > 0) { - gHudDisplay.flags |= HUD_DISPLAY_FLAG_BREATH_METER; - } else { - gHudDisplay.flags &= ~HUD_DISPLAY_FLAG_BREATH_METER; - } + COND_BIT((gMarioState->breath > 0), gHudDisplay.flags, HUD_DISPLAY_FLAG_BREATH_METER); #endif } } diff --git a/src/game/mario_actions_moving.c b/src/game/mario_actions_moving.c index 1253932d..c3cbeb4a 100644 --- a/src/game/mario_actions_moving.c +++ b/src/game/mario_actions_moving.c @@ -500,6 +500,8 @@ void update_walking_speed(struct MarioState *m) { } #elif GROUND_TURN_MODE == 3 // Instant turn. m->faceAngle[1] = m->intendedYaw; +#elif GROUND_TURN_MODE == 4 + m->faceAngle[1] = approach_s16_asymptotic(m->faceAngle[1], m->intendedYaw, m->forwardVel / 8.0f); // should be max speed for the current action instead of m->forwardVel #endif apply_slope_accel(m); } diff --git a/src/game/mario_misc.c b/src/game/mario_misc.c index 5740afdd..7d081003 100644 --- a/src/game/mario_misc.c +++ b/src/game/mario_misc.c @@ -512,11 +512,7 @@ Gfx *geo_switch_mario_cap_on_off(s32 callContext, struct GraphNode *node, UNUSED switchCase->selectedCase = bodyState->capState & 1; while (next != node) { if (next->type == GRAPH_NODE_TYPE_TRANSLATION_ROTATION) { - if (bodyState->capState & 2) { - next->flags |= GRAPH_RENDER_ACTIVE; - } else { - next->flags &= ~GRAPH_RENDER_ACTIVE; - } + COND_BIT((bodyState->capState & 0x2), next->flags, GRAPH_RENDER_ACTIVE); } next = next->next; } diff --git a/src/game/obj_behaviors.c b/src/game/obj_behaviors.c index a79263c5..e4dfd5b4 100644 --- a/src/game/obj_behaviors.c +++ b/src/game/obj_behaviors.c @@ -513,15 +513,7 @@ s8 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. */ void set_object_visibility(struct Object *obj, s32 dist) { - f32 objX = obj->oPosX; - f32 objY = obj->oPosY; - f32 objZ = obj->oPosZ; - - if (is_point_within_radius_of_mario(objX, objY, objZ, dist) == TRUE) { - obj->header.gfx.node.flags &= ~GRAPH_RENDER_INVISIBLE; - } else { - obj->header.gfx.node.flags |= GRAPH_RENDER_INVISIBLE; - } + COND_BIT((!is_point_within_radius_of_mario(obj->oPosX, obj->oPosY, obj->oPosZ, dist)), obj->header.gfx.node.flags, GRAPH_RENDER_INVISIBLE); } /** @@ -620,11 +612,7 @@ s8 obj_flicker_and_disappear(struct Object *obj, s16 lifeSpan) { } if (obj->oTimer < lifeSpan + 40) { - if (obj->oTimer % 2 != 0) { - obj->header.gfx.node.flags |= GRAPH_RENDER_INVISIBLE; - } else { - obj->header.gfx.node.flags &= ~GRAPH_RENDER_INVISIBLE; - } + COND_BIT((obj->oTimer & 0x1), obj->header.gfx.node.flags, GRAPH_RENDER_INVISIBLE); } else { obj->activeFlags = ACTIVE_FLAG_DEACTIVATED; return TRUE; diff --git a/src/game/object_collision.c b/src/game/object_collision.c index 3e4b0bf4..6b765fe4 100644 --- a/src/game/object_collision.c +++ b/src/game/object_collision.c @@ -34,28 +34,20 @@ s32 detect_object_hitbox_overlap(struct Object *a, struct Object *b) { f32 dya_top = a->hitboxHeight + dya_bottom; f32 dyb_top = b->hitboxHeight + dyb_bottom; - if (dya_bottom > dyb_top) { - return 0; - } - if (dya_top < dyb_bottom) { - return 0; - } - if (a->numCollidedObjs >= 4) { - return 0; - } - if (b->numCollidedObjs >= 4) { - return 0; - } + if (dya_bottom > dyb_top) return FALSE; + if (dya_top < dyb_bottom) return FALSE; + if (a->numCollidedObjs >= 4) return FALSE; + if (b->numCollidedObjs >= 4) return FALSE; a->collidedObjs[a->numCollidedObjs] = b; b->collidedObjs[b->numCollidedObjs] = a; a->collidedObjInteractTypes |= b->oInteractType; b->collidedObjInteractTypes |= a->oInteractType; a->numCollidedObjs++; b->numCollidedObjs++; - return 1; + return TRUE; } - return 0; + return FALSE; } s32 detect_object_hurtbox_overlap(struct Object *a, struct Object *b) { @@ -74,19 +66,15 @@ s32 detect_object_hurtbox_overlap(struct Object *a, struct Object *b) { f32 dya_top = a->hitboxHeight + dya_bottom; f32 dyb_top = b->hurtboxHeight + dyb_bottom; - if (dya_bottom > dyb_top) { - return 0; - } - if (dya_top < dyb_bottom) { - return 0; - } + if (dya_bottom > dyb_top) return FALSE; + if (dya_top < dyb_bottom) return FALSE; if (a == gMarioObject) { b->oInteractionSubtype &= ~INT_SUBTYPE_DELAY_INVINCIBILITY; } - return 1; + return TRUE; } - return 0; + return FALSE; } void clear_object_collision(struct Object *a) { diff --git a/src/game/object_helpers.c b/src/game/object_helpers.c index d0a37817..cedeabeb 100644 --- a/src/game/object_helpers.c +++ b/src/game/object_helpers.c @@ -1244,13 +1244,7 @@ void cur_obj_move_y(f32 gravity, f32 bounciness, f32 buoyancy) { } } } - - if (o->oMoveFlags & (OBJ_MOVE_MASK_ON_GROUND | OBJ_MOVE_AT_WATER_SURFACE - | OBJ_MOVE_UNDERWATER_OFF_GROUND)) { - o->oMoveFlags &= ~OBJ_MOVE_IN_AIR; - } else { - o->oMoveFlags |= OBJ_MOVE_IN_AIR; - } + COND_BIT((!(o->oMoveFlags & (OBJ_MOVE_MASK_ON_GROUND | OBJ_MOVE_AT_WATER_SURFACE | OBJ_MOVE_UNDERWATER_OFF_GROUND))), o->oMoveFlags, OBJ_MOVE_IN_AIR); } static s32 clear_move_flag(u32 *bitSet, s32 flag) { diff --git a/src/game/object_list_processor.c b/src/game/object_list_processor.c index 70847dd1..659be2e2 100644 --- a/src/game/object_list_processor.c +++ b/src/game/object_list_processor.c @@ -590,10 +590,10 @@ UNUSED static u16 unused_get_elapsed_time(u64 *cycleCounts, s32 index) { */ void update_objects(UNUSED s32 unused) { s64 cycleCounts[30]; - #if PUPPYPRINT_DEBUG +#if PUPPYPRINT_DEBUG OSTime first = osGetTime(); OSTime colTime = collisionTime[perfIteration]; - #endif +#endif cycleCounts[0] = get_current_clock(); @@ -641,17 +641,12 @@ void update_objects(UNUSED s32 unused) { cycleCounts[0] = 0; try_print_debug_mario_object_info(); - // If time stop was enabled this frame, activate it now so that it will - // take effect next frame - if (gTimeStopState & TIME_STOP_ENABLED) { - gTimeStopState |= TIME_STOP_ACTIVE; - } else { - gTimeStopState &= ~TIME_STOP_ACTIVE; - } + // If time stop was enabled this frame, activate it now so that it will take effect next frame + COND_BIT((gTimeStopState & TIME_STOP_ENABLED), gTimeStopState, TIME_STOP_ACTIVE); gPrevFrameObjectCount = gObjectCounter; - #if PUPPYPRINT_DEBUG +#if PUPPYPRINT_DEBUG profiler_update(behaviourTime, first); behaviourTime[perfIteration] -= collisionTime[perfIteration]+colTime; - #endif +#endif } diff --git a/src/game/puppycam2.c b/src/game/puppycam2.c index c53b0397..683ba402 100644 --- a/src/game/puppycam2.c +++ b/src/game/puppycam2.c @@ -821,19 +821,11 @@ void puppycam_debug_view(void) { vec3f_set(gMarioState->pos, gPuppyCam.pos[0], gPuppyCam.pos[1], gPuppyCam.pos[2]); } if (gPlayer1Controller->buttonPressed & B_BUTTON) { - if (gPuppyCam.debugFlags & PUPPYDEBUG_LOCK_CONTROLS) { - gPuppyCam.debugFlags &= ~PUPPYDEBUG_LOCK_CONTROLS; - } else { - gPuppyCam.debugFlags |= PUPPYDEBUG_LOCK_CONTROLS; - } + gPuppyCam.debugFlags ^= PUPPYDEBUG_LOCK_CONTROLS; } if (gPlayer1Controller->buttonPressed & R_TRIG && !(gPuppyCam.debugFlags & PUPPYDEBUG_LOCK_CONTROLS)) { - if (gPuppyCam.debugFlags & PUPPYDEBUG_TRACK_MARIO) { - gPuppyCam.debugFlags &= ~PUPPYDEBUG_TRACK_MARIO; - } else { - gPuppyCam.debugFlags |= PUPPYDEBUG_TRACK_MARIO; - } + gPuppyCam.debugFlags ^= PUPPYDEBUG_TRACK_MARIO; } } diff --git a/src/game/puppylights.c b/src/game/puppylights.c index a3a49900..64f86098 100644 --- a/src/game/puppylights.c +++ b/src/game/puppylights.c @@ -254,13 +254,12 @@ void puppylights_run(Lights1 *src, struct Object *obj, s32 flags, u32 baseColour { if (gPuppyLights[i]->rgba[3] > 0 && gPuppyLights[i]->active == TRUE && gPuppyLights[i]->area == gCurrAreaIndex && (gPuppyLights[i]->room == -1 || gPuppyLights[i]->room == gMarioCurrentRoom)) { - if (gPuppyLights[i]->flags & PUPPYLIGHT_DIRECTIONAL && !offsetPlaced) - { + if (gPuppyLights[i]->flags & PUPPYLIGHT_DIRECTIONAL && !offsetPlaced) { lightFlags |= LIGHTFLAG_DIRECTIONAL_OFFSET; offsetPlaced = 1; - } - else + } else { lightFlags &= ~LIGHTFLAG_DIRECTIONAL_OFFSET; + } puppylights_iterate(gPuppyLights[i], src, obj, lightFlags); numlights++; } diff --git a/src/goddard/draw_objects.c b/src/goddard/draw_objects.c index 9ccc8f45..95c19812 100644 --- a/src/goddard/draw_objects.c +++ b/src/goddard/draw_objects.c @@ -1267,8 +1267,7 @@ void update_view(struct ObjView *view) { } find_and_drag_picked_object(sUpdateViewState.view->components); - } else // check for any previously picked objects, and turn off? - { + } else { // check for any previously picked objects, and turn off? if (sUpdateViewState.view->pickedObj != NULL) { sUpdateViewState.view->pickedObj->drawFlags &= ~OBJ_PICKED; sUpdateViewState.view->pickedObj->drawFlags &= ~OBJ_HIGHLIGHTED; From ec31997ba078f4b2db106ee69a8fa4bb315eb20a Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Mon, 27 Sep 2021 21:39:45 -0700 Subject: [PATCH 15/97] Improved puppyprint font --- src/game/mario_actions_moving.c | 19 +- src/game/puppyprint.c | 722 +++++++++++---------------- textures/segment2/custom_text.i4.png | Bin 1870 -> 16346 bytes 3 files changed, 302 insertions(+), 439 deletions(-) diff --git a/src/game/mario_actions_moving.c b/src/game/mario_actions_moving.c index c3cbeb4a..db316f5d 100644 --- a/src/game/mario_actions_moving.c +++ b/src/game/mario_actions_moving.c @@ -434,23 +434,19 @@ s32 update_decelerating_speed(struct MarioState *m) { } void update_walking_speed(struct MarioState *m) { - f32 maxTargetSpeed; + f32 maxTargetSpeed = ((m->floor != NULL && m->floor->type == SURFACE_SLOW) ? 24.0f : 32.0f); - if (m->floor != NULL && m->floor->type == SURFACE_SLOW) { - maxTargetSpeed = 24.0f; - } else { - maxTargetSpeed = 32.0f; - } - - f32 targetSpeed = m->intendedMag < maxTargetSpeed ? m->intendedMag : maxTargetSpeed; + f32 targetSpeed = ((m->intendedMag < maxTargetSpeed) ? m->intendedMag : maxTargetSpeed); if (m->quicksandDepth > 10.0f) { targetSpeed *= 6.25 / m->quicksandDepth; } if (m->forwardVel <= 0.0f) { + // Slow down if moving backwards m->forwardVel += 1.1f; } else if (m->forwardVel <= targetSpeed) { + // If accelerating m->forwardVel += 1.1f - m->forwardVel / 43.0f; } else if (m->floor->normal.y >= 0.95f) { m->forwardVel -= 1.0f; @@ -476,14 +472,15 @@ void update_walking_speed(struct MarioState *m) { } m->faceAngle[1] = approach_angle(m->faceAngle[1], m->intendedYaw, turnRange); #elif GROUND_TURN_MODE == 2 // similar to mode 1, but a bit further from vanilla, and allows instant turnaround if Mario is moving slower than a certain threshold. - if ((m->forwardVel < 0.0f) && (m->heldObj == NULL) && !(m->action & ACT_FLAG_SHORT_HITBOX)) { + Bool32 doFullTurn = (m->heldObj == NULL) && !(m->action & ACT_FLAG_SHORT_HITBOX); + if ((m->forwardVel < 0.0f) && doFullTurn) { // Flip Mario if he is moving backwards m->faceAngle[1] += 0x8000; m->forwardVel *= -1.0f; } - if (analog_stick_held_back(m) && (m->heldObj == NULL) && !(m->action & ACT_FLAG_SHORT_HITBOX)) { + if (analog_stick_held_back(m) && doFullTurn) { // Turn around instantly - set_mario_action(m, ACT_TURNING_AROUND, 0); + // set_mario_action(m, ACT_TURNING_AROUND, 0); if (m->forwardVel < 10.0f) { m->faceAngle[1] = m->intendedYaw; } diff --git a/src/game/puppyprint.c b/src/game/puppyprint.c index 7ab328c6..5c3d454b 100644 --- a/src/game/puppyprint.c +++ b/src/game/puppyprint.c @@ -46,20 +46,20 @@ a modern game engine's developer's console. #include "hud.h" #include "debug_box.h" -u8 currEnv[4]; +ColorRGBA currEnv; u8 fDebug = 0; #if PUPPYPRINT_DEBUG s8 benchViewer = 0; u8 benchOption = 0; s8 logViewer = 0; -//Profiler values +// Profiler values s8 perfIteration = 0; s16 benchmarkLoop = 0; s32 benchmarkTimer = 0; s32 benchmarkProgramTimer = 0; s8 benchmarkType = 0; -//General +// General OSTime cpuTime = 0; OSTime rspTime = 0; OSTime rdpTime = 0; @@ -68,7 +68,7 @@ OSTime loadTime = 0; OSTime gLastOSTime = 0; OSTime rspDelta = 0; s32 benchMark[NUM_BENCH_ITERATIONS+2]; -//CPU +// CPU OSTime collisionTime[NUM_PERF_ITERATIONS+1]; OSTime behaviourTime[NUM_PERF_ITERATIONS+1]; OSTime scriptTime[NUM_PERF_ITERATIONS+1]; @@ -80,19 +80,19 @@ OSTime faultTime[NUM_PERF_ITERATIONS+1]; OSTime taskTime[NUM_PERF_ITERATIONS+1]; OSTime profilerTime[NUM_PERF_ITERATIONS+1]; OSTime profilerTime2[NUM_PERF_ITERATIONS+1]; -//RSP +// RSP OSTime audioTime[NUM_PERF_ITERATIONS+1]; OSTime rspGenTime[NUM_PERF_ITERATIONS+1]; -//RDP +// RDP OSTime bufferTime[NUM_PERF_ITERATIONS+1]; OSTime tmemTime[NUM_PERF_ITERATIONS+1]; OSTime busTime[NUM_PERF_ITERATIONS+1]; -//RAM +// RAM s8 ramViewer = 0; s32 ramsizeSegment[33] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; s32 audioPool[12]; s32 mempool; -//Collision +// Collision u8 collisionViewer = 0; s32 numSurfaces = 0; @@ -116,22 +116,21 @@ s32 ramP[5][2] = { {(u32)&_goddardSegmentStart, (u32)&_goddardSegmentEnd}, }; -void puppyprint_calculate_ram_usage(void) -{ +void puppyprint_calculate_ram_usage(void) { s32 temp[2]; s32 i = 0; - for (i = 0; i < 5; i++) - { - if (!ramP[i][0] || !ramP[i][1]) + for (i = 0; i < 5; i++) { + if (!ramP[i][0] || !ramP[i][1]) { continue; + } temp[0] = ramP[i][0]; temp[1] = ramP[i][1]; ramsizeSegment[i] = temp[1] - temp[0]; } - //These are a bit hacky, but what can ye do eh? - //gEffectsMemoryPool is 0x4000, gObjectsMemoryPool is 0x800. Epic C limitations mean I can't just sizeof their values :) + // These are a bit hacky, but what can ye do eh? + // gEffectsMemoryPool is 0x4000, gObjectsMemoryPool is 0x800. Epic C limitations mean I can't just sizeof their values :) ramsizeSegment[5] = 0x4000 + 0x800 + 0x4000 + 0x800; ramsizeSegment[6] = (SURFACE_NODE_POOL_SIZE * sizeof(struct SurfaceNode)) + (SURFACE_POOL_SIZE * sizeof(struct Surface)); ramsizeSegment[7] = gAudioHeapSize + gAudioInitPoolSize; @@ -145,17 +144,17 @@ void puppyprint_profiler_finished(void) { benchMark[NUM_BENCH_ITERATIONS+1] = 0; benchmarkTimer = 300; benchViewer = 0; - for (i = 0; i < NUM_BENCH_ITERATIONS-2; i++) - { + for (i = 0; i < NUM_BENCH_ITERATIONS - 2; i++) { benchMark[NUM_BENCH_ITERATIONS] += benchMark[i]; - if (benchMark[i] > benchMark[NUM_BENCH_ITERATIONS+1]) - benchMark[NUM_BENCH_ITERATIONS+1] = benchMark[i]; + if (benchMark[i] > benchMark[NUM_BENCH_ITERATIONS + 1]) { + benchMark[NUM_BENCH_ITERATIONS + 1] = benchMark[i]; + } } benchMark[NUM_BENCH_ITERATIONS] /= NUM_BENCH_ITERATIONS; benchmarkProgramTimer = OS_CYCLES_TO_USEC(osGetTime() - benchmarkProgramTimer); } -//RGB colour lookup table for colouring all the funny ram prints. +// RGB colour lookup table for colouring all the funny ram prints. u8 colourChart[33][3] = { { 255, 0, 0 }, { 0, 0, 255 }, @@ -189,38 +188,38 @@ u8 colourChart[33][3] = { { 176, 196, 222 }, { 255, 255, 255 }}; -//Change this to alter the width of the bar at the bottom. +// Change this to alter the width of the bar at the bottom. #define BAR_LENGTH 200 -void print_ram_bar(void) -{ +void print_ram_bar(void) { s32 i = 0; f32 perfPercentage; s32 graphPos = 0; - s32 prevGraph = 160-(BAR_LENGTH/2); + s32 prevGraph = 160 - (BAR_LENGTH / 2); s32 ramsize = osGetMemSize(); prepare_blank_box(); - for (i = 0; i < 32; i++) - { - if (ramsizeSegment[i] == 0) + for (i = 0; i < 32; i++) { + if (ramsizeSegment[i] == 0) { continue; + } perfPercentage = (f32)ramsizeSegment[i]/ramsize; - graphPos = prevGraph + CLAMP((BAR_LENGTH*perfPercentage), 1, 160+(BAR_LENGTH/2)); + graphPos = prevGraph + CLAMP((BAR_LENGTH * perfPercentage), 1, 160 + (BAR_LENGTH / 2)); render_blank_box(prevGraph, 210, graphPos, 218, colourChart[i][0], colourChart[i][1], colourChart[i][2], 255); prevGraph = graphPos; } perfPercentage = (f32)ramsizeSegment[32]/ramsize; - graphPos = prevGraph + CLAMP((BAR_LENGTH*perfPercentage), 1, 160+(BAR_LENGTH/2)); + graphPos = prevGraph + CLAMP((BAR_LENGTH * perfPercentage), 1, 160 + (BAR_LENGTH / 2)); render_blank_box(prevGraph, 210, graphPos, 218, 255, 255, 255, 255); prevGraph = graphPos; - render_blank_box(prevGraph, 210, 160+(BAR_LENGTH/2), 218, 0, 0, 0, 255); + render_blank_box(prevGraph, 210, 160+(BAR_LENGTH / 2), 218, 0, 0, 0, 255); finish_blank_box(); } -//Another epic lookup table, for text this time. + +// Another epic lookup table, for text this time. const char ramNames[9][32] = { "Buffers", "Main", @@ -233,10 +232,9 @@ const char ramNames[9][32] = { "Audio Pools", }; -s8 nameTable = sizeof(ramNames)/32; +s8 nameTable = sizeof(ramNames) / 32; -void print_ram_overview(void) -{ +void print_ram_overview(void) { s32 i = 0; char textBytes[32]; s32 x = 80; @@ -246,22 +244,18 @@ void print_ram_overview(void) render_blank_box(0, 0, 320, 240, 0, 0, 0, 192); finish_blank_box(); - for (i = 0; i < 33; i++) - { - if (drawn == 16) - { + for (i = 0; i < 33; i++) { + if (drawn == 16) { x = 240; y = 16; } - if (ramsizeSegment[i] == 0) + if (ramsizeSegment[i] == 0) { continue; - if (i < 9) - { - sprintf(textBytes, "%s: %X", ramNames[i], ramsizeSegment[i]); } - else - { - sprintf(textBytes, "Segment %02X: %X",i-nameTable+2, ramsizeSegment[i]); + if (i < 9) { + sprintf(textBytes, "%s: %X", ramNames[i], ramsizeSegment[i]); + } else { + sprintf(textBytes, "Segment %02X: %X", i - nameTable + 2, ramsizeSegment[i]); } print_set_envcolour(colourChart[i][0], colourChart[i][1], colourChart[i][2], 255); print_small_text(x, y, textBytes, PRINT_TEXT_ALIGN_CENTRE, PRINT_ALL); @@ -270,28 +264,25 @@ void print_ram_overview(void) } } -void benchmark_custom(void) -{ - if (benchmarkLoop == 0 || benchOption != 2) +void benchmark_custom(void) { + if (benchmarkLoop == 0 || benchOption != 2) { return; + } OSTime lastTime; - while (TRUE) - { + while (TRUE) { lastTime = osGetTime(); - //Insert your function here! + // Insert your function here! - if (benchmarkLoop > 0 && benchOption == 2) - { + if (benchmarkLoop > 0 && benchOption == 2) { benchmarkLoop--; benchMark[benchmarkLoop] = osGetTime() - lastTime; - if (benchmarkLoop == 0) - { + if (benchmarkLoop == 0) { puppyprint_profiler_finished(); break; } - } - else + } else { break; + } } } @@ -301,8 +292,7 @@ const char benchNames[][32] = { "Custom", }; -void print_which_benchmark(void) -{ +void print_which_benchmark(void) { char textBytes[40]; prepare_blank_box(); @@ -318,121 +308,111 @@ static char *write_to_buf(char *buffer, const char *data, size_t size) { return (char *) memcpy(buffer, data, size) + size; } -void append_puppyprint_log(const char *str, ...) -{ +void append_puppyprint_log(const char *str, ...) { s32 i; char textBytes[255]; memset(textBytes, 0, sizeof(textBytes)); va_list arguments; va_start(arguments, str); - if ((_Printf(write_to_buf, textBytes, str, arguments)) <= 0) - { + if ((_Printf(write_to_buf, textBytes, str, arguments)) <= 0) { va_end(arguments); return; } #ifdef UNF osSyncPrintf(textBytes); #endif - for (i = 0; i < LOG_BUFFER_SIZE-1; i++) - { - memcpy(consoleLogTable[i], consoleLogTable[i+1], 255); + for (i = 0; i < LOG_BUFFER_SIZE-1; i++) { + memcpy(consoleLogTable[i], consoleLogTable[i + 1], 255); } - memcpy(consoleLogTable[LOG_BUFFER_SIZE-1], textBytes, 255); + memcpy(consoleLogTable[LOG_BUFFER_SIZE - 1], textBytes, 255); va_end(arguments); } -#define LINE_HEIGHT 8 + ((LOG_BUFFER_SIZE-1)*12) -void print_console_log(void) -{ +#define LINE_HEIGHT 8 + ((LOG_BUFFER_SIZE - 1) * 12) +void print_console_log(void) { s32 i; prepare_blank_box(); render_blank_box(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0, 0, 96); finish_blank_box(); - for (i = 0; i < LOG_BUFFER_SIZE; i++) - { - if (consoleLogTable[i] == NULL) + for (i = 0; i < LOG_BUFFER_SIZE; i++) { + if (consoleLogTable[i] == NULL) { continue; - print_small_text(16, (LINE_HEIGHT)-(i*12), consoleLogTable[i], PRINT_TEXT_ALIGN_LEFT, PRINT_ALL); + } + print_small_text(16, (LINE_HEIGHT) - (i * 12), consoleLogTable[i], PRINT_TEXT_ALIGN_LEFT, PRINT_ALL); } } #undef LINE_HEIGHT extern void print_fps(s32 x, s32 y); -void puppyprint_render_profiler(void) -{ +void puppyprint_render_profiler(void) { s32 perfPercentage[5]; s32 graphPos; s32 prevGraph; #ifdef PUPPYPRINT_DEBUG_CYCLES - OSTime cpuCount = (cpuTime+audioTime[NUM_PERF_ITERATIONS]+dmaAudioTime[NUM_PERF_ITERATIONS]+faultTime[NUM_PERF_ITERATIONS] - +taskTime[NUM_PERF_ITERATIONS]-profilerTime[NUM_PERF_ITERATIONS]-profilerTime2[NUM_PERF_ITERATIONS]); + OSTime cpuCount = (cpuTime + audioTime[NUM_PERF_ITERATIONS] + dmaAudioTime[NUM_PERF_ITERATIONS] + faultTime[NUM_PERF_ITERATIONS] + + taskTime[NUM_PERF_ITERATIONS] - profilerTime[NUM_PERF_ITERATIONS] - profilerTime2[NUM_PERF_ITERATIONS]); #else - OSTime cpuCount = OS_CYCLES_TO_USEC(cpuTime+audioTime[NUM_PERF_ITERATIONS]+dmaAudioTime[NUM_PERF_ITERATIONS]+faultTime[NUM_PERF_ITERATIONS] - +taskTime[NUM_PERF_ITERATIONS]-profilerTime[NUM_PERF_ITERATIONS]-profilerTime2[NUM_PERF_ITERATIONS]); + OSTime cpuCount = OS_CYCLES_TO_USEC(cpuTime+audioTime[NUM_PERF_ITERATIONS] + dmaAudioTime[NUM_PERF_ITERATIONS] + faultTime[NUM_PERF_ITERATIONS] + + taskTime[NUM_PERF_ITERATIONS] - profilerTime[NUM_PERF_ITERATIONS] - profilerTime2[NUM_PERF_ITERATIONS]); #endif OSTime first = osGetTime(); char textBytes[80]; - if (!fDebug) - { + if (!fDebug) { profiler_update(profilerTime, first); return; } - sprintf(textBytes, "RAM: %06X /%06X (%d_)", main_pool_available(), mempool, (s32)(((f32)main_pool_available()/(f32)mempool)*100)); + sprintf(textBytes, "RAM: %06X /%06X (%d_)", main_pool_available(), mempool, (s32)(((f32)main_pool_available() / (f32)mempool) * 100)); print_small_text(160, 224, textBytes, PRINT_TEXT_ALIGN_CENTRE, PRINT_ALL); - if (!ramViewer && !benchViewer && !logViewer) - { + if (!ramViewer && !benchViewer && !logViewer) { print_fps(16,40); #ifdef PUPPYPRINT_DEBUG_CYCLES sprintf(textBytes, "CPU: %dc (%d_)#RSP: %dc (%d_)#RDP: %dc (%d_)", (s32)cpuCount, (s32)(cpuCount/333), (s32)(rspTime), (s32)(rspTime)/333, (s32)(rdpTime), (s32)(rdpTime)/333); #else - sprintf(textBytes, "CPU: %dus (%d_)#RSP: %dus (%d_)#RDP: %dus (%d_)", (s32)cpuCount, (s32)(cpuCount/333), (s32)OS_CYCLES_TO_USEC(rspTime), (s32)OS_CYCLES_TO_USEC(rspTime)/333, (s32)OS_CYCLES_TO_USEC(rdpTime), (s32)OS_CYCLES_TO_USEC(rdpTime)/333); + sprintf(textBytes, "CPU: %dus (%d_)#RSP: %dus (%d_)#RDP: %dus (%d_)", (s32)cpuCount, (s32)(cpuCount / 333), (s32)OS_CYCLES_TO_USEC(rspTime), (s32)OS_CYCLES_TO_USEC(rspTime) / 333, (s32)OS_CYCLES_TO_USEC(rdpTime), (s32)OS_CYCLES_TO_USEC(rdpTime) / 333); #endif print_small_text(16, 52, textBytes, PRINT_TEXT_ALIGN_LEFT, PRINT_ALL); sprintf(textBytes, "OBJ: %d/%d", gObjectCounter, OBJECT_POOL_CAPACITY); print_small_text(16, 124, textBytes, PRINT_TEXT_ALIGN_LEFT, PRINT_ALL); - //Very little point printing useless info if Mayro doesn't even exist. - if (gMarioState->marioObj) - { + // Very little point printing useless info if Mayro doesn't even exist. + if (gMarioState->marioObj) { sprintf(textBytes, "Mario Pos#X: %d#Y: %d#Z: %d#D: %X", (s32)(gMarioState->pos[0]), (s32)(gMarioState->pos[1]), (s32)(gMarioState->pos[2]), (u16)(gMarioState->faceAngle[1])); print_small_text(16, 140, textBytes, PRINT_TEXT_ALIGN_LEFT, PRINT_ALL); } - //Same for the camera, especially so because this will crash otherwise. - if (gCamera) - { + // Same for the camera, especially so because this will crash otherwise. + if (gCamera) { sprintf(textBytes, "Camera Pos#X: %d#Y: %d#Z: %d#D: %X", (s32)(gCamera->pos[0]), (s32)(gCamera->pos[1]), (s32)(gCamera->pos[2]), (u16)(gCamera->yaw)); print_small_text(304, 140, textBytes, PRINT_TEXT_ALIGN_RIGHT, PRINT_ALL); } - if (benchmarkTimer > 0) - { + if (benchmarkTimer > 0) { benchmarkTimer--; prepare_blank_box(); #ifdef PUPPYPRINT_DEBUG_CYCLES - //sprintf(textBytes, "Benchmark: %dus#High: %dc", (s32)(benchMark[NUM_BENCH_ITERATIONS]), (s32)(benchMark[NUM_BENCH_ITERATIONS+1])); - sprintf(textBytes, "Done in %0.000f seconds#Benchmark: %dc#High: %dc", (f32)(benchmarkProgramTimer)*0.000001f, (s32)(benchMark[NUM_BENCH_ITERATIONS]), (s32)(benchMark[NUM_BENCH_ITERATIONS+1])); + // sprintf(textBytes, "Benchmark: %dus#High: %dc", (s32)(benchMark[NUM_BENCH_ITERATIONS]), (s32)(benchMark[NUM_BENCH_ITERATIONS + 1])); + sprintf(textBytes, "Done in %0.000f seconds#Benchmark: %dc#High: %dc", (f32)(benchmarkProgramTimer) * 0.000001f, (s32)(benchMark[NUM_BENCH_ITERATIONS]), (s32)(benchMark[NUM_BENCH_ITERATIONS + 1])); #else - //sprintf(textBytes, "Benchmark: %dus#High: %dus", (s32)OS_CYCLES_TO_USEC(benchMark[NUM_BENCH_ITERATIONS]), (s32)OS_CYCLES_TO_USEC(benchMark[NUM_BENCH_ITERATIONS+1])); - sprintf(textBytes, "Done in %0.000f seconds#Benchmark: %dus#High: %dus", (f32)(benchmarkProgramTimer)*0.000001f, (s32)OS_CYCLES_TO_USEC(benchMark[NUM_BENCH_ITERATIONS]), (s32)OS_CYCLES_TO_USEC(benchMark[NUM_BENCH_ITERATIONS+1])); + // sprintf(textBytes, "Benchmark: %dus#High: %dus", (s32)OS_CYCLES_TO_USEC(benchMark[NUM_BENCH_ITERATIONS]), (s32)OS_CYCLES_TO_USEC(benchMark[NUM_BENCH_ITERATIONS+1])); + sprintf(textBytes, "Done in %0.000f seconds#Benchmark: %dus#High: %dus", (f32)(benchmarkProgramTimer) * 0.000001f, (s32)OS_CYCLES_TO_USEC(benchMark[NUM_BENCH_ITERATIONS]), (s32)OS_CYCLES_TO_USEC(benchMark[NUM_BENCH_ITERATIONS + 1])); #endif - render_blank_box(160-(get_text_width(textBytes)/2)-4, 158, 160+(get_text_width(textBytes)/2)+4, 196, 0, 0, 0, 255); + render_blank_box(160 - (get_text_width(textBytes) / 2) - 4, 158, 160 + (get_text_width(textBytes) / 2) + 4, 196, 0, 0, 0, 255); print_set_envcolour(255, 255, 255, 255); print_small_text(160, 160, textBytes, PRINT_TEXT_ALIGN_CENTRE, PRINT_ALL); finish_blank_box(); } #define ADDTIMES MAX((collisionTime[NUM_PERF_ITERATIONS] + graphTime[NUM_PERF_ITERATIONS] + behaviourTime[NUM_PERF_ITERATIONS] + audioTime[NUM_PERF_ITERATIONS] + dmaTime[NUM_PERF_ITERATIONS])/80, 1) - perfPercentage[0] = MAX((collisionTime[NUM_PERF_ITERATIONS]/ADDTIMES), 1); - perfPercentage[1] = MAX((graphTime[NUM_PERF_ITERATIONS]/ADDTIMES), 1); - perfPercentage[2] = MAX((behaviourTime[NUM_PERF_ITERATIONS]/ADDTIMES), 1); - perfPercentage[3] = MAX((audioTime[NUM_PERF_ITERATIONS]/ADDTIMES), 1); - perfPercentage[4] = MAX((dmaTime[NUM_PERF_ITERATIONS]/ADDTIMES), 1); + perfPercentage[0] = MAX((collisionTime[NUM_PERF_ITERATIONS] / ADDTIMES), 1); + perfPercentage[1] = MAX(( graphTime[NUM_PERF_ITERATIONS] / ADDTIMES), 1); + perfPercentage[2] = MAX((behaviourTime[NUM_PERF_ITERATIONS] / ADDTIMES), 1); + perfPercentage[3] = MAX(( audioTime[NUM_PERF_ITERATIONS] / ADDTIMES), 1); + perfPercentage[4] = MAX(( dmaTime[NUM_PERF_ITERATIONS] / ADDTIMES), 1); #undef ADDTIMES #ifdef PUPPYPRINT_DEBUG_CYCLES @@ -459,7 +439,7 @@ void puppyprint_render_profiler(void) print_small_text(304, 88, textBytes, PRINT_TEXT_ALIGN_RIGHT, PRINT_ALL); #endif - //Render CPU breakdown bar. + // Render CPU breakdown bar. prepare_blank_box(); graphPos = 224 + perfPercentage[0]; render_blank_box(224, 104, graphPos, 112, 255, 0, 0, 255); @@ -475,47 +455,38 @@ void puppyprint_render_profiler(void) prevGraph = graphPos; graphPos += perfPercentage[4]; render_blank_box(prevGraph, 104, 304, 112, 255, 0, 255, 255); - } - else - if (ramViewer) + } else if (ramViewer) { print_ram_overview(); - else - if (logViewer) + } else if (logViewer) { print_console_log(); - else - if (benchViewer) + } else if (benchViewer) { print_which_benchmark(); - + } print_ram_bar(); profiler_update(profilerTime, first); } -void profiler_update(OSTime *time, OSTime time2) -{ +void profiler_update(OSTime *time, OSTime time2) { time[perfIteration] = osGetTime() - time2; } -void get_average_perf_time(OSTime *time) -{ - //This takes all but the last index of the timer array, and creates an average value, which is written to the last index. +void get_average_perf_time(OSTime *time) { + // This takes all but the last index of the timer array, and creates an average value, which is written to the last index. s32 i = 0; s32 total = 0; - for (i = 0; i < NUM_PERF_ITERATIONS-1; i++) - { + for (i = 0; i < NUM_PERF_ITERATIONS - 1; i++) { total += time[i]; } - time[NUM_PERF_ITERATIONS] = total/NUM_PERF_ITERATIONS; + time[NUM_PERF_ITERATIONS] = total / NUM_PERF_ITERATIONS; } -void puppyprint_profiler_process(void) -{ +void puppyprint_profiler_process(void) { bufferTime[perfIteration] = (IO_READ(DPC_BUFBUSY_REG)); tmemTime[perfIteration] = (IO_READ(DPC_TMEM_REG)); busTime[perfIteration] = (IO_READ(DPC_PIPEBUSY_REG)); OSTime newTime = osGetTime(); - if (gGlobalTimer % 15 == 0) - { + if ((gGlobalTimer % 15) == 0) { get_average_perf_time(scriptTime); get_average_perf_time(behaviourTime); get_average_perf_time(collisionTime); @@ -545,74 +516,56 @@ void puppyprint_profiler_process(void) } gLastOSTime = newTime; - if (gGlobalTimer > 5) + if (gGlobalTimer > 5) { IO_WRITE(DPC_STATUS_REG, DPC_CLR_CLOCK_CTR | DPC_CLR_CMD_CTR | DPC_CLR_PIPE_CTR | DPC_CLR_TMEM_CTR); - - if (fDebug) - { - if (gPlayer1Controller->buttonPressed & D_JPAD) - { + } + if (fDebug) { + if (gPlayer1Controller->buttonPressed & D_JPAD) { benchViewer ^= 1; ramViewer = 0; logViewer = 0; - } - else - if (gPlayer1Controller->buttonPressed & U_JPAD) - { + } else if (gPlayer1Controller->buttonPressed & U_JPAD) { ramViewer ^= 1; benchViewer = 0; logViewer = 0; - } - else - if (gPlayer1Controller->buttonPressed & L_JPAD) - { + } else if (gPlayer1Controller->buttonPressed & L_JPAD) { logViewer ^= 1; ramViewer = 0; benchViewer = 0; } - #ifdef VISUAL_DEBUG - else - if (!benchViewer && !ramViewer && !logViewer) - { +#ifdef VISUAL_DEBUG + else if (!benchViewer && !ramViewer && !logViewer) { debug_box_input(); } - #endif - if (benchViewer) - { - if (gPlayer1Controller->buttonPressed & R_JPAD) - benchOption++; - if (gPlayer1Controller->buttonPressed & L_JPAD) - benchOption--; - if (benchOption == 255) - benchOption = 2; - if (benchOption > 2) - benchOption = 0; - if (gPlayer1Controller->buttonPressed & L_TRIG) - { +#endif + if (benchViewer) { + if (gPlayer1Controller->buttonPressed & R_JPAD) benchOption++; + if (gPlayer1Controller->buttonPressed & L_JPAD) benchOption--; + if (benchOption == 255) benchOption = 2; + if (benchOption > 2) benchOption = 0; + if (gPlayer1Controller->buttonPressed & L_TRIG) { benchmarkLoop = NUM_BENCH_ITERATIONS; benchmarkProgramTimer = osGetTime(); } } benchmark_custom(); } - if (gPlayer1Controller->buttonDown & U_JPAD && gPlayer1Controller->buttonPressed & L_TRIG) - { + if (gPlayer1Controller->buttonDown & U_JPAD && gPlayer1Controller->buttonPressed & L_TRIG) { ramViewer = 0; benchViewer = 0; fDebug ^= 1; } - if (perfIteration++ == NUM_PERF_ITERATIONS-1) + if (perfIteration++ == NUM_PERF_ITERATIONS - 1) { perfIteration = 0; + } profiler_update(profilerTime2, newTime); } #endif -void print_set_envcolour(s32 r, s32 g, s32 b, s32 a) -{ - if (r != currEnv[0] || g != currEnv[1] || b != currEnv[2] || a != currEnv[3]) - { +void print_set_envcolour(s32 r, s32 g, s32 b, s32 a) { + if (r != currEnv[0] || g != currEnv[1] || b != currEnv[2] || a != currEnv[3]) { gDPSetEnvColor(gDisplayListHead++, (u8)r, (u8)g, (u8)b, (u8)a); currEnv[0] = r; currEnv[1] = g; @@ -623,38 +576,29 @@ void print_set_envcolour(s32 r, s32 g, s32 b, s32 a) #define BLANK 0, 0, 0, ENVIRONMENT, 0, 0, 0, ENVIRONMENT -void prepare_blank_box(void) -{ +void prepare_blank_box(void) { gDPSetCombineMode(gDisplayListHead++, BLANK, BLANK); } -void finish_blank_box(void) -{ +void finish_blank_box(void) { print_set_envcolour(255, 255, 255, 255); gSPDisplayList(gDisplayListHead++,dl_hud_img_end); } -//This does some epic shenanigans to figure out the optimal way to draw this. -//If the width is a multiple of 4, then use fillmode (fastest) -//Otherwise, if there's transparency, it uses that rendermode, which is slower than using opaque rendermodes. -void render_blank_box(s16 x1, s16 y1, s16 x2, s16 y2, u8 r, u8 g, u8 b, u8 a) -{ +// This does some epic shenanigans to figure out the optimal way to draw this. +// If the width is a multiple of 4, then use fillmode (fastest) +// Otherwise, if there's transparency, it uses that rendermode, which is slower than using opaque rendermodes. +void render_blank_box(s16 x1, s16 y1, s16 x2, s16 y2, u8 r, u8 g, u8 b, u8 a) { s32 cycleadd = 0; - if (ABS(x1 - x2) % 4 == 0 && a == 255) - { + if (ABS(x1 - x2) % 4 == 0 && a == 255) { gDPSetCycleType(gDisplayListHead++, G_CYC_FILL); gDPSetRenderMode(gDisplayListHead++, G_RM_NOOP, G_RM_NOOP); cycleadd = 1; - } - else - { + } else { gDPSetCycleType(gDisplayListHead++, G_CYC_1CYCLE); - if (a == 255) - { + if (a == 255) { gDPSetRenderMode(gDisplayListHead++, G_RM_OPA_SURF, G_RM_OPA_SURF2); - } - else - { + } else { gDPSetRenderMode(gDisplayListHead++, G_RM_XLU_SURF, G_RM_XLU_SURF2); } cycleadd = 0; @@ -667,220 +611,174 @@ void render_blank_box(s16 x1, s16 y1, s16 x2, s16 y2, u8 r, u8 g, u8 b, u8 a) u8 textLen[] = { - /*0*/ 6, /*1*/ 5, /*2*/ 7, /*3*/ 7, /*4*/ 7, /*5*/ 7, /*6*/ 8, /*7*/ 7, /*8*/ 7, /*9*/ 6, /*-*/ 8, /*+*/ 8, /*(*/ 5, /*)*/ 5, /*!*/ 4, /*?*/ 6, - /*A*/ 7, /*B*/ 7, /*C*/ 7, /*D*/ 7, /*E*/ 6, /*F*/ 5, /*G*/ 8, /*H*/ 6, /*I*/ 6, /*J*/ 5, /*K*/ 7, /*L*/ 6, /*M*/ 7, /*N*/ 7, /*O*/ 7, /*P*/ 6, - /*Q*/ 8, /*R*/ 6, /*S*/ 7, /*T*/ 7, /*U*/ 7, /*V*/ 7, /*W*/ 8, /*X*/ 7, /*Y*/ 7, /*Z*/ 7, /*"*/ 5, /*'*/ 2, /*:*/ 3, /*;*/ 3, /*.*/ 3, /*,*/ 3, - /*a*/ 7, /*b*/ 7, /*c*/ 6, /*d*/ 7, /*e*/ 7, /*f*/ 7, /*g*/ 7, /*h*/ 7, /*i*/ 3, /*j*/ 5, /*k*/ 8, /*l*/ 4, /*m*/ 7, /*n*/ 7, /*o*/ 7, /*p*/ 7, - /*q*/ 7, /*r*/ 6, /*s*/ 6, /*t*/ 6, /*u*/ 6, /*v*/ 7, /*w*/ 8, /*x*/ 6, /*y*/ 8, /*z*/ 7, /*~*/ 8, /*..*/ 7, /*^*/ 8, /*/*/ 8, /*%*/ 8, /*&*/ 8, + /*0*/ 7, /*1*/ 7, /*2*/ 7, /*3*/ 7, /*4*/ 7, /*5*/ 7, /*6*/ 7, /*7*/ 7, /*8*/ 7, /*9*/ 7, /*-*/ 7, /*+*/ 7, /*(*/ 4, /*)*/ 4, /*!*/ 5, /*?*/ 6, + /*A*/ 7, /*B*/ 7, /*C*/ 7, /*D*/ 7, /*E*/ 7, /*F*/ 7, /*G*/ 7, /*H*/ 7, /*I*/ 7, /*J*/ 7, /*K*/ 7, /*L*/ 7, /*M*/ 7, /*N*/ 7, /*O*/ 7, /*P*/ 7, + /*Q*/ 7, /*R*/ 7, /*S*/ 7, /*T*/ 7, /*U*/ 7, /*V*/ 7, /*W*/ 7, /*X*/ 7, /*Y*/ 7, /*Z*/ 7, /*"*/ 5, /*'*/ 2, /*:*/ 3, /*;*/ 3, /*.*/ 3, /*,*/ 3, + /*a*/ 6, /*b*/ 6, /*c*/ 6, /*d*/ 6, /*e*/ 6, /*f*/ 6, /*g*/ 6, /*h*/ 6, /*i*/ 2, /*j*/ 6, /*k*/ 6, /*l*/ 3, /*m*/ 6, /*n*/ 6, /*o*/ 6, /*p*/ 6, + /*q*/ 6, /*r*/ 6, /*s*/ 6, /*t*/ 6, /*u*/ 6, /*v*/ 6, /*w*/ 6, /*x*/ 6, /*y*/ 6, /*z*/ 6, /*~*/ 7, /*¨*/ 6, /*^*/ 7, /*/*/ 6, /*%*/ 6, /*&*/ 7, }; #include "level_update.h" -void get_char_from_byte(u8 letter, s32 *textX, s32 *textY, s32 *spaceX, s32 *offsetY) -{ +void get_char_from_byte(u8 letter, s32 *textX, s32 *textY, s32 *spaceX, s32 *offsetY) { *offsetY = 0; - //Line 1 - if (letter >= '0' && letter <= '9') - { + if (letter >= '0' && letter <= '9') { // Line 1 *textX = (letter - '0') * 4; *textY = 0; *spaceX = textLen[letter - '0']; - } - else - //Line 2 - if (letter >= 'A' && letter <= 'P') - { + } else if (letter >= 'A' && letter <= 'P') { // Line 2 *textX = ((letter - 'A') * 4); *textY = 6; - *spaceX = textLen[letter - 'A'+16]; - } - else - //Line 3 - if (letter >= 'Q' && letter <= 'Z') - { + *spaceX = textLen[letter - 'A' + 16]; + } else if (letter >= 'Q' && letter <= 'Z') { // Line 3 *textX = ((letter - 'Q') * 4); *textY = 12; - *spaceX = textLen[letter - 'Q'+32]; - } - else - //Line 4 - if (letter >= 'a' && letter <= 'p') - { + *spaceX = textLen[letter - 'Q' + 32]; + } else if (letter >= 'a' && letter <= 'p') { // Line 4 *textX = ((letter - 'a') * 4); *textY = 18; - *spaceX = textLen[letter - 'a'+48]; - } - else - //Line 5 - if (letter >= 'q' && letter <= 'z') - { + *spaceX = textLen[letter - 'a' + 48]; + } else if (letter >= 'q' && letter <= 'z') { // Line 5 *textX = ((letter - 'q') * 4); *textY = 24; - *spaceX = textLen[letter - 'q'+64]; - } - else - {//Space, the final frontier. + *spaceX = textLen[letter - 'q' + 64]; + } else { // Space, the final frontier. *textX = 128; - *textY = 0; + *textY = 12; *spaceX = 2; } - switch (letter) - { - case '-': *textX = 40; *textY = 0; *spaceX = textLen[10]; break; //Hyphen - case '+': *textX = 44; *textY = 0; *spaceX = textLen[11]; break; //Plus - case '(': *textX = 48; *textY = 0; *spaceX = textLen[12]; break; //Open Bracket - case ')': *textX = 52; *textY = 0; *spaceX = textLen[13]; break; //Close Bracket - case '!': *textX = 56; *textY = 0; *spaceX = textLen[14]; break; //Exclamation mark - case '?': *textX = 60; *textY = 0; *spaceX = textLen[15]; break; //Question mark + switch (letter) { + case '-': *textX = 40; *textY = 0; *spaceX = textLen[10]; break; // Hyphen + case '+': *textX = 44; *textY = 0; *spaceX = textLen[11]; break; // Plus + case '(': *textX = 48; *textY = 0; *spaceX = textLen[12]; break; // Open Bracket + case ')': *textX = 52; *textY = 0; *spaceX = textLen[13]; break; // Close Bracket + case '!': *textX = 56; *textY = 0; *spaceX = textLen[14]; break; // Exclamation mark + case '?': *textX = 60; *textY = 0; *spaceX = textLen[15]; break; // Question mark - case '"': *textX = 40; *textY = 12; *spaceX = textLen[42]; break; //Speech mark - case 0x27: *textX = 44; *textY = 12; *spaceX = textLen[43]; break; //Apostrophe. - case ':': *textX = 48; *textY = 12; *spaceX = textLen[44]; break; //Colon - case ';': *textX = 52; *textY = 12; *spaceX = textLen[45]; break; //Semicolon - case '.': *textX = 56; *textY = 12; *spaceX = textLen[46]; break; //Full stop - case ',': *textX = 60; *textY = 12; *spaceX = textLen[47]; break; //Comma + case '"': *textX = 40; *textY = 12; *spaceX = textLen[42]; break; // Speech mark + case'\'': *textX = 44; *textY = 12; *spaceX = textLen[43]; break; // Apostrophe. + case ':': *textX = 48; *textY = 12; *spaceX = textLen[44]; break; // Colon + case ';': *textX = 52; *textY = 12; *spaceX = textLen[45]; break; // Semicolon + case '.': *textX = 56; *textY = 12; *spaceX = textLen[46]; break; // Full stop + case ',': *textX = 60; *textY = 12; *spaceX = textLen[47]; break; // Comma - case '~': *textX = 40; *textY = 24; *spaceX = textLen[74]; break; //Tilde - case '@': *textX = 44; *textY = 24; *spaceX = textLen[75]; break; //Umlaut - case '^': *textX = 48; *textY = 24; *spaceX = textLen[76]; break; //Caret - case '/': *textX = 52; *textY = 24; *spaceX = textLen[77]; break; //Slash - case '_': *textX = 56; *textY = 24; *spaceX = textLen[78]; break; //Percent - case '&': *textX = 60; *textY = 24; *spaceX = textLen[79]; break; //Ampersand + case '~': *textX = 40; *textY = 24; *spaceX = textLen[74]; break; // Tilde + case '@': *textX = 44; *textY = 24; *spaceX = textLen[75]; break; // Umlaut + case '^': *textX = 48; *textY = 24; *spaceX = textLen[76]; break; // Caret + case '/': *textX = 52; *textY = 24; *spaceX = textLen[77]; break; // Slash + case '_': *textX = 56; *textY = 24; *spaceX = textLen[78]; break; // Percent + case '&': *textX = 60; *textY = 24; *spaceX = textLen[79]; break; // Ampersand - //This is for the letters that sit differently on the line. It just moves them down a bit. + // This is for the letters that sit differently on the line. It just moves them down a bit. case 'g': *offsetY = 1; break; case 'q': *offsetY = 1; break; - case 'p': *offsetY = 3; break; - case 'y': *offsetY = 1; break; + // case 'p': *offsetY = 1; break; + // case 'y': *offsetY = 1; break; } } s8 shakeToggle = 0; s8 waveToggle = 0; -s32 text_iterate_command(const char *str, s32 i, s32 runCMD) -{ +s32 text_iterate_command(const char *str, s32 i, s32 runCMD) { s32 len = 0; - while (str[i+len] != '>' && i+len < (signed)strlen(str)) - len++; + while (str[i+len] != '>' && i+len < (signed)strlen(str)) len++; len++; - if (runCMD) - { - if (strncmp(str+i, "", 5) == 0) //Simple text colour effect. goes up to 99 for each, so 99000000 is red. - { + if (runCMD) { + if (strncmp(str+i, "", 5) == 0) { // Simple text colour effect. goes up to 99 for each, so 99000000 is red. s32 r, g, b, a; - //Each value is taken from the strong. The first is multiplied by 10, because it's a larger significant value, then it adds the next digit onto it. - r = (str[i+5] - '0')*10; - r += str[i+6] - '0'; - g = (str[i+7] - '0')*10; - g += str[i+8] - '0'; - b = (str[i+9] - '0')*10; - b += str[i+10] - '0'; - a = (str[i+11] - '0')*10; - a += str[i+12] - '0'; - //Multiply each value afterwards by 2.575f to make 255. - print_set_envcolour(r*2.575f, g*2.575f, b*2.575f, a*2.575f); - } - else - if (strncmp(str+i, "", 6) == 0) //Same as above, except it fades between two colours. The third set of numbers is the speed it fades. - { + // Each value is taken from the strong. The first is multiplied by 10, because it's a larger significant value, then it adds the next digit onto it. + r = ((str[i + 5] - '0') * 10); + r += str[i + 6] - '0'; + g = ((str[i + 7] - '0') * 10); + g += str[i + 8] - '0'; + b = ((str[i + 9] - '0') * 10); + b += str[i + 10] - '0'; + a = ((str[i + 11] - '0') * 10); + a += str[i + 12] - '0'; + // Multiply each value afterwards by 2.575f to make 255. + print_set_envcolour(r * 2.575f, g * 2.575f, b * 2.575f, a * 2.575f); + } else if (strncmp(str+i, "", 6) == 0) { // Same as above, except it fades between two colours. The third set of numbers is the speed it fades. s32 r, g, b, a, r2, g2, b2, a2, spd, r3, g3, b3, a3, r4, g4, b4, a4; - r = (str[i+6] - '0')*10; - r += str[i+7] - '0'; - g = (str[i+8] - '0')*10; - g += str[i+9] - '0'; - b = (str[i+10] - '0')*10; - b += str[i+11] - '0'; - a = (str[i+12] - '0')*10; - a += str[i+13] - '0'; - r2 = (str[i+15] - '0')*10; - r2 += str[i+16] - '0'; - g2 = (str[i+17] - '0')*10; - g2 += str[i+18] - '0'; - b2 = (str[i+19] - '0')*10; - b2 += str[i+20] - '0'; - a2 = (str[i+21] - '0')*10; - a2 += str[i+22] - '0'; - spd = (str[i+24] - '0')*10; - spd += str[i+25] - '0'; + r = ((str[i + 6] - '0') * 10); + r += str[i + 7] - '0'; + g = ((str[i + 8] - '0') * 10); + g += str[i + 9] - '0'; + b = ((str[i + 10] - '0') * 10); + b += str[i + 11] - '0'; + a = ((str[i + 12] - '0') * 10); + a += str[i + 13] - '0'; + r2 = ((str[i + 15] - '0') * 10); + r2 += str[i + 16] - '0'; + g2 = ((str[i + 17] - '0') * 10); + g2 += str[i + 18] - '0'; + b2 = ((str[i + 19] - '0') * 10); + b2 += str[i + 20] - '0'; + a2 = ((str[i + 21] - '0') * 10); + a2 += str[i + 22] - '0'; + spd = ((str[i + 24] - '0') * 10); + spd += str[i + 25] - '0'; - //Find the median. - r3 = (r + r2)*1.2875f; - g3 = (g + g2)*1.2875f; - b3 = (b + b2)*1.2875f; - a3 = (a + a2)*1.2875f; - //Find the difference. - r4 = (r - r2)*1.2875f; - g4 = (g - g2)*1.2875f; - b4 = (b - b2)*1.2875f; - a4 = (a - a2)*1.2875f; - //Now start from the median, and wave from end to end with the difference, to create the fading effect. - print_set_envcolour(r3 + ((sins(gGlobalTimer*spd*50)) * r4), g3 + ((sins(gGlobalTimer*spd*50)) * g4), b3 + ((sins(gGlobalTimer*spd*50)) * b4), a3 + ((sins(gGlobalTimer*spd*50)) * a4)); + // Find the median. + r3 = (r + r2) * 1.2875f; + g3 = (g + g2) * 1.2875f; + b3 = (b + b2) * 1.2875f; + a3 = (a + a2) * 1.2875f; + // Find the difference. + r4 = (r - r2) * 1.2875f; + g4 = (g - g2) * 1.2875f; + b4 = (b - b2) * 1.2875f; + a4 = (a - a2) * 1.2875f; + // Now start from the median, and wave from end to end with the difference, to create the fading effect. + print_set_envcolour(r3 + ((sins(gGlobalTimer * spd * 50)) * r4), g3 + ((sins(gGlobalTimer * spd * 50)) * g4), b3 + ((sins(gGlobalTimer * spd * 50)) * b4), a3 + ((sins(gGlobalTimer * spd * 50)) * a4)); } else - if (strncmp(str+i, "", 8) == 0) //Toggles the happy colours :o) Do it again to disable it. - { - s32 r, g, b; - r = (coss(gGlobalTimer*600)+1)*127; - g = (coss((gGlobalTimer*600)+21845)+1)*127; - b = (coss((gGlobalTimer*600)-21845)+1)*127; + if (strncmp(str+i, "", 8) == 0) { // Toggles the happy colours :o) Do it again to disable it. + s32 r = (coss(gGlobalTimer * 600) + 1) * 127; + s32 g = (coss((gGlobalTimer * 600) + 21845) + 1) * 127; + s32 b = (coss((gGlobalTimer * 600) - 21845) + 1) * 127; print_set_envcolour(r, g, b, 255); + } else if (strncmp(str + i, "", 7) == 0) { // Toggles text that shakes on the spot. Do it again to disable it. + shakeToggle ^= 1; + } else if (strncmp(str + i, "", 6) == 0) { // Toggles text that waves around. Do it again to disable it. + waveToggle ^= 1; } - else - if (strncmp(str+i, "", 7) == 0) //Toggles text that shakes on the spot. Do it again to disable it. - { - shakeToggle^=1; - } - else - if (strncmp(str+i, "", 6) == 0) //Toggles text that waves around. Do it again to disable it. - { - waveToggle^=1; - } - } - return len; } -s32 get_text_width(const char *str) -{ +s32 get_text_width(const char *str) { s32 i= 0; s32 textPos = 0; s32 wideX = 0; s32 textX, textY, offsetY, spaceX; - for (i = 0; i < (signed)strlen(str); i++) - { - if (str[i] == '#') - { - i++; - textPos = 0; - } - if (str[i] == '<') - { - i+= text_iterate_command(str, i, FALSE); - } - get_char_from_byte(str[i], &textX, &textY, &spaceX, &offsetY); - textPos+=spaceX+1; - wideX = MAX(textPos, wideX); + for (i = 0; i < (signed)strlen(str); i++) { + if (str[i] == '#') { + i++; + textPos = 0; + } + if (str[i] == '<') { + i += text_iterate_command(str, i, FALSE); + } + get_char_from_byte(str[i], &textX, &textY, &spaceX, &offsetY); + textPos += spaceX + 1; + wideX = MAX(textPos, wideX); } return wideX; } -s32 get_text_height(const char *str) -{ +s32 get_text_height(const char *str) { s32 i= 0; s32 textPos = 0; - for (i = 0; i < (signed)strlen(str); i++) - { - if (str[i] == '#') - { - i++; - textPos+=12; - } + for (i = 0; i < (signed)strlen(str); i++) { + if (str[i] == '#') { + i++; + textPos += 12; + } } return textPos; } @@ -910,97 +808,73 @@ void print_small_text(s32 x, s32 y, const char *str, s32 align, s32 amount) gDPSetTexturePersp(gDisplayListHead++, G_TP_NONE); gDPSetCombineMode(gDisplayListHead++, G_CC_FADEA, G_CC_FADEA); gDPSetTextureFilter(gDisplayListHead++, G_TF_POINT); - if (align == PRINT_TEXT_ALIGN_CENTRE) - { - for (i = 0; i < (signed)strlen(str); i++) - { - if (str[i] == '#') - { - i++; - textPos[0] = 0; - lines++; + if (align == PRINT_TEXT_ALIGN_CENTRE) { + for (i = 0; i < (signed)strlen(str); i++) { + if (str[i] == '#') { + i++; + textPos[0] = 0; + lines++; + } + if (str[i] == '<') { + i += text_iterate_command(str, i, FALSE); + } + get_char_from_byte(str[i], &textX, &textY, &spaceX, &offsetY); + textPos[0] += spaceX + 1; + wideX[lines] = MAX(textPos[0], wideX[lines]); } - if (str[i] == '<') - { - i+= text_iterate_command(str, i, FALSE); - } - get_char_from_byte(str[i], &textX, &textY, &spaceX, &offsetY); - textPos[0]+=spaceX+1; - wideX[lines] = MAX(textPos[0], wideX[lines]); - } - textPos[0] = -(wideX[0]/2); - } - else - if (align == PRINT_TEXT_ALIGN_RIGHT) - { - for (i = 0; i < (signed)strlen(str); i++) - { - if (str[i] == '#') - { - i++; - textPos[0] = 0; - lines++; - } - else - { - textPos[0]+=spaceX+1; - } - if (str[i] == '<') - { - i+= text_iterate_command(str, i, FALSE); - } - get_char_from_byte(str[i], &textX, &textY, &spaceX, &offsetY); + textPos[0] = -(wideX[0] / 2); + } else if (align == PRINT_TEXT_ALIGN_RIGHT) { + for (i = 0; i < (signed)strlen(str); i++) { + if (str[i] == '#') { + i++; + textPos[0] = 0; + lines++; + } else { + textPos[0]+=spaceX+1; + } + if (str[i] == '<') { + i += text_iterate_command(str, i, FALSE); + } + get_char_from_byte(str[i], &textX, &textY, &spaceX, &offsetY); - wideX[lines] = MAX(textPos[0], wideX[lines]); + wideX[lines] = MAX(textPos[0], wideX[lines]); } textPos[0] = -wideX[0]; } lines = 0; gDPLoadTextureBlock_4b(gDisplayListHead++, segmented_to_virtual(small_font), G_IM_FMT_I, 128, 60, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, 0, 0, 0, 0, 0); - for (i = 0; i < tx; i++) - { - if (str[i] == '#') - { + for (i = 0; i < tx; i++) { + if (str[i] == '#') { i++; lines++; - if (align == PRINT_TEXT_ALIGN_RIGHT) + if (align == PRINT_TEXT_ALIGN_RIGHT) { textPos[0] = -(wideX[lines]); - else + } else { textPos[0] = -(wideX[lines]/2); + } textPos[1] += 12; } - if (str[i] == '<') - { - i+= text_iterate_command(str, i, TRUE); + if (str[i] == '<') { + i += text_iterate_command(str, i, TRUE); } - if (shakeToggle) - { - shakePos[0] = -1+(random_u16() % 2); - shakePos[1] = -1+(random_u16() % 2); - } - else - { + if (shakeToggle) { + shakePos[0] = -1 + (random_u16() % 2); + shakePos[1] = -1 + (random_u16() % 2); + } else { shakePos[0] = 0; shakePos[1] = 0; } - if (waveToggle) - { - wavePos = (sins((gGlobalTimer*3000)+(i*10000)))*2; - } - else - { + if (waveToggle) { + wavePos = (sins((gGlobalTimer * 3000) + (i * 10000))) * 2; + } else { wavePos = 0; } get_char_from_byte(str[i], &textX, &textY, &spaceX, &offsetY); - if (xlu != prevxlu) - { + if (xlu != prevxlu) { prevxlu = xlu; - if (xlu > 250) - { + if (xlu > 250) { gDPSetRenderMode(gDisplayListHead++, G_RM_TEX_EDGE, G_RM_TEX_EDGE2); - } - else - { + } else { gDPSetRenderMode(gDisplayListHead++, G_RM_XLU_SURF, G_RM_XLU_SURF); } } @@ -1010,23 +884,19 @@ void print_small_text(s32 x, s32 y, const char *str, s32 align, s32 amount) gSPDisplayList(gDisplayListHead++, dl_rgba16_text_end); } -void render_multi_image(Texture *image, s32 x, s32 y, s32 width, s32 height, UNUSED s32 scaleX, UNUSED s32 scaleY, s32 mode) -{ +void render_multi_image(Texture *image, s32 x, s32 y, s32 width, s32 height, UNUSED s32 scaleX, UNUSED s32 scaleY, s32 mode) { s32 posW, posH, imW, imH, peakH, maskW, maskH, cycles, num, i, modeSC, mOne; i = 0; num = 256; maskW = 1; maskH = 1; - if (mode == G_CYC_COPY) - { + if (mode == G_CYC_COPY) { gDPSetCycleType(gDisplayListHead++, mode); gDPSetRenderMode(gDisplayListHead++, G_RM_NOOP, G_RM_NOOP2); modeSC = 4; mOne = 1; - } - else - { + } else { gDPSetCycleType(gDisplayListHead++, mode); gDPSetRenderMode(gDisplayListHead++, G_RM_XLU_SURF, G_RM_XLU_SURF2); modeSC = 1; @@ -1034,9 +904,8 @@ void render_multi_image(Texture *image, s32 x, s32 y, s32 width, s32 height, UNU } - //Find how best to seperate the horizontal. Keep going until it finds a whole value. - while (1) - { + // Find how best to seperate the horizontal. Keep going until it finds a whole value. + while (TRUE) { f32 val = (f32)width/(f32)num; if ((s32)val == val && (s32) val >= 1) @@ -1051,28 +920,25 @@ void render_multi_image(Texture *image, s32 x, s32 y, s32 width, s32 height, UNU return; } } - //Find the tile height - imH = 64/(imW/32); //This gets the vertical amount. + // Find the tile height + imH = 64 / (imW / 32); // This gets the vertical amount. num = 2; - //Find the width mask - while (1) - { + // Find the width mask + while (TRUE) { if ((s32) num == imW) break; - num*=2; + num *= 2; maskW++; - if (maskW == 9) - { + if (maskW == 9) { print_text(32,32,"WIDTH MASK FAILURE"); return; } } num = 2; //Find the height mask - while (1) - { + while (TRUE) { if ((s32) num == imH) break; diff --git a/textures/segment2/custom_text.i4.png b/textures/segment2/custom_text.i4.png index 0227ef1b415075ff334f6ca6624efde5b96313fa..bb9be8eef3f6b7d694cf6f9b55598737ecf6bd0c 100644 GIT binary patch literal 16346 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 ev za&s`z<+-XBf2!){Nom&EsTY20%5`PP9shWl z-NAonhR5_$1Lm1)CgvueKfj>%+lQ+Bm8*Ab-tM$v?dc_|Qn`QY3z!7;_s)OukY~a5 z6{$ukCdJ;<1z%6!s>2^$ylKrhK{or#7r(sPvqp0r$D=rhYlq#hE3EC4*Ile$Zo<2z z?6;0Ocjo<5?iEYFEv}vTjq6v$(fiyBET2qV;=X$E)aOiV&b!aw`}@~K!*fCmB`+my zZwnmi+irgB)Ow3&H$NA4Cmny^Gc~^Sf5NkxKg>6ueJnO9zun2ez`)??>gTe~DWM4f Dz~{af delta 1856 zcmcare~xd0ay`4Kr;B4q#hka%oOw?ScuxP1zdHYm=I$3sp#>5_lOD%hKGtwS&93C) zq&HhmZ_=rk+r?g6SNCsme?R}ve+v6f+qd1Aa5Mb=b>sc+kA7N&ecjlUw^oneOsv09 z_entUD%1X=f79x=^ln2A5be_DEY*KwJr1@D}ltz4H*_^^+;UgnPLse&D0XObm% zpI1JzXVv$+hN27s_owPRFPyQW?7@mld3$c(&0D_n`^-s^B{v@xsOB#_EXJ^bf7RKE zj0}B{~-!?a-cy^gr6&;GvNd7;q)=J}J_Z=ZPg-lZXuA><#Y!@fP~?Kx{1ty+7cR^L)oW(Y{E5)rv8Vj}g= znqh_~qu|_CKehjdEN|drn3A;d+6u?{nY+G;{t4jA(Oy{K-2eenC1QO$hdP z(WN_vVdBy56;6G;#jb)Urhd7{@Is{WYB8%u&3lIMlLng(ihaG<#=A(V<@VJZcdARD z6eh=X6o1;(;}sScZ@NA2`82-Du-Elnv+Y?JzH1Al9Y4_ax2XQG-IvENix}mq7(VQ4 zQ4C)?+k?@)#;uN_fO*xcsqbDs3S#KFry72rvB2jWyYf}vsm5~RE7qMjS#iXsyyt20 z_AGlghMWa&Bo03JE9K*TUdr>3p&`+9^&Vs92j=!JD0L{cw%C2`-^6qL3>L>%tPhY?)=)mr;83fY z{Jfx}pQ-1fbJFrp(=yg@ge0$CeX6g}dO^YN>A|5U)6HaFOx0O&Ua?8KW3I%cx&NZlZm0P_qd5QZQdF>b-pX_^EWGXy{DXg{|+GMb9Hvs20ve4O7aaJI$KX)i zt@PKHVS?qni@mSkYyRKOw7??m`@fHhob`%EKD+k+3JlHs7H%FY`Yw-4lA*8tktH+3 z@%=>tr#szm`P6NhxM}Sp|My}$CHT(qtXbE-xw`S<^DOn1O74~t#~*w?q3X}tFq7k; zc*I6ORr}wonH?^fhi`Hc;5K-rU|P?@FtuswpT7GV3{&RCGJM$1&E}xC|CM{>BGqr- z>Mz`^XFZU?7s6DydQO=-!-k3H*%&^jGHmFLKURG2gYE8PwwE6STGcdHh z&3kf7m?4zq#EO+*kO0-T9CpEmlKi<7WG^F z9kpy+oLMV+Zb|0(JX>(?PoLt{z`Hhe(-|8|!~gCOW3HDmpEyfCS(d@-6TAP>-HF?8 zEhu09M&xsV=X7p^w|}&%Y`!!z7O)>Wws7aF#-@ Date: Mon, 27 Sep 2021 22:33:00 -0700 Subject: [PATCH 16/97] Improve puppyprint font a bit more --- src/game/platform_displacement.c | 40 ++-- src/game/platform_displacement.h | 4 +- src/game/print.c | 5 +- src/game/puppycam2.c | 35 ++-- src/game/puppylights.c | 300 ++++++++++++--------------- src/game/puppyprint.c | 89 ++++---- src/game/puppyprint.h | 40 ++-- textures/segment2/custom_text.i4.png | Bin 16346 -> 16247 bytes 8 files changed, 236 insertions(+), 277 deletions(-) diff --git a/src/game/platform_displacement.c b/src/game/platform_displacement.c index 39599038..bbb4b5fa 100644 --- a/src/game/platform_displacement.c +++ b/src/game/platform_displacement.c @@ -21,9 +21,7 @@ struct Object *gMarioPlatform = NULL; */ void update_mario_platform(void) { struct Surface *floor; - f32 marioX; - f32 marioY; - f32 marioZ; + f32 marioX, marioY, marioZ; f32 floorHeight; u32 awayFromFloor; @@ -41,27 +39,19 @@ void update_mario_platform(void) { marioZ = gMarioObject->oPosZ; floorHeight = find_floor(marioX, marioY, marioZ, &floor); - if (absf(marioY - floorHeight) < 4.0f) { - awayFromFloor = 0; - } else { - awayFromFloor = 1; - } + awayFromFloor = (absf(marioY - floorHeight) >= 4.0f); - switch (awayFromFloor) { - case 1: + if (awayFromFloor) { + gMarioPlatform = NULL; + gMarioObject->platform = NULL; + } else { + if (floor != NULL && floor->object != NULL) { + gMarioPlatform = floor->object; + gMarioObject->platform = floor->object; + } else { gMarioPlatform = NULL; gMarioObject->platform = NULL; - break; - - case 0: - if (floor != NULL && floor->object != NULL) { - gMarioPlatform = floor->object; - gMarioObject->platform = floor->object; - } else { - gMarioPlatform = NULL; - gMarioObject->platform = NULL; - } - break; + } } } @@ -231,12 +221,8 @@ void apply_mario_platform_displacement(void) { * platform. If isMario is false, use gCurrentObject. */ void apply_platform_displacement(u32 isMario, struct Object *platform) { - f32 x; - f32 y; - f32 z; - f32 platformPosX; - f32 platformPosY; - f32 platformPosZ; + f32 x, y, z; + f32 platformPosX, platformPosY, platformPosZ; Vec3f currentObjectOffset; Vec3f relativeOffset; Vec3f newObjectOffset; diff --git a/src/game/platform_displacement.h b/src/game/platform_displacement.h index 5eef98d9..6029be9a 100644 --- a/src/game/platform_displacement.h +++ b/src/game/platform_displacement.h @@ -20,9 +20,9 @@ void update_mario_platform(void); void get_mario_pos(f32 *x, f32 *y, f32 *z); void set_mario_pos(f32 x, f32 y, f32 z); #ifdef PLATFORM_DISPLACEMENT_2 - void apply_platform_displacement(struct PlatformDisplacementInfo *displaceInfo, Vec3f pos, s16 *yaw, struct Object *platform); +void apply_platform_displacement(struct PlatformDisplacementInfo *displaceInfo, Vec3f pos, s16 *yaw, struct Object *platform); #else - void apply_platform_displacement(u32 isMario, struct Object *platform); +void apply_platform_displacement(u32 isMario, struct Object *platform); #endif void apply_mario_platform_displacement(void); void clear_mario_platform(void); diff --git a/src/game/print.c b/src/game/print.c index de346548..6af48f13 100644 --- a/src/game/print.c +++ b/src/game/print.c @@ -52,7 +52,7 @@ void format_integer(s32 n, s32 base, char *dest, s32 *totalLength, u8 width, s8 s8 negative = FALSE; char pad; - if (zeroPad == TRUE) { + if (zeroPad) { pad = '0'; } else { pad = -1; @@ -207,8 +207,7 @@ void print_text_fmt_int(s32 x, s32 y, const char *str, s32 n) { srcIndex++; format_integer(n, base, sTextLabels[sTextLabelsCount]->buffer + len, &len, width, zeroPad); - } else // straight copy - { + } else { // straight copy sTextLabels[sTextLabelsCount]->buffer[len] = c; len++; srcIndex++; diff --git a/src/game/puppycam2.c b/src/game/puppycam2.c index 683ba402..ec6035bf 100644 --- a/src/game/puppycam2.c +++ b/src/game/puppycam2.c @@ -30,7 +30,7 @@ static inline float smooth(float x) { x = CLAMP(x, 0, 1); - return x * x * (3.f - 2.f * x); + return sqr(x) * (3.f - 2.f * x); } static inline float softClamp(float x, float a, float b) { @@ -43,12 +43,12 @@ static inline float softClamp(float x, float a, float b) { struct gPuppyStruct gPuppyCam; struct sPuppyVolume *sPuppyVolumeStack[MAX_PUPPYCAM_VOLUMES]; -s16 sFloorHeight = 0; -u8 gPCOptionOpen = 0; -s8 gPCOptionSelected = 0; +s16 sFloorHeight = 0; +u8 gPCOptionOpen = 0; +s8 gPCOptionSelected = 0; s32 gPCOptionTimer = 0; -u8 gPCOptionIndex = 0; -u8 gPCOptionScroll = 0; +u8 gPCOptionIndex = 0; +u8 gPCOptionScroll = 0; u16 gPuppyVolumeCount = 0; struct MemoryPool *gPuppyMemoryPool; s32 gPuppyError = 0; @@ -196,9 +196,9 @@ void puppycam_activate_cutscene(s32 (*scene)(), s32 lockinput) { gPuppyCam.sceneInput = lockinput; } -//If you've read camera.c this will look familiar. -//It takes the next 4 spline points and extrapolates a curvature based positioning of the camera vector that's passed through. -//It's a standard B spline +// If you've read camera.c this will look familiar. +// It takes the next 4 spline points and extrapolates a curvature based positioning of the camera vector that's passed through. +// It's a standard B spline static void puppycam_evaluate_spline(f32 progress, Vec3s cameraPos, Vec3f spline1, Vec3f spline2, Vec3f spline3, Vec3f spline4) { f32 tempP[4]; @@ -227,11 +227,11 @@ s32 puppycam_move_spline(struct sPuppySpline splinePos[], struct sPuppySpline sp gPuppyCam.splineIndex = index; } if (splinePos[gPuppyCam.splineIndex].index == -1 || splinePos[gPuppyCam.splineIndex + 1].index == -1 || splinePos[gPuppyCam.splineIndex + 2].index == -1) { - return 1; + return TRUE; } if (mode == PUPPYSPLINE_FOLLOW) { if (splineFocus[gPuppyCam.splineIndex].index == -1 || splineFocus[gPuppyCam.splineIndex + 1].index == -1 || splineFocus[gPuppyCam.splineIndex + 2].index == -1) { - return 1; + return TRUE; } } vec3f_set(prevPos, gPuppyCam.pos[0], gPuppyCam.pos[1], gPuppyCam.pos[2]); @@ -262,12 +262,12 @@ s32 puppycam_move_spline(struct sPuppySpline splinePos[], struct sPuppySpline sp if (splinePos[gPuppyCam.splineIndex + 3].index == -1) { gPuppyCam.splineIndex = 0; gPuppyCam.splineProgress = 0; - return 1; + return TRUE; } gPuppyCam.splineProgress -=1; } - return 0; + return FALSE; } static void puppycam_process_cutscene(void) { @@ -979,7 +979,6 @@ static s32 puppycam_check_volume_bounds(struct sPuppyVolume *volume, s32 index) void puppycam_wall_angle(void) { struct Surface *wall; struct WallCollisionData cData; - s16 wallYaw; if (!(gMarioState->action & ACT_WALL_KICK_AIR) || ((gMarioState->action & ACT_FLAG_AIR) && ABS(gMarioState->forwardVel) < 16.0f) || !(gMarioState->action & ACT_FLAG_AIR)) { return; @@ -995,7 +994,7 @@ void puppycam_wall_angle(void) { } else { return; } - wallYaw = atan2s(wall->normal.z, wall->normal.x) + 0x4000; + s16 wallYaw = atan2s(wall->normal.z, wall->normal.x) + 0x4000; wallYaw -= gPuppyCam.yawTarget; if (wallYaw % 0x4000) { @@ -1345,15 +1344,15 @@ void puppycam_loop(void) { puppycam_input_core(); puppycam_projection(); puppycam_script(); - if (gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_COLLISION) + if (gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_COLLISION) { puppycam_collision(); - else + } else { gPuppyCam.opacity = 255; + } } else if (gPuppyCam.cutscene) { gPuppyCam.opacity = 255; puppycam_process_cutscene(); } - puppycam_apply(); } diff --git a/src/game/puppylights.c b/src/game/puppylights.c index 64f86098..8cdacaf6 100644 --- a/src/game/puppylights.c +++ b/src/game/puppylights.c @@ -39,31 +39,31 @@ shaped and rotated correctly, for accurate representation of their properties. #ifdef PUPPYLIGHTS -Lights1 gLevelLight; //Existing ambient light in the area. Will be set by the level script, though can always be changed afterwards if desired. +Lights1 gLevelLight; // Existing ambient light in the area. Will be set by the level script, though can always be changed afterwards if desired. u8 levelAmbient = FALSE; -Lights1 *sLightBase; //The base value where lights are written to when worked with. -Lights1 sDefaultLights = gdSPDefLights1(0x7F, 0x7F, 0x7F, 0xFE, 0xFE, 0xFE, 0x28, 0x28, 0x28); //Default lights default lights -u16 gNumLights = 0; //How many lights are loaded. -u16 gDynLightStart = 0; //Where the dynamic lights will start. -struct PuppyLight *gPuppyLights[MAX_LIGHTS]; //This contains all the loaded data. -struct MemoryPool *gLightsPool; //The memory pool where the above is stored. +Lights1 *sLightBase; // The base value where lights are written to when worked with. +Lights1 sDefaultLights = gdSPDefLights1(0x7F, 0x7F, 0x7F, 0xFE, 0xFE, 0xFE, 0x28, 0x28, 0x28); // Default lights default lights +u16 gNumLights = 0; // How many lights are loaded. +u16 gDynLightStart = 0; // Where the dynamic lights will start. +struct PuppyLight *gPuppyLights[MAX_LIGHTS]; // This contains all the loaded data. +struct MemoryPool *gLightsPool; // The memory pool where the above is stored. -//Runs after an area load, allocates the dynamic light slots. -void puppylights_allocate(void) -{ +// Runs after an area load, allocates the dynamic light slots. +void puppylights_allocate(void) { s32 numAllocate = MIN(MAX_LIGHTS - gNumLights, MAX_LIGHTS_DYNAMIC); s32 i; gDynLightStart = gNumLights; - if (numAllocate <= 0) //If this happens you've allocated too many static lights and therefore cucked dynamic. + if (numAllocate <= 0) { // If this happens you've allocated too many static lights and therefore cucked dynamic. return; - //Now it has the number it wants, it will allocate this many extra lights, intended for dynamic lights. - for (i = 0; i < numAllocate; i++) - { + } + // Now it has the number it wants, it will allocate this many extra lights, intended for dynamic lights. + for (i = 0; i < numAllocate; i++) { gPuppyLights[gNumLights] = mem_pool_alloc(gLightsPool, sizeof(struct PuppyLight)); - if (gPuppyLights[gNumLights] == NULL) + if (gPuppyLights[gNumLights] == NULL) { return; + } gPuppyLights[gNumLights]->active = FALSE; gPuppyLights[gNumLights]->flags = 0; gNumLights++; @@ -72,9 +72,8 @@ void puppylights_allocate(void) extern Mat4 gMatStack[32]; -//Function that iterates through each light. -void puppylights_iterate(struct PuppyLight *light, Lights1 *src, struct Object *obj, s32 flags) -{ +// Function that iterates through each light. +void puppylights_iterate(struct PuppyLight *light, Lights1 *src, struct Object *obj, s32 flags) { Lights1 *tempLight; s32 lightPos[2]; Vec3i lightRelative; @@ -88,77 +87,74 @@ void puppylights_iterate(struct PuppyLight *light, Lights1 *src, struct Object * f64 scaleVal = 1.0f; Vec3f debugPos[2]; - //Relative positions of the object vs. the centre of the node. + // Relative positions of the object vs. the centre of the node. lightRelative[0] = light->pos[0][0] - obj->oPosX; lightRelative[1] = light->pos[0][1] - obj->oPosY; lightRelative[2] = light->pos[0][2] - obj->oPosZ; - //If the nodes X and Z values are equal, then a check is made if the angle is a derivative of 90. - //If so, then it will completely skip over the calculation that figures out position from rotation. - //If it's a cylinder, then it ignores that check, simply because an equal sided cylinder will have the - //same result no matter the yaw. If neither is true, then it simply checks if it's 180 degrees, since - //That will just be the same as 0. - if (light->pos[1][0] == light->pos[1][2]) - { - if (light->yaw % 0x4000 == 0 || light->flags & PUPPYLIGHT_SHAPE_CYLINDER) - { + // If the nodes X and Z values are equal, then a check is made if the angle is a derivative of 90. + // If so, then it will completely skip over the calculation that figures out position from rotation. + // If it's a cylinder, then it ignores that check, simply because an equal sided cylinder will have the + // same result no matter the yaw. If neither is true, then it simply checks if it's 180 degrees, since + // That will just be the same as 0. + if (light->pos[1][0] == light->pos[1][2]) { + if (light->yaw % 0x4000 == 0 || light->flags & PUPPYLIGHT_SHAPE_CYLINDER) { lightPos[0] = lightRelative[0]; lightPos[1] = lightRelative[2]; goto skippingTrig; } - } - else - if (light->yaw % 0x8000 == 0) - { + } else if (light->yaw % 0x8000 == 0) { lightPos[0] = lightRelative[0]; lightPos[1] = lightRelative[2]; goto skippingTrig; } - //Get the position based off the rotation of the box. + // Get the position based off the rotation of the box. lightPos[0] = lightRelative[2] * sins(-light->yaw) + lightRelative[0] * coss(-light->yaw); lightPos[1] = lightRelative[2] * coss(-light->yaw) - lightRelative[0] * sins(-light->yaw); skippingTrig: - #ifdef VISUAL_DEBUG +#ifdef VISUAL_DEBUG vec3f_set(debugPos[0], light->pos[0][0], light->pos[0][1], light->pos[0][2]); vec3f_set(debugPos[1], light->pos[1][0], light->pos[1][1], light->pos[1][2]); debug_box_color(0x08FF00FF); - if (light->flags & PUPPYLIGHT_SHAPE_CYLINDER) + if (light->flags & PUPPYLIGHT_SHAPE_CYLINDER) { debug_box_rot(debugPos[0], debugPos[1], light->yaw, DEBUG_SHAPE_CYLINDER | DEBUG_UCODE_DEFAULT); - else + } else { debug_box_rot(debugPos[0], debugPos[1], light->yaw, DEBUG_SHAPE_BOX | DEBUG_UCODE_DEFAULT); - #endif - //Check if the object is inside the box, after correcting it for rotation. + } +#endif + // Check if the object is inside the box, after correcting it for rotation. if (-light->pos[1][0] < lightPos[0] && lightPos[0] < light->pos[1][0] && -light->pos[1][1] < lightRelative[1] && lightRelative[1] < light->pos[1][1] && - -light->pos[1][2] < lightPos[1] && lightPos[1] < light->pos[1][2]) - { - //If so, then start making preparations to see how alongside they're in. - //This takes the largest side of the box and multiplies the other axis to match the numbers. - //This way, the colour value will scale correctly, no matter which side is entered. - //Because positions are a vector, and Y is up, it means tempID needs to be multiplied - //By 2 in order to reach the X and Z axis. Thanks SM64. - //It will skip scaling the opposite axis if there's no need to. + -light->pos[1][2] < lightPos[1] && lightPos[1] < light->pos[1][2]) { + // If so, then start making preparations to see how alongside they're in. + // This takes the largest side of the box and multiplies the other axis to match the numbers. + // This way, the colour value will scale correctly, no matter which side is entered. + // Because positions are a vector, and Y is up, it means tempID needs to be multiplied + // By 2 in order to reach the X and Z axis. Thanks SM64. + // It will skip scaling the opposite axis if there's no need to. - //Every axis needs to be the same as Z, so X and Y, if necessary, will be scaled to match it. - //This is done, so that when calculating scale, it's done spherically. - if (light->pos[1][0] != light->pos[1][2]) - lightPos[0] /= ((f32)light->pos[1][0]/light->pos[1][2]); - //Same for Y axis. - if (light->pos[1][1] != light->pos[1][2]) - lightRelative[1] /= ((f32)light->pos[1][1]/light->pos[1][2]); - - if (light->flags & PUPPYLIGHT_IGNORE_Y) - scaleOrig = (lightPos[0] * lightPos[0]) + (lightPos[1] * lightPos[1]); - else - scaleOrig = (lightPos[0] * lightPos[0]) + (lightRelative[1] * lightRelative[1]) + (lightPos[1] * lightPos[1]); + // Every axis needs to be the same as Z, so X and Y, if necessary, will be scaled to match it. + // This is done, so that when calculating scale, it's done spherically. + if (light->pos[1][0] != light->pos[1][2]) { + lightPos[0] /= ((f32)light->pos[1][0] / light->pos[1][2]); + } + // Same for Y axis. + if (light->pos[1][1] != light->pos[1][2]) { + lightRelative[1] /= ((f32)light->pos[1][1] / light->pos[1][2]); + } + if (light->flags & PUPPYLIGHT_IGNORE_Y) { + scaleOrig = sqr(lightPos[0]) + sqr(lightPos[1]); + } else { + scaleOrig = sqr(lightPos[0]) + sqr(lightRelative[1]) + sqr(lightPos[1]); + } scaleVal = (light->pos[1][2]*light->pos[1][2]); - //If it's a cylinder, then bin anything outside it. - if (light->flags & PUPPYLIGHT_SHAPE_CYLINDER) - { - if (scaleOrig > scaleVal) + // If it's a cylinder, then bin anything outside it. + if (light->flags & PUPPYLIGHT_SHAPE_CYLINDER) { + if (scaleOrig > scaleVal) { return; + } } } else @@ -167,79 +163,69 @@ void puppylights_iterate(struct PuppyLight *light, Lights1 *src, struct Object * f32 epc = (f32)(light->epicentre/100.0f); tempLight = segmented_to_virtual(src); //Now we have a scale value and a scale factor, we can start lighting things up. - //Convert to a percentage. + // Convert to a percentage. scale = CLAMP(scaleOrig/scaleVal, 0.0f, 1.0f); - //Reduce scale2 by the epicentre. - scale2 = CLAMP((scale - epc) * (1+epc), 0.0f, 1.0f); + // Reduce scale2 by the epicentre. + scale2 = CLAMP((scale - epc) * (1 + epc), 0.0f, 1.0f); - //Get the direction numbers we want by applying some maths to the relative positions. We use 64 because light directions range from -64 to 63. - //Note: can this be optimised further? Simply squaring lightRelative and then dividing it by preScale doesn't work. - if (light->flags & PUPPYLIGHT_DIRECTIONAL) - { + // Get the direction numbers we want by applying some maths to the relative positions. We use 64 because light directions range from -64 to 63. + // Note: can this be optimised further? Simply squaring lightRelative and then dividing it by preScale doesn't work. + if (light->flags & PUPPYLIGHT_DIRECTIONAL) { lightDir[0] = ((lightRelative[0]) * 64.0f) / light->pos[1][0]; lightDir[1] = ((lightRelative[1]) * 64.0f) / light->pos[1][1]; lightDir[2] = ((lightRelative[2]) * 64.0f) / light->pos[1][2]; } //Get direction if applicable. - for (i = 0; i < 3; i++) - { + for (i = 0; i < 3; i++) { //So it works by starting from the final colour, and then lerping to the original colour, by a factor of the epicentre corrected scale. Light opacity affects this further. - colour = approach_f32_asymptotic(light->rgba[i], tempLight->l[0].l.col[i], scale2*((f32)light->rgba[3]/255.0f)); - //If it's a directional light, then increase the current ambient by 50%, to give the effect better. - //Otherwise, just normalise the brightness to keep it in line with the current ambient. - //And now to apply the values. + colour = approach_f32_asymptotic(light->rgba[i], tempLight->l[0].l.col[i], scale2 * ((f32)light->rgba[3]/255.0f)); + // If it's a directional light, then increase the current ambient by 50%, to give the effect better. + // Otherwise, just normalise the brightness to keep it in line with the current ambient. + // And now to apply the values. tempLight->l[0].l.col[i] = colour; tempLight->l[0].l.colc[i] = colour; - //Ambient, too. - if (!(light->flags & PUPPYLIGHT_DIRECTIONAL)) - { - ambient = approach_f32_asymptotic(light->rgba[i]/2, tempLight->a.l.col[i], scale*((f32)light->rgba[3]/255.0f)); + // Ambient, too. + if (!(light->flags & PUPPYLIGHT_DIRECTIONAL)) { + ambient = approach_f32_asymptotic(light->rgba[i]/2, tempLight->a.l.col[i], scale*((f32)light->rgba[3] / 255.0f)); tempLight->a.l.col[i] = ambient; tempLight->a.l.colc[i] = ambient; } - //A slightly hacky way to offset the ambient lighting in order to prevent directional lighting from having a noticeable change in ambient brightness. - if (flags & LIGHTFLAG_DIRECTIONAL_OFFSET) - { - ambient = approach_f32_asymptotic(MIN(tempLight->a.l.col[i] * 2, 0xFF), tempLight->a.l.col[i], scale2*((f32)light->rgba[3]/255.0f)); + // A slightly hacky way to offset the ambient lighting in order to prevent directional lighting from having a noticeable change in ambient brightness. + if (flags & LIGHTFLAG_DIRECTIONAL_OFFSET) { + ambient = approach_f32_asymptotic(MIN(tempLight->a.l.col[i] * 2, 0xFF), tempLight->a.l.col[i], scale2*((f32)light->rgba[3] / 255.0f)); tempLight->a.l.col[i] = ambient; tempLight->a.l.colc[i] = ambient; } - //Apply direction. It takes the relative positions, and then multiplies them with the perspective matrix to get a correct direction. - //Index 1 of the first dimension of gMatStack is perspective. Note that if you ever decide to cheat your way into rendering things after the game does :^) - if (light->flags & PUPPYLIGHT_DIRECTIONAL) + // Apply direction. It takes the relative positions, and then multiplies them with the perspective matrix to get a correct direction. + // Index 1 of the first dimension of gMatStack is perspective. Note that if you ever decide to cheat your way into rendering things after the game does :^) + if (light->flags & PUPPYLIGHT_DIRECTIONAL) { tempLight->l->l.dir[i] = approach_f32_asymptotic((s8)(lightDir[0] * gMatStack[1][0][i] + lightDir[1] * gMatStack[1][1][i] + lightDir[2] * gMatStack[1][2][i]), tempLight->l->l.dir[i], scale); + } } } -//Main function. Run this in the object you wish to illuminate, and just give it its light, object pointer and any potential flags if you want to use them. -//If the object has multiple lights, then you run this for each light. -void puppylights_run(Lights1 *src, struct Object *obj, s32 flags, u32 baseColour) -{ +// Main function. Run this in the object you wish to illuminate, and just give it its light, object pointer and any potential flags if you want to use them. +// If the object has multiple lights, then you run this for each light. +void puppylights_run(Lights1 *src, struct Object *obj, s32 flags, u32 baseColour) { s32 i; s32 numlights = 0; s32 offsetPlaced = 0; s32 lightFlags = flags; - if (gCurrLevelNum < LEVEL_BBH) + if (gCurrLevelNum < LEVEL_BBH) { return; - //Checks if there's a hardset colour. Colours are only the first 3 bytes, so you can really put whatever you want in the last. - //If there isn't a colour, then it decides whether to apply the ambient lighting, or the default lighting as the baseline. - //Otherwise, it hardsets a colour to begin with. I don't recommend you use this, simply because it's intended to be used - //As a hacky quick-fix for models coloured by lights. Lightcoloured models don't blend nearly as nicely as ones coloured - //By other means. - if (baseColour < 0x100) - { - if (levelAmbient) - sLightBase = &gLevelLight; - else - sLightBase = &sDefaultLights; } - else - { + // Checks if there's a hardset colour. Colours are only the first 3 bytes, so you can really put whatever you want in the last. + // If there isn't a colour, then it decides whether to apply the ambient lighting, or the default lighting as the baseline. + // Otherwise, it hardsets a colour to begin with. I don't recommend you use this, simply because it's intended to be used + // As a hacky quick-fix for models coloured by lights. Lightcoloured models don't blend nearly as nicely as ones coloured + // By other means. + if (baseColour < 0x100) { + sLightBase = (levelAmbient ? &gLevelLight : &sDefaultLights); + } else { s32 colour; sLightBase = (levelAmbient) ? &gLevelLight : &sDefaultLights; - for (i = 0; i < 3; i++) - { + for (i = 0; i < 3; i++) { colour = (((baseColour >> (24-(i*8)))) & 0xFF); sLightBase->l[0].l.col[i] = colour; sLightBase->l[0].l.colc[i] = colour; @@ -250,10 +236,8 @@ void puppylights_run(Lights1 *src, struct Object *obj, s32 flags, u32 baseColour } memcpy(segmented_to_virtual(src), &sLightBase[0], sizeof(Lights1)); - for (i = 0; i < gNumLights; i++) - { - if (gPuppyLights[i]->rgba[3] > 0 && gPuppyLights[i]->active == TRUE && gPuppyLights[i]->area == gCurrAreaIndex && (gPuppyLights[i]->room == -1 || gPuppyLights[i]->room == gMarioCurrentRoom)) - { + for (i = 0; i < gNumLights; i++) { + if (gPuppyLights[i]->rgba[3] > 0 && gPuppyLights[i]->active == TRUE && gPuppyLights[i]->area == gCurrAreaIndex && (gPuppyLights[i]->room == -1 || gPuppyLights[i]->room == gMarioCurrentRoom)) { if (gPuppyLights[i]->flags & PUPPYLIGHT_DIRECTIONAL && !offsetPlaced) { lightFlags |= LIGHTFLAG_DIRECTIONAL_OFFSET; offsetPlaced = 1; @@ -266,35 +250,33 @@ void puppylights_run(Lights1 *src, struct Object *obj, s32 flags, u32 baseColour } } -//Sets and updates dynamic lights from objects. -//0xFFFF is essentially the null ID. If the display flag is met, it will find and set an ID, otherwise it frees up the spot. -void puppylights_object_emit(struct Object *obj) -{ +// Sets and updates dynamic lights from objects. +// 0xFFFF is essentially the null ID. If the display flag is met, it will find and set an ID, otherwise it frees up the spot. +void puppylights_object_emit(struct Object *obj) { s32 i; - if (gCurrLevelNum < LEVEL_BBH) + if (gCurrLevelNum < LEVEL_BBH) { return; - - if (obj->oFlags & OBJ_FLAG_EMIT_LIGHT) - { + } + if (obj->oFlags & OBJ_FLAG_EMIT_LIGHT) { f64 dist = ((obj->oPosX - gMarioState->pos[0]) * (obj->oPosX - gMarioState->pos[0])) + ((obj->oPosY - gMarioState->pos[1]) * (obj->oPosY - gMarioState->pos[1])) + ((obj->oPosZ - gMarioState->pos[2]) * (obj->oPosZ - gMarioState->pos[2])); f64 lightSize = ((obj->puppylight.pos[1][0]) * (obj->puppylight.pos[1][0])) + ((obj->puppylight.pos[1][1]) * (obj->puppylight.pos[1][1])) + ((obj->puppylight.pos[1][2]) * (obj->puppylight.pos[1][2])); - if (dist > lightSize) - goto deallocate; //That's right. I used a goto. Eat your heart out xkcd. - if (obj->oLightID == 0xFFFF) - { + if (dist > lightSize) { + goto deallocate; // That's right. I used a goto. Eat your heart out xkcd. + } + if (obj->oLightID == 0xFFFF) { s32 fadingExists = FALSE; - if (ABS(gNumLights - gDynLightStart) < MAX_LIGHTS_DYNAMIC) + if (ABS(gNumLights - gDynLightStart) < MAX_LIGHTS_DYNAMIC) { goto deallocate; - for (i = gDynLightStart; i < MIN(gDynLightStart+MAX_LIGHTS_DYNAMIC, MAX_LIGHTS); i++) - { - if (gPuppyLights[i]->active == TRUE) - { - if (gPuppyLights[i]->flags & PUPPYLIGHT_DELETE) + } + for (i = gDynLightStart; i < MIN(gDynLightStart+MAX_LIGHTS_DYNAMIC, MAX_LIGHTS); i++) { + if (gPuppyLights[i]->active == TRUE) { + if (gPuppyLights[i]->flags & PUPPYLIGHT_DELETE) { fadingExists = TRUE; + } continue; } memcpy(gPuppyLights[i], &obj->puppylight, sizeof(struct PuppyLight)); @@ -304,13 +286,12 @@ void puppylights_object_emit(struct Object *obj) obj->oLightID = i; goto updatepos; } - //Go through all the lights again, now this time, ignore the fading light flag and overwrite them. - if (fadingExists) - { - for (i = gDynLightStart; i < MIN(gDynLightStart+MAX_LIGHTS_DYNAMIC, MAX_LIGHTS); i++) - { - if (gPuppyLights[i]->active == TRUE && !(gPuppyLights[i]->flags & PUPPYLIGHT_DELETE)) + // Go through all the lights again, now this time, ignore the fading light flag and overwrite them. + if (fadingExists) { + for (i = gDynLightStart; i < MIN(gDynLightStart+MAX_LIGHTS_DYNAMIC, MAX_LIGHTS); i++) { + if (gPuppyLights[i]->active == TRUE && !(gPuppyLights[i]->flags & PUPPYLIGHT_DELETE)) { continue; + } memcpy(gPuppyLights[i], &obj->puppylight, sizeof(struct PuppyLight)); gPuppyLights[i]->active = TRUE; gPuppyLights[i]->area = gCurrAreaIndex; @@ -320,20 +301,15 @@ void puppylights_object_emit(struct Object *obj) goto updatepos; } } - } - else - { + } else { updatepos: gPuppyLights[obj->oLightID]->pos[0][0] = obj->oPosX; gPuppyLights[obj->oLightID]->pos[0][1] = obj->oPosY; gPuppyLights[obj->oLightID]->pos[0][2] = obj->oPosZ; } - } - else - { + } else { deallocate: - if (obj->oLightID != 0xFFFF) - { + if (obj->oLightID != 0xFFFF) { gPuppyLights[obj->oLightID]->active = FALSE; gPuppyLights[obj->oLightID]->flags = 0; } @@ -341,10 +317,9 @@ void puppylights_object_emit(struct Object *obj) } } -//A bit unorthodox, but anything to avoid having to set up data to pass through in the original function. -//Objects will completely ignore X, Y, Z and active though. -void set_light_properties(struct PuppyLight *light, s32 x, s32 y, s32 z, s32 offsetX, s32 offsetY, s32 offsetZ, s32 yaw, s32 epicentre, s32 colour, s32 flags, s32 room, s32 active) -{ +// A bit unorthodox, but anything to avoid having to set up data to pass through in the original function. +// Objects will completely ignore X, Y, Z and active though. +void set_light_properties(struct PuppyLight *light, s32 x, s32 y, s32 z, s32 offsetX, s32 offsetY, s32 offsetZ, s32 yaw, s32 epicentre, s32 colour, s32 flags, s32 room, s32 active) { light->active = active; light->pos[0][0] = x; light->pos[0][1] = y; @@ -354,7 +329,7 @@ void set_light_properties(struct PuppyLight *light, s32 x, s32 y, s32 z, s32 off light->pos[1][2] = MAX(offsetZ, 10); light->rgba[0] = (colour >> 24) & 0xFF; light->rgba[1] = (colour >> 16) & 0xFF; - light->rgba[2] = (colour >> 8) & 0xFF; + light->rgba[2] = (colour >> 8) & 0xFF; light->rgba[3] = colour & 0xFF; light->yaw = yaw; light->area = gCurrAreaIndex; @@ -365,45 +340,38 @@ void set_light_properties(struct PuppyLight *light, s32 x, s32 y, s32 z, s32 off light->flags |= flags | PUPPYLIGHT_DYNAMIC; } -//You can run these in objects to enable or disable their light properties. -void cur_obj_enable_light(void) -{ +// You can run these in objects to enable or disable their light properties. +void cur_obj_enable_light(void) { gCurrentObject->oFlags |= OBJ_FLAG_EMIT_LIGHT; } -void cur_obj_disable_light(void) -{ +void cur_obj_disable_light(void) { gCurrentObject->oFlags &= ~OBJ_FLAG_EMIT_LIGHT; if (gPuppyLights[gCurrentObject->oLightID] && gCurrentObject->oLightID != 0xFFFF) gPuppyLights[gCurrentObject->oLightID]->flags |= PUPPYLIGHT_DELETE; } -void obj_enable_light(struct Object *obj) -{ +void obj_enable_light(struct Object *obj) { obj->oFlags |= OBJ_FLAG_EMIT_LIGHT; } -void obj_disable_light(struct Object *obj) -{ +void obj_disable_light(struct Object *obj) { obj->oFlags &= ~OBJ_FLAG_EMIT_LIGHT; - if (gPuppyLights[obj->oLightID] && obj->oLightID != 0xFFFF) + if (gPuppyLights[obj->oLightID] && obj->oLightID != 0xFFFF) { gPuppyLights[obj->oLightID]->flags |= PUPPYLIGHT_DELETE; + } } -//This is ran during a standard area update -void delete_lights(void) -{ +// This is ran during a standard area update +void delete_lights(void) { s32 i; - for (i = 0; i < gNumLights; i++) - { - if (gPuppyLights[i]->active == TRUE && gPuppyLights[i]->flags & PUPPYLIGHT_DELETE) - { + for (i = 0; i < gNumLights; i++) { + if (gPuppyLights[i]->active == TRUE && gPuppyLights[i]->flags & PUPPYLIGHT_DELETE) { gPuppyLights[i]->pos[1][0] = approach_f32_asymptotic(gPuppyLights[i]->pos[1][0], 0, 0.15f); gPuppyLights[i]->pos[1][1] = approach_f32_asymptotic(gPuppyLights[i]->pos[1][1], 0, 0.15f); gPuppyLights[i]->pos[1][2] = approach_f32_asymptotic(gPuppyLights[i]->pos[1][2], 0, 0.15f); - if (gPuppyLights[i]->pos[1][0] < 1.0f && gPuppyLights[i]->pos[1][1] < 1.0f && gPuppyLights[i]->pos[1][2] < 1.0f) - { + if (gPuppyLights[i]->pos[1][0] < 1.0f && gPuppyLights[i]->pos[1][1] < 1.0f && gPuppyLights[i]->pos[1][2] < 1.0f) { gPuppyLights[i]->flags &= ~ PUPPYLIGHT_DELETE; gPuppyLights[i]->active = FALSE; } diff --git a/src/game/puppyprint.c b/src/game/puppyprint.c index 5c3d454b..8b88692d 100644 --- a/src/game/puppyprint.c +++ b/src/game/puppyprint.c @@ -47,18 +47,18 @@ a modern game engine's developer's console. #include "debug_box.h" ColorRGBA currEnv; -u8 fDebug = 0; +u8 fDebug = FALSE; #if PUPPYPRINT_DEBUG -s8 benchViewer = 0; +s8 benchViewer = FALSE; u8 benchOption = 0; -s8 logViewer = 0; +s8 logViewer = FALSE; // Profiler values -s8 perfIteration = 0; +s8 perfIteration = 0; s16 benchmarkLoop = 0; s32 benchmarkTimer = 0; s32 benchmarkProgramTimer = 0; -s8 benchmarkType = 0; +s8 benchmarkType = 0; // General OSTime cpuTime = 0; OSTime rspTime = 0; @@ -67,34 +67,41 @@ OSTime ramTime = 0; OSTime loadTime = 0; OSTime gLastOSTime = 0; OSTime rspDelta = 0; -s32 benchMark[NUM_BENCH_ITERATIONS+2]; +s32 benchMark[NUM_BENCH_ITERATIONS + 2]; // CPU -OSTime collisionTime[NUM_PERF_ITERATIONS+1]; -OSTime behaviourTime[NUM_PERF_ITERATIONS+1]; -OSTime scriptTime[NUM_PERF_ITERATIONS+1]; -OSTime graphTime[NUM_PERF_ITERATIONS+1]; -OSTime audioTime[NUM_PERF_ITERATIONS+1]; -OSTime dmaTime[NUM_PERF_ITERATIONS+1]; -OSTime dmaAudioTime[NUM_PERF_ITERATIONS+1]; -OSTime faultTime[NUM_PERF_ITERATIONS+1]; -OSTime taskTime[NUM_PERF_ITERATIONS+1]; -OSTime profilerTime[NUM_PERF_ITERATIONS+1]; -OSTime profilerTime2[NUM_PERF_ITERATIONS+1]; +OSTime collisionTime[NUM_PERF_ITERATIONS + 1]; +OSTime behaviourTime[NUM_PERF_ITERATIONS + 1]; +OSTime scriptTime[NUM_PERF_ITERATIONS + 1]; +OSTime graphTime[NUM_PERF_ITERATIONS + 1]; +OSTime audioTime[NUM_PERF_ITERATIONS + 1]; +OSTime dmaTime[NUM_PERF_ITERATIONS + 1]; +OSTime dmaAudioTime[NUM_PERF_ITERATIONS + 1]; +OSTime faultTime[NUM_PERF_ITERATIONS + 1]; +OSTime taskTime[NUM_PERF_ITERATIONS + 1]; +OSTime profilerTime[NUM_PERF_ITERATIONS + 1]; +OSTime profilerTime2[NUM_PERF_ITERATIONS + 1]; // RSP -OSTime audioTime[NUM_PERF_ITERATIONS+1]; -OSTime rspGenTime[NUM_PERF_ITERATIONS+1]; +OSTime audioTime[NUM_PERF_ITERATIONS + 1]; +OSTime rspGenTime[NUM_PERF_ITERATIONS + 1]; // RDP -OSTime bufferTime[NUM_PERF_ITERATIONS+1]; -OSTime tmemTime[NUM_PERF_ITERATIONS+1]; -OSTime busTime[NUM_PERF_ITERATIONS+1]; +OSTime bufferTime[NUM_PERF_ITERATIONS + 1]; +OSTime tmemTime[NUM_PERF_ITERATIONS + 1]; +OSTime busTime[NUM_PERF_ITERATIONS + 1]; // RAM -s8 ramViewer = 0; -s32 ramsizeSegment[33] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; +s8 ramViewer = FALSE; +s32 ramsizeSegment[33] = { 0, 0, 0, + 0, 0, 0, + 0, 0, 0, + 0, 0, 0, + 0, 0, 0, + 0, 0, 0, + 0, 0, 0, + 0, 0, 0, + 0, 0, 0, + 0, 0, 0, + 0, 0, 0 }; s32 audioPool[12]; s32 mempool; -// Collision -u8 collisionViewer = 0; -s32 numSurfaces = 0; extern u8 _mainSegmentStart[]; extern u8 _mainSegmentEnd[]; @@ -107,7 +114,7 @@ extern u8 _buffersSegmentBssEnd[]; extern u8 _goddardSegmentStart[]; extern u8 _goddardSegmentEnd[]; -//Here is stored the rom addresses of the global code segments. If you get rid of any, it's best to just write them as NULL. +// Here is stored the rom addresses of the global code segments. If you get rid of any, it's best to just write them as NULL. s32 ramP[5][2] = { {(u32)&_buffersSegmentBssStart, (u32)&_buffersSegmentBssEnd}, {(u32)&_mainSegmentStart, (u32)&_mainSegmentEnd}, @@ -143,7 +150,7 @@ void puppyprint_profiler_finished(void) { benchMark[NUM_BENCH_ITERATIONS] = 0; benchMark[NUM_BENCH_ITERATIONS+1] = 0; benchmarkTimer = 300; - benchViewer = 0; + benchViewer = FALSE; for (i = 0; i < NUM_BENCH_ITERATIONS - 2; i++) { benchMark[NUM_BENCH_ITERATIONS] += benchMark[i]; if (benchMark[i] > benchMark[NUM_BENCH_ITERATIONS + 1]) { @@ -521,17 +528,17 @@ void puppyprint_profiler_process(void) { } if (fDebug) { if (gPlayer1Controller->buttonPressed & D_JPAD) { - benchViewer ^= 1; - ramViewer = 0; - logViewer = 0; + benchViewer ^= TRUE; + ramViewer = FALSE; + logViewer = FALSE; } else if (gPlayer1Controller->buttonPressed & U_JPAD) { - ramViewer ^= 1; - benchViewer = 0; - logViewer = 0; + ramViewer ^= TRUE; + benchViewer = FALSE; + logViewer = FALSE; } else if (gPlayer1Controller->buttonPressed & L_JPAD) { - logViewer ^= 1; - ramViewer = 0; - benchViewer = 0; + logViewer ^= TRUE; + ramViewer = FALSE; + benchViewer = FALSE; } #ifdef VISUAL_DEBUG else if (!benchViewer && !ramViewer && !logViewer) { @@ -551,9 +558,9 @@ void puppyprint_profiler_process(void) { benchmark_custom(); } if (gPlayer1Controller->buttonDown & U_JPAD && gPlayer1Controller->buttonPressed & L_TRIG) { - ramViewer = 0; - benchViewer = 0; - fDebug ^= 1; + ramViewer = FALSE; + benchViewer = FALSE; + fDebug ^= TRUE; } diff --git a/src/game/puppyprint.h b/src/game/puppyprint.h index 19523668..0af3ce0b 100644 --- a/src/game/puppyprint.h +++ b/src/game/puppyprint.h @@ -35,25 +35,25 @@ extern OSTime rdpTime; extern OSTime ramTime; extern OSTime loadTime; extern OSTime rspDelta; -extern s32 benchMark[NUM_BENCH_ITERATIONS+2]; +extern s32 benchMark[NUM_BENCH_ITERATIONS + 2]; -//CPU -extern OSTime collisionTime[NUM_PERF_ITERATIONS+1]; -extern OSTime behaviourTime[NUM_PERF_ITERATIONS+1]; -extern OSTime scriptTime[NUM_PERF_ITERATIONS+1]; -extern OSTime graphTime[NUM_PERF_ITERATIONS+1]; -extern OSTime audioTime[NUM_PERF_ITERATIONS+1]; -extern OSTime dmaTime[NUM_PERF_ITERATIONS+1]; -extern OSTime dmaAudioTime[NUM_PERF_ITERATIONS+1]; -extern OSTime faultTime[NUM_PERF_ITERATIONS+1]; -extern OSTime taskTime[NUM_PERF_ITERATIONS+1]; -extern OSTime profilerTime[NUM_PERF_ITERATIONS+1]; -//RSP -extern OSTime rspGenTime[NUM_PERF_ITERATIONS+1]; -//RDP -extern OSTime bufferTime[NUM_PERF_ITERATIONS+1]; -extern OSTime tmemTime[NUM_PERF_ITERATIONS+1]; -extern OSTime busTime[NUM_PERF_ITERATIONS+1]; +// CPU +extern OSTime collisionTime[NUM_PERF_ITERATIONS + 1]; +extern OSTime behaviourTime[NUM_PERF_ITERATIONS + 1]; +extern OSTime scriptTime[NUM_PERF_ITERATIONS + 1]; +extern OSTime graphTime[NUM_PERF_ITERATIONS + 1]; +extern OSTime audioTime[NUM_PERF_ITERATIONS + 1]; +extern OSTime dmaTime[NUM_PERF_ITERATIONS + 1]; +extern OSTime dmaAudioTime[NUM_PERF_ITERATIONS + 1]; +extern OSTime faultTime[NUM_PERF_ITERATIONS + 1]; +extern OSTime taskTime[NUM_PERF_ITERATIONS + 1]; +extern OSTime profilerTime[NUM_PERF_ITERATIONS + 1]; +// RSP +extern OSTime rspGenTime[NUM_PERF_ITERATIONS + 1]; +// RDP +extern OSTime bufferTime[NUM_PERF_ITERATIONS + 1]; +extern OSTime tmemTime[NUM_PERF_ITERATIONS + 1]; +extern OSTime busTime[NUM_PERF_ITERATIONS + 1]; extern void profiler_update(OSTime *time, OSTime time2); extern void puppyprint_profiler_process(void); @@ -65,8 +65,8 @@ extern void finish_blank_box(void); extern void render_blank_box(s16 x1, s16 y1, s16 x2, s16 y2, u8 r, u8 g, u8 b, u8 a); extern void print_small_text(s32 x, s32 y, const char *str, s32 align, s32 amount); extern void render_multi_image(Texture *image, s32 x, s32 y, s32 width, s32 height, s32 scaleX, s32 scaleY, s32 mode); -extern s32 get_text_height(const char *str); -extern s32 get_text_width(const char *str); +extern s32 get_text_height(const char *str); +extern s32 get_text_width(const char *str); extern void prepare_blank_box(void); extern void finish_blank_box(void); extern void render_blank_box(s16 x1, s16 y1, s16 x2, s16 y2, u8 r, u8 g, u8 b, u8 a); diff --git a/textures/segment2/custom_text.i4.png b/textures/segment2/custom_text.i4.png index bb9be8eef3f6b7d694cf6f9b55598737ecf6bd0c..ccecd85f80c1c528ca00be449182fba0ae95a2e6 100644 GIT binary patch delta 12678 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 A@c;k- delta 12778 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 Date: Tue, 28 Sep 2021 12:41:27 +0100 Subject: [PATCH 17/97] Puppytext font support + visual debug colour tweak --- bin/segment2.c | 34 +++++++++++- src/game/debug_box.c | 16 ++++-- src/game/hud.c | 2 +- src/game/puppycam2.c | 4 +- src/game/puppyprint.c | 75 ++++++++++++-------------- src/game/puppyprint.h | 16 ++++-- src/game/rendering_graph_node.c | 6 ++- src/game/segment2.h | 3 ++ textures/segment2/custom_text.i4.png | Bin 16247 -> 2646 bytes textures/segment2/custom_text2.i4.png | Bin 0 -> 16247 bytes 10 files changed, 102 insertions(+), 54 deletions(-) create mode 100644 textures/segment2/custom_text2.i4.png diff --git a/bin/segment2.c b/bin/segment2.c index 23a99516..969f279e 100644 --- a/bin/segment2.c +++ b/bin/segment2.c @@ -10,9 +10,41 @@ // SM64 (US/JP/EU/SH) Segment 02 #ifdef PUPPYPRINT -ALIGNED8 const Texture small_font[] = { +ALIGNED8 static const Texture small_font_1[] = { #include "textures/segment2/custom_text.i4.inc.c" }; +ALIGNED8 static const Texture small_font_2[] = { +#include "textures/segment2/custom_text2.i4.inc.c" +}; + +const Texture *const puppyprint_font_lut[2] = +{ + small_font_1, small_font_2 +}; + +static const u8 small_font_kerning_1[80] = +{ + /*0*/ 7, /*1*/ 7, /*2*/ 7, /*3*/ 7, /*4*/ 7, /*5*/ 7, /*6*/ 7, /*7*/ 7, /*8*/ 7, /*9*/ 7, /*-*/ 7, /*+*/ 7, /*(*/ 4, /*)*/ 4, /*!*/ 5, /*?*/ 6, + /*A*/ 7, /*B*/ 7, /*C*/ 7, /*D*/ 7, /*E*/ 7, /*F*/ 7, /*G*/ 7, /*H*/ 7, /*I*/ 7, /*J*/ 7, /*K*/ 7, /*L*/ 7, /*M*/ 7, /*N*/ 7, /*O*/ 7, /*P*/ 7, + /*Q*/ 7, /*R*/ 7, /*S*/ 7, /*T*/ 7, /*U*/ 7, /*V*/ 7, /*W*/ 7, /*X*/ 7, /*Y*/ 7, /*Z*/ 7, /*"*/ 5, /*'*/ 2, /*:*/ 3, /*;*/ 3, /*.*/ 3, /*,*/ 3, + /*a*/ 6, /*b*/ 6, /*c*/ 6, /*d*/ 6, /*e*/ 6, /*f*/ 6, /*g*/ 6, /*h*/ 6, /*i*/ 2, /*j*/ 6, /*k*/ 6, /*l*/ 3, /*m*/ 6, /*n*/ 6, /*o*/ 6, /*p*/ 6, + /*q*/ 6, /*r*/ 6, /*s*/ 6, /*t*/ 6, /*u*/ 6, /*v*/ 6, /*w*/ 6, /*x*/ 6, /*y*/ 6, /*z*/ 6, /*~*/ 7, /*¨*/ 6, /*^*/ 7, /*/*/ 6, /*%*/ 6, /*&*/ 7, +}; + +static const u8 small_font_kerning_2[80] = +{ + /*0*/ 6, /*1*/ 5, /*2*/ 7, /*3*/ 7, /*4*/ 7, /*5*/ 7, /*6*/ 8, /*7*/ 7, /*8*/ 7, /*9*/ 6, /*-*/ 8, /*+*/ 8, /*(*/ 5, /*)*/ 5, /*!*/ 4, /*?*/ 6, + /*A*/ 7, /*B*/ 7, /*C*/ 7, /*D*/ 7, /*E*/ 6, /*F*/ 5, /*G*/ 8, /*H*/ 6, /*I*/ 6, /*J*/ 5, /*K*/ 7, /*L*/ 6, /*M*/ 7, /*N*/ 7, /*O*/ 7, /*P*/ 6, + /*Q*/ 8, /*R*/ 6, /*S*/ 7, /*T*/ 7, /*U*/ 7, /*V*/ 7, /*W*/ 8, /*X*/ 7, /*Y*/ 7, /*Z*/ 7, /*"*/ 5, /*'*/ 2, /*:*/ 3, /*;*/ 3, /*.*/ 3, /*,*/ 3, + /*a*/ 7, /*b*/ 7, /*c*/ 6, /*d*/ 7, /*e*/ 7, /*f*/ 7, /*g*/ 7, /*h*/ 7, /*i*/ 3, /*j*/ 5, /*k*/ 8, /*l*/ 4, /*m*/ 7, /*n*/ 7, /*o*/ 7, /*p*/ 7, + /*q*/ 7, /*r*/ 6, /*s*/ 6, /*t*/ 6, /*u*/ 6, /*v*/ 7, /*w*/ 8, /*x*/ 6, /*y*/ 8, /*z*/ 7, /*~*/ 8, /*¨*/ 7, /*^*/ 8, /*/*/ 8, /*%*/ 8, /*&*/ 8, +}; + +const u8 *const puppyprint_kerning_lut[2][80] = +{ + small_font_kerning_1, small_font_kerning_2 +}; + #endif ALIGNED8 static const Texture texture_hud_char_0[] = { diff --git a/src/game/debug_box.c b/src/game/debug_box.c index 42fe79ec..1b9ca87f 100644 --- a/src/game/debug_box.c +++ b/src/game/debug_box.c @@ -29,6 +29,7 @@ #include "engine/surface_collision.h" #include "engine/surface_load.h" #include "object_list_processor.h" +#include "behavior_data.h" #include "debug_box.h" @@ -239,9 +240,18 @@ void iterate_surfaces_visual(s32 x, s32 z, Vtx *verts) { surf = node->surface; node = node->next; - make_vertex(verts, gVisualSurfaceCount, surf->vertex1[0], surf->vertex1[1], surf->vertex1[2], 0, 0, col[0], col[1], col[2], 0x80); - make_vertex(verts, gVisualSurfaceCount+1, surf->vertex2[0], surf->vertex2[1], surf->vertex2[2], 0, 0, col[0], col[1], col[2], 0x80); - make_vertex(verts, gVisualSurfaceCount+2, surf->vertex3[0], surf->vertex3[1], surf->vertex3[2], 0, 0, col[0], col[1], col[2], 0x80); + if (surf->type >= SURFACE_INSTANT_WARP_1B && surf->type <= SURFACE_INSTANT_WARP_1E) + { + make_vertex(verts, gVisualSurfaceCount, surf->vertex1[0], surf->vertex1[1], surf->vertex1[2], 0, 0, 0xFF, 0xA0, 0x00, 0x80); + make_vertex(verts, gVisualSurfaceCount+1, surf->vertex2[0], surf->vertex2[1], surf->vertex2[2], 0, 0, 0xFF, 0xA0, 0x00, 0x80); + make_vertex(verts, gVisualSurfaceCount+2, surf->vertex3[0], surf->vertex3[1], surf->vertex3[2], 0, 0, 0xFF, 0xA0, 0x00, 0x80); + } + else + { + make_vertex(verts, gVisualSurfaceCount, surf->vertex1[0], surf->vertex1[1], surf->vertex1[2], 0, 0, col[0], col[1], col[2], 0x80); + make_vertex(verts, gVisualSurfaceCount+1, surf->vertex2[0], surf->vertex2[1], surf->vertex2[2], 0, 0, col[0], col[1], col[2], 0x80); + make_vertex(verts, gVisualSurfaceCount+2, surf->vertex3[0], surf->vertex3[1], surf->vertex3[2], 0, 0, col[0], col[1], col[2], 0x80); + } gVisualSurfaceCount+=3; } diff --git a/src/game/hud.c b/src/game/hud.c index c0403142..1da58cf0 100644 --- a/src/game/hud.c +++ b/src/game/hud.c @@ -71,7 +71,7 @@ void print_fps(s32 x, s32 y) { sprintf(text, "FPS %2.2f", fps); #ifdef PUPPYPRINT - print_small_text(x, y, text, PRINT_TEXT_ALIGN_LEFT, PRINT_ALL); + print_small_text(x, y, text, PRINT_TEXT_ALIGN_LEFT, PRINT_ALL, FONT_OUTLINE); #else print_text(x, y, text); #endif diff --git a/src/game/puppycam2.c b/src/game/puppycam2.c index ec6035bf..10168fb9 100644 --- a/src/game/puppycam2.c +++ b/src/game/puppycam2.c @@ -451,7 +451,7 @@ void puppycam_check_pause_buttons(void) { play_sound(SOUND_MENU_CHANGE_SELECT, gGlobalSoundSource); if (gPlayer1Controller->rawStickX >= 60 || gPlayer1Controller->buttonDown & R_JPAD) { puppycam_change_setting(1); - } else if (gPlayer1Controller->rawStickX <= -60 || gPlayer1Controller->buttonDown & L_JPAD) + } else if (gPlayer1Controller->rawStickX <= -60 || gPlayer1Controller->buttonDown & L_JPAD) { puppycam_change_setting(-1); } } @@ -1079,7 +1079,7 @@ void puppycam_projection_behaviours(void) { gPuppyCam.floorY[1] = 0; gPuppyCam.targetFloorHeight = gPuppyCam.targetObj->oPosY; gPuppyCam.lastTargetFloorHeight = gPuppyCam.targetObj->oPosY; - + gPuppyCam.yawTarget = approach_angle(gPuppyCam.yawTarget, (gMarioState->faceAngle[1] + 0x8000), (1000 * (gMarioState->forwardVel / 32))); if (gMarioState->waterLevel - 100 - gMarioState->pos[1] > 5 && gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_PITCH_ROTATION) { gPuppyCam.swimPitch = approach_f32_asymptotic(gPuppyCam.swimPitch,gMarioState->faceAngle[0] / 10, 0.05f); diff --git a/src/game/puppyprint.c b/src/game/puppyprint.c index 8b88692d..5c3bc265 100644 --- a/src/game/puppyprint.c +++ b/src/game/puppyprint.c @@ -31,7 +31,6 @@ a modern game engine's developer's console. #include "game_init.h" #include "memory.h" #include "print.h" -#include "segment2.h" #include "string.h" #include "stdarg.h" #include "printf.h" @@ -265,7 +264,7 @@ void print_ram_overview(void) { sprintf(textBytes, "Segment %02X: %X", i - nameTable + 2, ramsizeSegment[i]); } print_set_envcolour(colourChart[i][0], colourChart[i][1], colourChart[i][2], 255); - print_small_text(x, y, textBytes, PRINT_TEXT_ALIGN_CENTRE, PRINT_ALL); + print_small_text(x, y, textBytes, PRINT_TEXT_ALIGN_CENTRE, PRINT_ALL, FONT_DEFAULT); y += 12; drawn++; } @@ -306,7 +305,7 @@ void print_which_benchmark(void) { render_blank_box(110, 115, 210, 160, 0, 0, 0, 255); finish_blank_box(); sprintf(textBytes, "Select Option#%s#L: Confirm", benchNames[benchOption]); - print_small_text(160,120, textBytes, PRINT_TEXT_ALIGN_CENTRE, PRINT_ALL); + print_small_text(160,120, textBytes, PRINT_TEXT_ALIGN_CENTRE, PRINT_ALL, FONT_DEFAULT); } char consoleLogTable[LOG_BUFFER_SIZE][255]; @@ -346,7 +345,7 @@ void print_console_log(void) { if (consoleLogTable[i] == NULL) { continue; } - print_small_text(16, (LINE_HEIGHT) - (i * 12), consoleLogTable[i], PRINT_TEXT_ALIGN_LEFT, PRINT_ALL); + print_small_text(16, (LINE_HEIGHT) - (i * 12), consoleLogTable[i], PRINT_TEXT_ALIGN_LEFT, PRINT_ALL, FONT_DEFAULT); } } #undef LINE_HEIGHT @@ -373,7 +372,7 @@ void puppyprint_render_profiler(void) { } sprintf(textBytes, "RAM: %06X /%06X (%d_)", main_pool_available(), mempool, (s32)(((f32)main_pool_available() / (f32)mempool) * 100)); - print_small_text(160, 224, textBytes, PRINT_TEXT_ALIGN_CENTRE, PRINT_ALL); + print_small_text(160, 224, textBytes, PRINT_TEXT_ALIGN_CENTRE, PRINT_ALL, FONT_OUTLINE); if (!ramViewer && !benchViewer && !logViewer) { print_fps(16,40); @@ -382,20 +381,20 @@ void puppyprint_render_profiler(void) { #else sprintf(textBytes, "CPU: %dus (%d_)#RSP: %dus (%d_)#RDP: %dus (%d_)", (s32)cpuCount, (s32)(cpuCount / 333), (s32)OS_CYCLES_TO_USEC(rspTime), (s32)OS_CYCLES_TO_USEC(rspTime) / 333, (s32)OS_CYCLES_TO_USEC(rdpTime), (s32)OS_CYCLES_TO_USEC(rdpTime) / 333); #endif - print_small_text(16, 52, textBytes, PRINT_TEXT_ALIGN_LEFT, PRINT_ALL); + print_small_text(16, 52, textBytes, PRINT_TEXT_ALIGN_LEFT, PRINT_ALL, FONT_OUTLINE); sprintf(textBytes, "OBJ: %d/%d", gObjectCounter, OBJECT_POOL_CAPACITY); - print_small_text(16, 124, textBytes, PRINT_TEXT_ALIGN_LEFT, PRINT_ALL); + print_small_text(16, 124, textBytes, PRINT_TEXT_ALIGN_LEFT, PRINT_ALL, FONT_OUTLINE); // Very little point printing useless info if Mayro doesn't even exist. if (gMarioState->marioObj) { sprintf(textBytes, "Mario Pos#X: %d#Y: %d#Z: %d#D: %X", (s32)(gMarioState->pos[0]), (s32)(gMarioState->pos[1]), (s32)(gMarioState->pos[2]), (u16)(gMarioState->faceAngle[1])); - print_small_text(16, 140, textBytes, PRINT_TEXT_ALIGN_LEFT, PRINT_ALL); + print_small_text(16, 140, textBytes, PRINT_TEXT_ALIGN_LEFT, PRINT_ALL, FONT_OUTLINE); } // Same for the camera, especially so because this will crash otherwise. if (gCamera) { sprintf(textBytes, "Camera Pos#X: %d#Y: %d#Z: %d#D: %X", (s32)(gCamera->pos[0]), (s32)(gCamera->pos[1]), (s32)(gCamera->pos[2]), (u16)(gCamera->yaw)); - print_small_text(304, 140, textBytes, PRINT_TEXT_ALIGN_RIGHT, PRINT_ALL); + print_small_text(304, 140, textBytes, PRINT_TEXT_ALIGN_RIGHT, PRINT_ALL, FONT_OUTLINE); } if (benchmarkTimer > 0) { @@ -408,9 +407,9 @@ void puppyprint_render_profiler(void) { // sprintf(textBytes, "Benchmark: %dus#High: %dus", (s32)OS_CYCLES_TO_USEC(benchMark[NUM_BENCH_ITERATIONS]), (s32)OS_CYCLES_TO_USEC(benchMark[NUM_BENCH_ITERATIONS+1])); sprintf(textBytes, "Done in %0.000f seconds#Benchmark: %dus#High: %dus", (f32)(benchmarkProgramTimer) * 0.000001f, (s32)OS_CYCLES_TO_USEC(benchMark[NUM_BENCH_ITERATIONS]), (s32)OS_CYCLES_TO_USEC(benchMark[NUM_BENCH_ITERATIONS + 1])); #endif - render_blank_box(160 - (get_text_width(textBytes) / 2) - 4, 158, 160 + (get_text_width(textBytes) / 2) + 4, 196, 0, 0, 0, 255); + render_blank_box(160 - (get_text_width(textBytes, FONT_OUTLINE) / 2) - 4, 158, 160 + (get_text_width(textBytes, FONT_OUTLINE) / 2) + 4, 196, 0, 0, 0, 255); print_set_envcolour(255, 255, 255, 255); - print_small_text(160, 160, textBytes, PRINT_TEXT_ALIGN_CENTRE, PRINT_ALL); + print_small_text(160, 160, textBytes, PRINT_TEXT_ALIGN_CENTRE, PRINT_ALL, FONT_OUTLINE); finish_blank_box(); } @@ -424,26 +423,26 @@ void puppyprint_render_profiler(void) { #ifdef PUPPYPRINT_DEBUG_CYCLES sprintf(textBytes, "Collision: %dc", (s32)(collisionTime[NUM_PERF_ITERATIONS])); - print_small_text(304, 40, textBytes, PRINT_TEXT_ALIGN_RIGHT, PRINT_ALL); + print_small_text(304, 40, textBytes, PRINT_TEXT_ALIGN_RIGHT, PRINT_ALL, FONT_OUTLINE); sprintf(textBytes, "Graph: %dc", (s32)(graphTime[NUM_PERF_ITERATIONS])); - print_small_text(304, 52, textBytes, PRINT_TEXT_ALIGN_RIGHT, PRINT_ALL); + print_small_text(304, 52, textBytes, PRINT_TEXT_ALIGN_RIGHT, PRINT_ALL, FONT_OUTLINE); sprintf(textBytes, "Behaviour: %dc", (s32)(behaviourTime[NUM_PERF_ITERATIONS])); - print_small_text(304, 64, textBytes, PRINT_TEXT_ALIGN_RIGHT, PRINT_ALL); + print_small_text(304, 64, textBytes, PRINT_TEXT_ALIGN_RIGHT, PRINT_ALL, FONT_OUTLINE); sprintf(textBytes, "Audio: %dc", (s32)(audioTime[NUM_PERF_ITERATIONS])); - print_small_text(304, 76, textBytes, PRINT_TEXT_ALIGN_RIGHT, PRINT_ALL); + print_small_text(304, 76, textBytes, PRINT_TEXT_ALIGN_RIGHT, PRINT_ALL, FONT_OUTLINE); sprintf(textBytes, "DMA: %dc", (s32)(dmaTime[NUM_PERF_ITERATIONS])); - print_small_text(304, 88, textBytes, PRINT_TEXT_ALIGN_RIGHT, PRINT_ALL); + print_small_text(304, 88, textBytes, PRINT_TEXT_ALIGN_RIGHT, PRINT_ALL, FONT_OUTLINE); #else sprintf(textBytes, "Collision: %dus", (s32)OS_CYCLES_TO_USEC(collisionTime[NUM_PERF_ITERATIONS])); - print_small_text(304, 40, textBytes, PRINT_TEXT_ALIGN_RIGHT, PRINT_ALL); + print_small_text(304, 40, textBytes, PRINT_TEXT_ALIGN_RIGHT, PRINT_ALL, FONT_OUTLINE); sprintf(textBytes, "Graph: %dus", (s32)OS_CYCLES_TO_USEC(graphTime[NUM_PERF_ITERATIONS])); - print_small_text(304, 52, textBytes, PRINT_TEXT_ALIGN_RIGHT, PRINT_ALL); + print_small_text(304, 52, textBytes, PRINT_TEXT_ALIGN_RIGHT, PRINT_ALL, FONT_OUTLINE); sprintf(textBytes, "Behaviour: %dus", (s32)OS_CYCLES_TO_USEC(behaviourTime[NUM_PERF_ITERATIONS])); - print_small_text(304, 64, textBytes, PRINT_TEXT_ALIGN_RIGHT, PRINT_ALL); + print_small_text(304, 64, textBytes, PRINT_TEXT_ALIGN_RIGHT, PRINT_ALL, FONT_OUTLINE); sprintf(textBytes, "Audio: %dus", (s32)OS_CYCLES_TO_USEC(audioTime[NUM_PERF_ITERATIONS])); - print_small_text(304, 76, textBytes, PRINT_TEXT_ALIGN_RIGHT, PRINT_ALL); + print_small_text(304, 76, textBytes, PRINT_TEXT_ALIGN_RIGHT, PRINT_ALL, FONT_OUTLINE); sprintf(textBytes, "DMA: %dus", (s32)OS_CYCLES_TO_USEC(dmaTime[NUM_PERF_ITERATIONS])); - print_small_text(304, 88, textBytes, PRINT_TEXT_ALIGN_RIGHT, PRINT_ALL); + print_small_text(304, 88, textBytes, PRINT_TEXT_ALIGN_RIGHT, PRINT_ALL, FONT_OUTLINE); #endif // Render CPU breakdown bar. @@ -595,7 +594,7 @@ void finish_blank_box(void) { // This does some epic shenanigans to figure out the optimal way to draw this. // If the width is a multiple of 4, then use fillmode (fastest) // Otherwise, if there's transparency, it uses that rendermode, which is slower than using opaque rendermodes. -void render_blank_box(s16 x1, s16 y1, s16 x2, s16 y2, u8 r, u8 g, u8 b, u8 a) { +void render_blank_box(s32 x1, s32 y1, s32 x2, s32 y2, s32 r, s32 g, s32 b, s32 a) { s32 cycleadd = 0; if (ABS(x1 - x2) % 4 == 0 && a == 255) { gDPSetCycleType(gDisplayListHead++, G_CYC_FILL); @@ -616,19 +615,12 @@ void render_blank_box(s16 x1, s16 y1, s16 x2, s16 y2, u8 r, u8 g, u8 b, u8 a) { gDPFillRectangle(gDisplayListHead++, x1, y1, x2-cycleadd, y2-cycleadd); } - -u8 textLen[] = { - /*0*/ 7, /*1*/ 7, /*2*/ 7, /*3*/ 7, /*4*/ 7, /*5*/ 7, /*6*/ 7, /*7*/ 7, /*8*/ 7, /*9*/ 7, /*-*/ 7, /*+*/ 7, /*(*/ 4, /*)*/ 4, /*!*/ 5, /*?*/ 6, - /*A*/ 7, /*B*/ 7, /*C*/ 7, /*D*/ 7, /*E*/ 7, /*F*/ 7, /*G*/ 7, /*H*/ 7, /*I*/ 7, /*J*/ 7, /*K*/ 7, /*L*/ 7, /*M*/ 7, /*N*/ 7, /*O*/ 7, /*P*/ 7, - /*Q*/ 7, /*R*/ 7, /*S*/ 7, /*T*/ 7, /*U*/ 7, /*V*/ 7, /*W*/ 7, /*X*/ 7, /*Y*/ 7, /*Z*/ 7, /*"*/ 5, /*'*/ 2, /*:*/ 3, /*;*/ 3, /*.*/ 3, /*,*/ 3, - /*a*/ 6, /*b*/ 6, /*c*/ 6, /*d*/ 6, /*e*/ 6, /*f*/ 6, /*g*/ 6, /*h*/ 6, /*i*/ 2, /*j*/ 6, /*k*/ 6, /*l*/ 3, /*m*/ 6, /*n*/ 6, /*o*/ 6, /*p*/ 6, - /*q*/ 6, /*r*/ 6, /*s*/ 6, /*t*/ 6, /*u*/ 6, /*v*/ 6, /*w*/ 6, /*x*/ 6, /*y*/ 6, /*z*/ 6, /*~*/ 7, /*¨*/ 6, /*^*/ 7, /*/*/ 6, /*%*/ 6, /*&*/ 7, -}; - #include "level_update.h" -void get_char_from_byte(u8 letter, s32 *textX, s32 *textY, s32 *spaceX, s32 *offsetY) { +void get_char_from_byte(u8 letter, s32 *textX, s32 *textY, s32 *spaceX, s32 *offsetY, s32 font) { *offsetY = 0; + u8 **textKern = segmented_to_virtual(puppyprint_kerning_lut); + u8 *textLen = segmented_to_virtual(textKern[font]); if (letter >= '0' && letter <= '9') { // Line 1 *textX = (letter - '0') * 4; *textY = 0; @@ -680,8 +672,8 @@ void get_char_from_byte(u8 letter, s32 *textX, s32 *textY, s32 *spaceX, s32 *off // This is for the letters that sit differently on the line. It just moves them down a bit. case 'g': *offsetY = 1; break; case 'q': *offsetY = 1; break; - // case 'p': *offsetY = 1; break; - // case 'y': *offsetY = 1; break; + case 'p': if (font == FONT_DEFAULT) *offsetY = 3; break; + case 'y': if (font == FONT_DEFAULT) *offsetY = 1; break; } } @@ -756,7 +748,7 @@ s32 text_iterate_command(const char *str, s32 i, s32 runCMD) { return len; } -s32 get_text_width(const char *str) { +s32 get_text_width(const char *str, s32 font) { s32 i= 0; s32 textPos = 0; s32 wideX = 0; @@ -770,7 +762,7 @@ s32 get_text_width(const char *str) { if (str[i] == '<') { i += text_iterate_command(str, i, FALSE); } - get_char_from_byte(str[i], &textX, &textY, &spaceX, &offsetY); + get_char_from_byte(str[i], &textX, &textY, &spaceX, &offsetY, font); textPos += spaceX + 1; wideX = MAX(textPos, wideX); } @@ -790,7 +782,7 @@ s32 get_text_height(const char *str) { return textPos; } -void print_small_text(s32 x, s32 y, const char *str, s32 align, s32 amount) +void print_small_text(s32 x, s32 y, const char *str, s32 align, s32 amount, s32 font) { s32 textX = 0; s32 textY = 0; @@ -805,6 +797,7 @@ void print_small_text(s32 x, s32 y, const char *str, s32 align, s32 amount) s32 lines = 0; s32 xlu = currEnv[3]; s32 prevxlu = 256; //Set out of bounds, so it will *always* be different at first. + Texture *(*fontTex)[] = segmented_to_virtual(&puppyprint_font_lut); shakeToggle = 0; waveToggle = 0; @@ -825,7 +818,7 @@ void print_small_text(s32 x, s32 y, const char *str, s32 align, s32 amount) if (str[i] == '<') { i += text_iterate_command(str, i, FALSE); } - get_char_from_byte(str[i], &textX, &textY, &spaceX, &offsetY); + get_char_from_byte(str[i], &textX, &textY, &spaceX, &offsetY, font); textPos[0] += spaceX + 1; wideX[lines] = MAX(textPos[0], wideX[lines]); } @@ -842,14 +835,14 @@ void print_small_text(s32 x, s32 y, const char *str, s32 align, s32 amount) if (str[i] == '<') { i += text_iterate_command(str, i, FALSE); } - get_char_from_byte(str[i], &textX, &textY, &spaceX, &offsetY); + get_char_from_byte(str[i], &textX, &textY, &spaceX, &offsetY, font); wideX[lines] = MAX(textPos[0], wideX[lines]); } textPos[0] = -wideX[0]; } lines = 0; - gDPLoadTextureBlock_4b(gDisplayListHead++, segmented_to_virtual(small_font), G_IM_FMT_I, 128, 60, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, 0, 0, 0, 0, 0); + gDPLoadTextureBlock_4b(gDisplayListHead++, (*fontTex)[font], G_IM_FMT_I, 128, 60, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, 0, 0, 0, 0, 0); for (i = 0; i < tx; i++) { if (str[i] == '#') { i++; @@ -876,7 +869,7 @@ void print_small_text(s32 x, s32 y, const char *str, s32 align, s32 amount) } else { wavePos = 0; } - get_char_from_byte(str[i], &textX, &textY, &spaceX, &offsetY); + get_char_from_byte(str[i], &textX, &textY, &spaceX, &offsetY, font); if (xlu != prevxlu) { prevxlu = xlu; if (xlu > 250) { diff --git a/src/game/puppyprint.h b/src/game/puppyprint.h index 0af3ce0b..ffcd06d9 100644 --- a/src/game/puppyprint.h +++ b/src/game/puppyprint.h @@ -2,6 +2,7 @@ #define PUPPYPRINT_H #ifdef PUPPYPRINT +#include "segment2.h" // This is how many indexes of timers are saved at once. higher creates a smoother average, but naturally uses more RAM. 15's fine. #define NUM_PERF_ITERATIONS 15 @@ -17,7 +18,13 @@ #define PRINT_TEXT_ALIGN_RIGHT 2 #define PRINT_ALL -1 -extern Texture small_font[]; +enum PuppyFont { + FONT_DEFAULT, + FONT_OUTLINE, + FONT_NUM, +}; + +extern u8 gPuppyFont; extern s8 perfIteration; extern s16 benchmarkLoop; extern s32 benchmarkTimer; @@ -62,14 +69,13 @@ extern void puppyprint_profiler_finished(void); extern void print_set_envcolour(s32 r, s32 g, s32 b, s32 a); extern void prepare_blank_box(void); extern void finish_blank_box(void); -extern void render_blank_box(s16 x1, s16 y1, s16 x2, s16 y2, u8 r, u8 g, u8 b, u8 a); -extern void print_small_text(s32 x, s32 y, const char *str, s32 align, s32 amount); +extern void print_small_text(s32 x, s32 y, const char *str, s32 align, s32 amount, s32 font); extern void render_multi_image(Texture *image, s32 x, s32 y, s32 width, s32 height, s32 scaleX, s32 scaleY, s32 mode); extern s32 get_text_height(const char *str); -extern s32 get_text_width(const char *str); +extern s32 get_text_width(const char *str, s32 font); extern void prepare_blank_box(void); extern void finish_blank_box(void); -extern void render_blank_box(s16 x1, s16 y1, s16 x2, s16 y2, u8 r, u8 g, u8 b, u8 a); +extern void render_blank_box(s32 x1, s32 y1, s32 x2, s32 y2, s32 r, s32 g, s32 b, s32 a); extern void append_puppyprint_log(const char *str, ...); extern char consoleLogTable[LOG_BUFFER_SIZE][255]; diff --git a/src/game/rendering_graph_node.c b/src/game/rendering_graph_node.c index 50217784..e1a2b343 100644 --- a/src/game/rendering_graph_node.c +++ b/src/game/rendering_graph_node.c @@ -15,6 +15,7 @@ #include "puppyprint.h" #include "debug_box.h" #include "level_update.h" +#include "behavior_data.h" #include "config.h" @@ -965,7 +966,10 @@ void geo_process_object(struct Object *node) { if (node->oIntangibleTimer != -1) { vec3f_set(bnds1, node->oPosX, node->oPosY - node->hitboxDownOffset, node->oPosZ); vec3f_set(bnds2, node->hitboxRadius, node->hitboxHeight-node->hitboxDownOffset, node->hitboxRadius); - debug_box_color(0x800000FF); + if (node->behavior == segmented_to_virtual(bhvWarp) || node->behavior == segmented_to_virtual(bhvDoorWarp) || node->behavior == segmented_to_virtual(bhvFadingWarp)) + debug_box_color(0x80FFA500); + else + debug_box_color(0x800000FF); debug_box(bnds1, bnds2, DEBUG_SHAPE_CYLINDER | DEBUG_UCODE_REJ); vec3f_set(bnds1, node->oPosX, node->oPosY - node->hitboxDownOffset, node->oPosZ); vec3f_set(bnds2, node->hurtboxRadius, node->hurtboxHeight, node->hurtboxRadius); diff --git a/src/game/segment2.h b/src/game/segment2.h index 7eecce54..1d020304 100644 --- a/src/game/segment2.h +++ b/src/game/segment2.h @@ -4,6 +4,9 @@ #include #include +extern void *puppyprint_font_lut[2]; +extern void *puppyprint_kerning_lut[2][80]; + extern u8 seg2_course_name_table[]; extern u8 seg2_act_name_table[]; extern Gfx dl_rgba16_text_begin[]; diff --git a/textures/segment2/custom_text.i4.png b/textures/segment2/custom_text.i4.png index ccecd85f80c1c528ca00be449182fba0ae95a2e6..02dd2d17c379a8fdf962e199cb20fe2e2fc1645a 100644 GIT binary patch delta 2638 zcmexfcTHr1ayb|85lTUd%8G=RK&fV6LVKf0Oj;c%18b;ctddWiprj7jr50FF!xO z+W76;E#>0%>cK1#I)O1gA^ z@zyH&qZ8-Nc;s?>_PeXD$#Zp2C?rnsy!+#b=C+GgI}Q6BkEyg;E&9zmb9!mL+HQ~i z8@BhP&e;iMS=(B^jy6E z#!4yK0Sx&FJ_O>pIJMWsW za3{L?pQeAj(qo|;{dt$JUog%4%Kkm6sDIn9)27S*{_}mHeXywc+UslEYu*2?Kl+zp zk5a|t_)qn#AN*$gaq#2i!(aR4MZ(z|rc2EeoW|bCemXrNyR2vDrRi(8oIEr4Pk@iz zjjuEP4P)NAzF@w)-KWIo`}|+mMBe7Fm^V#5o#X$}bHdIEmN!1B_x~x-Py5t(qhYH1>j?_QjK7|3*R$AccVNz+IqF8o ztt4l&e7o|s@#pmI4gdfB{=RzodDVoyUHkvP6*mfJn(tv>^J7EYe5O}-xW4UNK6CHw z|7#Ea`}=dfeZ1}7`K^05i@kTQXNui$=fu}rKiNA8`T`wm>+na zR4@=-Z2AA!$LB9?yX|JyHdis%RLJ(r6KzBh;E^(p5`AL>l& z_n24z-Yv(#V#F|M%hyly%%csZynkP7JaBLMhn*GY;*SRxEIGgL;_>TpOrJhKGg+qJ zv?bN|cy*MxPPdeN&<5sXKcwdxAI-UW@!o0XV-Ma(3BNU8SoXa6%KU_!*J2|Y%ik?|e5bB+=A%pV%QE&DzHP7GXYMV=dYdt( zAnBIPOSPuH%hSy`cGcb9%lGk2DC z{Iv6X#o2!@F06ey<4yTKot^yWcZ#cja(`UzT(G6F+VIa)lS};HzV!dOKkHh%(r?Q@ zx(S{8tM>0_z3^o3Pt67FpB{KOJ?EGw|3LS@@M-U+bn$upG0er^|DXLM@uWG^?o6kR zOyB(aq5~J^{M&x^JCj^Rt;Y9Phu>B)6fti%TW@aZSo7@gl^ds7=h{DQ>bdBq)80J! zZ0{U9)rPfFw)J{zio^ONuAjJC^L^!8qp!yMYtsw9w(RK8k?KBmI7Z@d>8#1=ey?(m z&Y$Z&!Bl12Hs;T+$DY)zzUPvBnJp^&w0+?IotD@5gOux^$28g%?<`xx@=Ls~@PH2A zL6r?x9fbeKF$ddqu<38Rc5_qnVqOpF7gfU5`3er+%k=-|PG`7#<(%P*KU^*nf}d$E3$AKXgy$tg9?yd0qeR?ZoB5MY^Tx^>T>MeP_U&NvviXxvsJ7b) zt#y_$Ox9WMY4L2z!`-ZmyC%QyS9{HpUjKHxT4`1Ow^wC*k{{TfE<7fA`s<_gNt~Bs zxQ=CiV!q72=|{_%_m(>q{;o{#v5Yac=lsB!`>MP@);adGbhPPwuMMHrxk69wSUlLb zWnQ7|?q4%XHu4-`@9|ui$+x@lO#Zh1m}>SSN7=OzE| zdFyY~tJfcITwQ8wq~jxfL#Q>+BU|O*G`HV5U$URQaLCCl*E!?M^hjd$Wy4nz-!HLD zmVH(=d)@NuTaSJA*B9I2ap7O*k&b%`8&#oT4Z@=PVwrc?Fl$_qX8p!x9?jpR+xso`@Z|cl*+L5z_7z`Gurr&m({qBA z(dWzmCb3MG-F5Aa?3S}PzUXc{fAG-JqN~%Hd>{3+#s)}x+4#soU;QF#eLUj$ z&B+@l`yJ1keWCFFqy+a(hu=9bnY;CwmBi_z|5YQKGMo3Mzmx5;pLB1}$#P{ovwg>U qe}sKG)_i?On!(Nd!{zh;@vHo+dup~&cm)Fk1B0ilpUXO@geCyM@^dl( literal 16247 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 DXE1q! diff --git a/textures/segment2/custom_text2.i4.png b/textures/segment2/custom_text2.i4.png new file mode 100644 index 0000000000000000000000000000000000000000..ccecd85f80c1c528ca00be449182fba0ae95a2e6 GIT binary patch literal 16247 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 DXE1q! literal 0 HcmV?d00001 From 997d481e3a7b42b6913806f57858b17a12f05db9 Mon Sep 17 00:00:00 2001 From: Fazana <52551480+FazanaJ@users.noreply.github.com> Date: Tue, 28 Sep 2021 13:50:40 +0100 Subject: [PATCH 18/97] Update rendering_graph_node.c --- src/game/rendering_graph_node.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/rendering_graph_node.c b/src/game/rendering_graph_node.c index e1a2b343..de90361b 100644 --- a/src/game/rendering_graph_node.c +++ b/src/game/rendering_graph_node.c @@ -427,7 +427,6 @@ void geo_process_perspective(struct GraphNodePerspective *node) { if (gCamera) { // gWorldScale = ((sqr(gCamera->pos[0]) + sqr(gCamera->pos[1]) + sqr(gCamera->pos[2])) / sqr(0x2000)); gWorldScale = (max_3f(ABS(gCamera->pos[0]), ABS(gCamera->pos[1]), ABS(gCamera->pos[2])) / (f32)0x2000); - gWorldScale = MAX(gWorldScale, 1.0f); } else { gWorldScale = 1.0f; } @@ -436,6 +435,7 @@ void geo_process_perspective(struct GraphNodePerspective *node) { farClipDelta /= farClip; gWorldScale *= farClipDelta; } + gWorldScale = MAX(gWorldScale, 1.0f); guPerspective(mtx, &perspNorm, node->fov, sAspectRatio, ((farClip / 300) / gWorldScale), (farClip / gWorldScale), 1.0f); gSPPerspNormalize(gDisplayListHead++, perspNorm); From 4ba22859690fb8a51a0a67205015e7d5d41d9b19 Mon Sep 17 00:00:00 2001 From: Fazana <52551480+FazanaJ@users.noreply.github.com> Date: Tue, 28 Sep 2021 17:39:49 +0100 Subject: [PATCH 19/97] Graph optimisations that actually work now --- Makefile | 12 +- asm/math.s | 46 +++++ sm64.ld | 1 + src/boot/memory.c | 10 +- src/engine/math_util.c | 423 +++++++++++++++++++++++++---------------- 5 files changed, 323 insertions(+), 169 deletions(-) create mode 100644 asm/math.s diff --git a/Makefile b/Makefile index 47259e2e..f8d7885b 100644 --- a/Makefile +++ b/Makefile @@ -153,12 +153,12 @@ LINK_LIBRARIES = $(foreach i,$(LIBRARIES),-l$(i)) ifeq ($(COMPILER),gcc) NON_MATCHING := 1 MIPSISET := -mips3 - OPT_FLAGS := -Os + OPT_FLAGS := -Ofast else ifeq ($(COMPILER),clang) NON_MATCHING := 1 # clang doesn't support ABI 'o32' for 'mips3' MIPSISET := -mips2 - OPT_FLAGS := -Os + OPT_FLAGS := -Ofast endif @@ -197,7 +197,7 @@ UNF ?= 0 $(eval $(call validate-option,UNF,0 1)) ifeq ($(UNF),1) DEFINES += UNF=1 - SRC_DIRS += src/usb + SRC_DIRS += src/usbOfast USE_DEBUG := 1 endif @@ -394,8 +394,8 @@ export LD_LIBRARY_PATH=./tools AS := $(CROSS)as ifeq ($(COMPILER),gcc) CC := $(CROSS)gcc - $(BUILD_DIR)/actors/%.o: OPT_FLAGS := -Os -mlong-calls - $(BUILD_DIR)/levels/%.o: OPT_FLAGS := -Os -mlong-calls + $(BUILD_DIR)/actors/%.o: OPT_FLAGS := -Ofast -mlong-calls + $(BUILD_DIR)/levels/%.o: OPT_FLAGS := -Ofast -mlong-calls else ifeq ($(COMPILER),clang) CC := clang endif @@ -430,7 +430,7 @@ DEF_INC_CFLAGS := $(foreach i,$(INCLUDE_DIRS),-I$(i)) $(C_DEFINES) # C compiler options CFLAGS = -G 0 $(OPT_FLAGS) $(TARGET_CFLAGS) $(MIPSISET) $(DEF_INC_CFLAGS) ifeq ($(COMPILER),gcc) - CFLAGS += -mno-shared -march=vr4300 -mfix4300 -mabi=32 -mhard-float -mdivide-breaks -fno-stack-protector -fno-common -fno-zero-initialized-in-bss -fno-PIC -mno-abicalls -fno-strict-aliasing -fno-inline-functions -ffreestanding -fwrapv -Wall -Wextra -Wno-missing-braces -fno-jump-tables + CFLAGS += -mno-shared -march=vr4300 -mfix4300 -mabi=32 -mhard-float -mdivide-breaks -fno-stack-protector -fno-common -fno-zero-initialized-in-bss -fno-PIC -mno-abicalls -fno-strict-aliasing -fno-inline-functions -ffreestanding -fwrapv -Wall -Wextra -Wno-missing-braces else ifeq ($(COMPILER),clang) CFLAGS += -target mips -mabi=32 -G 0 -mhard-float -fomit-frame-pointer -fno-stack-protector -fno-common -I include -I src/ -I $(BUILD_DIR)/include -fno-PIC -mno-abicalls -fno-strict-aliasing -fno-inline-functions -ffreestanding -fwrapv -Wall -Wextra -Wno-missing-braces -fno-jump-tables else diff --git a/asm/math.s b/asm/math.s new file mode 100644 index 00000000..1649959d --- /dev/null +++ b/asm/math.s @@ -0,0 +1,46 @@ +# assembler directives +.set noat # allow manual use of $at +.set noreorder # don't insert nops after branches +.set gp=64 + +.include "macros.inc" + + +.section .text, "ax" + +.global mtxf_to_mtx_asm +.balign 32 +mtxf_to_mtx_asm: + addiu $v0, $zero, 0x0001 + lui $t2, 0x4780 + mtc1 $t2, $f4 +loop: + lwc1 $f0, 0x0000($a1) + andi $t0, $v0, 0x0002 + mul.s $f0, $f0, $f4 + lwc1 $f2, 0x0004($a1) + trunc.w.s $f0, $f0 + mfc1 $t3, $f0 + addiu $a1, $a1, 0x0008 + sra $t4, $t3, 16 + sh $t4, 0x0000($a0) + sh $t3, 0x0020($a0) + bne $t0, $zero, storezero + addiu $v0, $v0, 0x0002 + mul.s $f2, $f2, $f4 + addiu $t1, $zero, 1 + trunc.w.s $f2, $f2 + mfc1 $t3, $f2 + addiu $v1, $zero, 0x0011 + sra $t4, $t3, 16 + sh $t4, 0x0002($a0) + sh $t3, 0x0022($a0) +loopend: + bne $v0, $v1, loop + addiu $a0, $a0, 0x0004 + jr $ra + sh $t1, -2 ($a0) +storezero: + sh $zero, 0x0002($a0) + j loopend + sh $zero, 0x0022($a0) \ No newline at end of file diff --git a/sm64.ld b/sm64.ld index 28f16fb0..a390d36f 100755 --- a/sm64.ld +++ b/sm64.ld @@ -245,6 +245,7 @@ SECTIONS { BUILD_DIR/src/game*.o(.text); BUILD_DIR/src/engine*.o(.text); + BUILD_DIR/asm/math.o(.text); _engineSegmentTextEnd = .; /* data */ BUILD_DIR/src/game*.o(.*data*); diff --git a/src/boot/memory.c b/src/boot/memory.c index b492fff9..e0914775 100644 --- a/src/boot/memory.c +++ b/src/boot/memory.c @@ -66,7 +66,9 @@ extern struct MainPoolBlock *sPoolListHeadR; */ struct MemoryPool *gEffectsMemoryPool; + uintptr_t sSegmentTable[32]; +uintptr_t sSegmentROMTable[32]; u32 sPoolFreeSpace; u8 *sPoolStart; u8 *sPoolEnd; @@ -337,13 +339,13 @@ void *load_segment(s32 segment, u8 *srcStart, u8 *srcEnd, u32 side, u8 *bssStart addr = dynamic_dma_read(srcStart, srcEnd, side, TLB_PAGE_SIZE, (uintptr_t)bssEnd - (uintptr_t)bssStart); if (addr != NULL) { u8 *realAddr = (u8 *)ALIGN((uintptr_t)addr, TLB_PAGE_SIZE); - set_segment_base_addr(segment, realAddr); + set_segment_base_addr(segment, realAddr); sSegmentROMTable[segment] = (uintptr_t) srcStart; mapTLBPages(segment << 24, VIRTUAL_TO_PHYSICAL(realAddr), (srcEnd - srcStart) + ((uintptr_t)bssEnd - (uintptr_t)bssStart), segment); } } else { addr = dynamic_dma_read(srcStart, srcEnd, side, 0, 0); if (addr != NULL) { - set_segment_base_addr(segment, addr); + set_segment_base_addr(segment, addr); sSegmentROMTable[segment] = (uintptr_t) srcStart; } } #if PUPPYPRINT_DEBUG @@ -418,7 +420,7 @@ void *load_segment_decompress(s32 segment, u8 *srcStart, u8 *srcEnd) { decompress(compressed, dest); #endif osSyncPrintf("end decompress\n"); - set_segment_base_addr(segment, dest); + set_segment_base_addr(segment, dest); sSegmentROMTable[segment] = (uintptr_t) srcStart; main_pool_free(compressed); } } @@ -457,7 +459,7 @@ void *load_segment_decompress_heap(u32 segment, u8 *srcStart, u8 *srcEnd) { #elif MIO0 decompress(compressed, gDecompressionHeap); #endif - set_segment_base_addr(segment, gDecompressionHeap); + set_segment_base_addr(segment, gDecompressionHeap); sSegmentROMTable[segment] = (uintptr_t) srcStart; main_pool_free(compressed); } return gDecompressionHeap; diff --git a/src/engine/math_util.c b/src/engine/math_util.c index 80c3c101..7e4632d6 100644 --- a/src/engine/math_util.c +++ b/src/engine/math_util.c @@ -12,6 +12,10 @@ #include "config.h" +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wreturn-local-addr" +#pragma intrinsic(sqrtf); + /// Returns the lowest of three values. s32 min_3i(s32 a0, s32 a1, s32 a2) { if (a1 < a0) a0 = a1; if (a2 < a0) a0 = a2; return a0; } f32 min_3f(f32 a0, f32 a1, f32 a2) { if (a1 < a0) a0 = a1; if (a2 < a0) a0 = a2; return a0; } @@ -108,36 +112,47 @@ void vec3f_cross(Vec3f dest, Vec3f a, Vec3f b) { /// Scale vector 'dest' so it has length 1 void vec3f_normalize(Vec3f dest) { - f32 invsqrt = sqrtf(sqr(dest[0]) + sqr(dest[1]) + sqr(dest[2])); - if (invsqrt < 0.00001f) return; - invsqrt = 1.0f / invsqrt; - vec3_mul_val(dest, invsqrt); + f32 size = sqrtf(dest[0] * dest[0] + dest[1] * dest[1] + dest[2] * dest[2]); + register f32 invsqrt; + if (size > 0.01f) { + + invsqrt = 1.0f / size; + vec3_mul_val(dest, invsqrt); + /*dest[0] *= invsqrt; + dest[1] *= invsqrt; + dest[2] *= invsqrt;*/ + } else { + dest[0] = 0; + dest[1] = 1; + dest[2] = 0; + } } -/// Copy matrix 'src' to 'dest' -void mtxf_copy(Mat4 dest, Mat4 src) { - register s32 i; - register u32 *d = (u32 *) dest; - register u32 *s = (u32 *) src; +#pragma GCC diagnostic pop +struct CopyMe { + f32 x; f32 y; f32 z; f32 w; + f32 x1; f32 y1; f32 z1; f32 w1; + f32 x2; f32 y2; f32 z2; f32 w2; + f32 x3; f32 y3; f32 z3; f32 w3; +}; - for (i = 0; i < 16; i++) { - *d++ = *s++; - } +/// Copy matrix 'src' to 'dest' +void mtxf_copy(register Mat4 dest, register Mat4 src) { + *((struct CopyMe *) dest) = *((struct CopyMe *) src); } /** * Set mtx to the identity matrix */ -void mtxf_identity(Mat4 mtx) { - register s32 i; - register f32 *dest; - // These loops must be one line to match on -O2 - - // initialize everything except the first and last cells to 0 - for (dest = (f32 *) mtx + 1, i = 0; i < 14; dest++, i++) *dest = 0; - - // initialize the diagonal cells to 1 - for (dest = (f32 *) mtx, i = 0; i < 4; dest += 5, i++) *dest = 1; +void mtxf_identity(register Mat4 mtx) { + s32 i; + f32 *dest; + for (dest = (f32 *) mtx + 1, i = 0; i < 14; dest++, i++) { + *dest = 0; + } + for (dest = (f32 *) mtx, i = 0; i < 4; dest += 5, i++) { + *((u32 *) dest) = 0x3F800000; + } } /** @@ -194,6 +209,14 @@ void mtxf_rot_trans_mul(Vec3s rot, Vec3f trans, Mat4 dest, Mat4 src) { ((u32 *) dest)[15] = 0x3F800000; } +f32 lookAtCalc(f32 sqrtsqrt) { + f32 calc = sqrtf(sqrtsqrt); + if (calc == 0) + calc = 0.00000000001; + + return -1.0 / calc; +} + /** * Set mtx to a look-at matrix for the camera. The resulting transformation * transforms the world as if there exists a camera at position 'from' pointed @@ -201,47 +224,73 @@ void mtxf_rot_trans_mul(Vec3s rot, Vec3f trans, Mat4 dest, Mat4 src) { * angle allows a bank rotation of the camera. */ void mtxf_lookat(Mat4 mtx, Vec3f from, Vec3f to, s32 roll) { - Vec3f colX, colY, colZ; + register f32 invLength; + f32 dx; + f32 dz; + f32 xColY; + f32 yColY; + f32 zColY; + f32 xColZ; + f32 yColZ; + f32 zColZ; + f32 xColX; + f32 yColX; + f32 zColX; + f32 calc; - f32 dx = to[0] - from[0]; - f32 dz = to[2] - from[2]; + dx = to[0] - from[0]; + dz = to[2] - from[2]; - register f32 invLength = -1.0f / MAX(sqrtf(sqr(dx) + sqr(dz)), 0.00001f); + invLength = lookAtCalc(dx * dx + dz * dz); dx *= invLength; dz *= invLength; - colY[1] = coss(roll); - colY[0] = sins(roll) * dz; - colY[2] = -sins(roll) * dx; - vec3_diff(colZ, to, from); + yColY = coss(roll); + xColY = sins(roll) * dz; + zColY = -sins(roll) * dx; - invLength = -1.0f / MAX(sqrtf(sqr(colZ[0]) + sqr(colZ[1]) + sqr(colZ[2])), 0.00001f); - vec3_mul_val(colZ, invLength); + xColZ = to[0] - from[0]; + yColZ = to[1] - from[1]; + zColZ = to[2] - from[2]; - vec3_cross(colX, colY, colZ); + invLength = lookAtCalc(xColZ * xColZ + yColZ * yColZ + zColZ * zColZ); + xColZ *= invLength; + yColZ *= invLength; + zColZ *= invLength; - invLength = 1.0f / MAX(sqrtf(sqr(colX[0]) + sqr(colX[1]) + sqr(colX[2])), 0.00001f); - vec3_mul_val(colX, invLength); + xColX = yColY * zColZ - zColY * yColZ; + yColX = zColY * xColZ - xColY * zColZ; + zColX = xColY * yColZ - yColY * xColZ; - vec3_cross(colY, colZ, colX); + invLength = -lookAtCalc(xColX * xColX + yColX * yColX + zColX * zColX); - invLength = 1.0f / MAX(sqrtf(sqr(colY[0]) + sqr(colY[1]) + sqr(colY[2])), 0.00001f); - vec3_mul_val(colY, invLength); + xColX *= invLength; + yColX *= invLength; + zColX *= invLength; - mtx[0][0] = colX[0]; - mtx[1][0] = colX[1]; - mtx[2][0] = colX[2]; + xColY = yColZ * zColX - zColZ * yColX; + yColY = zColZ * xColX - xColZ * zColX; + zColY = xColZ * yColX - yColZ * xColX; - mtx[0][1] = colY[0]; - mtx[1][1] = colY[1]; - mtx[2][1] = colY[2]; + invLength = -lookAtCalc(xColY * xColY + yColY * yColY + zColY * zColY); + xColY *= invLength; + yColY *= invLength; + zColY *= invLength; - mtx[0][2] = colZ[0]; - mtx[1][2] = colZ[1]; - mtx[2][2] = colZ[2]; - mtx[3][0] = -vec3_dot(from, colX); - mtx[3][1] = -vec3_dot(from, colY); - mtx[3][2] = -vec3_dot(from, colZ); + mtx[0][0] = xColX; + mtx[1][0] = yColX; + mtx[2][0] = zColX; + mtx[3][0] = -(from[0] * xColX + from[1] * yColX + from[2] * zColX); + + mtx[0][1] = xColY; + mtx[1][1] = yColY; + mtx[2][1] = zColY; + mtx[3][1] = -(from[0] * xColY + from[1] * yColY + from[2] * zColY); + + mtx[0][2] = xColZ; + mtx[1][2] = yColZ; + mtx[2][2] = zColZ; + mtx[3][2] = -(from[0] * xColZ + from[1] * yColZ + from[2] * zColZ); mtx[0][3] = 0; mtx[1][3] = 0; @@ -278,8 +327,8 @@ void mtxf_rotate_zxy_and_translate(Mat4 dest, Vec3f translate, Vec3s rotate) { dest[2][2] = cx * cy; dest[3][2] = translate[2]; - dest[0][3] = dest[1][3] = dest[2][3] = 0.0f; - dest[3][3] = 1.0f; + dest[0][3] = dest[1][3] = dest[2][3] = 0.; + ((u32 *) dest)[15] = 0x3F800000; } /** @@ -314,7 +363,7 @@ void mtxf_rotate_xyz_and_translate(Mat4 dest, Vec3f b, Vec3s c) { dest[3][0] = b[0]; dest[3][1] = b[1]; dest[3][2] = b[2]; - dest[3][3] = 1; + ((u32 *) dest)[15] = 0x3F800000; } /** @@ -324,30 +373,28 @@ void mtxf_rotate_xyz_and_translate(Mat4 dest, Vec3f b, Vec3s c) { * 'angle' rotates the object while still facing the camera. */ void mtxf_billboard(Mat4 dest, Mat4 mtx, Vec3f position, s32 angle) { - if (angle == 0x0) { - dest[0][0] = 1; - dest[0][1] = 0; - } else { - dest[0][0] = coss(angle); - dest[0][1] = sins(angle); + register s32 i; + register f32 *temp, *temp2; + temp = dest; + for (i = 0; i < 16; i++) { + *temp = 0; + temp++; } - dest[0][2] = 0; - dest[0][3] = 0; - + dest[0][0] = coss(angle); + dest[0][1] = sins(angle); dest[1][0] = -dest[0][1]; dest[1][1] = dest[0][0]; - dest[1][2] = 0; - dest[1][3] = 0; - - dest[2][0] = 0; - dest[2][1] = 0; - dest[2][2] = 1; + ((u32 *) dest)[10] = 0x3F800000; dest[2][3] = 0; + ((u32 *) dest)[15] = 0x3F800000; - dest[3][0] = mtx[0][0] * position[0] + mtx[1][0] * position[1] + mtx[2][0] * position[2] + mtx[3][0]; - dest[3][1] = mtx[0][1] * position[0] + mtx[1][1] * position[1] + mtx[2][1] * position[2] + mtx[3][1]; - dest[3][2] = mtx[0][2] * position[0] + mtx[1][2] * position[1] + mtx[2][2] * position[2] + mtx[3][2]; - dest[3][3] = 1; + temp = dest; + temp2 = mtx; + for (i = 0; i < 3; i++) { + temp[12] = temp2[0] * position[0] + temp2[4] * position[1] + temp2[8] * position[2] + temp2[12]; + temp++; + temp2++; + } } /** @@ -371,15 +418,25 @@ void mtxf_align_terrain_normal(Mat4 dest, Vec3f upDir, Vec3f pos, s32 yaw) { vec3_cross(forwardDir, leftDir, upDir); vec3f_normalize(forwardDir); - vec3f_copy(dest[0], leftDir); - vec3f_copy(dest[1], upDir); - vec3f_copy(dest[2], forwardDir); - vec3f_copy(dest[3], pos); + dest[0][0] = leftDir[0]; + dest[0][1] = leftDir[1]; + dest[0][2] = leftDir[2]; + dest[3][0] = pos[0]; - dest[0][3] = 0.0f; - dest[1][3] = 0.0f; - dest[2][3] = 0.0f; - dest[3][3] = 1.0f; + dest[1][0] = upDir[0]; + dest[1][1] = upDir[1]; + dest[1][2] = upDir[2]; + dest[3][1] = pos[1]; + + dest[2][0] = forwardDir[0]; + dest[2][1] = forwardDir[1]; + dest[2][2] = forwardDir[2]; + dest[3][2] = pos[2]; + + dest[0][3] = 0; + dest[1][3] = 0; + dest[2][3] = 0; + ((u32 *) dest)[15] = 0x3F800000; } /** @@ -391,10 +448,14 @@ void mtxf_align_terrain_normal(Mat4 dest, Vec3f upDir, Vec3f pos, s32 yaw) { * 'radius' is the distance from each triangle vertex to the center */ void mtxf_align_terrain_triangle(Mat4 mtx, Vec3f pos, s32 yaw, f32 radius) { - struct Surface *floor; - Vec3f point0, point1, point2; + struct Surface *sp74; + Vec3f point0; + Vec3f point1; + Vec3f point2; Vec3f forward; - Vec3f xColumn, yColumn, zColumn; + Vec3f xColumn; + Vec3f yColumn; + Vec3f zColumn; f32 avgY; f32 minY = -radius * 3; @@ -405,9 +466,9 @@ void mtxf_align_terrain_triangle(Mat4 mtx, Vec3f pos, s32 yaw, f32 radius) { point2[0] = pos[0] + radius * sins(yaw + 0xD555); point2[2] = pos[2] + radius * coss(yaw + 0xD555); - point0[1] = find_floor(point0[0], pos[1] + 150, point0[2], &floor); - point1[1] = find_floor(point1[0], pos[1] + 150, point1[2], &floor); - point2[1] = find_floor(point2[0], pos[1] + 150, point2[2], &floor); + point0[1] = find_floor(point0[0], pos[1] + 150, point0[2], &sp74); + point1[1] = find_floor(point1[0], pos[1] + 150, point1[2], &sp74); + point2[1] = find_floor(point2[0], pos[1] + 150, point2[2], &sp74); if (point0[1] - pos[1] < minY) { point0[1] = pos[1]; @@ -421,27 +482,35 @@ void mtxf_align_terrain_triangle(Mat4 mtx, Vec3f pos, s32 yaw, f32 radius) { point2[1] = pos[1]; } - avgY = (point0[1] + point1[1] + point2[1]) / 3; + avgY = (point0[1] + point1[1] + point2[1]) * .3333333333333333333333333333333333333333333333f; - vec3_set(forward, sins(yaw), 0, coss(yaw)); + vec3f_set(forward, sins(yaw), 0, coss(yaw)); find_vector_perpendicular_to_plane(yColumn, point0, point1, point2); vec3f_normalize(yColumn); - vec3_cross(xColumn, yColumn, forward); + vec3f_cross(xColumn, yColumn, forward); vec3f_normalize(xColumn); - vec3_cross(zColumn, xColumn, yColumn); + vec3f_cross(zColumn, xColumn, yColumn); vec3f_normalize(zColumn); - vec3f_copy(mtx[0], xColumn); - vec3f_copy(mtx[1], yColumn); - vec3f_copy(mtx[2], zColumn); + mtx[0][0] = xColumn[0]; + mtx[0][1] = xColumn[1]; + mtx[0][2] = xColumn[2]; mtx[3][0] = pos[0]; + + mtx[1][0] = yColumn[0]; + mtx[1][1] = yColumn[1]; + mtx[1][2] = yColumn[2]; mtx[3][1] = (avgY < pos[1]) ? pos[1] : avgY; + + mtx[2][0] = zColumn[0]; + mtx[2][1] = zColumn[1]; + mtx[2][2] = zColumn[2]; mtx[3][2] = pos[2]; mtx[0][3] = 0; mtx[1][3] = 0; mtx[2][3] = 0; - mtx[3][3] = 1; + ((u32 *) mtx)[15] = 0x3F800000; } /** @@ -453,50 +522,45 @@ void mtxf_align_terrain_triangle(Mat4 mtx, Vec3f pos, s32 yaw, f32 radius) { * then a. */ void mtxf_mul(Mat4 dest, Mat4 a, Mat4 b) { - Mat4 temp; - register Vec3f entry; - - // column 0 - vec3_copy(entry, a[0]); - temp[0][0] = entry[0] * b[0][0] + entry[1] * b[1][0] + entry[2] * b[2][0]; - temp[0][1] = entry[0] * b[0][1] + entry[1] * b[1][1] + entry[2] * b[2][1]; - temp[0][2] = entry[0] * b[0][2] + entry[1] * b[1][2] + entry[2] * b[2][2]; - - // column 1 - vec3_copy(entry, a[1]); - temp[1][0] = entry[0] * b[0][0] + entry[1] * b[1][0] + entry[2] * b[2][0]; - temp[1][1] = entry[0] * b[0][1] + entry[1] * b[1][1] + entry[2] * b[2][1]; - temp[1][2] = entry[0] * b[0][2] + entry[1] * b[1][2] + entry[2] * b[2][2]; - - // column 2 - vec3_copy(entry, a[2]); - temp[2][0] = entry[0] * b[0][0] + entry[1] * b[1][0] + entry[2] * b[2][0]; - temp[2][1] = entry[0] * b[0][1] + entry[1] * b[1][1] + entry[2] * b[2][1]; - temp[2][2] = entry[0] * b[0][2] + entry[1] * b[1][2] + entry[2] * b[2][2]; - - // column 3 - vec3_copy(entry, a[3]); - temp[3][0] = entry[0] * b[0][0] + entry[1] * b[1][0] + entry[2] * b[2][0] + b[3][0]; - temp[3][1] = entry[0] * b[0][1] + entry[1] * b[1][1] + entry[2] * b[2][1] + b[3][1]; - temp[3][2] = entry[0] * b[0][2] + entry[1] * b[1][2] + entry[2] * b[2][2] + b[3][2]; - - temp[0][3] = temp[1][3] = temp[2][3] = 0; - temp[3][3] = 1; - - mtxf_copy(dest, temp); + register f32 entry0; + register f32 entry1; + register f32 entry2; + register f32 *temp = a; + register f32 *temp2 = dest; + register f32 *temp3; + register s32 i; + for (i = 0; i < 16; i++) { + entry0 = temp[0]; + entry1 = temp[1]; + entry2 = temp[2]; + temp3 = b; + for (; (i & 3) !=3; i++) { + *temp2 = entry0 * temp3[0] + entry1 * temp3[4] + entry2 * temp3[8]; + temp2++; + temp3++; + } + *temp2 = 0; + temp += 4; + temp2++; + } + vec3f_add(&dest[3][0], &b[3][0]); + ((u32 *) dest)[15] = 0x3F800000; } /** * Set matrix 'dest' to 'mtx' scaled by vector s */ -void mtxf_scale_vec3f(Mat4 dest, Mat4 mtx, Vec3f s) { +void mtxf_scale_vec3f(Mat4 dest, Mat4 mtx, register Vec3f s) { + register f32 *temp = dest; + register f32 *temp2 = mtx; register s32 i; - for (i = 0; i < 4; i++) { - dest[0][i] = mtx[0][i] * s[0]; - dest[1][i] = mtx[1][i] * s[1]; - dest[2][i] = mtx[2][i] * s[2]; - dest[3][i] = mtx[3][i]; + temp[0] = temp2[0] * s[0]; + temp[4] = temp2[4] * s[1]; + temp[8] = temp2[8] * s[2]; + temp[12] = temp2[12]; + temp++; + temp2++; } } @@ -509,10 +573,14 @@ void mtxf_mul_vec3s(Mat4 mtx, Vec3s b) { register f32 x = b[0]; register f32 y = b[1]; register f32 z = b[2]; - - b[0] = x * mtx[0][0] + y * mtx[1][0] + z * mtx[2][0] + mtx[3][0]; - b[1] = x * mtx[0][1] + y * mtx[1][1] + z * mtx[2][1] + mtx[3][1]; - b[2] = x * mtx[0][2] + y * mtx[1][2] + z * mtx[2][2] + mtx[3][2]; + register f32 *temp2 = mtx; + register s32 i; + register s16 *c = b; + for (i = 0; i < 3; i++) { + c[0] = x * temp2[0] + y * temp2[4] + z * temp2[8] + temp2[12]; + c++; + temp2++; + } } /** @@ -562,14 +630,36 @@ void mtxf_to_mtx(void *dest, void *src) { /** * Set 'mtx' to a transformation matrix that rotates around the z axis. */ +#define MATENTRY(a, b) \ + ((s16 *) mtx)[a] = ((s32) b) >> 16; \ + ((s16 *) mtx)[a + 16] = ((s32) b) & 0xFFFF; void mtxf_rotate_xy(Mtx *mtx, s32 angle) { - Mat4 temp; - mtxf_identity(temp); - temp[0][0] = coss(angle); - temp[0][1] = sins(angle); - temp[1][0] = -temp[0][1]; - temp[1][1] = temp[0][0]; - mtxf_to_mtx(mtx, temp); + register s32 i = coss(angle) * 65536; + register s32 j = sins(angle) * 65536; + register f32 *temp = mtx; + register s32 k; + for (k = 0; k < 16; k++) { + *temp = 0; + temp++; + } + MATENTRY(0, i) + MATENTRY(1, j) + //((s32 *) mtx)[1] = 0; + MATENTRY(4, -j) + MATENTRY(5, i) + /*((s32 *) mtx)[3] = 0; + ((s32 *) mtx)[4] = 0; + ((s32 *) mtx)[5] = 0; + ((s32 *) mtx)[6] = 0; + ((s32 *) mtx)[7] = 0; + ((s32 *) mtx)[9] = 0; + ((s32 *) mtx)[11] = 0; + ((s32 *) mtx)[12] = 0; + ((s32 *) mtx)[13] = 0; + ((s32 *) mtx)[14] = 0; + ((s32 *) mtx)[15] = 0;*/ + ((s16 *) mtx)[10] = 1; + ((s16 *) mtx)[15] = 1; } /** @@ -580,14 +670,27 @@ void mtxf_rotate_xy(Mtx *mtx, s32 angle) { * objMtx back from screen orientation to world orientation, and then subtracting * the camera position. */ -void get_pos_from_transform_mtx(Vec3f dest, Mat4 objMtx, Mat4 camMtx) { - f32 camX = camMtx[3][0] * camMtx[0][0] + camMtx[3][1] * camMtx[0][1] + camMtx[3][2] * camMtx[0][2]; - f32 camY = camMtx[3][0] * camMtx[1][0] + camMtx[3][1] * camMtx[1][1] + camMtx[3][2] * camMtx[1][2]; - f32 camZ = camMtx[3][0] * camMtx[2][0] + camMtx[3][1] * camMtx[2][1] + camMtx[3][2] * camMtx[2][2]; +void get_pos_from_transform_mtx(Vec3f dest, Mat4 objMtx, register Mat4 camMtx) { + register s32 i; + register f32 *temp = dest; + register f32 *temp2 = camMtx; + f32 y[3]; + register f32 *x = y; + register f32 *temp3 = objMtx; + + for (i = 0; i < 3; i++) { + *x = (temp3[12] - temp2[12]); + temp2++; + temp3++; + x = ((u32)x)+4; + } + temp2 -=3;; + for (i = 0; i < 3; i++) { + *temp = x[-3] * temp2[0] + x[-2] * temp2[1] + x[-1] * temp2[2]; + temp++; + temp2 += 4; + } - dest[0] = objMtx[3][0] * camMtx[0][0] + objMtx[3][1] * camMtx[0][1] + objMtx[3][2] * camMtx[0][2] - camX; - dest[1] = objMtx[3][0] * camMtx[1][0] + objMtx[3][1] * camMtx[1][1] + objMtx[3][2] * camMtx[1][2] - camY; - dest[2] = objMtx[3][0] * camMtx[2][0] + objMtx[3][1] * camMtx[2][1] + objMtx[3][2] * camMtx[2][2] - camZ; } @@ -682,12 +785,15 @@ void vec3f_get_lateral_dist_and_angle(Vec3f from, Vec3f to, f32 *lateralDist, An /// Finds the distance and angles between two vectors. void vec3f_get_dist_and_angle(Vec3f from, Vec3f to, f32 *dist, s16 *pitch, s16 *yaw) { - register Vec3f d; - vec3_diff(d, to, from); - register f32 xz = sqr(d[0]) + sqr(d[2]); - *dist = sqrtf(xz + sqr(d[1])); - *pitch = atan2s(sqrtf(xz), d[1]); - *yaw = atan2s(d[2], d[0]); + register f32 x = to[0] - from[0]; + register f32 y = to[1] - from[1]; + register f32 z = to[2] - from[2]; + register f32 xs = x * x; + register f32 zs = z * z; + + *dist = sqrtf(xs + zs); + *pitch = atan2s(sqrtf(xs + zs), y); + *yaw = atan2s(z, x); } void vec3s_get_dist_and_angle(Vec3s from, Vec3s to, s16 *dist, Angle *pitch, Angle *yaw) { Vec3s d; @@ -714,10 +820,9 @@ void vec3f_get_dist_and_lateral_dist_and_angle(Vec3f from, Vec3f to, f32 *dist, * and has the angles pitch and yaw. */ void vec3f_set_dist_and_angle(Vec3f from, Vec3f to, f32 dist, s32 pitch, s32 yaw) { - register f32 dcos = (dist * coss(pitch)); - to[0] = (from[0] + (dcos * sins(yaw ))); - to[1] = (from[1] + (dist * sins(pitch))); - to[2] = (from[2] + (dcos * coss(yaw ))); + to[0] = from[0] + dist * coss(pitch) * sins(yaw); + to[1] = from[1] + dist * sins(pitch); + to[2] = from[2] + dist * coss(pitch) * coss(yaw); } void vec3s_set_dist_and_angle(Vec3s from, Vec3s to, s16 dist, Angle32 pitch, Angle32 yaw) { register f32 dcos = (dist * coss(pitch)); From e562c6543bf74d730c7d4615932333593c9c5776 Mon Sep 17 00:00:00 2001 From: Fazana <52551480+FazanaJ@users.noreply.github.com> Date: Tue, 28 Sep 2021 17:52:42 +0100 Subject: [PATCH 20/97] Remove profiler.c It's in its own commit, so if you for some reason disagree with this, reverting it is super easy. --- src/boot/main.c | 25 --- src/engine/level_script.c | 2 - src/game/area.c | 4 +- src/game/game_init.c | 8 - src/game/level_update.c | 2 +- src/game/main.h | 1 - src/game/object_list_processor.c | 1 - src/game/profiler.c | 306 ------------------------------- src/game/profiler.h | 51 ------ src/game/sound_init.c | 3 - 10 files changed, 4 insertions(+), 399 deletions(-) delete mode 100644 src/game/profiler.c delete mode 100644 src/game/profiler.h diff --git a/src/boot/main.c b/src/boot/main.c index b4b447b9..74ec296b 100644 --- a/src/boot/main.c +++ b/src/boot/main.c @@ -8,7 +8,6 @@ #include "game/game_init.h" #include "game/memory.h" #include "game/sound_init.h" -#include "game/profiler.h" #include "buffers/buffers.h" #include "segments.h" #include "game/main.h" @@ -71,27 +70,14 @@ s8 gDebugLevelSelect = TRUE; s8 gDebugLevelSelect = FALSE; #endif -s8 gShowProfiler = FALSE; s8 gShowDebugText = FALSE; // unused void handle_debug_key_sequences(void) { - static u16 sProfilerKeySequence[] = { - U_JPAD, U_JPAD, D_JPAD, D_JPAD, L_JPAD, R_JPAD, L_JPAD, R_JPAD - }; static u16 sDebugTextKeySequence[] = { D_JPAD, D_JPAD, U_JPAD, U_JPAD, L_JPAD, R_JPAD, L_JPAD, R_JPAD }; - static s16 sProfilerKey = 0; static s16 sDebugTextKey = 0; if (gPlayer3Controller->buttonPressed != 0) { - if (sProfilerKeySequence[sProfilerKey++] == gPlayer3Controller->buttonPressed) { - if (sProfilerKey == ARRAY_COUNT(sProfilerKeySequence)) { - sProfilerKey = 0, gShowProfiler ^= 1; - } - } else { - sProfilerKey = 0; - } - if (sDebugTextKeySequence[sDebugTextKey++] == gPlayer3Controller->buttonPressed) { if (sDebugTextKey == ARRAY_COUNT(sDebugTextKeySequence)) { sDebugTextKey = 0, gShowDebugText ^= 1; @@ -192,7 +178,6 @@ void interrupt_gfx_sptask(void) { void start_gfx_sptask(void) { if (gActiveSPTask == NULL && sCurrentDisplaySPTask != NULL && sCurrentDisplaySPTask->state == SPTASK_STATE_NOT_STARTED) { - profiler_log_gfx_time(TASKS_QUEUED); #if PUPPYPRINT_DEBUG rspDelta = osGetTime(); #endif @@ -224,7 +209,6 @@ void handle_vblank(void) { if (gActiveSPTask != NULL) { interrupt_gfx_sptask(); } else { - profiler_log_vblank_time(); if (sAudioEnabled) { start_sptask(M_AUDTASK); } else { @@ -234,7 +218,6 @@ void handle_vblank(void) { } else { if (gActiveSPTask == NULL && sCurrentDisplaySPTask != NULL && sCurrentDisplaySPTask->state != SPTASK_STATE_FINISHED) { - profiler_log_gfx_time(TASKS_QUEUED); #if PUPPYPRINT_DEBUG rspDelta = osGetTime(); #endif @@ -267,11 +250,9 @@ void handle_sp_complete(void) { #if PUPPYPRINT_DEBUG profiler_update(rspGenTime, rspDelta); #endif - profiler_log_gfx_time(RSP_COMPLETE); } // Start the audio task, as expected by handle_vblank. - profiler_log_vblank_time(); if (sAudioEnabled) { start_sptask(M_AUDTASK); } else { @@ -281,12 +262,8 @@ void handle_sp_complete(void) { curSPTask->state = SPTASK_STATE_FINISHED; if (curSPTask->task.t.type == M_AUDTASK) { // After audio tasks come gfx tasks. - profiler_log_vblank_time(); if (sCurrentDisplaySPTask != NULL && sCurrentDisplaySPTask->state != SPTASK_STATE_FINISHED) { - if (sCurrentDisplaySPTask->state != SPTASK_STATE_INTERRUPTED) { - profiler_log_gfx_time(TASKS_QUEUED); - } start_sptask(M_GFXTASK); } sCurrentAudioSPTask = NULL; @@ -300,7 +277,6 @@ void handle_sp_complete(void) { #if PUPPYPRINT_DEBUG profiler_update(rspGenTime, rspDelta); #endif - profiler_log_gfx_time(RSP_COMPLETE); } } } @@ -310,7 +286,6 @@ void handle_dp_complete(void) { if (sCurrentDisplaySPTask->msgqueue != NULL) { osSendMesg(sCurrentDisplaySPTask->msgqueue, sCurrentDisplaySPTask->msg, OS_MESG_NOBLOCK); } - profiler_log_gfx_time(RDP_COMPLETE); sCurrentDisplaySPTask->state = SPTASK_STATE_FINISHED_DP; sCurrentDisplaySPTask = NULL; } diff --git a/src/engine/level_script.c b/src/engine/level_script.c index bc2df6db..c22544fa 100644 --- a/src/engine/level_script.c +++ b/src/engine/level_script.c @@ -13,7 +13,6 @@ #include "game/memory.h" #include "game/object_helpers.h" #include "game/object_list_processor.h" -#include "game/profiler.h" #include "game/save_file.h" #include "game/sound_init.h" #include "goddard/renderer.h" @@ -961,7 +960,6 @@ struct LevelCommand *level_script_execute(struct LevelCommand *cmd) { LevelScriptJumpTable[sCurrentCmd->type](); } - profiler_log_thread5_time(LEVEL_SCRIPT_EXECUTE); init_rcp(CLEAR_ZBUFFER); render_game(); end_master_display_list(); diff --git a/src/game/area.c b/src/game/area.c index ca298033..88c61e64 100644 --- a/src/game/area.c +++ b/src/game/area.c @@ -369,7 +369,9 @@ void play_transition_after_delay(s16 transType, s16 time, u8 red, u8 green, u8 b void render_game(void) { if (gCurrentArea != NULL && !gWarpTransition.pauseRendering) { - geo_process_root(gCurrentArea->graphNode, gViewportOverride, gViewportClip, gFBSetColor); + if (gCurrentArea->graphNode) { + geo_process_root(gCurrentArea->graphNode, gViewportOverride, gViewportClip, gFBSetColor); + } gSPViewport(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(&gViewport)); diff --git a/src/game/game_init.c b/src/game/game_init.c index 3e192dbe..689aace3 100644 --- a/src/game/game_init.c +++ b/src/game/game_init.c @@ -11,7 +11,6 @@ #include "game_init.h" #include "main.h" #include "memory.h" -#include "profiler.h" #include "save_file.h" #include "seq_ids.h" #include "sound_init.h" @@ -322,9 +321,6 @@ void init_rcp(s32 resetZB) { */ void end_master_display_list(void) { draw_screen_borders(); - if (gShowProfiler) { - draw_profiler(); - } gDPFullSync(gDisplayListHead++); gSPEndDisplayList(gDisplayListHead++); @@ -415,7 +411,6 @@ void display_and_vsync(void) { gIsConsole = 1; gBorderHeight = BORDER_HEIGHT_CONSOLE; } - profiler_log_thread5_time(BEFORE_DISPLAY_LISTS); //gIsConsole = (IO_READ(DPC_PIPEBUSY_REG)); osRecvMesg(&gGfxVblankQueue, &gMainReceivedMesg, OS_MESG_BLOCK); if (gGoddardVblankCallback != NULL) { @@ -423,10 +418,8 @@ void display_and_vsync(void) { gGoddardVblankCallback = NULL; } exec_display_list(&gGfxPool->spTask); - profiler_log_thread5_time(AFTER_DISPLAY_LISTS); osRecvMesg(&gGameVblankQueue, &gMainReceivedMesg, OS_MESG_BLOCK); osViSwapBuffer((void *) PHYSICAL_TO_VIRTUAL(gPhysicalFrameBuffers[sRenderedFramebuffer])); - profiler_log_thread5_time(THREAD5_END); osRecvMesg(&gGameVblankQueue, &gMainReceivedMesg, OS_MESG_BLOCK); // Skip swapping buffers on emulator so that they display immediately as the Gfx task finishes if (gIsConsole || gIsVC) { // Read RDP Clock Register, has a value of zero on emulators @@ -741,7 +734,6 @@ void thread5_game_loop(UNUSED void *arg) { draw_reset_bars(); continue; } - profiler_log_thread5_time(THREAD5_START); #if PUPPYPRINT_DEBUG while (TRUE) { lastTime = osGetTime(); diff --git a/src/game/level_update.c b/src/game/level_update.c index cc76124b..3036436c 100644 --- a/src/game/level_update.c +++ b/src/game/level_update.c @@ -1335,7 +1335,7 @@ s32 lvl_set_current_level(UNUSED s16 arg0, s32 levelNum) { return 0; } - if (gDebugLevelSelect && !gShowProfiler) { + if (gDebugLevelSelect) { return 0; } diff --git a/src/game/main.h b/src/game/main.h index e175a768..2eed3225 100644 --- a/src/game/main.h +++ b/src/game/main.h @@ -65,7 +65,6 @@ extern u32 gNumVblanks; extern s8 gResetTimer; extern s8 gNmiResetBarsTimer; extern s8 gDebugLevelSelect; -extern s8 gShowProfiler; extern s8 gShowDebugText; void set_vblank_handler(s32 index, struct VblankHandler *handler, OSMesgQueue *queue, OSMesg *msg); diff --git a/src/game/object_list_processor.c b/src/game/object_list_processor.c index 659be2e2..ebdf8456 100644 --- a/src/game/object_list_processor.c +++ b/src/game/object_list_processor.c @@ -18,7 +18,6 @@ #include "object_helpers.h" #include "object_list_processor.h" #include "platform_displacement.h" -#include "profiler.h" #include "spawn_object.h" #include "puppyprint.h" #include "puppylights.h" diff --git a/src/game/profiler.c b/src/game/profiler.c deleted file mode 100644 index c834d739..00000000 --- a/src/game/profiler.c +++ /dev/null @@ -1,306 +0,0 @@ -#include - -#include "sm64.h" -#include "profiler.h" -#include "game_init.h" - -s16 gProfilerMode = 0; - -// the thread 3 info is logged on the opposite profiler from what is used by -// the thread4 and 5 loggers. It's likely because the sound thread runs at a -// much faster rate and shouldn't be flipping the index for the "slower" game -// threads, which could leave the frame data in a possibly corrupt or incomplete -// state. -s16 gCurrentFrameIndex1 = 1; -s16 gCurrentFrameIndex2 = 0; - -struct ProfilerFrameData gProfilerFrameData[2]; - -// log the current osTime to the appropriate idx for current thread5 processes. -void profiler_log_thread5_time(enum ProfilerGameEvent eventID) { - gProfilerFrameData[gCurrentFrameIndex1].gameTimes[eventID] = osGetTime(); - - // event ID 4 is the last profiler event for after swapping - // buffers: switch the Info after updating. - if (eventID == THREAD5_END) { - gCurrentFrameIndex1 ^= 1; - gProfilerFrameData[gCurrentFrameIndex1].numSoundTimes = 0; - } -} - -// log the audio system before and after osTimes in pairs to the soundTimes array. -void profiler_log_thread4_time(void) { - struct ProfilerFrameData *profiler = &gProfilerFrameData[gCurrentFrameIndex1]; - - if (profiler->numSoundTimes < ARRAY_COUNT(profiler->soundTimes)) { - profiler->soundTimes[profiler->numSoundTimes++] = osGetTime(); - } -} - -// log the times for gfxTimes: RSP completes, and RDP completes. -void profiler_log_gfx_time(enum ProfilerGfxEvent eventID) { - if (eventID == TASKS_QUEUED) { - gCurrentFrameIndex2 ^= 1; - gProfilerFrameData[gCurrentFrameIndex2].numVblankTimes = 0; - } - - gProfilerFrameData[gCurrentFrameIndex2].gfxTimes[eventID] = osGetTime(); -} - -// log the times between vblank started and ended. -void profiler_log_vblank_time(void) { - struct ProfilerFrameData *profiler = &gProfilerFrameData[gCurrentFrameIndex2]; - - if (profiler->numVblankTimes < ARRAY_COUNT(profiler->vblankTimes)) { - profiler->vblankTimes[profiler->numVblankTimes++] = osGetTime(); - } -} - -// draw the specified profiler given the information passed. -void draw_profiler_bar(OSTime clockBase, OSTime clockStart, OSTime clockEnd, s16 posY, u16 color) { - s64 durationStart, durationEnd; - s32 rectX1, rectX2; - - // set the duration to start, and floor to 0 if the result is below 0. - if ((durationStart = clockStart - clockBase) < 0) { - durationStart = 0; - } - // like the above, but with end. - if ((durationEnd = clockEnd - clockBase) < 0) { - durationEnd = 0; - } - - // calculate the x coordinates of where start and end begins, respectively. - rectX1 = ((((durationStart * 1000000) / osClockRate * 3) / 1000) + 30); - rectX2 = ((((durationEnd * 1000000) / osClockRate * 3) / 1000) + 30); - - //! I believe this is supposed to cap rectX1 and rectX2 to 320, but the - // code seems to use the wrong variables... it's possible that the variable - // names were very similar within a single letter. - if (rectX1 > 319) { - clockStart = 319; - } - if (rectX2 > 319) { - clockEnd = 319; - } - - // perform the render if start is less than end. in most cases, it should be. - if (rectX1 < rectX2) { - gDPPipeSync(gDisplayListHead++); - gDPSetFillColor(gDisplayListHead++, color << 16 | color); - gDPFillRectangle(gDisplayListHead++, rectX1, posY, rectX2, posY + 2); - } -} - -void draw_reference_profiler_bars(void) { - // Draws the reference "max" bars underneath the real thing. - - // Blue - gDPPipeSync(gDisplayListHead++); - gDPSetFillColor(gDisplayListHead++, - GPACK_RGBA5551(40, 80, 255, 1) << 16 | GPACK_RGBA5551(40, 80, 255, 1)); - gDPFillRectangle(gDisplayListHead++, 30, 220, 79, 222); - - // Yellow - gDPPipeSync(gDisplayListHead++); - gDPSetFillColor(gDisplayListHead++, - GPACK_RGBA5551(255, 255, 40, 1) << 16 | GPACK_RGBA5551(255, 255, 40, 1)); - gDPFillRectangle(gDisplayListHead++, 79, 220, 128, 222); - - // Orange - gDPPipeSync(gDisplayListHead++); - gDPSetFillColor(gDisplayListHead++, - GPACK_RGBA5551(255, 120, 40, 1) << 16 | GPACK_RGBA5551(255, 120, 40, 1)); - gDPFillRectangle(gDisplayListHead++, 128, 220, 177, 222); - - // Red - gDPPipeSync(gDisplayListHead++); - gDPSetFillColor(gDisplayListHead++, - GPACK_RGBA5551(255, 40, 40, 1) << 16 | GPACK_RGBA5551(255, 40, 40, 1)); - gDPFillRectangle(gDisplayListHead++, 177, 220, 226, 222); -} - -/* - Draw Profiler Mode 1. This mode draws a traditional per-event bar for durations of tasks - recorded by the profiler calls of various threads. - - Information: - - (yellow): Level Scripts Execution - (orange): Rendering - (blue): Display Lists Send - (red): Sound Updates - (yellow): Time from SP tasks queued to RSP complete - (orange): Time from RSP complete to RDP complete (possibly bugged, see //! note below) - (red): VBlank Times -*/ -void draw_profiler_mode_1(void) { - s32 i; - struct ProfilerFrameData *profiler; - OSTime clockBase; - - // the profiler logs 2 frames of data: last frame and current frame. Indexes are used - // to keep track of the current frame, so the index is xor'd to retrieve the last frame's - // data. - profiler = &gProfilerFrameData[gCurrentFrameIndex1 ^ 1]; - - // calculate the clockBase. - clockBase = profiler->soundTimes[0] - (16433 * osClockRate / 1000000); - - // draw the profiler for the time it takes for level scripts to execute. (yellow) - draw_profiler_bar(clockBase, profiler->gameTimes[0], profiler->gameTimes[1], 212, - GPACK_RGBA5551(255, 255, 40, 1)); - - // draw the profiler for the time it takes for the game to render (between level scripts and - // pre-display lists). (orange) - draw_profiler_bar(clockBase, profiler->gameTimes[1], profiler->gameTimes[2], 212, - GPACK_RGBA5551(255, 120, 40, 1)); - - // draw the profiler for the time it takes for the display lists to send. (blue) - draw_profiler_bar(clockBase, profiler->gameTimes[2], profiler->gameTimes[3], 212, - GPACK_RGBA5551(40, 192, 230, 1)); - - // we need to get the amount of finished numSoundTimes pairs, so get rid of the odd bit to get the - // limit of finished pairs. - profiler->numSoundTimes &= 0xFFFE; - - // draw the sound update times. (red) - for (i = 0; i < profiler->numSoundTimes; i += 2) { - draw_profiler_bar(clockBase, profiler->soundTimes[i], profiler->soundTimes[i + 1], 212, - GPACK_RGBA5551(255, 40, 40, 1)); - } - - //! RSP and RDP run in parallel, so while they are not absolutely guaranteed to return in order, - // it is theoretically possible they might not. In all cases, the RDP should finish later than RSP. - // Thus, this is not really a bug in practice, but should still be noted that the C doesn't check - // this. - draw_profiler_bar(clockBase, profiler->gfxTimes[0], profiler->gfxTimes[1], 216, - GPACK_RGBA5551(255, 255, 40, 1)); - // (orange) - draw_profiler_bar(clockBase, profiler->gfxTimes[1], profiler->gfxTimes[2], 216, - GPACK_RGBA5551(255, 120, 40, 1)); - - // like earlier, toss the odd bit. - profiler->numVblankTimes &= 0xFFFE; - - // render the vblank time pairs. (red) - for (i = 0; i < profiler->numVblankTimes; i += 2) { - draw_profiler_bar(clockBase, profiler->vblankTimes[i], profiler->vblankTimes[i + 1], 216, - GPACK_RGBA5551(255, 40, 40, 1)); - } - - draw_reference_profiler_bars(); -} - -/* - Draw Profiler Mode 0. This mode renders bars over each other to make it - easier to see which processes take the longest. - - Information: - - (red): Sound Updates - (yellow): Level Script Execution - (orange): Rendering - (orange): RDP Duration - (yellow): RSP Duration - (red): VBlank Duration -*/ -void draw_profiler_mode_0(void) { - s32 i; - struct ProfilerFrameData *profiler; - - u64 clockStart; - u64 levelScriptDuration; - u64 renderDuration; - u64 taskStart; - u64 rspDuration; - u64 rdpDuration; - u64 vblank; - u64 soundDuration; - - // get the last frame profiler. gCurrentFrameIndex1 has the current frame being processed, so - // xor it to get the last frame profiler. - profiler = &gProfilerFrameData[gCurrentFrameIndex1 ^ 1]; - - // was thread 5 ran before thread 4? set the lower one to be the clockStart. - clockStart = profiler->gameTimes[0] <= profiler->soundTimes[0] ? profiler->gameTimes[0] - : profiler->soundTimes[0]; - - // set variables for duration of tasks. - levelScriptDuration = profiler->gameTimes[1] - clockStart; - renderDuration = profiler->gameTimes[2] - profiler->gameTimes[1]; - taskStart = 0; - rspDuration = profiler->gfxTimes[1] - profiler->gfxTimes[0]; - rdpDuration = profiler->gfxTimes[2] - profiler->gfxTimes[0]; - vblank = 0; - - // like above functions, toss the odd bit. - profiler->numSoundTimes &= 0xFFFE; - - // sound duration seems to be rendered with empty space and not actually drawn. - for (i = 0; i < profiler->numSoundTimes; i += 2) { - // calculate sound duration of max - min - soundDuration = profiler->soundTimes[i + 1] - profiler->soundTimes[i]; - taskStart += soundDuration; - // was the sound time minimum less than level script execution? - if (profiler->soundTimes[i] < profiler->gameTimes[1]) { - // overlay the levelScriptDuration onto the profiler by subtracting the soundDuration. - levelScriptDuration -= soundDuration; - } else if (profiler->soundTimes[i] < profiler->gameTimes[2]) { - // overlay the renderDuration onto the profiler by subtracting the soundDuration. - renderDuration -= soundDuration; - } - } - - // same as above. toss the odd bit. - profiler->numSoundTimes &= 0xFFFE; - - //! wrong index used to retrieve vblankTimes, thus empty pairs can - // potentially be passed to draw_profiler_bar, because it could be sending - // pairs that are beyond the numVblankTimes enforced non-odd limit, due to - // using the wrong num value. - for (i = 0; i < profiler->numSoundTimes; i += 2) { - vblank += (profiler->vblankTimes[i + 1] - profiler->vblankTimes[i]); - } - - // Draw top profilers. - - // draw sound duration as the first bar. (red) - clockStart = 0; - draw_profiler_bar(0, clockStart, clockStart + taskStart, 212, GPACK_RGBA5551(255, 40, 40, 1)); - - // draw level script execution duration. (yellow) - clockStart += taskStart; - draw_profiler_bar(0, clockStart, clockStart + levelScriptDuration, 212, - GPACK_RGBA5551(255, 255, 40, 1)); - - // draw render duration. (orange) - clockStart += levelScriptDuration; - draw_profiler_bar(0, clockStart, clockStart + renderDuration, 212, - GPACK_RGBA5551(255, 120, 40, 1)); - - // Draw bottom profilers. - - // rdp duration (orange) - draw_profiler_bar(0, 0, rdpDuration, 216, GPACK_RGBA5551(255, 120, 40, 1)); - // rsp duration (yellow) - draw_profiler_bar(0, 0, rspDuration, 216, GPACK_RGBA5551(255, 255, 40, 1)); - // vblank duration (red) - draw_profiler_bar(0, 0, vblank, 216, GPACK_RGBA5551(255, 40, 40, 1)); - - draw_reference_profiler_bars(); -} - -// Draw the Profiler per frame. Toggle the mode if the player presses L while this -// renderer is active. -void draw_profiler(void) { - if (gPlayer1Controller->buttonPressed & L_TRIG) { - gProfilerMode ^= 1; - } - - if (gProfilerMode == 0) { - draw_profiler_mode_0(); - } else { - draw_profiler_mode_1(); - } -} diff --git a/src/game/profiler.h b/src/game/profiler.h deleted file mode 100644 index 0bb66a58..00000000 --- a/src/game/profiler.h +++ /dev/null @@ -1,51 +0,0 @@ -#ifndef PROFILER_H -#define PROFILER_H - -#include -#include - -#include "types.h" - -extern u64 osClockRate; - -struct ProfilerFrameData { - /* 0x00 */ s16 numSoundTimes; - /* 0x02 */ s16 numVblankTimes; - // gameTimes: - // 0: thread 5 start - // 1: level script execution - // 2: render - // 3: display lists - // 4: thread 4 end (0 terminated) - /* 0x08 */ OSTime gameTimes[5]; - // gfxTimes: - // 0: processors queued - // 1: rsp completed - // 2: rdp completed - /* 0x30 */ OSTime gfxTimes[3]; - /* 0x48 */ OSTime soundTimes[8]; - /* 0x88 */ OSTime vblankTimes[8]; -}; - -// thread event IDs -enum ProfilerGameEvent { - THREAD5_START, - LEVEL_SCRIPT_EXECUTE, - BEFORE_DISPLAY_LISTS, - AFTER_DISPLAY_LISTS, - THREAD5_END -}; - -enum ProfilerGfxEvent { - TASKS_QUEUED, - RSP_COMPLETE, - RDP_COMPLETE -}; - -void profiler_log_thread5_time(enum ProfilerGameEvent eventID); -void profiler_log_thread4_time(void); -void profiler_log_gfx_time(enum ProfilerGfxEvent eventID); -void profiler_log_vblank_time(void); -void draw_profiler(void); - -#endif // PROFILER_H diff --git a/src/game/sound_init.c b/src/game/sound_init.c index d8d50d2a..94b4c869 100644 --- a/src/game/sound_init.c +++ b/src/game/sound_init.c @@ -9,7 +9,6 @@ #include "main.h" #include "paintings.h" #include "print.h" -#include "profiler.h" #include "save_file.h" #include "seq_ids.h" #include "sm64.h" @@ -358,12 +357,10 @@ void thread4_sound(UNUSED void *arg) { #endif if (gResetTimer < 25) { struct SPTask *spTask; - profiler_log_thread4_time(); spTask = create_next_audio_frame_task(); if (spTask != NULL) { dispatch_audio_sptask(spTask); } - profiler_log_thread4_time(); #if PUPPYPRINT_DEBUG profiler_update(audioTime, lastTime); audioTime[perfIteration] -= dmaAudioTime[perfIteration]; From 501a0caec0311045afb6d9be0db6d7713be33b11 Mon Sep 17 00:00:00 2001 From: Fazana <52551480+FazanaJ@users.noreply.github.com> Date: Tue, 28 Sep 2021 18:03:24 +0100 Subject: [PATCH 21/97] Update Makefile --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index f8d7885b..21bf3cfe 100644 --- a/Makefile +++ b/Makefile @@ -197,7 +197,7 @@ UNF ?= 0 $(eval $(call validate-option,UNF,0 1)) ifeq ($(UNF),1) DEFINES += UNF=1 - SRC_DIRS += src/usbOfast + SRC_DIRS += src/usb USE_DEBUG := 1 endif From 6bad22d98cd85285693e5e5d009ec0f8f19634a9 Mon Sep 17 00:00:00 2001 From: Fazana <52551480+FazanaJ@users.noreply.github.com> Date: Tue, 28 Sep 2021 18:44:57 +0100 Subject: [PATCH 22/97] Specific cflags --- Makefile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Makefile b/Makefile index 21bf3cfe..3ed89661 100644 --- a/Makefile +++ b/Makefile @@ -576,6 +576,9 @@ $(BUILD_DIR)/src/usb/usb.o: OPT_FLAGS := -O0 $(BUILD_DIR)/src/usb/usb.o: CFLAGS += -Wno-unused-variable -Wno-sign-compare -Wno-unused-function $(BUILD_DIR)/src/usb/debug.o: OPT_FLAGS := -O0 $(BUILD_DIR)/src/usb/debug.o: CFLAGS += -Wno-unused-parameter -Wno-maybe-uninitialized +$(BUILD_DIR)/src/engine/surface_collision.o: OPT_FLAGS := -Os +$(BUILD_DIR)/src/audio/*.o: OPT_FLAGS := -Os -fno-jump-tables +$(BUILD_DIR)/src/game/*.o: OPT_FLAGS := -Ofast ALL_DIRS := $(BUILD_DIR) $(addprefix $(BUILD_DIR)/,$(SRC_DIRS) asm/debug $(GODDARD_SRC_DIRS) $(LIBZ_SRC_DIRS) $(ULTRA_BIN_DIRS) $(BIN_DIRS) $(TEXTURE_DIRS) $(TEXT_DIRS) $(SOUND_SAMPLE_DIRS) $(addprefix levels/,$(LEVEL_DIRS)) rsp include) $(YAY0_DIR) $(addprefix $(YAY0_DIR)/,$(VERSION)) $(SOUND_BIN_DIR) $(SOUND_BIN_DIR)/sequences/$(VERSION) @@ -589,6 +592,7 @@ $(BUILD_DIR)/src/game/ingame_menu.o: $(BUILD_DIR)/include/text_strings.h $(BUILD_DIR)/src/game/puppycam2.o: $(BUILD_DIR)/include/text_strings.h + #==============================================================================# # Texture Generation # #==============================================================================# From c89858ebd216aa99d298972449ced511869ef330 Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Tue, 28 Sep 2021 12:17:53 -0700 Subject: [PATCH 23/97] Make obj_set_opacity_from_cam_dist its own function --- src/engine/behavior_script.c | 44 ++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/src/engine/behavior_script.c b/src/engine/behavior_script.c index 05631ff5..ee839837 100644 --- a/src/engine/behavior_script.c +++ b/src/engine/behavior_script.c @@ -93,6 +93,30 @@ void obj_update_gfx_pos_and_angle(struct Object *obj) { obj->header.gfx.angle[2] = obj->oFaceAngleRoll & 0xFFFF; } +#ifdef OBJ_OPACITY_BY_CAM_DIST +void obj_set_opacity_from_cam_dist(struct Object *obj) { + f32 dist; + Vec3f d; + if (obj->header.gfx.node.flags & GRAPH_RENDER_BILLBOARD) { + d[0] = (obj->oPosX - gCamera->pos[0]); + d[2] = (obj->oPosZ - gCamera->pos[2]); + dist = (sqr(d[0]) + sqr(d[2])); + } else { + vec3_diff(d, &obj->oPosVec, gCamera->pos); + dist = (sqr(d[0]) + sqr(d[1]) + sqr(d[2])); + } + if (dist > 0.0f) { + obj->header.gfx.node.flags &= ~GRAPH_RENDER_UCODE_REJ; + } +#ifdef PUPPYCAM + s32 opacityDist = ((gPuppyCam.zoom > 0) ? ((dist / sqr(gPuppyCam.zoom)) * 255.0f) : 255); +#else + s32 opacityDist = (dist * (255.0f / sqr(1024.0f))); +#endif + obj->oOpacity = CLAMP(opacityDist, 0x00, 0xFF); +} +#endif + // Push the address of a behavior command to the object's behavior stack. static void cur_obj_bhv_stack_push(uintptr_t bhvAddr) { gCurrentObject->bhvStack[gCurrentObject->bhvStackIndex] = bhvAddr; @@ -976,25 +1000,7 @@ void cur_obj_update(void) { #ifdef OBJ_OPACITY_BY_CAM_DIST if (objFlags & OBJ_FLAG_OPACITY_FROM_CAMERA_DIST) { - f32 dist; - Vec3f d; - if (gCurrentObject->header.gfx.node.flags & GRAPH_RENDER_BILLBOARD) { - d[0] = (gCurrentObject->oPosX - gCamera->pos[0]); - d[2] = (gCurrentObject->oPosZ - gCamera->pos[2]); - dist = (sqr(d[0]) + sqr(d[2])); - } else { - vec3_diff(d, &gCurrentObject->oPosVec, gCamera->pos); - dist = (sqr(d[0]) + sqr(d[1]) + sqr(d[2])); - } - if (dist > 0.0f) { - gCurrentObject->header.gfx.node.flags &= ~GRAPH_RENDER_UCODE_REJ; - } -#ifdef PUPPYCAM - s32 opacityDist = ((gPuppyCam.zoom > 0) ? ((dist / sqr(gPuppyCam.zoom)) * 255.0f) : 255); -#else - s32 opacityDist = (dist * (255.0f / sqr(1024.0f))); -#endif - gCurrentObject->oOpacity = CLAMP(opacityDist, 0x00, 0xFF); + obj_set_opacity_from_cam_dist(gCurrentObject); } #endif From 79d7b7e4b99ccebfaeb0eed95087bcc19c2543ca Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Tue, 28 Sep 2021 12:36:26 -0700 Subject: [PATCH 24/97] Add COS defines --- include/sm64.h | 25 +++++++++++++++++++++++++ src/game/mario.c | 28 ++++++++++++++-------------- src/game/mario_actions_airborne.c | 6 +++--- src/game/mario_actions_automatic.c | 2 +- src/game/mario_actions_moving.c | 4 ++-- src/game/mario_actions_stationary.c | 4 ++-- src/game/mario_step.c | 3 +-- src/game/object_helpers.c | 9 +++++++-- 8 files changed, 55 insertions(+), 26 deletions(-) diff --git a/include/sm64.h b/include/sm64.h index efdfe675..ed793c27 100644 --- a/include/sm64.h +++ b/include/sm64.h @@ -29,6 +29,31 @@ #define SET_HIGH_U16_OF_32(var, x) ((var) = ((var) & 0xFFFF) | ((x) << 16)) #define SET_HIGH_S16_OF_32(var, x) ((var) = ((var) & 0xFFFF) | ((x) << 16)) +// Common cos values for degrees, often used for surface Y normals +// These are different than coss() +#define COS1 0.9998477f +#define COS5 0.9961947f +#define COS10 0.9848077f +#define COS15 0.9659258f +#define COS20 0.9396926f +#define COS25 0.9063078f // ledge grabs +#define COS30 0.8660254f +#define COS35 0.85264016f +#define COS36 0.8443279f +#define COS38 0.7880108f // mario_floor_is_slippery default +#define COS40 0.80901699f +#define COS45 0.76040596f +#define COS50 0.70710678f // SURFACE_FLAG_X_PROJECTION +#define COS55 0.64944805f +#define COS60 0.58778525f +#define COS65 0.52249856f +#define COS70 0.4539905f +#define COS73 0.29237169f // common_landing_cancels, check_common_idle_cancels, check_common_hold_idle_cancels +#define COS75 0.38268343f +#define COS78 0.20791169f +#define COS80 0.17364818f // braking action +#define COS85 0.23344536f + enum RenderLayers { LAYER_FORCE, diff --git a/src/game/mario.c b/src/game/mario.c index 273de3b1..b009a256 100644 --- a/src/game/mario.c +++ b/src/game/mario.c @@ -533,15 +533,15 @@ s32 mario_facing_downhill(struct MarioState *m, s32 turnYaw) { u32 mario_floor_is_slippery(struct MarioState *m) { f32 normY; - if ((m->area->terrainType & TERRAIN_MASK) == TERRAIN_SLIDE && m->floor->normal.y < 0.9998477f) { //~cos(1 deg) + if ((m->area->terrainType & TERRAIN_MASK) == TERRAIN_SLIDE && m->floor->normal.y < COS1) { return TRUE; } switch (mario_get_floor_class(m)) { - case SURFACE_VERY_SLIPPERY: normY = 0.9848077f; break; //~cos(10 deg) - case SURFACE_SLIPPERY: normY = 0.9396926f; break; //~cos(20 deg) - default: normY = 0.7880108f; break; //~cos(38 deg) - case SURFACE_NOT_SLIPPERY: normY = 0.0f; break; + case SURFACE_VERY_SLIPPERY: normY = COS10; break; + case SURFACE_SLIPPERY: normY = COS20; break; + default: normY = COS38; break; + case SURFACE_NOT_SLIPPERY: normY = 0.0f; break; } return m->floor->normal.y <= normY; @@ -554,15 +554,15 @@ s32 mario_floor_is_slope(struct MarioState *m) { f32 normY; if ((m->area->terrainType & TERRAIN_MASK) == TERRAIN_SLIDE - && m->floor->normal.y < 0.9998477f) { // ~cos(1 deg) + && m->floor->normal.y < COS1) { return TRUE; } switch (mario_get_floor_class(m)) { - case SURFACE_VERY_SLIPPERY: normY = 0.9961947f; break; // ~cos(5 deg) - case SURFACE_SLIPPERY: normY = 0.9848077f; break; // ~cos(10 deg) - default: normY = 0.9659258f; break; // ~cos(15 deg) - case SURFACE_NOT_SLIPPERY: normY = 0.9396926f; break; // ~cos(20 deg) + case SURFACE_VERY_SLIPPERY: normY = COS5; break; + case SURFACE_SLIPPERY: normY = COS10; break; + default: normY = COS15; break; + case SURFACE_NOT_SLIPPERY: normY = COS20; break; } return m->floor->normal.y <= normY; @@ -586,10 +586,10 @@ s32 mario_floor_is_steep(struct MarioState *m) { // This does not matter in vanilla game practice. if (!mario_facing_downhill(m, FALSE)) { switch (mario_get_floor_class(m)) { - case SURFACE_VERY_SLIPPERY: normY = 0.9659258f; break; // ~cos(15 deg) - case SURFACE_SLIPPERY: normY = 0.9396926f; break; // ~cos(20 deg) - default: normY = 0.8660254f; break; // ~cos(30 deg) - case SURFACE_NOT_SLIPPERY: normY = 0.8660254f; break; // ~cos(30 deg) + case SURFACE_VERY_SLIPPERY: normY = COS15; break; + case SURFACE_SLIPPERY: normY = COS20; break; + default: normY = COS30; break; + case SURFACE_NOT_SLIPPERY: normY = COS30; break; } result = m->floor->normal.y <= normY; diff --git a/src/game/mario_actions_airborne.c b/src/game/mario_actions_airborne.c index 7966975c..23192561 100644 --- a/src/game/mario_actions_airborne.c +++ b/src/game/mario_actions_airborne.c @@ -128,7 +128,7 @@ s32 should_get_stuck_in_ground(struct MarioState *m) { #else if (floor != NULL && (terrainType == TERRAIN_SNOW || terrainType == TERRAIN_SAND) && type != SURFACE_BURNING && SURFACE_IS_NOT_HARD(type)) { - if (!(flags & 0x01) && m->peakHeight - m->pos[1] > 1000.0f && floor->normal.y >= 0.8660254f) { + if (!(flags & 0x01) && m->peakHeight - m->pos[1] > 1000.0f && floor->normal.y >= COS30) { return TRUE; } } @@ -1445,7 +1445,7 @@ s32 act_butt_slide_air(struct MarioState *m) { switch (perform_air_step(m, 0)) { case AIR_STEP_LANDED: - if (m->actionState == 0 && m->vel[1] < 0.0f && m->floor->normal.y >= 0.9848077f) { + if (m->actionState == 0 && m->vel[1] < 0.0f && m->floor->normal.y >= COS10) { m->vel[1] = -m->vel[1] / 2.0f; m->actionState = 1; } else { @@ -1484,7 +1484,7 @@ s32 act_hold_butt_slide_air(struct MarioState *m) { switch (perform_air_step(m, 0)) { case AIR_STEP_LANDED: - if (m->actionState == 0 && m->vel[1] < 0.0f && m->floor->normal.y >= 0.9848077f) { + if (m->actionState == 0 && m->vel[1] < 0.0f && m->floor->normal.y >= COS10) { m->vel[1] = -m->vel[1] / 2.0f; m->actionState = 1; } else { diff --git a/src/game/mario_actions_automatic.c b/src/game/mario_actions_automatic.c index 96340613..5cbd080a 100644 --- a/src/game/mario_actions_automatic.c +++ b/src/game/mario_actions_automatic.c @@ -561,7 +561,7 @@ s32 act_ledge_grab(struct MarioState *m) { m->actionTimer++; } #ifndef NO_FALSE_LEDGEGRABS - if (m->floor->normal.y < 0.9063078f) { + if (m->floor->normal.y < COS25) { return let_go_of_ledge(m); } #endif diff --git a/src/game/mario_actions_moving.c b/src/game/mario_actions_moving.c index db316f5d..ab153e9b 100644 --- a/src/game/mario_actions_moving.c +++ b/src/game/mario_actions_moving.c @@ -538,7 +538,7 @@ s32 begin_braking_action(struct MarioState *m) { return set_mario_action(m, ACT_STANDING_AGAINST_WALL, 0); } - if (m->forwardVel >= 16.0f && m->floor->normal.y >= 0.17364818f) { + if (m->forwardVel >= 16.0f && m->floor->normal.y >= COS80) { return set_mario_action(m, ACT_BRAKING, 0); } @@ -1784,7 +1784,7 @@ s32 common_landing_cancels(struct MarioState *m, struct LandingAction *landingAc //! Everything here, including floor steepness, is checked before checking // if Mario is actually on the floor. This leads to e.g. remote sliding. - if (m->floor->normal.y < 0.2923717f) { + if (m->floor->normal.y < COS73) { return mario_push_off_steep_floor(m, landingAction->verySteepAction, 0); } diff --git a/src/game/mario_actions_stationary.c b/src/game/mario_actions_stationary.c index f6950fc7..4aa2d109 100644 --- a/src/game/mario_actions_stationary.c +++ b/src/game/mario_actions_stationary.c @@ -19,7 +19,7 @@ s32 check_common_idle_cancels(struct MarioState *m) { mario_drop_held_object(m); - if (m->floor->normal.y < 0.29237169f) { + if (m->floor->normal.y < COS73) { return mario_push_off_steep_floor(m, ACT_FREEFALL, 0); } @@ -60,7 +60,7 @@ s32 check_common_idle_cancels(struct MarioState *m) { } s32 check_common_hold_idle_cancels(struct MarioState *m) { - if (m->floor->normal.y < 0.29237169f) { + if (m->floor->normal.y < COS73) { return mario_push_off_steep_floor(m, ACT_HOLD_FREEFALL, 0); } diff --git a/src/game/mario_step.c b/src/game/mario_step.c index 3a2d5002..5bc69cf2 100644 --- a/src/game/mario_step.c +++ b/src/game/mario_step.c @@ -519,8 +519,7 @@ s32 perform_air_quarter_step(struct MarioState *m, Vec3f intendedPos, u32 stepAr set_mario_floor(m, floor, ledgePos[1]); m->faceAngle[0] = 0; m->faceAngle[1] = atan2s(grabbedWall->normal.z, grabbedWall->normal.x) + 0x8000; - } - else { + } else { vec3f_copy(m->pos, nextPos); set_mario_floor(m, floor, floorHeight); } diff --git a/src/game/object_helpers.c b/src/game/object_helpers.c index cedeabeb..7f6e9bb6 100644 --- a/src/game/object_helpers.c +++ b/src/game/object_helpers.c @@ -1652,8 +1652,13 @@ void cur_obj_move_standard(s16 steepSlopeAngleDegrees) { careAboutEdgesAndSteepSlopes = TRUE; steepSlopeAngleDegrees = -steepSlopeAngleDegrees; // clang-format on } - - steepSlopeNormalY = coss(steepSlopeAngleDegrees * (0x10000 / 360)); + if (steepSlopeAngleDegrees == 78) { + steepSlopeNormalY = COS78; + } else if (steepSlopeAngleDegrees == -78) { + steepSlopeNormalY = -COS78; + } else { + steepSlopeNormalY = coss(DEGREES(steepSlopeAngleDegrees)); + } cur_obj_compute_vel_xz(); cur_obj_apply_drag_xz(dragStrength); From cefd4b62ab5e10d4d90683f7e6f1ba1d7d1fe489 Mon Sep 17 00:00:00 2001 From: Fazana <52551480+FazanaJ@users.noreply.github.com> Date: Tue, 28 Sep 2021 21:52:00 +0100 Subject: [PATCH 25/97] Held object fix --- src/engine/math_util.c | 82 ++++++++++++--------------------- src/game/rendering_graph_node.c | 14 ++++-- 2 files changed, 38 insertions(+), 58 deletions(-) diff --git a/src/engine/math_util.c b/src/engine/math_util.c index 7e4632d6..610984b6 100644 --- a/src/engine/math_util.c +++ b/src/engine/math_util.c @@ -37,7 +37,7 @@ void vec3f_set(Vec3f dest, f32 x, f32 y, f32 z) { /// Add vector 'a' to 'dest' void vec3f_add(Vec3f dest, Vec3f a) { - register f32 *temp = dest; + register f32 *temp = (f32 *)dest; register s32 j; register f32 sum, sum2; for (j = 0; j < 3; j++) { @@ -118,9 +118,6 @@ void vec3f_normalize(Vec3f dest) { invsqrt = 1.0f / size; vec3_mul_val(dest, invsqrt); - /*dest[0] *= invsqrt; - dest[1] *= invsqrt; - dest[2] *= invsqrt;*/ } else { dest[0] = 0; dest[1] = 1; @@ -160,7 +157,7 @@ void mtxf_identity(register Mat4 mtx) { */ void mtxf_translate(Mat4 dest, Vec3f b) { mtxf_identity(dest); - vec3f_copy(dest[3], b); + vec3_copy(dest[3], b); } void mtxf_rot_trans_mul(Vec3s rot, Vec3f trans, Mat4 dest, Mat4 src) { @@ -212,7 +209,7 @@ void mtxf_rot_trans_mul(Vec3s rot, Vec3f trans, Mat4 dest, Mat4 src) { f32 lookAtCalc(f32 sqrtsqrt) { f32 calc = sqrtf(sqrtsqrt); if (calc == 0) - calc = 0.00000000001; + calc = 0.001f; return -1.0 / calc; } @@ -236,7 +233,6 @@ void mtxf_lookat(Mat4 mtx, Vec3f from, Vec3f to, s32 roll) { f32 xColX; f32 yColX; f32 zColX; - f32 calc; dx = to[0] - from[0]; dz = to[2] - from[2]; @@ -375,7 +371,7 @@ void mtxf_rotate_xyz_and_translate(Mat4 dest, Vec3f b, Vec3s c) { void mtxf_billboard(Mat4 dest, Mat4 mtx, Vec3f position, s32 angle) { register s32 i; register f32 *temp, *temp2; - temp = dest; + temp = (f32 *)dest; for (i = 0; i < 16; i++) { *temp = 0; temp++; @@ -388,8 +384,8 @@ void mtxf_billboard(Mat4 dest, Mat4 mtx, Vec3f position, s32 angle) { dest[2][3] = 0; ((u32 *) dest)[15] = 0x3F800000; - temp = dest; - temp2 = mtx; + temp = (f32 *)dest; + temp2 = (f32 *)mtx; for (i = 0; i < 3; i++) { temp[12] = temp2[0] * position[0] + temp2[4] * position[1] + temp2[8] * position[2] + temp2[12]; temp++; @@ -448,7 +444,7 @@ void mtxf_align_terrain_normal(Mat4 dest, Vec3f upDir, Vec3f pos, s32 yaw) { * 'radius' is the distance from each triangle vertex to the center */ void mtxf_align_terrain_triangle(Mat4 mtx, Vec3f pos, s32 yaw, f32 radius) { - struct Surface *sp74; + struct Surface *floor; Vec3f point0; Vec3f point1; Vec3f point2; @@ -466,9 +462,9 @@ void mtxf_align_terrain_triangle(Mat4 mtx, Vec3f pos, s32 yaw, f32 radius) { point2[0] = pos[0] + radius * sins(yaw + 0xD555); point2[2] = pos[2] + radius * coss(yaw + 0xD555); - point0[1] = find_floor(point0[0], pos[1] + 150, point0[2], &sp74); - point1[1] = find_floor(point1[0], pos[1] + 150, point1[2], &sp74); - point2[1] = find_floor(point2[0], pos[1] + 150, point2[2], &sp74); + point0[1] = find_floor(point0[0], pos[1] + 150, point0[2], &floor); + point1[1] = find_floor(point1[0], pos[1] + 150, point1[2], &floor); + point2[1] = find_floor(point2[0], pos[1] + 150, point2[2], &floor); if (point0[1] - pos[1] < minY) { point0[1] = pos[1]; @@ -482,29 +478,21 @@ void mtxf_align_terrain_triangle(Mat4 mtx, Vec3f pos, s32 yaw, f32 radius) { point2[1] = pos[1]; } - avgY = (point0[1] + point1[1] + point2[1]) * .3333333333333333333333333333333333333333333333f; + avgY = (point0[1] + point1[1] + point2[1]) / 3; - vec3f_set(forward, sins(yaw), 0, coss(yaw)); + vec3_set(forward, sins(yaw), 0, coss(yaw)); find_vector_perpendicular_to_plane(yColumn, point0, point1, point2); vec3f_normalize(yColumn); - vec3f_cross(xColumn, yColumn, forward); + vec3_cross(xColumn, yColumn, forward); vec3f_normalize(xColumn); - vec3f_cross(zColumn, xColumn, yColumn); + vec3_cross(zColumn, xColumn, yColumn); vec3f_normalize(zColumn); + vec3f_copy(mtx[0], xColumn); + vec3f_copy(mtx[1], yColumn); + vec3f_copy(mtx[2], zColumn); - mtx[0][0] = xColumn[0]; - mtx[0][1] = xColumn[1]; - mtx[0][2] = xColumn[2]; mtx[3][0] = pos[0]; - - mtx[1][0] = yColumn[0]; - mtx[1][1] = yColumn[1]; - mtx[1][2] = yColumn[2]; mtx[3][1] = (avgY < pos[1]) ? pos[1] : avgY; - - mtx[2][0] = zColumn[0]; - mtx[2][1] = zColumn[1]; - mtx[2][2] = zColumn[2]; mtx[3][2] = pos[2]; mtx[0][3] = 0; @@ -525,15 +513,15 @@ void mtxf_mul(Mat4 dest, Mat4 a, Mat4 b) { register f32 entry0; register f32 entry1; register f32 entry2; - register f32 *temp = a; - register f32 *temp2 = dest; + register f32 *temp = (f32 *)a; + register f32 *temp2 = (f32 *)dest; register f32 *temp3; register s32 i; for (i = 0; i < 16; i++) { entry0 = temp[0]; entry1 = temp[1]; entry2 = temp[2]; - temp3 = b; + temp3 = (f32 *)b; for (; (i & 3) !=3; i++) { *temp2 = entry0 * temp3[0] + entry1 * temp3[4] + entry2 * temp3[8]; temp2++; @@ -543,7 +531,7 @@ void mtxf_mul(Mat4 dest, Mat4 a, Mat4 b) { temp += 4; temp2++; } - vec3f_add(&dest[3][0], &b[3][0]); + vec3_add(&dest[3][0], &b[3][0]); ((u32 *) dest)[15] = 0x3F800000; } @@ -551,9 +539,10 @@ void mtxf_mul(Mat4 dest, Mat4 a, Mat4 b) { * Set matrix 'dest' to 'mtx' scaled by vector s */ void mtxf_scale_vec3f(Mat4 dest, Mat4 mtx, register Vec3f s) { - register f32 *temp = dest; - register f32 *temp2 = mtx; + register f32 *temp = (f32 *)dest; + register f32 *temp2 = (f32 *)mtx; register s32 i; + for (i = 0; i < 4; i++) { temp[0] = temp2[0] * s[0]; temp[4] = temp2[4] * s[1]; @@ -573,7 +562,7 @@ void mtxf_mul_vec3s(Mat4 mtx, Vec3s b) { register f32 x = b[0]; register f32 y = b[1]; register f32 z = b[2]; - register f32 *temp2 = mtx; + register f32 *temp2 = (f32 *)mtx; register s32 i; register s16 *c = b; for (i = 0; i < 3; i++) { @@ -636,7 +625,7 @@ void mtxf_to_mtx(void *dest, void *src) { void mtxf_rotate_xy(Mtx *mtx, s32 angle) { register s32 i = coss(angle) * 65536; register s32 j = sins(angle) * 65536; - register f32 *temp = mtx; + register f32 *temp = (f32 *)mtx; register s32 k; for (k = 0; k < 16; k++) { *temp = 0; @@ -644,20 +633,8 @@ void mtxf_rotate_xy(Mtx *mtx, s32 angle) { } MATENTRY(0, i) MATENTRY(1, j) - //((s32 *) mtx)[1] = 0; MATENTRY(4, -j) MATENTRY(5, i) - /*((s32 *) mtx)[3] = 0; - ((s32 *) mtx)[4] = 0; - ((s32 *) mtx)[5] = 0; - ((s32 *) mtx)[6] = 0; - ((s32 *) mtx)[7] = 0; - ((s32 *) mtx)[9] = 0; - ((s32 *) mtx)[11] = 0; - ((s32 *) mtx)[12] = 0; - ((s32 *) mtx)[13] = 0; - ((s32 *) mtx)[14] = 0; - ((s32 *) mtx)[15] = 0;*/ ((s16 *) mtx)[10] = 1; ((s16 *) mtx)[15] = 1; } @@ -672,11 +649,11 @@ void mtxf_rotate_xy(Mtx *mtx, s32 angle) { */ void get_pos_from_transform_mtx(Vec3f dest, Mat4 objMtx, register Mat4 camMtx) { register s32 i; - register f32 *temp = dest; - register f32 *temp2 = camMtx; + register f32 *temp = (f32 *)dest; + register f32 *temp2 = (f32 *)camMtx; f32 y[3]; register f32 *x = y; - register f32 *temp3 = objMtx; + register f32 *temp3 = (f32 *)objMtx; for (i = 0; i < 3; i++) { *x = (temp3[12] - temp2[12]); @@ -690,7 +667,6 @@ void get_pos_from_transform_mtx(Vec3f dest, Mat4 objMtx, register Mat4 camMtx) { temp++; temp2 += 4; } - } diff --git a/src/game/rendering_graph_node.c b/src/game/rendering_graph_node.c index de90361b..06c53c17 100644 --- a/src/game/rendering_graph_node.c +++ b/src/game/rendering_graph_node.c @@ -16,6 +16,7 @@ #include "debug_box.h" #include "level_update.h" #include "behavior_data.h" +#include "string.h" #include "config.h" @@ -350,12 +351,13 @@ void geo_append_display_list(void *displayList, s32 layer) { } } -void incrementMatStack() { +void incrementMatStack(void) { Mtx *mtx = alloc_display_list(sizeof(*mtx)); gMatStackIndex++; mtxf_to_mtx(mtx, gMatStack[gMatStackIndex]); gMatStackFixed[gMatStackIndex] = mtx; } + void appendDLandReturn(struct GraphNodeDisplayList *node) { if (node->displayList != NULL) { geo_append_display_list(node->displayList, node->node.flags >> 8); @@ -1022,6 +1024,7 @@ void geo_process_object_parent(struct GraphNodeObjectParent *node) { void geo_process_held_object(struct GraphNodeHeldObject *node) { Mat4 mat; Vec3f translation; + Mat4 tempMtx; #ifdef F3DEX_GBI_2 gSPLookAt(gDisplayListHead++, &lookAt); @@ -1033,16 +1036,17 @@ void geo_process_held_object(struct GraphNodeHeldObject *node) { if (node->objNode != NULL && node->objNode->header.gfx.sharedChild != NULL) { s32 hasAnimation = (node->objNode->header.gfx.node.flags & GRAPH_RENDER_HAS_ANIMATION) != 0; - translation[0] = node->translation[0] / 4.0f; - translation[1] = node->translation[1] / 4.0f; - translation[2] = node->translation[2] / 4.0f; + translation[0] = node->translation[0] / 4; + translation[1] = node->translation[1] / 4; + translation[2] = node->translation[2] / 4; mtxf_translate(mat, translation); mtxf_copy(gMatStack[gMatStackIndex + 1], *gCurGraphNodeObject->throwMatrix); gMatStack[gMatStackIndex + 1][3][0] = gMatStack[gMatStackIndex][3][0]; gMatStack[gMatStackIndex + 1][3][1] = gMatStack[gMatStackIndex][3][1]; gMatStack[gMatStackIndex + 1][3][2] = gMatStack[gMatStackIndex][3][2]; - mtxf_mul(gMatStack[gMatStackIndex + 1], mat, gMatStack[gMatStackIndex + 1]); + mtxf_copy(temp, gMatStack[gMatStackIndex + 1]); + mtxf_mul(gMatStack[gMatStackIndex + 1], mat, tempMtx); mtxf_scale_vec3f(gMatStack[gMatStackIndex + 1], gMatStack[gMatStackIndex + 1], node->objNode->header.gfx.scale); if (node->fnNode.func != NULL) { node->fnNode.func(GEO_CONTEXT_HELD_OBJ, &node->fnNode.node, (struct AllocOnlyPool *) gMatStack[gMatStackIndex + 1]); From 81a64e59d7a15de3f6a496024e6aeef3f9bc14a4 Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Tue, 28 Sep 2021 13:54:34 -0700 Subject: [PATCH 26/97] Fix held objects + some cleanup --- enhancements/platform_displacement_2.diff | 10 +- src/engine/math_util.c | 200 ++++++------------ src/engine/math_util.h | 97 ++++++++- src/engine/surface_collision.h | 6 + src/game/behaviors/bowser.inc.c | 5 +- .../behaviors/bowser_falling_platform.inc.c | 4 +- src/game/behaviors/grand_star.inc.c | 10 +- src/game/behaviors/king_bobomb.inc.c | 2 +- src/game/behaviors/sl_snowman_wind.inc.c | 4 +- src/game/behaviors/whomp.inc.c | 6 +- src/game/object_helpers.c | 37 +--- src/game/rendering_graph_node.c | 97 ++++----- 12 files changed, 241 insertions(+), 237 deletions(-) diff --git a/enhancements/platform_displacement_2.diff b/enhancements/platform_displacement_2.diff index 9a3bfaf0..e492e9f4 100644 --- a/enhancements/platform_displacement_2.diff +++ b/enhancements/platform_displacement_2.diff @@ -22,7 +22,7 @@ index 0000000..6bf33a8 + UNUSED f32 floorHeight; + if ((platform = o->platform) != NULL) +- apply_platform_displacement(0, platform); -++ apply_platform_displacement(&sBowserDisplacementInfo, &o->oPosX, &o->oFaceAngleYaw, platform); +++ apply_platform_displacement(&sBowserDisplacementInfo, &o->oPosVec, &o->oFaceAngleYaw, platform); + o->oBowserUnk10E = 0; + cur_obj_update_floor_and_walls(); + cur_obj_call_action_function(sBowserActions); @@ -312,7 +312,7 @@ index 97cba2a..410e612 100644 - if ((platform = o->platform) != NULL) - apply_platform_displacement(FALSE, platform); + if ((platform = o->platform) != NULL) { -+ apply_platform_displacement(&sBowserDisplacementInfo, &o->oPosX, &o->oFaceAngleYaw, platform); ++ apply_platform_displacement(&sBowserDisplacementInfo, &o->oPosVec, &o->oFaceAngleYaw, platform); + } o->oBowserUnk10E = 0; cur_obj_update_floor_and_walls(); @@ -1648,7 +1648,7 @@ index 0000000..97cba2a + if ((o->oTimer & 1) == 0 && o->oTimer < 14) { + sp22 = D_8032F698[o->oBehParams2ndByte].unk3 + (gDebugInfo[4][1] << 8); + sp1C = -(o->oTimer / 2) * 290 + 1740; -+ vec3f_copy(sp24, &o->oPosX); ++ vec3f_copy(sp24, &o->oPosVec); + o->oPosX = D_8032F698[o->oBehParams2ndByte].unk1 + sins(sp22 + 5296) * sp1C; + o->oPosZ = D_8032F698[o->oBehParams2ndByte].unk2 + coss(sp22 + 5296) * sp1C; + o->oPosY = 307.0f; @@ -1656,7 +1656,7 @@ index 0000000..97cba2a + o->oPosX = D_8032F698[o->oBehParams2ndByte].unk1 + sins(sp22 - 5296) * sp1C; + o->oPosZ = D_8032F698[o->oBehParams2ndByte].unk2 + coss(sp22 - 5296) * sp1C; + spawn_mist_particles_variable(4, 0, 100); -+ vec3f_copy(&o->oPosX, sp24); ++ vec3f_copy(&o->oPosVec, sp24); + } + cur_obj_move_using_fvel_and_gravity(); + if (o->oTimer > 300) @@ -1922,7 +1922,7 @@ index 0000000..f47808d + UNUSED f32 floorHeight; + if ((platform = o->platform) != NULL) +- apply_platform_displacement(0, platform); -++ apply_platform_displacement(&sBowserDisplacementInfo, &o->oPosX, &o->oFaceAngleYaw, platform); +++ apply_platform_displacement(&sBowserDisplacementInfo, &o->oPosVec, &o->oFaceAngleYaw, platform); + o->oBowserUnk10E = 0; + cur_obj_update_floor_and_walls(); + cur_obj_call_action_function(sBowserActions); diff --git a/src/engine/math_util.c b/src/engine/math_util.c index 7e4632d6..d0987ad3 100644 --- a/src/engine/math_util.c +++ b/src/engine/math_util.c @@ -112,15 +112,23 @@ void vec3f_cross(Vec3f dest, Vec3f a, Vec3f b) { /// Scale vector 'dest' so it has length 1 void vec3f_normalize(Vec3f dest) { - f32 size = sqrtf(dest[0] * dest[0] + dest[1] * dest[1] + dest[2] * dest[2]); - register f32 invsqrt; - if (size > 0.01f) { - - invsqrt = 1.0f / size; + f32 mag = sqrtf(sqr(dest[0] + sqr(dest[1]) + sqr(dest[2])); + if (mag > __FLT_EPSILON__) { + register f32 invsqrt = 1.0f / mag; + vec3_mul_val(dest, invsqrt); + } else { + dest[0] = 0; + dest[1] = 1; + dest[2] = 0; + } +} + +/// Scale vector 'dest' so it has length -1 +void vec3f_normalize_negative(Vec3f dest) { + f32 mag = sqrtf(sqr(dest[0] + sqr(dest[1]) + sqr(dest[2])); + if (mag > __FLT_EPSILON__) { + register f32 invsqrt = -1.0f / mag; vec3_mul_val(dest, invsqrt); - /*dest[0] *= invsqrt; - dest[1] *= invsqrt; - dest[2] *= invsqrt;*/ } else { dest[0] = 0; dest[1] = 1; @@ -130,7 +138,7 @@ void vec3f_normalize(Vec3f dest) { #pragma GCC diagnostic pop struct CopyMe { - f32 x; f32 y; f32 z; f32 w; + f32 x; f32 y; f32 z; f32 w; f32 x1; f32 y1; f32 z1; f32 w1; f32 x2; f32 y2; f32 z2; f32 w2; f32 x3; f32 y3; f32 z3; f32 w3; @@ -209,14 +217,6 @@ void mtxf_rot_trans_mul(Vec3s rot, Vec3f trans, Mat4 dest, Mat4 src) { ((u32 *) dest)[15] = 0x3F800000; } -f32 lookAtCalc(f32 sqrtsqrt) { - f32 calc = sqrtf(sqrtsqrt); - if (calc == 0) - calc = 0.00000000001; - - return -1.0 / calc; -} - /** * Set mtx to a look-at matrix for the camera. The resulting transformation * transforms the world as if there exists a camera at position 'from' pointed @@ -224,78 +224,36 @@ f32 lookAtCalc(f32 sqrtsqrt) { * angle allows a bank rotation of the camera. */ void mtxf_lookat(Mat4 mtx, Vec3f from, Vec3f to, s32 roll) { - register f32 invLength; - f32 dx; - f32 dz; - f32 xColY; - f32 yColY; - f32 zColY; - f32 xColZ; - f32 yColZ; - f32 zColZ; - f32 xColX; - f32 yColX; - f32 zColX; - f32 calc; - - dx = to[0] - from[0]; - dz = to[2] - from[2]; - - invLength = lookAtCalc(dx * dx + dz * dz); + Vec3f colX, colY, colZ; + register f32 dx = (to[0] - from[0]); + register f32 dz = (to[2] - from[2]); + register f32 invLength = sqrtf(sqr(dx) + sqr(dz)); + invLength = -(1.0f / MAX(invLength, NEAR_ZERO)); dx *= invLength; dz *= invLength; - - yColY = coss(roll); - xColY = sins(roll) * dz; - zColY = -sins(roll) * dx; - - xColZ = to[0] - from[0]; - yColZ = to[1] - from[1]; - zColZ = to[2] - from[2]; - - invLength = lookAtCalc(xColZ * xColZ + yColZ * yColZ + zColZ * zColZ); - xColZ *= invLength; - yColZ *= invLength; - zColZ *= invLength; - - xColX = yColY * zColZ - zColY * yColZ; - yColX = zColY * xColZ - xColY * zColZ; - zColX = xColY * yColZ - yColY * xColZ; - - invLength = -lookAtCalc(xColX * xColX + yColX * yColX + zColX * zColX); - - xColX *= invLength; - yColX *= invLength; - zColX *= invLength; - - xColY = yColZ * zColX - zColZ * yColX; - yColY = zColZ * xColX - xColZ * zColX; - zColY = xColZ * yColX - yColZ * xColX; - - invLength = -lookAtCalc(xColY * xColY + yColY * yColY + zColY * zColY); - xColY *= invLength; - yColY *= invLength; - zColY *= invLength; - - mtx[0][0] = xColX; - mtx[1][0] = yColX; - mtx[2][0] = zColX; - mtx[3][0] = -(from[0] * xColX + from[1] * yColX + from[2] * zColX); - - mtx[0][1] = xColY; - mtx[1][1] = yColY; - mtx[2][1] = zColY; - mtx[3][1] = -(from[0] * xColY + from[1] * yColY + from[2] * zColY); - - mtx[0][2] = xColZ; - mtx[1][2] = yColZ; - mtx[2][2] = zColZ; - mtx[3][2] = -(from[0] * xColZ + from[1] * yColZ + from[2] * zColZ); - - mtx[0][3] = 0; - mtx[1][3] = 0; - mtx[2][3] = 0; - mtx[3][3] = 1; + f32 sr = sins(roll); + colY[1] = coss(roll); + colY[0] = ( sr * dz); + colY[2] = (-sr * dx); + vec3_diff(colZ, to, from); + vec3_normalize_negative(colZ); + vec3f_cross(colX, colY, colZ); + vec3f_normalize(colX); + vec3f_cross(colY, colZ, colX); + vec3f_normalize(colY); + mtx[0][0] = colX[0]; + mtx[1][0] = colX[1]; + mtx[2][0] = colX[2]; + mtx[0][1] = colY[0]; + mtx[1][1] = colY[1]; + mtx[2][1] = colY[2]; + mtx[0][2] = colZ[0]; + mtx[1][2] = colZ[1]; + mtx[2][2] = colZ[2]; + mtx[3][0] = -vec3_dot(from, colX); + mtx[3][1] = -vec3_dot(from, colY); + mtx[3][2] = -vec3_dot(from, colZ); + MTXF_END(mtx); } /** @@ -375,7 +333,7 @@ void mtxf_rotate_xyz_and_translate(Mat4 dest, Vec3f b, Vec3s c) { void mtxf_billboard(Mat4 dest, Mat4 mtx, Vec3f position, s32 angle) { register s32 i; register f32 *temp, *temp2; - temp = dest; + temp = (f32 *)dest; for (i = 0; i < 16; i++) { *temp = 0; temp++; @@ -388,8 +346,8 @@ void mtxf_billboard(Mat4 dest, Mat4 mtx, Vec3f position, s32 angle) { dest[2][3] = 0; ((u32 *) dest)[15] = 0x3F800000; - temp = dest; - temp2 = mtx; + temp = (f32 *)dest; + temp2 = (f32 *)mtx; for (i = 0; i < 3; i++) { temp[12] = temp2[0] * position[0] + temp2[4] * position[1] + temp2[8] * position[2] + temp2[12]; temp++; @@ -448,14 +406,10 @@ void mtxf_align_terrain_normal(Mat4 dest, Vec3f upDir, Vec3f pos, s32 yaw) { * 'radius' is the distance from each triangle vertex to the center */ void mtxf_align_terrain_triangle(Mat4 mtx, Vec3f pos, s32 yaw, f32 radius) { - struct Surface *sp74; - Vec3f point0; - Vec3f point1; - Vec3f point2; + struct Surface *floor; + Vec3f point0, point1, point2; Vec3f forward; - Vec3f xColumn; - Vec3f yColumn; - Vec3f zColumn; + Vec3f xColumn, yColumn, zColumn; f32 avgY; f32 minY = -radius * 3; @@ -466,9 +420,9 @@ void mtxf_align_terrain_triangle(Mat4 mtx, Vec3f pos, s32 yaw, f32 radius) { point2[0] = pos[0] + radius * sins(yaw + 0xD555); point2[2] = pos[2] + radius * coss(yaw + 0xD555); - point0[1] = find_floor(point0[0], pos[1] + 150, point0[2], &sp74); - point1[1] = find_floor(point1[0], pos[1] + 150, point1[2], &sp74); - point2[1] = find_floor(point2[0], pos[1] + 150, point2[2], &sp74); + point0[1] = find_floor(point0[0], pos[1] + 150, point0[2], &floor); + point1[1] = find_floor(point1[0], pos[1] + 150, point1[2], &floor); + point2[1] = find_floor(point2[0], pos[1] + 150, point2[2], &floor); if (point0[1] - pos[1] < minY) { point0[1] = pos[1]; @@ -491,20 +445,11 @@ void mtxf_align_terrain_triangle(Mat4 mtx, Vec3f pos, s32 yaw, f32 radius) { vec3f_normalize(xColumn); vec3f_cross(zColumn, xColumn, yColumn); vec3f_normalize(zColumn); - - mtx[0][0] = xColumn[0]; - mtx[0][1] = xColumn[1]; - mtx[0][2] = xColumn[2]; + vec3_copy(mtx[0], xColumn); + vec3_copy(mtx[1], yColumn); + vec3_copy(mtx[2], zColumn); mtx[3][0] = pos[0]; - - mtx[1][0] = yColumn[0]; - mtx[1][1] = yColumn[1]; - mtx[1][2] = yColumn[2]; mtx[3][1] = (avgY < pos[1]) ? pos[1] : avgY; - - mtx[2][0] = zColumn[0]; - mtx[2][1] = zColumn[1]; - mtx[2][2] = zColumn[2]; mtx[3][2] = pos[2]; mtx[0][3] = 0; @@ -522,20 +467,16 @@ void mtxf_align_terrain_triangle(Mat4 mtx, Vec3f pos, s32 yaw, f32 radius) { * then a. */ void mtxf_mul(Mat4 dest, Mat4 a, Mat4 b) { - register f32 entry0; - register f32 entry1; - register f32 entry2; - register f32 *temp = a; - register f32 *temp2 = dest; + register Vec3f entry; + register f32 *temp = (f32 *)a; + register f32 *temp2 = (f32 *)dest; register f32 *temp3; register s32 i; for (i = 0; i < 16; i++) { - entry0 = temp[0]; - entry1 = temp[1]; - entry2 = temp[2]; - temp3 = b; + vec3_copy(entry, temp); + temp3 = (f32 *)b; for (; (i & 3) !=3; i++) { - *temp2 = entry0 * temp3[0] + entry1 * temp3[4] + entry2 * temp3[8]; + *temp2 = entry[0] * temp3[0] + entry[1] * temp3[4] + entry[2] * temp3[8]; temp2++; temp3++; } @@ -551,8 +492,8 @@ void mtxf_mul(Mat4 dest, Mat4 a, Mat4 b) { * Set matrix 'dest' to 'mtx' scaled by vector s */ void mtxf_scale_vec3f(Mat4 dest, Mat4 mtx, register Vec3f s) { - register f32 *temp = dest; - register f32 *temp2 = mtx; + register f32 *temp = (f32 *)dest; + register f32 *temp2 = (f32 *)mtx; register s32 i; for (i = 0; i < 4; i++) { temp[0] = temp2[0] * s[0]; @@ -573,7 +514,7 @@ void mtxf_mul_vec3s(Mat4 mtx, Vec3s b) { register f32 x = b[0]; register f32 y = b[1]; register f32 z = b[2]; - register f32 *temp2 = mtx; + register f32 *temp2 = (f32 *)mtx; register s32 i; register s16 *c = b; for (i = 0; i < 3; i++) { @@ -636,7 +577,7 @@ void mtxf_to_mtx(void *dest, void *src) { void mtxf_rotate_xy(Mtx *mtx, s32 angle) { register s32 i = coss(angle) * 65536; register s32 j = sins(angle) * 65536; - register f32 *temp = mtx; + register f32 *temp = (f32 *)mtx; register s32 k; for (k = 0; k < 16; k++) { *temp = 0; @@ -672,11 +613,11 @@ void mtxf_rotate_xy(Mtx *mtx, s32 angle) { */ void get_pos_from_transform_mtx(Vec3f dest, Mat4 objMtx, register Mat4 camMtx) { register s32 i; - register f32 *temp = dest; - register f32 *temp2 = camMtx; + register f32 *temp = (f32 *)dest; + register f32 *temp2 = (f32 *)camMtx; f32 y[3]; register f32 *x = y; - register f32 *temp3 = objMtx; + register f32 *temp3 = (f32 *)objMtx; for (i = 0; i < 3; i++) { *x = (temp3[12] - temp2[12]); @@ -690,7 +631,6 @@ void get_pos_from_transform_mtx(Vec3f dest, Mat4 objMtx, register Mat4 camMtx) { temp++; temp2 += 4; } - } diff --git a/src/engine/math_util.h b/src/engine/math_util.h index 41c403e2..0b08c90c 100644 --- a/src/engine/math_util.h +++ b/src/engine/math_util.h @@ -5,6 +5,10 @@ #include "types.h" +#define NEAR_ZERO 0.00001f +#define NEARER_ZERO 0.000001f +#define NEAR_ONE 0.99999f + /** * Converts an angle in degrees to sm64's s16 angle units. For example, DEGREES(90) == 0x4000 * This should be used mainly to make camera code clearer at first glance. @@ -124,6 +128,32 @@ extern f32 gSineTable[]; (dst)[2] = (((a)[0] * (b)[1]) - ((a)[1] * (b)[0])); \ } +/** + * | ? ? ? 0 | + * | ? ? ? 0 | + * | ? ? ? 0 | + * | 0 0 0 1 | + * i.e. a matrix representing a linear transformation over 3 space. + */ +// Multiply a vector by a matrix of the form +#define linear_mtxf_mul_vec3(mtx, dstV, srcV) { \ + (dstV)[0] = (((mtx)[0][0] * (srcV)[0]) + ((mtx)[1][0] * (srcV)[1]) + ((mtx)[2][0] * (srcV)[2]));\ + (dstV)[1] = (((mtx)[0][1] * (srcV)[0]) + ((mtx)[1][1] * (srcV)[1]) + ((mtx)[2][1] * (srcV)[2]));\ + (dstV)[2] = (((mtx)[0][2] * (srcV)[0]) + ((mtx)[1][2] * (srcV)[1]) + ((mtx)[2][2] * (srcV)[2]));\ +} + +#define linear_mtxf_mul_vec3_and_translate(mtx, dstV, srcV) { \ + linear_mtxf_mul_vec3f((mtx), (dstV), (srcV)); \ + vec3_add((dstV), (mtx)[3]); \ +} + +// Multiply a vector by the transpose of a matrix of the form +#define linear_mtxf_transpose_mul_vec3(mtx, dstV, srcV) { \ + (dstV)[0] = vec3_dot((mtx)[0], (srcV)); \ + (dstV)[1] = vec3_dot((mtx)[1], (srcV)); \ + (dstV)[2] = vec3_dot((mtx)[2], (srcV)); \ +} + #define vec2_set(dst, x, y) { \ (dst)[0] = (x); \ (dst)[1] = (y); \ @@ -340,11 +370,68 @@ extern f32 gSineTable[]; #define vec3_div_val(dst, x) vec3_quot_val((dst), (dst), (x)) #define vec4_div_val(dst, x) vec4_quot_val((dst), (dst), (x)) -#define RAYCAST_FIND_FLOOR (0x1) -#define RAYCAST_FIND_WALL (0x2) -#define RAYCAST_FIND_CEIL (0x4) -#define RAYCAST_FIND_WATER (0x8) -#define RAYCAST_FIND_ALL (0xFFFFFFFF) +#define MAT4_VEC_DOT_PROD(R, A, B, row, col) { \ + (R)[(row)][(col)] = ((A)[(row)][0] * (B)[0][(col)]); \ + (R)[(row)][(col)] += ((A)[(row)][1] * (B)[1][(col)]); \ + (R)[(row)][(col)] += ((A)[(row)][2] * (B)[2][(col)]); \ +} +#define MAT4_DOT_PROD(R, A, B, row, col) { \ + (R)[(row)][(col)] = ((A)[(row)][0] * (B)[0][(col)]); \ + (R)[(row)][(col)] += ((A)[(row)][1] * (B)[1][(col)]); \ + (R)[(row)][(col)] += ((A)[(row)][2] * (B)[2][(col)]); \ + (R)[(row)][(col)] += ((A)[(row)][3] * (B)[3][(col)]); \ +} + +#define MAT4_MULTIPLY(R, A, B) { \ + MAT4_DOT_PROD((R), (A), (B), 0, 0); \ + MAT4_DOT_PROD((R), (A), (B), 0, 1); \ + MAT4_DOT_PROD((R), (A), (B), 0, 2); \ + MAT4_DOT_PROD((R), (A), (B), 0, 3); \ + MAT4_DOT_PROD((R), (A), (B), 1, 0); \ + MAT4_DOT_PROD((R), (A), (B), 1, 1); \ + MAT4_DOT_PROD((R), (A), (B), 1, 2); \ + MAT4_DOT_PROD((R), (A), (B), 1, 3); \ + MAT4_DOT_PROD((R), (A), (B), 2, 0); \ + MAT4_DOT_PROD((R), (A), (B), 2, 1); \ + MAT4_DOT_PROD((R), (A), (B), 2, 2); \ + MAT4_DOT_PROD((R), (A), (B), 2, 3); \ + MAT4_DOT_PROD((R), (A), (B), 3, 0); \ + MAT4_DOT_PROD((R), (A), (B), 3, 1); \ + MAT4_DOT_PROD((R), (A), (B), 3, 2); \ + MAT4_DOT_PROD((R), (A), (B), 3, 3); \ +} + +#define MTXF_END(mtx) { \ + (mtx)[0][3] = 0.0f; \ + (mtx)[1][3] = 0.0f; \ + (mtx)[2][3] = 0.0f; \ + (mtx)[3][3] = 1.0f; \ +} + +#define NAME_INVMAG(v) v##_invmag + +/// Scale vector 'v' so it has length 1 +#define vec3_normalize(v) { \ + register f32 NAME_INVMAG(v) = vec3_mag((v)); \ + NAME_INVMAG(v) = (1.0f / MAX(NAME_INVMAG(v), NEAR_ZERO)); \ + vec3_mul_val((v), NAME_INVMAG(v)); \ +} + +/// Scale vector 'v' so it has length -1 +#define vec3_normalize_negative(v) { \ + register f32 v##_invmag = vec3_mag((v)); \ + v##_invmag = -(1.0f / MAX(v##_invmag, NEAR_ZERO)); \ + vec3_mul_val((v), v##_invmag); \ +} + +#define vec3_normalize_max(v, max) { \ + register f32 v##_mag = vec3_mag(v); \ + v##_mag = MAX(v##_mag, NEAR_ZERO); \ + if (v##_mag > max) { \ + v##_mag = (max / v##_mag); \ + vec3_mul_val(v, v##_mag); \ + } \ +} s32 min_3i(s32 a0, s32 a1, s32 a2); f32 min_3f(f32 a0, f32 a1, f32 a2); diff --git a/src/engine/surface_collision.h b/src/engine/surface_collision.h index 8982e2d5..bd1ebd36 100644 --- a/src/engine/surface_collision.h +++ b/src/engine/surface_collision.h @@ -19,6 +19,12 @@ #define SURFACE_YAW(s) (atan2s(((s)->normal.z), ((s)->normal.x))) +#define RAYCAST_FIND_FLOOR (1 << 0) +#define RAYCAST_FIND_WALL (1 << 1) +#define RAYCAST_FIND_CEIL (1 << 2) +#define RAYCAST_FIND_WATER (1 << 3) +#define RAYCAST_FIND_ALL (0xFFFFFFFF) + struct WallCollisionData { /*0x00*/ f32 x, y, z; diff --git a/src/game/behaviors/bowser.inc.c b/src/game/behaviors/bowser.inc.c index 884dc87f..61e175fe 100644 --- a/src/game/behaviors/bowser.inc.c +++ b/src/game/behaviors/bowser.inc.c @@ -1537,12 +1537,11 @@ s8 sBowserHealth[] = { 1, 1, 3 }; void bowser_free_update(void) { struct Surface *floor; struct Object *platform; - UNUSED f32 floorHeight; #ifdef PLATFORM_DISPLACEMENT_2 s16 tmpOFaceAngleYaw = (s16) o->oFaceAngleYaw; if ((platform = o->platform) != NULL) { // NOTE: This function was at one point using '&o->oFaceAngleYaw', which is a s32 address. Should tmpOFaceAngleYaw be using the first 16 bits instead, or was that a bug? - apply_platform_displacement(&sBowserDisplacementInfo, &o->oPosX, &tmpOFaceAngleYaw, platform); + apply_platform_displacement(&sBowserDisplacementInfo, &o->oPosVec, &tmpOFaceAngleYaw, platform); o->oFaceAngleYaw = tmpOFaceAngleYaw; } #else @@ -1561,7 +1560,7 @@ void bowser_free_update(void) { o->oAction = BOWSER_ACT_JUMP_ONTO_STAGE; } // Check floor height and platform - floorHeight = find_floor(o->oPosX, o->oPosY, o->oPosZ, &floor); + find_floor(o->oPosX, o->oPosY, o->oPosZ, &floor); if ((floor != NULL) && (floor->object != NULL)) { o->platform = floor->object; } else { diff --git a/src/game/behaviors/bowser_falling_platform.inc.c b/src/game/behaviors/bowser_falling_platform.inc.c index f1c66117..685f0aa9 100644 --- a/src/game/behaviors/bowser_falling_platform.inc.c +++ b/src/game/behaviors/bowser_falling_platform.inc.c @@ -62,7 +62,7 @@ void falling_bowser_plat_act_fall(void) { if ((o->oTimer & 1) == 0 && o->oTimer < 14) { angle = sBowserFallingPlatform[o->oBehParams2ndByte].angle + (gDebugInfo[4][1] << 8); val = -(o->oTimer / 2) * 290 + 1740; - vec3f_copy(pos, &o->oPosX); + vec3f_copy(pos, &o->oPosVec); o->oPosX = sBowserFallingPlatform[o->oBehParams2ndByte].posX + sins(angle + 0x14B0) * val; o->oPosZ = sBowserFallingPlatform[o->oBehParams2ndByte].posZ + coss(angle + 0x14B0) * val; o->oPosY = 307.0f; @@ -70,7 +70,7 @@ void falling_bowser_plat_act_fall(void) { o->oPosX = sBowserFallingPlatform[o->oBehParams2ndByte].posX + sins(angle - 0x14B0) * val; o->oPosZ = sBowserFallingPlatform[o->oBehParams2ndByte].posZ + coss(angle - 0x14B0) * val; spawn_mist_particles_variable(4, 0, 100); - vec3f_copy(&o->oPosX, pos); + vec3f_copy(&o->oPosVec, pos); } cur_obj_move_using_fvel_and_gravity(); if (o->oTimer > 300) { diff --git a/src/game/behaviors/grand_star.inc.c b/src/game/behaviors/grand_star.inc.c index 4fa2ec99..a71c3a88 100644 --- a/src/game/behaviors/grand_star.inc.c +++ b/src/game/behaviors/grand_star.inc.c @@ -4,23 +4,21 @@ s32 arc_to_goal_pos(Vec3f a0, Vec3f a1, f32 yVel, f32 gravity) { f32 dx = a0[0] - a1[0]; f32 dz = a0[2] - a1[2]; f32 planarDist = sqrtf(sqr(dx) + sqr(dz)); - s32 time; o->oMoveAngleYaw = atan2s(dz, dx); o->oVelY = yVel; o->oGravity = gravity; - time = -2.0f / o->oGravity * yVel - 1.0f; + s32 time = -2.0f / o->oGravity * yVel - 1.0f; o->oForwardVel = planarDist / time; return time; } void grand_star_zero_velocity(void) { - o->oGravity = 0.0f; - o->oVelY = 0.0f; + o->oGravity = 0.0f; + o->oVelY = 0.0f; o->oForwardVel = 0.0f; } void bhv_grand_star_loop(void) { - Vec3f dest = { 0.0f, 0.0f, 0.0f }; if (o->oAction == 0) { if (o->oTimer == 0) { obj_set_angle(o, 0, 0, 0); @@ -34,7 +32,7 @@ void bhv_grand_star_loop(void) { if (o->oTimer == 0) { cur_obj_play_sound_2(SOUND_GENERAL_GRAND_STAR); cutscene_object(CUTSCENE_STAR_SPAWN, o); - o->oGrandStarArcTime = arc_to_goal_pos(dest, &o->oPosX, 80.0f, -2.0f); + o->oGrandStarArcTime = arc_to_goal_pos(gVec3fZero, &o->oPosVec, 80.0f, -2.0f); } cur_obj_move_using_fvel_and_gravity(); if (o->oSubAction == 0) { diff --git a/src/game/behaviors/king_bobomb.inc.c b/src/game/behaviors/king_bobomb.inc.c index 199a1cb6..43c3c260 100644 --- a/src/game/behaviors/king_bobomb.inc.c +++ b/src/game/behaviors/king_bobomb.inc.c @@ -226,7 +226,7 @@ void king_bobomb_act_5(void) { // bobomb returns home if (o->oPosY < o->oHomeY) o->oVelY = 100.0f; else { - arc_to_goal_pos(&o->oHomeX, &o->oPosX, 100.0f, -4.0f); + arc_to_goal_pos(&o->oPosVec, &o->oPosVec, 100.0f, -4.0f); o->oSubAction++; } break; diff --git a/src/game/behaviors/sl_snowman_wind.inc.c b/src/game/behaviors/sl_snowman_wind.inc.c index f5059973..a9d41b2e 100644 --- a/src/game/behaviors/sl_snowman_wind.inc.c +++ b/src/game/behaviors/sl_snowman_wind.inc.c @@ -12,11 +12,11 @@ void bhv_sl_snowman_wind_loop(void) { o->oDistanceToMario = 0; // Check if Mario is within 1000 units of the center of the bridge, and ready to speak. - vec3f_copy(tempPos, &o->oPosX); + vec3f_copy(tempPos, &o->oPosVec); obj_set_pos(o, 1100, 3328, 1164); // Position is in the middle of the ice bridge if (cur_obj_can_mario_activate_textbox(1000.0f, 30.0f, 0x7FFF)) o->oSubAction++; - vec3f_copy(&o->oPosX, tempPos); + vec3f_copy(&o->oPosVec, tempPos); // Mario has come close, begin dialog. } else if (o->oSubAction == SL_SNOWMAN_WIND_ACT_TALKING) { diff --git a/src/game/behaviors/whomp.inc.c b/src/game/behaviors/whomp.inc.c index a4e4dd1b..f98de7d8 100644 --- a/src/game/behaviors/whomp.inc.c +++ b/src/game/behaviors/whomp.inc.c @@ -146,12 +146,12 @@ void king_whomp_on_ground(void) { if (o->oHealth == 0) o->oAction = 8; else { - vec3f_copy(pos, &o->oPosX); - vec3f_copy(&o->oPosX, &gMarioObject->oPosX); + vec3f_copy(pos, &o->oPosVec); + vec3f_copy(&o->oPosVec, &gMarioObject->oPosVec); spawn_mist_particles_variable(0, 0, 100.0f); spawn_triangle_break_particles(20, MODEL_DIRT_ANIMATION, 3.0f, 4); cur_obj_shake_screen(SHAKE_POS_SMALL); - vec3f_copy(&o->oPosX, pos); + vec3f_copy(&o->oPosVec, pos); } o->oSubAction++; } diff --git a/src/game/object_helpers.c b/src/game/object_helpers.c index 7f6e9bb6..f65557a9 100644 --- a/src/game/object_helpers.c +++ b/src/game/object_helpers.c @@ -1704,8 +1704,7 @@ void cur_obj_move_using_fvel_and_gravity(void) { cur_obj_move_using_vel_and_gravity(); //! No terminal velocity } -void obj_set_pos_relative(struct Object *obj, struct Object *other, f32 dleft, f32 dy, - f32 dforward) { +void obj_set_pos_relative(struct Object *obj, struct Object *other, f32 dleft, f32 dy, f32 dforward) { f32 facingZ = coss(other->oMoveAngleYaw); f32 facingX = sins(other->oMoveAngleYaw); @@ -1720,12 +1719,9 @@ void obj_set_pos_relative(struct Object *obj, struct Object *other, f32 dleft, f } s16 cur_obj_angle_to_home(void) { - s16 angle; f32 dx = o->oHomeX - o->oPosX; f32 dz = o->oHomeZ - o->oPosZ; - - angle = atan2s(dz, dx); - return angle; + return atan2s(dz, dx); } void obj_set_gfx_pos_at_obj_pos(struct Object *obj1, struct Object *obj2) { @@ -1747,26 +1743,16 @@ void obj_translate_local(struct Object *obj, s16 posIndex, s16 localTranslateInd f32 dy = obj->rawData.asF32[localTranslateIndex + 1]; f32 dz = obj->rawData.asF32[localTranslateIndex + 2]; - obj->rawData.asF32[posIndex + 0] += - obj->transform[0][0] * dx + obj->transform[1][0] * dy + obj->transform[2][0] * dz; - obj->rawData.asF32[posIndex + 1] += - obj->transform[0][1] * dx + obj->transform[1][1] * dy + obj->transform[2][1] * dz; - obj->rawData.asF32[posIndex + 2] += - obj->transform[0][2] * dx + obj->transform[1][2] * dy + obj->transform[2][2] * dz; + obj->rawData.asF32[posIndex + 0] += obj->transform[0][0] * dx + obj->transform[1][0] * dy + obj->transform[2][0] * dz; + obj->rawData.asF32[posIndex + 1] += obj->transform[0][1] * dx + obj->transform[1][1] * dy + obj->transform[2][1] * dz; + obj->rawData.asF32[posIndex + 2] += obj->transform[0][2] * dx + obj->transform[1][2] * dy + obj->transform[2][2] * dz; } void obj_build_transform_from_pos_and_angle(struct Object *obj, s16 posIndex, s16 angleIndex) { Vec3f translate; + vec3_copy(translate, &obj->rawData.asF32[posIndex]); Vec3s rotation; - - translate[0] = obj->rawData.asF32[posIndex + 0]; - translate[1] = obj->rawData.asF32[posIndex + 1]; - translate[2] = obj->rawData.asF32[posIndex + 2]; - - rotation[0] = obj->rawData.asS32[angleIndex + 0]; - rotation[1] = obj->rawData.asS32[angleIndex + 1]; - rotation[2] = obj->rawData.asS32[angleIndex + 2]; - + vec3_copy(rotation, &obj->rawData.asS32[angleIndex]); mtxf_rotate_zxy_and_translate(obj->transform, translate, rotation); } @@ -1790,9 +1776,7 @@ void obj_build_transform_relative_to_parent(struct Object *obj) { obj_apply_scale_to_transform(obj); mtxf_mul(obj->transform, obj->transform, parent->transform); - obj->oPosX = obj->transform[3][0]; - obj->oPosY = obj->transform[3][1]; - obj->oPosZ = obj->transform[3][2]; + vec3_copy(&obj->oPosVec, obj->transform[3]); obj->header.gfx.throwMatrix = &obj->transform; @@ -1802,10 +1786,7 @@ void obj_build_transform_relative_to_parent(struct Object *obj) { void obj_create_transform_from_self(struct Object *obj) { obj->oFlags &= ~OBJ_FLAG_TRANSFORM_RELATIVE_TO_PARENT; obj->oFlags |= OBJ_FLAG_SET_THROW_MATRIX_FROM_TRANSFORM; - - obj->transform[3][0] = obj->oPosX; - obj->transform[3][1] = obj->oPosY; - obj->transform[3][2] = obj->oPosZ; + vec3_copy(obj->transform[3], &obj->oPosVec); } void cur_obj_rotate_move_angle_using_vel(void) { diff --git a/src/game/rendering_graph_node.c b/src/game/rendering_graph_node.c index de90361b..8096accc 100644 --- a/src/game/rendering_graph_node.c +++ b/src/game/rendering_graph_node.c @@ -350,13 +350,14 @@ void geo_append_display_list(void *displayList, s32 layer) { } } -void incrementMatStack() { +void inc_mat_stack() { Mtx *mtx = alloc_display_list(sizeof(*mtx)); gMatStackIndex++; mtxf_to_mtx(mtx, gMatStack[gMatStackIndex]); gMatStackFixed[gMatStackIndex] = mtx; } -void appendDLandReturn(struct GraphNodeDisplayList *node) { + +void append_dl_and_return(struct GraphNodeDisplayList *node) { if (node->displayList != NULL) { geo_append_display_list(node->displayList, node->node.flags >> 8); } @@ -513,7 +514,7 @@ void geo_process_camera(struct GraphNodeCamera *node) { mtxf_lookat(cameraTransform, node->pos, node->focus, node->roll); mtxf_mul(gMatStack[gMatStackIndex + 1], cameraTransform, gMatStack[gMatStackIndex]); - incrementMatStack(); + inc_mat_stack(); if (node->fnNode.node.children != 0) { gCurGraphNodeCamera = node; node->matrixPtr = &gMatStack[gMatStackIndex]; @@ -536,8 +537,8 @@ void geo_process_translation_rotation(struct GraphNodeTranslationRotation *node) vec3_copy(translation, node->translation); mtxf_rotate_zxy_and_translate(mtxf, translation, node->rotation); mtxf_mul(gMatStack[gMatStackIndex + 1], mtxf, gMatStack[gMatStackIndex]); - incrementMatStack(); - appendDLandReturn(((struct GraphNodeDisplayList *)node)); + inc_mat_stack(); + append_dl_and_return(((struct GraphNodeDisplayList *)node)); } /** @@ -552,8 +553,8 @@ void geo_process_translation(struct GraphNodeTranslation *node) { vec3_copy(translation, node->translation); mtxf_rotate_zxy_and_translate(mtxf, translation, gVec3sZero); mtxf_mul(gMatStack[gMatStackIndex + 1], mtxf, gMatStack[gMatStackIndex]); - incrementMatStack(); - appendDLandReturn(((struct GraphNodeDisplayList *)node)); + inc_mat_stack(); + append_dl_and_return(((struct GraphNodeDisplayList *)node)); } /** @@ -566,8 +567,8 @@ void geo_process_rotation(struct GraphNodeRotation *node) { mtxf_rotate_zxy_and_translate(mtxf, gVec3fZero, node->rotation); mtxf_mul(gMatStack[gMatStackIndex + 1], mtxf, gMatStack[gMatStackIndex]); - incrementMatStack(); - appendDLandReturn(((struct GraphNodeDisplayList *)node)); + inc_mat_stack(); + append_dl_and_return(((struct GraphNodeDisplayList *)node)); } /** @@ -580,8 +581,8 @@ void geo_process_scale(struct GraphNodeScale *node) { vec3f_set(scaleVec, node->scale, node->scale, node->scale); mtxf_scale_vec3f(gMatStack[gMatStackIndex + 1], gMatStack[gMatStackIndex], scaleVec); - incrementMatStack(); - appendDLandReturn(((struct GraphNodeDisplayList *)node)); + inc_mat_stack(); + append_dl_and_return(((struct GraphNodeDisplayList *)node)); } /** @@ -594,16 +595,16 @@ void geo_process_billboard(struct GraphNodeBillboard *node) { Vec3f translation; vec3_copy(translation, node->translation); - mtxf_billboard(gMatStack[gMatStackIndex+1], gMatStack[gMatStackIndex], translation, gCurGraphNodeCamera->roll); + mtxf_billboard(gMatStack[gMatStackIndex + 1], gMatStack[gMatStackIndex], translation, gCurGraphNodeCamera->roll); if (gCurGraphNodeHeldObject != NULL) { - mtxf_scale_vec3f(gMatStack[gMatStackIndex+1], gMatStack[gMatStackIndex+1], gCurGraphNodeHeldObject->objNode->header.gfx.scale); + mtxf_scale_vec3f(gMatStack[gMatStackIndex + 1], gMatStack[gMatStackIndex + 1], gCurGraphNodeHeldObject->objNode->header.gfx.scale); } else if (gCurGraphNodeObject != NULL) { - mtxf_scale_vec3f(gMatStack[gMatStackIndex+1], gMatStack[gMatStackIndex+1], gCurGraphNodeObject->scale); + mtxf_scale_vec3f(gMatStack[gMatStackIndex + 1], gMatStack[gMatStackIndex + 1], gCurGraphNodeObject->scale); } - incrementMatStack(); - appendDLandReturn(((struct GraphNodeDisplayList *)node)); + inc_mat_stack(); + append_dl_and_return(((struct GraphNodeDisplayList *)node)); } /** @@ -612,7 +613,7 @@ void geo_process_billboard(struct GraphNodeBillboard *node) { * parent node. It processes its children if it has them. */ void geo_process_display_list(struct GraphNodeDisplayList *node) { - appendDLandReturn(((struct GraphNodeDisplayList *)node)); + append_dl_and_return(((struct GraphNodeDisplayList *)node)); gMatStackIndex++; } @@ -622,8 +623,7 @@ void geo_process_display_list(struct GraphNodeDisplayList *node) { */ void geo_process_generated_list(struct GraphNodeGenerated *node) { if (node->fnNode.func != NULL) { - Gfx *list = node->fnNode.func(GEO_CONTEXT_RENDER, &node->fnNode.node, - (struct AllocOnlyPool *) gMatStack[gMatStackIndex]); + Gfx *list = node->fnNode.func(GEO_CONTEXT_RENDER, &node->fnNode.node, (struct AllocOnlyPool *) gMatStack[gMatStackIndex]); if (list != NULL) { geo_append_display_list((void *) VIRTUAL_TO_PHYSICAL(list), GET_GRAPH_NODE_LAYER(node->fnNode.node.flags)); @@ -710,8 +710,8 @@ void geo_process_animated_part(struct GraphNodeAnimatedPart *node) { rotation[2] = gCurAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)]; } mtxf_rot_trans_mul(rotation, translation, gMatStack[gMatStackIndex + 1], gMatStack[gMatStackIndex]); - incrementMatStack(); - appendDLandReturn(((struct GraphNodeDisplayList *)node)); + inc_mat_stack(); + append_dl_and_return(((struct GraphNodeDisplayList *)node)); } /** @@ -750,8 +750,8 @@ void geo_process_bone(struct GraphNodeBone *node) { rotation[2] = gCurAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)]; } mtxf_rot_trans_mul(rotation, translation, gMatStack[gMatStackIndex + 1], gMatStack[gMatStackIndex]); - incrementMatStack(); - appendDLandReturn(((struct GraphNodeDisplayList *)node)); + inc_mat_stack(); + append_dl_and_return(((struct GraphNodeDisplayList *)node)); } /** @@ -833,8 +833,8 @@ void geo_process_shadow(struct GraphNodeShadow *node) { Gfx *shadowList = create_shadow_below_xyz(shadowPos[0], shadowPos[1], shadowPos[2], shadowScale, node->shadowSolidity, node->shadowType); if (shadowList != NULL) { mtxf_translate(mtxf, shadowPos); - mtxf_mul(gMatStack[gMatStackIndex+1], mtxf, *gCurGraphNodeCamera->matrixPtr); - incrementMatStack(); + mtxf_mul(gMatStack[gMatStackIndex + 1], mtxf, *gCurGraphNodeCamera->matrixPtr); + inc_mat_stack(); geo_append_display_list((void *) VIRTUAL_TO_PHYSICAL(shadowList), ((gShadowFlags & (SHADOW_FLAG_WATER_BOX | SHADOW_FLAG_WATER_SURFACE | SHADOW_FLAG_ICE_CARPET)) ? LAYER_TRANSPARENT : LAYER_TRANSPARENT_DECAL)); gMatStackIndex--; } @@ -919,12 +919,8 @@ s32 obj_is_in_view(struct GraphNodeObject *node, Mat4 matrix) { } // Check whether the object is horizontally in view - if (matrix[3][0] > (hScreenEdge + cullingRadius)) { - return FALSE; - } - if (matrix[3][0] < (-hScreenEdge - cullingRadius)) { - return FALSE; - } + if (matrix[3][0] > ( hScreenEdge + cullingRadius)) return FALSE; + if (matrix[3][0] < (-hScreenEdge - cullingRadius)) return FALSE; return TRUE; } @@ -956,7 +952,7 @@ void geo_process_object(struct Object *node) { if (obj_is_in_view(&node->header.gfx, gMatStack[gMatStackIndex])) { gMatStackIndex--; - incrementMatStack(); + inc_mat_stack(); if (node->header.gfx.sharedChild != NULL) { #ifdef VISUAL_DEBUG if (hitboxView) { @@ -1032,30 +1028,27 @@ void geo_process_held_object(struct GraphNodeHeldObject *node) { } if (node->objNode != NULL && node->objNode->header.gfx.sharedChild != NULL) { s32 hasAnimation = (node->objNode->header.gfx.node.flags & GRAPH_RENDER_HAS_ANIMATION) != 0; - - translation[0] = node->translation[0] / 4.0f; - translation[1] = node->translation[1] / 4.0f; - translation[2] = node->translation[2] / 4.0f; + vec3_quot_val(translation, node->translation, 4.0f); mtxf_translate(mat, translation); mtxf_copy(gMatStack[gMatStackIndex + 1], *gCurGraphNodeObject->throwMatrix); - gMatStack[gMatStackIndex + 1][3][0] = gMatStack[gMatStackIndex][3][0]; - gMatStack[gMatStackIndex + 1][3][1] = gMatStack[gMatStackIndex][3][1]; - gMatStack[gMatStackIndex + 1][3][2] = gMatStack[gMatStackIndex][3][2]; - mtxf_mul(gMatStack[gMatStackIndex + 1], mat, gMatStack[gMatStackIndex + 1]); + vec3_copy(gMatStack[gMatStackIndex + 1][3], gMatStack[gMatStackIndex][3]); + Mat4 temp; + mtxf_copy(temp, gMatStack[gMatStackIndex + 1]); + mtxf_mul(gMatStack[gMatStackIndex + 1], mat, temp); mtxf_scale_vec3f(gMatStack[gMatStackIndex + 1], gMatStack[gMatStackIndex + 1], node->objNode->header.gfx.scale); if (node->fnNode.func != NULL) { node->fnNode.func(GEO_CONTEXT_HELD_OBJ, &node->fnNode.node, (struct AllocOnlyPool *) gMatStack[gMatStackIndex + 1]); } - incrementMatStack(); - gGeoTempState.type = gCurAnimType; - gGeoTempState.enabled = gCurAnimEnabled; - gGeoTempState.frame = gCurrAnimFrame; + inc_mat_stack(); + gGeoTempState.type = gCurAnimType; + gGeoTempState.enabled = gCurAnimEnabled; + gGeoTempState.frame = gCurrAnimFrame; gGeoTempState.translationMultiplier = gCurAnimTranslationMultiplier; - gGeoTempState.attribute = gCurrAnimAttribute; - gGeoTempState.data = gCurAnimData; - gCurAnimType = 0; - gCurGraphNodeHeldObject = (void *) node; + gGeoTempState.attribute = gCurrAnimAttribute; + gGeoTempState.data = gCurAnimData; + gCurAnimType = 0; + gCurGraphNodeHeldObject = (void *) node; if (node->objNode->header.gfx.animInfo.curAnim != NULL) { geo_set_animation_globals(&node->objNode->header.gfx.animInfo, hasAnimation); } @@ -1144,9 +1137,9 @@ void geo_process_node_and_siblings(struct GraphNode *firstNode) { * to set up the projection and draw display lists. */ void geo_process_root(struct GraphNodeRoot *node, Vp *b, Vp *c, s32 clearColor) { - #if PUPPYPRINT_DEBUG +#if PUPPYPRINT_DEBUG OSTime first = osGetTime(); - #endif +#endif if (node->node.flags & GRAPH_RENDER_ACTIVE) { Mtx *initialMatrix; @@ -1156,7 +1149,7 @@ void geo_process_root(struct GraphNodeRoot *node, Vp *b, Vp *c, s32 clearColor) initialMatrix = alloc_display_list(sizeof(*initialMatrix)); gMatStackIndex = 0; gCurAnimType = 0; - vec3s_set(viewport->vp.vtrans, node->x * 4, node->y * 4, 511); + vec3s_set(viewport->vp.vtrans, node->x * 4, node->y * 4, 511); vec3s_set(viewport->vp.vscale, node->width * 4, node->height * 4, 511); if (b != NULL) { clear_frame_buffer(clearColor); @@ -1174,7 +1167,7 @@ void geo_process_root(struct GraphNodeRoot *node, Vp *b, Vp *c, s32 clearColor) gMatStackFixed[gMatStackIndex] = initialMatrix; gSPViewport(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(viewport)); gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(gMatStackFixed[gMatStackIndex]), - G_MTX_MODELVIEW | G_MTX_LOAD | G_MTX_NOPUSH); + (G_MTX_MODELVIEW | G_MTX_LOAD | G_MTX_NOPUSH)); gCurGraphNodeRoot = node; if (node->node.children != NULL) { geo_process_node_and_siblings(node->node.children); From baceb79c89604e6124a1ef0a441a4665d9c7009c Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Tue, 28 Sep 2021 14:02:13 -0700 Subject: [PATCH 27/97] Dirt particle & cartoon star particle dl names --- actors/common1.h | 24 +++++------ actors/dirt/geo.inc.c | 22 +++++----- actors/dirt/model.inc.c | 94 ++++++++++++++++++++--------------------- 3 files changed, 70 insertions(+), 70 deletions(-) diff --git a/actors/common1.h b/actors/common1.h index e7a993cb..2c2b1d7f 100644 --- a/actors/common1.h +++ b/actors/common1.h @@ -50,18 +50,18 @@ extern const Gfx coin_seg3_dl_030079B8[]; extern const GeoLayout dirt_animation_geo[]; extern const GeoLayout cartoon_star_geo[]; extern const Gfx dirt_seg3_dl_0302BFF8[]; -extern const Gfx dirt_seg3_dl_0302C028[]; -extern const Gfx dirt_seg3_dl_0302C238[]; -extern const Gfx dirt_seg3_dl_0302C298[]; -extern const Gfx dirt_seg3_dl_0302C2B8[]; -extern const Gfx dirt_seg3_dl_0302C2D8[]; -extern const Gfx dirt_seg3_dl_0302C2F8[]; -extern const Gfx dirt_seg3_dl_0302C318[]; -extern const Gfx dirt_seg3_dl_0302C378[]; -extern const Gfx dirt_seg3_dl_0302C3B0[]; -extern const Gfx dirt_seg3_dl_0302C3E8[]; -extern const Gfx dirt_seg3_dl_0302C420[]; -extern const Gfx dirt_seg3_dl_0302C458[]; +extern const Gfx dirt_seg3_dl_dirt_particle[]; +extern const Gfx dirt_seg3_sub_dl_cartoon_star[]; +extern const Gfx dirt_seg3_dl_cartoon_star_red[]; +extern const Gfx dirt_seg3_dl_cartoon_star_green[]; +extern const Gfx dirt_seg3_dl_cartoon_star_blue[]; +extern const Gfx dirt_seg3_dl_cartoon_star_yellow[]; +extern const Gfx dirt_seg3_dl_cartoon_star_billboard[]; +extern const Gfx dirt_seg3_dl_tiny_particle_red[]; +extern const Gfx dirt_seg3_dl_tiny_particle_green[]; +extern const Gfx dirt_seg3_dl_tiny_particle_blue[]; +extern const Gfx dirt_seg3_dl_tiny_particle_yellow[]; +extern const Gfx dirt_seg3_dl_tiny_particle_billboard[]; // door extern const GeoLayout castle_door_geo[]; diff --git a/actors/dirt/geo.inc.c b/actors/dirt/geo.inc.c index b27dc51c..6d045d22 100644 --- a/actors/dirt/geo.inc.c +++ b/actors/dirt/geo.inc.c @@ -4,12 +4,12 @@ const GeoLayout dirt_animation_geo[] = { GEO_OPEN_NODE(), GEO_SWITCH_CASE(6, geo_switch_anim_state), GEO_OPEN_NODE(), - GEO_DISPLAY_LIST(LAYER_OCCLUDE_SILHOUETTE_OPAQUE, dirt_seg3_dl_0302C378), - GEO_DISPLAY_LIST(LAYER_OCCLUDE_SILHOUETTE_OPAQUE, dirt_seg3_dl_0302C3B0), - GEO_DISPLAY_LIST(LAYER_OCCLUDE_SILHOUETTE_OPAQUE, dirt_seg3_dl_0302C3E8), - GEO_DISPLAY_LIST(LAYER_OCCLUDE_SILHOUETTE_ALPHA, dirt_seg3_dl_0302C028), - GEO_DISPLAY_LIST(LAYER_OCCLUDE_SILHOUETTE_OPAQUE, dirt_seg3_dl_0302C420), - GEO_DISPLAY_LIST(LAYER_OCCLUDE_SILHOUETTE_OPAQUE, dirt_seg3_dl_0302C458), + GEO_DISPLAY_LIST(LAYER_OCCLUDE_SILHOUETTE_OPAQUE, dirt_seg3_dl_tiny_particle_red), + GEO_DISPLAY_LIST(LAYER_OCCLUDE_SILHOUETTE_OPAQUE, dirt_seg3_dl_tiny_particle_green), + GEO_DISPLAY_LIST(LAYER_OCCLUDE_SILHOUETTE_OPAQUE, dirt_seg3_dl_tiny_particle_blue), + GEO_DISPLAY_LIST(LAYER_OCCLUDE_SILHOUETTE_ALPHA, dirt_seg3_dl_dirt_particle), + GEO_DISPLAY_LIST(LAYER_OCCLUDE_SILHOUETTE_OPAQUE, dirt_seg3_dl_tiny_particle_yellow), + GEO_DISPLAY_LIST(LAYER_OCCLUDE_SILHOUETTE_OPAQUE, dirt_seg3_dl_tiny_particle_billboard), GEO_CLOSE_NODE(), GEO_CLOSE_NODE(), GEO_END(), @@ -22,11 +22,11 @@ const GeoLayout cartoon_star_geo[] = { GEO_OPEN_NODE(), GEO_SWITCH_CASE(5, geo_switch_anim_state), GEO_OPEN_NODE(), - GEO_DISPLAY_LIST(LAYER_OCCLUDE_SILHOUETTE_OPAQUE, dirt_seg3_dl_0302C298), - GEO_DISPLAY_LIST(LAYER_OCCLUDE_SILHOUETTE_OPAQUE, dirt_seg3_dl_0302C2B8), - GEO_DISPLAY_LIST(LAYER_OCCLUDE_SILHOUETTE_OPAQUE, dirt_seg3_dl_0302C2D8), - GEO_DISPLAY_LIST(LAYER_OCCLUDE_SILHOUETTE_OPAQUE, dirt_seg3_dl_0302C2F8), - GEO_DISPLAY_LIST(LAYER_OCCLUDE_SILHOUETTE_OPAQUE, dirt_seg3_dl_0302C318), + GEO_DISPLAY_LIST(LAYER_OCCLUDE_SILHOUETTE_OPAQUE, dirt_seg3_dl_cartoon_star_red), + GEO_DISPLAY_LIST(LAYER_OCCLUDE_SILHOUETTE_OPAQUE, dirt_seg3_dl_cartoon_star_green), + GEO_DISPLAY_LIST(LAYER_OCCLUDE_SILHOUETTE_OPAQUE, dirt_seg3_dl_cartoon_star_blue), + GEO_DISPLAY_LIST(LAYER_OCCLUDE_SILHOUETTE_OPAQUE, dirt_seg3_dl_cartoon_star_yellow), + GEO_DISPLAY_LIST(LAYER_OCCLUDE_SILHOUETTE_OPAQUE, dirt_seg3_dl_cartoon_star_billboard), GEO_CLOSE_NODE(), GEO_CLOSE_NODE(), GEO_END(), diff --git a/actors/dirt/model.inc.c b/actors/dirt/model.inc.c index d630615f..b48fa177 100644 --- a/actors/dirt/model.inc.c +++ b/actors/dirt/model.inc.c @@ -1,25 +1,25 @@ // Dirt // 0x0302BD68 -static const Lights1 dirt_seg3_lights_0302BD68 = gdSPDefLights1( +static const Lights1 dirt_seg3_lights_red = gdSPDefLights1( 0x3f, 0x19, 0x19, 0xff, 0x64, 0x64, 0x28, 0x28, 0x28 ); // 0x0302BD80 -static const Lights1 dirt_seg3_lights_0302BD80 = gdSPDefLights1( +static const Lights1 dirt_seg3_lights_green = gdSPDefLights1( 0x19, 0x3f, 0x19, 0x64, 0xff, 0x64, 0x28, 0x28, 0x28 ); // 0x0302BD98 -static const Lights1 dirt_seg3_lights_0302BD98 = gdSPDefLights1( +static const Lights1 dirt_seg3_lights_blue = gdSPDefLights1( 0x19, 0x19, 0x3f, 0x64, 0x64, 0xff, 0x28, 0x28, 0x28 ); // 0x0302BDB0 -static const Lights1 dirt_seg3_lights_0302BDB0 = gdSPDefLights1( +static const Lights1 dirt_seg3_lights_yellow = gdSPDefLights1( 0x3f, 0x3f, 0x19, 0xff, 0xff, 0x64, 0x28, 0x28, 0x28 ); @@ -47,7 +47,7 @@ const Gfx dirt_seg3_dl_0302BFF8[] = { }; // 0x0302C028 - 0x0302C098 -const Gfx dirt_seg3_dl_0302C028[] = { +const Gfx dirt_seg3_dl_dirt_particle[] = { gsDPPipeSync(), gsDPSetCombineMode(G_CC_DECALRGBA, G_CC_DECALRGBA), gsSPClearGeometryMode(G_CULL_BACK), @@ -65,21 +65,21 @@ const Gfx dirt_seg3_dl_0302C028[] = { }; // 0x0302C098 -static const Vtx dirt_seg3_vertex_0302C098[] = { +static const Vtx dirt_seg3_vertex_tiny_particle[] = { {{{ -10, 0, 10}, 0, { 0, 0}, {0x00, 0x7f, 0x00, 0x00}}}, {{{ 10, 0, 10}, 0, { 0, 0}, {0x00, 0x7f, 0x00, 0x00}}}, {{{ 0, 0, -10}, 0, { 0, 0}, {0x00, 0x7f, 0x00, 0x00}}}, }; // 0x0302C0C8 -static const Vtx dirt_seg3_vertex_0302C0C8[] = { +static const Vtx dirt_seg3_vertex_tiny_particle_billboard[] = { {{{ -10, 10, 0}, 0, { 0, 0}, {0xff, 0xff, 0x00, 0xff}}}, {{{ 10, 10, 0}, 0, { 0, 0}, {0xff, 0xff, 0x00, 0xff}}}, {{{ 0, -10, 0}, 0, { 0, 0}, {0xff, 0xff, 0x00, 0xff}}}, }; // 0x0302C0F8 -static const Vtx dirt_seg3_vertex_0302C0F8[] = { +static const Vtx dirt_seg3_vertex_cartoon_star[] = { {{{ 0, -8, 0}, 0, { 0, 0}, {0x00, 0x00, 0x81, 0x00}}}, {{{ -32, 80, 0}, 0, { 0, 0}, {0x00, 0x00, 0x81, 0x00}}}, {{{ 32, 80, 0}, 0, { 0, 0}, {0x00, 0x00, 0x81, 0x00}}}, @@ -93,7 +93,7 @@ static const Vtx dirt_seg3_vertex_0302C0F8[] = { }; // 0x0302C198 -static const Vtx dirt_seg3_vertex_0302C198[] = { +static const Vtx dirt_seg3_vertex_cartoon_star_billboard[] = { {{{ 0, -8, 0}, 0, { 0, 0}, {0xff, 0xff, 0x00, 0xff}}}, {{{ -32, 80, 0}, 0, { 0, 0}, {0xff, 0xff, 0x00, 0xff}}}, {{{ 32, 80, 0}, 0, { 0, 0}, {0xff, 0xff, 0x00, 0xff}}}, @@ -107,9 +107,9 @@ static const Vtx dirt_seg3_vertex_0302C198[] = { }; // 0x0302C238 - 0x0302C298 -const Gfx dirt_seg3_dl_0302C238[] = { +const Gfx dirt_seg3_sub_dl_cartoon_star[] = { gsSPClearGeometryMode(G_CULL_BACK), - gsSPVertex(dirt_seg3_vertex_0302C0F8, 10, 0), + gsSPVertex(dirt_seg3_vertex_cartoon_star, 10, 0), gsSP2Triangles( 0, 1, 2, 0x0, 3, 4, 1, 0x0), gsSP2Triangles( 0, 5, 3, 0x0, 6, 7, 0, 0x0), gsSP2Triangles( 2, 8, 6, 0x0, 1, 9, 2, 0x0), @@ -119,41 +119,41 @@ const Gfx dirt_seg3_dl_0302C238[] = { }; // 0x0302C298 - 0x0302C2B8 -const Gfx dirt_seg3_dl_0302C298[] = { - gsSPLight(&dirt_seg3_lights_0302BD68.l, 1), - gsSPLight(&dirt_seg3_lights_0302BD68.a, 2), - gsSPDisplayList(dirt_seg3_dl_0302C238), +const Gfx dirt_seg3_dl_cartoon_star_red[] = { + gsSPLight(&dirt_seg3_lights_red.l, 1), + gsSPLight(&dirt_seg3_lights_red.a, 2), + gsSPDisplayList(dirt_seg3_sub_dl_cartoon_star), gsSPEndDisplayList(), }; // 0x0302C2B8 - 0x0302C2D8 -const Gfx dirt_seg3_dl_0302C2B8[] = { - gsSPLight(&dirt_seg3_lights_0302BD80.l, 1), - gsSPLight(&dirt_seg3_lights_0302BD80.a, 2), - gsSPDisplayList(dirt_seg3_dl_0302C238), +const Gfx dirt_seg3_dl_cartoon_star_green[] = { + gsSPLight(&dirt_seg3_lights_green.l, 1), + gsSPLight(&dirt_seg3_lights_green.a, 2), + gsSPDisplayList(dirt_seg3_sub_dl_cartoon_star), gsSPEndDisplayList(), }; // 0x0302C2D8 - 0x0302C2F8 -const Gfx dirt_seg3_dl_0302C2D8[] = { - gsSPLight(&dirt_seg3_lights_0302BD98.l, 1), - gsSPLight(&dirt_seg3_lights_0302BD98.a, 2), - gsSPDisplayList(dirt_seg3_dl_0302C238), +const Gfx dirt_seg3_dl_cartoon_star_blue[] = { + gsSPLight(&dirt_seg3_lights_blue.l, 1), + gsSPLight(&dirt_seg3_lights_blue.a, 2), + gsSPDisplayList(dirt_seg3_sub_dl_cartoon_star), gsSPEndDisplayList(), }; // 0x0302C2F8 - 0x0302C318 -const Gfx dirt_seg3_dl_0302C2F8[] = { - gsSPLight(&dirt_seg3_lights_0302BDB0.l, 1), - gsSPLight(&dirt_seg3_lights_0302BDB0.a, 2), - gsSPDisplayList(dirt_seg3_dl_0302C238), +const Gfx dirt_seg3_dl_cartoon_star_yellow[] = { + gsSPLight(&dirt_seg3_lights_yellow.l, 1), + gsSPLight(&dirt_seg3_lights_yellow.a, 2), + gsSPDisplayList(dirt_seg3_sub_dl_cartoon_star), gsSPEndDisplayList(), }; // 0x0302C318 - 0x0302C378 -const Gfx dirt_seg3_dl_0302C318[] = { +const Gfx dirt_seg3_dl_cartoon_star_billboard[] = { gsSPClearGeometryMode(G_LIGHTING | G_CULL_BACK), - gsSPVertex(dirt_seg3_vertex_0302C198, 10, 0), + gsSPVertex(dirt_seg3_vertex_cartoon_star_billboard, 10, 0), gsSP2Triangles( 0, 1, 2, 0x0, 3, 4, 1, 0x0), gsSP2Triangles( 0, 5, 3, 0x0, 6, 7, 0, 0x0), gsSP2Triangles( 2, 8, 6, 0x0, 1, 9, 2, 0x0), @@ -163,53 +163,53 @@ const Gfx dirt_seg3_dl_0302C318[] = { }; // 0x0302C378 - 0x0302C3B0 -const Gfx dirt_seg3_dl_0302C378[] = { - gsSPLight(&dirt_seg3_lights_0302BD68.l, 1), - gsSPLight(&dirt_seg3_lights_0302BD68.a, 2), +const Gfx dirt_seg3_dl_tiny_particle_red[] = { + gsSPLight(&dirt_seg3_lights_red.l, 1), + gsSPLight(&dirt_seg3_lights_red.a, 2), gsSPClearGeometryMode(G_CULL_BACK), - gsSPVertex(dirt_seg3_vertex_0302C098, 3, 0), + gsSPVertex(dirt_seg3_vertex_tiny_particle, 3, 0), gsSP1Triangle( 0, 1, 2, 0x0), gsSPSetGeometryMode(G_CULL_BACK), gsSPEndDisplayList(), }; // 0x0302C3B0 - 0x0302C3E8 -const Gfx dirt_seg3_dl_0302C3B0[] = { - gsSPLight(&dirt_seg3_lights_0302BD80.l, 1), - gsSPLight(&dirt_seg3_lights_0302BD80.a, 2), +const Gfx dirt_seg3_dl_tiny_particle_green[] = { + gsSPLight(&dirt_seg3_lights_green.l, 1), + gsSPLight(&dirt_seg3_lights_green.a, 2), gsSPClearGeometryMode(G_CULL_BACK), - gsSPVertex(dirt_seg3_vertex_0302C098, 3, 0), + gsSPVertex(dirt_seg3_vertex_tiny_particle, 3, 0), gsSP1Triangle( 0, 1, 2, 0x0), gsSPSetGeometryMode(G_CULL_BACK), gsSPEndDisplayList(), }; // 0x0302C3E8 - 0x0302C420 -const Gfx dirt_seg3_dl_0302C3E8[] = { - gsSPLight(&dirt_seg3_lights_0302BD98.l, 1), - gsSPLight(&dirt_seg3_lights_0302BD98.a, 2), +const Gfx dirt_seg3_dl_tiny_particle_blue[] = { + gsSPLight(&dirt_seg3_lights_blue.l, 1), + gsSPLight(&dirt_seg3_lights_blue.a, 2), gsSPClearGeometryMode(G_CULL_BACK), - gsSPVertex(dirt_seg3_vertex_0302C098, 3, 0), + gsSPVertex(dirt_seg3_vertex_tiny_particle, 3, 0), gsSP1Triangle( 0, 1, 2, 0x0), gsSPSetGeometryMode(G_CULL_BACK), gsSPEndDisplayList(), }; // 0x0302C420 - 0x0302C458 -const Gfx dirt_seg3_dl_0302C420[] = { - gsSPLight(&dirt_seg3_lights_0302BDB0.l, 1), - gsSPLight(&dirt_seg3_lights_0302BDB0.a, 2), +const Gfx dirt_seg3_dl_tiny_particle_yellow[] = { + gsSPLight(&dirt_seg3_lights_yellow.l, 1), + gsSPLight(&dirt_seg3_lights_yellow.a, 2), gsSPClearGeometryMode(G_CULL_BACK), - gsSPVertex(dirt_seg3_vertex_0302C098, 3, 0), + gsSPVertex(dirt_seg3_vertex_tiny_particle, 3, 0), gsSP1Triangle( 0, 1, 2, 0x0), gsSPSetGeometryMode(G_CULL_BACK), gsSPEndDisplayList(), }; // 0x0302C458 - 0x0302C480 -const Gfx dirt_seg3_dl_0302C458[] = { +const Gfx dirt_seg3_dl_tiny_particle_billboard[] = { gsSPClearGeometryMode(G_LIGHTING | G_CULL_BACK), - gsSPVertex(dirt_seg3_vertex_0302C0C8, 3, 0), + gsSPVertex(dirt_seg3_vertex_tiny_particle_billboard, 3, 0), gsSP1Triangle( 0, 1, 2, 0x0), gsSPSetGeometryMode(G_LIGHTING | G_CULL_BACK), gsSPEndDisplayList(), From 5b43bc3b03cd52fdebf6eff47225e1df10911756 Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Tue, 28 Sep 2021 14:04:26 -0700 Subject: [PATCH 28/97] Fix typo --- src/engine/math_util.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/engine/math_util.c b/src/engine/math_util.c index c3b8b3f9..81a56845 100644 --- a/src/engine/math_util.c +++ b/src/engine/math_util.c @@ -112,7 +112,7 @@ void vec3f_cross(Vec3f dest, Vec3f a, Vec3f b) { /// Scale vector 'dest' so it has length 1 void vec3f_normalize(Vec3f dest) { - f32 mag = sqrtf(sqr(dest[0] + sqr(dest[1]) + sqr(dest[2])); + f32 mag = sqrtf(sqr(dest[0]) + sqr(dest[1]) + sqr(dest[2])); if (mag > __FLT_EPSILON__) { register f32 invsqrt = 1.0f / mag; vec3_mul_val(dest, invsqrt); @@ -125,7 +125,7 @@ void vec3f_normalize(Vec3f dest) { /// Scale vector 'dest' so it has length -1 void vec3f_normalize_negative(Vec3f dest) { - f32 mag = sqrtf(sqr(dest[0] + sqr(dest[1]) + sqr(dest[2])); + f32 mag = sqrtf(sqr(dest[0]) + sqr(dest[1]) + sqr(dest[2])); if (mag > __FLT_EPSILON__) { register f32 invsqrt = -1.0f / mag; vec3_mul_val(dest, invsqrt); From 04b6089d72e5b69cfc20e6dfab25d1274e5c0994 Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Tue, 28 Sep 2021 14:14:48 -0700 Subject: [PATCH 29/97] Fix puppyprint font kerning --- bin/segment2.c | 26 +++++++++----------- src/engine/math_util.c | 56 ++++++++++++++++++++---------------------- 2 files changed, 37 insertions(+), 45 deletions(-) diff --git a/bin/segment2.c b/bin/segment2.c index 969f279e..033b8406 100644 --- a/bin/segment2.c +++ b/bin/segment2.c @@ -17,22 +17,11 @@ ALIGNED8 static const Texture small_font_2[] = { #include "textures/segment2/custom_text2.i4.inc.c" }; -const Texture *const puppyprint_font_lut[2] = -{ +const Texture *const puppyprint_font_lut[2] = { small_font_1, small_font_2 }; -static const u8 small_font_kerning_1[80] = -{ - /*0*/ 7, /*1*/ 7, /*2*/ 7, /*3*/ 7, /*4*/ 7, /*5*/ 7, /*6*/ 7, /*7*/ 7, /*8*/ 7, /*9*/ 7, /*-*/ 7, /*+*/ 7, /*(*/ 4, /*)*/ 4, /*!*/ 5, /*?*/ 6, - /*A*/ 7, /*B*/ 7, /*C*/ 7, /*D*/ 7, /*E*/ 7, /*F*/ 7, /*G*/ 7, /*H*/ 7, /*I*/ 7, /*J*/ 7, /*K*/ 7, /*L*/ 7, /*M*/ 7, /*N*/ 7, /*O*/ 7, /*P*/ 7, - /*Q*/ 7, /*R*/ 7, /*S*/ 7, /*T*/ 7, /*U*/ 7, /*V*/ 7, /*W*/ 7, /*X*/ 7, /*Y*/ 7, /*Z*/ 7, /*"*/ 5, /*'*/ 2, /*:*/ 3, /*;*/ 3, /*.*/ 3, /*,*/ 3, - /*a*/ 6, /*b*/ 6, /*c*/ 6, /*d*/ 6, /*e*/ 6, /*f*/ 6, /*g*/ 6, /*h*/ 6, /*i*/ 2, /*j*/ 6, /*k*/ 6, /*l*/ 3, /*m*/ 6, /*n*/ 6, /*o*/ 6, /*p*/ 6, - /*q*/ 6, /*r*/ 6, /*s*/ 6, /*t*/ 6, /*u*/ 6, /*v*/ 6, /*w*/ 6, /*x*/ 6, /*y*/ 6, /*z*/ 6, /*~*/ 7, /*¨*/ 6, /*^*/ 7, /*/*/ 6, /*%*/ 6, /*&*/ 7, -}; - -static const u8 small_font_kerning_2[80] = -{ +static const u8 small_font_kerning_1[80] = { /*0*/ 6, /*1*/ 5, /*2*/ 7, /*3*/ 7, /*4*/ 7, /*5*/ 7, /*6*/ 8, /*7*/ 7, /*8*/ 7, /*9*/ 6, /*-*/ 8, /*+*/ 8, /*(*/ 5, /*)*/ 5, /*!*/ 4, /*?*/ 6, /*A*/ 7, /*B*/ 7, /*C*/ 7, /*D*/ 7, /*E*/ 6, /*F*/ 5, /*G*/ 8, /*H*/ 6, /*I*/ 6, /*J*/ 5, /*K*/ 7, /*L*/ 6, /*M*/ 7, /*N*/ 7, /*O*/ 7, /*P*/ 6, /*Q*/ 8, /*R*/ 6, /*S*/ 7, /*T*/ 7, /*U*/ 7, /*V*/ 7, /*W*/ 8, /*X*/ 7, /*Y*/ 7, /*Z*/ 7, /*"*/ 5, /*'*/ 2, /*:*/ 3, /*;*/ 3, /*.*/ 3, /*,*/ 3, @@ -40,8 +29,15 @@ static const u8 small_font_kerning_2[80] = /*q*/ 7, /*r*/ 6, /*s*/ 6, /*t*/ 6, /*u*/ 6, /*v*/ 7, /*w*/ 8, /*x*/ 6, /*y*/ 8, /*z*/ 7, /*~*/ 8, /*¨*/ 7, /*^*/ 8, /*/*/ 8, /*%*/ 8, /*&*/ 8, }; -const u8 *const puppyprint_kerning_lut[2][80] = -{ +static const u8 small_font_kerning_2[80] = { + /*0*/ 7, /*1*/ 7, /*2*/ 7, /*3*/ 7, /*4*/ 7, /*5*/ 7, /*6*/ 7, /*7*/ 7, /*8*/ 7, /*9*/ 7, /*-*/ 7, /*+*/ 7, /*(*/ 4, /*)*/ 4, /*!*/ 5, /*?*/ 6, + /*A*/ 7, /*B*/ 7, /*C*/ 7, /*D*/ 7, /*E*/ 7, /*F*/ 7, /*G*/ 7, /*H*/ 7, /*I*/ 7, /*J*/ 7, /*K*/ 7, /*L*/ 7, /*M*/ 7, /*N*/ 7, /*O*/ 7, /*P*/ 7, + /*Q*/ 7, /*R*/ 7, /*S*/ 7, /*T*/ 7, /*U*/ 7, /*V*/ 7, /*W*/ 7, /*X*/ 7, /*Y*/ 7, /*Z*/ 7, /*"*/ 5, /*'*/ 2, /*:*/ 3, /*;*/ 3, /*.*/ 3, /*,*/ 3, + /*a*/ 6, /*b*/ 6, /*c*/ 6, /*d*/ 6, /*e*/ 6, /*f*/ 6, /*g*/ 6, /*h*/ 6, /*i*/ 2, /*j*/ 6, /*k*/ 6, /*l*/ 3, /*m*/ 6, /*n*/ 6, /*o*/ 6, /*p*/ 6, + /*q*/ 6, /*r*/ 6, /*s*/ 6, /*t*/ 6, /*u*/ 6, /*v*/ 6, /*w*/ 6, /*x*/ 6, /*y*/ 6, /*z*/ 6, /*~*/ 7, /*¨*/ 6, /*^*/ 7, /*/*/ 6, /*%*/ 6, /*&*/ 7, +}; + +const u8 *const puppyprint_kerning_lut[2][80] = { small_font_kerning_1, small_font_kerning_2 }; diff --git a/src/engine/math_util.c b/src/engine/math_util.c index 81a56845..f4ddfea7 100644 --- a/src/engine/math_util.c +++ b/src/engine/math_util.c @@ -180,39 +180,35 @@ void mtxf_rot_trans_mul(Vec3s rot, Vec3f trans, Mat4 dest, Mat4 src) { register f32 sz = sins(rot[2]); register f32 cz = coss(rot[2]); - register f32 entry0; - register f32 entry1; - register f32 entry2; + register Vec3f entry; - entry0 = cy * cz; - entry1 = cy * sz; - entry2 = -sy; - dest[0][0] = entry0 * src[0][0] + entry1 * src[1][0] + entry2 * src[2][0]; - dest[0][1] = entry0 * src[0][1] + entry1 * src[1][1] + entry2 * src[2][1]; - dest[0][2] = entry0 * src[0][2] + entry1 * src[1][2] + entry2 * src[2][2]; + entry[0] = cy * cz; + entry[1] = cy * sz; + entry[2] = -sy; + dest[0][0] = entry[0] * src[0][0] + entry[1] * src[1][0] + entry[2] * src[2][0]; + dest[0][1] = entry[0] * src[0][1] + entry[1] * src[1][1] + entry[2] * src[2][1]; + dest[0][2] = entry[0] * src[0][2] + entry[1] * src[1][2] + entry[2] * src[2][2]; - entry1 = sx * sy; - entry0 = entry1 * cz - cx * sz; - entry1 = entry1 * sz + cx * cz; - entry2 = sx * cy; - dest[1][0] = entry0 * src[0][0] + entry1 * src[1][0] + entry2 * src[2][0]; - dest[1][1] = entry0 * src[0][1] + entry1 * src[1][1] + entry2 * src[2][1]; - dest[1][2] = entry0 * src[0][2] + entry1 * src[1][2] + entry2 * src[2][2]; + entry[1] = sx * sy; + entry[0] = (entry[1] * cz) - (cx * sz); + entry[1] = (entry[1] * sz) + (cx * cz); + entry[2] = sx * cy; + dest[1][0] = entry[0] * src[0][0] + entry[1] * src[1][0] + entry[2] * src[2][0]; + dest[1][1] = entry[0] * src[0][1] + entry[1] * src[1][1] + entry[2] * src[2][1]; + dest[1][2] = entry[0] * src[0][2] + entry[1] * src[1][2] + entry[2] * src[2][2]; - entry1 = cx * sy; - entry0 = entry1 * cz + sx * sz; - entry1 = entry1 * sz - sx * cz; - entry2 = cx * cy; - dest[2][0] = entry0 * src[0][0] + entry1 * src[1][0] + entry2 * src[2][0]; - dest[2][1] = entry0 * src[0][1] + entry1 * src[1][1] + entry2 * src[2][1]; - dest[2][2] = entry0 * src[0][2] + entry1 * src[1][2] + entry2 * src[2][2]; + entry[1] = cx * sy; + entry[0] = (entry[1] * cz) + (sx * sz); + entry[1] = (entry[1] * sz) - (sx * cz); + entry[2] = cx * cy; + dest[2][0] = entry[0] * src[0][0] + entry[1] * src[1][0] + entry[2] * src[2][0]; + dest[2][1] = entry[0] * src[0][1] + entry[1] * src[1][1] + entry[2] * src[2][1]; + dest[2][2] = entry[0] * src[0][2] + entry[1] * src[1][2] + entry[2] * src[2][2]; - entry0 = trans[0]; - entry1 = trans[1]; - entry2 = trans[2]; - dest[3][0] = entry0 * src[0][0] + entry1 * src[1][0] + entry2 * src[2][0] + src[3][0]; - dest[3][1] = entry0 * src[0][1] + entry1 * src[1][1] + entry2 * src[2][1] + src[3][1]; - dest[3][2] = entry0 * src[0][2] + entry1 * src[1][2] + entry2 * src[2][2] + src[3][2]; + vec3_copy(entry, trans); + dest[3][0] = entry[0] * src[0][0] + entry[1] * src[1][0] + entry[2] * src[2][0] + src[3][0]; + dest[3][1] = entry[0] * src[0][1] + entry[1] * src[1][1] + entry[2] * src[2][1] + src[3][1]; + dest[3][2] = entry[0] * src[0][2] + entry[1] * src[1][2] + entry[2] * src[2][2] + src[3][2]; dest[0][3] = dest[1][3] = dest[2][3] = 0; ((u32 *) dest)[15] = 0x3F800000; } @@ -228,7 +224,7 @@ void mtxf_lookat(Mat4 mtx, Vec3f from, Vec3f to, s32 roll) { register f32 dx = (to[0] - from[0]); register f32 dz = (to[2] - from[2]); register f32 invLength = sqrtf(sqr(dx) + sqr(dz)); - invLength = -(1.0f / MAX(invLength, NEAR_ZERO)); + invLength = -(1.0f / MAX(invLength, __FLT_EPSILON__)); dx *= invLength; dz *= invLength; f32 sr = sins(roll); From beee3c05626f797a08bd5d3215eb1ea9db7d3a86 Mon Sep 17 00:00:00 2001 From: Fazana <52551480+FazanaJ@users.noreply.github.com> Date: Tue, 28 Sep 2021 22:26:14 +0100 Subject: [PATCH 30/97] Puppyprint debugging now supports nonstandard resolutions Isn't that nice? --- src/game/puppyprint.c | 52 +++++++++++++++++++++---------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/src/game/puppyprint.c b/src/game/puppyprint.c index 5c3bc265..da42b513 100644 --- a/src/game/puppyprint.c +++ b/src/game/puppyprint.c @@ -201,7 +201,7 @@ void print_ram_bar(void) { s32 i = 0; f32 perfPercentage; s32 graphPos = 0; - s32 prevGraph = 160 - (BAR_LENGTH / 2); + s32 prevGraph = (SCREEN_WIDTH/2) - (BAR_LENGTH / 2); s32 ramsize = osGetMemSize(); prepare_blank_box(); @@ -211,16 +211,16 @@ void print_ram_bar(void) { continue; } perfPercentage = (f32)ramsizeSegment[i]/ramsize; - graphPos = prevGraph + CLAMP((BAR_LENGTH * perfPercentage), 1, 160 + (BAR_LENGTH / 2)); - render_blank_box(prevGraph, 210, graphPos, 218, colourChart[i][0], colourChart[i][1], colourChart[i][2], 255); + graphPos = prevGraph + CLAMP((BAR_LENGTH * perfPercentage), 1, (SCREEN_WIDTH/2) + (BAR_LENGTH / 2)); + render_blank_box(prevGraph, SCREEN_HEIGHT-30, graphPos, SCREEN_HEIGHT-22, colourChart[i][0], colourChart[i][1], colourChart[i][2], 255); prevGraph = graphPos; } perfPercentage = (f32)ramsizeSegment[32]/ramsize; - graphPos = prevGraph + CLAMP((BAR_LENGTH * perfPercentage), 1, 160 + (BAR_LENGTH / 2)); - render_blank_box(prevGraph, 210, graphPos, 218, 255, 255, 255, 255); + graphPos = prevGraph + CLAMP((BAR_LENGTH * perfPercentage), 1, (SCREEN_WIDTH/2) + (BAR_LENGTH / 2)); + render_blank_box(prevGraph, SCREEN_HEIGHT-30, graphPos, SCREEN_HEIGHT-22, 255, 255, 255, 255); prevGraph = graphPos; - render_blank_box(prevGraph, 210, 160+(BAR_LENGTH / 2), 218, 0, 0, 0, 255); + render_blank_box(prevGraph, SCREEN_HEIGHT-30, (SCREEN_WIDTH/2)+(BAR_LENGTH / 2), SCREEN_HEIGHT-22, 0, 0, 0, 255); finish_blank_box(); } @@ -247,7 +247,7 @@ void print_ram_overview(void) { s32 y = 16; s32 drawn = 0; prepare_blank_box(); - render_blank_box(0, 0, 320, 240, 0, 0, 0, 192); + render_blank_box(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0, 0, 192); finish_blank_box(); for (i = 0; i < 33; i++) { @@ -302,10 +302,10 @@ void print_which_benchmark(void) { char textBytes[40]; prepare_blank_box(); - render_blank_box(110, 115, 210, 160, 0, 0, 0, 255); + render_blank_box((SCREEN_WIDTH/2)-50, 115, (SCREEN_WIDTH/2)+50, 160, 0, 0, 0, 255); finish_blank_box(); sprintf(textBytes, "Select Option#%s#L: Confirm", benchNames[benchOption]); - print_small_text(160,120, textBytes, PRINT_TEXT_ALIGN_CENTRE, PRINT_ALL, FONT_DEFAULT); + print_small_text((SCREEN_WIDTH/2),120, textBytes, PRINT_TEXT_ALIGN_CENTRE, PRINT_ALL, FONT_DEFAULT); } char consoleLogTable[LOG_BUFFER_SIZE][255]; @@ -372,7 +372,7 @@ void puppyprint_render_profiler(void) { } sprintf(textBytes, "RAM: %06X /%06X (%d_)", main_pool_available(), mempool, (s32)(((f32)main_pool_available() / (f32)mempool) * 100)); - print_small_text(160, 224, textBytes, PRINT_TEXT_ALIGN_CENTRE, PRINT_ALL, FONT_OUTLINE); + print_small_text((SCREEN_WIDTH/2), SCREEN_HEIGHT-16, textBytes, PRINT_TEXT_ALIGN_CENTRE, PRINT_ALL, FONT_OUTLINE); if (!ramViewer && !benchViewer && !logViewer) { print_fps(16,40); @@ -394,7 +394,7 @@ void puppyprint_render_profiler(void) { // Same for the camera, especially so because this will crash otherwise. if (gCamera) { sprintf(textBytes, "Camera Pos#X: %d#Y: %d#Z: %d#D: %X", (s32)(gCamera->pos[0]), (s32)(gCamera->pos[1]), (s32)(gCamera->pos[2]), (u16)(gCamera->yaw)); - print_small_text(304, 140, textBytes, PRINT_TEXT_ALIGN_RIGHT, PRINT_ALL, FONT_OUTLINE); + print_small_text(SCREEN_WIDTH-16, 140, textBytes, PRINT_TEXT_ALIGN_RIGHT, PRINT_ALL, FONT_OUTLINE); } if (benchmarkTimer > 0) { @@ -407,9 +407,9 @@ void puppyprint_render_profiler(void) { // sprintf(textBytes, "Benchmark: %dus#High: %dus", (s32)OS_CYCLES_TO_USEC(benchMark[NUM_BENCH_ITERATIONS]), (s32)OS_CYCLES_TO_USEC(benchMark[NUM_BENCH_ITERATIONS+1])); sprintf(textBytes, "Done in %0.000f seconds#Benchmark: %dus#High: %dus", (f32)(benchmarkProgramTimer) * 0.000001f, (s32)OS_CYCLES_TO_USEC(benchMark[NUM_BENCH_ITERATIONS]), (s32)OS_CYCLES_TO_USEC(benchMark[NUM_BENCH_ITERATIONS + 1])); #endif - render_blank_box(160 - (get_text_width(textBytes, FONT_OUTLINE) / 2) - 4, 158, 160 + (get_text_width(textBytes, FONT_OUTLINE) / 2) + 4, 196, 0, 0, 0, 255); + render_blank_box((SCREEN_WIDTH/2) - (get_text_width(textBytes, FONT_OUTLINE) / 2) - 4, 158, (SCREEN_WIDTH/2) + (get_text_width(textBytes, FONT_OUTLINE) / 2) + 4, 196, 0, 0, 0, 255); print_set_envcolour(255, 255, 255, 255); - print_small_text(160, 160, textBytes, PRINT_TEXT_ALIGN_CENTRE, PRINT_ALL, FONT_OUTLINE); + print_small_text((SCREEN_WIDTH/2), 160, textBytes, PRINT_TEXT_ALIGN_CENTRE, PRINT_ALL, FONT_OUTLINE); finish_blank_box(); } @@ -423,32 +423,32 @@ void puppyprint_render_profiler(void) { #ifdef PUPPYPRINT_DEBUG_CYCLES sprintf(textBytes, "Collision: %dc", (s32)(collisionTime[NUM_PERF_ITERATIONS])); - print_small_text(304, 40, textBytes, PRINT_TEXT_ALIGN_RIGHT, PRINT_ALL, FONT_OUTLINE); + print_small_text(SCREEN_WIDTH-16, 40, textBytes, PRINT_TEXT_ALIGN_RIGHT, PRINT_ALL, FONT_OUTLINE); sprintf(textBytes, "Graph: %dc", (s32)(graphTime[NUM_PERF_ITERATIONS])); - print_small_text(304, 52, textBytes, PRINT_TEXT_ALIGN_RIGHT, PRINT_ALL, FONT_OUTLINE); + print_small_text(SCREEN_WIDTH-16, 52, textBytes, PRINT_TEXT_ALIGN_RIGHT, PRINT_ALL, FONT_OUTLINE); sprintf(textBytes, "Behaviour: %dc", (s32)(behaviourTime[NUM_PERF_ITERATIONS])); - print_small_text(304, 64, textBytes, PRINT_TEXT_ALIGN_RIGHT, PRINT_ALL, FONT_OUTLINE); + print_small_text(SCREEN_WIDTH-16, 64, textBytes, PRINT_TEXT_ALIGN_RIGHT, PRINT_ALL, FONT_OUTLINE); sprintf(textBytes, "Audio: %dc", (s32)(audioTime[NUM_PERF_ITERATIONS])); - print_small_text(304, 76, textBytes, PRINT_TEXT_ALIGN_RIGHT, PRINT_ALL, FONT_OUTLINE); + print_small_text(SCREEN_WIDTH-16, 76, textBytes, PRINT_TEXT_ALIGN_RIGHT, PRINT_ALL, FONT_OUTLINE); sprintf(textBytes, "DMA: %dc", (s32)(dmaTime[NUM_PERF_ITERATIONS])); - print_small_text(304, 88, textBytes, PRINT_TEXT_ALIGN_RIGHT, PRINT_ALL, FONT_OUTLINE); + print_small_text(SCREEN_WIDTH-16, 88, textBytes, PRINT_TEXT_ALIGN_RIGHT, PRINT_ALL, FONT_OUTLINE); #else sprintf(textBytes, "Collision: %dus", (s32)OS_CYCLES_TO_USEC(collisionTime[NUM_PERF_ITERATIONS])); - print_small_text(304, 40, textBytes, PRINT_TEXT_ALIGN_RIGHT, PRINT_ALL, FONT_OUTLINE); + print_small_text(SCREEN_WIDTH-16, 40, textBytes, PRINT_TEXT_ALIGN_RIGHT, PRINT_ALL, FONT_OUTLINE); sprintf(textBytes, "Graph: %dus", (s32)OS_CYCLES_TO_USEC(graphTime[NUM_PERF_ITERATIONS])); - print_small_text(304, 52, textBytes, PRINT_TEXT_ALIGN_RIGHT, PRINT_ALL, FONT_OUTLINE); + print_small_text(SCREEN_WIDTH-16, 52, textBytes, PRINT_TEXT_ALIGN_RIGHT, PRINT_ALL, FONT_OUTLINE); sprintf(textBytes, "Behaviour: %dus", (s32)OS_CYCLES_TO_USEC(behaviourTime[NUM_PERF_ITERATIONS])); - print_small_text(304, 64, textBytes, PRINT_TEXT_ALIGN_RIGHT, PRINT_ALL, FONT_OUTLINE); + print_small_text(SCREEN_WIDTH-16, 64, textBytes, PRINT_TEXT_ALIGN_RIGHT, PRINT_ALL, FONT_OUTLINE); sprintf(textBytes, "Audio: %dus", (s32)OS_CYCLES_TO_USEC(audioTime[NUM_PERF_ITERATIONS])); - print_small_text(304, 76, textBytes, PRINT_TEXT_ALIGN_RIGHT, PRINT_ALL, FONT_OUTLINE); + print_small_text(SCREEN_WIDTH-16, 76, textBytes, PRINT_TEXT_ALIGN_RIGHT, PRINT_ALL, FONT_OUTLINE); sprintf(textBytes, "DMA: %dus", (s32)OS_CYCLES_TO_USEC(dmaTime[NUM_PERF_ITERATIONS])); - print_small_text(304, 88, textBytes, PRINT_TEXT_ALIGN_RIGHT, PRINT_ALL, FONT_OUTLINE); + print_small_text(SCREEN_WIDTH-16, 88, textBytes, PRINT_TEXT_ALIGN_RIGHT, PRINT_ALL, FONT_OUTLINE); #endif // Render CPU breakdown bar. prepare_blank_box(); - graphPos = 224 + perfPercentage[0]; - render_blank_box(224, 104, graphPos, 112, 255, 0, 0, 255); + graphPos = SCREEN_WIDTH-96 + perfPercentage[0]; + render_blank_box(SCREEN_WIDTH-96, 104, graphPos, 112, 255, 0, 0, 255); prevGraph = graphPos; graphPos += perfPercentage[1]; render_blank_box(prevGraph, 104, graphPos, 112, 0, 0, 255, 255); @@ -460,7 +460,7 @@ void puppyprint_render_profiler(void) { render_blank_box(prevGraph, 104, graphPos, 112, 255, 255, 0, 255); prevGraph = graphPos; graphPos += perfPercentage[4]; - render_blank_box(prevGraph, 104, 304, 112, 255, 0, 255, 255); + render_blank_box(prevGraph, 104, SCREEN_WIDTH-16, 112, 255, 0, 255, 255); } else if (ramViewer) { print_ram_overview(); } else if (logViewer) { From 65e8369d1ce17bd7bf18a8648df5a74739ad5f94 Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Tue, 28 Sep 2021 14:28:14 -0700 Subject: [PATCH 31/97] Puppyprint debug font improvements --- bin/segment2.c | 10 +++++----- textures/segment2/custom_text2.i4.png | Bin 16247 -> 1681 bytes 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/bin/segment2.c b/bin/segment2.c index 033b8406..f9526518 100644 --- a/bin/segment2.c +++ b/bin/segment2.c @@ -30,11 +30,11 @@ static const u8 small_font_kerning_1[80] = { }; static const u8 small_font_kerning_2[80] = { - /*0*/ 7, /*1*/ 7, /*2*/ 7, /*3*/ 7, /*4*/ 7, /*5*/ 7, /*6*/ 7, /*7*/ 7, /*8*/ 7, /*9*/ 7, /*-*/ 7, /*+*/ 7, /*(*/ 4, /*)*/ 4, /*!*/ 5, /*?*/ 6, - /*A*/ 7, /*B*/ 7, /*C*/ 7, /*D*/ 7, /*E*/ 7, /*F*/ 7, /*G*/ 7, /*H*/ 7, /*I*/ 7, /*J*/ 7, /*K*/ 7, /*L*/ 7, /*M*/ 7, /*N*/ 7, /*O*/ 7, /*P*/ 7, - /*Q*/ 7, /*R*/ 7, /*S*/ 7, /*T*/ 7, /*U*/ 7, /*V*/ 7, /*W*/ 7, /*X*/ 7, /*Y*/ 7, /*Z*/ 7, /*"*/ 5, /*'*/ 2, /*:*/ 3, /*;*/ 3, /*.*/ 3, /*,*/ 3, - /*a*/ 6, /*b*/ 6, /*c*/ 6, /*d*/ 6, /*e*/ 6, /*f*/ 6, /*g*/ 6, /*h*/ 6, /*i*/ 2, /*j*/ 6, /*k*/ 6, /*l*/ 3, /*m*/ 6, /*n*/ 6, /*o*/ 6, /*p*/ 6, - /*q*/ 6, /*r*/ 6, /*s*/ 6, /*t*/ 6, /*u*/ 6, /*v*/ 6, /*w*/ 6, /*x*/ 6, /*y*/ 6, /*z*/ 6, /*~*/ 7, /*¨*/ 6, /*^*/ 7, /*/*/ 6, /*%*/ 6, /*&*/ 7, + /*0*/ 6, /*1*/ 6, /*2*/ 6, /*3*/ 6, /*4*/ 6, /*5*/ 6, /*6*/ 6, /*7*/ 6, /*8*/ 6, /*9*/ 6, /*-*/ 6, /*+*/ 6, /*(*/ 3, /*)*/ 3, /*!*/ 4, /*?*/ 5, + /*A*/ 6, /*B*/ 6, /*C*/ 6, /*D*/ 6, /*E*/ 6, /*F*/ 6, /*G*/ 6, /*H*/ 6, /*I*/ 6, /*J*/ 6, /*K*/ 6, /*L*/ 6, /*M*/ 6, /*N*/ 6, /*O*/ 6, /*P*/ 6, + /*Q*/ 6, /*R*/ 6, /*S*/ 6, /*T*/ 6, /*U*/ 6, /*V*/ 6, /*W*/ 6, /*X*/ 6, /*Y*/ 6, /*Z*/ 6, /*"*/ 4, /*'*/ 1, /*:*/ 2, /*;*/ 2, /*.*/ 2, /*,*/ 2, + /*a*/ 5, /*b*/ 5, /*c*/ 5, /*d*/ 5, /*e*/ 5, /*f*/ 5, /*g*/ 5, /*h*/ 5, /*i*/ 1, /*j*/ 5, /*k*/ 5, /*l*/ 3, /*m*/ 5, /*n*/ 5, /*o*/ 5, /*p*/ 5, + /*q*/ 5, /*r*/ 5, /*s*/ 5, /*t*/ 5, /*u*/ 5, /*v*/ 5, /*w*/ 5, /*x*/ 5, /*y*/ 5, /*z*/ 5, /*~*/ 6, /*¨*/ 5, /*^*/ 6, /*/*/ 5, /*%*/ 5, /*&*/ 6, }; const u8 *const puppyprint_kerning_lut[2][80] = { diff --git a/textures/segment2/custom_text2.i4.png b/textures/segment2/custom_text2.i4.png index ccecd85f80c1c528ca00be449182fba0ae95a2e6..4073382638478f4194b40696310830a479e21900 100644 GIT binary patch delta 1665 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 DXE1q! From f03d21fd04aac68ac0ce935b9fed78c67dd736ea Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Tue, 28 Sep 2021 14:36:54 -0700 Subject: [PATCH 32/97] Fix png formats --- actors/coin/coin_front.ia8.png | Bin 13846 -> 2552 bytes actors/coin/coin_side.ia8.png | Bin 8610 -> 1007 bytes actors/coin/coin_tilt_left.ia8.png | Bin 14685 -> 2725 bytes actors/coin/coin_tilt_right.ia8.png | Bin 13170 -> 2304 bytes textures/segment2/custom_text.i4.png | Bin 2646 -> 1809 bytes textures/segment2/custom_text2.i4.png | Bin 1681 -> 1443 bytes 6 files changed, 0 insertions(+), 0 deletions(-) diff --git a/actors/coin/coin_front.ia8.png b/actors/coin/coin_front.ia8.png index ebda0e72a8d24542a43ecc136a56032e0d1fc685..85c25f4b05887164dd05e35ce907eec5a3897284 100644 GIT binary patch delta 2535 zcmbQ1^Fw%oBnJxv0|P_C&d|wyy5jYmt2|vCLo)6iy?MJ|^?E4Vhx_YR6~DcF_uaPT zlh5?%Z|s#l-k|vK*$-A04o!Uz4$hBFNA4e}XB6W2DD;tmapZCD^$8R345J=&4X!MDWo@aKtu>Qvk z#v0peN+&&bTmF9Y-_b+hM9Lx_@x#Yi9%LJKHTf*loot@YYvjl>bHQ5G@Fls2V;d{( zv+t8qUNmis$IBRd-`05sN3Ij^|=|GI7C;wiSA4+DDNR){m~6I#3?^=Xf=>(bkCg{rDAjzqj$l^$yx zI$!F-sT&ch^OzDj4@`foW1JpYduvs1&hLdAqf+ngRnrQ-|8>z{+OKw#}>G?<H!{_%dt z!my~XJ?yqGyUlv1-1|I>`D2g48HG7t9L?VU+tvB6=#{Lc*{$-E>%4C3S2?YF{JHM* z@+o|K-gUj~EblvPU@AC$l3{e&e~0?zhVoav1Ly8~<=&R%|D&mI#ih^E`!W(&XXZ_aOxpvD#ZnNMui+Rug(42bv-iBNaJ%KAp z4C>z77e>@9&~_KOq-K16idSIf3)%OJ-g1gR_X)XX^ENlxeDA8)cDgfdJf|s7Q&|cfR~C6?CZ((~Dt&NaA+zf;P8Zy)uiv2*EPcy7NUfrE-L`ezby4qG zR*KF0QoJwyk%4MVuf}!r3xN?|cPx*&5PF_Mv`4EaBd?RD^qxZvBf@tIK@f?0RSWyKPz9GPZXc(|p61`9vCUJ247xJ=5iM<$2TM9GhXjLs+tn7cwEIa6Z&gbs` zS?qi+wySsfau=7p&9?6mk^0rqJ2|~RbE#g2*dqR0E^HUqX?x9ncQJa0>B5(4<9B zc@{T+RcTOc#&WB|?b%^RvbXO^eNrEM?&VyMJF7mrDem02b&0Q*bFeIH)Fzdc@7B%i zQMugeOH=RL&N^fAee8`l_2R z_|E(E*a`;)YF~Bx_T1&fpSyNnCgtyXw`X0|$v>I5pI>`&@1yMX%M%}Q^7F`Q^{>t{ zDcqo-@%;LQ(A@c79UiqBr2kWSvf{O(_{O*H%YP|YZK$8j75}(#<;2%*tCsREUMbyn zuKGw;@c!rXSNiX{_-RJ`w$$U&WqyYCrHAKjd}!FPpJ(aH=zEq6BeSjV3C0xoWk0-Q zoOj2c$4Gw5nPv08GOVi%-+AGI>r`fIujKvG&pOryNmZS$cvusdd3|ANbmxrzv(x!v zzqWY_cUVkkl|J{gD@z{imh;}cLHW_!`rXGJyx(4M zymaERis`kr%NtX3XFXHgsu67cJn?r?wObW0^Si36S6LrrGt}t*iIUm*gqQiQ2_p{| zvu*BF=IeJ1#I}^Im3onB+NyauNW+)6*Y%>UT=D63s}w&cWZj<4xAynt0iH2OAa+dB3qPLoz`-Bw)m)-rNiL|^hJ7uD;VCMA5`B75fJVeY)8?_TpT+~?~* zT7T)t=UrBMXLysUGvm@$%Fg`n?XxCm^(2O~Us-}@P7JqwE<5wm^uw}lCiWcs$4;4^ zmwIu_C~#?>LiPQZX&FpGCnxpH-CD9VSASQ|qNlST);?>=Z*Na}+LgXGGt$5I;N8xR z2H}qBuG!C~de8g1E$U(Yq1fIm`QC$F=PPcduT|}=pIfWoD-)cS;+6k<+H~KK@elRX zm#%MDPk!pV)wcikCGThN~h!bWx1!WYp=bxocGd|+mfFz|149UWmRzW^|rUCr~dob z-2eJvc=FN4*##LRIq}QZnt5H%D&zeB=<%=MoboMo`rED; zRSGRqy!hsg^SvCS8B4eQIdA`tfBNy){7D|SzC|#Kd5UiRm~Ow%fBWgz-ydH*vgCug feB%81AAZ@#JpR*a{Qa&5s7dGP>gTe~DWM4f6a^1I literal 13846 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 S{qX|Sdh&Gjb6Mw<&;$Us`TX<% diff --git a/actors/coin/coin_side.ia8.png b/actors/coin/coin_side.ia8.png index 7c8bf58e484b76a2e5ec51e0080ab2c9f9ab9ea4..0b30a4255996f6a0ef3b81c83533b8a88627c99a 100644 GIT binary patch delta 996 zcmZ4F{GNS+WIYQ50|P_C&QJyh2F?PH$YKTtzC$3)D5~Mrz`($~(9^{+B;(%En`is( zxQMVmSbyr<7atF!156@^_{0P~7&p2kbsm{#{(!YYHm>1$qiD{=9}^v18c!}+e%n4& zC+4vVkF>Sd!)d#g=1qNlW$*Vn)iu^N>2FK#ZATbcQCCmIWX8>0e{w&=#-h6gI3^<=}46$#N2@+4ZR|H*RNw$d{iXZc#!P7M!$9 z$$o!*-PxOri!-j=IBj+CUhZ7S4gaEe6&|@5%#d*{cv^D#*=$CZX6}oD7dY0vxpR*r z(X^p*_C5J23)tPK`|YjQ%VXHccp&Ec_mt@`Hk7|w_qj^*!5#G||1_^%mnxm}S1~SN zw6>mes_B7`dcN0zXB-B$>W6Qp#H?k|4{bS_9H>7%{Pi8rvr-m6SlJ^@EUi8_mNkYe zGMTuoT_9Lmb}P!t!2Q9M+iJ%zO<+skwbUxkuwmPQ3g4ojlEjkLat+It)IZeq)bHN3 zXysW!g z8I2oueEhR*N?x6#@S#t+_d?pFgD3nKb~-A>p`RnpC9QSM;fMIsroze6H$)o$#Jnhe z=&;WBaEY?&J8cs` z@~HF5szynt#}f}O5Okd!c;$+r3Ukx(x~mphCX1Sl%Vl4=JP0`PV{(Q-%4GF-mFvTJ zW$I6Fy6>}0=m+;+^X#P$B6fV(u_B?_JFPr2TzoFh8pM)9%H3ZZqJFm^FIQ!pI ztLDU{h)F@B2et_0Yt0HUWjz`4%W2v_eul)A4V5mFvzT8@>r`CqcaP(ts+&n6qrjH0 zZYI7j*{`py&^r-Zr_64~U@>{CoT!wY@oVvSdCUS~?h2JsPfDB@@F#9RD7jsJZOn&t z@-jS%&&AzM#2@xOIGB|$bM1fa|HbR`D;_B9dMo{Y&A!|AwUPN>t)Cp92FlN#u6{1- HoD!M>wWJvCc7{e06-vlZ^T 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 Q8_?PWPgg&ebxsLQ0K2{Dga7~l diff --git a/actors/coin/coin_tilt_right.ia8.png b/actors/coin/coin_tilt_right.ia8.png index fcf14e271adf0847c78f5b8ed2ec88356f678fd6..5e1780c8441e361ba64fe7400fe940c317c23466 100644 GIT binary patch delta 2284 zcmeyA)*v)Nl7oeTfq@}mXXqqt@p_I;o-U3d8TXFf^vsXBS;_X``JL+379yS#r>vOx zcG|;j)*E+Q8@|a)iC~F)QvQVfi9L(KCN6=Li3+nB&Y7)N*u6&9I`^=rz~Qb%7H!o* zt5=3)D`|#_=HGpo64<^}YvPoyEJeHSs4KRItM@(p+jcm=qGfvQkMD)Ix82z_Pa(mw z{*OJwkK-p6rrtKoeZlqUj9NN-QQOJ?0>xV!bMqsGQLz@Jg2wr^B>{uZOf*K9n0C4tN-w|DtQM{#38oeClcpJDu#7i#(h0#oSO> zHtN&7^{FS)n}R+ zZ__&0)epUyeyo;Y?Nz=1&A0pIyQyB2`|@0`l-=2$8*FEIWWk1n$E@li=YRj0zENyT z(e%A}o+4Yc7MHxam{I#?K5y;$RW+aTLlVu`*^4`U+tc40rX96yuFU(DH)j^@Vt)U7 z>+g3GK7SHzvX<8G{V|E*pVGEPVb`E0*z&rbPqxP>>btL}PR%)0j*i?XiOPt@%_r`2fR z|M>0hb-OggFMoVE7V<{gzKJA z?RC-cCq@@#%X!s5D*AZ7@?ki3ZSL(26K!^1^O3Ok^T;?KJ3S_RM^2!CO;L1xm-6E& zTj$JVuiCbDDeo*z<{nLk-kQGcB8%!jZ+l`iwVH2PUp?2OW()I%_sdtV){DHdXzrc+ zAsTiY)W4guXy3bXG0V0nzOpOi`Lo83L%WKNbhC0VrJGzb7Yec4n0#5NXqBks^E@qy=`{wrN1JA#iNPUm_e(#9-xyrk;&g^+FcdK2G zD6hY|YaMIs#rmV$56@v(7g3uiam6PgBnpjU?)7|-?t5kbkb^Ya6S3b@Zy$kGXzhQ)b|@ zu+x*>_b?pL@JyIh|CvcF*8kiMH8YOmn|5m~IU)GvONs7jR>R7m8SDoZ`pho+Z{ch^ zcM5Zwy1?lzMoz!pMoc-~k}fp!In$5H5q|F;v^)@=cRDw5)4I^5Z!DIWY_pwM*8P}k z!liy?vHbZf|DU}OpEv2LWxT?^UGS<^v zZ?AkTW|ZK(CGz)J+h>z0a#tPH@79_1TTIxQ<-6LX%582j!-=h4%u`z>jpvA!`s`N^ zwQ}~4De()@4Av47KEB65roX3WO4(iW894%ds@m~$3jW-9lEwc;_hiVanaYa~i+ew4 zf5@Mtr}0MWMW)Eg2lHaD&E51Pvp!?yC3d-J&(1$U(VVVZW94_gwExq0zueU<@$_Wb?;#93ZJF0bEnRHw>OJ#X!X$0G-I*@OPxLj0 zuD+&rba%*|vqxKIUbEe;wUk-bJJ_4~T8eRbf3VxuM@^!?+w49^_}5)KwIW37R{8mQ z=cSFu`OE#wE!*U1Pj9>N z(#U1L^Mrzo>JO&Au3FT1F(j$ZU_Q&cHn+8954P?8_V#A5pBJxiShsNJTd7l%S1f)p z=k>aXt5^M47yj^h`e)9Zf*5i6U5|xl&x_cQuj*T$J4NrM%F-)raxZqJo!l{lzbW;) z?5@SuFE!>KV_MFT!Q%LIq3q0k*KEZvU5UCMCRCkye%;cLeXOk$uEmMuNWAiG{qmy! z&>V(aOJ?t5Kc~rClXZL2g3=cUmieq)ufHql@TM?Tt(2m*Vb>@5R=--A5p_OZ+=eq- zuFxfpSI^O_4QgpZ4APIBw63j3nIGWyFCov9aR)Odf-u~=Ss zpM6{Gl~uaY6EfFE1Z0G+%TJSib3r2{uk!G&)R|$ceYe}oaUbjSnHcn;u<6r>H@>TGC*GN` zUgk#mif^s600`p*6T5&J{${WD^^dVLb_s%CrE z>#n}{F*ZE7CL?_p%j1rXkJIa3&ENN?`Dn$Q{>RI%R)()tT`Q_rar?HO-=A8YUtVuJ z<9}_8|9w6DV~Vj{w&8*ePffL*v<|Uf+w*pN%!UrH`?>bz$A#N}oLpVCMXGy3;^k!!J=*9inC+3}rCewQt>YuCN{ ztNhd5la0$#n&z!jef}h?^c9!sE~7uUXMWQ;$MzubR*kls^sYr-8x+LvRJ?5eaR0>* Y`@ponE4pPrrh(cup00i_>zopr0AM148UO$Q literal 13170 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4rT@hhPm4t-!L$Ul~#pBlmsP~D-;yvr)B1( zDwI?fq$;FVWTr7NRNPuSD|?cRWnatx&mz?=4`$o&%}=Xtw*6PvcVg8vleM|MZ&&zC zjhrZ0!@$?h>{I^l`Tq64_5VGUlb>FcyL9@e5BguP9Dd+ieXss--EZ}q`M;;z$$$Lr zfBo)v_D1iC*MI!GdFuJU^{@X`H+)b1p!eS(AbLLkv-9#_&hsq%Yjh!f(F#%4dvDG= z{51~XdC&gO_&~+>uT$>5>W`lBy!LLqb>{o}?I#u-yeLm%G%hU=b?+dd|kW5 zJyw^$-}U(Jh1C7-u&lUWIX}6ozCNtU@!vVW^Zcue_E$aqJ@^0Fukmw)PFLS8e3+g* z?fv!rd*6M&FMWSzXZ;Mzb?;}^@2XpMet+Kc*Z=qK-dTNq_wI>YYP$1%Yjcm@D|~$9 z$wfKsKOz6p?}h(<`NxF4N?h;$`6@O0)8+C7r@x-exBv6?c--`O9m7^(t@VmJGE1{{ zuU$B-69p! zy2Zz4WvyF!?N-+M#Yd+_E#`IZmkY{IW>ml2y8Yg72_Gwo$`4;2v>B$&C|ou( zeP-#lo6jQ-q%WNs9$9L-{g;&Wn;j23W6SR5ez)zjcX+vEvcKimEtk*laCm!ccHX|H z*KX(Se|$Up-rl^w)92fNpY{J!l!5=tW53>-%B}sH&7p5~@{^<-_sPc}wfGrcD9pD# zyIf>WjQV_ATLDqa4X1RT=jiu8JXlh5;(Gn>clzi5J~5wu>Hq2cho_7E*8TRcICrvi z|HnJ~f4$A$vu$ebHQ~9H9*G)@?IwPB+;-V5!`bt#eEj(trzbDIvv2!S%k%TTf2sD~ zWqc>@J@1;*x3=kP%a^^7F7JswzC-ue)5>?5qPrf|?@8ZX)jjQumtWe}(rZP0%-ez= z&oMXDpWkb6UPAY(t;vVtZ?UPTvVQN(HqvUax%<6TNjP&y;pNBtk!|)y#+7c(@$1zR zp6xNXJhyQA&pUVXpXw)k=9?0sALtHgj+ zGW`9g!@mrBPM_K4ut@LG)|J=i-Q)kf({Sn~xjonOUjMY)eedz-g9_h{ToR5DkbZku zO-$`=<*}e?YuBE?Veb6aAX=h4k8ShE3t|!3-{jqNb$SBt*0QJm*3R-tySO5vZEb%o9w~JQ#Ft=>>*UR24lMr@o;{DZkjye4k40y*s z(fs?m)0>6$?>znWD39CPIP+!2TJcEs<`Y_VchA}dO!|IM=;f=(u&`IMt*v2+H!zat_h z*mmPoxoHOv*Xs6cdY5=K(Ay@V^y@^iq)9ir`cgAzx!m|9^Q7YT!$OA83OR{RlQKz; zX?103wTtD~ziiR|_Rn$3Z^jk%2TT4ptk9qHkJ~G~Q-Z^wTVz_ZRn3Ysj!Rlj-V*2E zdT#y`Tc6F_SbbF)(gjaRXo<~WWRvVV#9s7G(^@lo?@#kMW9N+9O; zQe&L(r|N6{+ih=zs#@5O9clIVHEV2^WAV8s6vew<&QLn-#ojBE^$IP-e|(y~;{4)e z3<(L_O~OKVZZwF|P2Qo(^!QRllUSxmj6#A zIRC1~ow9EV(+>wT_a7}!J>Uom)iI15Yj~ z6`C`xX?5eGJ15s9{NHqB#nQK)eyodJcXBP3NxxE6r51d3@60uu{T+m)_?=armi|)M z?zibEXUq+bpYiS`_nouMPPw(5G<%WQWnZz@MWp7dPxM8uGrZSh6OH4F`x8H(a!t5w zeoynhDbu!EN2@w}=6QGDGtRZyaAxE0C|%X1Gmo9g;jnmofvx7A44=>6!pJ+zHCk*R zOb&je)SJcmGKnp$N&4%-sPmgVm=jXkZm@-NX3Hw)-g(k+$0h0Iext{HOXnM{$f#gh z>3E@ezp3lG;>GI(ybnes%3M6XD|E}P6WOP}d04+Y@Y!Q=b+*~<$!&+k9n?)lz6$(m znL3GGNZ?R_Zk>XVJ>F*=J~=Ks=AnY=D!=dLA3L(*K{F1#3V`_=Uqy$bAxQ`lxK z=2~Go(KSGFhQ8kvwn>6}dSb)Y#pSs7IE&cm)vDCZsZmE%Rj&=W-Z8Kboj!bZ`IJEyN+r5tSk9D;ExJY|QZSl+s%-9gKQS6|R zPR`BK+Gg+akF;e!J#X~wu;0bNZr{%;dWz-~P0ObJV7Sev!?Cnp(OS{?pPr_-kHW4` zvohTGuwN8Ax?eCZioqz~YsOEZWpApMT7TU*qiA9Fg`J^!cb*;7GS~8UJ9ByJtcf4z zHHIj%vDnTr-=11JUuE9pfSJl`{s?IEE@<*T^EHrl;xEqClY%Zb1Q z#QcpfYg=w>ZY>Dh5+wX!er&PvuLUwmyv?ljCqDC}%wBtS=}Wq?Q!Pw4msMUJ%#P_IJVWCUV}Y)QmgnKUe){M%N_!1IIO`BbZIRJ}=m^d9U&- zU-$4#!{Bp)nxgwT^*dVIFCD$2X=HNrzRFkxp(T=9aB*1tJ*wy zR@2D^`W=b^ckepfnl#7dt%U5NQYO)DH!Ho@JPzYr7jS<;T9nX&!?7K_iL&b_WQDr< z&NOG(kp631+{vl$R|H?1Bf4wm+@=djj$62|h^0-iC)g{6eVgKAQ+;ytYOW<>UV%?c#a^kz zy~^xh;;TJm?0z_2>_c49w}$1tpWeG@Y@L(p_c2Im=K7+p!|D;oy&w99ZV52qbczl> z`s?901EZoZ8!DIh-+Q~I_R!*-1S9oS7ni>r4^`xQX{YwjU z?w(lH^Mq4lLds$7p-oG8Cm z-y_quVO7duvnvIv*_&<{oT;Di`-#wz1S_UxS_K=H*0{8_ef3~G?fOOYbf`hRtGc%R z%V={qW+^|hg38eUr&v> z_OFyHEXo}CcK|^putUqx9{?W8he{f!jBpboS5+6$0}LlhH}^k?`=Obe09vXtH!Q- z+B@q|dc<+*t5f{*+ZEP4@o?S0b<(0h#aG{4->h4@H0al5owUx5-wVP*?aK_Cl-68d zo8Yj2-X{5N-xm7(uGqf5(SxZoK5p*P^bL1ZKC($YPj~&gJ}=ls(keovXX%9@&OUgPWZ;)&^3U8$8P_RO^6>&ZXN*(G&F>B*E8brX6UESP>@d-r11hO=vKe0+9w!k-m;7WTc| z?3t>@=IMB?u#iJpkmvf$243&$rX7kas(ZKbC$kDhZM*g@JI(Zh<`$Lvzn1ke+&TT0 zE8Zb*vAp8T^za|slSREI*d@EKh)bI4(-y(*CQ)L@u=Gm7=d-JL-9nTfMObO=tXSlj z>g1ZR+Rb%lv~Y@G>H=LY-nW0fb})#|r_-Hd z=GV0wLZja3?~T10?^V^b*2NWY0A1t(;$Gg-jGyL}g$AsxwFIHWO68e1mn&SJ_ z4|j(4uShSn)mBn1Y|fI&;9OB|&b);C#F4FEr+$5L?#sLP2Q_~NE^Yd;=bnd%+0H9J zlO6os+KnVsSzh%RysHYB#ye%7$bY8;n;RV}?(=84yf%;y?u>AVm>v=Q`|$?b43|f9 zqpUYyIF+ubWcrO^`{`ewzUp>{+({1hS(g=;U2pn#Y7_e-zI~D#7ifBKKfdXR;-N`9 zeGi#Bbgu5u5@k=R%FF!Kur=qaqz04Yy#-AyKM!bV<;J}BD-HZ~b{5Z(^YgAd+b;fW zI(2{CTbb!eilZ*jJNUrldt3N3Rua`xr2RhySBUVPS% z^~QtcrLR}~o;LTgLjT&oZC>uTOiO--y$>%bx@vO0`Fi7N4+Uo{jVEkB?mgXC>$&9Q z@{3AN>hjI3!cviQg|?nvbKXS5ZEn{*ZMIeV2GYAYP3EmPP?tB?vdl>my;RGcIdzfL zuZ4fM>OCmSVt#hzige=bT0L-{!oo&bcy0Vfq)f`qvY@ZYV@7P1v6LGCT5?_2z8BqXB>VZVDwIxN`00 z!`L(0lNXnY?7n)eu~TE3$Xx~JPc1*)Pcuw9S+Mtn{yxhh*FUpz=B`(m!QfrGwJB0! zx~j3pop~kMOoAu)vgPekmispPpIYEC};qyFQUKOEL;0%k6ggvsb3edu3UCScWJ}Rb61YvUg;VC zs@e5Oy-k~o(UpeST@o1%|16iR33k`J@vv)dqR*4Z!B_SwEIGS8pMQ~3PTQ{JkEIdY zrdhu0%bUDrSIM%kuL>BihVKj%aeB4-{@ne12FqlB7GAabme4h+axc5h?aVE_tqzTd*K&W8-(rmFm>jdvYln^6uEN2`NE~{IdWfwuX>Agbjw;D z+pcZEz9c-ph{I~*N zd-L)I3eraw6e}n=?9{tBF(FXJJxKWm-<&q7&4#*Pub=!p_u%{G+UwifS2dR2XMLio z*?M8o2{Xm;ZYg!krLRM6;$BahtSZVeyYrX8!{n#yifwAu*R%%fuqbeUk}|VooV}1= zL;S|&+git6?GFb3`ttwP*4^_(#9H};Z&b!kDmpWBPPfbEhQOaZYk7npvFzu2q-uQ0 zDLp}1sE6;c3ddf>%(D9@el2%8u$T2h#hVJIjW6@RP52U&npdjFne@xw%Bpb5T8;JJ zcFt7}RSggIQcQGj5<2(IYJXeXRMj=lt~GLg`nm6}g88=~?H@sp?E<~FIUG7Ti}97x ziqe~_=dN>TyuM9aYeASar*A?eYp9vb(kt5i^)GzeKUm5>T)RbIRkYA!-}#UoJI?#@ zv438fnp>nOH@$R&#Z_U))1lo?t}+n`FAw(3wfp;zb>f7X>rxlrJ>e0Y9i1P1|K-8y z&u4ABRs7GqFZ_+D`~l^>)RY%?mw0>%*Q9*@EhTYj@j0f8vpIIUKGJ>@c>g-bG|yS3 ztVK-HJFS)!hTaODXj*#Y_~r>=D}n-bL_1z^%a`pdEHHicz5l7%R+TCH`!6oEuAIP8 z%HzR0_v==c*9=NU%B7+cm0CQzU;a6h9vV|6ykphGHkRF5G2i);U8AmC=Vkk?`^~id z`tM}{t88`&1U_ASv^1rrL{6gQ=J6|YgY=JHcGz%G`I7maE6&^0o-OC>E6d^;Q1#`DfiS(50zcNxQdBblPpYnLCQfr^iX`s;YyI<#HY?p?|9q(O7_%x+CJT+c? zSh`aE*F5`gNvi#yT3@lgD8IGvPUi2|uXUN9=1Ul@<;qj#%>HBH{WNVBzr-r5kKvA2 zS5?(yD_Ql=s_FMwxiWJ5T(!fgOJf5|-Wf!+Sn9qEjBLZ1tp`K%V^;N9l1d7tD$vt?3suO?3aR2Q64ojzAh zWYH^CYlVqt_g-fd+IhiyVQtjom$|b9SzmtUZGC=ppP#ofPvz~fReV-wUFWWxoUV4S zrQNJ|^QYSv&s~0E7gJocQR>F7(>HQcrayX-nzH(cU|-1d;6w9x($c4_I^zC^IjX4s zMEpPTkId?Vw+g;bS zIjex_-S%rdGuI~_S@&&1N_9@KCXdXSMBB}Yq7`NyTb2m#U$>d{b>ixn(o;17d$mGe zhfY>GwY+^FgZf>Flf!02zR0V5pc=JJHtTu!GFe z_~50Bbot5z3Qq*g)$tH5oT4Rm&?!@U%d3Q+uZEvoRmLFRj z#Z~H_?0WM_`uU{8Oy_x|Z+@{UoDrc@y7A7@H90GeTs|V`dQ~I-#LhJZ_a3bYd%dRC z|KFhm$LNy-CRp--K_Izqq+~%P=|Vcnd;R$>zkf3>`&P8a<=Sj%1_u5)nIRD+5xzcF$@#f@i7EL>sd^Q;1q>iy zV_#8_n4FzjqL7rDo|$K>^nUk#C56lsTcvPQUjyF)=hTc$kE){7;3~h6Mh zJ1(0FtBTx$+|-gpg^Jvqyke^gTP3i$R(Zu%AYpwa1+bEmY+I!W-v9;Y{GwC^6Fn0> z16|jO%rYY-J1zyAqLehNAQv~N5k)C!wn`Z#B?VUc`sL;2dgaD?`9gg98y`3svneEoL^d$oa$PZnpdKXY-vGGX)&^$ zrNyZrA+Wo1QquG*av?S&>v8w=4S?$b1!H<rKzrosd<{Ng}G6Zu4S5`VWP27s!5_D z#5JIJuyPFWv{f?FGXNV77755nEJ@2R%C%Jr&&*57FE2(&g=FTY2A3p)g3Zv($jrdd z(9F`*!otwp)EJ>CEVZaOGd~Yxs-c0Nkr7xXCE3a?zbH4c#8xRYH!(d`zaTFiECGrb zEB~U*)Vz{JQ0}l*f;g@sx4_D|C^fMpzbGU>KgU)H%IS8e2Qyhy*%JYk|{fqpQ zvQm>v@SB58G2En})bz~alA=ma0-i!sX9G#F9+|}@`9+mT_6MgHLU<5w(DM{wKCW(nA zx{2myhPuXPN#?03iK!MTNob}Q=ckpFCl;kTrl;nW*ebba<`#hCSwRDu{xnftQ=X9u zN?Zm;hPnpkx`u`!29{Q)CRV1VN|4xAu+ayVurS}+fXX0WUn}JBumP1(R-T}Q7+hLV zkdv8O1PK{%x(QA#gqUQbk3$`jesHqOC#W4+8AP{penDkXW_m`6e|a8W>#-<=nBbF{ zoSIjR*KTAbkYGWoi0rtaK^5fUX2)ft53UVCH6tV}Ks6IBF*Nnj(h3EIQAgpOA8k(A#T3TA#+S)ogI=Z^L zdU|^L`uYY228M=)Mn*=)#>OTlCZ?vQW@cvQ=H?a_7M7NlR#sNl*48#QHnz65c6N65 z_Vx}A4vvnFPEJnF&dx3_F0QVwZf35kh` zNl8h`$;l}xDXFQcX=!Qc>FF668JU@xSy@@x+1WWcIk~yHd3kyH`S}F}1%-u$MMXu$ z#leI>6_u5hRaI5h)zvjMHMO<1b#-<1_4N%64ULVBO-)VB&CM+> zEv>DsZEbDs?d=^M9i5$>U0q$>-Q7JsJ-xlXeSLlX{rwXrOqe)v;-pEFCQqI`Wy+MP zQ>RXwHf{R!=`&``m^pLitXZ>W&z?PJ&YZb(=gylqZ~pxG3l=O`v}n=d#fz6LS+aEL z(q+q*EnmKT#flXxSFT*OYSrr1tJkbqvv%#;b?erxU%!6Ch7B7xZrrqK)8@^aw`|$6 zb?eq`+qP}rzJ14z9XogK+_h`h?%lih?%lg@-@g6(_a8WL;NZc7hYlS&eE9H@BS(%N zJ$mfeu@fgwoIH8*)TvXaPoF+>=FHi%XV0BGcmDkO3l}b2ym;}_rAwDDU%qnX%GIk^ zuU)%#{rdGAH*Va#dGpq-TeolDzH{f!-Me@1-Me@H{{06J9z1;b@X@13j~_pN^5n_W zr%#_fd-nYK^A|5(ynOlc)vH&pU%!6y=FQu;Z{NLp_x}C+4<9~!{P^+Hr%#_hfBy32 z%h#`8zkU1m{rmSHKYslD`SaJWU%!9<{`2P#Xq1T*d|*p%D+2=qV@Z%-FoVOh8)+a; zlDE4HLkFv@2Ll5GXMsm#F#`kNeh_A~U=3DbU|?V`@$_|Nf6C6yYi53p_0CEL1`Z=n z7srr@!&|5S4iC95di?S+_O3m%GA?DAs?CzPvOtiL+sz@4SxM`n#FdVfQcI;4Cj`oA zb%?sIWz@}D<=Eq!RC`4&!Htb&%5xqA6+gFS{-IxT-`Zo>HJ*-0?ew$ypAY}L z^Zw@VH}7vgUpl?+Z0W3v(R=bVcdh>os)I$Le;$#)xW%YLeIJYm28->Of1iCZ1# z9L@{YI4AB9@^|sCn$T{IdZ|Zi#WqJyIurK8`q+=pQ>QLJXJ=$B`Z8@^s$| z$(IXOJu1m`oh+$hEh{!}na89Cc}F1;?Os>s%AY4E8B3jH{a7Z<{gI_FnT_SJ!5oFk z+r^Jh_f4NVC(K)K`sqx;h_+=4_g3utd7>f7qEEQz%bXvVl2zTk*9+%Ozn%Fo@v{-b z--r71ue}ms=rewHkq3l`khs$d9U@%^@J?aY&rTWz~oR9gg{f5qb13`~3_-^=gz7Km*(4qy6a@BMU_fKF=?Rc1=h2-J3CM%ge0i1`E!cEBp^A)U|z3cAF(mz{2VJ zy^B?!zqn3XGUK?lkZ_pnpM6WW?!3#8=}=wE^l#Su@-6qQ9+b^uz4l|tzhg5WHT`*$ z+$-X0c+4m?CnxG$=OX-)z{YST*z&&@mht!;gSEj zw=wgl2}n=hV3d}5UtN7XV})u?;}KrlyRv8P>q?(= zAM&ThzV}0_&?oh3rY$0kiX9hk{Qb~4ZS$?OJQv^c z-q`o~{QUcZbNFVfbSZfoKWJCD&-}q+aSflOcEsLJl`Z!g&d$#{w^Q3f#%#03ET2V1 z(Ms}YYdu`_VROqu-Gtm;7L^G>Hb39Y@b z4`%3HD>m17&X9k`|Fll1bV@X{L$mpVvzEn&xBWl9;-Dl^mPj%keZ(iAovTXf{; zs{Pv=HBUxod|~^Oc-lPzW)=;>cw zys1cUt3(Q;RD6TyWOa6T`TZ43J_)iiTHIjO<5PL|I9kW z;NtoEd+&sIx^5R>m>|2RQ<-PQye72h0vzkb)PI??#PI`Pg9&bs=T`i%4M ziv1rjypYzAyKZKGX_MIwO;yh)ky3AKBJN-6R#ERcS_V%vO; zW$QOjH@dB>KlcatjSxjQCY*?eqgl!WU z{{8!RaP#6|;mKUH4MPfc%rPstu4t~9De$nsT2<<`Y~hiaR;gYGwv;bQQo0^@`LddU zy6QdVhQ#U5&hoW)e!J>%I9=1gAf+nf$D|iAyhmrd0<2DCWYqS~~SiwXTLn z#jDwg-pXOMH_ui`6-p@Zn;$qZTgz>>Npo{^y?JtCN=V7I(78hA{>U>3Two1d+_!5z z)5ERXm6N6&&)vOhY1=fW4?f`@$Digd=0Cljg|+nzM>L<@+}f417jb-w?sRA3eVwKVM(S@{7G?kKoJ|K`YIsT>U;# zWZ?}Bw+R*bcQ-!SxTjLhf0l?rcBGNOrR{Tro!=|CHSgQL+BbIV!@nE%?mFf_!=N&) zq^K(^G%CjJV(+hGZeRDF%Iys77VG_b_xq>Q`@hcKnUgxn>#O6FO+QQ{qs`Xx&Hwk? zGBLTn!cXS=?2o~R!`Afp`}p+q_i@Erq<_2fvpfF9TPsZii7KwY diff --git a/textures/segment2/custom_text.i4.png b/textures/segment2/custom_text.i4.png index 02dd2d17c379a8fdf962e199cb20fe2e2fc1645a..c6ed0af86277d9f4729894e50513bc0a8f9c3405 100644 GIT binary patch delta 1785 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 diff --git a/textures/segment2/custom_text2.i4.png b/textures/segment2/custom_text2.i4.png index 4073382638478f4194b40696310830a479e21900..00c4f282359cc4f7e23f280f3f965c4777ae9bb0 100644 GIT binary patch delta 1416 zcmbQpyO?`|BnJxv0|SeFmES}~@p{%!PZ!6KjC*gRZ%=!zz>&J^Q}>67KPJv=pQ*wj zZ8FpE`b_U%6QX(?U2ZhgF7~_sFG)!$>*4QHTi^BvNF3SzEk5c0$L$}p*4g{NsQ7d9 z%hV?s+MF9JCvnF~?=4in)W1xIM^o_R!M>%!KmTp(mw5HFKUHrJgSlVol<`7=EfHJ?7v^MW zM`@buf4ePIIa#+wMR<;9O!ILM>BgH|^wa^{u27qkqh$UnzE=bb-u#Ht_lA0E8C z$zmK@&~(e}z{(~?rpC#8CrfAZtvAtW5j%M2#D6!2uCRkVqA%9YWJt~V{aiF})3jBe zIgYO8=%03=vf<3)Sl*cc~Ylq7GWOJ`-6E~-&D_8Y2W50E6bULI`7RWXRQ-Hd_bbkeEGew zA2pu4-))hPWBq8d<;K^*)}w0|w0!CEIjp}|=STJRK=Bi5H}sx=4eVO$6&b3z^Jl%9 zgVs9dV=I;km%h5Pv-thq@^@d(+HbC`_?6~+@%)Y_LVvHjH+z;=ysKMP7xN~e?Pk-S z`&s|hnHGlLUfr6ZCB3fu@r$GX{5je-%(2|~v10GvnQLE#L~4Iuqw{k1^(lAMRkuFB z`|ta?x%}Fhx94oBc6!gbSH7g|ujR&T>VMxn{r$ea|?Rs7l<`{D1LwkqkQ3&)#w$f|2(ZYe)nCPq|fg^FAO=Szwh|RKWw#}X7+2}{TI-Vu#1}@HeKI4-Bvm5 z2irylamT7UgDlon=DR}06CQ~#J9YC(frwMevX2GFGfr84sO~#ave{sf{#6E5$*jYR zCnhtu6nw0iuQPk`{-PgkYpqsx8ri+EF+BEY{$AlTipkdN+yi61>P;FiK6&=vF>&)I zo0QDlRUz#%^JDgXW;zmgmfO3akLS(`J`0Ebn|Z}K>kqzv_4JJ(^Mfe&#;T7;D!s#Y zOD6vQZ>MoGk2&D)Q6>G>sZx3ijkigi?bxtXQ{=BpsKT2%`}h9q~Kdd&-`*af1Jvp>E&|9gEn>jZ`i-&ShzbGp^(nmyM) r{A=_1WZPx`ymIc%v$^-{E5C91C-Y6scaJkLFfe$!`njxgN@xNAKRv`r delta 1656 zcmZ3?J&|{UBnKM<1H(GAO-Cmxir2F_d%8G=RNQ(Sn_cu;i>J&u=VDySo)dTEx0jTN z*xD&hw9-6NvdnB6gCeJGLrw1OZ#Tkze%jW{JDRA|J^5h{A0-d`|p42ZOc5{d;S0V+WYc*1*59mH5z}JA1|~K zbgyq--hAOhcEvAqnXs(GS@zuhU+k40PGY!ta(c_^>)AXCXL*h6&FwbMc_GErX(412 z)W5~?p{5+mezx$d^;_<||E_M~U!}ce$(8H>)-Cktd)%O+8Ks{ozE;-Ly5eo+tW`yC z7`K9ij3TXNmkS9J02Q#gx&9yUin?+Ow^$*AG1z# zCY@fubmI3Vt)&jLYgP*1V@b2TGfAx1Qujy4-Uo(GZe8v@DS7G_?6w4o9>4G1d|85d zVu4GN7Kd=8^U`md-4ts3qkbx%-k`?78`yZS#e+?F?e-7KZs$6>`h-%{>iF3r?@#6{6?QQPI`s>gAdfBlgX-m#w9< zS};}2dt=L*rhmSVH%yGER`Xco$>l#Q;%nS*p+FOxkf6Y;Ijx5l`%L)B)+p+H(8KCl z(uACoDWZaEvKRTLzOHAjHR4fFogX#LVQQ9u;-2T+?wu`9tS)@KFro1NLE%J=mVc3I z558naiXLLm^UPjicgW#p#NPVpuR9(*_X#lEH}moTn?lnbE(_n)I5Fp@^^TdMd8te4 z=hSHn?NDl5y~g8#*5#h7H&4!4%BUBxN5Su_+m#~T35Ji>J=5O5o9$znM`-rMG+CJq z+k%Si#XF}~e+{p{_G^8voNKI+{yBqU<4g^aHCGqUwyRGL&vBh|z-vu~Q039m{q=X) z9`rbNmdso3!Sc4YO!u0a$E2V*_lHY$BX0UG6#Kj9&MBRRnw>0OK}O2q28U<7D&ynb z81-Dq^jSr?^dmE+my@1aU%upeJ=8O3Ldo`J3vG_AH>$J!b#~4EN-YB;Ne-J$EfHB! zlO0YAthTzdQn&bh%)E1~F6shzzt6upJ^x^Mea=d!kLL|O1&FSj%YEWd{_X!e8;+YR z+kC67|MF?BMpXU&AJgaZ^Y6=KyQpSNmPZl>SQW zGb)g&c$ao-hudci-v)4`IKT}R_-8p09$!!aTL?Ta{dOCbN((jkY%ABrJKih9X`St!|3XyA5 zdVPgAvy-z<4Hx`{dbvI1!;1?&mr09xg|Mu+<2-8a_a=e~!cYEoa%xT(zk z-Ys-%-3_@n4t0i0u4nEmaLtgcyv7uI@q($WbL+;F<%-IVCTDrCs>OG?zWLqf%2e;3 zbl#)kN$4>N{>^Ed>aRZjP^Wlga*kfhJ^zm%YEI}rvhvjG7rJ3JqtWM@$E_QijWg!& zt=PN$O6Z-N(Fbo_OT8r2v+bX~WMjwFd;VVvm@Z^rF_Km>DfON%_c_>YU!L@-r8eH_aO%}zvEQD!=fSDfOXS~nPtksn zELyMM@J_M+P32~*s7k#9RrbH$+`Zo4Qz*u~!2A4*n{5GaDt Date: Tue, 28 Sep 2021 22:57:37 +0100 Subject: [PATCH 33/97] pragma'd --- src/engine/math_util.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/engine/math_util.c b/src/engine/math_util.c index f4ddfea7..6741ee55 100644 --- a/src/engine/math_util.c +++ b/src/engine/math_util.c @@ -14,7 +14,6 @@ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wreturn-local-addr" -#pragma intrinsic(sqrtf); /// Returns the lowest of three values. s32 min_3i(s32 a0, s32 a1, s32 a2) { if (a1 < a0) a0 = a1; if (a2 < a0) a0 = a2; return a0; } From 4ec50b81235a3dc5bc7f19aa9b6d79a5529687e9 Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Tue, 28 Sep 2021 15:42:41 -0700 Subject: [PATCH 34/97] #define o gCurrentObject in object_list_processor.h --- src/engine/math_util.c | 32 ++------ src/engine/surface_load.c | 12 +-- src/game/area.c | 10 +-- src/game/area.h | 2 +- src/game/behavior_actions.c | 2 - src/game/behaviors/intro_lakitu.inc.c | 32 ++++---- src/game/behaviors/intro_peach.inc.c | 16 ++-- src/game/camera.c | 112 ++++++++++++-------------- src/game/camera.h | 10 +-- src/game/farcall_helpers.h | 2 - src/game/interaction.h | 10 +-- src/game/mario.c | 60 +++++++------- src/game/mario.h | 2 +- src/game/mario_actions_cutscene.c | 22 ++--- src/game/obj_behaviors.c | 2 - src/game/obj_behaviors_2.c | 2 - src/game/object_helpers.c | 2 - src/game/object_list_processor.h | 1 + 18 files changed, 145 insertions(+), 186 deletions(-) diff --git a/src/engine/math_util.c b/src/engine/math_util.c index 6741ee55..76b8d1a6 100644 --- a/src/engine/math_util.c +++ b/src/engine/math_util.c @@ -568,9 +568,9 @@ void mtxf_to_mtx(void *dest, void *src) { /** * Set 'mtx' to a transformation matrix that rotates around the z axis. */ -#define MATENTRY(a, b) \ - ((s16 *) mtx)[a] = ((s32) b) >> 16; \ - ((s16 *) mtx)[a + 16] = ((s32) b) & 0xFFFF; +#define MATENTRY(a, b) \ + ((s16 *) mtx)[a ] = (((s32) b) >> 16); \ + ((s16 *) mtx)[a + 16] = (((s32) b) & 0xFFFF); void mtxf_rotate_xy(Mtx *mtx, s32 angle) { register s32 i = coss(angle) * 65536; register s32 j = sins(angle) * 65536; @@ -580,10 +580,10 @@ void mtxf_rotate_xy(Mtx *mtx, s32 angle) { *temp = 0; temp++; } - MATENTRY(0, i) - MATENTRY(1, j) + MATENTRY(0, i) + MATENTRY(1, j) MATENTRY(4, -j) - MATENTRY(5, i) + MATENTRY(5, i) ((s16 *) mtx)[10] = 1; ((s16 *) mtx)[15] = 1; } @@ -1087,23 +1087,3 @@ s32 anim_spline_poll(Vec3f result) { return hasEnded; } - -/// Multiply vector 'dest' by a -void vec3f_mul(Vec3f dest, f32 a) { - vec3_mul_val(dest, a); -} - -/// Get length of vector 'a' -f32 vec3f_length(Vec3f a) { - return sqrtf(sqr(a[0]) + sqr(a[1]) + sqr(a[2])); -} - -/// Get dot product of vectors 'a' and 'b' -f32 vec3f_dot(Vec3f a, Vec3f b) { - return vec3_dot(a, b); -} - -/// Make 'dest' the difference of vectors a and b. -void vec3f_dif(Vec3f dest, Vec3f a, Vec3f b) { - vec3_diff(dest, a, b); -} diff --git a/src/engine/surface_load.c b/src/engine/surface_load.c index 56dafaf4..2014bb1c 100644 --- a/src/engine/surface_load.c +++ b/src/engine/surface_load.c @@ -690,25 +690,25 @@ void load_object_surfaces(TerrainData **data, TerrainData *vertexData) { #ifdef AUTO_COLLISION_DISTANCE // From Kaze -static void get_optimal_coll_dist(struct Object *o) { +static void get_optimal_coll_dist(struct Object *obj) { register f32 thisVertDist, maxDist = 0.0f; Vec3f v; TerrainData *collisionData = gCurrentObject->collisionData; - o->oFlags |= OBJ_FLAG_DONT_CALC_COLL_DIST; + obj->oFlags |= OBJ_FLAG_DONT_CALC_COLL_DIST; collisionData++; register u32 vertsLeft = *(collisionData); collisionData++; // vertices = *data; while (vertsLeft) { - v[0] = *(collisionData + 0) * o->header.gfx.scale[0]; - v[1] = *(collisionData + 1) * o->header.gfx.scale[1]; - v[2] = *(collisionData + 2) * o->header.gfx.scale[2]; + v[0] = *(collisionData + 0) * obj->header.gfx.scale[0]; + v[1] = *(collisionData + 1) * obj->header.gfx.scale[1]; + v[2] = *(collisionData + 2) * obj->header.gfx.scale[2]; thisVertDist = (sqr(v[0]) + sqr(v[1]) + sqr(v[2])); if (thisVertDist > maxDist) maxDist = thisVertDist; collisionData += 3; vertsLeft--; } - o->oCollisionDistance = (sqrtf(maxDist) + 100.0f); + obj->oCollisionDistance = (sqrtf(maxDist) + 100.0f); } #endif diff --git a/src/game/area.c b/src/game/area.c index 88c61e64..030c2534 100644 --- a/src/game/area.c +++ b/src/game/area.c @@ -130,9 +130,9 @@ void print_intro_text(void) { } } -u32 get_mario_spawn_type(struct Object *o) { +u32 get_mario_spawn_type(struct Object *obj) { s32 i; - const BehaviorScript *behavior = virtual_to_segmented(0x13, o->behavior); + const BehaviorScript *behavior = virtual_to_segmented(0x13, obj->behavior); for (i = 0; i < 20; i++) { if (sWarpBhvSpawnTable[i] == behavior) { @@ -153,10 +153,8 @@ struct ObjectWarpNode *area_get_warp_node(u8 id) { return node; } -struct ObjectWarpNode *area_get_warp_node_from_params(struct Object *o) { - u8 id = (o->oBehParams & 0x00FF0000) >> 16; - - return area_get_warp_node(id); +struct ObjectWarpNode *area_get_warp_node_from_params(struct Object *obj) { + return area_get_warp_node((obj->oBehParams & 0x00FF0000) >> 16); } void load_obj_warp_nodes(void) { diff --git a/src/game/area.h b/src/game/area.h index 950a1a26..16239b72 100644 --- a/src/game/area.h +++ b/src/game/area.h @@ -169,7 +169,7 @@ extern s16 gCurrLevelNum; void override_viewport_and_clip(Vp *a, Vp *b, u8 c, u8 d, u8 e); void print_intro_text(void); -u32 get_mario_spawn_type(struct Object *o); +u32 get_mario_spawn_type(struct Object *obj); struct ObjectWarpNode *area_get_warp_node(u8 id); void clear_areas(void); void clear_area_graph_nodes(void); diff --git a/src/game/behavior_actions.c b/src/game/behavior_actions.c index e3e2bcb1..ef80ee68 100644 --- a/src/game/behavior_actions.c +++ b/src/game/behavior_actions.c @@ -46,8 +46,6 @@ #include "rumble_init.h" #include "puppylights.h" -#define o gCurrentObject - struct WFRotatingPlatformData { s16 pad; s16 scale; diff --git a/src/game/behaviors/intro_lakitu.inc.c b/src/game/behaviors/intro_lakitu.inc.c index 97428e7c..a36f8614 100644 --- a/src/game/behaviors/intro_lakitu.inc.c +++ b/src/game/behaviors/intro_lakitu.inc.c @@ -9,7 +9,7 @@ * Add the camera's position to `offset`, rotate the point to be relative to the camera's focus, then * set lakitu's location. */ -void intro_lakitu_set_offset_from_camera(struct Object *o, Vec3f offset) { +void intro_lakitu_set_offset_from_camera(struct Object *obj, Vec3f offset) { f32 dist; Vec3s focusAngles; s16 offsetPitch, offsetYaw; @@ -20,36 +20,36 @@ void intro_lakitu_set_offset_from_camera(struct Object *o, Vec3f offset) { vec3f_get_dist_and_angle(gCamera->pos, offset, &dist, &offsetPitch, &offsetYaw); vec3f_set_dist_and_angle(gCamera->pos, offset, dist, focusAngles[0] + offsetPitch, focusAngles[1] + offsetYaw); - vec3f_to_object_pos(o, offset); + vec3f_copy(&obj->oPosVec, offset); } -void intro_lakitu_set_focus(struct Object *o, Vec3f newFocus) { +void intro_lakitu_set_focus(struct Object *obj, Vec3f newFocus) { f32 dist; s16 pitch, yaw; // newFocus is an offset from lakitu's origin, not a point in the world. vec3f_get_dist_and_angle(gVec3fZero, newFocus, &dist, &pitch, &yaw); - o->oFaceAnglePitch = pitch; - o->oFaceAngleYaw = yaw; + obj->oFaceAnglePitch = pitch; + obj->oFaceAngleYaw = yaw; } /** * Move lakitu along the spline `offset`, relative to the camera, and face him towards the corresponding * location along the spline `focus`. */ -s32 intro_lakitu_set_pos_and_focus(struct Object *o, struct CutsceneSplinePoint offset[], +s32 intro_lakitu_set_pos_and_focus(struct Object *obj, struct CutsceneSplinePoint offset[], struct CutsceneSplinePoint focus[]) { Vec3f newOffset, newFocus; s32 splineFinished = 0; - s16 splineSegment = o->oIntroLakituSplineSegment; + s16 splineSegment = obj->oIntroLakituSplineSegment; - if ((move_point_along_spline(newFocus, offset, &splineSegment, &(o->oIntroLakituSplineSegmentProgress)) == 1) - || (move_point_along_spline(newOffset, focus, &splineSegment, &(o->oIntroLakituSplineSegmentProgress)) == 1)) + if ((move_point_along_spline(newFocus, offset, &splineSegment, &(obj->oIntroLakituSplineSegmentProgress)) == 1) + || (move_point_along_spline(newOffset, focus, &splineSegment, &(obj->oIntroLakituSplineSegmentProgress)) == 1)) splineFinished++; - o->oIntroLakituSplineSegment = splineSegment; - intro_lakitu_set_offset_from_camera(o, newOffset); - intro_lakitu_set_focus(o, newFocus); + obj->oIntroLakituSplineSegment = splineSegment; + intro_lakitu_set_offset_from_camera(obj, newOffset); + intro_lakitu_set_focus(obj, newFocus); return splineFinished; } @@ -142,7 +142,7 @@ void bhv_intro_lakitu_loop(void) { toPoint[0] += gCurrentObject->oIntroLakituEndBirds1DestY; gCurrentObject->oIntroLakituEndBirds1DestY = approach_f32_asymptotic(gCurrentObject->oIntroLakituEndBirds1DestY, 0.f, 0.05f); - vec3f_to_object_pos(gCurrentObject, toPoint); + vec3f_copy(&gCurrentObject->oPosVec, toPoint); if (gCurrentObject->oTimer == 31) { gCurrentObject->oPosY -= 158.f; @@ -169,7 +169,7 @@ void bhv_intro_lakitu_loop(void) { cur_obj_enable_rendering(); vec3f_set(offset, -100.f, 100.f, 300.f); offset_rotated(toPoint, gCamera->pos, offset, sMarioCamState->faceAngle); - vec3f_to_object_pos(gCurrentObject, toPoint); + vec3f_copy(&gCurrentObject->oPosVec, toPoint); gCurrentObject->oMoveAnglePitch = 0x1000; gCurrentObject->oMoveAngleYaw = 0x9000; gCurrentObject->oFaceAnglePitch = gCurrentObject->oMoveAnglePitch / 2; @@ -178,7 +178,7 @@ void bhv_intro_lakitu_loop(void) { break; case 101: - object_pos_to_vec3f(toPoint, gCurrentObject); + vec3f_copy(toPoint, &gCurrentObject->oPosVec); if (gCurrentObject->oTimer > 60) { gCurrentObject->oForwardVel = approach_f32_asymptotic(gCurrentObject->oForwardVel, -10.f, 0.05f); gCurrentObject->oMoveAngleYaw += 0x78; @@ -195,7 +195,7 @@ void bhv_intro_lakitu_loop(void) { break; case 102: - object_pos_to_vec3f(toPoint, gCurrentObject); + vec3f_copy(toPoint, &gCurrentObject->oPosVec); gCurrentObject->oForwardVel = approach_f32_asymptotic(gCurrentObject->oForwardVel, 60.f, 0.05f); vec3f_get_yaw(toPoint, gCamera->pos, &yawToCam); gCurrentObject->oFaceAngleYaw = camera_approach_s16_symmetric(gCurrentObject->oFaceAngleYaw, yawToCam, 0x200); diff --git a/src/game/behaviors/intro_peach.inc.c b/src/game/behaviors/intro_peach.inc.c index 3a234657..ab3706b0 100644 --- a/src/game/behaviors/intro_peach.inc.c +++ b/src/game/behaviors/intro_peach.inc.c @@ -4,18 +4,18 @@ * Set peach's location relative to the camera focus. * If nonzero, make peach's opacity approach targetOpacity by increment */ -void intro_peach_set_pos_and_opacity(struct Object *o, f32 targetOpacity, f32 increment) { +void intro_peach_set_pos_and_opacity(struct Object *obj, f32 targetOpacity, f32 increment) { Vec3f newPos; s16 focusPitch, focusYaw; - f32 UNUSED dist, newOpacity; + f32 newOpacity; - vec3f_get_dist_and_angle(gLakituState.pos, gLakituState.focus, &dist, &focusPitch, &focusYaw); - vec3f_set_dist_and_angle(gLakituState.pos, newPos, o->oIntroPeachDistToCamera, o->oIntroPeachPitchFromFocus + focusPitch, - o->oIntroPeachYawFromFocus + focusYaw); - vec3f_to_object_pos(o, newPos); - newOpacity = o->oOpacity; + vec3f_get_angle(gLakituState.pos, gLakituState.focus, &focusPitch, &focusYaw); + vec3f_set_dist_and_angle(gLakituState.pos, newPos, obj->oIntroPeachDistToCamera, obj->oIntroPeachPitchFromFocus + focusPitch, + obj->oIntroPeachYawFromFocus + focusYaw); + vec3f_copy(&obj->oPosVec, newPos); + newOpacity = obj->oOpacity; camera_approach_f32_symmetric_bool(&newOpacity, targetOpacity, increment); - o->oOpacity = newOpacity; + obj->oOpacity = newOpacity; } void bhv_intro_peach_loop(void) { diff --git a/src/game/camera.c b/src/game/camera.c index ef946406..9768997b 100644 --- a/src/game/camera.c +++ b/src/game/camera.c @@ -1456,7 +1456,7 @@ s32 update_fixed_camera(struct Camera *c, Vec3f focus, UNUSED Vec3f pos) { * Updates the camera during a boss fight */ s32 update_boss_fight_camera(struct Camera *c, Vec3f focus, Vec3f pos) { - struct Object *o; + struct Object *obj; f32 focusDistance; s16 yaw; s16 heldState; @@ -1478,9 +1478,9 @@ s32 update_boss_fight_camera(struct Camera *c, Vec3f focus, Vec3f pos) { yaw = sModeOffsetYaw + DEGREES(45); // Get boss's position and whether Mario is holding it. - if ((o = gSecondCameraFocus) != NULL) { - object_pos_to_vec3f(secondFocus, o); - heldState = o->oHeldState; + if ((obj = gSecondCameraFocus) != NULL) { + vec3f_copy(secondFocus, &obj->oPosVec); + heldState = obj->oHeldState; } else { // If no boss is there, just rotate around the area's center point. secondFocus[0] = c->areaCenX; @@ -3306,13 +3306,6 @@ Gfx *geo_camera_main(s32 callContext, struct GraphNode *g, void *context) { return NULL; } -void object_pos_to_vec3f(Vec3f dst, struct Object *o) { - vec3f_copy(dst, &o->oPosVec); -} - -void vec3f_to_object_pos(struct Object *o, Vec3f src) { - vec3f_copy(&o->oPosVec, src); -} /** * Produces values using a cubic b-spline curve. Basically Q is the used output, @@ -3331,9 +3324,9 @@ void evaluate_cubic_spline(f32 u, Vec3f Q, Vec3f a0, Vec3f a1, Vec3f a2, Vec3f a B[1] = (( hcu ) - su + (2.0f / 3.0f)); B[2] = ((-hcu ) + (su / 2.0f) + (u / 2.0f) + (5.0f / 3.0f)); B[3] = ( hcu / 3.0f); - Q[0] = B[0] * a0[0] + B[1] * a1[0] + B[2] * a2[0] + B[3] * a3[0]; - Q[1] = B[0] * a0[1] + B[1] * a1[1] + B[2] * a2[1] + B[3] * a3[1]; - Q[2] = B[0] * a0[2] + B[1] * a1[2] + B[2] * a2[2] + B[3] * a3[2]; + Q[0] = ((B[0] * a0[0]) + (B[1] * a1[0]) + (B[2] * a2[0]) + (B[3] * a3[0])); + Q[1] = ((B[0] * a0[1]) + (B[1] * a1[1]) + (B[2] * a2[1]) + (B[3] * a3[1])); + Q[2] = ((B[0] * a0[2]) + (B[1] * a1[2]) + (B[2] * a2[2]) + (B[3] * a3[2])); } /** @@ -6146,10 +6139,10 @@ void find_mario_floor_and_ceil(struct PlayerGeometry *pg) { * Start a cutscene focusing on an object * This will play if nothing else happened in the same frame, like exiting or warping. */ -void start_object_cutscene(u8 cutscene, struct Object *o) { - sObjectCutscene = cutscene; - gRecentCutscene = 0; - gCutsceneFocus = o; +void start_object_cutscene(u8 cutscene, struct Object *obj) { + sObjectCutscene = cutscene; + gRecentCutscene = 0; + gCutsceneFocus = obj; gObjCutsceneDone = FALSE; } @@ -6177,12 +6170,12 @@ s16 unused_dialog_cutscene_response(u8 cutscene) { } } -s16 cutscene_object_with_dialog(u8 cutscene, struct Object *o, s16 dialogID) { +s16 cutscene_object_with_dialog(u8 cutscene, struct Object *obj, s16 dialogID) { s16 response = DIALOG_RESPONSE_NONE; if ((gCamera->cutscene == 0) && (sObjectCutscene == 0)) { if (gRecentCutscene != cutscene) { - start_object_cutscene(cutscene, o); + start_object_cutscene(cutscene, obj); if (dialogID != DIALOG_NONE) { sCutsceneDialogID = dialogID; } else { @@ -6197,21 +6190,21 @@ s16 cutscene_object_with_dialog(u8 cutscene, struct Object *o, s16 dialogID) { return response; } -s16 cutscene_object_without_dialog(u8 cutscene, struct Object *o) { - s16 response = cutscene_object_with_dialog(cutscene, o, DIALOG_NONE); +s16 cutscene_object_without_dialog(u8 cutscene, struct Object *obj) { + s16 response = cutscene_object_with_dialog(cutscene, obj, DIALOG_NONE); return response; } /** * @return 0 if not started, 1 if started, and -1 if finished */ -s16 cutscene_object(u8 cutscene, struct Object *o) { +s16 cutscene_object(u8 cutscene, struct Object *obj) { s16 status = 0; if ((gCamera->cutscene == 0) && (sObjectCutscene == 0)) { if (gRecentCutscene != cutscene) { - start_object_cutscene(cutscene, o); - status = 1; + start_object_cutscene(cutscene, obj); + status = 1; } else { status = -1; } @@ -7442,7 +7435,7 @@ void cutscene_star_spawn_store_info(struct Camera *c) { void cutscene_star_spawn_focus_star(struct Camera *c) { Vec3f starPos; if (gCutsceneFocus != NULL) { - object_pos_to_vec3f(starPos, gCutsceneFocus); + vec3f_copy(starPos, &gCutsceneFocus->oPosVec); starPos[1] += gCutsceneFocus->hitboxHeight; approach_vec3f_asymptotic(c->focus, starPos, 0.1f, 0.1f, 0.1f); } @@ -7552,7 +7545,7 @@ void cutscene_exit_fall_to_castle_grounds(struct Camera *c) { * Start the red coin star spawning cutscene. */ void cutscene_red_coin_star_start(struct Camera *c) { - object_pos_to_vec3f(sCutsceneVars[1].point, gCutsceneFocus); + vec3f_copy(sCutsceneVars[1].point, &gCutsceneFocus->oPosVec); store_info_star(c); // Store the default fov for after the cutscene sCutsceneVars[2].point[2] = sFOVState.fov; @@ -7586,9 +7579,9 @@ void cutscene_red_coin_star_look_up_at_star(struct Camera *c) { void cutscene_red_coin_star_warp(struct Camera *c) { f32 dist; s16 pitch, yaw, posYaw; - struct Object *o = gCutsceneFocus; + struct Object *obj = gCutsceneFocus; - vec3f_set(sCutsceneVars[1].point, o->oHomeX, o->oHomeY, o->oHomeZ); + vec3f_copy(sCutsceneVars[1].point, &obj->oHomeVec); vec3f_get_dist_and_angle(sCutsceneVars[1].point, c->pos, &dist, &pitch, &yaw); vec3f_get_yaw(sCutsceneVars[1].point, c->pos, &posYaw); vec3f_get_yaw(sCutsceneVars[1].point, sMarioCamState->pos, &yaw); @@ -7707,7 +7700,7 @@ void cutscene_prepare_cannon_start(struct Camera *c) { vec3f_copy(sCutsceneVars[0].point, c->focus); sCutsceneVars[2].point[0] = 30.f; // Store the cannon door's position in sCutsceneVars[3]'s point - object_pos_to_vec3f(sCutsceneVars[3].point, gCutsceneFocus); + vec3f_copy(sCutsceneVars[3].point, &gCutsceneFocus->oPosVec); vec3s_set(sCutsceneVars[5].angle, 0, 0, 0); } @@ -8125,7 +8118,7 @@ void cutscene_dialog_start(struct Camera *c) { sCutsceneVars[8].point[1] += 125.f; // Store gCutsceneFocus's position and yaw - object_pos_to_vec3f(sCutsceneVars[9].point, gCutsceneFocus); + vec3f_copy(sCutsceneVars[9].point, &gCutsceneFocus->oPosVec); sCutsceneVars[9].point[1] += gCutsceneFocus->hitboxHeight + 200.f; vec3f_get_yaw(sCutsceneVars[8].point, sCutsceneVars[9].point, &sCutsceneVars[9].angle[1]); vec3f_get_yaw(sMarioCamState->pos, gLakituState.curPos, &yaw); @@ -9282,7 +9275,7 @@ void cutscene_enter_cannon_end(struct Camera *c) { * Rotate around the cannon as it rises out of the hole. */ void cutscene_enter_cannon_raise(struct Camera *c) { - struct Object *o; + struct Object *obj; f32 floorHeight; struct Surface *floor; Vec3f cannonFocus; @@ -9301,14 +9294,14 @@ void cutscene_enter_cannon_raise(struct Camera *c) { sCutsceneVars[3].point[1] += 2.f; c->pos[1] += sCutsceneVars[3].point[1]; - if ((o = sMarioCamState->usedObj) != NULL) { - sCutsceneVars[0].point[1] = o->oPosY; - cannonAngle[0] = o->oMoveAnglePitch; - cannonAngle[1] = o->oMoveAngleYaw; - cannonAngle[2] = o->oMoveAngleRoll; - c->focus[0] = o->oPosX; - c->focus[1] = o->oPosY; - c->focus[2] = o->oPosZ; + if ((obj = sMarioCamState->usedObj) != NULL) { + sCutsceneVars[0].point[1] = obj->oPosY; + cannonAngle[0] = obj->oMoveAnglePitch; + cannonAngle[1] = obj->oMoveAngleYaw; + cannonAngle[2] = obj->oMoveAngleRoll; + c->focus[0] = obj->oPosX; + c->focus[1] = obj->oPosY; + c->focus[2] = obj->oPosZ; cannonFocus[0] = 0.f; cannonFocus[1] = 100.f; cannonFocus[2] = 0.f; @@ -9326,19 +9319,19 @@ void cutscene_enter_cannon_raise(struct Camera *c) { * Start the cannon entering cutscene */ void cutscene_enter_cannon_start(struct Camera *c) { - struct Object *o; + struct Object *obj; sStatusFlags |= CAM_FLAG_SMOOTH_MOVEMENT; sMarioCamState->cameraEvent = 0; // Store the cannon's position and angle in cvar0 - if ((o = sMarioCamState->usedObj) != NULL) { - sCutsceneVars[0].point[0] = o->oPosX; - sCutsceneVars[0].point[1] = o->oPosY; - sCutsceneVars[0].point[2] = o->oPosZ; - sCutsceneVars[0].angle[0] = o->oMoveAnglePitch; - sCutsceneVars[0].angle[1] = o->oMoveAngleYaw; - sCutsceneVars[0].angle[2] = o->oMoveAngleRoll; + if ((obj = sMarioCamState->usedObj) != NULL) { + sCutsceneVars[0].point[0] = obj->oPosX; + sCutsceneVars[0].point[1] = obj->oPosY; + sCutsceneVars[0].point[2] = obj->oPosZ; + sCutsceneVars[0].angle[0] = obj->oMoveAnglePitch; + sCutsceneVars[0].angle[1] = obj->oMoveAngleYaw; + sCutsceneVars[0].angle[2] = obj->oMoveAngleRoll; } // Store the camera's polar offset from the cannon in cvar1 @@ -10532,34 +10525,33 @@ void set_fov_shake_from_point_preset(u8 preset, f32 posX, f32 posY, f32 posZ) { /** * Offset an object's position in a random direction within the given bounds. */ -static UNUSED void unused_displace_obj_randomly(struct Object *o, f32 xRange, f32 yRange, f32 zRange) { +static UNUSED void unused_displace_obj_randomly(struct Object *obj, f32 xRange, f32 yRange, f32 zRange) { f32 rnd = random_float(); - o->oPosX += (rnd * xRange - xRange / 2.f); - o->oPosY += (rnd * yRange - yRange / 2.f); - o->oPosZ += (rnd * zRange - zRange / 2.f); + obj->oPosX += (rnd * xRange - xRange / 2.f); + obj->oPosY += (rnd * yRange - yRange / 2.f); + obj->oPosZ += (rnd * zRange - zRange / 2.f); } /** * Rotate an object in a random direction within the given bounds. */ -static UNUSED void unused_rotate_obj_randomly(struct Object *o, f32 pitchRange, f32 yawRange) { +static UNUSED void unused_rotate_obj_randomly(struct Object *obj, f32 pitchRange, f32 yawRange) { f32 rnd = random_float(); - o->oMoveAnglePitch += (s16)(rnd * pitchRange - pitchRange / 2.f); - o->oMoveAngleYaw += (s16)(rnd * yawRange - yawRange / 2.f); + obj->oMoveAnglePitch += (s16)(rnd * pitchRange - pitchRange / 2.f); + obj->oMoveAngleYaw += (s16)(rnd * yawRange - yawRange / 2.f); } /** * Rotate the object towards the point `point`. */ -void obj_rotate_towards_point(struct Object *o, Vec3f point, s16 pitchOff, s16 yawOff, s16 pitchDiv, s16 yawDiv) { +void obj_rotate_towards_point(struct Object *obj, Vec3f point, s16 pitchOff, s16 yawOff, s16 pitchDiv, s16 yawDiv) { f32 dist; s16 pitch, yaw; Vec3f oPos; - - object_pos_to_vec3f(oPos, o); + vec3f_copy(oPos, &obj->oPosVec); vec3f_get_dist_and_angle(oPos, point, &dist, &pitch, &yaw); - o->oMoveAnglePitch = approach_s16_asymptotic(o->oMoveAnglePitch, pitchOff - pitch, pitchDiv); - o->oMoveAngleYaw = approach_s16_asymptotic(o->oMoveAngleYaw, yaw + yawOff, yawDiv); + obj->oMoveAnglePitch = approach_s16_asymptotic(obj->oMoveAnglePitch, pitchOff - pitch, pitchDiv); + obj->oMoveAngleYaw = approach_s16_asymptotic(obj->oMoveAngleYaw, yaw + yawOff, yawDiv); } #include "behaviors/intro_peach.inc.c" diff --git a/src/game/camera.h b/src/game/camera.h index 122fb35d..c18e8d56 100644 --- a/src/game/camera.h +++ b/src/game/camera.h @@ -682,8 +682,6 @@ void reset_camera(struct Camera *c); void init_camera(struct Camera *c); void select_mario_cam_mode(void); Gfx *geo_camera_main(s32 callContext, struct GraphNode *g, void *context); -void object_pos_to_vec3f(Vec3f dst, struct Object *o); -void vec3f_to_object_pos(struct Object *o, Vec3f src); s32 move_point_along_spline(Vec3f p, struct CutsceneSplinePoint spline[], s16 *splineSegment, f32 *progress); s32 cam_select_alt_mode(s32 angle); s32 set_cam_angle(s32 mode); @@ -739,9 +737,9 @@ void resolve_geometry_collisions(Vec3f pos); s32 rotate_camera_around_walls(struct Camera *c, Vec3f cPos, s16 *avoidYaw, s16 yawRange); void find_mario_floor_and_ceil(struct PlayerGeometry *pg); u8 start_object_cutscene_without_focus(u8 cutscene); -s16 cutscene_object_with_dialog(u8 cutscene, struct Object *o, s16 dialogID); -s16 cutscene_object_without_dialog(u8 cutscene, struct Object *o); -s16 cutscene_object(u8 cutscene, struct Object *o); +s16 cutscene_object_with_dialog(u8 cutscene, struct Object *obj, s16 dialogID); +s16 cutscene_object_without_dialog(u8 cutscene, struct Object *obj); +s16 cutscene_object(u8 cutscene, struct Object *obj); void play_cutscene(struct Camera *c); s32 cutscene_event(CameraEvent event, struct Camera * c, s16 start, s16 end); s32 cutscene_spawn_obj(u32 obj, s16 frame); @@ -750,7 +748,7 @@ void set_fov_shake(s16 amplitude, s16 decay, s16 shakeSpeed); void set_fov_function(u8 func); void cutscene_set_fov_shake_preset(u8 preset); void set_fov_shake_from_point_preset(u8 preset, f32 posX, f32 posY, f32 posZ); -void obj_rotate_towards_point(struct Object *o, Vec3f point, s16 pitchOff, s16 yawOff, s16 pitchDiv, s16 yawDiv); +void obj_rotate_towards_point(struct Object *obj, Vec3f point, s16 pitchOff, s16 yawOff, s16 pitchDiv, s16 yawDiv); Gfx *geo_camera_fov(s32 callContext, struct GraphNode *g, UNUSED void *context); diff --git a/src/game/farcall_helpers.h b/src/game/farcall_helpers.h index d42daf15..45624e14 100644 --- a/src/game/farcall_helpers.h +++ b/src/game/farcall_helpers.h @@ -25,8 +25,6 @@ #include "level_headers.h" #include "level_misc_macros.h" -#define o gCurrentObject - s32 obj_is_rendering_enabled(void); s16 obj_get_pitch_from_vel(void); s32 obj_update_race_proposition_dialog(s16 dialogID); diff --git a/src/game/interaction.h b/src/game/interaction.h index 24cf1bac..973e5977 100644 --- a/src/game/interaction.h +++ b/src/game/interaction.h @@ -107,19 +107,19 @@ #define INT_STATUS_TOUCHED_BOB_OMB (1 << 23) /* 0x00800000 */ -s16 mario_obj_angle_to_object(struct MarioState *m, struct Object *o); +s16 mario_obj_angle_to_object(struct MarioState *m, struct Object *obj); void mario_stop_riding_object(struct MarioState *m); void mario_grab_used_object(struct MarioState *m); void mario_drop_held_object(struct MarioState *m); void mario_throw_held_object(struct MarioState *m); void mario_stop_riding_and_holding(struct MarioState *m); -u32 does_mario_have_normal_cap_on_head(struct MarioState *m); +u32 does_mario_have_normal_cap_on_head(struct MarioState *m); void mario_blow_off_cap(struct MarioState *m, f32 capSpeed); -u32 mario_lose_cap_to_enemy(u32 enemyType); +u32 mario_lose_cap_to_enemy(u32 enemyType); void mario_retrieve_cap(void); struct Object *mario_get_collided_object(struct MarioState *m, u32 interactType); -u32 mario_check_object_grab(struct MarioState *m); -u32 get_door_save_file_flag(struct Object *door); +u32 mario_check_object_grab(struct MarioState *m); +u32 get_door_save_file_flag(struct Object *door); void mario_process_interactions(struct MarioState *m); void mario_handle_special_floors(struct MarioState *m); diff --git a/src/game/mario.c b/src/game/mario.c index b009a256..1dd100c3 100644 --- a/src/game/mario.c +++ b/src/game/mario.c @@ -42,50 +42,50 @@ * Checks if Mario's animation has reached its end point. */ s32 is_anim_at_end(struct MarioState *m) { - struct Object *o = m->marioObj; + struct Object *marioObj = m->marioObj; - return (o->header.gfx.animInfo.animFrame + 1) == o->header.gfx.animInfo.curAnim->loopEnd; + return (marioObj->header.gfx.animInfo.animFrame + 1) == marioObj->header.gfx.animInfo.curAnim->loopEnd; } /** * Checks if Mario's animation has surpassed 2 frames before its end point. */ s32 is_anim_past_end(struct MarioState *m) { - struct Object *o = m->marioObj; + struct Object *marioObj = m->marioObj; - return o->header.gfx.animInfo.animFrame >= (o->header.gfx.animInfo.curAnim->loopEnd - 2); + return marioObj->header.gfx.animInfo.animFrame >= (marioObj->header.gfx.animInfo.curAnim->loopEnd - 2); } /** * Sets Mario's animation without any acceleration, running at its default rate. */ s16 set_mario_animation(struct MarioState *m, s32 targetAnimID) { - struct Object *o = m->marioObj; + struct Object *marioObj = m->marioObj; struct Animation *targetAnim = m->animList->bufTarget; if (load_patchable_table(m->animList, targetAnimID)) { targetAnim->values = (void *) VIRTUAL_TO_PHYSICAL((u8 *) targetAnim + (uintptr_t) targetAnim->values); - targetAnim->index = (void *) VIRTUAL_TO_PHYSICAL((u8 *) targetAnim + (uintptr_t) targetAnim->index); + targetAnim->index = (void *) VIRTUAL_TO_PHYSICAL((u8 *) targetAnim + (uintptr_t) targetAnim->index); } - if (o->header.gfx.animInfo.animID != targetAnimID) { - o->header.gfx.animInfo.animID = targetAnimID; - o->header.gfx.animInfo.curAnim = targetAnim; - o->header.gfx.animInfo.animAccel = 0; - o->header.gfx.animInfo.animYTrans = m->animYTrans; + if (marioObj->header.gfx.animInfo.animID != targetAnimID) { + marioObj->header.gfx.animInfo.animID = targetAnimID; + marioObj->header.gfx.animInfo.curAnim = targetAnim; + marioObj->header.gfx.animInfo.animAccel = 0; + marioObj->header.gfx.animInfo.animYTrans = m->animYTrans; if (targetAnim->flags & ANIM_FLAG_NO_ACCEL) { - o->header.gfx.animInfo.animFrame = targetAnim->startFrame; + marioObj->header.gfx.animInfo.animFrame = targetAnim->startFrame; } else { if (targetAnim->flags & ANIM_FLAG_FORWARD) { - o->header.gfx.animInfo.animFrame = targetAnim->startFrame + 1; + marioObj->header.gfx.animInfo.animFrame = targetAnim->startFrame + 1; } else { - o->header.gfx.animInfo.animFrame = targetAnim->startFrame - 1; + marioObj->header.gfx.animInfo.animFrame = targetAnim->startFrame - 1; } } } - return o->header.gfx.animInfo.animFrame; + return marioObj->header.gfx.animInfo.animFrame; } /** @@ -93,7 +93,7 @@ s16 set_mario_animation(struct MarioState *m, s32 targetAnimID) { * slowed down via acceleration. */ s16 set_mario_anim_with_accel(struct MarioState *m, s32 targetAnimID, s32 accel) { - struct Object *o = m->marioObj; + struct Object *marioObj = m->marioObj; struct Animation *targetAnim = m->animList->bufTarget; if (load_patchable_table(m->animList, targetAnimID)) { @@ -101,27 +101,27 @@ s16 set_mario_anim_with_accel(struct MarioState *m, s32 targetAnimID, s32 accel) targetAnim->index = (void *) VIRTUAL_TO_PHYSICAL((u8 *) targetAnim + (uintptr_t) targetAnim->index); } - if (o->header.gfx.animInfo.animID != targetAnimID) { - o->header.gfx.animInfo.animID = targetAnimID; - o->header.gfx.animInfo.curAnim = targetAnim; - o->header.gfx.animInfo.animYTrans = m->animYTrans; + if (marioObj->header.gfx.animInfo.animID != targetAnimID) { + marioObj->header.gfx.animInfo.animID = targetAnimID; + marioObj->header.gfx.animInfo.curAnim = targetAnim; + marioObj->header.gfx.animInfo.animYTrans = m->animYTrans; if (targetAnim->flags & ANIM_FLAG_NO_ACCEL) { - o->header.gfx.animInfo.animFrameAccelAssist = (targetAnim->startFrame << 0x10); + marioObj->header.gfx.animInfo.animFrameAccelAssist = (targetAnim->startFrame << 0x10); } else { if (targetAnim->flags & ANIM_FLAG_FORWARD) { - o->header.gfx.animInfo.animFrameAccelAssist = (targetAnim->startFrame << 0x10) + accel; + marioObj->header.gfx.animInfo.animFrameAccelAssist = (targetAnim->startFrame << 0x10) + accel; } else { - o->header.gfx.animInfo.animFrameAccelAssist = (targetAnim->startFrame << 0x10) - accel; + marioObj->header.gfx.animInfo.animFrameAccelAssist = (targetAnim->startFrame << 0x10) - accel; } } - o->header.gfx.animInfo.animFrame = (o->header.gfx.animInfo.animFrameAccelAssist >> 0x10); + marioObj->header.gfx.animInfo.animFrame = (marioObj->header.gfx.animInfo.animFrameAccelAssist >> 0x10); } - o->header.gfx.animInfo.animAccel = accel; + marioObj->header.gfx.animInfo.animAccel = accel; - return o->header.gfx.animInfo.animFrame; + return marioObj->header.gfx.animInfo.animFrame; } /** @@ -1554,13 +1554,13 @@ void mario_reset_bodystate(struct MarioState *m) { * Adjusts Mario's graphical height for quicksand. */ void sink_mario_in_quicksand(struct MarioState *m) { - struct Object *o = m->marioObj; + struct Object *marioObj = m->marioObj; - if (o->header.gfx.throwMatrix) { - (*o->header.gfx.throwMatrix)[3][1] -= m->quicksandDepth; + if (marioObj->header.gfx.throwMatrix) { + (*marioObj->header.gfx.throwMatrix)[3][1] -= m->quicksandDepth; } - o->header.gfx.pos[1] -= m->quicksandDepth; + marioObj->header.gfx.pos[1] -= m->quicksandDepth; } /** diff --git a/src/game/mario.h b/src/game/mario.h index ae547b89..b2a5d802 100644 --- a/src/game/mario.h +++ b/src/game/mario.h @@ -12,7 +12,7 @@ s16 set_mario_animation(struct MarioState *m, s32 targetAnimID); s16 set_mario_anim_with_accel(struct MarioState *m, s32 targetAnimID, s32 accel); void set_anim_to_frame(struct MarioState *m, s16 animFrame); s32 is_anim_past_frame(struct MarioState *m, s16 animFrame); -s16 find_mario_anim_flags_and_translation(struct Object *o, s32 yaw, Vec3s translation); +s16 find_mario_anim_flags_and_translation(struct Object *obj, s32 yaw, Vec3s translation); void update_mario_pos_for_anim(struct MarioState *m); s16 return_mario_anim_y_translation(struct MarioState *m); void play_sound_if_no_flag(struct MarioState *m, u32 soundBits, u32 flags); diff --git a/src/game/mario_actions_cutscene.c b/src/game/mario_actions_cutscene.c index f4352e00..2ddb17cb 100644 --- a/src/game/mario_actions_cutscene.c +++ b/src/game/mario_actions_cutscene.c @@ -273,14 +273,14 @@ void handle_save_menu(struct MarioState *m) { * and yaw plus relative yaw. */ struct Object *spawn_obj_at_mario_rel_yaw(struct MarioState *m, s32 model, const BehaviorScript *behavior, s16 relYaw) { - struct Object *o = spawn_object(m->marioObj, model, behavior); + struct Object *obj = spawn_object(m->marioObj, model, behavior); - o->oFaceAngleYaw = m->faceAngle[1] + relYaw; - o->oPosX = m->pos[0]; - o->oPosY = m->pos[1]; - o->oPosZ = m->pos[2]; + obj->oFaceAngleYaw = m->faceAngle[1] + relYaw; + obj->oPosX = m->pos[0]; + obj->oPosY = m->pos[1]; + obj->oPosZ = m->pos[2]; - return o; + return obj; } /** @@ -1983,16 +1983,16 @@ void generate_yellow_sparkles(s16 x, s16 y, s16 z, f32 radius) { // not sure what this does, returns the height of the floor. // (animation related?) -static f32 end_obj_set_visual_pos(struct Object *o) { +static f32 end_obj_set_visual_pos(struct Object *obj) { struct Surface *surf; Vec3s translation; f32 x, y, z; - find_mario_anim_flags_and_translation(o, o->header.gfx.angle[1], translation); + find_mario_anim_flags_and_translation(obj, obj->header.gfx.angle[1], translation); - x = o->header.gfx.pos[0] + translation[0]; - y = o->header.gfx.pos[1] + 10.0f; - z = o->header.gfx.pos[2] + translation[2]; + x = obj->header.gfx.pos[0] + translation[0]; + y = obj->header.gfx.pos[1] + 10.0f; + z = obj->header.gfx.pos[2] + translation[2]; return find_floor(x, y, z, &surf); } diff --git a/src/game/obj_behaviors.c b/src/game/obj_behaviors.c index e4dfd5b4..a9cbefe4 100644 --- a/src/game/obj_behaviors.c +++ b/src/game/obj_behaviors.c @@ -40,8 +40,6 @@ * specific behaviors. Few functions besides the bhv_ functions are used elsewhere in the repo. */ -#define o gCurrentObject - #define OBJ_COL_FLAG_GROUNDED (1 << 0) #define OBJ_COL_FLAG_HIT_WALL (1 << 1) #define OBJ_COL_FLAG_UNDERWATER (1 << 2) diff --git a/src/game/obj_behaviors_2.c b/src/game/obj_behaviors_2.c index dab8f3a7..2be8540f 100644 --- a/src/game/obj_behaviors_2.c +++ b/src/game/obj_behaviors_2.c @@ -53,8 +53,6 @@ #define POS_OP_COMPUTE_VELOCITY 1 #define POS_OP_RESTORE_POSITION 2 -#define o gCurrentObject - /* BSS (declared to force order) */ extern s32 sNumActiveFirePiranhaPlants; extern s32 sNumKilledFirePiranhaPlants; diff --git a/src/game/object_helpers.c b/src/game/object_helpers.c index f65557a9..d5281d52 100644 --- a/src/game/object_helpers.c +++ b/src/game/object_helpers.c @@ -33,8 +33,6 @@ static s8 sLevelsWithRooms[] = { LEVEL_BBH, LEVEL_CASTLE, LEVEL_HMC, -1 }; static s32 clear_move_flag(u32 * bitSet, s32 flag); -#define o gCurrentObject - Gfx *geo_update_projectile_pos_from_parent(s32 callContext, UNUSED struct GraphNode *node, Mat4 mtx) { Mat4 mtx2; struct Object *projObj; diff --git a/src/game/object_list_processor.h b/src/game/object_list_processor.h index 1f2be9cd..a5152fbd 100644 --- a/src/game/object_list_processor.h +++ b/src/game/object_list_processor.h @@ -86,6 +86,7 @@ extern struct ObjectNode gFreeObjectList; extern struct Object *gMarioObject; extern struct Object *gLuigiObject; extern struct Object *gCurrentObject; +#define o gCurrentObject extern const BehaviorScript *gCurBhvCommand; extern s16 gPrevFrameObjectCount; From 4adf87f622b2ef1b646034556cea93826a2ad4d6 Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Tue, 28 Sep 2021 17:33:18 -0700 Subject: [PATCH 35/97] Some cleanup/fixes --- src/engine/graph_node.c | 2 +- src/engine/level_script.c | 4 +- src/engine/math_util.c | 49 ++++++++++++------------ src/engine/math_util.h | 3 +- src/game/behaviors/intro_peach.inc.c | 3 +- src/game/behaviors/snowman.inc.c | 14 ++----- src/game/behaviors/spawn_star.inc.c | 7 +--- src/game/camera.c | 50 ++++++++++-------------- src/game/insn_disasm.c | 12 +++--- src/game/mario.c | 2 +- src/game/mario_actions_airborne.c | 7 +--- src/game/mario_actions_automatic.c | 7 +--- src/game/mario_actions_moving.c | 2 +- src/game/mario_actions_stationary.c | 9 ++--- src/game/mario_actions_submerged.c | 2 +- src/game/mario_misc.c | 4 +- src/game/platform_displacement.c | 2 +- src/game/puppycam2.c | 57 ++++++++++------------------ src/game/puppyprint.c | 55 ++++++++++++--------------- 19 files changed, 120 insertions(+), 171 deletions(-) diff --git a/src/engine/graph_node.c b/src/engine/graph_node.c index 1b0790ad..a2b2f5d1 100644 --- a/src/engine/graph_node.c +++ b/src/engine/graph_node.c @@ -887,7 +887,7 @@ void geo_retreive_animation_translation(struct GraphNodeObject *obj, Vec3f posit position[1] = (f32) values[retrieve_animation_index(frame, &attribute)]; position[2] = (f32) values[retrieve_animation_index(frame, &attribute)]; } else { - vec3f_set(position, 0, 0, 0); + vec3_zero(position); } } diff --git a/src/engine/level_script.c b/src/engine/level_script.c index c22544fa..360a704f 100644 --- a/src/engine/level_script.c +++ b/src/engine/level_script.c @@ -460,8 +460,8 @@ static void level_cmd_23(void) { } static void level_cmd_init_mario(void) { - vec3s_set(gMarioSpawnInfo->startPos, 0, 0, 0); - vec3s_set(gMarioSpawnInfo->startAngle, 0, 0, 0); + vec3_zero(gMarioSpawnInfo->startPos); + vec3_zero(gMarioSpawnInfo->startAngle); gMarioSpawnInfo->activeAreaIndex = -1; gMarioSpawnInfo->areaIndex = 0; diff --git a/src/engine/math_util.c b/src/engine/math_util.c index 76b8d1a6..d83439c7 100644 --- a/src/engine/math_util.c +++ b/src/engine/math_util.c @@ -598,7 +598,7 @@ void mtxf_rotate_xy(Mtx *mtx, s32 angle) { */ void get_pos_from_transform_mtx(Vec3f dest, Mat4 objMtx, register Mat4 camMtx) { register s32 i; - register f32 *temp = (f32 *)dest; + register f32 *temp1 = (f32 *)dest; register f32 *temp2 = (f32 *)camMtx; f32 y[3]; register f32 *x = y; @@ -608,12 +608,12 @@ void get_pos_from_transform_mtx(Vec3f dest, Mat4 objMtx, register Mat4 camMtx) { *x = (temp3[12] - temp2[12]); temp2++; temp3++; - x = ((u32)x)+4; + x = (f32 *)(((u32)x) + 4); } temp2 -=3;; for (i = 0; i < 3; i++) { - *temp = x[-3] * temp2[0] + x[-2] * temp2[1] + x[-1] * temp2[2]; - temp++; + *temp1 = x[-3] * temp2[0] + x[-2] * temp2[1] + x[-1] * temp2[2]; + temp1++; temp2 += 4; } } @@ -756,6 +756,25 @@ void vec3s_set_dist_and_angle(Vec3s from, Vec3s to, s16 dist, Angle32 pitch, Ang to[2] = (from[2] + (dcos * coss(yaw ))); } +/** + * Similar to approach_s32, but converts to s16 and allows for overflow between 32767 and -32768 + */ +s32 approach_angle(s32 current, s32 target, s32 inc) { + s32 dist = (s16)(target - current); + if (dist < 0) { + dist += inc; + if (dist > 0) dist = 0; + } else if (dist > 0) { + dist -= inc; + if (dist < 0) dist = 0; + } + return (target - dist); +} +Bool32 approach_angle_bool(s16 *current, s32 target, s32 inc) { + *current = approach_angle(*current, target, inc); + return (*current != target); +} + s32 approach_s16(s32 current, s32 target, s32 inc, s32 dec) { s16 dist = (target - current); if (dist >= 0) { // target >= current @@ -765,10 +784,9 @@ s32 approach_s16(s32 current, s32 target, s32 inc, s32 dec) { } return current; } - Bool32 approach_s16_bool(s16 *current, s32 target, s32 inc, s32 dec) { *current = approach_s16(*current, target, inc, dec); - return !(*current == target); + return (*current != target); } /** @@ -784,10 +802,9 @@ s32 approach_s32(s32 current, s32 target, s32 inc, s32 dec) { } return current; } - Bool32 approach_s32_bool(s32 *current, s32 target, s32 inc, s32 dec) { *current = approach_s32(*current, target, inc, dec); - return !(*current == target); + return (*current != target); } /** @@ -803,7 +820,6 @@ f32 approach_f32(f32 current, f32 target, f32 inc, f32 dec) { } return current; } - Bool32 approach_f32_bool(f32 *current, f32 target, f32 inc, f32 dec) { *current = approach_f32(*current, target, inc, dec); return !(*current == target); @@ -826,21 +842,6 @@ s32 approach_f32_signed(f32 *current, f32 target, f32 inc) { return reachedTarget; } -/** - * Similar to approach_s32, but converts to s16 and allows for overflow between 32767 and -32768 - */ -s32 approach_angle(s32 current, s32 target, s32 inc) { - s32 dist = (s16)(target - current); - if (dist < 0) { - dist += inc; - if (dist > 0) dist = 0; - } else if (dist > 0) { - dist -= inc; - if (dist < 0) dist = 0; - } - return (target - dist); -} - /** * Approaches an f32 value by taking the difference between the target and current value * and adding a fraction of that to the current value. diff --git a/src/engine/math_util.h b/src/engine/math_util.h index 0b08c90c..c09b957a 100644 --- a/src/engine/math_util.h +++ b/src/engine/math_util.h @@ -486,9 +486,11 @@ void vec3f_get_dist_and_angle( Vec3f from, Vec3f to, f32 *dist, void vec3s_set_dist_and_angle( Vec3s from, Vec3s to, s16 dist, Angle32 pitch, Angle32 yaw); void vec3f_set_dist_and_angle( Vec3f from, Vec3f to, f32 dist, Angle32 pitch, Angle32 yaw); +s32 approach_angle(s32 current, s32 target, s32 inc); s32 approach_s16(s32 current, s32 target, s32 inc, s32 dec); s32 approach_s32(s32 current, s32 target, s32 inc, s32 dec); f32 approach_f32(f32 current, f32 target, f32 inc, f32 dec); +Bool32 approach_angle_bool(s16 *current, s32 target, s32 inc); Bool32 approach_s16_bool(s16 *current, s32 target, s32 inc, s32 dec); Bool32 approach_s32_bool(s32 *current, s32 target, s32 inc, s32 dec); Bool32 approach_f32_bool(f32 *current, f32 target, f32 inc, f32 dec); @@ -499,7 +501,6 @@ Bool32 approach_f32_bool(f32 *current, f32 target, f32 inc, f32 dec); #define approach_s32_symmetric_bool(current, target, inc) approach_s32_bool((current), (target), (inc), (inc)) #define approach_f32_symmetric_bool(current, target, inc) approach_f32_bool((current), (target), (inc), (inc)) s32 approach_f32_signed(f32 *current, f32 target, f32 inc); -s32 approach_angle(s32 current, s32 target, s32 inc); s32 approach_f32_asymptotic_bool(f32 *current, f32 target, f32 multiplier); f32 approach_f32_asymptotic(f32 current, f32 target, f32 multiplier); s32 approach_s16_asymptotic_bool(s16 *current, s16 target, s16 divisor); diff --git a/src/game/behaviors/intro_peach.inc.c b/src/game/behaviors/intro_peach.inc.c index ab3706b0..906dbc39 100644 --- a/src/game/behaviors/intro_peach.inc.c +++ b/src/game/behaviors/intro_peach.inc.c @@ -7,13 +7,12 @@ void intro_peach_set_pos_and_opacity(struct Object *obj, f32 targetOpacity, f32 increment) { Vec3f newPos; s16 focusPitch, focusYaw; - f32 newOpacity; vec3f_get_angle(gLakituState.pos, gLakituState.focus, &focusPitch, &focusYaw); vec3f_set_dist_and_angle(gLakituState.pos, newPos, obj->oIntroPeachDistToCamera, obj->oIntroPeachPitchFromFocus + focusPitch, obj->oIntroPeachYawFromFocus + focusYaw); vec3f_copy(&obj->oPosVec, newPos); - newOpacity = obj->oOpacity; + f32 newOpacity = obj->oOpacity; camera_approach_f32_symmetric_bool(&newOpacity, targetOpacity, increment); obj->oOpacity = newOpacity; } diff --git a/src/game/behaviors/snowman.inc.c b/src/game/behaviors/snowman.inc.c index 9560bdf0..61d12ced 100644 --- a/src/game/behaviors/snowman.inc.c +++ b/src/game/behaviors/snowman.inc.c @@ -153,11 +153,8 @@ void bhv_snowmans_bottom_loop(void) { } void bhv_snowmans_head_init(void) { - u8 starFlags; - s8 behParams; - - starFlags = save_file_get_star_flags(gCurrSaveFileNum - 1, gCurrCourseNum - 1); - behParams = (o->oBehParams >> 24) & 0xFF; + u8 starFlags = save_file_get_star_flags(gCurrSaveFileNum - 1, gCurrCourseNum - 1); + s8 behParams = (o->oBehParams >> 24) & 0xFF; cur_obj_scale(0.7f); @@ -166,11 +163,8 @@ void bhv_snowmans_head_init(void) { o->oBuoyancy = 2.0f; if ((starFlags & (1 << behParams)) && gCurrActNum != behParams + 1) { - spawn_object_abs_with_rot(o, 0, MODEL_CCM_SNOWMAN_BASE, bhvBigSnowmanWhole, -4230, -1344, 1813, - 0, 0, 0); - o->oPosX = -4230.0f; - o->oPosY = -994.0f; - o->oPosZ = 1813.0f; + spawn_object_abs_with_rot(o, 0, MODEL_CCM_SNOWMAN_BASE, bhvBigSnowmanWhole, -4230, -1344, 1813, 0, 0, 0); + vec3_set(&o->oPosVec, -4230.0f, -994.0f, 1813.0f); o->oAction = 1; } } diff --git a/src/game/behaviors/spawn_star.inc.c b/src/game/behaviors/spawn_star.inc.c index cd546b85..c088ea43 100644 --- a/src/game/behaviors/spawn_star.inc.c +++ b/src/game/behaviors/spawn_star.inc.c @@ -117,12 +117,9 @@ void bhv_star_spawn_loop(void) { } struct Object *spawn_star(struct Object *starObj, f32 x, f32 y, f32 z) { - starObj = spawn_object_abs_with_rot(o, 0, MODEL_STAR, bhvStarSpawnCoordinates, o->oPosX, o->oPosY, - o->oPosZ, 0, 0, 0); + starObj = spawn_object_abs_with_rot(o, 0, MODEL_STAR, bhvStarSpawnCoordinates, o->oPosX, o->oPosY, o->oPosZ, 0, 0, 0); starObj->oBehParams = o->oBehParams; - starObj->oHomeX = x; - starObj->oHomeY = y; - starObj->oHomeZ = z; + vec3_set(&starObj->oHomeVec, x, y, z); starObj->oFaceAnglePitch = 0; starObj->oFaceAngleRoll = 0; return starObj; diff --git a/src/game/camera.c b/src/game/camera.c index 9768997b..d63beb0e 100644 --- a/src/game/camera.c +++ b/src/game/camera.c @@ -1618,7 +1618,7 @@ void mode_fixed_camera(struct Camera *c) { c->nextYaw = update_fixed_camera(c, c->focus, c->pos); c->yaw = c->nextYaw; pan_ahead_of_player(c); - vec3f_set(sCastleEntranceOffset, 0.f, 0.f, 0.f); + vec3_zero(sCastleEntranceOffset); } /** @@ -2756,7 +2756,7 @@ void update_lakitu(struct Camera *c) { if (c->cutscene) { vec3f_add(gLakituState.focus, sPlayer2FocusOffset); - vec3f_set(sPlayer2FocusOffset, 0, 0, 0); + vec3_zero(sPlayer2FocusOffset); } vec3f_get_dist_and_angle(gLakituState.pos, gLakituState.focus, &gLakituState.focusDistance, @@ -3072,8 +3072,8 @@ void init_camera(struct Camera *c) { gLakituState.keyDanceRoll = 0; gLakituState.unused = 0; sStatusFlags &= ~CAM_FLAG_SMOOTH_MOVEMENT; - vec3f_set(sCastleEntranceOffset, 0.f, 0.f, 0.f); - vec3f_set(sPlayer2FocusOffset, 0.f, 0.f, 0.f); + vec3_zero(sCastleEntranceOffset); + vec3_zero(sPlayer2FocusOffset); find_mario_floor_and_ceil(&sMarioGeometry); sMarioGeometry.prevFloorHeight = sMarioGeometry.currFloorHeight; sMarioGeometry.prevCeilHeight = sMarioGeometry.currCeilHeight; @@ -3494,7 +3494,7 @@ void shake_camera_handheld(Vec3f pos, Vec3f focus) { s16 pitch, yaw; if (sHandheldShakeMag == 0) { - vec3f_set(shakeOffset, 0.f, 0.f, 0.f); + vec3_zero(shakeOffset); } else { for (i = 0; i < 4; i++) { shakeSpline[i][0] = sHandheldShakeSpline[i].point[0]; @@ -4437,9 +4437,9 @@ void clear_cutscene_vars(UNUSED struct Camera *c) { for (i = 0; i < 10; i++) { sCutsceneVars[i].unused1 = 0; - vec3f_set(sCutsceneVars[i].point, 0.f, 0.f, 0.f); - vec3f_set(sCutsceneVars[i].unusedPoint, 0.f, 0.f, 0.f); - vec3s_set(sCutsceneVars[i].angle, 0, 0, 0); + vec3_zero(sCutsceneVars[i].point); + vec3_zero(sCutsceneVars[i].unusedPoint); + vec3_zero(sCutsceneVars[i].angle); sCutsceneVars[i].unused2 = 0; } } @@ -5885,11 +5885,8 @@ s16 camera_course_processing(struct Camera *c) { case AREA_BBH: // if camera is fixed at bbh_room_13_balcony_camera (but as floats) - if (vec3f_compare(sFixedModeBasePosition, 210.f, 420.f, 3109.f) == 1) - { - if (sMarioCamState->pos[1] < 1800.f) { - transition_to_camera_mode(c, CAMERA_MODE_CLOSE, 30); - } + if (sFixedModeBasePosition[0] == 210.f && sFixedModeBasePosition[1] == 420.f && sFixedModeBasePosition[2] == 3109.f && sMarioCamState->pos[1] < 1800.f) { + transition_to_camera_mode(c, CAMERA_MODE_CLOSE, 30); } break; @@ -6756,7 +6753,7 @@ void cutscene_grand_star_front_of_mario(struct Camera *c) { */ void cutscene_grand_star_mario_jump(UNUSED struct Camera *c) { vec3s_set(sCutsceneVars[0].angle, 0, sMarioCamState->faceAngle[1], 0); - vec3f_set(sCutsceneVars[2].point, 0.f, 0.f, 0.f); + vec3_zero(sCutsceneVars[2].point); } /** @@ -7362,20 +7359,12 @@ void cutscene_bowser_arena_start(struct Camera *c) { * Create the dialog box depending on which bowser fight Mario is in. */ void bowser_fight_intro_dialog(UNUSED struct Camera *c) { - s16 dialog; - switch (gCurrLevelNum) { - case LEVEL_BOWSER_1: - dialog = DIALOG_067; - break; - case LEVEL_BOWSER_2: - dialog = DIALOG_092; - break; - default: // LEVEL_BOWSER_3 - dialog = DIALOG_093; + case LEVEL_BOWSER_1: create_dialog_box(DIALOG_067); break; + case LEVEL_BOWSER_2: create_dialog_box(DIALOG_092); break; + case LEVEL_BOWSER_3: create_dialog_box(DIALOG_093); break; + default: break; } - - create_dialog_box(dialog); } /** @@ -7383,7 +7372,6 @@ void bowser_fight_intro_dialog(UNUSED struct Camera *c) { */ void cutscene_bowser_arena_dialog(struct Camera *c) { cutscene_event(bowser_fight_intro_dialog, c, 0, 0); - if (get_dialog_id() == DIALOG_NONE) { gCutsceneTimer = CUTSCENE_LOOP; } @@ -7449,7 +7437,7 @@ void cutscene_star_spawn_update_boss_fight(struct Camera *c) { update_boss_fight_camera(c, focus, pos); approach_vec3f_asymptotic(c->focus, focus, 0.2f, 0.2f, 0.2f); - approach_vec3f_asymptotic(c->pos, pos, 0.2f, 0.2f, 0.2f); + approach_vec3f_asymptotic(c->pos, pos, 0.2f, 0.2f, 0.2f); } /** @@ -7496,7 +7484,7 @@ void cutscene_star_spawn_end(struct Camera *c) { void cutscene_exit_waterfall_warp(struct Camera *c) { //! hardcoded position - vec3f_set(c->pos, -3899.f, 39.f, -5671.f); + vec3_set(c->pos, -3899.f, 39.f, -5671.f); } /** @@ -7504,7 +7492,7 @@ void cutscene_exit_waterfall_warp(struct Camera *c) { */ void cutscene_exit_to_castle_grounds_focus_mario(struct Camera *c) { vec3f_copy(c->focus, sMarioCamState->pos); - c->focus[1] = c->pos[1] + (sMarioCamState->pos[1] + 125.f - c->pos[1]) * 0.5f; + c->focus[1] = c->pos[1] + ((sMarioCamState->pos[1] + 125.f - c->pos[1]) * 0.5f); approach_vec3f_asymptotic(c->focus, sMarioCamState->pos, 0.05f, 0.4f, 0.05f); } @@ -7701,7 +7689,7 @@ void cutscene_prepare_cannon_start(struct Camera *c) { sCutsceneVars[2].point[0] = 30.f; // Store the cannon door's position in sCutsceneVars[3]'s point vec3f_copy(sCutsceneVars[3].point, &gCutsceneFocus->oPosVec); - vec3s_set(sCutsceneVars[5].angle, 0, 0, 0); + vec3_zero(sCutsceneVars[5].angle); } /** diff --git a/src/game/insn_disasm.c b/src/game/insn_disasm.c index 337a60a0..c2dfb31a 100644 --- a/src/game/insn_disasm.c +++ b/src/game/insn_disasm.c @@ -21,15 +21,15 @@ extern far char *parse_map(u32); static char insn_as_string[100]; typedef struct __attribute__((packed)) { - u8 rd : 5; + u8 rd : 5; u8 shift_amt : 5; - u8 function : 6; + u8 function : 6; } RTypeData; typedef struct __attribute__((packed)) { u8 opcode : 6; - u8 rs : 5; - u8 rt : 5; + u8 rs : 5; + u8 rt : 5; union { RTypeData rdata; u16 immediate; @@ -44,7 +44,7 @@ typedef union { typedef struct __attribute__((packed)) { u32 type; u32 arbitraryParam; - u8 opcode : 6; + u8 opcode : 6; u8 function : 6; u8 name[10]; } InsnTemplate; @@ -67,7 +67,7 @@ InsnTemplate insn_db[] = { {I_TYPE, PARAM_NONE, 0b100101, 0, "LHU"}, {I_TYPE, PARAM_NONE, 0b101011, 0, "SW"}, {I_TYPE, PARAM_NONE, 0b100011, 0, "LW"}, - {I_TYPE, PARAM_LUI, 0b001111, 0, "LUI"}, + {I_TYPE, PARAM_LUI, 0b001111, 0, "LUI"}, // branches {I_TYPE, PARAM_SWAP_RS_IMM, 0b000100, 0, "BEQ"}, diff --git a/src/game/mario.c b/src/game/mario.c index 1dd100c3..11be2998 100644 --- a/src/game/mario.c +++ b/src/game/mario.c @@ -1100,7 +1100,7 @@ s32 check_common_hold_action_exits(struct MarioState *m) { s32 transition_submerged_to_walking(struct MarioState *m) { set_camera_mode(m->area->camera, m->area->camera->defMode, 1); - vec3s_set(m->angleVel, 0, 0, 0); + vec3_zero(m->angleVel); if (m->heldObj == NULL) { return set_mario_action(m, ACT_WALKING, 0); diff --git a/src/game/mario_actions_airborne.c b/src/game/mario_actions_airborne.c index 23192561..9f79162e 100644 --- a/src/game/mario_actions_airborne.c +++ b/src/game/mario_actions_airborne.c @@ -1862,10 +1862,7 @@ s32 act_riding_hoot(struct MarioState *m) { #endif return set_mario_action(m, ACT_FREEFALL, 0); } - - m->pos[0] = m->usedObj->oPosX; - m->pos[1] = m->usedObj->oPosY - 92.5f; - m->pos[2] = m->usedObj->oPosZ; + vec3_copy_y_off(m->pos, &m->usedObj->oPosVec, -92.5f); m->faceAngle[1] = 0x4000 - m->usedObj->oMoveAngleYaw; @@ -1877,7 +1874,7 @@ s32 act_riding_hoot(struct MarioState *m) { } } - vec3f_set(m->vel, 0.0f, 0.0f, 0.0f); + vec3_zero(m->vel); vec3f_set(m->marioObj->header.gfx.pos, m->pos[0], m->pos[1], m->pos[2]); vec3s_set(m->marioObj->header.gfx.angle, 0, 0x4000 - m->faceAngle[1], 0); return FALSE; diff --git a/src/game/mario_actions_automatic.c b/src/game/mario_actions_automatic.c index 5cbd080a..961a12c9 100644 --- a/src/game/mario_actions_automatic.c +++ b/src/game/mario_actions_automatic.c @@ -697,11 +697,8 @@ s32 act_in_cannon(struct MarioState *m) { m->statusForCamera->cameraEvent = CAM_EVENT_CANNON; m->statusForCamera->usedObj = m->usedObj; - vec3f_set(m->vel, 0.0f, 0.0f, 0.0f); - - m->pos[0] = m->usedObj->oPosX; - m->pos[1] = m->usedObj->oPosY + 350.0f; - m->pos[2] = m->usedObj->oPosZ; + vec3_zero(m->vel); + vec3_copy_y_off(m->pos, &m->usedObj->oPosVec, 350.0f); m->forwardVel = 0.0f; diff --git a/src/game/mario_actions_moving.c b/src/game/mario_actions_moving.c index ab153e9b..600f51a4 100644 --- a/src/game/mario_actions_moving.c +++ b/src/game/mario_actions_moving.c @@ -497,7 +497,7 @@ void update_walking_speed(struct MarioState *m) { } #elif GROUND_TURN_MODE == 3 // Instant turn. m->faceAngle[1] = m->intendedYaw; -#elif GROUND_TURN_MODE == 4 +#elif GROUND_TURN_MODE == 4 // Experimental. m->faceAngle[1] = approach_s16_asymptotic(m->faceAngle[1], m->intendedYaw, m->forwardVel / 8.0f); // should be max speed for the current action instead of m->forwardVel #endif apply_slope_accel(m); diff --git a/src/game/mario_actions_stationary.c b/src/game/mario_actions_stationary.c index 4aa2d109..bae1ebc4 100644 --- a/src/game/mario_actions_stationary.c +++ b/src/game/mario_actions_stationary.c @@ -774,9 +774,6 @@ s32 act_stop_crawling(struct MarioState *m) { } s32 act_shockwave_bounce(struct MarioState *m) { - s16 bounceTimer; - f32 bounceAmt; - if (m->marioObj->oInteractStatus & INT_STATUS_MARIO_SHOCKWAVE) { #if ENABLE_RUMBLE queue_rumble_data(70, 40); @@ -797,10 +794,10 @@ s32 act_shockwave_bounce(struct MarioState *m) { return set_mario_action(m, ACT_IDLE, 0); } - bounceTimer = (m->actionTimer % 16) << 12; - bounceAmt = (f32)(((f32)(6 - m->actionTimer / 8) * 8.0f) + 4.0f); + s16 bounceTimer = (m->actionTimer % 16) << 12; + f32 bounceAmt = (f32)(((f32)(6 - m->actionTimer / 8) * 8.0f) + 4.0f); mario_set_forward_vel(m, 0); - vec3f_set(m->vel, 0.0f, 0.0f, 0.0f); + vec3_zero(m->vel); if (sins(bounceTimer) >= 0.0f) { m->pos[1] = sins(bounceTimer) * bounceAmt + m->floorHeight; } else { diff --git a/src/game/mario_actions_submerged.c b/src/game/mario_actions_submerged.c index d0a15374..85bfadc1 100644 --- a/src/game/mario_actions_submerged.c +++ b/src/game/mario_actions_submerged.c @@ -492,7 +492,7 @@ static s32 check_water_jump(struct MarioState *m) { if (m->input & INPUT_A_PRESSED) { if (probe >= m->waterLevel - 80 && m->faceAngle[0] >= 0 && m->controller->stickY < -60.0f) { - vec3s_set(m->angleVel, 0, 0, 0); + vec3_zero(m->angleVel); m->vel[1] = 62.0f; diff --git a/src/game/mario_misc.c b/src/game/mario_misc.c index 7d081003..0409bc8d 100644 --- a/src/game/mario_misc.c +++ b/src/game/mario_misc.c @@ -427,8 +427,8 @@ Gfx *geo_mario_head_rotation(s32 callContext, struct GraphNode *node, UNUSED Mat rotNode->rotation[1] = bodyState->headAngle[2]; rotNode->rotation[2] = bodyState->headAngle[0]; } else { - vec3s_set(bodyState->headAngle, 0, 0, 0); - vec3s_set(rotNode->rotation, 0, 0, 0); + vec3_zero(bodyState->headAngle); + vec3_zero(rotNode->rotation); } } return NULL; diff --git a/src/game/platform_displacement.c b/src/game/platform_displacement.c index bbb4b5fa..4169f8c0 100644 --- a/src/game/platform_displacement.c +++ b/src/game/platform_displacement.c @@ -150,7 +150,7 @@ void apply_platform_displacement(struct PlatformDisplacementInfo *displaceInfo, // Make sure inertia isn't set on the first frame otherwise the previous value isn't cleared if ((platform != displaceInfo->prevPlatform) || (gGlobalTimer != displaceInfo->prevTimer + 1)) { - vec3f_set(sMarioAmountDisplaced, 0.f, 0.f, 0.f); + vec3_zero(sMarioAmountDisplaced); } } diff --git a/src/game/puppycam2.c b/src/game/puppycam2.c index 10168fb9..6bf921b3 100644 --- a/src/game/puppycam2.c +++ b/src/game/puppycam2.c @@ -637,10 +637,8 @@ static void puppycam_input_hold_preset3(void) { gPuppyCam.pitchAcceleration = approach_f32_asymptotic(gPuppyCam.pitchAcceleration, 0, DECELERATION); } } else { - if (gPlayer1Controller->buttonPressed & L_TRIG) { - if (gPuppyCam.yawTarget % 0x2000) { - gPuppyCam.yawTarget += 0x2000 - gPuppyCam.yawTarget % 0x2000; - } + if ((gPlayer1Controller->buttonPressed & L_TRIG) && (gPuppyCam.yawTarget % 0x2000)) { + gPuppyCam.yawTarget += 0x2000 - gPuppyCam.yawTarget % 0x2000; } if (gPuppyCam.mode3Flags & PUPPYCAM_MODE3_ZOOMED_MED) gPuppyCam.pitchTarget = approach_s32(gPuppyCam.pitchTarget, 0x3800, 0x200, 0x200); @@ -702,8 +700,8 @@ static void puppycam_input_hold_preset3(void) { // Handles C Button inputs for modes that have held inputs, rather than presses. static void puppycam_input_hold(void) { - f32 ivX = ((gPuppyCam.options.invertX*2)-1)*(gPuppyCam.options.sensitivityX/100.f); - f32 ivY = ((gPuppyCam.options.invertY*2)-1)*(gPuppyCam.options.sensitivityY/100.f); + f32 ivX = ((gPuppyCam.options.invertX * 2) - 1) * (gPuppyCam.options.sensitivityX / 100.f); + f32 ivY = ((gPuppyCam.options.invertY * 2) - 1) * (gPuppyCam.options.sensitivityY / 100.f); s8 stickMag[2] = {100, 100}; if (gPuppyCam.intendedFlags & PUPPYCAM_BEHAVIOUR_FREE) { @@ -830,13 +828,12 @@ void puppycam_debug_view(void) { } static void puppycam_view_panning(void) { - f32 panFloor, panMulti; s32 expectedPanX, expectedPanZ; s32 height = gPuppyCam.targetObj->oPosY; s32 panEx = (gPuppyCam.zoomTarget >= 1000) * 160; //Removes the basic panning when idling if the zoom level is at the closest. f32 slideSpeed = 1; - panMulti = CLAMP(gPuppyCam.zoom / (f32)gPuppyCam.zoomPoints[2], 0.f, 1.f); + f32 panMulti = CLAMP(gPuppyCam.zoom / (f32)gPuppyCam.zoomPoints[2], 0.f, 1.f); if (gPuppyCam.options.inputType == 2) { panMulti /= 2; } @@ -850,7 +847,7 @@ static void puppycam_view_panning(void) { gPuppyCam.pan[0] = approach_f32_asymptotic(gPuppyCam.pan[0], expectedPanX, 0.02f*slideSpeed); gPuppyCam.pan[2] = approach_f32_asymptotic(gPuppyCam.pan[2], expectedPanZ, 0.02f*slideSpeed); if (gMarioState->vel[1] == 0.0f) { - panFloor = CLAMP(find_floor_height((s16)(gPuppyCam.targetObj->oPosX+expectedPanX), (s16)(gPuppyCam.targetObj->oPosY + 200), + f32 panFloor = CLAMP(find_floor_height((s16)(gPuppyCam.targetObj->oPosX+expectedPanX), (s16)(gPuppyCam.targetObj->oPosY + 200), (s16)(gPuppyCam.targetObj->oPosZ+expectedPanZ)), gPuppyCam.targetObj->oPosY - 50,gPuppyCam.targetObj->oPosY + 50); // If the floor is lower than 150 units below Mario, then ignore the Y value and tilt the camera instead. if (panFloor <= gPuppyCam.targetObj->oPosY - 150) { @@ -922,26 +919,23 @@ const struct sPuppyAngles puppyAnglesNull = { static s32 puppycam_check_volume_bounds(struct sPuppyVolume *volume, s32 index) { s32 rel[3]; s32 pos[2]; - f32 distCheck; if (sPuppyVolumeStack[index]->room != gMarioCurrentRoom && sPuppyVolumeStack[index]->room != -1) { return FALSE; } if (sPuppyVolumeStack[index]->shape == PUPPYVOLUME_SHAPE_BOX) { // Fetch the relative position. to the triggeree. - rel[0] = sPuppyVolumeStack[index]->pos[0] - gPuppyCam.targetObj->oPosX; - rel[1] = sPuppyVolumeStack[index]->pos[1] - gPuppyCam.targetObj->oPosY; - rel[2] = sPuppyVolumeStack[index]->pos[2] - gPuppyCam.targetObj->oPosZ; + vec3_diff(rel, sPuppyVolumeStack[index]->pos, &gPuppyCam.targetObj->oPosVec); // Use the dark, forbidden arts of trig to rotate the volume. pos[0] = rel[2] * sins(sPuppyVolumeStack[index]->rot) + rel[0] * coss(sPuppyVolumeStack[index]->rot); pos[1] = rel[2] * coss(sPuppyVolumeStack[index]->rot) - rel[0] * sins(sPuppyVolumeStack[index]->rot); - #ifdef VISUAL_DEBUG +#ifdef VISUAL_DEBUG Vec3f debugPos[2]; vec3f_set(debugPos[0], sPuppyVolumeStack[index]->pos[0], sPuppyVolumeStack[index]->pos[1], sPuppyVolumeStack[index]->pos[2]); vec3f_set(debugPos[1], sPuppyVolumeStack[index]->radius[0], sPuppyVolumeStack[index]->radius[1], sPuppyVolumeStack[index]->radius[2]); debug_box_color(0x0000FF00); debug_box_rot(debugPos[0], debugPos[1], sPuppyVolumeStack[index]->rot, DEBUG_SHAPE_BOX | DEBUG_UCODE_DEFAULT); - #endif +#endif // Now compare values. if (-sPuppyVolumeStack[index]->radius[0] < pos[0] && pos[0] < sPuppyVolumeStack[index]->radius[0] && -sPuppyVolumeStack[index]->radius[1] < rel[1] && rel[1] < sPuppyVolumeStack[index]->radius[1] && @@ -951,11 +945,8 @@ static s32 puppycam_check_volume_bounds(struct sPuppyVolume *volume, s32 index) } } else if (sPuppyVolumeStack[index]->shape == PUPPYVOLUME_SHAPE_CYLINDER) { // s16 dir; - f32 dist; - rel[0] = sPuppyVolumeStack[index]->pos[0] - gPuppyCam.targetObj->oPosX; - rel[1] = sPuppyVolumeStack[index]->pos[1] - gPuppyCam.targetObj->oPosY; - rel[2] = sPuppyVolumeStack[index]->pos[2] - gPuppyCam.targetObj->oPosZ; - dist = sqrtf(sqr(rel[0]) + sqr(rel[2])); + vec3_diff(rel, sPuppyVolumeStack[index]->pos, &gPuppyCam.targetObj->oPosVec); + f32 dist = sqrtf(sqr(rel[0]) + sqr(rel[2])); #ifdef VISUAL_DEBUG Vec3f debugPos[2]; vec3f_set(debugPos[0], sPuppyVolumeStack[index]->pos[0], sPuppyVolumeStack[index]->pos[1], sPuppyVolumeStack[index]->pos[2]); @@ -963,7 +954,7 @@ static s32 puppycam_check_volume_bounds(struct sPuppyVolume *volume, s32 index) debug_box_color(0x0000FF00); debug_box_rot(debugPos[0], debugPos[1], sPuppyVolumeStack[index]->rot, DEBUG_SHAPE_CYLINDER | DEBUG_UCODE_DEFAULT); #endif - distCheck = (dist < sPuppyVolumeStack[index]->radius[0]); + f32 distCheck = (dist < sPuppyVolumeStack[index]->radius[0]); if (-sPuppyVolumeStack[index]->radius[1] < rel[1] && rel[1] < sPuppyVolumeStack[index]->radius[1] && distCheck) { *volume = *sPuppyVolumeStack[index]; @@ -1151,8 +1142,8 @@ static void puppycam_projection(void) { targetPos3[0] = (s16)approach_f32_asymptotic(targetPos[0], targetPos2[0], 0.5f); targetPos3[1] = (s16)approach_f32_asymptotic(targetPos[1], targetPos2[1], 0.5f); targetPos3[2] = (s16)approach_f32_asymptotic(targetPos[2], targetPos2[2], 0.5f); - gPuppyCam.targetDist[0] = approach_f32_asymptotic(gPuppyCam.targetDist[0],(ABS(LENCOS(sqrtf(((targetPos[0]-targetPos2[0])*(targetPos[0]-targetPos2[0]))+((targetPos[2]-targetPos2[2])*(targetPos[2]-targetPos2[2]))), - (s16)ABS(((gPuppyCam.yaw + 0x8000) % 0xFFFF - 0x8000) - (atan2s(targetPos[2]-targetPos2[2], targetPos[0]-targetPos2[0])) % 0xFFFF - 0x8000)+0x4000))), 0.2f); + gPuppyCam.targetDist[0] = approach_f32_asymptotic(gPuppyCam.targetDist[0],(ABS(LENCOS(sqrtf(((targetPos[0] - targetPos2[0]) * (targetPos[0] - targetPos2[0])) + ((targetPos[2] - targetPos2[2]) * (targetPos[2] - targetPos2[2]))), + (s16)ABS(((gPuppyCam.yaw + 0x8000) % 0xFFFF - 0x8000) - (atan2s(targetPos[2] - targetPos2[2], targetPos[0] - targetPos2[0])) % 0xFFFF - 0x8000) + 0x4000))), 0.2f); } else { gPuppyCam.targetDist[0] = approach_f32_asymptotic(gPuppyCam.targetDist[0], 0, 0.2f); } @@ -1229,7 +1220,7 @@ static void puppycam_script(void) { } } -//Handles collision detection using ray casting. +// Handles collision detection using ray casting. static void puppycam_collision(void) { struct WallCollisionData wall0, wall1; struct Surface *surf[2]; @@ -1243,17 +1234,13 @@ static void puppycam_collision(void) { return; } // The ray, starting from the top - target[0][0] = gPuppyCam.targetObj->oPosX; - target[0][1] = gPuppyCam.targetObj->oPosY + (gPuppyCam.povHeight) - CLAMP(gPuppyCam.targetObj->oPosY - gPuppyCam.targetFloorHeight, 0, 300); - target[0][2] = gPuppyCam.targetObj->oPosZ; + vec3_copy_y_off(target[0], &gPuppyCam.targetObj->oPosVec, (gPuppyCam.povHeight) - CLAMP(gPuppyCam.targetObj->oPosY - gPuppyCam.targetFloorHeight, 0, 300)); // The ray, starting from the bottom - target[1][0] = gPuppyCam.targetObj->oPosX; - target[1][1] = gPuppyCam.targetObj->oPosY + (gPuppyCam.povHeight * 0.4f); - target[1][2] = gPuppyCam.targetObj->oPosZ; + vec3_copy_y_off(target[1], &gPuppyCam.targetObj->oPosVec, (gPuppyCam.povHeight * 0.4f)); - camdir[0][0] = LENSIN(LENSIN(gPuppyCam.zoomTarget,pitchTotal),gPuppyCam.yaw) + gPuppyCam.shake[0]; - camdir[0][1] = LENCOS(gPuppyCam.zoomTarget,pitchTotal) + gPuppyCam.shake[1]; - camdir[0][2] = LENCOS(LENSIN(gPuppyCam.zoomTarget,pitchTotal),gPuppyCam.yaw) + gPuppyCam.shake[2]; + camdir[0][0] = LENSIN(LENSIN(gPuppyCam.zoomTarget, pitchTotal), gPuppyCam.yaw) + gPuppyCam.shake[0]; + camdir[0][1] = LENCOS(gPuppyCam.zoomTarget, pitchTotal) + gPuppyCam.shake[1]; + camdir[0][2] = LENCOS(LENSIN(gPuppyCam.zoomTarget, pitchTotal), gPuppyCam.yaw) + gPuppyCam.shake[2]; vec3_copy(camdir[1], camdir[0]); @@ -1274,9 +1261,7 @@ static void puppycam_collision(void) { if (dist[0] >= dist[1]) { vec3_copy(gPuppyCam.pos, hitpos[0]); } else { - gPuppyCam.pos[0] = hitpos[1][0]; - gPuppyCam.pos[1] = hitpos[1][1] + (gPuppyCam.povHeight * 0.6f); - gPuppyCam.pos[2] = hitpos[1][2]; + vec3_copy_y_off(gPuppyCam.pos, hitpos[1], (gPuppyCam.povHeight * 0.6f)); } } } diff --git a/src/game/puppyprint.c b/src/game/puppyprint.c index da42b513..1cc02994 100644 --- a/src/game/puppyprint.c +++ b/src/game/puppyprint.c @@ -656,7 +656,7 @@ void get_char_from_byte(u8 letter, s32 *textX, s32 *textY, s32 *spaceX, s32 *off case '?': *textX = 60; *textY = 0; *spaceX = textLen[15]; break; // Question mark case '"': *textX = 40; *textY = 12; *spaceX = textLen[42]; break; // Speech mark - case'\'': *textX = 44; *textY = 12; *spaceX = textLen[43]; break; // Apostrophe. + case'\'': *textX = 44; *textY = 12; *spaceX = textLen[43]; break; // Apostrophe case ':': *textX = 48; *textY = 12; *spaceX = textLen[44]; break; // Colon case ';': *textX = 52; *textY = 12; *spaceX = textLen[45]; break; // Semicolon case '.': *textX = 56; *textY = 12; *spaceX = textLen[46]; break; // Full stop @@ -698,7 +698,7 @@ s32 text_iterate_command(const char *str, s32 i, s32 runCMD) { a = ((str[i + 11] - '0') * 10); a += str[i + 12] - '0'; // Multiply each value afterwards by 2.575f to make 255. - print_set_envcolour(r * 2.575f, g * 2.575f, b * 2.575f, a * 2.575f); + print_set_envcolour((r * 2.575f), (g * 2.575f), (b * 2.575f), (a * 2.575f)); } else if (strncmp(str+i, "", 6) == 0) { // Same as above, except it fades between two colours. The third set of numbers is the speed it fades. s32 r, g, b, a, r2, g2, b2, a2, spd, r3, g3, b3, a3, r4, g4, b4, a4; r = ((str[i + 6] - '0') * 10); @@ -906,17 +906,15 @@ void render_multi_image(Texture *image, s32 x, s32 y, s32 width, s32 height, UNU // Find how best to seperate the horizontal. Keep going until it finds a whole value. while (TRUE) { - f32 val = (f32)width/(f32)num; + f32 val = (f32)width / (f32)num; - if ((s32)val == val && (s32) val >= 1) - { + if ((s32)val == val && (s32) val >= 1) { imW = num; break; } num /= 2; - if (num == 1) - { - print_text(32,32,"IMAGE WIDTH FAILURE"); + if (num == 1) { + print_text(32, 32, "IMAGE WIDTH FAILURE"); return; } } @@ -926,42 +924,39 @@ void render_multi_image(Texture *image, s32 x, s32 y, s32 width, s32 height, UNU num = 2; // Find the width mask while (TRUE) { - if ((s32) num == imW) + if ((s32) num == imW) { break; - + } num *= 2; maskW++; if (maskW == 9) { - print_text(32,32,"WIDTH MASK FAILURE"); + print_text(32, 32, "WIDTH MASK FAILURE"); return; } } num = 2; - //Find the height mask + // Find the height mask while (TRUE) { - if ((s32) num == imH) + if ((s32) num == imH) { break; - - num*=2; + } + num *= 2; maskH++; - if (maskH == 9) - { - print_text(32,32,"HEIGHT MASK FAILURE"); + if (maskH == 9) { + print_text(32, 32, "HEIGHT MASK FAILURE"); return; } } num = height; - //Find the height remainder + // Find the height remainder peakH = height - (height % imH); - cycles = (width*peakH)/(imW*imH); + cycles = (width * peakH) / (imW * imH); - //Pass 1 - for (i = 0; i < cycles; i++) - { + // Pass 1 + for (i = 0; i < cycles; i++) { posW = 0; posH = (i*imH); - while (posH >= peakH) - { + while (posH >= peakH) { posW += imW; posH -= peakH; } @@ -969,14 +964,12 @@ void render_multi_image(Texture *image, s32 x, s32 y, s32 width, s32 height, UNU gDPLoadTextureTile(gDisplayListHead++, image, G_IM_FMT_RGBA, G_IM_SIZ_16b, width, height, posW, posH, posW+imW-1, posH+imH-1, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, maskW, maskH, 0, 0); gSPScisTextureRectangle(gDisplayListHead++, (x + posW) << 2, (y + posH) << 2, (x + posW+imW-mOne) << 2,(y + posH + imH-mOne) << 2, G_TX_RENDERTILE, 0, 0, modeSC << 10, 1 << 10); } - //If there's a remainder on the vertical side, then it will cycle through that too. - if (height-peakH != 0) - { + // If there's a remainder on the vertical side, then it will cycle through that too. + if (height-peakH != 0) { posW = 0; posH = peakH; - for (i = 0; i < (width/imW); i++) - { - posW = i*imW; + for (i = 0; i < (width / imW); i++) { + posW = i * imW; gDPLoadSync(gDisplayListHead++); gDPLoadTextureTile(gDisplayListHead++, image, G_IM_FMT_RGBA, G_IM_SIZ_16b, width, height, posW, posH, posW+imW-1, height-1, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, maskW, maskH, 0, 0); gSPScisTextureRectangle(gDisplayListHead++, (x + posW) << 2, (y + posH) << 2, (x + posW+imW-mOne) << 2,(y + posH + imH-mOne) << 2, G_TX_RENDERTILE, 0, 0, modeSC << 10, 1 << 10); From 82edc20696279b3ce850718b99b86a220db0d211 Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Tue, 28 Sep 2021 17:35:12 -0700 Subject: [PATCH 36/97] Fix insn_disasm build warnings --- src/game/insn_disasm.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/game/insn_disasm.c b/src/game/insn_disasm.c index c2dfb31a..3e679397 100644 --- a/src/game/insn_disasm.c +++ b/src/game/insn_disasm.c @@ -21,15 +21,15 @@ extern far char *parse_map(u32); static char insn_as_string[100]; typedef struct __attribute__((packed)) { - u8 rd : 5; - u8 shift_amt : 5; - u8 function : 6; + u16 rd : 5; + u16 shift_amt : 5; + u16 function : 6; } RTypeData; typedef struct __attribute__((packed)) { - u8 opcode : 6; - u8 rs : 5; - u8 rt : 5; + u16 opcode : 6; + u16 rs : 5; + u16 rt : 5; union { RTypeData rdata; u16 immediate; @@ -44,8 +44,8 @@ typedef union { typedef struct __attribute__((packed)) { u32 type; u32 arbitraryParam; - u8 opcode : 6; - u8 function : 6; + u16 opcode : 6; + u16 function : 6; u8 name[10]; } InsnTemplate; From 868dd8f97b9e4f66d508aaccc021ed6db6a660db Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Tue, 28 Sep 2021 19:08:34 -0700 Subject: [PATCH 37/97] Some small fixes + cleanup --- data/behavior_data.c | 2 +- src/audio/external.c | 8 ++--- src/audio/heap.c | 2 +- src/audio/internal.h | 12 ------- src/audio/port_sh.c | 5 ++- src/engine/surface_collision.c | 4 +-- src/game/behaviors/dorrie.inc.c | 7 ++-- src/game/behaviors/fish.inc.c | 26 +++------------ src/game/behaviors/sliding_platform_2.inc.c | 4 +-- src/game/game_init.c | 5 +-- src/game/interaction.c | 4 +-- src/game/level_update.c | 35 ++++++++++---------- src/game/mario.c | 6 ++-- src/game/mario_actions_airborne.c | 7 ++-- src/game/mario_actions_cutscene.c | 4 +-- src/game/mario_actions_submerged.c | 6 ++-- src/game/obj_behaviors_2.c | 5 +-- src/game/save_file.c | 36 +++++++++------------ src/goddard/draw_objects.c | 3 -- src/goddard/joints.c | 1 - src/goddard/particles.c | 1 - src/goddard/renderer.c | 5 --- 22 files changed, 64 insertions(+), 124 deletions(-) diff --git a/data/behavior_data.c b/data/behavior_data.c index ebbe6f66..fc7fc59e 100644 --- a/data/behavior_data.c +++ b/data/behavior_data.c @@ -3198,7 +3198,7 @@ const BehaviorScript bhvSmallWhomp[] = { BEGIN(OBJ_LIST_SURFACE), SET_INT(oNumLootCoins, 5), // Whomp - common: - OR_INT(oFlags, (OBJ_FLAG_COMPUTE_ANGLE_TO_MARIO | 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_COMPUTE_DIST_TO_MARIO | OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_UCODE_LARGE)), LOAD_ANIMATIONS(oAnimations, whomp_seg6_anims_06020A04), LOAD_COLLISION_DATA(whomp_seg6_collision_06020A0C), ANIMATE(0), diff --git a/src/audio/external.c b/src/audio/external.c index 7fd7f231..efd5b9bb 100644 --- a/src/audio/external.c +++ b/src/audio/external.c @@ -228,8 +228,8 @@ struct MusicDynamic sMusicDynamics[8] = { { 0x0e43, 127, 200, 0x0000, 0, 200 }, // SEQ_LEVEL_WATER { 0x02ff, 127, 100, 0x0100, 0, 100 }, // SEQ_LEVEL_UNDERGROUND { 0x03f7, 127, 100, 0x0008, 0, 100 }, // SEQ_LEVEL_UNDERGROUND - { 0x0070, 127, 10, 0x0000, 0, 100 }, // SEQ_LEVEL_SPOOKY - { 0x0000, 127, 100, 0x0070, 0, 10 }, // SEQ_LEVEL_SPOOKY + { 0x0070, 127, 10, 0x0000, 0, 100 }, // SEQ_LEVEL_SPOOKY + { 0x0000, 127, 100, 0x0070, 0, 10 }, // SEQ_LEVEL_SPOOKY { 0xffff, 127, 100, 0x0000, 0, 100 }, // any (unused) }; @@ -256,11 +256,7 @@ u16 sLevelAcousticReaches[LEVEL_COUNT] = { #define AUDIO_MAX_DISTANCE US_FLOAT(22000.0) -#ifdef VERSION_JP -#define LOW_VOLUME_REVERB 48.0 -#else #define LOW_VOLUME_REVERB 40.0f -#endif #ifdef VERSION_JP #define VOLUME_RANGE_UNK1 0.8f diff --git a/src/audio/heap.c b/src/audio/heap.c index 33c848e5..9562bf26 100644 --- a/src/audio/heap.c +++ b/src/audio/heap.c @@ -1742,7 +1742,7 @@ void func_sh_802f23ec(void) { s32 drumId; struct Drum *drum; struct Instrument *inst; - struct UnkEntry *entry; //! @bug: not initialized but nevertheless used + struct UnkEntry *entry = NULL; //! @bug: not initialized but nevertheless used seqCount = gAlCtlHeader->seqCount; for (idx = 0; idx < seqCount; idx++) { diff --git a/src/audio/internal.h b/src/audio/internal.h index fb38a43e..3bc42e0f 100644 --- a/src/audio/internal.h +++ b/src/audio/internal.h @@ -46,27 +46,15 @@ #define CODEC_S8 1 #define CODEC_SKIP 2 -#ifdef VERSION_JP -#define TEMPO_SCALE 1 -#else #define TEMPO_SCALE TATUMS_PER_BEAT -#endif // TODO: US_FLOAT should probably be renamed to JP_DOUBLE since eu seems to use floats too -#ifdef VERSION_JP -#define US_FLOAT(x) x -#else #define US_FLOAT(x) x ## f -#endif // Convert u8 or u16 to f32. On JP, this uses a u32->f32 conversion, // resulting in more bloated codegen, while on US it goes through s32. // Since u8 and u16 fit losslessly in both, behavior is the same. -#ifdef VERSION_JP -#define FLOAT_CAST(x) (f32) (x) -#else #define FLOAT_CAST(x) (f32) (s32) (x) -#endif #if defined(ISVPRINT) || defined(UNF) #define stubbed_printf osSyncPrintf diff --git a/src/audio/port_sh.c b/src/audio/port_sh.c index 899cbb38..31e9d936 100644 --- a/src/audio/port_sh.c +++ b/src/audio/port_sh.c @@ -398,9 +398,8 @@ void func_802ad7ec(u32 arg0) { } break; case 5: - //! @bug u8 s8 comparison (but harmless) - if (chan->reverbVol != cmd->u2.as_s8) { - chan->reverbVol = cmd->u2.as_s8; + if (chan->reverbVol != cmd->u2.as_u8) { + chan->reverbVol = cmd->u2.as_u8; } break; case 6: diff --git a/src/engine/surface_collision.c b/src/engine/surface_collision.c index 2ba89e53..11b474db 100644 --- a/src/engine/surface_collision.c +++ b/src/engine/surface_collision.c @@ -561,7 +561,7 @@ f32 find_floor(f32 xPos, f32 yPos, f32 zPos, struct Surface **pfloor) { struct Surface *floor, *dynamicFloor; struct SurfaceNode *surfaceList; - f32 height = FLOOR_LOWER_LIMIT; + f32 height = FLOOR_LOWER_LIMIT; f32 dynamicHeight = FLOOR_LOWER_LIMIT; //! (Parallel Universes) Because position is casted to an s16, reaching higher @@ -575,7 +575,7 @@ f32 find_floor(f32 xPos, f32 yPos, f32 zPos, struct Surface **pfloor) { if (is_outside_level_bounds(x, z)) { #if PUPPYPRINT_DEBUG - collisionTime[perfIteration] += osGetTime()-first; + collisionTime[perfIteration] += osGetTime() - first; #endif return height; } diff --git a/src/game/behaviors/dorrie.inc.c b/src/game/behaviors/dorrie.inc.c index adc6b669..ab0e4206 100644 --- a/src/game/behaviors/dorrie.inc.c +++ b/src/game/behaviors/dorrie.inc.c @@ -104,15 +104,14 @@ void bhv_dorrie_update(void) { if (!(o->activeFlags & ACTIVE_FLAG_IN_DIFFERENT_ROOM)) { o->oDorrieForwardDistToMario = o->oDistanceToMario * coss(o->oAngleToMario - o->oMoveAngleYaw); - obj_perform_position_op(0); + obj_perform_position_op(POS_OP_SAVE_POSITION); cur_obj_move_using_fvel_and_gravity(); o->oDorrieAngleToHome = cur_obj_angle_to_home(); o->oDorrieDistToHome = cur_obj_lateral_dist_to_home(); // Shift dorrie's bounds to account for her neck - boundsShift = - 440.0f * coss(o->oDorrieNeckAngle) * coss(o->oMoveAngleYaw - o->oDorrieAngleToHome); + boundsShift = 440.0f * coss(o->oDorrieNeckAngle) * coss(o->oMoveAngleYaw - o->oDorrieAngleToHome); if (clamp_f32(&o->oDorrieDistToHome, 1650.0f + boundsShift, 2300.0f + boundsShift)) { o->oPosX = o->oHomeX - o->oDorrieDistToHome * sins(o->oDorrieAngleToHome); @@ -154,6 +153,6 @@ void bhv_dorrie_update(void) { break; } - obj_perform_position_op(1); + obj_perform_position_op(POS_OP_COMPUTE_VELOCITY); } } diff --git a/src/game/behaviors/fish.inc.c b/src/game/behaviors/fish.inc.c index bad68ecf..f72291d7 100644 --- a/src/game/behaviors/fish.inc.c +++ b/src/game/behaviors/fish.inc.c @@ -16,29 +16,13 @@ static void fish_spawner_act_spawn(void) { struct Object *fishObject; switch (o->oBehParams2ndByte) { - - // Cases need to be on one line to match with and without optimizations. - case FISH_SPAWNER_BP_MANY_BLUE: - model = MODEL_FISH; schoolQuantity = 20; minDistToMario = 1500.0f; fishAnimation = blue_fish_seg3_anims_0301C2B0; - break; - - case FISH_SPAWNER_BP_FEW_BLUE: - model = MODEL_FISH; schoolQuantity = 5; minDistToMario = 1500.0f; fishAnimation = blue_fish_seg3_anims_0301C2B0; - break; - - case FISH_SPAWNER_BP_MANY_CYAN: - model = MODEL_CYAN_FISH; schoolQuantity = 20; minDistToMario = 1500.0f; fishAnimation = cyan_fish_seg6_anims_0600E264; - break; - - case FISH_SPAWNER_BP_FEW_CYAN: - model = MODEL_CYAN_FISH; schoolQuantity = 5; minDistToMario = 1500.0f; fishAnimation = cyan_fish_seg6_anims_0600E264; - break; - - default: - return; + case FISH_SPAWNER_BP_MANY_BLUE: model = MODEL_FISH; schoolQuantity = 20; minDistToMario = 1500.0f; fishAnimation = blue_fish_seg3_anims_0301C2B0; break; + case FISH_SPAWNER_BP_FEW_BLUE: model = MODEL_FISH; schoolQuantity = 5; minDistToMario = 1500.0f; fishAnimation = blue_fish_seg3_anims_0301C2B0; break; + case FISH_SPAWNER_BP_MANY_CYAN: model = MODEL_CYAN_FISH; schoolQuantity = 20; minDistToMario = 1500.0f; fishAnimation = cyan_fish_seg6_anims_0600E264; break; + case FISH_SPAWNER_BP_FEW_CYAN: model = MODEL_CYAN_FISH; schoolQuantity = 5; minDistToMario = 1500.0f; fishAnimation = cyan_fish_seg6_anims_0600E264; break; + default: return; } - // Spawn and animate the schoolQuantity of fish if Mario enters render distance // or the stage is Secret Aquarium. // Fish moves randomly within a range of 700.0f. diff --git a/src/game/behaviors/sliding_platform_2.inc.c b/src/game/behaviors/sliding_platform_2.inc.c index 55946e7d..ede3ea31 100644 --- a/src/game/behaviors/sliding_platform_2.inc.c +++ b/src/game/behaviors/sliding_platform_2.inc.c @@ -42,7 +42,7 @@ void bhv_sliding_plat_2_loop(void) { } } - obj_perform_position_op(0); + obj_perform_position_op(POS_OP_SAVE_POSITION); if (o->oBackAndForthPlatformDirection != 0.0f) { o->oPosY = o->oHomeY + o->oBackAndForthPlatformDistance * o->oBackAndForthPlatformDirection; @@ -50,5 +50,5 @@ void bhv_sliding_plat_2_loop(void) { obj_set_dist_from_home(o->oBackAndForthPlatformDistance); } - obj_perform_position_op(1); + obj_perform_position_op(POS_OP_COMPUTE_VELOCITY); } diff --git a/src/game/game_init.c b/src/game/game_init.c index 689aace3..344c2e74 100644 --- a/src/game/game_init.c +++ b/src/game/game_init.c @@ -347,8 +347,9 @@ void draw_reset_bars(void) { fbPtr += gNmiResetBarsTimer++ * (SCREEN_WIDTH / 4); for (width = 0; width < ((SCREEN_HEIGHT / 16) + 1); width++) { - // Loop must be one line to match on -O2 - for (height = 0; height < (SCREEN_WIDTH / 4); height++) *fbPtr++ = 0; + for (height = 0; height < (SCREEN_WIDTH / 4); height++) { + *fbPtr++ = 0; + } fbPtr += ((SCREEN_WIDTH / 4) * 14); } } diff --git a/src/game/interaction.c b/src/game/interaction.c index 902ef299..78f9c941 100644 --- a/src/game/interaction.c +++ b/src/game/interaction.c @@ -1445,9 +1445,7 @@ u32 interact_koopa_shell(struct MarioState *m, UNUSED u32 interactType, struct O play_shell_music(); mario_drop_held_object(m); - //! Puts Mario in ground action even when in air, making it easy to - // escape air actions into crouch slide (shell cancel) - return set_mario_action(m, ACT_RIDING_SHELL_GROUND, 0); + return set_mario_action(m, ((m->pos[0] > m->floorHeight) ? ACT_RIDING_SHELL_FALL : ACT_RIDING_SHELL_GROUND), 0); } push_mario_out_of_object(m, obj, 2.0f); diff --git a/src/game/level_update.c b/src/game/level_update.c index 3036436c..07a81885 100644 --- a/src/game/level_update.c +++ b/src/game/level_update.c @@ -715,11 +715,12 @@ s16 level_trigger_warp(struct MarioState *m, s32 warpOp) { switch (warpOp) { case WARP_OP_DEMO_NEXT: - case WARP_OP_DEMO_END: sDelayedWarpTimer = 20; // Must be one line to match on -O2 + case WARP_OP_DEMO_END: + sDelayedWarpTimer = 20; sSourceWarpNodeId = WARP_NODE_F0; gSavedCourseNum = COURSE_NONE; fadeMusic = FALSE; - play_transition(WARP_TRANSITION_FADE_INTO_STAR, 0x14, 0x00, 0x00, 0x00); + play_transition(WARP_TRANSITION_FADE_INTO_STAR, sDelayedWarpTimer, 0x00, 0x00, 0x00); break; case WARP_OP_CREDITS_END: @@ -727,14 +728,14 @@ s16 level_trigger_warp(struct MarioState *m, s32 warpOp) { sSourceWarpNodeId = WARP_NODE_F0; fadeMusic = FALSE; gSavedCourseNum = COURSE_NONE; - play_transition(WARP_TRANSITION_FADE_INTO_COLOR, 0x3C, 0x00, 0x00, 0x00); + play_transition(WARP_TRANSITION_FADE_INTO_COLOR, sDelayedWarpTimer, 0x00, 0x00, 0x00); break; case WARP_OP_STAR_EXIT: sDelayedWarpTimer = 32; sSourceWarpNodeId = WARP_NODE_F0; gSavedCourseNum = COURSE_NONE; - play_transition(WARP_TRANSITION_FADE_INTO_MARIO, 0x20, 0x00, 0x00, 0x00); + play_transition(WARP_TRANSITION_FADE_INTO_MARIO, sDelayedWarpTimer, 0x00, 0x00, 0x00); break; case WARP_OP_DEATH: @@ -745,7 +746,7 @@ s16 level_trigger_warp(struct MarioState *m, s32 warpOp) { #endif sDelayedWarpTimer = 48; sSourceWarpNodeId = WARP_NODE_DEATH; - play_transition(WARP_TRANSITION_FADE_INTO_BOWSER, 0x30, 0x00, 0x00, 0x00); + play_transition(WARP_TRANSITION_FADE_INTO_BOWSER, sDelayedWarpTimer, 0x00, 0x00, 0x00); play_sound(SOUND_MENU_BOWSER_LAUGH, gGlobalSoundSource); break; @@ -764,13 +765,13 @@ s16 level_trigger_warp(struct MarioState *m, s32 warpOp) { } sDelayedWarpTimer = 20; - play_transition(WARP_TRANSITION_FADE_INTO_CIRCLE, 0x14, 0x00, 0x00, 0x00); + play_transition(WARP_TRANSITION_FADE_INTO_CIRCLE, sDelayedWarpTimer, 0x00, 0x00, 0x00); break; case WARP_OP_LOOK_UP: // enter totwc sDelayedWarpTimer = 30; sSourceWarpNodeId = WARP_NODE_LOOK_UP; - play_transition(WARP_TRANSITION_FADE_INTO_COLOR, 0x1E, 0xFF, 0xFF, 0xFF); + play_transition(WARP_TRANSITION_FADE_INTO_COLOR, sDelayedWarpTimer, 0xFF, 0xFF, 0xFF); #ifndef VERSION_JP play_sound(SOUND_MENU_STAR_SOUND, gGlobalSoundSource); #endif @@ -779,14 +780,14 @@ s16 level_trigger_warp(struct MarioState *m, s32 warpOp) { case WARP_OP_SPIN_SHRINK: // bbh enter sDelayedWarpTimer = 30; sSourceWarpNodeId = (m->usedObj->oBehParams & 0x00FF0000) >> 16; - play_transition(WARP_TRANSITION_FADE_INTO_COLOR, 0x1E, 0xFF, 0xFF, 0xFF); + play_transition(WARP_TRANSITION_FADE_INTO_COLOR, sDelayedWarpTimer, 0xFF, 0xFF, 0xFF); break; case WARP_OP_TELEPORT: sDelayedWarpTimer = 20; sSourceWarpNodeId = (m->usedObj->oBehParams & 0x00FF0000) >> 16; fadeMusic = !music_unchanged_through_warp(sSourceWarpNodeId); - play_transition(WARP_TRANSITION_FADE_INTO_COLOR, 0x14, 0xFF, 0xFF, 0xFF); + play_transition(WARP_TRANSITION_FADE_INTO_COLOR, sDelayedWarpTimer, 0xFF, 0xFF, 0xFF); break; case WARP_OP_WARP_DOOR: @@ -794,28 +795,28 @@ s16 level_trigger_warp(struct MarioState *m, s32 warpOp) { sDelayedWarpArg = m->actionArg; sSourceWarpNodeId = (m->usedObj->oBehParams & 0x00FF0000) >> 16; fadeMusic = !music_unchanged_through_warp(sSourceWarpNodeId); - play_transition(WARP_TRANSITION_FADE_INTO_CIRCLE, 0x14, 0x00, 0x00, 0x00); + play_transition(WARP_TRANSITION_FADE_INTO_CIRCLE, sDelayedWarpTimer, 0x00, 0x00, 0x00); break; case WARP_OP_WARP_OBJECT: sDelayedWarpTimer = 20; sSourceWarpNodeId = (m->usedObj->oBehParams & 0x00FF0000) >> 16; fadeMusic = !music_unchanged_through_warp(sSourceWarpNodeId); - play_transition(WARP_TRANSITION_FADE_INTO_STAR, 0x14, 0x00, 0x00, 0x00); + play_transition(WARP_TRANSITION_FADE_INTO_STAR, sDelayedWarpTimer, 0x00, 0x00, 0x00); break; case WARP_OP_CREDITS_START: sDelayedWarpTimer = 30; - play_transition(WARP_TRANSITION_FADE_INTO_COLOR, 0x1E, 0x00, 0x00, 0x00); + play_transition(WARP_TRANSITION_FADE_INTO_COLOR, sDelayedWarpTimer, 0x00, 0x00, 0x00); break; case WARP_OP_CREDITS_NEXT: if (gCurrCreditsEntry == &sCreditsSequence[0]) { sDelayedWarpTimer = 60; - play_transition(WARP_TRANSITION_FADE_INTO_COLOR, 0x3C, 0x00, 0x00, 0x00); + play_transition(WARP_TRANSITION_FADE_INTO_COLOR, sDelayedWarpTimer, 0x00, 0x00, 0x00); } else { sDelayedWarpTimer = 20; - play_transition(WARP_TRANSITION_FADE_INTO_COLOR, 0x14, 0x00, 0x00, 0x00); + play_transition(WARP_TRANSITION_FADE_INTO_COLOR, sDelayedWarpTimer, 0x00, 0x00, 0x00); } fadeMusic = FALSE; break; @@ -856,8 +857,7 @@ void initiate_delayed_warp(void) { case WARP_OP_CREDITS_END: warp_special(WARP_SPECIAL_ENDING); - sound_banks_enable(SEQ_PLAYER_SFX, - SOUND_BANKS_ALL & ~SOUND_BANKS_DISABLED_AFTER_CREDITS); + sound_banks_enable(SEQ_PLAYER_SFX, SOUND_BANKS_ALL & ~SOUND_BANKS_DISABLED_AFTER_CREDITS); break; case WARP_OP_DEMO_NEXT: @@ -881,8 +881,7 @@ void initiate_delayed_warp(void) { destWarpNode = WARP_NODE_CREDITS_NEXT; } - initiate_warp(gCurrCreditsEntry->levelNum, gCurrCreditsEntry->areaIndex, - destWarpNode, 0); + initiate_warp(gCurrCreditsEntry->levelNum, gCurrCreditsEntry->areaIndex, destWarpNode, WARP_FLAGS_NONE); break; default: diff --git a/src/game/mario.c b/src/game/mario.c index 11be2998..2afe2f0a 100644 --- a/src/game/mario.c +++ b/src/game/mario.c @@ -692,10 +692,8 @@ void update_mario_sound_and_camera(struct MarioState *m) { raise_background_noise(2); } - if (!(action & (ACT_FLAG_SWIMMING | ACT_FLAG_METAL_WATER))) { - if (camPreset == CAMERA_MODE_BEHIND_MARIO || camPreset == CAMERA_MODE_WATER_SURFACE) { - set_camera_mode(m->area->camera, m->area->camera->defMode, 1); - } + if (!(action & (ACT_FLAG_SWIMMING | ACT_FLAG_METAL_WATER)) && (camPreset == CAMERA_MODE_BEHIND_MARIO || camPreset == CAMERA_MODE_WATER_SURFACE)) { + set_camera_mode(m->area->camera, m->area->camera->defMode, 1); } } diff --git a/src/game/mario_actions_airborne.c b/src/game/mario_actions_airborne.c index 9f79162e..2ee09de5 100644 --- a/src/game/mario_actions_airborne.c +++ b/src/game/mario_actions_airborne.c @@ -617,10 +617,9 @@ s32 act_side_flip(struct MarioState *m) { m->marioObj->header.gfx.angle[1] += 0x8000; } - // This must be one line to match on -O2 - // clang-format off - if (m->marioObj->header.gfx.animInfo.animFrame == 6) play_sound(SOUND_ACTION_SIDE_FLIP_UNK, m->marioObj->header.gfx.cameraToObject); - // clang-format on + if (m->marioObj->header.gfx.animInfo.animFrame == 6) { + play_sound(SOUND_ACTION_SIDE_FLIP_UNK, m->marioObj->header.gfx.cameraToObject); + } return FALSE; } diff --git a/src/game/mario_actions_cutscene.c b/src/game/mario_actions_cutscene.c index 2ddb17cb..8a5ff6c5 100644 --- a/src/game/mario_actions_cutscene.c +++ b/src/game/mario_actions_cutscene.c @@ -1525,9 +1525,7 @@ s32 act_squished(struct MarioState *m) { play_sound_if_no_flag(m, SOUND_MARIO_ATTACKED, MARIO_MARIO_SOUND_PLAYED); } - // Both of the 1.8's are really floats, but one of them has to - // be written as a double for this to match on -O2. - vec3f_set(m->marioObj->header.gfx.scale, 1.8, 0.05f, 1.8f); + vec3f_set(m->marioObj->header.gfx.scale, 1.8f, 0.05f, 1.8f); #if ENABLE_RUMBLE queue_rumble_data(10, 80); #endif diff --git a/src/game/mario_actions_submerged.c b/src/game/mario_actions_submerged.c index 85bfadc1..583de0b3 100644 --- a/src/game/mario_actions_submerged.c +++ b/src/game/mario_actions_submerged.c @@ -482,9 +482,9 @@ static void common_swimming_step(struct MarioState *m, s16 swimStrength) { static void play_swimming_noise(struct MarioState *m) { s16 animFrame = m->marioObj->header.gfx.animInfo.animFrame; - - // This must be one line to match on -O2 - if (animFrame == 0 || animFrame == 12) play_sound(SOUND_ACTION_UNKNOWN434, m->marioObj->header.gfx.cameraToObject); + if (animFrame == 0 || animFrame == 12) { + play_sound(SOUND_ACTION_UNKNOWN434, m->marioObj->header.gfx.cameraToObject); + } } static s32 check_water_jump(struct MarioState *m) { diff --git a/src/game/obj_behaviors_2.c b/src/game/obj_behaviors_2.c index 2be8540f..dd1d1a7b 100644 --- a/src/game/obj_behaviors_2.c +++ b/src/game/obj_behaviors_2.c @@ -89,8 +89,7 @@ static s16 obj_get_pitch_from_vel(void) { * move again. */ static s32 obj_update_race_proposition_dialog(s16 dialogID) { - s32 dialogResponse = - cur_obj_update_dialog_with_cutscene(MARIO_DIALOG_LOOK_UP, + s32 dialogResponse = cur_obj_update_dialog_with_cutscene(MARIO_DIALOG_LOOK_UP, (DIALOG_FLAG_TURN_TO_MARIO | DIALOG_FLAG_TIME_STOP_ENABLED), CUTSCENE_RACE_DIALOG, dialogID); if (dialogResponse == DIALOG_RESPONSE_NO) { @@ -110,8 +109,6 @@ static s32 obj_is_near_to_and_facing_mario(f32 maxDist, s16 maxAngleDiff) { return (o->oDistanceToMario < maxDist && abs_angle_diff(o->oMoveAngleYaw, o->oAngleToMario) < maxAngleDiff); } -//! Although having no return value, this function -//! must be u32 to match other functions on -O2. static void obj_perform_position_op(s32 op) { switch (op) { case POS_OP_SAVE_POSITION: vec3_copy(sObjSavedPos, &o->oPosVec); break; diff --git a/src/game/save_file.c b/src/game/save_file.c index d1647256..b36b48f2 100644 --- a/src/game/save_file.c +++ b/src/game/save_file.c @@ -33,7 +33,7 @@ s8 gSaveFileModified; u8 gLastCompletedCourseNum = COURSE_NONE; u8 gLastCompletedStarNum = 0; -s8 sUnusedGotGlobalCoinHiScore = 0; +s8 sUnusedGotGlobalCoinHiScore = FALSE; u8 gGotFileCoinHiScore = FALSE; u8 gCurrCourseStarFlags = 0; @@ -457,17 +457,17 @@ void save_file_collect_star_or_key(s16 coinScore, s16 starIndex) { s32 starFlag = 1 << starIndex; #endif - gLastCompletedCourseNum = courseIndex + 1; - gLastCompletedStarNum = starIndex + 1; - sUnusedGotGlobalCoinHiScore = 0; - gGotFileCoinHiScore = FALSE; + gLastCompletedCourseNum = courseIndex + 1; + gLastCompletedStarNum = starIndex + 1; + sUnusedGotGlobalCoinHiScore = FALSE; + gGotFileCoinHiScore = FALSE; if (courseIndex >= 0 && courseIndex < COURSE_STAGES_COUNT) { //! Compares the coin score as a 16 bit value, but only writes the 8 bit // truncation. This can allow a high score to decrease. if (coinScore > ((u16) save_file_get_max_coin_score(courseIndex) & 0xFFFF)) { - sUnusedGotGlobalCoinHiScore = 1; + sUnusedGotGlobalCoinHiScore = TRUE; } if (coinScore > save_file_get_course_coin_score(fileIndex, courseIndex)) { @@ -475,7 +475,7 @@ void save_file_collect_star_or_key(s16 coinScore, s16 starIndex) { touch_coin_score_age(fileIndex, courseIndex); gGotFileCoinHiScore = TRUE; - gSaveFileModified = TRUE; + gSaveFileModified = TRUE; } } @@ -521,7 +521,7 @@ s32 save_file_exists(s32 fileIndex) { u32 save_file_get_max_coin_score(s32 courseIndex) { s32 fileIndex; s32 maxCoinScore = -1; - s32 maxScoreAge = -1; + s32 maxScoreAge = -1; s32 maxScoreFileNum = 0; for (fileIndex = 0; fileIndex < NUM_SAVE_FILES; fileIndex++) { @@ -683,15 +683,9 @@ u16 save_file_get_sound_mode(void) { void save_file_move_cap_to_default_location(void) { if (save_file_get_flags() & SAVE_FLAG_CAP_ON_GROUND) { switch (gSaveBuffer.files[gCurrSaveFileNum - 1][0].capLevel) { - case LEVEL_SSL: - save_file_set_flags(SAVE_FLAG_CAP_ON_KLEPTO); - break; - case LEVEL_SL: - save_file_set_flags(SAVE_FLAG_CAP_ON_MR_BLIZZARD); - break; - case LEVEL_TTM: - save_file_set_flags(SAVE_FLAG_CAP_ON_UKIKI); - break; + case LEVEL_SSL: save_file_set_flags(SAVE_FLAG_CAP_ON_KLEPTO ); break; + case LEVEL_SL: save_file_set_flags(SAVE_FLAG_CAP_ON_MR_BLIZZARD); break; + case LEVEL_TTM: save_file_set_flags(SAVE_FLAG_CAP_ON_UKIKI ); break; } save_file_clear_flags(SAVE_FLAG_CAP_ON_GROUND); } @@ -721,11 +715,11 @@ void disable_warp_checkpoint(void) { void check_if_should_set_warp_checkpoint(struct WarpNode *warpNode) { if (warpNode->destLevel & 0x80) { // Overwrite the warp checkpoint variables. - gWarpCheckpoint.actNum = gCurrActNum; + gWarpCheckpoint.actNum = gCurrActNum; gWarpCheckpoint.courseNum = gCurrCourseNum; - gWarpCheckpoint.levelID = warpNode->destLevel & 0x7F; - gWarpCheckpoint.areaNum = warpNode->destArea; - gWarpCheckpoint.warpNode = warpNode->destNode; + gWarpCheckpoint.levelID = warpNode->destLevel & 0x7F; + gWarpCheckpoint.areaNum = warpNode->destArea; + gWarpCheckpoint.warpNode = warpNode->destNode; } } diff --git a/src/goddard/draw_objects.c b/src/goddard/draw_objects.c index 95c19812..f9137093 100644 --- a/src/goddard/draw_objects.c +++ b/src/goddard/draw_objects.c @@ -506,7 +506,6 @@ void draw_camera(struct ObjCamera *cam) { sp44.x += cam->lookAt.x; sp44.y += cam->lookAt.y; sp44.z += cam->lookAt.z; - ; // needed to match } else { sp44.x = cam->lookAt.x; sp44.y = cam->lookAt.y; @@ -692,7 +691,6 @@ void draw_particle(struct GdObj *obj) { sLightColours.r = (white->r - black->r) * brightness + black->r; sLightColours.g = (white->g - black->g) * brightness + black->g; sLightColours.b = (white->b - black->b) * brightness + black->b; - ; // needed to match } else { sLightColours.r = 0.0f; sLightColours.g = 0.0f; @@ -765,7 +763,6 @@ void draw_plane(struct GdObj *obj) { if (obj->drawFlags & OBJ_HIGHLIGHTED) { obj->drawFlags &= ~OBJ_HIGHLIGHTED; - ; // needed to match; presumably setting up the color to draw the plane with } else { sUseSelectedColor = FALSE; } diff --git a/src/goddard/joints.c b/src/goddard/joints.c index df0950b6..e6d4d793 100644 --- a/src/goddard/joints.c +++ b/src/goddard/joints.c @@ -61,7 +61,6 @@ void grabbable_joint_update_func(struct ObjJoint *self) { self->velocity.z = offset.z * -0.25f; self->flags |= 0x2000; - ; // needed to match } else { if (gGdCtrl.trgR == FALSE) // R trigger is released { diff --git a/src/goddard/particles.c b/src/goddard/particles.c index d9daac30..9d7d22b7 100644 --- a/src/goddard/particles.c +++ b/src/goddard/particles.c @@ -339,7 +339,6 @@ void move_particle(struct ObjParticle *ptc) { if (sp4C->unk18C->pickedObj != NULL) { set_cur_dynobj(sp4C->unk18C->pickedObj); ptc->flags |= 0x20; - ; // needed to match } else { ptc->flags &= ~0x10; ptc->flags &= ~0x20; diff --git a/src/goddard/renderer.c b/src/goddard/renderer.c index e89ebddb..0de64537 100644 --- a/src/goddard/renderer.c +++ b/src/goddard/renderer.c @@ -2,10 +2,6 @@ #include #include -#if defined(VERSION_JP) || defined(VERSION_US) -#include "prevent_bss_reordering.h" -#endif - #include "debug_utils.h" #include "draw_objects.h" #include "dynlist_proc.h" @@ -858,7 +854,6 @@ void gd_printf(const char *format, ...) { csr++; *csr = '\0'; break; - break; // needed to match case 'f': val.f = (f32) va_arg(args, double); csr = sprint_val_withspecifiers(csr, val, spec); From 705d44e034df232b7516fdc70029788bafc9a358 Mon Sep 17 00:00:00 2001 From: gheskett Date: Wed, 29 Sep 2021 00:00:00 -0400 Subject: [PATCH 38/97] Fix WDW cannon bob-omb placement --- levels/wdw/areas/1/macro.inc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/levels/wdw/areas/1/macro.inc.c b/levels/wdw/areas/1/macro.inc.c index c27d5c7c..74d7d8fe 100644 --- a/levels/wdw/areas/1/macro.inc.c +++ b/levels/wdw/areas/1/macro.inc.c @@ -1,7 +1,7 @@ // 0x070160D8 - 0x0701633C const MacroObject wdw_seg7_area_1_macro_objs[] = { MACRO_OBJECT_WITH_BEH_PARAM(/*preset*/ macro_wooden_signpost, /*yaw*/ 0, /*pos*/ -2077, 2816, -660, /*behParam*/ DIALOG_081), - MACRO_OBJECT(/*preset*/ macro_bobomb_buddy_opens_cannon, /*yaw*/ 0, /*pos*/ -2, 2944, 3583), + MACRO_OBJECT(/*preset*/ macro_bobomb_buddy_opens_cannon, /*yaw*/ 0, /*pos*/ -2, 3200, 3583), MACRO_OBJECT(/*preset*/ macro_coin_ring_horizontal, /*yaw*/ 0, /*pos*/ -2057, 2800, -500), MACRO_OBJECT(/*preset*/ macro_coin_line_horizontal, /*yaw*/ 90, /*pos*/ 1500, 1741, 2191), MACRO_OBJECT(/*preset*/ macro_blue_coin_switch, /*yaw*/ 0, /*pos*/ 500, 384, 250), From 28e8d99707fc56edb21caf58c351e31db9125b93 Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Tue, 28 Sep 2021 21:13:26 -0700 Subject: [PATCH 39/97] Some optimizations + cleanup --- src/engine/graph_node.c | 5 - src/engine/graph_node.h | 5 - src/engine/math_util.c | 156 ++++---- src/engine/math_util.h | 18 +- src/engine/surface_collision.c | 335 ++++++------------ src/game/behaviors/bbh_tilting_trap.inc.c | 2 +- src/game/behaviors/boo.inc.c | 11 + src/game/behaviors/chain_chomp.inc.c | 5 +- .../behaviors/checkerboard_platform.inc.c | 12 +- src/game/behaviors/coffin.inc.c | 2 +- src/game/behaviors/jrb_ship.inc.c | 9 +- src/game/behaviors/klepto.inc.c | 8 +- src/game/behaviors/mr_blizzard.inc.c | 2 +- src/game/behaviors/seesaw_platform.inc.c | 2 +- src/game/behaviors/sl_snowman_wind.inc.c | 4 +- src/game/mario_actions_automatic.c | 2 +- src/game/mario_actions_moving.c | 2 +- src/game/obj_behaviors_2.c | 5 +- src/game/object_helpers.c | 328 ++++------------- src/game/object_helpers.h | 4 - src/game/puppycam2.c | 5 +- src/game/sound_init.c | 36 +- 22 files changed, 339 insertions(+), 619 deletions(-) diff --git a/src/engine/graph_node.c b/src/engine/graph_node.c index a2b2f5d1..3f968659 100644 --- a/src/engine/graph_node.c +++ b/src/engine/graph_node.c @@ -13,11 +13,6 @@ s16 identityMtx[4][4] = { { 1, 0, 0, 0 }, { 0, 1, 0, 0 }, { 0, 0, 1, 0 }, { 0, 0, 0, 1 } }; s16 zeroMtx[4][4] = { { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } }; -Vec3f gVec3fZero = { 0.0f, 0.0f, 0.0f }; -Vec3s gVec3sZero = { 0, 0, 0 }; -Vec3f gVec3fOne = { 1.0f, 1.0f, 1.0f }; -UNUSED Vec3s gVec3sOne = { 1, 1, 1 }; - /** * Initialize a geo node with a given type. Sets all links such that there * are no siblings, parent or children for this node. diff --git a/src/engine/graph_node.h b/src/engine/graph_node.h index 5d8f4c5c..f497efb8 100644 --- a/src/engine/graph_node.h +++ b/src/engine/graph_node.h @@ -376,11 +376,6 @@ extern struct GraphNode *gCurGraphNodeList[]; extern s16 gCurGraphNodeIndex; -extern Vec3f gVec3fZero; -extern Vec3s gVec3sZero; -extern Vec3f gVec3fOne; -extern Vec3s gVec3sOne; - void init_scene_graph_node_links(struct GraphNode *graphNode, s32 type); struct GraphNodeRoot *init_graph_node_root(struct AllocOnlyPool *pool, struct GraphNodeRoot *graphNode, diff --git a/src/engine/math_util.c b/src/engine/math_util.c index d83439c7..4f4efad7 100644 --- a/src/engine/math_util.c +++ b/src/engine/math_util.c @@ -12,8 +12,40 @@ #include "config.h" -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wreturn-local-addr" +Vec3f gVec3fX = { 1.0f, 0.0f, 0.0f }; +Vec3f gVec3fY = { 0.0f, 1.0f, 0.0f }; +Vec3f gVec3fZ = { 0.0f, 0.0f, 1.0f }; +Vec3f gVec3fNX = { -1.0f, 0.0f, 0.0f }; +Vec3f gVec3fNY = { 0.0f, -1.0f, 0.0f }; +Vec3f gVec3fNZ = { 0.0f, 0.0f, -1.0f }; +Vec3f gVec3fZero = { 0.0f, 0.0f, 0.0f }; +Vec3f gVec3fOne = { 1.0f, 1.0f, 1.0f }; +Vec3s gVec3sZero = { 0, 0, 0 }; +Vec3i gVec3iZero = { 0, 0, 0 }; +Vec3s gVec3sOne = { 1, 1, 1 }; + +/// From Wiseguy +static inline s32 roundf(f32 in) { + f32 tmp; + s32 out; + __asm__("round.w.s %0,%1" : "=f" (tmp) : "f" (in)); + __asm__("mfc1 %0,%1" : "=r" (out) : "f" (tmp)); + return out; +} + +// static inline float absf(float in) { +// f32 out; +// __asm__("abs.s %0,%1" : "=f" (out) : "f" (in)); +// return out; +// } + +f32 absf(f32 x) { + if (x >= 0) { + return x; + } else { + return -x; + } +} /// Returns the lowest of three values. s32 min_3i(s32 a0, s32 a1, s32 a2) { if (a1 < a0) a0 = a1; if (a2 < a0) a0 = a2; return a0; } @@ -112,7 +144,7 @@ void vec3f_cross(Vec3f dest, Vec3f a, Vec3f b) { /// Scale vector 'dest' so it has length 1 void vec3f_normalize(Vec3f dest) { f32 mag = sqrtf(sqr(dest[0]) + sqr(dest[1]) + sqr(dest[2])); - if (mag > __FLT_EPSILON__) { + if (mag > NEAR_ZERO) { register f32 invsqrt = 1.0f / mag; vec3_mul_val(dest, invsqrt); } else { @@ -125,7 +157,7 @@ void vec3f_normalize(Vec3f dest) { /// Scale vector 'dest' so it has length -1 void vec3f_normalize_negative(Vec3f dest) { f32 mag = sqrtf(sqr(dest[0]) + sqr(dest[1]) + sqr(dest[2])); - if (mag > __FLT_EPSILON__) { + if (mag > NEAR_ZERO) { register f32 invsqrt = -1.0f / mag; vec3_mul_val(dest, invsqrt); } else { @@ -135,7 +167,6 @@ void vec3f_normalize_negative(Vec3f dest) { } } -#pragma GCC diagnostic pop struct CopyMe { f32 x; f32 y; f32 z; f32 w; f32 x1; f32 y1; f32 z1; f32 w1; @@ -173,33 +204,31 @@ void mtxf_translate(Mat4 dest, Vec3f b) { void mtxf_rot_trans_mul(Vec3s rot, Vec3f trans, Mat4 dest, Mat4 src) { register f32 sx = sins(rot[0]); register f32 cx = coss(rot[0]); - register f32 sy = sins(rot[1]); register f32 cy = coss(rot[1]); - register f32 sz = sins(rot[2]); register f32 cz = coss(rot[2]); register Vec3f entry; - entry[0] = cy * cz; - entry[1] = cy * sz; + entry[0] = (cy * cz); + entry[1] = (cy * sz); entry[2] = -sy; dest[0][0] = entry[0] * src[0][0] + entry[1] * src[1][0] + entry[2] * src[2][0]; dest[0][1] = entry[0] * src[0][1] + entry[1] * src[1][1] + entry[2] * src[2][1]; dest[0][2] = entry[0] * src[0][2] + entry[1] * src[1][2] + entry[2] * src[2][2]; - entry[1] = sx * sy; + entry[1] = (sx * sy); entry[0] = (entry[1] * cz) - (cx * sz); entry[1] = (entry[1] * sz) + (cx * cz); - entry[2] = sx * cy; + entry[2] = (sx * cy); dest[1][0] = entry[0] * src[0][0] + entry[1] * src[1][0] + entry[2] * src[2][0]; dest[1][1] = entry[0] * src[0][1] + entry[1] * src[1][1] + entry[2] * src[2][1]; dest[1][2] = entry[0] * src[0][2] + entry[1] * src[1][2] + entry[2] * src[2][2]; - entry[1] = cx * sy; + entry[1] = (cx * sy); entry[0] = (entry[1] * cz) + (sx * sz); entry[1] = (entry[1] * sz) - (sx * cz); - entry[2] = cx * cy; + entry[2] = (cx * cy); dest[2][0] = entry[0] * src[0][0] + entry[1] * src[1][0] + entry[2] * src[2][0]; dest[2][1] = entry[0] * src[0][1] + entry[1] * src[1][1] + entry[2] * src[2][1]; dest[2][2] = entry[0] * src[0][2] + entry[1] * src[1][2] + entry[2] * src[2][2]; @@ -223,7 +252,7 @@ void mtxf_lookat(Mat4 mtx, Vec3f from, Vec3f to, s32 roll) { register f32 dx = (to[0] - from[0]); register f32 dz = (to[2] - from[2]); register f32 invLength = sqrtf(sqr(dx) + sqr(dz)); - invLength = -(1.0f / MAX(invLength, __FLT_EPSILON__)); + invLength = -(1.0f / MAX(invLength, NEAR_ZERO)); dx *= invLength; dz *= invLength; f32 sr = sins(roll); @@ -256,30 +285,26 @@ void mtxf_lookat(Mat4 mtx, Vec3f from, Vec3f to, s32 roll) { * axis, and then translates. */ void mtxf_rotate_zxy_and_translate(Mat4 dest, Vec3f translate, Vec3s rotate) { - register f32 sx = sins(rotate[0]); - register f32 cx = coss(rotate[0]); - - register f32 sy = sins(rotate[1]); - register f32 cy = coss(rotate[1]); - - register f32 sz = sins(rotate[2]); - register f32 cz = coss(rotate[2]); - - dest[0][0] = cy * cz + sx * sy * sz; - dest[1][0] = -cy * sz + sx * sy * cz; - dest[2][0] = cx * sy; - dest[3][0] = translate[0]; - - dest[0][1] = cx * sz; - dest[1][1] = cx * cz; + register f32 sx = sins(rotate[0]); + register f32 cx = coss(rotate[0]); + register f32 sy = sins(rotate[1]); + register f32 cy = coss(rotate[1]); + register f32 sz = sins(rotate[2]); + register f32 cz = coss(rotate[2]); + register f32 cycz = (cy * cz); + register f32 cysz = (cy * sz); + register f32 sycz = (sy * cz); + register f32 sysz = (sy * sz); + dest[0][0] = ((sx * sysz) + cycz); + dest[1][0] = ((sx * sycz) - cysz); + dest[2][0] = (cx * sy); + dest[0][1] = (cx * sz); + dest[1][1] = (cx * cz); dest[2][1] = -sx; - dest[3][1] = translate[1]; - - dest[0][2] = -sy * cz + sx * cy * sz; - dest[1][2] = sy * sz + sx * cy * cz; + dest[0][2] = ((sx * cysz) - sycz); + dest[1][2] = ((sx * cycz) + sysz); dest[2][2] = cx * cy; - dest[3][2] = translate[2]; - + vec3_copy(dest[3], translate); dest[0][3] = dest[1][3] = dest[2][3] = 0.; ((u32 *) dest)[15] = 0x3F800000; } @@ -289,33 +314,29 @@ void mtxf_rotate_zxy_and_translate(Mat4 dest, Vec3f translate, Vec3s rotate) { * axis, and then translates. */ void mtxf_rotate_xyz_and_translate(Mat4 dest, Vec3f b, Vec3s c) { - register f32 sx = sins(c[0]); - register f32 cx = coss(c[0]); - - register f32 sy = sins(c[1]); - register f32 cy = coss(c[1]); - - register f32 sz = sins(c[2]); - register f32 cz = coss(c[2]); - - dest[0][0] = cy * cz; - dest[0][1] = cy * sz; + register f32 sx = sins(c[0]); + register f32 cx = coss(c[0]); + register f32 sy = sins(c[1]); + register f32 cy = coss(c[1]); + register f32 sz = sins(c[2]); + register f32 cz = coss(c[2]); + register f32 cxsz = (cx * sz); + register f32 cxcz = (cx * cz); + register f32 sxsz = (sx * sz); + register f32 sxcz = (sx * cz); + dest[0][0] = (cy * cz); + dest[0][1] = (cy * sz); dest[0][2] = -sy; + dest[1][0] = ((sxcz * sy) - cxsz); + dest[1][1] = ((sxsz * sy) + cxcz); + dest[1][2] = (sx * cy); + dest[2][0] = ((cxcz * sy) + sxsz); + dest[2][1] = ((cxsz * sy) - sxcz); + dest[2][2] = (cx * cy); dest[0][3] = 0; - - dest[1][0] = sx * sy * cz - cx * sz; - dest[1][1] = sx * sy * sz + cx * cz; - dest[1][2] = sx * cy; dest[1][3] = 0; - - dest[2][0] = cx * sy * cz + sx * sz; - dest[2][1] = cx * sy * sz - sx * cz; - dest[2][2] = cx * cy; dest[2][3] = 0; - - dest[3][0] = b[0]; - dest[3][1] = b[1]; - dest[3][2] = b[2]; + vec3_copy(dest[3], b); ((u32 *) dest)[15] = 0x3F800000; } @@ -333,10 +354,17 @@ void mtxf_billboard(Mat4 dest, Mat4 mtx, Vec3f position, s32 angle) { *temp = 0; temp++; } - dest[0][0] = coss(angle); - dest[0][1] = sins(angle); - dest[1][0] = -dest[0][1]; - dest[1][1] = dest[0][0]; + if (angle == 0x0) { + dest[0][0] = 1; + dest[0][1] = 0; + dest[1][0] = 0; + dest[1][1] = 1; + } else { + dest[0][0] = coss(angle); + dest[0][1] = sins(angle); + dest[1][0] = -dest[0][1]; + dest[1][1] = dest[0][0]; + } ((u32 *) dest)[10] = 0x3F800000; dest[2][3] = 0; ((u32 *) dest)[15] = 0x3F800000; @@ -344,7 +372,7 @@ void mtxf_billboard(Mat4 dest, Mat4 mtx, Vec3f position, s32 angle) { temp = (f32 *)dest; temp2 = (f32 *)mtx; for (i = 0; i < 3; i++) { - temp[12] = temp2[0] * position[0] + temp2[4] * position[1] + temp2[8] * position[2] + temp2[12]; + temp[12] = (temp2[0] * position[0]) + (temp2[4] * position[1]) + (temp2[8] * position[2]) + temp2[12]; temp++; temp2++; } diff --git a/src/engine/math_util.h b/src/engine/math_util.h index c09b957a..24bf7753 100644 --- a/src/engine/math_util.h +++ b/src/engine/math_util.h @@ -5,9 +5,20 @@ #include "types.h" -#define NEAR_ZERO 0.00001f -#define NEARER_ZERO 0.000001f -#define NEAR_ONE 0.99999f +#define NEAR_ZERO __FLT_EPSILON__ +#define NEAR_ONE (1.0f - __FLT_EPSILON__) + +extern Vec3f gVec3fX; +extern Vec3f gVec3fY; +extern Vec3f gVec3fZ; +extern Vec3f gVec3fNX; +extern Vec3f gVec3fNY; +extern Vec3f gVec3fNZ; +extern Vec3f gVec3fZero; +extern Vec3s gVec3sZero; +extern Vec3i gVec3iZero; +extern Vec3f gVec3fOne; +extern Vec3s gVec3sOne; /** * Converts an angle in degrees to sm64's s16 angle units. For example, DEGREES(90) == 0x4000 @@ -433,6 +444,7 @@ extern f32 gSineTable[]; } \ } +f32 absf(f32 x); s32 min_3i(s32 a0, s32 a1, s32 a2); f32 min_3f(f32 a0, f32 a1, f32 a2); s32 max_3i(s32 a0, s32 a1, s32 a2); diff --git a/src/engine/surface_collision.c b/src/engine/surface_collision.c index 11b474db..42cb4b41 100644 --- a/src/engine/surface_collision.c +++ b/src/engine/surface_collision.c @@ -5,7 +5,6 @@ #include "game/level_update.h" #include "game/mario.h" #include "game/object_list_processor.h" -// #include "game/rendering_graph_node.h" #include "math_util.h" #include "surface_collision.h" #include "surface_load.h" @@ -46,14 +45,6 @@ static s32 find_wall_collisions_from_list(struct SurfaceNode *surfaceNode, struc register f32 margin_radius = (radius - 1.0f); register TerrainData type = SURFACE_DEFAULT; s32 numCols = 0; -// #if EXTENDED_BOUNDS_MODE -// const float down_scale = (1.0f / gWorldScale); -// radius *= down_scale; -// x *= down_scale; -// y *= down_scale; -// z *= down_scale; -// margin_radius *= down_scale; -// #endif // Max collision radius = 200 if (radius > 200.0f) { radius = 200.0f; @@ -67,34 +58,22 @@ static s32 find_wall_collisions_from_list(struct SurfaceNode *surfaceNode, struc if ((type == SURFACE_NEW_WATER) || (type == SURFACE_NEW_WATER_BOTTOM)) continue; // Determine if checking for the camera or not. if (gCheckingSurfaceCollisionsForCamera) { - if (surf->flags & SURFACE_FLAG_NO_CAM_COLLISION) { - continue; - } + if (surf->flags & SURFACE_FLAG_NO_CAM_COLLISION) continue; } else { // Ignore camera only surfaces. - if (type == SURFACE_CAMERA_BOUNDARY) { - continue; - } + if (type == SURFACE_CAMERA_BOUNDARY) continue; // If an object can pass through a vanish cap wall, pass through. if (type == SURFACE_VANISH_CAP_WALLS && gCurrentObject != NULL) { // If an object can pass through a vanish cap wall, pass through. - if (gCurrentObject->activeFlags & ACTIVE_FLAG_MOVE_THROUGH_GRATE) { - continue; - } + if (gCurrentObject->activeFlags & ACTIVE_FLAG_MOVE_THROUGH_GRATE) continue; // If Mario has a vanish cap, pass through the vanish cap wall. - if (gCurrentObject == gMarioObject && (gMarioState->flags & MARIO_VANISH_CAP)) { - continue; - } + if (gCurrentObject == gMarioObject && (gMarioState->flags & MARIO_VANISH_CAP)) continue; } } - if (pos[1] < surf->lowerY || pos[1] > surf->upperY) { - continue; - } + if (pos[1] < surf->lowerY || pos[1] > surf->upperY) continue; // Dot of normal and pos, + origin offset offset = (surf->normal.x * pos[0]) + (surf->normal.y * pos[1]) + (surf->normal.z * pos[2]) + surf->originOffset; - if (offset < -radius || offset > radius) { - continue; - } + if (offset < -radius || offset > radius) continue; vec3_diff(v0, surf->vertex2, surf->vertex1); vec3_diff(v1, surf->vertex3, surf->vertex1); vec3_diff(v2, pos, surf->vertex1); @@ -106,13 +85,9 @@ static s32 find_wall_collisions_from_list(struct SurfaceNode *surfaceNode, struc d21 = vec3_dot(v2, v1); invDenom = 1.0f / ((d00 * d11) - (d01 * d01)); v = ((d11 * d20) - (d01 * d21)) * invDenom; - if (v < 0.0f || v > 1.0f) { - goto edge_1_2; - } - w = (d00 * d21 - d01 * d20) * invDenom; - if (w < 0.0f || w > 1.0f || v + w > 1.0f) { - goto edge_1_2; - } + if (v < 0.0f || v > 1.0f) goto edge_1_2; + w = ((d00 * d21) - (d01 * d20)) * invDenom; + if (w < 0.0f || w > 1.0f || v + w > 1.0f) goto edge_1_2; pos[0] += surf->normal.x * (radius - offset); pos[2] += surf->normal.z * (radius - offset); goto hasCollision; @@ -130,9 +105,7 @@ static s32 find_wall_collisions_from_list(struct SurfaceNode *surfaceNode, struc pos[0] += (d00 *= invDenom); pos[2] += (d01 *= invDenom); margin_radius += 0.01f; - if ((d00 * surf->normal.x) + (d01 * surf->normal.z) < (corner_threshold * offset)) { - continue; - } + if ((d00 * surf->normal.x) + (d01 * surf->normal.z) < (corner_threshold * offset)) continue; hasCollision: // (Unreferenced Walls) Since this only returns the first MAX_REFEREMCED_WALLS walls, // this can lead to wall interaction being missed. Typically unreferenced walls @@ -142,11 +115,6 @@ static s32 find_wall_collisions_from_list(struct SurfaceNode *surfaceNode, struc } numCols++; } -// #if EXTENDED_BOUNDS_MODE -// x *= gWorldScale; -// y *= gWorldScale; -// z *= gWorldScale; -// #endif data->x = pos[0]; data->z = pos[2]; return numCols; @@ -157,23 +125,17 @@ static s32 find_wall_collisions_from_list(struct SurfaceNode *surfaceNode, struc */ s32 f32_find_wall_collision(f32 *xPtr, f32 *yPtr, f32 *zPtr, f32 offsetY, f32 radius) { struct WallCollisionData collision; - s32 numCollisions = 0; - - collision.offsetY = offsetY; - collision.radius = radius; - - collision.x = *xPtr; - collision.y = *yPtr; - collision.z = *zPtr; - + s32 numCollisions = 0; + collision.offsetY = offsetY; + collision.radius = radius; + collision.x = *xPtr; + collision.y = *yPtr; + collision.z = *zPtr; collision.numWalls = 0; - - numCollisions = find_wall_collisions(&collision); - - *xPtr = collision.x; - *yPtr = collision.y; - *zPtr = collision.z; - + numCollisions = find_wall_collisions(&collision); + *xPtr = collision.x; + *yPtr = collision.y; + *zPtr = collision.z; return numCollisions; } @@ -186,9 +148,9 @@ s32 find_wall_collisions(struct WallCollisionData *colData) { s32 numCollisions = 0; s32 x = colData->x; s32 z = colData->z; - #if PUPPYPRINT_DEBUG +#if PUPPYPRINT_DEBUG OSTime first = osGetTime(); - #endif +#endif colData->numWalls = 0; @@ -212,9 +174,9 @@ s32 find_wall_collisions(struct WallCollisionData *colData) { // Increment the debug tracker. gNumCalls.wall++; - #if PUPPYPRINT_DEBUG - collisionTime[perfIteration] += osGetTime()-first; - #endif +#if PUPPYPRINT_DEBUG + collisionTime[perfIteration] += osGetTime() - first; +#endif return numCollisions; } @@ -229,7 +191,7 @@ void resolve_and_return_wall_collisions(Vec3f pos, f32 offset, f32 radius, struc collisionData->radius = radius; collisionData->offsetY = offset; - find_wall_collisions(collisionData); + find_wall_collisions(collisionData); pos[0] = collisionData->x; pos[1] = collisionData->y; @@ -241,12 +203,12 @@ void resolve_and_return_wall_collisions(Vec3f pos, f32 offset, f32 radius, struc **************************************************/ void add_ceil_margin(s32 *x, s32 *z, Vec3s target1, Vec3s target2, f32 margin) { - register f32 diff_x, diff_z, invDenom; - diff_x = target1[0] - *x + target2[0] - *x; - diff_z = target1[2] - *z + target2[2] - *z; - invDenom = margin / sqrtf(sqr(diff_x) + sqr(diff_z)); - *x += diff_x * invDenom; - *z += diff_z * invDenom; + register f32 diff_x, diff_z, invDenom; + diff_x = target1[0] - *x + target2[0] - *x; + diff_z = target1[2] - *z + target2[2] - *z; + invDenom = margin / sqrtf(sqr(diff_x) + sqr(diff_z)); + *x += diff_x * invDenom; + *z += diff_z * invDenom; } /** @@ -263,64 +225,38 @@ static struct Surface *find_ceil_from_list(struct SurfaceNode *surfaceNode, s32 while (surfaceNode != NULL) { surf = surfaceNode->surface; surfaceNode = surfaceNode->next; - if (y > surf->upperY) { - continue; - } + if (y > surf->upperY) continue; vx[0] = surf->vertex1[0]; vz[0] = surf->vertex1[2]; - if (surf->type != SURFACE_HANGABLE) { - add_ceil_margin(&vx[0], &vz[0], surf->vertex2, surf->vertex3, margin); - } + if (surf->type != SURFACE_HANGABLE) add_ceil_margin(&vx[0], &vz[0], surf->vertex2, surf->vertex3, margin); vx[1] = surf->vertex2[0]; vz[1] = surf->vertex2[2]; - if (surf->type != SURFACE_HANGABLE) { - add_ceil_margin(&vx[1], &vz[1], surf->vertex3, surf->vertex1, margin); - } + if (surf->type != SURFACE_HANGABLE) add_ceil_margin(&vx[1], &vz[1], surf->vertex3, surf->vertex1, margin); // Checking if point is in bounds of the triangle laterally. - if ((vz[0] - z) * (vx[1] - vx[0]) - (vx[0] - x) * (vz[1] - vz[0]) > 0) { - continue; - } + if ((vz[0] - z) * (vx[1] - vx[0]) - (vx[0] - x) * (vz[1] - vz[0]) > 0) continue; // Slight optimization by checking these later. vx[2] = surf->vertex3[0]; vz[2] = surf->vertex3[2]; - if (surf->type != SURFACE_HANGABLE) { - add_ceil_margin(&vx[2], &vz[2], surf->vertex1, surf->vertex2, margin); - } - if ((vz[1] - z) * (vx[2] - vx[1]) - (vx[1] - x) * (vz[2] - vz[1]) > 0) { - continue; - } - if ((vz[2] - z) * (vx[0] - vx[2]) - (vx[2] - x) * (vz[0] - vz[2]) > 0) { - continue; - } + if (surf->type != SURFACE_HANGABLE) add_ceil_margin(&vx[2], &vz[2], surf->vertex1, surf->vertex2, margin); + if ((vz[1] - z) * (vx[2] - vx[1]) - (vx[1] - x) * (vz[2] - vz[1]) > 0) continue; + if ((vz[2] - z) * (vx[0] - vx[2]) - (vx[2] - x) * (vz[0] - vz[2]) > 0) continue; // Determine if checking for the camera or not. - if (surf->type == SURFACE_NEW_WATER || surf->type == SURFACE_NEW_WATER_BOTTOM) { - continue; - } + if (surf->type == SURFACE_NEW_WATER || surf->type == SURFACE_NEW_WATER_BOTTOM) continue; if (gCheckingSurfaceCollisionsForCamera) { - if (surf->flags & SURFACE_FLAG_NO_CAM_COLLISION) { - continue; - } + if (surf->flags & SURFACE_FLAG_NO_CAM_COLLISION) continue; } else if (surf->type == SURFACE_CAMERA_BOUNDARY) { // Ignore camera only surfaces. continue; } // Find the ceil height at the specific point. height = get_surface_height_at_location(x, z, surf); - if (height > *pheight) { - continue; - } + if (height > *pheight) continue; // Checks for ceiling interaction - if (y > height) { - continue; - } - if (y >= surf->upperY) { - continue; - } + if (y > height) continue; + if (y >= surf->upperY) continue; *pheight = height; ceil = surf; - if (height == y) { - break; - } + if (height == y) break; } return ceil; } @@ -335,10 +271,9 @@ f32 find_ceil(f32 posX, f32 posY, f32 posZ, struct Surface **pceil) { f32 height = CELL_HEIGHT_LIMIT; f32 dynamicHeight = CELL_HEIGHT_LIMIT; s32 x, y, z; - #if PUPPYPRINT_DEBUG +#if PUPPYPRINT_DEBUG OSTime first = osGetTime(); - #endif - +#endif x = posX; y = posY; z = posZ; @@ -370,9 +305,9 @@ f32 find_ceil(f32 posX, f32 posY, f32 posZ, struct Surface **pceil) { // Increment the debug tracker. gNumCalls.ceil++; - #if PUPPYPRINT_DEBUG - collisionTime[perfIteration] += osGetTime()-first; - #endif +#if PUPPYPRINT_DEBUG + collisionTime[perfIteration] += osGetTime() - first; +#endif return height; } @@ -403,49 +338,33 @@ static struct Surface *find_floor_from_list(struct SurfaceNode *surfaceNode, s32 while (surfaceNode != NULL) { surf = surfaceNode->surface; surfaceNode = surfaceNode->next; - if (y < surf->lowerY - 30) { - continue; - } + if (y < (surf->lowerY - 30)) continue; vx[0] = surf->vertex1[0]; vz[0] = surf->vertex1[2]; vx[1] = surf->vertex2[0]; vz[1] = surf->vertex2[2]; // Check that the point is within the triangle bounds. - if ((vz[0] - z) * (vx[1] - vx[0]) - (vx[0] - x) * (vz[1] - vz[0]) < 0) { - continue; - } + if ((vz[0] - z) * (vx[1] - vx[0]) - (vx[0] - x) * (vz[1] - vz[0]) < 0) continue; // To slightly save on computation time, set this later. vx[2] = surf->vertex3[0]; vz[2] = surf->vertex3[2]; - if ((vz[1] - z) * (vx[2] - vx[1]) - (vx[1] - x) * (vz[2] - vz[1]) < 0) { - continue; - } - if ((vz[2] - z) * (vx[0] - vx[2]) - (vx[2] - x) * (vz[0] - vz[2]) < 0) { - continue; - } + if ((vz[1] - z) * (vx[2] - vx[1]) - (vx[1] - x) * (vz[2] - vz[1]) < 0) continue; + if ((vz[2] - z) * (vx[0] - vx[2]) - (vx[2] - x) * (vz[0] - vz[2]) < 0) continue; // Determine if we are checking for the camera or not. if (gCheckingSurfaceCollisionsForCamera != 0) { - if (surf->flags & SURFACE_FLAG_NO_CAM_COLLISION || surf->type == SURFACE_NEW_WATER || surf->type == SURFACE_NEW_WATER_BOTTOM) { - continue; - } + if (surf->flags & SURFACE_FLAG_NO_CAM_COLLISION || surf->type == SURFACE_NEW_WATER || surf->type == SURFACE_NEW_WATER_BOTTOM) continue; } else if (surf->type == SURFACE_CAMERA_BOUNDARY) { // If we are not checking for the camera, ignore camera only floors. continue; } // Find the height of the floor at a given location. height = get_surface_height_at_location(x, z, surf); - if (height < *pheight) { - continue; - } + if (height < *pheight) continue; // Checks for floor interaction with a 78 unit buffer. - if (y < (height - 78.0f)) { - continue; - } + if (y < (height - 78.0f)) continue; *pheight = height; floor = surf; - if (height - 78.0f == y) { - break; - } + if ((height - 78.0f) == y) break; } return floor; } @@ -496,7 +415,7 @@ struct Surface *find_water_floor_from_list(struct SurfaceNode *surfaceNode, s32 surf = topSurfaceNode->surface; topSurfaceNode = topSurfaceNode->next; - if (surf->type == SURFACE_NEW_WATER_BOTTOM || !check_within_triangle_bounds(x, z, surf)) continue; + if ((surf->type == SURFACE_NEW_WATER_BOTTOM) || !check_within_triangle_bounds(x, z, surf)) continue; curHeight = get_surface_height_at_location(x, z, surf); @@ -517,10 +436,7 @@ struct Surface *find_water_floor_from_list(struct SurfaceNode *surfaceNode, s32 */ f32 find_floor_height(f32 x, f32 y, f32 z) { struct Surface *floor; - - f32 floorHeight = find_floor(x, y, z, &floor); - - return floorHeight; + return find_floor(x, y, z, &floor); } /** @@ -554,9 +470,9 @@ f32 unused_find_dynamic_floor(f32 xPos, f32 yPos, f32 zPos, struct Surface **pfl */ f32 find_floor(f32 xPos, f32 yPos, f32 zPos, struct Surface **pfloor) { s32 cellZ, cellX; - #if PUPPYPRINT_DEBUG +#if PUPPYPRINT_DEBUG OSTime first = osGetTime(); - #endif +#endif struct Surface *floor, *dynamicFloor; struct SurfaceNode *surfaceList; @@ -574,9 +490,9 @@ f32 find_floor(f32 xPos, f32 yPos, f32 zPos, struct Surface **pfloor) { *pfloor = NULL; if (is_outside_level_bounds(x, z)) { - #if PUPPYPRINT_DEBUG +#if PUPPYPRINT_DEBUG collisionTime[perfIteration] += osGetTime() - first; - #endif +#endif return height; } @@ -645,9 +561,7 @@ f32 find_water_floor(s32 xPos, s32 yPos, s32 zPos, struct Surface **pfloor) { s32 y = yPos; s32 z = zPos; - if (is_outside_level_bounds(x, z)) { - return height; - } + if (is_outside_level_bounds(x, z)) return height; // Each level is split into cells to limit load, find the appropriate cell. cellX = ((x + LEVEL_BOUNDARY_MAX) / CELL_SIZE) & NUM_CELLS_INDEX; @@ -681,15 +595,10 @@ s32 find_water_level_and_floor(s32 x, s32 z, struct Surface **pfloor) { s32 waterLevel = FLOOR_LOWER_LIMIT; TerrainData *p = gEnvironmentRegions; struct Surface *floor = NULL; - #if PUPPYPRINT_DEBUG +#if PUPPYPRINT_DEBUG OSTime first = osGetTime(); - #endif - - if (gCheckingSurfaceCollisionsForCamera) { - waterLevel = find_water_floor(x, gLakituState.pos[1], z, &floor); - } else { - waterLevel = find_water_floor(x, gMarioState->pos[1], z, &floor); - } +#endif + waterLevel = find_water_floor(x, (gCheckingSurfaceCollisionsForCamera ? gLakituState.pos[1] : gMarioState->pos[1]), z, &floor); if (p != NULL && waterLevel == FLOOR_LOWER_LIMIT) { numRegions = *p++; @@ -714,10 +623,9 @@ s32 find_water_level_and_floor(s32 x, s32 z, struct Surface **pfloor) { *pfloor = floor; } - #if PUPPYPRINT_DEBUG - collisionTime[perfIteration] += osGetTime()-first; - #endif - +#if PUPPYPRINT_DEBUG + collisionTime[perfIteration] += osGetTime() - first; +#endif return waterLevel; } @@ -763,9 +671,9 @@ s32 find_water_level(s32 x, s32 z) { } } - #if PUPPYPRINT_DEBUG - collisionTime[perfIteration] += osGetTime()-first; - #endif +#if PUPPYPRINT_DEBUG + collisionTime[perfIteration] += osGetTime() - first; +#endif return waterLevel; } @@ -780,9 +688,9 @@ s32 find_poison_gas_level(s32 x, s32 z) { s32 loX, hiX, loZ, hiZ; s32 gasLevel = FLOOR_LOWER_LIMIT; TerrainData *p = gEnvironmentRegions; - #if PUPPYPRINT_DEBUG +#if PUPPYPRINT_DEBUG OSTime first = osGetTime(); - #endif +#endif if (p != NULL) { numRegions = *p++; @@ -809,9 +717,9 @@ s32 find_poison_gas_level(s32 x, s32 z) { } } - #if PUPPYPRINT_DEBUG - collisionTime[perfIteration] += osGetTime()-first; - #endif +#if PUPPYPRINT_DEBUG + collisionTime[perfIteration] += osGetTime() - first; +#endif return gasLevel; } @@ -825,12 +733,10 @@ s32 find_poison_gas_level(s32 x, s32 z) { */ static s32 surface_list_length(struct SurfaceNode *list) { s32 count = 0; - while (list != NULL) { list = list->next; count++; } - return count; } @@ -946,51 +852,34 @@ s32 ray_surface_intersect(Vec3f orig, Vec3f dir, f32 dir_length, struct Surface f32 a, f, u, v; Vec3f add_dir; Vec3f norm; - - //Ignore certain surface types. - if (surface->type == SURFACE_INTANGIBLE || surface->flags & SURFACE_FLAG_NO_CAM_COLLISION) - return FALSE; - + // Ignore certain surface types. + if (surface->type == SURFACE_INTANGIBLE || surface->flags & SURFACE_FLAG_NO_CAM_COLLISION) return FALSE; // Get surface normal and some other stuff vec3_set(norm, 0, surface->normal.y, 0); vec3_mul_val(norm, RAY_OFFSET); - vec3_copy(v0, surface->vertex1); vec3_copy(v1, surface->vertex2); vec3_copy(v2, surface->vertex3); - - vec3_add(v0, norm); - vec3_add(v1, norm); - vec3_add(v2, norm); - + vec3_add( v0, norm); + vec3_add( v1, norm); + vec3_add( v2, norm); vec3_diff(e1, v1, v0); vec3_diff(e2, v2, v0); - vec3_cross(h, dir, e2); - // Check if we're perpendicular from the surface a = vec3_dot(e1, h); - if (a > -0.00001f && a < 0.00001f) { - return FALSE; - } + if ((a > -NEAR_ZERO) && (a < NEAR_ZERO)) return FALSE; // Check if we're making contact with the surface f = 1.0f / a; - vec3_diff(s, orig, v0); u = f * vec3_dot(s, h); - if (u < 0.0f || u > 1.0f) { - return FALSE; - } + if ((u < 0.0f) || (u > 1.0f)) return FALSE; vec3_cross(q, s, e1); v = f * vec3_dot(dir, q); - if (v < 0.0f || u + v > 1.0f) { - return FALSE; - } + if ((v < 0.0f) || ((u + v) > 1.0f)) return FALSE; // Get the length between our origin and the surface contact point *length = f * vec3_dot(e2, q); - if (*length <= 0.00001 || *length > dir_length) { - return FALSE; - } + if (*length <= 0.00001 || *length > dir_length) return FALSE; // Successful contact vec3f_copy(add_dir, dir); vec3_mul_val(add_dir, *length); @@ -1009,42 +898,38 @@ void find_surface_on_ray_list(struct SurfaceNode *list, Vec3f orig, Vec3f dir, f // Get upper and lower bounds of ray if (dir[1] >= 0.0f) { - top = orig[1] + dir[1] * dir_length; + top = (orig[1] + (dir[1] * dir_length)); bottom = orig[1]; } else { - top = orig[1]; - bottom = orig[1] + dir[1] * dir_length; + top = orig[1]; + bottom = (orig[1] + (dir[1] * dir_length)); } // Iterate through every surface of the list for (; list != NULL; list = list->next) { // Reject surface if out of vertical bounds - if (list->surface->lowerY > top || list->surface->upperY < bottom) { - continue; - } + if (list->surface->lowerY > top || list->surface->upperY < bottom) continue; // Check intersection between the ray and this surface - if ((hit = ray_surface_intersect(orig, dir, dir_length, list->surface, chk_hit_pos, &length)) != 0) { - if (length <= *max_length) { - *hit_surface = list->surface; - vec3f_copy(hit_pos, chk_hit_pos); - *max_length = length; - } + if ((hit = ray_surface_intersect(orig, dir, dir_length, list->surface, chk_hit_pos, &length)) && (length <= *max_length)) { + *hit_surface = list->surface; + vec3f_copy(hit_pos, chk_hit_pos); + *max_length = length; } } - #if PUPPYPRINT_DEBUG - collisionTime[perfIteration] += osGetTime()-first; - #endif +#if PUPPYPRINT_DEBUG + collisionTime[perfIteration] += (osGetTime() - first); +#endif } void find_surface_on_ray_cell(s32 cellX, s32 cellZ, Vec3f orig, Vec3f normalized_dir, f32 dir_length, struct Surface **hit_surface, Vec3f hit_pos, f32 *max_length, s32 flags) { // Skip if OOB if (cellX >= 0 && cellX <= (NUM_CELLS - 1) && cellZ >= 0 && cellZ <= (NUM_CELLS - 1)) { // Iterate through each surface in this partition - if (normalized_dir[1] > -0.99999f && flags & RAYCAST_FIND_CEIL) { + if ((normalized_dir[1] > -NEAR_ONE) && (flags & RAYCAST_FIND_CEIL)) { find_surface_on_ray_list(gStaticSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_CEILS].next, orig, normalized_dir, dir_length, hit_surface, hit_pos, max_length); find_surface_on_ray_list(gDynamicSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_CEILS].next, orig, normalized_dir, dir_length, hit_surface, hit_pos, max_length); } - if (normalized_dir[1] < 0.99999f && flags & RAYCAST_FIND_FLOOR) { + if ((normalized_dir[1] < NEAR_ONE) && (flags & RAYCAST_FIND_FLOOR)) { find_surface_on_ray_list(gStaticSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_FLOORS].next, orig, normalized_dir, dir_length, hit_surface, hit_pos, max_length); find_surface_on_ray_list(gDynamicSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_FLOORS].next, orig, normalized_dir, dir_length, hit_surface, hit_pos, max_length); } @@ -1060,12 +945,10 @@ void find_surface_on_ray_cell(s32 cellX, s32 cellZ, Vec3f orig, Vec3f normalized } void find_surface_on_ray(Vec3f orig, Vec3f dir, struct Surface **hit_surface, Vec3f hit_pos, s32 flags) { - f32 max_length; s32 cellZ, cellX, cellPrevX, cellPrevZ; f32 fCellZ, fCellX; - f32 dir_length; Vec3f normalized_dir; - f32 step, dx, dz; + f32 step; s32 i; // Set that no surface has been hit @@ -1073,8 +956,8 @@ void find_surface_on_ray(Vec3f orig, Vec3f dir, struct Surface **hit_surface, Ve vec3_sum(hit_pos, orig, dir); // Get normalized direction - dir_length = vec3_mag(dir); - max_length = dir_length; + f32 dir_length = vec3_mag(dir); + f32 max_length = dir_length; vec3f_copy(normalized_dir, dir); vec3f_normalize(normalized_dir); @@ -1093,13 +976,13 @@ void find_surface_on_ray(Vec3f orig, Vec3f dir, struct Surface **hit_surface, Ve } // Get cells we cross using DDA - if (ABS(dir[0]) >= ABS(dir[2])) + if (ABS(dir[0]) >= ABS(dir[2])) { step = RAY_STEPS * ABS(dir[0]) / CELL_SIZE; - else + } else { step = RAY_STEPS * ABS(dir[2]) / CELL_SIZE; - - dx = dir[0] / step / CELL_SIZE; - dz = dir[2] / step / CELL_SIZE; + } + f32 dx = dir[0] / step / CELL_SIZE; + f32 dz = dir[2] / step / CELL_SIZE; for (i = 0; i < step && *hit_surface == NULL; i++) { find_surface_on_ray_cell(cellX, cellZ, orig, normalized_dir, dir_length, hit_surface, hit_pos, &max_length, flags); diff --git a/src/game/behaviors/bbh_tilting_trap.inc.c b/src/game/behaviors/bbh_tilting_trap.inc.c index d2657bb4..9dc0cc01 100644 --- a/src/game/behaviors/bbh_tilting_trap.inc.c +++ b/src/game/behaviors/bbh_tilting_trap.inc.c @@ -29,7 +29,7 @@ void bhv_bbh_tilting_trap_platform_loop(void) { // the platform more dangerous. This code will not work correctly // without the oAction changes above, since oTimer will not ever // reset to 0 without them. - if ((absi(o->oFaceAnglePitch) < 3000) || (o->oTimer >= 16)) { + if ((ABSI(o->oFaceAnglePitch) < 3000) || (o->oTimer >= 16)) { // Make the platform return to the horizontal at a speed of // 200 angle units/frame, and clamp it to 0 if it's within 200 units of 0. o->oAngleVelPitch = 0; diff --git a/src/game/behaviors/boo.inc.c b/src/game/behaviors/boo.inc.c index 7ca36a0a..6509da94 100644 --- a/src/game/behaviors/boo.inc.c +++ b/src/game/behaviors/boo.inc.c @@ -854,6 +854,17 @@ void bhv_boo_in_castle_loop(void) { cur_obj_move_using_fvel_and_gravity(); } +static s8 sBbhStairJiggleOffsets[] = { -8, 8, -4, 4 }; + +s32 jiggle_bbh_stair(s32 index) { + if (index >= 4 || index < 0) { + return TRUE; + } + + o->oPosY += sBbhStairJiggleOffsets[index]; + return FALSE; +} + void bhv_boo_staircase(void) { f32 targetY = 0.0f; diff --git a/src/game/behaviors/chain_chomp.inc.c b/src/game/behaviors/chain_chomp.inc.c index a4a70ebb..609ec508 100644 --- a/src/game/behaviors/chain_chomp.inc.c +++ b/src/game/behaviors/chain_chomp.inc.c @@ -508,10 +508,9 @@ void bhv_wooden_post_update(void) { if (o->oDistanceToMario > 400.0f) { o->oTimer = o->oWoodenPostTotalMarioAngle = 0; } else { - // When mario runs around the post 3 times within 200 frames, spawn - // coins + // When mario runs around the post 3 times within 200 frames, spawn coins o->oWoodenPostTotalMarioAngle += (s16)(o->oAngleToMario - o->oWoodenPostPrevAngleToMario); - if (absi(o->oWoodenPostTotalMarioAngle) > 0x30000 && o->oTimer < 200) { + if (ABSI(o->oWoodenPostTotalMarioAngle) > 0x30000 && o->oTimer < 200) { obj_spawn_loot_yellow_coins(o, 5, 20.0f); set_object_respawn_info_bits(o, 1); } diff --git a/src/game/behaviors/checkerboard_platform.inc.c b/src/game/behaviors/checkerboard_platform.inc.c index 353fc35e..c7fd8798 100644 --- a/src/game/behaviors/checkerboard_platform.inc.c +++ b/src/game/behaviors/checkerboard_platform.inc.c @@ -38,8 +38,9 @@ void checkerboard_plat_act_move_y(UNUSED s32 unused, f32 vel, s32 time) { void checkerboard_plat_act_rotate(s32 nextAction, s16 pitch) { o->oVelY = 0.0f; o->oAngleVelPitch = pitch; - if (o->oTimer + 1 == 0x8000 / absi(pitch)) + if (o->oTimer + 1 == 0x8000 / ABSI(pitch)) { o->oAction = nextAction; + } o->oCheckerBoardPlatformRotateAction = nextAction; } @@ -72,12 +73,13 @@ void bhv_checkerboard_platform_loop(void) { checkerboard_plat_act_rotate(1, -512); break; } - o->oMoveAnglePitch += absi(o->oAngleVelPitch); - o->oFaceAnglePitch += absi(o->oAngleVelPitch); + o->oMoveAnglePitch += ABSI(o->oAngleVelPitch); + o->oFaceAnglePitch += ABSI(o->oAngleVelPitch); o->oFaceAngleYaw = o->oMoveAngleYaw; if (o->oMoveAnglePitch != 0) { - o->oForwardVel = signum_positive(o->oAngleVelPitch) * sins(o->oMoveAnglePitch) * radius; - o->oVelY = signum_positive(o->oAngleVelPitch) * coss(o->oMoveAnglePitch) * radius; + f32 mul = (o->oAngleVelPitch >= 0) ? 1.0f : -1.0f; + o->oForwardVel = mul * sins(o->oMoveAnglePitch) * radius; + o->oVelY = mul * coss(o->oMoveAnglePitch) * radius; } if (o->oCheckerBoardPlatformRotateAction == 1) { o->oAngleVelPitch = 0; diff --git a/src/game/behaviors/coffin.inc.c b/src/game/behaviors/coffin.inc.c index 081a6869..dc35492e 100644 --- a/src/game/behaviors/coffin.inc.c +++ b/src/game/behaviors/coffin.inc.c @@ -101,7 +101,7 @@ void coffin_act_idle(void) { // It also checks in the case Mario is squished, so he doesn't get permanently squished. if (o->oTimer > 60 && (o->oDistanceToMario > 100.0f || gMarioState->action == ACT_SQUISHED)) { - if (gMarioObject->oPosY - o->oPosY < 200.0f && absf(distForwards) < 140.0f) { + if (gMarioObject->oPosY - o->oPosY < 200.0f && ABSF(distForwards) < 140.0f) { if (distSideways < 150.0f && distSideways > -450.0f) { cur_obj_play_sound_2(SOUND_GENERAL_BUTTON_PRESS_2_LOWPRIO); o->oAction = COFFIN_ACT_STAND_UP; diff --git a/src/game/behaviors/jrb_ship.inc.c b/src/game/behaviors/jrb_ship.inc.c index a88606a1..ba8ce49e 100644 --- a/src/game/behaviors/jrb_ship.inc.c +++ b/src/game/behaviors/jrb_ship.inc.c @@ -65,12 +65,13 @@ void bhv_jrb_sliding_box_loop(void) { o->oJrbSlidingBoxAdditiveZ = sins(o->oJrbSlidingBoxAngle) * 20.0f; o->oJrbSlidingBoxAngle += 0x100; o->oParentRelativePosZ += o->oJrbSlidingBoxAdditiveZ; - if (gMarioObject->oPosY > 1000.0f) - if (absf(o->oJrbSlidingBoxAdditiveZ) > 3.0f) - cur_obj_play_sound_1(SOUND_AIR_ROUGH_SLIDE); + if ((gMarioObject->oPosY > 1000.0f) && (ABSF(o->oJrbSlidingBoxAdditiveZ) > 3.0f)) { + cur_obj_play_sound_1(SOUND_AIR_ROUGH_SLIDE); + } obj_set_hitbox(o, &sSkullSlidingBoxHitbox); - if (!(o->oJrbSlidingBoxAngle & 0x7FFF)) + if (!(o->oJrbSlidingBoxAngle & 0x7FFF)) { cur_obj_become_tangible(); + } if (obj_check_if_collided_with_object(o, gMarioObject)) { o->oInteractStatus = 0; cur_obj_become_intangible(); diff --git a/src/game/behaviors/klepto.inc.c b/src/game/behaviors/klepto.inc.c index a2adb846..561c4673 100644 --- a/src/game/behaviors/klepto.inc.c +++ b/src/game/behaviors/klepto.inc.c @@ -104,9 +104,9 @@ static void klepto_change_target(void) { dx = gMarioObject->oPosX - sKleptoTargetPositions[i][0]; dz = gMarioObject->oPosZ - sKleptoTargetPositions[i][2]; - targetDist = sqrtf(sqr(dx) + sqr(dz)); - if (targetDist < minTargetDist) { - minTargetDist = targetDist; + targetDist = (sqr(dx) + sqr(dz)); + if (targetDist < sqr(minTargetDist)) { + minTargetDist = sqrtf(targetDist); newTarget = i; } } @@ -114,7 +114,7 @@ static void klepto_change_target(void) { newTarget = random_u16() % 3; } - o->oKleptoHomeYOffset = 400 * absi(newTarget - o->oKleptoTargetNumber); + o->oKleptoHomeYOffset = 400 * ABSI(newTarget - o->oKleptoTargetNumber); o->oKleptoTargetNumber = newTarget; o->oHomeX = sKleptoTargetPositions[o->oKleptoTargetNumber][0]; diff --git a/src/game/behaviors/mr_blizzard.inc.c b/src/game/behaviors/mr_blizzard.inc.c index 62d3f46e..44c7cea8 100644 --- a/src/game/behaviors/mr_blizzard.inc.c +++ b/src/game/behaviors/mr_blizzard.inc.c @@ -182,7 +182,7 @@ static void mr_blizzard_act_rotate(void) { // If Dizziness is not 0 and Mr. Blizzard's FaceRollAngle has a magnitude greater than // 67.5 degrees move to death action, delete the snowball, and make Mr. Blizzard intangible. if (o->oMrBlizzardDizziness != 0.0f) { - if (absi(o->oFaceAngleRoll) > 0x3000) { + if (ABSI(o->oFaceAngleRoll) > 0x3000) { o->oAction = MR_BLIZZARD_ACT_DEATH; o->prevObj = o->oMrBlizzardHeldObj = NULL; cur_obj_become_intangible(); diff --git a/src/game/behaviors/seesaw_platform.inc.c b/src/game/behaviors/seesaw_platform.inc.c index 4822ec25..b977da37 100644 --- a/src/game/behaviors/seesaw_platform.inc.c +++ b/src/game/behaviors/seesaw_platform.inc.c @@ -31,7 +31,7 @@ void bhv_seesaw_platform_init(void) { void bhv_seesaw_platform_update(void) { o->oFaceAnglePitch += (s32) o->oSeesawPlatformPitchVel; - if (absf(o->oSeesawPlatformPitchVel) > 10.0f) { + if (ABSF(o->oSeesawPlatformPitchVel) > 10.0f) { cur_obj_play_sound_1(SOUND_ENV_BOAT_ROCKING1); } diff --git a/src/game/behaviors/sl_snowman_wind.inc.c b/src/game/behaviors/sl_snowman_wind.inc.c index a9d41b2e..d62efab0 100644 --- a/src/game/behaviors/sl_snowman_wind.inc.c +++ b/src/game/behaviors/sl_snowman_wind.inc.c @@ -20,9 +20,9 @@ void bhv_sl_snowman_wind_loop(void) { // Mario has come close, begin dialog. } else if (o->oSubAction == SL_SNOWMAN_WIND_ACT_TALKING) { - if (cur_obj_update_dialog(MARIO_DIALOG_LOOK_UP, DIALOG_FLAG_TEXT_DEFAULT, DIALOG_153, 0)) + if (cur_obj_update_dialog(MARIO_DIALOG_LOOK_UP, DIALOG_FLAG_TEXT_DEFAULT, DIALOG_153, 0)) { o->oSubAction++; - + } // Blowing, spawn wind particles (SL_SNOWMAN_WIND_ACT_BLOWING) } else if (o->oDistanceToMario < 1500.0f && absf(gMarioObject->oPosY - o->oHomeY) < 500.0f) { // Point towards Mario, but only within 0x1500 angle units of the original angle. diff --git a/src/game/mario_actions_automatic.c b/src/game/mario_actions_automatic.c index 961a12c9..3d53800a 100644 --- a/src/game/mario_actions_automatic.c +++ b/src/game/mario_actions_automatic.c @@ -343,7 +343,7 @@ s32 update_hang_moving(struct MarioState *m) { // Reduce Mario's forward speed by the turn amount, so Mario won't move off sideward from the intended angle when turning around. m->forwardVel *= ((coss(dYaw) + 1.0f) / 2.0f); // 1.0f is turning forwards, 0.0f is turning backwards // Increase turn speed if forwardVel is lower and intendedMag is higher - turnRange *= (2.0f - (ABSF(m->forwardVel) / MAX(m->intendedMag, __FLT_EPSILON__))); // 1.0f front, 2.0f back + turnRange *= (2.0f - (ABSF(m->forwardVel) / MAX(m->intendedMag, NEAR_ZERO))); // 1.0f front, 2.0f back } m->faceAngle[1] = approach_angle(m->faceAngle[1], m->intendedYaw, turnRange); #else diff --git a/src/game/mario_actions_moving.c b/src/game/mario_actions_moving.c index 600f51a4..74a03ea5 100644 --- a/src/game/mario_actions_moving.c +++ b/src/game/mario_actions_moving.c @@ -468,7 +468,7 @@ void update_walking_speed(struct MarioState *m) { // Reduce Mario's forward speed by the turn amount, so Mario won't move off sideward from the intended angle when turning around. m->forwardVel *= ((coss(dYaw) + 1.0f) / 2.0f); // 1.0f is turning forwards, 0.0f is turning backwards // Increase turn speed if forwardVel is lower and intendedMag is higher - turnRange *= (2.0f - (ABSF(m->forwardVel) / MAX(m->intendedMag, __FLT_EPSILON__))); // 1.0f front, 2.0f back + turnRange *= (2.0f - (ABSF(m->forwardVel) / MAX(m->intendedMag, NEAR_ZERO))); // 1.0f front, 2.0f back } m->faceAngle[1] = approach_angle(m->faceAngle[1], m->intendedYaw, turnRange); #elif GROUND_TURN_MODE == 2 // similar to mode 1, but a bit further from vanilla, and allows instant turnaround if Mario is moving slower than a certain threshold. diff --git a/src/game/obj_behaviors_2.c b/src/game/obj_behaviors_2.c index dd1d1a7b..2af73438 100644 --- a/src/game/obj_behaviors_2.c +++ b/src/game/obj_behaviors_2.c @@ -386,10 +386,9 @@ static s32 obj_smooth_turn(s16 *angleVel, s32 *angle, s16 targetAngle, f32 targe s16 currentSpeed; s16 currentAngle = (s16)(*angle); - *angleVel = - approach_s16_symmetric(*angleVel, (targetAngle - currentAngle) * targetSpeedProportion, accel); + *angleVel = approach_s16_symmetric(*angleVel, (targetAngle - currentAngle) * targetSpeedProportion, accel); - currentSpeed = absi(*angleVel); + currentSpeed = ABSI(*angleVel); clamp_s16(¤tSpeed, minSpeed, maxSpeed); *angle = approach_angle(*angle, targetAngle, currentSpeed); diff --git a/src/game/object_helpers.c b/src/game/object_helpers.c index d5281d52..e19e7f6c 100644 --- a/src/game/object_helpers.c +++ b/src/game/object_helpers.c @@ -28,7 +28,6 @@ #include "spawn_sound.h" #include "puppylights.h" -static s8 sBbhStairJiggleOffsets[] = { -8, 8, -4, 4 }; static s8 sLevelsWithRooms[] = { LEVEL_BBH, LEVEL_CASTLE, LEVEL_HMC, -1 }; static s32 clear_move_flag(u32 * bitSet, s32 flag); @@ -146,10 +145,10 @@ Gfx *geo_switch_anim_state(s32 callContext, struct GraphNode *node, UNUSED void return NULL; } +//! rename to geo_switch_room? Gfx *geo_switch_area(s32 callContext, struct GraphNode *node, UNUSED void *context) { s16 roomCase; struct Surface *floor; - UNUSED struct Object *obj = (struct Object *) gCurGraphNodeObject; // TODO: change global type to Object pointer struct GraphNodeSwitchCase *switchCase = (struct GraphNodeSwitchCase *) node; if (callContext == GEO_CONTEXT_RENDER) { @@ -178,31 +177,19 @@ Gfx *geo_switch_area(s32 callContext, struct GraphNode *node, UNUSED void *conte } void obj_update_pos_from_parent_transformation(Mat4 mtx, struct Object *obj) { - f32 parentRelX = obj->oParentRelativePosX; - f32 parentRelY = obj->oParentRelativePosY; - f32 parentRelZ = obj->oParentRelativePosZ; + Vec3f rel; + vec3_copy(rel, &obj->oParentRelativePosVec); - obj->oPosX = parentRelX * mtx[0][0] + parentRelY * mtx[1][0] + parentRelZ * mtx[2][0] + mtx[3][0]; - obj->oPosY = parentRelX * mtx[0][1] + parentRelY * mtx[1][1] + parentRelZ * mtx[2][1] + mtx[3][1]; - obj->oPosZ = parentRelX * mtx[0][2] + parentRelY * mtx[1][2] + parentRelZ * mtx[2][2] + mtx[3][2]; + obj->oPosX = rel[0] * mtx[0][0] + rel[1] * mtx[1][0] + rel[2] * mtx[2][0] + mtx[3][0]; + obj->oPosY = rel[0] * mtx[0][1] + rel[1] * mtx[1][1] + rel[2] * mtx[2][1] + mtx[3][1]; + obj->oPosZ = rel[0] * mtx[0][2] + rel[1] * mtx[1][2] + rel[2] * mtx[2][2] + mtx[3][2]; } void obj_apply_scale_to_matrix(struct Object *obj, Mat4 dst, Mat4 src) { - dst[0][0] = src[0][0] * obj->header.gfx.scale[0]; - dst[1][0] = src[1][0] * obj->header.gfx.scale[1]; - dst[2][0] = src[2][0] * obj->header.gfx.scale[2]; - dst[3][0] = src[3][0]; - - dst[0][1] = src[0][1] * obj->header.gfx.scale[0]; - dst[1][1] = src[1][1] * obj->header.gfx.scale[1]; - dst[2][1] = src[2][1] * obj->header.gfx.scale[2]; - dst[3][1] = src[3][1]; - - dst[0][2] = src[0][2] * obj->header.gfx.scale[0]; - dst[1][2] = src[1][2] * obj->header.gfx.scale[1]; - dst[2][2] = src[2][2] * obj->header.gfx.scale[2]; - dst[3][2] = src[3][2]; - + vec3_prod_val(dst[0], src[0], obj->header.gfx.scale[0]); + vec3_prod_val(dst[1], src[1], obj->header.gfx.scale[1]); + vec3_prod_val(dst[2], src[2], obj->header.gfx.scale[2]); + vec3_copy(dst[3], src[3]); dst[0][3] = src[0][3]; dst[1][3] = src[1][3]; dst[2][3] = src[2][3]; @@ -240,17 +227,9 @@ void obj_set_held_state(struct Object *obj, const BehaviorScript *heldBehavior) obj->parentObj = o; if (obj->oFlags & OBJ_FLAG_HOLDABLE) { - if (heldBehavior == bhvCarrySomethingHeld) { - obj->oHeldState = HELD_HELD; - } - - if (heldBehavior == bhvCarrySomethingThrown) { - obj->oHeldState = HELD_THROWN; - } - - if (heldBehavior == bhvCarrySomethingDropped) { - obj->oHeldState = HELD_DROPPED; - } + if (heldBehavior == bhvCarrySomethingHeld ) obj->oHeldState = HELD_HELD; + if (heldBehavior == bhvCarrySomethingThrown ) obj->oHeldState = HELD_THROWN; + if (heldBehavior == bhvCarrySomethingDropped) obj->oHeldState = HELD_DROPPED; } else { obj->curBhvCommand = segmented_to_virtual(heldBehavior); obj->bhvStackIndex = 0; @@ -258,18 +237,15 @@ void obj_set_held_state(struct Object *obj, const BehaviorScript *heldBehavior) } f32 lateral_dist_between_objects(struct Object *obj1, struct Object *obj2) { - f32 dx = obj1->oPosX - obj2->oPosX; - f32 dz = obj1->oPosZ - obj2->oPosZ; - - return sqrtf(sqr(dx) + sqr(dz)); + f32 lateralDist; + vec3f_get_lateral_dist(&obj1->oPosVec, &obj2->oPosVec, &lateralDist); + return lateralDist; } f32 dist_between_objects(struct Object *obj1, struct Object *obj2) { - f32 dx = obj1->oPosX - obj2->oPosX; - f32 dy = obj1->oPosY - obj2->oPosY; - f32 dz = obj1->oPosZ - obj2->oPosZ; - - return sqrtf(sqr(dx) + sqr(dy) + sqr(dz)); + f32 dist; + vec3f_get_dist(&obj1->oPosVec, &obj2->oPosVec, &dist); + return dist; } void cur_obj_forward_vel_approach_upward(f32 target, f32 increment) { @@ -546,50 +522,32 @@ void linear_mtxf_mul_vec3f(Mat4 m, Vec3f dst, Vec3f v) { void linear_mtxf_transpose_mul_vec3f(Mat4 m, Vec3f dst, Vec3f v) { s32 i; for (i = 0; i < 3; i++) { - dst[i] = m[i][0] * v[0] + m[i][1] * v[1] + m[i][2] * v[2]; + dst[i] = vec3_dot(m[i], v); } } void obj_apply_scale_to_transform(struct Object *obj) { - f32 scaleX = obj->header.gfx.scale[0]; - f32 scaleY = obj->header.gfx.scale[1]; - f32 scaleZ = obj->header.gfx.scale[2]; - - obj->transform[0][0] *= scaleX; - obj->transform[0][1] *= scaleX; - obj->transform[0][2] *= scaleX; - - obj->transform[1][0] *= scaleY; - obj->transform[1][1] *= scaleY; - obj->transform[1][2] *= scaleY; - - obj->transform[2][0] *= scaleZ; - obj->transform[2][1] *= scaleZ; - obj->transform[2][2] *= scaleZ; + Vec3f scale; + vec3_copy(scale, obj->header.gfx.scale); + vec3_mul_val(obj->transform[0], scale[0]); + vec3_mul_val(obj->transform[1], scale[1]); + vec3_mul_val(obj->transform[2], scale[2]); } void obj_copy_scale(struct Object *dst, struct Object *src) { - dst->header.gfx.scale[0] = src->header.gfx.scale[0]; - dst->header.gfx.scale[1] = src->header.gfx.scale[1]; - dst->header.gfx.scale[2] = src->header.gfx.scale[2]; + vec3_copy(dst->header.gfx.scale, src->header.gfx.scale); } void obj_scale_xyz(struct Object *obj, f32 xScale, f32 yScale, f32 zScale) { - obj->header.gfx.scale[0] = xScale; - obj->header.gfx.scale[1] = yScale; - obj->header.gfx.scale[2] = zScale; + vec3_set(obj->header.gfx.scale, xScale, yScale, zScale); } void obj_scale(struct Object *obj, f32 scale) { - obj->header.gfx.scale[0] = scale; - obj->header.gfx.scale[1] = scale; - obj->header.gfx.scale[2] = scale; + vec3_same(obj->header.gfx.scale, scale); } void cur_obj_scale(f32 scale) { - o->header.gfx.scale[0] = scale; - o->header.gfx.scale[1] = scale; - o->header.gfx.scale[2] = scale; + vec3_same(o->header.gfx.scale, scale); } void cur_obj_init_animation(s32 animIndex) { @@ -676,9 +634,7 @@ void cur_obj_unused_init_on_floor(void) { } void obj_set_face_angle_to_move_angle(struct Object *obj) { - obj->oFaceAnglePitch = obj->oMoveAnglePitch; - obj->oFaceAngleYaw = obj->oMoveAngleYaw; - obj->oFaceAngleRoll = obj->oMoveAngleRoll; + vec3_copy(&obj->oFaceAngleVec, &obj->oMoveAngleVec); } u32 get_object_list_from_behavior(const BehaviorScript *behavior) { @@ -696,23 +652,15 @@ u32 get_object_list_from_behavior(const BehaviorScript *behavior) { } struct Object *cur_obj_nearest_object_with_behavior(const BehaviorScript *behavior) { - struct Object *obj; f32 dist; - - obj = cur_obj_find_nearest_object_with_behavior(behavior, &dist); - + struct Object *obj = cur_obj_find_nearest_object_with_behavior(behavior, &dist); return obj; } f32 cur_obj_dist_to_nearest_object_with_behavior(const BehaviorScript *behavior) { - struct Object *obj; f32 dist; - - obj = cur_obj_find_nearest_object_with_behavior(behavior, &dist); - if (obj == NULL) { - dist = 15000.0f; - } - + struct Object *obj = cur_obj_find_nearest_object_with_behavior(behavior, &dist); + if (obj == NULL) dist = 15000.0f; return dist; } @@ -807,10 +755,8 @@ struct Object *cur_obj_find_nearby_held_actor(const BehaviorScript *behavior, f3 } } } - obj = (struct Object *) obj->header.next; } - return foundObj; } @@ -828,7 +774,6 @@ void cur_obj_change_action(s32 action) { void cur_obj_set_vel_from_mario_vel(f32 min, f32 mul) { f32 marioFwdVel = gMarioStates[0].forwardVel; f32 minVel = min * mul; - if (marioFwdVel < minVel) { o->oForwardVel = minVel; } else { @@ -845,7 +790,6 @@ void cur_obj_reverse_animation(void) { void cur_obj_extend_animation_if_at_end(void) { s32 animFrame = o->header.gfx.animInfo.animFrame; s32 nearLoopEnd = o->header.gfx.animInfo.curAnim->loopEnd - 2; - if (animFrame == nearLoopEnd) o->header.gfx.animInfo.animFrame--; } @@ -853,78 +797,40 @@ s32 cur_obj_check_if_near_animation_end(void) { u32 animFlags = (s32) o->header.gfx.animInfo.curAnim->flags; s32 animFrame = o->header.gfx.animInfo.animFrame; s32 nearLoopEnd = o->header.gfx.animInfo.curAnim->loopEnd - 2; - s32 isNearEnd = FALSE; - - if (animFlags & ANIM_FLAG_NOLOOP && nearLoopEnd + 1 == animFrame) { - isNearEnd = TRUE; - } - - if (animFrame == nearLoopEnd) { - isNearEnd = TRUE; - } - - return isNearEnd; + return ((animFlags & ANIM_FLAG_NOLOOP && nearLoopEnd + 1 == animFrame) || animFrame == nearLoopEnd); } s32 cur_obj_check_if_at_animation_end(void) { s32 animFrame = o->header.gfx.animInfo.animFrame; s32 lastFrame = o->header.gfx.animInfo.curAnim->loopEnd - 1; - - if (animFrame == lastFrame) { - return TRUE; - } else { - return FALSE; - } + return (animFrame == lastFrame); } s32 cur_obj_check_anim_frame(s32 frame) { s32 animFrame = o->header.gfx.animInfo.animFrame; - - if (animFrame == frame) { - return TRUE; - } else { - return FALSE; - } + return (animFrame == frame); } s32 cur_obj_check_anim_frame_in_range(s32 startFrame, s32 rangeLength) { s32 animFrame = o->header.gfx.animInfo.animFrame; - - if (animFrame >= startFrame && animFrame < startFrame + rangeLength) { - return TRUE; - } else { - return FALSE; - } + return (animFrame >= startFrame && animFrame < startFrame + rangeLength); } s32 cur_obj_check_frame_prior_current_frame(s16 *frame) { s16 animFrame = o->header.gfx.animInfo.animFrame; - while (*frame != -1) { - if (*frame == animFrame) { - return TRUE; - } - + if (*frame == animFrame) return TRUE; frame++; } - return FALSE; } s32 mario_is_in_air_action(void) { - if (gMarioStates[0].action & ACT_FLAG_AIR) { - return TRUE; - } else { - return FALSE; - } + return (gMarioStates[0].action & ACT_FLAG_AIR); } s32 mario_is_dive_sliding(void) { - if (gMarioStates[0].action == ACT_DIVE_SLIDE) { - return TRUE; - } else { - return FALSE; - } + return (gMarioStates[0].action == ACT_DIVE_SLIDE); } void cur_obj_set_y_vel_and_animation(f32 yVel, s32 animIndex) { @@ -1318,76 +1224,38 @@ void obj_set_behavior(struct Object *obj, const BehaviorScript *behavior) { } s32 cur_obj_has_behavior(const BehaviorScript *behavior) { - if (o->behavior == segmented_to_virtual(behavior)) { - return TRUE; - } else { - return FALSE; - } + return (o->behavior == segmented_to_virtual(behavior)); } s32 obj_has_behavior(struct Object *obj, const BehaviorScript *behavior) { - if (obj->behavior == segmented_to_virtual(behavior)) { - return TRUE; - } else { - return FALSE; - } + return (obj->behavior == segmented_to_virtual(behavior)); } f32 cur_obj_lateral_dist_from_mario_to_home(void) { - f32 dist; f32 dx = o->oHomeX - gMarioObject->oPosX; f32 dz = o->oHomeZ - gMarioObject->oPosZ; - - dist = sqrtf(sqr(dx) + sqr(dz)); - return dist; + return sqrtf(sqr(dx) + sqr(dz)); } f32 cur_obj_lateral_dist_to_home(void) { - f32 dist; f32 dx = o->oHomeX - o->oPosX; f32 dz = o->oHomeZ - o->oPosZ; - - dist = sqrtf(sqr(dx) + sqr(dz)); - return dist; + return sqrtf(sqr(dx) + sqr(dz)); } s32 cur_obj_outside_home_square(f32 halfLength) { - if (o->oHomeX - halfLength > o->oPosX) { - return TRUE; - } - - if (o->oHomeX + halfLength < o->oPosX) { - return TRUE; - } - - if (o->oHomeZ - halfLength > o->oPosZ) { - return TRUE; - } - - if (o->oHomeZ + halfLength < o->oPosZ) { - return TRUE; - } - + if (o->oHomeX - halfLength > o->oPosX) return TRUE; + if (o->oHomeX + halfLength < o->oPosX) return TRUE; + if (o->oHomeZ - halfLength > o->oPosZ) return TRUE; + if (o->oHomeZ + halfLength < o->oPosZ) return TRUE; return FALSE; } s32 cur_obj_outside_home_rectangle(f32 minX, f32 maxX, f32 minZ, f32 maxZ) { - if (o->oHomeX + minX > o->oPosX) { - return TRUE; - } - - if (o->oHomeX + maxX < o->oPosX) { - return TRUE; - } - - if (o->oHomeZ + minZ > o->oPosZ) { - return TRUE; - } - - if (o->oHomeZ + maxZ < o->oPosZ) { - return TRUE; - } - + if (o->oHomeX + minX > o->oPosX) return TRUE; + if (o->oHomeX + maxX < o->oPosX) return TRUE; + if (o->oHomeZ + minZ > o->oPosZ) return TRUE; + if (o->oHomeZ + maxZ < o->oPosZ) return TRUE; return FALSE; } @@ -1566,11 +1434,7 @@ s32 cur_obj_resolve_wall_collisions(void) { wall = collisionData.walls[collisionData.numWalls - 1]; o->oWallAngle = atan2s(wall->normal.z, wall->normal.x); - if (abs_angle_diff(o->oWallAngle, o->oMoveAngleYaw) > 0x4000) { - return TRUE; - } else { - return FALSE; - } + return (abs_angle_diff(o->oWallAngle, o->oMoveAngleYaw) > 0x4000); } } @@ -1674,19 +1538,10 @@ void cur_obj_move_standard(s16 steepSlopeAngleDegrees) { } } -UNUSED static s32 cur_obj_within_12k_bounds(void) { - if (o->oPosX < -12000.0f || 12000.0f < o->oPosX) { - return FALSE; - } - - if (o->oPosY < -12000.0f || 12000.0f < o->oPosY) { - return FALSE; - } - - if (o->oPosZ < -12000.0f || 12000.0f < o->oPosZ) { - return FALSE; - } - +UNUSED static s32 cur_obj_within_bounds(f32 bounds) { + if (o->oPosX < -bounds || bounds < o->oPosX) return FALSE; + if (o->oPosY < -bounds || bounds < o->oPosY) return FALSE; + if (o->oPosZ < -bounds || bounds < o->oPosZ) return FALSE; return TRUE; } @@ -1954,53 +1809,26 @@ void obj_set_hitbox(struct Object *obj, struct ObjectHitbox *hitbox) { cur_obj_become_tangible(); } - obj->hitboxRadius = obj->header.gfx.scale[0] * hitbox->radius; - obj->hitboxHeight = obj->header.gfx.scale[1] * hitbox->height; - obj->hurtboxRadius = obj->header.gfx.scale[0] * hitbox->hurtboxRadius; - obj->hurtboxHeight = obj->header.gfx.scale[1] * hitbox->hurtboxHeight; + obj->hitboxRadius = obj->header.gfx.scale[0] * hitbox->radius; + obj->hitboxHeight = obj->header.gfx.scale[1] * hitbox->height; + obj->hurtboxRadius = obj->header.gfx.scale[0] * hitbox->hurtboxRadius; + obj->hurtboxHeight = obj->header.gfx.scale[1] * hitbox->hurtboxHeight; obj->hitboxDownOffset = obj->header.gfx.scale[1] * hitbox->downOffset; } -s32 signum_positive(s32 x) { - if (x >= 0) { - return 1; - } else { - return -1; - } -} - -f32 absf(f32 x) { - if (x >= 0) { - return x; - } else { - return -x; - } -} - -s32 absi(s32 x) { - if (x >= 0) { - return x; - } else { - return -x; - } -} - s32 cur_obj_wait_then_blink(s32 timeUntilBlinking, s32 numBlinks) { - s32 done = FALSE; s32 timeBlinking; - if (o->oTimer >= timeUntilBlinking) { if ((timeBlinking = o->oTimer - timeUntilBlinking) % 2 != 0) { o->header.gfx.node.flags |= GRAPH_RENDER_INVISIBLE; if (timeBlinking / 2 > numBlinks) { - done = TRUE; + return TRUE; } } else { o->header.gfx.node.flags &= ~GRAPH_RENDER_INVISIBLE; } } - - return done; + return FALSE; } s32 cur_obj_is_mario_ground_pounding_platform(void) { @@ -2009,7 +1837,6 @@ s32 cur_obj_is_mario_ground_pounding_platform(void) { return TRUE; } } - return FALSE; } @@ -2025,9 +1852,9 @@ void spawn_mist_particles_with_sound(u32 soundMagic) { void cur_obj_push_mario_away(f32 radius) { f32 marioRelX = gMarioObject->oPosX - o->oPosX; f32 marioRelZ = gMarioObject->oPosZ - o->oPosZ; - f32 marioDist = sqrtf(sqr(marioRelX) + sqr(marioRelZ)); + f32 marioDist = (sqr(marioRelX) + sqr(marioRelZ)); - if (marioDist < radius) { + if (marioDist < sqr(radius)) { //! If this function pushes Mario out of bounds, it will trigger Mario's // oob failsafe gMarioStates[0].pos[0] += (radius - marioDist) / radius * marioRelX; @@ -2048,9 +1875,7 @@ void cur_obj_push_mario_away_from_cylinder(f32 radius, f32 extentY) { } void bhv_dust_smoke_loop(void) { - o->oPosX += o->oVelX; - o->oPosY += o->oVelY; - o->oPosZ += o->oVelZ; + vec3_add(&o->oPosVec, &o->oVelVec); if (o->oSmokeTimer == 10) { obj_mark_for_deletion(o); @@ -2107,11 +1932,7 @@ void cur_obj_set_pos_to_home_with_debug(void) { } s32 cur_obj_is_mario_on_platform(void) { - if (gMarioObject->platform == o) { - return TRUE; - } else { - return FALSE; - } + return (gMarioObject->platform == o); } s32 cur_obj_shake_y_until(s32 cycles, s32 amount) { @@ -2121,20 +1942,7 @@ s32 cur_obj_shake_y_until(s32 cycles, s32 amount) { o->oPosY += amount; } - if (o->oTimer == cycles * 2) { - return TRUE; - } else { - return FALSE; - } -} - -s32 jiggle_bbh_stair(s32 index) { - if (index >= 4 || index < 0) { - return TRUE; - } - - o->oPosY += sBbhStairJiggleOffsets[index]; - return FALSE; + return (o->oTimer == cycles * 2); } void cur_obj_call_action_function(void (*actionFunctions[])(void)) { diff --git a/src/game/object_helpers.h b/src/game/object_helpers.h index aeef86ce..83bb8dff 100644 --- a/src/game/object_helpers.h +++ b/src/game/object_helpers.h @@ -219,9 +219,6 @@ struct GraphNode_802A45E4 { }; void obj_set_hitbox(struct Object *obj, struct ObjectHitbox *hitbox); -s32 signum_positive(s32 x); -f32 absf(f32 x); -s32 absi(s32 a0); s32 cur_obj_wait_then_blink(s32 timeUntilBlinking, s32 numBlinks); s32 cur_obj_is_mario_ground_pounding_platform(void); void spawn_mist_particles(void); @@ -233,7 +230,6 @@ s32 cur_obj_progress_direction_table(void); void cur_obj_scale_over_time(s32 axis, s32 times, f32 start, f32 end); void cur_obj_set_pos_to_home_with_debug(void); s32 cur_obj_is_mario_on_platform(void); -s32 jiggle_bbh_stair(s32 timer); void cur_obj_call_action_function(void (*actionFunctions[])(void)); void spawn_base_star_with_no_lvl_exit(void); s32 cur_obj_mario_far_away(void); diff --git a/src/game/puppycam2.c b/src/game/puppycam2.c index 6bf921b3..d6ceae06 100644 --- a/src/game/puppycam2.c +++ b/src/game/puppycam2.c @@ -1029,9 +1029,8 @@ void puppycam_projection_behaviours(void) { //This is the base floor height when stood on the ground. It's used to set a baseline for where the camera sits while Mario remains a height from this point, so it keeps a consistent motion. gPuppyCam.targetFloorHeight = CLAMP(find_floor_height(gPuppyCam.targetObj->oPosX, gPuppyCam.targetObj->oPosY, gPuppyCam.targetObj->oPosZ), gPuppyCam.targetObj->oPosY-350, gPuppyCam.targetObj->oPosY+300); - gPuppyCam.lastTargetFloorHeight = approach_f32_asymptotic(gPuppyCam.lastTargetFloorHeight - , gPuppyCam.targetFloorHeight - , CLAMP((absf(gMarioState->vel[1]) - 17.f) / 200.f, 0, 0.1f) + gPuppyCam.lastTargetFloorHeight = approach_f32_asymptotic(gPuppyCam.lastTargetFloorHeight , gPuppyCam.targetFloorHeight + , CLAMP((ABSF(gMarioState->vel[1]) - 17.f) / 200.f, 0, 0.1f) + CLAMP((absf(gPuppyCam.targetFloorHeight - gPuppyCam.lastTargetFloorHeight) - 30.f) / 300.f, 0, 0.1f)); if (gMarioState->action == ACT_SLEEPING || gMarioState->action == ACT_START_SLEEPING) { diff --git a/src/game/sound_init.c b/src/game/sound_init.c index 94b4c869..1abd9192 100644 --- a/src/game/sound_init.c +++ b/src/game/sound_init.c @@ -18,7 +18,6 @@ #define MUSIC_NONE 0xFFFF -static Vec3f unused80339DC0; static OSMesgQueue sSoundMesgQueue; static OSMesg sSoundMesgBuf[1]; static struct VblankHandler sSoundVblankHandler; @@ -334,52 +333,45 @@ void audio_game_loop_tick(void) { void thread4_sound(UNUSED void *arg) { audio_init(); sound_init(); - #if PUPPYPRINT_DEBUG +#if PUPPYPRINT_DEBUG OSTime lastTime; - #endif - - // Zero-out unused vector - vec3f_copy(unused80339DC0, gVec3fZero); +#endif osCreateMesgQueue(&sSoundMesgQueue, sSoundMesgBuf, ARRAY_COUNT(sSoundMesgBuf)); set_vblank_handler(1, &sSoundVblankHandler, &sSoundMesgQueue, (OSMesg) 512); - while (TRUE) - { + while (TRUE) { OSMesg msg; osRecvMesg(&sSoundMesgQueue, &msg, OS_MESG_BLOCK); - #if PUPPYPRINT_DEBUG - while (TRUE) - { +#if PUPPYPRINT_DEBUG + while (TRUE) { lastTime = osGetTime(); dmaAudioTime[perfIteration] = 0; - #endif +#endif if (gResetTimer < 25) { struct SPTask *spTask; spTask = create_next_audio_frame_task(); if (spTask != NULL) { dispatch_audio_sptask(spTask); } - #if PUPPYPRINT_DEBUG +#if PUPPYPRINT_DEBUG profiler_update(audioTime, lastTime); audioTime[perfIteration] -= dmaAudioTime[perfIteration]; - if (benchmarkLoop > 0 && benchOption == 1) - { + if (benchmarkLoop > 0 && benchOption == 1) { benchmarkLoop--; benchMark[benchmarkLoop] = osGetTime() - lastTime; - if (benchmarkLoop == 0) - { + if (benchmarkLoop == 0) { puppyprint_profiler_finished(); break; } - } - else + } else { break; - #endif + } +#endif } - #if PUPPYPRINT_DEBUG +#if PUPPYPRINT_DEBUG } - #endif +#endif } } From 8e398008d8de55903e20c1447d141d15eac1fa9c Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Tue, 28 Sep 2021 22:43:29 -0700 Subject: [PATCH 40/97] Optimize out a bunch of sqrtf --- src/audio/external.c | 7 +- src/engine/graph_node.c | 4 - src/engine/math_util.c | 26 ++-- src/engine/math_util.h | 29 ++--- src/engine/surface_load.c | 4 +- src/game/behavior_actions.h | 2 +- src/game/behaviors/amp.inc.c | 2 +- src/game/behaviors/bbh_merry_go_round.inc.c | 2 +- src/game/behaviors/beta_chest.inc.c | 2 +- src/game/behaviors/boo.inc.c | 40 ++---- src/game/behaviors/bowser.inc.c | 40 ++---- src/game/behaviors/bowser_flame.inc.c | 8 +- src/game/behaviors/bowser_key_cutscene.inc.c | 4 +- src/game/behaviors/bub.inc.c | 4 +- src/game/behaviors/butterfly.inc.c | 6 +- src/game/behaviors/chain_chomp.inc.c | 59 +++++---- src/game/behaviors/chuckya.inc.c | 12 +- src/game/behaviors/end_birds_2.inc.c | 3 +- src/game/behaviors/eyerok.inc.c | 8 +- src/game/behaviors/haunted_chair.inc.c | 2 +- src/game/behaviors/heave_ho.inc.c | 2 +- src/game/behaviors/hoot.inc.c | 2 +- src/game/behaviors/intro_lakitu.inc.c | 4 +- src/game/behaviors/king_bobomb.inc.c | 8 +- src/game/behaviors/klepto.inc.c | 7 +- src/game/behaviors/koopa.inc.c | 5 +- src/game/behaviors/mad_piano.inc.c | 6 +- src/game/behaviors/purple_switch.inc.c | 6 +- src/game/behaviors/scuttlebug.inc.c | 2 +- src/game/behaviors/sparkle_spawn_star.inc.c | 6 +- src/game/behaviors/spindrift.inc.c | 2 +- src/game/behaviors/strong_wind_particle.inc.c | 4 +- .../behaviors/tilting_inverted_pyramid.inc.c | 77 ++++-------- src/game/behaviors/tuxie.inc.c | 16 +-- src/game/behaviors/tweester.inc.c | 7 +- src/game/behaviors/ukiki.inc.c | 23 ++-- src/game/behaviors/water_bomb.inc.c | 8 +- src/game/camera.c | 9 +- src/game/game_init.c | 50 +++----- src/game/geo_misc.h | 8 +- src/game/interaction.c | 16 ++- src/game/mario.c | 3 +- src/game/mario_actions_airborne.c | 13 +- src/game/mario_actions_cutscene.c | 16 ++- src/game/mario_actions_moving.c | 20 +-- src/game/mario_actions_submerged.c | 2 +- src/game/mario_step.c | 2 +- src/game/obj_behaviors.c | 15 +-- src/game/obj_behaviors_2.c | 44 +++---- src/game/object_collision.c | 8 +- src/game/object_helpers.c | 118 +++++++----------- src/game/object_helpers.h | 6 +- src/game/paintings.c | 4 +- src/game/platform_displacement.c | 2 +- src/game/puppycam2.c | 10 +- src/game/screen_transition.c | 60 +++------ src/game/shadow.c | 3 +- src/game/skybox.c | 2 +- src/game/sound_init.c | 4 +- src/goddard/joints.c | 3 +- 60 files changed, 332 insertions(+), 535 deletions(-) diff --git a/src/audio/external.c b/src/audio/external.c index efd5b9bb..72345ea0 100644 --- a/src/audio/external.c +++ b/src/audio/external.c @@ -10,14 +10,11 @@ #include "game/level_update.h" #include "game/object_list_processor.h" #include "game/camera.h" +#include "engine/math_util.h" #include "seq_ids.h" #include "dialog_ids.h" -#if defined(VERSION_EU) || defined(VERSION_SH) #define EU_FLOAT(x) x##f -#else -#define EU_FLOAT(x) x -#endif // N.B. sound banks are different from the audio banks referred to in other // files. We should really fix our naming to be less ambiguous... @@ -845,7 +842,7 @@ static void process_sound_request(u32 bits, f32 *pos) { // Allocate from free list soundIndex = sSoundBankFreeListFront[bank]; - dist = sqrtf(pos[0] * pos[0] + pos[1] * pos[1] + pos[2] * pos[2]) * one; + dist = sqrtf(sqr(pos[0]) + sqr(pos[1]) + sqr(pos[2])) * one; sSoundBanks[bank][soundIndex].x = &pos[0]; sSoundBanks[bank][soundIndex].y = &pos[1]; sSoundBanks[bank][soundIndex].z = &pos[2]; diff --git a/src/engine/graph_node.c b/src/engine/graph_node.c index 3f968659..c91c1358 100644 --- a/src/engine/graph_node.c +++ b/src/engine/graph_node.c @@ -9,10 +9,6 @@ #include "game/area.h" #include "geo_layout.h" -// unused Mtx(s) -s16 identityMtx[4][4] = { { 1, 0, 0, 0 }, { 0, 1, 0, 0 }, { 0, 0, 1, 0 }, { 0, 0, 0, 1 } }; -s16 zeroMtx[4][4] = { { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } }; - /** * Initialize a geo node with a given type. Sets all links such that there * are no siblings, parent or children for this node. diff --git a/src/engine/math_util.c b/src/engine/math_util.c index 4f4efad7..a8fc7189 100644 --- a/src/engine/math_util.c +++ b/src/engine/math_util.c @@ -12,6 +12,10 @@ #include "config.h" +// unused Mtx(s) +s16 identityMtx[4][4] = { { 1, 0, 0, 0 }, { 0, 1, 0, 0 }, { 0, 0, 1, 0 }, { 0, 0, 0, 1 } }; +s16 zeroMtx[4][4] = { { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } }; + Vec3f gVec3fX = { 1.0f, 0.0f, 0.0f }; Vec3f gVec3fY = { 0.0f, 1.0f, 0.0f }; Vec3f gVec3fZ = { 0.0f, 0.0f, 1.0f }; @@ -40,11 +44,7 @@ static inline s32 roundf(f32 in) { // } f32 absf(f32 x) { - if (x >= 0) { - return x; - } else { - return -x; - } + return ABSF(x); } /// Returns the lowest of three values. @@ -543,7 +543,7 @@ void mtxf_mul_vec3s(Mat4 mtx, Vec3s b) { register s32 i; register s16 *c = b; for (i = 0; i < 3; i++) { - c[0] = x * temp2[0] + y * temp2[4] + z * temp2[8] + temp2[12]; + c[0] = (x * temp2[0]) + (y * temp2[4]) + (z * temp2[8]) + temp2[12]; c++; temp2++; } @@ -566,13 +566,13 @@ void mtxf_mul_vec3s(Mat4 mtx, Vec3s b) { void mtxf_to_mtx_scale(Mtx *dest, Mat4 src) { Mat4 temp; register s32 i, j; - for( i = 0; i < 4; i++ ) { - for( j = 0; j < 3; j++ ) { - temp[i][j] = src[i][j] / gWorldScale; + for(i = 0; i < 4; i++) { + for(j = 0; j < 3; j++) { + temp[i][j] = (src[i][j] / gWorldScale); } temp[i][3] = src[i][3]; } - guMtxF2L( temp, dest ); + guMtxF2L(temp, dest); } void mtxf_to_mtx_constant(register s16 *dest, register f32 *src) { @@ -580,7 +580,7 @@ void mtxf_to_mtx_constant(register s16 *dest, register f32 *src) { s32 i; for (i = 0; i < 16; i++) { asFixedPoint = (src[i] * (1 << 16)); - dest[i] = (asFixedPoint >> 16); + dest[i ] = (asFixedPoint >> 16); dest[i + 16] = (asFixedPoint & 0xFFFF); } } @@ -660,7 +660,7 @@ void vec3f_get_lateral_dist(Vec3f from, Vec3f to, f32 *lateralDist) { *lateralDist = sqrtf(sqr(dx) + sqr(dz)); } -/// Finds the squared horizontal distance between two vectors. +/// Finds the squared horizontal distance between two vectors. Avoids a sqrtf call. void vec3f_get_lateral_dist_squared(Vec3f from, Vec3f to, f32 *lateralDist) { register f32 dx = (to[0] - from[0]); register f32 dz = (to[2] - from[2]); @@ -674,7 +674,7 @@ void vec3f_get_dist(Vec3f from, Vec3f to, f32 *dist) { *dist = vec3_mag(d); } -/// Finds the squared distance between two vectors. +/// Finds the squared distance between two vectors. Avoids a sqrtf call. void vec3f_get_dist_squared(Vec3f from, Vec3f to, f32 *dist) { register Vec3f d; vec3_diff(d, to, from); diff --git a/src/engine/math_util.h b/src/engine/math_util.h index 24bf7753..5b58fee9 100644 --- a/src/engine/math_util.h +++ b/src/engine/math_util.h @@ -481,20 +481,21 @@ void mtxf_to_mtx_scale(Mtx *dest, Mat4 src); void mtxf_rotate_xy(Mtx *mtx, s32 angle); void get_pos_from_transform_mtx(Vec3f dest, Mat4 objMtx, Mat4 camMtx); -void vec2f_get_lateral_dist( Vec2f from, Vec2f to, f32 *lateralDist ); -void vec3f_get_lateral_dist( Vec3f from, Vec3f to, f32 *lateralDist ); -void vec3f_get_dist( Vec3f from, Vec3f to, f32 *dist ); -void vec3f_get_dist_squared( Vec3f from, Vec3f to, f32 *dist ); -void vec3f_get_dist_and_yaw( Vec3f from, Vec3f to, f32 *dist, Angle *yaw); -void vec3f_get_pitch( Vec3f from, Vec3f to, Angle *pitch ); -void vec3f_get_yaw( Vec3f from, Vec3f to, Angle *yaw); -void vec3f_get_angle( Vec3f from, Vec3f to, Angle *pitch, Angle *yaw); -void vec3f_get_lateral_dist_and_pitch( Vec3f from, Vec3f to, f32 *lateralDist, Angle *pitch ); -void vec3f_get_lateral_dist_and_yaw( Vec3f from, Vec3f to, f32 *lateralDist, Angle *yaw); -void vec3f_get_lateral_dist_and_angle( Vec3f from, Vec3f to, f32 *lateralDist, Angle *pitch, Angle *yaw); -void vec3f_get_dist_and_lateral_dist_and_angle(Vec3f from, Vec3f to, f32 *dist, f32 *lateralDist, Angle *pitch, Angle *yaw); -void vec3s_get_dist_and_angle( Vec3s from, Vec3s to, s16 *dist, Angle *pitch, Angle *yaw); -void vec3f_get_dist_and_angle( Vec3f from, Vec3f to, f32 *dist, Angle *pitch, Angle *yaw); +void vec2f_get_lateral_dist( Vec2f from, Vec2f to, f32 *lateralDist ); +void vec3f_get_lateral_dist( Vec3f from, Vec3f to, f32 *lateralDist ); +void vec3f_get_lateral_dist_squared( Vec3f from, Vec3f to, f32 *lateralDist ); +void vec3f_get_dist( Vec3f from, Vec3f to, f32 *dist ); +void vec3f_get_dist_squared( Vec3f from, Vec3f to, f32 *dist ); +void vec3f_get_dist_and_yaw( Vec3f from, Vec3f to, f32 *dist, Angle *yaw); +void vec3f_get_pitch( Vec3f from, Vec3f to, Angle *pitch ); +void vec3f_get_yaw( Vec3f from, Vec3f to, Angle *yaw); +void vec3f_get_angle( Vec3f from, Vec3f to, Angle *pitch, Angle *yaw); +void vec3f_get_lateral_dist_and_pitch( Vec3f from, Vec3f to, f32 *lateralDist, Angle *pitch ); +void vec3f_get_lateral_dist_and_yaw( Vec3f from, Vec3f to, f32 *lateralDist, Angle *yaw); +void vec3f_get_lateral_dist_and_angle( Vec3f from, Vec3f to, f32 *lateralDist, Angle *pitch, Angle *yaw); +void vec3f_get_dist_and_lateral_dist_and_angle(Vec3f from, Vec3f to, f32 *dist, f32 *lateralDist, Angle *pitch, Angle *yaw); +void vec3s_get_dist_and_angle( Vec3s from, Vec3s to, s16 *dist, Angle *pitch, Angle *yaw); +void vec3f_get_dist_and_angle( Vec3f from, Vec3f to, f32 *dist, Angle *pitch, Angle *yaw); void vec3s_set_dist_and_angle( Vec3s from, Vec3s to, s16 dist, Angle32 pitch, Angle32 yaw); void vec3f_set_dist_and_angle( Vec3f from, Vec3f to, f32 dist, Angle32 pitch, Angle32 yaw); diff --git a/src/engine/surface_load.c b/src/engine/surface_load.c index 2014bb1c..db8a3d4e 100644 --- a/src/engine/surface_load.c +++ b/src/engine/surface_load.c @@ -717,9 +717,9 @@ static void get_optimal_coll_dist(struct Object *obj) { */ void load_object_collision_model(void) { TerrainData vertexData[600]; - #if PUPPYPRINT_DEBUG +#if PUPPYPRINT_DEBUG OSTime first = osGetTime(); - #endif +#endif TerrainData *collisionData = gCurrentObject->collisionData; f32 marioDist = gCurrentObject->oDistanceToMario; diff --git a/src/game/behavior_actions.h b/src/game/behavior_actions.h index 37701670..bab17674 100644 --- a/src/game/behavior_actions.h +++ b/src/game/behavior_actions.h @@ -569,7 +569,7 @@ Gfx *geo_snufit_move_mask(s32 callContext, struct GraphNode *node, UNUSED Mat4 * Gfx *geo_snufit_scale_body(s32 callContext, struct GraphNode *node, UNUSED Mat4 *c); // Bowser key cutscene -Gfx *geo_scale_bowser_key(s32 run, struct GraphNode *node, UNUSED f32 mtx[4][4]); +Gfx *geo_scale_bowser_key(s32 run, struct GraphNode *node, UNUSED Mat4 mtx); // Water splash extern struct WaterDropletParams gShallowWaterSplashDropletParams; diff --git a/src/game/behaviors/amp.inc.c b/src/game/behaviors/amp.inc.c index f9bb9bed..eb417c57 100644 --- a/src/game/behaviors/amp.inc.c +++ b/src/game/behaviors/amp.inc.c @@ -270,7 +270,7 @@ static void fixed_circling_amp_idle_loop(void) { f32 xToMario = gMarioObject->header.gfx.pos[0] - o->oPosX; f32 yToMario = gMarioObject->header.gfx.pos[1] + 120.0f - o->oPosY; f32 zToMario = gMarioObject->header.gfx.pos[2] - o->oPosZ; - s16 vAngleToMario = atan2s(sqrtf(xToMario * xToMario + zToMario * zToMario), -yToMario); + s16 vAngleToMario = atan2s(sqrtf(sqr(xToMario) + sqr(zToMario)), -yToMario); obj_turn_toward_object(o, gMarioObject, 19, 0x1000); o->oFaceAnglePitch = approach_s16_symmetric(o->oFaceAnglePitch, vAngleToMario, 0x1000); diff --git a/src/game/behaviors/bbh_merry_go_round.inc.c b/src/game/behaviors/bbh_merry_go_round.inc.c index d1d047da..f65a3197 100644 --- a/src/game/behaviors/bbh_merry_go_round.inc.c +++ b/src/game/behaviors/bbh_merry_go_round.inc.c @@ -12,7 +12,7 @@ static void handle_merry_go_round_music(void) { // If the music should play, play it and check whether it still should. // Otherwise, don't play it and check whether it should. - if (o->oMerryGoRoundMusicShouldPlay == FALSE) { + if (!o->oMerryGoRoundMusicShouldPlay) { if (gMarioCurrentRoom == BBH_NEAR_MERRY_GO_ROUND_ROOM) { // Play the merry-go-round and BBH music at the same time play_secondary_music(SEQ_EVENT_MERRY_GO_ROUND, 45, 20, 200); diff --git a/src/game/behaviors/beta_chest.inc.c b/src/game/behaviors/beta_chest.inc.c index 7a1a786d..6a373f29 100644 --- a/src/game/behaviors/beta_chest.inc.c +++ b/src/game/behaviors/beta_chest.inc.c @@ -44,7 +44,7 @@ void bhv_beta_chest_bottom_loop(void) { void bhv_beta_chest_lid_loop(void) { switch (o->oAction) { case BETA_CHEST_ACT_IDLE_CLOSED: - if (dist_between_objects(o->parentObj, gMarioObject) < 300.0f) { + if (dist_between_objects_squared(o->parentObj, gMarioObject) < sqr(300.0f)) { o->oAction++; // Set to BETA_CHEST_ACT_OPENING } diff --git a/src/game/behaviors/boo.inc.c b/src/game/behaviors/boo.inc.c index 6509da94..037d8178 100644 --- a/src/game/behaviors/boo.inc.c +++ b/src/game/behaviors/boo.inc.c @@ -14,9 +14,9 @@ static struct ObjectHitbox sBooGivingStarHitbox = { // Relative positions static s16 sCourtyardBooTripletPositions[][3] = { - {0, 50, 0}, - {210, 110, 210}, - {-210, 70, -210} + { 0, 50, 0}, + { 210, 110, 210}, + {-210, 70, -210} }; static void boo_stop(void) { @@ -31,20 +31,14 @@ void bhv_boo_init(void) { static s32 boo_should_be_stopped(void) { if (cur_obj_has_behavior(bhvMerryGoRoundBigBoo) || cur_obj_has_behavior(bhvMerryGoRoundBoo)) { - if (!gMarioOnMerryGoRound) { - return TRUE; - } else { - return FALSE; - } + return (!gMarioOnMerryGoRound); } else { if (o->activeFlags & ACTIVE_FLAG_IN_DIFFERENT_ROOM) { return TRUE; } - if (o->oRoom == 10) { - if (gTimeStopState & TIME_STOP_MARIO_OPENED_DOOR) { - return TRUE; - } + if ((o->oRoom == 10) && (gTimeStopState & TIME_STOP_MARIO_OPENED_DOOR)) { + return TRUE; } } @@ -52,20 +46,10 @@ static s32 boo_should_be_stopped(void) { } static s32 boo_should_be_active(void) { - f32 activationRadius; - - if (cur_obj_has_behavior(bhvBalconyBigBoo)) { - activationRadius = 5000.0f; - } else { - activationRadius = 1500.0f; - } + f32 activationRadius = (cur_obj_has_behavior(bhvBalconyBigBoo) ? 5000.0f : 1500.0f); if (cur_obj_has_behavior(bhvMerryGoRoundBigBoo) || cur_obj_has_behavior(bhvMerryGoRoundBoo)) { - if (gMarioOnMerryGoRound == TRUE) { - return TRUE; - } else { - return FALSE; - } + return (gMarioOnMerryGoRound); } else if (o->oRoom == -1) { if (o->oDistanceToMario < activationRadius) { return TRUE; @@ -299,11 +283,7 @@ static s32 boo_update_during_death(void) { } static s32 obj_has_attack_type(u32 attackType) { - if ((o->oInteractStatus & INT_STATUS_ATTACK_MASK) == attackType) { - return TRUE; - } else { - return FALSE; - } + return ((o->oInteractStatus & INT_STATUS_ATTACK_MASK) == attackType); } static s32 boo_get_attack_status(void) { @@ -338,7 +318,7 @@ static void boo_chase_mario(f32 minDY, s16 yawIncrement, f32 mul) { if (boo_vanish_or_appear()) { o->oInteractType = 0x8000; - if (cur_obj_lateral_dist_from_mario_to_home() > 1500.0f) { + if (!cur_obj_lateral_dist_from_mario_to_home_is_in_range(1500.0f)) { targetYaw = cur_obj_angle_to_home(); } else { targetYaw = o->oAngleToMario; diff --git a/src/game/behaviors/bowser.inc.c b/src/game/behaviors/bowser.inc.c index 61e175fe..50ef6f6e 100644 --- a/src/game/behaviors/bowser.inc.c +++ b/src/game/behaviors/bowser.inc.c @@ -187,11 +187,7 @@ s32 bowser_set_anim_look_up_and_walk(void) { if (cur_obj_check_anim_frame(21)) { o->oForwardVel = 3.0f; } - if (cur_obj_check_if_near_animation_end()) { - return TRUE; - } else { - return FALSE; - } + return (cur_obj_check_if_near_animation_end()); } /** @@ -201,11 +197,7 @@ s32 bowser_set_anim_look_up_and_walk(void) { s32 bowser_set_anim_slow_gait(void) { o->oForwardVel = 3.0f; cur_obj_init_animation_with_sound(BOWSER_ANIM_SLOW_GAIT); - if (cur_obj_check_if_near_animation_end()) { - return TRUE; - } else { - return FALSE; - } + return (cur_obj_check_if_near_animation_end()); } /** @@ -217,11 +209,7 @@ s32 bowser_set_anim_look_down_stop_walk(void) { if (cur_obj_check_anim_frame(20)) { o->oForwardVel = 0.0f; } - if (cur_obj_check_if_near_animation_end()) { - return TRUE; - } else { - return FALSE; - } + return (cur_obj_check_if_near_animation_end()); } @@ -315,7 +303,7 @@ void bowser_bitdw_actions(void) { // Generate random float f32 rand = random_float(); // Set attacks when Bowser Reacts - if (o->oBowserIsReacting == FALSE) { + if (!o->oBowserIsReacting) { if (o->oBowserStatus & BOWSER_STATUS_ANGLE_MARIO) { if (o->oDistanceToMario < 1500.0f) { o->oAction = BOWSER_ACT_BREATH_FIRE; // nearby @@ -358,7 +346,7 @@ void bowser_bitfs_actions(void) { // Generate random float f32 rand = random_float(); // Set attacks when Bowser Reacts - if (o->oBowserIsReacting == FALSE) { + if (!o->oBowserIsReacting) { if (o->oBowserStatus & BOWSER_STATUS_ANGLE_MARIO) { if (o->oDistanceToMario < 1300.0f) { // nearby if (rand < 0.5f) { // 50% chance @@ -425,7 +413,7 @@ void bowser_bits_actions(void) { case FALSE: // oBowserBitsJustJump never changes value, // so its always FALSE, maybe a debug define - if (o->oBowserBitsJustJump == FALSE) { + if (!o->oBowserBitsJustJump) { bowser_bits_action_list(); } else { bowser_set_act_big_jump(); @@ -669,11 +657,7 @@ void bowser_act_hit_mine(void) { */ s32 bowser_set_anim_jump(void) { cur_obj_init_animation_with_sound(BOWSER_ANIM_JUMP_START); - if (cur_obj_check_anim_frame(11)) { - return TRUE; - } else { - return FALSE; - } + return (cur_obj_check_anim_frame(11)); } /** @@ -859,11 +843,7 @@ s32 bowser_turn_on_timer(s32 time, s16 yaw) { } o->oForwardVel = 0.0f; o->oMoveAngleYaw += yaw; - if (o->oTimer >= time) { - return TRUE; - } else { - return FALSE; - } + return (o->oTimer >= time); } /** @@ -1069,7 +1049,7 @@ void bowser_act_jump_onto_stage(void) { o->oDragStrength = 10.0f; o->oSubAction++; // Spawn shockwave (BITS only) if is not on a platform - if (onDynamicFloor == FALSE) { + if (!onDynamicFloor) { bowser_spawn_shockwave(); // If is on a dynamic floor in BITS, then jump // because of the falling platform @@ -1644,7 +1624,7 @@ void bhv_bowser_loop(void) { s16 angleToCentre; // AngleToCentre from Bowser's perspective // Set distance/angle values - o->oBowserDistToCentre = sqrtf(o->oPosX * o->oPosX + o->oPosZ * o->oPosZ); + o->oBowserDistToCentre = sqrtf(sqr(o->oPosX) + sqr(o->oPosZ)); o->oBowserAngleToCentre = atan2s(0.0f - o->oPosZ, 0.0f - o->oPosX); angleToMario = abs_angle_diff(o->oMoveAngleYaw, o->oAngleToMario); angleToCentre = abs_angle_diff(o->oMoveAngleYaw, o->oBowserAngleToCentre); diff --git a/src/game/behaviors/bowser_flame.inc.c b/src/game/behaviors/bowser_flame.inc.c index f709ef18..c8b138da 100644 --- a/src/game/behaviors/bowser_flame.inc.c +++ b/src/game/behaviors/bowser_flame.inc.c @@ -214,12 +214,8 @@ void bhv_flame_bouncing_loop(void) { if (bowser_flame_should_despawn(300)) { obj_mark_for_deletion(o); } - if (bowser != NULL) { - if (bowser->oHeldState == HELD_FREE) { - if (lateral_dist_between_objects(o, bowser) < 300.0f) { - obj_mark_for_deletion(o); - } - } + if ((bowser != NULL) && (bowser->oHeldState == HELD_FREE) && (lateral_dist_between_objects_squared(o, bowser) < sqr(300.0f))) { + obj_mark_for_deletion(o); } } diff --git a/src/game/behaviors/bowser_key_cutscene.inc.c b/src/game/behaviors/bowser_key_cutscene.inc.c index 96c074c7..62c7c7cf 100644 --- a/src/game/behaviors/bowser_key_cutscene.inc.c +++ b/src/game/behaviors/bowser_key_cutscene.inc.c @@ -1,8 +1,8 @@ // bowser_key_cutscene.inc.c -Gfx *geo_scale_bowser_key(s32 run, struct GraphNode *node, UNUSED Mat4 mtx) { +Gfx *geo_scale_bowser_key(s32 callContext, struct GraphNode *node, UNUSED Mat4 mtx) { struct Object *nodeObj; - if (run == TRUE) { + if (callContext == GEO_CONTEXT_RENDER) { nodeObj = (struct Object *) gCurGraphNodeObject; ((struct GraphNodeScale *) node->next)->scale = nodeObj->oBowserKeyScale; } diff --git a/src/game/behaviors/bub.inc.c b/src/game/behaviors/bub.inc.c index a54536f8..5caf416a 100644 --- a/src/game/behaviors/bub.inc.c +++ b/src/game/behaviors/bub.inc.c @@ -67,7 +67,7 @@ void bub_act_1(void) { if (dy > 300.0f) o->oPosY = o->oPosY - 1.0f; } - if (800.0f < cur_obj_lateral_dist_from_mario_to_home()) + if (!cur_obj_lateral_dist_from_mario_to_home_is_in_range(800.0f)) o->oAngleToMario = cur_obj_angle_to_home(); cur_obj_rotate_yaw_toward(o->oAngleToMario, 0x100); if (o->oDistanceToMario < 200.0f) @@ -101,7 +101,7 @@ void bub_act_2(void) { if (dy > 300.0f) o->oPosY -= 1.0f; } - if (cur_obj_lateral_dist_from_mario_to_home() > 800.0f) + if (!cur_obj_lateral_dist_from_mario_to_home_is_in_range(800.0f)) o->oAngleToMario = cur_obj_angle_to_home(); cur_obj_rotate_yaw_toward(o->oAngleToMario + 0x8000, 0x400); if (o->oTimer > 200 && o->oDistanceToMario > 600.0f) diff --git a/src/game/behaviors/butterfly.inc.c b/src/game/behaviors/butterfly.inc.c index cb72c0c2..885cfe0d 100644 --- a/src/game/behaviors/butterfly.inc.c +++ b/src/game/behaviors/butterfly.inc.c @@ -73,7 +73,7 @@ void butterfly_act_return_home(void) { f32 homeDistY = o->oHomeY - o->oPosY; f32 homeDistZ = o->oHomeZ - o->oPosZ; s16 hAngleToHome = atan2s(homeDistZ, homeDistX); - s16 vAngleToHome = atan2s(sqrtf(homeDistX * homeDistX + homeDistZ * homeDistZ), -homeDistY); + s16 vAngleToHome = atan2s(sqrtf(sqr(homeDistX) + sqr(homeDistZ)), -homeDistY); o->oMoveAngleYaw = approach_s16_symmetric(o->oMoveAngleYaw, hAngleToHome, 0x800); o->oMoveAnglePitch = approach_s16_symmetric(o->oMoveAnglePitch, vAngleToHome, 0x50); @@ -84,9 +84,7 @@ void butterfly_act_return_home(void) { cur_obj_init_animation(1); o->oAction = BUTTERFLY_ACT_RESTING; - o->oPosX = o->oHomeX; - o->oPosY = o->oHomeY; - o->oPosZ = o->oHomeZ; + vec3_copy(&o->oPosVec, &o->oHomeVec); } } diff --git a/src/game/behaviors/chain_chomp.inc.c b/src/game/behaviors/chain_chomp.inc.c index 609ec508..07a4ab8f 100644 --- a/src/game/behaviors/chain_chomp.inc.c +++ b/src/game/behaviors/chain_chomp.inc.c @@ -88,10 +88,8 @@ static void chain_chomp_act_uninitialized(void) { static void chain_chomp_update_chain_segments(void) { struct ChainSegment *prevSegment; struct ChainSegment *segment; - f32 offsetX; - f32 offsetY; - f32 offsetZ; - f32 offset; + Vec3f offset; + f32 mag; f32 segmentVelY; f32 maxTotalOffset; s32 i; @@ -115,40 +113,41 @@ static void chain_chomp_update_chain_segments(void) { segment->posY = 0.0f; } - // Cap distance to previous chain part (so that the tail follows the - // chomp) + // Cap distance to previous chain part (so that the tail follows the chomp) - offsetX = segment->posX - prevSegment->posX; - offsetY = segment->posY - prevSegment->posY; - offsetZ = segment->posZ - prevSegment->posZ; - offset = sqrtf(offsetX * offsetX + offsetY * offsetY + offsetZ * offsetZ); + offset[0] = segment->posX - prevSegment->posX; + offset[1] = segment->posY - prevSegment->posY; + offset[2] = segment->posZ - prevSegment->posZ; + mag = (sqr(offset[0]) + sqr(offset[1]) + sqr(offset[2])); - if (offset > o->oChainChompMaxDistBetweenChainParts) { - offset = o->oChainChompMaxDistBetweenChainParts / offset; - offsetX *= offset; - offsetY *= offset; - offsetZ *= offset; + if (mag > sqr(o->oChainChompMaxDistBetweenChainParts)) { + mag = sqrtf(mag); + mag = o->oChainChompMaxDistBetweenChainParts / mag; + offset[0] *= mag; + offset[1] *= mag; + offset[2] *= mag; } // Cap distance to pivot (so that it stretches when the chomp moves far // from the wooden post) - offsetX += prevSegment->posX; - offsetY += prevSegment->posY; - offsetZ += prevSegment->posZ; - offset = sqrtf(offsetX * offsetX + offsetY * offsetY + offsetZ * offsetZ); + offset[0] += prevSegment->posX; + offset[1] += prevSegment->posY; + offset[2] += prevSegment->posZ; + mag = (sqr(offset[0]) + sqr(offset[1]) + sqr(offset[2])); maxTotalOffset = o->oChainChompMaxDistFromPivotPerChainPart * (5 - i); - if (offset > maxTotalOffset) { - offset = maxTotalOffset / offset; - offsetX *= offset; - offsetY *= offset; - offsetZ *= offset; + if (mag > sqr(maxTotalOffset)) { + mag = sqrtf(mag); + mag = maxTotalOffset / mag; + offset[0] *= mag; + offset[1] *= mag; + offset[2] *= mag; } - segment->posX = offsetX; - segment->posY = offsetY; - segment->posZ = offsetZ; + segment->posX = offset[0]; + segment->posY = offset[1]; + segment->posZ = offset[2]; } } @@ -397,9 +396,9 @@ static void chain_chomp_act_move(void) { 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); + sqrtf(sqr(o->oChainChompSegments[0].posX) + + sqr(o->oChainChompSegments[0].posY) + + sqr(o->oChainChompSegments[0].posZ)); // If the chain is fully stretched maxDistToPivot = o->oChainChompMaxDistFromPivotPerChainPart * 5; diff --git a/src/game/behaviors/chuckya.inc.c b/src/game/behaviors/chuckya.inc.c index 942e4124..bae7f4f6 100644 --- a/src/game/behaviors/chuckya.inc.c +++ b/src/game/behaviors/chuckya.inc.c @@ -38,8 +38,8 @@ void bhv_chuckya_anchor_mario_loop(void) { s32 unknown_chuckya_function(s32 updateAngle, f32 latDist, f32 dist, s32 time) { s32 ret = 0; if (o->oChuckyaUnused != 4) { - if (latDist < cur_obj_lateral_dist_from_mario_to_home()) { - if (cur_obj_lateral_dist_to_home() < 200.0f) { + if (!cur_obj_lateral_dist_from_mario_to_home_is_in_range(latDist)) { + if (cur_obj_lateral_dist_to_home_is_in_range(200.0f)) { ret = 0; } else { ret = 1; @@ -86,7 +86,7 @@ void chuckya_act_0(void) { switch (initialSubAction = o->oSubAction) { case 0: o->oForwardVel = 0; - if (cur_obj_lateral_dist_from_mario_to_home() < 2000.0f) { + if (cur_obj_lateral_dist_from_mario_to_home_is_in_range(2000.0f)) { cur_obj_rotate_yaw_toward(o->oAngleToMario, 0x400); if (o->oChuckyaSubActionTimer > 40 || abs_angle_diff(o->oMoveAngleYaw, o->oAngleToMario) < 0x1000) @@ -98,7 +98,7 @@ void chuckya_act_0(void) { approach_forward_vel(&o->oForwardVel, 30.0f, 4.0f); if (abs_angle_diff(o->oMoveAngleYaw, o->oAngleToMario) > 0x4000) o->oSubAction = 2; - if (cur_obj_lateral_dist_from_mario_to_home() > 2000.0f) + if (!cur_obj_lateral_dist_from_mario_to_home_is_in_range(2000.0f)) o->oSubAction = 3; break; case 2: @@ -107,14 +107,14 @@ void chuckya_act_0(void) { o->oSubAction = 0; break; case 3: - if (cur_obj_lateral_dist_to_home() < 500.0f) + if (cur_obj_lateral_dist_to_home_is_in_range(500.0f)) o->oForwardVel = 0; else { approach_forward_vel(&o->oForwardVel, 10.0f, 4.0f); o->oAngleToMario = cur_obj_angle_to_home(); cur_obj_rotate_yaw_toward(o->oAngleToMario, 0x800); } - if (cur_obj_lateral_dist_from_mario_to_home() < 1900.0f) + if (cur_obj_lateral_dist_from_mario_to_home_is_in_range(1900.0f)) o->oSubAction = 0; break; } diff --git a/src/game/behaviors/end_birds_2.inc.c b/src/game/behaviors/end_birds_2.inc.c index 8f5ef9dd..cd52f8b4 100644 --- a/src/game/behaviors/end_birds_2.inc.c +++ b/src/game/behaviors/end_birds_2.inc.c @@ -18,8 +18,9 @@ void bhv_end_birds_2_loop(void) { vec3f_set_dist_and_angle(gCamera->pos, pos, 14000.f, pitch, yaw); obj_rotate_towards_point(gCurrentObject, pos, 0, 0, 8, 8); - if ((gCurrentObject->oEndBirdCutsceneVars9PointX == 0.f) && (gCurrentObject->oTimer == 0)) + if ((gCurrentObject->oEndBirdCutsceneVars9PointX == 0.f) && (gCurrentObject->oTimer == 0)) { cur_obj_play_sound_2(SOUND_GENERAL_BIRDS_FLY_AWAY); + } break; } diff --git a/src/game/behaviors/eyerok.inc.c b/src/game/behaviors/eyerok.inc.c index 33b49610..e3c52ad6 100644 --- a/src/game/behaviors/eyerok.inc.c +++ b/src/game/behaviors/eyerok.inc.c @@ -12,12 +12,8 @@ struct ObjectHitbox sEyerokHitbox = { s8 sEyerokAnimStatesList[] = { 0, 1, 3, 2, 1, 0 }; -static s32 eyerok_check_mario_relative_z(s32 arg0) { - if (gMarioObject->oPosZ - o->oHomeZ < arg0) { - return TRUE; - } else { - return FALSE; - } +static s32 eyerok_check_mario_relative_z(s32 z) { + return (gMarioObject->oPosZ - o->oHomeZ < z); } static void eyerok_spawn_hand(s16 side, s32 model, const BehaviorScript *behavior) { diff --git a/src/game/behaviors/haunted_chair.inc.c b/src/game/behaviors/haunted_chair.inc.c index 29d8cb47..28ab9786 100644 --- a/src/game/behaviors/haunted_chair.inc.c +++ b/src/game/behaviors/haunted_chair.inc.c @@ -29,7 +29,7 @@ void haunted_chair_act_0(void) { if (o->parentObj != o) { if (o->oHauntedChairFallTargetAngle == 0) { - if (lateral_dist_between_objects(o, o->parentObj) < 250.0f) { + if (lateral_dist_between_objects_squared(o, o->parentObj) < sqr(250.0f)) { dAngleToPiano = obj_angle_to_object(o, o->parentObj) - o->oFaceAngleYaw + 0x2000; if (dAngleToPiano & 0x4000) { o->oHauntedChairFallFromPianoAngle = &o->oFaceAngleRoll; diff --git a/src/game/behaviors/heave_ho.inc.c b/src/game/behaviors/heave_ho.inc.c index c20ae418..fc0a2321 100644 --- a/src/game/behaviors/heave_ho.inc.c +++ b/src/game/behaviors/heave_ho.inc.c @@ -42,7 +42,7 @@ void heave_ho_act_1(void) { void heave_ho_act_2(void) { s16 angleVel; - if (1000.0f < cur_obj_lateral_dist_from_mario_to_home()) + if (!cur_obj_lateral_dist_from_mario_to_home_is_in_range(1000.0f)) o->oAngleToMario = cur_obj_angle_to_home(); if (o->oTimer > 150) { o->oHeaveHoTimedSpeed = (302 - o->oTimer) / 152.0f; diff --git a/src/game/behaviors/hoot.inc.c b/src/game/behaviors/hoot.inc.c index a77383b9..6f5e8260 100644 --- a/src/game/behaviors/hoot.inc.c +++ b/src/game/behaviors/hoot.inc.c @@ -196,7 +196,7 @@ void hoot_turn_to_home(void) { f32 homeDistY = o->oHomeY - o->oPosY; f32 homeDistZ = o->oHomeZ - o->oPosZ; s16 hAngleToHome = atan2s(homeDistZ, homeDistX); - s16 vAngleToHome = atan2s(sqrtf(homeDistX * homeDistX + homeDistZ * homeDistZ), -homeDistY); + s16 vAngleToHome = atan2s(sqrtf(sqr(homeDistX) + sqr(homeDistZ)), -homeDistY); o->oMoveAngleYaw = approach_s16_symmetric(o->oMoveAngleYaw, hAngleToHome, 0x140); o->oMoveAnglePitch = approach_s16_symmetric(o->oMoveAnglePitch, vAngleToHome, 0x140); diff --git a/src/game/behaviors/intro_lakitu.inc.c b/src/game/behaviors/intro_lakitu.inc.c index a36f8614..82e3417c 100644 --- a/src/game/behaviors/intro_lakitu.inc.c +++ b/src/game/behaviors/intro_lakitu.inc.c @@ -24,11 +24,9 @@ void intro_lakitu_set_offset_from_camera(struct Object *obj, Vec3f offset) { } void intro_lakitu_set_focus(struct Object *obj, Vec3f newFocus) { - f32 dist; s16 pitch, yaw; - // newFocus is an offset from lakitu's origin, not a point in the world. - vec3f_get_dist_and_angle(gVec3fZero, newFocus, &dist, &pitch, &yaw); + vec3f_get_angle(gVec3fZero, newFocus, &pitch, &yaw); obj->oFaceAnglePitch = pitch; obj->oFaceAngleYaw = yaw; } diff --git a/src/game/behaviors/king_bobomb.inc.c b/src/game/behaviors/king_bobomb.inc.c index 43c3c260..b408d20f 100644 --- a/src/game/behaviors/king_bobomb.inc.c +++ b/src/game/behaviors/king_bobomb.inc.c @@ -40,12 +40,8 @@ void king_bobomb_act_0(void) { } } -s32 mario_is_far_below_object(f32 arg0) { - if (arg0 < o->oPosY - gMarioObject->oPosY) { - return TRUE; - } else { - return FALSE; - } +s32 mario_is_far_below_object(f32 maxY) { + return (maxY < (o->oPosY - gMarioObject->oPosY)); } void king_bobomb_act_2(void) { diff --git a/src/game/behaviors/klepto.inc.c b/src/game/behaviors/klepto.inc.c index 561c4673..a90cb6c2 100644 --- a/src/game/behaviors/klepto.inc.c +++ b/src/game/behaviors/klepto.inc.c @@ -265,11 +265,8 @@ static void klepto_act_struck_by_mario(void) { o->oGravity = 0.0f; o->oMoveAnglePitch = -obj_get_pitch_from_vel(); - o->oKleptoSpeed = sqrtf(o->oForwardVel * o->oForwardVel + o->oVelY * o->oVelY); - - o->oHomeX = o->oPosX; - o->oHomeY = o->oPosY + 500.0f; - o->oHomeZ = o->oPosZ; + o->oKleptoSpeed = sqrtf(sqr(o->oForwardVel) + sqr(o->oVelY)); + vec3_copy_y_off(&o->oHomeVec, &o->oPosVec, 500.0f); } } diff --git a/src/game/behaviors/koopa.inc.c b/src/game/behaviors/koopa.inc.c index 14417a76..74c79f81 100644 --- a/src/game/behaviors/koopa.inc.c +++ b/src/game/behaviors/koopa.inc.c @@ -403,8 +403,7 @@ static void koopa_unshelled_act_dive(void) { // units behind mario. // Using this, we can get the koopa to pick up and despawn its shell // while mario is riding it. - if (shell != NULL && dist_between_objects(shell, gMarioObject) > 200.0f - && distToShell < 50.0f) { + if (shell != NULL && dist_between_objects_squared(shell, gMarioObject) > sqr(200.0f) && distToShell < 50.0f) { o->oKoopaMovementType = KOOPA_BP_NORMAL; o->oAction = KOOPA_SHELLED_ACT_LYING; o->oForwardVel *= 0.5f; @@ -766,7 +765,7 @@ static void koopa_the_quick_update(void) { } if (o->parentObj != o) { - if (dist_between_objects(o, o->parentObj) < 400.0f) { + if (dist_between_objects_squared(o, o->parentObj) < sqr(400.0f)) { o->parentObj->oKoopaRaceEndpointKoopaFinished = TRUE; } } diff --git a/src/game/behaviors/mad_piano.inc.c b/src/game/behaviors/mad_piano.inc.c index 08c053a3..8998c48a 100644 --- a/src/game/behaviors/mad_piano.inc.c +++ b/src/game/behaviors/mad_piano.inc.c @@ -44,10 +44,10 @@ static void mad_piano_act_attack(void) { } else { f32 dx = o->oPosX - o->oHomeX; f32 dz = o->oPosZ - o->oHomeZ; - f32 distToHome = sqrtf(sqr(dx) + sqr(dz)); + f32 distToHome = (sqr(dx) + sqr(dz)); - if (distToHome > 400.0f) { - distToHome = 400.0f / distToHome; + if (distToHome > sqr(400.0f)) { + distToHome = 400.0f / sqrtf(distToHome); o->oPosX = o->oHomeX + dx * distToHome; o->oPosZ = o->oHomeZ + dz * distToHome; } diff --git a/src/game/behaviors/purple_switch.inc.c b/src/game/behaviors/purple_switch.inc.c index 135960aa..75a606a5 100644 --- a/src/game/behaviors/purple_switch.inc.c +++ b/src/game/behaviors/purple_switch.inc.c @@ -15,10 +15,8 @@ void bhv_purple_switch_loop(void) { case PURPLE_SWITCH_ACT_IDLE: cur_obj_set_model(MODEL_PURPLE_SWITCH); cur_obj_scale(1.5f); - if (gMarioObject->platform == o && !(gMarioStates[0].action & MARIO_NO_PURPLE_SWITCH)) { - if (lateral_dist_between_objects(o, gMarioObject) < 127.5f) { - o->oAction = PURPLE_SWITCH_ACT_PRESSED; - } + if ((gMarioObject->platform == o) && !(gMarioStates[0].action & MARIO_NO_PURPLE_SWITCH) && (lateral_dist_between_objects_squared(o, gMarioObject) < sqr(127.5f))) { + o->oAction = PURPLE_SWITCH_ACT_PRESSED; } break; /** diff --git a/src/game/behaviors/scuttlebug.inc.c b/src/game/behaviors/scuttlebug.inc.c index fffe6b59..a9e98ebd 100644 --- a/src/game/behaviors/scuttlebug.inc.c +++ b/src/game/behaviors/scuttlebug.inc.c @@ -45,7 +45,7 @@ void bhv_scuttlebug_loop(void) { break; case 1: o->oForwardVel = 5.0f; - if (cur_obj_lateral_dist_from_mario_to_home() > 1000.0f) + if (!cur_obj_lateral_dist_from_mario_to_home_is_in_range(1000.0f)) o->oAngleToMario = cur_obj_angle_to_home(); else { if (o->oScuttlebugIsAtttacking == 0) { diff --git a/src/game/behaviors/sparkle_spawn_star.inc.c b/src/game/behaviors/sparkle_spawn_star.inc.c index 0272dd1a..4f76e7a0 100644 --- a/src/game/behaviors/sparkle_spawn_star.inc.c +++ b/src/game/behaviors/sparkle_spawn_star.inc.c @@ -32,15 +32,13 @@ void set_sparkle_spawn_star_hitbox(void) { } void set_home_to_mario(void) { - f32 dx; - f32 dz; o->oHomeX = gMarioObject->oPosX; o->oHomeZ = gMarioObject->oPosZ; o->oHomeY = gMarioObject->oPosY; o->oHomeY += 250.0f; o->oPosY = o->oHomeY; - dx = o->oHomeX - o->oPosX; - dz = o->oHomeZ - o->oPosZ; + f32 dx = o->oHomeX - o->oPosX; + f32 dz = o->oHomeZ - o->oPosZ; o->oForwardVel = sqrtf(sqr(dx) + sqr(dz)) / 23.0f; } diff --git a/src/game/behaviors/spindrift.inc.c b/src/game/behaviors/spindrift.inc.c index b1bad6d6..5174733a 100644 --- a/src/game/behaviors/spindrift.inc.c +++ b/src/game/behaviors/spindrift.inc.c @@ -20,7 +20,7 @@ void bhv_spindrift_loop(void) { switch (o->oAction) { case 0: approach_forward_vel(&o->oForwardVel, 4.0f, 1.0f); - if (cur_obj_lateral_dist_from_mario_to_home() > 1000.0f) + if (!cur_obj_lateral_dist_from_mario_to_home_is_in_range(1000.0f)) o->oAngleToMario = cur_obj_angle_to_home(); else if (o->oDistanceToMario > 300.0f) o->oAngleToMario = obj_angle_to_object(o, gMarioObject); diff --git a/src/game/behaviors/strong_wind_particle.inc.c b/src/game/behaviors/strong_wind_particle.inc.c index 03ee7500..ab97eb8c 100644 --- a/src/game/behaviors/strong_wind_particle.inc.c +++ b/src/game/behaviors/strong_wind_particle.inc.c @@ -39,8 +39,8 @@ void bhv_strong_wind_particle_loop(void) { if (penguinObj != NULL) { penguinXDist = penguinObj->oSLWalkingPenguinWindCollisionXPos - o->oPosX; penguinZDist = penguinObj->oSLWalkingPenguinWindCollisionZPos - o->oPosZ; - distanceFromPenguin = sqrtf(penguinXDist * penguinXDist + penguinZDist * penguinZDist); - if (distanceFromPenguin < 300.0f) { + distanceFromPenguin = (sqr(penguinXDist) + sqr(penguinZDist)); + if (distanceFromPenguin < sqr(300.0f)) { obj_mark_for_deletion(o); cur_obj_become_intangible(); } diff --git a/src/game/behaviors/tilting_inverted_pyramid.inc.c b/src/game/behaviors/tilting_inverted_pyramid.inc.c index da5e16ce..e811cc29 100644 --- a/src/game/behaviors/tilting_inverted_pyramid.inc.c +++ b/src/game/behaviors/tilting_inverted_pyramid.inc.c @@ -64,78 +64,47 @@ f32 approach_by_increment(f32 goal, f32 src, f32 inc) { * then gradually tilt back moving Mario with them. */ void bhv_tilting_inverted_pyramid_loop(void) { - f32 dx; - f32 dy; - f32 dz; - f32 d; - + Vec3f d; +#ifndef PLATFORM_DISPLACEMENT_2 Vec3f dist; Vec3f posBeforeRotation; Vec3f posAfterRotation; // Mario's position - f32 mx; - f32 my; - f32 mz; - - s32 marioOnPlatform = FALSE; + Vec3f m; +#endif Mat4 *transform = &o->transform; - if (gMarioObject->platform == o) { - get_mario_pos(&mx, &my, &mz); - - dist[0] = gMarioObject->oPosX - o->oPosX; - dist[1] = gMarioObject->oPosY - o->oPosY; - dist[2] = gMarioObject->oPosZ - o->oPosZ; +#ifndef PLATFORM_DISPLACEMENT_2 + get_mario_pos(&m[0], &m[1], &m[2]); + vec3_diff(dist, &gMarioObject->oPosVec, &o->oPosVec); linear_mtxf_mul_vec3f(*transform, posBeforeRotation, dist); - - dx = gMarioObject->oPosX - o->oPosX; - dy = 500.0f; - dz = gMarioObject->oPosZ - o->oPosZ; - d = sqrtf(sqr(dx) + sqr(dy) + sqr(dz)); - - //! Always true since dy = 500, making d >= 500. - if (d != 0.0f) { - // Normalizing - d = 1.0f / d; - dx *= d; - dy *= d; - dz *= d; - } else { - dx = 0.0f; - dy = 1.0f; - dz = 0.0f; - } - - if (o->oTiltingPyramidMarioOnPlatform == TRUE) - marioOnPlatform++; - +#endif + d[0] = gMarioObject->oPosX - o->oPosX; + d[1] = 500.0f; + d[2] = gMarioObject->oPosZ - o->oPosZ; + vec3f_normalize(d); o->oTiltingPyramidMarioOnPlatform = TRUE; } else { - dx = 0.0f; - dy = 1.0f; - dz = 0.0f; + vec3_copy(d, gVec3fY); o->oTiltingPyramidMarioOnPlatform = FALSE; } - // Approach the normals by 0.01f towards the new goal, then create a transform matrix and orient the object. // Outside of the other conditionals since it needs to tilt regardless of whether Mario is on. - o->oTiltingPyramidNormalX = approach_by_increment(dx, o->oTiltingPyramidNormalX, 0.01f); - o->oTiltingPyramidNormalY = approach_by_increment(dy, o->oTiltingPyramidNormalY, 0.01f); - o->oTiltingPyramidNormalZ = approach_by_increment(dz, o->oTiltingPyramidNormalZ, 0.01f); + o->oTiltingPyramidNormalX = approach_by_increment(d[0], o->oTiltingPyramidNormalX, 0.01f); + o->oTiltingPyramidNormalY = approach_by_increment(d[1], o->oTiltingPyramidNormalY, 0.01f); + o->oTiltingPyramidNormalZ = approach_by_increment(d[2], o->oTiltingPyramidNormalZ, 0.01f); create_transform_from_normals(*transform, o->oTiltingPyramidNormalX, o->oTiltingPyramidNormalY, o->oTiltingPyramidNormalZ); - +#ifndef PLATFORM_DISPLACEMENT_2 // If Mario is on the platform, adjust his position for the platform tilt. - if (marioOnPlatform != FALSE) { + if (o->oTiltingPyramidMarioOnPlatform) { linear_mtxf_mul_vec3f(*transform, posAfterRotation, dist); - mx += posAfterRotation[0] - posBeforeRotation[0]; - my += posAfterRotation[1] - posBeforeRotation[1]; - mz += posAfterRotation[2] - posBeforeRotation[2]; + m[0] += posAfterRotation[0] - posBeforeRotation[0]; + m[1] += posAfterRotation[1] - posBeforeRotation[1]; + m[2] += posAfterRotation[2] - posBeforeRotation[2]; - #ifndef PLATFORM_DISPLACEMENT_2 - set_mario_pos(mx, my, mz); - #endif + set_mario_pos(m[0], m[1], m[2]); } - +#endif o->header.gfx.throwMatrix = transform; } diff --git a/src/game/behaviors/tuxie.inc.c b/src/game/behaviors/tuxie.inc.c index b9264134..6c2655d9 100644 --- a/src/game/behaviors/tuxie.inc.c +++ b/src/game/behaviors/tuxie.inc.c @@ -20,13 +20,13 @@ void tuxies_mother_act_2(void) { if (o->oSubAction == 0) { cur_obj_init_animation_with_sound(0); o->oForwardVel = 10.0f; - if (800.0f < cur_obj_lateral_dist_from_mario_to_home()) + if (!cur_obj_lateral_dist_from_mario_to_home_is_in_range(800.0f)) o->oSubAction = 1; cur_obj_rotate_yaw_toward(o->oAngleToMario, 0x400); } else { o->oForwardVel = 0.0f; cur_obj_init_animation_with_sound(3); - if (cur_obj_lateral_dist_from_mario_to_home() < 700.0f) + if (cur_obj_lateral_dist_from_mario_to_home_is_in_range(700.0f)) o->oSubAction = 0; } } else { @@ -213,20 +213,20 @@ void small_penguin_act_0(void) { } void small_penguin_act_5(void) { - f32 distToMother; s16 angleToMother; struct Object *motherPenguinObj = cur_obj_nearest_object_with_behavior(bhvTuxiesMother); if (motherPenguinObj != NULL) { - if (o->oDistanceToMario < 1000.0f) + if (o->oDistanceToMario < 1000.0f) { o->oForwardVel = 2.0f; - else + } else { o->oForwardVel = 0.0f; - distToMother = dist_between_objects(o, motherPenguinObj); + } angleToMother = obj_angle_to_object(o, motherPenguinObj); - if (distToMother > 200.0f) + if (dist_between_objects_squared(o, motherPenguinObj) > sqr(200.0f)) { cur_obj_rotate_yaw_toward(angleToMother, 0x400); - else + } else { cur_obj_rotate_yaw_toward(angleToMother + 0x8000, 0x400); + } cur_obj_init_animation_with_sound(0); } small_penguin_dive_with_mario(); diff --git a/src/game/behaviors/tweester.inc.c b/src/game/behaviors/tweester.inc.c index b6d334ab..f5942f77 100644 --- a/src/game/behaviors/tweester.inc.c +++ b/src/game/behaviors/tweester.inc.c @@ -71,8 +71,7 @@ void tweester_act_chase(void) { o->oAngleToHome = cur_obj_angle_to_home(); cur_obj_play_sound_1(SOUND_ENV_WIND1); - if (cur_obj_lateral_dist_from_mario_to_home() < activationRadius - && o->oSubAction == TWEESTER_SUB_ACT_CHASE_MARIO) { + if (cur_obj_lateral_dist_from_mario_to_home_is_in_range(activationRadius) && o->oSubAction == TWEESTER_SUB_ACT_CHASE_MARIO) { o->oForwardVel = 20.0f; cur_obj_rotate_yaw_toward(o->oAngleToMario, 0x200); @@ -84,7 +83,7 @@ void tweester_act_chase(void) { o->oForwardVel = 20.0f; cur_obj_rotate_yaw_toward(o->oAngleToHome, 0x200); - if (cur_obj_lateral_dist_to_home() < 200.0f) + if (cur_obj_lateral_dist_to_home_is_in_range(200.0f)) o->oAction = TWEESTER_ACT_HIDE; } @@ -111,7 +110,7 @@ void tweester_act_hide(void) { tweester_scale_and_move(shrinkTimer / 60.0f); else { cur_obj_become_intangible(); - if (cur_obj_lateral_dist_from_mario_to_home() > 2500.0f) + if (!cur_obj_lateral_dist_from_mario_to_home_is_in_range(2500.0f)) o->oAction = TWEESTER_ACT_IDLE; if (o->oTimer > 360) o->oAction = TWEESTER_ACT_IDLE; diff --git a/src/game/behaviors/ukiki.inc.c b/src/game/behaviors/ukiki.inc.c index 9e430762..bd58174c 100644 --- a/src/game/behaviors/ukiki.inc.c +++ b/src/game/behaviors/ukiki.inc.c @@ -336,17 +336,7 @@ static Trajectory sCageUkikiPath[] = { * our death. Ukiki is a tad suicidal. */ void ukiki_act_go_to_cage(void) { - struct Object* obj; - f32 latDistToCage = 0.0f; - s16 yawToCage = 0; - obj = cur_obj_nearest_object_with_behavior(bhvUkikiCageChild); - - // Ultimately is checking the cage, as it points to the parent - // of a dummy child object of the cage. - if (obj != NULL) { - latDistToCage = lateral_dist_between_objects(o, obj->parentObj); - yawToCage = obj_angle_to_object(o, obj->parentObj); - } + struct Object *obj = cur_obj_nearest_object_with_behavior(bhvUkikiCageChild); cur_obj_become_intangible(); o->oFlags |= OBJ_FLAG_ACTIVE_FROM_AFAR; @@ -375,7 +365,7 @@ void ukiki_act_go_to_cage(void) { if (cur_obj_can_mario_activate_textbox(200.0f, 30.0f, 0x7FFF)) { o->oSubAction++; // fallthrough } else { - break; + break; } case UKIKI_SUB_ACT_CAGE_TALK_TO_MARIO: @@ -389,8 +379,9 @@ void ukiki_act_go_to_cage(void) { case UKIKI_SUB_ACT_CAGE_TURN_TO_CAGE: cur_obj_init_animation_with_sound(UKIKI_ANIM_RUN); - - if (cur_obj_rotate_yaw_toward(yawToCage, 0x400)) { + // Ultimately is checking the cage, as it points to the parent + // of a dummy child object of the cage. + if (obj != NULL && cur_obj_rotate_yaw_toward(obj_angle_to_object(o, obj->parentObj), 0x400)) { o->oForwardVel = 10.0f; o->oSubAction++; } @@ -403,7 +394,9 @@ void ukiki_act_go_to_cage(void) { break; case UKIKI_SUB_ACT_CAGE_LAND_ON_CAGE: - if (latDistToCage < 50.0f) { + // Ultimately is checking the cage, as it points to the parent + // of a dummy child object of the cage. + if ((obj != NULL) && lateral_dist_between_objects_squared(o, obj->parentObj) < sqr(50.0f)) { o->oForwardVel = 0.0f; } diff --git a/src/game/behaviors/water_bomb.inc.c b/src/game/behaviors/water_bomb.inc.c index b4383672..2321ff6a 100644 --- a/src/game/behaviors/water_bomb.inc.c +++ b/src/game/behaviors/water_bomb.inc.c @@ -29,14 +29,10 @@ static struct ObjectHitbox sWaterBombHitbox = { * Spawn water bombs targeting mario when he comes in range. */ void bhv_water_bomb_spawner_update(void) { - f32 latDistToMario; - f32 spawnerRadius; - - spawnerRadius = 50 * (u16)(o->oBehParams >> 16) + 200.0f; - latDistToMario = lateral_dist_between_objects(o, gMarioObject); + f32 spawnerRadius = 50 * (u16)(o->oBehParams >> 16) + 200.0f; // When mario is in range and a water bomb isn't already active - if (!o->oWaterBombSpawnerBombActive && latDistToMario < spawnerRadius + if (!o->oWaterBombSpawnerBombActive && lateral_dist_between_objects_squared(o, gMarioObject) < sqr(spawnerRadius) && gMarioObject->oPosY - o->oPosY < 1000.0f) { if (o->oWaterBombSpawnerTimeToSpawn != 0) { o->oWaterBombSpawnerTimeToSpawn--; diff --git a/src/game/camera.c b/src/game/camera.c index d63beb0e..14c67381 100644 --- a/src/game/camera.c +++ b/src/game/camera.c @@ -1997,10 +1997,10 @@ s16 update_default_camera(struct Camera *c) { nextYawVel = 0; } sYawSpeed = 0x400; - vec3f_get_lateral_dist(sMarioCamState->pos, c->pos, &xzDist); + vec3f_get_lateral_dist_squared(sMarioCamState->pos, c->pos, &xzDist); if (sStatusFlags & CAM_FLAG_BEHIND_MARIO_POST_DOOR) { - if (xzDist >= 250) { + if (xzDist >= sqr(250.0f)) { sStatusFlags &= ~CAM_FLAG_BEHIND_MARIO_POST_DOOR; } if (ABS((sMarioCamState->faceAngle[1] - yaw) / 2) < 0x1800) { @@ -2009,7 +2009,8 @@ s16 update_default_camera(struct Camera *c) { dist = 800.f; sStatusFlags |= CAM_FLAG_BLOCK_SMOOTH_MOVEMENT; } - } else if (xzDist < 250) { + } else if (xzDist < sqr(250.0f)) { + xzDist = sqrtf(xzDist); // Turn rapidly if very close to Mario c->pos[0] += (250 - xzDist) * sins(yaw); c->pos[2] += (250 - xzDist) * coss(yaw); @@ -6081,7 +6082,7 @@ s32 rotate_camera_around_walls(UNUSED struct Camera *c, Vec3f cPos, s16 *avoidYa if ((is_range_behind_surface(sMarioCamState->pos, cPos, wall, yawRange, SURFACE_WALL_MISC) == 0) && (is_behind_surface(sMarioCamState->pos, wall) == TRUE) // Also check if the wall is tall enough to cover Mario - && (is_surf_within_bounding_box(wall, -1.f, 150.f, -1.f) == FALSE)) { + && (!is_surf_within_bounding_box(wall, -1.f, 150.f, -1.f))) { // Calculate the avoid direction. The function returns the opposite direction so add 180 // degrees. *avoidYaw = calc_avoid_yaw(yawFromMario, wallYaw) + DEGREES(180); diff --git a/src/game/game_init.c b/src/game/game_init.c index 344c2e74..a070efbb 100644 --- a/src/game/game_init.c +++ b/src/game/game_init.c @@ -8,6 +8,7 @@ #include "buffers/framebuffers.h" #include "buffers/zbuffer.h" #include "engine/level_script.h" +#include "engine/math_util.h" #include "game_init.h" #include "main.h" #include "memory.h" @@ -535,25 +536,13 @@ void adjust_analog_stick(struct Controller *controller) { controller->stickY = 0; // Modulate the rawStickX and rawStickY to be the new f32 values by adding/subtracting 6. - if (controller->rawStickX <= -8) { - controller->stickX = controller->rawStickX + 6; - } - - if (controller->rawStickX >= 8) { - controller->stickX = controller->rawStickX - 6; - } - - if (controller->rawStickY <= -8) { - controller->stickY = controller->rawStickY + 6; - } - - if (controller->rawStickY >= 8) { - controller->stickY = controller->rawStickY - 6; - } + if (controller->rawStickX <= -8) controller->stickX = controller->rawStickX + 6; + if (controller->rawStickX >= 8) controller->stickX = controller->rawStickX - 6; + if (controller->rawStickY <= -8) controller->stickY = controller->rawStickY + 6; + if (controller->rawStickY >= 8) controller->stickY = controller->rawStickY - 6; // Calculate f32 magnitude from the center by vector length. - controller->stickMag = - sqrtf(controller->stickX * controller->stickX + controller->stickY * controller->stickY); + controller->stickMag = sqrtf(sqr(controller->stickX) + sqr(controller->stickY)); // Magnitude cannot exceed 64.0f: if it does, modify the values // appropriately to flatten the values down to the allowed maximum value. @@ -595,28 +584,27 @@ void read_controller_inputs(s32 threadID) { // 0.5x A presses are a good meme controller->buttonDown = controller->controllerData->button; adjust_analog_stick(controller); - } else // otherwise, if the controllerData is NULL, 0 out all of the inputs. - { - controller->rawStickX = 0; - controller->rawStickY = 0; + } else { // otherwise, if the controllerData is NULL, 0 out all of the inputs. + controller->rawStickX = 0; + controller->rawStickY = 0; controller->buttonPressed = 0; - controller->buttonDown = 0; - controller->stickX = 0; - controller->stickY = 0; - controller->stickMag = 0; + controller->buttonDown = 0; + controller->stickX = 0; + controller->stickY = 0; + controller->stickMag = 0; } } // For some reason, player 1's inputs are copied to player 3's port. // This potentially may have been a way the developers "recorded" // the inputs for demos, despite record_demo existing. - gPlayer3Controller->rawStickX = gPlayer1Controller->rawStickX; - gPlayer3Controller->rawStickY = gPlayer1Controller->rawStickY; - gPlayer3Controller->stickX = gPlayer1Controller->stickX; - gPlayer3Controller->stickY = gPlayer1Controller->stickY; - gPlayer3Controller->stickMag = gPlayer1Controller->stickMag; + gPlayer3Controller->rawStickX = gPlayer1Controller->rawStickX; + gPlayer3Controller->rawStickY = gPlayer1Controller->rawStickY; + gPlayer3Controller->stickX = gPlayer1Controller->stickX; + gPlayer3Controller->stickY = gPlayer1Controller->stickY; + gPlayer3Controller->stickMag = gPlayer1Controller->stickMag; gPlayer3Controller->buttonPressed = gPlayer1Controller->buttonPressed; - gPlayer3Controller->buttonDown = gPlayer1Controller->buttonDown; + gPlayer3Controller->buttonDown = gPlayer1Controller->buttonDown; } /** diff --git a/src/game/geo_misc.h b/src/game/geo_misc.h index 904633af..f2a97c2a 100644 --- a/src/game/geo_misc.h +++ b/src/game/geo_misc.h @@ -23,10 +23,10 @@ extern void make_vertex( ); #endif extern s16 round_float(f32); -extern Gfx *geo_exec_inside_castle_light(s32 callContext, struct GraphNode *node, UNUSED f32 mtx[4][4]); -extern Gfx *geo_exec_flying_carpet_timer_update(s32 callContext, struct GraphNode *node, UNUSED f32 mtx[4][4]); -extern Gfx *geo_exec_flying_carpet_create(s32 callContext, struct GraphNode *node, UNUSED f32 mtx[4][4]); -extern Gfx *geo_exec_cake_end_screen(s32 callContext, struct GraphNode *node, UNUSED f32 mtx[4][4]); +extern Gfx *geo_exec_inside_castle_light(s32 callContext, struct GraphNode *node, UNUSED Mat4 mtx); +extern Gfx *geo_exec_flying_carpet_timer_update(s32 callContext, struct GraphNode *node, UNUSED Mat4 mtx); +extern Gfx *geo_exec_flying_carpet_create(s32 callContext, struct GraphNode *node, UNUSED Mat4 mtx); +extern Gfx *geo_exec_cake_end_screen(s32 callContext, struct GraphNode *node, UNUSED Mat4 mtx); #define gLoadBlockTexture(dl, width, height, format, image) \ { \ diff --git a/src/game/interaction.c b/src/game/interaction.c index 78f9c941..8a5ff3a1 100644 --- a/src/game/interaction.c +++ b/src/game/interaction.c @@ -476,12 +476,12 @@ u32 bully_knock_back_mario(struct MarioState *mario) { marioDYaw = newMarioYaw - mario->faceAngle[1]; mario->faceAngle[1] = newMarioYaw; - mario->forwardVel = sqrtf(marioData.velX * marioData.velX + marioData.velZ * marioData.velZ); + mario->forwardVel = sqrtf(sqr(marioData.velX) + sqr(marioData.velZ)); mario->pos[0] = marioData.posX; mario->pos[2] = marioData.posZ; bully->oMoveAngleYaw = newBullyYaw; - bully->oForwardVel = sqrtf(bullyData.velX * bullyData.velX + bullyData.velZ * bullyData.velZ); + bully->oForwardVel = sqrtf(sqr(bullyData.velX) + sqr(bullyData.velZ)); bully->oPosX = bullyData.posX; bully->oPosZ = bullyData.posZ; @@ -611,9 +611,9 @@ void push_mario_out_of_object(struct MarioState *m, struct Object *obj, f32 padd f32 offsetX = m->pos[0] - obj->oPosX; f32 offsetZ = m->pos[2] - obj->oPosZ; - f32 distance = sqrtf(offsetX * offsetX + offsetZ * offsetZ); + f32 distance = (sqr(offsetX) + sqr(offsetZ)); - if (distance < minDistance) { + if (distance < sqr(minDistance)) { struct Surface *floor; s16 pushAngle; f32 newMarioX; @@ -662,8 +662,8 @@ void bounce_back_from_attack(struct MarioState *m, u32 interaction) { } u32 should_push_or_pull_door(struct MarioState *m, struct Object *obj) { - f32 dx = obj->oPosX - m->pos[0]; - f32 dz = obj->oPosZ - m->pos[2]; + f32 dx = (obj->oPosX - m->pos[0]); + f32 dz = (obj->oPosZ - m->pos[2]); s16 dYaw = abs_angle_diff(obj->oMoveAngleYaw, atan2s(dz, dx)); return (dYaw <= 0x4000) ? WARP_FLAG_DOOR_PULLED : WARP_FLAG_DOOR_FLIP_MARIO; } @@ -1226,9 +1226,7 @@ u32 interact_bully(struct MarioState *m, UNUSED u32 interactType, struct Object attack_object(obj, interaction); bounce_back_from_attack(m, interaction); return TRUE; - } - - else if (!sInvulnerable && !(m->flags & MARIO_VANISH_CAP) + } else if (!sInvulnerable && !(m->flags & MARIO_VANISH_CAP) && !(obj->oInteractionSubtype & INT_SUBTYPE_DELAY_INVINCIBILITY)) { obj->oInteractStatus = INT_STATUS_INTERACTED; m->invincTimer = 2; diff --git a/src/game/mario.c b/src/game/mario.c index 2afe2f0a..3c4727ee 100644 --- a/src/game/mario.c +++ b/src/game/mario.c @@ -1192,8 +1192,7 @@ void debug_print_speed_action_normal(struct MarioState *m) { f32 floor_nY; if (gShowDebugText) { - steepness = sqrtf( - ((m->floor->normal.x * m->floor->normal.x) + (m->floor->normal.z * m->floor->normal.z))); + steepness = sqrtf(sqr(m->floor->normal.x) + sqr(m->floor->normal.z)); floor_nY = m->floor->normal.y; print_text_fmt_int(210, 88, "ANG %d", (atan2s(floor_nY, steepness) * 180.0f) / 32768.0f); diff --git a/src/game/mario_actions_airborne.c b/src/game/mario_actions_airborne.c index 2ee09de5..897b4480 100644 --- a/src/game/mario_actions_airborne.c +++ b/src/game/mario_actions_airborne.c @@ -156,21 +156,18 @@ s32 check_fall_damage_or_get_stuck(struct MarioState *m, u32 hardFallAction) { } s32 check_horizontal_wind(struct MarioState *m) { - struct Surface *floor; - f32 speed; - s16 pushAngle; - - floor = m->floor; + struct Surface *floor = m->floor; if (floor->type == SURFACE_HORIZONTAL_WIND) { - pushAngle = floor->force << 8; + s16 pushAngle = floor->force << 8; m->slideVelX += 1.2f * sins(pushAngle); m->slideVelZ += 1.2f * coss(pushAngle); - speed = sqrtf(m->slideVelX * m->slideVelX + m->slideVelZ * m->slideVelZ); + f32 speed = (sqr(m->slideVelX) + sqr(m->slideVelZ)); - if (speed > 48.0f) { + if (speed > sqr(48.0f)) { + speed = sqrtf(speed); m->slideVelX = m->slideVelX * 48.0f / speed; m->slideVelZ = m->slideVelZ * 48.0f / speed; speed = 48.0f; diff --git a/src/game/mario_actions_cutscene.c b/src/game/mario_actions_cutscene.c index 8a5ff6c5..906894c5 100644 --- a/src/game/mario_actions_cutscene.c +++ b/src/game/mario_actions_cutscene.c @@ -1292,19 +1292,18 @@ s32 act_spawn_no_spin_landing(struct MarioState *m) { s32 act_bbh_enter_spin(struct MarioState *m) { f32 floorDist; f32 scale; - f32 cageDX; - f32 cageDZ; + f32 cageDX, cageDZ; f32 cageDist; f32 forwardVel; cageDX = m->usedObj->oPosX - m->pos[0]; cageDZ = m->usedObj->oPosZ - m->pos[2]; - cageDist = sqrtf(cageDX * cageDX + cageDZ * cageDZ); + cageDist = (sqr(cageDX) + sqr(cageDZ)); - if (cageDist > 20.0f) { + if (cageDist > sqr(20.0f)) { forwardVel = 10.0f; } else { - forwardVel = cageDist / 2.0f; + forwardVel = sqrtf(cageDist) / 2.0f; } if (forwardVel < 0.5f) { forwardVel = 0.0f; @@ -1374,8 +1373,7 @@ s32 act_bbh_enter_spin(struct MarioState *m) { } s32 act_bbh_enter_jump(struct MarioState *m) { - f32 cageDX; - f32 cageDZ; + f32 cageDX, cageDZ; f32 cageDist; play_mario_action_sound( @@ -1385,7 +1383,7 @@ s32 act_bbh_enter_jump(struct MarioState *m) { if (m->actionState == 0) { cageDX = m->usedObj->oPosX - m->pos[0]; cageDZ = m->usedObj->oPosZ - m->pos[2]; - cageDist = sqrtf(cageDX * cageDX + cageDZ * cageDZ); + cageDist = sqrtf(sqr(cageDX) + sqr(cageDZ)); m->vel[1] = 60.0f; m->faceAngle[1] = atan2s(cageDZ, cageDX); @@ -1914,7 +1912,7 @@ static s32 jumbo_star_cutscene_flying(struct MarioState *m) { targetDX = targetPos[0] - m->pos[0]; targetDY = targetPos[1] - m->pos[1]; targetDZ = targetPos[2] - m->pos[2]; - targetHyp = sqrtf(targetDX * targetDX + targetDZ * targetDZ); + targetHyp = sqrtf(sqr(targetDX) + sqr(targetDZ)); targetAngle = atan2s(targetDZ, targetDX); vec3f_copy(m->pos, targetPos); diff --git a/src/game/mario_actions_moving.c b/src/game/mario_actions_moving.c index 74a03ea5..d5897fd5 100644 --- a/src/game/mario_actions_moving.c +++ b/src/game/mario_actions_moving.c @@ -171,7 +171,7 @@ s32 set_triple_jump_action(struct MarioState *m, UNUSED u32 action, UNUSED u32 a void update_sliding_angle(struct MarioState *m, f32 accel, f32 lossFactor) { struct Surface *floor = m->floor; s16 slopeAngle = atan2s(floor->normal.z, floor->normal.x); - f32 steepness = sqrtf(floor->normal.x * floor->normal.x + floor->normal.z * floor->normal.z); + f32 steepness = sqrtf(sqr(floor->normal.x) + sqr(floor->normal.z)); m->slideVelX += accel * steepness * sins(slopeAngle); m->slideVelZ += accel * steepness * coss(slopeAngle); @@ -301,18 +301,10 @@ void apply_slope_accel(struct MarioState *m) { } switch (slopeClass) { - case SURFACE_CLASS_VERY_SLIPPERY: - slopeAccel = 5.3f; - break; - case SURFACE_CLASS_SLIPPERY: - slopeAccel = 2.7f; - break; - default: - slopeAccel = 1.7f; - break; - case SURFACE_CLASS_NOT_SLIPPERY: - slopeAccel = 0.0f; - break; + case SURFACE_CLASS_VERY_SLIPPERY: slopeAccel = 5.3f; break; + case SURFACE_CLASS_SLIPPERY: slopeAccel = 2.7f; break; + default: slopeAccel = 1.7f; break; + case SURFACE_CLASS_NOT_SLIPPERY: slopeAccel = 0.0f; break; } if (floorDYaw > -0x4000 && floorDYaw < 0x4000) { @@ -1418,7 +1410,7 @@ void common_slide_action(struct MarioState *m, u32 endAction, u32 airAction, s32 slide_bonk(m, ACT_GROUND_BONK, endAction); } else if (m->wall != NULL) { s16 wallAngle = atan2s(m->wall->normal.z, m->wall->normal.x); - f32 slideSpeed = sqrtf(m->slideVelX * m->slideVelX + m->slideVelZ * m->slideVelZ); + f32 slideSpeed = sqrtf(sqr(m->slideVelX) + sqr(m->slideVelZ)); if ((slideSpeed *= 0.9f) < 4.0f) { slideSpeed = 4.0f; diff --git a/src/game/mario_actions_submerged.c b/src/game/mario_actions_submerged.c index 583de0b3..712d47da 100644 --- a/src/game/mario_actions_submerged.c +++ b/src/game/mario_actions_submerged.c @@ -137,7 +137,7 @@ static void apply_water_current(struct MarioState *m, Vec3f step) { f32 dz = whirlpool->pos[2] - m->pos[2]; f32 lateralDist = sqrtf(sqr(dx) + sqr(dz)); - f32 distance = sqrtf(lateralDist * lateralDist + sqr(dy)); + f32 distance = sqrtf(sqr(lateralDist) + sqr(dy)); s16 pitchToWhirlpool = atan2s(lateralDist, dy); s16 yawToWhirlpool = atan2s(dz, dx); diff --git a/src/game/mario_step.c b/src/game/mario_step.c index 5bc69cf2..6315a197 100644 --- a/src/game/mario_step.c +++ b/src/game/mario_step.c @@ -646,7 +646,7 @@ void apply_vertical_wind(struct MarioState *m) { s32 perform_air_step(struct MarioState *m, u32 stepArg) { // s16 wallDYaw; Vec3f intendedPos; - const f32 numSteps = 4.0f; /* max(4.0f, (s32)(sqrtf(m->vel[0] * m->vel[0] + m->vel[1] * m->vel[1] + m->vel[2] * m->vel[2]) / 50.0f));*/ + const f32 numSteps = 4.0f; /* max(4.0f, (s32)(sqrtf(sqr(m->vel[0]) + sqr(m->vel[1]) + sqr(m->vel[2])) / 50.0f));*/ s32 i; s32 quarterStepResult; s32 stepResult = AIR_STEP_NONE; diff --git a/src/game/obj_behaviors.c b/src/game/obj_behaviors.c index a9cbefe4..732dc2bd 100644 --- a/src/game/obj_behaviors.c +++ b/src/game/obj_behaviors.c @@ -296,7 +296,7 @@ void calc_new_obj_vel_and_pos_y(struct Surface *objFloor, f32 objFloorY, f32 obj } calc_obj_friction(&objFriction, floor_nY); - o->oForwardVel = sqrtf(objVelX * objVelX + objVelZ * objVelZ) * objFriction; + o->oForwardVel = sqrtf(sqr(objVelX) + sqr(objVelZ)) * objFriction; } } @@ -628,18 +628,9 @@ s8 current_mario_room_check(s16 room) { // Since object surfaces have room 0, this tests if the surface is an // object first and uses the last room if so. if (gMarioCurrentRoom == 0) { - if (room == sPrevCheckMarioRoom) { - return TRUE; - } else { - return FALSE; - } + return (room == sPrevCheckMarioRoom); } else { - if (room == gMarioCurrentRoom) { - result = TRUE; - } else { - result = FALSE; - } - + result = (room == gMarioCurrentRoom); sPrevCheckMarioRoom = gMarioCurrentRoom; } diff --git a/src/game/obj_behaviors_2.c b/src/game/obj_behaviors_2.c index 2af73438..00fcd91d 100644 --- a/src/game/obj_behaviors_2.c +++ b/src/game/obj_behaviors_2.c @@ -49,9 +49,9 @@ //! TODO: remove static -#define POS_OP_SAVE_POSITION 0 -#define POS_OP_COMPUTE_VELOCITY 1 -#define POS_OP_RESTORE_POSITION 2 +#define POS_OP_SAVE_POSITION 0x0 +#define POS_OP_COMPUTE_VELOCITY 0x1 +#define POS_OP_RESTORE_POSITION 0x2 /* BSS (declared to force order) */ extern s32 sNumActiveFirePiranhaPlants; @@ -185,9 +185,7 @@ static void platform_on_track_update_pos_or_spawn_ball(s32 ballIndex, f32 x, f32 MODEL_TRAJECTORY_MARKER_BALL, bhvTrackBall); if (trackBall != NULL) { - trackBall->oPosX = x; - trackBall->oPosY = y; - trackBall->oPosZ = z; + vec3_set(&trackBall->oPosVec, x, y, z); } } else { if (prevWaypoint != initialPrevWaypoint) { @@ -225,7 +223,7 @@ static void cur_obj_spin_all_dimensions(f32 pitchSpeed, f32 rollSpeed) { if (o->oFaceAngleRoll < 0) { roll = -rollSpeed; } else if (o->oFaceAngleRoll > 0) { - roll = rollSpeed; + roll = rollSpeed; } } @@ -265,11 +263,11 @@ static s16 obj_get_pitch_to_home(f32 latDistToHome) { } static void obj_compute_vel_from_move_pitch(f32 speed) { - o->oForwardVel = speed * coss(o->oMoveAnglePitch); - o->oVelY = speed * -sins(o->oMoveAnglePitch); + o->oForwardVel = speed * coss(o->oMoveAnglePitch); + o->oVelY = speed * -sins(o->oMoveAnglePitch); } -static s32 clamp_s16(s16 *value, s16 minimum, s16 maximum) { +static s32 clamp_s16(s16 *value, s16 minimum, s16 maximum) { // move to math_util? if (*value <= minimum) { *value = minimum; } else if (*value >= maximum) { @@ -280,7 +278,7 @@ static s32 clamp_s16(s16 *value, s16 minimum, s16 maximum) { return TRUE; } -static s32 clamp_f32(f32 *value, f32 minimum, f32 maximum) { +static s32 clamp_f32(f32 *value, f32 minimum, f32 maximum) { // move to math_util? if (*value <= minimum) { *value = minimum; } else if (*value >= maximum) { @@ -343,9 +341,7 @@ static s32 approach_f32_ptr(f32 *px, f32 target, f32 delta) { if (*px > target) { delta = -delta; } - *px += delta; - if ((*px - target) * delta >= 0) { *px = target; return TRUE; @@ -439,8 +435,7 @@ static s32 obj_grow_then_shrink(f32 *scaleVel, f32 shootFireScale, f32 endScale) return 0; } -static s32 oscillate_toward(s32 *value, f32 *vel, s32 target, f32 velCloseToZero, f32 accel, - f32 slowdown) { +static s32 oscillate_toward(s32 *value, f32 *vel, s32 target, f32 velCloseToZero, f32 accel, f32 slowdown) { s32 startValue = *value; *value += (s32) *vel; @@ -786,21 +781,18 @@ static s32 obj_move_for_one_second(s32 endAction) { * with partial updates. */ static void treat_far_home_as_mario(f32 threshold) { - f32 dx = o->oHomeX - o->oPosX; - f32 dy = o->oHomeY - o->oPosY; - f32 dz = o->oHomeZ - o->oPosZ; - f32 distance = sqrtf(sqr(dx) + sqr(dy) + sqr(dz)); + Vec3f d; + vec3_diff(d, &o->oHomeVec, &o->oPosVec); + f32 distance = vec3_sumsq(d); - if (distance > threshold) { - o->oAngleToMario = atan2s(dz, dx); + if (distance > sqr(threshold)) { + o->oAngleToMario = atan2s(d[2], d[0]); o->oDistanceToMario = 25000.0f; } else { - dx = o->oHomeX - gMarioObject->oPosX; - dy = o->oHomeY - gMarioObject->oPosY; - dz = o->oHomeZ - gMarioObject->oPosZ; - distance = sqrtf(sqr(dx) + sqr(dy) + sqr(dz)); + vec3_diff(d, &o->oHomeVec, &gMarioObject->oPosVec); + distance = vec3_sumsq(d); - if (distance > threshold) { + if (distance > sqr(threshold)) { o->oDistanceToMario = 20000.0f; } } diff --git a/src/game/object_collision.c b/src/game/object_collision.c index 6b765fe4..22cdb86f 100644 --- a/src/game/object_collision.c +++ b/src/game/object_collision.c @@ -28,9 +28,9 @@ s32 detect_object_hitbox_overlap(struct Object *a, struct Object *b) { f32 dx = a->oPosX - b->oPosX; f32 dz = a->oPosZ - b->oPosZ; f32 collisionRadius = a->hitboxRadius + b->hitboxRadius; - f32 distance = sqrtf(sqr(dx) + sqr(dz)); + f32 distance = (sqr(dx) + sqr(dz)); - if (collisionRadius > distance) { + if (sqr(collisionRadius) > distance) { f32 dya_top = a->hitboxHeight + dya_bottom; f32 dyb_top = b->hitboxHeight + dyb_bottom; @@ -56,13 +56,13 @@ s32 detect_object_hurtbox_overlap(struct Object *a, struct Object *b) { f32 dx = a->oPosX - b->oPosX; f32 dz = a->oPosZ - b->oPosZ; f32 collisionRadius = a->hurtboxRadius + b->hurtboxRadius; - f32 distance = sqrtf(sqr(dx) + sqr(dz)); + f32 distance = (sqr(dx) + sqr(dz)); if (a == gMarioObject) { b->oInteractionSubtype |= INT_SUBTYPE_DELAY_INVINCIBILITY; } - if (collisionRadius > distance) { + if (sqr(collisionRadius) > distance) { f32 dya_top = a->hitboxHeight + dya_bottom; f32 dyb_top = b->hurtboxHeight + dyb_bottom; diff --git a/src/game/object_helpers.c b/src/game/object_helpers.c index e19e7f6c..4cad77fd 100644 --- a/src/game/object_helpers.c +++ b/src/game/object_helpers.c @@ -242,12 +242,26 @@ f32 lateral_dist_between_objects(struct Object *obj1, struct Object *obj2) { return lateralDist; } +// Same as above, but doesn't do sqrtf. +f32 lateral_dist_between_objects_squared(struct Object *obj1, struct Object *obj2) { + register f32 dx = obj2->oPosX - obj1->oPosX; + register f32 dz = obj2->oPosZ - obj1->oPosZ; + return (sqr(dx) + sqr(dz)); +} + f32 dist_between_objects(struct Object *obj1, struct Object *obj2) { f32 dist; vec3f_get_dist(&obj1->oPosVec, &obj2->oPosVec, &dist); return dist; } +// Same as above, but doesn't do sqrtf. +f32 dist_between_objects_squared(struct Object *obj1, struct Object *obj2) { + register Vec3f d; + vec3_diff(d, &obj2->oPosVec, &obj1->oPosVec); + return vec3_sumsq(d); +} + void cur_obj_forward_vel_approach_upward(f32 target, f32 increment) { if (o->oForwardVel >= target) { o->oForwardVel = target; @@ -269,7 +283,7 @@ s16 obj_angle_to_object(struct Object *obj1, struct Object *obj2) { s16 obj_turn_toward_object(struct Object *obj, struct Object *target, s16 angleIndex, s16 turnAmount) { f32 a, b, c, d; - s16 targetAngle = 0; + s16 targetAngle = 0x0; s16 startAngle; switch (angleIndex) { @@ -667,17 +681,15 @@ f32 cur_obj_dist_to_nearest_object_with_behavior(const BehaviorScript *behavior) struct Object *cur_obj_find_nearest_object_with_behavior(const BehaviorScript *behavior, f32 *dist) { uintptr_t *behaviorAddr = segmented_to_virtual(behavior); struct Object *closestObj = NULL; - struct Object *obj; - struct ObjectNode *listHead; - f32 minDist = 0x20000; + f32 minDist = F32_MAX; - listHead = &gObjectLists[get_object_list_from_behavior(behaviorAddr)]; - obj = (struct Object *) listHead->next; + struct ObjectNode *listHead = &gObjectLists[get_object_list_from_behavior(behaviorAddr)]; + struct Object *obj = (struct Object *) listHead->next; while (obj != (struct Object *) listHead) { if (obj->behavior == behaviorAddr) { if (obj->activeFlags != ACTIVE_FLAG_DEACTIVATED && obj != o) { - f32 objDist = dist_between_objects(o, obj); + f32 objDist = dist_between_objects_squared(o, obj); if (objDist < minDist) { closestObj = obj; minDist = objDist; @@ -686,8 +698,11 @@ struct Object *cur_obj_find_nearest_object_with_behavior(const BehaviorScript *b } obj = (struct Object *) obj->header.next; } - - *dist = minDist; + if (minDist == F32_MAX) { + *dist = F32_MAX; + } else { + *dist = sqrtf(minDist); + } return closestObj; } @@ -748,7 +763,7 @@ struct Object *cur_obj_find_nearby_held_actor(const BehaviorScript *behavior, f3 // This includes the dropped and thrown states. By combining instant // release, this allows us to activate mama penguin remotely if (obj->oHeldState != HELD_FREE) { - if (dist_between_objects(o, obj) < maxDist) { + if (dist_between_objects_squared(o, obj) < sqr(maxDist)) { foundObj = obj; break; } @@ -1038,7 +1053,7 @@ static s32 cur_obj_move_xz(f32 steepSlopeNormalY, s32 careAboutEdgesAndSteepSlop } static void cur_obj_move_update_underwater_flags(void) { - f32 decelY = (f32)(sqrtf(o->oVelY * o->oVelY) * (o->oDragStrength * 7.0f)) / 100.0L; + f32 decelY = (f32)(ABSF(o->oVelY) * (o->oDragStrength * 7.0f)) / 100.0L; if (o->oVelY > 0) { o->oVelY -= decelY; @@ -1178,7 +1193,6 @@ void cur_obj_move_y_with_terminal_vel(void) { if (o->oVelY < -70.0f) { o->oVelY = -70.0f; } - o->oPosY += o->oVelY; } @@ -1211,7 +1225,6 @@ s32 obj_check_if_collided_with_object(struct Object *obj1, struct Object *obj2) return TRUE; } } - return FALSE; } @@ -1231,10 +1244,10 @@ s32 obj_has_behavior(struct Object *obj, const BehaviorScript *behavior) { return (obj->behavior == segmented_to_virtual(behavior)); } -f32 cur_obj_lateral_dist_from_mario_to_home(void) { +Bool32 cur_obj_lateral_dist_from_mario_to_home_is_in_range(f32 dist) { f32 dx = o->oHomeX - gMarioObject->oPosX; f32 dz = o->oHomeZ - gMarioObject->oPosZ; - return sqrtf(sqr(dx) + sqr(dz)); + return ((sqr(dx) + sqr(dz)) < sqr(dist)); } f32 cur_obj_lateral_dist_to_home(void) { @@ -1243,6 +1256,12 @@ f32 cur_obj_lateral_dist_to_home(void) { return sqrtf(sqr(dx) + sqr(dz)); } +Bool32 cur_obj_lateral_dist_to_home_is_in_range(f32 dist) { + f32 dx = o->oHomeX - o->oPosX; + f32 dz = o->oHomeZ - o->oPosZ; + return ((sqr(dx) + sqr(dz)) < sqr(dist)); +} + s32 cur_obj_outside_home_square(f32 halfLength) { if (o->oHomeX - halfLength > o->oPosX) return TRUE; if (o->oHomeX + halfLength < o->oPosX) return TRUE; @@ -1286,13 +1305,6 @@ void cur_obj_start_cam_event(UNUSED struct Object *obj, s32 cameraEvent) { gSecondCameraFocus = o; } -// unused, self explanatory, maybe oInteractStatus originally had TRUE/FALSE statements -void set_mario_interact_true_if_in_range(UNUSED s32 arg0, UNUSED s32 arg1, f32 range) { - if (o->oDistanceToMario < range) { - gMarioObject->oInteractStatus = TRUE; - } -} - void obj_set_billboard(struct Object *obj) { obj->header.gfx.node.flags |= GRAPH_RENDER_BILLBOARD; } @@ -1664,9 +1676,8 @@ s32 cur_obj_follow_path(UNUSED s32 unusedArg) { struct Waypoint *startWaypoint; struct Waypoint *lastWaypoint; struct Waypoint *targetWaypoint; - f32 prevToNextX, prevToNextY, prevToNextZ; + Vec3f prevToNext, objToNext; f32 objToNextXZ; - f32 objToNextX, objToNextY, objToNextZ; if (o->oPathedPrevWaypointFlags == 0) { o->oPathedPrevWaypoint = o->oPathedStartWaypoint; @@ -1683,21 +1694,16 @@ s32 cur_obj_follow_path(UNUSED s32 unusedArg) { } o->oPathedPrevWaypointFlags = lastWaypoint->flags | WAYPOINT_FLAGS_INITIALIZED; + vec3_diff(prevToNext, targetWaypoint->pos, lastWaypoint->pos); + vec3_diff(objToNext, targetWaypoint->pos, &o->oPosVec); - prevToNextX = targetWaypoint->pos[0] - lastWaypoint->pos[0]; - prevToNextY = targetWaypoint->pos[1] - lastWaypoint->pos[1]; - prevToNextZ = targetWaypoint->pos[2] - lastWaypoint->pos[2]; + objToNextXZ = sqrtf(sqr(objToNext[0]) + sqr(objToNext[2])); - objToNextX = targetWaypoint->pos[0] - o->oPosX; - objToNextY = targetWaypoint->pos[1] - o->oPosY; - objToNextZ = targetWaypoint->pos[2] - o->oPosZ; - objToNextXZ = sqrtf(sqr(objToNextX) + sqr(objToNextZ)); - - o->oPathedTargetYaw = atan2s(objToNextZ, objToNextX); - o->oPathedTargetPitch = atan2s(objToNextXZ, -objToNextY); + o->oPathedTargetYaw = atan2s(objToNext[2], objToNext[0]); + o->oPathedTargetPitch = atan2s(objToNextXZ, -objToNext[1]); // If dot(prevToNext, objToNext) <= 0 (i.e. reached other side of target waypoint) - if (prevToNextX * objToNextX + prevToNextY * objToNextY + prevToNextZ * objToNextZ <= 0.0f) { + if (vec3_dot(prevToNext, objToNext) <= 0.0f) { o->oPathedPrevWaypoint = targetWaypoint; if ((targetWaypoint + 1)->flags == WAYPOINT_FLAGS_END) { return PATH_REACHED_END; @@ -1832,12 +1838,7 @@ s32 cur_obj_wait_then_blink(s32 timeUntilBlinking, s32 numBlinks) { } s32 cur_obj_is_mario_ground_pounding_platform(void) { - if (gMarioObject->platform == o) { - if (gMarioStates[0].action == ACT_GROUND_POUND_LAND) { - return TRUE; - } - } - return FALSE; + return ((gMarioObject->platform == o) && (gMarioStates[0].action == ACT_GROUND_POUND_LAND)); } void spawn_mist_particles(void) { @@ -1855,6 +1856,7 @@ void cur_obj_push_mario_away(f32 radius) { f32 marioDist = (sqr(marioRelX) + sqr(marioRelZ)); if (marioDist < sqr(radius)) { + marioDist = sqrtf(marioDist); //! If this function pushes Mario out of bounds, it will trigger Mario's // oob failsafe gMarioStates[0].pos[0] += (radius - marioDist) / radius * marioRelX; @@ -1876,11 +1878,9 @@ void cur_obj_push_mario_away_from_cylinder(f32 radius, f32 extentY) { void bhv_dust_smoke_loop(void) { vec3_add(&o->oPosVec, &o->oVelVec); - if (o->oSmokeTimer == 10) { obj_mark_for_deletion(o); } - o->oSmokeTimer++; } @@ -1970,23 +1970,11 @@ s32 cur_obj_mario_far_away(void) { f32 dz = o->oHomeZ - gMarioObject->oPosZ; f32 marioDistToHome = sqrtf(sqr(dx) + sqr(dy) + sqr(dz)); - if (o->oDistanceToMario > 2000.0f && marioDistToHome > 2000.0f) { - return TRUE; - } else { - return FALSE; - } + return (o->oDistanceToMario > 2000.0f && marioDistToHome > 2000.0f); } s32 is_mario_moving_fast_or_in_air(s32 speedThreshold) { - if (gMarioStates[0].forwardVel > speedThreshold) { - return TRUE; - } - - if (gMarioStates[0].action & ACT_FLAG_AIR) { - return TRUE; - } else { - return FALSE; - } + return ((gMarioStates[0].forwardVel > speedThreshold) || (gMarioStates[0].action & ACT_FLAG_AIR)); } s32 is_item_in_array(s8 item, s8 *array) { @@ -1994,10 +1982,8 @@ s32 is_item_in_array(s8 item, s8 *array) { if (*array == item) { return TRUE; } - array++; } - return FALSE; } @@ -2133,11 +2119,7 @@ Gfx *geo_offset_klepto_debug(s32 callContext, struct GraphNode *node, UNUSED s32 } s32 obj_is_hidden(struct Object *obj) { - if (obj->header.gfx.node.flags & GRAPH_RENDER_INVISIBLE) { - return TRUE; - } else { - return FALSE; - } + return (obj->header.gfx.node.flags & GRAPH_RENDER_INVISIBLE); } void enable_time_stop(void) { @@ -2159,7 +2141,7 @@ void clear_time_stop_flags(s32 flags) { s32 cur_obj_can_mario_activate_textbox(f32 radius, f32 height, UNUSED s32 unused) { if (o->oDistanceToMario < 1500.0f) { if (o->oPosY < gMarioObject->oPosY + 160.0f && gMarioObject->oPosY < o->oPosY + height && !(gMarioStates[0].action & ACT_FLAG_AIR) - && lateral_dist_between_objects(o, gMarioObject) < radius && mario_ready_to_speak()) { + && lateral_dist_between_objects_squared(o, gMarioObject) < sqr(radius) && mario_ready_to_speak()) { return TRUE; } } @@ -2328,11 +2310,7 @@ s32 cur_obj_update_dialog_with_cutscene(s32 actionArg, s32 dialogFlags, s32 cuts } s32 cur_obj_has_model(u16 modelID) { - if (o->header.gfx.sharedChild == gLoadedGraphNodes[modelID]) { - return TRUE; - } else { - return FALSE; - } + return (o->header.gfx.sharedChild == gLoadedGraphNodes[modelID]); } void cur_obj_align_gfx_with_floor(void) { diff --git a/src/game/object_helpers.h b/src/game/object_helpers.h index 83bb8dff..41e4a86c 100644 --- a/src/game/object_helpers.h +++ b/src/game/object_helpers.h @@ -67,7 +67,9 @@ void obj_apply_scale_to_matrix(struct Object *obj, Mat4 dst, Mat4 src); void create_transformation_from_matrices(Mat4 dst, Mat4 a1, Mat4 a2); void obj_set_held_state(struct Object *obj, const BehaviorScript *heldBehavior); f32 lateral_dist_between_objects(struct Object *obj1, struct Object *obj2); +f32 lateral_dist_between_objects_squared(struct Object *obj1, struct Object *obj2); f32 dist_between_objects(struct Object *obj1, struct Object *obj2); +f32 dist_between_objects_squared(struct Object *obj1, struct Object *obj2); void cur_obj_forward_vel_approach_upward(f32 target, f32 increment); s32 cur_obj_rotate_yaw_toward(s16 target, s16 increment); s16 obj_angle_to_object(struct Object *obj1, struct Object *obj2); @@ -162,13 +164,13 @@ void cur_obj_set_behavior(const BehaviorScript *behavior); void obj_set_behavior(struct Object *obj, const BehaviorScript *behavior); s32 cur_obj_has_behavior(const BehaviorScript *behavior); s32 obj_has_behavior(struct Object *obj, const BehaviorScript *behavior); -f32 cur_obj_lateral_dist_from_mario_to_home(void); +Bool32 cur_obj_lateral_dist_from_mario_to_home_is_in_range(f32 dist); f32 cur_obj_lateral_dist_to_home(void); +Bool32 cur_obj_lateral_dist_to_home_is_in_range(f32 dist); void cur_obj_set_pos_to_home(void); void cur_obj_set_pos_to_home_and_stop(void); void cur_obj_shake_y(f32 amount); void cur_obj_start_cam_event(UNUSED struct Object *obj, s32 cameraEvent); -void set_mario_interact_true_if_in_range(UNUSED s32 sp0, UNUSED s32 sp4, f32 sp8); void obj_set_billboard(struct Object *obj); void cur_obj_set_hitbox_radius_and_height(f32 radius, f32 height); void cur_obj_set_hurtbox_radius_and_height(f32 radius, f32 height); diff --git a/src/game/paintings.c b/src/game/paintings.c index a42fb2e8..5e87bc75 100644 --- a/src/game/paintings.c +++ b/src/game/paintings.c @@ -771,7 +771,6 @@ void painting_average_vertex_normals(s16 *neighborTris, s16 numVtx) { f32 nx = 0.0f; f32 ny = 0.0f; f32 nz = 0.0f; - f32 nlen; // The first number of each entry is the number of adjacent tris neighbors = neighborTris[entry]; @@ -788,13 +787,14 @@ void painting_average_vertex_normals(s16 *neighborTris, s16 numVtx) { nx /= neighbors; ny /= neighbors; nz /= neighbors; - nlen = sqrtf(sqr(nx) + sqr(ny) + sqr(nz)); + f32 nlen = (sqr(nx) + sqr(ny) + sqr(nz)); if (nlen == 0.0f) { gPaintingMesh[i].norm[0] = 0; gPaintingMesh[i].norm[1] = 0; gPaintingMesh[i].norm[2] = 0; } else { + nlen = sqrtf(nlen); gPaintingMesh[i].norm[0] = normalize_component(nx / nlen); gPaintingMesh[i].norm[1] = normalize_component(ny / nlen); gPaintingMesh[i].norm[2] = normalize_component(nz / nlen); diff --git a/src/game/platform_displacement.c b/src/game/platform_displacement.c index 4169f8c0..3c73aa83 100644 --- a/src/game/platform_displacement.c +++ b/src/game/platform_displacement.c @@ -227,7 +227,7 @@ void apply_platform_displacement(u32 isMario, struct Object *platform) { Vec3f relativeOffset; Vec3f newObjectOffset; Vec3s rotation; - f32 displaceMatrix[4][4]; + Mat4 displaceMatrix; rotation[0] = platform->oAngleVelPitch; rotation[1] = platform->oAngleVelYaw; diff --git a/src/game/puppycam2.c b/src/game/puppycam2.c index d6ceae06..638645c6 100644 --- a/src/game/puppycam2.c +++ b/src/game/puppycam2.c @@ -946,7 +946,7 @@ static s32 puppycam_check_volume_bounds(struct sPuppyVolume *volume, s32 index) } else if (sPuppyVolumeStack[index]->shape == PUPPYVOLUME_SHAPE_CYLINDER) { // s16 dir; vec3_diff(rel, sPuppyVolumeStack[index]->pos, &gPuppyCam.targetObj->oPosVec); - f32 dist = sqrtf(sqr(rel[0]) + sqr(rel[2])); + f32 dist = (sqr(rel[0]) + sqr(rel[2])); #ifdef VISUAL_DEBUG Vec3f debugPos[2]; vec3f_set(debugPos[0], sPuppyVolumeStack[index]->pos[0], sPuppyVolumeStack[index]->pos[1], sPuppyVolumeStack[index]->pos[2]); @@ -954,7 +954,7 @@ static s32 puppycam_check_volume_bounds(struct sPuppyVolume *volume, s32 index) debug_box_color(0x0000FF00); debug_box_rot(debugPos[0], debugPos[1], sPuppyVolumeStack[index]->rot, DEBUG_SHAPE_CYLINDER | DEBUG_UCODE_DEFAULT); #endif - f32 distCheck = (dist < sPuppyVolumeStack[index]->radius[0]); + f32 distCheck = (dist < sqr(sPuppyVolumeStack[index]->radius[0])); if (-sPuppyVolumeStack[index]->radius[1] < rel[1] && rel[1] < sPuppyVolumeStack[index]->radius[1] && distCheck) { *volume = *sPuppyVolumeStack[index]; @@ -1141,8 +1141,10 @@ static void puppycam_projection(void) { targetPos3[0] = (s16)approach_f32_asymptotic(targetPos[0], targetPos2[0], 0.5f); targetPos3[1] = (s16)approach_f32_asymptotic(targetPos[1], targetPos2[1], 0.5f); targetPos3[2] = (s16)approach_f32_asymptotic(targetPos[2], targetPos2[2], 0.5f); - gPuppyCam.targetDist[0] = approach_f32_asymptotic(gPuppyCam.targetDist[0],(ABS(LENCOS(sqrtf(((targetPos[0] - targetPos2[0]) * (targetPos[0] - targetPos2[0])) + ((targetPos[2] - targetPos2[2]) * (targetPos[2] - targetPos2[2]))), - (s16)ABS(((gPuppyCam.yaw + 0x8000) % 0xFFFF - 0x8000) - (atan2s(targetPos[2] - targetPos2[2], targetPos[0] - targetPos2[0])) % 0xFFFF - 0x8000) + 0x4000))), 0.2f); + Vec3s d; + vec3_diff(d, targetPos, targetPos2); + gPuppyCam.targetDist[0] = approach_f32_asymptotic(gPuppyCam.targetDist[0], (ABS(LENCOS(sqrtf(sqr(d[0]) + sqr(d[2])), + (s16)ABS(((gPuppyCam.yaw + 0x8000) % 0xFFFF - 0x8000) - (atan2s(d[2], d[0])) % 0xFFFF - 0x8000) + 0x4000))), 0.2f); } else { gPuppyCam.targetDist[0] = approach_f32_asymptotic(gPuppyCam.targetDist[0], 0, 0.2f); } diff --git a/src/game/screen_transition.c b/src/game/screen_transition.c index 98083747..0ea9febe 100644 --- a/src/game/screen_transition.c +++ b/src/game/screen_transition.c @@ -93,32 +93,24 @@ s16 calc_tex_transition_radius(s8 fadeTimer, s8 transTime, struct WarpTransition } f32 calc_tex_transition_time(s8 fadeTimer, s8 transTime, struct WarpTransitionData *transData) { - f32 startX = transData->startTexX; - f32 startY = transData->startTexY; - f32 endX = transData->endTexX; - f32 endY = transData->endTexY; - f32 sqrtfXY = sqrtf((startX - endX) * (startX - endX) + (startY - endY) * (startY - endY)); - f32 result = (f32) sTransitionColorFadeCount[fadeTimer] * sqrtfXY / (f32)(transTime - 1); - - return result; + f32 dx = transData->startTexX - transData->endTexX; + f32 dy = transData->startTexY - transData->endTexY; + return (f32) sTransitionColorFadeCount[fadeTimer] * sqrtf(sqr(dx) + sqr(dy)) / (f32)(transTime - 1); } u16 convert_tex_transition_angle_to_pos(struct WarpTransitionData *transData) { - f32 x = transData->endTexX - transData->startTexX; - f32 y = transData->endTexY - transData->startTexY; - - return atan2s(x, y); + f32 dx = transData->endTexX - transData->startTexX; + f32 dy = transData->endTexY - transData->startTexY; + return atan2s(dx, dy); } s16 center_tex_transition_x(struct WarpTransitionData *transData, f32 texTransTime, u16 texTransPos) { f32 x = transData->startTexX + coss(texTransPos) * texTransTime; - return (s16)(x + 0.5f); } s16 center_tex_transition_y(struct WarpTransitionData *transData, f32 texTransTime, u16 texTransPos) { f32 y = transData->startTexY + sins(texTransPos) * texTransTime; - return (s16)(y + 0.5f); } @@ -206,36 +198,16 @@ s32 render_textured_transition(s8 fadeTimer, s8 transTime, struct WarpTransition s32 render_screen_transition(s8 fadeTimer, s8 transType, u8 transTime, struct WarpTransitionData *transData) { switch (transType) { - case WARP_TRANSITION_FADE_FROM_COLOR: - return render_fade_transition_from_color(fadeTimer, transTime, transData); - break; - case WARP_TRANSITION_FADE_INTO_COLOR: - return render_fade_transition_into_color(fadeTimer, transTime, transData); - break; - case WARP_TRANSITION_FADE_FROM_STAR: - return render_textured_transition(fadeTimer, transTime, transData, TEX_TRANS_STAR, TRANS_TYPE_MIRROR); - break; - case WARP_TRANSITION_FADE_INTO_STAR: - return render_textured_transition(fadeTimer, transTime, transData, TEX_TRANS_STAR, TRANS_TYPE_MIRROR); - break; - case WARP_TRANSITION_FADE_FROM_CIRCLE: - return render_textured_transition(fadeTimer, transTime, transData, TEX_TRANS_CIRCLE, TRANS_TYPE_MIRROR); - break; - case WARP_TRANSITION_FADE_INTO_CIRCLE: - return render_textured_transition(fadeTimer, transTime, transData, TEX_TRANS_CIRCLE, TRANS_TYPE_MIRROR); - break; - case WARP_TRANSITION_FADE_FROM_MARIO: - return render_textured_transition(fadeTimer, transTime, transData, TEX_TRANS_MARIO, TRANS_TYPE_CLAMP); - break; - case WARP_TRANSITION_FADE_INTO_MARIO: - return render_textured_transition(fadeTimer, transTime, transData, TEX_TRANS_MARIO, TRANS_TYPE_CLAMP); - break; - case WARP_TRANSITION_FADE_FROM_BOWSER: - return render_textured_transition(fadeTimer, transTime, transData, TEX_TRANS_BOWSER, TRANS_TYPE_MIRROR); - break; - case WARP_TRANSITION_FADE_INTO_BOWSER: - return render_textured_transition(fadeTimer, transTime, transData, TEX_TRANS_BOWSER, TRANS_TYPE_MIRROR); - break; + case WARP_TRANSITION_FADE_FROM_COLOR: return render_fade_transition_from_color(fadeTimer, transTime, transData); break; + case WARP_TRANSITION_FADE_INTO_COLOR: return render_fade_transition_into_color(fadeTimer, transTime, transData); break; + case WARP_TRANSITION_FADE_FROM_STAR: return render_textured_transition(fadeTimer, transTime, transData, TEX_TRANS_STAR, TRANS_TYPE_MIRROR); break; + case WARP_TRANSITION_FADE_INTO_STAR: return render_textured_transition(fadeTimer, transTime, transData, TEX_TRANS_STAR, TRANS_TYPE_MIRROR); break; + case WARP_TRANSITION_FADE_FROM_CIRCLE: return render_textured_transition(fadeTimer, transTime, transData, TEX_TRANS_CIRCLE, TRANS_TYPE_MIRROR); break; + case WARP_TRANSITION_FADE_INTO_CIRCLE: return render_textured_transition(fadeTimer, transTime, transData, TEX_TRANS_CIRCLE, TRANS_TYPE_MIRROR); break; + case WARP_TRANSITION_FADE_FROM_MARIO: return render_textured_transition(fadeTimer, transTime, transData, TEX_TRANS_MARIO, TRANS_TYPE_CLAMP ); break; + case WARP_TRANSITION_FADE_INTO_MARIO: return render_textured_transition(fadeTimer, transTime, transData, TEX_TRANS_MARIO, TRANS_TYPE_CLAMP ); break; + case WARP_TRANSITION_FADE_FROM_BOWSER: return render_textured_transition(fadeTimer, transTime, transData, TEX_TRANS_BOWSER, TRANS_TYPE_MIRROR); break; + case WARP_TRANSITION_FADE_INTO_BOWSER: return render_textured_transition(fadeTimer, transTime, transData, TEX_TRANS_BOWSER, TRANS_TYPE_MIRROR); break; } return 0; } diff --git a/src/game/shadow.c b/src/game/shadow.c index 936a40b1..4354a4d2 100644 --- a/src/game/shadow.c +++ b/src/game/shadow.c @@ -253,12 +253,13 @@ s32 init_shadow(struct Shadow *s, f32 xPos, f32 yPos, f32 zPos, s16 shadowScale, s->floorDownwardAngle = atan2_deg(s->floorNormalZ, s->floorNormalX); - f32 floorSteepness = sqrtf(sqr(s->floorNormalX) + sqr(s->floorNormalZ)); + f32 floorSteepness = (sqr(s->floorNormalX) + sqr(s->floorNormalZ)); // This if-statement avoids dividing by 0. if (floorSteepness == 0.0f) { s->floorTilt = 0; } else { + floorSteepness = sqrtf(floorSteepness); s->floorTilt = 90.0f - atan2_deg(floorSteepness, s->floorNormalY); } return 0; diff --git a/src/game/skybox.c b/src/game/skybox.c index 3bd89d27..d7142282 100644 --- a/src/game/skybox.c +++ b/src/game/skybox.c @@ -308,7 +308,7 @@ Gfx *create_skybox_facing_camera(s8 player, s8 background, f32 fov, //! the first frame, which causes a floating point divide by 0 fov = 90.0f; sSkyBoxInfo[player].yaw = atan2s(cameraFaceZ, cameraFaceX); - sSkyBoxInfo[player].pitch = atan2s(sqrtf(cameraFaceX * cameraFaceX + cameraFaceZ * cameraFaceZ), cameraFaceY); + sSkyBoxInfo[player].pitch = atan2s(sqrtf(sqr(cameraFaceX) + sqr(cameraFaceZ)), cameraFaceY); sSkyBoxInfo[player].scaledX = calculate_skybox_scaled_x(player, fov); sSkyBoxInfo[player].scaledY = calculate_skybox_scaled_y(player, fov); sSkyBoxInfo[player].upperLeftTile = get_top_left_tile_idx(player); diff --git a/src/game/sound_init.c b/src/game/sound_init.c index 1abd9192..d471021c 100644 --- a/src/game/sound_init.c +++ b/src/game/sound_init.c @@ -115,7 +115,7 @@ void raise_background_noise(s32 a) { * Called from threads: thread5_game_loop */ void disable_background_sound(void) { - if (sBgMusicDisabled == FALSE) { + if (!sBgMusicDisabled) { sBgMusicDisabled = TRUE; sound_banks_disable(SEQ_PLAYER_SFX, SOUND_BANKS_BACKGROUND); } @@ -125,7 +125,7 @@ void disable_background_sound(void) { * Called from threads: thread5_game_loop */ void enable_background_sound(void) { - if (sBgMusicDisabled == TRUE) { + if (sBgMusicDisabled) { sBgMusicDisabled = FALSE; sound_banks_enable(SEQ_PLAYER_SFX, SOUND_BANKS_BACKGROUND); } diff --git a/src/goddard/joints.c b/src/goddard/joints.c index e6d4d793..57b05e07 100644 --- a/src/goddard/joints.c +++ b/src/goddard/joints.c @@ -62,8 +62,7 @@ void grabbable_joint_update_func(struct ObjJoint *self) { self->flags |= 0x2000; } else { - if (gGdCtrl.trgR == FALSE) // R trigger is released - { + if (!gGdCtrl.trgR) { // R trigger is released // Set velocity so that the joint approaches its initial position self->velocity.x -= offset.x * 0.5f; self->velocity.y -= offset.y * 0.5f; From f8a9eaea4b4e791b2fae1da0ad7d6025d9a20d64 Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Tue, 28 Sep 2021 23:43:44 -0700 Subject: [PATCH 41/97] Fix GRAPH_RENDER_FLAGS_SIZE + Add OBJ_FLAG_OCCLUDE_SILHOUETTE + name Bowser 1 painting dl's --- data/behavior_data.c | 5 -- include/behavior_data.h | 1 - include/macro_presets.h | 2 +- include/object_constants.h | 3 +- levels/castle_inside/areas/1/1/model.inc.c | 22 ++++---- levels/castle_inside/areas/1/geo.inc.c | 4 +- levels/castle_inside/areas/2/14/model.inc.c | 16 +++--- levels/castle_inside/areas/2/15/model.inc.c | 8 +-- levels/castle_inside/areas/2/6/model.inc.c | 2 +- levels/castle_inside/areas/2/9/model.inc.c | 8 +-- levels/castle_inside/header.h | 2 +- levels/castle_inside/texture.inc.c | 18 +++--- levels/scripts.c | 4 +- src/engine/behavior_script.c | 20 +++---- src/engine/graph_node.h | 23 ++++---- src/game/behaviors/water_bomb.inc.c | 61 ++++++++++----------- src/game/camera.c | 3 +- src/game/rendering_graph_node.c | 8 ++- 18 files changed, 104 insertions(+), 106 deletions(-) diff --git a/data/behavior_data.c b/data/behavior_data.c index fc7fc59e..9866d749 100644 --- a/data/behavior_data.c +++ b/data/behavior_data.c @@ -2218,11 +2218,6 @@ const BehaviorScript bhvMacroUkiki[] = { END_LOOP(), }; -const BehaviorScript bhvStub1D0C[] = { - BEGIN(OBJ_LIST_DEFAULT), - DEACTIVATE(), -}; - const BehaviorScript bhvLllRotatingHexagonalPlatform[] = { BEGIN(OBJ_LIST_SURFACE), OR_LONG(oFlags, (OBJ_FLAG_SET_FACE_YAW_TO_MOVE_YAW | OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE | OBJ_FLAG_DONT_CALC_COLL_DIST | OBJ_FLAG_UCODE_LARGE)), diff --git a/include/behavior_data.h b/include/behavior_data.h index adb9d2dd..1a62944c 100644 --- a/include/behavior_data.h +++ b/include/behavior_data.h @@ -176,7 +176,6 @@ extern const BehaviorScript bhvMoatGrills[]; extern const BehaviorScript bhvClockMinuteHand[]; extern const BehaviorScript bhvClockHourHand[]; extern const BehaviorScript bhvMacroUkiki[]; -extern const BehaviorScript bhvStub1D0C[]; extern const BehaviorScript bhvLllRotatingHexagonalPlatform[]; extern const BehaviorScript bhvLllSinkingRockBlock[]; extern const BehaviorScript bhvStub1D70[]; diff --git a/include/macro_presets.h b/include/macro_presets.h index 698e3bdf..2ad5c23c 100644 --- a/include/macro_presets.h +++ b/include/macro_presets.h @@ -109,7 +109,7 @@ struct MacroPreset MacroObjectPresets[] = { {bhvSmallBully, MODEL_BULLY, 0}, {bhvSmallBully, MODEL_BULLY_BOSS, 0}, // unused {bhvYellowCoin, MODEL_YELLOW_COIN, 0}, - {bhvStub1D0C, MODEL_UNKNOWN_58, 0}, // unused + {bhvYellowCoin, MODEL_UNKNOWN_58, 0}, // unused {bhvBouncingFireball, MODEL_NONE, 0}, {bhvFlamethrower, MODEL_NONE, 4}, {bhvYellowCoin, MODEL_YELLOW_COIN, 0}, diff --git a/include/object_constants.h b/include/object_constants.h index 23e51fb2..7b9a3526 100644 --- a/include/object_constants.h +++ b/include/object_constants.h @@ -47,7 +47,8 @@ #define OBJ_FLAG_EMIT_LIGHT (1 << 17) // 0x00020000 #define OBJ_FLAG_UCODE_LARGE (1 << 18) // 0x00040000 #define OBJ_FLAG_SILHOUETTE (1 << 19) // 0x00080000 -#define OBJ_FLAG_OPACITY_FROM_CAMERA_DIST (1 << 20) // 0x00100000 +#define OBJ_FLAG_OCCLUDE_SILHOUETTE (1 << 20) // 0x00100000 +#define OBJ_FLAG_OPACITY_FROM_CAMERA_DIST (1 << 21) // 0x00200000 #define OBJ_FLAG_HITBOX_WAS_SET (1 << 30) // 0x40000000 /* oHeldState */ diff --git a/levels/castle_inside/areas/1/1/model.inc.c b/levels/castle_inside/areas/1/1/model.inc.c index e79a050b..c5ed78a9 100644 --- a/levels/castle_inside/areas/1/1/model.inc.c +++ b/levels/castle_inside/areas/1/1/model.inc.c @@ -1,5 +1,5 @@ // 0x07023CB0 - 0x07023DB0 -static const Vtx inside_castle_seg7_vertex_07023CB0[] = { +static const Vtx inside_castle_seg7_vertex_bowser_1_painting[] = { {{{ -7395, 1126, -5772}, 0, { 0, 992}, {0xff, 0xff, 0xff, 0xff}}}, {{{ -7178, 1126, -5989}, 0, { 992, 992}, {0xff, 0xff, 0xff, 0xff}}}, {{{ -7178, 1434, -5989}, 0, { 992, 0}, {0xff, 0xff, 0xff, 0xff}}}, @@ -19,7 +19,7 @@ static const Vtx inside_castle_seg7_vertex_07023CB0[] = { }; // 0x07023DB0 - 0x07023FE0 -const Gfx inside_castle_seg7_dl_07023DB0[] = { +const Gfx inside_castle_seg7_dl_bowser_1_painting[] = { gsDPPipeSync(), gsDPSetCycleType(G_CYC_2CYCLE), gsDPSetCombineMode(G_CC_TRILERP, G_CC_DECALRGB2), @@ -33,46 +33,46 @@ const Gfx inside_castle_seg7_dl_07023DB0[] = { gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b, 8, 256, G_TX_RENDERTILE + 1, 0, G_TX_CLAMP, 5, G_TX_NOLOD, G_TX_CLAMP, 5, G_TX_NOLOD), gsDPSetTileSize(1, 0, 0, 124, 124), gsSPTexture(0xFFFF, 0xFFFF, 1, G_TX_RENDERTILE, G_ON), - gsSPVertex(inside_castle_seg7_vertex_07023CB0, 16, 0), - gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, inside_castle_seg7_texture_07008000), + gsSPVertex(inside_castle_seg7_vertex_bowser_1_painting, 16, 0), + gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, inside_castle_seg7_texture_bowser_top_left), gsDPTileSync(), gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b, 0, 0, G_TX_LOADTILE, 0, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOLOD, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOLOD), gsDPLoadSync(), gsDPLoadBlock(G_TX_LOADTILE, 0, 0, 32 * 32 - 1, CALC_DXT(32, G_IM_SIZ_16b_BYTES)), - gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, inside_castle_seg7_texture_07006000), + gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, inside_castle_seg7_texture_peach_top_left), gsDPTileSync(), gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b, 0, 256, G_TX_LOADTILE, 0, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOLOD, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOLOD), gsDPLoadSync(), gsDPLoadBlock(G_TX_LOADTILE, 0, 0, 32 * 32 - 1, CALC_DXT(32, G_IM_SIZ_16b_BYTES)), gsSP2Triangles( 0, 1, 2, 0x0, 0, 2, 3, 0x0), - gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, inside_castle_seg7_texture_07008800), + gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, inside_castle_seg7_texture_bowser_top_right), gsDPTileSync(), gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b, 0, 0, G_TX_LOADTILE, 0, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOLOD, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOLOD), gsDPLoadSync(), gsDPLoadBlock(G_TX_LOADTILE, 0, 0, 32 * 32 - 1, CALC_DXT(32, G_IM_SIZ_16b_BYTES)), - gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, inside_castle_seg7_texture_07006800), + gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, inside_castle_seg7_texture_peach_top_right), gsDPTileSync(), gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b, 0, 256, G_TX_LOADTILE, 0, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOLOD, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOLOD), gsDPLoadSync(), gsDPLoadBlock(G_TX_LOADTILE, 0, 0, 32 * 32 - 1, CALC_DXT(32, G_IM_SIZ_16b_BYTES)), gsSP2Triangles( 4, 5, 6, 0x0, 4, 6, 7, 0x0), - gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, inside_castle_seg7_texture_07009000), + gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, inside_castle_seg7_texture_bowser_bottom_left), gsDPTileSync(), gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b, 0, 0, G_TX_LOADTILE, 0, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOLOD, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOLOD), gsDPLoadSync(), gsDPLoadBlock(G_TX_LOADTILE, 0, 0, 32 * 32 - 1, CALC_DXT(32, G_IM_SIZ_16b_BYTES)), - gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, inside_castle_seg7_texture_07007000), + gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, inside_castle_seg7_texture_peach_bottom_left), gsDPTileSync(), gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b, 0, 256, G_TX_LOADTILE, 0, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOLOD, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOLOD), gsDPLoadSync(), gsDPLoadBlock(G_TX_LOADTILE, 0, 0, 32 * 32 - 1, CALC_DXT(32, G_IM_SIZ_16b_BYTES)), gsSP2Triangles( 8, 9, 10, 0x0, 8, 10, 11, 0x0), - gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, inside_castle_seg7_texture_07009800), + gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, inside_castle_seg7_texture_bowser_bottom_right), gsDPTileSync(), gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b, 0, 0, G_TX_LOADTILE, 0, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOLOD, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOLOD), gsDPLoadSync(), gsDPLoadBlock(G_TX_LOADTILE, 0, 0, 32 * 32 - 1, CALC_DXT(32, G_IM_SIZ_16b_BYTES)), - gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, inside_castle_seg7_texture_07007800), + gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, inside_castle_seg7_texture_peach_bottom_right), gsDPTileSync(), gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b, 0, 256, G_TX_LOADTILE, 0, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOLOD, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOLOD), gsDPLoadSync(), diff --git a/levels/castle_inside/areas/1/geo.inc.c b/levels/castle_inside/areas/1/geo.inc.c index 78d3e442..dd4a5a14 100644 --- a/levels/castle_inside/areas/1/geo.inc.c +++ b/levels/castle_inside/areas/1/geo.inc.c @@ -26,7 +26,7 @@ const GeoLayout castle_geo_000F88[] = { GEO_NODE_START(), GEO_OPEN_NODE(), GEO_DISPLAY_LIST(LAYER_OPAQUE, inside_castle_seg7_dl_0702FD30), - GEO_DISPLAY_LIST(LAYER_OPAQUE, inside_castle_seg7_dl_07023DB0), + GEO_DISPLAY_LIST(LAYER_OPAQUE, inside_castle_seg7_dl_bowser_1_painting), GEO_CLOSE_NODE(), GEO_RETURN(), }; @@ -138,7 +138,7 @@ const GeoLayout castle_geo_001158[] = { GEO_DISPLAY_LIST(LAYER_ALPHA, inside_castle_seg7_dl_0702AB20), GEO_ASM(0, geo_exec_inside_castle_light), GEO_DISPLAY_LIST(LAYER_OPAQUE, inside_castle_seg7_dl_0702FD30), - GEO_DISPLAY_LIST(LAYER_OPAQUE, inside_castle_seg7_dl_07023DB0), + GEO_DISPLAY_LIST(LAYER_OPAQUE, inside_castle_seg7_dl_bowser_1_painting), GEO_CLOSE_NODE(), GEO_RETURN(), }; diff --git a/levels/castle_inside/areas/2/14/model.inc.c b/levels/castle_inside/areas/2/14/model.inc.c index 57e95f8e..0e564b5e 100644 --- a/levels/castle_inside/areas/2/14/model.inc.c +++ b/levels/castle_inside/areas/2/14/model.inc.c @@ -412,7 +412,7 @@ static const Vtx inside_castle_seg7_vertex_07056BB0[] = { // 0x07056BF0 - 0x07056CE0 static const Gfx inside_castle_seg7_dl_07056BF0[] = { - gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, inside_castle_seg7_texture_07008000), + gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, inside_castle_seg7_texture_bowser_top_left), gsDPLoadSync(), gsDPLoadBlock(G_TX_LOADTILE, 0, 0, 32 * 32 - 1, CALC_DXT(32, G_IM_SIZ_16b_BYTES)), gsSPLight(&inside_castle_seg7_lights_070559C0.l, 1), @@ -438,7 +438,7 @@ static const Gfx inside_castle_seg7_dl_07056BF0[] = { // 0x07056CE0 - 0x07056DD0 static const Gfx inside_castle_seg7_dl_07056CE0[] = { - gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, inside_castle_seg7_texture_07008800), + gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, inside_castle_seg7_texture_bowser_top_right), gsDPLoadSync(), gsDPLoadBlock(G_TX_LOADTILE, 0, 0, 32 * 32 - 1, CALC_DXT(32, G_IM_SIZ_16b_BYTES)), gsSPLight(&inside_castle_seg7_lights_070559C0.l, 1), @@ -464,7 +464,7 @@ static const Gfx inside_castle_seg7_dl_07056CE0[] = { // 0x07056DD0 - 0x07056EC0 static const Gfx inside_castle_seg7_dl_07056DD0[] = { - gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, inside_castle_seg7_texture_07009000), + gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, inside_castle_seg7_texture_bowser_bottom_left), gsDPLoadSync(), gsDPLoadBlock(G_TX_LOADTILE, 0, 0, 32 * 32 - 1, CALC_DXT(32, G_IM_SIZ_16b_BYTES)), gsSPLight(&inside_castle_seg7_lights_070559C0.l, 1), @@ -490,7 +490,7 @@ static const Gfx inside_castle_seg7_dl_07056DD0[] = { // 0x07056EC0 - 0x07056FB0 static const Gfx inside_castle_seg7_dl_07056EC0[] = { - gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, inside_castle_seg7_texture_07009800), + gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, inside_castle_seg7_texture_bowser_bottom_right), gsDPLoadSync(), gsDPLoadBlock(G_TX_LOADTILE, 0, 0, 32 * 32 - 1, CALC_DXT(32, G_IM_SIZ_16b_BYTES)), gsSPLight(&inside_castle_seg7_lights_070559C0.l, 1), @@ -516,7 +516,7 @@ static const Gfx inside_castle_seg7_dl_07056EC0[] = { // 0x07056FB0 - 0x07057078 static const Gfx inside_castle_seg7_dl_07056FB0[] = { - gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, inside_castle_seg7_texture_07006000), + gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, inside_castle_seg7_texture_peach_top_left), gsDPLoadSync(), gsDPLoadBlock(G_TX_LOADTILE, 0, 0, 32 * 32 - 1, CALC_DXT(32, G_IM_SIZ_16b_BYTES)), gsSPLight(&inside_castle_seg7_lights_070559C0.l, 1), @@ -538,7 +538,7 @@ static const Gfx inside_castle_seg7_dl_07056FB0[] = { // 0x07057078 - 0x07057130 static const Gfx inside_castle_seg7_dl_07057078[] = { - gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, inside_castle_seg7_texture_07006800), + gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, inside_castle_seg7_texture_peach_top_right), gsDPLoadSync(), gsDPLoadBlock(G_TX_LOADTILE, 0, 0, 32 * 32 - 1, CALC_DXT(32, G_IM_SIZ_16b_BYTES)), gsSPVertex(inside_castle_seg7_vertex_07056590, 15, 0), @@ -558,7 +558,7 @@ static const Gfx inside_castle_seg7_dl_07057078[] = { // 0x07057130 - 0x070571E8 static const Gfx inside_castle_seg7_dl_07057130[] = { - gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, inside_castle_seg7_texture_07007000), + gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, inside_castle_seg7_texture_peach_bottom_left), gsDPLoadSync(), gsDPLoadBlock(G_TX_LOADTILE, 0, 0, 32 * 32 - 1, CALC_DXT(32, G_IM_SIZ_16b_BYTES)), gsSPVertex(inside_castle_seg7_vertex_070567B0, 15, 0), @@ -578,7 +578,7 @@ static const Gfx inside_castle_seg7_dl_07057130[] = { // 0x070571E8 - 0x070572A0 static const Gfx inside_castle_seg7_dl_070571E8[] = { - gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, inside_castle_seg7_texture_07007800), + gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, inside_castle_seg7_texture_peach_bottom_right), gsDPLoadSync(), gsDPLoadBlock(G_TX_LOADTILE, 0, 0, 32 * 32 - 1, CALC_DXT(32, G_IM_SIZ_16b_BYTES)), gsSPVertex(inside_castle_seg7_vertex_070569D0, 15, 0), diff --git a/levels/castle_inside/areas/2/15/model.inc.c b/levels/castle_inside/areas/2/15/model.inc.c index 6798a28f..7baf47c5 100644 --- a/levels/castle_inside/areas/2/15/model.inc.c +++ b/levels/castle_inside/areas/2/15/model.inc.c @@ -235,7 +235,7 @@ static const Gfx inside_castle_seg7_dl_07057C20[] = { // 0x07057D30 - 0x07057D88 static const Gfx inside_castle_seg7_dl_07057D30[] = { - gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, inside_castle_seg7_texture_07008000), + gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, inside_castle_seg7_texture_bowser_top_left), gsDPLoadSync(), gsDPLoadBlock(G_TX_LOADTILE, 0, 0, 32 * 32 - 1, CALC_DXT(32, G_IM_SIZ_16b_BYTES)), gsSPLight(&inside_castle_seg7_lights_07057398.l, 1), @@ -248,7 +248,7 @@ static const Gfx inside_castle_seg7_dl_07057D30[] = { // 0x07057D88 - 0x07057DD0 static const Gfx inside_castle_seg7_dl_07057D88[] = { - gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, inside_castle_seg7_texture_07008800), + gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, inside_castle_seg7_texture_bowser_top_right), gsDPLoadSync(), gsDPLoadBlock(G_TX_LOADTILE, 0, 0, 32 * 32 - 1, CALC_DXT(32, G_IM_SIZ_16b_BYTES)), gsSPVertex(inside_castle_seg7_vertex_07057850, 8, 0), @@ -259,7 +259,7 @@ static const Gfx inside_castle_seg7_dl_07057D88[] = { // 0x07057DD0 - 0x07057E18 static const Gfx inside_castle_seg7_dl_07057DD0[] = { - gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, inside_castle_seg7_texture_07009000), + gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, inside_castle_seg7_texture_bowser_bottom_left), gsDPLoadSync(), gsDPLoadBlock(G_TX_LOADTILE, 0, 0, 32 * 32 - 1, CALC_DXT(32, G_IM_SIZ_16b_BYTES)), gsSPVertex(inside_castle_seg7_vertex_070578D0, 8, 0), @@ -270,7 +270,7 @@ static const Gfx inside_castle_seg7_dl_07057DD0[] = { // 0x07057E18 - 0x07057E60 static const Gfx inside_castle_seg7_dl_07057E18[] = { - gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, inside_castle_seg7_texture_07009800), + gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, inside_castle_seg7_texture_bowser_bottom_right), gsDPLoadSync(), gsDPLoadBlock(G_TX_LOADTILE, 0, 0, 32 * 32 - 1, CALC_DXT(32, G_IM_SIZ_16b_BYTES)), gsSPVertex(inside_castle_seg7_vertex_07057950, 8, 0), diff --git a/levels/castle_inside/areas/2/6/model.inc.c b/levels/castle_inside/areas/2/6/model.inc.c index 556333c2..e28c39b5 100644 --- a/levels/castle_inside/areas/2/6/model.inc.c +++ b/levels/castle_inside/areas/2/6/model.inc.c @@ -36,7 +36,7 @@ const Gfx inside_castle_seg7_dl_0704A2E0[] = { gsDPPipeSync(), gsSPSetGeometryMode(G_TEXTURE_GEN), gsDPSetCombineMode(G_CC_MODULATEIA, G_CC_MODULATEIA), - gsDPLoadTextureBlock(inside_castle_seg7_texture_0700A000, G_IM_FMT_IA, G_IM_SIZ_16b, 32, 32, 0, G_TX_WRAP | G_TX_NOMIRROR, G_TX_WRAP | G_TX_NOMIRROR, 5, 5, G_TX_NOLOD, G_TX_NOLOD), + gsDPLoadTextureBlock(inside_castle_seg7_texture_light_radial_inverse, G_IM_FMT_IA, G_IM_SIZ_16b, 32, 32, 0, G_TX_WRAP | G_TX_NOMIRROR, G_TX_WRAP | G_TX_NOMIRROR, 5, 5, G_TX_NOLOD, G_TX_NOLOD), gsSPTexture(0x07C0, 0x07C0, 0, G_TX_RENDERTILE, G_ON), gsSPDisplayList(inside_castle_seg7_dl_0704A290), gsSPTexture(0x07C0, 0x07C0, 0, G_TX_RENDERTILE, G_OFF), diff --git a/levels/castle_inside/areas/2/9/model.inc.c b/levels/castle_inside/areas/2/9/model.inc.c index 455aba04..b62fc80a 100644 --- a/levels/castle_inside/areas/2/9/model.inc.c +++ b/levels/castle_inside/areas/2/9/model.inc.c @@ -1265,7 +1265,7 @@ static const Gfx inside_castle_seg7_dl_07050080[] = { // 0x070501E8 - 0x07050230 static const Gfx inside_castle_seg7_dl_070501E8[] = { - gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, inside_castle_seg7_texture_07007000), + gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, inside_castle_seg7_texture_peach_bottom_left), gsDPLoadSync(), gsDPLoadBlock(G_TX_LOADTILE, 0, 0, 32 * 32 - 1, CALC_DXT(32, G_IM_SIZ_16b_BYTES)), gsSPVertex(inside_castle_seg7_vertex_0704E288, 8, 0), @@ -1276,7 +1276,7 @@ static const Gfx inside_castle_seg7_dl_070501E8[] = { // 0x07050230 - 0x07050278 static const Gfx inside_castle_seg7_dl_07050230[] = { - gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, inside_castle_seg7_texture_07006000), + gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, inside_castle_seg7_texture_peach_top_left), gsDPLoadSync(), gsDPLoadBlock(G_TX_LOADTILE, 0, 0, 32 * 32 - 1, CALC_DXT(32, G_IM_SIZ_16b_BYTES)), gsSPVertex(inside_castle_seg7_vertex_0704E308, 8, 0), @@ -1287,7 +1287,7 @@ static const Gfx inside_castle_seg7_dl_07050230[] = { // 0x07050278 - 0x070502C0 static const Gfx inside_castle_seg7_dl_07050278[] = { - gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, inside_castle_seg7_texture_07007800), + gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, inside_castle_seg7_texture_peach_bottom_right), gsDPLoadSync(), gsDPLoadBlock(G_TX_LOADTILE, 0, 0, 32 * 32 - 1, CALC_DXT(32, G_IM_SIZ_16b_BYTES)), gsSPVertex(inside_castle_seg7_vertex_0704E388, 8, 0), @@ -1298,7 +1298,7 @@ static const Gfx inside_castle_seg7_dl_07050278[] = { // 0x070502C0 - 0x07050308 static const Gfx inside_castle_seg7_dl_070502C0[] = { - gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, inside_castle_seg7_texture_07006800), + gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, inside_castle_seg7_texture_peach_top_right), gsDPLoadSync(), gsDPLoadBlock(G_TX_LOADTILE, 0, 0, 32 * 32 - 1, CALC_DXT(32, G_IM_SIZ_16b_BYTES)), gsSPVertex(inside_castle_seg7_vertex_0704E408, 8, 0), diff --git a/levels/castle_inside/header.h b/levels/castle_inside/header.h index 043e3383..891fee82 100644 --- a/levels/castle_inside/header.h +++ b/levels/castle_inside/header.h @@ -73,7 +73,7 @@ extern struct Painting ttm_painting; extern struct Painting ttc_painting; extern struct Painting sl_painting; extern struct Painting thi_huge_painting; -extern const Gfx inside_castle_seg7_dl_07023DB0[]; +extern const Gfx inside_castle_seg7_dl_bowser_1_painting[]; extern const Gfx inside_castle_seg7_dl_07028FD0[]; extern const Gfx inside_castle_seg7_dl_07029578[]; extern const Gfx inside_castle_seg7_dl_0702A650[]; diff --git a/levels/castle_inside/texture.inc.c b/levels/castle_inside/texture.inc.c index a3157f23..6ffde7f9 100644 --- a/levels/castle_inside/texture.inc.c +++ b/levels/castle_inside/texture.inc.c @@ -38,47 +38,47 @@ ALIGNED8 static const Texture inside_castle_seg7_texture_07005800[] = { }; // 0x07006000 - 0x07006800 -ALIGNED8 static const Texture inside_castle_seg7_texture_07006000[] = { +ALIGNED8 static const Texture inside_castle_seg7_texture_peach_top_left[] = { #include "levels/castle_inside/8.rgba16.inc.c" }; // 0x07006800 - 0x07007000 -ALIGNED8 static const Texture inside_castle_seg7_texture_07006800[] = { +ALIGNED8 static const Texture inside_castle_seg7_texture_peach_top_right[] = { #include "levels/castle_inside/9.rgba16.inc.c" }; // 0x07007000 - 0x07007800 -ALIGNED8 static const Texture inside_castle_seg7_texture_07007000[] = { +ALIGNED8 static const Texture inside_castle_seg7_texture_peach_bottom_left[] = { #include "levels/castle_inside/10.rgba16.inc.c" }; // 0x07007800 - 0x07008000 -ALIGNED8 static const Texture inside_castle_seg7_texture_07007800[] = { +ALIGNED8 static const Texture inside_castle_seg7_texture_peach_bottom_right[] = { #include "levels/castle_inside/11.rgba16.inc.c" }; // 0x07008000 - 0x07008800 -ALIGNED8 static const Texture inside_castle_seg7_texture_07008000[] = { +ALIGNED8 static const Texture inside_castle_seg7_texture_bowser_top_left[] = { #include "levels/castle_inside/12.rgba16.inc.c" }; // 0x07008800 - 0x07009000 -ALIGNED8 static const Texture inside_castle_seg7_texture_07008800[] = { +ALIGNED8 static const Texture inside_castle_seg7_texture_bowser_top_right[] = { #include "levels/castle_inside/13.rgba16.inc.c" }; // 0x07009000 - 0x07009800 -ALIGNED8 static const Texture inside_castle_seg7_texture_07009000[] = { +ALIGNED8 static const Texture inside_castle_seg7_texture_bowser_bottom_left[] = { #include "levels/castle_inside/14.rgba16.inc.c" }; // 0x07009800 - 0x0700A000 -ALIGNED8 static const Texture inside_castle_seg7_texture_07009800[] = { +ALIGNED8 static const Texture inside_castle_seg7_texture_bowser_bottom_right[] = { #include "levels/castle_inside/15.rgba16.inc.c" }; // 0x0700A000 - 0x0700A800 -ALIGNED8 static const Texture inside_castle_seg7_texture_0700A000[] = { +ALIGNED8 static const Texture inside_castle_seg7_texture_light_radial_inverse[] = { #include "levels/castle_inside/16.ia16.inc.c" }; diff --git a/levels/scripts.c b/levels/scripts.c index d13d0d5b..a4f2aaab 100644 --- a/levels/scripts.c +++ b/levels/scripts.c @@ -59,8 +59,8 @@ static const LevelScript goto_debug_level_select[6]; #undef STUB_LEVEL const LevelScript level_main_scripts_entry[] = { - LOAD_YAY0(/*seg*/ 0x04, _group0_yay0SegmentRomStart, _group0_yay0SegmentRomEnd), - LOAD_YAY0(/*seg*/ 0x03, _common1_yay0SegmentRomStart, _common1_yay0SegmentRomEnd), + LOAD_YAY0( /*seg*/ 0x04, _group0_yay0SegmentRomStart, _group0_yay0SegmentRomEnd), + LOAD_YAY0( /*seg*/ 0x03, _common1_yay0SegmentRomStart, _common1_yay0SegmentRomEnd), LOAD_RAW_WITH_CODE( /*seg*/ 0x17, _group0_geoSegmentRomStart, _group0_geoSegmentRomEnd, _group0_geoSegmentBssStart, _group0_geoSegmentBssEnd), LOAD_RAW_WITH_CODE( /*seg*/ 0x16, _common1_geoSegmentRomStart, _common1_geoSegmentRomEnd, _common1_geoSegmentBssStart, _common1_geoSegmentBssEnd), LOAD_RAW_WITH_CODE( /*seg*/ 0x13, _behaviorSegmentRomStart, _behaviorSegmentRomEnd, _behaviorSegmentBssStart, _behaviorSegmentBssEnd), diff --git a/src/engine/behavior_script.c b/src/engine/behavior_script.c index ee839837..44eb3838 100644 --- a/src/engine/behavior_script.c +++ b/src/engine/behavior_script.c @@ -76,7 +76,7 @@ f32 random_float(void) { // Return either -1 or 1 with a 50:50 chance. s32 random_sign(void) { if (random_u16() >= 0x7FFF) { - return 1; + return 1; } else { return -1; } @@ -84,18 +84,15 @@ s32 random_sign(void) { // Update an object's graphical position and rotation to match its real position and rotation. void obj_update_gfx_pos_and_angle(struct Object *obj) { - obj->header.gfx.pos[0] = obj->oPosX; - obj->header.gfx.pos[1] = obj->oPosY + obj->oGraphYOffset; - obj->header.gfx.pos[2] = obj->oPosZ; - - obj->header.gfx.angle[0] = obj->oFaceAnglePitch & 0xFFFF; - obj->header.gfx.angle[1] = obj->oFaceAngleYaw & 0xFFFF; - obj->header.gfx.angle[2] = obj->oFaceAngleRoll & 0xFFFF; + vec3_copy_y_off(obj->header.gfx.pos, &obj->oPosVec, obj->oGraphYOffset); + obj->header.gfx.angle[0] = (obj->oFaceAnglePitch & 0xFFFF); + obj->header.gfx.angle[1] = (obj->oFaceAngleYaw & 0xFFFF); + obj->header.gfx.angle[2] = (obj->oFaceAngleRoll & 0xFFFF); } #ifdef OBJ_OPACITY_BY_CAM_DIST void obj_set_opacity_from_cam_dist(struct Object *obj) { - f32 dist; + f32 dist; //! Should this be done via LOD's instead? Vec3f d; if (obj->header.gfx.node.flags & GRAPH_RENDER_BILLBOARD) { d[0] = (obj->oPosX - gCamera->pos[0]); @@ -995,8 +992,9 @@ void cur_obj_update(void) { obj_update_gfx_pos_and_angle(gCurrentObject); } - COND_BIT((!(objFlags & OBJ_FLAG_UCODE_LARGE)), gCurrentObject->header.gfx.node.flags, GRAPH_RENDER_UCODE_REJ ); - COND_BIT( (objFlags & OBJ_FLAG_SILHOUETTE ), gCurrentObject->header.gfx.node.flags, GRAPH_RENDER_SILHOUETTE); + COND_BIT((!(objFlags & OBJ_FLAG_UCODE_LARGE )), gCurrentObject->header.gfx.node.flags, GRAPH_RENDER_UCODE_REJ ); + COND_BIT(( objFlags & OBJ_FLAG_SILHOUETTE ), gCurrentObject->header.gfx.node.flags, GRAPH_RENDER_SILHOUETTE ); + COND_BIT(( objFlags & OBJ_FLAG_OCCLUDE_SILHOUETTE ), gCurrentObject->header.gfx.node.flags, GRAPH_RENDER_OCCLUDE_SILHOUETTE); #ifdef OBJ_OPACITY_BY_CAM_DIST if (objFlags & OBJ_FLAG_OPACITY_FROM_CAMERA_DIST) { diff --git a/src/engine/graph_node.h b/src/engine/graph_node.h index f497efb8..626511c5 100644 --- a/src/engine/graph_node.h +++ b/src/engine/graph_node.h @@ -9,22 +9,23 @@ #include "geo_commands.h" #include "game/memory.h" -#define GRAPH_RENDER_ACTIVE (1 << 0) // 0x0001 -#define GRAPH_RENDER_CHILDREN_FIRST (1 << 1) // 0x0002 -#define GRAPH_RENDER_BILLBOARD (1 << 2) // 0x0004 -#define GRAPH_RENDER_Z_BUFFER (1 << 3) // 0x0008 -#define GRAPH_RENDER_INVISIBLE (1 << 4) // 0x0010 -#define GRAPH_RENDER_HAS_ANIMATION (1 << 5) // 0x0020 -#define GRAPH_RENDER_UCODE_REJ (1 << 6) // 0x0040 -#define GRAPH_RENDER_SILHOUETTE (1 << 7) // 0x0080 +#define GRAPH_RENDER_ACTIVE (1 << 0) // 0x0001 +#define GRAPH_RENDER_CHILDREN_FIRST (1 << 1) // 0x0002 +#define GRAPH_RENDER_BILLBOARD (1 << 2) // 0x0004 +#define GRAPH_RENDER_Z_BUFFER (1 << 3) // 0x0008 +#define GRAPH_RENDER_INVISIBLE (1 << 4) // 0x0010 +#define GRAPH_RENDER_HAS_ANIMATION (1 << 5) // 0x0020 +#define GRAPH_RENDER_SILHOUETTE (1 << 6) // 0x0040 +#define GRAPH_RENDER_OCCLUDE_SILHOUETTE (1 << 7) // 0x0080 +#define GRAPH_RENDER_UCODE_REJ (1 << 8) // 0x0100 // The amount of bits to use for the above flags out of a s16 variable. // The remaining bits to the left are used for the render layers. // The vanilla value is 8, allowing for 8 flags and 255 layers. -#define GRAPH_RENDER_FLAGS_SIZE 8 +#define GRAPH_RENDER_FLAGS_SIZE 12 -#define GRAPH_RENDER_LAYERS_MASK (BITMASK(16 - GRAPH_RENDER_FLAGS_SIZE) << GRAPH_RENDER_FLAGS_SIZE) -#define GRAPH_RENDER_FLAGS_MASK BITMASK(GRAPH_RENDER_FLAGS_SIZE) +#define GRAPH_RENDER_LAYERS_MASK (BITMASK(16 - GRAPH_RENDER_FLAGS_SIZE) << GRAPH_RENDER_FLAGS_SIZE) // 8:0xFF00 12:0xF000 +#define GRAPH_RENDER_FLAGS_MASK BITMASK(GRAPH_RENDER_FLAGS_SIZE) // 8:0x00FF 12:0x0FFF #define SET_GRAPH_NODE_LAYER(flags, layer) ((flags) = ((flags) & GRAPH_RENDER_FLAGS_MASK) | (((layer) << GRAPH_RENDER_FLAGS_SIZE) & GRAPH_RENDER_LAYERS_MASK)) #define GET_GRAPH_NODE_LAYER(flags ) ((flags & GRAPH_RENDER_LAYERS_MASK) >> GRAPH_RENDER_FLAGS_SIZE) diff --git a/src/game/behaviors/water_bomb.inc.c b/src/game/behaviors/water_bomb.inc.c index 2321ff6a..445e0217 100644 --- a/src/game/behaviors/water_bomb.inc.c +++ b/src/game/behaviors/water_bomb.inc.c @@ -58,25 +58,25 @@ void bhv_water_bomb_spawner_update(void) { } } +static struct SpawnParticlesInfo sWaterBombExplodeParticles = { + /* behParam: */ 0, + /* count: */ 5, + /* model: */ MODEL_BUBBLE, + /* offsetY: */ 20, + /* forwardVelBase: */ 20, + /* forwardVelRange: */ 60, + /* velYBase: */ 10, + /* velYRange: */ 10, + /* gravity: */ -2, + /* dragStrength: */ 0, + /* sizeBase: */ 35.0f, + /* sizeRange: */ 10.0f, +}; + /** * Spawn particles when the water bomb explodes. */ void water_bomb_spawn_explode_particles(s8 offsetY, s8 forwardVelRange, s8 velYBase) { - static struct SpawnParticlesInfo sWaterBombExplodeParticles = { - /* behParam: */ 0, - /* count: */ 5, - /* model: */ MODEL_BUBBLE, - /* offsetY: */ 20, - /* forwardVelBase: */ 20, - /* forwardVelRange: */ 60, - /* velYBase: */ 10, - /* velYRange: */ 10, - /* gravity: */ -2, - /* dragStrength: */ 0, - /* sizeBase: */ 35.0f, - /* sizeRange: */ 10.0f, - }; - sWaterBombExplodeParticles.offsetY = offsetY; sWaterBombExplodeParticles.forwardVelRange = forwardVelRange; sWaterBombExplodeParticles.velYBase = velYBase; @@ -165,26 +165,25 @@ static void water_bomb_act_explode(void) { obj_mark_for_deletion(o); } +static struct SpawnParticlesInfo sWaterBombCannonParticle = { + /* behParam: */ 0, + /* count: */ 1, + /* model: */ MODEL_BUBBLE, + /* offsetY: */ 236, + /* forwardVelBase: */ 20, + /* forwardVelRange: */ 5, + /* velYBase: */ 0, + /* velYRange: */ 0, + /* gravity: */ -2, + /* dragStrength: */ 0, + /* sizeBase: */ 20.0f, + /* sizeRange: */ 5.0f, +}; + /** * Despawn after 100 frames. */ static void water_bomb_act_shot_from_cannon(void) { - - static struct SpawnParticlesInfo sWaterBombCannonParticle = { - /* behParam: */ 0, - /* count: */ 1, - /* model: */ MODEL_BUBBLE, - /* offsetY: */ 236, - /* forwardVelBase: */ 20, - /* forwardVelRange: */ 5, - /* velYBase: */ 0, - /* velYRange: */ 0, - /* gravity: */ -2, - /* dragStrength: */ 0, - /* sizeBase: */ 20.0f, - /* sizeRange: */ 5.0f, - }; - if (o->oTimer > 100) { obj_mark_for_deletion(o); } else { diff --git a/src/game/camera.c b/src/game/camera.c index 14c67381..db3f5a7d 100644 --- a/src/game/camera.c +++ b/src/game/camera.c @@ -2713,8 +2713,7 @@ void set_camera_mode(struct Camera *c, s16 mode, s16 frames) { */ void update_lakitu(struct Camera *c) { struct Surface *floor = NULL; - Vec3f newPos; - Vec3f newFoc; + Vec3f newPos, newFoc; f32 distToFloor; s16 newYaw; diff --git a/src/game/rendering_graph_node.c b/src/game/rendering_graph_node.c index da0773aa..8ca441f7 100644 --- a/src/game/rendering_graph_node.c +++ b/src/game/rendering_graph_node.c @@ -333,6 +333,12 @@ void geo_append_display_list(void *displayList, s32 layer) { case LAYER_ALPHA: layer = LAYER_SILHOUETTE_ALPHA; break; } } + if (gCurGraphNodeObject->node.flags & GRAPH_RENDER_OCCLUDE_SILHOUETTE) { + switch (layer) { + case LAYER_OPAQUE: layer = LAYER_OCCLUDE_SILHOUETTE_OPAQUE; break; + case LAYER_ALPHA: layer = LAYER_OCCLUDE_SILHOUETTE_ALPHA; break; + } + } #endif } #endif @@ -360,7 +366,7 @@ void inc_mat_stack() { void append_dl_and_return(struct GraphNodeDisplayList *node) { if (node->displayList != NULL) { - geo_append_display_list(node->displayList, node->node.flags >> 8); + geo_append_display_list(node->displayList, GET_GRAPH_NODE_LAYER(node->node.flags)); } if (node->node.children != NULL) { geo_process_node_and_siblings(node->node.children); From 565af70485db3e2bb23ce8f1dca8db826b216e03 Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Tue, 28 Sep 2021 23:55:49 -0700 Subject: [PATCH 42/97] Fix alloc_display_list in intro_draw_face --- src/menu/intro_geo.c | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/menu/intro_geo.c b/src/menu/intro_geo.c index 7d2f463d..4bc27261 100644 --- a/src/menu/intro_geo.c +++ b/src/menu/intro_geo.c @@ -292,8 +292,8 @@ void intro_gen_face_texrect(Gfx **dlIter) { for (y = 0; y < 6; y++) { for (x = 0; x < 8; x++) { - if (sFaceVisible[y*8 + x] != 0) { - gSPTextureRectangle((*dlIter)++, (x * 40) << 2, (y * 40) << 2, (x * 40 + 39) << 2, (y * 40 + 39) << 2, 0, + if (sFaceVisible[(y * 8) + x] != 0) { + gSPTextureRectangle((*dlIter)++, (x * 40) << 2, (y * 40) << 2, ((x * 40) + 39) << 2, ((y * 40) + 39) << 2, 0, 0, 0, 4 << 10, 1 << 10); } } @@ -301,10 +301,9 @@ void intro_gen_face_texrect(Gfx **dlIter) { } Gfx *intro_draw_face(u16 *image, s32 imageW, s32 imageH) { - Gfx *dl; Gfx *dlIter; - dl = alloc_display_list(110 * sizeof(Gfx)); + Gfx *dl = alloc_display_list(130 * sizeof(Gfx)); if (dl == NULL) { return dl; @@ -326,8 +325,6 @@ Gfx *intro_draw_face(u16 *image, s32 imageW, s32 imageH) { } u16 *intro_sample_frame_buffer(s32 imageW, s32 imageH, s32 sampleW, s32 sampleH) { - u16 *fb; - u16 *image; s32 pixel; f32 size; f32 r, g, b; @@ -336,8 +333,8 @@ u16 *intro_sample_frame_buffer(s32 imageW, s32 imageH, s32 sampleW, s32 sampleH) s32 xOffset = 120; s32 yOffset = 80; - fb = gFrameBuffers[sRenderingFrameBuffer]; - image = alloc_display_list(imageW * imageH * sizeof(u16)); + u16 *fb = gFrameBuffers[sRenderingFrameBuffer]; + u16 *image = alloc_display_list(imageW * imageH * sizeof(u16)); if (image == NULL) { return image; @@ -381,7 +378,6 @@ u16 *intro_sample_frame_buffer(s32 imageW, s32 imageH, s32 sampleW, s32 sampleH) Gfx *geo_intro_face_easter_egg(s32 state, struct GraphNode *node, UNUSED void *context) { struct GraphNodeGenerated *genNode = (struct GraphNodeGenerated *)node; - u16 *image; Gfx *dl = NULL; s32 i; @@ -406,7 +402,7 @@ Gfx *geo_intro_face_easter_egg(s32 state, struct GraphNode *node, UNUSED void *c // Draw while the first or last face is visible. if (sFaceVisible[0] == 1 || sFaceVisible[17] == 1) { - image = intro_sample_frame_buffer(40, 40, 2, 2); + u16 *image = intro_sample_frame_buffer(40, 40, 2, 2); if (image != NULL) { SET_GRAPH_NODE_LAYER(genNode->fnNode.node.flags, LAYER_OPAQUE); dl = intro_draw_face(image, 40, 40); From 67ee6b395b16002a2c960b8e6fa1124ee001d67c Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Wed, 29 Sep 2021 00:09:11 -0700 Subject: [PATCH 43/97] callContext arg name in geo functions --- src/game/behavior_actions.c | 7 ++- src/game/behavior_actions.h | 14 +++--- src/game/behaviors/king_bobomb.inc.c | 8 ++-- src/game/behaviors/tuxie.inc.c | 30 ++++++------- src/game/behaviors/ukiki.inc.c | 15 ++----- src/goddard/gd_math.c | 67 ++++------------------------ src/menu/intro_geo.c | 47 +++++++++---------- src/menu/intro_geo.h | 12 ++--- 8 files changed, 65 insertions(+), 135 deletions(-) diff --git a/src/game/behavior_actions.c b/src/game/behavior_actions.c index ef80ee68..62942ccc 100644 --- a/src/game/behavior_actions.c +++ b/src/game/behavior_actions.c @@ -156,12 +156,11 @@ void spawn_mist_particles_variable(s32 count, s32 offsetY, f32 size) { #include "behaviors/breakable_box.inc.c" // not sure what this is doing here. not in a behavior file. -Gfx *geo_move_mario_part_from_parent(s32 run, UNUSED struct GraphNode *node, Mat4 mtx) { +Gfx *geo_move_mario_part_from_parent(s32 callContext, UNUSED struct GraphNode *node, Mat4 mtx) { Mat4 mtx2; - struct Object *obj; - if (run == TRUE) { - obj = (struct Object *) gCurGraphNodeObject; + if (callContext == GEO_CONTEXT_RENDER) { + struct Object *obj = (struct Object *) gCurGraphNodeObject; if (obj == gMarioObject && obj->prevObj != NULL) { create_transformation_from_matrices(mtx2, mtx, *gCurGraphNodeCamera->matrixPtr); obj_update_pos_from_parent_transformation(mtx2, obj->prevObj); diff --git a/src/game/behavior_actions.h b/src/game/behavior_actions.h index bab17674..71f353ee 100644 --- a/src/game/behavior_actions.h +++ b/src/game/behavior_actions.h @@ -551,25 +551,25 @@ void bhv_dust_smoke_loop(void); void bhv_yoshi_loop(void); void bhv_volcano_trap_loop(void); -Gfx *geo_move_mario_part_from_parent(s32 run, UNUSED struct GraphNode *node, Mat4 mtx); +Gfx *geo_move_mario_part_from_parent(s32 callContext, UNUSED struct GraphNode *node, Mat4 mtx); // Bowser -Gfx *geo_bits_bowser_coloring(s32 run, struct GraphNode *node, UNUSED s32 a2); -Gfx *geo_update_body_rot_from_parent(s32 run, UNUSED struct GraphNode *node, Mat4 mtx); -Gfx *geo_switch_bowser_eyes(s32 run, struct GraphNode *node, UNUSED Mat4 *mtx); +Gfx *geo_bits_bowser_coloring(s32 callContext, struct GraphNode *node, UNUSED s32 context); +Gfx *geo_update_body_rot_from_parent(s32 callContext, UNUSED struct GraphNode *node, Mat4 mtx); +Gfx *geo_switch_bowser_eyes(s32 callContext, struct GraphNode *node, UNUSED Mat4 *mtx); // Tuxie -Gfx *geo_switch_tuxie_mother_eyes(s32 run, struct GraphNode *node, UNUSED Mat4 *mtx); +Gfx *geo_switch_tuxie_mother_eyes(s32 callContext, struct GraphNode *node, UNUSED Mat4 *mtx); // Cap switch -Gfx *geo_update_held_mario_pos(s32 run, UNUSED struct GraphNode *node, Mat4 mtx); +Gfx *geo_update_held_mario_pos(s32 callContext, UNUSED struct GraphNode *node, Mat4 mtx); // Snufit Gfx *geo_snufit_move_mask(s32 callContext, struct GraphNode *node, UNUSED Mat4 *c); Gfx *geo_snufit_scale_body(s32 callContext, struct GraphNode *node, UNUSED Mat4 *c); // Bowser key cutscene -Gfx *geo_scale_bowser_key(s32 run, struct GraphNode *node, UNUSED Mat4 mtx); +Gfx *geo_scale_bowser_key(s32 callContext, struct GraphNode *node, UNUSED Mat4 mtx); // Water splash extern struct WaterDropletParams gShallowWaterSplashDropletParams; diff --git a/src/game/behaviors/king_bobomb.inc.c b/src/game/behaviors/king_bobomb.inc.c index b408d20f..ed0d012f 100644 --- a/src/game/behaviors/king_bobomb.inc.c +++ b/src/game/behaviors/king_bobomb.inc.c @@ -1,12 +1,10 @@ // king_bobomb.c.inc // Copy of geo_update_projectile_pos_from_parent -Gfx *geo_update_held_mario_pos(s32 run, UNUSED struct GraphNode *node, Mat4 mtx) { +Gfx *geo_update_held_mario_pos(s32 callContext, UNUSED struct GraphNode *node, Mat4 mtx) { Mat4 mtx2; - struct Object *obj; - - if (run == TRUE) { - obj = (struct Object *) gCurGraphNodeObject; + if (callContext == GEO_CONTEXT_RENDER) { + struct Object *obj = (struct Object *) gCurGraphNodeObject; if (obj->prevObj != NULL) { create_transformation_from_matrices(mtx2, mtx, *gCurGraphNodeCamera->matrixPtr); obj_update_pos_from_parent_transformation(mtx2, obj->prevObj); diff --git a/src/game/behaviors/tuxie.inc.c b/src/game/behaviors/tuxie.inc.c index 6c2655d9..c61ecdba 100644 --- a/src/game/behaviors/tuxie.inc.c +++ b/src/game/behaviors/tuxie.inc.c @@ -277,34 +277,30 @@ void bhv_small_penguin_loop(void) { /** Geo switch logic for Tuxie's mother's eyes. Cases 0-4. Interestingly, case * 4 is unused, and is the eye state seen in Shoshinkai 1995 footage. */ -Gfx *geo_switch_tuxie_mother_eyes(s32 run, struct GraphNode *node, UNUSED Mat4 *mtx) { - struct Object *obj; - struct GraphNodeSwitchCase *switchCase; - s32 timer; - - if (run == TRUE) { - obj = (struct Object *) gCurGraphNodeObject; - switchCase = (struct GraphNodeSwitchCase *) node; +Gfx *geo_switch_tuxie_mother_eyes(s32 callContext, struct GraphNode *node, UNUSED Mat4 *mtx) { + if (callContext == GEO_CONTEXT_RENDER) { + struct Object *obj = (struct Object *) gCurGraphNodeObject; + struct GraphNodeSwitchCase *switchCase = (struct GraphNodeSwitchCase *) node; switchCase->selectedCase = 0; // timer logic for blinking. uses cases 0-2. - timer = gGlobalTimer % 50; - if (timer < 43) + s32 timer = gGlobalTimer % 50; + if (timer < 43) { switchCase->selectedCase = 0; - else if (timer < 45) + } else if (timer < 45) { switchCase->selectedCase = 1; - else if (timer < 47) + } else if (timer < 47) { switchCase->selectedCase = 2; - else + } else { switchCase->selectedCase = 1; - + } /** make Tuxie's Mother have angry eyes if Mario takes the correct baby * after giving it back. The easiest way to check this is to see if she's * moving, since she only does when she's chasing Mario. */ - if (segmented_to_virtual(bhvTuxiesMother) == obj->behavior) - if (obj->oForwardVel > 5.0f) - switchCase->selectedCase = 3; + if ((segmented_to_virtual(bhvTuxiesMother) == obj->behavior) && (obj->oForwardVel > 5.0f)) { + switchCase->selectedCase = 3; + } } return NULL; } diff --git a/src/game/behaviors/ukiki.inc.c b/src/game/behaviors/ukiki.inc.c index bd58174c..32ed6a0d 100644 --- a/src/game/behaviors/ukiki.inc.c +++ b/src/game/behaviors/ukiki.inc.c @@ -27,25 +27,18 @@ void handle_cap_ukiki_reset(void) { * the cap ukiki. */ s32 is_cap_ukiki_and_mario_has_normal_cap_on_head(void) { - if (o->oBehParams2ndByte == UKIKI_CAP) { - if (does_mario_have_normal_cap_on_head(gMarioState)) { - return TRUE; - } - } - - return FALSE; + return ((o->oBehParams2ndByte == UKIKI_CAP) && does_mario_have_normal_cap_on_head(gMarioState)); } /** * Unused copy of geo_update_projectile_pos_from_parent. Perhaps a copy paste mistake. */ -Gfx *geo_update_projectile_pos_from_parent_copy(s32 run,UNUSED struct GraphNode *node, Mat4 mtx) { +Gfx *geo_update_projectile_pos_from_parent_copy(s32 callContext, UNUSED struct GraphNode *node, Mat4 mtx) { Mat4 mtx2; - struct Object* obj; - if (run == TRUE) { + if (callContext == GEO_CONTEXT_RENDER) { // TODO: change global type to Object pointer - obj = (struct Object *) gCurGraphNodeObject; + struct Object *obj = (struct Object *) gCurGraphNodeObject; if (obj->prevObj != NULL) { create_transformation_from_matrices(mtx2, mtx, *gCurGraphNodeCamera->matrixPtr); diff --git a/src/goddard/gd_math.c b/src/goddard/gd_math.c index c030e584..bdf4dd67 100644 --- a/src/goddard/gd_math.c +++ b/src/goddard/gd_math.c @@ -136,7 +136,6 @@ void gd_rot_mat_about_vec(Mat4f *mtx, struct GdVec3f *vec) { * translation column of a mat4f matrix. */ void gd_add_vec3f_to_mat4f_offset(Mat4f *mtx, struct GdVec3f *vec) { - UNUSED Mat4f temp; f32 z, y, x; x = vec->x; @@ -230,7 +229,6 @@ f32 gd_clamp_f32(f32 a, f32 b) { } else if (a < -b) { a = -b; } - return a; } @@ -375,8 +373,7 @@ f32 gd_dot_vec3f(struct GdVec3f *a, struct GdVec3f *b) { * Inverts each element of src into dst. */ void UNUSED gd_invert_elements_mat4f(Mat4f *src, Mat4f *dst) { - s32 i; - s32 j; + s32 i, j; for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { @@ -397,8 +394,7 @@ void gd_inverse_mat4f(Mat4f *src, Mat4f *dst) { gd_adjunct_mat4f(src, dst); determinant = gd_mat4f_det(dst); - if (ABS(determinant) < 1e-5) //? 1e-5f - { + if (ABS(determinant) < 1e-5) { //? 1e-5f fatal_print("Non-singular matrix, no inverse!\n"); } @@ -530,9 +526,7 @@ f32 gd_3x3_det(f32 r0c0, f32 r0c1, f32 r0c2, * returns the determinant. */ f32 gd_2x2_det(f32 a, f32 b, f32 c, f32 d) { - f32 det = a * d - b * c; - - return det; + return (a * d) - (b * c); } /** @@ -554,46 +548,6 @@ void UNUSED gd_create_neg_vec_zero_first_mat_row(Mat4f *mtx, struct GdVec3f *vec } } -/** - * This function quite literally does nothing. - * Seems to have been meant to create a vector from a quaternion? - */ -void UNUSED gd_broken_quat_to_vec3f(f32 quat[4], struct GdVec3f *vec, f32 zHalf, s32 i, s32 run) { - s32 j; - s32 k; - UNUSED f32 jVal; - UNUSED f32 kVal; - UNUSED struct GdVec3f uVec; - struct GdVec3f tVec; - - tVec.x = vec->x; - tVec.y = vec->y; - tVec.z = vec->z; - - if (run < 0) { - goto end; - } - - if ((j = i + 1) >= 4) { - j = 1; - } - - if ((k = j + 1) >= 4) { - k = 1; - } - - jVal = quat[j]; - kVal = quat[k]; - uVec.x = quat[0]; - uVec.y = quat[i]; - uVec.z = zHalf + zHalf; - -end: - vec->x = tVec.x; - vec->y = tVec.y; - vec->z = tVec.z; -} - /** * This function is a pitch rotation of a quaternion, with the sign allowing both regular * and inverse multiplication. @@ -896,8 +850,7 @@ void gd_print_bounding_box(UNUSED const char *prefix, UNUSED const struct GdBoun * does have a "Matrix:" prefix, so it was definitely used at one point. */ void gd_print_mtx(UNUSED const char *prefix, const Mat4f *mtx) { - s32 i; - s32 j; + s32 i, j; for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { @@ -927,13 +880,9 @@ void UNUSED gd_print_quat(const char *prefix, const f32 f[4]) { void UNUSED gd_rot_mat_offset(Mat4f *dst, f32 x, f32 y, f32 z, s32 copy) { f32 adj = 100.0f; Mat4f rot; - f32 c; - f32 s; - f32 opp; - f32 mag; struct GdVec3f vec; - opp = gd_sqrt_f(SQ(x) + SQ(y) + SQ(z)); + f32 opp = gd_sqrt_f(SQ(x) + SQ(y) + SQ(z)); if (opp == 0.0f) { if (copy) { @@ -942,9 +891,9 @@ void UNUSED gd_rot_mat_offset(Mat4f *dst, f32 x, f32 y, f32 z, s32 copy) { return; } - mag = gd_sqrt_f(SQ(adj) + SQ(opp)); - c = adj / mag; - s = opp / mag; + f32 mag = gd_sqrt_f(SQ(adj) + SQ(opp)); + f32 c = adj / mag; + f32 s = opp / mag; vec.x = -y / opp; vec.y = -x / opp; diff --git a/src/menu/intro_geo.c b/src/menu/intro_geo.c index 4bc27261..7a56f995 100644 --- a/src/menu/intro_geo.c +++ b/src/menu/intro_geo.c @@ -37,19 +37,18 @@ static s32 sTmCopyrightAlpha; /** * Geo callback to render the "Super Mario 64" logo on the title screen */ -Gfx *geo_intro_super_mario_64_logo(s32 state, struct GraphNode *node, UNUSED void *context) { +Gfx *geo_intro_super_mario_64_logo(s32 callContext, struct GraphNode *node, UNUSED void *context) { struct GraphNode *graphNode = node; Gfx *dl = NULL; Gfx *dlIter = NULL; - Mtx *scaleMat; - f32 *scaleTable1 = segmented_to_virtual(intro_seg7_table_scale_1); - f32 *scaleTable2 = segmented_to_virtual(intro_seg7_table_scale_2); - if (state != 1) { + if (callContext != GEO_CONTEXT_RENDER) { sIntroFrameCounter = 0; - } else if (state == 1) { + } else if (callContext == GEO_CONTEXT_RENDER) { + f32 *scaleTable1 = segmented_to_virtual(intro_seg7_table_scale_1); + f32 *scaleTable2 = segmented_to_virtual(intro_seg7_table_scale_2); SET_GRAPH_NODE_LAYER(graphNode->flags, LAYER_OPAQUE); - scaleMat = alloc_display_list(sizeof(*scaleMat)); + Mtx *scaleMat = alloc_display_list(sizeof(*scaleMat)); dl = alloc_display_list(4 * sizeof(*dl)); dlIter = dl; Vec3f scale; @@ -83,14 +82,14 @@ Gfx *geo_intro_super_mario_64_logo(s32 state, struct GraphNode *node, UNUSED voi /** * Geo callback to render TM and Copyright on the title screen */ -Gfx *geo_intro_tm_copyright(s32 state, struct GraphNode *node, UNUSED void *context) { +Gfx *geo_intro_tm_copyright(s32 callContext, struct GraphNode *node, UNUSED void *context) { struct GraphNode *graphNode = node; Gfx *dl = NULL; Gfx *dlIter = NULL; - if (state != 1) { // reset + if (callContext != GEO_CONTEXT_RENDER) { // reset sTmCopyrightAlpha = 0; - } else if (state == 1) { // draw + } else if (callContext == GEO_CONTEXT_RENDER) { // draw dl = alloc_display_list(5 * sizeof(*dl)); dlIter = dl; gSPDisplayList(dlIter++, dl_proj_mtx_fullscreen); @@ -179,7 +178,7 @@ static s8 *introBackgroundTables[] = { introBackgroundIndexTable }; /** * Geo callback to render the intro background tiles */ -Gfx *geo_intro_regular_backdrop(s32 state, struct GraphNode *node, UNUSED void *context) { +Gfx *geo_intro_regular_backdrop(s32 callContext, struct GraphNode *node, UNUSED void *context) { struct GraphNodeMore *graphNode = (struct GraphNodeMore *) node; s32 index = graphNode->bgTableID & 0xff; // TODO: word at offset 0x18 of struct GraphNode (always ends up being 0) s8 *backgroundTable = introBackgroundTables[index]; @@ -187,7 +186,7 @@ Gfx *geo_intro_regular_backdrop(s32 state, struct GraphNode *node, UNUSED void * Gfx *dlIter = NULL; s32 i; - if (state == 1) { // draw + if (callContext == GEO_CONTEXT_RENDER) { // draw dl = alloc_display_list(16 * sizeof(*dl)); dlIter = dl; SET_GRAPH_NODE_LAYER(graphNode->node.flags, LAYER_OPAQUE); @@ -212,14 +211,13 @@ static s8 gameOverBackgroundTable[] = { /** * Geo callback to render the Game Over background tiles */ -Gfx *geo_intro_gameover_backdrop(s32 state, struct GraphNode *node, UNUSED void *context) { +Gfx *geo_intro_gameover_backdrop(s32 callContext, struct GraphNode *node, UNUSED void *context) { struct GraphNode *graphNode = node; Gfx *dl = NULL; Gfx *dlIter = NULL; - s32 j; - s32 i; + s32 i, j; - if (state != 1) { // reset + if (callContext != GEO_CONTEXT_RENDER) { // reset sGameOverFrameCounter = 0; sGameOverTableIndex = -2; for (i = 0; i < ARRAY_COUNT(gameOverBackgroundTable); ++i) @@ -376,17 +374,16 @@ u16 *intro_sample_frame_buffer(s32 imageW, s32 imageH, s32 sampleW, s32 sampleH) return image; } -Gfx *geo_intro_face_easter_egg(s32 state, struct GraphNode *node, UNUSED void *context) { +Gfx *geo_intro_face_easter_egg(s32 callContext, struct GraphNode *node, UNUSED void *context) { struct GraphNodeGenerated *genNode = (struct GraphNodeGenerated *)node; Gfx *dl = NULL; s32 i; - if (state != 1) { + if (callContext != GEO_CONTEXT_RENDER) { for (i = 0; i < 48; i++) { sFaceVisible[i] = 0; } - - } else if (state == 1) { + } else if (callContext == GEO_CONTEXT_RENDER) { if (sFaceCounter == 0) { if (gPlayer1Controller->buttonPressed & Z_TRIG) { play_sound(SOUND_MENU_STAR_SOUND, gGlobalSoundSource); @@ -399,7 +396,6 @@ Gfx *geo_intro_face_easter_egg(s32 state, struct GraphNode *node, UNUSED void *c sFaceCounter = 0; } } - // Draw while the first or last face is visible. if (sFaceVisible[0] == 1 || sFaceVisible[17] == 1) { u16 *image = intro_sample_frame_buffer(40, 40, 2, 2); @@ -415,18 +411,17 @@ Gfx *geo_intro_face_easter_egg(s32 state, struct GraphNode *node, UNUSED void *c #endif #if ENABLE_RUMBLE -Gfx *geo_intro_rumble_pak_graphic(s32 state, struct GraphNode *node, UNUSED void *context) { +Gfx *geo_intro_rumble_pak_graphic(s32 callContext, struct GraphNode *node, UNUSED void *context) { struct GraphNodeGenerated *genNode = (struct GraphNodeGenerated *)node; Gfx *dlIter; Gfx *dl = NULL; - s32 introContext; s8 backgroundTileSix = 0; - if (state != 1) { + if (callContext != GEO_CONTEXT_RENDER) { dl = NULL; - } else if (state == 1) { + } else if (callContext == GEO_CONTEXT_RENDER) { SET_GRAPH_NODE_LAYER(genNode->fnNode.node.flags, LAYER_OPAQUE); - introContext = genNode->parameter & 0xFF; + s32 introContext = (genNode->parameter & 0xFF); if (introContext == 0) { backgroundTileSix = introBackgroundIndexTable[6]; } else if (introContext == 1) { diff --git a/src/menu/intro_geo.h b/src/menu/intro_geo.h index 3f882621..fb9f1349 100644 --- a/src/menu/intro_geo.h +++ b/src/menu/intro_geo.h @@ -7,16 +7,16 @@ #include "types.h" #include "engine/graph_node.h" -Gfx *geo_intro_super_mario_64_logo(s32 state, struct GraphNode *node, UNUSED void *context); -Gfx *geo_intro_tm_copyright(s32 state, struct GraphNode *node, UNUSED void *context); -Gfx *geo_intro_regular_backdrop(s32 state, struct GraphNode *node, UNUSED void *context); -Gfx *geo_intro_gameover_backdrop(s32 state, struct GraphNode *node, UNUSED void *context); +Gfx *geo_intro_super_mario_64_logo(s32 callContext, struct GraphNode *node, UNUSED void *context); +Gfx *geo_intro_tm_copyright(s32 callContext, struct GraphNode *node, UNUSED void *context); +Gfx *geo_intro_regular_backdrop(s32 callContext, struct GraphNode *node, UNUSED void *context); +Gfx *geo_intro_gameover_backdrop(s32 callContext, struct GraphNode *node, UNUSED void *context); #ifdef GODDARD_EASTER_EGG -Gfx *geo_intro_face_easter_egg(s32 state, struct GraphNode *node, UNUSED void *context); +Gfx *geo_intro_face_easter_egg(s32 callContext, struct GraphNode *node, UNUSED void *context); #endif #if ENABLE_RUMBLE -Gfx *geo_intro_rumble_pak_graphic(s32 state, struct GraphNode *node, UNUSED void *context); +Gfx *geo_intro_rumble_pak_graphic(s32 callContext, struct GraphNode *node, UNUSED void *context); #endif #endif // INTRO_GEO_H From 510e5c137f6329c79b47203d6e1ef6c8d4269b90 Mon Sep 17 00:00:00 2001 From: Fazana <52551480+FazanaJ@users.noreply.github.com> Date: Wed, 29 Sep 2021 11:59:19 +0100 Subject: [PATCH 44/97] Revert some changes Something amongst these remaining changes is a substantial decrease in game performance. I've taken out stuff that's confirmed not to, whilst something left is part of the problem. --- src/game/behaviors/amp.inc.c | 2 +- src/game/behaviors/bbh_merry_go_round.inc.c | 2 +- src/game/behaviors/beta_chest.inc.c | 2 +- src/game/behaviors/boo.inc.c | 40 ++++++--- src/game/behaviors/bowser.inc.c | 40 ++++++--- src/game/behaviors/bowser_flame.inc.c | 8 +- src/game/behaviors/bowser_key_cutscene.inc.c | 4 +- src/game/behaviors/bub.inc.c | 4 +- src/game/behaviors/butterfly.inc.c | 6 +- src/game/behaviors/chain_chomp.inc.c | 59 +++++++------- src/game/behaviors/chuckya.inc.c | 12 +-- src/game/behaviors/end_birds_2.inc.c | 3 +- src/game/behaviors/eyerok.inc.c | 8 +- src/game/behaviors/haunted_chair.inc.c | 2 +- src/game/behaviors/heave_ho.inc.c | 2 +- src/game/behaviors/hoot.inc.c | 2 +- src/game/behaviors/intro_lakitu.inc.c | 4 +- src/game/behaviors/king_bobomb.inc.c | 8 +- src/game/behaviors/klepto.inc.c | 7 +- src/game/behaviors/koopa.inc.c | 5 +- src/game/behaviors/mad_piano.inc.c | 6 +- src/game/behaviors/purple_switch.inc.c | 6 +- src/game/behaviors/scuttlebug.inc.c | 2 +- src/game/behaviors/sparkle_spawn_star.inc.c | 6 +- src/game/behaviors/spindrift.inc.c | 2 +- src/game/behaviors/strong_wind_particle.inc.c | 4 +- .../behaviors/tilting_inverted_pyramid.inc.c | 81 +++++++++++++------ src/game/behaviors/tuxie.inc.c | 16 ++-- src/game/behaviors/tweester.inc.c | 7 +- src/game/behaviors/ukiki.inc.c | 23 ++++-- src/game/behaviors/water_bomb.inc.c | 8 +- src/game/camera.c | 7 +- src/game/object_helpers.c | 79 +++++++++--------- src/game/object_helpers.h | 6 +- 34 files changed, 285 insertions(+), 188 deletions(-) diff --git a/src/game/behaviors/amp.inc.c b/src/game/behaviors/amp.inc.c index eb417c57..f9bb9bed 100644 --- a/src/game/behaviors/amp.inc.c +++ b/src/game/behaviors/amp.inc.c @@ -270,7 +270,7 @@ static void fixed_circling_amp_idle_loop(void) { f32 xToMario = gMarioObject->header.gfx.pos[0] - o->oPosX; f32 yToMario = gMarioObject->header.gfx.pos[1] + 120.0f - o->oPosY; f32 zToMario = gMarioObject->header.gfx.pos[2] - o->oPosZ; - s16 vAngleToMario = atan2s(sqrtf(sqr(xToMario) + sqr(zToMario)), -yToMario); + s16 vAngleToMario = atan2s(sqrtf(xToMario * xToMario + zToMario * zToMario), -yToMario); obj_turn_toward_object(o, gMarioObject, 19, 0x1000); o->oFaceAnglePitch = approach_s16_symmetric(o->oFaceAnglePitch, vAngleToMario, 0x1000); diff --git a/src/game/behaviors/bbh_merry_go_round.inc.c b/src/game/behaviors/bbh_merry_go_round.inc.c index f65a3197..d1d047da 100644 --- a/src/game/behaviors/bbh_merry_go_round.inc.c +++ b/src/game/behaviors/bbh_merry_go_round.inc.c @@ -12,7 +12,7 @@ static void handle_merry_go_round_music(void) { // If the music should play, play it and check whether it still should. // Otherwise, don't play it and check whether it should. - if (!o->oMerryGoRoundMusicShouldPlay) { + if (o->oMerryGoRoundMusicShouldPlay == FALSE) { if (gMarioCurrentRoom == BBH_NEAR_MERRY_GO_ROUND_ROOM) { // Play the merry-go-round and BBH music at the same time play_secondary_music(SEQ_EVENT_MERRY_GO_ROUND, 45, 20, 200); diff --git a/src/game/behaviors/beta_chest.inc.c b/src/game/behaviors/beta_chest.inc.c index 6a373f29..7a1a786d 100644 --- a/src/game/behaviors/beta_chest.inc.c +++ b/src/game/behaviors/beta_chest.inc.c @@ -44,7 +44,7 @@ void bhv_beta_chest_bottom_loop(void) { void bhv_beta_chest_lid_loop(void) { switch (o->oAction) { case BETA_CHEST_ACT_IDLE_CLOSED: - if (dist_between_objects_squared(o->parentObj, gMarioObject) < sqr(300.0f)) { + if (dist_between_objects(o->parentObj, gMarioObject) < 300.0f) { o->oAction++; // Set to BETA_CHEST_ACT_OPENING } diff --git a/src/game/behaviors/boo.inc.c b/src/game/behaviors/boo.inc.c index 037d8178..6509da94 100644 --- a/src/game/behaviors/boo.inc.c +++ b/src/game/behaviors/boo.inc.c @@ -14,9 +14,9 @@ static struct ObjectHitbox sBooGivingStarHitbox = { // Relative positions static s16 sCourtyardBooTripletPositions[][3] = { - { 0, 50, 0}, - { 210, 110, 210}, - {-210, 70, -210} + {0, 50, 0}, + {210, 110, 210}, + {-210, 70, -210} }; static void boo_stop(void) { @@ -31,14 +31,20 @@ void bhv_boo_init(void) { static s32 boo_should_be_stopped(void) { if (cur_obj_has_behavior(bhvMerryGoRoundBigBoo) || cur_obj_has_behavior(bhvMerryGoRoundBoo)) { - return (!gMarioOnMerryGoRound); + if (!gMarioOnMerryGoRound) { + return TRUE; + } else { + return FALSE; + } } else { if (o->activeFlags & ACTIVE_FLAG_IN_DIFFERENT_ROOM) { return TRUE; } - if ((o->oRoom == 10) && (gTimeStopState & TIME_STOP_MARIO_OPENED_DOOR)) { - return TRUE; + if (o->oRoom == 10) { + if (gTimeStopState & TIME_STOP_MARIO_OPENED_DOOR) { + return TRUE; + } } } @@ -46,10 +52,20 @@ static s32 boo_should_be_stopped(void) { } static s32 boo_should_be_active(void) { - f32 activationRadius = (cur_obj_has_behavior(bhvBalconyBigBoo) ? 5000.0f : 1500.0f); + f32 activationRadius; + + if (cur_obj_has_behavior(bhvBalconyBigBoo)) { + activationRadius = 5000.0f; + } else { + activationRadius = 1500.0f; + } if (cur_obj_has_behavior(bhvMerryGoRoundBigBoo) || cur_obj_has_behavior(bhvMerryGoRoundBoo)) { - return (gMarioOnMerryGoRound); + if (gMarioOnMerryGoRound == TRUE) { + return TRUE; + } else { + return FALSE; + } } else if (o->oRoom == -1) { if (o->oDistanceToMario < activationRadius) { return TRUE; @@ -283,7 +299,11 @@ static s32 boo_update_during_death(void) { } static s32 obj_has_attack_type(u32 attackType) { - return ((o->oInteractStatus & INT_STATUS_ATTACK_MASK) == attackType); + if ((o->oInteractStatus & INT_STATUS_ATTACK_MASK) == attackType) { + return TRUE; + } else { + return FALSE; + } } static s32 boo_get_attack_status(void) { @@ -318,7 +338,7 @@ static void boo_chase_mario(f32 minDY, s16 yawIncrement, f32 mul) { if (boo_vanish_or_appear()) { o->oInteractType = 0x8000; - if (!cur_obj_lateral_dist_from_mario_to_home_is_in_range(1500.0f)) { + if (cur_obj_lateral_dist_from_mario_to_home() > 1500.0f) { targetYaw = cur_obj_angle_to_home(); } else { targetYaw = o->oAngleToMario; diff --git a/src/game/behaviors/bowser.inc.c b/src/game/behaviors/bowser.inc.c index 50ef6f6e..61e175fe 100644 --- a/src/game/behaviors/bowser.inc.c +++ b/src/game/behaviors/bowser.inc.c @@ -187,7 +187,11 @@ s32 bowser_set_anim_look_up_and_walk(void) { if (cur_obj_check_anim_frame(21)) { o->oForwardVel = 3.0f; } - return (cur_obj_check_if_near_animation_end()); + if (cur_obj_check_if_near_animation_end()) { + return TRUE; + } else { + return FALSE; + } } /** @@ -197,7 +201,11 @@ s32 bowser_set_anim_look_up_and_walk(void) { s32 bowser_set_anim_slow_gait(void) { o->oForwardVel = 3.0f; cur_obj_init_animation_with_sound(BOWSER_ANIM_SLOW_GAIT); - return (cur_obj_check_if_near_animation_end()); + if (cur_obj_check_if_near_animation_end()) { + return TRUE; + } else { + return FALSE; + } } /** @@ -209,7 +217,11 @@ s32 bowser_set_anim_look_down_stop_walk(void) { if (cur_obj_check_anim_frame(20)) { o->oForwardVel = 0.0f; } - return (cur_obj_check_if_near_animation_end()); + if (cur_obj_check_if_near_animation_end()) { + return TRUE; + } else { + return FALSE; + } } @@ -303,7 +315,7 @@ void bowser_bitdw_actions(void) { // Generate random float f32 rand = random_float(); // Set attacks when Bowser Reacts - if (!o->oBowserIsReacting) { + if (o->oBowserIsReacting == FALSE) { if (o->oBowserStatus & BOWSER_STATUS_ANGLE_MARIO) { if (o->oDistanceToMario < 1500.0f) { o->oAction = BOWSER_ACT_BREATH_FIRE; // nearby @@ -346,7 +358,7 @@ void bowser_bitfs_actions(void) { // Generate random float f32 rand = random_float(); // Set attacks when Bowser Reacts - if (!o->oBowserIsReacting) { + if (o->oBowserIsReacting == FALSE) { if (o->oBowserStatus & BOWSER_STATUS_ANGLE_MARIO) { if (o->oDistanceToMario < 1300.0f) { // nearby if (rand < 0.5f) { // 50% chance @@ -413,7 +425,7 @@ void bowser_bits_actions(void) { case FALSE: // oBowserBitsJustJump never changes value, // so its always FALSE, maybe a debug define - if (!o->oBowserBitsJustJump) { + if (o->oBowserBitsJustJump == FALSE) { bowser_bits_action_list(); } else { bowser_set_act_big_jump(); @@ -657,7 +669,11 @@ void bowser_act_hit_mine(void) { */ s32 bowser_set_anim_jump(void) { cur_obj_init_animation_with_sound(BOWSER_ANIM_JUMP_START); - return (cur_obj_check_anim_frame(11)); + if (cur_obj_check_anim_frame(11)) { + return TRUE; + } else { + return FALSE; + } } /** @@ -843,7 +859,11 @@ s32 bowser_turn_on_timer(s32 time, s16 yaw) { } o->oForwardVel = 0.0f; o->oMoveAngleYaw += yaw; - return (o->oTimer >= time); + if (o->oTimer >= time) { + return TRUE; + } else { + return FALSE; + } } /** @@ -1049,7 +1069,7 @@ void bowser_act_jump_onto_stage(void) { o->oDragStrength = 10.0f; o->oSubAction++; // Spawn shockwave (BITS only) if is not on a platform - if (!onDynamicFloor) { + if (onDynamicFloor == FALSE) { bowser_spawn_shockwave(); // If is on a dynamic floor in BITS, then jump // because of the falling platform @@ -1624,7 +1644,7 @@ void bhv_bowser_loop(void) { s16 angleToCentre; // AngleToCentre from Bowser's perspective // Set distance/angle values - o->oBowserDistToCentre = sqrtf(sqr(o->oPosX) + sqr(o->oPosZ)); + o->oBowserDistToCentre = sqrtf(o->oPosX * o->oPosX + o->oPosZ * o->oPosZ); o->oBowserAngleToCentre = atan2s(0.0f - o->oPosZ, 0.0f - o->oPosX); angleToMario = abs_angle_diff(o->oMoveAngleYaw, o->oAngleToMario); angleToCentre = abs_angle_diff(o->oMoveAngleYaw, o->oBowserAngleToCentre); diff --git a/src/game/behaviors/bowser_flame.inc.c b/src/game/behaviors/bowser_flame.inc.c index c8b138da..f709ef18 100644 --- a/src/game/behaviors/bowser_flame.inc.c +++ b/src/game/behaviors/bowser_flame.inc.c @@ -214,8 +214,12 @@ void bhv_flame_bouncing_loop(void) { if (bowser_flame_should_despawn(300)) { obj_mark_for_deletion(o); } - if ((bowser != NULL) && (bowser->oHeldState == HELD_FREE) && (lateral_dist_between_objects_squared(o, bowser) < sqr(300.0f))) { - obj_mark_for_deletion(o); + if (bowser != NULL) { + if (bowser->oHeldState == HELD_FREE) { + if (lateral_dist_between_objects(o, bowser) < 300.0f) { + obj_mark_for_deletion(o); + } + } } } diff --git a/src/game/behaviors/bowser_key_cutscene.inc.c b/src/game/behaviors/bowser_key_cutscene.inc.c index 62c7c7cf..96c074c7 100644 --- a/src/game/behaviors/bowser_key_cutscene.inc.c +++ b/src/game/behaviors/bowser_key_cutscene.inc.c @@ -1,8 +1,8 @@ // bowser_key_cutscene.inc.c -Gfx *geo_scale_bowser_key(s32 callContext, struct GraphNode *node, UNUSED Mat4 mtx) { +Gfx *geo_scale_bowser_key(s32 run, struct GraphNode *node, UNUSED Mat4 mtx) { struct Object *nodeObj; - if (callContext == GEO_CONTEXT_RENDER) { + if (run == TRUE) { nodeObj = (struct Object *) gCurGraphNodeObject; ((struct GraphNodeScale *) node->next)->scale = nodeObj->oBowserKeyScale; } diff --git a/src/game/behaviors/bub.inc.c b/src/game/behaviors/bub.inc.c index 5caf416a..a54536f8 100644 --- a/src/game/behaviors/bub.inc.c +++ b/src/game/behaviors/bub.inc.c @@ -67,7 +67,7 @@ void bub_act_1(void) { if (dy > 300.0f) o->oPosY = o->oPosY - 1.0f; } - if (!cur_obj_lateral_dist_from_mario_to_home_is_in_range(800.0f)) + if (800.0f < cur_obj_lateral_dist_from_mario_to_home()) o->oAngleToMario = cur_obj_angle_to_home(); cur_obj_rotate_yaw_toward(o->oAngleToMario, 0x100); if (o->oDistanceToMario < 200.0f) @@ -101,7 +101,7 @@ void bub_act_2(void) { if (dy > 300.0f) o->oPosY -= 1.0f; } - if (!cur_obj_lateral_dist_from_mario_to_home_is_in_range(800.0f)) + if (cur_obj_lateral_dist_from_mario_to_home() > 800.0f) o->oAngleToMario = cur_obj_angle_to_home(); cur_obj_rotate_yaw_toward(o->oAngleToMario + 0x8000, 0x400); if (o->oTimer > 200 && o->oDistanceToMario > 600.0f) diff --git a/src/game/behaviors/butterfly.inc.c b/src/game/behaviors/butterfly.inc.c index 885cfe0d..cb72c0c2 100644 --- a/src/game/behaviors/butterfly.inc.c +++ b/src/game/behaviors/butterfly.inc.c @@ -73,7 +73,7 @@ void butterfly_act_return_home(void) { f32 homeDistY = o->oHomeY - o->oPosY; f32 homeDistZ = o->oHomeZ - o->oPosZ; s16 hAngleToHome = atan2s(homeDistZ, homeDistX); - s16 vAngleToHome = atan2s(sqrtf(sqr(homeDistX) + sqr(homeDistZ)), -homeDistY); + s16 vAngleToHome = atan2s(sqrtf(homeDistX * homeDistX + homeDistZ * homeDistZ), -homeDistY); o->oMoveAngleYaw = approach_s16_symmetric(o->oMoveAngleYaw, hAngleToHome, 0x800); o->oMoveAnglePitch = approach_s16_symmetric(o->oMoveAnglePitch, vAngleToHome, 0x50); @@ -84,7 +84,9 @@ void butterfly_act_return_home(void) { cur_obj_init_animation(1); o->oAction = BUTTERFLY_ACT_RESTING; - vec3_copy(&o->oPosVec, &o->oHomeVec); + o->oPosX = o->oHomeX; + o->oPosY = o->oHomeY; + o->oPosZ = o->oHomeZ; } } diff --git a/src/game/behaviors/chain_chomp.inc.c b/src/game/behaviors/chain_chomp.inc.c index 07a4ab8f..609ec508 100644 --- a/src/game/behaviors/chain_chomp.inc.c +++ b/src/game/behaviors/chain_chomp.inc.c @@ -88,8 +88,10 @@ static void chain_chomp_act_uninitialized(void) { static void chain_chomp_update_chain_segments(void) { struct ChainSegment *prevSegment; struct ChainSegment *segment; - Vec3f offset; - f32 mag; + f32 offsetX; + f32 offsetY; + f32 offsetZ; + f32 offset; f32 segmentVelY; f32 maxTotalOffset; s32 i; @@ -113,41 +115,40 @@ static void chain_chomp_update_chain_segments(void) { segment->posY = 0.0f; } - // Cap distance to previous chain part (so that the tail follows the chomp) + // Cap distance to previous chain part (so that the tail follows the + // chomp) - offset[0] = segment->posX - prevSegment->posX; - offset[1] = segment->posY - prevSegment->posY; - offset[2] = segment->posZ - prevSegment->posZ; - mag = (sqr(offset[0]) + sqr(offset[1]) + sqr(offset[2])); + offsetX = segment->posX - prevSegment->posX; + offsetY = segment->posY - prevSegment->posY; + offsetZ = segment->posZ - prevSegment->posZ; + offset = sqrtf(offsetX * offsetX + offsetY * offsetY + offsetZ * offsetZ); - if (mag > sqr(o->oChainChompMaxDistBetweenChainParts)) { - mag = sqrtf(mag); - mag = o->oChainChompMaxDistBetweenChainParts / mag; - offset[0] *= mag; - offset[1] *= mag; - offset[2] *= mag; + if (offset > o->oChainChompMaxDistBetweenChainParts) { + offset = o->oChainChompMaxDistBetweenChainParts / offset; + offsetX *= offset; + offsetY *= offset; + offsetZ *= offset; } // Cap distance to pivot (so that it stretches when the chomp moves far // from the wooden post) - offset[0] += prevSegment->posX; - offset[1] += prevSegment->posY; - offset[2] += prevSegment->posZ; - mag = (sqr(offset[0]) + sqr(offset[1]) + sqr(offset[2])); + offsetX += prevSegment->posX; + offsetY += prevSegment->posY; + offsetZ += prevSegment->posZ; + offset = sqrtf(offsetX * offsetX + offsetY * offsetY + offsetZ * offsetZ); maxTotalOffset = o->oChainChompMaxDistFromPivotPerChainPart * (5 - i); - if (mag > sqr(maxTotalOffset)) { - mag = sqrtf(mag); - mag = maxTotalOffset / mag; - offset[0] *= mag; - offset[1] *= mag; - offset[2] *= mag; + if (offset > maxTotalOffset) { + offset = maxTotalOffset / offset; + offsetX *= offset; + offsetY *= offset; + offsetZ *= offset; } - segment->posX = offset[0]; - segment->posY = offset[1]; - segment->posZ = offset[2]; + segment->posX = offsetX; + segment->posY = offsetY; + segment->posZ = offsetZ; } } @@ -396,9 +397,9 @@ static void chain_chomp_act_move(void) { o->oChainChompSegments[0].posZ = o->oPosZ - o->parentObj->oPosZ; o->oChainChompDistToPivot = - sqrtf(sqr(o->oChainChompSegments[0].posX) - + sqr(o->oChainChompSegments[0].posY) - + sqr(o->oChainChompSegments[0].posZ)); + 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; diff --git a/src/game/behaviors/chuckya.inc.c b/src/game/behaviors/chuckya.inc.c index bae7f4f6..942e4124 100644 --- a/src/game/behaviors/chuckya.inc.c +++ b/src/game/behaviors/chuckya.inc.c @@ -38,8 +38,8 @@ void bhv_chuckya_anchor_mario_loop(void) { s32 unknown_chuckya_function(s32 updateAngle, f32 latDist, f32 dist, s32 time) { s32 ret = 0; if (o->oChuckyaUnused != 4) { - if (!cur_obj_lateral_dist_from_mario_to_home_is_in_range(latDist)) { - if (cur_obj_lateral_dist_to_home_is_in_range(200.0f)) { + if (latDist < cur_obj_lateral_dist_from_mario_to_home()) { + if (cur_obj_lateral_dist_to_home() < 200.0f) { ret = 0; } else { ret = 1; @@ -86,7 +86,7 @@ void chuckya_act_0(void) { switch (initialSubAction = o->oSubAction) { case 0: o->oForwardVel = 0; - if (cur_obj_lateral_dist_from_mario_to_home_is_in_range(2000.0f)) { + if (cur_obj_lateral_dist_from_mario_to_home() < 2000.0f) { cur_obj_rotate_yaw_toward(o->oAngleToMario, 0x400); if (o->oChuckyaSubActionTimer > 40 || abs_angle_diff(o->oMoveAngleYaw, o->oAngleToMario) < 0x1000) @@ -98,7 +98,7 @@ void chuckya_act_0(void) { approach_forward_vel(&o->oForwardVel, 30.0f, 4.0f); if (abs_angle_diff(o->oMoveAngleYaw, o->oAngleToMario) > 0x4000) o->oSubAction = 2; - if (!cur_obj_lateral_dist_from_mario_to_home_is_in_range(2000.0f)) + if (cur_obj_lateral_dist_from_mario_to_home() > 2000.0f) o->oSubAction = 3; break; case 2: @@ -107,14 +107,14 @@ void chuckya_act_0(void) { o->oSubAction = 0; break; case 3: - if (cur_obj_lateral_dist_to_home_is_in_range(500.0f)) + if (cur_obj_lateral_dist_to_home() < 500.0f) o->oForwardVel = 0; else { approach_forward_vel(&o->oForwardVel, 10.0f, 4.0f); o->oAngleToMario = cur_obj_angle_to_home(); cur_obj_rotate_yaw_toward(o->oAngleToMario, 0x800); } - if (cur_obj_lateral_dist_from_mario_to_home_is_in_range(1900.0f)) + if (cur_obj_lateral_dist_from_mario_to_home() < 1900.0f) o->oSubAction = 0; break; } diff --git a/src/game/behaviors/end_birds_2.inc.c b/src/game/behaviors/end_birds_2.inc.c index cd52f8b4..8f5ef9dd 100644 --- a/src/game/behaviors/end_birds_2.inc.c +++ b/src/game/behaviors/end_birds_2.inc.c @@ -18,9 +18,8 @@ void bhv_end_birds_2_loop(void) { vec3f_set_dist_and_angle(gCamera->pos, pos, 14000.f, pitch, yaw); obj_rotate_towards_point(gCurrentObject, pos, 0, 0, 8, 8); - if ((gCurrentObject->oEndBirdCutsceneVars9PointX == 0.f) && (gCurrentObject->oTimer == 0)) { + if ((gCurrentObject->oEndBirdCutsceneVars9PointX == 0.f) && (gCurrentObject->oTimer == 0)) cur_obj_play_sound_2(SOUND_GENERAL_BIRDS_FLY_AWAY); - } break; } diff --git a/src/game/behaviors/eyerok.inc.c b/src/game/behaviors/eyerok.inc.c index e3c52ad6..33b49610 100644 --- a/src/game/behaviors/eyerok.inc.c +++ b/src/game/behaviors/eyerok.inc.c @@ -12,8 +12,12 @@ struct ObjectHitbox sEyerokHitbox = { s8 sEyerokAnimStatesList[] = { 0, 1, 3, 2, 1, 0 }; -static s32 eyerok_check_mario_relative_z(s32 z) { - return (gMarioObject->oPosZ - o->oHomeZ < z); +static s32 eyerok_check_mario_relative_z(s32 arg0) { + if (gMarioObject->oPosZ - o->oHomeZ < arg0) { + return TRUE; + } else { + return FALSE; + } } static void eyerok_spawn_hand(s16 side, s32 model, const BehaviorScript *behavior) { diff --git a/src/game/behaviors/haunted_chair.inc.c b/src/game/behaviors/haunted_chair.inc.c index 28ab9786..29d8cb47 100644 --- a/src/game/behaviors/haunted_chair.inc.c +++ b/src/game/behaviors/haunted_chair.inc.c @@ -29,7 +29,7 @@ void haunted_chair_act_0(void) { if (o->parentObj != o) { if (o->oHauntedChairFallTargetAngle == 0) { - if (lateral_dist_between_objects_squared(o, o->parentObj) < sqr(250.0f)) { + if (lateral_dist_between_objects(o, o->parentObj) < 250.0f) { dAngleToPiano = obj_angle_to_object(o, o->parentObj) - o->oFaceAngleYaw + 0x2000; if (dAngleToPiano & 0x4000) { o->oHauntedChairFallFromPianoAngle = &o->oFaceAngleRoll; diff --git a/src/game/behaviors/heave_ho.inc.c b/src/game/behaviors/heave_ho.inc.c index fc0a2321..c20ae418 100644 --- a/src/game/behaviors/heave_ho.inc.c +++ b/src/game/behaviors/heave_ho.inc.c @@ -42,7 +42,7 @@ void heave_ho_act_1(void) { void heave_ho_act_2(void) { s16 angleVel; - if (!cur_obj_lateral_dist_from_mario_to_home_is_in_range(1000.0f)) + if (1000.0f < cur_obj_lateral_dist_from_mario_to_home()) o->oAngleToMario = cur_obj_angle_to_home(); if (o->oTimer > 150) { o->oHeaveHoTimedSpeed = (302 - o->oTimer) / 152.0f; diff --git a/src/game/behaviors/hoot.inc.c b/src/game/behaviors/hoot.inc.c index 6f5e8260..a77383b9 100644 --- a/src/game/behaviors/hoot.inc.c +++ b/src/game/behaviors/hoot.inc.c @@ -196,7 +196,7 @@ void hoot_turn_to_home(void) { f32 homeDistY = o->oHomeY - o->oPosY; f32 homeDistZ = o->oHomeZ - o->oPosZ; s16 hAngleToHome = atan2s(homeDistZ, homeDistX); - s16 vAngleToHome = atan2s(sqrtf(sqr(homeDistX) + sqr(homeDistZ)), -homeDistY); + s16 vAngleToHome = atan2s(sqrtf(homeDistX * homeDistX + homeDistZ * homeDistZ), -homeDistY); o->oMoveAngleYaw = approach_s16_symmetric(o->oMoveAngleYaw, hAngleToHome, 0x140); o->oMoveAnglePitch = approach_s16_symmetric(o->oMoveAnglePitch, vAngleToHome, 0x140); diff --git a/src/game/behaviors/intro_lakitu.inc.c b/src/game/behaviors/intro_lakitu.inc.c index 82e3417c..a36f8614 100644 --- a/src/game/behaviors/intro_lakitu.inc.c +++ b/src/game/behaviors/intro_lakitu.inc.c @@ -24,9 +24,11 @@ void intro_lakitu_set_offset_from_camera(struct Object *obj, Vec3f offset) { } void intro_lakitu_set_focus(struct Object *obj, Vec3f newFocus) { + f32 dist; s16 pitch, yaw; + // newFocus is an offset from lakitu's origin, not a point in the world. - vec3f_get_angle(gVec3fZero, newFocus, &pitch, &yaw); + vec3f_get_dist_and_angle(gVec3fZero, newFocus, &dist, &pitch, &yaw); obj->oFaceAnglePitch = pitch; obj->oFaceAngleYaw = yaw; } diff --git a/src/game/behaviors/king_bobomb.inc.c b/src/game/behaviors/king_bobomb.inc.c index ed0d012f..ce7a0ce8 100644 --- a/src/game/behaviors/king_bobomb.inc.c +++ b/src/game/behaviors/king_bobomb.inc.c @@ -38,8 +38,12 @@ void king_bobomb_act_0(void) { } } -s32 mario_is_far_below_object(f32 maxY) { - return (maxY < (o->oPosY - gMarioObject->oPosY)); +s32 mario_is_far_below_object(f32 arg0) { + if (arg0 < o->oPosY - gMarioObject->oPosY) { + return TRUE; + } else { + return FALSE; + } } void king_bobomb_act_2(void) { diff --git a/src/game/behaviors/klepto.inc.c b/src/game/behaviors/klepto.inc.c index a90cb6c2..561c4673 100644 --- a/src/game/behaviors/klepto.inc.c +++ b/src/game/behaviors/klepto.inc.c @@ -265,8 +265,11 @@ static void klepto_act_struck_by_mario(void) { o->oGravity = 0.0f; o->oMoveAnglePitch = -obj_get_pitch_from_vel(); - o->oKleptoSpeed = sqrtf(sqr(o->oForwardVel) + sqr(o->oVelY)); - vec3_copy_y_off(&o->oHomeVec, &o->oPosVec, 500.0f); + o->oKleptoSpeed = sqrtf(o->oForwardVel * o->oForwardVel + o->oVelY * o->oVelY); + + o->oHomeX = o->oPosX; + o->oHomeY = o->oPosY + 500.0f; + o->oHomeZ = o->oPosZ; } } diff --git a/src/game/behaviors/koopa.inc.c b/src/game/behaviors/koopa.inc.c index 74c79f81..14417a76 100644 --- a/src/game/behaviors/koopa.inc.c +++ b/src/game/behaviors/koopa.inc.c @@ -403,7 +403,8 @@ static void koopa_unshelled_act_dive(void) { // units behind mario. // Using this, we can get the koopa to pick up and despawn its shell // while mario is riding it. - if (shell != NULL && dist_between_objects_squared(shell, gMarioObject) > sqr(200.0f) && distToShell < 50.0f) { + if (shell != NULL && dist_between_objects(shell, gMarioObject) > 200.0f + && distToShell < 50.0f) { o->oKoopaMovementType = KOOPA_BP_NORMAL; o->oAction = KOOPA_SHELLED_ACT_LYING; o->oForwardVel *= 0.5f; @@ -765,7 +766,7 @@ static void koopa_the_quick_update(void) { } if (o->parentObj != o) { - if (dist_between_objects_squared(o, o->parentObj) < sqr(400.0f)) { + if (dist_between_objects(o, o->parentObj) < 400.0f) { o->parentObj->oKoopaRaceEndpointKoopaFinished = TRUE; } } diff --git a/src/game/behaviors/mad_piano.inc.c b/src/game/behaviors/mad_piano.inc.c index 8998c48a..08c053a3 100644 --- a/src/game/behaviors/mad_piano.inc.c +++ b/src/game/behaviors/mad_piano.inc.c @@ -44,10 +44,10 @@ static void mad_piano_act_attack(void) { } else { f32 dx = o->oPosX - o->oHomeX; f32 dz = o->oPosZ - o->oHomeZ; - f32 distToHome = (sqr(dx) + sqr(dz)); + f32 distToHome = sqrtf(sqr(dx) + sqr(dz)); - if (distToHome > sqr(400.0f)) { - distToHome = 400.0f / sqrtf(distToHome); + if (distToHome > 400.0f) { + distToHome = 400.0f / distToHome; o->oPosX = o->oHomeX + dx * distToHome; o->oPosZ = o->oHomeZ + dz * distToHome; } diff --git a/src/game/behaviors/purple_switch.inc.c b/src/game/behaviors/purple_switch.inc.c index 75a606a5..135960aa 100644 --- a/src/game/behaviors/purple_switch.inc.c +++ b/src/game/behaviors/purple_switch.inc.c @@ -15,8 +15,10 @@ void bhv_purple_switch_loop(void) { case PURPLE_SWITCH_ACT_IDLE: cur_obj_set_model(MODEL_PURPLE_SWITCH); cur_obj_scale(1.5f); - if ((gMarioObject->platform == o) && !(gMarioStates[0].action & MARIO_NO_PURPLE_SWITCH) && (lateral_dist_between_objects_squared(o, gMarioObject) < sqr(127.5f))) { - o->oAction = PURPLE_SWITCH_ACT_PRESSED; + if (gMarioObject->platform == o && !(gMarioStates[0].action & MARIO_NO_PURPLE_SWITCH)) { + if (lateral_dist_between_objects(o, gMarioObject) < 127.5f) { + o->oAction = PURPLE_SWITCH_ACT_PRESSED; + } } break; /** diff --git a/src/game/behaviors/scuttlebug.inc.c b/src/game/behaviors/scuttlebug.inc.c index a9e98ebd..fffe6b59 100644 --- a/src/game/behaviors/scuttlebug.inc.c +++ b/src/game/behaviors/scuttlebug.inc.c @@ -45,7 +45,7 @@ void bhv_scuttlebug_loop(void) { break; case 1: o->oForwardVel = 5.0f; - if (!cur_obj_lateral_dist_from_mario_to_home_is_in_range(1000.0f)) + if (cur_obj_lateral_dist_from_mario_to_home() > 1000.0f) o->oAngleToMario = cur_obj_angle_to_home(); else { if (o->oScuttlebugIsAtttacking == 0) { diff --git a/src/game/behaviors/sparkle_spawn_star.inc.c b/src/game/behaviors/sparkle_spawn_star.inc.c index 4f76e7a0..0272dd1a 100644 --- a/src/game/behaviors/sparkle_spawn_star.inc.c +++ b/src/game/behaviors/sparkle_spawn_star.inc.c @@ -32,13 +32,15 @@ void set_sparkle_spawn_star_hitbox(void) { } void set_home_to_mario(void) { + f32 dx; + f32 dz; o->oHomeX = gMarioObject->oPosX; o->oHomeZ = gMarioObject->oPosZ; o->oHomeY = gMarioObject->oPosY; o->oHomeY += 250.0f; o->oPosY = o->oHomeY; - f32 dx = o->oHomeX - o->oPosX; - f32 dz = o->oHomeZ - o->oPosZ; + dx = o->oHomeX - o->oPosX; + dz = o->oHomeZ - o->oPosZ; o->oForwardVel = sqrtf(sqr(dx) + sqr(dz)) / 23.0f; } diff --git a/src/game/behaviors/spindrift.inc.c b/src/game/behaviors/spindrift.inc.c index 5174733a..b1bad6d6 100644 --- a/src/game/behaviors/spindrift.inc.c +++ b/src/game/behaviors/spindrift.inc.c @@ -20,7 +20,7 @@ void bhv_spindrift_loop(void) { switch (o->oAction) { case 0: approach_forward_vel(&o->oForwardVel, 4.0f, 1.0f); - if (!cur_obj_lateral_dist_from_mario_to_home_is_in_range(1000.0f)) + if (cur_obj_lateral_dist_from_mario_to_home() > 1000.0f) o->oAngleToMario = cur_obj_angle_to_home(); else if (o->oDistanceToMario > 300.0f) o->oAngleToMario = obj_angle_to_object(o, gMarioObject); diff --git a/src/game/behaviors/strong_wind_particle.inc.c b/src/game/behaviors/strong_wind_particle.inc.c index ab97eb8c..03ee7500 100644 --- a/src/game/behaviors/strong_wind_particle.inc.c +++ b/src/game/behaviors/strong_wind_particle.inc.c @@ -39,8 +39,8 @@ void bhv_strong_wind_particle_loop(void) { if (penguinObj != NULL) { penguinXDist = penguinObj->oSLWalkingPenguinWindCollisionXPos - o->oPosX; penguinZDist = penguinObj->oSLWalkingPenguinWindCollisionZPos - o->oPosZ; - distanceFromPenguin = (sqr(penguinXDist) + sqr(penguinZDist)); - if (distanceFromPenguin < sqr(300.0f)) { + distanceFromPenguin = sqrtf(penguinXDist * penguinXDist + penguinZDist * penguinZDist); + if (distanceFromPenguin < 300.0f) { obj_mark_for_deletion(o); cur_obj_become_intangible(); } diff --git a/src/game/behaviors/tilting_inverted_pyramid.inc.c b/src/game/behaviors/tilting_inverted_pyramid.inc.c index e811cc29..da5e16ce 100644 --- a/src/game/behaviors/tilting_inverted_pyramid.inc.c +++ b/src/game/behaviors/tilting_inverted_pyramid.inc.c @@ -64,47 +64,78 @@ f32 approach_by_increment(f32 goal, f32 src, f32 inc) { * then gradually tilt back moving Mario with them. */ void bhv_tilting_inverted_pyramid_loop(void) { - Vec3f d; -#ifndef PLATFORM_DISPLACEMENT_2 + f32 dx; + f32 dy; + f32 dz; + f32 d; + Vec3f dist; Vec3f posBeforeRotation; Vec3f posAfterRotation; // Mario's position - Vec3f m; -#endif + f32 mx; + f32 my; + f32 mz; + + s32 marioOnPlatform = FALSE; Mat4 *transform = &o->transform; + if (gMarioObject->platform == o) { -#ifndef PLATFORM_DISPLACEMENT_2 - get_mario_pos(&m[0], &m[1], &m[2]); - vec3_diff(dist, &gMarioObject->oPosVec, &o->oPosVec); + get_mario_pos(&mx, &my, &mz); + + dist[0] = gMarioObject->oPosX - o->oPosX; + dist[1] = gMarioObject->oPosY - o->oPosY; + dist[2] = gMarioObject->oPosZ - o->oPosZ; linear_mtxf_mul_vec3f(*transform, posBeforeRotation, dist); -#endif - d[0] = gMarioObject->oPosX - o->oPosX; - d[1] = 500.0f; - d[2] = gMarioObject->oPosZ - o->oPosZ; - vec3f_normalize(d); + + dx = gMarioObject->oPosX - o->oPosX; + dy = 500.0f; + dz = gMarioObject->oPosZ - o->oPosZ; + d = sqrtf(sqr(dx) + sqr(dy) + sqr(dz)); + + //! Always true since dy = 500, making d >= 500. + if (d != 0.0f) { + // Normalizing + d = 1.0f / d; + dx *= d; + dy *= d; + dz *= d; + } else { + dx = 0.0f; + dy = 1.0f; + dz = 0.0f; + } + + if (o->oTiltingPyramidMarioOnPlatform == TRUE) + marioOnPlatform++; + o->oTiltingPyramidMarioOnPlatform = TRUE; } else { - vec3_copy(d, gVec3fY); + dx = 0.0f; + dy = 1.0f; + dz = 0.0f; o->oTiltingPyramidMarioOnPlatform = FALSE; } + // Approach the normals by 0.01f towards the new goal, then create a transform matrix and orient the object. // Outside of the other conditionals since it needs to tilt regardless of whether Mario is on. - o->oTiltingPyramidNormalX = approach_by_increment(d[0], o->oTiltingPyramidNormalX, 0.01f); - o->oTiltingPyramidNormalY = approach_by_increment(d[1], o->oTiltingPyramidNormalY, 0.01f); - o->oTiltingPyramidNormalZ = approach_by_increment(d[2], o->oTiltingPyramidNormalZ, 0.01f); + o->oTiltingPyramidNormalX = approach_by_increment(dx, o->oTiltingPyramidNormalX, 0.01f); + o->oTiltingPyramidNormalY = approach_by_increment(dy, o->oTiltingPyramidNormalY, 0.01f); + o->oTiltingPyramidNormalZ = approach_by_increment(dz, o->oTiltingPyramidNormalZ, 0.01f); create_transform_from_normals(*transform, o->oTiltingPyramidNormalX, o->oTiltingPyramidNormalY, o->oTiltingPyramidNormalZ); -#ifndef PLATFORM_DISPLACEMENT_2 - // If Mario is on the platform, adjust his position for the platform tilt. - if (o->oTiltingPyramidMarioOnPlatform) { - linear_mtxf_mul_vec3f(*transform, posAfterRotation, dist); - m[0] += posAfterRotation[0] - posBeforeRotation[0]; - m[1] += posAfterRotation[1] - posBeforeRotation[1]; - m[2] += posAfterRotation[2] - posBeforeRotation[2]; - set_mario_pos(m[0], m[1], m[2]); + // If Mario is on the platform, adjust his position for the platform tilt. + if (marioOnPlatform != FALSE) { + linear_mtxf_mul_vec3f(*transform, posAfterRotation, dist); + mx += posAfterRotation[0] - posBeforeRotation[0]; + my += posAfterRotation[1] - posBeforeRotation[1]; + mz += posAfterRotation[2] - posBeforeRotation[2]; + + #ifndef PLATFORM_DISPLACEMENT_2 + set_mario_pos(mx, my, mz); + #endif } -#endif + o->header.gfx.throwMatrix = transform; } diff --git a/src/game/behaviors/tuxie.inc.c b/src/game/behaviors/tuxie.inc.c index c61ecdba..7d924d84 100644 --- a/src/game/behaviors/tuxie.inc.c +++ b/src/game/behaviors/tuxie.inc.c @@ -20,13 +20,13 @@ void tuxies_mother_act_2(void) { if (o->oSubAction == 0) { cur_obj_init_animation_with_sound(0); o->oForwardVel = 10.0f; - if (!cur_obj_lateral_dist_from_mario_to_home_is_in_range(800.0f)) + if (800.0f < cur_obj_lateral_dist_from_mario_to_home()) o->oSubAction = 1; cur_obj_rotate_yaw_toward(o->oAngleToMario, 0x400); } else { o->oForwardVel = 0.0f; cur_obj_init_animation_with_sound(3); - if (cur_obj_lateral_dist_from_mario_to_home_is_in_range(700.0f)) + if (cur_obj_lateral_dist_from_mario_to_home() < 700.0f) o->oSubAction = 0; } } else { @@ -213,20 +213,20 @@ void small_penguin_act_0(void) { } void small_penguin_act_5(void) { + f32 distToMother; s16 angleToMother; struct Object *motherPenguinObj = cur_obj_nearest_object_with_behavior(bhvTuxiesMother); if (motherPenguinObj != NULL) { - if (o->oDistanceToMario < 1000.0f) { + if (o->oDistanceToMario < 1000.0f) o->oForwardVel = 2.0f; - } else { + else o->oForwardVel = 0.0f; - } + distToMother = dist_between_objects(o, motherPenguinObj); angleToMother = obj_angle_to_object(o, motherPenguinObj); - if (dist_between_objects_squared(o, motherPenguinObj) > sqr(200.0f)) { + if (distToMother > 200.0f) cur_obj_rotate_yaw_toward(angleToMother, 0x400); - } else { + else cur_obj_rotate_yaw_toward(angleToMother + 0x8000, 0x400); - } cur_obj_init_animation_with_sound(0); } small_penguin_dive_with_mario(); diff --git a/src/game/behaviors/tweester.inc.c b/src/game/behaviors/tweester.inc.c index f5942f77..b6d334ab 100644 --- a/src/game/behaviors/tweester.inc.c +++ b/src/game/behaviors/tweester.inc.c @@ -71,7 +71,8 @@ void tweester_act_chase(void) { o->oAngleToHome = cur_obj_angle_to_home(); cur_obj_play_sound_1(SOUND_ENV_WIND1); - if (cur_obj_lateral_dist_from_mario_to_home_is_in_range(activationRadius) && o->oSubAction == TWEESTER_SUB_ACT_CHASE_MARIO) { + if (cur_obj_lateral_dist_from_mario_to_home() < activationRadius + && o->oSubAction == TWEESTER_SUB_ACT_CHASE_MARIO) { o->oForwardVel = 20.0f; cur_obj_rotate_yaw_toward(o->oAngleToMario, 0x200); @@ -83,7 +84,7 @@ void tweester_act_chase(void) { o->oForwardVel = 20.0f; cur_obj_rotate_yaw_toward(o->oAngleToHome, 0x200); - if (cur_obj_lateral_dist_to_home_is_in_range(200.0f)) + if (cur_obj_lateral_dist_to_home() < 200.0f) o->oAction = TWEESTER_ACT_HIDE; } @@ -110,7 +111,7 @@ void tweester_act_hide(void) { tweester_scale_and_move(shrinkTimer / 60.0f); else { cur_obj_become_intangible(); - if (!cur_obj_lateral_dist_from_mario_to_home_is_in_range(2500.0f)) + if (cur_obj_lateral_dist_from_mario_to_home() > 2500.0f) o->oAction = TWEESTER_ACT_IDLE; if (o->oTimer > 360) o->oAction = TWEESTER_ACT_IDLE; diff --git a/src/game/behaviors/ukiki.inc.c b/src/game/behaviors/ukiki.inc.c index 32ed6a0d..a69bb22b 100644 --- a/src/game/behaviors/ukiki.inc.c +++ b/src/game/behaviors/ukiki.inc.c @@ -329,7 +329,17 @@ static Trajectory sCageUkikiPath[] = { * our death. Ukiki is a tad suicidal. */ void ukiki_act_go_to_cage(void) { - struct Object *obj = cur_obj_nearest_object_with_behavior(bhvUkikiCageChild); + struct Object* obj; + f32 latDistToCage = 0.0f; + s16 yawToCage = 0; + obj = cur_obj_nearest_object_with_behavior(bhvUkikiCageChild); + + // Ultimately is checking the cage, as it points to the parent + // of a dummy child object of the cage. + if (obj != NULL) { + latDistToCage = lateral_dist_between_objects(o, obj->parentObj); + yawToCage = obj_angle_to_object(o, obj->parentObj); + } cur_obj_become_intangible(); o->oFlags |= OBJ_FLAG_ACTIVE_FROM_AFAR; @@ -358,7 +368,7 @@ void ukiki_act_go_to_cage(void) { if (cur_obj_can_mario_activate_textbox(200.0f, 30.0f, 0x7FFF)) { o->oSubAction++; // fallthrough } else { - break; + break; } case UKIKI_SUB_ACT_CAGE_TALK_TO_MARIO: @@ -372,9 +382,8 @@ void ukiki_act_go_to_cage(void) { case UKIKI_SUB_ACT_CAGE_TURN_TO_CAGE: cur_obj_init_animation_with_sound(UKIKI_ANIM_RUN); - // Ultimately is checking the cage, as it points to the parent - // of a dummy child object of the cage. - if (obj != NULL && cur_obj_rotate_yaw_toward(obj_angle_to_object(o, obj->parentObj), 0x400)) { + + if (cur_obj_rotate_yaw_toward(yawToCage, 0x400)) { o->oForwardVel = 10.0f; o->oSubAction++; } @@ -387,9 +396,7 @@ void ukiki_act_go_to_cage(void) { break; case UKIKI_SUB_ACT_CAGE_LAND_ON_CAGE: - // Ultimately is checking the cage, as it points to the parent - // of a dummy child object of the cage. - if ((obj != NULL) && lateral_dist_between_objects_squared(o, obj->parentObj) < sqr(50.0f)) { + if (latDistToCage < 50.0f) { o->oForwardVel = 0.0f; } diff --git a/src/game/behaviors/water_bomb.inc.c b/src/game/behaviors/water_bomb.inc.c index 445e0217..1e293dbf 100644 --- a/src/game/behaviors/water_bomb.inc.c +++ b/src/game/behaviors/water_bomb.inc.c @@ -29,10 +29,14 @@ static struct ObjectHitbox sWaterBombHitbox = { * Spawn water bombs targeting mario when he comes in range. */ void bhv_water_bomb_spawner_update(void) { - f32 spawnerRadius = 50 * (u16)(o->oBehParams >> 16) + 200.0f; + f32 latDistToMario; + f32 spawnerRadius; + + spawnerRadius = 50 * (u16)(o->oBehParams >> 16) + 200.0f; + latDistToMario = lateral_dist_between_objects(o, gMarioObject); // When mario is in range and a water bomb isn't already active - if (!o->oWaterBombSpawnerBombActive && lateral_dist_between_objects_squared(o, gMarioObject) < sqr(spawnerRadius) + if (!o->oWaterBombSpawnerBombActive && latDistToMario < spawnerRadius && gMarioObject->oPosY - o->oPosY < 1000.0f) { if (o->oWaterBombSpawnerTimeToSpawn != 0) { o->oWaterBombSpawnerTimeToSpawn--; diff --git a/src/game/camera.c b/src/game/camera.c index db3f5a7d..cc7aa740 100644 --- a/src/game/camera.c +++ b/src/game/camera.c @@ -1997,10 +1997,10 @@ s16 update_default_camera(struct Camera *c) { nextYawVel = 0; } sYawSpeed = 0x400; - vec3f_get_lateral_dist_squared(sMarioCamState->pos, c->pos, &xzDist); + vec3f_get_lateral_dist(sMarioCamState->pos, c->pos, &xzDist); if (sStatusFlags & CAM_FLAG_BEHIND_MARIO_POST_DOOR) { - if (xzDist >= sqr(250.0f)) { + if (xzDist >= 250) { sStatusFlags &= ~CAM_FLAG_BEHIND_MARIO_POST_DOOR; } if (ABS((sMarioCamState->faceAngle[1] - yaw) / 2) < 0x1800) { @@ -2009,8 +2009,7 @@ s16 update_default_camera(struct Camera *c) { dist = 800.f; sStatusFlags |= CAM_FLAG_BLOCK_SMOOTH_MOVEMENT; } - } else if (xzDist < sqr(250.0f)) { - xzDist = sqrtf(xzDist); + } else if (xzDist < 250) { // Turn rapidly if very close to Mario c->pos[0] += (250 - xzDist) * sins(yaw); c->pos[2] += (250 - xzDist) * coss(yaw); diff --git a/src/game/object_helpers.c b/src/game/object_helpers.c index 4cad77fd..7351e090 100644 --- a/src/game/object_helpers.c +++ b/src/game/object_helpers.c @@ -242,26 +242,12 @@ f32 lateral_dist_between_objects(struct Object *obj1, struct Object *obj2) { return lateralDist; } -// Same as above, but doesn't do sqrtf. -f32 lateral_dist_between_objects_squared(struct Object *obj1, struct Object *obj2) { - register f32 dx = obj2->oPosX - obj1->oPosX; - register f32 dz = obj2->oPosZ - obj1->oPosZ; - return (sqr(dx) + sqr(dz)); -} - f32 dist_between_objects(struct Object *obj1, struct Object *obj2) { f32 dist; vec3f_get_dist(&obj1->oPosVec, &obj2->oPosVec, &dist); return dist; } -// Same as above, but doesn't do sqrtf. -f32 dist_between_objects_squared(struct Object *obj1, struct Object *obj2) { - register Vec3f d; - vec3_diff(d, &obj2->oPosVec, &obj1->oPosVec); - return vec3_sumsq(d); -} - void cur_obj_forward_vel_approach_upward(f32 target, f32 increment) { if (o->oForwardVel >= target) { o->oForwardVel = target; @@ -283,7 +269,7 @@ s16 obj_angle_to_object(struct Object *obj1, struct Object *obj2) { s16 obj_turn_toward_object(struct Object *obj, struct Object *target, s16 angleIndex, s16 turnAmount) { f32 a, b, c, d; - s16 targetAngle = 0x0; + s16 targetAngle = 0; s16 startAngle; switch (angleIndex) { @@ -681,15 +667,17 @@ f32 cur_obj_dist_to_nearest_object_with_behavior(const BehaviorScript *behavior) struct Object *cur_obj_find_nearest_object_with_behavior(const BehaviorScript *behavior, f32 *dist) { uintptr_t *behaviorAddr = segmented_to_virtual(behavior); struct Object *closestObj = NULL; - f32 minDist = F32_MAX; + struct Object *obj; + struct ObjectNode *listHead; + f32 minDist = 0x20000; - struct ObjectNode *listHead = &gObjectLists[get_object_list_from_behavior(behaviorAddr)]; - struct Object *obj = (struct Object *) listHead->next; + listHead = &gObjectLists[get_object_list_from_behavior(behaviorAddr)]; + obj = (struct Object *) listHead->next; while (obj != (struct Object *) listHead) { if (obj->behavior == behaviorAddr) { if (obj->activeFlags != ACTIVE_FLAG_DEACTIVATED && obj != o) { - f32 objDist = dist_between_objects_squared(o, obj); + f32 objDist = dist_between_objects(o, obj); if (objDist < minDist) { closestObj = obj; minDist = objDist; @@ -698,11 +686,8 @@ struct Object *cur_obj_find_nearest_object_with_behavior(const BehaviorScript *b } obj = (struct Object *) obj->header.next; } - if (minDist == F32_MAX) { - *dist = F32_MAX; - } else { - *dist = sqrtf(minDist); - } + + *dist = minDist; return closestObj; } @@ -763,7 +748,7 @@ struct Object *cur_obj_find_nearby_held_actor(const BehaviorScript *behavior, f3 // This includes the dropped and thrown states. By combining instant // release, this allows us to activate mama penguin remotely if (obj->oHeldState != HELD_FREE) { - if (dist_between_objects_squared(o, obj) < sqr(maxDist)) { + if (dist_between_objects(o, obj) < maxDist) { foundObj = obj; break; } @@ -1053,7 +1038,7 @@ static s32 cur_obj_move_xz(f32 steepSlopeNormalY, s32 careAboutEdgesAndSteepSlop } static void cur_obj_move_update_underwater_flags(void) { - f32 decelY = (f32)(ABSF(o->oVelY) * (o->oDragStrength * 7.0f)) / 100.0L; + f32 decelY = (f32)(sqrtf(o->oVelY * o->oVelY) * (o->oDragStrength * 7.0f)) / 100.0L; if (o->oVelY > 0) { o->oVelY -= decelY; @@ -1193,6 +1178,7 @@ void cur_obj_move_y_with_terminal_vel(void) { if (o->oVelY < -70.0f) { o->oVelY = -70.0f; } + o->oPosY += o->oVelY; } @@ -1225,6 +1211,7 @@ s32 obj_check_if_collided_with_object(struct Object *obj1, struct Object *obj2) return TRUE; } } + return FALSE; } @@ -1244,10 +1231,10 @@ s32 obj_has_behavior(struct Object *obj, const BehaviorScript *behavior) { return (obj->behavior == segmented_to_virtual(behavior)); } -Bool32 cur_obj_lateral_dist_from_mario_to_home_is_in_range(f32 dist) { +f32 cur_obj_lateral_dist_from_mario_to_home(void) { f32 dx = o->oHomeX - gMarioObject->oPosX; f32 dz = o->oHomeZ - gMarioObject->oPosZ; - return ((sqr(dx) + sqr(dz)) < sqr(dist)); + return sqrtf(sqr(dx) + sqr(dz)); } f32 cur_obj_lateral_dist_to_home(void) { @@ -1256,12 +1243,6 @@ f32 cur_obj_lateral_dist_to_home(void) { return sqrtf(sqr(dx) + sqr(dz)); } -Bool32 cur_obj_lateral_dist_to_home_is_in_range(f32 dist) { - f32 dx = o->oHomeX - o->oPosX; - f32 dz = o->oHomeZ - o->oPosZ; - return ((sqr(dx) + sqr(dz)) < sqr(dist)); -} - s32 cur_obj_outside_home_square(f32 halfLength) { if (o->oHomeX - halfLength > o->oPosX) return TRUE; if (o->oHomeX + halfLength < o->oPosX) return TRUE; @@ -1305,6 +1286,13 @@ void cur_obj_start_cam_event(UNUSED struct Object *obj, s32 cameraEvent) { gSecondCameraFocus = o; } +// unused, self explanatory, maybe oInteractStatus originally had TRUE/FALSE statements +void set_mario_interact_true_if_in_range(UNUSED s32 arg0, UNUSED s32 arg1, f32 range) { + if (o->oDistanceToMario < range) { + gMarioObject->oInteractStatus = TRUE; + } +} + void obj_set_billboard(struct Object *obj) { obj->header.gfx.node.flags |= GRAPH_RENDER_BILLBOARD; } @@ -1676,8 +1664,9 @@ s32 cur_obj_follow_path(UNUSED s32 unusedArg) { struct Waypoint *startWaypoint; struct Waypoint *lastWaypoint; struct Waypoint *targetWaypoint; - Vec3f prevToNext, objToNext; + f32 prevToNextX, prevToNextY, prevToNextZ; f32 objToNextXZ; + f32 objToNextX, objToNextY, objToNextZ; if (o->oPathedPrevWaypointFlags == 0) { o->oPathedPrevWaypoint = o->oPathedStartWaypoint; @@ -1694,16 +1683,21 @@ s32 cur_obj_follow_path(UNUSED s32 unusedArg) { } o->oPathedPrevWaypointFlags = lastWaypoint->flags | WAYPOINT_FLAGS_INITIALIZED; - vec3_diff(prevToNext, targetWaypoint->pos, lastWaypoint->pos); - vec3_diff(objToNext, targetWaypoint->pos, &o->oPosVec); - objToNextXZ = sqrtf(sqr(objToNext[0]) + sqr(objToNext[2])); + prevToNextX = targetWaypoint->pos[0] - lastWaypoint->pos[0]; + prevToNextY = targetWaypoint->pos[1] - lastWaypoint->pos[1]; + prevToNextZ = targetWaypoint->pos[2] - lastWaypoint->pos[2]; - o->oPathedTargetYaw = atan2s(objToNext[2], objToNext[0]); - o->oPathedTargetPitch = atan2s(objToNextXZ, -objToNext[1]); + objToNextX = targetWaypoint->pos[0] - o->oPosX; + objToNextY = targetWaypoint->pos[1] - o->oPosY; + objToNextZ = targetWaypoint->pos[2] - o->oPosZ; + objToNextXZ = sqrtf(sqr(objToNextX) + sqr(objToNextZ)); + + o->oPathedTargetYaw = atan2s(objToNextZ, objToNextX); + o->oPathedTargetPitch = atan2s(objToNextXZ, -objToNextY); // If dot(prevToNext, objToNext) <= 0 (i.e. reached other side of target waypoint) - if (vec3_dot(prevToNext, objToNext) <= 0.0f) { + if (prevToNextX * objToNextX + prevToNextY * objToNextY + prevToNextZ * objToNextZ <= 0.0f) { o->oPathedPrevWaypoint = targetWaypoint; if ((targetWaypoint + 1)->flags == WAYPOINT_FLAGS_END) { return PATH_REACHED_END; @@ -1856,7 +1850,6 @@ void cur_obj_push_mario_away(f32 radius) { f32 marioDist = (sqr(marioRelX) + sqr(marioRelZ)); if (marioDist < sqr(radius)) { - marioDist = sqrtf(marioDist); //! If this function pushes Mario out of bounds, it will trigger Mario's // oob failsafe gMarioStates[0].pos[0] += (radius - marioDist) / radius * marioRelX; @@ -2141,7 +2134,7 @@ void clear_time_stop_flags(s32 flags) { s32 cur_obj_can_mario_activate_textbox(f32 radius, f32 height, UNUSED s32 unused) { if (o->oDistanceToMario < 1500.0f) { if (o->oPosY < gMarioObject->oPosY + 160.0f && gMarioObject->oPosY < o->oPosY + height && !(gMarioStates[0].action & ACT_FLAG_AIR) - && lateral_dist_between_objects_squared(o, gMarioObject) < sqr(radius) && mario_ready_to_speak()) { + && lateral_dist_between_objects(o, gMarioObject) < radius && mario_ready_to_speak()) { return TRUE; } } diff --git a/src/game/object_helpers.h b/src/game/object_helpers.h index 41e4a86c..83bb8dff 100644 --- a/src/game/object_helpers.h +++ b/src/game/object_helpers.h @@ -67,9 +67,7 @@ void obj_apply_scale_to_matrix(struct Object *obj, Mat4 dst, Mat4 src); void create_transformation_from_matrices(Mat4 dst, Mat4 a1, Mat4 a2); void obj_set_held_state(struct Object *obj, const BehaviorScript *heldBehavior); f32 lateral_dist_between_objects(struct Object *obj1, struct Object *obj2); -f32 lateral_dist_between_objects_squared(struct Object *obj1, struct Object *obj2); f32 dist_between_objects(struct Object *obj1, struct Object *obj2); -f32 dist_between_objects_squared(struct Object *obj1, struct Object *obj2); void cur_obj_forward_vel_approach_upward(f32 target, f32 increment); s32 cur_obj_rotate_yaw_toward(s16 target, s16 increment); s16 obj_angle_to_object(struct Object *obj1, struct Object *obj2); @@ -164,13 +162,13 @@ void cur_obj_set_behavior(const BehaviorScript *behavior); void obj_set_behavior(struct Object *obj, const BehaviorScript *behavior); s32 cur_obj_has_behavior(const BehaviorScript *behavior); s32 obj_has_behavior(struct Object *obj, const BehaviorScript *behavior); -Bool32 cur_obj_lateral_dist_from_mario_to_home_is_in_range(f32 dist); +f32 cur_obj_lateral_dist_from_mario_to_home(void); f32 cur_obj_lateral_dist_to_home(void); -Bool32 cur_obj_lateral_dist_to_home_is_in_range(f32 dist); void cur_obj_set_pos_to_home(void); void cur_obj_set_pos_to_home_and_stop(void); void cur_obj_shake_y(f32 amount); void cur_obj_start_cam_event(UNUSED struct Object *obj, s32 cameraEvent); +void set_mario_interact_true_if_in_range(UNUSED s32 sp0, UNUSED s32 sp4, f32 sp8); void obj_set_billboard(struct Object *obj); void cur_obj_set_hitbox_radius_and_height(f32 radius, f32 height); void cur_obj_set_hurtbox_radius_and_height(f32 radius, f32 height); From f10955b78583a69efad81a5e67ae389fcb038d2b Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Wed, 29 Sep 2021 10:10:14 -0700 Subject: [PATCH 45/97] Move some structs/data into proper behavior files --- src/game/behavior_actions.c | 42 ------------------- src/game/behaviors/boo.inc.c | 5 +++ src/game/behaviors/capswitch.inc.c | 8 +++- .../behaviors/checkerboard_platform.inc.c | 6 +++ src/game/behaviors/exclamation_box.inc.c | 8 ++++ src/game/behaviors/grill_door.inc.c | 6 +++ src/game/behaviors/rotating_platform.inc.c | 7 ++++ src/game/behaviors/tumbling_bridge.inc.c | 8 ++++ 8 files changed, 46 insertions(+), 44 deletions(-) diff --git a/src/game/behavior_actions.c b/src/game/behavior_actions.c index 62942ccc..acdc3203 100644 --- a/src/game/behavior_actions.c +++ b/src/game/behavior_actions.c @@ -46,48 +46,6 @@ #include "rumble_init.h" #include "puppylights.h" -struct WFRotatingPlatformData { - s16 pad; - s16 scale; - const Collision *collisionData; - s16 collisionDistance; -}; - -struct TumblingBridgeParams { - s16 numBridgeSections; - s16 bridgeRelativeStartingXorZ; - s16 platformWidth; - ModelID16 model; - const void *segAddr; -}; - -struct ExclamationBoxContents { - u8 id; - u8 unk1; - u8 behParams; - ModelID16 model; - const BehaviorScript *behavior; -}; - -struct CheckerBoardPlatformInitPosition { - s32 relPosZ; - Vec3f scale; - f32 radius; -}; - -struct OpenableGrill { - s16 halfWidth; - ModelID16 modelID; - const Collision *collision; -}; - -static s32 sCapSaveFlags[] = { SAVE_FLAG_HAVE_WING_CAP, SAVE_FLAG_HAVE_METAL_CAP, SAVE_FLAG_HAVE_VANISH_CAP }; - -// Boo Roll -static s16 sBooHitRotations[] = { 6047, 5664, 5292, 4934, 4587, 4254, 3933, 3624, 3329, 3046, 2775, - 2517, 2271, 2039, 1818, 1611, 1416, 1233, 1063, 906, 761, 629, - 509, 402, 308, 226, 157, 100, 56, 25, 4, 0 }; - #include "behaviors/star_door.inc.c" #include "behaviors/mr_i.inc.c" #include "behaviors/pole.inc.c" diff --git a/src/game/behaviors/boo.inc.c b/src/game/behaviors/boo.inc.c index 6509da94..8b00220e 100644 --- a/src/game/behaviors/boo.inc.c +++ b/src/game/behaviors/boo.inc.c @@ -186,6 +186,11 @@ static void boo_set_move_yaw_for_during_hit(s32 hurt) { } } +// Boo Roll +static s16 sBooHitRotations[] = { 6047, 5664, 5292, 4934, 4587, 4254, 3933, 3624, 3329, 3046, 2775, + 2517, 2271, 2039, 1818, 1611, 1416, 1233, 1063, 906, 761, 629, + 509, 402, 308, 226, 157, 100, 56, 25, 4, 0 }; + static void boo_move_during_hit(s32 roll, f32 fVel) { // Boos seem to have been supposed to oscillate up then down then back again // when hit. However it seems the programmers forgot to scale the cosine, diff --git a/src/game/behaviors/capswitch.inc.c b/src/game/behaviors/capswitch.inc.c index f3504522..d79f8970 100644 --- a/src/game/behaviors/capswitch.inc.c +++ b/src/game/behaviors/capswitch.inc.c @@ -1,5 +1,7 @@ // capswitch.c.inc +static s32 sCapSaveFlags[] = { SAVE_FLAG_HAVE_WING_CAP, SAVE_FLAG_HAVE_METAL_CAP, SAVE_FLAG_HAVE_VANISH_CAP }; + void cap_switch_act_0(void) { o->oAnimState = o->oBehParams2ndByte; cur_obj_scale(0.5f); @@ -9,10 +11,12 @@ void cap_switch_act_0(void) { if (save_file_get_flags() & sCapSaveFlags[o->oBehParams2ndByte]) { o->oAction = 3; o->header.gfx.scale[1] = 0.1f; - } else + } else { o->oAction = 1; - } else + } + } else { o->oAction = 1; + } } void cap_switch_act_1(void) { diff --git a/src/game/behaviors/checkerboard_platform.inc.c b/src/game/behaviors/checkerboard_platform.inc.c index c7fd8798..b7c22ae8 100644 --- a/src/game/behaviors/checkerboard_platform.inc.c +++ b/src/game/behaviors/checkerboard_platform.inc.c @@ -1,5 +1,11 @@ // checkerboard_platform.c.inc +struct CheckerBoardPlatformInitPosition { + s32 relPosZ; + Vec3f scale; + f32 radius; +}; + struct CheckerBoardPlatformInitPosition sCheckerBoardPlatformInitPositions[] = { { 145, { 0.7f, 1.5f, 0.7f }, 7.0f }, { 235, { 1.2f, 2.0f, 1.2f }, 11.6f } }; diff --git a/src/game/behaviors/exclamation_box.inc.c b/src/game/behaviors/exclamation_box.inc.c index 547b4fcd..da33945d 100644 --- a/src/game/behaviors/exclamation_box.inc.c +++ b/src/game/behaviors/exclamation_box.inc.c @@ -1,5 +1,13 @@ // exclamation_box.c.inc +struct ExclamationBoxContents { + u8 id; + u8 unk1; + u8 behParams; + ModelID16 model; + const BehaviorScript *behavior; +}; + struct ObjectHitbox sExclamationBoxHitbox = { /* interactType: */ INTERACT_BREAKABLE, /* downOffset: */ 5, diff --git a/src/game/behaviors/grill_door.inc.c b/src/game/behaviors/grill_door.inc.c index 74dd82fa..871f43d5 100644 --- a/src/game/behaviors/grill_door.inc.c +++ b/src/game/behaviors/grill_door.inc.c @@ -1,5 +1,11 @@ // grill_door.c.inc +struct OpenableGrill { + s16 halfWidth; + ModelID16 modelID; + const Collision *collision; +}; + struct OpenableGrill gOpenableGrills[] = { { 320, MODEL_BOB_BARS_GRILLS, bob_seg7_collision_gate }, { 410, MODEL_HMC_RED_GRILLS, hmc_seg7_collision_0702B65C } }; diff --git a/src/game/behaviors/rotating_platform.inc.c b/src/game/behaviors/rotating_platform.inc.c index 2d582daf..d2bb3229 100644 --- a/src/game/behaviors/rotating_platform.inc.c +++ b/src/game/behaviors/rotating_platform.inc.c @@ -3,6 +3,13 @@ #include "levels/wf/header.h" #include "levels/wdw/header.h" +struct WFRotatingPlatformData { + s16 pad; + s16 scale; + const Collision *collisionData; + s16 collisionDistance; +}; + struct WFRotatingPlatformData sWFRotatingPlatformData[] = { { 0, 100, wf_seg7_collision_rotating_platform, 2000 }, { 0, 150, wdw_seg7_collision_070186B4, 1000 } diff --git a/src/game/behaviors/tumbling_bridge.inc.c b/src/game/behaviors/tumbling_bridge.inc.c index 86f3915c..86b7af13 100644 --- a/src/game/behaviors/tumbling_bridge.inc.c +++ b/src/game/behaviors/tumbling_bridge.inc.c @@ -5,6 +5,14 @@ #include "levels/lll/header.h" #include "levels/bitfs/header.h" +struct TumblingBridgeParams { + s16 numBridgeSections; + s16 bridgeRelativeStartingXorZ; + s16 platformWidth; + ModelID16 model; + const void *segAddr; +}; + struct TumblingBridgeParams sTumblingBridgeParams[] = { { 9, -512, 0x80, MODEL_WF_TUMBLING_BRIDGE_PART, wf_seg7_collision_tumbling_bridge }, { 9, -412, 103, MODEL_BBH_TUMBLING_PLATFORM_PART, bbh_seg7_collision_07026B1C }, From c9d48d3c43f7955ecfd88025d1f3c4efd553bc43 Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Wed, 29 Sep 2021 10:19:34 -0700 Subject: [PATCH 46/97] Fix BBH crash --- src/engine/surface_collision.c | 64 ++++++++++++++-------------------- 1 file changed, 27 insertions(+), 37 deletions(-) diff --git a/src/engine/surface_collision.c b/src/engine/surface_collision.c index 42cb4b41..e12aacf9 100644 --- a/src/engine/surface_collision.c +++ b/src/engine/surface_collision.c @@ -216,15 +216,24 @@ void add_ceil_margin(s32 *x, s32 *z, Vec3s target1, Vec3s target2, f32 margin) { */ static struct Surface *find_ceil_from_list(struct SurfaceNode *surfaceNode, s32 x, s32 y, s32 z, f32 *pheight) { const f32 margin = 1.5f; - register struct Surface *surf; + register struct Surface *surf, *ceil = NULL; Vec3i vx, vz; f32 height; - struct Surface *ceil = NULL; + s16 type; *pheight = CELL_HEIGHT_LIMIT; // Stay in this loop until out of ceilings. while (surfaceNode != NULL) { surf = surfaceNode->surface; surfaceNode = surfaceNode->next; + type = surf->type; + // Determine if checking for the camera or not. + if (type == SURFACE_NEW_WATER || type == SURFACE_NEW_WATER_BOTTOM) continue; + if (gCheckingSurfaceCollisionsForCamera) { + if (surf->flags & SURFACE_FLAG_NO_CAM_COLLISION) continue; + } else if (type == SURFACE_CAMERA_BOUNDARY) { + // Ignore camera only surfaces. + continue; + } if (y > surf->upperY) continue; vx[0] = surf->vertex1[0]; vz[0] = surf->vertex1[2]; @@ -240,14 +249,6 @@ static struct Surface *find_ceil_from_list(struct SurfaceNode *surfaceNode, s32 if (surf->type != SURFACE_HANGABLE) add_ceil_margin(&vx[2], &vz[2], surf->vertex1, surf->vertex2, margin); if ((vz[1] - z) * (vx[2] - vx[1]) - (vx[1] - x) * (vz[2] - vz[1]) > 0) continue; if ((vz[2] - z) * (vx[0] - vx[2]) - (vx[2] - x) * (vz[0] - vz[2]) > 0) continue; - // Determine if checking for the camera or not. - if (surf->type == SURFACE_NEW_WATER || surf->type == SURFACE_NEW_WATER_BOTTOM) continue; - if (gCheckingSurfaceCollisionsForCamera) { - if (surf->flags & SURFACE_FLAG_NO_CAM_COLLISION) continue; - } else if (surf->type == SURFACE_CAMERA_BOUNDARY) { - // Ignore camera only surfaces. - continue; - } // Find the ceil height at the specific point. height = get_surface_height_at_location(x, z, surf); if (height > *pheight) continue; @@ -321,23 +322,33 @@ f32 find_ceil(f32 posX, f32 posY, f32 posZ, struct Surface **pceil) { */ f32 unused_obj_find_floor_height(struct Object *obj) { struct Surface *floor; - f32 floorHeight = find_floor(obj->oPosX, obj->oPosY, obj->oPosZ, &floor); - return floorHeight; + return find_floor(obj->oPosX, obj->oPosY, obj->oPosZ, &floor); } /** * Iterate through the list of floors and find the first floor under a given point. */ static struct Surface *find_floor_from_list(struct SurfaceNode *surfaceNode, s32 x, s32 y, s32 z, f32 *pheight) { - register struct Surface *surf; + register struct Surface *surf, *floor = NULL; register Vec3i vx, vz; f32 height; - struct Surface *floor = NULL; + s16 type = SURFACE_DEFAULT; *pheight = FLOOR_LOWER_LIMIT; // Iterate through the list of floors until there are no more floors. while (surfaceNode != NULL) { surf = surfaceNode->surface; surfaceNode = surfaceNode->next; + type = surf->type; + // To prevent the Merry-Go-Round room from loading when Mario passes above the hole that leads + // there, SURFACE_INTANGIBLE is used. This prevent the wrong room from loading, but can also allow + // Mario to pass through. + if (!gFindFloorIncludeSurfaceIntangible && (type == SURFACE_INTANGIBLE)) continue; + // Determine if we are checking for the camera or not. + if (gCheckingSurfaceCollisionsForCamera) { + if ((surf->flags & SURFACE_FLAG_NO_CAM_COLLISION) || (surf->type == SURFACE_NEW_WATER) || (surf->type == SURFACE_NEW_WATER_BOTTOM)) continue; + } else if (surf->type == SURFACE_CAMERA_BOUNDARY) { + continue; // If we are not checking for the camera, ignore camera only floors. + } if (y < (surf->lowerY - 30)) continue; vx[0] = surf->vertex1[0]; vz[0] = surf->vertex1[2]; @@ -350,13 +361,6 @@ static struct Surface *find_floor_from_list(struct SurfaceNode *surfaceNode, s32 vz[2] = surf->vertex3[2]; if ((vz[1] - z) * (vx[2] - vx[1]) - (vx[1] - x) * (vz[2] - vz[1]) < 0) continue; if ((vz[2] - z) * (vx[0] - vx[2]) - (vx[2] - x) * (vz[0] - vz[2]) < 0) continue; - // Determine if we are checking for the camera or not. - if (gCheckingSurfaceCollisionsForCamera != 0) { - if (surf->flags & SURFACE_FLAG_NO_CAM_COLLISION || surf->type == SURFACE_NEW_WATER || surf->type == SURFACE_NEW_WATER_BOTTOM) continue; - } else if (surf->type == SURFACE_CAMERA_BOUNDARY) { - // If we are not checking for the camera, ignore camera only floors. - continue; - } // Find the height of the floor at a given location. height = get_surface_height_at_location(x, z, surf); if (height < *pheight) continue; @@ -508,22 +512,8 @@ f32 find_floor(f32 xPos, f32 yPos, f32 zPos, struct Surface **pfloor) { surfaceList = gStaticSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_FLOORS].next; floor = find_floor_from_list(surfaceList, x, y, z, &height); - // To prevent the Merry-Go-Round room from loading when Mario passes above the hole that leads - // there, SURFACE_INTANGIBLE is used. This prevent the wrong room from loading, but can also allow - // Mario to pass through. - if (!gFindFloorIncludeSurfaceIntangible) { - //! (BBH Crash) Most NULL checking is done by checking the height of the floor returned - // instead of checking directly for a NULL floor. If this check returns a NULL floor - // (happens when there is no floor under the SURFACE_INTANGIBLE floor) but returns the height - // of the SURFACE_INTANGIBLE floor instead of the typical -11000 returned for a NULL floor. - if (floor != NULL && floor->type == SURFACE_INTANGIBLE) { - floor = find_floor_from_list(surfaceList, x, (s32)(height - 200.0f), z, &height); - } - } else { - // To prevent accidentally leaving the floor tangible, stop checking for it. - gFindFloorIncludeSurfaceIntangible = FALSE; - } - + // To prevent accidentally leaving the floor tangible, stop checking for it. + gFindFloorIncludeSurfaceIntangible = FALSE; // If a floor was missed, increment the debug counter. if (floor == NULL) { gNumFindFloorMisses++; From c203e8a17d41de9d9c5be68350185fa1974126ce Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Wed, 29 Sep 2021 10:35:27 -0700 Subject: [PATCH 47/97] Add find_room_floor --- src/engine/surface_collision.c | 40 +++++++++++++++++--------------- src/engine/surface_collision.h | 1 + src/game/behaviors/door.inc.c | 6 ++--- src/game/object_helpers.c | 33 ++++++++++---------------- src/game/object_list_processor.c | 1 + src/game/object_list_processor.h | 1 + 6 files changed, 39 insertions(+), 43 deletions(-) diff --git a/src/engine/surface_collision.c b/src/engine/surface_collision.c index e12aacf9..fb4c7808 100644 --- a/src/engine/surface_collision.c +++ b/src/engine/surface_collision.c @@ -499,43 +499,45 @@ f32 find_floor(f32 xPos, f32 yPos, f32 zPos, struct Surface **pfloor) { #endif return height; } - // Each level is split into cells to limit load, find the appropriate cell. cellX = ((x + LEVEL_BOUNDARY_MAX) / CELL_SIZE) & NUM_CELLS_INDEX; cellZ = ((z + LEVEL_BOUNDARY_MAX) / CELL_SIZE) & NUM_CELLS_INDEX; - - // Check for surfaces belonging to objects. - surfaceList = gDynamicSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_FLOORS].next; - dynamicFloor = find_floor_from_list(surfaceList, x, y, z, &dynamicHeight); - // Check for surfaces that are a part of level geometry. surfaceList = gStaticSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_FLOORS].next; floor = find_floor_from_list(surfaceList, x, y, z, &height); - + if (!gFindFloorExcludeDynamic) { + // In the next check, only check for floors higher than the previous check + dynamicHeight = height; + // Check for surfaces belonging to objects. + surfaceList = gDynamicSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_FLOORS].next; + dynamicFloor = find_floor_from_list(surfaceList, x, y, z, &dynamicHeight); + if (dynamicHeight > height) { + floor = dynamicFloor; + height = dynamicHeight; + } + } // To prevent accidentally leaving the floor tangible, stop checking for it. gFindFloorIncludeSurfaceIntangible = FALSE; + gFindFloorExcludeDynamic = FALSE; // If a floor was missed, increment the debug counter. if (floor == NULL) { gNumFindFloorMisses++; } - - if (dynamicHeight > height) { - floor = dynamicFloor; - height = dynamicHeight; - } - *pfloor = floor; - // Increment the debug tracker. gNumCalls.floor++; - - #if PUPPYPRINT_DEBUG - collisionTime[perfIteration] += osGetTime()-first; - #endif - +#if PUPPYPRINT_DEBUG + collisionTime[perfIteration] += osGetTime() - first; +#endif return height; } +f32 find_room_floor(f32 x, f32 y, f32 z, struct Surface **pfloor) { + gFindFloorIncludeSurfaceIntangible = TRUE; + gFindFloorExcludeDynamic = TRUE; + return find_floor(x, y, z, pfloor); +} + /** * Find the highest water floor under a given position and return the height. */ diff --git a/src/engine/surface_collision.h b/src/engine/surface_collision.h index bd1ebd36..eb174505 100644 --- a/src/engine/surface_collision.h +++ b/src/engine/surface_collision.h @@ -41,6 +41,7 @@ void resolve_and_return_wall_collisions(Vec3f pos, f32 offset, f32 radius, struc f32 find_ceil(f32 posX, f32 posY, f32 posZ, struct Surface **pceil); f32 find_floor_height(f32 x, f32 y, f32 z); f32 find_floor(f32 xPos, f32 yPos, f32 zPos, struct Surface **pfloor); +f32 find_room_floor(f32 x, f32 y, f32 z, struct Surface **pfloor); s32 find_water_level_and_floor(s32 x, s32 z, struct Surface **pfloor); s32 find_water_level(s32 x, s32 z); s32 find_poison_gas_level(s32 x, s32 z); diff --git a/src/game/behaviors/door.inc.c b/src/game/behaviors/door.inc.c index 8685fdcb..9f529fbd 100644 --- a/src/game/behaviors/door.inc.c +++ b/src/game/behaviors/door.inc.c @@ -84,21 +84,21 @@ void bhv_door_init(void) { f32 x = o->oPosX; f32 z = o->oPosZ; struct Surface *floor; - find_floor(x, o->oPosY, z, &floor); + find_room_floor(x, o->oPosY, z, &floor); if (floor != NULL) { o->oDoorSelfRoom = floor->room; } x = o->oPosX + sins(o->oMoveAngleYaw) * 200.0f; z = o->oPosZ + coss(o->oMoveAngleYaw) * 200.0f; - find_floor(x, o->oPosY, z, &floor); + find_room_floor(x, o->oPosY, z, &floor); if (floor != NULL) { o->oDoorForwardRoom = floor->room; } x = o->oPosX + sins(o->oMoveAngleYaw) * -200.0f; z = o->oPosZ + coss(o->oMoveAngleYaw) * -200.0f; - find_floor(x, o->oPosY, z, &floor); + find_room_floor(x, o->oPosY, z, &floor); if (floor != NULL) { o->oDoorBackwardRoom = floor->room; } diff --git a/src/game/object_helpers.c b/src/game/object_helpers.c index 7351e090..dc1df145 100644 --- a/src/game/object_helpers.c +++ b/src/game/object_helpers.c @@ -155,9 +155,13 @@ Gfx *geo_switch_area(s32 callContext, struct GraphNode *node, UNUSED void *conte if (gMarioObject == NULL) { switchCase->selectedCase = 0; } else { - gFindFloorIncludeSurfaceIntangible = TRUE; - - find_floor(gMarioObject->oPosX, gMarioObject->oPosY, gMarioObject->oPosZ, &floor); + if (gCurrLevelNum == LEVEL_BBH) { + // In BBH, check for a floor manually, since there is an intangible floor. In custom hacks this can be removed. + find_room_floor(gMarioObject->oPosX, gMarioObject->oPosY, gMarioObject->oPosZ, &floor); + } else { + // Since no intangible floors are nearby, use Mario's floor instead. + floor = gMarioState->floor; + } if (floor) { gMarioCurrentRoom = floor->room; @@ -1981,28 +1985,15 @@ s32 is_item_in_array(s8 item, s8 *array) { } void bhv_init_room(void) { - struct Surface *floor; - f32 floorHeight; - + struct Surface *floor = NULL; if (is_item_in_array(gCurrLevelNum, sLevelsWithRooms)) { - floorHeight = find_floor(o->oPosX, o->oPosY, o->oPosZ, &floor); - + find_room_floor(o->oPosX, o->oPosY, o->oPosZ, &floor); if (floor != NULL) { - if (floor->room != 0) { - o->oRoom = floor->room; - } else { - // Floor probably belongs to a platform object. Try looking - // underneath it - find_floor(o->oPosX, floorHeight - 100.0f, o->oPosZ, &floor); - if (floor != NULL) { - //! Technically possible that the room could still be 0 here - o->oRoom = floor->room; - } - } + o->oRoom = floor->room; + return; } - } else { - o->oRoom = -1; } + o->oRoom = -1; } void cur_obj_enable_rendering_if_mario_in_room(void) { diff --git a/src/game/object_list_processor.c b/src/game/object_list_processor.c index ebdf8456..13c51f72 100644 --- a/src/game/object_list_processor.c +++ b/src/game/object_list_processor.c @@ -146,6 +146,7 @@ struct MemoryPool *gObjectMemoryPool; s16 gCheckingSurfaceCollisionsForCamera; s16 gFindFloorIncludeSurfaceIntangible; +s16 gFindFloorExcludeDynamic; TerrainData *gEnvironmentRegions; s32 gEnvironmentLevels[20]; RoomData gDoorAdjacentRooms[60][2]; diff --git a/src/game/object_list_processor.h b/src/game/object_list_processor.h index a5152fbd..7c3c6099 100644 --- a/src/game/object_list_processor.h +++ b/src/game/object_list_processor.h @@ -100,6 +100,7 @@ extern struct MemoryPool *gObjectMemoryPool; extern s16 gCheckingSurfaceCollisionsForCamera; extern s16 gFindFloorIncludeSurfaceIntangible; +extern s16 gFindFloorExcludeDynamic; extern TerrainData *gEnvironmentRegions; extern s32 gEnvironmentLevels[20]; extern RoomData gDoorAdjacentRooms[60][2]; From 66932d84a46f1e7329c43b6f3bd350c48222ae9f Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Wed, 29 Sep 2021 11:30:07 -0700 Subject: [PATCH 48/97] Add DISABLE_LEVEL_SPECIFIC_CHECKS --- include/config.h | 14 ++- src/game/behaviors/capswitch.inc.c | 9 ++ src/game/behaviors/coin.inc.c | 4 + src/game/behaviors/fish.inc.c | 37 +++++--- src/game/behaviors/flamethrower.inc.c | 15 ++-- src/game/behaviors/piranha_plant.inc.c | 8 +- src/game/behaviors/whomp.inc.c | 22 ++--- src/game/camera.c | 120 ++++++++++++++----------- src/game/level_update.c | 13 ++- src/game/mario_actions_automatic.c | 8 +- src/game/mario_actions_cutscene.c | 7 +- src/game/mario_actions_submerged.c | 3 +- src/game/object_helpers.c | 9 +- src/game/object_helpers.h | 4 +- src/game/puppycam2.c | 3 +- 15 files changed, 166 insertions(+), 110 deletions(-) diff --git a/include/config.h b/include/config.h index 2b393dee..88106dc8 100644 --- a/include/config.h +++ b/include/config.h @@ -26,6 +26,10 @@ #endif // TARGET_N64 // -- GAME SETTINGS -- +// Disables some mechanics that change behavior depending on hardcoded level numbers. +// You may also need to change sLevelsWithRooms in object_helpers.c +// TODO: separate this into separate defines, behavior params, or make these mechanics otherwise dynamic +// #define DISABLE_LEVEL_SPECIFIC_CHECKS // Disable lives and hide the lives counter #define DISABLE_LIVES // Air/Breath meter is separate from health meter when underwater @@ -127,12 +131,10 @@ //#define SKIP_TITLE_SCREEN // Uncomment this if you want to keep the mario head and not skip it //#define KEEP_MARIO_HEAD -#ifdef KEEP_MARIO_HEAD // safeguard -//Goddard easter egg from Shindou (has no effect if KEEP_MARIO_HEAD is disabled) +// Goddard easter egg from Shindou (has no effect if KEEP_MARIO_HEAD is disabled) #define GODDARD_EASTER_EGG // Disables the demo that plays when idle on the start screen (has no effect if KEEP_MARIO_HEAD is disabled) #define DISABLE_DEMO -#endif // KEEP_MARIO_HEAD // -- CAMERA SETTINGS -- // Remove course specific camera processing @@ -204,3 +206,9 @@ //#define UNLOCK_ALL // If you want to change the extended boundaries mode, go to engine/extended_bounds.h and change EXTENDED_BOUNDS_MODE + +// -- Compatibility safeguards. Don't mess with these unless you know what you're doing.-- +#ifndef KEEP_MARIO_HEAD +#undef GODDARD_EASTER_EGG +#define DISABLE_DEMO +#endif diff --git a/src/game/behaviors/capswitch.inc.c b/src/game/behaviors/capswitch.inc.c index d79f8970..2688634f 100644 --- a/src/game/behaviors/capswitch.inc.c +++ b/src/game/behaviors/capswitch.inc.c @@ -7,6 +7,14 @@ void cap_switch_act_0(void) { cur_obj_scale(0.5f); o->oPosY += 71.0f; spawn_object_relative_with_scale(0, 0, -71, 0, 0.5f, o, MODEL_CAP_SWITCH_BASE, bhvCapSwitchBase); +#ifdef DISABLE_LEVEL_SPECIFIC_CHECKS + if (save_file_get_flags() & sCapSaveFlags[o->oBehParams2ndByte]) { + o->oAction = 3; + o->header.gfx.scale[1] = 0.1f; + } else { + o->oAction = 1; + } +#else if (gCurrLevelNum != LEVEL_UNKNOWN_32) { if (save_file_get_flags() & sCapSaveFlags[o->oBehParams2ndByte]) { o->oAction = 3; @@ -17,6 +25,7 @@ void cap_switch_act_0(void) { } else { o->oAction = 1; } +#endif } void cap_switch_act_1(void) { diff --git a/src/game/behaviors/coin.inc.c b/src/game/behaviors/coin.inc.c index 7436c13f..3dd847d2 100644 --- a/src/game/behaviors/coin.inc.c +++ b/src/game/behaviors/coin.inc.c @@ -216,7 +216,11 @@ void coin_inside_boo_act_0(void) { s16 marioMoveYaw; struct Object *parent = o->parentObj; cur_obj_become_intangible(); +#ifdef DISABLE_LEVEL_SPECIFIC_CHECKS + if (o->oTimer == 0) { +#else if (o->oTimer == 0 && gCurrLevelNum == LEVEL_BBH) { +#endif cur_obj_set_model(MODEL_BLUE_COIN); cur_obj_scale(0.7f); } diff --git a/src/game/behaviors/fish.inc.c b/src/game/behaviors/fish.inc.c index f72291d7..67a95b34 100644 --- a/src/game/behaviors/fish.inc.c +++ b/src/game/behaviors/fish.inc.c @@ -26,7 +26,11 @@ static void fish_spawner_act_spawn(void) { // Spawn and animate the schoolQuantity of fish if Mario enters render distance // or the stage is Secret Aquarium. // Fish moves randomly within a range of 700.0f. +#ifdef DISABLE_LEVEL_SPECIFIC_CHECKS + if (o->oDistanceToMario < minDistToMario) { +#else if (o->oDistanceToMario < minDistToMario || gCurrLevelNum == LEVEL_SA) { +#endif for (i = 0; i < schoolQuantity; i++) { fishObject = spawn_object(o, model, bhvFish); fishObject->oBehParams2ndByte = o->oBehParams2ndByte; @@ -67,7 +71,7 @@ void bhv_fish_spawner_loop(void) { */ static void fish_vertical_roam(s32 speed) { f32 parentY = o->parentObj->oPosY; - +#ifndef DISABLE_LEVEL_SPECIFIC_CHECKS // If the stage is Secret Aquarium, the fish can // travel as far vertically as they wish. if (gCurrLevelNum == LEVEL_SA) { @@ -76,9 +80,10 @@ static void fish_vertical_roam(s32 speed) { } o->oPosY = approach_f32_symmetric(o->oPosY, o->oFishGoalY, speed); - // Allow the fish to roam vertically if within - // range of the fish spawner. - } else if (parentY - 100.0f - o->oFishDepthDistance < o->oPosY + // Allow the fish to roam vertically if within range of the fish spawner. + } else +#endif + if (parentY - 100.0f - o->oFishDepthDistance < o->oPosY && o->oPosY < parentY + 1000.0f + o->oFishDepthDistance) { o->oPosY = approach_f32_symmetric(o->oPosY, o->oFishGoalY, speed); } @@ -100,11 +105,11 @@ static void fish_act_roam(void) { // Initializes some variables when the fish first begins roaming. if (o->oTimer == 0) { o->oForwardVel = random_float() * 2 + 3.0f; - if (gCurrLevelNum == LEVEL_SA) { - o->oFishHeightOffset = random_float() * 700.0f; - } else { - o->oFishHeightOffset = random_float() * 100.0f; - } +#ifdef DISABLE_LEVEL_SPECIFIC_CHECKS + o->oFishHeightOffset = random_float() * 100.0f; +#else + o->oFishHeightOffset = random_float() * ((gCurrLevelNum == LEVEL_SA) ? 700.0f : 100.0f); +#endif o->oFishRoamDistance = random_float() * 500 + 200.0f; } @@ -217,25 +222,29 @@ void bhv_fish_loop(void) { // oFishWaterLevel tracks if a fish has roamed out of water. // This can't happen in Secret Aquarium, so set it to 0. o->oFishWaterLevel = find_water_level(o->oPosX, o->oPosZ); +#ifndef DISABLE_LEVEL_SPECIFIC_CHECKS if (gCurrLevelNum == LEVEL_SA) { o->oFishWaterLevel = 0.0f; } +#endif // Apply hitbox and resolve wall collisions o->oWallHitboxRadius = 30.0f; cur_obj_resolve_wall_collisions(); - +#ifdef DISABLE_LEVEL_SPECIFIC_CHECKS + if (o->oFishWaterLevel < FLOOR_LOWER_LIMIT_MISC) { + obj_mark_for_deletion(o); + return; + } +#else // Delete fish if it's drifted to an area with no water. if (gCurrLevelNum != LEVEL_UNKNOWN_32) { if (o->oFishWaterLevel < FLOOR_LOWER_LIMIT_MISC) { obj_mark_for_deletion(o); return; } - - // Unreachable code, perhaps for debugging or testing. - } else { - o->oFishWaterLevel = 1000.0f; } +#endif // Call fish action methods and apply physics engine. cur_obj_call_action_function(sFishActions); diff --git a/src/game/behaviors/flamethrower.inc.c b/src/game/behaviors/flamethrower.inc.c index 8c4e600f..66d3f1ca 100644 --- a/src/game/behaviors/flamethrower.inc.c +++ b/src/game/behaviors/flamethrower.inc.c @@ -39,9 +39,13 @@ void bhv_flamethrower_loop(void) { s32 flameTimeRemaining; s32 model; if (o->oAction == 0) { - if (gCurrLevelNum != LEVEL_BBH || gMarioOnMerryGoRound == TRUE) - if (o->oDistanceToMario < 2000.0f) +#ifndef DISABLE_LEVEL_SPECIFIC_CHECKS + if (gCurrLevelNum != LEVEL_BBH || gMarioOnMerryGoRound == TRUE) { + if (o->oDistanceToMario < 2000.0f) { o->oAction++; + } + } +#endif } else if (o->oAction == 1) { model = MODEL_RED_FLAME; flameVel = 95.0f; @@ -50,12 +54,13 @@ void bhv_flamethrower_loop(void) { if (o->oBehParams2ndByte == 2) flameVel = 50.0f; flameTimeRemaining = 1; - if (o->oTimer < 60) + if (o->oTimer < 60) { flameTimeRemaining = 15; - else if (o->oTimer < 74) + } else if (o->oTimer < 74) { flameTimeRemaining = 75 - o->oTimer; // Range: [15..2] - else + } else { o->oAction++; + } o->oFlameThowerTimeRemaining = flameTimeRemaining; flame = spawn_object_relative(o->oBehParams2ndByte, 0, 0, 0, o, model, bhvFlamethrowerFlame); flame->oForwardVel = flameVel; diff --git a/src/game/behaviors/piranha_plant.inc.c b/src/game/behaviors/piranha_plant.inc.c index 371bf557..d97e53ab 100644 --- a/src/game/behaviors/piranha_plant.inc.c +++ b/src/game/behaviors/piranha_plant.inc.c @@ -309,13 +309,15 @@ void (*TablePiranhaPlantActions[])(void) = { */ void bhv_piranha_plant_loop(void) { cur_obj_call_action_function(TablePiranhaPlantActions); - +#ifndef DISABLE_LEVEL_SPECIFIC_CHECKS // In WF, hide all Piranha Plants once high enough up. if (gCurrLevelNum == LEVEL_WF) { - if (gMarioObject->oPosY > 3400.0f) + if (gMarioObject->oPosY > 3400.0f) { cur_obj_hide(); - else + } else { cur_obj_unhide(); + } } +#endif o->oInteractStatus = 0; } diff --git a/src/game/behaviors/whomp.inc.c b/src/game/behaviors/whomp.inc.c index f98de7d8..d1517601 100644 --- a/src/game/behaviors/whomp.inc.c +++ b/src/game/behaviors/whomp.inc.c @@ -52,23 +52,19 @@ void whomp_turn(void) { } void whomp_patrol(void) { - s16 marioAngle; - f32 distWalked; - f32 patrolDist; - - marioAngle = abs_angle_diff(o->oAngleToMario, o->oMoveAngleYaw); - distWalked = cur_obj_lateral_dist_to_home(); - if (gCurrLevelNum == LEVEL_BITS) - patrolDist = 200.0f; - else - patrolDist = 700.0f; - + s16 marioAngle = abs_angle_diff(o->oAngleToMario, o->oMoveAngleYaw); + f32 distWalked = cur_obj_lateral_dist_to_home(); +#ifdef DISABLE_LEVEL_SPECIFIC_CHECKS // Make this a behavior param? + f32 patrolDist = 700.0f; +#else + f32 patrolDist = ((gCurrLevelNum == LEVEL_BITS) ? 200.0f : 700.0f); +#endif cur_obj_init_animation_with_accel_and_sound(0, 1.0f); o->oForwardVel = 3.0f; - if (distWalked > patrolDist) + if (distWalked > patrolDist) { o->oAction = 7; - else if (marioAngle < 0x2000) { + } else if (marioAngle < 0x2000) { if (o->oDistanceToMario < 1500.0f) { o->oForwardVel = 9.0f; cur_obj_init_animation_with_accel_and_sound(0, 3.0f); diff --git a/src/game/camera.c b/src/game/camera.c index cc7aa740..0c91c8e7 100644 --- a/src/game/camera.c +++ b/src/game/camera.c @@ -1525,12 +1525,12 @@ s32 update_boss_fight_camera(struct Camera *c, Vec3f focus, Vec3f pos) { pos[1] += 125.f; } } - +#ifndef DISABLE_LEVEL_SPECIFIC_CHECKS // Prevent the camera from going to the ground in the outside boss fight if (gCurrLevelNum == LEVEL_BBH) { pos[1] = 2047.f; } - +#endif // Rotate from C-Button input if (sCSideButtonYaw < 0) { sModeOffsetYaw += 0x200; @@ -1610,11 +1610,15 @@ void mode_parallel_tracking_camera(struct Camera *c) { * Fixed camera mode, the camera rotates around a point and looks and zooms toward Mario. */ void mode_fixed_camera(struct Camera *c) { +#ifdef DISABLE_LEVEL_SPECIFIC_CHECKS + set_fov_function(CAM_FOV_APP_45); +#else if (gCurrLevelNum == LEVEL_BBH) { set_fov_function(CAM_FOV_BBH); } else { set_fov_function(CAM_FOV_APP_45); } +#endif c->nextYaw = update_fixed_camera(c, c->focus, c->pos); c->yaw = c->nextYaw; pan_ahead_of_player(c); @@ -2149,9 +2153,11 @@ s16 update_default_camera(struct Camera *c) { } if ((gCameraMovementFlags & CAM_MOVE_ZOOMED_OUT) && (sSelectionFlags & CAM_MODE_MARIO_ACTIVE)) { posHeight = 610.f; +#ifndef DISABLE_LEVEL_SPECIFIC_CHECKS if (gCurrLevelArea == AREA_SSL_PYRAMID || gCurrLevelNum == LEVEL_CASTLE) { posHeight /= 2; } +#endif } // Make Lakitu fly above the gas @@ -2806,9 +2812,9 @@ void update_camera(struct Camera *c) { gCamera = c; update_camera_hud_status(c); if (c->cutscene == 0 && - #ifdef PUPPYCAM +#ifdef PUPPYCAM !gPuppyCam.enabled && - #endif +#endif !(gCurrentArea->camera->mode == CAMERA_MODE_INSIDE_CANNON)) { // Only process R_TRIG if 'fixed' is not selected in the menu if (cam_select_alt_mode(0) == CAM_SELECTION_MARIO) { @@ -2831,9 +2837,9 @@ void update_camera(struct Camera *c) { sStatusFlags |= CAM_FLAG_FRAME_AFTER_CAM_INIT; } - #ifdef PUPPYCAM +#ifdef PUPPYCAM if (!gPuppyCam.enabled || c->cutscene != 0 || gCurrentArea->camera->mode == CAMERA_MODE_INSIDE_CANNON) { - #endif +#endif // Store previous geometry information sMarioGeometry.prevFloorHeight = sMarioGeometry.currFloorHeight; sMarioGeometry.prevCeilHeight = sMarioGeometry.currCeilHeight; @@ -2903,62 +2909,65 @@ void update_camera(struct Camera *c) { } } } - #ifdef PUPPYCAM +#ifdef PUPPYCAM } - #endif +#endif // Start any Mario-related cutscenes start_cutscene(c, get_cutscene_from_mario_status(c)); gCheckingSurfaceCollisionsForCamera = FALSE; - #ifdef PUPPYCAM +#ifdef PUPPYCAM if (!gPuppyCam.enabled || c->cutscene != 0 || gCurrentArea->camera->mode == CAMERA_MODE_INSIDE_CANNON) { - #endif - if (gCurrLevelNum != LEVEL_CASTLE) { - // If fixed camera is selected as the alternate mode, then fix the camera as long as the right - // trigger is held - if ((c->cutscene == 0 && - (gPlayer1Controller->buttonDown & R_TRIG) && cam_select_alt_mode(0) == CAM_SELECTION_FIXED) - || (gCameraMovementFlags & CAM_MOVE_FIX_IN_PLACE) - || (sMarioCamState->action) == ACT_GETTING_BLOWN) { +#endif +#ifndef DISABLE_LEVEL_SPECIFIC_CHECKS + if (gCurrLevelNum != LEVEL_CASTLE) { +#endif + // If fixed camera is selected as the alternate mode, then fix the camera as long as the right + // trigger is held + if ((c->cutscene == 0 && + (gPlayer1Controller->buttonDown & R_TRIG) && cam_select_alt_mode(0) == CAM_SELECTION_FIXED) + || (gCameraMovementFlags & CAM_MOVE_FIX_IN_PLACE) + || (sMarioCamState->action) == ACT_GETTING_BLOWN) { - // If this is the first frame that R_TRIG is held, play the "click" sound - if (c->cutscene == 0 && (gPlayer1Controller->buttonPressed & R_TRIG) - && cam_select_alt_mode(0) == CAM_SELECTION_FIXED) { - sCameraSoundFlags |= CAM_SOUND_FIXED_ACTIVE; - play_sound_rbutton_changed(); + // If this is the first frame that R_TRIG is held, play the "click" sound + if (c->cutscene == 0 && (gPlayer1Controller->buttonPressed & R_TRIG) + && cam_select_alt_mode(0) == CAM_SELECTION_FIXED) { + sCameraSoundFlags |= CAM_SOUND_FIXED_ACTIVE; + play_sound_rbutton_changed(); + } + + // Fixed mode only prevents Lakitu from moving. The camera pos still updates, so + // Lakitu will fly to his next position as normal whenever R_TRIG is released. + gLakituState.posHSpeed = 0.f; + gLakituState.posVSpeed = 0.f; + + vec3f_get_yaw(gLakituState.focus, gLakituState.pos, &c->nextYaw); + c->yaw = c->nextYaw; + gCameraMovementFlags &= ~CAM_MOVE_FIX_IN_PLACE; + } else { + // Play the "click" sound when fixed mode is released + if (sCameraSoundFlags & CAM_SOUND_FIXED_ACTIVE) { + play_sound_rbutton_changed(); + sCameraSoundFlags &= ~CAM_SOUND_FIXED_ACTIVE; + } } - - // Fixed mode only prevents Lakitu from moving. The camera pos still updates, so - // Lakitu will fly to his next position as normal whenever R_TRIG is released. - gLakituState.posHSpeed = 0.f; - gLakituState.posVSpeed = 0.f; - - vec3f_get_yaw(gLakituState.focus, gLakituState.pos, &c->nextYaw); - c->yaw = c->nextYaw; - gCameraMovementFlags &= ~CAM_MOVE_FIX_IN_PLACE; +#ifndef DISABLE_LEVEL_SPECIFIC_CHECKS } else { - // Play the "click" sound when fixed mode is released - if (sCameraSoundFlags & CAM_SOUND_FIXED_ACTIVE) { - play_sound_rbutton_changed(); - sCameraSoundFlags &= ~CAM_SOUND_FIXED_ACTIVE; + if ((gPlayer1Controller->buttonPressed & R_TRIG) && cam_select_alt_mode(0) == CAM_SELECTION_FIXED) { + play_sound_button_change_blocked(); } } - } else { - if ((gPlayer1Controller->buttonPressed & R_TRIG) && cam_select_alt_mode(0) == CAM_SELECTION_FIXED) { - play_sound_button_change_blocked(); - } - } +#endif - update_lakitu(c); - #ifdef PUPPYCAM + update_lakitu(c); +#ifdef PUPPYCAM } - //Just a cute little bit that syncs puppycamera up to vanilla when playing a vanilla cutscene :3 + // Just a cute little bit that syncs puppycamera up to vanilla when playing a vanilla cutscene :3 if (c->cutscene != 0) { gPuppyCam.yawTarget = gCamera->yaw; gPuppyCam.yaw = gCamera->yaw; - if (gMarioState->action == ACT_ENTERING_STAR_DOOR) - { //god this is stupid and the fact I have to continue doing this is testament to the idiocy of the star door cutscene >:( - gPuppyCam.yawTarget = gMarioState->faceAngle[1]+0x8000; - gPuppyCam.yaw = gMarioState->faceAngle[1]+0x8000; + if (gMarioState->action == ACT_ENTERING_STAR_DOOR) { // god this is stupid and the fact I have to continue doing this is testament to the idiocy of the star door cutscene >:( + gPuppyCam.yawTarget = gMarioState->faceAngle[1] + 0x8000; + gPuppyCam.yaw = gMarioState->faceAngle[1] + 0x8000; } } if (c->cutscene == 0 && gPuppyCam.enabled && !(gCurrentArea->camera->mode == CAMERA_MODE_INSIDE_CANNON)) { @@ -2983,7 +2992,7 @@ void update_camera(struct Camera *c) { gLakituState.roll += sHandheldShakeRoll; gLakituState.roll += gLakituState.keyDanceRoll; } - #endif +#endif gLakituState.lastFrameAction = sMarioCamState->action; } @@ -3246,9 +3255,11 @@ void zoom_out_if_paused_and_outside(struct GraphNodeCamera *camera) { camera->focus[2] = gCamera->areaCenZ; vec3f_get_yaw(camera->focus, sMarioCamState->pos, &yaw); vec3f_set_dist_and_angle(sMarioCamState->pos, camera->pos, 6000.f, 0x1000, yaw); +#ifndef DISABLE_LEVEL_SPECIFIC_CHECKS if (gCurrLevelNum != LEVEL_THI) { find_in_bounds_yaw_wdw_bob_thi(camera->pos, camera->focus, 0); } +#endif } } else { sFramesPaused++; @@ -4926,11 +4937,11 @@ void check_blocking_area_processing(const u8 *mode) { *mode == CAMERA_MODE_BEHIND_MARIO || *mode == CAMERA_MODE_WATER_SURFACE) { sStatusFlags |= CAM_FLAG_BLOCK_AREA_PROCESSING; } - +#ifndef DISABLE_LEVEL_SPECIFIC_CHECKS if (gCurrLevelNum == LEVEL_DDD || gCurrLevelNum == LEVEL_WDW || gCurrLevelNum == LEVEL_COTMC) { sStatusFlags &= ~CAM_FLAG_BLOCK_AREA_PROCESSING; } - +#endif if ((*mode == CAMERA_MODE_BEHIND_MARIO && !(sMarioCamState->action & (ACT_FLAG_SWIMMING | ACT_FLAG_METAL_WATER))) || *mode == CAMERA_MODE_INSIDE_CANNON) { @@ -7358,12 +7369,14 @@ void cutscene_bowser_arena_start(struct Camera *c) { * Create the dialog box depending on which bowser fight Mario is in. */ void bowser_fight_intro_dialog(UNUSED struct Camera *c) { +#ifndef DISABLE_LEVEL_SPECIFIC_CHECKS switch (gCurrLevelNum) { case LEVEL_BOWSER_1: create_dialog_box(DIALOG_067); break; case LEVEL_BOWSER_2: create_dialog_box(DIALOG_092); break; case LEVEL_BOWSER_3: create_dialog_box(DIALOG_093); break; default: break; } +#endif } /** @@ -7640,11 +7653,12 @@ void cutscene_goto_cvar_pos(struct Camera *c, f32 goalDist, s16 goalPitch, s16 r nextPitch = goalPitch; vec3f_copy(sCutsceneVars[0].point, sCutsceneVars[3].point); sStatusFlags &= ~CAM_FLAG_SMOOTH_MOVEMENT; - +#ifndef DISABLE_LEVEL_SPECIFIC_CHECKS if (gCurrLevelNum == LEVEL_TTM) { nextYaw = atan2s(sCutsceneVars[3].point[2] - c->areaCenZ, sCutsceneVars[3].point[0] - c->areaCenX); } +#endif } else { if (c->cutscene == CUTSCENE_PREPARE_CANNON) { vec3f_get_dist_and_angle(c->pos, sCutsceneVars[0].point, &curDist, &curPitch, &curYaw); @@ -7928,14 +7942,14 @@ void cutscene_suffocation(struct Camera *c) { void cutscene_enter_pool_start(struct Camera *c) { vec3f_copy(sCutsceneVars[3].point, sMarioCamState->pos); - +#ifndef DISABLE_LEVEL_SPECIFIC_CHECKS if (gCurrLevelNum == LEVEL_CASTLE) { // entering HMC vec3f_set(sCutsceneVars[3].point, 2485.f, -1589.f, -2659.f); } if (gCurrLevelNum == LEVEL_HMC) { // entering CotMC vec3f_set(sCutsceneVars[3].point, 3350.f, -4589.f, 4800.f); } - +#endif vec3f_copy(sCutsceneVars[0].point, c->focus); } diff --git a/src/game/level_update.c b/src/game/level_update.c index 07a81885..35c1b275 100644 --- a/src/game/level_update.c +++ b/src/game/level_update.c @@ -433,7 +433,7 @@ void init_mario_after_warp(void) { play_cap_music(SEQUENCE_ARGS(4, SEQ_EVENT_POWERUP)); } -#ifndef VERSION_JP +#ifndef DISABLE_LEVEL_SPECIFIC_CHECKS if (gCurrLevelNum == LEVEL_BOB && get_current_background_music() != SEQUENCE_ARGS(4, SEQ_LEVEL_SLIDE) && sTimerRunning) { @@ -443,7 +443,7 @@ void init_mario_after_warp(void) { if (sWarpDest.levelNum == LEVEL_CASTLE && sWarpDest.areaIdx == 1 && (sWarpDest.nodeId == 31 || sWarpDest.nodeId == 32)) play_sound(SOUND_MENU_MARIO_CASTLE_WARP, gGlobalSoundSource); -#ifndef VERSION_JP +#ifndef DISABLE_LEVEL_SPECIFIC_CHECKS if (sWarpDest.levelNum == LEVEL_CASTLE_GROUNDS && sWarpDest.areaIdx == 1 && (sWarpDest.nodeId == 7 || sWarpDest.nodeId == 10 || sWarpDest.nodeId == 20 || sWarpDest.nodeId == 30)) { @@ -573,6 +573,7 @@ s16 music_unchanged_through_warp(s16 arg) { s16 unchanged = TRUE; s16 currBgMusic; +#ifndef DISABLE_LEVEL_SPECIFIC_CHECKS if (levelNum == LEVEL_BOB && levelNum == gCurrLevelNum && destArea == gCurrAreaIndex) { currBgMusic = get_current_background_music(); if (currBgMusic == SEQUENCE_ARGS(4, SEQ_EVENT_POWERUP | SEQ_VARIATION) @@ -580,6 +581,7 @@ s16 music_unchanged_through_warp(s16 arg) { unchanged = FALSE; } } else { +#endif u16 destParam1 = gAreas[destArea].musicParam; u16 destParam2 = gAreas[destArea].musicParam2; @@ -589,7 +591,9 @@ s16 music_unchanged_through_warp(s16 arg) { if (get_current_background_music() != destParam2) { unchanged = FALSE; } +#ifndef DISABLE_LEVEL_SPECIFIC_CHECKS } +#endif return unchanged; } @@ -969,16 +973,17 @@ void basic_update(UNUSED s16 *arg) { } s32 play_mode_normal(void) { +#ifndef DISABLE_DEMO if (gCurrDemoInput != NULL) { print_intro_text(); if (gPlayer1Controller->buttonPressed & END_DEMO) { - level_trigger_warp(gMarioState, - gCurrLevelNum == LEVEL_PSS ? WARP_OP_DEMO_END : WARP_OP_DEMO_NEXT); + level_trigger_warp(gMarioState, gCurrLevelNum == LEVEL_PSS ? WARP_OP_DEMO_END : WARP_OP_DEMO_NEXT); } else if (!gWarpTransition.isActive && sDelayedWarpOp == WARP_OP_NONE && (gPlayer1Controller->buttonPressed & START_BUTTON)) { level_trigger_warp(gMarioState, WARP_OP_DEMO_NEXT); } } +#endif warp_area(); check_instant_warp(); diff --git a/src/game/mario_actions_automatic.c b/src/game/mario_actions_automatic.c index 3d53800a..a14dfc30 100644 --- a/src/game/mario_actions_automatic.c +++ b/src/game/mario_actions_automatic.c @@ -28,15 +28,9 @@ #define HANG_LEFT_CEIL 2 void add_tree_leaf_particles(struct MarioState *m) { - f32 leafHeight; - if (m->usedObj->behavior == segmented_to_virtual(bhvTree)) { // make leaf effect spawn higher on the Shifting Sand Land palm tree - if (gCurrLevelNum == LEVEL_SSL) { - leafHeight = 250.0f; - } else { - leafHeight = 100.0f; - } + f32 leafHeight = (obj_has_model(m->usedObj, MODEL_SSL_PALM_TREE) ? 250.0f : 100.0f); if (m->pos[1] - m->floorHeight > leafHeight) { m->particleFlags |= PARTICLE_LEAF; } diff --git a/src/game/mario_actions_cutscene.c b/src/game/mario_actions_cutscene.c index 906894c5..31e2c793 100644 --- a/src/game/mario_actions_cutscene.c +++ b/src/game/mario_actions_cutscene.c @@ -950,11 +950,15 @@ s32 act_warp_door_spawn(struct MarioState *m) { m->usedObj->oInteractStatus = INT_STATUS_WARP_DOOR_PUSHED; } } else if (m->usedObj->oAction == 0) { +#ifdef DISABLE_LEVEL_SPECIFIC_CHECKS + set_mario_action(m, ACT_IDLE, 0); +#else if (gNeverEnteredCastle == TRUE && gCurrLevelNum == LEVEL_CASTLE) { set_mario_action(m, ACT_READING_AUTOMATIC_DIALOG, DIALOG_021); } else { set_mario_action(m, ACT_IDLE, 0); } +#endif } set_mario_animation(m, MARIO_ANIM_FIRST_PERSON); stop_and_set_height_to_floor(m); @@ -972,7 +976,7 @@ s32 act_emerge_from_pipe(struct MarioState *m) { marioObj->header.gfx.node.flags |= GRAPH_RENDER_ACTIVE; play_sound_if_no_flag(m, SOUND_MARIO_YAHOO, MARIO_MARIO_SOUND_PLAYED); - +#ifndef DISABLE_LEVEL_SPECIFIC_CHECKS if (gCurrLevelNum == LEVEL_THI) { if (gCurrAreaIndex == 2) { play_sound_if_no_flag(m, SOUND_MENU_EXIT_PIPE, MARIO_ACTION_SOUND_PLAYED); @@ -980,6 +984,7 @@ s32 act_emerge_from_pipe(struct MarioState *m) { play_sound_if_no_flag(m, SOUND_MENU_ENTER_PIPE, MARIO_ACTION_SOUND_PLAYED); } } +#endif if (launch_mario_until_land(m, ACT_JUMP_LAND_STOP, MARIO_ANIM_SINGLE_JUMP, 8.0f)) { mario_set_forward_vel(m, 0.0f); diff --git a/src/game/mario_actions_submerged.c b/src/game/mario_actions_submerged.c index 712d47da..90e177b0 100644 --- a/src/game/mario_actions_submerged.c +++ b/src/game/mario_actions_submerged.c @@ -145,10 +145,11 @@ static void apply_water_current(struct MarioState *m, Vec3f step) { yawToWhirlpool -= (s16)(0x2000 * 1000.0f / (distance + 1000.0f)); if (whirlpool->strength >= 0) { +#ifndef DISABLE_LEVEL_SPECIFIC_CHECKS if (gCurrLevelNum == LEVEL_DDD && gCurrAreaIndex == 2) { whirlpoolRadius = 4000.0f; } - +#endif if (distance >= 26.0f && distance < whirlpoolRadius) { strength = whirlpool->strength * (1.0f - distance / whirlpoolRadius); } diff --git a/src/game/object_helpers.c b/src/game/object_helpers.c index dc1df145..4627e61e 100644 --- a/src/game/object_helpers.c +++ b/src/game/object_helpers.c @@ -155,6 +155,7 @@ Gfx *geo_switch_area(s32 callContext, struct GraphNode *node, UNUSED void *conte if (gMarioObject == NULL) { switchCase->selectedCase = 0; } else { +#ifndef DISABLE_LEVEL_SPECIFIC_CHECKS if (gCurrLevelNum == LEVEL_BBH) { // In BBH, check for a floor manually, since there is an intangible floor. In custom hacks this can be removed. find_room_floor(gMarioObject->oPosX, gMarioObject->oPosY, gMarioObject->oPosZ, &floor); @@ -162,7 +163,9 @@ Gfx *geo_switch_area(s32 callContext, struct GraphNode *node, UNUSED void *conte // Since no intangible floors are nearby, use Mario's floor instead. floor = gMarioState->floor; } - +#else + floor = gMarioState->floor; +#endif if (floor) { gMarioCurrentRoom = floor->room; roomCase = floor->room - 1; @@ -2458,11 +2461,11 @@ void cur_obj_spawn_star_at_y_offset(f32 targetX, f32 targetY, f32 targetZ, f32 o } // Extra functions for HackerSM64 -void obj_set_model(struct Object *obj, s32 modelID) { +void obj_set_model(struct Object *obj, ModelID16 modelID) { obj->header.gfx.sharedChild = gLoadedGraphNodes[modelID]; } -s32 obj_has_model(struct Object *obj, u16 modelID) { +s32 obj_has_model(struct Object *obj, ModelID16 modelID) { return (obj->header.gfx.sharedChild == gLoadedGraphNodes[modelID]); } diff --git a/src/game/object_helpers.h b/src/game/object_helpers.h index 83bb8dff..ca2a42c4 100644 --- a/src/game/object_helpers.h +++ b/src/game/object_helpers.h @@ -273,8 +273,8 @@ void cur_obj_spawn_loot_blue_coin(void); void cur_obj_spawn_star_at_y_offset(f32 targetX, f32 targetY, f32 targetZ, f32 offsetY); // Extra functions for HackerSM64 -void obj_set_model(struct Object *obj, s32 modelID); -s32 obj_has_model(struct Object *obj, u16 modelID); +void obj_set_model(struct Object *obj, ModelID16 modelID); +s32 obj_has_model(struct Object *obj, ModelID16 modelID); u32 obj_get_model_id(struct Object *obj); // End of HackerSM64 stuff diff --git a/src/game/puppycam2.c b/src/game/puppycam2.c index 638645c6..38e0a6a6 100644 --- a/src/game/puppycam2.c +++ b/src/game/puppycam2.c @@ -486,10 +486,11 @@ void puppycam_init(void) { gPuppyCam.targetObj2 = NULL; gPuppyCam.intendedFlags = PUPPYCAM_BEHAVIOUR_DEFAULT; - +#ifndef DISABLE_LEVEL_SPECIFIC_CHECKS if (gCurrLevelNum == LEVEL_PSS || (gCurrLevelNum == LEVEL_TTM && gCurrAreaIndex == 2) || (gCurrLevelNum == LEVEL_CCM && gCurrAreaIndex == 2)) { gPuppyCam.intendedFlags |= PUPPYCAM_BEHAVIOUR_SLIDE_CORRECTION; } +#endif gPuppyCam.flags = gPuppyCam.intendedFlags; gPuppyCam.zoom = gPuppyCam.zoomPoints[1]; gPuppyCam.zoomSet = 1; From f68c63703eb8ca5c84b1e2a2bcf93568c9e25db5 Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Wed, 29 Sep 2021 12:00:37 -0700 Subject: [PATCH 49/97] Improve debug level select controls --- src/menu/title_screen.c | 85 ++++++++++++++++++++++------------------- 1 file changed, 45 insertions(+), 40 deletions(-) diff --git a/src/menu/title_screen.c b/src/menu/title_screen.c index abe8f743..70827fa2 100644 --- a/src/menu/title_screen.c +++ b/src/menu/title_screen.c @@ -84,63 +84,68 @@ s32 run_level_id_or_demo(s32 level) { #endif #endif + +u8 gLevelSelectHoldKeyIndex = 0; +u8 gLevelSelectHoldKeyTimer = 0; + /** * Level select intro function, updates the selected stage * count if an input was received. signals the stage to be started * or the level select to be exited if start or the quit combo is pressed. */ -s16 intro_level_select(void) { //! this function runs and crashes on save+quit even if level select is disabled - s32 stageChanged = FALSE; - - // perform the ID updates per each button press. - // runs into a loop so after a button is pressed - // stageChanged goes back to FALSE - if (gPlayer1Controller->buttonPressed & A_BUTTON) { - ++gCurrLevelNum, stageChanged = TRUE; +s16 intro_level_select(void) { + u32 index = 0; + if ((gPlayer1Controller->rawStickY < -60) + || (gPlayer1Controller->rawStickX < -60) + || (gPlayer1Controller->buttonDown & (D_CBUTTONS | D_JPAD | L_CBUTTONS | L_JPAD))) index++; + if ((gPlayer1Controller->rawStickY > 60) + || (gPlayer1Controller->rawStickX > 60) + || (gPlayer1Controller->buttonDown & (U_CBUTTONS | U_JPAD | R_CBUTTONS | R_JPAD))) index += 2; + if (((index ^ gLevelSelectHoldKeyIndex) & index) == 2) { + if (gCurrLevelNum > LEVEL_MAX) { + gCurrLevelNum = LEVEL_MIN; + } else if (gPlayer3Controller->buttonDown & B_BUTTON) { + play_sound(SOUND_GENERAL_LEVEL_SELECT_CHANGE, gGlobalSoundSource); + gCurrLevelNum += 10; + } else { + play_sound(SOUND_GENERAL_LEVEL_SELECT_CHANGE, gGlobalSoundSource); + gCurrLevelNum++; + } } - if (gPlayer1Controller->buttonPressed & B_BUTTON) { - --gCurrLevelNum, stageChanged = TRUE; + if (((index ^ gLevelSelectHoldKeyIndex) & index) == 1) { + if (gCurrLevelNum < LEVEL_MIN) { + // Same applies to here as above + gCurrLevelNum = LEVEL_MAX; + } else if (gPlayer3Controller->buttonDown & B_BUTTON) { + play_sound(SOUND_GENERAL_LEVEL_SELECT_CHANGE, gGlobalSoundSource); + gCurrLevelNum -= 10; + } else { + play_sound(SOUND_GENERAL_LEVEL_SELECT_CHANGE, gGlobalSoundSource); + gCurrLevelNum--; + } } - if (gPlayer1Controller->buttonPressed & U_JPAD) { - --gCurrLevelNum, stageChanged = TRUE; + if (gLevelSelectHoldKeyTimer == 10) { + gLevelSelectHoldKeyTimer = 8; + gLevelSelectHoldKeyIndex = 0; + } else { + gLevelSelectHoldKeyTimer++; + gLevelSelectHoldKeyIndex = index; } - if (gPlayer1Controller->buttonPressed & D_JPAD) { - ++gCurrLevelNum, stageChanged = TRUE; - } - if (gPlayer1Controller->buttonPressed & L_JPAD) { - gCurrLevelNum -= 10, stageChanged = TRUE; - } - if (gPlayer1Controller->buttonPressed & R_JPAD) { - gCurrLevelNum += 10, stageChanged = TRUE; - } - - // if the stage was changed, play the sound for changing a stage. - if (stageChanged) { - play_sound(SOUND_GENERAL_LEVEL_SELECT_CHANGE, gGlobalSoundSource); - } - - if (gCurrLevelNum > LEVEL_MAX) { - gCurrLevelNum = LEVEL_MIN; // exceeded max. set to min. - } - - if (gCurrLevelNum < LEVEL_MIN) { - gCurrLevelNum = LEVEL_MAX; // exceeded min. set to max. - } - + if ((index & 0x3) == 0) gLevelSelectHoldKeyTimer = 0; + if (gCurrLevelNum > LEVEL_MAX) gCurrLevelNum = LEVEL_MIN; // exceeded max. set to min. + if (gCurrLevelNum < LEVEL_MIN) gCurrLevelNum = LEVEL_MAX; // exceeded min. set to max. // Use file 4 and last act as a test gCurrSaveFileNum = 4; - gCurrActNum = 6; - + gCurrActNum = 6; print_text_centered(160, 80, "SELECT STAGE"); print_text_centered(160, 30, "PRESS START BUTTON"); print_text_fmt_int(40, 60, "%2d", gCurrLevelNum); print_text(80, 60, sLevelSelectStageNames[gCurrLevelNum - 1]); // print stage name - // start being pressed signals the stage to be started. that is, unless... - if (gPlayer1Controller->buttonPressed & START_BUTTON) { + if (gPlayer1Controller->buttonPressed & (START_BUTTON | A_BUTTON)) { // ... the level select quit combo is being pressed, which uses START. If this // is the case, quit the menu instead. - if (gPlayer1Controller->buttonDown == (Z_TRIG | START_BUTTON | L_CBUTTONS | R_CBUTTONS)) { + if (gPlayer1Controller->buttonDown == (Z_TRIG | START_BUTTON | L_CBUTTONS)) { // quit level select gDebugLevelSelect = FALSE; return LEVEL_RESTART_GAME; } From 9b4b9d9c032a79a38f2d3ac4a923baba1c77f09d Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Wed, 29 Sep 2021 12:35:46 -0700 Subject: [PATCH 50/97] Add ENABLE_DEBUG_FREE_MOVE + improve debug free move controls --- include/config.h | 2 ++ src/game/camera.c | 19 ++++++---- src/game/mario.c | 7 +++- src/game/mario_actions_airborne.c | 4 +-- src/game/mario_actions_cutscene.c | 59 ++++++++++++++----------------- 5 files changed, 47 insertions(+), 44 deletions(-) diff --git a/include/config.h b/include/config.h index 88106dc8..99adb2e6 100644 --- a/include/config.h +++ b/include/config.h @@ -192,6 +192,8 @@ //#define TEST_LEVEL LEVEL_BOB // Enable debug level select //#define DEBUG_LEVEL_SELECT +// Enable debug free move (DPad up to enter, A to exit) +//#define ENABLE_DEBUG_FREE_MOVE // Custom debug mode. Press DPAD left to show the debug UI. Press DPAD right to enter the noclip mode. //#define CUSTOM_DEBUG // Include Puppyprint, a display library for text and large images. Also includes a custom, enhanced performance profiler. diff --git a/src/game/camera.c b/src/game/camera.c index 0c91c8e7..5021c5d4 100644 --- a/src/game/camera.c +++ b/src/game/camera.c @@ -2681,6 +2681,9 @@ void set_camera_mode(struct Camera *c, s16 mode, s16 frames) { sLakituDist = 0; sLakituPitch = 0; sAreaYawChange = 0; +// #ifdef CAMERA_FIX +// if ((sMarioCamState->action & ACT_GROUP_MASK) != ACT_GROUP_SUBMERGED) mode = CAMERA_MODE_8_DIRECTIONS; +// #endif sModeInfo.newMode = (mode != -1) ? mode : sModeInfo.lastMode; sModeInfo.lastMode = c->mode; @@ -4932,8 +4935,11 @@ void set_fixed_cam_axis_sa_lobby(UNUSED s16 preset) { * Only block area mode changes if Mario is in a cannon, * or if the camera is in Mario mode and Mario is not swimming or in water with the metal cap */ -void check_blocking_area_processing(const u8 *mode) { - if (sMarioCamState->action & ACT_FLAG_METAL_WATER || +void check_blocking_area_processing(UNUSED const u8 *mode) { +#ifdef CAMERA_FIX + sStatusFlags |= CAM_FLAG_BLOCK_AREA_PROCESSING; +#else + if ((sMarioCamState->action & ACT_FLAG_METAL_WATER) || (sMarioCamState->action == ACT_DEBUG_FREE_MOVE) || *mode == CAMERA_MODE_BEHIND_MARIO || *mode == CAMERA_MODE_WATER_SURFACE) { sStatusFlags |= CAM_FLAG_BLOCK_AREA_PROCESSING; } @@ -4947,6 +4953,7 @@ void check_blocking_area_processing(const u8 *mode) { *mode == CAMERA_MODE_INSIDE_CANNON) { sStatusFlags |= CAM_FLAG_BLOCK_AREA_PROCESSING; } +#endif } void cam_rr_exit_building_side(struct Camera *c) { @@ -5809,7 +5816,6 @@ struct CutsceneSplinePoint sEndingLookAtSkyFocus[] = { */ s16 camera_course_processing(struct Camera *c) { s16 level = gCurrLevelNum; - s16 mode; s8 area = gCurrentArea->index; // Bounds iterator u32 b; @@ -5866,7 +5872,7 @@ s16 camera_course_processing(struct Camera *c) { b++; } } - +#if !defined(CAMERA_FIX) && !defined(DISABLE_LEVEL_SPECIFIC_CHECKS) // Area-specific camera processing if (!(sStatusFlags & CAM_FLAG_BLOCK_AREA_PROCESSING)) { switch (gCurrLevelArea) { @@ -5968,14 +5974,13 @@ s16 camera_course_processing(struct Camera *c) { break; } } - +#endif sStatusFlags &= ~CAM_FLAG_BLOCK_AREA_PROCESSING; if (oldMode == CAMERA_MODE_C_UP) { sModeInfo.lastMode = c->mode; c->mode = oldMode; } - mode = c->mode; - return mode; + return c->mode; } /** diff --git a/src/game/mario.c b/src/game/mario.c index 3c4727ee..7ea43b67 100644 --- a/src/game/mario.c +++ b/src/game/mario.c @@ -1709,6 +1709,12 @@ s32 execute_mario_action(struct MarioState *m) { vec3f_get_dist_and_lateral_dist_and_angle(m->prevPos, m->pos, &m->moveSpeed, &m->lateralSpeed, &m->movePitch, &m->moveYaw); vec3_copy(m->prevPos, m->pos); if (m->action) { +#ifdef ENABLE_DEBUG_FREE_MOVE + if (gPlayer1Controller->buttonDown & U_JPAD) { + set_camera_mode(m->area->camera, CAMERA_MODE_8_DIRECTIONS, 1); + set_mario_action(m, ACT_DEBUG_FREE_MOVE, 0); + } +#endif m->marioObj->header.gfx.node.flags &= ~GRAPH_RENDER_INVISIBLE; mario_reset_bodystate(m); update_mario_inputs(m); @@ -1722,7 +1728,6 @@ s32 execute_mario_action(struct MarioState *m) { if (m->floor == NULL) { return ACTIVE_PARTICLE_NONE; } - // The function can loop through many action shifts in one frame, // which can lead to unexpected sub-frame behavior. Could potentially hang // if a loop of actions were found, but there has not been a situation found. diff --git a/src/game/mario_actions_airborne.c b/src/game/mario_actions_airborne.c index 897b4480..aa574dbd 100644 --- a/src/game/mario_actions_airborne.c +++ b/src/game/mario_actions_airborne.c @@ -373,11 +373,9 @@ void update_flying(struct MarioState *m) { } u32 common_air_action_step(struct MarioState *m, u32 landAction, s32 animation, u32 stepArg) { - u32 stepResult; - update_air_without_turn(m); - stepResult = perform_air_step(m, stepArg); + u32 stepResult = perform_air_step(m, stepArg); switch (stepResult) { case AIR_STEP_NONE: set_mario_animation(m, animation); diff --git a/src/game/mario_actions_cutscene.c b/src/game/mario_actions_cutscene.c index 31e2c793..027a198d 100644 --- a/src/game/mario_actions_cutscene.c +++ b/src/game/mario_actions_cutscene.c @@ -524,56 +524,49 @@ s32 act_reading_sign(struct MarioState *m) { s32 act_debug_free_move(struct MarioState *m) { struct WallCollisionData wallData; - struct Surface *surf; - f32 floorHeight; + struct Surface *floor, *ceil; Vec3f pos; - f32 speed; - u32 action; - - // integer immediates, generates convert instructions for some reason - speed = gPlayer1Controller->buttonDown & B_BUTTON ? 4 : 1; - if (gPlayer1Controller->buttonDown & L_TRIG) { - speed = 0.01f; - } - + f32 speed = ((gPlayer1Controller->buttonDown & B_BUTTON) ? 4.0f : 1.0f); + if (gPlayer1Controller->buttonDown & L_TRIG) speed = 0.01f; + if (m->area->camera->mode != CAMERA_MODE_8_DIRECTIONS) set_camera_mode(m->area->camera, CAMERA_MODE_8_DIRECTIONS, 1); set_mario_animation(m, MARIO_ANIM_A_POSE); vec3f_copy(pos, m->pos); - if (gPlayer1Controller->buttonDown & U_JPAD) { pos[1] += 16.0f * speed; + } else if (gPlayer1Controller->buttonPressed == A_BUTTON) { + m->vel[1] = 0.0f; + set_camera_mode(m->area->camera, m->area->camera->defMode, 1); + m->input &= ~INPUT_A_PRESSED; + if (m->pos[1] <= (m->waterLevel - 100)) { + return set_mario_action(m, ACT_WATER_IDLE, 0); + } else if (m->pos[1] <= m->floorHeight) { + return set_mario_action(m, ACT_IDLE, 0); + } else { + gPlayer1Controller->buttonDown &= ~U_JPAD; + return set_mario_action(m, ACT_FREEFALL, 0); + } } if (gPlayer1Controller->buttonDown & D_JPAD) { pos[1] -= 16.0f * speed; } - if (m->intendedMag > 0) { - pos[0] += 32.0f * speed * sins(m->intendedYaw); - pos[2] += 32.0f * speed * coss(m->intendedYaw); + pos[0] += (2.0f * speed * sins(m->intendedYaw) * m->intendedMag); + pos[2] += (2.0f * speed * coss(m->intendedYaw) * m->intendedMag); } - resolve_and_return_wall_collisions(pos, 60.0f, 50.0f, &wallData); - - floorHeight = find_floor(pos[0], pos[1], pos[2], &surf); - if (surf != NULL) { - if (pos[1] < floorHeight) { - pos[1] = floorHeight; - } - vec3f_copy(m->pos, pos); + set_mario_wall(m, ((wallData.numWalls > 0) ? wallData.walls[0] : NULL)); + f32 floorHeight = find_floor(pos[0], pos[1], pos[2], &floor); + f32 ceilHeight = find_ceil( pos[0], pos[1], pos[2], &ceil); + if (floor == NULL) return FALSE; + if ((ceilHeight - floorHeight) >= 160.0f) { + if ((floor != NULL) && ( pos[1] < floorHeight)) pos[1] = floorHeight; + if (( ceil != NULL) && ((pos[1] + 160.0f) > ceilHeight)) pos[1] = (ceilHeight - 160.0f); + vec3_copy(m->pos, pos); } - m->faceAngle[1] = m->intendedYaw; vec3f_copy(m->marioObj->header.gfx.pos, m->pos); vec3s_set(m->marioObj->header.gfx.angle, 0, m->faceAngle[1], 0); - if (gPlayer1Controller->buttonPressed == A_BUTTON) { - if (m->pos[1] <= m->waterLevel - 100) { - action = ACT_WATER_IDLE; - } else { - action = ACT_IDLE; - } - set_mario_action(m, action, 0); - } - return FALSE; } From a8afa914cd0093033457e081ad4f4ba69c360f30 Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Wed, 29 Sep 2021 12:59:49 -0700 Subject: [PATCH 51/97] some surface_terrains.h defines --- include/surface_terrains.h | 23 +++++++++++++++++------ src/engine/surface_collision.c | 6 +++--- src/engine/surface_load.c | 2 +- src/game/mario_step.c | 2 +- 4 files changed, 22 insertions(+), 11 deletions(-) diff --git a/include/surface_terrains.h b/include/surface_terrains.h index 6a13429b..24ab18dd 100644 --- a/include/surface_terrains.h +++ b/include/surface_terrains.h @@ -154,18 +154,29 @@ #define SURFACE_WOBBLING_WARP 0x00FD // Pool warp (HMC & DDD) #define SURFACE_TRAPDOOR 0x00FF // Bowser Left trapdoor, has no action defined -#define SURFACE_IS_QUICKSAND(cmd) (cmd >= 0x21 && cmd < 0x28) // Doesn't include SURFACE_INSTANT_MOVING_QUICKSAND -#define SURFACE_IS_NOT_HARD(cmd) (cmd != SURFACE_HARD && \ - !(cmd >= 0x35 && cmd <= 0x37)) -#define SURFACE_IS_PAINTING_WARP(cmd) (cmd >= 0xD3 && cmd < 0xFD) +#define SURFACE_IS_NEW_WATER(cmd) (cmd == SURFACE_NEW_WATER || cmd == SURFACE_NEW_WATER_BOTTOM) +#define SURFACE_IS_QUICKSAND(cmd) (cmd >= SURFACE_SHALLOW_QUICKSAND && cmd <= SURFACE_MOVING_QUICKSAND || cmd == SURFACE_INSTANT_MOVING_QUICKSAND) +#define SURFACE_IS_NOT_HARD(cmd) (cmd != SURFACE_HARD && !(cmd >= SURFACE_HARD_SLIPPERY && cmd <= SURFACE_HARD_NOT_SLIPPERY)) +#define SURFACE_IS_PAINTING_WOBBLE(cmd) (cmd >= SURFACE_PAINTING_WOBBLE_A6 && cmd <= SURFACE_PAINTING_WOBBLE_D2) +#define SURFACE_IS_PAINTING_WOBBLE_LEFT(cmd) (((cmd - SURFACE_PAINTING_WOBBLE_A6) % 3) == 0) +#define SURFACE_IS_PAINTING_WOBBLE_MIDDLE(cmd) (((cmd - SURFACE_PAINTING_WOBBLE_A7) % 3) == 0) +#define SURFACE_IS_PAINTING_WOBBLE_RIGHT(cmd) (((cmd - SURFACE_PAINTING_WOBBLE_A8) % 3) == 0) +#define SURFACE_IS_PAINTING_WARP(cmd) (cmd >= SURFACE_PAINTING_WARP_D3 && cmd < SURFACE_WOBBLING_WARP) // skips SURFACE_WOBBLING_WARP +#define SURFACE_IS_PAINTING_WARP_LEFT(cmd) (((cmd - SURFACE_PAINTING_WARP_D3 ) % 3) == 0) +#define SURFACE_IS_PAINTING_WARP_MIDDLE(cmd) (((cmd - SURFACE_PAINTING_WARP_D4 ) % 3) == 0) +#define SURFACE_IS_PAINTING_WARP_RIGHT(cmd) (((cmd - SURFACE_PAINTING_WARP_D5 ) % 3) == 0) +#define SURFACE_IS_INSTANT_WARP(cmd) (cmd >= SURFACE_INSTANT_WARP_1B && cmd <= SURFACE_INSTANT_WARP_1E) +#define SURFACE_IS_WARP(cmd) (SURFACE_IS_PAINTING_WARP(cmd) || SURFACE_IS_INSTANT_WARP(cmd) || cmd == SURFACE_LOOK_UP_WARP || cmd == SURFACE_WOBBLING_WARP) +#define SURFACE_IS_UNSAFE(cmd) (SURFACE_IS_QUICKSAND(cmd)|| cmd == SURFACE_BURNING) #define SURFACE_CLASS_DEFAULT 0x0000 #define SURFACE_CLASS_VERY_SLIPPERY 0x0013 #define SURFACE_CLASS_SLIPPERY 0x0014 #define SURFACE_CLASS_NOT_SLIPPERY 0x0015 -#define SURFACE_FLAG_DYNAMIC (1 << 0) -#define SURFACE_FLAG_NO_CAM_COLLISION (1 << 1) +#define SURFACE_FLAGS_NONE (0 << 0) // 0x0000 +#define SURFACE_FLAG_DYNAMIC (1 << 0) // 0x0001 +#define SURFACE_FLAG_NO_CAM_COLLISION (1 << 1) // 0x0002 // These are effectively unique "surface" types like those defined higher // And they are used as collision commands to load certain functions diff --git a/src/engine/surface_collision.c b/src/engine/surface_collision.c index fb4c7808..791b61e3 100644 --- a/src/engine/surface_collision.c +++ b/src/engine/surface_collision.c @@ -55,7 +55,7 @@ static s32 find_wall_collisions_from_list(struct SurfaceNode *surfaceNode, struc surfaceNode = surfaceNode->next; type = surf->type; // Exclude a large number of walls immediately to optimize. - if ((type == SURFACE_NEW_WATER) || (type == SURFACE_NEW_WATER_BOTTOM)) continue; + if (SURFACE_IS_NEW_WATER(type)) continue; // Determine if checking for the camera or not. if (gCheckingSurfaceCollisionsForCamera) { if (surf->flags & SURFACE_FLAG_NO_CAM_COLLISION) continue; @@ -227,7 +227,7 @@ static struct Surface *find_ceil_from_list(struct SurfaceNode *surfaceNode, s32 surfaceNode = surfaceNode->next; type = surf->type; // Determine if checking for the camera or not. - if (type == SURFACE_NEW_WATER || type == SURFACE_NEW_WATER_BOTTOM) continue; + if (SURFACE_IS_NEW_WATER(type)) continue; if (gCheckingSurfaceCollisionsForCamera) { if (surf->flags & SURFACE_FLAG_NO_CAM_COLLISION) continue; } else if (type == SURFACE_CAMERA_BOUNDARY) { @@ -345,7 +345,7 @@ static struct Surface *find_floor_from_list(struct SurfaceNode *surfaceNode, s32 if (!gFindFloorIncludeSurfaceIntangible && (type == SURFACE_INTANGIBLE)) continue; // Determine if we are checking for the camera or not. if (gCheckingSurfaceCollisionsForCamera) { - if ((surf->flags & SURFACE_FLAG_NO_CAM_COLLISION) || (surf->type == SURFACE_NEW_WATER) || (surf->type == SURFACE_NEW_WATER_BOTTOM)) continue; + if ((surf->flags & SURFACE_FLAG_NO_CAM_COLLISION) || SURFACE_IS_NEW_WATER(type)) continue; } else if (surf->type == SURFACE_CAMERA_BOUNDARY) { continue; // If we are not checking for the camera, ignore camera only floors. } diff --git a/src/engine/surface_load.c b/src/engine/surface_load.c index db8a3d4e..d96e2004 100644 --- a/src/engine/surface_load.c +++ b/src/engine/surface_load.c @@ -114,7 +114,7 @@ static void add_surface_to_cell(s32 dynamic, s32 cellX, s32 cellZ, struct Surfac s32 priority; s32 sortDir; s32 listIndex; - s32 isWater = surface->type == SURFACE_NEW_WATER || surface->type == SURFACE_NEW_WATER_BOTTOM; + s32 isWater = SURFACE_IS_NEW_WATER(surface->type); if (surface->normal.y > 0.01) { listIndex = isWater ? SPATIAL_PARTITION_WATER : SPATIAL_PARTITION_FLOORS; diff --git a/src/game/mario_step.c b/src/game/mario_step.c index 6315a197..ef4618e3 100644 --- a/src/game/mario_step.c +++ b/src/game/mario_step.c @@ -301,7 +301,7 @@ static s32 perform_ground_quarter_step(struct MarioState *m, Vec3f nextPos) { } vec3f_set(m->pos, nextPos[0], floorHeight, nextPos[2]); - if (!SURFACE_IS_QUICKSAND(floor->type) && (floor->type != SURFACE_BURNING)) vec3_copy(m->lastSafePos, m->pos); + if (!SURFACE_IS_UNSAFE(floor->type)) vec3_copy(m->lastSafePos, m->pos); set_mario_floor(m, floor, floorHeight); if (m->wall != NULL) { From 3bfb394b70561ba7682f16d15c55b787f77a1ca9 Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Wed, 29 Sep 2021 13:28:49 -0700 Subject: [PATCH 52/97] Fix compiler warnings --- include/surface_terrains.h | 2 +- src/engine/surface_load.h | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/include/surface_terrains.h b/include/surface_terrains.h index 24ab18dd..cc71af11 100644 --- a/include/surface_terrains.h +++ b/include/surface_terrains.h @@ -155,7 +155,7 @@ #define SURFACE_TRAPDOOR 0x00FF // Bowser Left trapdoor, has no action defined #define SURFACE_IS_NEW_WATER(cmd) (cmd == SURFACE_NEW_WATER || cmd == SURFACE_NEW_WATER_BOTTOM) -#define SURFACE_IS_QUICKSAND(cmd) (cmd >= SURFACE_SHALLOW_QUICKSAND && cmd <= SURFACE_MOVING_QUICKSAND || cmd == SURFACE_INSTANT_MOVING_QUICKSAND) +#define SURFACE_IS_QUICKSAND(cmd) ((cmd >= SURFACE_SHALLOW_QUICKSAND && cmd <= SURFACE_MOVING_QUICKSAND) || cmd == SURFACE_INSTANT_MOVING_QUICKSAND) #define SURFACE_IS_NOT_HARD(cmd) (cmd != SURFACE_HARD && !(cmd >= SURFACE_HARD_SLIPPERY && cmd <= SURFACE_HARD_NOT_SLIPPERY)) #define SURFACE_IS_PAINTING_WOBBLE(cmd) (cmd >= SURFACE_PAINTING_WOBBLE_A6 && cmd <= SURFACE_PAINTING_WOBBLE_D2) #define SURFACE_IS_PAINTING_WOBBLE_LEFT(cmd) (((cmd - SURFACE_PAINTING_WOBBLE_A6) % 3) == 0) diff --git a/src/engine/surface_load.h b/src/engine/surface_load.h index 0f8fea57..7cffe2e4 100644 --- a/src/engine/surface_load.h +++ b/src/engine/surface_load.h @@ -8,7 +8,6 @@ extern u8 gSurfacePoolError; -#define NUM_CELLS (2 * LEVEL_BOUNDARY_MAX / CELL_SIZE) #define NUM_CELLS_INDEX (NUM_CELLS - 1) struct SurfaceNode From 50d180134f978a9094ecafbf1180d1ee6b891128 Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Wed, 29 Sep 2021 15:18:28 -0700 Subject: [PATCH 53/97] ok --- src/game/camera.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/game/camera.c b/src/game/camera.c index 5021c5d4..ec1c4046 100644 --- a/src/game/camera.c +++ b/src/game/camera.c @@ -4935,10 +4935,11 @@ void set_fixed_cam_axis_sa_lobby(UNUSED s16 preset) { * Only block area mode changes if Mario is in a cannon, * or if the camera is in Mario mode and Mario is not swimming or in water with the metal cap */ -void check_blocking_area_processing(UNUSED const u8 *mode) { #ifdef CAMERA_FIX +void check_blocking_area_processing(UNUSED const UNUSED u8 *mode) { sStatusFlags |= CAM_FLAG_BLOCK_AREA_PROCESSING; #else +void check_blocking_area_processing(UNUSED const u8 *mode) { if ((sMarioCamState->action & ACT_FLAG_METAL_WATER) || (sMarioCamState->action == ACT_DEBUG_FREE_MOVE) || *mode == CAMERA_MODE_BEHIND_MARIO || *mode == CAMERA_MODE_WATER_SURFACE) { sStatusFlags |= CAM_FLAG_BLOCK_AREA_PROCESSING; From 824056390fbb92f450e0380a067bf66c8e228711 Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Wed, 29 Sep 2021 16:22:34 -0700 Subject: [PATCH 54/97] Lowercase abs and signum_positive defines --- src/engine/math_util.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/engine/math_util.h b/src/engine/math_util.h index 5b58fee9..af6b7282 100644 --- a/src/engine/math_util.h +++ b/src/engine/math_util.h @@ -58,6 +58,11 @@ extern f32 gSineTable[]; #define ABSF(x) ((x) > 0.0f ? (x) : -(x)) #define ABSI(x) ((x) > 0 ? (x) : -(x)) #define ABS(x) ABSF((x)) +#define absf(x) ABSF((x)) +#define absi(x) ABSI((x)) +#define abs(x) ABS((x)) + +#define signum_positive(x) ((x < 0) ? -1 : 1) #define min(a, b) MIN((a), (b)) // ((a) < (b) ? (a) : (b)) #define max(a, b) MAX((a), (b)) // ((a) > (b) ? (a) : (b)) From ef4ffdc71f62c5e563f5d19477d7a8f6ee81f067 Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Wed, 29 Sep 2021 16:32:23 -0700 Subject: [PATCH 55/97] #define floorAngle floorYaw for compatibility --- include/types.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/types.h b/include/types.h index 13e5c298..44a54b41 100644 --- a/include/types.h +++ b/include/types.h @@ -427,6 +427,7 @@ struct MarioState /*0x6C*/ f32 ceilHeight; /*0x70*/ f32 floorHeight; /*0x74*/ s16 floorYaw; + #define floorAngle floorYaw /*0x76*/ s16 waterLevel; /*0x78*/ struct Object *interactObj; /*0x7C*/ struct Object *heldObj; From d1ed598480b4a03033a46f9bd46ed998c1ab3172 Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Wed, 29 Sep 2021 16:37:20 -0700 Subject: [PATCH 56/97] Whoops, lowercase absf already exists --- src/engine/math_util.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/engine/math_util.h b/src/engine/math_util.h index af6b7282..c43ea5ce 100644 --- a/src/engine/math_util.h +++ b/src/engine/math_util.h @@ -58,7 +58,7 @@ extern f32 gSineTable[]; #define ABSF(x) ((x) > 0.0f ? (x) : -(x)) #define ABSI(x) ((x) > 0 ? (x) : -(x)) #define ABS(x) ABSF((x)) -#define absf(x) ABSF((x)) +// #define absf(x) ABSF((x)) #define absi(x) ABSI((x)) #define abs(x) ABS((x)) From 4fe6b323e70b67bb361d3c5908b395b5f9aca7d6 Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Wed, 29 Sep 2021 16:38:36 -0700 Subject: [PATCH 57/97] Automatically calculate SURFACE_POOL_SIZE and SURFACE_NODE_POOL_SIZE --- src/engine/extended_bounds.h | 64 ++++++++++++++-------------------- src/engine/surface_collision.c | 41 +++++++++++----------- src/engine/surface_load.c | 21 ++++++----- src/engine/surface_load.h | 2 -- src/game/debug_box.c | 8 ++--- 5 files changed, 62 insertions(+), 74 deletions(-) diff --git a/src/engine/extended_bounds.h b/src/engine/extended_bounds.h index 591a183e..14897859 100644 --- a/src/engine/extended_bounds.h +++ b/src/engine/extended_bounds.h @@ -22,59 +22,49 @@ Collision calculations remain as fast as vanilla, at the cost of using far more RAM (16 times vanilla). 64x64 collision cells. - If you see "SURFACE POOL FULL" or "SURFACE NODE POOL FULL" in game, you should increase SURFACE_POOL_SIZE or SURFACE_NODE_POOL_SIZE, respectively, or reduce the amount of collision surfaces in your level. */ -//for the static assert macro +// For the static assert macro #include "macros.h" -//set this to the extended bounds mode you want, then do "make clean". +// Set this to the extended bounds mode you want, then do "make clean". #define EXTENDED_BOUNDS_MODE 1 -//the maximum amount of collision surfaces (static and dynamic combined) -//8200 should work fine for a 2x extended stage, the vanilla value is 2300 -#define SURFACE_POOL_SIZE 4000 +// Don't touch the stuff past this point unless you know what you're doing! -//make this approximately (amount of collision cells) + (SURFACE_POOL_SIZE * 3) -//22000 should work fine for a 2x extended stage, the vanilla value is 7000 -#define SURFACE_NODE_POOL_SIZE 12000 - - - - - -//don't touch the stuff past this point unless you know what you're doing! - -//default value to check if the user set a proper extended bounds mode -#define LEVEL_BOUNDARY_MAX 0x0000 - -#if EXTENDED_BOUNDS_MODE == 0 - #undef LEVEL_BOUNDARY_MAX // Undefine the old value to avoid compiler warnings - #define LEVEL_BOUNDARY_MAX 0x2000L - #define CELL_SIZE 0x400 -#elif EXTENDED_BOUNDS_MODE == 1 - #undef LEVEL_BOUNDARY_MAX - #define LEVEL_BOUNDARY_MAX 0x4000L - #define CELL_SIZE 0x400 -#elif EXTENDED_BOUNDS_MODE == 2 - #undef LEVEL_BOUNDARY_MAX - #define LEVEL_BOUNDARY_MAX 0x2000L - #define CELL_SIZE 0x200 -#elif EXTENDED_BOUNDS_MODE == 3 - #undef LEVEL_BOUNDARY_MAX - #define LEVEL_BOUNDARY_MAX 0x8000L - #define CELL_SIZE 0x400 +#if EXTENDED_BOUNDS_MODE == 0 // 1x, normal cell size + #define LEVEL_BOUNDARY_MAX 0x2000L // 8192 + #define CELL_SIZE 0x400 // 1024, NUM_CELLS = 16 +#elif EXTENDED_BOUNDS_MODE == 1 // 2x, normal cell size + #define LEVEL_BOUNDARY_MAX 0x4000L // 16384 + #define CELL_SIZE 0x400 // 1024, NUM_CELLS = 32 +#elif EXTENDED_BOUNDS_MODE == 2 // 1x, smaller cell size + #define LEVEL_BOUNDARY_MAX 0x2000L // 8192 + #define CELL_SIZE 0x200 // 512, NUM_CELLS = 32 +#elif EXTENDED_BOUNDS_MODE == 3 // 4x, normal cell size + #define LEVEL_BOUNDARY_MAX 0x8000L // 32768 + #define CELL_SIZE 0x400 // 1024, NUM_CELLS = 64 #endif -STATIC_ASSERT(LEVEL_BOUNDARY_MAX != 0, "You must set a valid extended bounds mode!"); +STATIC_ASSERT((EXTENDED_BOUNDS_MODE >= 0 && EXTENDED_BOUNDS_MODE <= 3), "You must set a valid extended bounds mode!"); -#define NUM_CELLS (2 * LEVEL_BOUNDARY_MAX / CELL_SIZE) +// The amount of cells in each axis in an area. +#define NUM_CELLS (2 * LEVEL_BOUNDARY_MAX / CELL_SIZE) +// The maximum amount of collision surfaces (static and dynamic combined) +#define SURFACE_POOL_SIZE (LEVEL_BOUNDARY_MAX / 2) // Vanilla: 2300. Modes: 0: 4096, 1: 8192, 2: 8192, 3: 16384 +// How many SurfaceNodes can fit in Surface. This is done so that the maximum sizes for both can contain the same amount. +#define SURFACE_NODE_STRUCT_DIFF 3.5 // = (56 / 16) = (sizeof(struct Surface) / sizeof(struct SurfaceNode)) +// The maximum amount of SurfaceNodes (static and dynamic combined) +#define SURFACE_NODE_POOL_SIZE (s32)(SURFACE_POOL_SIZE * SURFACE_NODE_STRUCT_DIFF) // Vanilla: 7000. Modes: 0: 14336, 1: 28672, 2: 28672, 3: 57344 +// Flags for error messages #define NOT_ENOUGH_ROOM_FOR_SURFACES (1 << 0) #define NOT_ENOUGH_ROOM_FOR_NODES (1 << 1) +// Use this to convert game units to cell coordinates +#define GET_CELL_COORD(p) ((((p) + LEVEL_BOUNDARY_MAX) / CELL_SIZE) & (NUM_CELLS - 1)); #endif // __EXTENDED_BOUNDS_H__ diff --git a/src/engine/surface_collision.c b/src/engine/surface_collision.c index 791b61e3..c86a39cb 100644 --- a/src/engine/surface_collision.c +++ b/src/engine/surface_collision.c @@ -158,10 +158,9 @@ s32 find_wall_collisions(struct WallCollisionData *colData) { return numCollisions; } - // World (level) consists of a 16x16 grid. Find where the collision is on - // the grid (round toward -inf) - cellX = ((x + LEVEL_BOUNDARY_MAX) / CELL_SIZE) & NUM_CELLS_INDEX; - cellZ = ((z + LEVEL_BOUNDARY_MAX) / CELL_SIZE) & NUM_CELLS_INDEX; + // World (level) consists of a 16x16 grid. Find where the collision is on the grid (round toward -inf) + cellX = GET_CELL_COORD(x); + cellZ = GET_CELL_COORD(z); // Check for surfaces belonging to objects. node = gDynamicSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_WALLS].next; @@ -285,8 +284,8 @@ f32 find_ceil(f32 posX, f32 posY, f32 posZ, struct Surface **pceil) { } // Each level is split into cells to limit load, find the appropriate cell. - cellX = ((x + LEVEL_BOUNDARY_MAX) / CELL_SIZE) & NUM_CELLS_INDEX; - cellZ = ((z + LEVEL_BOUNDARY_MAX) / CELL_SIZE) & NUM_CELLS_INDEX; + cellX = GET_CELL_COORD(x); + cellZ = GET_CELL_COORD(z); // Check for surfaces belonging to objects. surfaceList = gDynamicSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_CEILS].next; @@ -458,8 +457,8 @@ f32 unused_find_dynamic_floor(f32 xPos, f32 yPos, f32 zPos, struct Surface **pfl s32 z = zPos; // Each level is split into cells to limit load, find the appropriate cell. - s32 cellX = ((x + LEVEL_BOUNDARY_MAX) / CELL_SIZE) & NUM_CELLS_INDEX; - s32 cellZ = ((z + LEVEL_BOUNDARY_MAX) / CELL_SIZE) & NUM_CELLS_INDEX; + s32 cellX = GET_CELL_COORD(x); + s32 cellZ = GET_CELL_COORD(z); surfaceList = gDynamicSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_FLOORS].next; floor = find_floor_from_list(surfaceList, x, y, z, &floorHeight); @@ -500,8 +499,8 @@ f32 find_floor(f32 xPos, f32 yPos, f32 zPos, struct Surface **pfloor) { return height; } // Each level is split into cells to limit load, find the appropriate cell. - cellX = ((x + LEVEL_BOUNDARY_MAX) / CELL_SIZE) & NUM_CELLS_INDEX; - cellZ = ((z + LEVEL_BOUNDARY_MAX) / CELL_SIZE) & NUM_CELLS_INDEX; + cellX = GET_CELL_COORD(x); + cellZ = GET_CELL_COORD(z); // Check for surfaces that are a part of level geometry. surfaceList = gStaticSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_FLOORS].next; floor = find_floor_from_list(surfaceList, x, y, z, &height); @@ -556,8 +555,8 @@ f32 find_water_floor(s32 xPos, s32 yPos, s32 zPos, struct Surface **pfloor) { if (is_outside_level_bounds(x, z)) return height; // Each level is split into cells to limit load, find the appropriate cell. - cellX = ((x + LEVEL_BOUNDARY_MAX) / CELL_SIZE) & NUM_CELLS_INDEX; - cellZ = ((z + LEVEL_BOUNDARY_MAX) / CELL_SIZE) & NUM_CELLS_INDEX; + cellX = GET_CELL_COORD(x); + cellZ = GET_CELL_COORD(z); // Check for surfaces that are a part of level geometry. surfaceList = gStaticSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_WATER].next; @@ -741,26 +740,28 @@ void debug_surface_list_info(f32 xPos, f32 zPos) { s32 numFloors = 0; s32 numWalls = 0; s32 numCeils = 0; + s32 x = xPos; + s32 z = zPos; - s32 cellX = (xPos + LEVEL_BOUNDARY_MAX) / CELL_SIZE; - s32 cellZ = (zPos + LEVEL_BOUNDARY_MAX) / CELL_SIZE; + s32 cellX = GET_CELL_COORD(x); + s32 cellZ = GET_CELL_COORD(z); - list = gStaticSurfacePartition[cellZ & NUM_CELLS_INDEX][cellX & NUM_CELLS_INDEX][SPATIAL_PARTITION_FLOORS].next; + list = gStaticSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_FLOORS].next; numFloors += surface_list_length(list); - list = gDynamicSurfacePartition[cellZ & NUM_CELLS_INDEX][cellX & NUM_CELLS_INDEX][SPATIAL_PARTITION_FLOORS].next; + list = gDynamicSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_FLOORS].next; numFloors += surface_list_length(list); - list = gStaticSurfacePartition[cellZ & NUM_CELLS_INDEX][cellX & NUM_CELLS_INDEX][SPATIAL_PARTITION_WALLS].next; + list = gStaticSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_WALLS].next; numWalls += surface_list_length(list); - list = gDynamicSurfacePartition[cellZ & NUM_CELLS_INDEX][cellX & NUM_CELLS_INDEX][SPATIAL_PARTITION_WALLS].next; + list = gDynamicSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_WALLS].next; numWalls += surface_list_length(list); - list = gStaticSurfacePartition[cellZ & NUM_CELLS_INDEX][cellX & NUM_CELLS_INDEX][SPATIAL_PARTITION_CEILS].next; + list = gStaticSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_CEILS].next; numCeils += surface_list_length(list); - list = gDynamicSurfacePartition[cellZ & NUM_CELLS_INDEX][cellX & NUM_CELLS_INDEX][SPATIAL_PARTITION_CEILS].next; + list = gDynamicSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_CEILS].next; numCeils += surface_list_length(list); print_debug_top_down_mapinfo("area %x", cellZ * NUM_CELLS + cellX); diff --git a/src/engine/surface_load.c b/src/engine/surface_load.c index d96e2004..acd6e2c6 100644 --- a/src/engine/surface_load.c +++ b/src/engine/surface_load.c @@ -153,7 +153,7 @@ static void add_surface_to_cell(s32 dynamic, s32 cellX, s32 cellZ, struct Surfac } /** - * Every level is split into 16 * 16 cells of surfaces (to limit computing + * Every level is split into CELL_SIZE * CELL_SIZE cells of surfaces (to limit computing * time). This function determines the lower cell for a given x/z position. * @param coord The coordinate to test */ @@ -185,7 +185,7 @@ static s32 lower_cell_index(s32 coord) { } /** - * Every level is split into 16 * 16 cells of surfaces (to limit computing + * Every level is split into CELL_SIZE * CELL_SIZE cells of surfaces (to limit computing * time). This function determines the upper cell for a given x/z position. * @param coord The coordinate to test */ @@ -208,8 +208,8 @@ static s32 upper_cell_index(s32 coord) { index++; } - if (index > NUM_CELLS_INDEX) { - index = NUM_CELLS_INDEX; + if (index > (NUM_CELLS - 1)) { + index = (NUM_CELLS - 1); } // Potentially < 0, but since lower index is >= 0, not exploitable @@ -430,11 +430,10 @@ static TerrainData *read_vertex_data(TerrainData **data) { * Loads in special environmental regions, such as water, poison gas, and JRB fog. */ static void load_environmental_regions(TerrainData **data) { - s32 numRegions; s32 i; gEnvironmentRegions = *data; - numRegions = *(*data)++; + s32 numRegions = *(*data)++; for (i = 0; i < numRegions; i++) { *data += 5; @@ -518,9 +517,9 @@ u32 get_area_terrain_size(TerrainData *data) { void load_area_terrain(s32 index, TerrainData *data, RoomData *surfaceRooms, s16 *macroObjects) { s32 terrainLoadType; TerrainData *vertexData = NULL; - #if PUPPYPRINT_DEBUG +#if PUPPYPRINT_DEBUG OSTime first = osGetTime(); - #endif +#endif // Initialize the data for this. gEnvironmentRegions = NULL; @@ -568,9 +567,9 @@ void load_area_terrain(s32 index, TerrainData *data, RoomData *surfaceRooms, s16 gNumStaticSurfaceNodes = gSurfaceNodesAllocated; gNumStaticSurfaces = gSurfacesAllocated; - #if PUPPYPRINT_DEBUG - collisionTime[perfIteration] += osGetTime()-first; - #endif +#if PUPPYPRINT_DEBUG + collisionTime[perfIteration] += osGetTime() - first; +#endif } /** diff --git a/src/engine/surface_load.h b/src/engine/surface_load.h index 7cffe2e4..5ba5ac46 100644 --- a/src/engine/surface_load.h +++ b/src/engine/surface_load.h @@ -8,8 +8,6 @@ extern u8 gSurfacePoolError; -#define NUM_CELLS_INDEX (NUM_CELLS - 1) - struct SurfaceNode { struct SurfaceNode *next; diff --git a/src/game/debug_box.c b/src/game/debug_box.c index 1b9ca87f..cc014e1e 100644 --- a/src/game/debug_box.c +++ b/src/game/debug_box.c @@ -221,8 +221,8 @@ void iterate_surfaces_visual(s32 x, s32 z, Vtx *verts) { return; } - cellX = ((x + LEVEL_BOUNDARY_MAX) / CELL_SIZE) & NUM_CELLS_INDEX; - cellZ = ((z + LEVEL_BOUNDARY_MAX) / CELL_SIZE) & NUM_CELLS_INDEX; + s32 cellX = GET_CELL_COORD(x); + s32 cellZ = GET_CELL_COORD(z); for (i = 0; i < 8; i++) { switch (i) { @@ -350,8 +350,8 @@ s32 iterate_surface_count(s32 x, s32 z) return 0; } - cellX = ((x + LEVEL_BOUNDARY_MAX) / CELL_SIZE) & NUM_CELLS_INDEX; - cellZ = ((z + LEVEL_BOUNDARY_MAX) / CELL_SIZE) & NUM_CELLS_INDEX; + cellX = GET_CELL_COORD(x); + cellZ = GET_CELL_COORD(z); for (i = 0; i < 8; i++) { From b8804bba87a9c3d5ad100118e3577717db398120 Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Wed, 29 Sep 2021 21:25:36 -0700 Subject: [PATCH 58/97] Fix teleporting on poles --- src/game/object_helpers.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/game/object_helpers.c b/src/game/object_helpers.c index 4627e61e..e1d9040d 100644 --- a/src/game/object_helpers.c +++ b/src/game/object_helpers.c @@ -1852,13 +1852,12 @@ void spawn_mist_particles_with_sound(u32 soundMagic) { } void cur_obj_push_mario_away(f32 radius) { - f32 marioRelX = gMarioObject->oPosX - o->oPosX; - f32 marioRelZ = gMarioObject->oPosZ - o->oPosZ; + f32 marioRelX = (gMarioObject->oPosX - o->oPosX); + f32 marioRelZ = (gMarioObject->oPosZ - o->oPosZ); f32 marioDist = (sqr(marioRelX) + sqr(marioRelZ)); - if (marioDist < sqr(radius)) { - //! If this function pushes Mario out of bounds, it will trigger Mario's - // oob failsafe + marioDist = sqrtf(marioDist); + //! If this function pushes Mario out of bounds, it will trigger Mario's oob failsafe gMarioStates[0].pos[0] += (radius - marioDist) / radius * marioRelX; gMarioStates[0].pos[2] += (radius - marioDist) / radius * marioRelZ; } From cfa6e6dc9f1be4d139fbee16fce31d7639fe0261 Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Wed, 29 Sep 2021 23:43:14 -0700 Subject: [PATCH 59/97] Fix squishy doors on LLE --- data/behavior_data.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/behavior_data.c b/data/behavior_data.c index 9866d749..765f3fb7 100644 --- a/data/behavior_data.c +++ b/data/behavior_data.c @@ -1066,7 +1066,7 @@ const BehaviorScript bhvDoor[] = { BEGIN(OBJ_LIST_SURFACE), SET_INT(oInteractType, INTERACT_DOOR), // Door - common: - OR_INT(oFlags, (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_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_ANIMATIONS(oAnimations, door_seg3_anims_030156C0), ANIMATE(0), LOAD_COLLISION_DATA(door_seg3_collision_door), From fdd81f5e14c7c6975f77762655bb568d54997527 Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Thu, 30 Sep 2021 00:21:58 -0700 Subject: [PATCH 60/97] Fix rotate_in_xz --- src/game/area.h | 6 +-- src/game/behaviors/cannon.inc.c | 9 +++-- src/game/camera.c | 69 +++++++++++---------------------- src/game/level_update.c | 4 +- 4 files changed, 33 insertions(+), 55 deletions(-) diff --git a/src/game/area.h b/src/game/area.h index 16239b72..f6f9b8e5 100644 --- a/src/game/area.h +++ b/src/game/area.h @@ -67,11 +67,11 @@ struct Area { /*0x00*/ s8 index; /*0x01*/ s8 flags; // Only has 1 flag: 0x01 = Is this the active area? - /*0x02*/ u16 terrainType; // default terrain of the level (set from level script cmd 0x31) + /*0x02*/ TerrainData terrainType; // default terrain of the level (set from level script cmd 0x31) /*0x04*/ struct GraphNodeRoot *graphNode; // geometry layout data - /*0x08*/ s16 *terrainData; // collision data (set from level script cmd 0x2E) + /*0x08*/ TerrainData *terrainData; // collision data (set from level script cmd 0x2E) /*0x0C*/ RoomData *surfaceRooms; // (set from level script cmd 0x2F) - /*0x10*/ s16 *macroObjects; // Macro Objects Ptr (set from level script cmd 0x39) + /*0x10*/ MacroObject *macroObjects; // Macro Objects Ptr (set from level script cmd 0x39) /*0x14*/ struct ObjectWarpNode *warpNodes; /*0x18*/ struct WarpNode *paintingWarpNodes; /*0x1C*/ struct InstantWarp *instantWarps; diff --git a/src/game/behaviors/cannon.inc.c b/src/game/behaviors/cannon.inc.c index ff52180c..97e9cb92 100644 --- a/src/game/behaviors/cannon.inc.c +++ b/src/game/behaviors/cannon.inc.c @@ -94,8 +94,9 @@ void opened_cannon_act_2(void) { } void opened_cannon_act_3(void) { - if (o->oTimer > 3) + if (o->oTimer > 3) { o->oAction = 0; + } } void (*sOpenedCannonActions[])(void) = { opened_cannon_act_0, opened_cannon_act_1, opened_cannon_act_2, @@ -104,8 +105,9 @@ void (*sOpenedCannonActions[])(void) = { opened_cannon_act_0, opened_cannon_act_ void bhv_cannon_base_loop(void) { cur_obj_call_action_function(sOpenedCannonActions); - if (o->oCannonTimeSinceActivated) + if (o->oCannonTimeSinceActivated) { o->oCannonTimeSinceActivated++; + } o->oInteractStatus = 0; } @@ -116,6 +118,7 @@ void bhv_cannon_barrel_loop(void) { obj_copy_pos(o, o->parentObj); o->oMoveAngleYaw = o->parentObj->oMoveAngleYaw; o->oFaceAnglePitch = o->parentObj->oMoveAnglePitch; - } else + } else { cur_obj_disable_rendering(); + } } diff --git a/src/game/camera.c b/src/game/camera.c index ec1c4046..60e02167 100644 --- a/src/game/camera.c +++ b/src/game/camera.c @@ -428,7 +428,7 @@ s32 update_8_directions_camera (struct Camera *c, Vec3f focus, Vec3f pos); s32 update_slide_or_0f_camera (struct Camera *c, Vec3f focus, Vec3f pos); s32 update_spiral_stairs_camera (struct Camera *c, Vec3f focus, Vec3f pos); -typedef s32 (*CameraTransition)(struct Camera *c, Vec3f, Vec3f); +typedef s32 (*CameraTransition)(struct Camera *c, Vec3f focus, Vec3f pos); CameraTransition sModeTransitions[] = { NULL, update_radial_camera, @@ -679,8 +679,7 @@ void focus_on_mario(Vec3f focus, Vec3f pos, f32 posYOff, f32 focYOff, f32 dist, static UNUSED void set_pos_to_mario(Vec3f foc, Vec3f pos, f32 yOff, f32 focYOff, f32 dist, s16 pitch, s16 yaw) { Vec3f marioPos; f32 posDist; - s16 posPitch; - s16 posYaw; + s16 posPitch, posYaw; vec3f_copy(marioPos, sMarioCamState->pos); marioPos[1] += yOff; @@ -1260,11 +1259,7 @@ s32 update_parallel_tracking_camera(struct Camera *c, Vec3f focus, Vec3f pos) { pathPitch = -pathPitch; rotate_in_yz(marioOffset, marioOffset, pathPitch); pathPitch = -pathPitch; - vec3f_copy(focOffset, marioOffset); - - // OK - focOffset[0] = 0.f; - focOffset[1] = 0.f; + focOffset[2] = marioOffset[2]; // Repeat above calcs with camOffset camOffset[0] = pos[0] - parMidPoint[0]; @@ -2356,21 +2351,19 @@ void store_lakitu_cam_info_for_c_up(struct Camera *c) { * * @see update_mario_inputs */ -s32 set_mode_c_up(struct Camera *c) { +void set_mode_c_up(struct Camera *c) { if (!(gCameraMovementFlags & CAM_MOVE_C_UP_MODE)) { gCameraMovementFlags |= CAM_MOVE_C_UP_MODE; store_lakitu_cam_info_for_c_up(c); sCameraSoundFlags &= ~CAM_SOUND_C_UP_PLAYED; - return 1; } - return 0; } /** * Zoom the camera out of C-Up mode, avoiding moving into a wall, if possible, by searching for an open * direction. */ -s32 exit_c_up(struct Camera *c) { +void exit_c_up(struct Camera *c) { struct Surface *surface; Vec3f checkFoc; Vec3f curPos; @@ -2378,12 +2371,10 @@ s32 exit_c_up(struct Camera *c) { s32 searching = 0; /// The current sector of the circle that we are checking s32 sector; - f32 ceilHeight; - f32 floorHeight; + f32 ceilHeight, floorHeight; f32 curDist; f32 d; - s16 curPitch; - s16 curYaw; + s16 curPitch, curYaw; s16 checkYaw = 0; if ((gCameraMovementFlags & CAM_MOVE_C_UP_MODE) && !(gCameraMovementFlags & CAM_MOVE_STARTED_EXITING_C_UP)) { @@ -2462,7 +2453,6 @@ s32 exit_c_up(struct Camera *c) { } play_sound_cbutton_down(); } - return 0; } /** @@ -2541,7 +2531,7 @@ void move_into_c_up(struct Camera *c) { /** * The main update function for C-Up mode */ -s32 mode_c_up_camera(struct Camera *c) { +void mode_c_up_camera(struct Camera *c) { // Play a sound when entering C-Up mode if (!(sCameraSoundFlags & CAM_SOUND_C_UP_PLAYED)) { play_sound_cbutton_up(); @@ -2552,7 +2542,6 @@ s32 mode_c_up_camera(struct Camera *c) { if (gCameraMovementFlags & CAM_MOVING_INTO_MODE) { gCameraMovementFlags |= CAM_MOVE_C_UP_MODE; move_into_c_up(c); - return 1; } if (!(gCameraMovementFlags & CAM_MOVE_STARTED_EXITING_C_UP)) { @@ -2581,7 +2570,6 @@ s32 mode_c_up_camera(struct Camera *c) { if (gPlayer1Controller->buttonPressed & (A_BUTTON | B_BUTTON | D_CBUTTONS | L_CBUTTONS | R_CBUTTONS)) { exit_c_up(c); } - return 0; } /** @@ -2820,13 +2808,11 @@ void update_camera(struct Camera *c) { #endif !(gCurrentArea->camera->mode == CAMERA_MODE_INSIDE_CANNON)) { // Only process R_TRIG if 'fixed' is not selected in the menu - if (cam_select_alt_mode(0) == CAM_SELECTION_MARIO) { - if (gPlayer1Controller->buttonPressed & R_TRIG) { - if (set_cam_angle(0) == CAM_ANGLE_LAKITU) { - set_cam_angle(CAM_ANGLE_MARIO); - } else { - set_cam_angle(CAM_ANGLE_LAKITU); - } + if ((cam_select_alt_mode(0) == CAM_SELECTION_MARIO) && (gPlayer1Controller->buttonPressed & R_TRIG)) { + if (set_cam_angle(0) == CAM_ANGLE_LAKITU) { + set_cam_angle(CAM_ANGLE_MARIO); + } else { + set_cam_angle(CAM_ANGLE_LAKITU); } } play_sound_if_cam_switched_to_lakitu_or_mario(); @@ -2865,8 +2851,7 @@ void update_camera(struct Camera *c) { #else camera_course_processing(c); #endif - sCButtonsPressed = find_c_buttons_pressed(sCButtonsPressed, gPlayer1Controller->buttonPressed, - gPlayer1Controller->buttonDown); + sCButtonsPressed = find_c_buttons_pressed(sCButtonsPressed, gPlayer1Controller->buttonPressed, gPlayer1Controller->buttonDown); if (c->cutscene != 0) { sYawSpeed = 0; @@ -2924,8 +2909,7 @@ void update_camera(struct Camera *c) { #ifndef DISABLE_LEVEL_SPECIFIC_CHECKS if (gCurrLevelNum != LEVEL_CASTLE) { #endif - // If fixed camera is selected as the alternate mode, then fix the camera as long as the right - // trigger is held + // If fixed camera is selected as the alternate mode, then fix the camera as long as the right trigger is held if ((c->cutscene == 0 && (gPlayer1Controller->buttonDown & R_TRIG) && cam_select_alt_mode(0) == CAM_SELECTION_FIXED) || (gCameraMovementFlags & CAM_MOVE_FIX_IN_PLACE) @@ -3319,7 +3303,6 @@ Gfx *geo_camera_main(s32 callContext, struct GraphNode *g, void *context) { return NULL; } - /** * Produces values using a cubic b-spline curve. Basically Q is the used output, * u is a value between 0 and 1 that represents the position along the spline, @@ -3718,7 +3701,6 @@ void approach_vec3s_asymptotic(Vec3s current, Vec3s target, s16 xMul, s16 yMul, approach_s16_asymptotic_bool(¤t[2], target[2], zMul); } - //! move these to math_util s32 camera_approach_s16_symmetric_bool(s16 *current, s16 target, s16 inc) { s16 dist = (target - *current); @@ -4021,9 +4003,9 @@ void rotate_in_xz(Vec3f dst, Vec3f src, s16 yaw) { register f32 z = src[2]; register f32 sy = sins(yaw); register f32 cy = coss(yaw); - dst[0] = ((x * sy) + (z * cy)); + dst[0] = (z * sy) + (x * cy); dst[1] = src[1]; - dst[2] = ((x * cy) - (z * sy)); + dst[2] = (z * cy) - (x * sy); } /** @@ -5428,8 +5410,7 @@ u32 surface_type_modes(struct Camera *c) { * Set the camera mode to `mode` if Mario is not standing on a special surface */ u32 set_mode_if_not_set_by_surface(struct Camera *c, u8 mode) { - u32 modeChanged = 0; - modeChanged = surface_type_modes(c); + u32 modeChanged = surface_type_modes(c); if ((modeChanged == 0) && (mode != 0)) { transition_to_camera_mode(c, mode, 90); @@ -5988,12 +5969,11 @@ s16 camera_course_processing(struct Camera *c) { * Move `pos` between the nearest floor and ceiling */ void resolve_geometry_collisions(Vec3f pos) { - f32 ceilY, floorY; struct Surface *surf; f32_find_wall_collision(&pos[0], &pos[1], &pos[2], 0.f, 100.f); - floorY = find_floor(pos[0], pos[1] + 50.f, pos[2], &surf); - ceilY = find_ceil(pos[0], pos[1] - 50.f, pos[2], &surf); + f32 floorY = find_floor(pos[0], pos[1] + 50.f, pos[2], &surf); + f32 ceilY = find_ceil(pos[0], pos[1] - 50.f, pos[2], &surf); if ((FLOOR_LOWER_LIMIT != floorY) && (CELL_HEIGHT_LIMIT == ceilY)) { if (pos[1] < (floorY += 125.f)) { @@ -6095,7 +6075,7 @@ s32 rotate_camera_around_walls(UNUSED struct Camera *c, Vec3f cPos, s16 *avoidYa wallYaw = horWallNorm + DEGREES(90); // If Mario would be blocked by the surface, then avoid it if ((is_range_behind_surface(sMarioCamState->pos, cPos, wall, yawRange, SURFACE_WALL_MISC) == 0) - && (is_behind_surface(sMarioCamState->pos, wall) == TRUE) + && (is_behind_surface(sMarioCamState->pos, wall)) // Also check if the wall is tall enough to cover Mario && (!is_surf_within_bounding_box(wall, -1.f, 150.f, -1.f))) { // Calculate the avoid direction. The function returns the opposite direction so add 180 @@ -7585,9 +7565,8 @@ void cutscene_red_coin_star_look_up_at_star(struct Camera *c) { void cutscene_red_coin_star_warp(struct Camera *c) { f32 dist; s16 pitch, yaw, posYaw; - struct Object *obj = gCutsceneFocus; - vec3f_copy(sCutsceneVars[1].point, &obj->oHomeVec); + vec3f_copy(sCutsceneVars[1].point, &gCutsceneFocus->oHomeVec); vec3f_get_dist_and_angle(sCutsceneVars[1].point, c->pos, &dist, &pitch, &yaw); vec3f_get_yaw(sCutsceneVars[1].point, c->pos, &posYaw); vec3f_get_yaw(sCutsceneVars[1].point, sMarioCamState->pos, &yaw); @@ -8108,16 +8087,12 @@ void cutscene_dialog_start(struct Camera *c) { cutscene_soften_music(c); set_time_stop_flags(TIME_STOP_ENABLED | TIME_STOP_DIALOG); -#ifndef VERSION_JP if (c->mode == CAMERA_MODE_BOSS_FIGHT) { vec3f_copy(sCameraStoreCutscene.focus, c->focus); vec3f_copy(sCameraStoreCutscene.pos, c->pos); } else { -#endif store_info_star(c); -#ifndef VERSION_JP } -#endif // Store Mario's position and faceAngle sCutsceneVars[8].angle[0] = 0; diff --git a/src/game/level_update.c b/src/game/level_update.c index 35c1b275..9d5631fe 100644 --- a/src/game/level_update.c +++ b/src/game/level_update.c @@ -1171,9 +1171,9 @@ s32 update_level(void) { s32 init_level(void) { s32 fadeFromColor = FALSE; - #if PUPPYPRINT_DEBUG +#if PUPPYPRINT_DEBUG OSTime first = osGetTime(); - #endif +#endif set_play_mode(PLAY_MODE_NORMAL); From be79ded91e386cf1117f5934f343bd1ca36aa464 Mon Sep 17 00:00:00 2001 From: Fazana <52551480+FazanaJ@users.noreply.github.com> Date: Thu, 30 Sep 2021 10:31:31 +0100 Subject: [PATCH 61/97] Fix build error with debug_box.c --- src/game/debug_box.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/game/debug_box.c b/src/game/debug_box.c index cc014e1e..cff86906 100644 --- a/src/game/debug_box.c +++ b/src/game/debug_box.c @@ -210,7 +210,6 @@ extern s32 gSurfacesAllocated; void iterate_surfaces_visual(s32 x, s32 z, Vtx *verts) { struct SurfaceNode *node; struct Surface *surf; - s32 cellX, cellZ; s32 i = 0; s32 col[3] = {0xFF, 0x00, 0x00}; @@ -337,7 +336,6 @@ void visual_surface_display(Vtx *verts, s32 iteration) s32 iterate_surface_count(s32 x, s32 z) { struct SurfaceNode *node; - s32 cellX, cellZ; s32 i = 0; s32 j = 0; TerrainData *p = gEnvironmentRegions; @@ -350,8 +348,8 @@ s32 iterate_surface_count(s32 x, s32 z) return 0; } - cellX = GET_CELL_COORD(x); - cellZ = GET_CELL_COORD(z); + s32 cellX = GET_CELL_COORD(x); + s32 cellZ = GET_CELL_COORD(z); for (i = 0; i < 8; i++) { From 4448273b149d1b99db44315076e48068e10a6f2f Mon Sep 17 00:00:00 2001 From: Fazana <52551480+FazanaJ@users.noreply.github.com> Date: Thu, 30 Sep 2021 10:40:37 +0100 Subject: [PATCH 62/97] Move raycasts back to math_util --- src/engine/math_util.c | 162 ++++++++++++++++++++++++++++++++ src/engine/math_util.h | 1 + src/engine/surface_collision.c | 163 --------------------------------- src/engine/surface_collision.h | 1 - 4 files changed, 163 insertions(+), 164 deletions(-) diff --git a/src/engine/math_util.c b/src/engine/math_util.c index a8fc7189..4670ffcc 100644 --- a/src/engine/math_util.c +++ b/src/engine/math_util.c @@ -1116,3 +1116,165 @@ s32 anim_spline_poll(Vec3f result) { return hasEnded; } + +/************************************************** + * RAYCASTING * + **************************************************/ + +#define RAY_OFFSET 30.0f /*How many units to extrapolate surfaces when testing for a raycast*/ +#define RAY_STEPS 4 /*How many steps to do when casting rays, default to quartersteps.*/ + +s32 ray_surface_intersect(Vec3f orig, Vec3f dir, f32 dir_length, struct Surface *surface, Vec3f hit_pos, f32 *length) { + Vec3f v0, v1, v2, e1, e2, h, s, q; + f32 a, f, u, v; + Vec3f add_dir; + Vec3f norm; + // Ignore certain surface types. + if (surface->type == SURFACE_INTANGIBLE || surface->flags & SURFACE_FLAG_NO_CAM_COLLISION) return FALSE; + // Get surface normal and some other stuff + vec3_set(norm, 0, surface->normal.y, 0); + vec3_mul_val(norm, RAY_OFFSET); + vec3_copy(v0, surface->vertex1); + vec3_copy(v1, surface->vertex2); + vec3_copy(v2, surface->vertex3); + vec3_add( v0, norm); + vec3_add( v1, norm); + vec3_add( v2, norm); + vec3_diff(e1, v1, v0); + vec3_diff(e2, v2, v0); + vec3_cross(h, dir, e2); + // Check if we're perpendicular from the surface + a = vec3_dot(e1, h); + if ((a > -NEAR_ZERO) && (a < NEAR_ZERO)) return FALSE; + // Check if we're making contact with the surface + f = 1.0f / a; + vec3_diff(s, orig, v0); + u = f * vec3_dot(s, h); + if ((u < 0.0f) || (u > 1.0f)) return FALSE; + vec3_cross(q, s, e1); + v = f * vec3_dot(dir, q); + if ((v < 0.0f) || ((u + v) > 1.0f)) return FALSE; + // Get the length between our origin and the surface contact point + *length = f * vec3_dot(e2, q); + if (*length <= 0.00001 || *length > dir_length) return FALSE; + // Successful contact + vec3f_copy(add_dir, dir); + vec3_mul_val(add_dir, *length); + vec3_sum(hit_pos, orig, add_dir); + return TRUE; +} + +void find_surface_on_ray_list(struct SurfaceNode *list, Vec3f orig, Vec3f dir, f32 dir_length, struct Surface **hit_surface, Vec3f hit_pos, f32 *max_length) { + s32 hit; + f32 length; + Vec3f chk_hit_pos; + f32 top, bottom; + #if PUPPYPRINT_DEBUG + OSTime first = osGetTime(); + #endif + + // Get upper and lower bounds of ray + if (dir[1] >= 0.0f) { + top = (orig[1] + (dir[1] * dir_length)); + bottom = orig[1]; + } else { + top = orig[1]; + bottom = (orig[1] + (dir[1] * dir_length)); + } + + // Iterate through every surface of the list + for (; list != NULL; list = list->next) { + // Reject surface if out of vertical bounds + if (list->surface->lowerY > top || list->surface->upperY < bottom) continue; + // Check intersection between the ray and this surface + if ((hit = ray_surface_intersect(orig, dir, dir_length, list->surface, chk_hit_pos, &length)) && (length <= *max_length)) { + *hit_surface = list->surface; + vec3f_copy(hit_pos, chk_hit_pos); + *max_length = length; + } + } +#if PUPPYPRINT_DEBUG + collisionTime[perfIteration] += (osGetTime() - first); +#endif +} + +void find_surface_on_ray_cell(s32 cellX, s32 cellZ, Vec3f orig, Vec3f normalized_dir, f32 dir_length, struct Surface **hit_surface, Vec3f hit_pos, f32 *max_length, s32 flags) { + // Skip if OOB + if (cellX >= 0 && cellX <= (NUM_CELLS - 1) && cellZ >= 0 && cellZ <= (NUM_CELLS - 1)) { + // Iterate through each surface in this partition + if ((normalized_dir[1] > -NEAR_ONE) && (flags & RAYCAST_FIND_CEIL)) { + find_surface_on_ray_list(gStaticSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_CEILS].next, orig, normalized_dir, dir_length, hit_surface, hit_pos, max_length); + find_surface_on_ray_list(gDynamicSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_CEILS].next, orig, normalized_dir, dir_length, hit_surface, hit_pos, max_length); + } + if ((normalized_dir[1] < NEAR_ONE) && (flags & RAYCAST_FIND_FLOOR)) { + find_surface_on_ray_list(gStaticSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_FLOORS].next, orig, normalized_dir, dir_length, hit_surface, hit_pos, max_length); + find_surface_on_ray_list(gDynamicSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_FLOORS].next, orig, normalized_dir, dir_length, hit_surface, hit_pos, max_length); + } + if (flags & RAYCAST_FIND_WALL) { + find_surface_on_ray_list(gStaticSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_WALLS].next, orig, normalized_dir, dir_length, hit_surface, hit_pos, max_length); + find_surface_on_ray_list(gDynamicSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_WALLS].next, orig, normalized_dir, dir_length, hit_surface, hit_pos, max_length); + } + if (flags & RAYCAST_FIND_WATER) { + find_surface_on_ray_list(gStaticSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_WATER].next, orig, normalized_dir, dir_length, hit_surface, hit_pos, max_length); + find_surface_on_ray_list(gDynamicSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_WATER].next, orig, normalized_dir, dir_length, hit_surface, hit_pos, max_length); + } + } +} + +void find_surface_on_ray(Vec3f orig, Vec3f dir, struct Surface **hit_surface, Vec3f hit_pos, s32 flags) { + s32 cellZ, cellX, cellPrevX, cellPrevZ; + f32 fCellZ, fCellX; + Vec3f normalized_dir; + f32 step; + s32 i; + + // Set that no surface has been hit + *hit_surface = NULL; + vec3_sum(hit_pos, orig, dir); + + // Get normalized direction + f32 dir_length = vec3_mag(dir); + f32 max_length = dir_length; + vec3f_copy(normalized_dir, dir); + vec3f_normalize(normalized_dir); + + // Get our cell coordinate + fCellX = (orig[0] + LEVEL_BOUNDARY_MAX) / CELL_SIZE; + fCellZ = (orig[2] + LEVEL_BOUNDARY_MAX) / CELL_SIZE; + cellX = fCellX; + cellZ = fCellZ; + cellPrevX = cellX; + cellPrevZ = cellZ; + + // Don't do DDA if straight down + if (normalized_dir[1] >= 0.99999f || normalized_dir[1] <= -0.99999f) { + find_surface_on_ray_cell(cellX, cellZ, orig, normalized_dir, dir_length, hit_surface, hit_pos, &max_length, flags); + return; + } + + // Get cells we cross using DDA + if (ABS(dir[0]) >= ABS(dir[2])) { + step = RAY_STEPS * ABS(dir[0]) / CELL_SIZE; + } else { + step = RAY_STEPS * ABS(dir[2]) / CELL_SIZE; + } + f32 dx = dir[0] / step / CELL_SIZE; + f32 dz = dir[2] / step / CELL_SIZE; + + for (i = 0; i < step && *hit_surface == NULL; i++) { + find_surface_on_ray_cell(cellX, cellZ, orig, normalized_dir, dir_length, hit_surface, hit_pos, &max_length, flags); + + // Move cell coordinate + fCellX += dx; + fCellZ += dz; + cellPrevX = cellX; + cellPrevZ = cellZ; + cellX = fCellX; + cellZ = fCellZ; + + if ((cellPrevX != cellX) && (cellPrevZ != cellZ)) { + find_surface_on_ray_cell(cellX, cellPrevZ, orig, normalized_dir, dir_length, hit_surface, hit_pos, &max_length, flags); + find_surface_on_ray_cell(cellPrevX, cellZ, orig, normalized_dir, dir_length, hit_surface, hit_pos, &max_length, flags); + } + } +} diff --git a/src/engine/math_util.h b/src/engine/math_util.h index c43ea5ce..5098ee3a 100644 --- a/src/engine/math_util.h +++ b/src/engine/math_util.h @@ -530,5 +530,6 @@ void spline_get_weights(Vec4f result, f32 t, UNUSED s32 c); void anim_spline_init(Vec4s *keyFrames); s32 anim_spline_poll(Vec3f result); void mtxf_rot_trans_mul(Vec3s rot, Vec3f trans, Mat4 dest, Mat4 src); +void find_surface_on_ray(Vec3f orig, Vec3f dir, struct Surface **hit_surface, Vec3f hit_pos, s32 flags); #endif // MATH_UTIL_H diff --git a/src/engine/surface_collision.c b/src/engine/surface_collision.c index c86a39cb..11524535 100644 --- a/src/engine/surface_collision.c +++ b/src/engine/surface_collision.c @@ -832,166 +832,3 @@ s32 unused_resolve_floor_or_ceil_collisions(s32 checkCeil, f32 *px, f32 *py, f32 return 0; } - -/************************************************** - * RAYCASTING * - **************************************************/ - -#define RAY_OFFSET 30.0f /*How many units to extrapolate surfaces when testing for a raycast*/ -#define RAY_STEPS 4 /*How many steps to do when casting rays, default to quartersteps.*/ - -s32 ray_surface_intersect(Vec3f orig, Vec3f dir, f32 dir_length, struct Surface *surface, Vec3f hit_pos, f32 *length) { - Vec3f v0, v1, v2, e1, e2, h, s, q; - f32 a, f, u, v; - Vec3f add_dir; - Vec3f norm; - // Ignore certain surface types. - if (surface->type == SURFACE_INTANGIBLE || surface->flags & SURFACE_FLAG_NO_CAM_COLLISION) return FALSE; - // Get surface normal and some other stuff - vec3_set(norm, 0, surface->normal.y, 0); - vec3_mul_val(norm, RAY_OFFSET); - vec3_copy(v0, surface->vertex1); - vec3_copy(v1, surface->vertex2); - vec3_copy(v2, surface->vertex3); - vec3_add( v0, norm); - vec3_add( v1, norm); - vec3_add( v2, norm); - vec3_diff(e1, v1, v0); - vec3_diff(e2, v2, v0); - vec3_cross(h, dir, e2); - // Check if we're perpendicular from the surface - a = vec3_dot(e1, h); - if ((a > -NEAR_ZERO) && (a < NEAR_ZERO)) return FALSE; - // Check if we're making contact with the surface - f = 1.0f / a; - vec3_diff(s, orig, v0); - u = f * vec3_dot(s, h); - if ((u < 0.0f) || (u > 1.0f)) return FALSE; - vec3_cross(q, s, e1); - v = f * vec3_dot(dir, q); - if ((v < 0.0f) || ((u + v) > 1.0f)) return FALSE; - // Get the length between our origin and the surface contact point - *length = f * vec3_dot(e2, q); - if (*length <= 0.00001 || *length > dir_length) return FALSE; - // Successful contact - vec3f_copy(add_dir, dir); - vec3_mul_val(add_dir, *length); - vec3_sum(hit_pos, orig, add_dir); - return TRUE; -} - -void find_surface_on_ray_list(struct SurfaceNode *list, Vec3f orig, Vec3f dir, f32 dir_length, struct Surface **hit_surface, Vec3f hit_pos, f32 *max_length) { - s32 hit; - f32 length; - Vec3f chk_hit_pos; - f32 top, bottom; - #if PUPPYPRINT_DEBUG - OSTime first = osGetTime(); - #endif - - // Get upper and lower bounds of ray - if (dir[1] >= 0.0f) { - top = (orig[1] + (dir[1] * dir_length)); - bottom = orig[1]; - } else { - top = orig[1]; - bottom = (orig[1] + (dir[1] * dir_length)); - } - - // Iterate through every surface of the list - for (; list != NULL; list = list->next) { - // Reject surface if out of vertical bounds - if (list->surface->lowerY > top || list->surface->upperY < bottom) continue; - // Check intersection between the ray and this surface - if ((hit = ray_surface_intersect(orig, dir, dir_length, list->surface, chk_hit_pos, &length)) && (length <= *max_length)) { - *hit_surface = list->surface; - vec3f_copy(hit_pos, chk_hit_pos); - *max_length = length; - } - } -#if PUPPYPRINT_DEBUG - collisionTime[perfIteration] += (osGetTime() - first); -#endif -} - -void find_surface_on_ray_cell(s32 cellX, s32 cellZ, Vec3f orig, Vec3f normalized_dir, f32 dir_length, struct Surface **hit_surface, Vec3f hit_pos, f32 *max_length, s32 flags) { - // Skip if OOB - if (cellX >= 0 && cellX <= (NUM_CELLS - 1) && cellZ >= 0 && cellZ <= (NUM_CELLS - 1)) { - // Iterate through each surface in this partition - if ((normalized_dir[1] > -NEAR_ONE) && (flags & RAYCAST_FIND_CEIL)) { - find_surface_on_ray_list(gStaticSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_CEILS].next, orig, normalized_dir, dir_length, hit_surface, hit_pos, max_length); - find_surface_on_ray_list(gDynamicSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_CEILS].next, orig, normalized_dir, dir_length, hit_surface, hit_pos, max_length); - } - if ((normalized_dir[1] < NEAR_ONE) && (flags & RAYCAST_FIND_FLOOR)) { - find_surface_on_ray_list(gStaticSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_FLOORS].next, orig, normalized_dir, dir_length, hit_surface, hit_pos, max_length); - find_surface_on_ray_list(gDynamicSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_FLOORS].next, orig, normalized_dir, dir_length, hit_surface, hit_pos, max_length); - } - if (flags & RAYCAST_FIND_WALL) { - find_surface_on_ray_list(gStaticSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_WALLS].next, orig, normalized_dir, dir_length, hit_surface, hit_pos, max_length); - find_surface_on_ray_list(gDynamicSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_WALLS].next, orig, normalized_dir, dir_length, hit_surface, hit_pos, max_length); - } - if (flags & RAYCAST_FIND_WATER) { - find_surface_on_ray_list(gStaticSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_WATER].next, orig, normalized_dir, dir_length, hit_surface, hit_pos, max_length); - find_surface_on_ray_list(gDynamicSurfacePartition[cellZ][cellX][SPATIAL_PARTITION_WATER].next, orig, normalized_dir, dir_length, hit_surface, hit_pos, max_length); - } - } -} - -void find_surface_on_ray(Vec3f orig, Vec3f dir, struct Surface **hit_surface, Vec3f hit_pos, s32 flags) { - s32 cellZ, cellX, cellPrevX, cellPrevZ; - f32 fCellZ, fCellX; - Vec3f normalized_dir; - f32 step; - s32 i; - - // Set that no surface has been hit - *hit_surface = NULL; - vec3_sum(hit_pos, orig, dir); - - // Get normalized direction - f32 dir_length = vec3_mag(dir); - f32 max_length = dir_length; - vec3f_copy(normalized_dir, dir); - vec3f_normalize(normalized_dir); - - // Get our cell coordinate - fCellX = (orig[0] + LEVEL_BOUNDARY_MAX) / CELL_SIZE; - fCellZ = (orig[2] + LEVEL_BOUNDARY_MAX) / CELL_SIZE; - cellX = fCellX; - cellZ = fCellZ; - cellPrevX = cellX; - cellPrevZ = cellZ; - - // Don't do DDA if straight down - if (normalized_dir[1] >= 0.99999f || normalized_dir[1] <= -0.99999f) { - find_surface_on_ray_cell(cellX, cellZ, orig, normalized_dir, dir_length, hit_surface, hit_pos, &max_length, flags); - return; - } - - // Get cells we cross using DDA - if (ABS(dir[0]) >= ABS(dir[2])) { - step = RAY_STEPS * ABS(dir[0]) / CELL_SIZE; - } else { - step = RAY_STEPS * ABS(dir[2]) / CELL_SIZE; - } - f32 dx = dir[0] / step / CELL_SIZE; - f32 dz = dir[2] / step / CELL_SIZE; - - for (i = 0; i < step && *hit_surface == NULL; i++) { - find_surface_on_ray_cell(cellX, cellZ, orig, normalized_dir, dir_length, hit_surface, hit_pos, &max_length, flags); - - // Move cell coordinate - fCellX += dx; - fCellZ += dz; - cellPrevX = cellX; - cellPrevZ = cellZ; - cellX = fCellX; - cellZ = fCellZ; - - if ((cellPrevX != cellX) && (cellPrevZ != cellZ)) { - find_surface_on_ray_cell(cellX, cellPrevZ, orig, normalized_dir, dir_length, hit_surface, hit_pos, &max_length, flags); - find_surface_on_ray_cell(cellPrevX, cellZ, orig, normalized_dir, dir_length, hit_surface, hit_pos, &max_length, flags); - } - } -} - diff --git a/src/engine/surface_collision.h b/src/engine/surface_collision.h index eb174505..81a2a4bf 100644 --- a/src/engine/surface_collision.h +++ b/src/engine/surface_collision.h @@ -46,6 +46,5 @@ s32 find_water_level_and_floor(s32 x, s32 z, struct Surface **pfloor); s32 find_water_level(s32 x, s32 z); s32 find_poison_gas_level(s32 x, s32 z); void debug_surface_list_info(f32 xPos, f32 zPos); -void find_surface_on_ray(Vec3f orig, Vec3f dir, struct Surface **hit_surface, Vec3f hit_pos, s32 flags); #endif // SURFACE_COLLISION_H From d79dd5a51f4980fc9bbbb7296c2ba0f2783bdca8 Mon Sep 17 00:00:00 2001 From: Fazana <52551480+FazanaJ@users.noreply.github.com> Date: Thu, 30 Sep 2021 12:17:54 +0100 Subject: [PATCH 63/97] Make collision build with Ofast :pensive: nothing makes sense anymore. --- Makefile | 2 -- 1 file changed, 2 deletions(-) diff --git a/Makefile b/Makefile index 3ed89661..013a24ed 100644 --- a/Makefile +++ b/Makefile @@ -576,9 +576,7 @@ $(BUILD_DIR)/src/usb/usb.o: OPT_FLAGS := -O0 $(BUILD_DIR)/src/usb/usb.o: CFLAGS += -Wno-unused-variable -Wno-sign-compare -Wno-unused-function $(BUILD_DIR)/src/usb/debug.o: OPT_FLAGS := -O0 $(BUILD_DIR)/src/usb/debug.o: CFLAGS += -Wno-unused-parameter -Wno-maybe-uninitialized -$(BUILD_DIR)/src/engine/surface_collision.o: OPT_FLAGS := -Os $(BUILD_DIR)/src/audio/*.o: OPT_FLAGS := -Os -fno-jump-tables -$(BUILD_DIR)/src/game/*.o: OPT_FLAGS := -Ofast ALL_DIRS := $(BUILD_DIR) $(addprefix $(BUILD_DIR)/,$(SRC_DIRS) asm/debug $(GODDARD_SRC_DIRS) $(LIBZ_SRC_DIRS) $(ULTRA_BIN_DIRS) $(BIN_DIRS) $(TEXTURE_DIRS) $(TEXT_DIRS) $(SOUND_SAMPLE_DIRS) $(addprefix levels/,$(LEVEL_DIRS)) rsp include) $(YAY0_DIR) $(addprefix $(YAY0_DIR)/,$(VERSION)) $(SOUND_BIN_DIR) $(SOUND_BIN_DIR)/sequences/$(VERSION) From a8fd8c517211d4554ffd82a371f749a9db6d4e64 Mon Sep 17 00:00:00 2001 From: Fazana <52551480+FazanaJ@users.noreply.github.com> Date: Thu, 30 Sep 2021 15:24:44 +0100 Subject: [PATCH 64/97] fix memory.c and add ucode_small flag --- include/object_constants.h | 1 + src/boot/memory.c | 9 ++++----- src/engine/behavior_script.c | 10 ++++++++++ src/engine/graph_node.h | 1 + 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/include/object_constants.h b/include/object_constants.h index 7b9a3526..8bfe26dc 100644 --- a/include/object_constants.h +++ b/include/object_constants.h @@ -49,6 +49,7 @@ #define OBJ_FLAG_SILHOUETTE (1 << 19) // 0x00080000 #define OBJ_FLAG_OCCLUDE_SILHOUETTE (1 << 20) // 0x00100000 #define OBJ_FLAG_OPACITY_FROM_CAMERA_DIST (1 << 21) // 0x00200000 +#define OBJ_FLAG_UCODE_SMALL (1 << 22) // 0x00400000 #define OBJ_FLAG_HITBOX_WAS_SET (1 << 30) // 0x40000000 /* oHeldState */ diff --git a/src/boot/memory.c b/src/boot/memory.c index e0914775..7d44ac60 100644 --- a/src/boot/memory.c +++ b/src/boot/memory.c @@ -68,7 +68,6 @@ struct MemoryPool *gEffectsMemoryPool; uintptr_t sSegmentTable[32]; -uintptr_t sSegmentROMTable[32]; u32 sPoolFreeSpace; u8 *sPoolStart; u8 *sPoolEnd; @@ -339,13 +338,13 @@ void *load_segment(s32 segment, u8 *srcStart, u8 *srcEnd, u32 side, u8 *bssStart addr = dynamic_dma_read(srcStart, srcEnd, side, TLB_PAGE_SIZE, (uintptr_t)bssEnd - (uintptr_t)bssStart); if (addr != NULL) { u8 *realAddr = (u8 *)ALIGN((uintptr_t)addr, TLB_PAGE_SIZE); - set_segment_base_addr(segment, realAddr); sSegmentROMTable[segment] = (uintptr_t) srcStart; + set_segment_base_addr(segment, realAddr); mapTLBPages(segment << 24, VIRTUAL_TO_PHYSICAL(realAddr), (srcEnd - srcStart) + ((uintptr_t)bssEnd - (uintptr_t)bssStart), segment); } } else { addr = dynamic_dma_read(srcStart, srcEnd, side, 0, 0); if (addr != NULL) { - set_segment_base_addr(segment, addr); sSegmentROMTable[segment] = (uintptr_t) srcStart; + set_segment_base_addr(segment, addr); } } #if PUPPYPRINT_DEBUG @@ -420,7 +419,7 @@ void *load_segment_decompress(s32 segment, u8 *srcStart, u8 *srcEnd) { decompress(compressed, dest); #endif osSyncPrintf("end decompress\n"); - set_segment_base_addr(segment, dest); sSegmentROMTable[segment] = (uintptr_t) srcStart; + set_segment_base_addr(segment, dest); main_pool_free(compressed); } } @@ -459,7 +458,7 @@ void *load_segment_decompress_heap(u32 segment, u8 *srcStart, u8 *srcEnd) { #elif MIO0 decompress(compressed, gDecompressionHeap); #endif - set_segment_base_addr(segment, gDecompressionHeap); sSegmentROMTable[segment] = (uintptr_t) srcStart; + set_segment_base_addr(segment, gDecompressionHeap); main_pool_free(compressed); } return gDecompressionHeap; diff --git a/src/engine/behavior_script.c b/src/engine/behavior_script.c index 44eb3838..2ea40dad 100644 --- a/src/engine/behavior_script.c +++ b/src/engine/behavior_script.c @@ -920,6 +920,7 @@ void cur_obj_update(void) { f32 distanceFromMario; BhvCommandProc bhvCmdProc; s32 bhvProcResult; + s32 objListIndex; // Calculate the distance from the object to Mario. if (objFlags & OBJ_FLAG_COMPUTE_DIST_TO_MARIO) { @@ -995,6 +996,15 @@ void cur_obj_update(void) { COND_BIT((!(objFlags & OBJ_FLAG_UCODE_LARGE )), gCurrentObject->header.gfx.node.flags, GRAPH_RENDER_UCODE_REJ ); COND_BIT(( objFlags & OBJ_FLAG_SILHOUETTE ), gCurrentObject->header.gfx.node.flags, GRAPH_RENDER_SILHOUETTE ); COND_BIT(( objFlags & OBJ_FLAG_OCCLUDE_SILHOUETTE ), gCurrentObject->header.gfx.node.flags, GRAPH_RENDER_OCCLUDE_SILHOUETTE); + BehaviorScript *bhvScript = segmented_to_virtual(gCurrentObject->behavior); + if ((bhvScript[0] >> 24) == 0) { + objListIndex = (bhvScript[0] >> 16) & 0xFFFF; + } + if (objListIndex == OBJ_LIST_SURFACE && !(objFlags & OBJ_FLAG_UCODE_SMALL)) + { + gCurrentObject->header.gfx.node.flags &= ~GRAPH_RENDER_UCODE_REJ; + gCurrentObject->header.gfx.node.flags |= GRAPH_RENDER_UCODE_ZEX; + } #ifdef OBJ_OPACITY_BY_CAM_DIST if (objFlags & OBJ_FLAG_OPACITY_FROM_CAMERA_DIST) { diff --git a/src/engine/graph_node.h b/src/engine/graph_node.h index cc033f5c..f112dc9f 100644 --- a/src/engine/graph_node.h +++ b/src/engine/graph_node.h @@ -18,6 +18,7 @@ #define GRAPH_RENDER_SILHOUETTE (1 << 6) // 0x0040 #define GRAPH_RENDER_OCCLUDE_SILHOUETTE (1 << 7) // 0x0080 #define GRAPH_RENDER_UCODE_REJ (1 << 8) // 0x0100 +#define GRAPH_RENDER_UCODE_ZEX (1 << 9) // 0x0200 // The amount of bits to use for the above flags out of a s16 variable. // The remaining bits to the left are used for the render layers. From 83e727400e99c8e29bd579901817d2a37ecd0d1b Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Thu, 30 Sep 2021 12:35:46 -0700 Subject: [PATCH 65/97] Update src/game/behaviors/king_bobomb.inc.c Co-authored-by: thecozies <79979276+thecozies@users.noreply.github.com> --- src/game/behaviors/king_bobomb.inc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/behaviors/king_bobomb.inc.c b/src/game/behaviors/king_bobomb.inc.c index ce7a0ce8..7114675a 100644 --- a/src/game/behaviors/king_bobomb.inc.c +++ b/src/game/behaviors/king_bobomb.inc.c @@ -224,7 +224,7 @@ void king_bobomb_act_5(void) { // bobomb returns home if (o->oPosY < o->oHomeY) o->oVelY = 100.0f; else { - arc_to_goal_pos(&o->oPosVec, &o->oPosVec, 100.0f, -4.0f); + arc_to_goal_pos(&o->oHomeX, &o->oPosVec, 100.0f, -4.0f); o->oSubAction++; } break; From 4f3e84c2adf3c68b93fa8c104a7bcd800ea50b47 Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Thu, 30 Sep 2021 12:37:25 -0700 Subject: [PATCH 66/97] Update play_mode_change_area --- src/game/camera.c | 14 ++++++------ src/game/level_update.c | 48 ++++++++++++++++------------------------- 2 files changed, 25 insertions(+), 37 deletions(-) diff --git a/src/game/camera.c b/src/game/camera.c index 60e02167..fd47d858 100644 --- a/src/game/camera.c +++ b/src/game/camera.c @@ -2710,11 +2710,9 @@ void set_camera_mode(struct Camera *c, s16 mode, s16 frames) { void update_lakitu(struct Camera *c) { struct Surface *floor = NULL; Vec3f newPos, newFoc; - f32 distToFloor; - s16 newYaw; if (!(gCameraMovementFlags & CAM_MOVE_PAUSE_SCREEN)) { - newYaw = next_lakitu_state(newPos, newFoc, c->pos, c->focus, sOldPosition, sOldFocus, c->nextYaw); + s16 newYaw = next_lakitu_state(newPos, newFoc, c->pos, c->focus, sOldPosition, sOldFocus, c->nextYaw); set_or_approach_s16_symmetric(&c->yaw, newYaw, sYawSpeed); sStatusFlags &= ~CAM_FLAG_UNUSED_CUTSCENE_ACTIVE; @@ -2775,9 +2773,9 @@ void update_lakitu(struct Camera *c) { if (c->mode != CAMERA_MODE_C_UP && c->cutscene == 0) { gCheckingSurfaceCollisionsForCamera = TRUE; - distToFloor = find_floor(gLakituState.pos[0], - gLakituState.pos[1] + 20.0f, - gLakituState.pos[2], &floor); + f32 distToFloor = find_floor(gLakituState.pos[0], + gLakituState.pos[1] + 20.0f, + gLakituState.pos[2], &floor); if (distToFloor != FLOOR_LOWER_LIMIT) { if (gLakituState.pos[1] < (distToFloor += 100.0f)) { gLakituState.pos[1] = distToFloor; @@ -2844,8 +2842,8 @@ void update_camera(struct Camera *c) { c->yaw = gLakituState.yaw; c->nextYaw = gLakituState.nextYaw; - c->mode = gLakituState.mode; - c->defMode = gLakituState.defMode; + c->mode = gLakituState.mode;// = c->mode; + c->defMode = gLakituState.defMode;// = c->defMode; #ifdef CAMERA_FIX if (gCurrDemoInput != NULL) camera_course_processing(c); #else diff --git a/src/game/level_update.c b/src/game/level_update.c index 9d5631fe..7dd7ba66 100644 --- a/src/game/level_update.c +++ b/src/game/level_update.c @@ -757,15 +757,15 @@ s16 level_trigger_warp(struct MarioState *m, s32 warpOp) { case WARP_OP_WARP_FLOOR: sSourceWarpNodeId = WARP_NODE_WARP_FLOOR; if (area_get_warp_node(sSourceWarpNodeId) == NULL) { - #ifndef DISABLE_LIVES +#ifndef DISABLE_LIVES if (m->numLives == 0) { sDelayedWarpOp = WARP_OP_GAME_OVER; } else { sSourceWarpNodeId = WARP_NODE_DEATH; } - #else +#else sSourceWarpNodeId = WARP_NODE_DEATH; - #endif +#endif } sDelayedWarpTimer = 20; @@ -1022,7 +1022,7 @@ s32 play_mode_normal(void) { } } - return 0; + return FALSE; } s32 play_mode_paused(void) { @@ -1044,7 +1044,7 @@ s32 play_mode_paused(void) { gCameraMovementFlags &= ~CAM_MOVE_PAUSE_SCREEN; } - return 0; + return FALSE; } /** @@ -1080,24 +1080,16 @@ void level_set_transition(s16 length, void (*updateFunction)(s16 *)) { * Play the transition and then return to normal play mode. */ s32 play_mode_change_area(void) { - //! This maybe was supposed to be sTransitionTimer == -1? sTransitionUpdate - // is never set to -1. - if (sTransitionUpdate == (void (*)(s16 *)) - 1) { + // sm64ex-axo + // Change function to have similar change_level defines + if (sTransitionUpdate != NULL) sTransitionUpdate(&sTransitionTimer); + if (--sTransitionTimer == -1) { update_camera(gCurrentArea->camera); - } else if (sTransitionUpdate != NULL) { - sTransitionUpdate(&sTransitionTimer); - } - - if (sTransitionTimer > 0) { - sTransitionTimer--; - } - - if (sTransitionTimer == 0) { + sTransitionTimer = 0; sTransitionUpdate = NULL; set_play_mode(PLAY_MODE_NORMAL); } - - return 0; + return FALSE; } /** @@ -1120,7 +1112,7 @@ s32 play_mode_change_level(void) { } } - return 0; + return FALSE; } /** @@ -1269,10 +1261,8 @@ s32 lvl_init_or_update(s16 initOrUpdate, UNUSED s32 unused) { } #if MULTILANG -void load_language_text(void) -{ - switch (gInGameLanguage-1) - { +void load_language_text(void) { + switch (gInGameLanguage - 1) { case LANGUAGE_ENGLISH: load_segment_decompress(0x19, _translation_en_yay0SegmentRomStart, _translation_en_yay0SegmentRomEnd); break; @@ -1321,7 +1311,7 @@ s32 lvl_set_current_level(UNUSED s16 arg0, s32 levelNum) { gCurrCourseNum = gLevelToCourseNumTable[levelNum - 1]; if (gCurrDemoInput != NULL || gCurrCreditsEntry != NULL || gCurrCourseNum == COURSE_NONE) { - return 0; + return FALSE; } if (gCurrLevelNum != LEVEL_BOWSER_1 && gCurrLevelNum != LEVEL_BOWSER_2 && gCurrLevelNum != LEVEL_BOWSER_3) { @@ -1336,14 +1326,14 @@ s32 lvl_set_current_level(UNUSED s16 arg0, s32 levelNum) { } if (gCurrCourseNum > COURSE_STAGES_MAX || warpCheckpointActive) { - return 0; + return FALSE; } if (gDebugLevelSelect) { - return 0; + return FALSE; } - return 1; + return TRUE; } /** @@ -1351,5 +1341,5 @@ s32 lvl_set_current_level(UNUSED s16 arg0, s32 levelNum) { */ s32 lvl_play_the_end_screen_sound(UNUSED s16 arg0, UNUSED s32 arg1) { play_sound(SOUND_MENU_THANK_YOU_PLAYING_MY_GAME, gGlobalSoundSource); - return 1; + return TRUE; } From 0d427d3f25d24fe5e14296ed0b4831b386cbc416 Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Thu, 30 Sep 2021 12:52:48 -0700 Subject: [PATCH 67/97] Initialize objListIndex --- src/engine/behavior_script.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/engine/behavior_script.c b/src/engine/behavior_script.c index 2ea40dad..3e9f14f1 100644 --- a/src/engine/behavior_script.c +++ b/src/engine/behavior_script.c @@ -920,7 +920,7 @@ void cur_obj_update(void) { f32 distanceFromMario; BhvCommandProc bhvCmdProc; s32 bhvProcResult; - s32 objListIndex; + s32 objListIndex = OBJ_LIST_PLAYER; // Calculate the distance from the object to Mario. if (objFlags & OBJ_FLAG_COMPUTE_DIST_TO_MARIO) { @@ -1000,10 +1000,9 @@ void cur_obj_update(void) { if ((bhvScript[0] >> 24) == 0) { objListIndex = (bhvScript[0] >> 16) & 0xFFFF; } - if (objListIndex == OBJ_LIST_SURFACE && !(objFlags & OBJ_FLAG_UCODE_SMALL)) - { + if (objListIndex == OBJ_LIST_SURFACE && !(objFlags & OBJ_FLAG_UCODE_SMALL)) { gCurrentObject->header.gfx.node.flags &= ~GRAPH_RENDER_UCODE_REJ; - gCurrentObject->header.gfx.node.flags |= GRAPH_RENDER_UCODE_ZEX; + gCurrentObject->header.gfx.node.flags |= GRAPH_RENDER_UCODE_ZEX; } #ifdef OBJ_OPACITY_BY_CAM_DIST From 9e2726606b6fea42f53e753af2c3a0a477576683 Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Thu, 30 Sep 2021 14:04:09 -0700 Subject: [PATCH 68/97] fix funny typo --- src/game/level_update.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/game/level_update.c b/src/game/level_update.c index 7dd7ba66..c34a9e14 100644 --- a/src/game/level_update.c +++ b/src/game/level_update.c @@ -1080,9 +1080,11 @@ void level_set_transition(s16 length, void (*updateFunction)(s16 *)) { * Play the transition and then return to normal play mode. */ s32 play_mode_change_area(void) { - // sm64ex-axo + // sm64ex-alo // Change function to have similar change_level defines - if (sTransitionUpdate != NULL) sTransitionUpdate(&sTransitionTimer); + if (sTransitionUpdate != NULL) { + sTransitionUpdate(&sTransitionTimer); + } if (--sTransitionTimer == -1) { update_camera(gCurrentArea->camera); sTransitionTimer = 0; @@ -1129,7 +1131,7 @@ UNUSED static s32 play_mode_unused(void) { } } - return 0; + return FALSE; } s32 update_level(void) { From 362a46479e1bbee95a5e2af3d2f28b74aef0cf03 Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Thu, 30 Sep 2021 14:43:10 -0700 Subject: [PATCH 69/97] spawn_star.inc.c improvements --- src/game/behaviors/spawn_star.inc.c | 74 ++++++++++++++++------------- 1 file changed, 40 insertions(+), 34 deletions(-) diff --git a/src/game/behaviors/spawn_star.inc.c b/src/game/behaviors/spawn_star.inc.c index c088ea43..7a7c2fd9 100644 --- a/src/game/behaviors/spawn_star.inc.c +++ b/src/game/behaviors/spawn_star.inc.c @@ -15,15 +15,12 @@ static struct ObjectHitbox sCollectStarHitbox = { }; void bhv_collect_star_init(void) { - s8 starId; - u8 currentLevelStarFlags; - - starId = (o->oBehParams >> 24) & 0xFF; + s8 starId = (o->oBehParams >> 24) & 0xFF; #ifdef GLOBAL_STAR_IDS - currentLevelStarFlags = save_file_get_star_flags(gCurrSaveFileNum - 1, (starId/7) - 1); + u8 currentLevelStarFlags = save_file_get_star_flags(gCurrSaveFileNum - 1, (starId/7) - 1); if (currentLevelStarFlags & (1 << (starId % 7))) { #else - currentLevelStarFlags = save_file_get_star_flags(gCurrSaveFileNum - 1, gCurrCourseNum - 1); + u8 currentLevelStarFlags = save_file_get_star_flags(gCurrSaveFileNum - 1, gCurrCourseNum - 1); if (currentLevelStarFlags & (1 << starId)) { #endif o->header.gfx.sharedChild = gLoadedGraphNodes[MODEL_TRANSPARENT_STAR]; @@ -39,20 +36,27 @@ void bhv_collect_star_loop(void) { if (o->oInteractStatus & INT_STATUS_INTERACTED) { obj_mark_for_deletion(o); - o->oInteractStatus = 0; + o->oInteractStatus = INT_STATUS_NONE; } } void bhv_star_spawn_init(void) { - o->oMoveAngleYaw = atan2s(o->oHomeZ - o->oPosZ, o->oHomeX - o->oPosX); - o->oStarSpawnDisFromHome = sqrtf(sqr(o->oHomeX - o->oPosX) + sqr(o->oHomeZ - o->oPosZ)); + f32 dx = (o->oHomeX - o->oPosX); + f32 dz = (o->oHomeZ - o->oPosZ); + o->oMoveAngleYaw = atan2s(dz, dx); + o->oStarSpawnDisFromHome = sqrtf(sqr(dx) + sqr(dz)); o->oVelY = (o->oHomeY - o->oPosY) / 30.0f; o->oForwardVel = o->oStarSpawnDisFromHome / 30.0f; o->oStarSpawnVelY = o->oPosY; - if (o->oBehParams2ndByte == 0 || gCurrCourseNum == COURSE_BBH) +#ifdef DISABLE_LEVEL_SPECIFIC_CHECKS + if (o->oBehParams2ndByte == 0) { +#else + if (o->oBehParams2ndByte == 0 || gCurrCourseNum == COURSE_BBH) { +#endif cutscene_object(CUTSCENE_STAR_SPAWN, o); - else + } else { cutscene_object(CUTSCENE_RED_COIN_STAR_SPAWN, o); + } set_time_stop_flags(TIME_STOP_ENABLED | TIME_STOP_MARIO_AND_DOORS); o->activeFlags |= ACTIVE_FLAG_INITIATED_TIME_STOP; @@ -61,13 +65,14 @@ void bhv_star_spawn_init(void) { void bhv_star_spawn_loop(void) { switch (o->oAction) { - case 0: + case SPAWN_STAR_ARC_CUTSCENE_ACT_START: o->oFaceAngleYaw += 0x1000; - if (o->oTimer > 20) - o->oAction = 1; + if (o->oTimer > 20) { + o->oAction = SPAWN_STAR_ARC_CUTSCENE_ACT_GO_TO_HOME; + } break; - case 1: + case SPAWN_STAR_ARC_CUTSCENE_ACT_GO_TO_HOME: obj_move_xyz_using_fvel_and_yaw(o); o->oStarSpawnVelY += o->oVelY; o->oPosY = o->oStarSpawnVelY + sins((o->oTimer * 0x8000) / 30) * 400.0f; @@ -75,18 +80,21 @@ void bhv_star_spawn_loop(void) { spawn_object(o, MODEL_NONE, bhvSparkleSpawn); cur_obj_play_sound_1(SOUND_ENV_STAR); if (o->oTimer == 30) { - o->oAction = 2; + o->oAction = SPAWN_STAR_ARC_CUTSCENE_ACT_BOUNCE; o->oForwardVel = 0; + // Set to exact home coordinates + o->oPosX = o->oHomeX; + o->oPosZ = o->oHomeZ; play_power_star_jingle(TRUE); } break; - case 2: - if (o->oTimer < 20) + case SPAWN_STAR_ARC_CUTSCENE_ACT_BOUNCE: + if (o->oTimer < 20) { o->oVelY = 20 - o->oTimer; - else + } else { o->oVelY = -10.0f; - + } spawn_object(o, MODEL_NONE, bhvSparkleSpawn); obj_move_xyz_using_fvel_and_yaw(o); o->oFaceAngleYaw = o->oFaceAngleYaw - o->oTimer * 0x10 + 0x1000; @@ -96,11 +104,11 @@ void bhv_star_spawn_loop(void) { cur_obj_play_sound_2(SOUND_GENERAL_STAR_APPEARS); cur_obj_become_tangible(); o->oPosY = o->oHomeY; - o->oAction = 3; + o->oAction = SPAWN_STAR_ARC_CUTSCENE_ACT_END; } break; - case 3: + case SPAWN_STAR_ARC_CUTSCENE_ACT_END: o->oFaceAngleYaw += 0x800; if (o->oTimer == 20) { gObjCutsceneDone = TRUE; @@ -110,7 +118,7 @@ void bhv_star_spawn_loop(void) { if (o->oInteractStatus & INT_STATUS_INTERACTED) { obj_mark_for_deletion(o); - o->oInteractStatus = 0; + o->oInteractStatus = INT_STATUS_NONE; } break; } @@ -128,30 +136,28 @@ struct Object *spawn_star(struct Object *starObj, f32 x, f32 y, f32 z) { void spawn_default_star(f32 x, f32 y, f32 z) { struct Object *starObj = NULL; starObj = spawn_star(starObj, x, y, z); - starObj->oBehParams2ndByte = 0; + starObj->oBehParams2ndByte = SPAWN_STAR_ARC_CUTSCENE_BP_DEFAULT_STAR; } void spawn_red_coin_cutscene_star(f32 x, f32 y, f32 z) { struct Object *starObj = NULL; starObj = spawn_star(starObj, x, y, z); - starObj->oBehParams2ndByte = 1; + starObj->oBehParams2ndByte = SPAWN_STAR_ARC_CUTSCENE_BP_HIDDEN_STAR; } void spawn_no_exit_star(f32 x, f32 y, f32 z) { struct Object *starObj = NULL; starObj = spawn_star(starObj, x, y, z); - starObj->oBehParams2ndByte = 1; + starObj->oBehParams2ndByte = SPAWN_STAR_ARC_CUTSCENE_BP_HIDDEN_STAR; starObj->oInteractionSubtype |= INT_SUBTYPE_NO_EXIT; } void bhv_hidden_red_coin_star_init(void) { - s16 numRedCoinsRemaining; struct Object *starObj = NULL; - if (gCurrCourseNum != COURSE_JRB) { spawn_object(o, MODEL_TRANSPARENT_STAR, bhvRedCoinStarMarker); } - numRedCoinsRemaining = count_objects_with_behavior(bhvRedCoin); + s16 numRedCoinsRemaining = count_objects_with_behavior(bhvRedCoin); if (numRedCoinsRemaining == 0) { starObj = spawn_object_abs_with_rot(o, 0, MODEL_STAR, bhvStar, o->oPosX, o->oPosY, o->oPosZ, 0, 0, 0); starObj->oBehParams = o->oBehParams; @@ -164,12 +170,12 @@ void bhv_hidden_red_coin_star_init(void) { void bhv_hidden_red_coin_star_loop(void) { gRedCoinsCollected = o->oHiddenStarTriggerCounter; switch (o->oAction) { - case 0: - if (o->oHiddenStarTriggerCounter == 8) - o->oAction = 1; + case HIDDEN_STAR_ACT_INACTIVE: + if (o->oHiddenStarTriggerCounter == 8) { + o->oAction = HIDDEN_STAR_ACT_ACTIVE; + } break; - - case 1: + case HIDDEN_STAR_ACT_ACTIVE: if (o->oTimer > 2) { spawn_red_coin_cutscene_star(o->oPosX, o->oPosY, o->oPosZ); spawn_mist_particles(); From 02aa70559ae6152ef63b23793208f71c9cbb2d82 Mon Sep 17 00:00:00 2001 From: Fazana <52551480+FazanaJ@users.noreply.github.com> Date: Thu, 30 Sep 2021 23:04:43 +0100 Subject: [PATCH 70/97] Further make flag tweaks Performance go wheeee --- Makefile | 2 ++ src/engine/math_util.c | 26 +++++++++++++++++++++----- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 013a24ed..fb3a25c4 100644 --- a/Makefile +++ b/Makefile @@ -577,6 +577,8 @@ $(BUILD_DIR)/src/usb/usb.o: CFLAGS += -Wno-unused-variable -Wno-sign-compare -Wn $(BUILD_DIR)/src/usb/debug.o: OPT_FLAGS := -O0 $(BUILD_DIR)/src/usb/debug.o: CFLAGS += -Wno-unused-parameter -Wno-maybe-uninitialized $(BUILD_DIR)/src/audio/*.o: OPT_FLAGS := -Os -fno-jump-tables +$(BUILD_DIR)/src/engine/math_util.o: OPT_FLAGS := -Ofast -fno-unroll-loops -fno-peel-loops --param case-values-threshold=20 +$(BUILD_DIR)/src/game/rendering_graph_node.o: OPT_FLAGS := -Ofast -fno-unroll-loops -fno-peel-loops --param case-values-threshold=20 ALL_DIRS := $(BUILD_DIR) $(addprefix $(BUILD_DIR)/,$(SRC_DIRS) asm/debug $(GODDARD_SRC_DIRS) $(LIBZ_SRC_DIRS) $(ULTRA_BIN_DIRS) $(BIN_DIRS) $(TEXTURE_DIRS) $(TEXT_DIRS) $(SOUND_SAMPLE_DIRS) $(addprefix levels/,$(LEVEL_DIRS)) rsp include) $(YAY0_DIR) $(addprefix $(YAY0_DIR)/,$(VERSION)) $(SOUND_BIN_DIR) $(SOUND_BIN_DIR)/sequences/$(VERSION) diff --git a/src/engine/math_util.c b/src/engine/math_util.c index 4670ffcc..818a5184 100644 --- a/src/engine/math_util.c +++ b/src/engine/math_util.c @@ -57,13 +57,19 @@ f32 max_3f(f32 a0, f32 a1, f32 a2) { if (a1 > a0) a0 = a1; if (a2 > a0) a0 = a2; /// Copy vector 'src' to 'dest' void vec3f_copy(Vec3f dest, Vec3f src) { - ((u64 *) dest)[0] = ((u64 *) src)[0]; - ((u32 *) dest)[2] = ((u32 *) src)[2]; + register s32 x = ((u32 *) src)[0]; + register s32 y = ((u32 *) src)[1]; + register s32 z = ((u32 *) src)[2]; + ((u32 *) dest)[0] = x; + ((u32 *) dest)[1] = y; + ((u32 *) dest)[2] = z; } /// Set vector 'dest' to (x, y, z) -void vec3f_set(Vec3f dest, f32 x, f32 y, f32 z) { - vec3_set(dest, x, y, z); +inline void vec3f_set(Vec3f dest, f32 x, f32 y, f32 z) { + dest[0] = x; + dest[1] = y; + dest[2] = z; } /// Add vector 'a' to 'dest' @@ -82,7 +88,17 @@ void vec3f_add(Vec3f dest, Vec3f a) { /// Make 'dest' the sum of vectors a and b. void vec3f_sum(Vec3f dest, Vec3f a, Vec3f b) { - vec3_sum(dest, a, b); + register f32 *temp = dest; + register s32 j; + register f32 x,y; + for (j = 0; j < 3; j++) { + x = *a; + a++; + y = *b; + b++; + *temp = x+y; + temp++; + } } /// Copy vector src to dest From 3a3637723dc9fb5bd364936e7f0081bddd7589f2 Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Thu, 30 Sep 2021 15:07:18 -0700 Subject: [PATCH 71/97] macro_special_objects.c improvements --- include/macro_presets.h | 2 +- include/object_fields.h | 2 +- src/game/behaviors/bobomb.inc.c | 2 +- src/game/behaviors/fire_piranha_plant.inc.c | 2 +- src/game/behaviors/mr_blizzard.inc.c | 2 +- src/game/macro_special_objects.c | 196 +++++++------------- 6 files changed, 71 insertions(+), 135 deletions(-) diff --git a/include/macro_presets.h b/include/macro_presets.h index 2ad5c23c..817bb911 100644 --- a/include/macro_presets.h +++ b/include/macro_presets.h @@ -8,7 +8,7 @@ struct MacroPreset { /*0x00*/ const BehaviorScript *behavior; - /*0x04*/ s16 model; + /*0x04*/ ModelID16 model; /*0x06*/ s16 param; }; diff --git a/include/object_fields.h b/include/object_fields.h index d1a7f90d..0e8af879 100644 --- a/include/object_fields.h +++ b/include/object_fields.h @@ -167,7 +167,7 @@ #define /*0x19C*/ oDrawingDistance OBJECT_FIELD_F32(0x45) #define /*0x1A0*/ oRoom OBJECT_FIELD_S32(0x46) // 0x1A4 is unused, possibly related to 0x1A8 in removed macro purposes. -#define /*0x1A8*/ oUnk1A8 OBJECT_FIELD_U32(0x48) +#define /*0x1A8*/ oUnusedCoinParams OBJECT_FIELD_U32(0x48) // 0x1AC-0x1B2 (0x48-0x4A) are object specific and defined below the common fields. #define /*0x1B4*/ oWallAngle OBJECT_FIELD_S32(0x4B) #define /*0x1B8*/ oFloorType OBJECT_FIELD_S16(0x4C, 0) diff --git a/src/game/behaviors/bobomb.inc.c b/src/game/behaviors/bobomb.inc.c index ed84d283..a0a323cf 100644 --- a/src/game/behaviors/bobomb.inc.c +++ b/src/game/behaviors/bobomb.inc.c @@ -23,7 +23,7 @@ void bobomb_spawn_coin(void) { if (((o->oBehParams >> 8) & 0x1) == 0) { obj_spawn_yellow_coins(o, 1); o->oBehParams = 0x100; - set_object_respawn_info_bits(o, 1); + set_object_respawn_info_bits(o, RESPAWN_INFO_TYPE_32); } } diff --git a/src/game/behaviors/fire_piranha_plant.inc.c b/src/game/behaviors/fire_piranha_plant.inc.c index 4f9aedcf..9b077b29 100644 --- a/src/game/behaviors/fire_piranha_plant.inc.c +++ b/src/game/behaviors/fire_piranha_plant.inc.c @@ -65,7 +65,7 @@ static void fire_piranha_plant_act_hide(void) { } obj_die_if_health_non_positive(); - set_object_respawn_info_bits(o, 1); + set_object_respawn_info_bits(o, RESPAWN_INFO_TYPE_32); } } else if (sNumActiveFirePiranhaPlants < 2 && o->oTimer > 100 && o->oDistanceToMario > 100.0f && o->oDistanceToMario < 800.0f) { diff --git a/src/game/behaviors/mr_blizzard.inc.c b/src/game/behaviors/mr_blizzard.inc.c index 44c7cea8..d3fb4bb7 100644 --- a/src/game/behaviors/mr_blizzard.inc.c +++ b/src/game/behaviors/mr_blizzard.inc.c @@ -249,7 +249,7 @@ static void mr_blizzard_act_death(void) { o->oMrBlizzardScale = 0.0f; if (!(o->oBehParams & 0x0000FF00)) { obj_spawn_loot_yellow_coins(o, o->oNumLootCoins, 20.0f); - set_object_respawn_info_bits(o, 1); + set_object_respawn_info_bits(o, RESPAWN_INFO_TYPE_32); } } // Reset Mr. Blizzard if Mario leaves its radius. diff --git a/src/game/macro_special_objects.c b/src/game/macro_special_objects.c index f75e82ef..304b391b 100644 --- a/src/game/macro_special_objects.c +++ b/src/game/macro_special_objects.c @@ -16,25 +16,13 @@ * that can be used by in-game objects. */ s16 convert_rotation(s16 inRotation) { - u16 rotation = ((u16)(inRotation & 0xFF)); - rotation <<= 8; - - if (rotation == 0x3F00) { - rotation = 0x4000; + u16 rotation = ((u16)(inRotation & 0xFF) << 8); + switch (rotation) { + case 0x3F00: rotation = 0x4000; break; + case 0x7F00: rotation = 0x8000; break; + case 0xBF00: rotation = 0xC000; break; + case 0xFF00: rotation = 0x0000; break; } - - if (rotation == 0x7F00) { - rotation = 0x8000; - } - - if (rotation == 0xBF00) { - rotation = 0xC000; - } - - if (rotation == 0xFF00) { - rotation = 0x0000; - } - return (s16) rotation; } @@ -45,8 +33,8 @@ s16 convert_rotation(s16 inRotation) { */ void spawn_macro_abs_yrot_2params(s32 model, const BehaviorScript *behavior, s16 x, s16 y, s16 z, s16 ry, s16 params) { if (behavior != NULL) { - struct Object *newObj = spawn_object_abs_with_rot( - &gMacroObjectDefaultParent, 0, model, behavior, x, y, z, 0, convert_rotation(ry), 0); + struct Object *newObj = + spawn_object_abs_with_rot(&gMacroObjectDefaultParent, 0, model, behavior, x, y, z, 0, convert_rotation(ry), 0); newObj->oBehParams = ((u32) params) << 16; } } @@ -58,8 +46,8 @@ void spawn_macro_abs_yrot_2params(s32 model, const BehaviorScript *behavior, s16 */ void spawn_macro_abs_yrot_param1(s32 model, const BehaviorScript *behavior, s16 x, s16 y, s16 z, s16 ry, s16 param) { if (behavior != NULL) { - struct Object *newObj = spawn_object_abs_with_rot( - &gMacroObjectDefaultParent, 0, model, behavior, x, y, z, 0, convert_rotation(ry), 0); + struct Object *newObj = + spawn_object_abs_with_rot(&gMacroObjectDefaultParent, 0, model, behavior, x, y, z, 0, convert_rotation(ry), 0); newObj->oBehParams = ((u32) param) << 24; } } @@ -85,84 +73,64 @@ UNUSED static void spawn_macro_coin_unknown(const BehaviorScript *behavior, s16 obj = spawn_object_abs_with_rot(&gMacroObjectDefaultParent, 0, model, behavior, a1[1], a1[2], a1[3], 0, convert_rotation(a1[0]), 0); - obj->oUnk1A8 = a1[4]; + obj->oUnusedCoinParams = a1[4]; obj->oBehParams = (a1[4] & 0xFF) >> 16; } -struct LoadedPreset { - /*0x00*/ const BehaviorScript *behavior; - /*0x04*/ s16 param; // huh? why does the below function swap these.. just use the struct.. - /*0x06*/ ModelID16 model; -}; - -#define MACRO_OBJ_Y_ROT 0 -#define MACRO_OBJ_X 1 -#define MACRO_OBJ_Y 2 -#define MACRO_OBJ_Z 3 +#define MACRO_OBJ_Y_ROT 0 +#define MACRO_OBJ_X 1 +#define MACRO_OBJ_Y 2 +#define MACRO_OBJ_Z 3 #define MACRO_OBJ_PARAMS 4 void spawn_macro_objects(s32 areaIndex, s16 *macroObjList) { s32 presetID; - s16 macroObject[5]; // see the 5 #define statements above struct Object *newObj; - struct LoadedPreset preset; - - gMacroObjectDefaultParent.header.gfx.areaIndex = areaIndex; + s16 presetParams, macroParams; + gMacroObjectDefaultParent.header.gfx.areaIndex = areaIndex; gMacroObjectDefaultParent.header.gfx.activeAreaIndex = areaIndex; - while (TRUE) { - if (*macroObjList == -1) { // An encountered value of -1 means the list has ended. - break; - } - + if (*macroObjList == -1) break; // An encountered value of -1 means the list has ended. presetID = (*macroObjList & 0x1FF) - 31; // Preset identifier for MacroObjectPresets array - - if (presetID < 0) { - break; - } + if (presetID < 0) break; // Set macro object properties from the list - macroObject[MACRO_OBJ_Y_ROT] = ((*macroObjList++ >> 9) & 0x7F) << 1; // Y-Rotation - macroObject[MACRO_OBJ_X] = *macroObjList++; // X position - macroObject[MACRO_OBJ_Y] = *macroObjList++; // Y position - macroObject[MACRO_OBJ_Z] = *macroObjList++; // Z position - macroObject[MACRO_OBJ_PARAMS] = *macroObjList++; // Behavior params + macroObject[MACRO_OBJ_Y_ROT ] = ((*macroObjList++ >> 9) & 0x7F) << 1; // Y-Rotation + macroObject[MACRO_OBJ_X ] = *macroObjList++; // X position + macroObject[MACRO_OBJ_Y ] = *macroObjList++; // Y position + macroObject[MACRO_OBJ_Z ] = *macroObjList++; // Z position + macroObject[MACRO_OBJ_PARAMS] = *macroObjList++; // Behavior params // Get the preset values from the MacroObjectPresets list. - preset.model = MacroObjectPresets[presetID].model; - preset.behavior = MacroObjectPresets[presetID].behavior; - preset.param = MacroObjectPresets[presetID].param; + presetParams = MacroObjectPresets[presetID].param; + macroParams = macroObject[MACRO_OBJ_PARAMS]; - if (preset.param != 0) { - macroObject[MACRO_OBJ_PARAMS] = - (macroObject[MACRO_OBJ_PARAMS] & 0xFF00) + (preset.param & 0x00FF); + if (presetParams != 0) { + macroParams = (macroParams & 0xFF00) + (presetParams & 0x00FF); } // If object has been killed, prevent it from respawning - if (((macroObject[MACRO_OBJ_PARAMS] >> 8) & RESPAWN_INFO_DONT_RESPAWN) - != RESPAWN_INFO_DONT_RESPAWN) { + if (((macroParams >> 8) & RESPAWN_INFO_DONT_RESPAWN) != RESPAWN_INFO_DONT_RESPAWN) { // Spawn the new macro object. - newObj = - spawn_object_abs_with_rot(&gMacroObjectDefaultParent, // Parent object - 0, // Unused - preset.model, // Model ID - preset.behavior, // Behavior address - macroObject[MACRO_OBJ_X], // X-position - macroObject[MACRO_OBJ_Y], // Y-position - macroObject[MACRO_OBJ_Z], // Z-position - 0, // X-rotation - convert_rotation(macroObject[MACRO_OBJ_Y_ROT]), // Y-rotation - 0 // Z-rotation + newObj = spawn_object_abs_with_rot(&gMacroObjectDefaultParent, // Parent object + 0, // Unused + MacroObjectPresets[presetID].model, // Model ID + MacroObjectPresets[presetID].behavior, // Behavior address + macroObject[MACRO_OBJ_X], // X-position + macroObject[MACRO_OBJ_Y], // Y-position + macroObject[MACRO_OBJ_Z], // Z-position + 0, // X-rotation + convert_rotation(macroObject[MACRO_OBJ_Y_ROT]), // Y-rotation + 0 // Z-rotation ); - - newObj->oUnk1A8 = macroObject[MACRO_OBJ_PARAMS]; - newObj->oBehParams = ((macroObject[MACRO_OBJ_PARAMS] & 0x00FF) << 16) - + (macroObject[MACRO_OBJ_PARAMS] & 0xFF00); - newObj->oBehParams2ndByte = macroObject[MACRO_OBJ_PARAMS] & 0x00FF; - newObj->respawnInfoType = RESPAWN_INFO_TYPE_16; - newObj->respawnInfo = macroObjList - 1; - newObj->parentObj = newObj; + newObj->oUnusedCoinParams = macroParams; + newObj->oBehParams = ((macroParams & 0x00FF) << 16) + + (macroParams & 0xFF00); + newObj->oBehParams2ndByte = macroParams & 0x00FF; + newObj->respawnInfoType = RESPAWN_INFO_TYPE_16; + newObj->respawnInfo = (macroObjList - 1); + newObj->parentObj = newObj; } } } @@ -170,11 +138,9 @@ void spawn_macro_objects(s32 areaIndex, s16 *macroObjList) { void spawn_macro_objects_hardcoded(s32 areaIndex, s16 *macroObjList) { // This version of macroObjList has the preset and Y-Rotation separated, // and lacks behavior params. Might be an early version of the macro object list? - s16 macroObjX; - s16 macroObjY; - s16 macroObjZ; + Vec3s pos; s16 macroObjPreset; - s16 macroObjRY; // Y Rotation + s16 yaw; gMacroObjectDefaultParent.header.gfx.areaIndex = areaIndex; gMacroObjectDefaultParent.header.gfx.activeAreaIndex = areaIndex; @@ -186,56 +152,30 @@ void spawn_macro_objects_hardcoded(s32 areaIndex, s16 *macroObjList) { break; } - macroObjX = *macroObjList++; - macroObjY = *macroObjList++; - macroObjZ = *macroObjList++; - macroObjRY = *macroObjList++; + pos[0] = *macroObjList++; + pos[1] = *macroObjList++; + pos[2] = *macroObjList++; + yaw = *macroObjList++; // Spawn objects based on hardcoded presets, and most seem to be for Big Boo's Haunt. // However, BBH doesn't use this function so this might just be an early test? switch (macroObjPreset) { - case 0: - spawn_macro_abs_yrot_2params(MODEL_NONE, bhvBooStaircase, macroObjX, macroObjY, - macroObjZ, macroObjRY, 0); - break; - case 1: - spawn_macro_abs_yrot_2params(MODEL_BBH_TILTING_FLOOR_PLATFORM, - bhvBbhTiltingTrapPlatform, macroObjX, macroObjY, macroObjZ, - macroObjRY, 0); - break; - case 2: - spawn_macro_abs_yrot_2params(MODEL_BBH_TUMBLING_PLATFORM, bhvBbhTumblingBridge, - macroObjX, macroObjY, macroObjZ, macroObjRY, 0); - break; - case 3: - spawn_macro_abs_yrot_2params(MODEL_BBH_MOVING_BOOKSHELF, bhvHauntedBookshelf, macroObjX, - macroObjY, macroObjZ, macroObjRY, 0); - break; - case 4: - spawn_macro_abs_yrot_2params(MODEL_BBH_MESH_ELEVATOR, bhvMeshElevator, macroObjX, - macroObjY, macroObjZ, macroObjRY, 0); - break; - case 20: - spawn_macro_abs_yrot_2params(MODEL_YELLOW_COIN, bhvYellowCoin, macroObjX, macroObjY, - macroObjZ, macroObjRY, 0); - break; - case 21: - spawn_macro_abs_yrot_2params(MODEL_YELLOW_COIN, bhvYellowCoin, macroObjX, macroObjY, - macroObjZ, macroObjRY, 0); - break; - default: - break; + case 0: spawn_macro_abs_yrot_2params(MODEL_NONE, bhvBooStaircase, pos[0], pos[1], pos[2], yaw, 0); break; + case 1: spawn_macro_abs_yrot_2params(MODEL_BBH_TILTING_FLOOR_PLATFORM, bhvBbhTiltingTrapPlatform, pos[0], pos[1], pos[2], yaw, 0); break; + case 2: spawn_macro_abs_yrot_2params(MODEL_BBH_TUMBLING_PLATFORM, bhvBbhTumblingBridge, pos[0], pos[1], pos[2], yaw, 0); break; + case 3: spawn_macro_abs_yrot_2params(MODEL_BBH_MOVING_BOOKSHELF, bhvHauntedBookshelf, pos[0], pos[1], pos[2], yaw, 0); break; + case 4: spawn_macro_abs_yrot_2params(MODEL_BBH_MESH_ELEVATOR, bhvMeshElevator, pos[0], pos[1], pos[2], yaw, 0); break; + case 20: spawn_macro_abs_yrot_2params(MODEL_YELLOW_COIN, bhvYellowCoin, pos[0], pos[1], pos[2], yaw, 0); break; + case 21: spawn_macro_abs_yrot_2params(MODEL_YELLOW_COIN, bhvYellowCoin, pos[0], pos[1], pos[2], yaw, 0); break; + default: break; } } } void spawn_special_objects(s32 areaIndex, TerrainData **specialObjList) { - s32 numOfSpecialObjects; s32 i; s32 offset; - s16 x; - s16 y; - s16 z; + s16 x, y, z; s16 extraParams[4]; ModelID16 model; u8 type; @@ -243,7 +183,7 @@ void spawn_special_objects(s32 areaIndex, TerrainData **specialObjList) { u8 defaultParam; const BehaviorScript *behavior; - numOfSpecialObjects = **specialObjList; + s32 numOfSpecialObjects = **specialObjList; (*specialObjList)++; gMacroObjectDefaultParent.header.gfx.areaIndex = areaIndex; @@ -289,14 +229,11 @@ void spawn_special_objects(s32 areaIndex, TerrainData **specialObjList) { spawn_macro_abs_yrot_2params(model, behavior, x, y, z, extraParams[0], extraParams[1]); break; case SPTYPE_UNKNOWN: - extraParams[0] = - **specialObjList; // Unknown, gets put into obj->oMacroUnk108 as a float + extraParams[0] = **specialObjList; // Unknown, gets put into obj->oMacroUnk108 as a float (*specialObjList)++; - extraParams[1] = - **specialObjList; // Unknown, gets put into obj->oMacroUnk10C as a float + extraParams[1] = **specialObjList; // Unknown, gets put into obj->oMacroUnk10C as a float (*specialObjList)++; - extraParams[2] = - **specialObjList; // Unknown, gets put into obj->oMacroUnk110 as a float + extraParams[2] = **specialObjList; // Unknown, gets put into obj->oMacroUnk110 as a float (*specialObjList)++; spawn_macro_abs_special(model, behavior, x, y, z, extraParams[0], extraParams[1], extraParams[2]); @@ -315,12 +252,11 @@ void spawn_special_objects(s32 areaIndex, TerrainData **specialObjList) { #ifdef NO_SEGMENTED_MEMORY u32 get_special_objects_size(s16 *data) { s16 *startPos = data; - s32 numOfSpecialObjects; s32 i; u8 presetID; s32 offset; - numOfSpecialObjects = *data++; + s32 numOfSpecialObjects = *data++; for (i = 0; i < numOfSpecialObjects; i++) { presetID = (u8) *data++; From ff43340b0bd7c28f7a9cb952d804bdc0952ed83b Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Thu, 30 Sep 2021 15:09:01 -0700 Subject: [PATCH 72/97] Configurable number of segments for Chain Chomp, Pokey, and Wiggler --- include/config.h | 8 ++ include/object_constants.h | 2 +- src/game/behaviors/chain_chomp.inc.c | 126 ++++++++------------------- src/game/behaviors/pokey.inc.c | 38 ++++---- src/game/behaviors/wiggler.inc.c | 80 +++++++---------- src/game/object_helpers.c | 9 +- src/game/object_helpers.h | 8 +- 7 files changed, 95 insertions(+), 176 deletions(-) diff --git a/include/config.h b/include/config.h index 99adb2e6..93afe862 100644 --- a/include/config.h +++ b/include/config.h @@ -123,6 +123,14 @@ // -- SPECIFIC OBJECT SETTINGS -- // Allow for retries on collecting the remaining blue coins from a blue coin switch #define BLUE_COIN_SWITCH_RETRY +// The number of chain balls the Chain Chomp has. Vanilla is 5. +#define CHAIN_CHOMP_NUM_SEGMENTS 5 + +// The number of parts Pokey has, including the head. Vanilla is 5, max is 30. +#define POKEY_NUM_SEGMENTS 5 + +// The number of segments Wiggler has, not including the head. Vanilla is 4. +#define WIGGLER_NUM_SEGMENTS 4 // -- CUTSCENE SKIPS -- // Skip peach letter cutscene diff --git a/include/object_constants.h b/include/object_constants.h index 8bfe26dc..a80e5981 100644 --- a/include/object_constants.h +++ b/include/object_constants.h @@ -1282,7 +1282,7 @@ /* Pokey Body Part */ /* oBehParams2ndByte */ #define POKEY_PART_BP_HEAD 0x0 - #define POKEY_PART_BP_LOWEST POKEY_NUM_PARTS-0x1 + #define POKEY_PART_BP_LOWEST (POKEY_NUM_SEGMENTS - 0x1) /* Swoop */ /* oAction */ diff --git a/src/game/behaviors/chain_chomp.inc.c b/src/game/behaviors/chain_chomp.inc.c index 609ec508..48468d78 100644 --- a/src/game/behaviors/chain_chomp.inc.c +++ b/src/game/behaviors/chain_chomp.inc.c @@ -32,11 +32,8 @@ void bhv_chain_chomp_chain_part_update(void) { obj_mark_for_deletion(o); } else if (o->oBehParams2ndByte != CHAIN_CHOMP_CHAIN_PART_BP_PIVOT) { struct ChainSegment *segment = &o->parentObj->oChainChompSegments[o->oBehParams2ndByte]; - // Set position relative to the pivot - o->oPosX = o->parentObj->parentObj->oPosX + segment->posX; - o->oPosY = o->parentObj->parentObj->oPosY + segment->posY; - o->oPosZ = o->parentObj->parentObj->oPosZ + segment->posZ; + vec3_sum(&o->oPosVec, &o->parentObj->parentObj->oPosVec, segment->pos); } else if (o->parentObj->oChainChompReleaseStatus != CHAIN_CHOMP_NOT_RELEASED) { cur_obj_update_floor_and_walls(); cur_obj_move_standard(78); @@ -51,14 +48,14 @@ static void chain_chomp_act_uninitialized(void) { s32 i; if (o->oDistanceToMario < 3000.0f) { - segments = mem_pool_alloc(gObjectMemoryPool, 5 * sizeof(struct ChainSegment)); + segments = mem_pool_alloc(gObjectMemoryPool, CHAIN_CHOMP_NUM_SEGMENTS * sizeof(struct ChainSegment)); if (segments != NULL) { // Each segment represents the offset of a chain part to the pivot. // Segment 0 connects the pivot to the chain chomp itself. Segment // 1 connects the pivot to the chain part next to the chain chomp // (chain part 1), etc. o->oChainChompSegments = segments; - for (i = 0; i <= 4; i++) { + for (i = 0; i < CHAIN_CHOMP_NUM_SEGMENTS; i++) { chain_segment_init(&segments[i]); } @@ -70,7 +67,7 @@ static void chain_chomp_act_uninitialized(void) { != NULL) { // Spawn the non-pivot chain parts, starting from the chain // chomp and moving toward the pivot - for (i = 1; i <= 4; i++) { + for (i = 1; i < CHAIN_CHOMP_NUM_SEGMENTS; i++) { spawn_object_relative(i, 0, 0, 0, o, MODEL_METALLIC_BALL, bhvChainChompChainPart); } @@ -86,69 +83,31 @@ static void chain_chomp_act_uninitialized(void) { * part as well as from the pivot. */ static void chain_chomp_update_chain_segments(void) { - struct ChainSegment *prevSegment; - struct ChainSegment *segment; - f32 offsetX; - f32 offsetY; - f32 offsetZ; - f32 offset; - f32 segmentVelY; - f32 maxTotalOffset; - s32 i; - - if (o->oVelY < 0.0f) { - segmentVelY = o->oVelY; - } else { - segmentVelY = -20.0f; - } - // Segment 0 connects the pivot to the chain chomp itself, and segment i>0 // connects the pivot to chain part i (1 is closest to the chain chomp). - - for (i = 1; i <= 4; i++) { - prevSegment = &o->oChainChompSegments[i - 1]; - segment = &o->oChainChompSegments[i]; + s32 i; + for (i = 1; i < CHAIN_CHOMP_NUM_SEGMENTS; i++) { + struct ChainSegment *prevSegment = &o->oChainChompSegments[i - 1]; + struct ChainSegment *segment = &o->oChainChompSegments[i]; // Apply gravity - - if ((segment->posY += segmentVelY) < 0.0f) { - segment->posY = 0.0f; + f32 segmentVelY = ((o->oVelY < 0.0f) ? o->oVelY : -20.0f); + segment->pos[1] += segmentVelY; + if (segment->pos[1] < 0.0f) { + segment->pos[1] = 0.0f; } - // Cap distance to previous chain part (so that the tail follows the - // chomp) + // Cap distance to previous chain part (so that the tail follows the chomp) + Vec3f offset; + vec3_diff(offset, segment->pos, prevSegment->pos); + vec3_normalize_max(offset, o->oChainChompMaxDistBetweenChainParts); - offsetX = segment->posX - prevSegment->posX; - offsetY = segment->posY - prevSegment->posY; - offsetZ = segment->posZ - prevSegment->posZ; - offset = sqrtf(offsetX * offsetX + offsetY * offsetY + offsetZ * offsetZ); + // Cap distance to pivot (so that it stretches when the chomp moves far from the wooden post) + vec3_add(offset, prevSegment->pos); + f32 maxTotalDist = o->oChainChompMaxDistFromPivotPerChainPart * (CHAIN_CHOMP_NUM_SEGMENTS - i); + vec3_normalize_max(offset, maxTotalDist); - if (offset > o->oChainChompMaxDistBetweenChainParts) { - offset = o->oChainChompMaxDistBetweenChainParts / offset; - offsetX *= offset; - offsetY *= offset; - offsetZ *= offset; - } - - // Cap distance to pivot (so that it stretches when the chomp moves far - // from the wooden post) - - offsetX += prevSegment->posX; - offsetY += prevSegment->posY; - offsetZ += prevSegment->posZ; - offset = sqrtf(offsetX * offsetX + offsetY * offsetY + offsetZ * offsetZ); - - maxTotalOffset = o->oChainChompMaxDistFromPivotPerChainPart * (5 - i); - if (offset > maxTotalOffset) { - offset = maxTotalOffset / offset; - offsetX *= offset; - offsetY *= offset; - offsetZ *= offset; - } - - segment->posX = offsetX; - segment->posY = offsetY; - segment->posZ = offsetZ; + vec3_copy(segment->pos, offset); } } @@ -157,7 +116,8 @@ static void chain_chomp_update_chain_segments(void) { * distance between chain parts. Restore these values to normal. */ static void chain_chomp_restore_normal_chain_lengths(void) { - approach_f32_ptr(&o->oChainChompMaxDistFromPivotPerChainPart, 750.0f / 5, 4.0f); + // approach_f32_ptr(&o->oChainChompMaxDistFromPivotPerChainPart, 750.0f / CHAIN_CHOMP_NUM_SEGMENTS, 4.0f); + approach_f32_ptr(&o->oChainChompMaxDistFromPivotPerChainPart, 150.0f, 4.0f); o->oChainChompMaxDistBetweenChainParts = o->oChainChompMaxDistFromPivotPerChainPart; } @@ -182,8 +142,8 @@ static void chain_chomp_sub_act_turn(void) { cur_obj_play_sound_2(SOUND_GENERAL_CHAIN_CHOMP2); o->oSubAction = CHAIN_CHOMP_SUB_ACT_LUNGE; - o->oChainChompMaxDistFromPivotPerChainPart = 900.0f / 5; - + // o->oChainChompMaxDistFromPivotPerChainPart = 900.0f / CHAIN_CHOMP_NUM_SEGMENTS; + o->oChainChompMaxDistFromPivotPerChainPart = 180.0f; o->oForwardVel = 140.0f; o->oVelY = 20.0f; o->oGravity = 0.0f; @@ -227,8 +187,7 @@ static void chain_chomp_sub_act_lunge(void) { o->oTimer = 0; } else { // Turn toward pivot - cur_obj_rotate_yaw_toward(atan2s(o->oChainChompSegments[0].posZ, o->oChainChompSegments[0].posX), - 0x1000); + cur_obj_rotate_yaw_toward(atan2s(o->oChainChompSegments[0].pos[2], o->oChainChompSegments[0].pos[0]), 0x1000); if (o->oChainChompSignedMaxDistBetweenChainParts != 0.0f) { approach_f32_ptr(&o->oChainChompSignedMaxDistBetweenChainParts, 0.0f, 0.8f); @@ -392,40 +351,27 @@ static void chain_chomp_act_move(void) { 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; + vec3_diff(o->oChainChompSegments[0].pos, &o->oPosVec, &o->parentObj->oPosVec); - 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); + o->oChainChompDistToPivot = vec3_mag(o->oChainChompSegments[0].pos); // If the chain is fully stretched - maxDistToPivot = o->oChainChompMaxDistFromPivotPerChainPart * 5; + maxDistToPivot = o->oChainChompMaxDistFromPivotPerChainPart * CHAIN_CHOMP_NUM_SEGMENTS; 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; + vec3_mul_val(o->oChainChompSegments[0].pos, 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; - + vec3_sum(&o->oPosVec, &o->parentObj->oPosVec, o->oChainChompSegments[0].pos); 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; + vec3_diff(&o->parentObj->oPosVec, &o->oPosVec, o->oChainChompSegments[0].pos); o->parentObj->oVelY = o->parentObj->oPosY - oldPivotY; - o->parentObj->oPosZ = o->oPosZ - o->oChainChompSegments[0].posZ; } } else { o->oChainChompRestrictedByChain = FALSE; @@ -436,7 +382,8 @@ static void chain_chomp_act_move(void) { // 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->oChainChompMaxDistFromPivotPerChainPart = 900.0f / CHAIN_CHOMP_NUM_SEGMENTS; + o->oChainChompMaxDistFromPivotPerChainPart = 180.0f; // ((CHAIN_CHOMP_NUM_SEGMENTS * 180.0f) / CHAIN_CHOMP_NUM_SEGMENTS); o->oForwardVel = 0.0f; o->oVelY = 300.0f; o->oGravity = -4.0f; @@ -491,8 +438,7 @@ void bhv_wooden_post_update(void) { // Stay still until mario is done ground pounding o->oWoodenPostMarioPounding = cur_obj_is_mario_ground_pounding_platform(); } else if ((o->oWoodenPostOffsetY += o->oWoodenPostSpeedY) < -190.0f) { - // Once pounded, if this is the chain chomp's post, release the chain - // chomp + // Once pounded, if this is the chain chomp's post, release the chain chomp o->oWoodenPostOffsetY = -190.0f; if (o->parentObj != o) { play_puzzle_jingle(); @@ -512,7 +458,7 @@ void bhv_wooden_post_update(void) { o->oWoodenPostTotalMarioAngle += (s16)(o->oAngleToMario - o->oWoodenPostPrevAngleToMario); if (ABSI(o->oWoodenPostTotalMarioAngle) > 0x30000 && o->oTimer < 200) { obj_spawn_loot_yellow_coins(o, 5, 20.0f); - set_object_respawn_info_bits(o, 1); + set_object_respawn_info_bits(o, RESPAWN_INFO_TYPE_32); } } diff --git a/src/game/behaviors/pokey.inc.c b/src/game/behaviors/pokey.inc.c index fc29ff56..346beea6 100644 --- a/src/game/behaviors/pokey.inc.c +++ b/src/game/behaviors/pokey.inc.c @@ -36,15 +36,12 @@ static u8 sPokeyBodyPartAttackHandlers[] = { /** * Update function for pokey body part. - * The behavior parameter is the body part's index from 0 to 4, with 0 at the - * top. + * The behavior parameter is the body part's index from POKEY_PART_BP_HEAD to POKEY_PART_BP_LOWEST, + * with POKEY_PART_BP_HEAD at the top. */ void bhv_pokey_body_part_update(void) { // PARTIAL_UPDATE - s16 offsetAngle; - f32 baseHeight; - if (obj_update_standard_actions(3.0f)) { if (o->parentObj->oAction == POKEY_ACT_UNLOAD_PARTS) { obj_mark_for_deletion(o); @@ -79,12 +76,12 @@ void bhv_pokey_body_part_update(void) { } //! Pausing causes jumps in offset angle - offsetAngle = o->oBehParams2ndByte * 0x4000 + gGlobalTimer * 0x800; + s16 offsetAngle = o->oBehParams2ndByte * 0x4000 + gGlobalTimer * 0x800; o->oPosX = o->parentObj->oPosX + coss(offsetAngle) * 6.0f; o->oPosZ = o->parentObj->oPosZ + sins(offsetAngle) * 6.0f; // This is the height of the tower beneath the body part - baseHeight = o->parentObj->oPosY + f32 baseHeight = o->parentObj->oPosY + (120 * (o->parentObj->oPokeyNumAliveBodyParts - o->oBehParams2ndByte) - 240) + 120.0f * o->parentObj->oPokeyBottomBodyPartSize; @@ -96,18 +93,14 @@ void bhv_pokey_body_part_update(void) { } // Only the head has loot coins - if (o->oBehParams2ndByte == 0) { - o->oNumLootCoins = 1; - } else { - o->oNumLootCoins = 0; - } + o->oNumLootCoins = (o->oBehParams2ndByte == POKEY_PART_BP_HEAD); // If the body part was attacked, then die. If the head was killed, // then die after a delay. if (obj_handle_attacks(&sPokeyBodyPartHitbox, o->oAction, sPokeyBodyPartAttackHandlers)) { o->parentObj->oPokeyNumAliveBodyParts--; - if (o->oBehParams2ndByte == 0) { + if (o->oBehParams2ndByte == POKEY_PART_BP_HEAD) { o->parentObj->oPokeyHeadWasKilled = TRUE; // Last minute change to blue coins - not sure why they didn't // just set it to -1 above @@ -140,20 +133,19 @@ void bhv_pokey_body_part_update(void) { } /** - * When mario gets within range, spawn the 5 body parts and enter the wander - * action. + * When mario gets within range, spawn the POKEY_NUM_SEGMENTS body parts and enter the wander action. */ static void pokey_act_uninitialized(void) { struct Object *bodyPart; s32 i; s16 partModel; - if (o->oDistanceToMario < 2000.0f) { + if (o->oDistanceToMario < 4000.0f) { partModel = MODEL_POKEY_HEAD; - for (i = 0; i < 5; i++) { + for (i = 0; i < POKEY_NUM_SEGMENTS; i++) { // Spawn body parts at y offsets 480, 360, 240, 120, 0 - // behavior param 0 = head, 4 = lowest body part + // behavior param POKEY_PART_BP_HEAD = head, POKEY_PART_BP_LOWEST = lowest body part bodyPart = spawn_object_relative(i, 0, -i * 120 + 480, 0, o, partModel, bhvPokeyBodyPart); if (bodyPart != NULL) { @@ -163,8 +155,8 @@ static void pokey_act_uninitialized(void) { partModel = MODEL_POKEY_BODY_PART; } - o->oPokeyAliveBodyPartFlags = 0x1F; - o->oPokeyNumAliveBodyParts = 5; + o->oPokeyAliveBodyPartFlags = BITMASK(POKEY_NUM_SEGMENTS); + o->oPokeyNumAliveBodyParts = POKEY_NUM_SEGMENTS; o->oPokeyBottomBodyPartSize = 1.0f; o->oAction = POKEY_ACT_WANDER; } @@ -180,9 +172,9 @@ static void pokey_act_wander(void) { s32 targetAngleOffset; struct Object *bodyPart; - if (o->oPokeyNumAliveBodyParts == 0) { + if (o->oPokeyNumAliveBodyParts == POKEY_PART_BP_HEAD) { obj_mark_for_deletion(o); - } else if (o->oDistanceToMario > 2500.0f) { + } else if (o->oDistanceToMario > 4500.0f) { o->oAction = POKEY_ACT_UNLOAD_PARTS; o->oForwardVel = 0.0f; } else { @@ -195,7 +187,7 @@ static void pokey_act_wander(void) { o->oForwardVel = 5.0f; // If a body part is missing, replenish it after 100 frames - if (o->oPokeyNumAliveBodyParts < 5) { + if (o->oPokeyNumAliveBodyParts < POKEY_NUM_SEGMENTS) { if (o->oTimer > 100) { // Because the body parts shift index whenever a body part // is killed, the new part's index is equal to the number diff --git a/src/game/behaviors/wiggler.inc.c b/src/game/behaviors/wiggler.inc.c index 410297ec..98e7d2d0 100644 --- a/src/game/behaviors/wiggler.inc.c +++ b/src/game/behaviors/wiggler.inc.c @@ -62,28 +62,23 @@ static f32 sWigglerSpeeds[] = { 2.0f, 40.0f, 30.0f, 16.0f }; * attack. */ void bhv_wiggler_body_part_update(void) { - f32 dx; - f32 dy; - f32 dz; + Vec3f d; f32 dxz; struct ChainSegment *segment = &o->parentObj->oWigglerSegments[o->oBehParams2ndByte]; f32 posOffset; cur_obj_scale(o->parentObj->header.gfx.scale[0]); - o->oFaceAnglePitch = segment->pitch; - o->oFaceAngleYaw = segment->yaw; + o->oFaceAnglePitch = segment->angle[0]; + o->oFaceAngleYaw = segment->angle[1]; // TODO: What is this for? posOffset = -37.5f * o->header.gfx.scale[0]; - dy = posOffset * coss(o->oFaceAnglePitch) - posOffset; + d[1] = posOffset * coss(o->oFaceAnglePitch) - posOffset; dxz = posOffset * sins(o->oFaceAnglePitch); - dx = dxz * sins(o->oFaceAngleYaw); - dz = dxz * coss(o->oFaceAngleYaw); - - o->oPosX = segment->posX + dx; - o->oPosY = segment->posY + dy; - o->oPosZ = segment->posZ + dz; + d[0] = dxz * sins(o->oFaceAngleYaw); + d[2] = dxz * coss(o->oFaceAngleYaw); + vec3_sum(&o->oPosVec, segment->pos, d); if (o->oPosY < o->parentObj->oWigglerFallThroughFloorsHeight) { //! Since position is recomputed each frame, tilting the wiggler up @@ -91,13 +86,12 @@ void bhv_wiggler_body_part_update(void) { // the floor o->oPosY += -30.0f; cur_obj_update_floor_height(); - if (o->oFloorHeight > o->oPosY) // TODO: Check ineq swap - { + if (o->oFloorHeight > o->oPosY) { // TODO: Check ineq swap o->oPosY = o->oFloorHeight; } } - segment->posY = o->oPosY; + segment->pos[1] = o->oPosY; // Inherit walking animation speed from wiggler cur_obj_init_animation_with_accel_and_sound(0, o->parentObj->oWigglerWalkAnimSpeed); @@ -120,27 +114,23 @@ void wiggler_init_segments(void) { struct ChainSegment *segments; struct Object *bodyPart; - segments = mem_pool_alloc(gObjectMemoryPool, 4 * sizeof(struct ChainSegment)); + segments = mem_pool_alloc(gObjectMemoryPool, WIGGLER_NUM_SEGMENTS * sizeof(struct ChainSegment)); if (segments != NULL) { // Each segment represents the global position and orientation of each // object. Segment 0 represents the wiggler's head, and segment i>0 // represents body part i. o->oWigglerSegments = segments; - for (i = 0; i <= 3; i++) { + for (i = 0; i < WIGGLER_NUM_SEGMENTS; i++) { chain_segment_init(segments + i); - - (segments + i)->posX = o->oPosX; - (segments + i)->posY = o->oPosY; - (segments + i)->posZ = o->oPosZ; - - (segments + i)->pitch = o->oFaceAnglePitch; - (segments + i)->yaw = o->oFaceAngleYaw; + vec3_copy((segments + i)->pos, &o->oPosVec); + (segments + i)->angle[0] = o->oFaceAnglePitch; + (segments + i)->angle[1] = o->oFaceAngleYaw; } o->header.gfx.animInfo.animFrame = -1; // Spawn each body part - for (i = 1; i <= 3; i++) { + for (i = 1; i < WIGGLER_NUM_SEGMENTS; i++) { bodyPart = spawn_object_relative(i, 0, 0, 0, o, MODEL_WIGGLER_BODY, bhvWigglerBody); if (bodyPart != NULL) { @@ -166,9 +156,7 @@ void wiggler_init_segments(void) { void wiggler_update_segments(void) { struct ChainSegment *prevBodyPart; struct ChainSegment *bodyPart; - f32 dx; - f32 dy; - f32 dz; + Vec3f d; s16 dpitch; s16 dyaw; f32 dxz; @@ -177,33 +165,31 @@ void wiggler_init_segments(void) { segmentLength = 35.0f * o->header.gfx.scale[0]; - for (i = 1; i <= 3; i++) { + for (i = 1; i < WIGGLER_NUM_SEGMENTS; i++) { prevBodyPart = &o->oWigglerSegments[i - 1]; bodyPart = &o->oWigglerSegments[i]; - dx = bodyPart->posX - prevBodyPart->posX; - dy = bodyPart->posY - prevBodyPart->posY; - dz = bodyPart->posZ - prevBodyPart->posZ; + vec3_diff(d, bodyPart->pos, prevBodyPart->pos); // As the head turns, propagate this rotation backward if the difference // is more than 45 degrees - dyaw = atan2s(-dz, -dx) - prevBodyPart->yaw; + dyaw = atan2s(-d[2], -d[0]) - prevBodyPart->angle[1]; clamp_s16(&dyaw, -0x2000, 0x2000); - bodyPart->yaw = prevBodyPart->yaw + dyaw; + bodyPart->angle[1] = prevBodyPart->angle[1] + dyaw; // As the head tilts, propagate the tilt backward - dxz = sqrtf(sqr(dx) + sqr(dz)); - dpitch = atan2s(dxz, dy) - prevBodyPart->pitch; + dxz = sqrtf(sqr(d[0]) + sqr(d[2])); + dpitch = atan2s(dxz, d[1]) - prevBodyPart->angle[0]; clamp_s16(&dpitch, -0x2000, 0x2000); - bodyPart->pitch = prevBodyPart->pitch + dpitch; + bodyPart->angle[0] = prevBodyPart->angle[0] + dpitch; // Set the body part's position relative to the previous body part's // position, using the current body part's angles. This means that the // head can rotate up to 45 degrees without the body moving - bodyPart->posY = segmentLength * sins(bodyPart->pitch) + prevBodyPart->posY; - dxz = segmentLength * coss(bodyPart->pitch); - bodyPart->posX = prevBodyPart->posX - dxz * sins(bodyPart->yaw); - bodyPart->posZ = prevBodyPart->posZ - dxz * coss(bodyPart->yaw); + bodyPart->pos[1] = segmentLength * sins(bodyPart->angle[0]) + prevBodyPart->pos[1]; + dxz = segmentLength * coss(bodyPart->angle[0]); + bodyPart->pos[0] = prevBodyPart->pos[0] - dxz * sins(bodyPart->angle[1]); + bodyPart->pos[2] = prevBodyPart->pos[2] - dxz * coss(bodyPart->angle[1]); } } @@ -213,8 +199,6 @@ void wiggler_init_segments(void) { * If attacked by mario, enter either the jumped on or knockback action. */ static void wiggler_act_walk(void) { - s16 yawTurnSpeed; - o->oWigglerWalkAnimSpeed = 0.06f * o->oForwardVel; // Update text if necessary @@ -260,7 +244,7 @@ static void wiggler_act_walk(void) { // If moving at high speeds, could overflow. But can't reach such speeds // in practice - yawTurnSpeed = (s16)(30.0f * o->oForwardVel); + s16 yawTurnSpeed = (s16)(30.0f * o->oForwardVel); cur_obj_rotate_yaw_toward(o->oWigglerTargetYaw, yawTurnSpeed); obj_face_yaw_approach(o->oMoveAngleYaw, 2 * yawTurnSpeed); @@ -437,11 +421,9 @@ void bhv_wiggler_update(void) { } // Update segment 0 with data from the wiggler object - o->oWigglerSegments[0].posX = o->oPosX; - o->oWigglerSegments[0].posY = o->oPosY; - o->oWigglerSegments[0].posZ = o->oPosZ; - o->oWigglerSegments[0].pitch = o->oFaceAnglePitch; - o->oWigglerSegments[0].yaw = o->oFaceAngleYaw; + vec3_copy(o->oWigglerSegments[0].pos, &o->oPosVec); + o->oWigglerSegments[0].angle[0] = o->oFaceAnglePitch; + o->oWigglerSegments[0].angle[1] = o->oFaceAngleYaw; // Update the rest of the segments to follow segment 0 wiggler_update_segments(); diff --git a/src/game/object_helpers.c b/src/game/object_helpers.c index e1d9040d..78b046c5 100644 --- a/src/game/object_helpers.c +++ b/src/game/object_helpers.c @@ -1717,13 +1717,8 @@ s32 cur_obj_follow_path(UNUSED s32 unusedArg) { } void chain_segment_init(struct ChainSegment *segment) { - segment->posX = 0.0f; - segment->posY = 0.0f; - segment->posZ = 0.0f; - - segment->pitch = 0; - segment->yaw = 0; - segment->roll = 0; + vec3_zero(segment->pos); + vec3_zero(segment->angle); } f32 random_f32_around_zero(f32 diameter) { diff --git a/src/game/object_helpers.h b/src/game/object_helpers.h index ca2a42c4..b1fc1ea3 100644 --- a/src/game/object_helpers.h +++ b/src/game/object_helpers.h @@ -9,12 +9,8 @@ // used for chain chomp and wiggler struct ChainSegment { - f32 posX; - f32 posY; - f32 posZ; - s16 pitch; - s16 yaw; - s16 roll; + Vec3f pos; + Vec3s angle; }; #define WATER_DROPLET_FLAG_RAND_ANGLE (1 << 1) // 0x02 From 50941e0559d484d3a1de76430ceab019a2fb8416 Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Thu, 30 Sep 2021 15:42:36 -0700 Subject: [PATCH 73/97] math_util.c optimizations by Kaze Emanuar --- README.md | 3 ++ include/config.h | 7 ++++ src/engine/math_util.c | 94 ++++++++++++++++++++++++------------------ src/engine/math_util.h | 2 + 4 files changed, 67 insertions(+), 39 deletions(-) diff --git a/README.md b/README.md index de012fd2..1770bffc 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,7 @@ # ![](https://i.imgur.com/CeOukzk.gif) HackerSM64 ![](https://i.imgur.com/s0LUbTo.gif) + +**[Thank you to Kaze Emanuar for these major optimizations!](https://www.youtube.com/watch?v=uYPH-NH3B6k) + **AFTER CLONING THE REPO, CHECK OUT THE `include/config.h` FILE BEFORE ANYTHING ELSE! IT THERE'S A LOT OF STUFF IN THIS REPO THAT CAN BE TOGGLED THERE.** HackerSM64 now has a discord server! https://discord.gg/brETAakcXr diff --git a/include/config.h b/include/config.h index 93afe862..c876ff13 100644 --- a/include/config.h +++ b/include/config.h @@ -1,5 +1,12 @@ #pragma once +/** + * Thank you to Kaze Emanuar for these major optimizations! + * https://www.youtube.com/watch?v=uYPH-NH3B6k + * + * If you are making a hack with this repo, it is recommended to credit Kaze Emanuar. + */ + /** * @file config.h * A catch-all file for configuring various bugfixes and other settings in SM64 diff --git a/src/engine/math_util.c b/src/engine/math_util.c index 818a5184..02c823a8 100644 --- a/src/engine/math_util.c +++ b/src/engine/math_util.c @@ -57,9 +57,9 @@ f32 max_3f(f32 a0, f32 a1, f32 a2) { if (a1 > a0) a0 = a1; if (a2 > a0) a0 = a2; /// Copy vector 'src' to 'dest' void vec3f_copy(Vec3f dest, Vec3f src) { - register s32 x = ((u32 *) src)[0]; - register s32 y = ((u32 *) src)[1]; - register s32 z = ((u32 *) src)[2]; + register u32 x = ((u32 *) src)[0]; + register u32 y = ((u32 *) src)[1]; + register u32 z = ((u32 *) src)[2]; ((u32 *) dest)[0] = x; ((u32 *) dest)[1] = y; ((u32 *) dest)[2] = z; @@ -67,9 +67,7 @@ void vec3f_copy(Vec3f dest, Vec3f src) { /// Set vector 'dest' to (x, y, z) inline void vec3f_set(Vec3f dest, f32 x, f32 y, f32 z) { - dest[0] = x; - dest[1] = y; - dest[2] = z; + vec3_set(dest, x, y, z); } /// Add vector 'a' to 'dest' @@ -88,26 +86,36 @@ void vec3f_add(Vec3f dest, Vec3f a) { /// Make 'dest' the sum of vectors a and b. void vec3f_sum(Vec3f dest, Vec3f a, Vec3f b) { - register f32 *temp = dest; + register f32 *temp = (f32 *)dest; register s32 j; - register f32 x,y; + register f32 x, y; for (j = 0; j < 3; j++) { x = *a; a++; y = *b; b++; - *temp = x+y; + *temp = x + y; temp++; } } +/// Make 'dest' the difference of vectors a and b. +void vec3f_diff(Vec3f dest, Vec3f a, Vec3f b) { + vec3_diff(dest, a, b); +} + /// Copy vector src to dest void vec3s_copy(Vec3s dest, Vec3s src) { - vec3_copy(dest, src); + register s16 x = src[0]; + register s16 y = src[1]; + register s16 z = src[2]; + dest[0] = x; + dest[1] = y; + dest[2] = z; } /// Set vector 'dest' to (x, y, z) -void vec3s_set(Vec3s dest, s16 x, s16 y, s16 z) { +inline void vec3s_set(Vec3s dest, s16 x, s16 y, s16 z) { vec3_set(dest, x, y, z); } @@ -130,6 +138,10 @@ void vec3f_sub(Vec3f dest, Vec3f src) { vec3_sub(dest, src); } +f32 vec3f_dot(Vec3f a, Vec3f b) { + return vec3_dot(a, b); +} + /** * Convert float vector a to a short vector 'dest' by rounding the components * to the nearest integer. @@ -184,10 +196,7 @@ void vec3f_normalize_negative(Vec3f dest) { } struct CopyMe { - f32 x; f32 y; f32 z; f32 w; - f32 x1; f32 y1; f32 z1; f32 w1; - f32 x2; f32 y2; f32 z2; f32 w2; - f32 x3; f32 y3; f32 z3; f32 w3; + f32 a[4 * 4]; }; /// Copy matrix 'src' to 'dest' @@ -213,8 +222,15 @@ void mtxf_identity(register Mat4 mtx) { * Set dest to a translation matrix of vector b */ void mtxf_translate(Mat4 dest, Vec3f b) { - mtxf_identity(dest); - vec3_copy(dest[3], b); + register s32 i; + register f32 *pen; + for (pen = (f32 *) dest + 1, i = 0; i < 12; pen++, i++) { + *pen = 0; + } + for (pen = (f32 *) dest, i = 0; i < 4; pen += 5, i++) { + *((u32 *) pen) = 0x3F800000; + } + vec3f_copy(&dest[3][0], &b[0]); } void mtxf_rot_trans_mul(Vec3s rot, Vec3f trans, Mat4 dest, Mat4 src) { @@ -276,7 +292,7 @@ void mtxf_lookat(Mat4 mtx, Vec3f from, Vec3f to, s32 roll) { colY[0] = ( sr * dz); colY[2] = (-sr * dx); vec3_diff(colZ, to, from); - vec3_normalize_negative(colZ); + vec3f_normalize_negative(colZ); vec3f_cross(colX, colY, colZ); vec3f_normalize(colX); vec3f_cross(colY, colZ, colX); @@ -290,9 +306,9 @@ void mtxf_lookat(Mat4 mtx, Vec3f from, Vec3f to, s32 roll) { mtx[0][2] = colZ[0]; mtx[1][2] = colZ[1]; mtx[2][2] = colZ[2]; - mtx[3][0] = -vec3_dot(from, colX); - mtx[3][1] = -vec3_dot(from, colY); - mtx[3][2] = -vec3_dot(from, colZ); + mtx[3][0] = -vec3f_dot(from, colX); + mtx[3][1] = -vec3f_dot(from, colY); + mtx[3][2] = -vec3f_dot(from, colZ); MTXF_END(mtx); } @@ -591,7 +607,7 @@ void mtxf_to_mtx_scale(Mtx *dest, Mat4 src) { guMtxF2L(temp, dest); } -void mtxf_to_mtx_constant(register s16 *dest, register f32 *src) { +void mtxf_to_mtx_constant(register s16 *dest, register f32 *src) { //! TODO: asm s32 asFixedPoint; s32 i; for (i = 0; i < 16; i++) { @@ -1153,25 +1169,25 @@ s32 ray_surface_intersect(Vec3f orig, Vec3f dir, f32 dir_length, struct Surface vec3_copy(v0, surface->vertex1); vec3_copy(v1, surface->vertex2); vec3_copy(v2, surface->vertex3); - vec3_add( v0, norm); - vec3_add( v1, norm); - vec3_add( v2, norm); - vec3_diff(e1, v1, v0); - vec3_diff(e2, v2, v0); - vec3_cross(h, dir, e2); + vec3f_add( v0, norm); + vec3f_add( v1, norm); + vec3f_add( v2, norm); + vec3f_diff(e1, v1, v0); + vec3f_diff(e2, v2, v0); + vec3f_cross(h, dir, e2); // Check if we're perpendicular from the surface - a = vec3_dot(e1, h); + a = vec3f_dot(e1, h); if ((a > -NEAR_ZERO) && (a < NEAR_ZERO)) return FALSE; // Check if we're making contact with the surface f = 1.0f / a; - vec3_diff(s, orig, v0); - u = f * vec3_dot(s, h); + vec3f_diff(s, orig, v0); + u = f * vec3f_dot(s, h); if ((u < 0.0f) || (u > 1.0f)) return FALSE; - vec3_cross(q, s, e1); - v = f * vec3_dot(dir, q); + vec3f_cross(q, s, e1); + v = f * vec3f_dot(dir, q); if ((v < 0.0f) || ((u + v) > 1.0f)) return FALSE; // Get the length between our origin and the surface contact point - *length = f * vec3_dot(e2, q); + *length = f * vec3f_dot(e2, q); if (*length <= 0.00001 || *length > dir_length) return FALSE; // Successful contact vec3f_copy(add_dir, dir); @@ -1185,9 +1201,9 @@ void find_surface_on_ray_list(struct SurfaceNode *list, Vec3f orig, Vec3f dir, f f32 length; Vec3f chk_hit_pos; f32 top, bottom; - #if PUPPYPRINT_DEBUG +#if PUPPYPRINT_DEBUG OSTime first = osGetTime(); - #endif +#endif // Get upper and lower bounds of ray if (dir[1] >= 0.0f) { @@ -1263,7 +1279,7 @@ void find_surface_on_ray(Vec3f orig, Vec3f dir, struct Surface **hit_surface, Ve cellPrevZ = cellZ; // Don't do DDA if straight down - if (normalized_dir[1] >= 0.99999f || normalized_dir[1] <= -0.99999f) { + if (normalized_dir[1] >= NEAR_ONE || normalized_dir[1] <= -NEAR_ONE) { find_surface_on_ray_cell(cellX, cellZ, orig, normalized_dir, dir_length, hit_surface, hit_pos, &max_length, flags); return; } @@ -1274,8 +1290,8 @@ void find_surface_on_ray(Vec3f orig, Vec3f dir, struct Surface **hit_surface, Ve } else { step = RAY_STEPS * ABS(dir[2]) / CELL_SIZE; } - f32 dx = dir[0] / step / CELL_SIZE; - f32 dz = dir[2] / step / CELL_SIZE; + f32 dx = (dir[0] / step) / CELL_SIZE; + f32 dz = (dir[2] / step) / CELL_SIZE; for (i = 0; i < step && *hit_surface == NULL; i++) { find_surface_on_ray_cell(cellX, cellZ, orig, normalized_dir, dir_length, hit_surface, hit_pos, &max_length, flags); diff --git a/src/engine/math_util.h b/src/engine/math_util.h index 5098ee3a..38778ba7 100644 --- a/src/engine/math_util.h +++ b/src/engine/math_util.h @@ -464,8 +464,10 @@ void vec3s_add(Vec3s dest, Vec3s a); void vec3s_sum(Vec3s dest, Vec3s a, Vec3s b); void vec3s_sub(Vec3s dest, Vec3s a); void vec3f_sub(Vec3f dest, Vec3f src); +void vec3f_diff(Vec3f dest, Vec3f a, Vec3f b); void vec3f_to_vec3s(Vec3s dest, Vec3f a); void find_vector_perpendicular_to_plane(Vec3f dest, Vec3f a, Vec3f b, Vec3f c); +f32 vec3f_dot(Vec3f a, Vec3f b); void vec3f_cross(Vec3f dest, Vec3f a, Vec3f b); void vec3f_normalize(Vec3f dest); void mtxf_copy(Mat4 dest, Mat4 src); From 5206fdbe2ee2a49ce82dd47f7cc7b6f256d2bca3 Mon Sep 17 00:00:00 2001 From: Fazana <52551480+FazanaJ@users.noreply.github.com> Date: Fri, 1 Oct 2021 11:02:29 +0100 Subject: [PATCH 74/97] Revert macros struct funnies sausage --- src/game/macro_special_objects.c | 63 ++++++++++++++++++-------------- 1 file changed, 36 insertions(+), 27 deletions(-) diff --git a/src/game/macro_special_objects.c b/src/game/macro_special_objects.c index 304b391b..e8de3316 100644 --- a/src/game/macro_special_objects.c +++ b/src/game/macro_special_objects.c @@ -77,17 +77,23 @@ UNUSED static void spawn_macro_coin_unknown(const BehaviorScript *behavior, s16 obj->oBehParams = (a1[4] & 0xFF) >> 16; } -#define MACRO_OBJ_Y_ROT 0 -#define MACRO_OBJ_X 1 -#define MACRO_OBJ_Y 2 -#define MACRO_OBJ_Z 3 +struct LoadedPreset { + /*0x00*/ const BehaviorScript *behavior; + /*0x04*/ s16 param; // huh? why does the below function swap these.. just use the struct.. + /*0x06*/ ModelID16 model; +}; + +#define MACRO_OBJ_Y_ROT 0 +#define MACRO_OBJ_X 1 +#define MACRO_OBJ_Y 2 +#define MACRO_OBJ_Z 3 #define MACRO_OBJ_PARAMS 4 void spawn_macro_objects(s32 areaIndex, s16 *macroObjList) { s32 presetID; s16 macroObject[5]; // see the 5 #define statements above struct Object *newObj; - s16 presetParams, macroParams; + struct LoadedPreset preset; gMacroObjectDefaultParent.header.gfx.areaIndex = areaIndex; gMacroObjectDefaultParent.header.gfx.activeAreaIndex = areaIndex; while (TRUE) { @@ -103,34 +109,37 @@ void spawn_macro_objects(s32 areaIndex, s16 *macroObjList) { macroObject[MACRO_OBJ_PARAMS] = *macroObjList++; // Behavior params // Get the preset values from the MacroObjectPresets list. - presetParams = MacroObjectPresets[presetID].param; - macroParams = macroObject[MACRO_OBJ_PARAMS]; + preset.model = MacroObjectPresets[presetID].model; + preset.behavior = MacroObjectPresets[presetID].behavior; + preset.param = MacroObjectPresets[presetID].param; - if (presetParams != 0) { - macroParams = (macroParams & 0xFF00) + (presetParams & 0x00FF); + if (preset.param != 0) { + macroObject[MACRO_OBJ_PARAMS] = + (macroObject[MACRO_OBJ_PARAMS] & 0xFF00) + (preset.param & 0x00FF); } // If object has been killed, prevent it from respawning - if (((macroParams >> 8) & RESPAWN_INFO_DONT_RESPAWN) != RESPAWN_INFO_DONT_RESPAWN) { + if (((macroObject[MACRO_OBJ_PARAMS] >> 8) & RESPAWN_INFO_DONT_RESPAWN) != RESPAWN_INFO_DONT_RESPAWN) { // Spawn the new macro object. - newObj = spawn_object_abs_with_rot(&gMacroObjectDefaultParent, // Parent object - 0, // Unused - MacroObjectPresets[presetID].model, // Model ID - MacroObjectPresets[presetID].behavior, // Behavior address - macroObject[MACRO_OBJ_X], // X-position - macroObject[MACRO_OBJ_Y], // Y-position - macroObject[MACRO_OBJ_Z], // Z-position - 0, // X-rotation - convert_rotation(macroObject[MACRO_OBJ_Y_ROT]), // Y-rotation - 0 // Z-rotation + newObj = spawn_object_abs_with_rot(&gMacroObjectDefaultParent, // Parent object + 0, // Unused + MacroObjectPresets[presetID].model, // Model ID + MacroObjectPresets[presetID].behavior, // Behavior address + macroObject[MACRO_OBJ_X], // X-position + macroObject[MACRO_OBJ_Y], // Y-position + macroObject[MACRO_OBJ_Z], // Z-position + 0, // X-rotation + convert_rotation(macroObject[MACRO_OBJ_Y_ROT]), // Y-rotation + 0 // Z-rotation ); - newObj->oUnusedCoinParams = macroParams; - newObj->oBehParams = ((macroParams & 0x00FF) << 16) - + (macroParams & 0xFF00); - newObj->oBehParams2ndByte = macroParams & 0x00FF; - newObj->respawnInfoType = RESPAWN_INFO_TYPE_16; - newObj->respawnInfo = (macroObjList - 1); - newObj->parentObj = newObj; + + newObj->oUnusedCoinParams = macroObject[MACRO_OBJ_PARAMS]; + newObj->oBehParams = ((macroObject[MACRO_OBJ_PARAMS] & 0x00FF) << 16) + + (macroObject[MACRO_OBJ_PARAMS] & 0xFF00); + newObj->oBehParams2ndByte = macroObject[MACRO_OBJ_PARAMS] & 0x00FF; + newObj->respawnInfoType = RESPAWN_INFO_TYPE_16; + newObj->respawnInfo = macroObjList - 1; + newObj->parentObj = newObj; } } } From 39318ec6a263739d45531be0e3dcb708a2513683 Mon Sep 17 00:00:00 2001 From: Fazana <52551480+FazanaJ@users.noreply.github.com> Date: Fri, 1 Oct 2021 11:32:58 +0100 Subject: [PATCH 75/97] Further makerule tweaks --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index fb3a25c4..04485c81 100644 --- a/Makefile +++ b/Makefile @@ -578,7 +578,7 @@ $(BUILD_DIR)/src/usb/debug.o: OPT_FLAGS := -O0 $(BUILD_DIR)/src/usb/debug.o: CFLAGS += -Wno-unused-parameter -Wno-maybe-uninitialized $(BUILD_DIR)/src/audio/*.o: OPT_FLAGS := -Os -fno-jump-tables $(BUILD_DIR)/src/engine/math_util.o: OPT_FLAGS := -Ofast -fno-unroll-loops -fno-peel-loops --param case-values-threshold=20 -$(BUILD_DIR)/src/game/rendering_graph_node.o: OPT_FLAGS := -Ofast -fno-unroll-loops -fno-peel-loops --param case-values-threshold=20 +$(BUILD_DIR)/src/game/rendering_graph_node.o: OPT_FLAGS := -Ofast --param case-values-threshold=20 ALL_DIRS := $(BUILD_DIR) $(addprefix $(BUILD_DIR)/,$(SRC_DIRS) asm/debug $(GODDARD_SRC_DIRS) $(LIBZ_SRC_DIRS) $(ULTRA_BIN_DIRS) $(BIN_DIRS) $(TEXTURE_DIRS) $(TEXT_DIRS) $(SOUND_SAMPLE_DIRS) $(addprefix levels/,$(LEVEL_DIRS)) rsp include) $(YAY0_DIR) $(addprefix $(YAY0_DIR)/,$(VERSION)) $(SOUND_BIN_DIR) $(SOUND_BIN_DIR)/sequences/$(VERSION) From 2daf766901ef909621f1bcc7b75502f0cc16c7ff Mon Sep 17 00:00:00 2001 From: Reonu Date: Fri, 1 Oct 2021 16:47:18 +0300 Subject: [PATCH 76/97] fixed camera memes --- src/engine/math_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/engine/math_util.c b/src/engine/math_util.c index 02c823a8..751fff0c 100644 --- a/src/engine/math_util.c +++ b/src/engine/math_util.c @@ -776,7 +776,7 @@ void vec3f_get_dist_and_angle(Vec3f from, Vec3f to, f32 *dist, s16 *pitch, s16 * register f32 xs = x * x; register f32 zs = z * z; - *dist = sqrtf(xs + zs); + *dist = sqrtf(xs + zs + y * y) *pitch = atan2s(sqrtf(xs + zs), y); *yaw = atan2s(z, x); } From 6dde1e90264053199692b96bd4ee23ae4d939ceb Mon Sep 17 00:00:00 2001 From: Fazana <52551480+FazanaJ@users.noreply.github.com> Date: Fri, 1 Oct 2021 17:58:39 +0100 Subject: [PATCH 77/97] semi colon --- src/engine/math_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/engine/math_util.c b/src/engine/math_util.c index 751fff0c..c2669b27 100644 --- a/src/engine/math_util.c +++ b/src/engine/math_util.c @@ -776,7 +776,7 @@ void vec3f_get_dist_and_angle(Vec3f from, Vec3f to, f32 *dist, s16 *pitch, s16 * register f32 xs = x * x; register f32 zs = z * z; - *dist = sqrtf(xs + zs + y * y) + *dist = sqrtf(xs + zs + y * y); *pitch = atan2s(sqrtf(xs + zs), y); *yaw = atan2s(z, x); } From 6052ed8cdf1900cb4596b1fb2131ebeb04aba742 Mon Sep 17 00:00:00 2001 From: Fazana <52551480+FazanaJ@users.noreply.github.com> Date: Sun, 3 Oct 2021 14:56:16 +0100 Subject: [PATCH 78/97] Revert some camera "optimisations" --- src/game/behaviors/intro_lakitu.inc.c | 30 ++- src/game/camera.c | 277 ++++++++++++++++++-------- src/game/camera.h | 7 + 3 files changed, 222 insertions(+), 92 deletions(-) diff --git a/src/game/behaviors/intro_lakitu.inc.c b/src/game/behaviors/intro_lakitu.inc.c index a36f8614..0d538609 100644 --- a/src/game/behaviors/intro_lakitu.inc.c +++ b/src/game/behaviors/intro_lakitu.inc.c @@ -55,7 +55,7 @@ s32 intro_lakitu_set_pos_and_focus(struct Object *obj, struct CutsceneSplinePoin void bhv_intro_lakitu_loop(void) { Vec3f offset, fromPoint, toPoint; - s16 yawToCam; + s16 yawToCam; switch (gCurrentObject->oAction) { case 0: @@ -94,10 +94,18 @@ void bhv_intro_lakitu_loop(void) { cur_obj_play_sound_2(SOUND_ACTION_INTRO_UNK45E); break; #endif - case 73: gCurrentObject->oAnimState++; break; - case 74: gCurrentObject->oAnimState--; break; - case 82: gCurrentObject->oAnimState++; break; - case 84: gCurrentObject->oAnimState--; break; + case 73: + gCurrentObject->oAnimState += 1; + break; + case 74: + gCurrentObject->oAnimState -= 1; + break; + case 82: + gCurrentObject->oAnimState += 1; + break; + case 84: + gCurrentObject->oAnimState -= 1; + break; } #ifdef VERSION_EU if (gCurrentObject->oTimer == 446) @@ -155,14 +163,14 @@ void bhv_intro_lakitu_loop(void) { #else #define TIMER 98 #endif + if (gCurrentObject->oTimer == TIMER) { obj_mark_for_deletion(gCurrentObject); obj_mark_for_deletion(gCurrentObject->oIntroLakituCloud); } #ifndef VERSION_JP - if (gCurrentObject->oTimer == 14) { + if (gCurrentObject->oTimer == 14) cur_obj_play_sound_2(SOUND_ACTION_INTRO_UNK45F); - } #endif break; case 100: @@ -180,11 +188,13 @@ void bhv_intro_lakitu_loop(void) { case 101: vec3f_copy(toPoint, &gCurrentObject->oPosVec); if (gCurrentObject->oTimer > 60) { - gCurrentObject->oForwardVel = approach_f32_asymptotic(gCurrentObject->oForwardVel, -10.f, 0.05f); + gCurrentObject->oForwardVel = + approach_f32_asymptotic(gCurrentObject->oForwardVel, -10.f, 0.05f); gCurrentObject->oMoveAngleYaw += 0x78; gCurrentObject->oMoveAnglePitch += 0x40; - vec3f_get_yaw(toPoint, gCamera->pos, &yawToCam); - gCurrentObject->oFaceAngleYaw = camera_approach_s16_symmetric(gCurrentObject->oFaceAngleYaw, yawToCam, 0x200); + gCurrentObject->oFaceAngleYaw = camera_approach_s16_symmetric( + gCurrentObject->oFaceAngleYaw, (s16) calculate_yaw(toPoint, gCamera->pos), + 0x200); } if (gCurrentObject->oTimer > 105) { gCurrentObject->oAction++; diff --git a/src/game/camera.c b/src/game/camera.c index fd47d858..be8fb57a 100644 --- a/src/game/camera.c +++ b/src/game/camera.c @@ -893,11 +893,9 @@ void radial_camera_move(struct Camera *c) { s32 avoidStatus; f32 areaDistX = sMarioCamState->pos[0] - c->areaCenX; f32 areaDistZ = sMarioCamState->pos[2] - c->areaCenZ; - s16 yawOffset; // How much the camera's yaw changed - vec3f_get_yaw(sMarioCamState->pos, c->pos, &yawOffset); - yawOffset -= atan2s(areaDistZ, areaDistX); + s16 yawOffset = calculate_yaw(sMarioCamState->pos, c->pos) - atan2s(areaDistZ, areaDistX); if (yawOffset > maxAreaYaw) { yawOffset = maxAreaYaw; @@ -1321,14 +1319,14 @@ s32 update_parallel_tracking_camera(struct Camera *c, Vec3f focus, Vec3f pos) { // Check if the camera should go to the next path if (sParTrackPath[sParTrackIndex + 1].startOfPath != 0) { // get Mario's distance to the next path - vec3f_get_angle(sParTrackPath[sParTrackIndex + 1].pos, sParTrackPath[sParTrackIndex + 2].pos, &nextPitch, &nextYaw); + calculate_angles(sParTrackPath[sParTrackIndex + 1].pos, sParTrackPath[sParTrackIndex + 2].pos, &nextPitch, &nextYaw); vec3f_set_dist_and_angle(sParTrackPath[sParTrackIndex + 1].pos, nextPathPos, 400.f, nextPitch, nextYaw); - vec3f_get_dist_squared(marioPos, nextPathPos, &distToPrev); + distToPrev = calc_abs_dist_squared(marioPos, nextPathPos); // get Mario's distance to the previous path - vec3f_get_angle(sParTrackPath[sParTrackIndex + 1].pos, sParTrackPath[sParTrackIndex].pos, &prevPitch, &prevYaw); + calculate_angles(sParTrackPath[sParTrackIndex + 1].pos, sParTrackPath[sParTrackIndex].pos, &prevPitch, &prevYaw); vec3f_set_dist_and_angle(sParTrackPath[sParTrackIndex + 1].pos, prevPathPos, 400.f, prevPitch, prevYaw); - vec3f_get_dist_squared(marioPos, prevPathPos, &distToNext); + distToNext = calc_abs_dist_squared(marioPos, prevPathPos); if (distToPrev < distToNext) { sParTrackIndex++; sStatusFlags |= CAM_FLAG_CHANGED_PARTRACK_INDEX; @@ -1338,14 +1336,14 @@ s32 update_parallel_tracking_camera(struct Camera *c, Vec3f focus, Vec3f pos) { // Check if the camera should go to the previous path if (sParTrackIndex != 0) { // get Mario's distance to the next path - vec3f_get_angle((*(sParTrackPath + sParTrackIndex)).pos, (*(sParTrackPath + sParTrackIndex + 1)).pos, &nextPitch, &nextYaw); + calculate_angles((*(sParTrackPath + sParTrackIndex)).pos, (*(sParTrackPath + sParTrackIndex + 1)).pos, &nextPitch, &nextYaw); vec3f_set_dist_and_angle(sParTrackPath[sParTrackIndex].pos, nextPathPos, 700.f, nextPitch, nextYaw); - vec3f_get_dist_squared(marioPos, nextPathPos, &distToPrev); + distToPrev = calc_abs_dist_squared(marioPos, nextPathPos); // get Mario's distance to the previous path - vec3f_get_angle((*(sParTrackPath + sParTrackIndex)).pos, (*(sParTrackPath + sParTrackIndex - 1)).pos, &prevPitch, &prevYaw); + calculate_angles((*(sParTrackPath + sParTrackIndex)).pos, (*(sParTrackPath + sParTrackIndex - 1)).pos, &prevPitch, &prevYaw); vec3f_set_dist_and_angle(sParTrackPath[sParTrackIndex].pos, prevPathPos, 700.f, prevPitch, prevYaw); - vec3f_get_dist_squared(marioPos, prevPathPos, &distToNext); + distToNext = calc_abs_dist_squared(marioPos, prevPathPos); if (distToPrev > distToNext) { sParTrackIndex--; sStatusFlags |= CAM_FLAG_CHANGED_PARTRACK_INDEX; @@ -1484,9 +1482,7 @@ s32 update_boss_fight_camera(struct Camera *c, Vec3f focus, Vec3f pos) { heldState = 0; } - vec3f_get_dist(sMarioCamState->pos, secondFocus, &focusDistance); - focusDistance *= 1.6f; - + focusDistance = calc_abs_dist(sMarioCamState->pos, secondFocus) * 1.6f; if (focusDistance < 800.f) { focusDistance = 800.f; } @@ -1878,7 +1874,8 @@ s16 update_slide_camera(struct Camera *c) { vec3f_set_dist_and_angle(c->focus, c->pos, distCamToFocus, camPitch, camYaw); } } - vec3f_get_yaw(c->focus, c->pos, &camYaw); + + camYaw = calculate_yaw(c->focus, c->pos); return camYaw; } @@ -1996,7 +1993,7 @@ s16 update_default_camera(struct Camera *c) { nextYawVel = 0; } sYawSpeed = 0x400; - vec3f_get_lateral_dist(sMarioCamState->pos, c->pos, &xzDist); + xzDist = calc_hor_dist(sMarioCamState->pos, c->pos); if (sStatusFlags & CAM_FLAG_BEHIND_MARIO_POST_DOOR) { if (xzDist >= 250) { @@ -2158,8 +2155,7 @@ s16 update_default_camera(struct Camera *c) { // Make Lakitu fly above the gas gasHeight = find_poison_gas_level(cPos[0], cPos[2]); if (gasHeight != FLOOR_LOWER_LIMIT) { - gasHeight += 130.f; - if (gasHeight > c->pos[1]) { + if ((gasHeight += 130.f) > c->pos[1]) { c->pos[1] = gasHeight; } } @@ -2245,14 +2241,23 @@ void mode_mario_camera(struct Camera *c) { * Rotates the camera around the spiral staircase. */ s32 update_spiral_stairs_camera(struct Camera *c, Vec3f focus, Vec3f pos) { + /// The returned yaw + s16 camYaw; + // unused + s16 focPitch; /// The focus (Mario)'s yaw around the stairs s16 focYaw; + // unused + s16 posPitch; /// The camera's yaw around the stairs s16 posYaw; Vec3f cPos; Vec3f checkPos; struct Surface *floor; - f32 focusHeight, floorHeight; + // unused + f32 dist; + f32 focusHeight; + f32 floorHeight; f32 focY; handle_c_button_movement(c); @@ -2266,8 +2271,8 @@ s32 update_spiral_stairs_camera(struct Camera *c, Vec3f focus, Vec3f pos) { focus[2] = sMarioCamState->pos[2]; vec3f_copy(cPos, pos); - vec3f_get_yaw(sFixedModeBasePosition, focus, &focYaw); - vec3f_get_yaw(sFixedModeBasePosition, cPos, &posYaw); + vec3f_get_dist_and_angle(sFixedModeBasePosition, focus, &dist, &focPitch, &focYaw); + vec3f_get_dist_and_angle(sFixedModeBasePosition, cPos, &dist, &posPitch, &posYaw); sSpiralStairsYawOffset = posYaw - focYaw; // posYaw will change if Mario is more than 90 degrees around the stairs, relative to the camera @@ -2283,9 +2288,9 @@ s32 update_spiral_stairs_camera(struct Camera *c, Vec3f focus, Vec3f pos) { vec3f_set_dist_and_angle(sFixedModeBasePosition, cPos, 300.f, 0, posYaw); // Move the camera's y coord up/down the staircase - checkPos[0] = focus[0] + ((cPos[0] - focus[0]) * 0.7f); - checkPos[1] = focus[1] + ((cPos[1] - focus[1]) * 0.7f) + 300.f; - checkPos[2] = focus[2] + ((cPos[2] - focus[2]) * 0.7f); + checkPos[0] = focus[0] + (cPos[0] - focus[0]) * 0.7f; + checkPos[1] = focus[1] + (cPos[1] - focus[1]) * 0.7f + 300.f; + checkPos[2] = focus[2] + (cPos[2] - focus[2]) * 0.7f; floorHeight = find_floor(checkPos[0], checkPos[1] + 50.f, checkPos[2], &floor); if (floorHeight != FLOOR_LOWER_LIMIT) { @@ -2298,8 +2303,9 @@ s32 update_spiral_stairs_camera(struct Camera *c, Vec3f focus, Vec3f pos) { camera_approach_f32_symmetric_bool(&focus[1], focY, 30.f); pos[0] = cPos[0]; pos[2] = cPos[2]; - vec3f_get_yaw(focus, pos, &posYaw); - return posYaw; + camYaw = calculate_yaw(focus, pos); + + return camYaw; } /** @@ -2376,8 +2382,15 @@ void exit_c_up(struct Camera *c) { f32 d; s16 curPitch, curYaw; s16 checkYaw = 0; + Vec3f storePos; // unused + Vec3f storeFoc; // unused if ((gCameraMovementFlags & CAM_MOVE_C_UP_MODE) && !(gCameraMovementFlags & CAM_MOVE_STARTED_EXITING_C_UP)) { + // Copy the stored pos and focus. This is unused. + vec3f_copy(storePos, sCameraStoreCUp.pos); + vec3f_add(storePos, sMarioCamState->pos); + vec3f_copy(storeFoc, sCameraStoreCUp.focus); + vec3f_add(storeFoc, sMarioCamState->pos); vec3f_copy(checkFoc, c->focus); checkFoc[0] = sMarioCamState->pos[0]; @@ -3196,7 +3209,7 @@ void init_camera(struct Camera *c) { set_fixed_cam_axis_sa_lobby(c->mode); } store_lakitu_cam_info_for_c_up(c); - vec3f_get_yaw(c->focus, c->pos, &gLakituState.yaw); + gLakituState.yaw = calculate_yaw(c->focus, c->pos); gLakituState.nextYaw = gLakituState.yaw; c->yaw = gLakituState.yaw; c->nextYaw = gLakituState.yaw; @@ -3223,6 +3236,8 @@ void init_camera(struct Camera *c) { * modulo-4's the result, because each 8-bit mask only has 4 area bits for each level */ void zoom_out_if_paused_and_outside(struct GraphNodeCamera *camera) { + UNUSED f32 dist; + UNUSED s16 pitch; s16 yaw; s32 areaMaskIndex = gCurrLevelArea / 32; s32 areaBit = 1 << (((gCurrLevelArea & 0x10) / 4) + (((gCurrLevelArea & 0xF) - 1) & 3)); @@ -3238,7 +3253,7 @@ void zoom_out_if_paused_and_outside(struct GraphNodeCamera *camera) { camera->focus[0] = gCamera->areaCenX; camera->focus[1] = (sMarioCamState->pos[1] + gCamera->areaCenY) / 2; camera->focus[2] = gCamera->areaCenZ; - vec3f_get_yaw(camera->focus, sMarioCamState->pos, &yaw); + vec3f_get_dist_and_angle(camera->focus, sMarioCamState->pos, &dist, &pitch, &yaw); vec3f_set_dist_and_angle(sMarioCamState->pos, camera->pos, 6000.f, 0x1000, yaw); #ifndef DISABLE_LEVEL_SPECIFIC_CHECKS if (gCurrLevelNum != LEVEL_THI) { @@ -3463,13 +3478,34 @@ s32 set_cam_angle(s32 mode) { */ void set_handheld_shake(u8 mode) { switch (mode) { - case HAND_CAM_SHAKE_CUTSCENE: sHandheldShakeMag = 0x600; sHandheldShakeInc = 0.04f; break; // Lowest increment - case HAND_CAM_SHAKE_UNUSED: sHandheldShakeMag = 0x600; sHandheldShakeInc = 0.07f; break; // Never used - case HAND_CAM_SHAKE_HANG_OWL: sHandheldShakeMag = 0x600; sHandheldShakeInc = 0.07f; break; // exactly the same as UNUSED... - case HAND_CAM_SHAKE_HIGH: sHandheldShakeMag = 0x1000; sHandheldShakeInc = 0.1f; break; // Highest mag and inc - case HAND_CAM_SHAKE_STAR_DANCE: sHandheldShakeMag = 0x400; sHandheldShakeInc = 0.07f; break; // Slightly steadier than HANG_OWL and UNUSED - case HAND_CAM_SHAKE_LOW: sHandheldShakeMag = 0x300; sHandheldShakeInc = 0.06f; break; // Lowest magnitude - default: sHandheldShakeMag = 0x0; sHandheldShakeInc = 0.f; + // They're not in numerical order because that would be too simple... + case HAND_CAM_SHAKE_CUTSCENE: // Lowest increment + sHandheldShakeMag = 0x600; + sHandheldShakeInc = 0.04f; + break; + case HAND_CAM_SHAKE_LOW: // Lowest magnitude + sHandheldShakeMag = 0x300; + sHandheldShakeInc = 0.06f; + break; + case HAND_CAM_SHAKE_HIGH: // Highest mag and inc + sHandheldShakeMag = 0x1000; + sHandheldShakeInc = 0.1f; + break; + case HAND_CAM_SHAKE_UNUSED: // Never used + sHandheldShakeMag = 0x600; + sHandheldShakeInc = 0.07f; + break; + case HAND_CAM_SHAKE_HANG_OWL: // exactly the same as UNUSED... + sHandheldShakeMag = 0x600; + sHandheldShakeInc = 0.07f; + break; + case HAND_CAM_SHAKE_STAR_DANCE: // Slightly steadier than HANG_OWL and UNUSED + sHandheldShakeMag = 0x400; + sHandheldShakeInc = 0.07f; + break; + default: + sHandheldShakeMag = 0x0; + sHandheldShakeInc = 0.f; } } @@ -3627,7 +3663,7 @@ s32 collide_with_walls(Vec3f pos, f32 offsetY, f32 radius) { normZ = wall->normal.z; originOffset = wall->originOffset; offset = normX * newPos[i][0] + normY * newPos[i][1] + normZ * newPos[i][2] + originOffset; - offsetAbsolute = ABS(offset); + offsetAbsolute = ABS2(offset); if (offsetAbsolute < radius) { newPos[i][0] += normX * (radius - offset); newPos[i][2] += normZ * (radius - offset); @@ -3654,10 +3690,9 @@ void clamp_pitch(Vec3f from, Vec3f to, s16 maxPitch, s16 minPitch) { } s32 is_within_100_units_of_mario(f32 posX, f32 posY, f32 posZ) { - Vec3f pos = { posX, posY, posZ }; - f32 dist; - vec3f_get_dist_squared(sMarioCamState->pos, pos, &dist); - return (dist < sqr(100.f)); + Vec3f pos; + vec3f_set(pos, posX, posY, posZ); + return (calc_abs_dist_squared(sMarioCamState->pos, pos) < sqr(100.f)); } s32 set_or_approach_f32_asymptotic(f32 *dst, f32 goal, f32 scale) { @@ -3807,7 +3842,7 @@ s16 reduce_by_dist_from_camera(s16 value, f32 maxDist, f32 posX, f32 posY, f32 p pos[2] = posZ; vec3f_get_dist_and_angle(gLakituState.goalPos, pos, &dist, &pitch, &yaw); if (dist < maxDist) { - vec3f_get_angle(gLakituState.goalPos, gLakituState.goalFocus, &goalPitch, &goalYaw); + calculate_angles(gLakituState.goalPos, gLakituState.goalFocus, &goalPitch, &goalYaw); pitch -= goalPitch; yaw -= goalYaw; dist -= 2000.f; @@ -3830,11 +3865,20 @@ s16 reduce_by_dist_from_camera(s16 value, f32 maxDist, f32 posX, f32 posY, f32 p s32 clamp_positions_and_find_yaw(Vec3f pos, Vec3f origin, f32 xMax, f32 xMin, f32 zMax, f32 zMin) { s16 yaw = gCamera->nextYaw; - if (pos[0] >= xMax) pos[0] = xMax; - if (pos[0] <= xMin) pos[0] = xMin; - if (pos[2] >= zMax) pos[2] = zMax; - if (pos[2] <= zMin) pos[2] = zMin; - vec3f_get_yaw(origin, pos, &yaw); + + if (pos[0] >= xMax) { + pos[0] = xMax; + } + if (pos[0] <= xMin) { + pos[0] = xMin; + } + if (pos[2] >= zMax) { + pos[2] = zMax; + } + if (pos[2] <= zMin) { + pos[2] = zMin; + } + yaw = calculate_yaw(origin, pos); return yaw; } @@ -3849,7 +3893,9 @@ s32 clamp_positions_and_find_yaw(Vec3f pos, Vec3f origin, f32 xMax, f32 xMin, f3 * developers just add 180 degrees to the result. */ s32 calc_avoid_yaw(s16 yawFromMario, s16 wallYaw) { - if ((s16)(wallYaw - yawFromMario + DEGREES(90)) < 0) { + s16 yawDiff = wallYaw - yawFromMario + DEGREES(90); + + if (yawDiff < 0) { // Deflect to the right yawFromMario = wallYaw; } else { @@ -3892,14 +3938,22 @@ s32 is_surf_within_bounding_box(struct Surface *surf, f32 xMax, f32 yMax, f32 zM sz[2] = surf->vertex3[2]; for (i = 0; i < 3; i++) { - j = (i + 1); - if (j >= 3) j = 0; + j = i + 1; + if (j >= 3) { + j = 0; + } dx = ABS(sx[i] - sx[j]); - if (dx > dxMax) dxMax = dx; + if (dx > dxMax) { + dxMax = dx; + } dy = ABS(sy[i] - sy[j]); - if (dy > dyMax) dyMax = dy; + if (dy > dyMax) { + dyMax = dy; + } dz = ABS(sz[i] - sz[j]); - if (dz > dzMax) dzMax = dz; + if (dz > dzMax) { + dzMax = dz; + } } if (yMax != -1.f) { if (dyMax < yMax) { @@ -3993,6 +4047,56 @@ s32 is_pos_in_bounds(Vec3f pos, Vec3f center, Vec3f bounds, s16 boundsYaw) { -bounds[2] < rel[2] && rel[2] < bounds[2]); } +s16 calculate_pitch(Vec3f from, Vec3f to) { + f32 dx = to[0] - from[0]; + f32 dy = to[1] - from[1]; + f32 dz = to[2] - from[2]; + return atan2s(sqrtf(sqr(dx) + sqr(dz)), dy); +} + +s16 calculate_yaw(Vec3f from, Vec3f to) { + f32 dx = to[0] - from[0]; + f32 dz = to[2] - from[2]; + return atan2s(dz, dx); +} + +/** + * Calculates the pitch and yaw between two vectors. + */ +void calculate_angles(Vec3f from, Vec3f to, s16 *pitch, s16 *yaw) { + f32 dx = to[0] - from[0]; + f32 dy = to[1] - from[1]; + f32 dz = to[2] - from[2]; + *pitch = atan2s(sqrtf(sqr(dx) + sqr(dz)), dy); + *yaw = atan2s(dz, dx); +} + +/** + * Finds the distance between two vectors. + */ +f32 calc_abs_dist(Vec3f a, Vec3f b) { + register f32 distX = b[0] - a[0]; + register f32 distY = b[1] - a[1]; + register f32 distZ = b[2] - a[2]; + return sqrtf(sqr(distX) + sqr(distY) + sqr(distZ)); +} + +f32 calc_abs_dist_squared(Vec3f a, Vec3f b) { + register f32 distX = b[0] - a[0]; + register f32 distY = b[1] - a[1]; + register f32 distZ = b[2] - a[2]; + return (sqr(distX) + sqr(distY) + sqr(distZ)); +} + +/** + * Finds the horizontal distance between two vectors. + */ +f32 calc_hor_dist(Vec3f a, Vec3f b) { + register f32 distX = b[0] - a[0]; + register f32 distZ = b[2] - a[2]; + return sqrtf(sqr(distX) + sqr(distZ)); +} + /** * Rotates a vector in the horizontal plane and copies it to a new vector. */ @@ -4140,7 +4244,6 @@ void shake_camera_roll(s16 *roll) { s32 offset_yaw_outward_radial(struct Camera *c, s16 areaYaw) { s16 yawGoal = DEGREES(60); s16 yaw = sModeOffsetYaw; - f32 distFromAreaCenter; Vec3f areaCenter; s16 dYaw; switch (gCurrLevelArea) { @@ -4148,8 +4251,7 @@ s32 offset_yaw_outward_radial(struct Camera *c, s16 areaYaw) { areaCenter[0] = c->areaCenX; areaCenter[1] = sMarioCamState->pos[1]; areaCenter[2] = c->areaCenZ; - vec3f_get_dist_squared(areaCenter, sMarioCamState->pos, &distFromAreaCenter); - if (sqr(800.f) > distFromAreaCenter) { + if (sqr(800.f) > calc_abs_dist_squared(areaCenter, sMarioCamState->pos)) { yawGoal = 0x3800; } break; @@ -4711,13 +4813,18 @@ void determine_pushing_or_pulling_door(s16 *rotation) { */ s16 next_lakitu_state(Vec3f newPos, Vec3f newFoc, Vec3f curPos, Vec3f curFoc, Vec3f oldPos, Vec3f oldFoc, s16 yaw) { - s16 pitchVelocity, yawVelocity; + s16 yawVelocity; + s16 pitchVelocity; f32 distVelocity; f32 goalDist; - s16 goalPitch, goalYaw; + s16 goalPitch; + s16 goalYaw; f32 distTimer = sModeTransition.framesLeft; s16 angleTimer = sModeTransition.framesLeft; - Vec3f startPos, nextPos, startFoc, nextFoc; + Vec3f nextPos; + Vec3f nextFoc; + Vec3f startPos; + Vec3f startFoc; s32 i; f32 floorHeight; struct Surface *floor; @@ -4735,8 +4842,10 @@ s16 next_lakitu_state(Vec3f newPos, Vec3f newFoc, Vec3f curPos, Vec3f curFoc, } - vec3f_get_dist_and_angle(curFoc, startFoc, &sModeTransition.focDist, &sModeTransition.focPitch, &sModeTransition.focYaw); - vec3f_get_dist_and_angle(curFoc, startPos, &sModeTransition.posDist, &sModeTransition.posPitch, &sModeTransition.posYaw); + vec3f_get_dist_and_angle(curFoc, startFoc, &sModeTransition.focDist, &sModeTransition.focPitch, + &sModeTransition.focYaw); + vec3f_get_dist_and_angle(curFoc, startPos, &sModeTransition.posDist, &sModeTransition.posPitch, + &sModeTransition.posYaw); sStatusFlags &= ~CAM_FLAG_START_TRANSITION; } @@ -4777,7 +4886,7 @@ s16 next_lakitu_state(Vec3f newPos, Vec3f newFoc, Vec3f curPos, Vec3f curFoc, f32_find_wall_collision(&newPos[0], &newPos[1], &newPos[2], 0.f, 100.f); } sModeTransition.framesLeft--; - vec3f_get_yaw(newFoc, newPos, &yaw); + yaw = calculate_yaw(newFoc, newPos); } else { sModeTransition.posDist = 0.f; sModeTransition.posPitch = 0; @@ -4853,15 +4962,13 @@ void set_camera_mode_close_cam(u8 *mode) { */ void set_camera_mode_radial(struct Camera *c, s16 transitionTime) { Vec3f focus; - s16 yawToMario, yawToCam, yaw; + s16 yaw; focus[0] = c->areaCenX; focus[1] = sMarioCamState->pos[1]; focus[2] = c->areaCenZ; if (c->mode != CAMERA_MODE_RADIAL) { - vec3f_get_yaw(focus, sMarioCamState->pos, &yawToMario); - vec3f_get_yaw(c->focus, c->pos, &yawToCam); - yaw = yawToMario - yawToCam + DEGREES(90); + yaw = calculate_yaw(focus, sMarioCamState->pos) - calculate_yaw(c->focus, c->pos) + DEGREES(90); if (yaw > 0) { transition_to_camera_mode(c, CAMERA_MODE_RADIAL, transitionTime); } else { @@ -5802,6 +5909,7 @@ s16 camera_course_processing(struct Camera *c) { // Camera trigger's bounding box Vec3f center, bounds; u32 insideBounds = FALSE; + UNUSED struct CameraTrigger unused; u8 oldMode = c->mode; if (c->mode == CAMERA_MODE_C_UP) { @@ -5849,7 +5957,8 @@ s16 camera_course_processing(struct Camera *c) { } } } - b++; + + b += 1; } } #if !defined(CAMERA_FIX) && !defined(DISABLE_LEVEL_SPECIFIC_CHECKS) @@ -5920,14 +6029,18 @@ s16 camera_course_processing(struct Camera *c) { break; case AREA_WDW_MAIN: - if (sMarioGeometry.currFloorType == SURFACE_INSTANT_WARP_1B) { - c->defMode = CAMERA_MODE_RADIAL; + switch (sMarioGeometry.currFloorType) { + case SURFACE_INSTANT_WARP_1B: + c->defMode = CAMERA_MODE_RADIAL; + break; } break; case AREA_WDW_TOWN: - if (sMarioGeometry.currFloorType == SURFACE_INSTANT_WARP_1C) { - c->defMode = CAMERA_MODE_CLOSE; + switch (sMarioGeometry.currFloorType) { + case SURFACE_INSTANT_WARP_1C: + c->defMode = CAMERA_MODE_CLOSE; + break; } break; @@ -6207,7 +6320,7 @@ s16 cutscene_object(u8 cutscene, struct Object *obj) { * Update the camera's yaw and nextYaw. This is called from cutscenes to ignore the camera mode's yaw. */ void update_camera_yaw(struct Camera *c) { - vec3f_get_yaw(c->focus, c->pos, &c->nextYaw); + c->nextYaw = calculate_yaw(c->focus, c->pos); c->yaw = c->nextYaw; } @@ -6445,7 +6558,7 @@ void rotate_and_move_vec3f(Vec3f to, Vec3f from, f32 incDist, s16 incPitch, s16 void set_flag_post_door(struct Camera *c) { sStatusFlags |= CAM_FLAG_BEHIND_MARIO_POST_DOOR; - vec3f_get_yaw(c->focus, c->pos, &sCameraYawAfterDoorCutscene); + sCameraYawAfterDoorCutscene = calculate_yaw(c->focus, c->pos); } void cutscene_soften_music(UNUSED struct Camera *c) { @@ -7110,7 +7223,7 @@ void cutscene_dance_fly_away_start(struct Camera *c) { if (c->mode == CAMERA_MODE_RADIAL) { vec3f_set(areaCenter, c->areaCenX, c->areaCenY, c->areaCenZ); - vec3f_get_yaw(areaCenter, c->pos, &c->yaw); + c->yaw = calculate_yaw(areaCenter, c->pos); c->nextYaw = c->yaw; } @@ -7566,8 +7679,8 @@ void cutscene_red_coin_star_warp(struct Camera *c) { vec3f_copy(sCutsceneVars[1].point, &gCutsceneFocus->oHomeVec); vec3f_get_dist_and_angle(sCutsceneVars[1].point, c->pos, &dist, &pitch, &yaw); - vec3f_get_yaw(sCutsceneVars[1].point, c->pos, &posYaw); - vec3f_get_yaw(sCutsceneVars[1].point, sMarioCamState->pos, &yaw); + posYaw = calculate_yaw(sCutsceneVars[1].point, c->pos); + yaw = calculate_yaw(sCutsceneVars[1].point, sMarioCamState->pos); if (ABS(yaw - posYaw + DEGREES(90)) < ABS(yaw - posYaw - DEGREES(90))) { yaw += DEGREES(90); @@ -8100,8 +8213,9 @@ void cutscene_dialog_start(struct Camera *c) { // Store gCutsceneFocus's position and yaw vec3f_copy(sCutsceneVars[9].point, &gCutsceneFocus->oPosVec); sCutsceneVars[9].point[1] += gCutsceneFocus->hitboxHeight + 200.f; - vec3f_get_yaw(sCutsceneVars[8].point, sCutsceneVars[9].point, &sCutsceneVars[9].angle[1]); - vec3f_get_yaw(sMarioCamState->pos, gLakituState.curPos, &yaw); + sCutsceneVars[9].angle[1] = calculate_yaw(sCutsceneVars[8].point, sCutsceneVars[9].point); + + yaw = calculate_yaw(sMarioCamState->pos, gLakituState.curPos); if ((yaw - sCutsceneVars[9].angle[1]) & 0x8000) { sCutsceneVars[9].angle[1] -= 0x6000; } else { @@ -8120,7 +8234,7 @@ void cutscene_dialog_move_mario_shoulder(struct Camera *c) { scale_along_line(focus, sCutsceneVars[9].point, sMarioCamState->pos, 0.7f); vec3f_get_dist_and_angle(c->pos, focus, &dist, &pitch, &yaw); - vec3f_get_pitch(c->pos, sCutsceneVars[9].point, &pitch); + pitch = calculate_pitch(c->pos, sCutsceneVars[9].point); vec3f_set_dist_and_angle(c->pos, pos, dist, pitch, yaw); focus[1] = focus[1] + (sCutsceneVars[9].point[1] - focus[1]) * 0.1f; @@ -8136,8 +8250,8 @@ void cutscene_dialog_move_mario_shoulder(struct Camera *c) { vec3f_set_dist_and_angle(sCutsceneVars[8].point, pos, dist, pitch, yaw); // Move up if Mario is below the focus object, down is Mario is above - vec3f_get_pitch(sCutsceneVars[9].point, sCutsceneVars[8].point, &pitch); - pos[1] = sCutsceneVars[8].point[1] + (sins(pitch) * 100.f); + pos[1] = sCutsceneVars[8].point[1] + + sins(calculate_pitch(sCutsceneVars[9].point, sCutsceneVars[8].point)) * 100.f; approach_f32_asymptotic_bool(&c->pos[1], pos[1], 0.05f); c->pos[0] = pos[0]; @@ -8477,9 +8591,8 @@ void cutscene_non_painting_death(struct Camera *c) { * because cvar1 rotates until is reaches 0, so it's important that it's a multiple of 0x100. */ void cutscene_cap_switch_press_start(struct Camera *c) { - s16 yaw; store_info_star(c); - vec3f_get_yaw(sMarioCamState->pos, c->pos, &yaw); + s16 yaw = calculate_yaw(sMarioCamState->pos, c->pos); sCutsceneVars[3].angle[1] = 0x1200; // Basically the amount of rotation to get from behind Mario to in front of Mario sCutsceneVars[1].angle[1] = (yaw - (sMarioCamState->faceAngle[1] + sCutsceneVars[3].angle[1])) & 0xFF00; diff --git a/src/game/camera.h b/src/game/camera.h index c18e8d56..5b839d71 100644 --- a/src/game/camera.h +++ b/src/game/camera.h @@ -21,6 +21,7 @@ * @see camera.c */ +#define ABS2(x) ((x) >= 0.f ? (x) : -(x)) #define LEVEL_AREA_INDEX(levelNum, areaNum) (((levelNum) << 4) + (areaNum)) /** @@ -703,6 +704,12 @@ void random_vec3s(Vec3s dst, s16 xRange, s16 yRange, s16 zRange); s32 clamp_positions_and_find_yaw(Vec3f pos, Vec3f origin, f32 xMax, f32 xMin, f32 zMax, f32 zMin); s32 is_range_behind_surface(Vec3f from, Vec3f to, struct Surface *surf, s16 range, s16 surfType); void scale_along_line(Vec3f dest, Vec3f from, Vec3f to, f32 scale); +s16 calculate_pitch(Vec3f from, Vec3f to); +s16 calculate_yaw(Vec3f from, Vec3f to); +void calculate_angles(Vec3f from, Vec3f to, s16 *pitch, s16 *yaw); +f32 calc_abs_dist(Vec3f a, Vec3f b); +f32 calc_abs_dist_squared(Vec3f a, Vec3f b); +f32 calc_hor_dist(Vec3f a, Vec3f b); void rotate_in_xz(Vec3f dst, Vec3f src, s16 yaw); void rotate_in_yz(Vec3f dst, Vec3f src, s16 pitch); void set_camera_pitch_shake(s16 mag, s16 decay, s16 inc); From 1e1aa3754f8659f6e8ddb0138886341aad81e18d Mon Sep 17 00:00:00 2001 From: thecozies Date: Sun, 3 Oct 2021 10:30:30 -0500 Subject: [PATCH 79/97] Revert "Some more cleanup" This reverts commit ea0fd25a73226d930687fdf2b106937dcec5d41d. --- enhancements/mem_error_screen.patch | 2 +- enhancements/reonucam3.patch | 4 +- src/audio/effects.c | 2 +- src/audio/external.c | 4 ++ src/audio/load_sh.c | 4 +- src/engine/surface_load.c | 10 ++--- src/game/behaviors/activated_bf_plat.inc.c | 2 +- .../behaviors/animated_floor_switch.inc.c | 2 +- src/game/behaviors/bubba.inc.c | 2 +- src/game/behaviors/chain_chomp.inc.c | 4 +- src/game/behaviors/clam.inc.c | 2 +- src/game/behaviors/coffin.inc.c | 2 +- src/game/behaviors/end_birds_1.inc.c | 2 +- src/game/behaviors/end_birds_2.inc.c | 2 +- src/game/behaviors/enemy_lakitu.inc.c | 8 ++-- src/game/behaviors/eyerok.inc.c | 18 ++++----- src/game/behaviors/fire_piranha_plant.inc.c | 6 +-- src/game/behaviors/fly_guy.inc.c | 4 +- .../behaviors/flying_bookend_switch.inc.c | 2 +- src/game/behaviors/goomba.inc.c | 4 +- src/game/behaviors/haunted_chair.inc.c | 2 +- src/game/behaviors/intro_lakitu.inc.c | 21 +++++----- src/game/behaviors/intro_peach.inc.c | 6 +-- src/game/behaviors/klepto.inc.c | 4 +- src/game/behaviors/koopa.inc.c | 19 +++++----- src/game/behaviors/monty_mole.inc.c | 2 +- src/game/behaviors/mr_blizzard.inc.c | 2 +- src/game/behaviors/mr_i.inc.c | 2 +- src/game/behaviors/pokey.inc.c | 20 ++++++---- src/game/behaviors/recovery_heart.inc.c | 2 +- src/game/behaviors/shock_wave.inc.c | 2 +- src/game/behaviors/skeeter.inc.c | 4 +- src/game/behaviors/snufit.inc.c | 2 +- src/game/behaviors/spiny.inc.c | 6 +-- src/game/behaviors/swoop.inc.c | 2 +- src/game/behaviors/thi_top.inc.c | 2 +- src/game/behaviors/ttc_2d_rotator.inc.c | 2 +- src/game/behaviors/ttc_moving_bar.inc.c | 4 +- src/game/behaviors/ttc_pendulum.inc.c | 2 +- src/game/behaviors/water_bomb.inc.c | 8 ++-- src/game/behaviors/water_bomb_cannon.inc.c | 4 +- src/game/behaviors/wiggler.inc.c | 4 +- src/game/camera.c | 26 ++++++++----- src/game/debug.c | 18 ++++----- src/game/envfx_bubbles.c | 4 +- src/game/interaction.c | 38 +++++++++++++------ src/game/level_update.c | 9 +++-- src/game/mario.c | 15 ++++---- src/game/mario_actions_airborne.c | 2 +- src/game/mario_misc.c | 6 ++- src/game/obj_behaviors_2.c | 7 ++-- src/game/object_list_processor.c | 6 +-- src/game/spawn_object.c | 3 +- src/goddard/renderer.c | 2 +- src/goddard/shape_helper.c | 2 +- src/menu/file_select.c | 2 +- 56 files changed, 193 insertions(+), 155 deletions(-) diff --git a/enhancements/mem_error_screen.patch b/enhancements/mem_error_screen.patch index d2a21024..c6c76eef 100644 --- a/enhancements/mem_error_screen.patch +++ b/enhancements/mem_error_screen.patch @@ -258,7 +258,7 @@ index 00000000..f432927c + dl_ia_text_end); // Reset back to default render settings. + gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW); + } else { -+ gDelayForErrorMessage++; ++ gDelayForErrorMessage += 1; + } + } + diff --git a/enhancements/reonucam3.patch b/enhancements/reonucam3.patch index 739c253d..efc6aec6 100644 --- a/enhancements/reonucam3.patch +++ b/enhancements/reonucam3.patch @@ -394,14 +394,14 @@ index 6cbfd8e1..01dd4de8 100644 + + if (gPlayer1Controller->buttonPressed & R_JPAD) { + if (gCameraSpeed < 4) { -+ gCameraSpeed++; ++ gCameraSpeed += 1; + } else { + gCameraSpeed = 0; + } + save_file_set_camera_speed(gCameraSpeed); + } else if (gPlayer1Controller->buttonPressed & L_JPAD) { + if (gCameraSpeed > 0) { -+ gCameraSpeed--; ++ gCameraSpeed -= 1; + } else { + gCameraSpeed = 4; + } diff --git a/src/audio/effects.c b/src/audio/effects.c index 5bfc7c29..f18af4af 100644 --- a/src/audio/effects.c +++ b/src/audio/effects.c @@ -511,7 +511,7 @@ s32 adsr_update(struct AdsrState *adsr) { } case ADSR_STATE_SUSTAIN: - adsr->delay--; + adsr->delay -= 1; if (adsr->delay == 0) { adsr->state = ADSR_STATE_RELEASE; } diff --git a/src/audio/external.c b/src/audio/external.c index 72345ea0..fe095c99 100644 --- a/src/audio/external.c +++ b/src/audio/external.c @@ -1274,6 +1274,9 @@ static u8 get_sound_reverb(UNUSED u8 bank, UNUSED u8 soundIndex, u8 channelIndex return reverb; } +static void noop_8031EEC8(void) { +} + /** * Called from the game loop thread to inform the audio thread that a new game * frame has started. @@ -1285,6 +1288,7 @@ void audio_signal_game_loop_tick(void) { #if defined(VERSION_EU) || defined(VERSION_SH) maybe_tick_game_sound(); #endif + noop_8031EEC8(); } /** diff --git a/src/audio/load_sh.c b/src/audio/load_sh.c index b5577c7d..5a0e293a 100644 --- a/src/audio/load_sh.c +++ b/src/audio/load_sh.c @@ -1488,7 +1488,7 @@ void func_sh_802f5310(s32 bankId, struct AudioBank *mem, struct PatchStruct *pat if (D_SH_8034F68C != 0 && sp4C == 0) { temp_s0 = D_SH_8034EC88[D_SH_8034F68C - 1].sample; temp = (temp_s0->size >> 12); - temp++; + temp += 1; count = (uintptr_t) temp_s0->sampleAddr; func_sh_802f4cb4( count, @@ -1540,7 +1540,7 @@ next: sampleAddr = sample->sampleAddr; size = sample->size; unk = size >> 0xC; - unk++; + unk += 1; added = ((sampleAddr + size) + sample->medium); if (added != D_SH_8034EC88[D_SH_8034F68C - 1].endAndMediumIdentification) { D_SH_8034EC88[D_SH_8034F68C - 1].isFree = TRUE; diff --git a/src/engine/surface_load.c b/src/engine/surface_load.c index acd6e2c6..d7d8818d 100644 --- a/src/engine/surface_load.c +++ b/src/engine/surface_load.c @@ -173,7 +173,7 @@ static s32 lower_cell_index(s32 coord) { //! Some wall checks are larger than the buffer, meaning wall checks can // miss walls that are near a cell border. if (coord % CELL_SIZE < 50) { - index--; + index -= 1; } if (index < 0) { @@ -205,7 +205,7 @@ static s32 upper_cell_index(s32 coord) { //! Some wall checks are larger than the buffer, meaning wall checks can // miss walls that are near a cell border. if (coord % CELL_SIZE > CELL_SIZE - 50) { - index++; + index += 1; } if (index > (NUM_CELLS - 1)) { @@ -372,12 +372,12 @@ static void load_static_surfaces(TerrainData **data, TerrainData *vertexData, s3 s32 flags = surf_has_no_cam_collision(surfaceType); numSurfaces = *(*data); - (*data)++; + *data += 1; for (i = 0; i < numSurfaces; i++) { if (*surfaceRooms != NULL) { room = *(*surfaceRooms); - (*surfaceRooms)++; + *surfaceRooms += 1; } surface = read_surface_data(vertexData, data); @@ -404,7 +404,7 @@ static void load_static_surfaces(TerrainData **data, TerrainData *vertexData, s3 #else *data += 3; if (hasForce) { - (*data)++; + *data += 1; } #endif } diff --git a/src/game/behaviors/activated_bf_plat.inc.c b/src/game/behaviors/activated_bf_plat.inc.c index 5ed32c98..e58205fd 100644 --- a/src/game/behaviors/activated_bf_plat.inc.c +++ b/src/game/behaviors/activated_bf_plat.inc.c @@ -76,7 +76,7 @@ void bhv_activated_back_and_forth_platform_update(void) { // and one more frame of "lag" after it finally reaches 0 here, // Mario actually has to wait 22 frames before the platform starts moving. if (o->oActivatedBackAndForthPlatformCountdown != 0) { - o->oActivatedBackAndForthPlatformCountdown--; + o->oActivatedBackAndForthPlatformCountdown -= 1; } else { // After the wait period is over, we start moving, by adding the velocity // to the positional offset. diff --git a/src/game/behaviors/animated_floor_switch.inc.c b/src/game/behaviors/animated_floor_switch.inc.c index 27b87a4b..e79cb177 100644 --- a/src/game/behaviors/animated_floor_switch.inc.c +++ b/src/game/behaviors/animated_floor_switch.inc.c @@ -63,7 +63,7 @@ void bhv_animates_on_floor_switch_press_loop(void) { } if (o->oFloorSwitchPressAnimationDoubleFrame < 9) { - o->oFloorSwitchPressAnimationDoubleFrame++; + o->oFloorSwitchPressAnimationDoubleFrame += 1; } } else if ((o->oFloorSwitchPressAnimationDoubleFrame -= 2) < 0) { o->oFloorSwitchPressAnimationDoubleFrame = 0; diff --git a/src/game/behaviors/bubba.inc.c b/src/game/behaviors/bubba.inc.c index afd4c46f..d51a4b40 100644 --- a/src/game/behaviors/bubba.inc.c +++ b/src/game/behaviors/bubba.inc.c @@ -36,7 +36,7 @@ void bubba_act_0(void) { } else if (o->oTimer > 30 && o->oDistanceToMario < 2000.0f) { o->oAction = 1; } else if (o->oBubbaRandomTimer != 0) { - o->oBubbaRandomTimer--; + o->oBubbaRandomTimer -= 1; } else { o->oBubbaTargetYaw = obj_random_fixed_turn(0x2000); o->oBubbaRandomTimer = random_linear_offset(100, 100); diff --git a/src/game/behaviors/chain_chomp.inc.c b/src/game/behaviors/chain_chomp.inc.c index 48468d78..c49256a4 100644 --- a/src/game/behaviors/chain_chomp.inc.c +++ b/src/game/behaviors/chain_chomp.inc.c @@ -150,7 +150,7 @@ static void chain_chomp_sub_act_turn(void) { o->oChainChompTargetPitch = obj_get_pitch_from_vel(); } } else { - o->oTimer--; + o->oTimer -= 1; } } else { o->oForwardVel = 0.0f; @@ -235,7 +235,7 @@ static void chain_chomp_released_lunge_around(void) { if (o->oChainChompNumLunges == 0) { if (cur_obj_rotate_yaw_toward(o->oAngleToMario, 0x320)) { if (o->oTimer > 60) { - o->oChainChompNumLunges++; + o->oChainChompNumLunges += 1; // enable wall collision o->oWallHitboxRadius = 200.0f; } diff --git a/src/game/behaviors/clam.inc.c b/src/game/behaviors/clam.inc.c index 8679b4b2..b9ef5038 100644 --- a/src/game/behaviors/clam.inc.c +++ b/src/game/behaviors/clam.inc.c @@ -24,7 +24,7 @@ void clam_act_0(void) { cur_obj_play_sound_2(SOUND_GENERAL_CLAM_SHELL2); o->oAction = 1; } else if (o->oClamShakeTimer != 0) { - o->oClamShakeTimer--; + o->oClamShakeTimer -= 1; cur_obj_shake_y(3.0f); } } diff --git a/src/game/behaviors/coffin.inc.c b/src/game/behaviors/coffin.inc.c index dc35492e..35ad15d4 100644 --- a/src/game/behaviors/coffin.inc.c +++ b/src/game/behaviors/coffin.inc.c @@ -49,7 +49,7 @@ void bhv_coffin_spawner_loop(void) { } } - o->oAction++; + o->oAction += 1; } } else if (o->activeFlags & ACTIVE_FLAG_IN_DIFFERENT_ROOM) { o->oAction = COFFIN_SPAWNER_ACT_COFFINS_UNLOADED; diff --git a/src/game/behaviors/end_birds_1.inc.c b/src/game/behaviors/end_birds_1.inc.c index cb39e98a..38deec59 100644 --- a/src/game/behaviors/end_birds_1.inc.c +++ b/src/game/behaviors/end_birds_1.inc.c @@ -9,7 +9,7 @@ void bhv_end_birds_1_loop(void) { gCurrentObject->oIntroLakituEndBirds1DestX = -554.f; gCurrentObject->oIntroLakituEndBirds1DestY = 3044.f; gCurrentObject->oIntroLakituEndBirds1DestZ = -1314.f; - gCurrentObject->oAction = 1; + gCurrentObject->oAction += 1; break; case 1: vec3f_set(pos, gCurrentObject->oIntroLakituEndBirds1DestX, gCurrentObject->oIntroLakituEndBirds1DestY, diff --git a/src/game/behaviors/end_birds_2.inc.c b/src/game/behaviors/end_birds_2.inc.c index 8f5ef9dd..44fdd0f2 100644 --- a/src/game/behaviors/end_birds_2.inc.c +++ b/src/game/behaviors/end_birds_2.inc.c @@ -10,7 +10,7 @@ void bhv_end_birds_2_loop(void) { switch (gCurrentObject->oAction) { case 0: cur_obj_scale(0.7f); - gCurrentObject->oAction = 1; + gCurrentObject->oAction += 1; break; case 1: vec3f_get_dist_and_angle(gCamera->pos, gCamera->focus, &dist, &pitch, &yaw); diff --git a/src/game/behaviors/enemy_lakitu.inc.c b/src/game/behaviors/enemy_lakitu.inc.c index 670697e7..056c3f13 100644 --- a/src/game/behaviors/enemy_lakitu.inc.c +++ b/src/game/behaviors/enemy_lakitu.inc.c @@ -77,7 +77,7 @@ static void enemy_lakitu_update_speed_and_angle(void) { // Turn toward mario except right after throwing a spiny if (o->oEnemyLakituFaceForwardCountdown != 0) { - o->oEnemyLakituFaceForwardCountdown--; + o->oEnemyLakituFaceForwardCountdown -= 1; } else { obj_face_yaw_approach(o->oAngleToMario, 0x600); } @@ -96,7 +96,7 @@ static void enemy_lakitu_sub_act_no_spiny(void) { cur_obj_init_animation_with_sound(1); if (o->oEnemyLakituSpinyCooldown != 0) { - o->oEnemyLakituSpinyCooldown--; + o->oEnemyLakituSpinyCooldown -= 1; } else if (o->oEnemyLakituNumSpinies < 3 && o->oDistanceToMario < 800.0f && abs_angle_diff(o->oAngleToMario, o->oFaceAngleYaw) < 0x4000) { struct Object *spiny = spawn_object(o, MODEL_SPINY_BALL, bhvSpiny); @@ -105,7 +105,7 @@ static void enemy_lakitu_sub_act_no_spiny(void) { spiny->oAction = SPINY_ACT_HELD_BY_LAKITU; obj_init_animation_with_sound(spiny, spiny_egg_seg5_anims_050157E4, 0); - o->oEnemyLakituNumSpinies++; + o->oEnemyLakituNumSpinies += 1; o->oSubAction = ENEMY_LAKITU_SUB_ACT_HOLD_SPINY; o->oEnemyLakituSpinyCooldown = 30; } @@ -120,7 +120,7 @@ static void enemy_lakitu_sub_act_hold_spiny(void) { cur_obj_init_anim_extend(3); if (o->oEnemyLakituSpinyCooldown != 0) { - o->oEnemyLakituSpinyCooldown--; + o->oEnemyLakituSpinyCooldown -= 1; } // TODO: Check if anything interesting happens if we bypass this with speed else if (o->oDistanceToMario > o->oDrawingDistance - 100.0f diff --git a/src/game/behaviors/eyerok.inc.c b/src/game/behaviors/eyerok.inc.c index 33b49610..eb7f7c73 100644 --- a/src/game/behaviors/eyerok.inc.c +++ b/src/game/behaviors/eyerok.inc.c @@ -44,7 +44,7 @@ static void eyerok_boss_act_wake_up(void) { if (o->oTimer > 5) { if (o->oSubAction == 0) { seq_player_lower_volume(SEQ_PLAYER_LEVEL, 60, 40); - o->oSubAction++; + o->oSubAction += 1; } if (o->oEyerokBossOffsetFromHome == 0.0f && mario_ready_to_speak() != 0) { @@ -79,18 +79,18 @@ static void eyerok_boss_act_fight(void) { o->oEyerokBossAttackCountdown = 1; } } else { - o->oEyerokBossAttackCountdown--; + o->oEyerokBossAttackCountdown -= 1; } if (o->oEyerokBossAttackCountdown != 0 && o->oEyerokBossAttackCountdown != 1) { - o->oEyerokBossAttackPhase++; + o->oEyerokBossAttackPhase += 1; if ((o->oEyerokBossActiveHand = o->oEyerokBossAttackPhase & 0x1) == 0) { o->oEyerokBossActiveHand = -1; } } } } else { - o->oEyerokBossAttackPhase++; + o->oEyerokBossAttackPhase += 1; if (eyerok_check_mario_relative_z(400)) { o->oEyerokBossAttackCountdown = -8; @@ -120,7 +120,7 @@ static void eyerok_boss_act_die(void) { if (cur_obj_update_dialog_with_cutscene(MARIO_DIALOG_LOOK_UP, DIALOG_FLAG_NONE, CUTSCENE_DIALOG, DIALOG_118)) { spawn_default_star(0.0f, -900.0f, -3700.0f); } else { - o->oTimer--; + o->oTimer -= 1; } } else if (o->oTimer > 120) { stop_background_music(SEQUENCE_ARGS(4, SEQ_EVENT_BOSS)); @@ -156,7 +156,7 @@ static s32 eyerok_hand_check_attacked(void) { o->oAction = EYEROK_HAND_ACT_ATTACKED; o->oVelY = 30.0f; } else { - o->parentObj->oEyerokBossNumHands--; + o->parentObj->oEyerokBossNumHands -= 1; o->oAction = EYEROK_HAND_ACT_DIE; o->oVelY = 50.0f; } @@ -183,7 +183,7 @@ static void eyerok_hand_act_sleep(void) { if (o->parentObj->oAction != EYEROK_BOSS_ACT_SLEEP && ++o->oEyerokHandWakeUpTimer > -3 * o->oBehParams2ndByte) { if (cur_obj_check_if_near_animation_end()) { - o->parentObj->oEyerokBossNumHands++; + o->parentObj->oEyerokBossNumHands += 1; o->oAction = EYEROK_HAND_ACT_IDLE; o->collisionData = segmented_to_virtual(&ssl_seg7_collision_07028274); } else { @@ -268,14 +268,14 @@ static void eyerok_hand_act_show_eye(void) { if (!eyerok_hand_check_attacked()) { if (o->parentObj->oEyerokBossActiveHand == 0) { if (o->oAnimState < 3) { - o->oAnimState++; + o->oAnimState += 1; } else if (cur_obj_check_if_near_animation_end()) { o->oAction = EYEROK_HAND_ACT_CLOSE; } } else { if (o->oEyerokHandEyeShownTimer--) { if (o->oEyerokHandAnimStateIndex != 0) { - o->oEyerokHandAnimStateIndex--; + o->oEyerokHandAnimStateIndex -= 1; } o->oAnimState = sEyerokAnimStatesList[o->oEyerokHandAnimStateIndex]; } else { diff --git a/src/game/behaviors/fire_piranha_plant.inc.c b/src/game/behaviors/fire_piranha_plant.inc.c index 9b077b29..6e58fef0 100644 --- a/src/game/behaviors/fire_piranha_plant.inc.c +++ b/src/game/behaviors/fire_piranha_plant.inc.c @@ -56,7 +56,7 @@ static void fire_piranha_plant_act_hide(void) { 0.04f * o->oFirePiranhaPlantNeutralScale)) { cur_obj_become_intangible(); if (o->oFirePiranhaPlantActive) { - sNumActiveFirePiranhaPlants--; + sNumActiveFirePiranhaPlants -= 1; o->oFirePiranhaPlantActive = FALSE; if ((u16)(o->oBehParams >> 16) != 0 && o->oHealth == 0) { @@ -72,7 +72,7 @@ static void fire_piranha_plant_act_hide(void) { cur_obj_play_sound_2(SOUND_OBJ_PIRANHA_PLANT_APPEAR); o->oFirePiranhaPlantActive = TRUE; - sNumActiveFirePiranhaPlants++; + sNumActiveFirePiranhaPlants += 1; cur_obj_unhide(); o->oAction = FIRE_PIRANHA_PLANT_ACT_GROW; @@ -127,7 +127,7 @@ void bhv_fire_piranha_plant_update(void) { if (obj_check_attacks(&sFirePiranhaPlantHitbox, o->oAction)) { if (--o->oHealth < 0) { if (o->oFirePiranhaPlantActive) { - sNumActiveFirePiranhaPlants--; + sNumActiveFirePiranhaPlants -= 1; } } else { cur_obj_init_animation_with_sound(2); diff --git a/src/game/behaviors/fly_guy.inc.c b/src/game/behaviors/fly_guy.inc.c index c7e24e8a..4ae1f844 100644 --- a/src/game/behaviors/fly_guy.inc.c +++ b/src/game/behaviors/fly_guy.inc.c @@ -45,7 +45,7 @@ static void fly_guy_act_idle(void) { o->oAction = FLY_GUY_ACT_APPROACH_MARIO; } else { o->oFlyGuyUnusedJitter = o->oMoveAngleYaw + sFlyGuyJitterAmounts[o->oFlyGuyIdleTimer]; - o->oFlyGuyIdleTimer++; + o->oFlyGuyIdleTimer += 1; } } } @@ -190,7 +190,7 @@ void bhv_fly_guy_update(void) { } // Oscillate up and down - o->oFlyGuyOscTimer++; + o->oFlyGuyOscTimer += 1; o->oPosY += coss(0x400 * o->oFlyGuyOscTimer) * 1.5f; switch (o->oAction) { diff --git a/src/game/behaviors/flying_bookend_switch.inc.c b/src/game/behaviors/flying_bookend_switch.inc.c index d401e453..76418346 100644 --- a/src/game/behaviors/flying_bookend_switch.inc.c +++ b/src/game/behaviors/flying_bookend_switch.inc.c @@ -270,7 +270,7 @@ void bhv_book_switch_loop(void) { if (o->oAction != 0) { if (o->parentObj->oBookSwitchManagerNumCorrectChoices == o->oBehParams2ndByte) { play_sound(SOUND_GENERAL2_RIGHT_ANSWER, gGlobalSoundSource); - o->parentObj->oBookSwitchManagerNumCorrectChoices++; + o->parentObj->oBookSwitchManagerNumCorrectChoices += 1; } else { rand01 = random_u16() & 0x1; z = gMarioObject->oPosZ + 1.5f * gMarioStates[0].vel[2]; diff --git a/src/game/behaviors/goomba.inc.c b/src/game/behaviors/goomba.inc.c index 42583c27..c1155eca 100644 --- a/src/game/behaviors/goomba.inc.c +++ b/src/game/behaviors/goomba.inc.c @@ -95,7 +95,7 @@ void bhv_goomba_triplet_spawner_update(void) { } } - o->oAction++; + o->oAction += 1; } } else if (o->oDistanceToMario > 4000.0f) { // If mario is too far away, enter the unloaded action. The goombas @@ -194,7 +194,7 @@ static void goomba_act_walk(void) { o->oGoombaRelativeSpeed = 4.0f / 3.0f; if (o->oGoombaWalkTimer != 0) { - o->oGoombaWalkTimer--; + o->oGoombaWalkTimer -= 1; } else { if (random_u16() & 3) { o->oGoombaTargetYaw = obj_random_fixed_turn(0x2000); diff --git a/src/game/behaviors/haunted_chair.inc.c b/src/game/behaviors/haunted_chair.inc.c index 29d8cb47..4b6a6120 100644 --- a/src/game/behaviors/haunted_chair.inc.c +++ b/src/game/behaviors/haunted_chair.inc.c @@ -59,7 +59,7 @@ void haunted_chair_act_0(void) { } } else if (o->oHauntedChairSpinTimer != 0) { if (o->oDistanceToMario < 500.0f) { - o->oHauntedChairSpinTimer--; + o->oHauntedChairSpinTimer -= 1; } o->oTimer = 0.0f; } else { diff --git a/src/game/behaviors/intro_lakitu.inc.c b/src/game/behaviors/intro_lakitu.inc.c index a36f8614..8bf6adaf 100644 --- a/src/game/behaviors/intro_lakitu.inc.c +++ b/src/game/behaviors/intro_lakitu.inc.c @@ -43,9 +43,9 @@ s32 intro_lakitu_set_pos_and_focus(struct Object *obj, struct CutsceneSplinePoin s32 splineFinished = 0; s16 splineSegment = obj->oIntroLakituSplineSegment; - if ((move_point_along_spline(newFocus, offset, &splineSegment, &(obj->oIntroLakituSplineSegmentProgress)) == 1) - || (move_point_along_spline(newOffset, focus, &splineSegment, &(obj->oIntroLakituSplineSegmentProgress)) == 1)) - splineFinished++; + if ((move_point_along_spline(newFocus, offset, &splineSegment, &(o->oIntroLakituSplineSegmentProgress)) == 1) + || (move_point_along_spline(newOffset, focus, &splineSegment, &(o->oIntroLakituSplineSegmentProgress)) == 1)) + splineFinished += 1; obj->oIntroLakituSplineSegment = splineSegment; intro_lakitu_set_offset_from_camera(obj, newOffset); @@ -64,11 +64,10 @@ void bhv_intro_lakitu_loop(void) { gCurrentObject->oIntroLakituSplineSegmentProgress = 0.f; gCurrentObject->oIntroLakituCloud = spawn_object_relative_with_scale(1, 0, 0, 0, 2.f, gCurrentObject, MODEL_MIST, bhvCloud); - if (gCamera->cutscene == CUTSCENE_END_WAVING) { + if (gCamera->cutscene == CUTSCENE_END_WAVING) gCurrentObject->oAction = 100; - } else { - gCurrentObject->oAction = 1; - } + else + gCurrentObject->oAction += 1; break; case 1: @@ -83,7 +82,7 @@ void bhv_intro_lakitu_loop(void) { if (intro_lakitu_set_pos_and_focus(gCurrentObject, gIntroLakituStartToPipeOffsetFromCamera, gIntroLakituStartToPipeFocus) == 1) - gCurrentObject->oAction = 2; + gCurrentObject->oAction += 1; switch (gCurrentObject->oTimer) { #if defined(VERSION_US) || defined(VERSION_SH) @@ -112,7 +111,7 @@ void bhv_intro_lakitu_loop(void) { #else if (gCutsceneTimer > 720) { #endif - gCurrentObject->oAction = 3; + gCurrentObject->oAction += 1; gCurrentObject->oIntroLakituDistToBirdsX = 1400.f; gCurrentObject->oIntroLakituDistToBirdsZ = -4096.f; gCurrentObject->oIntroLakituEndBirds1DestZ = 2048.f; @@ -174,7 +173,7 @@ void bhv_intro_lakitu_loop(void) { gCurrentObject->oMoveAngleYaw = 0x9000; gCurrentObject->oFaceAnglePitch = gCurrentObject->oMoveAnglePitch / 2; gCurrentObject->oFaceAngleYaw = gCurrentObject->oMoveAngleYaw; - gCurrentObject->oAction++; + gCurrentObject->oAction += 1; break; case 101: @@ -187,7 +186,7 @@ void bhv_intro_lakitu_loop(void) { gCurrentObject->oFaceAngleYaw = camera_approach_s16_symmetric(gCurrentObject->oFaceAngleYaw, yawToCam, 0x200); } if (gCurrentObject->oTimer > 105) { - gCurrentObject->oAction++; + gCurrentObject->oAction += 1; gCurrentObject->oMoveAnglePitch = 0xE00; } gCurrentObject->oFaceAnglePitch = 0; diff --git a/src/game/behaviors/intro_peach.inc.c b/src/game/behaviors/intro_peach.inc.c index 906dbc39..2be37428 100644 --- a/src/game/behaviors/intro_peach.inc.c +++ b/src/game/behaviors/intro_peach.inc.c @@ -20,7 +20,7 @@ void intro_peach_set_pos_and_opacity(struct Object *obj, f32 targetOpacity, f32 void bhv_intro_peach_loop(void) { switch (gCurrentObject->oAction) { case 0: - gCurrentObject->oAction = 1; + gCurrentObject->oAction += 1; gCurrentObject->oFaceAnglePitch = 0x400; gCurrentObject->oFaceAngleYaw = 0x7500; gCurrentObject->oFaceAngleRoll = -0x3700; @@ -34,13 +34,13 @@ void bhv_intro_peach_loop(void) { intro_peach_set_pos_and_opacity(gCurrentObject, 0.f, 0.f); if (gCurrentObject->oTimer > 20) - gCurrentObject->oAction = 2; + gCurrentObject->oAction += 1; break; case 2: intro_peach_set_pos_and_opacity(gCurrentObject, 255.f, 3.f); if ((gCurrentObject->oTimer > 100) && (get_dialog_id() == DIALOG_NONE)) - gCurrentObject->oAction = 3; + gCurrentObject->oAction += 1; break; case 3: intro_peach_set_pos_and_opacity(gCurrentObject, 0.f, 8.f); diff --git a/src/game/behaviors/klepto.inc.c b/src/game/behaviors/klepto.inc.c index 561c4673..f547a0f5 100644 --- a/src/game/behaviors/klepto.inc.c +++ b/src/game/behaviors/klepto.inc.c @@ -63,7 +63,7 @@ static void klepto_anim_dive(void) { obj_move_pitch_approach(o->oKleptoPitchToTarget, 600); if (klepto_set_and_check_if_anim_at_end() != 0) { if (o->oKleptoDiveTimer != 0) { - o->oKleptoDiveTimer++; + o->oKleptoDiveTimer += 1; } else if (o->oKleptoPitchToTarget > -100) { o->oKleptoDiveTimer = random_linear_offset(60, 60); } @@ -234,7 +234,7 @@ static void klepto_act_dive_at_mario(void) { o->oKleptoYawToTarget = o->oAngleToMario; if (dy < 160.0f) { - o->oSubAction++; + o->oSubAction += 1; } } diff --git a/src/game/behaviors/koopa.inc.c b/src/game/behaviors/koopa.inc.c index 14417a76..2efdfc86 100644 --- a/src/game/behaviors/koopa.inc.c +++ b/src/game/behaviors/koopa.inc.c @@ -133,7 +133,7 @@ static void koopa_walk_start(void) { obj_forward_vel_approach(3.0f * o->oKoopaAgility, 0.3f * o->oKoopaAgility); if (cur_obj_init_anim_and_check_if_end(11)) { - o->oSubAction++; + o->oSubAction += 1; o->oKoopaCountdown = random_linear_offset(30, 100); } } @@ -146,9 +146,9 @@ static void koopa_walk(void) { koopa_play_footstep_sound(2, 17); if (o->oKoopaCountdown != 0) { - o->oKoopaCountdown--; + o->oKoopaCountdown -= 1; } else if (cur_obj_check_if_near_animation_end()) { - o->oSubAction++; + o->oSubAction += 1; } } @@ -244,7 +244,7 @@ static void koopa_shelled_act_lying(void) { cur_obj_init_anim_extend(5); koopa_dive_update_speed(0.3f); } else if (o->oKoopaCountdown != 0) { - o->oKoopaCountdown--; + o->oKoopaCountdown -= 1; cur_obj_extend_animation_if_at_end(); } else if (cur_obj_init_anim_and_check_if_end(6)) { o->oAction = KOOPA_SHELLED_ACT_STOPPED; @@ -350,7 +350,7 @@ static void koopa_unshelled_act_run(void) { obj_bounce_off_walls_edges_objects(&o->oKoopaTargetYaw))) { // Otherwise run around randomly if (o->oKoopaUnshelledTimeUntilTurn != 0) { - o->oKoopaUnshelledTimeUntilTurn--; + o->oKoopaUnshelledTimeUntilTurn -= 1; } else { o->oKoopaTargetYaw = obj_random_fixed_turn(0x2000); } @@ -424,7 +424,7 @@ static void koopa_unshelled_act_dive(void) { } koopa_dive_update_speed(0.5f); } else if (o->oKoopaCountdown != 0) { - o->oKoopaCountdown--; + o->oKoopaCountdown -= 1; cur_obj_extend_animation_if_at_end(); } else if (cur_obj_init_anim_and_check_if_end(6)) { o->oAction = KOOPA_UNSHELLED_ACT_RUN; @@ -491,7 +491,7 @@ static void koopa_the_quick_act_wait_before_race(void) { koopa_shelled_act_stopped(); if (o->oKoopaTheQuickInitTextboxCooldown != 0) { - o->oKoopaTheQuickInitTextboxCooldown--; + o->oKoopaTheQuickInitTextboxCooldown -= 1; } else if (cur_obj_can_mario_activate_textbox_2(400.0f, 400.0f)) { //! The next action doesn't execute until next frame, giving mario one // frame where he can jump, and thus no longer be ready to speak. @@ -650,10 +650,11 @@ static void koopa_the_quick_act_race(void) { break; case KOOPA_THE_QUICK_SUB_ACT_JUMP: - // We could perform a goomba double jump if we could deactivate ktq + // We could perform a goomba double jump if we could deactivate + // ktq if (o->oMoveFlags & OBJ_MOVE_MASK_ON_GROUND) { if (cur_obj_init_anim_and_check_if_end(13)) { - o->oSubAction--; + o->oSubAction -= 1; } koopa_the_quick_detect_bowling_ball(); diff --git a/src/game/behaviors/monty_mole.inc.c b/src/game/behaviors/monty_mole.inc.c index a538a8f7..3276cefd 100644 --- a/src/game/behaviors/monty_mole.inc.c +++ b/src/game/behaviors/monty_mole.inc.c @@ -104,7 +104,7 @@ void bhv_monty_mole_hole_update(void) { sMontyMoleHoleList = link_objects_with_behavior(bhvMontyMoleHole); sMontyMoleKillStreak = 0; } else if (o->oMontyMoleHoleCooldown > 0) { - o->oMontyMoleHoleCooldown--; + o->oMontyMoleHoleCooldown -= 1; } } diff --git a/src/game/behaviors/mr_blizzard.inc.c b/src/game/behaviors/mr_blizzard.inc.c index d3fb4bb7..6cc00ad4 100644 --- a/src/game/behaviors/mr_blizzard.inc.c +++ b/src/game/behaviors/mr_blizzard.inc.c @@ -116,7 +116,7 @@ static void mr_blizzard_act_rise_from_ground(void) { // If the timer is not 0, decrement by 1 until it reaches 0. if (o->oMrBlizzardTimer != 0) { - o->oMrBlizzardTimer--; + o->oMrBlizzardTimer -= 1; } else if ((o->oMrBlizzardGraphYOffset += o->oMrBlizzardGraphYVel) > 24.0f) { // Increments GraphYOffset by GraphYVel until it is greater than 24, // moving Mr. Blizzard's graphical position upward each frame. diff --git a/src/game/behaviors/mr_i.inc.c b/src/game/behaviors/mr_i.inc.c index 184521aa..52be2342 100644 --- a/src/game/behaviors/mr_i.inc.c +++ b/src/game/behaviors/mr_i.inc.c @@ -156,7 +156,7 @@ void mr_i_act_2(void) { o->oMrISpinAngle = 120; if (o->oMrISpinAmount > 1 << 16) o->oAction = 3; - o->oMrISpinAngle--; + o->oMrISpinAngle -= 1; if (!o->oMrISpinAngle) { o->oMrISpinAngle = 120; o->oMrISpinAmount = 0; diff --git a/src/game/behaviors/pokey.inc.c b/src/game/behaviors/pokey.inc.c index 346beea6..4d6b39c7 100644 --- a/src/game/behaviors/pokey.inc.c +++ b/src/game/behaviors/pokey.inc.c @@ -55,12 +55,15 @@ void bhv_pokey_body_part_update(void) { // index by killing two body parts on the frame before a new part // spawns, but one of the body parts shifts upward immediately, // so not very interesting - if (o->oBehParams2ndByte > 1 && !(o->parentObj->oPokeyAliveBodyPartFlags & (1 << (o->oBehParams2ndByte - 1)))) { - o->parentObj->oPokeyAliveBodyPartFlags |= (1 << (o->oBehParams2ndByte - 1)); + if (o->oBehParams2ndByte > 1 + && !(o->parentObj->oPokeyAliveBodyPartFlags & (1 << (o->oBehParams2ndByte - 1)))) { + o->parentObj->oPokeyAliveBodyPartFlags = + o->parentObj->oPokeyAliveBodyPartFlags | 1 << (o->oBehParams2ndByte - 1); - o->parentObj->oPokeyAliveBodyPartFlags &= ((1 << o->oBehParams2ndByte) ^ ~0); + o->parentObj->oPokeyAliveBodyPartFlags = + o->parentObj->oPokeyAliveBodyPartFlags & ((1 << o->oBehParams2ndByte) ^ ~0); - o->oBehParams2ndByte--; + o->oBehParams2ndByte -= 1; } // Set the bottom body part size, and gradually increase it. @@ -113,7 +116,7 @@ void bhv_pokey_body_part_update(void) { cur_obj_become_intangible(); if (--o->oPokeyBodyPartDeathDelayAfterHeadKilled < 0) { - o->parentObj->oPokeyNumAliveBodyParts--; + o->parentObj->oPokeyNumAliveBodyParts -= 1; obj_die_if_health_non_positive(); } } else { @@ -197,8 +200,9 @@ static void pokey_act_wander(void) { MODEL_POKEY_BODY_PART, bhvPokeyBodyPart); if (bodyPart != NULL) { - o->oPokeyAliveBodyPartFlags |= (1 << o->oPokeyNumAliveBodyParts); - o->oPokeyNumAliveBodyParts++; + o->oPokeyAliveBodyPartFlags = + o->oPokeyAliveBodyPartFlags | (1 << o->oPokeyNumAliveBodyParts); + o->oPokeyNumAliveBodyParts += 1; o->oPokeyBottomBodyPartSize = 0.0f; obj_scale(bodyPart, 0.0f); @@ -222,7 +226,7 @@ static void pokey_act_wander(void) { if (!(o->oPokeyTurningAwayFromWall = obj_bounce_off_walls_edges_objects(&o->oPokeyTargetYaw))) { if (o->oPokeyChangeTargetTimer != 0) { - o->oPokeyChangeTargetTimer--; + o->oPokeyChangeTargetTimer -= 1; } else if (o->oDistanceToMario > 2000.0f) { o->oPokeyTargetYaw = obj_random_fixed_turn(0x2000); o->oPokeyChangeTargetTimer = random_linear_offset(30, 50); diff --git a/src/game/behaviors/recovery_heart.inc.c b/src/game/behaviors/recovery_heart.inc.c index 167011dc..32f1de05 100644 --- a/src/game/behaviors/recovery_heart.inc.c +++ b/src/game/behaviors/recovery_heart.inc.c @@ -16,7 +16,7 @@ void bhv_recovery_heart_loop(void) { if (obj_check_if_collided_with_object(o, gMarioObject)) { if (o->oSpinningHeartPlayedSound == 0) { cur_obj_play_sound_2(SOUND_GENERAL_HEART_SPIN); - o->oSpinningHeartPlayedSound++; + o->oSpinningHeartPlayedSound += 1; } o->oAngleVelYaw = (s32)(200.0f * gMarioStates[0].forwardVel) + 1000; diff --git a/src/game/behaviors/shock_wave.inc.c b/src/game/behaviors/shock_wave.inc.c index fc291726..9665f997 100644 --- a/src/game/behaviors/shock_wave.inc.c +++ b/src/game/behaviors/shock_wave.inc.c @@ -16,7 +16,7 @@ void bhv_bowser_shock_wave_loop(void) { cur_obj_scale(o->oBowserShockWaveScale); // Slightly reduce opacity each 3 frames if (gGlobalTimer % 3) - o->oOpacity--; + o->oOpacity -= 1; // Reduce opacity faster after 70 frames have passed if (o->oTimer > fadeFrames) o->oOpacity -= 5; diff --git a/src/game/behaviors/skeeter.inc.c b/src/game/behaviors/skeeter.inc.c index 0fc3cc6e..f44c749d 100644 --- a/src/game/behaviors/skeeter.inc.c +++ b/src/game/behaviors/skeeter.inc.c @@ -48,7 +48,7 @@ static void skeeter_act_idle(void) { && obj_smooth_turn(&o->oSkeeterAngleVel, &o->oMoveAngleYaw, o->oSkeeterTargetAngle, 0.02f, 5, 50, 200)) { if (o->oSkeeterWaitTime != 0) { - o->oSkeeterWaitTime--; + o->oSkeeterWaitTime -= 1; } else if (cur_obj_check_if_near_animation_end()) { cur_obj_play_sound_2(SOUND_OBJ_WALKING_WATER); o->oAction = SKEETER_ACT_LUNGE; @@ -116,7 +116,7 @@ static void skeeter_act_walk(void) { } else { o->oSkeeterTargetForwardVel = 10.0f; if (o->oSkeeterWaitTime != 0) { - o->oSkeeterWaitTime--; + o->oSkeeterWaitTime -= 1; } else if (cur_obj_check_if_near_animation_end() != 0) { if (random_u16() & 0x0003) { o->oSkeeterTargetAngle = obj_random_fixed_turn(0x2000); diff --git a/src/game/behaviors/snufit.inc.c b/src/game/behaviors/snufit.inc.c index 1ea35cd1..128527f2 100644 --- a/src/game/behaviors/snufit.inc.c +++ b/src/game/behaviors/snufit.inc.c @@ -105,7 +105,7 @@ void snufit_act_shoot(void) { if ((u16) o->oSnufitBodyScalePeriod == 0x8000 && o->oSnufitBodyBaseScale == 167) { o->oAction = SNUFIT_ACT_IDLE; } else if (o->oSnufitBullets < 3 && o->oTimer >= 3) { - o->oSnufitBullets++; + o->oSnufitBullets += 1; cur_obj_play_sound_2(SOUND_OBJ_SNUFIT_SHOOT); spawn_object_relative(0, 0, -20, 40, o, MODEL_BOWLING_BALL, bhvSnufitBalls); o->oSnufitRecoil = -30; diff --git a/src/game/behaviors/spiny.inc.c b/src/game/behaviors/spiny.inc.c index 76339013..46c0d838 100644 --- a/src/game/behaviors/spiny.inc.c +++ b/src/game/behaviors/spiny.inc.c @@ -46,7 +46,7 @@ static s32 spiny_check_active(void) { // behave similar to a regular goomba. // It can also be used on a bob-omb respawner to change its model // to a butterfly or fish. - o->parentObj->oEnemyLakituNumSpinies--; + o->parentObj->oEnemyLakituNumSpinies -= 1; obj_mark_for_deletion(o); return FALSE; } @@ -85,7 +85,7 @@ static void spiny_act_walk(void) { obj_bounce_off_walls_edges_objects(&o->oSpinyTargetYaw))) { // Walk and occasionally randomly change direction if (o->oSpinyTimeUntilTurn != 0) { - o->oSpinyTimeUntilTurn--; + o->oSpinyTimeUntilTurn -= 1; } else { o->oSpinyTargetYaw = o->oMoveAngleYaw + (s16) random_sign() * 0x2000; o->oSpinyTimeUntilTurn = random_linear_offset(100, 100); @@ -171,7 +171,7 @@ static void spiny_act_thrown_by_lakitu(void) { if (obj_check_attacks(&sSpinyHitbox, o->oAction)) { if (o->parentObj != o) { - o->parentObj->oEnemyLakituNumSpinies--; + o->parentObj->oEnemyLakituNumSpinies -= 1; } } } diff --git a/src/game/behaviors/swoop.inc.c b/src/game/behaviors/swoop.inc.c index 84f0473d..8e628cf4 100644 --- a/src/game/behaviors/swoop.inc.c +++ b/src/game/behaviors/swoop.inc.c @@ -61,7 +61,7 @@ static void swoop_act_move(void) { o->oFaceAngleRoll = 0; } else { if (o->oSwoopBonkCountdown != 0) { - o->oSwoopBonkCountdown--; + o->oSwoopBonkCountdown -= 1; } else if (o->oVelY != 0.0f) { // If we're not done swooping, turn toward mario. When between // 0 and 200 units above mario, increase speed and stop swooping diff --git a/src/game/behaviors/thi_top.inc.c b/src/game/behaviors/thi_top.inc.c index fe30463a..727020d0 100644 --- a/src/game/behaviors/thi_top.inc.c +++ b/src/game/behaviors/thi_top.inc.c @@ -31,7 +31,7 @@ void bhv_thi_tiny_island_top_loop(void) { } else { gTHIWaterDrained |= 1; play_puzzle_jingle(); - o->oAction++; + o->oAction += 1; } } } else { diff --git a/src/game/behaviors/ttc_2d_rotator.inc.c b/src/game/behaviors/ttc_2d_rotator.inc.c index 0124bee1..46c7603e 100644 --- a/src/game/behaviors/ttc_2d_rotator.inc.c +++ b/src/game/behaviors/ttc_2d_rotator.inc.c @@ -51,7 +51,7 @@ void bhv_ttc_2d_rotator_update(void) { s32 startYaw = o->oFaceAngleYaw; if (o->oTTC2DRotatorRandomDirTimer != 0) { - o->oTTC2DRotatorRandomDirTimer--; + o->oTTC2DRotatorRandomDirTimer -= 1; } // Wait until rotated to target yaw diff --git a/src/game/behaviors/ttc_moving_bar.inc.c b/src/game/behaviors/ttc_moving_bar.inc.c index 2bee2193..e54e3c42 100644 --- a/src/game/behaviors/ttc_moving_bar.inc.c +++ b/src/game/behaviors/ttc_moving_bar.inc.c @@ -43,7 +43,7 @@ static void ttc_moving_bar_act_wait(void) { // This is zero except on the first cycle, and is used to desync the // bars from each other at the very beginning if (o->oTTCMovingBarStoppedTimer != 0) { - o->oTTCMovingBarStoppedTimer--; + o->oTTCMovingBarStoppedTimer -= 1; } else { if (gTTCSpeedSetting == TTC_SPEED_RANDOM) { // Set the delay for the next cycle @@ -70,7 +70,7 @@ static void ttc_moving_bar_act_pull_back(void) { if ((o->oTTCMovingBarSpeed += 0.73f) > 0.0f) { // Possibly pause after pulling back if (o->oTTCMovingBarStoppedTimer != 0) { - o->oTTCMovingBarStoppedTimer--; + o->oTTCMovingBarStoppedTimer -= 1; o->oTTCMovingBarSpeed = 0.0f; } else { // Begin extending diff --git a/src/game/behaviors/ttc_pendulum.inc.c b/src/game/behaviors/ttc_pendulum.inc.c index a096c124..569b4f15 100644 --- a/src/game/behaviors/ttc_pendulum.inc.c +++ b/src/game/behaviors/ttc_pendulum.inc.c @@ -42,7 +42,7 @@ void bhv_ttc_pendulum_update(void) { // Stay still for a while if (o->oTTCPendulumDelay != 0) { - o->oTTCPendulumDelay--; + o->oTTCPendulumDelay -= 1; } else { // Accelerate in the direction that moves angle to zero if (o->oTTCPendulumAngle * o->oTTCPendulumAccelDir > 0.0f) { diff --git a/src/game/behaviors/water_bomb.inc.c b/src/game/behaviors/water_bomb.inc.c index 1e293dbf..f239af68 100644 --- a/src/game/behaviors/water_bomb.inc.c +++ b/src/game/behaviors/water_bomb.inc.c @@ -39,7 +39,7 @@ void bhv_water_bomb_spawner_update(void) { if (!o->oWaterBombSpawnerBombActive && latDistToMario < spawnerRadius && gMarioObject->oPosY - o->oPosY < 1000.0f) { if (o->oWaterBombSpawnerTimeToSpawn != 0) { - o->oWaterBombSpawnerTimeToSpawn--; + o->oWaterBombSpawnerTimeToSpawn -= 1; } else { struct Object *waterBomb = spawn_object_relative(0, 0, 2000, 0, o, MODEL_WATER_BOMB, bhvWaterBomb); @@ -50,8 +50,10 @@ void bhv_water_bomb_spawner_update(void) { waterBomb->oAction = WATER_BOMB_ACT_INIT; - waterBomb->oPosX = gMarioObject->oPosX + waterBombDistToMario * sins(gMarioObject->oMoveAngleYaw); - waterBomb->oPosZ = gMarioObject->oPosZ + waterBombDistToMario * coss(gMarioObject->oMoveAngleYaw); + waterBomb->oPosX = + gMarioObject->oPosX + waterBombDistToMario * sins(gMarioObject->oMoveAngleYaw); + waterBomb->oPosZ = + gMarioObject->oPosZ + waterBombDistToMario * coss(gMarioObject->oMoveAngleYaw); spawn_object(waterBomb, MODEL_WATER_BOMB_SHADOW, bhvWaterBombShadow); diff --git a/src/game/behaviors/water_bomb_cannon.inc.c b/src/game/behaviors/water_bomb_cannon.inc.c index 8e884452..a606d48d 100644 --- a/src/game/behaviors/water_bomb_cannon.inc.c +++ b/src/game/behaviors/water_bomb_cannon.inc.c @@ -52,14 +52,14 @@ void water_bomb_cannon_act_1(void) { o->oAction = 2; } else if (o->oBehParams2ndByte == 0) { if (o->oWaterCannonIdleTimer != 0) { - o->oWaterCannonIdleTimer--; + o->oWaterCannonIdleTimer -= 1; } else { obj_move_pitch_approach(o->oWaterCannonTargetMovePitch, 0x80); obj_face_yaw_approach(o->oWaterCannonTargetFaceYaw, 0x100); if ((s16) o->oFaceAngleYaw == (s16) o->oWaterCannonTargetFaceYaw) { if (o->oWaterCannonRotationTimer != 0) { - o->oWaterCannonRotationTimer--; + o->oWaterCannonRotationTimer -= 1; } else { cur_obj_play_sound_2(SOUND_OBJ_CANNON4); o->oWaterCannonIdleTimer = 70; diff --git a/src/game/behaviors/wiggler.inc.c b/src/game/behaviors/wiggler.inc.c index 98e7d2d0..a42cea4d 100644 --- a/src/game/behaviors/wiggler.inc.c +++ b/src/game/behaviors/wiggler.inc.c @@ -218,7 +218,7 @@ static void wiggler_act_walk(void) { obj_forward_vel_approach(sWigglerSpeeds[o->oHealth - 1], 1.0f); if (o->oWigglerWalkAwayFromWallTimer != 0) { - o->oWigglerWalkAwayFromWallTimer--; + o->oWigglerWalkAwayFromWallTimer -= 1; } else { if (o->oDistanceToMario >= 25000.0f) { // If >1200 away from home, turn to home @@ -234,7 +234,7 @@ static void wiggler_act_walk(void) { if (o->oHealth < 4) { o->oWigglerTargetYaw = o->oAngleToMario; } else if (o->oWigglerTimeUntilRandomTurn != 0) { - o->oWigglerTimeUntilRandomTurn--; + o->oWigglerTimeUntilRandomTurn -= 1; } else { o->oWigglerTargetYaw = o->oMoveAngleYaw + 0x4000 * (s16) random_sign(); o->oWigglerTimeUntilRandomTurn = random_linear_offset(30, 50); diff --git a/src/game/camera.c b/src/game/camera.c index fd47d858..77598d05 100644 --- a/src/game/camera.c +++ b/src/game/camera.c @@ -3383,7 +3383,7 @@ s32 move_point_along_spline(Vec3f p, struct CutsceneSplinePoint spline[], s16 *s *splineSegment = 0; finished = 1; } - (*progress)--; + *progress -= 1; } return finished; } @@ -5388,17 +5388,17 @@ u32 surface_type_modes(struct Camera *c) { switch (sMarioGeometry.currFloorType) { case SURFACE_CLOSE_CAMERA: transition_to_camera_mode(c, CAMERA_MODE_CLOSE, 90); - modeChanged++; + modeChanged += 1; break; case SURFACE_CAMERA_FREE_ROAM: transition_to_camera_mode(c, CAMERA_MODE_FREE_ROAM, 90); - modeChanged++; + modeChanged += 1; break; case SURFACE_NO_CAM_COL_SLIPPERY: transition_to_camera_mode(c, CAMERA_MODE_CLOSE, 90); - modeChanged++; + modeChanged += 1; break; } return modeChanged; @@ -6239,12 +6239,12 @@ void copy_spline_segment(struct CutsceneSplinePoint dst[], struct CutsceneSpline s32 i = 0; init_spline_point(&dst[i], src[j].index, src[j].speed, src[j].point); - i++; + i += 1; do { do { init_spline_point(&dst[i], src[j].index, src[j].speed, src[j].point); - i++; - j++; + i += 1; + j += 1; } while (src[j].index != -1); } while (j > 16); @@ -6924,6 +6924,12 @@ void cutscene_dance_rotate_move_towards_mario(struct Camera *c) { rotate_and_move_vec3f(c->pos, sMarioCamState->pos, 20.f, 0, 0); } +/** + * Speculated to be dance-related due to its proximity to the other dance functions + */ +UNUSED static void cutscene_dance_unused(UNUSED struct Camera *c) { +} + /** * Slowly turn to the point 100 units in front of Mario */ @@ -8237,7 +8243,7 @@ void cutscene_read_message(struct Camera *c) { // Do nothing until message is gone. case 0: if (get_dialog_id() != DIALOG_NONE) { - sCutsceneVars[0].angle[0]++; + sCutsceneVars[0].angle[0] += 1; set_time_stop_flags(TIME_STOP_ENABLED | TIME_STOP_DIALOG); } break; @@ -10272,12 +10278,12 @@ void play_cutscene(struct Camera *c) { if ((cutsceneDuration != 0) && !(gCutsceneTimer & CUTSCENE_STOP)) { if (gCutsceneTimer < CUTSCENE_LOOP) { - gCutsceneTimer++; + gCutsceneTimer += 1; } //! Because gCutsceneTimer is often set to 0x7FFF (CUTSCENE_LOOP), this conditional can only //! check for == due to overflow if (gCutsceneTimer == cutsceneDuration) { - sCutsceneShot++; + sCutsceneShot += 1; gCutsceneTimer = 0; } } else { diff --git a/src/game/debug.c b/src/game/debug.c index 53502e88..58e38d72 100644 --- a/src/game/debug.c +++ b/src/game/debug.c @@ -96,7 +96,7 @@ void print_text_array_info(s16 *printState, const char *str, s32 number) { || (printState[DEBUG_PSTATE_MAX_X_CURSOR] < printState[DEBUG_PSTATE_Y_CURSOR])) { print_text(printState[DEBUG_PSTATE_X_CURSOR], printState[DEBUG_PSTATE_Y_CURSOR], "DPRINT OVER"); - printState[DEBUG_PSTATE_DISABLED] = TRUE; + printState[DEBUG_PSTATE_DISABLED] += 1; // why not just = TRUE... } else { print_text_fmt_int(printState[DEBUG_PSTATE_X_CURSOR], printState[DEBUG_PSTATE_Y_CURSOR], str, number); @@ -201,7 +201,7 @@ void print_string_array_info(const char **strArr) { s32 i; if (!sDebugStringArrPrinted) { - sDebugStringArrPrinted = TRUE; + sDebugStringArrPrinted += 1; // again, why not = TRUE... for (i = 0; i < 8; i++) { // sDebugPage is assumed to be 4 or 5 here. print_debug_top_down_mapinfo(strArr[i], gDebugInfo[sDebugPage][i]); @@ -240,7 +240,7 @@ void update_debug_dpadmask(void) { } else { sDebugInfoDPadMask = 0; } - sDebugInfoDPadUpdID++; + sDebugInfoDPadUpdID += 1; if (sDebugInfoDPadUpdID >= 8) { sDebugInfoDPadUpdID = 6; // rapidly set to 6 from 8 as long as dPadMask is being set. } @@ -249,7 +249,7 @@ void update_debug_dpadmask(void) { void debug_unknown_level_select_check(void) { if (!sDebugLvSelectCheckFlag) { - sDebugLvSelectCheckFlag = TRUE; + sDebugLvSelectCheckFlag += 1; // again, just do = TRUE... if (!gDebugLevelSelect) { gDebugInfoFlags = DEBUG_INFO_NOFLAGS; @@ -291,7 +291,7 @@ UNUSED static void check_debug_button_seq(void) { } else { if ((s16)(cButtonMask = (gPlayer1Controller->buttonPressed & C_BUTTONS))) { if (buttonArr[sDebugInfoButtonSeqID] == cButtonMask) { - sDebugInfoButtonSeqID++; + sDebugInfoButtonSeqID += 1; if (buttonArr[sDebugInfoButtonSeqID] == -1) { if (gDebugInfoFlags == DEBUG_INFO_FLAG_ALL) { gDebugInfoFlags = DEBUG_INFO_FLAG_LSELECT; @@ -314,11 +314,11 @@ UNUSED static void try_change_debug_page(void) { if (gDebugInfoFlags & DEBUG_INFO_FLAG_DPRINT) { if ((gPlayer1Controller->buttonPressed & L_JPAD) && (gPlayer1Controller->buttonDown & (L_TRIG | R_TRIG))) { - sDebugPage++; + sDebugPage += 1; } if ((gPlayer1Controller->buttonPressed & R_JPAD) && (gPlayer1Controller->buttonDown & (L_TRIG | R_TRIG))) { - sDebugPage--; + sDebugPage -= 1; } if (sDebugPage >= (DEBUG_PAGE_MAX + 1)) { sDebugPage = DEBUG_PAGE_MIN; @@ -351,14 +351,14 @@ void try_modify_debug_controls(void) { } if (sDebugInfoDPadMask & U_JPAD) { - sDebugSysCursor--; + sDebugSysCursor -= 1; if (sDebugSysCursor < 0) { sDebugSysCursor = 0; } } if (sDebugInfoDPadMask & D_JPAD) { - sDebugSysCursor++; + sDebugSysCursor += 1; if (sDebugSysCursor >= 8) { sDebugSysCursor = 7; } diff --git a/src/game/envfx_bubbles.c b/src/game/envfx_bubbles.c index de7eb6b5..18a30e09 100644 --- a/src/game/envfx_bubbles.c +++ b/src/game/envfx_bubbles.c @@ -83,7 +83,7 @@ void envfx_update_flower(Vec3s centerPos) { (gEnvFxBuffer + i)->isAlive = 1; (gEnvFxBuffer + i)->animFrame = random_float() * 5.0f; } else if ((timer & 0x03) == 0) { - (gEnvFxBuffer + i)->animFrame++; + (gEnvFxBuffer + i)->animFrame += 1; if ((gEnvFxBuffer + i)->animFrame > 5) { (gEnvFxBuffer + i)->animFrame = 0; } @@ -154,7 +154,7 @@ void envfx_update_lava(Vec3s centerPos) { envfx_set_lava_bubble_position(i, centerPos); (gEnvFxBuffer + i)->isAlive = 1; } else if ((timer & 0x01) == 0) { - (gEnvFxBuffer + i)->animFrame++; + (gEnvFxBuffer + i)->animFrame += 1; if ((gEnvFxBuffer + i)->animFrame > 8) { (gEnvFxBuffer + i)->isAlive = 0; (gEnvFxBuffer + i)->animFrame = 0; diff --git a/src/game/interaction.c b/src/game/interaction.c index 8a5ff3a1..d91f2435 100644 --- a/src/game/interaction.c +++ b/src/game/interaction.c @@ -1435,8 +1435,8 @@ u32 interact_koopa_shell(struct MarioState *m, UNUSED u32 interactType, struct O if (interaction == INT_HIT_FROM_ABOVE || m->action == ACT_WALKING || m->action == ACT_HOLD_WALKING) { m->interactObj = obj; - m->usedObj = obj; - m->riddenObj = obj; + m->usedObj = obj; + m->riddenObj = obj; attack_object(obj, interaction); update_mario_sound_and_camera(m); @@ -1496,9 +1496,9 @@ u32 interact_pole(struct MarioState *m, UNUSED u32 interactType, struct Object * #endif m->interactObj = obj; - m->usedObj = obj; - m->vel[1] = 0.0f; - m->forwardVel = 0.0f; + m->usedObj = obj; + m->vel[1] = 0.0f; + m->forwardVel = 0.0f; marioObj->oMarioPoleUnk108 = 0; marioObj->oMarioPoleYawVel = 0; @@ -1644,10 +1644,22 @@ u32 mario_can_talk(struct MarioState *m, u32 arg) { return FALSE; } +#ifdef VERSION_JP +#define READ_MASK (INPUT_B_PRESSED) +#else +#define READ_MASK (INPUT_B_PRESSED | INPUT_A_PRESSED) +#endif + +#ifdef VERSION_JP +#define SIGN_RANGE 0x38E3 +#else +#define SIGN_RANGE 0x4000 +#endif + u32 check_read_sign(struct MarioState *m, struct Object *obj) { - if ((m->input & (INPUT_B_PRESSED | INPUT_A_PRESSED)) && mario_can_talk(m, 0) && object_facing_mario(m, obj, 0x4000)) { + if ((m->input & READ_MASK) && mario_can_talk(m, 0) && object_facing_mario(m, obj, SIGN_RANGE)) { s16 facingDYaw = (s16)(obj->oMoveAngleYaw + 0x8000) - m->faceAngle[1]; - if (facingDYaw >= -0x4000 && facingDYaw <= 0x4000) { + if (facingDYaw >= -SIGN_RANGE && facingDYaw <= SIGN_RANGE) { f32 targetX = obj->oPosX + 105.0f * sins(obj->oMoveAngleYaw); f32 targetZ = obj->oPosZ + 105.0f * coss(obj->oMoveAngleYaw); @@ -1665,7 +1677,7 @@ u32 check_read_sign(struct MarioState *m, struct Object *obj) { } u32 check_npc_talk(struct MarioState *m, struct Object *obj) { - if ((m->input & (INPUT_B_PRESSED | INPUT_A_PRESSED)) && mario_can_talk(m, 1)) { + if ((m->input & READ_MASK) && mario_can_talk(m, 1)) { s16 facingDYaw = mario_obj_angle_to_object(m, obj) - m->faceAngle[1]; if (facingDYaw >= -0x4000 && facingDYaw <= 0x4000) { obj->oInteractStatus = INT_STATUS_INTERACTED; @@ -1746,7 +1758,7 @@ void mario_process_interactions(struct MarioState *m) { } if (m->invincTimer > 0 && !sDelayInvincTimer) { - m->invincTimer--; + m->invincTimer -= 1; } //! If the kick/punch flags are set and an object collision changes Mario's @@ -1828,8 +1840,12 @@ void mario_handle_special_floors(struct MarioState *m) { break; } - if (!(m->action & ACT_FLAG_AIR) && !(m->action & ACT_FLAG_SWIMMING) && (floorType == SURFACE_BURNING)) { - check_lava_boost(m); + if (!(m->action & ACT_FLAG_AIR) && !(m->action & ACT_FLAG_SWIMMING)) { + switch (floorType) { + case SURFACE_BURNING: + check_lava_boost(m); + break; + } } } } diff --git a/src/game/level_update.c b/src/game/level_update.c index c34a9e14..be090068 100644 --- a/src/game/level_update.c +++ b/src/game/level_update.c @@ -877,7 +877,7 @@ void initiate_delayed_warp(void) { case WARP_OP_CREDITS_NEXT: sound_banks_disable(SEQ_PLAYER_SFX, SOUND_BANKS_ALL); - gCurrCreditsEntry++; + gCurrCreditsEntry += 1; gCurrActNum = gCurrCreditsEntry->actNum & 0x07; if ((gCurrCreditsEntry + 1)->levelNum == LEVEL_NONE) { destWarpNode = WARP_NODE_CREDITS_END; @@ -913,7 +913,7 @@ void update_hud_values(void) { COND_BIT((gCurrCourseNum >= COURSE_MIN), gHudDisplay.flags, HUD_DISPLAY_FLAG_COIN_COUNT); if (gHudDisplay.coins < gMarioState->numCoins) { - if (gGlobalTimer & 0x1) { + if (gGlobalTimer & 0x00000001) { u32 coinSound; if (gMarioState->action & (ACT_FLAG_SWIMMING | ACT_FLAG_METAL_WATER)) { coinSound = SOUND_GENERAL_COIN_WATER; @@ -921,7 +921,7 @@ void update_hud_values(void) { coinSound = SOUND_GENERAL_COIN; } - gHudDisplay.coins++; + gHudDisplay.coins += 1; play_sound(coinSound, gMarioState->marioObj->header.gfx.cameraToObject); } } @@ -989,7 +989,7 @@ s32 play_mode_normal(void) { check_instant_warp(); if (sTimerRunning && gHudDisplay.timer < 17999) { - gHudDisplay.timer++; + gHudDisplay.timer += 1; } area_update_objects(); @@ -1324,6 +1324,7 @@ s32 lvl_set_current_level(UNUSED s16 arg0, s32 levelNum) { if (gSavedCourseNum != gCurrCourseNum) { gSavedCourseNum = gCurrCourseNum; + nop_change_course(); disable_warp_checkpoint(); } diff --git a/src/game/mario.c b/src/game/mario.c index 7ea43b67..b6d4e187 100644 --- a/src/game/mario.c +++ b/src/game/mario.c @@ -1165,10 +1165,11 @@ void squish_mario_model(struct MarioState *m) { if (m->squishTimer != 0xFF) { // If no longer squished, scale back to default. if (m->squishTimer == 0) { - vec3_same(m->marioObj->header.gfx.scale, 1.0f); + vec3f_set(m->marioObj->header.gfx.scale, 1.0f, 1.0f, 1.0f); + } // If timer is less than 16, rubber-band Mario's size scale up and down. - } else if (m->squishTimer <= 16) { - m->squishTimer--; + else if (m->squishTimer <= 16) { + m->squishTimer -= 1; m->marioObj->header.gfx.scale[1] = 1.0f - ((sSquishScaleOverTime[15 - m->squishTimer] * 0.6f) / 100.0f); @@ -1177,7 +1178,7 @@ void squish_mario_model(struct MarioState *m) { m->marioObj->header.gfx.scale[2] = m->marioObj->header.gfx.scale[0]; } else { - m->squishTimer--; + m->squishTimer -= 1; vec3f_set(m->marioObj->header.gfx.scale, 1.4f, 0.4f, 1.4f); } @@ -1239,13 +1240,13 @@ void update_mario_button_inputs(struct MarioState *m) { if (m->input & INPUT_A_PRESSED) { m->framesSinceA = 0; } else if (m->framesSinceA < 0xFF) { - m->framesSinceA++; + m->framesSinceA += 1; } if (m->input & INPUT_B_PRESSED) { m->framesSinceB = 0; } else if (m->framesSinceB < 0xFF) { - m->framesSinceB++; + m->framesSinceB += 1; } } @@ -1581,7 +1582,7 @@ u32 update_and_return_cap_flags(struct MarioState *m) { if ((m->capTimer <= 60) || ((action != ACT_READING_AUTOMATIC_DIALOG) && (action != ACT_READING_NPC_DIALOG) && (action != ACT_READING_SIGN) && (action != ACT_IN_CANNON))) { - m->capTimer--; + m->capTimer -= 1; } if (m->capTimer == 0) { diff --git a/src/game/mario_actions_airborne.c b/src/game/mario_actions_airborne.c index aa574dbd..ddd03664 100644 --- a/src/game/mario_actions_airborne.c +++ b/src/game/mario_actions_airborne.c @@ -1539,7 +1539,7 @@ s32 act_lava_boost(struct MarioState *m) { if (m->actionState < 2 && m->vel[1] < 0.0f) { m->vel[1] = -m->vel[1] * 0.4f; mario_set_forward_vel(m, m->forwardVel * 0.5f); - m->actionState++; + m->actionState += 1; } else { set_mario_action(m, ACT_LAVA_BOOST_LAND, 0); } diff --git a/src/game/mario_misc.c b/src/game/mario_misc.c index 0409bc8d..ebbd9870 100644 --- a/src/game/mario_misc.c +++ b/src/game/mario_misc.c @@ -477,10 +477,12 @@ Gfx *geo_mario_hand_foot_scaler(s32 callContext, struct GraphNode *node, UNUSED scaleNode->scale = 1.0f; if (asGenerated->parameter == bodyState->punchState >> 6) { if (sMarioAttackAnimCounter != gAreaUpdateCounter && (bodyState->punchState & 0x3F) > 0) { - bodyState->punchState--; + bodyState->punchState -= 1; sMarioAttackAnimCounter = gAreaUpdateCounter; } - scaleNode->scale = gMarioAttackScaleAnimation[asGenerated->parameter * 6 + (bodyState->punchState & 0x3F)] / 10.0f; + scaleNode->scale = + gMarioAttackScaleAnimation[asGenerated->parameter * 6 + (bodyState->punchState & 0x3F)] + / 10.0f; } } return NULL; diff --git a/src/game/obj_behaviors_2.c b/src/game/obj_behaviors_2.c index 00fcd91d..6c7740da 100644 --- a/src/game/obj_behaviors_2.c +++ b/src/game/obj_behaviors_2.c @@ -141,7 +141,7 @@ static void platform_on_track_update_pos_or_spawn_ball(s32 ballIndex, f32 x, f32 do { prevWaypoint = nextWaypoint; - nextWaypoint++; + nextWaypoint += 1; if (nextWaypoint->flags == WAYPOINT_FLAGS_END) { if (ballIndex == 0) { o->oPlatformOnTrackPrevWaypointFlags = WAYPOINT_FLAGS_END; @@ -459,9 +459,10 @@ static s32 oscillate_toward(s32 *value, f32 *vel, s32 target, f32 velCloseToZero return FALSE; } -static void obj_update_blinking(s32 *blinkTimer, s16 baseCycleLength, s16 cycleLengthRange, s16 blinkLength) { +static void obj_update_blinking(s32 *blinkTimer, s16 baseCycleLength, s16 cycleLengthRange, + s16 blinkLength) { if (*blinkTimer != 0) { - (*blinkTimer)--; + *blinkTimer -= 1; } else { *blinkTimer = random_linear_offset(baseCycleLength, cycleLengthRange); } diff --git a/src/game/object_list_processor.c b/src/game/object_list_processor.c index 13c51f72..13acc90d 100644 --- a/src/game/object_list_processor.c +++ b/src/game/object_list_processor.c @@ -285,7 +285,7 @@ s32 update_objects_starting_at(struct ObjectNode *objList, struct ObjectNode *fi cur_obj_update(); firstObj = firstObj->next; - count++; + count += 1; } return count; @@ -543,7 +543,7 @@ void update_non_terrain_objects(void) { s32 i = 2; while ((listIndex = sObjectListUpdateOrder[i]) != -1) { gObjectCounter += update_objects_in_list(&gObjectLists[listIndex]); - i++; + i += 1; } } @@ -556,7 +556,7 @@ void unload_deactivated_objects(void) { s32 i = 0; while ((listIndex = sObjectListUpdateOrder[i]) != -1) { unload_deactivated_objects_in_list(&gObjectLists[listIndex]); - i++; + i += 1; } // TIME_STOP_UNKNOWN_0 was most likely intended to be used to track whether diff --git a/src/game/spawn_object.c b/src/game/spawn_object.c index 351cddcc..6a60b716 100644 --- a/src/game/spawn_object.c +++ b/src/game/spawn_object.c @@ -220,7 +220,8 @@ struct Object *allocate_object(struct ObjectNode *objList) { // If no unimportant object exists, then the object pool is exhausted. if (unimportantObj == NULL) { // We've met with a terrible fate. - while (TRUE) {} + while (TRUE) { + } } else { // If an unimportant object does exist, unload it and take its slot. unload_object(unimportantObj); diff --git a/src/goddard/renderer.c b/src/goddard/renderer.c index 0de64537..cf35e45d 100644 --- a/src/goddard/renderer.c +++ b/src/goddard/renderer.c @@ -3003,7 +3003,7 @@ void Unknown801A5D90(struct ObjGroup *arg0) { sp23C = FALSE; for (;;) { - trackerNum++; + trackerNum += 1; mt = get_memtracker_by_index(trackerNum); if (mt->name != NULL) { diff --git a/src/goddard/shape_helper.c b/src/goddard/shape_helper.c index df18c7ec..29406035 100644 --- a/src/goddard/shape_helper.c +++ b/src/goddard/shape_helper.c @@ -1062,7 +1062,7 @@ void animate_mario_head_normal(struct ObjAnimator *self) { if (self->frame == 810.0f) { self->frame = 750.0f; - self->nods--; + self->nods -= 1; if (self->nods == 0) { state = 3; } diff --git a/src/menu/file_select.c b/src/menu/file_select.c index d1d359a9..4ba8f315 100644 --- a/src/menu/file_select.c +++ b/src/menu/file_select.c @@ -2211,7 +2211,7 @@ void print_file_select_strings(void) { sTextBaseAlpha += 10; } if (sMainMenuTimer < 1000) { - sMainMenuTimer++; + sMainMenuTimer += 1; } } From f4ffcc3ea173b284ddfd768e07068d74d4cf8981 Mon Sep 17 00:00:00 2001 From: someone2639 Date: Sat, 2 Oct 2021 09:12:47 -0400 Subject: [PATCH 80/97] make this asm file a lot easier to read (not documented though) --- asm/math.s | 54 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 28 insertions(+), 26 deletions(-) diff --git a/asm/math.s b/asm/math.s index 1649959d..2d92f658 100644 --- a/asm/math.s +++ b/asm/math.s @@ -1,6 +1,4 @@ # assembler directives -.set noat # allow manual use of $at -.set noreorder # don't insert nops after branches .set gp=64 .include "macros.inc" @@ -8,39 +6,43 @@ .section .text, "ax" -.global mtxf_to_mtx_asm .balign 32 +# glabel mtxf_to_mtx_asm +.globl mtxf_to_mtx_asm mtxf_to_mtx_asm: - addiu $v0, $zero, 0x0001 - lui $t2, 0x4780 - mtc1 $t2, $f4 -loop: - lwc1 $f0, 0x0000($a1) - andi $t0, $v0, 0x0002 - mul.s $f0, $f0, $f4 - lwc1 $f2, 0x0004($a1) + li $v0, 1 + li.s $f4, 65536.0 +1: + lwc1 $f0, ($a1) + andi $t0, $v0, (1 << 1) + mul.s $f0, $f4 + lwc1 $f2, 0x04($a1) trunc.w.s $f0, $f0 mfc1 $t3, $f0 - addiu $a1, $a1, 0x0008 + addiu $a1, 8 sra $t4, $t3, 16 - sh $t4, 0x0000($a0) - sh $t3, 0x0020($a0) - bne $t0, $zero, storezero - addiu $v0, $v0, 0x0002 - mul.s $f2, $f2, $f4 - addiu $t1, $zero, 1 + sh $t4, 0x00($a0) + sh $t3, 0x20($a0) + + addiu $v0, 2 + bnez $t0, storezero + + mul.s $f2, $f4 trunc.w.s $f2, $f2 mfc1 $t3, $f2 - addiu $v1, $zero, 0x0011 sra $t4, $t3, 16 - sh $t4, 0x0002($a0) - sh $t3, 0x0022($a0) + sh $t4, 0x02($a0) + sh $t3, 0x22($a0) loopend: - bne $v0, $v1, loop - addiu $a0, $a0, 0x0004 +.set noreorder + bnel $v0, 0x11, 1b + addiu $a0, 4 +.set reorder + + li $t1, 1 + sh $t1, 0x02($a0) jr $ra - sh $t1, -2 ($a0) storezero: - sh $zero, 0x0002($a0) + sh $zero, 0x02($a0) + sh $zero, 0x22($a0) j loopend - sh $zero, 0x0022($a0) \ No newline at end of file From 697492d1e12ba642f21a95e9c245155b895ef320 Mon Sep 17 00:00:00 2001 From: someone2639 Date: Sat, 2 Oct 2021 09:26:18 -0400 Subject: [PATCH 81/97] add some logic for gWorldScale; only div on scales higher than 1 --- asm/math.s | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/asm/math.s b/asm/math.s index 2d92f658..d67a89d3 100644 --- a/asm/math.s +++ b/asm/math.s @@ -7,16 +7,20 @@ .section .text, "ax" .balign 32 -# glabel mtxf_to_mtx_asm -.globl mtxf_to_mtx_asm -mtxf_to_mtx_asm: +glabel mtxf_to_mtx_asm + lwc1 $f6, gWorldScale + li.s $f8, 1.0 li $v0, 1 li.s $f4, 65536.0 1: lwc1 $f0, ($a1) + lwc1 $f2, 0x04($a1) + c.eq.s $f6, $f8 + bc1f 3f + nop +2: andi $t0, $v0, (1 << 1) mul.s $f0, $f4 - lwc1 $f2, 0x04($a1) trunc.w.s $f0, $f0 mfc1 $t3, $f0 addiu $a1, 8 @@ -46,3 +50,8 @@ storezero: sh $zero, 0x02($a0) sh $zero, 0x22($a0) j loopend +3: + div.s $f0, $f6 + div.s $f2, $f6 + b 2b + From 3887ac46e0673e6c03bfc0cf697f7d32518f1603 Mon Sep 17 00:00:00 2001 From: someone2639 Date: Sat, 2 Oct 2021 09:30:29 -0400 Subject: [PATCH 82/97] big brain optimization --- asm/math.s | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/asm/math.s b/asm/math.s index d67a89d3..d1188cc1 100644 --- a/asm/math.s +++ b/asm/math.s @@ -12,10 +12,12 @@ glabel mtxf_to_mtx_asm li.s $f8, 1.0 li $v0, 1 li.s $f4, 65536.0 + # flags will never update in this loop, so do the compare only once + # if this ever breaks contact someone2639, and then maybe MIPS Technologies, Inc. + c.eq.s $f6, $f8 1: lwc1 $f0, ($a1) lwc1 $f2, 0x04($a1) - c.eq.s $f6, $f8 bc1f 3f nop 2: From a4f61513644b69b91cf42f4ae715d1376e936f5c Mon Sep 17 00:00:00 2001 From: someone2639 Date: Sat, 2 Oct 2021 09:32:16 -0400 Subject: [PATCH 83/97] i hate the c preprocessor --- asm/math.s | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/asm/math.s b/asm/math.s index d1188cc1..1ae58394 100644 --- a/asm/math.s +++ b/asm/math.s @@ -12,8 +12,8 @@ glabel mtxf_to_mtx_asm li.s $f8, 1.0 li $v0, 1 li.s $f4, 65536.0 - # flags will never update in this loop, so do the compare only once - # if this ever breaks contact someone2639, and then maybe MIPS Technologies, Inc. + // flags will never update in this loop, so do the compare only once. + // if this ever breaks contact someone2639, and then maybe MIPS Technologies, Inc. c.eq.s $f6, $f8 1: lwc1 $f0, ($a1) From 3cc9fe8633d46a60144b425030789bbfda0b6008 Mon Sep 17 00:00:00 2001 From: someone2639 Date: Sat, 2 Oct 2021 09:54:11 -0400 Subject: [PATCH 84/97] let the scheduler handle the bc1f --- asm/math.s | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/asm/math.s b/asm/math.s index 1ae58394..7ffd9751 100644 --- a/asm/math.s +++ b/asm/math.s @@ -19,7 +19,6 @@ glabel mtxf_to_mtx_asm lwc1 $f0, ($a1) lwc1 $f2, 0x04($a1) bc1f 3f - nop 2: andi $t0, $v0, (1 << 1) mul.s $f0, $f4 @@ -42,7 +41,7 @@ glabel mtxf_to_mtx_asm loopend: .set noreorder bnel $v0, 0x11, 1b - addiu $a0, 4 + addiu $a0, 4 .set reorder li $t1, 1 From ab67e9be4de2d2f942db59d78ac7238e0a569f1e Mon Sep 17 00:00:00 2001 From: Fazana <52551480+FazanaJ@users.noreply.github.com> Date: Sat, 2 Oct 2021 17:37:12 +0100 Subject: [PATCH 85/97] gWorldScalen't --- asm/math.s | 2 +- src/engine/math_util.c | 44 --------------------------------- src/engine/math_util.h | 7 +++--- src/game/rendering_graph_node.c | 16 +----------- 4 files changed, 6 insertions(+), 63 deletions(-) diff --git a/asm/math.s b/asm/math.s index 7ffd9751..fca208c3 100644 --- a/asm/math.s +++ b/asm/math.s @@ -8,7 +8,7 @@ .balign 32 glabel mtxf_to_mtx_asm - lwc1 $f6, gWorldScale + li.s $f6, 4.0 li.s $f8, 1.0 li $v0, 1 li.s $f4, 65536.0 diff --git a/src/engine/math_util.c b/src/engine/math_util.c index c2669b27..be4018dd 100644 --- a/src/engine/math_util.c +++ b/src/engine/math_util.c @@ -581,50 +581,6 @@ void mtxf_mul_vec3s(Mat4 mtx, Vec3s b) { } } -/** - * Convert float matrix 'src' to fixed point matrix 'dest'. - * The float matrix may not contain entries larger than 65536 or the console - * crashes. The fixed point matrix has entries with a 16-bit integer part, so - * the floating point numbers are multiplied by 2^16 before being cast to a s32 - * integer. If this doesn't fit, the N64 and iQue consoles will throw an - * exception. On Wii and Wii U Virtual Console the value will simply be clamped - * and no crashes occur. - - * Modified into a hybrid of the original function and the worldscale altered function. - * Will check if the worldscale is below what's considered safe in vanilla bounds and - * just run the faster vanilla function, otherwise it'll run the slower, but safer scale - * function, for extended boundaries. - */ -void mtxf_to_mtx_scale(Mtx *dest, Mat4 src) { - Mat4 temp; - register s32 i, j; - for(i = 0; i < 4; i++) { - for(j = 0; j < 3; j++) { - temp[i][j] = (src[i][j] / gWorldScale); - } - temp[i][3] = src[i][3]; - } - guMtxF2L(temp, dest); -} - -void mtxf_to_mtx_constant(register s16 *dest, register f32 *src) { //! TODO: asm - s32 asFixedPoint; - s32 i; - for (i = 0; i < 16; i++) { - asFixedPoint = (src[i] * (1 << 16)); - dest[i ] = (asFixedPoint >> 16); - dest[i + 16] = (asFixedPoint & 0xFFFF); - } -} - -void mtxf_to_mtx(void *dest, void *src) { - if (gWorldScale > 2.0f) { - mtxf_to_mtx_scale(dest, src); - } else { - mtxf_to_mtx_constant(dest, src); - } -} - /** * Set 'mtx' to a transformation matrix that rotates around the z axis. */ diff --git a/src/engine/math_util.h b/src/engine/math_util.h index 38778ba7..d1808ce5 100644 --- a/src/engine/math_util.h +++ b/src/engine/math_util.h @@ -482,9 +482,10 @@ void mtxf_align_terrain_triangle(Mat4 mtx, Vec3f pos, s32 yaw, f32 radius); void mtxf_mul(Mat4 dest, Mat4 a, Mat4 b); void mtxf_scale_vec3f(Mat4 dest, Mat4 mtx, Vec3f s); void mtxf_mul_vec3s(Mat4 mtx, Vec3s b); -void mtxf_to_mtx(void *dest, void *src); -void mtxf_to_mtx_constant(register s16 *dest, register f32 *src); -void mtxf_to_mtx_scale(Mtx *dest, Mat4 src); +extern void mtxf_to_mtx_asm(register s16 *dest, register f32 *src); +inline void mtxf_to_mtx(register s16 *dest, register f32 *src) { + mtxf_to_mtx_asm(dest, src); +} void mtxf_rotate_xy(Mtx *mtx, s32 angle); void get_pos_from_transform_mtx(Vec3f dest, Mat4 objMtx, Mat4 camMtx); diff --git a/src/game/rendering_graph_node.c b/src/game/rendering_graph_node.c index 556fcb2d..7188c142 100644 --- a/src/game/rendering_graph_node.c +++ b/src/game/rendering_graph_node.c @@ -49,7 +49,6 @@ s16 gMatStackIndex; Mat4 gMatStack[32]; Mtx *gMatStackFixed[32]; f32 sAspectRatio; -f32 gWorldScale = 1.0f; /** * Animation nodes have state in global variables, so this struct captures @@ -432,20 +431,7 @@ void geo_process_perspective(struct GraphNodePerspective *node) { #else sAspectRatio = (4.0f / 3.0f); // 1.33333f #endif - if (gCamera) { - // gWorldScale = ((sqr(gCamera->pos[0]) + sqr(gCamera->pos[1]) + sqr(gCamera->pos[2])) / sqr(0x2000)); - gWorldScale = (max_3f(ABS(gCamera->pos[0]), ABS(gCamera->pos[1]), ABS(gCamera->pos[2])) / (f32)0x2000); - } else { - gWorldScale = 1.0f; - } - farClip = CLAMP(farClip / gWorldScale, 4096, 61440); - if (farClip / farClipDelta != 1) { - farClipDelta /= farClip; - gWorldScale *= farClipDelta; - } - gWorldScale = MAX(gWorldScale, 1.0f); - - guPerspective(mtx, &perspNorm, node->fov, sAspectRatio, ((farClip / 300) / gWorldScale), (farClip / gWorldScale), 1.0f); + guPerspective(mtx, &perspNorm, node->fov, sAspectRatio, ((farClip / 300) / 4), (farClip / 4), 1.0f); gSPPerspNormalize(gDisplayListHead++, perspNorm); gSPMatrix(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(mtx), (G_MTX_PROJECTION | G_MTX_LOAD | G_MTX_NOPUSH)); gCurGraphNodeCamFrustum = node; From 2d7aa1e5149af5c311befeee1d7df864327b4067 Mon Sep 17 00:00:00 2001 From: someone2639 Date: Sat, 2 Oct 2021 23:26:21 -0400 Subject: [PATCH 86/97] changed div to mul, it always runs now --- asm/math.s | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/asm/math.s b/asm/math.s index fca208c3..70d9cb08 100644 --- a/asm/math.s +++ b/asm/math.s @@ -8,18 +8,16 @@ .balign 32 glabel mtxf_to_mtx_asm - li.s $f6, 4.0 + li.s $f6, 0.25 li.s $f8, 1.0 li $v0, 1 li.s $f4, 65536.0 - // flags will never update in this loop, so do the compare only once. - // if this ever breaks contact someone2639, and then maybe MIPS Technologies, Inc. - c.eq.s $f6, $f8 1: lwc1 $f0, ($a1) lwc1 $f2, 0x04($a1) - bc1f 3f -2: + mul.s $f0, $f6 + mul.s $f2, $f6 + andi $t0, $v0, (1 << 1) mul.s $f0, $f4 trunc.w.s $f0, $f0 @@ -51,8 +49,4 @@ storezero: sh $zero, 0x02($a0) sh $zero, 0x22($a0) j loopend -3: - div.s $f0, $f6 - div.s $f2, $f6 - b 2b From 51bced5d3c6d841fca9eb7cc590a15ee1fb78602 Mon Sep 17 00:00:00 2001 From: someone2639 Date: Sat, 2 Oct 2021 23:52:16 -0400 Subject: [PATCH 87/97] dont need this line either [math.s] --- asm/math.s | 1 - 1 file changed, 1 deletion(-) diff --git a/asm/math.s b/asm/math.s index 70d9cb08..a8188b6a 100644 --- a/asm/math.s +++ b/asm/math.s @@ -9,7 +9,6 @@ .balign 32 glabel mtxf_to_mtx_asm li.s $f6, 0.25 - li.s $f8, 1.0 li $v0, 1 li.s $f4, 65536.0 1: From d76ca3ac715633eb6ceeaac6640b90c1535bf412 Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Sun, 3 Oct 2021 11:37:44 -0700 Subject: [PATCH 88/97] Some requested changes + fix build --- include/config.h | 4 +-- src/engine/math_util.h | 4 +-- src/game/camera.c | 44 +++++++++++++------------------- src/game/camera.h | 4 +-- src/game/interaction.c | 34 ++++++++++-------------- src/game/level_update.c | 1 - src/game/macro_special_objects.c | 4 +-- src/game/mario.c | 18 ++++++------- src/game/object_helpers.c | 10 ++++++-- src/game/rendering_graph_node.c | 1 - 10 files changed, 57 insertions(+), 67 deletions(-) diff --git a/include/config.h b/include/config.h index c876ff13..3371af74 100644 --- a/include/config.h +++ b/include/config.h @@ -130,12 +130,12 @@ // -- SPECIFIC OBJECT SETTINGS -- // Allow for retries on collecting the remaining blue coins from a blue coin switch #define BLUE_COIN_SWITCH_RETRY +// Fixes shell cancel +#define SHELL_CANCEL_FIX // The number of chain balls the Chain Chomp has. Vanilla is 5. #define CHAIN_CHOMP_NUM_SEGMENTS 5 - // The number of parts Pokey has, including the head. Vanilla is 5, max is 30. #define POKEY_NUM_SEGMENTS 5 - // The number of segments Wiggler has, not including the head. Vanilla is 4. #define WIGGLER_NUM_SEGMENTS 4 diff --git a/src/engine/math_util.h b/src/engine/math_util.h index d1808ce5..5262fb71 100644 --- a/src/engine/math_util.h +++ b/src/engine/math_util.h @@ -482,8 +482,8 @@ void mtxf_align_terrain_triangle(Mat4 mtx, Vec3f pos, s32 yaw, f32 radius); void mtxf_mul(Mat4 dest, Mat4 a, Mat4 b); void mtxf_scale_vec3f(Mat4 dest, Mat4 mtx, Vec3f s); void mtxf_mul_vec3s(Mat4 mtx, Vec3s b); -extern void mtxf_to_mtx_asm(register s16 *dest, register f32 *src); -inline void mtxf_to_mtx(register s16 *dest, register f32 *src) { +extern void mtxf_to_mtx_asm(register void *dest, register void *src); +inline void mtxf_to_mtx(register void *dest, register void *src) { mtxf_to_mtx_asm(dest, src); } void mtxf_rotate_xy(Mtx *mtx, s32 angle); diff --git a/src/game/camera.c b/src/game/camera.c index 21c6fc13..8d6943f9 100644 --- a/src/game/camera.c +++ b/src/game/camera.c @@ -2855,8 +2855,8 @@ void update_camera(struct Camera *c) { c->yaw = gLakituState.yaw; c->nextYaw = gLakituState.nextYaw; - c->mode = gLakituState.mode;// = c->mode; - c->defMode = gLakituState.defMode;// = c->defMode; + c->mode = gLakituState.mode; + c->defMode = gLakituState.defMode; #ifdef CAMERA_FIX if (gCurrDemoInput != NULL) camera_course_processing(c); #else @@ -3865,19 +3865,8 @@ s16 reduce_by_dist_from_camera(s16 value, f32 maxDist, f32 posX, f32 posY, f32 p s32 clamp_positions_and_find_yaw(Vec3f pos, Vec3f origin, f32 xMax, f32 xMin, f32 zMax, f32 zMin) { s16 yaw = gCamera->nextYaw; - - if (pos[0] >= xMax) { - pos[0] = xMax; - } - if (pos[0] <= xMin) { - pos[0] = xMin; - } - if (pos[2] >= zMax) { - pos[2] = zMax; - } - if (pos[2] <= zMin) { - pos[2] = zMin; - } + pos[0] = CLAMP(pos[0], xMin, xMax); + pos[2] = CLAMP(pos[2], zMin, zMax); yaw = calculate_yaw(origin, pos); return yaw; } @@ -4047,14 +4036,14 @@ s32 is_pos_in_bounds(Vec3f pos, Vec3f center, Vec3f bounds, s16 boundsYaw) { -bounds[2] < rel[2] && rel[2] < bounds[2]); } -s16 calculate_pitch(Vec3f from, Vec3f to) { +s32 calculate_pitch(Vec3f from, Vec3f to) { f32 dx = to[0] - from[0]; f32 dy = to[1] - from[1]; f32 dz = to[2] - from[2]; return atan2s(sqrtf(sqr(dx) + sqr(dz)), dy); } -s16 calculate_yaw(Vec3f from, Vec3f to) { +s32 calculate_yaw(Vec3f from, Vec3f to) { f32 dx = to[0] - from[0]; f32 dz = to[2] - from[2]; return atan2s(dz, dx); @@ -5023,19 +5012,17 @@ void set_fixed_cam_axis_sa_lobby(UNUSED s16 preset) { * or if the camera is in Mario mode and Mario is not swimming or in water with the metal cap */ #ifdef CAMERA_FIX -void check_blocking_area_processing(UNUSED const UNUSED u8 *mode) { +void check_blocking_area_processing(UNUSED const u8 *mode) { sStatusFlags |= CAM_FLAG_BLOCK_AREA_PROCESSING; #else -void check_blocking_area_processing(UNUSED const u8 *mode) { +void check_blocking_area_processing(const u8 *mode) { if ((sMarioCamState->action & ACT_FLAG_METAL_WATER) || (sMarioCamState->action == ACT_DEBUG_FREE_MOVE) || *mode == CAMERA_MODE_BEHIND_MARIO || *mode == CAMERA_MODE_WATER_SURFACE) { sStatusFlags |= CAM_FLAG_BLOCK_AREA_PROCESSING; } -#ifndef DISABLE_LEVEL_SPECIFIC_CHECKS if (gCurrLevelNum == LEVEL_DDD || gCurrLevelNum == LEVEL_WDW || gCurrLevelNum == LEVEL_COTMC) { sStatusFlags &= ~CAM_FLAG_BLOCK_AREA_PROCESSING; } -#endif if ((*mode == CAMERA_MODE_BEHIND_MARIO && !(sMarioCamState->action & (ACT_FLAG_SWIMMING | ACT_FLAG_METAL_WATER))) || *mode == CAMERA_MODE_INSIDE_CANNON) { @@ -5990,7 +5977,10 @@ s16 camera_course_processing(struct Camera *c) { case AREA_BBH: // if camera is fixed at bbh_room_13_balcony_camera (but as floats) - if (sFixedModeBasePosition[0] == 210.f && sFixedModeBasePosition[1] == 420.f && sFixedModeBasePosition[2] == 3109.f && sMarioCamState->pos[1] < 1800.f) { + if (sFixedModeBasePosition[0] == 210.f + && sFixedModeBasePosition[1] == 420.f + && sFixedModeBasePosition[2] == 3109.f + && sMarioCamState->pos[1] < 1800.f) { transition_to_camera_mode(c, CAMERA_MODE_CLOSE, 30); } break; @@ -7119,6 +7109,7 @@ void star_dance_bound_yaw(struct Camera *c, s16 absYaw, s16 yawMax) { * Store the camera's focus in cvar9. */ void cutscene_dance_closeup_start(struct Camera *c) { +#ifndef DISABLE_LEVEL_SPECIFIC_CHECKS if ((gLastCompletedStarNum == 4) && (gCurrCourseNum == COURSE_JRB)) { star_dance_bound_yaw(c, 0x0, 0x4000); } @@ -7128,7 +7119,7 @@ void cutscene_dance_closeup_start(struct Camera *c) { if ((gLastCompletedStarNum == 5) && (gCurrCourseNum == COURSE_WDW)) { star_dance_bound_yaw(c, 0x8000, 0x800); } - +#endif vec3f_copy(sCutsceneVars[9].point, c->focus); //! cvar8 is unused in the closeup cutscene sCutsceneVars[8].angle[0] = 0x2000; @@ -7152,12 +7143,12 @@ void cutscene_dance_closeup_fly_above(struct Camera *c) { s16 pitch, yaw; f32 dist; s16 goalPitch = 0x1800; - +#ifndef DISABLE_LEVEL_SPECIFIC_CHECKS if ((gLastCompletedStarNum == 6 && gCurrCourseNum == COURSE_SL) || (gLastCompletedStarNum == 4 && gCurrCourseNum == COURSE_TTC)) { goalPitch = 0x800; } - +#endif vec3f_get_dist_and_angle(sMarioCamState->pos, c->pos, &dist, &pitch, &yaw); approach_f32_asymptotic_bool(&dist, 800.f, 0.05f); approach_s16_asymptotic_bool(&pitch, goalPitch, 16); @@ -7232,12 +7223,13 @@ void cutscene_dance_fly_away_start(struct Camera *c) { c->yaw = calculate_yaw(areaCenter, c->pos); c->nextYaw = c->yaw; } - +#ifndef DISABLE_LEVEL_SPECIFIC_CHECKS // Restrict the camera yaw in tight spaces if ((gLastCompletedStarNum == 6) && (gCurrCourseNum == COURSE_CCM)) star_dance_bound_yaw(c, 0x5600, 0x800); if ((gLastCompletedStarNum == 2) && (gCurrCourseNum == COURSE_TTM)) star_dance_bound_yaw(c, 0x0, 0x800); if ((gLastCompletedStarNum == 1) && (gCurrCourseNum == COURSE_SL )) star_dance_bound_yaw(c, 0x2000, 0x800); if ((gLastCompletedStarNum == 3) && (gCurrCourseNum == COURSE_RR )) star_dance_bound_yaw(c, 0x0, 0x800); +#endif } void cutscene_dance_fly_away_approach_mario(struct Camera *c) { diff --git a/src/game/camera.h b/src/game/camera.h index 5b839d71..16dd1a9b 100644 --- a/src/game/camera.h +++ b/src/game/camera.h @@ -704,8 +704,8 @@ void random_vec3s(Vec3s dst, s16 xRange, s16 yRange, s16 zRange); s32 clamp_positions_and_find_yaw(Vec3f pos, Vec3f origin, f32 xMax, f32 xMin, f32 zMax, f32 zMin); s32 is_range_behind_surface(Vec3f from, Vec3f to, struct Surface *surf, s16 range, s16 surfType); void scale_along_line(Vec3f dest, Vec3f from, Vec3f to, f32 scale); -s16 calculate_pitch(Vec3f from, Vec3f to); -s16 calculate_yaw(Vec3f from, Vec3f to); +s32 calculate_pitch(Vec3f from, Vec3f to); +s32 calculate_yaw(Vec3f from, Vec3f to); void calculate_angles(Vec3f from, Vec3f to, s16 *pitch, s16 *yaw); f32 calc_abs_dist(Vec3f a, Vec3f b); f32 calc_abs_dist_squared(Vec3f a, Vec3f b); diff --git a/src/game/interaction.c b/src/game/interaction.c index d91f2435..d0b05f91 100644 --- a/src/game/interaction.c +++ b/src/game/interaction.c @@ -611,15 +611,15 @@ void push_mario_out_of_object(struct MarioState *m, struct Object *obj, f32 padd f32 offsetX = m->pos[0] - obj->oPosX; f32 offsetZ = m->pos[2] - obj->oPosZ; - f32 distance = (sqr(offsetX) + sqr(offsetZ)); + f32 distanceSquared = (sqr(offsetX) + sqr(offsetZ)); - if (distance < sqr(minDistance)) { + if (distanceSquared < sqr(minDistance)) { struct Surface *floor; s16 pushAngle; f32 newMarioX; f32 newMarioZ; - if (distance == 0.0f) { + if (distanceSquared == 0.0f) { pushAngle = m->faceAngle[1]; } else { pushAngle = atan2s(offsetZ, offsetX); @@ -1442,8 +1442,13 @@ u32 interact_koopa_shell(struct MarioState *m, UNUSED u32 interactType, struct O update_mario_sound_and_camera(m); play_shell_music(); mario_drop_held_object(m); - +#ifdef SHELL_CANCEL_FIX return set_mario_action(m, ((m->pos[0] > m->floorHeight) ? ACT_RIDING_SHELL_FALL : ACT_RIDING_SHELL_GROUND), 0); +#else + //! Puts Mario in ground action even when in air, making it easy to + // escape air actions into crouch slide (shell cancel) + return set_mario_action(m, ACT_RIDING_SHELL_GROUND, 0); +#endif } push_mario_out_of_object(m, obj, 2.0f); @@ -1644,17 +1649,8 @@ u32 mario_can_talk(struct MarioState *m, u32 arg) { return FALSE; } -#ifdef VERSION_JP -#define READ_MASK (INPUT_B_PRESSED) -#else -#define READ_MASK (INPUT_B_PRESSED | INPUT_A_PRESSED) -#endif - -#ifdef VERSION_JP -#define SIGN_RANGE 0x38E3 -#else -#define SIGN_RANGE 0x4000 -#endif +#define READ_MASK (INPUT_A_PRESSED | INPUT_B_PRESSED) +#define SIGN_RANGE DEGREES(45) u32 check_read_sign(struct MarioState *m, struct Object *obj) { if ((m->input & READ_MASK) && mario_can_talk(m, 0) && object_facing_mario(m, obj, SIGN_RANGE)) { @@ -1840,11 +1836,9 @@ void mario_handle_special_floors(struct MarioState *m) { break; } - if (!(m->action & ACT_FLAG_AIR) && !(m->action & ACT_FLAG_SWIMMING)) { - switch (floorType) { - case SURFACE_BURNING: - check_lava_boost(m); - break; + if (!(m->action & (ACT_FLAG_AIR | ACT_FLAG_SWIMMING))) { + if (floorType == SURFACE_BURNING) { + check_lava_boost(m); } } } diff --git a/src/game/level_update.c b/src/game/level_update.c index be090068..67023d39 100644 --- a/src/game/level_update.c +++ b/src/game/level_update.c @@ -1324,7 +1324,6 @@ s32 lvl_set_current_level(UNUSED s16 arg0, s32 levelNum) { if (gSavedCourseNum != gCurrCourseNum) { gSavedCourseNum = gCurrCourseNum; - nop_change_course(); disable_warp_checkpoint(); } diff --git a/src/game/macro_special_objects.c b/src/game/macro_special_objects.c index e8de3316..4a594d73 100644 --- a/src/game/macro_special_objects.c +++ b/src/game/macro_special_objects.c @@ -123,8 +123,8 @@ void spawn_macro_objects(s32 areaIndex, s16 *macroObjList) { // Spawn the new macro object. newObj = spawn_object_abs_with_rot(&gMacroObjectDefaultParent, // Parent object 0, // Unused - MacroObjectPresets[presetID].model, // Model ID - MacroObjectPresets[presetID].behavior, // Behavior address + preset.model, // Model ID + preset.behavior, // Behavior address macroObject[MACRO_OBJ_X], // X-position macroObject[MACRO_OBJ_Y], // Y-position macroObject[MACRO_OBJ_Z], // Z-position diff --git a/src/game/mario.c b/src/game/mario.c index b6d4e187..0712bbab 100644 --- a/src/game/mario.c +++ b/src/game/mario.c @@ -940,10 +940,10 @@ static u32 set_mario_action_cutscene(struct MarioState *m, u32 action, UNUSED u3 */ u32 set_mario_action(struct MarioState *m, u32 action, u32 actionArg) { switch (action & ACT_GROUP_MASK) { - case ACT_GROUP_MOVING: action = set_mario_action_moving (m, action, actionArg); break; - case ACT_GROUP_AIRBORNE: action = set_mario_action_airborne (m, action, actionArg); break; + case ACT_GROUP_MOVING: action = set_mario_action_moving( m, action, actionArg); break; + case ACT_GROUP_AIRBORNE: action = set_mario_action_airborne( m, action, actionArg); break; case ACT_GROUP_SUBMERGED: action = set_mario_action_submerged(m, action, actionArg); break; - case ACT_GROUP_CUTSCENE: action = set_mario_action_cutscene (m, action, actionArg); break; + case ACT_GROUP_CUTSCENE: action = set_mario_action_cutscene( m, action, actionArg); break; } // Resets the sound played flags, meaning Mario can play those sound types again. @@ -1735,12 +1735,12 @@ s32 execute_mario_action(struct MarioState *m) { while (inLoop) { switch (m->action & ACT_GROUP_MASK) { case ACT_GROUP_STATIONARY: inLoop = mario_execute_stationary_action(m); break; - case ACT_GROUP_MOVING: inLoop = mario_execute_moving_action (m); break; - case ACT_GROUP_AIRBORNE: inLoop = mario_execute_airborne_action (m); break; - case ACT_GROUP_SUBMERGED: inLoop = mario_execute_submerged_action (m); break; - case ACT_GROUP_CUTSCENE: inLoop = mario_execute_cutscene_action (m); break; - case ACT_GROUP_AUTOMATIC: inLoop = mario_execute_automatic_action (m); break; - case ACT_GROUP_OBJECT: inLoop = mario_execute_object_action (m); break; + case ACT_GROUP_MOVING: inLoop = mario_execute_moving_action(m); break; + case ACT_GROUP_AIRBORNE: inLoop = mario_execute_airborne_action(m); break; + case ACT_GROUP_SUBMERGED: inLoop = mario_execute_submerged_action(m); break; + case ACT_GROUP_CUTSCENE: inLoop = mario_execute_cutscene_action(m); break; + case ACT_GROUP_AUTOMATIC: inLoop = mario_execute_automatic_action(m); break; + case ACT_GROUP_OBJECT: inLoop = mario_execute_object_action(m); break; } } diff --git a/src/game/object_helpers.c b/src/game/object_helpers.c index 78b046c5..f755c750 100644 --- a/src/game/object_helpers.c +++ b/src/game/object_helpers.c @@ -804,7 +804,10 @@ s32 cur_obj_check_if_near_animation_end(void) { u32 animFlags = (s32) o->header.gfx.animInfo.curAnim->flags; s32 animFrame = o->header.gfx.animInfo.animFrame; s32 nearLoopEnd = o->header.gfx.animInfo.curAnim->loopEnd - 2; - return ((animFlags & ANIM_FLAG_NOLOOP && nearLoopEnd + 1 == animFrame) || animFrame == nearLoopEnd); + if (animFlags & ANIM_FLAG_NOLOOP && nearLoopEnd + 1 == animFrame) { + return TRUE; + } + return (animFrame == nearLoopEnd); } s32 cur_obj_check_if_at_animation_end(void) { @@ -1968,7 +1971,10 @@ s32 cur_obj_mario_far_away(void) { } s32 is_mario_moving_fast_or_in_air(s32 speedThreshold) { - return ((gMarioStates[0].forwardVel > speedThreshold) || (gMarioStates[0].action & ACT_FLAG_AIR)); + return ( + (gMarioState->forwardVel > speedThreshold) || + (gMarioState->action & ACT_FLAG_AIR) + ); } s32 is_item_in_array(s8 item, s8 *array) { diff --git a/src/game/rendering_graph_node.c b/src/game/rendering_graph_node.c index 7188c142..e597a38e 100644 --- a/src/game/rendering_graph_node.c +++ b/src/game/rendering_graph_node.c @@ -420,7 +420,6 @@ void geo_process_perspective(struct GraphNodePerspective *node) { if (node->fnNode.node.children != NULL) { u16 perspNorm; f32 farClip = node->far; - f32 farClipDelta = farClip; Mtx *mtx = alloc_display_list(sizeof(*mtx)); #ifdef WIDE if (gConfig.widescreen && (gCurrLevelNum != 0x01)){ From 9721960d80bbae100a7f24b108239411f8bc2211 Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Sun, 3 Oct 2021 12:56:45 -0700 Subject: [PATCH 89/97] Fixes for merging nightly --- include/config.h | 6 +++--- src/engine/math_util.c | 18 +++++++++++------- src/engine/math_util.h | 1 + src/game/camera.c | 37 +++++++++++-------------------------- src/game/mario_step.c | 9 --------- src/game/object_helpers.c | 12 ++++++------ 6 files changed, 32 insertions(+), 51 deletions(-) diff --git a/include/config.h b/include/config.h index 3371af74..4a3f5849 100644 --- a/include/config.h +++ b/include/config.h @@ -77,7 +77,7 @@ // 1 is similar to vanilla, but prevents Mario from moving in the wrong direction, and allows finer control with the analog stick. // 2 is similar to mode 1, but a bit further from vanilla, and allows instant turnaround if Mario is moving slower than a certain threshold. // 3 is instant turning to the intended direction regardless of speed and angle. -// 4 is an expeimental asymptotic turn. +// 4 is an experimental asymptotic turn. #define GROUND_TURN_MODE 0 // Improved hanging: // - Doesn't require holding down the A button @@ -105,7 +105,7 @@ #define HANGING_FIX // The last frame that will be considered a firsty when wallkicking #define FIRSTY_LAST_FRAME 1 -// The maximum angle the player can wall kick, in degrees. 0..90 +// The maximum angle the player can wall kick, in degrees. 0..90. To allow 45 degree wall kicks, you must supply `46` to allow 45 and under. #define WALL_KICK_DEGREES 45 // Disable BLJs and crush SimpleFlips's dreams //#define DISABLE_BLJ @@ -131,7 +131,7 @@ // Allow for retries on collecting the remaining blue coins from a blue coin switch #define BLUE_COIN_SWITCH_RETRY // Fixes shell cancel -#define SHELL_CANCEL_FIX +//#define SHELL_CANCEL_FIX // The number of chain balls the Chain Chomp has. Vanilla is 5. #define CHAIN_CHOMP_NUM_SEGMENTS 5 // The number of parts Pokey has, including the head. Vanilla is 5, max is 30. diff --git a/src/engine/math_util.c b/src/engine/math_util.c index be4018dd..6fcf1376 100644 --- a/src/engine/math_util.c +++ b/src/engine/math_util.c @@ -29,7 +29,7 @@ Vec3i gVec3iZero = { 0, 0, 0 }; Vec3s gVec3sOne = { 1, 1, 1 }; /// From Wiseguy -static inline s32 roundf(f32 in) { +static inline s32 asm_roundf(f32 in) { f32 tmp; s32 out; __asm__("round.w.s %0,%1" : "=f" (tmp) : "f" (in)); @@ -37,14 +37,18 @@ static inline s32 roundf(f32 in) { return out; } -// static inline float absf(float in) { -// f32 out; -// __asm__("abs.s %0,%1" : "=f" (out) : "f" (in)); -// return out; -// } +f32 roundf(f32 x) { + return asm_roundf(x); +} + +static inline float asm_absf(float in) { + f32 out; + __asm__("abs.s %0,%1" : "=f" (out) : "f" (in)); + return out; +} f32 absf(f32 x) { - return ABSF(x); + return asm_absf(x); } /// Returns the lowest of three values. diff --git a/src/engine/math_util.h b/src/engine/math_util.h index 5262fb71..ed8baf98 100644 --- a/src/engine/math_util.h +++ b/src/engine/math_util.h @@ -449,6 +449,7 @@ extern f32 gSineTable[]; } \ } +f32 roundf(f32 x); f32 absf(f32 x); s32 min_3i(s32 a0, s32 a1, s32 a2); f32 min_3f(f32 a0, f32 a1, f32 a2); diff --git a/src/game/camera.c b/src/game/camera.c index 8d6943f9..6a3cf85d 100644 --- a/src/game/camera.c +++ b/src/game/camera.c @@ -896,13 +896,7 @@ void radial_camera_move(struct Camera *c) { // How much the camera's yaw changed s16 yawOffset = calculate_yaw(sMarioCamState->pos, c->pos) - atan2s(areaDistZ, areaDistX); - - if (yawOffset > maxAreaYaw) { - yawOffset = maxAreaYaw; - } - if (yawOffset < minAreaYaw) { - yawOffset = minAreaYaw; - } + yawOffset = CLAMP(yawOffset, minAreaYaw, maxAreaYaw); // Check if Mario stepped on a surface that rotates the camera. For example, when Mario enters the // gate in BoB, the camera turns right to face up the hill path @@ -3874,23 +3868,16 @@ s32 clamp_positions_and_find_yaw(Vec3f pos, Vec3f origin, f32 xMax, f32 xMin, f3 /** * The yaw passed here is the yaw of the direction FROM Mario TO Lakitu. * - * wallYaw always has 90 degrees added to it before this is called -- it's parallel to the wall. - * * @return the new yaw from Mario to rotate towards. - * - * @warning this is jank. It actually returns the yaw that will rotate further INTO the wall. So, the - * developers just add 180 degrees to the result. */ s32 calc_avoid_yaw(s16 yawFromMario, s16 wallYaw) { - s16 yawDiff = wallYaw - yawFromMario + DEGREES(90); - - if (yawDiff < 0) { + if (yawFromMario < (s16)(wallYaw + DEGREES(180))) { // Deflect to the right - yawFromMario = wallYaw; + yawFromMario = wallYaw + DEGREES(90); } else { // Note: this favors the left side if the wall is exactly perpendicular to the camera. // Deflect to the left - yawFromMario = wallYaw + DEGREES(180); + yawFromMario = wallYaw - DEGREES(90); } return yawFromMario; } @@ -6118,7 +6105,7 @@ void resolve_geometry_collisions(Vec3f pos) { s32 rotate_camera_around_walls(UNUSED struct Camera *c, Vec3f cPos, s16 *avoidYaw, s16 yawRange) { struct WallCollisionData colData; struct Surface *wall; - s16 wallYaw, horWallNorm; + s16 wallYaw; // The yaw of the vector from Mario to the camera. s16 yawFromMario; s32 status = 0; @@ -6156,10 +6143,9 @@ s32 rotate_camera_around_walls(UNUSED struct Camera *c, Vec3f cPos, s16 *avoidYa status = 1; wall = colData.walls[colData.numWalls - 1]; // wallYaw is parallel to the wall, not perpendicular - wallYaw = atan2s(wall->normal.z, wall->normal.x) + DEGREES(90); - // Calculate the avoid direction. The function returns the opposite direction so add 180 - // degrees. - *avoidYaw = calc_avoid_yaw(yawFromMario, wallYaw) + DEGREES(180); + wallYaw = SURFACE_YAW(wall); + // Calculate the avoid direction. The function returns the opposite direction so add 180 degrees. + *avoidYaw = calc_avoid_yaw(yawFromMario, wallYaw); } } @@ -6172,8 +6158,7 @@ s32 rotate_camera_around_walls(UNUSED struct Camera *c, Vec3f cPos, s16 *avoidYa if (find_wall_collisions(&colData) != 0) { wall = colData.walls[colData.numWalls - 1]; - horWallNorm = atan2s(wall->normal.z, wall->normal.x); - wallYaw = horWallNorm + DEGREES(90); + wallYaw = SURFACE_YAW(wall); // If Mario would be blocked by the surface, then avoid it if ((is_range_behind_surface(sMarioCamState->pos, cPos, wall, yawRange, SURFACE_WALL_MISC) == 0) && (is_behind_surface(sMarioCamState->pos, wall)) @@ -6181,8 +6166,8 @@ s32 rotate_camera_around_walls(UNUSED struct Camera *c, Vec3f cPos, s16 *avoidYa && (!is_surf_within_bounding_box(wall, -1.f, 150.f, -1.f))) { // Calculate the avoid direction. The function returns the opposite direction so add 180 // degrees. - *avoidYaw = calc_avoid_yaw(yawFromMario, wallYaw) + DEGREES(180); - camera_approach_s16_symmetric_bool(avoidYaw, horWallNorm, yawRange); + *avoidYaw = calc_avoid_yaw(yawFromMario, wallYaw); + camera_approach_s16_symmetric_bool(avoidYaw, wallYaw, yawRange); status = 3; step = 8; } diff --git a/src/game/mario_step.c b/src/game/mario_step.c index ef4618e3..2facbcc2 100644 --- a/src/game/mario_step.c +++ b/src/game/mario_step.c @@ -685,15 +685,6 @@ s32 perform_air_step(struct MarioState *m, u32 stepArg) { vec3f_copy(m->marioObj->header.gfx.pos, m->pos); vec3s_set(m->marioObj->header.gfx.angle, 0, m->faceAngle[1], 0); - /*if (stepResult == AIR_STEP_HIT_WALL && m->wall != NULL) { - wallDYaw = abs_angle_diff(atan2s(m->wall->normal.z, m->wall->normal.x), m->faceAngle[1]); - if ((stepArg & AIR_STEP_CHECK_BONK) && (wallDYaw > DEGREES(180 - WALL_KICK_DEGREES))) { - if (m->forwardVel > 16.0f) { - mario_bonk_reflection(m, (stepArg & AIR_STEP_BONK_NEGATE_SPEED), m->wall); - } - } - }*/ - return stepResult; } diff --git a/src/game/object_helpers.c b/src/game/object_helpers.c index f755c750..e54bf38b 100644 --- a/src/game/object_helpers.c +++ b/src/game/object_helpers.c @@ -244,15 +244,15 @@ void obj_set_held_state(struct Object *obj, const BehaviorScript *heldBehavior) } f32 lateral_dist_between_objects(struct Object *obj1, struct Object *obj2) { - f32 lateralDist; - vec3f_get_lateral_dist(&obj1->oPosVec, &obj2->oPosVec, &lateralDist); - return lateralDist; + register f32 dx = (obj2->oPosX - obj1->oPosX); + register f32 dz = (obj2->oPosZ - obj1->oPosZ); + return sqrtf(sqr(dx) + sqr(dz)); } f32 dist_between_objects(struct Object *obj1, struct Object *obj2) { - f32 dist; - vec3f_get_dist(&obj1->oPosVec, &obj2->oPosVec, &dist); - return dist; + register Vec3f d; + vec3_diff(d, &obj2->oPosVec, &obj1->oPosVec); + return vec3_mag(d); } void cur_obj_forward_vel_approach_upward(f32 target, f32 increment) { From ea32e1ea70e2034a88b9f08e9fd4de8da358c2c2 Mon Sep 17 00:00:00 2001 From: Fazana <52551480+FazanaJ@users.noreply.github.com> Date: Sun, 3 Oct 2021 21:05:46 +0100 Subject: [PATCH 90/97] Moved hitbox visualisation into its own func Saves around 500us in the graph --- src/game/rendering_graph_node.c | 55 ++++++++++++++++++--------------- 1 file changed, 30 insertions(+), 25 deletions(-) diff --git a/src/game/rendering_graph_node.c b/src/game/rendering_graph_node.c index e597a38e..60096e06 100644 --- a/src/game/rendering_graph_node.c +++ b/src/game/rendering_graph_node.c @@ -916,6 +916,33 @@ s32 obj_is_in_view(struct GraphNodeObject *node, Mat4 matrix) { return TRUE; } +#ifdef VISUAL_DEBUG +void visualise_object_hitbox(struct Object *node) +{ + Vec3f bnds1, bnds2; + // This will create a cylinder that visualises their hitbox. + // If they do not have a hitbox, it will be a small white cube instead. + if (node->oIntangibleTimer != -1) { + vec3f_set(bnds1, node->oPosX, node->oPosY - node->hitboxDownOffset, node->oPosZ); + vec3f_set(bnds2, node->hitboxRadius, node->hitboxHeight-node->hitboxDownOffset, node->hitboxRadius); + if (node->behavior == segmented_to_virtual(bhvWarp) || node->behavior == segmented_to_virtual(bhvDoorWarp) || node->behavior == segmented_to_virtual(bhvFadingWarp)) + debug_box_color(0x80FFA500); + else + debug_box_color(0x800000FF); + debug_box(bnds1, bnds2, DEBUG_SHAPE_CYLINDER | DEBUG_UCODE_REJ); + vec3f_set(bnds1, node->oPosX, node->oPosY - node->hitboxDownOffset, node->oPosZ); + vec3f_set(bnds2, node->hurtboxRadius, node->hurtboxHeight, node->hurtboxRadius); + debug_box_color(0x8FF00000); + debug_box(bnds1, bnds2, DEBUG_SHAPE_CYLINDER | DEBUG_UCODE_REJ); + } else { + vec3f_set(bnds1, node->oPosX, node->oPosY - 15, node->oPosZ); + vec3f_set(bnds2, 30, 30, 30); + debug_box_color(0x80FFFFFF); + debug_box(bnds1, bnds2, DEBUG_SHAPE_BOX | DEBUG_UCODE_REJ); + } +} +#endif + /** * Process an object node. */ @@ -946,31 +973,9 @@ void geo_process_object(struct Object *node) { gMatStackIndex--; inc_mat_stack(); if (node->header.gfx.sharedChild != NULL) { - #ifdef VISUAL_DEBUG - if (hitboxView) { - Vec3f bnds1, bnds2; - // This will create a cylinder that visualises their hitbox. - // If they do not have a hitbox, it will be a small white cube instead. - if (node->oIntangibleTimer != -1) { - vec3f_set(bnds1, node->oPosX, node->oPosY - node->hitboxDownOffset, node->oPosZ); - vec3f_set(bnds2, node->hitboxRadius, node->hitboxHeight-node->hitboxDownOffset, node->hitboxRadius); - if (node->behavior == segmented_to_virtual(bhvWarp) || node->behavior == segmented_to_virtual(bhvDoorWarp) || node->behavior == segmented_to_virtual(bhvFadingWarp)) - debug_box_color(0x80FFA500); - else - debug_box_color(0x800000FF); - debug_box(bnds1, bnds2, DEBUG_SHAPE_CYLINDER | DEBUG_UCODE_REJ); - vec3f_set(bnds1, node->oPosX, node->oPosY - node->hitboxDownOffset, node->oPosZ); - vec3f_set(bnds2, node->hurtboxRadius, node->hurtboxHeight, node->hurtboxRadius); - debug_box_color(0x8FF00000); - debug_box(bnds1, bnds2, DEBUG_SHAPE_CYLINDER | DEBUG_UCODE_REJ); - } else { - vec3f_set(bnds1, node->oPosX, node->oPosY - 15, node->oPosZ); - vec3f_set(bnds2, 30, 30, 30); - debug_box_color(0x80FFFFFF); - debug_box(bnds1, bnds2, DEBUG_SHAPE_BOX | DEBUG_UCODE_REJ); - } - } - #endif +#ifdef VISUAL_DEBUG + if (hitboxView) visualise_object_hitbox(node); +#endif gCurGraphNodeObject = (struct GraphNodeObject *) node; node->header.gfx.sharedChild->parent = &node->header.gfx.node; geo_process_node_and_siblings(node->header.gfx.sharedChild); From 77bf07344955d9589156179124b5ca853951cf77 Mon Sep 17 00:00:00 2001 From: Fazana <52551480+FazanaJ@users.noreply.github.com> Date: Mon, 4 Oct 2021 18:37:19 +0100 Subject: [PATCH 91/97] Make layer 0 zex render first --- src/game/rendering_graph_node.c | 10 ++++++---- src/game/rendering_graph_node.h | 22 ++++++++++++---------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/game/rendering_graph_node.c b/src/game/rendering_graph_node.c index 60096e06..f2768aee 100644 --- a/src/game/rendering_graph_node.c +++ b/src/game/rendering_graph_node.c @@ -206,8 +206,8 @@ void reset_clipping(void) void geo_process_master_list_sub(struct GraphNodeMasterList *node) { struct DisplayListNode *currList; s32 startLayer, endLayer, currLayer = LAYER_FORCE; - s32 headsIndex = LIST_HEADS_REJ; - s32 renderPhase = RENDER_PHASE_REJ_ZB; + s32 headsIndex = LIST_HEADS_ZEX; + s32 renderPhase = RENDER_PHASE_ZEX_BG; s32 enableZBuffer = (node->node.flags & GRAPH_RENDER_Z_BUFFER) != 0; struct RenderModeContainer *mode1List = &renderModeTable_1Cycle[enableZBuffer]; struct RenderModeContainer *mode2List = &renderModeTable_2Cycle[enableZBuffer]; @@ -225,16 +225,18 @@ void geo_process_master_list_sub(struct GraphNodeMasterList *node) { loopBegin: switch (renderPhase) { #if SILHOUETTE + case RENDER_PHASE_ZEX_BG: headsIndex = LIST_HEADS_ZEX; startLayer = LAYER_FORCE; endLayer = LAYER_FORCE; break; case RENDER_PHASE_REJ_ZB: headsIndex = LIST_HEADS_REJ; startLayer = LAYER_FORCE; endLayer = LAYER_LAST_BEFORE_SILHOUETTE; break; - case RENDER_PHASE_ZEX_BEFORE_SILHOUETTE: headsIndex = LIST_HEADS_ZEX; startLayer = LAYER_FORCE; endLayer = LAYER_LAST_BEFORE_SILHOUETTE; break; + case RENDER_PHASE_ZEX_BEFORE_SILHOUETTE: headsIndex = LIST_HEADS_ZEX; startLayer = LAYER_OPAQUE; endLayer = LAYER_LAST_BEFORE_SILHOUETTE; break; case RENDER_PHASE_REJ_SILHOUETTE: headsIndex = LIST_HEADS_REJ; startLayer = LAYER_SILHOUETTE_FIRST; endLayer = LAYER_SILHOUETTE_LAST; break; case RENDER_PHASE_REJ_NON_SILHOUETTE: headsIndex = LIST_HEADS_REJ; startLayer = LAYER_SILHOUETTE_FIRST; endLayer = LAYER_SILHOUETTE_LAST; break; case RENDER_PHASE_REJ_OCCLUDE_SILHOUETTE: headsIndex = LIST_HEADS_REJ; startLayer = LAYER_OCCLUDE_SILHOUETTE_FIRST; endLayer = LAYER_OCCLUDE_SILHOUETTE_LAST; break; case RENDER_PHASE_ZEX_AFTER_SILHOUETTE: headsIndex = LIST_HEADS_ZEX; startLayer = LAYER_OCCLUDE_SILHOUETTE_FIRST; endLayer = (LAYER_COUNT - 1); break; case RENDER_PHASE_REJ_NON_ZB: headsIndex = LIST_HEADS_REJ; startLayer = LAYER_FIRST_NON_ZB; endLayer = (LAYER_COUNT - 1); break; #else + case RENDER_PHASE_ZEX_BG: headsIndex = LIST_HEADS_ZEX; startLayer = LAYER_FORCE; endLayer = LAYER_FORCE; break; case RENDER_PHASE_REJ_ZB: headsIndex = LIST_HEADS_REJ; startLayer = LAYER_FORCE; endLayer = LAYER_ZB_LAST; break; - case RENDER_PHASE_ZEX_ALL: headsIndex = LIST_HEADS_ZEX; startLayer = LAYER_FORCE; endLayer = (LAYER_COUNT - 1); break; + case RENDER_PHASE_ZEX_ALL: headsIndex = LIST_HEADS_ZEX; startLayer = LAYER_OPAQUE; endLayer = (LAYER_COUNT - 1); break; case RENDER_PHASE_REJ_NON_ZB: headsIndex = LIST_HEADS_REJ; startLayer = LAYER_FIRST_NON_ZB; endLayer = (LAYER_COUNT - 1); break; #endif } diff --git a/src/game/rendering_graph_node.h b/src/game/rendering_graph_node.h index f574a65e..3cb0c2da 100644 --- a/src/game/rendering_graph_node.h +++ b/src/game/rendering_graph_node.h @@ -38,17 +38,19 @@ extern f32 gWorldScale; #if SILHOUETTE #define IS_LAYER_SILHOUETTE(layer) (((layer) >= LAYER_SILHOUETTE_FIRST) || ((layer) <= LAYER_SILHOUETTE_LAST)) -#define RENDER_PHASE_REJ_ZB 0 -#define RENDER_PHASE_ZEX_BEFORE_SILHOUETTE 1 -#define RENDER_PHASE_REJ_SILHOUETTE 2 -#define RENDER_PHASE_REJ_NON_SILHOUETTE 3 -#define RENDER_PHASE_REJ_OCCLUDE_SILHOUETTE 4 -#define RENDER_PHASE_ZEX_AFTER_SILHOUETTE 5 -#define RENDER_PHASE_REJ_NON_ZB 6 +#define RENDER_PHASE_ZEX_BG 0 +#define RENDER_PHASE_REJ_ZB 1 +#define RENDER_PHASE_ZEX_BEFORE_SILHOUETTE 2 +#define RENDER_PHASE_REJ_SILHOUETTE 3 +#define RENDER_PHASE_REJ_NON_SILHOUETTE 4 +#define RENDER_PHASE_REJ_OCCLUDE_SILHOUETTE 5 +#define RENDER_PHASE_ZEX_AFTER_SILHOUETTE 6 +#define RENDER_PHASE_REJ_NON_ZB 7 #else -#define RENDER_PHASE_REJ_ZB 0 -#define RENDER_PHASE_ZEX_ALL 1 -#define RENDER_PHASE_REJ_NON_ZB 2 +#define RENDER_PHASE_ZEX_BG 0 +#define RENDER_PHASE_REJ_ZB 1 +#define RENDER_PHASE_ZEX_ALL 2 +#define RENDER_PHASE_REJ_NON_ZB 3 #endif #define RENDER_PHASE_FIRST RENDER_PHASE_REJ_ZB From da285a1457b40fe92c36750b80c18bfa7a5bfdf8 Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Mon, 4 Oct 2021 12:14:02 -0700 Subject: [PATCH 92/97] Fix pokey distance --- src/game/behaviors/pokey.inc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/game/behaviors/pokey.inc.c b/src/game/behaviors/pokey.inc.c index 4d6b39c7..150d6feb 100644 --- a/src/game/behaviors/pokey.inc.c +++ b/src/game/behaviors/pokey.inc.c @@ -143,7 +143,7 @@ static void pokey_act_uninitialized(void) { s32 i; s16 partModel; - if (o->oDistanceToMario < 4000.0f) { + if (o->oDistanceToMario < o->oDrawingDistance) { partModel = MODEL_POKEY_HEAD; for (i = 0; i < POKEY_NUM_SEGMENTS; i++) { @@ -177,7 +177,7 @@ static void pokey_act_wander(void) { if (o->oPokeyNumAliveBodyParts == POKEY_PART_BP_HEAD) { obj_mark_for_deletion(o); - } else if (o->oDistanceToMario > 4500.0f) { + } else if (o->oDistanceToMario > (o->oDrawingDistance + 500.0f)) { o->oAction = POKEY_ACT_UNLOAD_PARTS; o->oForwardVel = 0.0f; } else { From fec149b2380ffd8e25e533345db294d01a5e98c7 Mon Sep 17 00:00:00 2001 From: thecozies Date: Tue, 5 Oct 2021 08:29:12 -0500 Subject: [PATCH 93/97] Revert "Name some HMC geolayouts + some demo fixes" This reverts commit 72be706ec7796870438953b9e8c1927c66248a86. --- include/model_ids.h | 14 +++--- levels/bbh/script.c | 16 +++---- levels/bitdw/script.c | 12 ++--- levels/bitfs/script.c | 12 ++--- levels/bits/script.c | 8 ++-- levels/bob/script.c | 12 ++--- levels/bowser_2/script.c | 4 +- levels/bowser_3/script.c | 4 +- levels/castle_courtyard/script.c | 8 ++-- levels/castle_grounds/script.c | 16 +++---- levels/castle_inside/script.c | 16 +++---- levels/ccm/script.c | 16 +++---- levels/cotmc/script.c | 8 ++-- levels/ddd/script.c | 16 +++---- levels/hmc/areas/1/geo.inc.c | 2 +- levels/hmc/arrow_platform/geo.inc.c | 2 +- levels/hmc/arrow_platform_button/geo.inc.c | 2 +- levels/hmc/elevator_platform/geo.inc.c | 2 +- levels/hmc/grill_door/geo.inc.c | 2 +- levels/hmc/header.h | 16 +++---- levels/hmc/rolling_rock/geo.inc.c | 2 +- levels/hmc/rolling_rock_fragment_1/geo.inc.c | 2 +- levels/hmc/rolling_rock_fragment_2/geo.inc.c | 2 +- levels/hmc/script.c | 48 ++++++++++---------- levels/jrb/script.c | 16 +++---- levels/lll/script.c | 16 +++---- levels/rr/script.c | 12 ++--- levels/sa/script.c | 8 ++-- levels/sl/script.c | 16 +++---- levels/ssl/script.c | 16 +++---- levels/thi/script.c | 16 +++---- levels/totwc/script.c | 8 ++-- levels/ttc/script.c | 8 ++-- levels/ttm/script.c | 16 +++---- levels/vcutm/script.c | 12 ++--- levels/wdw/script.c | 16 +++---- levels/wf/script.c | 16 +++---- levels/wmotr/script.c | 8 ++-- 38 files changed, 213 insertions(+), 213 deletions(-) diff --git a/include/model_ids.h b/include/model_ids.h index dbc83f24..a8434c17 100644 --- a/include/model_ids.h +++ b/include/model_ids.h @@ -110,13 +110,13 @@ #define MODEL_CASTLE_CLOCK_PENDULUM 0x39 // castle_geo_001518 // hmc -#define MODEL_HMC_METAL_PLATFORM 0x36 // hmc_geo_controllable_arrow_platform -#define MODEL_HMC_METAL_ARROW_PLATFORM 0x37 // hmc_geo_controllable_arrow_platform_button -#define MODEL_HMC_ELEVATOR_PLATFORM 0x38 // hmc_geo_elevator_platform -#define MODEL_HMC_ROLLING_ROCK 0x39 // hmc_geo_rolling_rock -#define MODEL_HMC_ROCK_PIECE 0x3A // hmc_geo_rolling_rock_fragment_large - unused -#define MODEL_HMC_ROCK_SMALL_PIECE 0x3B // hmc_geo_rolling_rock_fragment_small - unused -#define MODEL_HMC_RED_GRILLS 0x3C // hmc_geo_grill_door +#define MODEL_HMC_METAL_PLATFORM 0x36 // hmc_geo_0005A0 +#define MODEL_HMC_METAL_ARROW_PLATFORM 0x37 // hmc_geo_0005B8 +#define MODEL_HMC_ELEVATOR_PLATFORM 0x38 // hmc_geo_0005D0 +#define MODEL_HMC_ROLLING_ROCK 0x39 // hmc_geo_000548 +#define MODEL_HMC_ROCK_PIECE 0x3A // hmc_geo_000570 - unused +#define MODEL_HMC_ROCK_SMALL_PIECE 0x3B // hmc_geo_000588 - unused +#define MODEL_HMC_RED_GRILLS 0x3C // hmc_geo_000530 // ssl #define MODEL_SSL_PYRAMID_TOP 0x3A // ssl_geo_000618 diff --git a/levels/bbh/script.c b/levels/bbh/script.c index fb1408f1..8c13b2ea 100644 --- a/levels/bbh/script.c +++ b/levels/bbh/script.c @@ -17,7 +17,7 @@ #include "levels/bbh/header.h" -static const LevelScript script_func_local_hmc_flames_and_poles[] = { +static const LevelScript script_func_local_1[] = { OBJECT(/*model*/ MODEL_RED_FLAME, /*pos*/ 2089, 1331, -1125, /*angle*/ 0, 270, 0, /*behParam*/ 0x00000000, /*beh*/ bhvFlame), OBJECT(/*model*/ MODEL_RED_FLAME, /*pos*/ 1331, 1075, -1330, /*angle*/ 0, 90, 0, /*behParam*/ 0x00000000, /*beh*/ bhvFlame), OBJECT(/*model*/ MODEL_RED_FLAME, /*pos*/ 2089, 1331, -511, /*angle*/ 0, 270, 0, /*behParam*/ 0x00000000, /*beh*/ bhvFlame), @@ -27,7 +27,7 @@ static const LevelScript script_func_local_hmc_flames_and_poles[] = { RETURN(), }; -static const LevelScript script_func_local_hmc_platforms[] = { +static const LevelScript script_func_local_2[] = { OBJECT(/*model*/ MODEL_BBH_TILTING_FLOOR_PLATFORM, /*pos*/ 2866, 820, 1897, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvBbhTiltingTrapPlatform), OBJECT(/*model*/ MODEL_BBH_TUMBLING_PLATFORM, /*pos*/ 2961, 0, -768, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvBbhTumblingBridge), OBJECT(/*model*/ MODEL_BBH_MOVING_BOOKSHELF, /*pos*/ -1994, 819, 213, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvHauntedBookshelf), @@ -37,7 +37,7 @@ static const LevelScript script_func_local_hmc_platforms[] = { RETURN(), }; -static const LevelScript script_func_local_hmc_dorrie_and_spawners[] = { +static const LevelScript script_func_local_3[] = { OBJECT_WITH_ACTS(/*model*/ MODEL_BOO, /*pos*/ 1000, 50, 1000, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvGhostHuntBigBoo, /*acts*/ ACT_1), OBJECT_WITH_ACTS(/*model*/ MODEL_BOO, /*pos*/ 20, 100, -908, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvGhostHuntBoo, /*acts*/ ACT_1), OBJECT_WITH_ACTS(/*model*/ MODEL_BOO, /*pos*/ 3150, 100, 398, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvGhostHuntBoo, /*acts*/ ACT_1), @@ -69,7 +69,7 @@ static const LevelScript script_func_local_hmc_dorrie_and_spawners[] = { RETURN(), }; -static const LevelScript script_func_local_hmc_stars[] = { +static const LevelScript script_func_local_4[] = { OBJECT_WITH_ACTS(/*model*/ MODEL_STAR, /*pos*/ -2030, 1350, 1940, /*angle*/ 0, 0, 0, /*behParam*/ 0x02000000, /*beh*/ bhvStar, /*acts*/ ALL_ACTS), OBJECT_WITH_ACTS(/*model*/ MODEL_NONE, /*pos*/ -204, 1100, 1576, /*angle*/ 0, 0, 0, /*behParam*/ 0x03000000, /*beh*/ bhvHiddenRedCoinStar, /*acts*/ ALL_ACTS), OBJECT_WITH_ACTS(/*model*/ MODEL_NONE, /*pos*/ 923, 1741, -332, /*angle*/ 0, 18, 0, /*behParam*/ 0x05010000, /*beh*/ bhvMrI, /*acts*/ ALL_ACTS), @@ -103,10 +103,10 @@ const LevelScript level_bbh_entry[] = { LOAD_MODEL_FROM_GEO(MODEL_BBH_WOODEN_TOMB, geo_bbh_000658), AREA(/*index*/ 1, geo_bbh_000F00), - JUMP_LINK(script_func_local_hmc_flames_and_poles), - JUMP_LINK(script_func_local_hmc_platforms), - JUMP_LINK(script_func_local_hmc_dorrie_and_spawners), - JUMP_LINK(script_func_local_hmc_stars), + JUMP_LINK(script_func_local_1), + JUMP_LINK(script_func_local_2), + JUMP_LINK(script_func_local_3), + JUMP_LINK(script_func_local_4), OBJECT(/*model*/ MODEL_NONE, /*pos*/ 666, 796, 5350, /*angle*/ 0, 180, 0, /*behParam*/ 0x000A0000, /*beh*/ bhvSpinAirborneWarp), WARP_NODE(/*id*/ 0x0A, /*destLevel*/ LEVEL_BBH, /*destArea*/ 0x01, /*destNode*/ 0x0A, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0xF0, /*destLevel*/ LEVEL_CASTLE_COURTYARD, /*destArea*/ 0x01, /*destNode*/ 0x0A, /*flags*/ WARP_NO_CHECKPOINT), diff --git a/levels/bitdw/script.c b/levels/bitdw/script.c index 7278514f..60bfc624 100644 --- a/levels/bitdw/script.c +++ b/levels/bitdw/script.c @@ -16,7 +16,7 @@ #include "make_const_nonconst.h" #include "levels/bitdw/header.h" -static const LevelScript script_func_local_hmc_flames_and_poles[] = { +static const LevelScript script_func_local_1[] = { OBJECT(/*model*/ MODEL_BITDW_SQUARE_PLATFORM, /*pos*/ -1966, -3154, 3586, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvSquarishPathMoving), OBJECT(/*model*/ MODEL_BITDW_SQUARE_PLATFORM, /*pos*/ -1352, -3154, 4200, /*angle*/ 0, 0, 0, /*behParam*/ 0x00020000, /*beh*/ bhvSquarishPathMoving), OBJECT(/*model*/ MODEL_BITDW_SQUARE_PLATFORM, /*pos*/ -2963, 1017, -2464, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvSquarishPathMoving), @@ -32,13 +32,13 @@ static const LevelScript script_func_local_hmc_flames_and_poles[] = { RETURN(), }; -static const LevelScript script_func_local_hmc_platforms[] = { +static const LevelScript script_func_local_2[] = { OBJECT(/*model*/ MODEL_NONE, /*pos*/ -3092, -2795, 2842, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvFlamethrower), OBJECT(/*model*/ MODEL_NONE, /*pos*/ 2463, -2386, 2844, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvFlamethrower), RETURN(), }; -static const LevelScript script_func_local_hmc_dorrie_and_spawners[] = { +static const LevelScript script_func_local_3[] = { OBJECT(/*model*/ MODEL_NONE, /*pos*/ 7180, 3000, 0, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvBowserCourseRedCoinStar), RETURN(), }; @@ -94,9 +94,9 @@ const LevelScript level_bitdw_entry[] = { WARP_NODE(/*id*/ 0x0B, /*destLevel*/ LEVEL_BOWSER_1, /*destArea*/ 0x01, /*destNode*/ 0x0A, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0x0C, /*destLevel*/ LEVEL_BITDW, /*destArea*/ 0x01, /*destNode*/ 0x0C, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0xF1, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x01, /*destNode*/ 0x25, /*flags*/ WARP_NO_CHECKPOINT), - JUMP_LINK(script_func_local_hmc_flames_and_poles), - JUMP_LINK(script_func_local_hmc_platforms), - JUMP_LINK(script_func_local_hmc_dorrie_and_spawners), + JUMP_LINK(script_func_local_1), + JUMP_LINK(script_func_local_2), + JUMP_LINK(script_func_local_3), TERRAIN(/*terrainData*/ bitdw_seg7_collision_level), MACRO_OBJECTS(/*objList*/ bitdw_seg7_macro_objs), SHOW_DIALOG(/*index*/ 0x00, DIALOG_090), diff --git a/levels/bitfs/script.c b/levels/bitfs/script.c index a7c63333..008d7547 100644 --- a/levels/bitfs/script.c +++ b/levels/bitfs/script.c @@ -15,7 +15,7 @@ #include "make_const_nonconst.h" #include "levels/bitfs/header.h" -static const LevelScript script_func_local_hmc_flames_and_poles[] = { +static const LevelScript script_func_local_1[] = { OBJECT(/*model*/ MODEL_BITFS_PLATFORM_ON_TRACK, /*pos*/ -5733, -3071, 0, /*angle*/ 0, 0, 0, /*behParam*/ 0x07330000, /*beh*/ bhvPlatformOnTrack), OBJECT(/*model*/ MODEL_BITFS_TILTING_SQUARE_PLATFORM, /*pos*/ -1945, -3225, -715, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvBitfsTiltingInvertedPyramid), OBJECT(/*model*/ MODEL_BITFS_TILTING_SQUARE_PLATFORM, /*pos*/ -2866, -3225, -715, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvBitfsTiltingInvertedPyramid), @@ -38,14 +38,14 @@ static const LevelScript script_func_local_hmc_flames_and_poles[] = { RETURN(), }; -static const LevelScript script_func_local_hmc_platforms[] = { +static const LevelScript script_func_local_2[] = { OBJECT(/*model*/ MODEL_NONE, /*pos*/ -3226, 3584, -822, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvFlamethrower), OBJECT(/*model*/ MODEL_NONE, /*pos*/ -1382, 3584, -822, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvFlamethrower), OBJECT(/*model*/ MODEL_NONE, /*pos*/ 1229, 307, -412, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvFlamethrower), RETURN(), }; -static const LevelScript script_func_local_hmc_dorrie_and_spawners[] = { +static const LevelScript script_func_local_3[] = { OBJECT(/*model*/ MODEL_NONE, /*pos*/ 1200, 5700, 160, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvBowserCourseRedCoinStar), RETURN(), }; @@ -107,9 +107,9 @@ const LevelScript level_bitfs_entry[] = { WARP_NODE(/*id*/ 0x0B, /*destLevel*/ LEVEL_BOWSER_2, /*destArea*/ 0x01, /*destNode*/ 0x0A, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0x0C, /*destLevel*/ LEVEL_BITFS, /*destArea*/ 0x01, /*destNode*/ 0x0C, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0xF1, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x03, /*destNode*/ 0x68, /*flags*/ WARP_NO_CHECKPOINT), - JUMP_LINK(script_func_local_hmc_flames_and_poles), - JUMP_LINK(script_func_local_hmc_platforms), - JUMP_LINK(script_func_local_hmc_dorrie_and_spawners), + JUMP_LINK(script_func_local_1), + JUMP_LINK(script_func_local_2), + JUMP_LINK(script_func_local_3), TERRAIN(/*terrainData*/ bitfs_seg7_collision_level), MACRO_OBJECTS(/*objList*/ bitfs_seg7_macro_objs), SET_BACKGROUND_MUSIC(/*settingsPreset*/ 0x0000, /*seq*/ SEQ_LEVEL_KOOPA_ROAD), diff --git a/levels/bits/script.c b/levels/bits/script.c index 0b003606..3232dbc6 100644 --- a/levels/bits/script.c +++ b/levels/bits/script.c @@ -15,7 +15,7 @@ #include "make_const_nonconst.h" #include "levels/bits/header.h" -static const LevelScript script_func_local_hmc_flames_and_poles[] = { +static const LevelScript script_func_local_1[] = { OBJECT(/*model*/ MODEL_BITS_SLIDING_PLATFORM, /*pos*/ -2370, -4525, 0, /*angle*/ 0, 0, 0, /*behParam*/ 0x00100000, /*beh*/ bhvSlidingPlatform2), OBJECT(/*model*/ MODEL_BITS_TWIN_SLIDING_PLATFORMS, /*pos*/ -2611, 3544, -904, /*angle*/ 0, 0, 0, /*behParam*/ 0x00CF0000, /*beh*/ bhvSlidingPlatform2), OBJECT(/*model*/ MODEL_BITS_TWIN_SLIDING_PLATFORMS, /*pos*/ -4700, 3544, -904, /*angle*/ 0, 180, 0, /*behParam*/ 0x008F0000, /*beh*/ bhvSlidingPlatform2), @@ -38,7 +38,7 @@ static const LevelScript script_func_local_hmc_flames_and_poles[] = { RETURN(), }; -static const LevelScript script_func_local_hmc_platforms[] = { +static const LevelScript script_func_local_2[] = { OBJECT(/*model*/ MODEL_NONE, /*pos*/ 350, 6800, -6800, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvBowserCourseRedCoinStar), RETURN(), }; @@ -97,8 +97,8 @@ const LevelScript level_bits_entry[] = { WARP_NODE(/*id*/ 0x0B, /*destLevel*/ LEVEL_BOWSER_3, /*destArea*/ 0x01, /*destNode*/ 0x0A, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0x0C, /*destLevel*/ LEVEL_BITS, /*destArea*/ 0x01, /*destNode*/ 0x0C, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0xF1, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x02, /*destNode*/ 0x6B, /*flags*/ WARP_NO_CHECKPOINT), - JUMP_LINK(script_func_local_hmc_flames_and_poles), - JUMP_LINK(script_func_local_hmc_platforms), + JUMP_LINK(script_func_local_1), + JUMP_LINK(script_func_local_2), TERRAIN(/*terrainData*/ bits_seg7_collision_level), MACRO_OBJECTS(/*objList*/ bits_seg7_macro_objs), SET_BACKGROUND_MUSIC(/*settingsPreset*/ 0x0000, /*seq*/ SEQ_LEVEL_KOOPA_ROAD), diff --git a/levels/bob/script.c b/levels/bob/script.c index 3aa64991..cdf8e14c 100644 --- a/levels/bob/script.c +++ b/levels/bob/script.c @@ -16,7 +16,7 @@ #include "make_const_nonconst.h" #include "levels/bob/header.h" -static const LevelScript script_func_local_hmc_flames_and_poles[] = { +static const LevelScript script_func_local_1[] = { OBJECT(/*model*/ MODEL_BOB_CHAIN_CHOMP_GATE, /*pos*/ 1456, 768, 446, /*angle*/ 0, 326, 0, /*behParam*/ 0x00000000, /*beh*/ bhvChainChompGate), OBJECT(/*model*/ MODEL_BOB_SEESAW_PLATFORM, /*pos*/ -2303, 717, 1024, /*angle*/ 0, 45, 0, /*behParam*/ 0x00030000, /*beh*/ bhvSeesawPlatform), OBJECT(/*model*/ MODEL_NONE, /*pos*/ -2050, 0, -3069, /*angle*/ 0, 25, 0, /*behParam*/ 0x00000000, /*beh*/ bhvOpenableGrill), @@ -25,7 +25,7 @@ static const LevelScript script_func_local_hmc_flames_and_poles[] = { RETURN(), }; -static const LevelScript script_func_local_hmc_platforms[] = { +static const LevelScript script_func_local_2[] = { OBJECT_WITH_ACTS(/*model*/ MODEL_NONE, /*pos*/ 1535, 3840, -5561, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvBobBowlingBallSpawner, /*acts*/ ACT_1 | ACT_2), OBJECT_WITH_ACTS(/*model*/ MODEL_NONE, /*pos*/ 1535, 3840, -5561, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvTtmBowlingBallSpawner, /*acts*/ ACT_3 | ACT_4 | ACT_5 | ACT_6), OBJECT_WITH_ACTS(/*model*/ MODEL_NONE, /*pos*/ 524, 2825, -5400, /*angle*/ 0, 0, 0, /*behParam*/ 0x00020000, /*beh*/ bhvBobBowlingBallSpawner, /*acts*/ ACT_1 | ACT_2), @@ -44,7 +44,7 @@ static const LevelScript script_func_local_hmc_platforms[] = { RETURN(), }; -static const LevelScript script_func_local_hmc_dorrie_and_spawners[] = { +static const LevelScript script_func_local_3[] = { OBJECT_WITH_ACTS(/*model*/ MODEL_KING_BOBOMB, /*pos*/ 1636, 4242, -5567, /*angle*/ 0, -147, 0, /*behParam*/ 0x00000000, /*beh*/ bhvKingBobomb, /*acts*/ ACT_1), OBJECT_WITH_ACTS(/*model*/ MODEL_KOOPA_WITH_SHELL, /*pos*/ -4004, 0, 5221, /*angle*/ 0, 0, 0, /*behParam*/ 0x01020000, /*beh*/ bhvKoopa, /*acts*/ ACT_2), OBJECT_WITH_ACTS(/*model*/ MODEL_NONE, /*pos*/ -6000, 1000, 2400, /*angle*/ 0, 0, 0, /*behParam*/ 0x03000000, /*beh*/ bhvHiddenRedCoinStar, /*acts*/ ALL_ACTS), @@ -75,9 +75,9 @@ const LevelScript level_bob_entry[] = { LOAD_MODEL_FROM_GEO(MODEL_BOB_BARS_GRILLS, bob_geo_000470), AREA(/*index*/ 1, bob_geo_000488), - JUMP_LINK(script_func_local_hmc_flames_and_poles), - JUMP_LINK(script_func_local_hmc_platforms), - JUMP_LINK(script_func_local_hmc_dorrie_and_spawners), + JUMP_LINK(script_func_local_1), + JUMP_LINK(script_func_local_2), + JUMP_LINK(script_func_local_3), OBJECT(/*model*/ MODEL_NONE, /*pos*/ -6558, 1000, 6464, /*angle*/ 0, 135, 0, /*behParam*/ 0x000A0000, /*beh*/ bhvSpinAirborneWarp), OBJECT(/*model*/ MODEL_NONE, /*pos*/ 583, 2683, -5387, /*angle*/ 0, -154, 0, /*behParam*/ 0x000B0000, /*beh*/ bhvFadingWarp), OBJECT(/*model*/ MODEL_NONE, /*pos*/ 1680, 3835, -5523, /*angle*/ 0, -153, 0, /*behParam*/ 0x000C0000, /*beh*/ bhvFadingWarp), diff --git a/levels/bowser_2/script.c b/levels/bowser_2/script.c index 2d1ef805..0511bf1c 100644 --- a/levels/bowser_2/script.c +++ b/levels/bowser_2/script.c @@ -15,7 +15,7 @@ #include "make_const_nonconst.h" #include "levels/bowser_2/header.h" -static const LevelScript script_func_local_hmc_flames_and_poles[] = { +static const LevelScript script_func_local_1[] = { OBJECT(/*model*/ MODEL_BOWSER_2_TILTING_ARENA, /*pos*/ 0, 0, 0, /*angle*/ 0, 90, 0, /*behParam*/ 0x00000000, /*beh*/ bhvTiltingBowserLavaPlatform), OBJECT(/*model*/ MODEL_BOWSER_BOMB, /*pos*/ 4, 1329, 3598, /*angle*/ 0, 90, 0, /*behParam*/ 0x00000000, /*beh*/ bhvBowserBomb), OBJECT(/*model*/ MODEL_BOWSER_BOMB, /*pos*/ 3584, 1329, 0, /*angle*/ 0, 90, 0, /*behParam*/ 0x00000000, /*beh*/ bhvBowserBomb), @@ -42,7 +42,7 @@ const LevelScript level_bowser_2_entry[] = { WARP_NODE(/*id*/ 0x0A, /*destLevel*/ LEVEL_BOWSER_2, /*destArea*/ 0x01, /*destNode*/ 0x0A, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0xF0, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x03, /*destNode*/ 0x36, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0xF1, /*destLevel*/ LEVEL_BITFS, /*destArea*/ 0x01, /*destNode*/ 0x0C, /*flags*/ WARP_NO_CHECKPOINT), - JUMP_LINK(script_func_local_hmc_flames_and_poles), + JUMP_LINK(script_func_local_1), TERRAIN(/*terrainData*/ bowser_2_seg7_collision_lava), SET_BACKGROUND_MUSIC(/*settingsPreset*/ 0x0002, /*seq*/ SEQ_LEVEL_BOSS_KOOPA), TERRAIN_TYPE(/*terrainType*/ TERRAIN_STONE), diff --git a/levels/bowser_3/script.c b/levels/bowser_3/script.c index 25a9af1b..3d6df9bf 100644 --- a/levels/bowser_3/script.c +++ b/levels/bowser_3/script.c @@ -15,7 +15,7 @@ #include "make_const_nonconst.h" #include "levels/bowser_3/header.h" -static const LevelScript script_func_local_hmc_flames_and_poles[] = { +static const LevelScript script_func_local_1[] = { OBJECT(/*model*/ MODEL_BOWSER_3_FALLING_PLATFORM_1, /*pos*/ 0, 0, 0, /*angle*/ 0, 0, 0, /*behParam*/ 0x00010000, /*beh*/ bhvFallingBowserPlatform), OBJECT(/*model*/ MODEL_BOWSER_3_FALLING_PLATFORM_2, /*pos*/ 0, 0, 0, /*angle*/ 0, 0, 0, /*behParam*/ 0x00020000, /*beh*/ bhvFallingBowserPlatform), OBJECT(/*model*/ MODEL_BOWSER_3_FALLING_PLATFORM_3, /*pos*/ 0, 0, 0, /*angle*/ 0, 0, 0, /*behParam*/ 0x00030000, /*beh*/ bhvFallingBowserPlatform), @@ -58,7 +58,7 @@ const LevelScript level_bowser_3_entry[] = { AREA(/*index*/ 1, bowser_3_geo_000398), OBJECT(/*model*/ MODEL_NONE, /*pos*/ 0, 1307, 0, /*angle*/ 0, 183, 0, /*behParam*/ 0x000A0000, /*beh*/ bhvSpinAirborneCircleWarp), WARP_NODE(/*id*/ 0x0A, /*destLevel*/ LEVEL_BOWSER_3, /*destArea*/ 0x01, /*destNode*/ 0x0A, /*flags*/ WARP_NO_CHECKPOINT), - JUMP_LINK(script_func_local_hmc_flames_and_poles), + JUMP_LINK(script_func_local_1), WARP_NODE(/*id*/ 0xF1, /*destLevel*/ LEVEL_BITS, /*destArea*/ 0x01, /*destNode*/ 0x0C, /*flags*/ WARP_NO_CHECKPOINT), TERRAIN(/*terrainData*/ bowser_3_seg7_collision_level), SET_BACKGROUND_MUSIC(/*settingsPreset*/ 0x0002, /*seq*/ SEQ_LEVEL_BOSS_KOOPA_FINAL), diff --git a/levels/castle_courtyard/script.c b/levels/castle_courtyard/script.c index 8701355f..a532c56a 100644 --- a/levels/castle_courtyard/script.c +++ b/levels/castle_courtyard/script.c @@ -15,14 +15,14 @@ #include "make_const_nonconst.h" #include "levels/castle_courtyard/header.h" -static const LevelScript script_func_local_hmc_flames_and_poles[] = { +static const LevelScript script_func_local_1[] = { OBJECT(/*model*/ MODEL_NONE, /*pos*/ 0, 200, -1652, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvAmbientSounds), OBJECT(/*model*/ MODEL_NONE, /*pos*/ -2700, 0, -1652, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvBirdsSoundLoop), OBJECT(/*model*/ MODEL_NONE, /*pos*/ 2700, 0, -1652, /*angle*/ 0, 0, 0, /*behParam*/ 0x00010000, /*beh*/ bhvBirdsSoundLoop), RETURN(), }; -static const LevelScript script_func_local_hmc_platforms[] = { +static const LevelScript script_func_local_2[] = { OBJECT(/*model*/ MODEL_BOO, /*pos*/ -3217, 100, -101, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvCourtyardBooTriplet), OBJECT(/*model*/ MODEL_BOO, /*pos*/ 3317, 100, -1701, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvCourtyardBooTriplet), OBJECT(/*model*/ MODEL_BOO, /*pos*/ -71, 1, -1387, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvCourtyardBooTriplet), @@ -55,8 +55,8 @@ const LevelScript level_castle_courtyard_entry[] = { WARP_NODE(/*id*/ 0x0B, /*destLevel*/ LEVEL_CASTLE_COURTYARD, /*destArea*/ 0x01, /*destNode*/ 0x0B, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0x01, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x01, /*destNode*/ 0x02, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0xF1, /*destLevel*/ LEVEL_CASTLE_GROUNDS, /*destArea*/ 0x01, /*destNode*/ 0x03, /*flags*/ WARP_NO_CHECKPOINT), - JUMP_LINK(script_func_local_hmc_flames_and_poles), - JUMP_LINK(script_func_local_hmc_platforms), + JUMP_LINK(script_func_local_1), + JUMP_LINK(script_func_local_2), TERRAIN(/*terrainData*/ castle_courtyard_seg7_collision), MACRO_OBJECTS(/*objList*/ castle_courtyard_seg7_macro_objs), SET_BACKGROUND_MUSIC(/*settingsPreset*/ 0x0000, /*seq*/ SEQ_SOUND_PLAYER), diff --git a/levels/castle_grounds/script.c b/levels/castle_grounds/script.c index ccfb7fa6..6e44620b 100644 --- a/levels/castle_grounds/script.c +++ b/levels/castle_grounds/script.c @@ -15,7 +15,7 @@ #include "make_const_nonconst.h" #include "levels/castle_grounds/header.h" -static const LevelScript script_func_local_hmc_flames_and_poles[] = { +static const LevelScript script_func_local_1[] = { WARP_NODE(/*id*/ 0x00, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x01, /*destNode*/ 0x00, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0x01, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x01, /*destNode*/ 0x01, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0x02, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x03, /*destNode*/ 0x02, /*flags*/ WARP_NO_CHECKPOINT), @@ -40,7 +40,7 @@ static const LevelScript script_func_local_hmc_flames_and_poles[] = { RETURN(), }; -static const LevelScript script_func_local_hmc_platforms[] = { +static const LevelScript script_func_local_2[] = { OBJECT(/*model*/ MODEL_NONE, /*pos*/ -5812, 100, -5937, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvWaterfallSoundLoop), OBJECT(/*model*/ MODEL_NONE, /*pos*/ -7430, 1500, 873, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvBirdsSoundLoop), OBJECT(/*model*/ MODEL_NONE, /*pos*/ -80, 1500, 5004, /*angle*/ 0, 0, 0, /*behParam*/ 0x00010000, /*beh*/ bhvBirdsSoundLoop), @@ -67,7 +67,7 @@ static const LevelScript script_func_local_hmc_platforms[] = { RETURN(), }; -static const LevelScript script_func_local_hmc_dorrie_and_spawners[] = { +static const LevelScript script_func_local_3[] = { OBJECT(/*model*/ MODEL_CASTLE_GROUNDS_FLAG, /*pos*/ -3213, 3348, -3011, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvCastleFlagWaving), OBJECT(/*model*/ MODEL_CASTLE_GROUNDS_FLAG, /*pos*/ 3213, 3348, -3011, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvCastleFlagWaving), OBJECT(/*model*/ MODEL_CASTLE_GROUNDS_FLAG, /*pos*/ -3835, 3348, -6647, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvCastleFlagWaving), @@ -75,7 +75,7 @@ static const LevelScript script_func_local_hmc_dorrie_and_spawners[] = { RETURN(), }; -static const LevelScript script_func_local_hmc_stars[] = { +static const LevelScript script_func_local_4[] = { OBJECT(/*model*/ MODEL_BUTTERFLY, /*pos*/ -4508, 406, 4400, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvButterfly), OBJECT(/*model*/ MODEL_BUTTERFLY, /*pos*/ -4408, 406, 4500, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvButterfly), OBJECT(/*model*/ MODEL_BUTTERFLY, /*pos*/ -4708, 406, 4100, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvButterfly), @@ -119,10 +119,10 @@ const LevelScript level_castle_grounds_entry[] = { AREA(/*index*/ 1, castle_grounds_geo_00073C), WARP_NODE(/*id*/ 0xF1, /*destLevel*/ LEVEL_CASTLE_GROUNDS, /*destArea*/ 0x01, /*destNode*/ 0x03, /*flags*/ WARP_NO_CHECKPOINT), - JUMP_LINK(script_func_local_hmc_flames_and_poles), - JUMP_LINK(script_func_local_hmc_platforms), - JUMP_LINK(script_func_local_hmc_dorrie_and_spawners), - JUMP_LINK(script_func_local_hmc_stars), + JUMP_LINK(script_func_local_1), + JUMP_LINK(script_func_local_2), + JUMP_LINK(script_func_local_3), + JUMP_LINK(script_func_local_4), TERRAIN(/*terrainData*/ castle_grounds_seg7_collision_level), MACRO_OBJECTS(/*objList*/ castle_grounds_seg7_macro_objs), SET_BACKGROUND_MUSIC(/*settingsPreset*/ 0x0000, /*seq*/ SEQ_SOUND_PLAYER), diff --git a/levels/castle_inside/script.c b/levels/castle_inside/script.c index aed935b8..00115603 100644 --- a/levels/castle_inside/script.c +++ b/levels/castle_inside/script.c @@ -16,7 +16,7 @@ #include "make_const_nonconst.h" #include "levels/castle_inside/header.h" -static const LevelScript script_func_local_hmc_flames_and_poles[] = { +static const LevelScript script_func_local_1[] = { WARP_NODE(/*id*/ 0x00, /*destLevel*/ LEVEL_CASTLE_GROUNDS, /*destArea*/ 0x01, /*destNode*/ 0x00, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0x01, /*destLevel*/ LEVEL_CASTLE_GROUNDS, /*destArea*/ 0x01, /*destNode*/ 0x01, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0x02, /*destLevel*/ LEVEL_CASTLE_COURTYARD, /*destArea*/ 0x01, /*destNode*/ 0x01, /*flags*/ WARP_NO_CHECKPOINT), @@ -90,7 +90,7 @@ static const LevelScript script_func_local_hmc_flames_and_poles[] = { RETURN(), }; -static const LevelScript script_func_local_hmc_platforms[] = { +static const LevelScript script_func_local_2[] = { OBJECT(/*model*/ MODEL_CASTLE_KEY_DOOR, /*pos*/ -1100, 512, 3021, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvDoorWarp), OBJECT(/*model*/ MODEL_CASTLE_KEY_DOOR, /*pos*/ -946, 512, 3021, /*angle*/ 0, 180, 0, /*behParam*/ 0x00010000, /*beh*/ bhvDoorWarp), WARP_NODE(/*id*/ 0x00, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x01, /*destNode*/ 0x03, /*flags*/ WARP_NO_CHECKPOINT), @@ -159,7 +159,7 @@ static const LevelScript script_func_local_hmc_platforms[] = { RETURN(), }; -static const LevelScript script_func_local_hmc_dorrie_and_spawners[] = { +static const LevelScript script_func_local_3[] = { OBJECT(/*model*/ MODEL_CASTLE_KEY_DOOR, /*pos*/ -1100, -1074, 922, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvDoorWarp), OBJECT(/*model*/ MODEL_CASTLE_KEY_DOOR, /*pos*/ -946, -1074, 922, /*angle*/ 0, 180, 0, /*behParam*/ 0x00010000, /*beh*/ bhvDoorWarp), WARP_NODE(/*id*/ 0x00, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x01, /*destNode*/ 0x05, /*flags*/ WARP_NO_CHECKPOINT), @@ -202,7 +202,7 @@ static const LevelScript script_func_local_hmc_dorrie_and_spawners[] = { RETURN(), }; -static const LevelScript script_func_local_hmc_stars[] = { +static const LevelScript script_func_local_4[] = { OBJECT(/*model*/ MODEL_RED_FLAME, /*pos*/ -2037, -818, -716, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvFlame), OBJECT(/*model*/ MODEL_RED_FLAME, /*pos*/ -1648, -818, -716, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvFlame), OBJECT(/*model*/ MODEL_RED_FLAME, /*pos*/ -1648, -818, -101, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvFlame), @@ -260,7 +260,7 @@ const LevelScript level_castle_inside_entry[] = { OBJECT(/*model*/ MODEL_TOAD, /*pos*/ -1671, 0, 1313, /*angle*/ 0, 83, 0, /*behParam*/ DIALOG_133 << 24, /*beh*/ bhvToadMessage), OBJECT(/*model*/ MODEL_TOAD, /*pos*/ 1524, 307, 458, /*angle*/ 0, 110, 0, /*behParam*/ DIALOG_134 << 24, /*beh*/ bhvToadMessage), OBJECT(/*model*/ MODEL_TOAD, /*pos*/ 596, -306, -2637, /*angle*/ 0, 152, 0, /*behParam*/ DIALOG_135 << 24, /*beh*/ bhvToadMessage), - JUMP_LINK(script_func_local_hmc_flames_and_poles), + JUMP_LINK(script_func_local_1), WARP_NODE(/*id*/ 0xF1, /*destLevel*/ LEVEL_CASTLE_GROUNDS, /*destArea*/ 0x01, /*destNode*/ 0x03, /*flags*/ WARP_NO_CHECKPOINT), TERRAIN(/*terrainData*/ inside_castle_seg7_area_1_collision), ROOMS(/*surfaceRooms*/ inside_castle_seg7_area_1_rooms), @@ -277,7 +277,7 @@ const LevelScript level_castle_inside_entry[] = { OBJECT(/*model*/ MODEL_TOAD, /*pos*/ -977, 1203, 2569, /*angle*/ 0, 0, 0, /*behParam*/ DIALOG_076 << 24, /*beh*/ bhvToadMessage), OBJECT(/*model*/ MODEL_TOAD, /*pos*/ -1584, 2253, 7157, /*angle*/ 0, 136, 0, /*behParam*/ DIALOG_083 << 24, /*beh*/ bhvToadMessage), OBJECT(/*model*/ MODEL_TOAD, /*pos*/ 837, 1203, 3020, /*angle*/ 0, 180, 0, /*behParam*/ DIALOG_137 << 24, /*beh*/ bhvToadMessage), - JUMP_LINK(script_func_local_hmc_platforms), + JUMP_LINK(script_func_local_2), WARP_NODE(/*id*/ 0xF1, /*destLevel*/ LEVEL_CASTLE_GROUNDS, /*destArea*/ 0x01, /*destNode*/ 0x03, /*flags*/ WARP_NO_CHECKPOINT), TERRAIN(/*terrainData*/ inside_castle_seg7_area_2_collision), ROOMS(/*surfaceRooms*/ inside_castle_seg7_area_2_rooms), @@ -294,8 +294,8 @@ const LevelScript level_castle_inside_entry[] = { OBJECT(/*model*/ MODEL_MIPS, /*pos*/ -1509, -1177, -1564, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvMips), OBJECT(/*model*/ MODEL_TOAD, /*pos*/ 1787, -1381, -1957, /*angle*/ 0, 126, 0, /*behParam*/ DIALOG_082 << 24, /*beh*/ bhvToadMessage), OBJECT(/*model*/ MODEL_TOAD, /*pos*/ -4048, -1381, -1334, /*angle*/ 0, 30, 0, /*behParam*/ DIALOG_136 << 24, /*beh*/ bhvToadMessage), - JUMP_LINK(script_func_local_hmc_dorrie_and_spawners), - JUMP_LINK(script_func_local_hmc_stars), + JUMP_LINK(script_func_local_3), + JUMP_LINK(script_func_local_4), WARP_NODE(/*id*/ 0xF1, /*destLevel*/ LEVEL_CASTLE_GROUNDS, /*destArea*/ 0x01, /*destNode*/ 0x03, /*flags*/ WARP_NO_CHECKPOINT), TERRAIN(/*terrainData*/ inside_castle_seg7_area_3_collision), ROOMS(/*surfaceRooms*/ inside_castle_seg7_area_3_rooms), diff --git a/levels/ccm/script.c b/levels/ccm/script.c index 3259d6c3..f98b3186 100644 --- a/levels/ccm/script.c +++ b/levels/ccm/script.c @@ -16,12 +16,12 @@ #include "make_const_nonconst.h" #include "levels/ccm/header.h" -static const LevelScript script_func_local_hmc_flames_and_poles[] = { +static const LevelScript script_func_local_1[] = { OBJECT(/*model*/ MODEL_CCM_ROPEWAY_LIFT, /*pos*/ 531, -4430, 6426, /*angle*/ 0, 0, 0, /*behParam*/ 0x07120000, /*beh*/ bhvPlatformOnTrack), RETURN(), }; -static const LevelScript script_func_local_hmc_platforms[] = { +static const LevelScript script_func_local_2[] = { OBJECT(/*model*/ MODEL_PENGUIN, /*pos*/ 2650, -3735, 3970, /*angle*/ 0, 0, 0, /*behParam*/ 0x00010000, /*beh*/ bhvSmallPenguin), OBJECT(/*model*/ MODEL_PENGUIN, /*pos*/ -555, 3470, -1000, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvSmallPenguin), OBJECT(/*model*/ MODEL_MR_BLIZZARD, /*pos*/ -2376, -1589, 4256, /*angle*/ 0, 252, 0, /*behParam*/ 0x00010000, /*beh*/ bhvMrBlizzard), @@ -30,7 +30,7 @@ static const LevelScript script_func_local_hmc_platforms[] = { RETURN(), }; -static const LevelScript script_func_local_hmc_dorrie_and_spawners[] = { +static const LevelScript script_func_local_3[] = { OBJECT_WITH_ACTS(/*model*/ MODEL_NONE, /*pos*/ 2665, -4607, 4525, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvCcmTouchedStarSpawn, /*acts*/ ALL_ACTS), OBJECT_WITH_ACTS(/*model*/ MODEL_PENGUIN, /*pos*/ 3450, -4700, 4550, /*angle*/ 0, 0, 0, /*behParam*/ 0x01000000, /*beh*/ bhvTuxiesMother, /*acts*/ ALL_ACTS), OBJECT_WITH_ACTS(/*model*/ MODEL_NONE, /*pos*/ 4200, -927, 400, /*angle*/ 0, 0, 0, /*behParam*/ 0x03000000, /*beh*/ bhvHiddenRedCoinStar, /*acts*/ ALL_ACTS), @@ -39,7 +39,7 @@ static const LevelScript script_func_local_hmc_dorrie_and_spawners[] = { RETURN(), }; -static const LevelScript script_func_local_hmc_stars[] = { +static const LevelScript script_func_local_4[] = { OBJECT_WITH_ACTS(/*model*/ MODEL_PENGUIN, /*pos*/ -4952, 6656, -6075, /*angle*/ 0, 270, 0, /*behParam*/ 0x02000000, /*beh*/ bhvRacingPenguin, /*acts*/ ACT_2 | ACT_3 | ACT_4 | ACT_5 | ACT_6), OBJECT(/*model*/ MODEL_NONE, /*pos*/ -6500, -5836, -6400, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvPenguinRaceFinishLine), OBJECT(/*model*/ MODEL_NONE, /*pos*/ -6393, -716, 7503, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvPenguinRaceShortcutCheck), @@ -87,9 +87,9 @@ const LevelScript level_ccm_entry[] = { WARP_NODE(/*id*/ 0x20, /*destLevel*/ LEVEL_CCM, /*destArea*/ 0x01, /*destNode*/ 0x1F, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0xF0, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x01, /*destNode*/ 0x33, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0xF1, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x01, /*destNode*/ 0x65, /*flags*/ WARP_NO_CHECKPOINT), - JUMP_LINK(script_func_local_hmc_flames_and_poles), - JUMP_LINK(script_func_local_hmc_platforms), - JUMP_LINK(script_func_local_hmc_dorrie_and_spawners), + JUMP_LINK(script_func_local_1), + JUMP_LINK(script_func_local_2), + JUMP_LINK(script_func_local_3), TERRAIN(/*terrainData*/ ccm_seg7_area_1_collision), MACRO_OBJECTS(/*objList*/ ccm_seg7_area_1_macro_objs), SHOW_DIALOG(/*index*/ 0x00, DIALOG_048), @@ -103,7 +103,7 @@ const LevelScript level_ccm_entry[] = { WARP_NODE(/*id*/ 0x0A, /*destLevel*/ LEVEL_CCM, /*destArea*/ 0x02, /*destNode*/ 0x0A, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0xF0, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x01, /*destNode*/ 0x33, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0xF1, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x01, /*destNode*/ 0x65, /*flags*/ WARP_NO_CHECKPOINT), - JUMP_LINK(script_func_local_hmc_stars), + JUMP_LINK(script_func_local_4), TERRAIN(/*terrainData*/ ccm_seg7_area_2_collision), MACRO_OBJECTS(/*objList*/ ccm_seg7_area_2_macro_objs), SET_BACKGROUND_MUSIC(/*settingsPreset*/ 0x0001, /*seq*/ SEQ_LEVEL_SLIDE), diff --git a/levels/cotmc/script.c b/levels/cotmc/script.c index d8efdcf8..149a11b2 100644 --- a/levels/cotmc/script.c +++ b/levels/cotmc/script.c @@ -16,14 +16,14 @@ #include "make_const_nonconst.h" #include "levels/cotmc/header.h" -static const LevelScript script_func_local_hmc_flames_and_poles[] = { +static const LevelScript script_func_local_1[] = { OBJECT(/*model*/ MODEL_CAP_SWITCH, /*pos*/ 0, 363, -6144, /*angle*/ 0, 0, 0, /*behParam*/ 0x00010000, /*beh*/ bhvCapSwitch), OBJECT(/*model*/ MODEL_NONE, /*pos*/ 0, 500, -7373, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvWaterfallSoundLoop), OBJECT(/*model*/ MODEL_NONE, /*pos*/ 0, 500, 3584, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvWaterfallSoundLoop), RETURN(), }; -static const LevelScript script_func_local_hmc_platforms[] = { +static const LevelScript script_func_local_2[] = { OBJECT(/*model*/ MODEL_NONE, /*pos*/ 0, -200, -7000, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvHiddenRedCoinStar), RETURN(), }; @@ -50,8 +50,8 @@ const LevelScript level_cotmc_entry[] = { WARP_NODE(/*id*/ 0xF0, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x03, /*destNode*/ 0x34, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0xF1, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x03, /*destNode*/ 0x66, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0xF3, /*destLevel*/ LEVEL_CASTLE_GROUNDS, /*destArea*/ 0x01, /*destNode*/ 0x14, /*flags*/ WARP_NO_CHECKPOINT), - JUMP_LINK(script_func_local_hmc_platforms), - JUMP_LINK(script_func_local_hmc_flames_and_poles), + JUMP_LINK(script_func_local_2), + JUMP_LINK(script_func_local_1), TERRAIN(/*terrainData*/ cotmc_seg7_collision_level), MACRO_OBJECTS(/*objList*/ cotmc_seg7_macro_objs), SHOW_DIALOG(/*index*/ 0x00, DIALOG_130), diff --git a/levels/ddd/script.c b/levels/ddd/script.c index fc5c8cd3..12d839d2 100644 --- a/levels/ddd/script.c +++ b/levels/ddd/script.c @@ -15,7 +15,7 @@ #include "make_const_nonconst.h" #include "levels/ddd/header.h" -static const LevelScript script_func_local_hmc_flames_and_poles[] = { +static const LevelScript script_func_local_1[] = { OBJECT(/*model*/ MODEL_SUSHI, /*pos*/ -3071, -270, 0, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvSushiShark), OBJECT(/*model*/ MODEL_SUSHI, /*pos*/ -3071, -4270, 0, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvSushiShark), OBJECT(/*model*/ MODEL_NONE, /*pos*/ -3071, -130, 0, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvFewBlueFishSpawner), @@ -26,13 +26,13 @@ static const LevelScript script_func_local_hmc_flames_and_poles[] = { RETURN(), }; -static const LevelScript script_func_local_hmc_platforms[] = { +static const LevelScript script_func_local_2[] = { OBJECT_WITH_ACTS(/*model*/ MODEL_NONE, /*pos*/ -2400, -4607, 125, /*angle*/ 0, 0, 0, /*behParam*/ 0x01000000, /*beh*/ bhvTreasureChests, /*acts*/ ALL_ACTS), OBJECT_WITH_ACTS(/*model*/ MODEL_MANTA_RAY, /*pos*/ -4640, -1380, 40, /*angle*/ 0, 0, 0, /*behParam*/ 0x04000000, /*beh*/ bhvMantaRay, /*acts*/ ACT_2 | ACT_3 | ACT_4 | ACT_5 | ACT_6), RETURN(), }; -static const LevelScript script_func_local_hmc_dorrie_and_spawners[] = { +static const LevelScript script_func_local_3[] = { OBJECT(/*model*/ MODEL_DDD_BOWSER_SUB_DOOR, /*pos*/ 0, 0, 0, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvBowserSubDoor), OBJECT(/*model*/ MODEL_DDD_BOWSER_SUB, /*pos*/ 0, 0, 0, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvBowsersSub), OBJECT(/*model*/ MODEL_DDD_POLE, /*pos*/ 5120, 1005, 3584, /*angle*/ 0, 180, 0, /*behParam*/ 0x001E0000, /*beh*/ bhvDDDPole), @@ -47,7 +47,7 @@ static const LevelScript script_func_local_hmc_dorrie_and_spawners[] = { RETURN(), }; -static const LevelScript script_func_local_hmc_stars[] = { +static const LevelScript script_func_local_4[] = { OBJECT(/*model*/ MODEL_NONE, /*pos*/ 3404, -3319, -489, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvJetStream), RETURN(), }; @@ -87,8 +87,8 @@ const LevelScript level_ddd_entry[] = { WARP_NODE(/*id*/ 0xF0, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x03, /*destNode*/ 0x35, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0xF1, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x03, /*destNode*/ 0x67, /*flags*/ WARP_NO_CHECKPOINT), WHIRLPOOL(/*unk2*/ 0, /*unk3*/ 0, /*pos*/ -3174, -4915, 102, /*strength*/ 20), - JUMP_LINK(script_func_local_hmc_flames_and_poles), - JUMP_LINK(script_func_local_hmc_platforms), + JUMP_LINK(script_func_local_1), + JUMP_LINK(script_func_local_2), INSTANT_WARP(/*index*/ 3, /*destArea*/ 2, /*displace*/ -8192, 0, 0), TERRAIN(/*terrainData*/ ddd_seg7_area_1_collision), MACRO_OBJECTS(/*objList*/ ddd_seg7_area_1_macro_objs), @@ -102,8 +102,8 @@ const LevelScript level_ddd_entry[] = { WARP_NODE(/*id*/ 0xF0, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x03, /*destNode*/ 0x35, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0xF1, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x03, /*destNode*/ 0x67, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0xF3, /*destLevel*/ LEVEL_CASTLE_GROUNDS, /*destArea*/ 0x01, /*destNode*/ 0x1E, /*flags*/ WARP_NO_CHECKPOINT), - JUMP_LINK(script_func_local_hmc_dorrie_and_spawners), - JUMP_LINK(script_func_local_hmc_stars), + JUMP_LINK(script_func_local_3), + JUMP_LINK(script_func_local_4), JUMP_LINK(script_func_local_5), INSTANT_WARP(/*index*/ 2, /*destArea*/ 1, /*displace*/ 8192, 0, 0), TERRAIN(/*terrainData*/ ddd_seg7_area_2_collision), diff --git a/levels/hmc/areas/1/geo.inc.c b/levels/hmc/areas/1/geo.inc.c index b62a69d3..5a2baac0 100644 --- a/levels/hmc/areas/1/geo.inc.c +++ b/levels/hmc/areas/1/geo.inc.c @@ -288,7 +288,7 @@ const GeoLayout hmc_geo_000B48[] = { }; // 0x0E000B90 -const GeoLayout hmc_geo_area_1[] = { +const GeoLayout hmc_geo_000B90[] = { GEO_NODE_SCREEN_AREA(10, SCREEN_WIDTH/2, SCREEN_HEIGHT/2, SCREEN_WIDTH/2, SCREEN_HEIGHT/2), GEO_OPEN_NODE(), GEO_ZBUFFER(0), diff --git a/levels/hmc/arrow_platform/geo.inc.c b/levels/hmc/arrow_platform/geo.inc.c index 3ed48cee..71f0be75 100644 --- a/levels/hmc/arrow_platform/geo.inc.c +++ b/levels/hmc/arrow_platform/geo.inc.c @@ -1,5 +1,5 @@ // 0x0E0005A0 -const GeoLayout hmc_geo_controllable_arrow_platform[] = { +const GeoLayout hmc_geo_0005A0[] = { GEO_CULLING_RADIUS(550), GEO_OPEN_NODE(), GEO_DISPLAY_LIST(LAYER_OPAQUE, hmc_seg7_dl_07022DA0), diff --git a/levels/hmc/arrow_platform_button/geo.inc.c b/levels/hmc/arrow_platform_button/geo.inc.c index 080f01b2..09af5b26 100644 --- a/levels/hmc/arrow_platform_button/geo.inc.c +++ b/levels/hmc/arrow_platform_button/geo.inc.c @@ -1,5 +1,5 @@ // 0x0E0005B8 -const GeoLayout hmc_geo_controllable_arrow_platform_button[] = { +const GeoLayout hmc_geo_0005B8[] = { GEO_CULLING_RADIUS(200), GEO_OPEN_NODE(), GEO_DISPLAY_LIST(LAYER_OPAQUE, hmc_seg7_dl_07023090), diff --git a/levels/hmc/elevator_platform/geo.inc.c b/levels/hmc/elevator_platform/geo.inc.c index 1a829001..2265af03 100644 --- a/levels/hmc/elevator_platform/geo.inc.c +++ b/levels/hmc/elevator_platform/geo.inc.c @@ -1,5 +1,5 @@ // 0x0E0005D0 -const GeoLayout hmc_geo_elevator_platform[] = { +const GeoLayout hmc_geo_0005D0[] = { GEO_CULLING_RADIUS(500), GEO_OPEN_NODE(), GEO_DISPLAY_LIST(LAYER_OPAQUE, hmc_seg7_dl_07022AA0), diff --git a/levels/hmc/grill_door/geo.inc.c b/levels/hmc/grill_door/geo.inc.c index bc27441e..e4e123f2 100644 --- a/levels/hmc/grill_door/geo.inc.c +++ b/levels/hmc/grill_door/geo.inc.c @@ -1,5 +1,5 @@ // 0x0E000530 -const GeoLayout hmc_geo_grill_door[] = { +const GeoLayout hmc_geo_000530[] = { GEO_CULLING_RADIUS(1000), GEO_OPEN_NODE(), GEO_DISPLAY_LIST(LAYER_ALPHA, hmc_seg7_dl_0701FFF8), diff --git a/levels/hmc/header.h b/levels/hmc/header.h index fa913c11..68ed2f64 100644 --- a/levels/hmc/header.h +++ b/levels/hmc/header.h @@ -5,13 +5,13 @@ #include "game/moving_texture.h" // geo -extern const GeoLayout hmc_geo_grill_door[]; -extern const GeoLayout hmc_geo_rolling_rock[]; -extern const GeoLayout hmc_geo_rolling_rock_fragment_large[]; -extern const GeoLayout hmc_geo_rolling_rock_fragment_small[]; -extern const GeoLayout hmc_geo_controllable_arrow_platform[]; -extern const GeoLayout hmc_geo_controllable_arrow_platform_button[]; -extern const GeoLayout hmc_geo_elevator_platform[]; +extern const GeoLayout hmc_geo_000530[]; +extern const GeoLayout hmc_geo_000548[]; +extern const GeoLayout hmc_geo_000570[]; +extern const GeoLayout hmc_geo_000588[]; +extern const GeoLayout hmc_geo_0005A0[]; +extern const GeoLayout hmc_geo_0005B8[]; +extern const GeoLayout hmc_geo_0005D0[]; extern const GeoLayout hmc_geo_0005E8[]; extern const GeoLayout hmc_geo_000618[]; extern const GeoLayout hmc_geo_000658[]; @@ -30,7 +30,7 @@ extern const GeoLayout hmc_geo_000A18[]; extern const GeoLayout hmc_geo_000A88[]; extern const GeoLayout hmc_geo_000AE8[]; extern const GeoLayout hmc_geo_000B48[]; -extern const GeoLayout hmc_geo_area_1[]; +extern const GeoLayout hmc_geo_000B90[]; // leveldata extern const Gfx hmc_seg7_dl_070078B0[]; diff --git a/levels/hmc/rolling_rock/geo.inc.c b/levels/hmc/rolling_rock/geo.inc.c index 2a70526b..3822ed9b 100644 --- a/levels/hmc/rolling_rock/geo.inc.c +++ b/levels/hmc/rolling_rock/geo.inc.c @@ -1,5 +1,5 @@ // 0x0E000548 -const GeoLayout hmc_geo_rolling_rock[] = { +const GeoLayout hmc_geo_000548[] = { GEO_CULLING_RADIUS(300), GEO_OPEN_NODE(), GEO_SHADOW(SHADOW_CIRCLE_9_VERTS, 0xB4, 400), diff --git a/levels/hmc/rolling_rock_fragment_1/geo.inc.c b/levels/hmc/rolling_rock_fragment_1/geo.inc.c index 88d94c13..a40bae62 100644 --- a/levels/hmc/rolling_rock_fragment_1/geo.inc.c +++ b/levels/hmc/rolling_rock_fragment_1/geo.inc.c @@ -1,5 +1,5 @@ // 0x0E000570 -const GeoLayout hmc_geo_rolling_rock_fragment_large[] = { +const GeoLayout hmc_geo_000570[] = { GEO_CULLING_RADIUS(150), GEO_OPEN_NODE(), GEO_DISPLAY_LIST(LAYER_OPAQUE, hmc_seg7_dl_07023E10), diff --git a/levels/hmc/rolling_rock_fragment_2/geo.inc.c b/levels/hmc/rolling_rock_fragment_2/geo.inc.c index 826f6bdc..fe5072ce 100644 --- a/levels/hmc/rolling_rock_fragment_2/geo.inc.c +++ b/levels/hmc/rolling_rock_fragment_2/geo.inc.c @@ -1,5 +1,5 @@ // 0x0E000588 -const GeoLayout hmc_geo_rolling_rock_fragment_small[] = { +const GeoLayout hmc_geo_000588[] = { GEO_CULLING_RADIUS(100), GEO_OPEN_NODE(), GEO_DISPLAY_LIST(LAYER_OPAQUE, hmc_seg7_dl_07024110), diff --git a/levels/hmc/script.c b/levels/hmc/script.c index a32459cf..a38c1fb1 100644 --- a/levels/hmc/script.c +++ b/levels/hmc/script.c @@ -15,7 +15,7 @@ #include "make_const_nonconst.h" #include "levels/hmc/header.h" -static const LevelScript script_func_local_hmc_flames_and_poles[] = { +static const LevelScript script_func_local_1[] = { OBJECT(/*model*/ MODEL_RED_FLAME, /*pos*/ 4936, -357, -4146, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvFlame), OBJECT(/*model*/ MODEL_RED_FLAME, /*pos*/ 5018, -460, -5559, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvFlame), OBJECT(/*model*/ MODEL_RED_FLAME, /*pos*/ 1997, 666, -235, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvFlame), @@ -38,7 +38,7 @@ static const LevelScript script_func_local_hmc_flames_and_poles[] = { RETURN(), }; -static const LevelScript script_func_local_hmc_platforms[] = { +static const LevelScript script_func_local_2[] = { OBJECT(/*model*/ MODEL_HMC_METAL_PLATFORM, /*pos*/ 1100, 950, 6350, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvControllablePlatform), OBJECT(/*model*/ MODEL_HMC_ELEVATOR_PLATFORM, /*pos*/ -3243, 1434, 1392, /*angle*/ 0, 27, 0, /*behParam*/ 0x00000000, /*beh*/ bhvHmcElevatorPlatform), OBJECT(/*model*/ MODEL_HMC_ELEVATOR_PLATFORM, /*pos*/ -2816, 2253, -2509, /*angle*/ 0, 0, 0, /*behParam*/ 0x00010000, /*beh*/ bhvHmcElevatorPlatform), @@ -50,7 +50,7 @@ static const LevelScript script_func_local_hmc_platforms[] = { RETURN(), }; -static const LevelScript script_func_local_hmc_dorrie_and_spawners[] = { +static const LevelScript script_func_local_3[] = { OBJECT(/*model*/ MODEL_DORRIE, /*pos*/ -3533, -4969, 3558, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvDorrie), OBJECT(/*model*/ MODEL_NONE, /*pos*/ -6093, 3075, -7807, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvBigBoulderGenerator), OBJECT(/*model*/ MODEL_NONE, /*pos*/ -500, 1600, 3500, /*angle*/ 0, 0, 0, /*behParam*/ 0x00040000, /*beh*/ bhvFlamethrower), @@ -58,13 +58,13 @@ static const LevelScript script_func_local_hmc_dorrie_and_spawners[] = { RETURN(), }; -static const LevelScript script_func_local_hmc_stars[] = { - OBJECT_WITH_ACTS(/*model*/ MODEL_STAR, /*pos*/ -3600, -4000, 3600, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvStar, /*acts*/ ALL_ACTS), +static const LevelScript script_func_local_4[] = { + OBJECT_WITH_ACTS(/*model*/ MODEL_STAR, /*pos*/ -3600, -4000, 3600, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvStar, /*acts*/ ALL_ACTS), OBJECT_WITH_ACTS(/*model*/ MODEL_NONE, /*pos*/ 4000, 300, 5000, /*angle*/ 0, 0, 0, /*behParam*/ 0x01000000, /*beh*/ bhvHiddenRedCoinStar, /*acts*/ ALL_ACTS), - OBJECT_WITH_ACTS(/*model*/ MODEL_STAR, /*pos*/ 6200, -4400, 2300, /*angle*/ 0, 0, 0, /*behParam*/ 0x02000000, /*beh*/ bhvStar, /*acts*/ ALL_ACTS), - OBJECT_WITH_ACTS(/*model*/ MODEL_STAR, /*pos*/ -2100, 2100, -7550, /*angle*/ 0, 0, 0, /*behParam*/ 0x03000000, /*beh*/ bhvStar, /*acts*/ ALL_ACTS), - OBJECT_WITH_ACTS(/*model*/ MODEL_STAR, /*pos*/ -6500, 2700, -1600, /*angle*/ 0, 0, 0, /*behParam*/ 0x04000000, /*beh*/ bhvStar, /*acts*/ ALL_ACTS), - OBJECT_WITH_ACTS(/*model*/ MODEL_STAR, /*pos*/ -5000, 3050, -6700, /*angle*/ 0, 0, 0, /*behParam*/ 0x05000000, /*beh*/ bhvStar, /*acts*/ ALL_ACTS), + OBJECT_WITH_ACTS(/*model*/ MODEL_STAR, /*pos*/ 6200, -4400, 2300, /*angle*/ 0, 0, 0, /*behParam*/ 0x02000000, /*beh*/ bhvStar, /*acts*/ ALL_ACTS), + OBJECT_WITH_ACTS(/*model*/ MODEL_STAR, /*pos*/ -2100, 2100, -7550, /*angle*/ 0, 0, 0, /*behParam*/ 0x03000000, /*beh*/ bhvStar, /*acts*/ ALL_ACTS), + OBJECT_WITH_ACTS(/*model*/ MODEL_STAR, /*pos*/ -6500, 2700, -1600, /*angle*/ 0, 0, 0, /*behParam*/ 0x04000000, /*beh*/ bhvStar, /*acts*/ ALL_ACTS), + OBJECT_WITH_ACTS(/*model*/ MODEL_STAR, /*pos*/ -5000, 3050, -6700, /*angle*/ 0, 0, 0, /*behParam*/ 0x05000000, /*beh*/ bhvStar, /*acts*/ ALL_ACTS), RETURN(), }; @@ -86,25 +86,25 @@ const LevelScript level_hmc_entry[] = { LOAD_MODEL_FROM_GEO(MODEL_HMC_WOODEN_DOOR, wooden_door_geo), LOAD_MODEL_FROM_GEO(MODEL_HMC_METAL_DOOR, metal_door_geo), LOAD_MODEL_FROM_GEO(MODEL_HMC_HAZY_MAZE_DOOR, hazy_maze_door_geo), - LOAD_MODEL_FROM_GEO(MODEL_HMC_METAL_PLATFORM, hmc_geo_controllable_arrow_platform), - LOAD_MODEL_FROM_GEO(MODEL_HMC_METAL_ARROW_PLATFORM, hmc_geo_controllable_arrow_platform_button), - LOAD_MODEL_FROM_GEO(MODEL_HMC_ELEVATOR_PLATFORM, hmc_geo_elevator_platform), - LOAD_MODEL_FROM_GEO(MODEL_HMC_ROLLING_ROCK, hmc_geo_rolling_rock), - LOAD_MODEL_FROM_GEO(MODEL_HMC_ROCK_PIECE, hmc_geo_rolling_rock_fragment_large), - LOAD_MODEL_FROM_GEO(MODEL_HMC_ROCK_SMALL_PIECE, hmc_geo_rolling_rock_fragment_small), - LOAD_MODEL_FROM_GEO(MODEL_HMC_RED_GRILLS, hmc_geo_grill_door), + LOAD_MODEL_FROM_GEO(MODEL_HMC_METAL_PLATFORM, hmc_geo_0005A0), + LOAD_MODEL_FROM_GEO(MODEL_HMC_METAL_ARROW_PLATFORM, hmc_geo_0005B8), + LOAD_MODEL_FROM_GEO(MODEL_HMC_ELEVATOR_PLATFORM, hmc_geo_0005D0), + LOAD_MODEL_FROM_GEO(MODEL_HMC_ROLLING_ROCK, hmc_geo_000548), + LOAD_MODEL_FROM_GEO(MODEL_HMC_ROCK_PIECE, hmc_geo_000570), + LOAD_MODEL_FROM_GEO(MODEL_HMC_ROCK_SMALL_PIECE, hmc_geo_000588), + LOAD_MODEL_FROM_GEO(MODEL_HMC_RED_GRILLS, hmc_geo_000530), - AREA(/*index*/ 1, hmc_geo_area_1), + AREA(/*index*/ 1, hmc_geo_000B90), OBJECT(/*model*/ MODEL_NONE, /*pos*/ -7152, 3161, 7181, /*angle*/ 0, 135, 0, /*behParam*/ 0x000A0000, /*beh*/ bhvSpinAirborneWarp), OBJECT(/*model*/ MODEL_NONE, /*pos*/ 3351, -4690, 4773, /*angle*/ 0, 0, 0, /*behParam*/ 0x340B0000, /*beh*/ bhvWarp), - WARP_NODE(/*id*/ 0x0A, /*destLevel*/ LEVEL_HMC, /*destArea*/ 0x01, /*destNode*/ 0x0A, /*flags*/ WARP_NO_CHECKPOINT), - WARP_NODE(/*id*/ 0x0B, /*destLevel*/ LEVEL_COTMC, /*destArea*/ 0x01, /*destNode*/ 0x0A, /*flags*/ WARP_NO_CHECKPOINT), + WARP_NODE(/*id*/ 0x0A, /*destLevel*/ LEVEL_HMC, /*destArea*/ 0x01, /*destNode*/ 0x0A, /*flags*/ WARP_NO_CHECKPOINT), + WARP_NODE(/*id*/ 0x0B, /*destLevel*/ LEVEL_COTMC, /*destArea*/ 0x01, /*destNode*/ 0x0A, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0xF0, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x03, /*destNode*/ 0x34, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0xF1, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x03, /*destNode*/ 0x66, /*flags*/ WARP_NO_CHECKPOINT), - JUMP_LINK(script_func_local_hmc_flames_and_poles), - JUMP_LINK(script_func_local_hmc_platforms), - JUMP_LINK(script_func_local_hmc_dorrie_and_spawners), - JUMP_LINK(script_func_local_hmc_stars), + JUMP_LINK(script_func_local_1), + JUMP_LINK(script_func_local_2), + JUMP_LINK(script_func_local_3), + JUMP_LINK(script_func_local_4), TERRAIN(/*terrainData*/ hmc_seg7_collision_level), MACRO_OBJECTS(/*objList*/ hmc_seg7_macro_objs), ROOMS(/*surfaceRooms*/ hmc_seg7_rooms), @@ -114,7 +114,7 @@ const LevelScript level_hmc_entry[] = { FREE_LEVEL_POOL(), MARIO_POS(/*area*/ 1, /*yaw*/ 135, /*pos*/ -7152, 2161, 7181), - CALL( /*arg*/ 0, /*func*/ lvl_init_or_update), + CALL(/*arg*/ 0, /*func*/ lvl_init_or_update), CALL_LOOP(/*arg*/ 1, /*func*/ lvl_init_or_update), CLEAR_LEVEL(), SLEEP_BEFORE_EXIT(/*frames*/ 1), diff --git a/levels/jrb/script.c b/levels/jrb/script.c index 39d2fc7b..57c9d548 100644 --- a/levels/jrb/script.c +++ b/levels/jrb/script.c @@ -15,7 +15,7 @@ #include "make_const_nonconst.h" #include "levels/jrb/header.h" -static const LevelScript script_func_local_hmc_flames_and_poles[] = { +static const LevelScript script_func_local_1[] = { OBJECT_WITH_ACTS(/*model*/ MODEL_JRB_SUNKEN_SHIP, /*pos*/ 2385, 3589, 3727, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvSunkenShipPart, /*acts*/ ACT_1), OBJECT_WITH_ACTS(/*model*/ MODEL_JRB_SUNKEN_SHIP_BACK, /*pos*/ 2385, 3589, 3727, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvSunkenShipPart, /*acts*/ ACT_1), OBJECT_WITH_ACTS(/*model*/ MODEL_JRB_SHIP_LEFT_HALF_PART, /*pos*/ 5385, -5520, 2428, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvSunkenShipPart2, /*acts*/ ACT_1), @@ -37,7 +37,7 @@ static const LevelScript script_func_local_hmc_flames_and_poles[] = { RETURN(), }; -static const LevelScript script_func_local_hmc_platforms[] = { +static const LevelScript script_func_local_2[] = { OBJECT(/*model*/ MODEL_JRB_ROCK, /*pos*/ 1834, -2556, -7090, /*angle*/ 0, 194, 0, /*behParam*/ 0x00000000, /*beh*/ bhvRockSolid), OBJECT(/*model*/ MODEL_JRB_ROCK, /*pos*/ -2005, -2556, -3506, /*angle*/ 0, 135, 0, /*behParam*/ 0x00000000, /*beh*/ bhvRockSolid), OBJECT(/*model*/ MODEL_JRB_ROCK, /*pos*/ 1578, -2556, -5554, /*angle*/ 0, 90, 0, /*behParam*/ 0x00000000, /*beh*/ bhvRockSolid), @@ -91,7 +91,7 @@ static const LevelScript script_func_local_hmc_platforms[] = { RETURN(), }; -static const LevelScript script_func_local_hmc_dorrie_and_spawners[] = { +static const LevelScript script_func_local_3[] = { OBJECT_WITH_ACTS(/*model*/ MODEL_NONE, /*pos*/ 4900, 2400, 800, /*angle*/ 0, 0, 0, /*behParam*/ 0x03000000, /*beh*/ bhvHiddenRedCoinStar, /*acts*/ ALL_ACTS), #if defined(VERSION_JP) || defined(VERSION_SH) OBJECT_WITH_ACTS(/*model*/ MODEL_STAR, /*pos*/ 1540, 2160, 2130, /*angle*/ 0, 0, 0, /*behParam*/ 0x04000000, /*beh*/ bhvStar, /*acts*/ ALL_ACTS), @@ -102,7 +102,7 @@ static const LevelScript script_func_local_hmc_dorrie_and_spawners[] = { RETURN(), }; -static const LevelScript script_func_local_hmc_stars[] = { +static const LevelScript script_func_local_4[] = { OBJECT(/*model*/ MODEL_NONE, /*pos*/ 400, -350, -2700, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvTreasureChestsShip), RETURN(), }; @@ -147,9 +147,9 @@ const LevelScript level_jrb_entry[] = { WARP_NODE(/*id*/ 0xF0, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x01, /*destNode*/ 0x35, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0xF1, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x01, /*destNode*/ 0x67, /*flags*/ WARP_NO_CHECKPOINT), WHIRLPOOL(/*unk2*/ 0, /*unk3*/ 3, /*pos*/ 4979, -5222, 2482, /*strength*/ -30), - JUMP_LINK(script_func_local_hmc_flames_and_poles), - JUMP_LINK(script_func_local_hmc_platforms), - JUMP_LINK(script_func_local_hmc_dorrie_and_spawners), + JUMP_LINK(script_func_local_1), + JUMP_LINK(script_func_local_2), + JUMP_LINK(script_func_local_3), TERRAIN(/*terrainData*/ jrb_seg7_area_1_collision), MACRO_OBJECTS(/*objList*/ jrb_seg7_area_1_macro_objs), SET_BACKGROUND_MUSIC(/*settingsPreset*/ 0x0003, /*seq*/ SEQ_LEVEL_WATER), @@ -161,7 +161,7 @@ const LevelScript level_jrb_entry[] = { WARP_NODE(/*id*/ 0x0A, /*destLevel*/ LEVEL_JRB, /*destArea*/ 0x02, /*destNode*/ 0x0A, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0xF0, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x01, /*destNode*/ 0x35, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0xF1, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x01, /*destNode*/ 0x67, /*flags*/ WARP_NO_CHECKPOINT), - JUMP_LINK(script_func_local_hmc_stars), + JUMP_LINK(script_func_local_4), JUMP_LINK(script_func_local_5), TERRAIN(/*terrainData*/ jrb_seg7_area_2_collision), MACRO_OBJECTS(/*objList*/ jrb_seg7_area_2_macro_objs), diff --git a/levels/lll/script.c b/levels/lll/script.c index 94446abc..99c903d5 100644 --- a/levels/lll/script.c +++ b/levels/lll/script.c @@ -17,7 +17,7 @@ #include "levels/lll/header.h" // Unlike most levels, level geometry objects in LLL are defined as regular objects instead of terrain objects. -static const LevelScript script_func_local_hmc_flames_and_poles[] = { +static const LevelScript script_func_local_1[] = { OBJECT(/*model*/ MODEL_LEVEL_GEOMETRY_03, /*pos*/ 3840, 0, -5631, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvStaticObject), OBJECT(/*model*/ MODEL_LEVEL_GEOMETRY_04, /*pos*/ 4992, 0, -639, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvStaticObject), OBJECT(/*model*/ MODEL_LEVEL_GEOMETRY_05, /*pos*/ 7168, 0, 1408, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvStaticObject), @@ -35,7 +35,7 @@ static const LevelScript script_func_local_hmc_flames_and_poles[] = { RETURN(), }; -static const LevelScript script_func_local_hmc_platforms[] = { +static const LevelScript script_func_local_2[] = { OBJECT(/*model*/ MODEL_LLL_DRAWBRIDGE_PART, /*pos*/ -1919, 307, 3648, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvLllDrawbridgeSpawner), OBJECT(/*model*/ MODEL_LLL_ROTATING_BLOCK_FIRE_BARS, /*pos*/ -5119, 307, -4095, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvLllRotatingBlockWithFireBars), OBJECT(/*model*/ MODEL_LLL_ROTATING_HEXAGONAL_RING, /*pos*/ 0, 0, 0, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvLllRotatingHexagonalRing), @@ -52,7 +52,7 @@ static const LevelScript script_func_local_hmc_platforms[] = { RETURN(), }; -static const LevelScript script_func_local_hmc_dorrie_and_spawners[] = { +static const LevelScript script_func_local_3[] = { OBJECT(/*model*/ MODEL_LLL_MOVING_OCTAGONAL_MESH_PLATFORM, /*pos*/ 1124, 0, -4607, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvLllMovingOctagonalMeshPlatform), OBJECT(/*model*/ MODEL_LLL_MOVING_OCTAGONAL_MESH_PLATFORM, /*pos*/ 7168, 0, 2432, /*angle*/ 0, 0, 0, /*behParam*/ 0x00010000, /*beh*/ bhvLllMovingOctagonalMeshPlatform), OBJECT(/*model*/ MODEL_LLL_SINKING_ROCK_BLOCK, /*pos*/ 7168, 0, 7296, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvLllSinkingRockBlock), @@ -62,7 +62,7 @@ static const LevelScript script_func_local_hmc_dorrie_and_spawners[] = { RETURN(), }; -static const LevelScript script_func_local_hmc_stars[] = { +static const LevelScript script_func_local_4[] = { OBJECT(/*model*/ MODEL_NONE, /*pos*/ -3199, 307, 3456, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvMrI), OBJECT(/*model*/ MODEL_BULLY_BOSS, /*pos*/ 0, 307, -4385, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvBigBully), OBJECT(/*model*/ MODEL_BULLY_BOSS, /*pos*/ 4046, 2234, -5521, /*angle*/ 0, 0, 0, /*behParam*/ 0x01000000, /*beh*/ bhvBigBullyWithMinions), @@ -182,10 +182,10 @@ const LevelScript level_lll_entry[] = { WARP_NODE(/*id*/ 0x0D, /*destLevel*/ LEVEL_LLL, /*destArea*/ 0x01, /*destNode*/ 0x0C, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0xF0, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x03, /*destNode*/ 0x32, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0xF1, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x03, /*destNode*/ 0x64, /*flags*/ WARP_NO_CHECKPOINT), - JUMP_LINK(script_func_local_hmc_flames_and_poles), - JUMP_LINK(script_func_local_hmc_platforms), - JUMP_LINK(script_func_local_hmc_dorrie_and_spawners), - JUMP_LINK(script_func_local_hmc_stars), + JUMP_LINK(script_func_local_1), + JUMP_LINK(script_func_local_2), + JUMP_LINK(script_func_local_3), + JUMP_LINK(script_func_local_4), JUMP_LINK(script_func_local_5), TERRAIN(/*terrainData*/ lll_seg7_area_1_collision), MACRO_OBJECTS(/*objList*/ lll_seg7_area_1_macro_objs), diff --git a/levels/rr/script.c b/levels/rr/script.c index af3d4516..c4dc6d70 100644 --- a/levels/rr/script.c +++ b/levels/rr/script.c @@ -15,7 +15,7 @@ #include "make_const_nonconst.h" #include "levels/rr/header.h" -static const LevelScript script_func_local_hmc_flames_and_poles[] = { +static const LevelScript script_func_local_1[] = { OBJECT(/*model*/ MODEL_RR_SLIDING_PLATFORM, /*pos*/ -3400, -2038, 6564, /*angle*/ 0, 0, 0, /*behParam*/ 0x02560000, /*beh*/ bhvSlidingPlatform2), OBJECT(/*model*/ MODEL_RR_SLIDING_PLATFORM, /*pos*/ -2684, -1423, -36, /*angle*/ 0, 0, 0, /*behParam*/ 0x02590000, /*beh*/ bhvSlidingPlatform2), OBJECT(/*model*/ MODEL_RR_FLYING_CARPET, /*pos*/ 4571, -1782, 2036, /*angle*/ 0, 180, 0, /*behParam*/ 0x00000000, /*beh*/ bhvPlatformOnTrack), @@ -50,7 +50,7 @@ static const LevelScript script_func_local_hmc_flames_and_poles[] = { RETURN(), }; -static const LevelScript script_func_local_hmc_platforms[] = { +static const LevelScript script_func_local_2[] = { OBJECT(/*model*/ MODEL_NONE, /*pos*/ -5809, -1834, 5719, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvFlamethrower), OBJECT(/*model*/ MODEL_NONE, /*pos*/ -4838, -1015, 4081, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvFlamethrower), OBJECT(/*model*/ MODEL_NONE, /*pos*/ 3301, -1834, 5617, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvFlamethrower), @@ -59,7 +59,7 @@ static const LevelScript script_func_local_hmc_platforms[] = { RETURN(), }; -static const LevelScript script_func_local_hmc_dorrie_and_spawners[] = { +static const LevelScript script_func_local_3[] = { OBJECT_WITH_ACTS(/*model*/ MODEL_STAR, /*pos*/ 1450, 3400, -2352, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvStar, /*acts*/ ALL_ACTS), OBJECT_WITH_ACTS(/*model*/ MODEL_STAR, /*pos*/ -4200, 6700, -4450, /*angle*/ 0, 0, 0, /*behParam*/ 0x01000000, /*beh*/ bhvStar, /*acts*/ ALL_ACTS), OBJECT_WITH_ACTS(/*model*/ MODEL_NONE, /*pos*/ -5150, -1400, 0, /*angle*/ 0, 0, 0, /*behParam*/ 0x02000000, /*beh*/ bhvHiddenRedCoinStar, /*acts*/ ALL_ACTS), @@ -127,9 +127,9 @@ const LevelScript level_rr_entry[] = { WARP_NODE(/*id*/ 0x0C, /*destLevel*/ LEVEL_RR, /*destArea*/ 0x01, /*destNode*/ 0x0B, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0xF0, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x02, /*destNode*/ 0x3A, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0xF1, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x02, /*destNode*/ 0x6C, /*flags*/ WARP_NO_CHECKPOINT), - JUMP_LINK(script_func_local_hmc_flames_and_poles), - JUMP_LINK(script_func_local_hmc_platforms), - JUMP_LINK(script_func_local_hmc_dorrie_and_spawners), + JUMP_LINK(script_func_local_1), + JUMP_LINK(script_func_local_2), + JUMP_LINK(script_func_local_3), TERRAIN(/*terrainData*/ rr_seg7_collision_level), MACRO_OBJECTS(/*objList*/ rr_seg7_macro_objs), SET_BACKGROUND_MUSIC(/*settingsPreset*/ 0x0000, /*seq*/ SEQ_LEVEL_SLIDE), diff --git a/levels/sa/script.c b/levels/sa/script.c index c1b2796a..575edac5 100644 --- a/levels/sa/script.c +++ b/levels/sa/script.c @@ -15,13 +15,13 @@ #include "make_const_nonconst.h" #include "levels/sa/header.h" -static const LevelScript script_func_local_hmc_flames_and_poles[] = { +static const LevelScript script_func_local_1[] = { OBJECT(/*model*/ MODEL_NONE, /*pos*/ 0, -1000, 0, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvFishSpawner), OBJECT(/*model*/ MODEL_NONE, /*pos*/ 0, -1000, 0, /*angle*/ 0, 0, 0, /*behParam*/ 0x00020000, /*beh*/ bhvFishSpawner), RETURN(), }; -static const LevelScript script_func_local_hmc_platforms[] = { +static const LevelScript script_func_local_2[] = { OBJECT(/*model*/ MODEL_NONE, /*pos*/ 0, -4250, 0, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvHiddenRedCoinStar), RETURN(), }; @@ -46,8 +46,8 @@ const LevelScript level_sa_entry[] = { WARP_NODE(/*id*/ 0x0A, /*destLevel*/ LEVEL_SA, /*destArea*/ 0x01, /*destNode*/ 0x0A, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0xF0, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x01, /*destNode*/ 0x27, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0xF1, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x01, /*destNode*/ 0x28, /*flags*/ WARP_NO_CHECKPOINT), - JUMP_LINK(script_func_local_hmc_flames_and_poles), - JUMP_LINK(script_func_local_hmc_platforms), + JUMP_LINK(script_func_local_1), + JUMP_LINK(script_func_local_2), TERRAIN(/*terrainData*/ sa_seg7_collision), MACRO_OBJECTS(/*objList*/ sa_seg7_macro_objs), SET_BACKGROUND_MUSIC(/*settingsPreset*/ 0x0003, /*seq*/ (SEQ_LEVEL_WATER | SEQ_VARIATION)), diff --git a/levels/sl/script.c b/levels/sl/script.c index cfd9627f..f937ddd1 100644 --- a/levels/sl/script.c +++ b/levels/sl/script.c @@ -16,19 +16,19 @@ #include "levels/sl/header.h" -static const LevelScript script_func_local_hmc_flames_and_poles[] = { +static const LevelScript script_func_local_1[] = { OBJECT_WITH_ACTS(/*model*/ MODEL_STAR, /*pos*/ 700, 4500, 690, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvStar, /*acts*/ ALL_ACTS), OBJECT_WITH_ACTS(/*model*/ MODEL_STAR, /*pos*/ 4350, 1350, 4350, /*angle*/ 0, 0, 0, /*behParam*/ 0x02000000, /*beh*/ bhvStar, /*acts*/ ALL_ACTS), OBJECT_WITH_ACTS(/*model*/ MODEL_NONE, /*pos*/ 5000, 1200, 0, /*angle*/ 0, 0, 0, /*behParam*/ 0x04000000, /*beh*/ bhvHiddenRedCoinStar, /*acts*/ ALL_ACTS), RETURN(), }; -static const LevelScript script_func_local_hmc_platforms[] = { +static const LevelScript script_func_local_2[] = { OBJECT(/*model*/ MODEL_NONE, /*pos*/ 977, 1024, 2075, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvSnowMoundSpawn), RETURN(), }; -static const LevelScript script_func_local_hmc_dorrie_and_spawners[] = { +static const LevelScript script_func_local_3[] = { OBJECT(/*model*/ MODEL_PENGUIN, /*pos*/ 1715, 3328, 518, /*angle*/ 0, -51, 0, /*behParam*/ 0x00000000, /*beh*/ bhvSLWalkingPenguin), OBJECT(/*model*/ MODEL_NONE, /*pos*/ 700, 3428, 700, /*angle*/ 0, 30, 0, /*behParam*/ 0x00000000, /*beh*/ bhvSLSnowmanWind), OBJECT(/*model*/ MODEL_NONE, /*pos*/ 480, 2300, 1370, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvIgloo), @@ -37,7 +37,7 @@ static const LevelScript script_func_local_hmc_dorrie_and_spawners[] = { RETURN(), }; -static const LevelScript script_func_local_hmc_stars[] = { +static const LevelScript script_func_local_4[] = { OBJECT_WITH_ACTS(/*model*/ MODEL_STAR, /*pos*/ 0, 500, 1000, /*angle*/ 0, 0, 0, /*behParam*/ 0x05000000, /*beh*/ bhvStar, /*acts*/ ALL_ACTS), RETURN(), }; @@ -75,9 +75,9 @@ const LevelScript level_sl_entry[] = { WARP_NODE(/*id*/ 0x0C, /*destLevel*/ LEVEL_SL, /*destArea*/ 0x02, /*destNode*/ 0x0A, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0x0D, /*destLevel*/ LEVEL_SL, /*destArea*/ 0x01, /*destNode*/ 0x0E, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0x0E, /*destLevel*/ LEVEL_SL, /*destArea*/ 0x01, /*destNode*/ 0x0D, /*flags*/ WARP_NO_CHECKPOINT), - JUMP_LINK(script_func_local_hmc_flames_and_poles), - JUMP_LINK(script_func_local_hmc_platforms), - JUMP_LINK(script_func_local_hmc_dorrie_and_spawners), + JUMP_LINK(script_func_local_1), + JUMP_LINK(script_func_local_2), + JUMP_LINK(script_func_local_3), WARP_NODE(/*id*/ 0xF0, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x02, /*destNode*/ 0x36, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0xF1, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x02, /*destNode*/ 0x68, /*flags*/ WARP_NO_CHECKPOINT), TERRAIN(/*terrainData*/ sl_seg7_area_1_collision), @@ -91,7 +91,7 @@ const LevelScript level_sl_entry[] = { OBJECT(/*model*/ MODEL_NONE, /*pos*/ 0, 0, 3277, /*angle*/ 0, 0, 0, /*behParam*/ 0x140B0000, /*beh*/ bhvWarp), WARP_NODE(/*id*/ 0x0A, /*destLevel*/ LEVEL_SL, /*destArea*/ 0x02, /*destNode*/ 0x0A, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0x0B, /*destLevel*/ LEVEL_SL, /*destArea*/ 0x01, /*destNode*/ 0x0B, /*flags*/ WARP_NO_CHECKPOINT), - JUMP_LINK(script_func_local_hmc_stars), + JUMP_LINK(script_func_local_4), WARP_NODE(/*id*/ 0xF0, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x02, /*destNode*/ 0x36, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0xF1, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x02, /*destNode*/ 0x68, /*flags*/ WARP_NO_CHECKPOINT), TERRAIN(/*terrainData*/ sl_seg7_area_2_collision), diff --git a/levels/ssl/script.c b/levels/ssl/script.c index 714ee43d..05725d14 100644 --- a/levels/ssl/script.c +++ b/levels/ssl/script.c @@ -15,12 +15,12 @@ #include "make_const_nonconst.h" #include "levels/ssl/header.h" -static const LevelScript script_func_local_hmc_flames_and_poles[] = { +static const LevelScript script_func_local_1[] = { OBJECT(/*model*/ MODEL_SSL_PYRAMID_TOP, /*pos*/ -2047, 1536, -1023, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvPyramidTop), RETURN(), }; -static const LevelScript script_func_local_hmc_platforms[] = { +static const LevelScript script_func_local_2[] = { OBJECT(/*model*/ MODEL_SSL_TOX_BOX, /*pos*/ -1284, 0, -5895, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvToxBox), OBJECT(/*model*/ MODEL_SSL_TOX_BOX, /*pos*/ 1283, 0, -4865, /*angle*/ 0, 0, 0, /*behParam*/ 0x00010000, /*beh*/ bhvToxBox), OBJECT(/*model*/ MODEL_SSL_TOX_BOX, /*pos*/ 4873, 0, -3335, /*angle*/ 0, 0, 0, /*behParam*/ 0x00020000, /*beh*/ bhvToxBox), @@ -32,13 +32,13 @@ static const LevelScript script_func_local_hmc_platforms[] = { RETURN(), }; -static const LevelScript script_func_local_hmc_dorrie_and_spawners[] = { +static const LevelScript script_func_local_3[] = { OBJECT_WITH_ACTS(/*model*/ MODEL_STAR, /*pos*/ -2050, 1200, -580, /*angle*/ 0, 0, 0, /*behParam*/ 0x01000000, /*beh*/ bhvStar, /*acts*/ ALL_ACTS), OBJECT_WITH_ACTS(/*model*/ MODEL_NONE, /*pos*/ 6000, 800, 3500, /*angle*/ 0, 0, 0, /*behParam*/ 0x04000000, /*beh*/ bhvHiddenRedCoinStar, /*acts*/ ALL_ACTS), RETURN(), }; -static const LevelScript script_func_local_hmc_stars[] = { +static const LevelScript script_func_local_4[] = { OBJECT(/*model*/ MODEL_NONE, /*pos*/ 2867, 640, 2867, /*angle*/ 0, 0, 0, /*behParam*/ 0x004D0000, /*beh*/ bhvPoleGrabbing), OBJECT(/*model*/ MODEL_NONE, /*pos*/ 0, 3200, 1331, /*angle*/ 0, 0, 0, /*behParam*/ 0x005C0000, /*beh*/ bhvPoleGrabbing), OBJECT(/*model*/ MODEL_SSL_GRINDEL, /*pos*/ 3297, 0, 95, /*angle*/ 0, 0, 0, /*behParam*/ 0x001C0000, /*beh*/ bhvGrindel), @@ -103,9 +103,9 @@ const LevelScript level_ssl_entry[] = { WARP_NODE(/*id*/ 0x20, /*destLevel*/ LEVEL_SSL, /*destArea*/ 0x01, /*destNode*/ 0x1F, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0xF0, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x03, /*destNode*/ 0x33, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0xF1, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x03, /*destNode*/ 0x65, /*flags*/ WARP_NO_CHECKPOINT), - JUMP_LINK(script_func_local_hmc_flames_and_poles), - JUMP_LINK(script_func_local_hmc_platforms), - JUMP_LINK(script_func_local_hmc_dorrie_and_spawners), + JUMP_LINK(script_func_local_1), + JUMP_LINK(script_func_local_2), + JUMP_LINK(script_func_local_3), TERRAIN(/*terrainData*/ ssl_seg7_area_1_collision), MACRO_OBJECTS(/*objList*/ ssl_seg7_area_1_macro_objs), SET_BACKGROUND_MUSIC(/*settingsPreset*/ 0x0000, /*seq*/ SEQ_LEVEL_HOT), @@ -123,7 +123,7 @@ const LevelScript level_ssl_entry[] = { WARP_NODE(/*id*/ 0x16, /*destLevel*/ LEVEL_SSL, /*destArea*/ 0x02, /*destNode*/ 0x15, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0xF0, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x03, /*destNode*/ 0x33, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0xF1, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x03, /*destNode*/ 0x65, /*flags*/ WARP_NO_CHECKPOINT), - JUMP_LINK(script_func_local_hmc_stars), + JUMP_LINK(script_func_local_4), JUMP_LINK(script_func_local_5), INSTANT_WARP(/*index*/ 3, /*destArea*/ 3, /*displace*/ 0, 0, 0), TERRAIN(/*terrainData*/ ssl_seg7_area_2_collision), diff --git a/levels/thi/script.c b/levels/thi/script.c index 6eaa4c13..82d371c2 100644 --- a/levels/thi/script.c +++ b/levels/thi/script.c @@ -15,22 +15,22 @@ #include "make_const_nonconst.h" #include "levels/thi/header.h" -static const LevelScript script_func_local_hmc_flames_and_poles[] = { +static const LevelScript script_func_local_1[] = { RETURN(), }; -static const LevelScript script_func_local_hmc_platforms[] = { +static const LevelScript script_func_local_2[] = { OBJECT_WITH_ACTS(/*model*/ MODEL_NONE, /*pos*/ 0, -700, -4500, /*angle*/ 0, 0, 0, /*behParam*/ 0x03000000, /*beh*/ bhvHiddenStar, /*acts*/ ALL_ACTS), RETURN(), }; -static const LevelScript script_func_local_hmc_dorrie_and_spawners[] = { +static const LevelScript script_func_local_3[] = { OBJECT_WITH_ACTS(/*model*/ MODEL_NONE, /*pos*/ -1800, 800, -1500, /*angle*/ 0, 0, 0, /*behParam*/ 0x04000000, /*beh*/ bhvHiddenRedCoinStar, /*acts*/ ALL_ACTS), OBJECT(/*model*/ MODEL_WIGGLER_HEAD, /*pos*/ 17, 1843, -62, /*angle*/ 0, 0, 0, /*behParam*/ 0x05000000, /*beh*/ bhvWigglerHead), RETURN(), }; -static const LevelScript script_func_local_hmc_stars[] = { +static const LevelScript script_func_local_4[] = { OBJECT_WITH_ACTS(/*model*/ MODEL_KOOPA_WITH_SHELL, /*pos*/ -1900, -511, 2400, /*angle*/ 0, -30, 0, /*behParam*/ 0x02030000, /*beh*/ bhvKoopa, /*acts*/ ACT_3), OBJECT_WITH_ACTS(/*model*/ MODEL_NONE, /*pos*/ 7400, -1537, -6300, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvKoopaRaceEndpoint, /*acts*/ ACT_3), OBJECT(/*model*/ MODEL_NONE, /*pos*/ -6556, -2969, 6565, /*angle*/ 0, 0, 0, /*behParam*/ 0x00010000, /*beh*/ bhvGoombaTripletSpawner), @@ -111,9 +111,9 @@ const LevelScript level_thi_entry[] = { WARP_NODE(/*id*/ 0xF0, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x02, /*destNode*/ 0x37, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0xF1, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x02, /*destNode*/ 0x69, /*flags*/ WARP_NO_CHECKPOINT), JUMP_LINK(script_func_local_7), - JUMP_LINK(script_func_local_hmc_flames_and_poles), + JUMP_LINK(script_func_local_1), JUMP_LINK(script_func_local_5), - JUMP_LINK(script_func_local_hmc_stars), + JUMP_LINK(script_func_local_4), TERRAIN(/*terrainData*/ thi_seg7_area_1_collision), MACRO_OBJECTS(/*objList*/ thi_seg7_area_1_macro_objs), SET_BACKGROUND_MUSIC(/*settingsPreset*/ 0x0000, /*seq*/ SEQ_LEVEL_GRASS), @@ -130,7 +130,7 @@ const LevelScript level_thi_entry[] = { WARP_NODE(/*id*/ 0xF0, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x02, /*destNode*/ 0x33, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0xF1, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x02, /*destNode*/ 0x65, /*flags*/ WARP_NO_CHECKPOINT), JUMP_LINK(script_func_local_8), - JUMP_LINK(script_func_local_hmc_platforms), + JUMP_LINK(script_func_local_2), JUMP_LINK(script_func_local_6), TERRAIN(/*terrainData*/ thi_seg7_area_2_collision), MACRO_OBJECTS(/*objList*/ thi_seg7_area_2_macro_objs), @@ -147,7 +147,7 @@ const LevelScript level_thi_entry[] = { WARP_NODE(/*id*/ 0x0C, /*destLevel*/ LEVEL_THI, /*destArea*/ 0x01, /*destNode*/ 0x0B, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0xF0, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x02, /*destNode*/ 0x37, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0xF1, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x02, /*destNode*/ 0x69, /*flags*/ WARP_NO_CHECKPOINT), - JUMP_LINK(script_func_local_hmc_dorrie_and_spawners), + JUMP_LINK(script_func_local_3), TERRAIN(/*terrainData*/ thi_seg7_area_3_collision), MACRO_OBJECTS(/*objList*/ thi_seg7_area_3_macro_objs), SET_BACKGROUND_MUSIC(/*settingsPreset*/ 0x0004, /*seq*/ SEQ_LEVEL_UNDERGROUND), diff --git a/levels/totwc/script.c b/levels/totwc/script.c index ea35d7ae..ea322ede 100644 --- a/levels/totwc/script.c +++ b/levels/totwc/script.c @@ -16,12 +16,12 @@ #include "make_const_nonconst.h" #include "levels/totwc/header.h" -static const LevelScript script_func_local_hmc_flames_and_poles[] = { +static const LevelScript script_func_local_1[] = { OBJECT(/*model*/ MODEL_CAP_SWITCH, /*pos*/ 0, -2047, 10, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvCapSwitch), RETURN(), }; -static const LevelScript script_func_local_hmc_platforms[] = { +static const LevelScript script_func_local_2[] = { OBJECT(/*model*/ MODEL_NONE, /*pos*/ 800, -1700, 0, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvHiddenRedCoinStar), RETURN(), }; @@ -47,8 +47,8 @@ const LevelScript level_totwc_entry[] = { WARP_NODE(/*id*/ 0xF3, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x01, /*destNode*/ 0x20, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0xF0, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x01, /*destNode*/ 0x26, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0xF1, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x01, /*destNode*/ 0x23, /*flags*/ WARP_NO_CHECKPOINT), - JUMP_LINK(script_func_local_hmc_platforms), - JUMP_LINK(script_func_local_hmc_flames_and_poles), + JUMP_LINK(script_func_local_2), + JUMP_LINK(script_func_local_1), TERRAIN(/*terrainData*/ totwc_seg7_collision), MACRO_OBJECTS(/*objList*/ totwc_seg7_macro_objs), SHOW_DIALOG(/*index*/ 0x00, DIALOG_131), diff --git a/levels/ttc/script.c b/levels/ttc/script.c index ca663f63..70c9f781 100644 --- a/levels/ttc/script.c +++ b/levels/ttc/script.c @@ -15,13 +15,13 @@ #include "make_const_nonconst.h" #include "levels/ttc/header.h" -static const LevelScript script_func_local_hmc_flames_and_poles[] = { +static const LevelScript script_func_local_1[] = { OBJECT(/*model*/ MODEL_NONE, /*pos*/ -1080, -840, 1573, /*angle*/ 0, 0, 0, /*behParam*/ 0x00560000, /*beh*/ bhvPoleGrabbing), OBJECT(/*model*/ MODEL_THWOMP, /*pos*/ 1919, 6191, 1919, /*angle*/ 0, 225, 0, /*behParam*/ 0x00000000, /*beh*/ bhvThwomp2), RETURN(), }; -static const LevelScript script_func_local_hmc_platforms[] = { +static const LevelScript script_func_local_2[] = { OBJECT_WITH_ACTS(/*model*/ MODEL_STAR, /*pos*/ -1450, -1130, -1050, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvStar, /*acts*/ ALL_ACTS), OBJECT_WITH_ACTS(/*model*/ MODEL_STAR, /*pos*/ -1850, 300, -950, /*angle*/ 0, 0, 0, /*behParam*/ 0x01000000, /*beh*/ bhvStar, /*acts*/ ALL_ACTS), OBJECT_WITH_ACTS(/*model*/ MODEL_STAR, /*pos*/ -1300, -2250, -1300, /*angle*/ 0, 0, 0, /*behParam*/ 0x02000000, /*beh*/ bhvStar, /*acts*/ ALL_ACTS), @@ -64,8 +64,8 @@ const LevelScript level_ttc_entry[] = { WARP_NODE(/*id*/ 0x0A, /*destLevel*/ LEVEL_TTC, /*destArea*/ 0x01, /*destNode*/ 0x0A, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0xF0, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x02, /*destNode*/ 0x35, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0xF1, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x02, /*destNode*/ 0x67, /*flags*/ WARP_NO_CHECKPOINT), - JUMP_LINK(script_func_local_hmc_flames_and_poles), - JUMP_LINK(script_func_local_hmc_platforms), + JUMP_LINK(script_func_local_1), + JUMP_LINK(script_func_local_2), TERRAIN(/*terrainData*/ ttc_seg7_collision_level), MACRO_OBJECTS(/*objList*/ ttc_seg7_macro_objs), SET_BACKGROUND_MUSIC(/*settingsPreset*/ 0x0001, /*seq*/ SEQ_LEVEL_SLIDE), diff --git a/levels/ttm/script.c b/levels/ttm/script.c index a9b88f49..899aef61 100644 --- a/levels/ttm/script.c +++ b/levels/ttm/script.c @@ -15,12 +15,12 @@ #include "make_const_nonconst.h" #include "levels/ttm/header.h" -static const LevelScript script_func_local_hmc_flames_and_poles[] = { +static const LevelScript script_func_local_1[] = { OBJECT(/*model*/ MODEL_TTM_ROLLING_LOG, /*pos*/ 4360, -1722, 4001, /*angle*/ 0, 48, 0, /*behParam*/ 0x00000000, /*beh*/ bhvTtmRollingLog), RETURN(), }; -static const LevelScript script_func_local_hmc_platforms[] = { +static const LevelScript script_func_local_2[] = { OBJECT(/*model*/ MODEL_NONE, /*pos*/ -1639, 1146, -1742, /*angle*/ 0, 0, 0, /*behParam*/ 0x00010000, /*beh*/ bhvTtmBowlingBallSpawner), OBJECT(/*model*/ MODEL_NONE, /*pos*/ 3295, -3692, 2928, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvWaterfallSoundLoop), OBJECT(/*model*/ MODEL_NONE, /*pos*/ 2004, -1580, 1283, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvWaterfallSoundLoop), @@ -41,7 +41,7 @@ static const LevelScript script_func_local_hmc_platforms[] = { RETURN(), }; -static const LevelScript script_func_local_hmc_dorrie_and_spawners[] = { +static const LevelScript script_func_local_3[] = { OBJECT_WITH_ACTS(/*model*/ MODEL_STAR, /*pos*/ 1200, 2600, 150, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvStar, /*acts*/ ACT_1), OBJECT_WITH_ACTS(/*model*/ MODEL_TTM_STAR_CAGE, /*pos*/ 2496, 1670, 1492, /*angle*/ 0, 0, 0, /*behParam*/ 0x01000000, /*beh*/ bhvUkikiCage, /*acts*/ ACT_2), OBJECT_WITH_ACTS(/*model*/ MODEL_NONE, /*pos*/ -3250, -2500, -3700, /*angle*/ 0, 0, 0, /*behParam*/ 0x02000000, /*beh*/ bhvHiddenRedCoinStar, /*acts*/ ALL_ACTS), @@ -51,7 +51,7 @@ static const LevelScript script_func_local_hmc_dorrie_and_spawners[] = { RETURN(), }; -static const LevelScript script_func_local_hmc_stars[] = { +static const LevelScript script_func_local_4[] = { OBJECT(/*model*/ MODEL_TTM_BLUE_SMILEY, /*pos*/ 4389, 3620, 624, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvStaticObject), OBJECT(/*model*/ MODEL_TTM_YELLOW_SMILEY, /*pos*/ -1251, 2493, 2224, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvStaticObject), OBJECT(/*model*/ MODEL_TTM_STAR_SMILEY, /*pos*/ -2547, 1365, -520, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvStaticObject), @@ -134,9 +134,9 @@ const LevelScript level_ttm_entry[] = { PAINTING_WARP_NODE(/*id*/ 0x02, /*destLevel*/ LEVEL_TTM, /*destArea*/ 0x02, /*destNode*/ 0x0A, /*flags*/ WARP_CHECKPOINT), WARP_NODE(/*id*/ 0xF0, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x02, /*destNode*/ 0x34, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0xF1, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x02, /*destNode*/ 0x66, /*flags*/ WARP_NO_CHECKPOINT), - JUMP_LINK(script_func_local_hmc_flames_and_poles), - JUMP_LINK(script_func_local_hmc_platforms), - JUMP_LINK(script_func_local_hmc_dorrie_and_spawners), + JUMP_LINK(script_func_local_1), + JUMP_LINK(script_func_local_2), + JUMP_LINK(script_func_local_3), TERRAIN(/*terrainData*/ ttm_seg7_area_1_collision), MACRO_OBJECTS(/*objList*/ ttm_seg7_area_1_macro_objs), SET_BACKGROUND_MUSIC(/*settingsPreset*/ 0x0000, /*seq*/ SEQ_LEVEL_GRASS), @@ -148,7 +148,7 @@ const LevelScript level_ttm_entry[] = { WARP_NODE(/*id*/ 0x0A, /*destLevel*/ LEVEL_TTM, /*destArea*/ 0x02, /*destNode*/ 0x0A, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0xF0, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x02, /*destNode*/ 0x34, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0xF1, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x02, /*destNode*/ 0x66, /*flags*/ WARP_NO_CHECKPOINT), - JUMP_LINK(script_func_local_hmc_stars), + JUMP_LINK(script_func_local_4), TERRAIN(/*terrainData*/ ttm_seg7_area_2_collision), MACRO_OBJECTS(/*objList*/ ttm_seg7_area_2_macro_objs), INSTANT_WARP(/*index*/ 2, /*destArea*/ 3, /*displace*/ 10240, 7168, 10240), diff --git a/levels/vcutm/script.c b/levels/vcutm/script.c index b76229db..9f9cdc37 100644 --- a/levels/vcutm/script.c +++ b/levels/vcutm/script.c @@ -16,7 +16,7 @@ #include "make_const_nonconst.h" #include "levels/vcutm/header.h" -static const LevelScript script_func_local_hmc_flames_and_poles[] = { +static const LevelScript script_func_local_1[] = { OBJECT(/*model*/ MODEL_VCUTM_SEESAW_PLATFORM, /*pos*/ 154, -1919, -6256, /*angle*/ 0, 270, 0, /*behParam*/ 0x00070000, /*beh*/ bhvSeesawPlatform), OBJECT(/*model*/ MODEL_VCUTM_SEESAW_PLATFORM, /*pos*/ -2047, -3378, -2047, /*angle*/ 0, 0, 0, /*behParam*/ 0x00070000, /*beh*/ bhvSeesawPlatform), OBJECT(/*model*/ MODEL_NONE, /*pos*/ 3251, -1082, -6256, /*angle*/ 0, 270, 0, /*behParam*/ 0x014B0000, /*beh*/ bhvCheckerboardElevatorGroup), @@ -26,12 +26,12 @@ static const LevelScript script_func_local_hmc_flames_and_poles[] = { RETURN(), }; -static const LevelScript script_func_local_hmc_platforms[] = { +static const LevelScript script_func_local_2[] = { OBJECT(/*model*/ MODEL_CAP_SWITCH, /*pos*/ 4506, 26, -6246, /*angle*/ 0, 0, 0, /*behParam*/ 0x00020000, /*beh*/ bhvCapSwitch), RETURN(), }; -static const LevelScript script_func_local_hmc_dorrie_and_spawners[] = { +static const LevelScript script_func_local_3[] = { OBJECT(/*model*/ MODEL_NONE, /*pos*/ 4600, 250, -4500, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvHiddenRedCoinStar), RETURN(), }; @@ -57,9 +57,9 @@ const LevelScript level_vcutm_entry[] = { WARP_NODE(/*id*/ 0xF3, /*destLevel*/ LEVEL_CASTLE_GROUNDS, /*destArea*/ 0x01, /*destNode*/ 0x07, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0xF0, /*destLevel*/ LEVEL_CASTLE_GROUNDS, /*destArea*/ 0x01, /*destNode*/ 0x08, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0xF1, /*destLevel*/ LEVEL_CASTLE_GROUNDS, /*destArea*/ 0x01, /*destNode*/ 0x06, /*flags*/ WARP_NO_CHECKPOINT), - JUMP_LINK(script_func_local_hmc_dorrie_and_spawners), - JUMP_LINK(script_func_local_hmc_flames_and_poles), - JUMP_LINK(script_func_local_hmc_platforms), + JUMP_LINK(script_func_local_3), + JUMP_LINK(script_func_local_1), + JUMP_LINK(script_func_local_2), TERRAIN(/*terrainData*/ vcutm_seg7_collision), MACRO_OBJECTS(/*objList*/ vcutm_seg7_macro_objs), SHOW_DIALOG(/*index*/ 0x00, DIALOG_129), diff --git a/levels/wdw/script.c b/levels/wdw/script.c index 22c4524a..e647ec14 100644 --- a/levels/wdw/script.c +++ b/levels/wdw/script.c @@ -15,7 +15,7 @@ #include "make_const_nonconst.h" #include "levels/wdw/header.h" -static const LevelScript script_func_local_hmc_flames_and_poles[] = { +static const LevelScript script_func_local_1[] = { OBJECT(/*model*/ MODEL_WDW_SQUARE_FLOATING_PLATFORM, /*pos*/ 3390, 0, 384, /*angle*/ 0, 180, 0, /*behParam*/ 0x00000000, /*beh*/ bhvWdwSquareFloatingPlatform), OBJECT(/*model*/ MODEL_WDW_SQUARE_FLOATING_PLATFORM, /*pos*/ -767, 384, 3584, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvWdwSquareFloatingPlatform), OBJECT(/*model*/ MODEL_WDW_SQUARE_FLOATING_PLATFORM, /*pos*/ -767, 384, 1536, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvWdwSquareFloatingPlatform), @@ -47,7 +47,7 @@ static const LevelScript script_func_local_hmc_flames_and_poles[] = { RETURN(), }; -static const LevelScript script_func_local_hmc_platforms[] = { +static const LevelScript script_func_local_2[] = { OBJECT(/*model*/ MODEL_NONE, /*pos*/ 0, 0, 0, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvInitializeChangingWaterLevel), OBJECT(/*model*/ MODEL_WDW_WATER_LEVEL_DIAMOND, /*pos*/ -3583, -2508, -2047, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvWaterLevelDiamond), OBJECT(/*model*/ MODEL_WDW_WATER_LEVEL_DIAMOND, /*pos*/ -767, -127, 1792, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvWaterLevelDiamond), @@ -55,13 +55,13 @@ static const LevelScript script_func_local_hmc_platforms[] = { RETURN(), }; -static const LevelScript script_func_local_hmc_dorrie_and_spawners[] = { +static const LevelScript script_func_local_3[] = { OBJECT_WITH_ACTS(/*model*/ MODEL_NONE, /*pos*/ 3360, 1580, 2660, /*angle*/ 0, 0, 0, /*behParam*/ 0x02000000, /*beh*/ bhvHiddenStar, /*acts*/ ALL_ACTS), OBJECT_WITH_ACTS(/*model*/ MODEL_STAR, /*pos*/ 890, 3400, -2040, /*angle*/ 0, 0, 0, /*behParam*/ 0x03000000, /*beh*/ bhvStar, /*acts*/ ALL_ACTS), RETURN(), }; -static const LevelScript script_func_local_hmc_stars[] = { +static const LevelScript script_func_local_4[] = { OBJECT_WITH_ACTS(/*model*/ MODEL_NONE, /*pos*/ -770, -1600, 3600, /*angle*/ 0, 0, 0, /*behParam*/ 0x04000000, /*beh*/ bhvHiddenRedCoinStar, /*acts*/ ALL_ACTS), OBJECT_WITH_ACTS(/*model*/ MODEL_STAR, /*pos*/ 2180, -840, 3720, /*angle*/ 0, 0, 0, /*behParam*/ 0x05000000, /*beh*/ bhvStar, /*acts*/ ALL_ACTS), RETURN(), @@ -99,8 +99,8 @@ const LevelScript level_wdw_entry[] = { WARP_NODE(/*id*/ 0x0A, /*destLevel*/ LEVEL_WDW, /*destArea*/ 0x01, /*destNode*/ 0x0A, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0x0B, /*destLevel*/ LEVEL_WDW, /*destArea*/ 0x01, /*destNode*/ 0x0C, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0x0C, /*destLevel*/ LEVEL_WDW, /*destArea*/ 0x01, /*destNode*/ 0x0B, /*flags*/ WARP_NO_CHECKPOINT), - JUMP_LINK(script_func_local_hmc_dorrie_and_spawners), - JUMP_LINK(script_func_local_hmc_flames_and_poles), + JUMP_LINK(script_func_local_3), + JUMP_LINK(script_func_local_1), WARP_NODE(/*id*/ 0xF0, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x02, /*destNode*/ 0x32, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0xF1, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x02, /*destNode*/ 0x64, /*flags*/ WARP_NO_CHECKPOINT), INSTANT_WARP(/*index*/ 1, /*destArea*/ 2, /*displace*/ 0, 0, 0), @@ -111,8 +111,8 @@ const LevelScript level_wdw_entry[] = { END_AREA(), AREA(/*index*/ 2, wdw_geo_000724), - JUMP_LINK(script_func_local_hmc_stars), - JUMP_LINK(script_func_local_hmc_platforms), + JUMP_LINK(script_func_local_4), + JUMP_LINK(script_func_local_2), WARP_NODE(/*id*/ 0xF0, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x02, /*destNode*/ 0x32, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0xF1, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x02, /*destNode*/ 0x64, /*flags*/ WARP_NO_CHECKPOINT), INSTANT_WARP(/*index*/ 0, /*destArea*/ 1, /*displace*/ 0, 0, 0), diff --git a/levels/wf/script.c b/levels/wf/script.c index b2473ede..57105e5d 100644 --- a/levels/wf/script.c +++ b/levels/wf/script.c @@ -18,7 +18,7 @@ // Unlike most levels, some of the level geometry objects in WF are defined as regular objects instead of terrain objects. // Some of them are still terrain objects, however. -static const LevelScript script_func_local_hmc_flames_and_poles[] = { +static const LevelScript script_func_local_1[] = { OBJECT(/*model*/ MODEL_LEVEL_GEOMETRY_03, /*pos*/ 2305, 2432, -255, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvStaticObject), OBJECT(/*model*/ MODEL_LEVEL_GEOMETRY_04, /*pos*/ 3405, 1664, -1791, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvStaticObject), OBJECT(/*model*/ MODEL_LEVEL_GEOMETRY_05, /*pos*/ 3840, 0, -2303, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvStaticObject), @@ -31,7 +31,7 @@ static const LevelScript script_func_local_hmc_flames_and_poles[] = { RETURN(), }; -static const LevelScript script_func_local_hmc_platforms[] = { +static const LevelScript script_func_local_2[] = { OBJECT(/*model*/ MODEL_WF_SMALL_BOMP, /*pos*/ 3300, 1070, 1, /*angle*/ 0, 90, 0, /*behParam*/ 0x00000000, /*beh*/ bhvSmallBomp), OBJECT(/*model*/ MODEL_WF_SMALL_BOMP, /*pos*/ 3300, 1070, 1281, /*angle*/ 0, 90, 0, /*behParam*/ 0x00000000, /*beh*/ bhvSmallBomp), OBJECT(/*model*/ MODEL_WF_LARGE_BOMP, /*pos*/ 3300, 1070, 641, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvLargeBomp), @@ -51,7 +51,7 @@ static const LevelScript script_func_local_hmc_platforms[] = { RETURN(), }; -static const LevelScript script_func_local_hmc_dorrie_and_spawners[] = { +static const LevelScript script_func_local_3[] = { OBJECT(/*model*/ MODEL_THWOMP, /*pos*/ 3462, 1939, -1545, /*angle*/ 0, 180, 0, /*behParam*/ 0x00000000, /*beh*/ bhvThwomp), OBJECT(/*model*/ MODEL_THWOMP, /*pos*/ 3462, 1075, -3314, /*angle*/ 0, 90, 0, /*behParam*/ 0x00000000, /*beh*/ bhvThwomp2), OBJECT(/*model*/ MODEL_NONE, /*pos*/ -856, 922, 3819, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvBetaFishSplashSpawner), @@ -81,7 +81,7 @@ static const LevelScript script_func_local_hmc_dorrie_and_spawners[] = { RETURN(), }; -static const LevelScript script_func_local_hmc_stars[] = { +static const LevelScript script_func_local_4[] = { OBJECT_WITH_ACTS(/*model*/ MODEL_WHOMP, /*pos*/ 0, 3584, 0, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvWhompKingBoss, /*acts*/ ACT_1), OBJECT_WITH_ACTS(/*model*/ MODEL_STAR, /*pos*/ 300, 5550, 0, /*angle*/ 0, 0, 0, /*behParam*/ 0x01000000, /*beh*/ bhvStar, /*acts*/ ACT_2 | ACT_3 | ACT_4 | ACT_5 | ACT_6), OBJECT_WITH_ACTS(/*model*/ MODEL_STAR, /*pos*/ -2500, 1500, -750, /*angle*/ 0, 0, 0, /*behParam*/ 0x02000000, /*beh*/ bhvStar, /*acts*/ ALL_ACTS), @@ -148,10 +148,10 @@ const LevelScript level_wf_entry[] = { WARP_NODE(/*id*/ 0x0C, /*destLevel*/ LEVEL_WF, /*destArea*/ 0x01, /*destNode*/ 0x0B, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0xF0, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x01, /*destNode*/ 0x34, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0xF1, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x01, /*destNode*/ 0x66, /*flags*/ WARP_NO_CHECKPOINT), - JUMP_LINK(script_func_local_hmc_flames_and_poles), - JUMP_LINK(script_func_local_hmc_platforms), - JUMP_LINK(script_func_local_hmc_dorrie_and_spawners), - JUMP_LINK(script_func_local_hmc_stars), + JUMP_LINK(script_func_local_1), + JUMP_LINK(script_func_local_2), + JUMP_LINK(script_func_local_3), + JUMP_LINK(script_func_local_4), TERRAIN(/*terrainData*/ wf_seg7_collision_070102D8), MACRO_OBJECTS(/*objList*/ wf_seg7_macro_objs), SHOW_DIALOG(/*index*/ 0x00, DIALOG_030), diff --git a/levels/wmotr/script.c b/levels/wmotr/script.c index 3877c2c8..dcd8363c 100644 --- a/levels/wmotr/script.c +++ b/levels/wmotr/script.c @@ -15,7 +15,7 @@ #include "make_const_nonconst.h" #include "levels/wmotr/header.h" -static const LevelScript script_func_local_hmc_flames_and_poles[] = { +static const LevelScript script_func_local_1[] = { OBJECT(/*model*/ MODEL_NONE, /*pos*/ 3996, -2739, 5477, /*angle*/ 0, 0, 0, /*behParam*/ 0x00520000, /*beh*/ bhvPoleGrabbing), OBJECT(/*model*/ MODEL_NONE, /*pos*/ -2911, 3564, -3967, /*angle*/ 0, 0, 0, /*behParam*/ 0x00540000, /*beh*/ bhvPoleGrabbing), OBJECT(/*model*/ MODEL_NONE, /*pos*/ -3258, 3359, -3946, /*angle*/ 0, 0, 0, /*behParam*/ 0x00690000, /*beh*/ bhvPoleGrabbing), @@ -25,7 +25,7 @@ static const LevelScript script_func_local_hmc_flames_and_poles[] = { RETURN(), }; -static const LevelScript script_func_local_hmc_platforms[] = { +static const LevelScript script_func_local_2[] = { OBJECT(/*model*/ MODEL_NONE, /*pos*/ -160, 1950, -470, /*angle*/ 0, 0, 0, /*behParam*/ 0x00000000, /*beh*/ bhvHiddenRedCoinStar), RETURN(), }; @@ -53,8 +53,8 @@ const LevelScript level_wmotr_entry[] = { WARP_NODE(/*id*/ 0xF0, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x02, /*destNode*/ 0x38, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0xF1, /*destLevel*/ LEVEL_CASTLE, /*destArea*/ 0x02, /*destNode*/ 0x6D, /*flags*/ WARP_NO_CHECKPOINT), WARP_NODE(/*id*/ 0xF3, /*destLevel*/ LEVEL_CASTLE_GROUNDS, /*destArea*/ 0x01, /*destNode*/ 0x0A, /*flags*/ WARP_NO_CHECKPOINT), - JUMP_LINK(script_func_local_hmc_flames_and_poles), - JUMP_LINK(script_func_local_hmc_platforms), + JUMP_LINK(script_func_local_1), + JUMP_LINK(script_func_local_2), TERRAIN(/*terrainData*/ wmotr_seg7_collision), MACRO_OBJECTS(/*objList*/ wmotr_seg7_macro_objs), SET_BACKGROUND_MUSIC(/*settingsPreset*/ 0x0000, /*seq*/ SEQ_LEVEL_SLIDE), From 708980de21d96fb30c689677a0f6eaf2ed840a73 Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Tue, 5 Oct 2021 10:24:37 -0700 Subject: [PATCH 94/97] Revert execute_mario_action --- src/game/mario.c | 68 ++++++++++++++++---------------- src/game/mario.h | 2 +- src/game/object_list_processor.c | 2 +- 3 files changed, 36 insertions(+), 36 deletions(-) diff --git a/src/game/mario.c b/src/game/mario.c index 0712bbab..87c5effd 100644 --- a/src/game/mario.c +++ b/src/game/mario.c @@ -1704,79 +1704,79 @@ void queue_rumble_particles(void) { /** * Main function for executing Mario's behavior. Returns particleFlags. */ -s32 execute_mario_action(struct MarioState *m) { +s32 execute_mario_action(UNUSED struct Object *obj) { s32 inLoop = TRUE; // Updates once per frame: - vec3f_get_dist_and_lateral_dist_and_angle(m->prevPos, m->pos, &m->moveSpeed, &m->lateralSpeed, &m->movePitch, &m->moveYaw); - vec3_copy(m->prevPos, m->pos); - if (m->action) { + vec3f_get_dist_and_lateral_dist_and_angle(gMarioState->prevPos, gMarioState->pos, &gMarioState->moveSpeed, &gMarioState->lateralSpeed, &gMarioState->movePitch, &gMarioState->moveYaw); + vec3_copy(gMarioState->prevPos, gMarioState->pos); + if (gMarioState->action) { #ifdef ENABLE_DEBUG_FREE_MOVE if (gPlayer1Controller->buttonDown & U_JPAD) { - set_camera_mode(m->area->camera, CAMERA_MODE_8_DIRECTIONS, 1); - set_mario_action(m, ACT_DEBUG_FREE_MOVE, 0); + set_camera_mode(gMarioState->area->camera, CAMERA_MODE_8_DIRECTIONS, 1); + set_mario_action(gMarioState, ACT_DEBUG_FREE_MOVE, 0); } #endif - m->marioObj->header.gfx.node.flags &= ~GRAPH_RENDER_INVISIBLE; - mario_reset_bodystate(m); - update_mario_inputs(m); + gMarioState->marioObj->header.gfx.node.flags &= ~GRAPH_RENDER_INVISIBLE; + mario_reset_bodystate(gMarioState); + update_mario_inputs(gMarioState); #ifdef PUPPYCAM if (!(gPuppyCam.flags & PUPPYCAM_BEHAVIOUR_FREE)) #endif - mario_handle_special_floors(m); - mario_process_interactions(m); + mario_handle_special_floors(gMarioState); + mario_process_interactions(gMarioState); // If Mario is OOB, stop executing actions. - if (m->floor == NULL) { + if (gMarioState->floor == NULL) { return ACTIVE_PARTICLE_NONE; } // The function can loop through many action shifts in one frame, // which can lead to unexpected sub-frame behavior. Could potentially hang // if a loop of actions were found, but there has not been a situation found. while (inLoop) { - switch (m->action & ACT_GROUP_MASK) { - case ACT_GROUP_STATIONARY: inLoop = mario_execute_stationary_action(m); break; - case ACT_GROUP_MOVING: inLoop = mario_execute_moving_action(m); break; - case ACT_GROUP_AIRBORNE: inLoop = mario_execute_airborne_action(m); break; - case ACT_GROUP_SUBMERGED: inLoop = mario_execute_submerged_action(m); break; - case ACT_GROUP_CUTSCENE: inLoop = mario_execute_cutscene_action(m); break; - case ACT_GROUP_AUTOMATIC: inLoop = mario_execute_automatic_action(m); break; - case ACT_GROUP_OBJECT: inLoop = mario_execute_object_action(m); break; + switch (gMarioState->action & ACT_GROUP_MASK) { + case ACT_GROUP_STATIONARY: inLoop = mario_execute_stationary_action(gMarioState); break; + case ACT_GROUP_MOVING: inLoop = mario_execute_moving_action(gMarioState); break; + case ACT_GROUP_AIRBORNE: inLoop = mario_execute_airborne_action(gMarioState); break; + case ACT_GROUP_SUBMERGED: inLoop = mario_execute_submerged_action(gMarioState); break; + case ACT_GROUP_CUTSCENE: inLoop = mario_execute_cutscene_action(gMarioState); break; + case ACT_GROUP_AUTOMATIC: inLoop = mario_execute_automatic_action(gMarioState); break; + case ACT_GROUP_OBJECT: inLoop = mario_execute_object_action(gMarioState); break; } } - sink_mario_in_quicksand(m); - squish_mario_model(m); - set_submerged_cam_preset_and_spawn_bubbles(m); - update_mario_health(m); + sink_mario_in_quicksand(gMarioState); + squish_mario_model(gMarioState); + set_submerged_cam_preset_and_spawn_bubbles(gMarioState); + update_mario_health(gMarioState); #ifdef BREATH_METER - update_mario_breath(m); + update_mario_breath(gMarioState); #endif - update_mario_info_for_cam(m); - mario_update_hitbox_and_cap_model(m); + update_mario_info_for_cam(gMarioState); + mario_update_hitbox_and_cap_model(gMarioState); // Both of the wind handling portions play wind audio only in // non-Japanese releases. - if (m->floor->type == SURFACE_HORIZONTAL_WIND) { - spawn_wind_particles(0, (m->floor->force << 8)); + if (gMarioState->floor->type == SURFACE_HORIZONTAL_WIND) { + spawn_wind_particles(0, (gMarioState->floor->force << 8)); #ifndef VERSION_JP - play_sound(SOUND_ENV_WIND2, m->marioObj->header.gfx.cameraToObject); + play_sound(SOUND_ENV_WIND2, gMarioState->marioObj->header.gfx.cameraToObject); #endif } - if (m->floor->type == SURFACE_VERTICAL_WIND) { + if (gMarioState->floor->type == SURFACE_VERTICAL_WIND) { spawn_wind_particles(1, 0); #ifndef VERSION_JP - play_sound(SOUND_ENV_WIND2, m->marioObj->header.gfx.cameraToObject); + play_sound(SOUND_ENV_WIND2, gMarioState->marioObj->header.gfx.cameraToObject); #endif } play_infinite_stairs_music(); - m->marioObj->oInteractStatus = 0; + gMarioState->marioObj->oInteractStatus = 0; #if ENABLE_RUMBLE queue_rumble_particles(); #endif - return m->particleFlags; + return gMarioState->particleFlags; } return ACTIVE_PARTICLE_NONE; diff --git a/src/game/mario.h b/src/game/mario.h index b2a5d802..d82fd23f 100644 --- a/src/game/mario.h +++ b/src/game/mario.h @@ -50,7 +50,7 @@ s32 check_common_hold_action_exits(struct MarioState *m); s32 transition_submerged_to_walking(struct MarioState *m); s32 transition_submerged_to_airborne(struct MarioState *m); s32 set_water_plunge_action(struct MarioState *m); -s32 execute_mario_action(struct MarioState *m); +s32 execute_mario_action(UNUSED struct Object *obj); void init_mario(void); void init_mario_from_save_file(void); diff --git a/src/game/object_list_processor.c b/src/game/object_list_processor.c index 13acc90d..e0f3a1f6 100644 --- a/src/game/object_list_processor.c +++ b/src/game/object_list_processor.c @@ -253,7 +253,7 @@ void bhv_mario_update(void) { u32 particleFlags = 0; s32 i; - particleFlags = execute_mario_action(gMarioState); + particleFlags = execute_mario_action(gCurrentObject); gCurrentObject->oMarioParticleFlags = particleFlags; // Mario code updates MarioState's versions of position etc, so we need From 2879456dbdee36993b47b084ae12aedc848c2bc1 Mon Sep 17 00:00:00 2001 From: Reonu Date: Tue, 5 Oct 2021 21:34:34 +0300 Subject: [PATCH 95/97] Added Made with HackerSM64 msg (thanks to PyroJay) --- levels/intro/leveldata.c | 4 +++- .../intro/made_with_hackersm64.custom.rgba16.png | Bin 0 -> 1597 bytes 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 levels/intro/made_with_hackersm64.custom.rgba16.png diff --git a/levels/intro/leveldata.c b/levels/intro/leveldata.c index a817c293..c8cbb401 100644 --- a/levels/intro/leveldata.c +++ b/levels/intro/leveldata.c @@ -3342,7 +3342,7 @@ ALIGNED8 static const Texture intro_seg7_texture_0700B4A0[] = { #else // 0x0700B4A0 - 0x0700B4A2 ALIGNED8 static const Texture intro_seg7_texture_0700B4A0[] = { -#include "levels/intro/2_copyright.rgba16.inc.c" +#include "levels/intro/made_with_hackersm64.custom.rgba16.inc.c" }; #endif @@ -3366,6 +3366,7 @@ ALIGNED8 static const Texture intro_seg7_texture_0700C4A0[] = { const Gfx intro_seg7_dl_copyright_trademark[] = { gsDPPipeSync(), gsDPSetCombineMode(G_CC_DECALFADE, G_CC_DECALFADE), + gsDPSetTextureFilter(G_TF_POINT), gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON), gsDPLoadTextureBlock(intro_seg7_texture_0700B4A0, G_IM_FMT_RGBA, G_IM_SIZ_16b, 128, 16, 0, G_TX_CLAMP, G_TX_CLAMP, 7, 4, G_TX_NOLOD, G_TX_NOLOD), @@ -3382,6 +3383,7 @@ const Gfx intro_seg7_dl_copyright_trademark[] = { gsDPSetCombineMode(G_CC_SHADE, G_CC_SHADE), gsDPSetEnvColor(255, 255, 255, 255), gsDPSetRenderMode(G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2), + gsDPSetTextureFilter(G_TF_BILERP), gsSPEndDisplayList(), }; diff --git a/levels/intro/made_with_hackersm64.custom.rgba16.png b/levels/intro/made_with_hackersm64.custom.rgba16.png new file mode 100644 index 0000000000000000000000000000000000000000..c3890a2f18511279b2c65b62b79020ccb75cfabe GIT binary patch literal 1597 zcmeAS@N?(olHy`uVBq!ia0y~yU}#`qU=ZM7W?*1=+19>`fq{XsILO_JVcj{ImkbOH zEa{HEjtmSN`?>!lvNA9*GX(gAxH2#>FxUz**orgQN-)^k^4Qu6+1i@g+S=IKGUN#| zkfZ;tU%F88(VD zY?R=c93V6~P+)Qh&&B}3jh;dq0~wC3>115DDX0bVe({#4I51-Pqv#p*>vMZyNw$e zHXLWzaEoE%J%$bU88+Q#*zmyg_;JhQ$8C=tH$8sK`q(YIW4BC?zpy<1-1^uH>tio% zkG-%z_A+*IN9@LqgvniLle^LmA0`f_IO9^t&Z3?9kHJ}(vEi}-fBy@)s^t3 zEA35J!kbBnpW2c>wI_V+O8d~2`k_DJ>yvj$5ZTzB#(-&FO7#&hL10YU9_V+rJ*! z^!4<%ujhAsJ$3x}@guixow{}F%&l9e-n=>U=FO4MUr&AddgjB|3vb?B`0y1Jt)rNT z5O@)^G=PDDfwRCPvY3H^?=T269?xHq!oa|E%+tj&#KZfoA7{8wpv2y(S2u6EawhZs z_arSR2Nx+FZsQoE;5BPz9I$%$Lc7?JX?jkn!pSW&e{8Ik@0;tl|6ujGJv;C3{a*b& zky%<{$Cb||^8#aMUr#&6Si1l4zk>_4moHd#W6`{_mQ&pA4Tr_ct(23ezg}=yW=?4A zI@tjI`P#*$!rx<8Ejjpg`}%{o9hTpId~cVTabH!Ro8&Z8cPK(Eu?|%8EYR~P0vxk}bsyf#@*2}zZyudz*>2Fn%z>ABI{e|wX@U~Ir ztdMcuevh?wf$>Gt89uLmC-s-??Kgkz>6X8T&;RQY;RT;7_pFbr-w^)ZJ=SJj_wSSc zBJ%f4p4@4-S6Jz1fcV#szjYL@eQ(lFpTTWxJVE}suhJj4@bR$5Ev8G`-Yg0>JtJlRZJIL z8GcyF)@)X&!5qKdlsN0gl^eHws>_jC`BKow*D2+GVu_Y(+ay^=H{(+UX0FxBm;W?; z`EezBQ)RiuaYc=p+fVo^oRzhlcuHf&oH=Kn6kU!i`ZF#$y@Txm!dh zemgd6o3)=pk$Ka?g$hg;)wXPPoN!-+cS7K8IhH2w4 zsPOkT{$qY)r5fYEX;~Rj9j?D7h6rBE*sl8Kb6|&wF3W}O_Z}`5+Bfwln;F9&#v2pP Vta*E7#}iO)@O1TaS?83{1ORYEc{~6B literal 0 HcmV?d00001 From a3c233004f6f25e2ca21629d2267abe6dd427734 Mon Sep 17 00:00:00 2001 From: Reonu Date: Tue, 5 Oct 2021 21:55:24 +0300 Subject: [PATCH 96/97] dpad down in aglabcam snaps to nearest axis instead of always going left --- src/game/camera.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/camera.c b/src/game/camera.c index 6a3cf85d..aa474d5d 100644 --- a/src/game/camera.c +++ b/src/game/camera.c @@ -1121,7 +1121,7 @@ void mode_8_directions_camera(struct Camera *c) { s8DirModeYawOffset += DEGREES(2); } else if (gPlayer1Controller->buttonPressed & D_JPAD) { - s8DirModeYawOffset = s8DirModeYawOffset&0xE000; + s8DirModeYawOffset = (s8DirModeYawOffset + 0x1000) & 0xE000; } #endif From d2590352af2c32cc2f015f87883db83563a40a36 Mon Sep 17 00:00:00 2001 From: thecozies Date: Wed, 6 Oct 2021 10:24:07 -0500 Subject: [PATCH 97/97] Fixed geo_bone --- src/game/rendering_graph_node.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/game/rendering_graph_node.c b/src/game/rendering_graph_node.c index f2768aee..972542ad 100644 --- a/src/game/rendering_graph_node.c +++ b/src/game/rendering_graph_node.c @@ -712,7 +712,7 @@ void geo_process_animated_part(struct GraphNodeAnimatedPart *node) { * Render an animated part that has an initial rotation value */ void geo_process_bone(struct GraphNodeBone *node) { - Vec3s rotation = {0, 0, 0}; + Vec3s rotation = {node->rotation[0], node->rotation[1], node->rotation[2] }; Vec3f translation = {node->translation[0], node->translation[1], node->translation[2]}; if (gCurAnimType == ANIM_TYPE_TRANSLATION) { @@ -739,9 +739,9 @@ void geo_process_bone(struct GraphNodeBone *node) { } } if (gCurAnimType == ANIM_TYPE_ROTATION) { - rotation[0] = gCurAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)]; - rotation[1] = gCurAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)]; - rotation[2] = gCurAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)]; + rotation[0] += gCurAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)]; + rotation[1] += gCurAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)]; + rotation[2] += gCurAnimData[retrieve_animation_index(gCurrAnimFrame, &gCurrAnimAttribute)]; } mtxf_rot_trans_mul(rotation, translation, gMatStack[gMatStackIndex + 1], gMatStack[gMatStackIndex]); inc_mat_stack();