diff --git a/client/public/stylesheets/markers/airbase.css b/client/public/stylesheets/markers/airbase.css index f734bf34..2faa2a02 100644 --- a/client/public/stylesheets/markers/airbase.css +++ b/client/public/stylesheets/markers/airbase.css @@ -4,8 +4,13 @@ display: flex; justify-content: center; position: relative; - width: 100%; - height: 100%; + width: 40px; + height: 40px; +} + +.airbase-icon svg { + width: 40px; + height: 40px; } .airbase-icon[data-coalition="red"] svg * { diff --git a/client/public/stylesheets/other/contextmenus.css b/client/public/stylesheets/other/contextmenus.css index b133be08..172afdac 100644 --- a/client/public/stylesheets/other/contextmenus.css +++ b/client/public/stylesheets/other/contextmenus.css @@ -727,4 +727,8 @@ #airbase-spawn-contextmenu>div:nth-child(n+3)>div { width: 100%; +} + +#force-coalition { + padding: 10px; } \ No newline at end of file diff --git a/client/src/contextmenus/coalitionareacontextmenu.ts b/client/src/contextmenus/coalitionareacontextmenu.ts index dc9ce242..f5bceafe 100644 --- a/client/src/contextmenus/coalitionareacontextmenu.ts +++ b/client/src/contextmenus/coalitionareacontextmenu.ts @@ -66,8 +66,9 @@ export class CoalitionAreaContextMenu extends ContextMenu { document.addEventListener("contextMenuCreateIads", (e: any) => { const area = this.getCoalitionArea(); + const forceCoalition = (this.getContainer()?.querySelector("#force-coalition")?.querySelector("input") as HTMLInputElement).checked; if (area) - getApp().getUnitsManager().createIADS(area, getCheckboxOptions(this.#iadsTypesDropdown), getCheckboxOptions(this.#iadsErasDropdown), getCheckboxOptions(this.#iadsRangesDropdown), this.#iadsDensitySlider.getValue(), this.#iadsDistributionSlider.getValue()); + getApp().getUnitsManager().createIADS(area, getCheckboxOptions(this.#iadsTypesDropdown), getCheckboxOptions(this.#iadsErasDropdown), getCheckboxOptions(this.#iadsRangesDropdown), this.#iadsDensitySlider.getValue(), this.#iadsDistributionSlider.getValue(), forceCoalition); this.hide(); }); this.hide(); diff --git a/client/src/other/utils.ts b/client/src/other/utils.ts index c92c2f7d..21fb2360 100644 --- a/client/src/other/utils.ts +++ b/client/src/other/utils.ts @@ -288,7 +288,7 @@ export function polygonArea(polygon: Polygon) { return turf.area(poly); } -export function randomUnitBlueprint(unitDatabase: UnitDatabase, options: {type?: string, role?: string, ranges?: string[], eras?: string[]} ) { +export function randomUnitBlueprint(unitDatabase: UnitDatabase, options: {type?: string, role?: string, ranges?: string[], eras?: string[], coalition?: string} ) { /* Start from all the unit blueprints in the database */ var unitBlueprints = Object.values(unitDatabase.getBlueprints()); @@ -329,6 +329,13 @@ export function randomUnitBlueprint(unitDatabase: UnitDatabase, options: {type?: }); } + /* Keep only the units that have the correct coalition, if selected */ + if (options.coalition) { + unitBlueprints = unitBlueprints.filter((unitBlueprint: UnitBlueprint) => { + return (unitBlueprint.coalition && unitBlueprint.coalition !== "")? options.coalition === unitBlueprint.coalition: true; + }); + } + var index = Math.floor(Math.random() * unitBlueprints.length); return unitBlueprints[index]; } diff --git a/client/src/unit/unitsmanager.ts b/client/src/unit/unitsmanager.ts index c74e7c27..da455dc1 100644 --- a/client/src/unit/unitsmanager.ts +++ b/client/src/unit/unitsmanager.ts @@ -13,7 +13,7 @@ import { navyUnitDatabase } from "./databases/navyunitdatabase"; import { TemporaryUnitMarker } from "../map/markers/temporaryunitmarker"; import { Popup } from "../popups/popup"; import { HotgroupPanel } from "../panels/hotgrouppanel"; -import { Contact, UnitData, UnitSpawnTable } from "../interfaces"; +import { Contact, UnitBlueprint, UnitData, UnitSpawnTable } from "../interfaces"; import { Dialog } from "../dialog/dialog"; import { Group } from "./group"; import { UnitDataFileExport } from "./importexport/unitdatafileexport"; @@ -1290,7 +1290,7 @@ export class UnitsManager { * @param density Value between 0 and 100, controls the amout of units created * @param distribution Value between 0 and 100, controls how "scattered" the units will be */ - createIADS(coalitionArea: CoalitionArea, types: { [key: string]: boolean }, eras: { [key: string]: boolean }, ranges: { [key: string]: boolean }, density: number, distribution: number) { + createIADS(coalitionArea: CoalitionArea, types: { [key: string]: boolean }, eras: { [key: string]: boolean }, ranges: { [key: string]: boolean }, density: number, distribution: number, forceCoalition: boolean) { const activeTypes = Object.keys(types).filter((key: string) => { return types[key]; }); const activeEras = Object.keys(eras).filter((key: string) => { return eras[key]; }); const activeRanges = Object.keys(ranges).filter((key: string) => { return ranges[key]; }); @@ -1313,7 +1313,12 @@ export class UnitsManager { const type = activeTypes[Math.floor(Math.random() * activeTypes.length)]; if (Math.random() < IADSDensities[type]) { /* Get a random blueprint depending on the selected parameters and spawn the unit */ - const unitBlueprint = randomUnitBlueprint(groundUnitDatabase, { type: type, eras: activeEras, ranges: activeRanges }); + let unitBlueprint: UnitBlueprint | null; + if (forceCoalition) + unitBlueprint = randomUnitBlueprint(groundUnitDatabase, { type: type, eras: activeEras, ranges: activeRanges, coalition: coalitionArea.getCoalition()}); + else + unitBlueprint = randomUnitBlueprint(groundUnitDatabase, { type: type, eras: activeEras, ranges: activeRanges }); + if (unitBlueprint) this.spawnUnits("GroundUnit", [{ unitType: unitBlueprint.name, location: latlng, liveryID: "" }], coalitionArea.getCoalition(), false, "", ""); } @@ -1338,7 +1343,12 @@ export class UnitsManager { const type = activeTypes[Math.floor(Math.random() * activeTypes.length)]; if (Math.random() < IADSDensities[type]) { /* Get a random blueprint depending on the selected parameters and spawn the unit */ - const unitBlueprint = randomUnitBlueprint(groundUnitDatabase, { type: type, eras: activeEras, ranges: activeRanges }); + let unitBlueprint: UnitBlueprint | null; + if (forceCoalition) + unitBlueprint = randomUnitBlueprint(groundUnitDatabase, { type: type, eras: activeEras, ranges: activeRanges, coalition: coalitionArea.getCoalition()}); + else + unitBlueprint = randomUnitBlueprint(groundUnitDatabase, { type: type, eras: activeEras, ranges: activeRanges }); + if (unitBlueprint) this.spawnUnits("GroundUnit", [{ unitType: unitBlueprint.name, location: latlng, liveryID: "" }], coalitionArea.getCoalition(), false, "", ""); } diff --git a/client/views/contextmenus/coalitionarea.ejs b/client/views/contextmenus/coalitionarea.ejs index fd711695..cb1f6973 100644 --- a/client/views/contextmenus/coalitionarea.ejs +++ b/client/views/contextmenus/coalitionarea.ejs @@ -56,6 +56,12 @@ +
+ +
\ No newline at end of file