Flying: Difference between revisions

2,676 bytes added ,  19 December 2023
fix misinformation
(this code is so indirect)
(fix misinformation)
 
(3 intermediate revisions by the same user not shown)
Line 22: Line 22:
As with all airborne actions, a variety of "cancels" are checked prior to actually performing any airborne action. See [[Jump#Airborne cancels]].
As with all airborne actions, a variety of "cancels" are checked prior to actually performing any airborne action. See [[Jump#Airborne cancels]].


Then:
Then:<ref>https://github.com/n64decomp/sm64/blob/66018e9f3caaa67399218971d61366cb3f7ba7d7/src/game/mario_actions_airborne.c#L1726</ref>
# If Z is pressed
# If Z is pressed
## If Mario's camera mode is CAMERA_MODE_BEHIND_MARIO, set_camera_mode to m->area->camera->defMode
## If Mario's camera mode is CAMERA_MODE_BEHIND_MARIO, set_camera_mode to m->area->camera->defMode
Line 37: Line 37:
### Set action state to 1
### Set action state to 1
# Call '''<code>update_flying</code>'''
# Call '''<code>update_flying</code>'''
# switch [[Movement_steps#Perform_Air_Step]]:
# switch [[Movement_steps#Perform_Air_Step]]: (Note: if there are no floor/wall/ceiling/oob interactions this just '''adds vel[0,1,2] to pos[0,1,2]'''.)
#* air step none:
#* air step none:
#*# Update graphics (camera) angle to be behind Mario
#*# Update graphics (camera) angle to be behind Mario
Line 56: Line 56:
Notice that there is no code handling air steps for ledge grabbing or hanging on a ceiling, so such transitions are impossible.
Notice that there is no code handling air steps for ledge grabbing or hanging on a ceiling, so such transitions are impossible.
===update_flying===
===update_flying===
Casually, tilt the joystick left to move left, right to move right, up to move down, down to move up.
I am too lazy to describe the exact details of <code>update_flying</code>, so here is the code
I am too lazy to describe the exact details of <code>update_flying</code>, so here is the code
<syntaxhighlight lang="c">
<syntaxhighlight lang="c">
Line 96: Line 98:
}
}
</syntaxhighlight>
</syntaxhighlight>
'''Key takeaways''':
* Pitching to move up happens faster with higher forward velocity.
** The difference between 4 and 5 speed, and 16 and 17 speed is especially large.
* At the same time, forward velocity is based on pitch. (But it is also based on:)
** There is a base 0.1 forwardVel speed loss
** There is anywhere from 0 to 0.5 further speed loss - more speed is lost the higher the yaw velocity is (ie '''the more Mario turns''').
* Pitch has a minimum and maximum and cannot overflow with standard speeds.
* '''More below the tables'''
* '''TODO:''' I heard moving down then up can be faster then just the direct line. Explain big picture movements, what happens in a practical example.
{| class="wikitable"
|+forwardVel's affect on pitch
|'''<=4'''
|5
|6
|7
|8
|9
|10
|11
|12
|13
|14
|15
|'''16'''
|17
|18
|19
|...
|31
|32
|33
|-
|  -1024
| -270
| -260
| -250
| -240
| -230
| -220
| -210
| -200
| -190
| -180
| -170
| -160
| -90
| -84
| -76
|...
| -6
|0
|6
|}
*'''TODO:''' I heard moving down then up can be faster then just the direct line. Explain big picture movements, what happens in a practical example.
Although I posted the code instead of the detailed psuedocode, here's some less detailed psuedocode anyways:
Although I was too lazy, I typed a less detailed pseudocode anyways:
# Joystick inputs affect (pitch,yaw) velocity.
# Yaw velocity affects yaw, roll, and forward velocity.
# Pitch affects forward velocity.
# Forward velocity becomes at least 0
# Forward velocity affects pitch (see above table)
# Pitch velocity affects pitch.
# Pitch is clamped to be inside [-0x2AAA, 0x2AAA]
# x,y,z velocity is more or less directly exactly correspondent to forward velocity, pitch, and yaw.
# xz sliding velocity updated to correspond
<hr>
Here are some tables summarizing the <code>approach_s32</code>, <code>update_flying_pitch</code>, and <code>update_flying_yaw</code> functions.
Here are some tables summarizing the <code>approach_s32</code>, <code>update_flying_pitch</code>, and <code>update_flying_yaw</code> functions.
{| class="wikitable"
{| class="wikitable"
Line 107: Line 176:
|negative pitch velocity
|negative pitch velocity
|add 64 vel, cap at 32
|add 64 vel, cap at 32
| approach (at most 40 up or 20 down)
| approach (at most 64 up or 32 down)
|approach 0 (by at most 40)
|approach 0 (by at most 64)
|-
|-
|positive pitch velocity
|positive pitch velocity
| approach (at most 20 down or 40 up)
| approach (at most 32 up or 64 down)
|subtract 64 vel, cap at -32
|subtract 64 vel, cap at -32
|approach 0 (by at most 40)
|approach 0 (by at most 64)
|-
|-
|zero pitch velocity
|zero pitch velocity
| approach (at most 20 down or 40 up)
| approach (at most 32 up or 64 down)
| approach (at most 40 up or 20 down)
| approach (at most 64 up or 32 down)
| approach 0 (by at most 40)
| approach 0 (by at most 64)
|}
|}
{| class="wikitable"
{| class="wikitable"
Line 129: Line 198:
|negative yaw velocity
|negative yaw velocity
| add 64 vel, cap at 16
| add 64 vel, cap at 16
|approach (at most 20 up or 10 down)
|approach (at most 32 up or 16 down)
|approach 0 (by at most 40)
|approach 0 (by at most 64)
|-
|-
|positive yaw velocity
|positive yaw velocity
| approach (at most 10 up or 20 down)
| approach (at most 16 up or 32 down)
| subtract 64 vel, cap at -16
| subtract 64 vel, cap at -16
|approach 0 (by at most 40)
|approach 0 (by at most 64)
|-
|-
|zero yaw velocity
|zero yaw velocity
|approach (at most 10 up or 20 down)
|approach (at most 16 up or 32 down)
|approach (at most 20 up or 10 down)
|approach (at most 32 up or 16 down)
|approach 0 (by at most 40)
|approach 0 (by at most 64)
|}
|}
'''Key takeaways''':
# Many joystick positions are equivalent.
# One cannot change velocity by more than 64 (ignoring the effects of speed)
# Holding joystick x=0 or y=0 will approach the corresponding 0 by at most 64.
#* In contrast, holding the opposite direction changes the angle by 32 (yaw) or 64 (pitch), unconditionally
#* In further contrast, holding less of the same direction changes the angle by 32 (yaw) or 64 (pitch)
#* In even furthest contrast, holding more of the same direction changes the angle by 16 (yaw) or 32 (pitch)
#* So it might be faster to say, modify pitch:as such: -56 to -4 to 60 instead of -56 to 8 to 40. Notice the slightly under zero instead of slightly over zero.
After that, update_flying_yaw does:
After that, update_flying_yaw does:
#Add yaw velocity to yaw
#Add yaw velocity to yaw
# Set roll to yaw times negative twenty (-20)
# Set roll to yaw times negative twenty (-20)
'''Note that turning left = positive yaw''' (up = positive pitch).<ref>https://youtu.be/TQt8MCsniQI</ref>
'''Note that turning left = positive yaw''' (up = positive pitch).<ref>https://youtu.be/TQt8MCsniQI</ref>
As can be seen, many joystick positions will be equivalent, and the pitch velocity or yaw velocity change by at most 40.
 
*
*
<syntaxhighlight lang="c">
<syntaxhighlight lang="c">
192

edits