Spaces:
Sleeping
Sleeping
| /** | |
| * @license | |
| * SPDX-License-Identifier: Apache-2.0 | |
| */ | |
| import { Vector3 } from "three"; | |
| import { Pilot, SkyZone } from "../types"; | |
| export class ObjectiveSystem { | |
| public static updateCaptureZones( | |
| dt: number, | |
| skyZones: SkyZone[], | |
| pilots: Pilot[], | |
| onGainScore: (team: 1 | 2, amount: number) => void, | |
| isMultiplayer: boolean, | |
| isHost: boolean | |
| ) { | |
| if (isMultiplayer && !isHost) { | |
| return; | |
| } | |
| skyZones.forEach(z => { | |
| const zonePos = new Vector3(z.x, z.y, z.z); | |
| let t1Count = 0; | |
| let t2Count = 0; | |
| pilots.forEach(p => { | |
| if (p.damage.fuselage <= 0) return; | |
| const d = zonePos.distanceTo(new Vector3(p.x, p.y, p.z)); | |
| if (d < z.radius) { | |
| if (p.team === 1) t1Count++; | |
| if (p.team === 2) t2Count++; | |
| } | |
| }); | |
| const delta = t1Count - t2Count; | |
| if (delta > 0) { | |
| z.captureProgress = Math.min(100, z.captureProgress + dt * 15 * delta); | |
| if (z.captureProgress >= 100) { | |
| z.owningTeam = 1; | |
| } | |
| } else if (delta < 0) { | |
| z.captureProgress = Math.max(-100, z.captureProgress + dt * 15 * delta); | |
| if (z.captureProgress <= -100) { | |
| z.owningTeam = 2; | |
| } | |
| } | |
| if (z.owningTeam === 1) { | |
| onGainScore(1, 3 * dt); | |
| } else if (z.owningTeam === 2) { | |
| onGainScore(2, 3 * dt); | |
| } | |
| }); | |
| } | |
| } | |