movement.zsc (3765B)
1 //TODO: Delay between flying and gliding? 2 extend class DevilbunnyPlayer 3 { 4 double flightYaw; //for flight tank controls 5 double flightRoll; 6 7 void PlayGliding() 8 { 9 if ((glideState != null) && !InStateSequence(CurState, glideState)) 10 { 11 SetState(glideState); 12 } 13 } 14 15 void PlayFlying() 16 { 17 if ((flyState != null) && !InStateSequence(CurState, flyState)) 18 { 19 SetState(flyState); 20 } 21 } 22 23 void PlayFurl() 24 { 25 if ((furlState != null) && !InStateSequence(CurState, furlState)) 26 { 27 SetState(furlState); 28 } 29 } 30 31 void PlayDash() 32 { 33 if ((dashState != null) && !InStateSequence(CurState, dashState)) 34 { 35 SetState(dashState); 36 } 37 } 38 39 40 override void CheckJump() 41 { 42 return; 43 } 44 45 override void CheckCrouch(bool totallyfrozen) 46 { 47 return; 48 } 49 50 //handle movement when not flying or gliding 51 void walkMove(double movefactor) 52 { 53 UserCmd cmd = player.cmd; 54 double forwardmove, sidemove; 55 if (cmd.forwardmove | cmd.sidemove) 56 { 57 double fm, sm; 58 59 60 61 fm = cmd.forwardmove; 62 sm = cmd.sidemove; 63 [fm, sm] = TweakSpeeds (fm, sm); 64 fm *= Speed / 256; 65 sm *= Speed / 256; 66 67 68 forwardmove = fm * movefactor * (35 / TICRATE); 69 sidemove = sm * movefactor * (35 / TICRATE); 70 71 if (forwardmove) 72 { 73 ForwardThrust(forwardmove, Angle); 74 } 75 if (sidemove) 76 { 77 let a = Angle - 90; 78 Thrust(sidemove, a); 79 } 80 81 if (!(player.cheats & CF_PREDICTING) && (forwardmove != 0 || sidemove != 0)) 82 { 83 PlayRunning (); 84 } 85 86 if (player.cheats & CF_REVERTPLEASE) 87 { 88 player.cheats &= ~CF_REVERTPLEASE; 89 player.camera = player.mo; 90 } 91 } 92 } 93 94 double getsign(double val) 95 { 96 double vout; 97 if (val) 98 { 99 vout = val / abs(val); 100 return vout; 101 } 102 return 0; 103 } 104 105 void FlyMove(double multithrust, double movefactor) 106 { 107 double fthrust; 108 double fakedrag; //Should make an actual drag vector 109 double velAngle; 110 111 fthrust = (multithrust * 100) * (Speed / 256) * movefactor * (35 / TICRATE); 112 velAngle = atan2(Vel.Y, Vel.X); 113 fakedrag = DeltaAngle(velAngle, Angle) / 180; 114 fakedrag = 200 * fakedrag * movefactor * (35 / TICRATE); 115 116 vector3 accel; 117 118 accel.x = fthrust * cos(Angle); 119 accel.y = fthrust * sin(Angle); 120 accel.z = fthrust * 7; 121 122 accel.x += (fakedrag * cos(velAngle + 90)); 123 accel.y += (fakedrag * sin(velAngle + 90)); 124 125 Vel += accel; 126 } 127 128 override void MovePlayer() 129 { 130 let player = self.player; 131 UserCmd cmd = player.cmd; 132 133 //A_Log(Pos.X .. ", " .. Pos.Y .. " / " .. Angle); 134 //A_Log("" .. Pitch); 135 //A_Log("" .. Pos.Z); 136 137 // [RH] 180-degree turn overrides all other yaws 138 if (player.turnticks) 139 { 140 player.turnticks--; 141 Angle += (180. / TURN180_TICKS); 142 } 143 else 144 { 145 Angle += cmd.yaw * (360./65536.); 146 } 147 148 player.onground = (pos.z <= floorz) || bOnMobj || bMBFBouncer || (player.cheats & CF_NOCLIP2); 149 150 double friction, movefactor; 151 [friction, movefactor] = GetFriction(); 152 153 //flying movement. Need to account for being underwater. 154 if ((cmd.buttons & BT_JUMP) && (waterlevel < 2)) 155 { 156 PlayFlying(); 157 flyMove(24, movefactor); 158 return; 159 } 160 161 //running and walking and such things. Don't glide off small ledges. 162 if(player.onground || waterlevel >= 2 || pos.z <= floorz + 20) 163 { 164 A_SetRoll(0); 165 flightYaw = Angle; 166 flightRoll = 0; 167 if ((waterlevel >= 2) && (cmd.buttons & BT_JUMP)) 168 { 169 Vel.Z = 4 * Speed; 170 } 171 172 A_StopSound(CHAN_WINGS); 173 walkMove(movefactor); 174 return; 175 } 176 177 if(cmd.buttons & BT_CROUCH) 178 { 179 PlayFurl(); 180 return; 181 } 182 183 //and finally, gliding 184 PlayGliding(); 185 flyMove(21, movefactor); 186 } 187 }