Start crash sound
This commit is contained in:
		
							parent
							
								
									367112dbd9
								
							
						
					
					
						commit
						b90f5bbfc8
					
				
					 4 changed files with 103 additions and 46 deletions
				
			
		
							
								
								
									
										68
									
								
								audio.h
									
										
									
									
									
								
							
							
						
						
									
										68
									
								
								audio.h
									
										
									
									
									
								
							|  | @ -7,11 +7,12 @@ | |||
| 
 | ||||
| #define LCR_SOUND_NONE 0 | ||||
| #define LCR_SOUND_CLICK 1 | ||||
| #define LCR_SOUND_CRASH 2 | ||||
| #define LCR_SOUND_ACCELERATOR 3 | ||||
| #define LCR_SOUND_CRASH_SMALL 2 | ||||
| #define LCR_SOUND_CRASH_BIG 3 | ||||
| #define LCR_SOUND_ACCELERATOR 4 | ||||
| 
 | ||||
| #define LCR_AUDIO_CRASH_LEN 2048 | ||||
| 
 | ||||
| #define LCR_AUDIO_MIN_RPM 128 | ||||
| #define LCR_AUDIO_MAX_RPM 2048 | ||||
| 
 | ||||
| struct | ||||
| { | ||||
|  | @ -25,8 +26,6 @@ int engineIntensity; | |||
| int engineOsc; | ||||
| int engineInc; | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| } LCR_audio; | ||||
| 
 | ||||
| void LCR_audioInit(void) | ||||
|  | @ -53,6 +52,7 @@ void LCR_audioSetEngineIntensity(uint8_t value) | |||
| 
 | ||||
| void LCR_audioPlaySound(uint8_t sound) | ||||
| { | ||||
|   LCR_LOG2("playing sound"); | ||||
|   LCR_audio.soundPlayed = sound; | ||||
|   LCR_audio.soundPlayedSample = 0; | ||||
| } | ||||
|  | @ -68,23 +68,49 @@ uint8_t LCR_audioGetNextSample(void) | |||
| { | ||||
|   unsigned char result = 128; | ||||
| 
 | ||||
|   //if (LCR_audio.engineIntensity)
 | ||||
|   { | ||||
|     LCR_audio.engineOsc += | ||||
|       LCR_audio.engineInc ? | ||||
|         (((_LCR_audioNoise() % 256) < | ||||
|         (10 + LCR_audio.engineIntensity))) : -31; | ||||
| switch (LCR_audio.soundPlayed) | ||||
| { | ||||
|   case LCR_SOUND_CRASH_SMALL:  | ||||
|     result += (LCR_AUDIO_CRASH_LEN - LCR_audio.soundPlayedSample) * | ||||
|       (_LCR_audioNoise() / 16) / LCR_AUDIO_CRASH_LEN; | ||||
| 
 | ||||
|     if (LCR_audio.engineInc && LCR_audio.engineOsc > | ||||
|       (90 + (LCR_audio.engineIntensity / 8))) | ||||
|       LCR_audio.engineInc = 0; | ||||
|     else if ((!LCR_audio.engineInc) && LCR_audio.engineOsc < 10) | ||||
|       LCR_audio.engineInc = 1; | ||||
|     if (LCR_audio.soundPlayedSample >= LCR_AUDIO_CRASH_LEN) | ||||
|       LCR_audio.soundPlayed = LCR_SOUND_NONE; | ||||
| 
 | ||||
|     result += | ||||
|       LCR_audio.engineIntensity < 20 ? | ||||
|         LCR_audio.engineOsc / 2 : LCR_audio.engineOsc; | ||||
|   } | ||||
|     break; | ||||
| 
 | ||||
|   case LCR_SOUND_CRASH_BIG: | ||||
|     result += ((LCR_AUDIO_CRASH_LEN * 2) - LCR_audio.soundPlayedSample) * | ||||
|       (_LCR_audioNoise() / 8) / (2 * LCR_AUDIO_CRASH_LEN); | ||||
| 
 | ||||
|     if (LCR_audio.soundPlayedSample >= 2 * LCR_AUDIO_CRASH_LEN) | ||||
|       LCR_audio.soundPlayed = LCR_SOUND_NONE; | ||||
| 
 | ||||
|     break; | ||||
| 
 | ||||
|   default: | ||||
|     break; | ||||
| } | ||||
| 
 | ||||
| if (LCR_audio.soundPlayed != LCR_SOUND_NONE) | ||||
|   LCR_audio.soundPlayedSample++; | ||||
| else | ||||
| { | ||||
|   LCR_audio.engineOsc += | ||||
|     LCR_audio.engineInc ? | ||||
|       (((_LCR_audioNoise() % 256) < | ||||
|       (10 + LCR_audio.engineIntensity))) : -31; | ||||
| 
 | ||||
|   if (LCR_audio.engineInc && LCR_audio.engineOsc > | ||||
|     (90 + (LCR_audio.engineIntensity / 8))) | ||||
|     LCR_audio.engineInc = 0; | ||||
|   else if ((!LCR_audio.engineInc) && LCR_audio.engineOsc < 10) | ||||
|     LCR_audio.engineInc = 1; | ||||
| 
 | ||||
|   result += | ||||
|     LCR_audio.engineIntensity < 20 ? | ||||
|       LCR_audio.engineOsc / 2 : LCR_audio.engineOsc; | ||||
| } | ||||
| 
 | ||||
|   LCR_audio.frame++; | ||||
| 
 | ||||
|  |  | |||
|  | @ -29,6 +29,7 @@ void audioFillCallback(void *userdata, uint8_t *s, int l) | |||
| //    s[i] = byte;
 | ||||
| 
 | ||||
| s[i] = byte / 2 + LCR_gameGetNextAudioSample() / 2; | ||||
| //s[i] = LCR_gameGetNextAudioSample();
 | ||||
| 
 | ||||
| 
 | ||||
|   } | ||||
|  |  | |||
							
								
								
									
										17
									
								
								game.h
									
										
									
									
									
								
							
							
						
						
									
										17
									
								
								game.h
									
										
									
									
									
								
							|  | @ -146,8 +146,6 @@ struct | |||
|   uint32_t nextRacingTickTime; | ||||
|   uint8_t controlMode; | ||||
|   uint8_t debugDraw; | ||||
|   uint32_t runTime; | ||||
| 
 | ||||
|   uint8_t musicVolume; | ||||
| } LCR_game; | ||||
| 
 | ||||
|  | @ -224,7 +222,6 @@ void LCR_gameResetRun(void) | |||
|   LCR_rendererSetCarTransform(carTransform,carTransform + 3); | ||||
|   LCR_rendererCameraReset(); | ||||
|   LCR_gameSetState(LCR_GAME_STATE_RUN_STARTING); | ||||
|   LCR_game.runTime = 0; | ||||
| } | ||||
| 
 | ||||
| void LCR_gameStartRun(const char *mapStr) | ||||
|  | @ -305,7 +302,17 @@ uint8_t LCR_gameStep(uint32_t time) | |||
|       LCR_LOG1("finished"); | ||||
|     } | ||||
| 
 | ||||
|     LCR_game.runTime++; | ||||
|     if (events & LCR_RACING_EVENT_CRASH_SMALL) | ||||
|     { | ||||
|       LCR_audioPlaySound(LCR_SOUND_CRASH_SMALL); | ||||
|       LCR_LOG1("crash (small)"); | ||||
|     } | ||||
|     else if (events & LCR_RACING_EVENT_CRASH_BIG) | ||||
|     { | ||||
|       LCR_audioPlaySound(LCR_SOUND_CRASH_BIG); | ||||
|       LCR_LOG1("crash (big)"); | ||||
|     } | ||||
| 
 | ||||
|     LCR_game.nextRacingTickTime += LCR_RACING_TICK_MS;  | ||||
|   } | ||||
| 
 | ||||
|  | @ -391,7 +398,7 @@ LCR_audioSetEngineIntensity((2 * val) < 256 ? (2 * val) : 255); | |||
|       LCR_EFFECTIVE_RESOLUTION_Y - | ||||
|       LCR_rendererComputeTextHeight(2) - 20,0,2); | ||||
| 
 | ||||
|     val = ((LCR_game.runTime * LCR_RACING_TICK_MS)) / 1000; // seconds
 | ||||
|     val = LCR_racingGetRunTimeMS() / 1000; // seconds
 | ||||
| 
 | ||||
|     str[3] = '0' + (val % 60) / 10; | ||||
|     str[4] = '0' + val % 10; | ||||
|  |  | |||
							
								
								
									
										63
									
								
								racing.h
									
										
									
									
									
								
							
							
						
						
									
										63
									
								
								racing.h
									
										
									
									
									
								
							|  | @ -45,6 +45,8 @@ typedef int32_t LCR_GameUnit;  ///< abstract game unit | |||
| #define LCR_CAR_DRIFT_THRESHOLD_1 (LCR_GAME_UNIT / 4) | ||||
| #define LCR_CAR_DRIFT_THRESHOLD_0 (LCR_GAME_UNIT / 200) | ||||
| 
 | ||||
| #define LCR_CAR_CRASH_SPEED_THRESHOLD 25 | ||||
| 
 | ||||
| // multipliers (in 8ths) of friction and acceleration on concrete:
 | ||||
| #define LCR_CAR_GRASS_FACTOR 5 | ||||
| #define LCR_CAR_DIRT_FACTOR 3 | ||||
|  | @ -62,27 +64,35 @@ struct | |||
|   TPE_Connection carConnections[LCR_CAR_CONNECTIONS]; | ||||
| 
 | ||||
|   uint32_t tick; | ||||
|   uint8_t wheelCollisions;  /**< In individual bits records for each car wheel
 | ||||
|                                  whether it's currently touching the ground. | ||||
|                                  Lower bits record current collisions, higher | ||||
|                                  bits the previous state (for averaging). */ | ||||
|   uint8_t wheelCollisions;   /**< In individual bits records for each car wheel
 | ||||
|                                   whether it's currently touching the ground. | ||||
|                                   Lower bits record current collisions, higher | ||||
|                                   bits the previous state (for averaging). */ | ||||
| 
 | ||||
|   TPE_Vec3 carPositions[2]; ///< Current and previous position in game units.
 | ||||
|   TPE_Vec3 carRotations[2]; ///< Current and previous rotation in game units.
 | ||||
|   uint8_t carDrifting;      ///< Whether or not the car is currently in drift.
 | ||||
|   TPE_Vec3 carPositions[2];  ///< Current and previous position in game units.
 | ||||
|   TPE_Vec3 carRotations[2];  ///< Current and previous rotation in game units.
 | ||||
|   uint8_t carDrifting;       ///< Whether or not the car is currently in drift.
 | ||||
| 
 | ||||
|   TPE_Unit fanForce;        ///< Upwards acceleration caused by a fan.
 | ||||
|   LCR_GameUnit wheelAngle;  ///< Current wheel angle, 0 to LCR_GAME_UNIT.
 | ||||
|   LCR_GameUnit wheelSteer;  ///< Left/right steer with LCR_CAR_STEER_MAX bounds.
 | ||||
|   TPE_Unit fanForce;         ///< Upwards acceleration caused by a fan.
 | ||||
|   LCR_GameUnit wheelAngle;   ///< Current wheel angle, 0 to LCR_GAME_UNIT.
 | ||||
|   LCR_GameUnit wheelSteer;   ///< Left/right steer, LCR_CAR_STEER_MAX bounds.
 | ||||
| 
 | ||||
|   LCR_GameUnit carSpeed;    /**< Signed speed in game units per tick (negative
 | ||||
|                                  if backwards) */ | ||||
|   LCR_GameUnit carSpeeds[2]; /**< Signed speed in game units per tick (negative
 | ||||
|                                   if backwards) and its previous value. */ | ||||
| 
 | ||||
|   // for fixing physics bugs:
 | ||||
|   TPE_Vec3 carOKPositions[LCR_CAR_JOINTS]; | ||||
|   uint8_t carNotOKCount; | ||||
| } LCR_racing; | ||||
| 
 | ||||
| /**
 | ||||
|   Gets times of the run in milliseconds. | ||||
| */ | ||||
| uint32_t LCR_racingGetRunTimeMS() | ||||
| { | ||||
|   return LCR_racing.tick * LCR_RACING_TICK_MS; | ||||
| } | ||||
| 
 | ||||
| TPE_Vec3 _LCR_TPE_vec3DividePlain(TPE_Vec3 v, TPE_Unit d) | ||||
| { | ||||
|   v.x /= d; v.y /= d; v.z /= d; | ||||
|  | @ -483,13 +493,13 @@ TPE_Vec3 _LCR_racingEnvironmentFunction(TPE_Vec3 point, TPE_Unit maxDist) | |||
| 
 | ||||
| LCR_GameUnit LCR_racingGetCarSpeedUnsigned(void) | ||||
| { | ||||
|   return LCR_racing.carSpeed >= 0 ? LCR_racing.carSpeed : | ||||
|     (-1 * LCR_racing.carSpeed); | ||||
|   return LCR_racing.carSpeeds[0] >= 0 ? LCR_racing.carSpeeds[0] : | ||||
|     (-1 * LCR_racing.carSpeeds[0]); | ||||
| } | ||||
| 
 | ||||
| LCR_GameUnit LCR_racingGetCarSpeedSigned(void) | ||||
| { | ||||
|   return LCR_racing.carSpeed; | ||||
|   return LCR_racing.carSpeeds[0]; | ||||
| } | ||||
| 
 | ||||
| uint8_t _LCR_racingCollisionHandler(uint16_t b1, uint16_t j1, uint16_t b2, | ||||
|  | @ -569,7 +579,8 @@ void LCR_racingRestart(void) | |||
| 
 | ||||
|   LCR_racing.wheelAngle = 0; | ||||
|   LCR_racing.wheelSteer = 0; | ||||
|   LCR_racing.carSpeed = 0; | ||||
|   LCR_racing.carSpeeds[0] = 0; | ||||
|   LCR_racing.carSpeeds[1] = 0; | ||||
|   LCR_racing.carDrifting = 0; | ||||
| 
 | ||||
|   // make the car body:
 | ||||
|  | @ -874,8 +885,8 @@ uint32_t LCR_racingStep(unsigned int input) | |||
|   if(!(input & (LCR_RACING_INPUT_FORW | LCR_RACING_INPUT_BACK))) | ||||
|     LCR_racing.carBody.friction *= LCR_CAR_STAND_FRICTION_MULTIPLIER; | ||||
|   else if ( | ||||
|   ((input & LCR_RACING_INPUT_FORW) && (LCR_racing.carSpeed < 0)) || | ||||
|   ((input & LCR_RACING_INPUT_BACK) && (LCR_racing.carSpeed > 0))) | ||||
|   ((input & LCR_RACING_INPUT_FORW) && (LCR_racing.carSpeeds[0] < 0)) || | ||||
|   ((input & LCR_RACING_INPUT_BACK) && (LCR_racing.carSpeeds[0] > 0))) | ||||
|     LCR_racing.carBody.friction *= 2 * LCR_CAR_STAND_FRICTION_MULTIPLIER; | ||||
| 
 | ||||
|   if (input) | ||||
|  | @ -1066,11 +1077,23 @@ uint32_t LCR_racingStep(unsigned int input) | |||
|   TPE_worldStep(&(LCR_racing.physicsWorld)); | ||||
|   LCR_LOG2("stepping physics engine done"); | ||||
| 
 | ||||
|   LCR_racing.carSpeed = (TPE_vec3Len(carVel) * LCR_GAME_UNIT) | ||||
|   int speedDiff = LCR_racing.carSpeeds[0] - LCR_racing.carSpeeds[1]; | ||||
| 
 | ||||
|   LCR_racing.carSpeeds[1] = LCR_racing.carSpeeds[0]; | ||||
| 
 | ||||
|   LCR_racing.carSpeeds[0] = (TPE_vec3Len(carVel) * LCR_GAME_UNIT) | ||||
|     / LCR_PHYSICS_UNIT; | ||||
| 
 | ||||
|   if (TPE_vec3Dot(carVel,carForw) < 0) | ||||
|     LCR_racing.carSpeed *= -1; | ||||
|     LCR_racing.carSpeeds[0] *= -1; | ||||
| 
 | ||||
|   else if (speedDiff < -1 * LCR_CAR_CRASH_SPEED_THRESHOLD) | ||||
|   { | ||||
|     result |= (speedDiff < -2 * LCR_CAR_CRASH_SPEED_THRESHOLD) ? | ||||
|       LCR_RACING_EVENT_CRASH_BIG : LCR_RACING_EVENT_CRASH_SMALL; | ||||
| 
 | ||||
|     LCR_racing.carSpeeds[1] = 0; // prevent several crash events in a row
 | ||||
|   } | ||||
| 
 | ||||
|   _LCR_racingUpdateCarPosRot(); | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue