What CMO scenarios lack

Take command of air and naval assets from post-WW2 to the near future in tactical and operational scale, complete with historical and hypothetical scenarios and an integrated scenario editor.

Moderator: MOD_Command

BDukes
Posts: 2685
Joined: Wed Dec 27, 2017 12:59 pm

Re: What CMO scenarios lack

Post by BDukes »

thewood1 wrote: Tue Jul 22, 2025 5:08 pm 1) It has zero impact on the scenario. There are thousands of whales and larger ocean life that aren't represented as well. I have not heard any mention of tha in the thread.

2) Feel free to show us a scenario completed to your liking to demonstrate.

3) We can see how the performance of the scenario compares to an unaltered one.
You can spawn in things (and out) rather than create all.


--Adds a contact with ASuW mission on bearing with specified ship. Center ship is the unit you want to target.
-- Check if the Blue side's CVN unit exists
if ScenEdit_GetUnit({side='Blue', unitname='Boxer'}) ~= nil then

-- Adding Unit at random position 40-80 miles away
local TargetedUnit = ScenEdit_GetUnit({unitname="Boxer", side='Blue'})

-- Submarine types: Pakistani DJ Khalid, Pakistani S26, China XLUUV, Russia Akula 2
--local SubID = {720, 738, 733, 748}
local SubID = {187, 189, 58, 454}

-- Initialize variables
--Within 1-2 CZs
local ranRange = math.random(40, 80)
--Want a sub within 180 degrees of the bearing the target ship is traveling. Get min and max angle in variables and use as the random bearing.
local subMinAngle = TargetedUnit.heading - ranRange / 2
local subMaxAngle = TargetedUnit.heading + ranRange / 2
local subBearing = math.random(subMinAngle,subMaxAngle)
--local subBearing = math.random(0, 359)
local subranPos = {}
local randSubID = math.random(1, 4)

-- Repeat until a suitable underwater position is found
repeat
ranRange = math.random(30, 70)
subBearing = math.random(subMinAngle,subMaxAngle)
--subBearing = math.random(0, 359)
subranPos = World_GetPointFromBearing({lat=TargetedUnit.latitude, lon=TargetedUnit.longitude, distance=ranRange, bearing=subBearing})
until World_GetElevation({lat=subranPos.latitude, lon=subranPos.longitude}) < -50 ---this is where you set minimum depth of water you want to add the unit

-- Generate a unique name for the submarine
local subName = 'Sub-' .. math.random(1000, 100000)

--set chance of contact type
local contactsuborfcontact= math.random(1,6)
if contactsuborfcontact ==1 then

-- Add the submarine unit to the Red side
ScenEdit_AddUnit({
type='Submarine',
name=subName,
DBID=SubID[randSubID],
heading=subBearing,
side='Red',
lat=subranPos.latitude,
lon=subranPos.longitude,
autodetectable=false
})
-- Add Reference Points for Mission
-- Reference points will be centered on the unit
local CenterUnit = ScenEdit_GetUnit({unitname="Boxer", side='Blue'})
local subrpbearingNE = 45
local subrpbearingNW = 315
local subrpbearingSE = 135
local subrpbearingSW = 225
local subrprange = 80 -- range from reference point to CenterUnit
local subrpNE = World_GetPointFromBearing({lat=CenterUnit.latitude, lon=CenterUnit.longitude, distance=subrprange, bearing=subrpbearingNE})
local subrpNW = World_GetPointFromBearing({lat=CenterUnit.latitude, lon=CenterUnit.longitude, distance=subrprange, bearing=subrpbearingNW})
local subrpSE = World_GetPointFromBearing({lat=CenterUnit.latitude, lon=CenterUnit.longitude, distance=subrprange, bearing=subrpbearingSE})
local subrpSW = World_GetPointFromBearing({lat=CenterUnit.latitude, lon=CenterUnit.longitude, distance=subrprange, bearing=subrpbearingSW})

-- Unique Reference Point Names
local rpsubName1 = 'RP-SUB-' .. math.random(1000, 100000)
local rpsubName2 = 'RP-SUB-' .. math.random(1000, 100000)
local rpsubName3 = 'RP-SUB-' .. math.random(1000, 100000)
local rpsubName4 = 'RP-SUB-' .. math.random(1000, 100000)

-- Add reference points in
ScenEdit_AddReferencePoint({side="Red", name=rpsubName1, lat=subrpNE.latitude, lon=subrpNE.longitude, highlighted=true})
ScenEdit_AddReferencePoint({side="Red", name=rpsubName4, lat=subrpSW.latitude, lon=subrpSW.longitude, highlighted=true})
ScenEdit_AddReferencePoint({side="Red", name=rpsubName2, lat=subrpNW.latitude, lon=subrpNW.longitude, highlighted=true})
ScenEdit_AddReferencePoint({side="Red", name=rpsubName3, lat=subrpSE.latitude, lon=subrpSE.longitude, highlighted=true})

--Add Mission
local rpsubmissionname = 'RP-SUB-MISSION-' .. math.random(1000, 100000)
local rpsubmissionReferencePoints={rpsubName1, rpsubName3,rpsubName4,rpsubName2}
local rpsubmission = ScenEdit_AddMission ('Red', rpsubmissionname, 'Patrol', {type='naval',zone= rpsubmissionReferencePoints} )

--Update Mission

ScenEdit_SetMission('Red',rpsubmissionname, {CheckOPA=false,ProsecutionZone=rpsubmissionReferencePoints,TransitDepthSubmarine="-200", StationDepthSubmarine='-25'})
ScenEdit_SetEMCON('Mission',rpsubmissionname,'Radar=Passive')

--add sub to mission
ScenEdit_AssignUnitToMission( subName, rpsubmissionname )

else if contactsuborfcontact >=2 then
ScenEdit_AddUnit({
type='Submarine',
name=subName,
DBID=94,--False Contact
heading=subBearing,
side='Nature',
altitude = '-200',
lat=subranPos.latitude,
lon=subranPos.longitude,
autodetectable=false
})
ScenEdit_SetUnit({name=subName, side='Nature', moveTo=false, manualaltitude='-75'})

else
end
end

else
-- Handle the case where the CVN unit doesn't exist (e.g., log an error, perform alternative actions)
print("Unit does not exist on the Blue side.")
end
Don't call it a comeback...
BDukes
Posts: 2685
Joined: Wed Dec 27, 2017 12:59 pm

Re: What CMO scenarios lack

Post by BDukes »

LoBlo wrote: Tue Jul 22, 2025 4:24 pm
thewood1 wrote: Fri Jul 11, 2025 12:30 am Here is an original CMO scenario. God's eye is on. There are a lot of aircraft that show up as well.


Screenshot 2025-07-10 202848.jpg
I appreciate that scenario and play it. What's lacking is that the civilian ships just meander around inside of geo-boxes most of the time instead of generating dynamic pathfinding.
Here's some lua code. Spawns unit in and assigns to mission.

--To use add a ship named ship and run
--Creates a sea control mission x miles around the ship as well as 4 reference points.
--Add a x number of ships x number of miles around the first ship you dropped. Adds them to Fishing Track Mission.
--Look into adding a prosecution zone

math.randomseed (os.time ())
SmallBoatCenter = ScenEdit_GetReferencePoint({name='Fishing Hole' ,side='Blue'}) -- Rename you dropped unit Ship. Edit side to your named side.
SBTDBID = {16,328,2358,2359,2357} --Fishing DBID
ScenEdit_AddReferencePoint( {side='Blue',name ="FT1", RelativeTo="Ship",bearing=45,distance=20,})
--Make sure you rename refernce points if you run this more than once.
ScenEdit_AddReferencePoint( {side='Blue',name ="FT2", RelativeTo="Ship",bearing=135,distance=20, })
ScenEdit_AddReferencePoint( {side='Blue',name ="FT3", RelativeTo="Ship",bearing=225,distance=20, })
ScenEdit_AddReferencePoint( {side='Blue',name ="FT4", RelativeTo="Ship",bearing=315 ,distance=20,})
ScenEdit_AddMission("Blue",'Fishing Trak','Patrol', {type="asw",zone={'FT1',"FT2","FT3","FT4"}})
--Update Mission Name and Refernce Points if you use this more than once.
for x=0,8,1 do
local ranRange = math.random(2,20)
local ranBearing = math.random(0,359)
local ranPos = {}
local randSBTDBID = math.random(1,5) --print(SBTDBID[randSBTDBID])
repeat
ranRange = math.random(2,4)
ranBearing = math.random(0,359)
ranPos = World_GetPointFromBearing({lat=SmallBoatCenter.latitude,lon=SmallBoatCenter.longitude,distance=ranRange,bearing=ranBearing})
until World_GetElevation({lat=ranPos.latitude,lon=ranPos.longitude}) < 0
local unit =
ScenEdit_AddUnit(
{
side = "Blue",
type = "Ship",
dbid = SBTDBID[randSBTDBID],
name = "Hull Number "..math.random(1000,50000),
lat = ranPos.latitude,
lon =ranPos.longitude,
autodetectable=false --to true to model AIS
}
)
ScenEdit_AssignUnitToMission(unit.name, "Fishing Trak")
end
Don't call it a comeback...
maverick3320
Posts: 288
Joined: Sun Feb 14, 2021 4:12 pm

Re: What CMO scenarios lack

Post by maverick3320 »

LoBlo wrote: Tue Jul 22, 2025 4:20 pm It's commendable not wanting to overload lower spec systems, but by that logic we would all still be playing Pacman and Space Invaders. Games and systems involve. Its the way the industry works.

I do play another Matrix Game called Distant Worlds and its impressive what the designers were able to accomplish in terms of scale. A large match will have 15000 units. Each with there own individual path findings and each showing multiple dynamic variables.

- optimal path finding
- fuel state and fuel burn
- Sensor strength and continuous scanning
- hostile response programming, invasion response, aggression response.
- sensor strength and range
- platform signal and detectability
- targeting
- firing arcs
- damage and damage control
- cargo acquistion and destination

And it runs on a recommended 8 cores 3Ghx processor (but more is better).
Here are some example screens.

DWGalaxy.png

If we want to give less system load then a solution would be to build in a "ASI slider" that gives users the ability to adjust realism. For example, 0%, 25%, 50%, 75%, 100%, etc. If a warzone exclusion is what a scenario has built, then you can set the slider to a lesser percent, but hostile nations eventually need to maintain supply lines and coastal economies. Depends on the scenario built.

Anyway, if the game's purpose is to build as accurate a "simulator" as possible, then actually "simulating" the real world environment is a core necessity.

lb
Does this game simulate reality?
LoBlo
Posts: 219
Joined: Fri Sep 12, 2014 6:07 pm

Re: What CMO scenarios lack

Post by LoBlo »

thewood1 wrote: Tue Jul 22, 2025 5:08 pm 1) It has zero impact on the scenario. There are thousands of whales and larger ocean life that aren't represented as well. I have not heard any mention of tha in the thread.

2) Feel free to show us a scenario completed to your liking to demonstrate.

3) We can see how the performance of the scenario compares to an unaltered one.
1) Its probably the opposite. That amount of sea traffic brings the fog of war into a whole new paradigm. Major navies and modern antiship missiles are specifically responding to this reality. The USN removed long range antiship missiles from first its submarine, and then its surface fleet due to the amount of collateral damage and civilian traffic in its areas of operation. New ASM have to be smart with target identification. The fog of war is a reality. The US Stark and US Vincent prove that.

Its the difference between having a pistol shoot-out in an open field and having on in the middle of a crowded sport stadium. Entirely different arena.

Any scenario with a sea-dependent economy like Japan, Tiawan, England, USA can't just shut down its sea-lanes. Doing so hands victor to the aggressor (see England circa WWII). So civillian traffic needs to continue to prevent economies from collapsing.

Also, its 2025. The concept of a traditional naval warfare is probably shifting as much as land has. Look at Ukraine. Sea strikes will probably follow suit. It wouldn't be hard for guerilla tactics with clandestine trawlers controlling FPV drones to strike cargo/tanker traffic. New challenges for maritime security.

2). I can, but the point is dynamic traffic, not predicable NPCs making circles in a box. Each would have a course and destination.

3). Would need a better engine and code, but skilled game designers are already showing they can do it at even larger scales.

CMO seems to model old paradigms well, but this is 2025 and its not very good and replicating current naval realities. If the CMO team wants to take the next leap in the validity of its simulation, its an unavoidable upgrade.
LoBlo
Posts: 219
Joined: Fri Sep 12, 2014 6:07 pm

Re: What CMO scenarios lack

Post by LoBlo »

BDukes wrote: Tue Jul 22, 2025 6:14 pm
LoBlo wrote: Tue Jul 22, 2025 4:24 pm
thewood1 wrote: Fri Jul 11, 2025 12:30 am Here is an original CMO scenario. God's eye is on. There are a lot of aircraft that show up as well.


Screenshot 2025-07-10 202848.jpg
I appreciate that scenario and play it. What's lacking is that the civilian ships just meander around inside of geo-boxes most of the time instead of generating dynamic pathfinding.
Here's some lua code. Spawns unit in and assigns to mission.

--To use add a ship named ship and run
--Creates a sea control mission x miles around the ship as well as 4 reference points.
--Add a x number of ships x number of miles around the first ship you dropped. Adds them to Fishing Track Mission.
--Look into adding a prosecution zone

math.randomseed (os.time ())
SmallBoatCenter = ScenEdit_GetReferencePoint({name='Fishing Hole' ,side='Blue'}) -- Rename you dropped unit Ship. Edit side to your named side.
SBTDBID = {16,328,2358,2359,2357} --Fishing DBID
ScenEdit_AddReferencePoint( {side='Blue',name ="FT1", RelativeTo="Ship",bearing=45,distance=20,})
--Make sure you rename refernce points if you run this more than once.
ScenEdit_AddReferencePoint( {side='Blue',name ="FT2", RelativeTo="Ship",bearing=135,distance=20, })
ScenEdit_AddReferencePoint( {side='Blue',name ="FT3", RelativeTo="Ship",bearing=225,distance=20, })
ScenEdit_AddReferencePoint( {side='Blue',name ="FT4", RelativeTo="Ship",bearing=315 ,distance=20,})
ScenEdit_AddMission("Blue",'Fishing Trak','Patrol', {type="asw",zone={'FT1',"FT2","FT3","FT4"}})
--Update Mission Name and Refernce Points if you use this more than once.
for x=0,8,1 do
local ranRange = math.random(2,20)
local ranBearing = math.random(0,359)
local ranPos = {}
local randSBTDBID = math.random(1,5) --print(SBTDBID[randSBTDBID])
repeat
ranRange = math.random(2,4)
ranBearing = math.random(0,359)
ranPos = World_GetPointFromBearing({lat=SmallBoatCenter.latitude,lon=SmallBoatCenter.longitude,distance=ranRange,bearing=ranBearing})
until World_GetElevation({lat=ranPos.latitude,lon=ranPos.longitude}) < 0
local unit =
ScenEdit_AddUnit(
{
side = "Blue",
type = "Ship",
dbid = SBTDBID[randSBTDBID],
name = "Hull Number "..math.random(1000,50000),
lat = ranPos.latitude,
lon =ranPos.longitude,
autodetectable=false --to true to model AIS
}
)
ScenEdit_AssignUnitToMission(unit.name, "Fishing Trak")
end
Thats some nice programming BDukes and a good workaround to try to replicate some dynamics.

Cheers.
LoBlo
Posts: 219
Joined: Fri Sep 12, 2014 6:07 pm

Re: What CMO scenarios lack

Post by LoBlo »

Something that's a real challenge, isn't the hardware, but its the reality of representing such an immense number of contacts in a digestible format. Probably why platforms like the F-35 are given so many accolades. Having to process through all those signs and data in a way the play can interpret and act. It would be nice to see how real-world commands combat information systems digest and present so much data.
Post Reply

Return to “Command: Modern Operations series”