AIRBOSS v0.9.9

FOX2 fixes
This commit is contained in:
Frank
2019-04-19 19:44:06 +02:00
parent 5aabdb7593
commit 1150c81ab9
2 changed files with 60 additions and 81 deletions
+3 -3
View File
@@ -223,7 +223,7 @@ end
-- @param Core.Zone#ZONE zone Training zone. -- @param Core.Zone#ZONE zone Training zone.
function FOX2:AddLaunchZone(zone) function FOX2:AddLaunchZone(zone)
table.insert(self.safezones, zone) table.insert(self.launchzones, zone)
end end
@@ -239,7 +239,7 @@ end
-- @param #string To To state. -- @param #string To To state.
function FOX2:onafterStatus(From, Event, To) function FOX2:onafterStatus(From, Event, To)
self:I(self.lid..string.format("Missile trainer status: %s", self.GetState())) self:I(self.lid..string.format("Missile trainer status: %s", self:GetState()))
self:_CheckMissileStatus() self:_CheckMissileStatus()
@@ -266,7 +266,7 @@ function FOX2:_CheckMissileStatus()
local mtype=missile.missileType local mtype=missile.missileType
local range=UTILS.MetersToNM(missile.missileRange) local range=UTILS.MetersToNM(missile.missileRange)
text=text..string.format("\n%d: active=%s, type=%d, range=%.1f NM, target=%s, player=%s, missilename=%s", i, active, mtype, range, targetname, playername) text=text..string.format("\n[%d] %s: active=%s, type=%s, range=%.1f NM, target=%s, player=%s, missilename=%s", i, mtype, active, range, targetname, playername, missile.missileName)
end end
self:T(self.lid..text) self:T(self.lid..text)
+51 -72
View File
@@ -2408,7 +2408,7 @@ function AIRBOSS:DeleteAllRecoveryWindows(delay)
-- Loop over all recovery windows. -- Loop over all recovery windows.
for _,recovery in pairs(self.recoverytimes) do for _,recovery in pairs(self.recoverytimes) do
env.info("FF deleting recovery window ID "..tostring(recovery.ID)) self:I(self.lid..string.format("Deleting recovery window ID %s", tostring(recovery.ID)))
self:DeleteRecoveryWindow(recovery, delay) self:DeleteRecoveryWindow(recovery, delay)
end end
@@ -7978,29 +7978,6 @@ end
-- EVENT functions -- EVENT functions
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--- General DCS event handler.
-- @param #AIRBOSS self
-- @param #table Event DCS event table.
function AIRBOSS:onEvent(Event)
self:F3(Event)
--[[
if Event == nil or Event.initiator == nil then
self:T3("Skipping onEvent. Event or Event.initiator unknown.")
return true
end
if Unit.getByName(Event.initiator:getName()) == nil then
self:T3("Skipping onEvent. Initiator unit name unknown.")
return true
end
]]
--env.info("FF DCS Event")
--self:E(Event)
end
--- Airboss event handler for event birth. --- Airboss event handler for event birth.
-- @param #AIRBOSS self -- @param #AIRBOSS self
-- @param Core.Event#EVENTDATA EventData -- @param Core.Event#EVENTDATA EventData
@@ -9395,6 +9372,8 @@ function AIRBOSS:_GetGrooveData(playerData)
groovedata.GradePoints=Gp groovedata.GradePoints=Gp
groovedata.GradeDetail=Gd groovedata.GradeDetail=Gd
--env.info(string.format(", %.6f, %.6f, %.6f, %.6f, %.6f, %.6f, %.6f", groovedata.Time, groovedata.Rho, groovedata.X, groovedata.Alt, groovedata.GSE, groovedata.LUE, groovedata.AoA))
return groovedata return groovedata
end end
@@ -9439,7 +9418,7 @@ function AIRBOSS:_Final(playerData, nocheck)
-- TODO: could add angled approach if lineup<5 and relhead>5. This would mean the player has not turned in correctly! -- TODO: could add angled approach if lineup<5 and relhead>5. This would mean the player has not turned in correctly!
-- Groove data. -- Groove data.
playerData.groove.X0=groovedata playerData.groove.X0=UTILS.DeepCopy(groovedata)
-- Set time stamp. Next call in 4 seconds. -- Set time stamp. Next call in 4 seconds.
playerData.Tlso=timer.getTime() playerData.Tlso=timer.getTime()
@@ -9448,6 +9427,9 @@ function AIRBOSS:_Final(playerData, nocheck)
self:_SetPlayerStep(playerData, AIRBOSS.PatternStep.GROOVE_XX) self:_SetPlayerStep(playerData, AIRBOSS.PatternStep.GROOVE_XX)
end end
-- Groovedata step.
groovedata.Step=playerData.step
end end
--- In the groove. --- In the groove.
@@ -9455,15 +9437,6 @@ end
-- @param #AIRBOSS.PlayerData playerData Player data table. -- @param #AIRBOSS.PlayerData playerData Player data table.
function AIRBOSS:_Groove(playerData) function AIRBOSS:_Groove(playerData)
-- Get distances between carrier and player unit (parallel and perpendicular to direction of movement of carrier)
local X, Z=self:_GetDistances(playerData.unit)
-- Check abort conditions.
if self:_CheckAbort(X, Z, self.Groove) then
self:_AbortPattern(playerData, X, Z, self.Groove, true)
return
end
-- Ranges in the groove. -- Ranges in the groove.
local RX0=UTILS.NMToMeters(1.000) -- Everything before X 1.00 = 1852 m local RX0=UTILS.NMToMeters(1.000) -- Everything before X 1.00 = 1852 m
local RXX=UTILS.NMToMeters(0.750) -- Start of groove. 0.75 = 1389 m local RXX=UTILS.NMToMeters(0.750) -- Start of groove. 0.75 = 1389 m
@@ -9477,6 +9450,16 @@ function AIRBOSS:_Groove(playerData)
-- Add data to trapsheet. -- Add data to trapsheet.
table.insert(playerData.trapsheet, groovedata) table.insert(playerData.trapsheet, groovedata)
-- Coords.
local X=groovedata.X
local Z=groovedata.Z
-- Check abort conditions.
if self:_CheckAbort(groovedata.X, groovedata.Z, self.Groove) then
self:_AbortPattern(playerData, groovedata.X, groovedata.Z, self.Groove, true)
return
end
-- Shortcuts. -- Shortcuts.
local rho=groovedata.Rho local rho=groovedata.Rho
local lineupError=groovedata.LUE local lineupError=groovedata.LUE
@@ -9500,7 +9483,7 @@ function AIRBOSS:_Groove(playerData)
self:RadioTransmission(self.LSORadio, self.LSOCall.ROGERBALL, false, nil, 2, true) self:RadioTransmission(self.LSORadio, self.LSOCall.ROGERBALL, false, nil, 2, true)
-- Store data. -- Store data.
playerData.groove.XX=groovedata playerData.groove.XX=UTILS.DeepCopy(groovedata)
-- This is a valid approach and player did not miss any important steps in the pattern. -- This is a valid approach and player did not miss any important steps in the pattern.
playerData.valid=true playerData.valid=true
@@ -9511,7 +9494,7 @@ function AIRBOSS:_Groove(playerData)
elseif rho<=RIM and playerData.step==AIRBOSS.PatternStep.GROOVE_IM then elseif rho<=RIM and playerData.step==AIRBOSS.PatternStep.GROOVE_IM then
-- Store data. -- Store data.
playerData.groove.IM=groovedata playerData.groove.IM=UTILS.DeepCopy(groovedata)
-- Next step: in close. -- Next step: in close.
self:_SetPlayerStep(playerData, AIRBOSS.PatternStep.GROOVE_IC) self:_SetPlayerStep(playerData, AIRBOSS.PatternStep.GROOVE_IC)
@@ -9519,7 +9502,7 @@ function AIRBOSS:_Groove(playerData)
elseif rho<=RIC and playerData.step==AIRBOSS.PatternStep.GROOVE_IC then elseif rho<=RIC and playerData.step==AIRBOSS.PatternStep.GROOVE_IC then
-- Store data. -- Store data.
playerData.groove.IC=groovedata playerData.groove.IC=UTILS.DeepCopy(groovedata)
-- Next step: AR at the ramp. -- Next step: AR at the ramp.
self:_SetPlayerStep(playerData, AIRBOSS.PatternStep.GROOVE_AR) self:_SetPlayerStep(playerData, AIRBOSS.PatternStep.GROOVE_AR)
@@ -9527,7 +9510,7 @@ function AIRBOSS:_Groove(playerData)
elseif rho<=RAR and playerData.step==AIRBOSS.PatternStep.GROOVE_AR then elseif rho<=RAR and playerData.step==AIRBOSS.PatternStep.GROOVE_AR then
-- Store data. -- Store data.
playerData.groove.AR=groovedata playerData.groove.AR=UTILS.DeepCopy(groovedata)
-- Next step: in the wires. -- Next step: in the wires.
if playerData.actype==AIRBOSS.AircraftCarrier.AV8B then if playerData.actype==AIRBOSS.AircraftCarrier.AV8B then
@@ -9539,7 +9522,7 @@ function AIRBOSS:_Groove(playerData)
elseif rho<=RAR and playerData.step==AIRBOSS.PatternStep.GROOVE_AL then elseif rho<=RAR and playerData.step==AIRBOSS.PatternStep.GROOVE_AL then
-- Store data. -- Store data.
playerData.groove.AL=groovedata playerData.groove.AL=UTILS.DeepCopy(groovedata)
-- Get zone abeam LDG spot. -- Get zone abeam LDG spot.
local ZoneALS=self:_GetZoneAbeamLandingSpot() local ZoneALS=self:_GetZoneAbeamLandingSpot()
@@ -9569,7 +9552,7 @@ function AIRBOSS:_Groove(playerData)
elseif rho<=RAR and playerData.step==AIRBOSS.PatternStep.GROOVE_LC then elseif rho<=RAR and playerData.step==AIRBOSS.PatternStep.GROOVE_LC then
-- Store data. -- Store data.
playerData.groove.LC=groovedata playerData.groove.LC=UTILS.DeepCopy(groovedata)
-- Get zone primary LDG spot. -- Get zone primary LDG spot.
local ZoneLS=self:_GetZoneLandingSpot() local ZoneLS=self:_GetZoneLandingSpot()
@@ -9625,25 +9608,31 @@ function AIRBOSS:_Groove(playerData)
end end
-- Groovedata step.
groovedata.Step=playerData.step
----------------- -----------------
-- Groove Data -- -- Groove Data --
----------------- -----------------
-- Get groove step short hand of the previous step.
local gs=self:_GS(playerData.step, -1)
-- Check if we are beween 3/4 NM and end of ship. -- Check if we are beween 3/4 NM and end of ship.
if rho>=RAR and rho<RX0 and playerData.waveoff==false then if rho>=RAR and rho<RX0 and playerData.waveoff==false then
-- Get groove step short hand of the previous step.
local gs=self:_GS(playerData.step, -1)
-- Get current groove data. -- Get current groove data.
local gd=playerData.groove[gs] --#AIRBOSS.GrooveData local gd=playerData.groove[gs] --#AIRBOSS.GrooveData
if gd then if gd then
self:T3(gd) self:T3(gd)
-- Distance in NM.
local d=UTILS.MetersToNM(rho)
-- Update max deviation of line up error. -- Update max deviation of line up error.
if math.abs(lineupError)>math.abs(gd.LUE) then if math.abs(lineupError)>math.abs(gd.LUE) then
self:T(self.lid..string.format("Got bigger Lineup error at %s: LUE %.3f>%.3f.", gs, lineupError, gd.LUE)) self:T(self.lid..string.format("Got bigger LUE at step %s, d=%.3f: LUE %.3f>%.3f", gs, d, lineupError, gd.LUE))
gd.LUE=lineupError gd.LUE=lineupError
end end
@@ -9651,22 +9640,19 @@ function AIRBOSS:_Groove(playerData)
if gd.GSE>0.4 and glideslopeError<-0.3 then if gd.GSE>0.4 and glideslopeError<-0.3 then
-- Fly through down ==> "\" -- Fly through down ==> "\"
gd.FlyThrough="\\" gd.FlyThrough="\\"
self:T(self.lid..string.format("Got Fly through DOWN at %s. Max GSE=%.1f, lower GSE=%.1f", gs, gd.GSE, glideslopeError)) self:T(self.lid..string.format("Got Fly through DOWN at step %s, d=%.3f: Max GSE=%.3f, lower GSE=%.3f", gs, d, gd.GSE, glideslopeError))
elseif gd.GSE<-0.3 and glideslopeError>0.4 then elseif gd.GSE<-0.3 and glideslopeError>0.4 then
-- Fly through up ==> "/" -- Fly through up ==> "/"
gd.FlyThrough="/" gd.FlyThrough="/"
self:T(self.lid..string.format("Got Fly through UP at %s. Min GSE=%.1f, lower GSE=%.1f", gs, gd.GSE, glideslopeError)) self:E(self.lid..string.format("Got Fly through UP at step %s, d=%.3f: Min GSE=%.3f, lower GSE=%.3f", gs, d, gd.GSE, glideslopeError))
end end
-- Update max deviation of glideslope error. -- Update max deviation of glideslope error.
if math.abs(glideslopeError)>math.abs(gd.GSE) then if math.abs(glideslopeError)>math.abs(gd.GSE) then
self:T(self.lid..string.format("Got bigger glideslope error at %s: GSE |%.3f|>|%.3f|.", gs, glideslopeError, gd.GSE)) self:T(self.lid..string.format("Got bigger GSE at step %s, d=%.3f: GSE |%.3f|>|%.3f|", gs, d, glideslopeError, gd.GSE))
gd.GSE=glideslopeError gd.GSE=glideslopeError
end end
-- Get current AoA.
local aoa=playerData.unit:GetAoA()
-- Get aircraft AoA parameters. -- Get aircraft AoA parameters.
local aircraftaoa=self:_GetAircraftAoA(playerData) local aircraftaoa=self:_GetAircraftAoA(playerData)
@@ -9674,11 +9660,14 @@ function AIRBOSS:_Groove(playerData)
local aoaopt=aircraftaoa.OnSpeed local aoaopt=aircraftaoa.OnSpeed
-- Compare AoAs wrt on speed AoA and update max deviation. -- Compare AoAs wrt on speed AoA and update max deviation.
if math.abs(aoa-aoaopt)>math.abs(gd.AoA-aoaopt) then if math.abs(AoA-aoaopt)>math.abs(gd.AoA-aoaopt) then
self:T(self.lid..string.format("Got bigger AoA error at %s: AoA %.3f>%.3f.", gs, aoa, gd.AoA)) self:T(self.lid..string.format("Got bigger AoA error at step %s, d=%.3f: AoA %.3f>%.3f.", gs, d, AoA, gd.AoA))
gd.AoA=aoa gd.AoA=AoA
end end
--local gs2=self:_GS(groovedata.Step, -1)
--env.info(string.format("groovestep %s %s d=%.3f NM: GSE=%.3f %.3f, LUE=%.3f %.3f, AoA=%.3f %.3f", gs, gs2, d, groovedata.GSE, gd.GSE, groovedata.LUE, gd.LUE, groovedata.AoA, gd.AoA))
end end
--------------- ---------------
@@ -10837,7 +10826,8 @@ function AIRBOSS:_AttitudeMonitor(playerData)
local vcarrier=self.carrier:GetVelocityKMH() local vcarrier=self.carrier:GetVelocityKMH()
-- Speed difference. -- Speed difference.
local dv=math.abs(vplayer-vcarrier) local dv=math.abs(vplayer-vcarrier)
text=text..string.format("\nDist=%.1f m Alt=%.1f m delta|V|=%.1f km/h", dist, self:_GetAltCarrier(playerData.unit), dv) local alt=self:_GetAltCarrier(playerData.unit)
text=text..string.format("\nDist=%.1f m Alt=%.1f m delta|V|=%.1f km/h", dist, alt, dv)
-- If in the groove, provide line up and glide slope error. -- If in the groove, provide line up and glide slope error.
if playerData.step==AIRBOSS.PatternStep.FINAL or if playerData.step==AIRBOSS.PatternStep.FINAL or
playerData.step==AIRBOSS.PatternStep.GROOVE_XX or playerData.step==AIRBOSS.PatternStep.GROOVE_XX or
@@ -10849,7 +10839,6 @@ function AIRBOSS:_AttitudeMonitor(playerData)
playerData.step==AIRBOSS.PatternStep.GROOVE_IW then playerData.step==AIRBOSS.PatternStep.GROOVE_IW then
local lue=self:_Lineup(playerData.unit, true) local lue=self:_Lineup(playerData.unit, true)
local gle=self:_Glideslope(playerData.unit) local gle=self:_Glideslope(playerData.unit)
--local gle2=self:_Glideslope2(playerData.unit)
text=text..string.format("\nGamma=%.1f° | Rho=%.1f°", relhead, phi) text=text..string.format("\nGamma=%.1f° | Rho=%.1f°", relhead, phi)
text=text..string.format("\nLineUp=%.2f° | GlideSlope=%.2f° | AoA=%.1f Units", lue, gle, self:_AoADeg2Units(playerData, aoa)) text=text..string.format("\nLineUp=%.2f° | GlideSlope=%.2f° | AoA=%.1f Units", lue, gle, self:_AoADeg2Units(playerData, aoa))
local grade, points, analysis=self:_LSOgrade(playerData) local grade, points, analysis=self:_LSOgrade(playerData)
@@ -10883,14 +10872,6 @@ function AIRBOSS:_Glideslope(unit, optangle)
-- Distance from stern to aircraft. -- Distance from stern to aircraft.
local x=unit:GetCoordinate():Get2DDistance(landingcoord) local x=unit:GetCoordinate():Get2DDistance(landingcoord)
-- New approach using distances!
-- TODO: Tarawa, check!
local X,Z=self:_GetDistances()
x=-X
x=x+70 -- 3 wire pos.
-- Altitude of unit corrected by the deck height of the carrier. -- Altitude of unit corrected by the deck height of the carrier.
local h=self:_GetAltCarrier(unit) local h=self:_GetAltCarrier(unit)
@@ -10905,12 +10886,6 @@ function AIRBOSS:_Glideslope(unit, optangle)
-- Glide slope (error) in degrees. -- Glide slope (error) in degrees.
local gs=math.deg(glideslope)-optangle local gs=math.deg(glideslope)-optangle
-- Debug.
self:T2(self.lid..string.format("Glide slope error = %.1f, x=%.1f h=%.1f", gs, x, h))
--local gs2=self:_Glideslope2(unit)
--self:E(self.lid..string.format("Glide slope error = %.1f =%.1f, x=%.1f h=%.1f", gs, gs2, x, h))
return gs return gs
end end
@@ -10974,10 +10949,11 @@ function AIRBOSS:_Lineup(unit, runway)
local C=UTILS.VecSubstract(A, B) local C=UTILS.VecSubstract(A, B)
-- Only in 2D plane. -- Only in 2D plane.
C.y=0 C.y=0.0
-- Orientation of carrier. -- Orientation of carrier.
local X=self.carrier:GetOrientationX() local X=self.carrier:GetOrientationX()
X.y=0.0
-- Rotate orientation to angled runway. -- Rotate orientation to angled runway.
if runway then if runway then
@@ -10989,6 +10965,7 @@ function AIRBOSS:_Lineup(unit, runway)
-- Orientation of carrier. -- Orientation of carrier.
local Z=self.carrier:GetOrientationZ() local Z=self.carrier:GetOrientationZ()
Z.y=0.0
-- Rotate orientation to angled runway. -- Rotate orientation to angled runway.
if runway then if runway then
@@ -17012,8 +16989,10 @@ function AIRBOSS:_SaveTrapSheet(playerData, grade)
local g0=playerData.trapsheet[1] --#AIRBOSS.GrooveData local g0=playerData.trapsheet[1] --#AIRBOSS.GrooveData
local T0=g0.Time local T0=g0.Time
for _,_groove in ipairs(playerData.trapsheet) do --for _,_groove in ipairs(playerData.trapsheet) do
local groove=_groove --#AIRBOSS.GrooveData for i=1,#playerData.trapsheet do
--local groove=_groove --#AIRBOSS.GrooveData
local groove=playerData.trapsheet[i]
local t=groove.Time-T0 local t=groove.Time-T0
local a=UTILS.MetersToNM(groove.Rho or 0) local a=UTILS.MetersToNM(groove.Rho or 0)
local b=-groove.X or 0 local b=-groove.X or 0