From e6f9b4a125669cb577fc2a3ec36842ccd0b41c4e Mon Sep 17 00:00:00 2001 From: Lt Cdr Gavin Edwards Date: Sat, 26 Mar 2022 11:54:53 -0700 Subject: [PATCH 1/2] Added Hermes section to Airboss. Will require tuning. --- Moose Development/Moose/Ops/Airboss.lua | 104 ++++++++++++++++++------ 1 file changed, 81 insertions(+), 23 deletions(-) diff --git a/Moose Development/Moose/Ops/Airboss.lua b/Moose Development/Moose/Ops/Airboss.lua index d2d0f6657..856ace33a 100644 --- a/Moose Development/Moose/Ops/Airboss.lua +++ b/Moose Development/Moose/Ops/Airboss.lua @@ -1,5 +1,3 @@ ---- **Ops** - Manages aircraft CASE X recoveries for carrier operations (X=I, II, III). --- -- The AIRBOSS class manages recoveries of human pilots and AI aircraft on aircraft carriers. -- -- **Main Features:** @@ -32,6 +30,7 @@ -- * [USS George Washington](https://en.wikipedia.org/wiki/USS_George_Washington_(CVN-73)) (CVN-73) [Super Carrier Module] -- * [USS Harry S. Truman](https://en.wikipedia.org/wiki/USS_Harry_S._Truman) (CVN-75) [Super Carrier Module] -- * [USS Forrestal](https://en.wikipedia.org/wiki/USS_Forrestal_(CV-59)) (CV-59) [Heatblur Carrier Module] +-- * [HMS Hermes](https://en.wikipedia.org/wiki/HMS_Hermes_(R12)) (R12) [**WIP**] -- * [USS Tarawa](https://en.wikipedia.org/wiki/USS_Tarawa_(LHA-1)) (LHA-1) [**WIP**] -- * [USS America](https://en.wikipedia.org/wiki/USS_America_(LHA-6)) (LHA-6) [**WIP**] -- * [Juan Carlos I](https://en.wikipedia.org/wiki/Spanish_amphibious_assault_ship_Juan_Carlos_I) (L61) [**WIP**] @@ -51,7 +50,7 @@ -- -- At the moment, optimized parameters are available for the F/A-18C Hornet (Lot 20) and A-4E community mod as aircraft and the USS John C. Stennis as carrier. -- --- The AV-8B Harrier, the USS Tarawa, USS America, HMAS Canberra and Juan Carlos I are WIP. The AV-8B harrier and the LHA's and LHD can only be used together, i.e. these ships are the only carriers the harrier is supposed to land on and +-- The AV-8B Harrier, HMS Hermes, the USS Tarawa, USS America, HMAS Canberra, and Juan Carlos I are WIP. The AV-8B harrier and the LHA's and LHD can only be used together, i.e. these ships are the only carriers the harrier is supposed to land on and -- no other fixed wing aircraft (human or AI controlled) are supposed to land on these ships. Currently only Case I is supported. Case II/III take slightly different steps from the CVN carrier. -- However, the two Case II/III pattern are very similar so this is not a big drawback. -- @@ -1260,7 +1259,7 @@ AIRBOSS = { --- Aircraft types capable of landing on carrier (human+AI). -- @type AIRBOSS.AircraftCarrier --- @field #string AV8B AV-8B Night Harrier. Works only with the USS Tarawa, USS America and Juan Carlos I. +-- @field #string AV8B AV-8B Night Harrier. Works only with the HMS Hermes, USS Tarawa, USS America, and Juan Carlos I. -- @field #string A4EC A-4E Community mod. -- @field #string HORNET F/A-18C Lot 20 Hornet by Eagle Dynamics. -- @field #string F14A F-14A by Heatblur. @@ -1296,6 +1295,7 @@ AIRBOSS.AircraftCarrier={ -- @field #string TRUMAN USS Harry S. Truman (CVN-75) [Super Carrier Module] -- @field #string FORRESTAL USS Forrestal (CV-59) [Heatblur Carrier Module] -- @field #string VINSON USS Carl Vinson (CVN-70) [Obsolete] +-- @field #string HERMES HMS Hermes (R12) [V/STOL Carrier] -- @field #string TARAWA USS Tarawa (LHA-1) [V/STOL Carrier] -- @field #string AMERICA USS America (LHA-6) [V/STOL Carrier] -- @field #string JCARLOS Juan Carlos I (L61) [V/STOL Carrier] @@ -1309,6 +1309,7 @@ AIRBOSS.CarrierType = { STENNIS = "Stennis", FORRESTAL = "Forrestal", VINSON = "VINSON", + HERMES = "HERMES81", TARAWA = "LHA_Tarawa", AMERICA = "USS America LHA-6", JCARLOS = "L61", @@ -1980,6 +1981,9 @@ function AIRBOSS:New( carriername, alias ) elseif self.carriertype == AIRBOSS.CarrierType.VINSON then -- TODO: Carl Vinson parameters. self:_InitStennis() + elseif self.carriertype == AIRBOSS.CarrierType.HERMES then + -- Hermes parameters. + self:_InitHermes() elseif self.carriertype == AIRBOSS.CarrierType.TARAWA then -- Tarawa parameters. self:_InitTarawa() @@ -2082,7 +2086,7 @@ function AIRBOSS:New( carriername, alias ) -- cL:FlareYellow() -- Carrier specific. - if self.carrier:GetTypeName() ~= AIRBOSS.CarrierType.TARAWA or self.carrier:GetTypeName() ~= AIRBOSS.CarrierType.AMERICA or self.carrier:GetTypeName() ~= AIRBOSS.CarrierType.JCARLOS or self.carrier:GetTypeName() ~= AIRBOSS.CarrierType.CANBERRA then + if self.carrier:GetTypeName() ~= AIRBOSS.CarrierType.HERMES or self.carrier:GetTypeName() ~= AIRBOSS.CarrierType.TARAWA or self.carrier:GetTypeName() ~= AIRBOSS.CarrierType.AMERICA or self.carrier:GetTypeName() ~= AIRBOSS.CarrierType.JCARLOS or self.carrier:GetTypeName() ~= AIRBOSS.CarrierType.CANBERRA then -- Flare wires. local w1 = stern:Translate( self.carrierparam.wire1, FB, true ) @@ -4384,6 +4388,46 @@ function AIRBOSS:_InitForrestal() end +--- Init parameters for R12 HMS Hermes carrier. +-- @param #AIRBOSS self +function AIRBOSS:_InitHermes() + + -- Init Stennis as default. + self:_InitStennis() + + -- Carrier Parameters. + self.carrierparam.sterndist = -105 + self.carrierparam.deckheight = 12 -- From model viewer WL0. + + -- Total size of the carrier (approx as rectangle). + self.carrierparam.totlength = 228.19 + self.carrierparam.totwidthport = 20.5 + self.carrierparam.totwidthstarboard = 24.5 + + -- Landing runway. + self.carrierparam.rwyangle = 0 + self.carrierparam.rwylength = 215 + self.carrierparam.rwywidth = 13 + + -- Wires. + self.carrierparam.wire1 = nil + self.carrierparam.wire2 = nil + self.carrierparam.wire3 = nil + self.carrierparam.wire4 = nil + + -- Late break. + self.BreakLate.name = "Late Break" + self.BreakLate.Xmin = -UTILS.NMToMeters( 1 ) -- Not more than 1 NM behind the boat. Last check was at 0. + self.BreakLate.Xmax = UTILS.NMToMeters( 5 ) -- Not more than 5 NM in front of the boat. Enough for late breaks? + self.BreakLate.Zmin = -UTILS.NMToMeters( 0.25 ) -- Not more than 0.25 NM port. + self.BreakLate.Zmax = UTILS.NMToMeters( 0.5 ) -- Not more than 0.5 NM starboard. + self.BreakLate.LimitXmin = 0 -- Check and next step 0.8 NM port and in front of boat. + self.BreakLate.LimitXmax = nil + self.BreakLate.LimitZmin = -UTILS.NMToMeters( 0.5 ) -- 926 m port, closer than the stennis as abeam is 0.8-1.0 rather than 1.2 + self.BreakLate.LimitZmax = nil + +end + --- Init parameters for LHA-1 Tarawa carrier. -- @param #AIRBOSS self function AIRBOSS:_InitTarawa() @@ -6209,7 +6253,7 @@ function AIRBOSS:_GetMarshalAltitude( stack, case ) p2 = Carrier:Translate( UTILS.NMToMeters( 1.5 ), hdg ) -- Tarawa,LHA,LHD Delta patterns. - if self.carriertype == AIRBOSS.CarrierType.TARAWA or self.carriertype == AIRBOSS.CarrierType.AMERICA or self.carriertype == AIRBOSS.CarrierType.JCARLOS or self.carriertype == AIRBOSS.CarrierType.CANBERRA then + if self.carriertype == AIRBOSS.CarrierType.HERMES or self.carriertype == AIRBOSS.CarrierType.TARAWA or self.carriertype == AIRBOSS.CarrierType.AMERICA or self.carriertype == AIRBOSS.CarrierType.JCARLOS or self.carriertype == AIRBOSS.CarrierType.CANBERRA then -- Pattern is directly overhead the carrier. p1 = Carrier:Translate( UTILS.NMToMeters( 1.0 ), hdg + 90 ) @@ -8048,7 +8092,7 @@ function AIRBOSS:OnEventLand( EventData ) self:T( self.lid .. text ) -- Check carrier type. - if self.carriertype == AIRBOSS.CarrierType.TARAWA or self.carriertype == AIRBOSS.CarrierType.AMERICA or self.carriertype == AIRBOSS.CarrierType.JCARLOS or self.carriertype == AIRBOSS.CarrierType.CANBERRA then + if self.carriertype == AIRBOSS.CarrierType.HERMES or self.carriertype == AIRBOSS.CarrierType.TARAWA or self.carriertype == AIRBOSS.CarrierType.AMERICA or self.carriertype == AIRBOSS.CarrierType.JCARLOS or self.carriertype == AIRBOSS.CarrierType.CANBERRA then -- Power "Idle". self:RadioTransmission( self.LSORadio, self.LSOCall.IDLE, false, 1, nil, true ) @@ -8083,7 +8127,7 @@ function AIRBOSS:OnEventLand( EventData ) -- AI unit landed -- -------------------- - if self.carriertype ~= AIRBOSS.CarrierType.TARAWA or self.carriertype ~= AIRBOSS.CarrierType.AMERICA or self.carriertype ~= AIRBOSS.CarrierType.JCARLOS or self.carriertype ~= AIRBOSS.CarrierType.CANBERRA then + if self.carriertype ~= AIRBOSS.CarrierType.HERMES or self.carriertype ~= AIRBOSS.CarrierType.TARAWA or self.carriertype ~= AIRBOSS.CarrierType.AMERICA or self.carriertype ~= AIRBOSS.CarrierType.JCARLOS or self.carriertype ~= AIRBOSS.CarrierType.CANBERRA then -- Coordinate at landing event local coord = EventData.IniUnit:GetCoordinate() @@ -9121,7 +9165,7 @@ function AIRBOSS:_CheckForLongDownwind( playerData ) local limit = UTILS.NMToMeters( -1.6 ) -- For the tarawa, other LHA and LHD we give a bit more space. - if self.carriertype == AIRBOSS.CarrierType.TARAWA or self.carriertype == AIRBOSS.CarrierType.AMERICA or self.carriertype == AIRBOSS.CarrierType.JCARLOS or self.carriertype == AIRBOSS.CarrierType.CANBERRA then + if self.carriertype == AIRBOSS.CarrierType.HERMES or self.carriertype == AIRBOSS.CarrierType.TARAWA or self.carriertype == AIRBOSS.CarrierType.AMERICA or self.carriertype == AIRBOSS.CarrierType.JCARLOS or self.carriertype == AIRBOSS.CarrierType.CANBERRA then limit = UTILS.NMToMeters( -2.0 ) end @@ -9208,7 +9252,7 @@ function AIRBOSS:_Ninety( playerData ) self:_PlayerHint( playerData ) -- Next step: wake. - if self.carriertype == AIRBOSS.CarrierType.TARAWA or self.carriertype == AIRBOSS.CarrierType.AMERICA or self.carriertype == AIRBOSS.CarrierType.JCARLOS or self.carriertype == AIRBOSS.CarrierType.CANBERRA then + if self.carriertype == AIRBOSS.CarrierType.HERMES or self.carriertype == AIRBOSS.CarrierType.TARAWA or self.carriertype == AIRBOSS.CarrierType.AMERICA or self.carriertype == AIRBOSS.CarrierType.JCARLOS or self.carriertype == AIRBOSS.CarrierType.CANBERRA then -- Harrier has no wake stop. It stays port of the boat. self:_SetPlayerStep( playerData, AIRBOSS.PatternStep.FINAL ) else @@ -9726,9 +9770,8 @@ function AIRBOSS:_CheckWaveOff( glideslopeError, lineupError, AoA, playerData ) -- For the harrier, we allow a bit more room. if playerData.actype == AIRBOSS.AircraftCarrier.AV8B then glMax = 2.6 - glMin = -2.0 + glMin = -2.6 -- Testing, @Engines may be just dragging it in on Hermes, or the carrier parameters need adjusting. luAbs = 4.1 -- Testing Pene (WIP) needs feedback to tighten up tolerences. - end -- Too high or too low? @@ -9900,7 +9943,7 @@ function AIRBOSS:_GetSternCoord() -- local stern=self:GetCoordinate() -- Stern coordinate (sterndist<0). - if self.carriertype == AIRBOSS.CarrierType.TARAWA or self.carriertype == AIRBOSS.CarrierType.AMERICA or self.carriertype == AIRBOSS.CarrierType.JCARLOS or self.carriertype == AIRBOSS.CarrierType.CANBERRA then + if self.carriertype == AIRBOSS.CarrierType.HERMES or self.carriertype == AIRBOSS.CarrierType.TARAWA or self.carriertype == AIRBOSS.CarrierType.AMERICA or self.carriertype == AIRBOSS.CarrierType.JCARLOS or self.carriertype == AIRBOSS.CarrierType.CANBERRA then -- Tarawa: Translate 8 meters port. self.sterncoord:Translate( self.carrierparam.sterndist, hdg, true, true ):Translate( 8, FB - 90, true, true ) elseif self.carriertype == AIRBOSS.CarrierType.STENNIS then @@ -10536,7 +10579,7 @@ function AIRBOSS:_GetZoneRunwayBox() return self.zoneRunwaybox end ---- Get zone of primary abeam landing position of USS Tarawa, USS America and Juan Carlos. Box length 50 meters and width 30 meters. +--- Get zone of primary abeam landing position of HMS Hermes, USS Tarawa, USS America and Juan Carlos. Box length 50 meters and width 30 meters. --- Allow for Clear to land call from LSO approaching abeam the landing spot if stable as per NATOPS 00-80T -- @param #AIRBOSS self -- @return Core.Zone#ZONE_POLYGON Zone surrounding landing runway. @@ -10640,7 +10683,7 @@ function AIRBOSS:_GetZoneHolding( case, stack ) self.zoneHolding = ZONE_RADIUS:New( "CASE I Holding Zone", Post:GetVec2(), self.marshalradius ) -- Delta pattern. - if self.carriertype == AIRBOSS.CarrierType.TARAWA or self.carriertype == AIRBOSS.CarrierType.AMERICA or self.carriertype == AIRBOSS.CarrierType.JCARLOS or self.carriertype == AIRBOSS.CarrierType.CANBERRA then + if self.carriertype == AIRBOSS.CarrierType.HERMES or self.carriertype == AIRBOSS.CarrierType.TARAWA or self.carriertype == AIRBOSS.CarrierType.AMERICA or self.carriertype == AIRBOSS.CarrierType.JCARLOS or self.carriertype == AIRBOSS.CarrierType.CANBERRA then self.zoneHolding = ZONE_RADIUS:New( "CASE I Holding Zone", self.carrier:GetVec2(), UTILS.NMToMeters( 5 ) ) end @@ -10692,7 +10735,7 @@ function AIRBOSS:_GetZoneCommence( case, stack ) -- Three position local Three = self:GetCoordinate():Translate( D, hdg + 275 ) - if self.carriertype == AIRBOSS.CarrierType.TARAWA or self.carriertype == AIRBOSS.CarrierType.AMERICA or self.carriertype == AIRBOSS.CarrierType.JCARLOS or self.carriertype == AIRBOSS.CarrierType.CANBERRA then + if self.carriertype == AIRBOSS.CarrierType.HERMES or self.carriertype == AIRBOSS.CarrierType.TARAWA or self.carriertype == AIRBOSS.CarrierType.AMERICA or self.carriertype == AIRBOSS.CarrierType.JCARLOS or self.carriertype == AIRBOSS.CarrierType.CANBERRA then local Dx = UTILS.NMToMeters( 2.25 ) @@ -10997,9 +11040,17 @@ function AIRBOSS:_GetOptLandingCoordinate() -- Final bearing. local FB = self:GetFinalBearing( false ) - if self.carriertype == AIRBOSS.CarrierType.TARAWA then + if self.carriertype == AIRBOSS.CarrierType.HERMES then - -- Landing 100 ft abeam, 120 ft alt. + -- Landing 100 ft abeam, 100 ft alt. + self.landingcoord:UpdateFromCoordinate( self:_GetLandingSpotCoordinate() ):Translate( 25, FB - 90, true, true ) + -- stern=self:_GetLandingSpotCoordinate():Translate(35, FB-90) + + -- Alitude 100 ft. + self.landingcoord:SetAltitude( UTILS.FeetToMeters( 100 ) ) + elseif self.carriertype == AIRBOSS.CarrierType.TARAWA then + + -- Landing 100 ft abeam, 100 ft alt. self.landingcoord:UpdateFromCoordinate( self:_GetLandingSpotCoordinate() ):Translate( 35, FB - 90, true, true ) -- stern=self:_GetLandingSpotCoordinate():Translate(35, FB-90) @@ -11059,7 +11110,14 @@ function AIRBOSS:_GetLandingSpotCoordinate() -- Stern coordinate. -- local stern=self:_GetSternCoord() - if self.carriertype == AIRBOSS.CarrierType.TARAWA then + if self.carriertype == AIRBOSS.CarrierType.HERMES then + + -- Landing 100 ft abeam, 100 alt. + local hdg = self:GetHeading() + + -- Primary landing spot 5 + self.landingspotcoord:Translate( 69, hdg, true, true ):SetAltitude( self.carrierparam.deckheight ) + elseif self.carriertype == AIRBOSS.CarrierType.TARAWA then -- Landing 100 ft abeam, 120 alt. local hdg = self:GetHeading() @@ -11994,7 +12052,7 @@ function AIRBOSS:_GS( step, n ) if n == -1 then gp = AIRBOSS.GroovePos.IC elseif n == 1 then - if self.carriertype == AIRBOSS.CarrierType.TARAWA or self.carriertype == AIRBOSS.CarrierType.AMERICA or self.carriertype == AIRBOSS.CarrierType.JCARLOS or self.carriertype == AIRBOSS.CarrierType.CANBERRA then + if self.carriertype == AIRBOSS.CarrierType.HERMES or self.carriertype == AIRBOSS.CarrierType.TARAWA or self.carriertype == AIRBOSS.CarrierType.AMERICA or self.carriertype == AIRBOSS.CarrierType.JCARLOS or self.carriertype == AIRBOSS.CarrierType.CANBERRA then gp = AIRBOSS.GroovePos.AL else gp = AIRBOSS.GroovePos.IW @@ -13873,7 +13931,7 @@ function AIRBOSS:_IsCarrierAircraft( unit ) -- Special case for Harrier which can only land on Tarawa, LHA and LHD. if aircrafttype == AIRBOSS.AircraftCarrier.AV8B then - if self.carriertype == AIRBOSS.CarrierType.TARAWA or self.carriertype == AIRBOSS.CarrierType.AMERICA or self.carriertype == AIRBOSS.CarrierType.JCARLOS or self.carriertype == AIRBOSS.CarrierType.CANBERRA then + if self.carriertype == AIRBOSS.CarrierType.HERMES or self.carriertype == AIRBOSS.CarrierType.TARAWA or self.carriertype == AIRBOSS.CarrierType.AMERICA or self.carriertype == AIRBOSS.CarrierType.JCARLOS or self.carriertype == AIRBOSS.CarrierType.CANBERRA then return true else return false @@ -13881,7 +13939,7 @@ function AIRBOSS:_IsCarrierAircraft( unit ) end -- Also only Harriers can land on the Tarawa, LHA and LHD. - if self.carriertype == AIRBOSS.CarrierType.TARAWA or self.carriertype == AIRBOSS.CarrierType.AMERICA or self.carriertype == AIRBOSS.CarrierType.JCARLOS or self.carriertype == AIRBOSS.CarrierType.CANBERRA then + if self.carriertype == AIRBOSS.CarrierType.HERMES or self.carriertype == AIRBOSS.CarrierType.TARAWA or self.carriertype == AIRBOSS.CarrierType.AMERICA or self.carriertype == AIRBOSS.CarrierType.JCARLOS or self.carriertype == AIRBOSS.CarrierType.CANBERRA then if aircrafttype ~= AIRBOSS.AircraftCarrier.AV8B then return false end @@ -17238,7 +17296,7 @@ function AIRBOSS:_MarkCaseZones( _unitName, flare ) end -- Tarawa, LHA and LHD landing spots. - if self.carriertype == AIRBOSS.CarrierType.TARAWA or self.carriertype == AIRBOSS.CarrierType.AMERICA or self.carriertype == AIRBOSS.CarrierType.JCARLOS or self.carriertype == AIRBOSS.CarrierType.CANBERRA then + if self.carriertype == AIRBOSS.CarrierType.HERMES or self.carriertype == AIRBOSS.CarrierType.TARAWA or self.carriertype == AIRBOSS.CarrierType.AMERICA or self.carriertype == AIRBOSS.CarrierType.JCARLOS or self.carriertype == AIRBOSS.CarrierType.CANBERRA then text = text .. "\n* abeam landing stop with RED flares" -- Abeam landing spot zone. local ALSPT = self:_GetZoneAbeamLandingSpot() From b1e5e1840eae8e7e3cb0f6d170f0fa79cab43895 Mon Sep 17 00:00:00 2001 From: Lt Cdr Gavin Edwards Date: Sat, 26 Mar 2022 15:23:38 -0700 Subject: [PATCH 2/2] Adding leading lines that I accidentally truncated. --- .vs/VSWorkspaceState.json | 10 ++++++++++ .vs/slnx.sqlite | Bin 0 -> 98304 bytes Moose Development/Moose/Ops/Airboss.lua | 2 ++ 3 files changed, 12 insertions(+) create mode 100644 .vs/VSWorkspaceState.json create mode 100644 .vs/slnx.sqlite diff --git a/.vs/VSWorkspaceState.json b/.vs/VSWorkspaceState.json new file mode 100644 index 000000000..4e376c288 --- /dev/null +++ b/.vs/VSWorkspaceState.json @@ -0,0 +1,10 @@ +{ + "ExpandedNodes": [ + "", + "\\Moose Development", + "\\Moose Development\\Moose", + "\\Moose Development\\Moose\\Ops" + ], + "SelectedNode": "\\Moose Development\\Moose\\Ops\\Airboss.lua", + "PreviewInSolutionExplorer": false +} \ No newline at end of file diff --git a/.vs/slnx.sqlite b/.vs/slnx.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..cf066726d3907bcc3ac74baa21f0e3e08e266d0c GIT binary patch literal 98304 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