etayn

old gzdoom project
git clone git://moonbender.net/etayn
Log | Files | Refs | README

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 }