(kart: Kart, dt: number)
| 150 | } |
| 151 | |
| 152 | function updateAI(kart: Kart, dt: number): void { |
| 153 | if (kart.finished || !raceStarted) return; |
| 154 | |
| 155 | const target = checkpoints[kart.targetCheckpoint]; |
| 156 | const dx = target.x - kart.x; |
| 157 | const dz = target.z - kart.z; |
| 158 | const targetAngle = Math.atan2(dz, dx); |
| 159 | |
| 160 | let angleDiff = targetAngle - kart.angle; |
| 161 | while (angleDiff > Math.PI) angleDiff = angleDiff - Math.PI * 2; |
| 162 | while (angleDiff < -Math.PI) angleDiff = angleDiff + Math.PI * 2; |
| 163 | |
| 164 | const steer = clamp(angleDiff * 3.0 + kart.steerBias, -TURN_SPEED, TURN_SPEED); |
| 165 | |
| 166 | // AI always accelerates, brakes on sharp turns |
| 167 | let accel = ACCEL * 0.85; |
| 168 | if (Math.abs(angleDiff) > 0.5) accel = accel * 0.5; |
| 169 | |
| 170 | updateKartPhysics(kart, dt, accel, steer); |
| 171 | } |
| 172 | |
| 173 | function getPlacement(): number { |
| 174 | // Sort by laps then checkpoints, player is karts[0] |
no test coverage detected