// Creates knockback for a vehicle func (p *Physics) VehicleKnockback(vehicle *state.Vehicle, kbAngle, kbVelocity float64) { // Get vehicle velocity vectors vehAngleX, vehAngleY := splitComponent(vehicle.Angle) vehVectorX := vehAngleX * vehicle.Velocity vehVectorY := vehAngleY * vehicle.Velocity // Get knockback velocity vectors kbAngleX, kbAngleY := splitComponent(kbAngle) kbVectorX := kbAngleX * kbVelocity kbVectorY := kbAngleY * kbVelocity // Combine vectors vectorX := vehVectorX + kbVectorX vectorY := vehVectorY + kbVectorY vehVelocity := combineComponents(vectorX, vectorY) // Calculate angle perpendicularity as a percent angleFactor := math.Mod(math.Abs(vehicle.Angle-kbAngle+90), 180) / 90.0 // Set vehicle velocity if math.Signbit(vehicle.Velocity) == math.Signbit(vehVelocity) { vehicle.Velocity = -vehVelocity * angleFactor } else { vehicle.Velocity = vehVelocity * angleFactor } }
func (p *Physics) VehicleBounding(v *state.Vehicle) { shouldStop := v.X < 0 if shouldStop { v.X = 2 } if v.Y < 0 { shouldStop = true v.Y = 2 } if v.Y > p.WorldHeight { shouldStop = true v.Y = p.WorldHeight - 2 } if v.X > p.WorldWidth { shouldStop = true v.X = p.WorldWidth - 2 } if shouldStop { v.Velocity = 0 } }
func (t *AccelerationCommandProcessor) accelerateVehicle(v *state.Vehicle, c *cmd.AccelerationCommand) { v.Velocity = v.Velocity + (c.Value * t.Physics.AccelerationCommandModifier) if v.Velocity >= t.Physics.MaxVehicleVelocity { v.Velocity = t.Physics.MaxVehicleVelocity } if (v.Velocity) <= (-1 * t.Physics.MaxVehicleVelocity) { v.Velocity = -1 * t.Physics.MaxVehicleVelocity } }
func (p *Physics) damageVehicle(v *state.Vehicle, amount int) bool { if v.IsAlive { v.CurrentHealth -= amount if v.CurrentHealth <= 0 { v.CurrentHealth = 0 v.IsAlive = false v.TimeDestroyed = time.Now() return true } } return false }
func (p *Physics) VehicleFrictionSlow(vehicle *state.Vehicle, duration time.Duration) { speedLoss := p.FrictionSpeedLoss * duration.Seconds() if vehicle.Velocity > 0 { vehicle.Velocity = float64(vehicle.Velocity) - float64(speedLoss) if vehicle.Velocity < 0 { vehicle.Velocity = 0 } } else { vehicle.Velocity = float64(vehicle.Velocity) + float64(speedLoss) if vehicle.Velocity > 0 { vehicle.Velocity = 0 } } }
func (t *PowerupCommandProcessor) placeWell(v *state.Vehicle, g *state.GameState) { v.StoredPowerup = NO_POWERUP r := state.GravityWell{ Point: state.NewPoint(v.X, v.Y), Sized: state.NewSized(10, 10), Owner: v.Owner, Expires: time.Now().Add(5 * time.Second), } g.GravityWells = append(g.GravityWells, &r) }
func (t *PowerupCommandProcessor) fireRocket(v *state.Vehicle, g *state.GameState) { v.StoredPowerup = NO_POWERUP targetedVehicle := targetVehicle(v, g) r := state.Rocket{ Point: state.NewPoint(v.X, v.Y), Sized: state.NewSized(t.Physics.BulletWidth*3, t.Physics.BulletWidth*1.25), Target: targetedVehicle, Velocity: t.Physics.BulletVelocity * .75, } g.Rockets = append(g.Rockets, &r) }
func (p *Physics) RespawnVehicle(v *state.Vehicle, g state.GameState) bool { if !v.IsAlive { if time.Now().After(v.TimeDestroyed.Add(p.VehicleRespawn)) { v.IsAlive = true loc := p.findSpace(v.Sized, g) v.Y = loc.Y v.X = loc.X v.Angle = 0 v.CurrentHealth = v.MaxHealth v.ActivePowerup = NO_POWERUP v.StoredPowerup = NO_POWERUP } } return false }
func TestBox2dVehicle(t *testing.T) { vehicle := state.Vehicle{ Point: state.NewPoint(10, 20), Sized: state.NewSized(15, 40), Angle: 3} Convey("Proper Box Vehicle", t, func() { So(vehicle.AngleDegrees(), ShouldAlmostEqual, vehicle.Angle, .001) x, y := vehicle.Position() w, h := vehicle.Size() So(x, ShouldAlmostEqual, vehicle.X, .001) So(y, ShouldAlmostEqual, vehicle.Y, .001) So(w, ShouldAlmostEqual, vehicle.Height, .001) So(h, ShouldAlmostEqual, vehicle.Width, .001) }) }
func (t *PowerupCommandProcessor) applySpeedPowerUp(v *state.Vehicle) { v.ActivePowerup = SPEEDUP v.StoredPowerup = NO_POWERUP v.OverRideSpeedTill = time.Now().Add(10 * time.Second) }
func (t *PowerupCommandProcessor) healVehicle(v *state.Vehicle) { v.CurrentHealth = v.MaxHealth v.StoredPowerup = NO_POWERUP }
func (p *Physics) PickupPowerUp(v1 *state.Vehicle, power *state.Powerup) { if v1.IsAlive && !power.ShouldRemove { power.ShouldRemove = true v1.StoredPowerup = power.PowerupType } }
func (p *Physics) MoveVehicle(vehicle *state.Vehicle, duration time.Duration) { x, y := p.move2d(vehicle.X, vehicle.Y, vehicle.Angle, vehicle.Velocity, duration) vehicle.X = x vehicle.Y = y }