diff --git a/DCS_Afgainistan/Insurgent_Sandstorm/F99th-Insurgent_Sandstorm_1.1.7.miz b/DCS_Afgainistan/Insurgent_Sandstorm/F99th-Insurgent_Sandstorm_1.1.7.miz new file mode 100644 index 0000000..ae6f992 Binary files /dev/null and b/DCS_Afgainistan/Insurgent_Sandstorm/F99th-Insurgent_Sandstorm_1.1.7.miz differ diff --git a/DCS_Afgainistan/Insurgent_Sandstorm/Moose_CTLD.lua b/DCS_Afgainistan/Insurgent_Sandstorm/Moose_CTLD.lua index f6906e5..f9df752 100644 --- a/DCS_Afgainistan/Insurgent_Sandstorm/Moose_CTLD.lua +++ b/DCS_Afgainistan/Insurgent_Sandstorm/Moose_CTLD.lua @@ -256,6 +256,24 @@ function blue_ctld:OnAfterTroopsDeployed(From,Event,To,Group,Unit,Troops) end end + + -- FARP Radio. First one has 130AM name London, next 131 name Dallas, and so forth. + local BlueFARPFreq = 129 + local BlueFARPName = 1 --numbers 1..10 + + local BlueFARPClearnames = { + [1]="London", + [2]="Dallas", + [3]="Paris", + [4]="Moscow", + [5]="Berlin", + [6]="Rome", + [7]="Madrid", + [8]="Warsaw", + [9]="Dublin", + [10]="Perth", + } + function blue_ctld:OnAfterCratesBuild(From, Event, To, Group, Unit, Vehicle) if Unit then @@ -278,15 +296,24 @@ function blue_ctld:OnAfterTroopsDeployed(From,Event,To,Group,Unit,Troops) local Coord = Vehicle:GetCoordinate():GetVec2() local mCoord = Vehicle:GetCoordinate() local zonename = "FOB-" .. math.random(1,10000) - local fobzone = ZONE_RADIUS:New(zonename,Coord,1000) + local fobzone = ZONE_RADIUS:New(zonename,Coord,500) local fobmarker = MARKER:New(mCoord, "FORWARD OPERATING BASE:\nBUILT BY: " .. PlayerName .. "\n\nTransport Helos may pick up troops and equipment from this location."):ReadOnly():ToCoalition(coalition.side.BLUE) fobzone:DrawZone(2,{.25,.63,.79},1,{0,0,0},0.25,2,true) - blue_ctld:AddCTLDZone(zonename,CTLD.CargoZoneType.LOAD,SMOKECOLOR.Blue,true,false) + + local FarpNameNumber = ((BlueFARPName-1)%10)+1 -- make sure 11 becomes 1 etc + local FName = BlueFARPClearnames[FarpNameNumber] -- get clear namee + + BlueFARPFreq = BlueFARPFreq + 1 + BlueFARPName = BlueFARPName + 1 + + -- Spawn a FARP with our little helper and fill it up with resources (10t fuel each type, 10 pieces of each known equipment) + UTILS.SpawnFARPAndFunctionalStatics(FName,Coord,ENUMS.FARPType.INVISIBLE,blue_ctld.coalition,country.id.USA,FarpNameNumber,BlueFARPFreq,radio.modulation.AM,nil,nil,nil,10,10) + + blue_ctld:AddCTLDZone(FName,CTLD.CargoZoneType.LOAD,SMOKECOLOR.Blue,true,false) MESSAGE:New("Pilot " .. PlayerName .. " has created a new loading zone for troops and equipment! See your F10 Map for marker!", msgTime, "[ Mission Info ]", false):ToBlue() else env.info("CRATEBUILD: No! Not a FOB: " .. vname,false) end - end end diff --git a/DCS_Afgainistan/Insurgent_Sandstorm/Moose_DroneOps.lua b/DCS_Afgainistan/Insurgent_Sandstorm/Moose_DroneOps.lua index 95fe0d3..c698e7e 100644 --- a/DCS_Afgainistan/Insurgent_Sandstorm/Moose_DroneOps.lua +++ b/DCS_Afgainistan/Insurgent_Sandstorm/Moose_DroneOps.lua @@ -33,58 +33,32 @@ for _, zone in ipairs(blueZones) do table.insert(combinedZones, zone) end --- Create a detection area using the Blue_Drone group and the combined zones -local droneDetection = DETECTION_UNITS:New(Blue_Drone) -droneDetection:SetAcceptZones(combinedZones) -droneDetection:Start() +-- Define the drone using the MOOSE SPAWN class +Blue_Drone = SPAWN:New("BLUE DRONE") + :InitLimit(1, 99) + :SpawnScheduled(1, 0.5) --- Function to present target options to the player -local function RequestTargetOptions() - if not droneDetection then - MESSAGE:New("Drone detection is not initialized", 10):ToAll() - return - end +-- Function to set the drone as a FAC after it spawns +Blue_Drone:OnSpawnGroup(function(spawnGroup) + local droneGroup = spawnGroup -- Reference to the spawned group + local droneUnit = droneGroup:GetUnit(1) -- Get the first unit in the group - local detectedTargets = droneDetection:GetDetectedSet() - if not detectedTargets or #detectedTargets == 0 then - MESSAGE:New("No targets detected", 10):ToAll() - return - end - MESSAGE:New("Targets Detected, use menu again to select.", 10):ToAll() - local targetMenu = MENU_COALITION:New(coalition.side.BLUE, "Select Target", nil) - - for i, target in ipairs(detectedTargets) do - local targetName = target:GetName() - MENU_COALITION_COMMAND:New(coalition.side.BLUE, targetName, targetMenu, function() - PresentActionOptions(target) - end) - end -end + if droneUnit then + -- Define a FAC task for the drone + local facTask = { + id = "FAC", + params = { + callsign = 1, -- Arbitrary callsign (e.g., "Enfield") + frequency = 255.0, -- Frequency for communication + } + } --- Function to present action options for a selected target -local function PresentActionOptions(target) - local actionMenu = MENU_COALITION:New(coalition.side.BLUE, "Select Action for " .. target:GetName(), nil) - - MENU_COALITION_COMMAND:New(coalition.side.BLUE, "Smoke (Red)", actionMenu, function() - target:SmokeTarget(SMOKECOLOR.Red) - end) - MENU_COALITION_COMMAND:New(coalition.side.BLUE, "Smoke (Green)", actionMenu, function() - target:SmokeTarget(SMOKECOLOR.Green) - end) - MENU_COALITION_COMMAND:New(coalition.side.BLUE, "Lase (Code 1688)", actionMenu, function() - target:LaseTarget(1688) - end) - MENU_COALITION_COMMAND:New(coalition.side.BLUE, "Flare (Red)", actionMenu, function() - target:FlareTarget(FLARECOLOR.Red) - end) - MENU_COALITION_COMMAND:New(coalition.side.BLUE, "Flare (Green)", actionMenu, function() - target:FlareTarget(FLARECOLOR.Green) - end) -end + -- Set the FAC task to the drone + droneUnit:SetTask(facTask) --- Create the main mission menu -missionMenu = MENU_MISSION:New("Mission Menu") + env.info("Blue Drone is now a FAC and ready to designate targets.") + else + env.info("No valid unit found in Blue Drone group.") + end +end) --- Create the Drone Menu for the player to interact with the drone -local DroneMenu = MENU_COALITION:New(coalition.side.BLUE, "Drone Ops", missionMenu) -MENU_COALITION_COMMAND:New(coalition.side.BLUE, "Request Target Options", DroneMenu, RequestTargetOptions) \ No newline at end of file diff --git a/DCS_Afgainistan/Insurgent_Sandstorm/Moose_DynamicGroundBattle.lua b/DCS_Afgainistan/Insurgent_Sandstorm/Moose_DynamicGroundBattle.lua index 4bf56f8..0e64749 100644 --- a/DCS_Afgainistan/Insurgent_Sandstorm/Moose_DynamicGroundBattle.lua +++ b/DCS_Afgainistan/Insurgent_Sandstorm/Moose_DynamicGroundBattle.lua @@ -295,14 +295,14 @@ function ZONE_CAPTURE_COALITION:OnEnterCaptured(From, Event, To) self:Smoke(SMOKECOLOR.Blue) self:UndrawZone() self:DrawZone(-1, {0, 0, 1}, 2) -- Draw the zone on the map for 30 seconds, blue color, and thickness 2 - US_CC:MessageTypeToCoalition(string.format("%s has been captured by the USA", self:GetZoneName()), MESSAGE.Type.Information) - RU_CC:MessageTypeToCoalition(string.format("%s has been captured by the USA", self:GetZoneName()), MESSAGE.Type.Information) + --US_CC:MessageTypeToCoalition(string.format("%s has been captured by the USA", self:GetZoneName()), MESSAGE.Type.Information) + --RU_CC:MessageTypeToCoalition(string.format("%s has been captured by the USA", self:GetZoneName()), MESSAGE.Type.Information) else self:Smoke(SMOKECOLOR.Red) self:UndrawZone() self:DrawZone(-1, {1, 0, 0}, 2) -- Draw the zone on the map for 30 seconds, red color, and thickness 2 - RU_CC:MessageTypeToCoalition(string.format("%s has been captured by Russia", self:GetZoneName()), MESSAGE.Type.Information) - US_CC:MessageTypeToCoalition(string.format("%s has been captured by Russia", self:GetZoneName()), MESSAGE.Type.Information) + --RU_CC:MessageTypeToCoalition(string.format("%s has been captured by Russia", self:GetZoneName()), MESSAGE.Type.Information) + --US_CC:MessageTypeToCoalition(string.format("%s has been captured by Russia", self:GetZoneName()), MESSAGE.Type.Information) end end end @@ -321,8 +321,8 @@ function ZONE_CAPTURE_COALITION:OnEnterGuarded(From, Event, To) self:UndrawZone() self:DrawZone(-1, {0, 0, 0.5}, 2) -- Draw the zone on the map for 30 seconds, dark blue color, and thickness 2 if ENABLE_CAPTURE_ZONE_MESSAGES then - US_CC:MessageTypeToCoalition(string.format("%s is under protection of the USA", self:GetZoneName()), MESSAGE.Type.Information) - RU_CC:MessageTypeToCoalition(string.format("%s is under protection of the USA", self:GetZoneName()), MESSAGE.Type.Information) + --US_CC:MessageTypeToCoalition(string.format("%s is under protection of the USA", self:GetZoneName()), MESSAGE.Type.Information) + --RU_CC:MessageTypeToCoalition(string.format("%s is under protection of the USA", self:GetZoneName()), MESSAGE.Type.Information) end else self:Smoke(SMOKECOLOR.Red) @@ -330,8 +330,8 @@ function ZONE_CAPTURE_COALITION:OnEnterGuarded(From, Event, To) self:UndrawZone() self:DrawZone(-1, {0.5, 0, 0}, 2) -- Draw the zone on the map for 30 seconds, dark red color, and thickness 2 if ENABLE_CAPTURE_ZONE_MESSAGES then - RU_CC:MessageTypeToCoalition(string.format("%s is under protection of Russia", self:GetZoneName()), MESSAGE.Type.Information) - US_CC:MessageTypeToCoalition(string.format("%s is under protection of Russia", self:GetZoneName()), MESSAGE.Type.Information) + --RU_CC:MessageTypeToCoalition(string.format("%s is under protection of Russia", self:GetZoneName()), MESSAGE.Type.Information) + --US_CC:MessageTypeToCoalition(string.format("%s is under protection of Russia", self:GetZoneName()), MESSAGE.Type.Information) end end end @@ -348,8 +348,8 @@ function ZONE_CAPTURE_COALITION:OnEnterEmpty(From, Event, To) self:UndrawZone() self:DrawZone(-1, {0, 1, 0}, 2) -- Draw the zone on the map for 30 seconds, green color, and thickness 2 if ENABLE_CAPTURE_ZONE_MESSAGES then - US_CC:MessageTypeToCoalition(string.format("%s is now empty", self:GetZoneName()), MESSAGE.Type.Information) - RU_CC:MessageTypeToCoalition(string.format("%s is now empty", self:GetZoneName()), MESSAGE.Type.Information) + --US_CC:MessageTypeToCoalition(string.format("%s is now empty", self:GetZoneName()), MESSAGE.Type.Information) + --RU_CC:MessageTypeToCoalition(string.format("%s is now empty", self:GetZoneName()), MESSAGE.Type.Information) end end end @@ -368,16 +368,16 @@ function ZONE_CAPTURE_COALITION:OnEnterAttacked(From, Event, To) self:UndrawZone() self:DrawZone(-1, {1, 0.5, 0}, 2) -- Draw the zone on the map for 30 seconds, orange color, and thickness 2 if ENABLE_CAPTURE_ZONE_MESSAGES then - US_CC:MessageTypeToCoalition(string.format("%s is under attack by Russia", self:GetZoneName()), MESSAGE.Type.Information) - RU_CC:MessageTypeToCoalition(string.format("%s is attacking the USA", self:GetZoneName()), MESSAGE.Type.Information) + --US_CC:MessageTypeToCoalition(string.format("%s is under attack by Russia", self:GetZoneName()), MESSAGE.Type.Information) + --RU_CC:MessageTypeToCoalition(string.format("%s is attacking the USA", self:GetZoneName()), MESSAGE.Type.Information) end else self:Smoke(SMOKECOLOR.Red) self:UndrawZone() self:DrawZone(-1, {1, 0.5, 0}, 2) -- Draw the zone on the map for 30 seconds, orange color, and thickness 2 if ENABLE_CAPTURE_ZONE_MESSAGES then - RU_CC:MessageTypeToCoalition(string.format("%s is under attack by the USA", self:GetZoneName()), MESSAGE.Type.Information) - US_CC:MessageTypeToCoalition(string.format("%s is attacking Russia", self:GetZoneName()), MESSAGE.Type.Information) + --RU_CC:MessageTypeToCoalition(string.format("%s is under attack by the USA", self:GetZoneName()), MESSAGE.Type.Information) + --US_CC:MessageTypeToCoalition(string.format("%s is attacking Russia", self:GetZoneName()), MESSAGE.Type.Information) end end end @@ -394,8 +394,8 @@ function ZONE_CAPTURE_COALITION:OnEnterNeutral(From, Event, To) self:UndrawZone() self:DrawZone(-1, {0, 1, 0}, 2) -- Draw the zone on the map for 30 seconds, green color, and thickness 2 if ENABLE_CAPTURE_ZONE_MESSAGES then - US_CC:MessageTypeToCoalition(string.format("%s is now neutral", self:GetZoneName()), MESSAGE.Type.Information) - RU_CC:MessageTypeToCoalition(string.format("%s is now neutral", self:GetZoneName()), MESSAGE.Type.Information) + --US_CC:MessageTypeToCoalition(string.format("%s is now neutral", self:GetZoneName()), MESSAGE.Type.Information) + --RU_CC:MessageTypeToCoalition(string.format("%s is now neutral", self:GetZoneName()), MESSAGE.Type.Information) end end end diff --git a/DCS_Afgainistan/Insurgent_Sandstorm/Moose_InsurgentSandstorm.lua b/DCS_Afgainistan/Insurgent_Sandstorm/Moose_InsurgentSandstorm.lua index d9154a4..10e0c5f 100644 --- a/DCS_Afgainistan/Insurgent_Sandstorm/Moose_InsurgentSandstorm.lua +++ b/DCS_Afgainistan/Insurgent_Sandstorm/Moose_InsurgentSandstorm.lua @@ -7,6 +7,9 @@ local RedDefaultCAP = 2 local BlueA2ADefaultOverhead = 1.5 local BlueDefaultCAP = 2 +-- Create the main mission menu. +missionMenu = MENU_MISSION:New("Mission Menu") + --Build Command Center and Mission for Blue US_CC = COMMANDCENTER:New( GROUP:FindByName( "BLUEHQ" ), "USA HQ" ) US_Mission = MISSION:New( US_CC, "Insurgent Sandstorm", "Primary", "Clear the front lines of enemy activity.", coalition.side.BLUE) @@ -137,7 +140,8 @@ AI_A2A_GCICAP:New(EWRPrefixes, TemplatePrefixes, CapPrefixes, CapLimit, Grouping -- Setup Air Dispatchers for RED and BLUE BLUEBorderZone = ZONE_POLYGON:New( "BLUE BORDER", GROUP:FindByName( "BLUE BORDER" ) ) BLUEA2ADispatcher = AI_A2A_GCICAP:NewWithBorder( { "BLUE EWR" }, { "FIGHTER SWEEP BLUE" }, 'BLUE BORDER', 'BLUE BORDER', BlueDefaultCAP, 10000, 50000, 75000, 100) -BLUEA2ADispatcher:SetDefaultLandingAtEngineShutdown() +BLUEA2ADispatcher:SetDefaultLandingAtRunway() +BLUEA2ADispatcher:SetDefaultTakeoffInAir() BLUEA2ADispatcher:SetTacticalDisplay(TAC_DISPLAY) BLUEA2ADispatcher:SetDefaultFuelThreshold( 0.20 ) BLUEA2ADispatcher:SetRefreshTimeInterval( 300 ) @@ -148,7 +152,8 @@ BLUEA2ADispatcher:SetGciRadius( 75000 ) CCCPBorderZone = ZONE_POLYGON:New( "RED BORDER", GROUP:FindByName( "RED BORDER" ) ) RedA2ADispatcher = AI_A2A_GCICAP:NewWithBorder( { "RED EWR" }, { "FIGHTER SWEEP RED" }, "RED BORDER", "RED BORDER", RedDefaultCAP, 10000, 50000, 75000, 100) -RedA2ADispatcher:SetDefaultLandingAtEngineShutdown() +RedA2ADispatcher:SetDefaultLandingAtRunway() +RedA2ADispatcher:SetDefaultTakeoffInAir() RedA2ADispatcher:SetTacticalDisplay(TAC_DISPLAY) RedA2ADispatcher:SetDefaultFuelThreshold( 0.20 ) RedA2ADispatcher:SetRefreshTimeInterval( 300 ) @@ -160,8 +165,9 @@ RedA2ADispatcher:SetGciRadius( 75000 ) DwyerBorderZone = ZONE_POLYGON:New( "DwyerBorderZone", GROUP:FindByName( "DwyerBorderZone" ) ) -DwyerDispatcher = AI_A2A_GCICAP:NewWithBorder( { "RED EWR" }, { "DwyerBorderCAP" }, "DwyerBorderZone", "DwyerBorderZone", RedDefaultCAP, 10000, 50000, 75000, 100) -DwyerDispatcher:SetDefaultLandingAtEngineShutdown() +DwyerDispatcher = AI_A2A_GCICAP:NewWithBorder( { "RED EWR" }, { "DwyerBorderCAP" }, "DwyerBorderZone", "DwyerBorderZone", RedDefaultCAP, 10000, 50000, 75000, 100) +DwyerDispatcher:SetDefaultLandingAtRunway() +DwyerDispatcher:SetDefaultTakeoffInAir() DwyerDispatcher:SetBorderZone( DwyerBorderZone ) DwyerDispatcher:SetTacticalDisplay(TAC_DISPLAY) DwyerDispatcher:SetDefaultFuelThreshold( 0.20 ) @@ -174,7 +180,8 @@ DwyerDispatcher:SetGciRadius( 75000 ) BostZone = ZONE_POLYGON:New( "BostBorderZone", GROUP:FindByName( "BostBorderZone" ) ) BostDispatcher = AI_A2A_GCICAP:NewWithBorder( { "RED EWR" }, { "BostBorderCAP" }, "BostBorderZone", "BostBorderZone", RedDefaultCAP, 10000, 50000, 75000, 100) -BostDispatcher:SetDefaultLandingAtEngineShutdown() +BostDispatcher:SetDefaultLandingAtRunway() +BostDispatcher:SetDefaultTakeoffInAir() BostDispatcher:SetBorderZone(BostZone) BostDispatcher:SetTacticalDisplay(TAC_DISPLAY) BostDispatcher:SetDefaultFuelThreshold( 0.20 ) @@ -185,12 +192,10 @@ BostDispatcher:SetEngageRadius( 50000 ) BostDispatcher:SetGciRadius( 75000 ) -- There are 12 units in this group. Need space for each one in the numbers. So if I want 4 SA11s i'm just rounding up to 48 -Blue_Drone = SPAWN:New("BLUE DRONE") - :InitLimit(1, 99) - :SpawnScheduled(1, 0.5) +--Blue_Drone = SPAWN:New("BLUE DRONE") +-- :InitLimit(1, 99) +-- :SpawnScheduled(1, 0.5) - -- Create the main mission menu. -missionMenu = MENU_MISSION:New("Mission Menu") -- Spawn the RED Bunker Buster @@ -198,6 +203,29 @@ Red_Bunker_Buster = SPAWN:New("BUNKER BUSTER") :InitLimit(1, 99) :SpawnScheduled(900, 0.5) + Red_Bunker_Buster2 = SPAWN:New("BUNKER BUSTER-1") :InitLimit(1, 99) - :SpawnScheduled(1800, 0.5) \ No newline at end of file + :SpawnScheduled(1800, 0.5) + +-- Spawn TRANSPORT truck. When it reaches it's last waypoint, despawn it and spawn a new one. +Blue_Transport = SPAWN:New("TRANSPORT") + :InitLimit(1, 99) + :SpawnScheduled(1, 0.5) + +-- When Red_Transport reaches it's last waypoint, despawn it and spawn a new one. +function Blue_Transport:OnAfterWayPoint(From, Event, To) + if To == 9 then + Blue_Transport:Destroy() + Blue_Transport:Spawn() + end +end + +--CleanUpAirports = CLEANUP_AIRBASE:New( { + -- AIRBASE.Afghanistan.Kandahar, + -- AIRBASE.Afghanistan.Camp_Bastion + +--}) + + + diff --git a/DCS_Afgainistan/Insurgent_Sandstorm/Moose_InsurgentSandstorm_Awacs.lua b/DCS_Afgainistan/Insurgent_Sandstorm/Moose_InsurgentSandstorm_Awacs.lua index d28719f..0ab1cc1 100644 --- a/DCS_Afgainistan/Insurgent_Sandstorm/Moose_InsurgentSandstorm_Awacs.lua +++ b/DCS_Afgainistan/Insurgent_Sandstorm/Moose_InsurgentSandstorm_Awacs.lua @@ -1,3 +1,7 @@ +------------------------------------------------------------------------------------------------------------------------------------------------ +-- Red AWACS +------------------------------------------------------------------------------------------------------------------------------------------------ + -- Define the event handler class for Red AWACS RedAwacsEventHandler = EVENTHANDLER:New() @@ -35,7 +39,11 @@ RedAwacsEventHandler:HandleEvent(EVENTS.Birth) RedAwacsEventHandler:HandleEvent(EVENTS.Dead) RedAwacsEventHandler:HandleEvent(EVENTS.Hit) --- Define the event handler class for Blue AWACS +------------------------------------------------------------------------------------------------------------------------------------------------ +-- Blue AWACS +------------------------------------------------------------------------------------------------------------------------------------------------ + +-- Define the event handler class for BlueAwacsEventHandler = EVENTHANDLER:New() -- Handle the Birth event for Blue AWACS @@ -70,4 +78,22 @@ Blue_Awacs = SPAWN:New("BLUE EWR AWACS") -- Add the event handler to the Blue AWACS group BlueAwacsEventHandler:HandleEvent(EVENTS.Birth) BlueAwacsEventHandler:HandleEvent(EVENTS.Dead) -BlueAwacsEventHandler:HandleEvent(EVENTS.Hit) \ No newline at end of file +BlueAwacsEventHandler:HandleEvent(EVENTS.Hit) + +-- function to destroy the AWACS if it's alive and then respawn it for the specified coalition. +function ResetAwacs(coalition) + if coalition == "blue" then + Blue_Awacs:Destroy() + Blue_Awacs:Spawn() + elseif coalition == "red" then + Red_Awacs:Destroy() + Red_Awacs:Spawn() + end +end + +-- Create a mission menu to reset the awacs for the specified coalition. +MenuCoalitionBlue = MENU_COALITION:New(coalition.side.BLUE, "Reset AWACS", missionMenu) +MenuCoalitionBlueAwacs = MENU_COALITION_COMMAND:New(coalition.side.BLUE, "Reset Blue AWACS", MenuCoalitionBlue, ResetAwacs, "blue") + +MenuCoalitionRed = MENU_COALITION:New(coalition.side.RED, "Reset AWACS", missionMenu) +MenuCoalitionRedAwacs = MENU_COALITION_COMMAND:New(coalition.side.RED, "Reset Red AWACS", MenuCoalitionRed, ResetAwacs, "red") diff --git a/Moose_.lua b/Moose_.lua index 4edd929..01fa27e 100644 --- a/Moose_.lua +++ b/Moose_.lua @@ -1,4 +1,4 @@ -env.info('*** MOOSE GITHUB Commit Hash ID: 2024-11-18T18:36:47+01:00-75e80a00913b1f49ef1140350f0a2de989939ace ***') +env.info('*** MOOSE GITHUB Commit Hash ID: 2024-11-20T11:15:09+01:00-5747c49abf7b02312ca3502f2e20e9a727698f82 ***') if not MOOSE_DEVELOPMENT_FOLDER then MOOSE_DEVELOPMENT_FOLDER='Scripts' end @@ -105500,6 +105500,14 @@ self.drawZone=true end return self end +function OPSZONE:SetDrawZoneForCoalition(Switch) +if Switch==true then +self.drawZoneForCoalition=true +else +self.drawZoneForCoalition=false +end +return self +end function OPSZONE:SetMarkZone(Switch,ReadOnly) if Switch then self.markZone=true @@ -105653,7 +105661,11 @@ self.ownerCurrent=NewOwnerCoalition if self.drawZone then self.zone:UndrawZone() local color=self:_GetZoneColor() -self.zone:DrawZone(nil,color,1.0,color,0.5) +local coalition=nil +if self.drawZoneForCoalition then +coalition=self.ownerCurrent +end +self.zone:DrawZone(coalition,color,1.0,color,0.5) end for _,_chief in pairs(self.chiefs)do local chief=_chief @@ -105681,7 +105693,11 @@ self.Tattacked=nil if self.drawZone then self.zone:UndrawZone() local color=self:_GetZoneColor() -self.zone:DrawZone(nil,color,1.0,color,0.5) +local coalition=nil +if self.drawZoneForCoalition then +coalition=self.ownerCurrent +end +self.zone:DrawZone(coalition,color,1.0,color,0.5) end end end @@ -105700,7 +105716,11 @@ end if self.drawZone then self.zone:UndrawZone() local color={1,204/255,204/255} -self.zone:DrawZone(nil,color,1.0,color,0.5) +local coalition=nil +if self.drawZoneForCoalition then +coalition=self.ownerCurrent +end +self.zone:DrawZone(coalition,color,1.0,color,0.5) end self:_CleanMissionTable() end @@ -105715,7 +105735,11 @@ end if self.drawZone then self.zone:UndrawZone() local color=self:_GetZoneColor() -self.zone:DrawZone(nil,color,1.0,color,0.2) +local coalition=nil +if self.drawZoneForCoalition then +coalition=self.ownerCurrent +end +self.zone:DrawZone(coalition,color,1.0,color,0.2) end end end @@ -110452,7 +110476,7 @@ DEAD="Dead", DAMAGED="Damaged", } _TARGETID=0 -TARGET.version="0.6.0" +TARGET.version="0.7.0" function TARGET:New(TargetObject) local self=BASE:Inherit(self,FSM:New()) _TARGETID=_TARGETID+1 @@ -110474,7 +110498,7 @@ self:AddTransition("*","ObjectDead","*") self:AddTransition("*","Damaged","Damaged") self:AddTransition("*","Destroyed","Dead") self:AddTransition("*","Dead","Dead") -self:__Start(-1) +self:__Start(-0.1) return self end function TARGET:AddObject(Object) @@ -110581,6 +110605,11 @@ function TARGET:IsAlive() for _,_target in pairs(self.targets)do local target=_target if target.Status~=TARGET.ObjectStatus.DEAD then +if self.isDestroyed then +self:E(self.lid..string.format("ERROR: target is DESTROYED but target object status is not DEAD but %s for object %s",target.Status,target.Name)) +elseif self:IsDead()then +self:E(self.lid..string.format("ERROR: target is DEAD but target object status is not DEAD but %s for object %s",target.Status,target.Name)) +end return true end end @@ -110593,6 +110622,14 @@ function TARGET:IsDead() local is=self:Is("Dead") return is end +function TARGET:IsTargetDead(TargetObject) +local isDead=TargetObject.Status==TARGET.ObjectStatus.DEAD +return isDead +end +function TARGET:IsTargetAlive(TargetObject) +local isAlive=TargetObject.Status==TARGET.ObjectStatus.ALIVE +return isAlive +end function TARGET:onafterStart(From,Event,To) self:T({From,Event,To}) local text=string.format("Starting Target") @@ -110604,7 +110641,6 @@ self:__Status(-1) return self end function TARGET:onafterStatus(From,Event,To) -self:T({From,Event,To}) local fsmstate=self:GetState() local damaged=false for i,_target in pairs(self.targets)do @@ -110618,11 +110654,10 @@ life=target.Life0 self.life0=self.life0+delta end if target.Life object dead now for target object %s!",tostring(target.Name))) self:ObjectDead(target) damaged=true @@ -110632,11 +110667,12 @@ if damaged then self:Damaged() end if self.verbose>=1 then -local text=string.format("%s: Targets=%d/%d Life=%.1f/%.1f Damage=%.1f",fsmstate,self:CountTargets(),self.N0,self:GetLife(),self:GetLife0(),self:GetDamage()) +local text=string.format("%s: Targets=%d/%d [%d, %d], Life=%.1f/%.1f, Damage=%.1f", +fsmstate,self:CountTargets(),self.N0,self.Ndestroyed,self.Ndead,self:GetLife(),self:GetLife0(),self:GetDamage()) if self:CountTargets()==0 or self:GetDamage()>=100 then -text=text.." Dead!" +text=text.." - Dead!" elseif damaged then -text=text.." Damaged!" +text=text.." - Damaged!" end self:I(self.lid..text) end @@ -110645,15 +110681,27 @@ local text="Target:" for i,_target in pairs(self.targets)do local target=_target local damage=(1-target.Life/target.Life0)*100 -text=text..string.format("\n[%d] %s %s %s: Life=%.1f/%.1f, Damage=%.1f",i,target.Type,target.Name,target.Status,target.Life,target.Life0,damage) +text=text..string.format("\n[%d] %s %s %s: Life=%.1f/%.1f, Damage=%.1f, N0=%d, Ndestroyed=%d, Ndead=%d", +i,target.Type,target.Name,target.Status,target.Life,target.Life0,damage,target.N0,target.Ndestroyed,target.Ndead) end self:I(self.lid..text) end -if self:CountTargets()==0 or self:GetDamage()>=100 then +if self:IsAlive()and(self:CountTargets()==0 or self:GetDamage()>=100)then self:Dead() end +for i,_target in pairs(self.targets)do +local target=_target +if target.Ndestroyed>target.N0 then +self:E(self.lid..string.format("ERROR: Number of destroyed target objects greater than number of initial target objects: %d>%d!",target.Ndestroyed,target.N0)) +end +if target.Ndestroyed>target.N0 then +self:E(self.lid..string.format("ERROR: Number of dead target objects greater than number of initial target objects: %d>%d!",target.Ndead,target.N0)) +end +end if self:IsAlive()then self:__Status(-self.TStatus) +else +self:I(self.lid..string.format("Target is not alive any more ==> no further status updates are carried out")) end return self end @@ -110666,6 +110714,8 @@ function TARGET:onafterObjectDestroyed(From,Event,To,Target) self:T({From,Event,To}) self:T(self.lid..string.format("Object %s destroyed",Target.Name)) self.Ndestroyed=self.Ndestroyed+1 +Target.Ndestroyed=Target.Ndestroyed+1 +Target.Life=0 self:ObjectDead(Target) return self end @@ -110673,12 +110723,15 @@ function TARGET:onafterObjectDead(From,Event,To,Target) self:T({From,Event,To}) self:T(self.lid..string.format("Object %s dead",Target.Name)) Target.Status=TARGET.ObjectStatus.DEAD +Target.Ndead=Target.Ndead+1 +Target.Life=0 self.Ndead=self.Ndead+1 local dead=true for _,_target in pairs(self.targets)do local target=_target if target.Status==TARGET.ObjectStatus.ALIVE then dead=false +break end end if dead then @@ -110719,14 +110772,16 @@ if not target then target=self:GetTargetByName(EventData.IniUnitName) end if target then +local Ndead=target.Ndead +local Ndestroyed=target.Ndestroyed if EventData.id==EVENTS.RemoveUnit then -target.Ndead=target.Ndead+1 +Ndead=Ndead+1 else -target.Ndestroyed=target.Ndestroyed+1 -target.Ndead=target.Ndead+1 +Ndestroyed=Ndestroyed+1 +Ndead=Ndead+1 end -if target.Ndead==target.N0 then -if target.Ndestroyed>=target.N0 then +if Ndead==target.N0 then +if Ndestroyed>=target.N0 then self:T2(self.lid..string.format("EVENT ID=%d: target %s dead/lost ==> destroyed",EventData.id,tostring(target.Name))) target.Life=0 self:ObjectDestroyed(target)