forked from AloXado320/sm64ex-alo-patches
-
Notifications
You must be signed in to change notification settings - Fork 0
/
inertia.patch
111 lines (103 loc) · 3.57 KB
/
inertia.patch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
diff --git a/include/types.h b/include/types.h
index 0824598..c1f4055 100644
--- a/include/types.h
+++ b/include/types.h
@@ -344,6 +344,7 @@ struct MarioState
/*0xBC*/ f32 peakHeight;
/*0xC0*/ f32 quicksandDepth;
/*0xC4*/ f32 unkC4;
+ /*0xC8*/ Vec3f platformDisplacement; // for inertia
};
#endif // _SM64_TYPES_H_
diff --git a/src/game/mario_actions_airborne.c b/src/game/mario_actions_airborne.c
index c9e5451..d2ad09b 100644
--- a/src/game/mario_actions_airborne.c
+++ b/src/game/mario_actions_airborne.c
@@ -2189,8 +2189,47 @@ s32 check_common_airborne_cancels(struct MarioState *m) {
return FALSE;
}
+// abs but with floats
+f32 absf2(f32 x) {
+ if (x >= 0) {
+ return x;
+ } else {
+ return -x;
+ }
+}
+
+void apply_intertia_logic(struct MarioState *m) {
+ f32 x;
+ f32 z;
+ f32 magnitude;
+ const float inertiaDisplacementScale = 16.0f;
+
+ magnitude = sqrtf(m->controller->stickX * m->controller->stickX + m->controller->stickY * m->controller->stickY);
+ magnitude /= inertiaDisplacementScale;
+
+ //16.0f by default
+ x = magnitude * sins(m->intendedYaw);
+ z = magnitude * coss(m->intendedYaw);
+
+ //reduce displacement if you arent holding in the direction of it
+ m->pos[0] += m->platformDisplacement[0];
+ m->vel[1] += m->platformDisplacement[1];
+ m->pos[2] += m->platformDisplacement[2];
+
+ m->platformDisplacement[1] = 0;
+
+ if (absf2(m->platformDisplacement[0] + x) < absf2(m->platformDisplacement[0])){
+ m->platformDisplacement[0] += x;
+ }
+ if (absf2(m->platformDisplacement[2] + z) < absf2(m->platformDisplacement[2])){
+ m->platformDisplacement[2] += z;
+ }
+}
+
s32 mario_execute_airborne_action(struct MarioState *m) {
u32 cancel;
+
+ apply_intertia_logic(m);
if (check_common_airborne_cancels(m)) {
return TRUE;
diff --git a/src/game/platform_displacement.c b/src/game/platform_displacement.c
index 9153bc4..67e45a6 100644
--- a/src/game/platform_displacement.c
+++ b/src/game/platform_displacement.c
@@ -9,10 +9,6 @@
#include "platform_displacement.h"
#include "types.h"
-u16 D_8032FEC0 = 0;
-
-u32 unused_8032FEC4[4] = { 0 };
-
struct Object *gMarioPlatform = NULL;
/**
@@ -109,7 +105,6 @@ void apply_platform_displacement(u32 isMario, struct Object *platform) {
rotation[2] = platform->oAngleVelRoll;
if (isMario) {
- D_8032FEC0 = 0;
get_mario_pos(&x, &y, &z);
} else {
x = gCurrentObject->oPosX;
@@ -157,6 +152,9 @@ void apply_platform_displacement(u32 isMario, struct Object *platform) {
}
if (isMario) {
+ gMarioStates[0].platformDisplacement[0] = x - gMarioStates[0].pos[0];
+ gMarioStates[0].platformDisplacement[1] = y - gMarioStates[0].pos[1];
+ gMarioStates[0].platformDisplacement[2] = z - gMarioStates[0].pos[2];
set_mario_pos(x, y, z);
} else {
gCurrentObject->oPosX = x;
@@ -171,6 +169,13 @@ void apply_platform_displacement(u32 isMario, struct Object *platform) {
void apply_mario_platform_displacement(void) {
struct Object *platform = gMarioPlatform;
+ //sets platform displacement to 0 now so it wont be stored from prior platforms
+ if (gMarioStates[0].pos[1] == gMarioStates[0].floorHeight) {
+ gMarioStates[0].platformDisplacement[0] = 0.0f;
+ gMarioStates[0].platformDisplacement[1] = 0.0f;
+ gMarioStates[0].platformDisplacement[2] = 0.0f;
+ }
+
if (!(gTimeStopState & TIME_STOP_ACTIVE) && gMarioObject != NULL && platform != NULL) {
apply_platform_displacement(TRUE, platform);
}