diff --git a/Moose Development/Moose/Functional/Mantis.lua b/Moose Development/Moose/Functional/Mantis.lua index 3cfbaa4c9..9bd80659b 100644 --- a/Moose Development/Moose/Functional/Mantis.lua +++ b/Moose Development/Moose/Functional/Mantis.lua @@ -22,7 +22,7 @@ -- @module Functional.Mantis -- @image Functional.Mantis.jpg -- --- Last Update: July 2023 +-- Last Update: Sept 2023 ------------------------------------------------------------------------- --- **MANTIS** class, extends Core.Base#BASE @@ -431,22 +431,24 @@ MANTIS.SamDataCH = { -- units from CH (Military Assets by Currenthill) -- https://www.currenthill.com/ -- group name MUST contain CHM to ID launcher type correctly! - ["2S38 CH"] = { Range=8, Blindspot=0.5, Height=6, Type="Short", Radar="2S38" }, - ["PantsirS1 CH"] = { Range=20, Blindspot=1.2, Height=15, Type="Short", Radar="PantsirS1" }, - ["PantsirS2 CH"] = { Range=30, Blindspot=1.2, Height=18, Type="Medium", Radar="PantsirS2" }, - ["PGL-625 CH"] = { Range=10, Blindspot=0.5, Height=5, Type="Short", Radar="PGL_625" }, - ["HQ-17A CH"] = { Range=20, Blindspot=1.5, Height=10, Type="Short", Radar="HQ17A" }, - ["M903PAC2 CH"] = { Range=160, Blindspot=3, Height=24.5, Type="Long", Radar="MIM104_M903_PAC2" }, - ["M903PAC3 CH"] = { Range=120, Blindspot=1, Height=40, Type="Long", Radar="MIM104_M903_PAC3" }, - ["TorM2 CH"] = { Range=12, Blindspot=1, Height=10, Type="Short", Radar="TorM2" }, - ["TorM2K CH"] = { Range=12, Blindspot=1, Height=10, Type="Short", Radar="TorM2K" }, - ["TorM2M CH"] = { Range=16, Blindspot=1, Height=10, Type="Short", Radar="TorM2M" }, - ["NASAMS3-AMRAAMER CH"] = { Range=50, Blindspot=2, Height=35.7, Type="Medium", Radar="CH_NASAMS3_LN_AMRAAM_ER" }, - ["NASAMS3-AIM9X2 CH"] = { Range=20, Blindspot=0.2, Height=18, Type="Short", Radar="CH_NASAMS3_LN_AIM9X2" }, - ["C-RAM CH"] = { Range=2, Blindspot=0, Height=2, Type="Short", Radar="CH_Centurion_C_RAM" }, - ["PGZ-09 CH"] = { Range=4, Blindspot=0, Height=3, Type="Short", Radar="CH_PGZ09" }, - ["S350-9M100 CH"] = { Range=15, Blindspot=1.5, Height=8, Type="Short", Radar="CH_S350_50P6_9M100" }, - ["S350-9M96D CH"] = { Range=150, Blindspot=2.5, Height=30, Type="Long", Radar="CH_S350_50P6_9M96D" }, + ["2S38 CH"] = { Range=8, Blindspot=0.5, Height=6, Type="Short", Radar="2S38" }, + ["PantsirS1 CH"] = { Range=20, Blindspot=1.2, Height=15, Type="Short", Radar="PantsirS1" }, + ["PantsirS2 CH"] = { Range=30, Blindspot=1.2, Height=18, Type="Medium", Radar="PantsirS2" }, + ["PGL-625 CH"] = { Range=10, Blindspot=0.5, Height=5, Type="Short", Radar="PGL_625" }, + ["HQ-17A CH"] = { Range=20, Blindspot=1.5, Height=10, Type="Short", Radar="HQ17A" }, + ["M903PAC2 CH"] = { Range=160, Blindspot=3, Height=24.5, Type="Long", Radar="MIM104_M903_PAC2" }, + ["M903PAC3 CH"] = { Range=120, Blindspot=1, Height=40, Type="Long", Radar="MIM104_M903_PAC3" }, + ["TorM2 CH"] = { Range=12, Blindspot=1, Height=10, Type="Short", Radar="TorM2" }, + ["TorM2K CH"] = { Range=12, Blindspot=1, Height=10, Type="Short", Radar="TorM2K" }, + ["TorM2M CH"] = { Range=16, Blindspot=1, Height=10, Type="Short", Radar="TorM2M" }, + ["NASAMS3-AMRAAMER CH"] = { Range=50, Blindspot=2, Height=35.7, Type="Medium", Radar="CH_NASAMS3_LN_AMRAAM_ER" }, + ["NASAMS3-AIM9X2 CH"] = { Range=20, Blindspot=0.2, Height=18, Type="Short", Radar="CH_NASAMS3_LN_AIM9X2" }, + ["C-RAM CH"] = { Range=2, Blindspot=0, Height=2, Type="Short", Radar="CH_Centurion_C_RAM" }, + ["PGZ-09 CH"] = { Range=4, Blindspot=0, Height=3, Type="Short", Radar="CH_PGZ09" }, + ["S350-9M100 CH"] = { Range=15, Blindspot=1.5, Height=8, Type="Short", Radar="CH_S350_50P6_9M100" }, + ["S350-9M96D CH"] = { Range=150, Blindspot=2.5, Height=30, Type="Long", Radar="CH_S350_50P6_9M96D" }, + ["LAV-AD CH"] = { Range=8, Blindspot=0.2, Height=4.8, Type="Short", Radar="CH_LAVAD" }, + ["HQ-22 CH"] = { Range=170, Blindspot=5, Height=27, Type="Long", Radar="CH_HQ22_LN" }, } ----------------------------------------------------------------------- @@ -465,6 +467,7 @@ do --@param #string awacs Group name of your Awacs (optional) --@param #boolean EmOnOff Make MANTIS switch Emissions on and off instead of changing the alarm state between RED and GREEN (optional) --@param #number Padding For #SEAD - Extra number of seconds to add to radar switch-back-on time (optional) + --@param #table Zones Table of Core.Zone#ZONE Zones Consider SAM groups in this zone(s) only for this MANTIS instance, must be handed as #table of Zone objects --@return #MANTIS self --@usage Start up your MANTIS with a basic setting -- @@ -483,7 +486,7 @@ do -- mybluemantis = MANTIS:New("bluemantis","Blue SAM","Blue EWR",nil,"blue",false,"Blue Awacs") -- mybluemantis:Start() -- - function MANTIS:New(name,samprefix,ewrprefix,hq,coalition,dynamic,awacs, EmOnOff, Padding) + function MANTIS:New(name,samprefix,ewrprefix,hq,coalition,dynamic,awacs, EmOnOff, Padding, Zones) -- DONE: Create some user functions for these -- DONE: Make HQ useful @@ -544,6 +547,7 @@ do self.maxclassic = 6 self.autoshorad = true self.ShoradGroupSet = SET_GROUP:New() -- Core.Set#SET_GROUP + self.FilterZones = Zones self.UseEmOnOff = true if EmOnOff == false then @@ -593,16 +597,23 @@ do self:T({self.ewr_templates}) + self.SAM_Group = SET_GROUP:New():FilterPrefixes(self.SAM_Templates_Prefix):FilterCoalitions(self.Coalition) + self.EWR_Group = SET_GROUP:New():FilterPrefixes(self.ewr_templates):FilterCoalitions(self.Coalition) + + if self.FilterZones then + self.SAM_Group:FilterZones(self.FilterZones) + end + if self.dynamic then -- Set SAM SET_GROUP - self.SAM_Group = SET_GROUP:New():FilterPrefixes(self.SAM_Templates_Prefix):FilterCoalitions(self.Coalition):FilterStart() + self.SAM_Group:FilterStart() -- Set EWR SET_GROUP - self.EWR_Group = SET_GROUP:New():FilterPrefixes(self.ewr_templates):FilterCoalitions(self.Coalition):FilterStart() + self.EWR_Group:FilterStart() else -- Set SAM SET_GROUP - self.SAM_Group = SET_GROUP:New():FilterPrefixes(self.SAM_Templates_Prefix):FilterCoalitions(self.Coalition):FilterOnce() + self.SAM_Group:FilterOnce() -- Set EWR SET_GROUP - self.EWR_Group = SET_GROUP:New():FilterPrefixes(self.ewr_templates):FilterCoalitions(self.Coalition):FilterOnce() + self.EWR_Group:FilterOnce() end -- set up CC @@ -612,7 +623,7 @@ do -- TODO Version -- @field #string version - self.version="0.8.11" + self.version="0.8.14" self:I(string.format("***** Starting MANTIS Version %s *****", self.version)) --- FSM Functions --- diff --git a/Moose Development/Moose/Ops/Airboss.lua b/Moose Development/Moose/Ops/Airboss.lua index ca554f823..56546d662 100644 --- a/Moose Development/Moose/Ops/Airboss.lua +++ b/Moose Development/Moose/Ops/Airboss.lua @@ -2543,7 +2543,7 @@ function AIRBOSS:AddRecoveryWindow( starttime, stoptime, case, holdingoffset, tu return self end if Tstop <= Tnow then - self:I( string.format( "WARNING: Recovery stop time %s already over. Tnow=%s! Recovery window rejected.", UTILS.SecondsToClock( Tstop ), UTILS.SecondsToClock( Tnow ) ) ) + string.format( "WARNING: Recovery stop time %s already over. Tnow=%s! Recovery window rejected.", UTILS.SecondsToClock( Tstop ), UTILS.SecondsToClock( Tnow ) ) return self end @@ -3258,7 +3258,7 @@ function AIRBOSS:SoundCheckLSO( delay ) end -- Debug message. - self:I( self.lid .. text ) + self:T( self.lid .. text ) end end @@ -3293,7 +3293,7 @@ function AIRBOSS:SoundCheckMarshal( delay ) end -- Debug message. - self:I( self.lid .. text ) + self:T( self.lid .. text ) end end @@ -3684,7 +3684,7 @@ function AIRBOSS:onafterStatus( From, Event, To ) if i == 0 then text = text .. " none" end - self:I( self.lid .. text ) + self:T( self.lid .. text ) -- Check for collision. if collision then @@ -5459,6 +5459,7 @@ function AIRBOSS:_GetAircraftParameters( playerData, step ) local skyhawk = playerData.actype == AIRBOSS.AircraftCarrier.A4EC local tomcat = playerData.actype == AIRBOSS.AircraftCarrier.F14A or playerData.actype == AIRBOSS.AircraftCarrier.F14B local harrier = playerData.actype == AIRBOSS.AircraftCarrier.AV8B + local goshawk = playerData.actype == AIRBOSS.AircraftCarrier.T45C -- Return values. local alt @@ -5924,6 +5925,7 @@ function AIRBOSS:_ScanCarrierZone() -- Get aircraft type name. local actype = group:GetTypeName() + -- Create a new flight group if knownflight then -- Debug output. @@ -6958,7 +6960,7 @@ function AIRBOSS:_GetFreeStack( ai, case, empty ) end - self:I( self.lid .. string.format( "Returning free stack %s", tostring( nfree ) ) ) + self:T( self.lid .. string.format( "Returning free stack %s", tostring( nfree ) ) ) return nfree end @@ -7892,7 +7894,7 @@ function AIRBOSS:_RemoveFlight( flight, completely ) -- Remove player from players table. local playerdata = self.players[flight.name] if playerdata then - self:I( self.lid .. string.format( "Removing player %s completely.", flight.name ) ) + self:T( self.lid .. string.format( "Removing player %s completely.", flight.name ) ) self.players[flight.name] = nil end @@ -14756,38 +14758,43 @@ function AIRBOSS:RadioTransmission( radio, call, loud, delay, interval, click, p if self:_IsOnboard( call.modexreceiver ) then self:_Number2Radio( radio, call.modexreceiver, delay, 0.3, pilotcall ) end - + -- Add transmission to the right queue. local caller = "" if radio.alias == "LSO" then - + table.insert( self.RQLSO, transmission ) - + caller = "LSOCall" - + -- Schedule radio queue checks. if not self.RQLid then self:T( self.lid .. string.format( "Starting LSO radio queue." ) ) self.RQLid = self.radiotimer:Schedule( nil, AIRBOSS._CheckRadioQueue, { self, self.RQLSO, "LSO" }, 0.02, 0.05 ) end - + elseif radio.alias == "MARSHAL" then - + table.insert( self.RQMarshal, transmission ) - + caller = "MarshalCall" - + if not self.RQMid then self:T( self.lid .. string.format( "Starting Marhal radio queue." ) ) self.RQMid = self.radiotimer:Schedule( nil, AIRBOSS._CheckRadioQueue, { self, self.RQMarshal, "MARSHAL" }, 0.02, 0.05 ) end - + end - + -- Append radio click sound at the end of the transmission. if click then self:RadioTransmission( radio, self[caller].CLICK, false, delay ) end + + else + -- SRS transmission + if call.subtitle ~= nil and string.len(call.subtitle) > 1 then + else -- SRS transmission @@ -14861,11 +14868,11 @@ function AIRBOSS:SetSRSPilotVoice( Voice, Gender, Culture ) self.PilotRadio.voice = Voice or MSRS.Voices.Microsoft.David self.PilotRadio.gender = Gender or "male" self.PilotRadio.culture = Culture or "en-US" - + if (not Voice) and self.SRS and self.SRS.google then self.PilotRadio.voice = MSRS.Voices.Google.Standard.en_US_Standard_J end - + return self end @@ -15632,7 +15639,7 @@ function AIRBOSS:_LSOCallAircraftBall( modex, nickname, fuelstate ) local text = string.format( "%s Ball, %.1f.", nickname, fuelstate ) -- Debug message. - self:I( self.lid .. text ) + self:T( self.lid .. text ) -- Nickname UPPERCASE. local NICKNAME = nickname:upper() @@ -15668,7 +15675,7 @@ function AIRBOSS:_MarshalCallGasAtTanker( modex ) local text = string.format( "Bingo fuel! Going for gas at the recovery tanker." ) -- Debug message. - self:I( self.lid .. text ) + self:T( self.lid .. text ) -- Create new call to display complete subtitle. @@ -15692,7 +15699,7 @@ function AIRBOSS:_MarshalCallGasAtDivert( modex, divertname ) local text = string.format( "Bingo fuel! Going for gas at divert field %s.", divertname ) -- Debug message. - self:I( self.lid .. text ) + self:T( self.lid .. text ) -- Create new call to display complete subtitle. local call = self:_NewRadioCall( self.PilotCall.BINGOFUEL, modex, text, self.Tmessage, nil, modex ) @@ -15714,7 +15721,7 @@ function AIRBOSS:_MarshalCallRecoveryStopped( case ) local text = string.format( "Case %d recovery ops are stopped. Deck is closed.", case ) -- Debug message. - self:I( self.lid .. text ) + self:T( self.lid .. text ) -- Create new call to display complete subtitle. local call = self:_NewRadioCall( self.MarshalCall.CASE, "AIRBOSS", text, self.Tmessage, "99" ) @@ -15755,7 +15762,7 @@ function AIRBOSS:_MarshalCallRecoveryPausedResumedAt( clock ) local text = string.format( "aircraft recovery is paused and will be resumed at %s.", clock ) -- Debug message. - self:I( self.lid .. text ) + self:T( self.lid .. text ) -- Create new call with full subtitle. local call = self:_NewRadioCall( self.MarshalCall.RECOVERYPAUSEDRESUMED, "AIRBOSS", text, self.Tmessage, "99" ) @@ -15782,7 +15789,7 @@ function AIRBOSS:_MarshalCallClearedForRecovery( modex, case ) local text = string.format( "you're cleared for Case %d recovery.", case ) -- Debug message. - self:I( self.lid .. text ) + self:T( self.lid .. text ) -- Create new call with full subtitle. local call = self:_NewRadioCall( self.MarshalCall.CLEAREDFORRECOVERY, "MARSHAL", text, self.Tmessage, modex ) @@ -15820,7 +15827,7 @@ function AIRBOSS:_MarshalCallNewFinalBearing( FB ) local text = string.format( "new final bearing %03d°.", FB ) -- Debug message. - self:I( self.lid .. text ) + self:T( self.lid .. text ) -- Create new call with full subtitle. local call = self:_NewRadioCall( self.MarshalCall.NEWFB, "AIRBOSS", text, self.Tmessage, "99" ) @@ -15843,7 +15850,7 @@ function AIRBOSS:_MarshalCallCarrierTurnTo( hdg ) local text = string.format( "carrier is now starting turn to heading %03d°.", hdg ) -- Debug message. - self:I( self.lid .. text ) + self:T( self.lid .. text ) -- Create new call with full subtitle. local call = self:_NewRadioCall( self.MarshalCall.CARRIERTURNTOHEADING, "AIRBOSS", text, self.Tmessage, "99" ) @@ -15874,7 +15881,7 @@ function AIRBOSS:_MarshalCallStackFull( modex, nwaiting ) end -- Debug message. - self:I( self.lid .. text ) + self:T( self.lid .. text ) -- Create new call with full subtitle. local call = self:_NewRadioCall( self.MarshalCall.STACKFULL, "AIRBOSS", text, self.Tmessage, modex ) @@ -15945,7 +15952,7 @@ function AIRBOSS:_MarshalCallArrived( modex, case, brc, altitude, charlie, qfe ) local text = string.format( "Case %d, expected BRC %03d°, hold at angels %d. Expected Charlie Time %s. Altimeter %.2f. Report see me.", case, brc, angels, charlie, qfe ) -- Debug message. - self:I( self.lid .. text ) + self:T( self.lid .. text ) -- Create new call to display complete subtitle. local casecall = self:_NewRadioCall( self.MarshalCall.CASE, "MARSHAL", text, self.Tmessage, modex ) diff --git a/Moose Development/Moose/Ops/Auftrag.lua b/Moose Development/Moose/Ops/Auftrag.lua index 1bf4f8710..46b957dd7 100644 --- a/Moose Development/Moose/Ops/Auftrag.lua +++ b/Moose Development/Moose/Ops/Auftrag.lua @@ -1312,8 +1312,11 @@ function AUFTRAG:NewCAP(ZoneCAP, Altitude, Speed, Coordinate, Heading, Leg, Targ -- Ensure given TargetTypes parameter is a table. TargetTypes=UTILS.EnsureTable(TargetTypes, true) + -- Set default altitude if not specified. + Altitude = Altitude or 10000 + -- Create ORBIT first. - local mission=AUFTRAG:NewORBIT(Coordinate or ZoneCAP:GetCoordinate(), Altitude or 10000, Speed or 350, Heading, Leg) + local mission=AUFTRAG:NewORBIT(Coordinate or ZoneCAP:GetCoordinate(), Altitude, Speed or 350, Heading, Leg) -- Mission type CAP. mission.type=AUFTRAG.Type.CAP diff --git a/Moose Development/Moose/Ops/OpsGroup.lua b/Moose Development/Moose/Ops/OpsGroup.lua index 3e03fc39d..c628cf603 100644 --- a/Moose Development/Moose/Ops/OpsGroup.lua +++ b/Moose Development/Moose/Ops/OpsGroup.lua @@ -9444,6 +9444,7 @@ function OPSGROUP:onafterLoading(From, Event, To) local weight=nil if cargo.type==OPSTRANSPORT.CargoType.OPSGROUP then + -- Get total weight of group. weight=cargo.opsgroup:GetWeightTotal() -- Find a carrier for this cargo. @@ -9582,8 +9583,10 @@ function OPSGROUP:onafterLoad(From, Event, To, CargoGroup, Carrier) -- No carrier provided. if not carrier then + -- Get total weight of group. + local weight=CargoGroup:GetWeightTotal() -- Try to find a carrier manually. - carrier=self:FindCarrierForCargo(CargoGroup) + carrier=self:FindCarrierForCargo(weight) end if carrier then