import React, { useState, useEffect } from "react"; import { OlUnitSummary } from "../components/olunitsummary"; import { OlCoalitionToggle } from "../components/olcoalitiontoggle"; import { OlNumberInput } from "../components/olnumberinput"; import { OlLabelToggle } from "../components/ollabeltoggle"; import { OlRangeSlider } from "../components/olrangeslider"; import { OlDropdownItem, OlDropdown } from "../components/oldropdown"; import { LoadoutBlueprint, UnitBlueprint } from "../../interfaces"; import { Coalition } from "../../types/types"; import { getApp } from "../../olympusapp"; import { IDLE, SPAWN_UNIT } from "../../constants/constants"; import { ftToM, getUnitCategoryByBlueprint } from "../../other/utils"; import { LatLng } from "leaflet"; import { Airbase } from "../../mission/airbase"; export function UnitSpawnMenu(props: { blueprint: UnitBlueprint; spawnAtLocation: boolean; airbase?: Airbase | null; coalition?: Coalition }) { /* Compute the min and max values depending on the unit type */ const minNumber = 1; const maxNumber = 4; const minAltitude = 0; const maxAltitude = 30000; const altitudeStep = 500; /* State initialization */ const [spawnCoalition, setSpawnCoalition] = useState("blue" as Coalition); const [spawnNumber, setSpawnNumber] = useState(1); const [spawnRole, setSpawnRole] = useState(""); const [spawnLoadoutName, setSpawnLoadout] = useState(""); const [spawnAltitude, setSpawnAltitude] = useState((maxAltitude - minAltitude) / 2); const [spawnAltitudeType, setSpawnAltitudeType] = useState(false); /* When the menu is opened show the unit preview on the map as a cursor */ useEffect(() => { if (props.coalition && props.coalition !== spawnCoalition) { setSpawnCoalition(props.coalition); } if (props.spawnAtLocation) { if (props.blueprint !== null) { getApp() ?.getMap() ?.setState(SPAWN_UNIT, { spawnRequestTable: { category: getUnitCategoryByBlueprint(props.blueprint), unit: { unitType: props.blueprint.name, location: new LatLng(0, 0), // This will be filled when the user clicks on the map to spawn the unit skill: "High", liveryID: "", altitude: ftToM(spawnAltitude), loadout: props.blueprint.loadouts?.find((loadout) => { return loadout.name === spawnLoadoutName; })?.code ?? "", }, coalition: spawnCoalition, }, }); } else { if (getApp()?.getMap()?.getState() === SPAWN_UNIT) getApp().getMap().setState(IDLE); } } }); function spawnAtAirbase() { getApp() .getUnitsManager() .spawnUnits( getUnitCategoryByBlueprint(props.blueprint), [ { unitType: props.blueprint.name, location: new LatLng(0, 0), // Not relevant spawning at airbase skill: "High", liveryID: "", altitude: 0, loadout: props.blueprint.loadouts?.find((loadout) => { return loadout.name === spawnLoadoutName; })?.code ?? "", }, ], props.coalition, false, props.airbase?.getName() ); } /* Get a list of all the roles */ const roles: string[] = []; (props.blueprint as UnitBlueprint).loadouts?.forEach((loadout) => { loadout.roles.forEach((role) => { !roles.includes(role) && roles.push(role); }); }); /* Initialize the role */ spawnRole === "" && roles.length > 0 && setSpawnRole(roles[0]); /* Get a list of all the loadouts */ const loadouts: LoadoutBlueprint[] = []; (props.blueprint as UnitBlueprint).loadouts?.forEach((loadout) => { loadout.roles.includes(spawnRole) && loadouts.push(loadout); }); /* Initialize the loadout */ spawnLoadoutName === "" && loadouts.length > 0 && setSpawnLoadout(loadouts[0].name); const spawnLoadout = props.blueprint.loadouts?.find((loadout) => { return loadout.name === spawnLoadoutName; }); return (
{!props.coalition && ( { spawnCoalition === "blue" && setSpawnCoalition("neutral"); spawnCoalition === "neutral" && setSpawnCoalition("red"); spawnCoalition === "red" && setSpawnCoalition("blue"); }} /> )} { setSpawnNumber(Math.max(minNumber, spawnNumber - 1)); }} onIncrease={() => { setSpawnNumber(Math.min(maxNumber, spawnNumber + 1)); }} onChange={(ev) => { !isNaN(Number(ev.target.value)) && setSpawnNumber(Math.max(minNumber, Math.min(maxNumber, Number(ev.target.value)))); }} />
Altitude {`${Intl.NumberFormat("en-US").format(spawnAltitude)} FT`}
setSpawnAltitudeType(!spawnAltitudeType)} />
setSpawnAltitude(Number(ev.target.value))} value={spawnAltitude} min={minAltitude} max={maxAltitude} step={altitudeStep} />
Role
{roles.map((role) => { return ( { setSpawnRole(role); setSpawnLoadout(""); }} className={`w-full`} > {role} ); })}
Weapons
{loadouts.map((loadout) => { return ( { setSpawnLoadout(loadout.name); }} className={`w-full`} > {loadout.name} ); })}
{spawnLoadout && spawnLoadout.items.length > 0 && (
{spawnLoadout.items.map((item) => { return (
{item.quantity}
{item.name}
); })}
)} {!props.spawnAtLocation && ( )}
); }