Files
MOOSE/Moose Development/Moose/Functional/RatCraft.lua
T
Frank 8c91c753ee RAT
2019-11-19 16:48:56 +01:00

277 lines
7.8 KiB
Lua

--- **Functional** - (R2.5) - Random Air Traffic.
--
--
--
-- RATCRAFT creates random air traffic on the map.
--
--
--
-- **Main Features:**
--
-- * It's very random.
--
-- ===
--
-- ### Author: **funkyfranky**
-- @module Functional.RatCraft
-- @image Functional_Rat2.png
--- RATCRAFT
--
-- @type RATCRAFT
-- @field #string ClassName Name of the class.
-- @field #boolean Debug Debug mode. Messages to all about status.
-- @field #string lid Class id string for output to DCS log file.
-- @field #number coalition Coalition side.
-- @field #number country Country number.
-- @field #number size Max size in meters.
-- @field #table liveries Table of liveries.
-- @field #string livery Livery.
-- @field #string actype Aircraft type name.
-- @field #number category Category (plane=X, helo=Y).
-- @field #string attribute Attribute.
-- @field #table template Spawn template table.
-- @extends Core.Fsm#FSM
RATCRAFT = {
ClassName = "RATCRAFT",
Debug = false,
lid = nil,
templatename = nil,
alias = nil,
idx = 0,
liveries = {},
livery = nil,
actype = nil,
attribute = nil,
ceiling = nil,
speedmax = nil,
sizex = nil,
sizez = nil,
size = nil,
coalition = nil,
country = nil,
skill = nil,
onboard = nil,
departures = {},
destinations = {},
departure = nil,
destination = nil,
commute = nil,
takeoff = nil,
landing = nil,
}
--- Generalized asset attributes. Can be used to request assets with certain general characteristics. See [DCS attributes](https://wiki.hoggitworld.com/view/DCS_enum_attributes) on hoggit.
-- @type RATCRAFT.Attribute
-- @field #string TRANSPORTPLANE Airplane with transport capability. This can be used to transport other assets.
-- @field #string AWACS Airborne Early Warning and Control System.
-- @field #string FIGHTER Fighter, interceptor, ... airplane.
-- @field #string BOMBER Aircraft which can be used for strategic bombing.
-- @field #string TANKER Airplane which can refuel other aircraft.
-- @field #string TRANSPORTHELO Helicopter with transport capability. This can be used to transport other assets.
-- @field #string ATTACKHELO Attack helicopter.
-- @field #string UAV Unpiloted Aerial Vehicle, e.g. drones.
RATCRAFT.Attribute = {
TRANSPORTPLANE="TransportPlane",
AWACS="AWACS",
FIGHTER="Fighter",
BOMBER="Bomber",
TANKER="Tanker",
TRANSPORTHELO="TransportHelo",
ATTACKHELO="AttackHelo",
UAV="UAV",
OTHER="Other",
}
--- Departure/destination
-- @type RATCRAFT.DeType
-- @field #string AIRBASE Departure/destination is an airbase.
-- @field #string ZONE Departure/destination is a zone.
RATCRAFT.DeType={
AIRBASE="Airbase",
ZONE="Zone",
}
--- Departure/destination
-- @type RATCRAFT.Departure
-- @field #string name
-- @field #string type
--- Create a new AIRBOSS class object for a specific aircraft carrier unit.
-- @param #RATCRAFT self
-- @param #string groupname Name of the late activated template group.
-- @param #string alias Alias for the group name used as spawning name prefix.
-- @return #RATCRAFT self
function RATCRAFT:New(groupname, alias)
-- Inherit everything from FSM class.
local self=BASE:Inherit(self, FSM:New()) --#RATCRAFT
self.templategroup=GROUP:FindByName(groupname)
self.templatename=groupname
self.alias=alias
-- Start State.
self:SetStartState("Stopped")
-- Add FSM transitions.
-- From State --> Event --> To State
self:AddTransition("Stopped", "Load", "Stopped") -- Load player scores from file.
self:AddTransition("Stopped", "Start", "Running") -- Start RAT2 script.
return self
end
--- Init aircraft parameters.
-- @param #RATCRAFT self
-- @return #RATCRAFT self
function RATCRAFT:_Init()
end
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- User Functions
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--- Add a departure for the aircraft.
-- @param #RATCRAFT self
-- @return #RATCRAFT self
function RATCRAFT:AddDeparture(departure)
if type(departure)=="string" then
-- Try to find an airbase.
local airbase=AIRBASE:FindByName(departure)
local zone=ZONE:New(ZoneName)
if airbase then
self:AddDepartureAirbase(airbase)
else
self:AddDepartureZone(departure)
end
else
end
end
--- Add one or multiple departure airbase(s) for the aircraft.
-- @param #RATCRAFT self
-- @param #string airbase Departure airbase name or a table of names.
-- @return #RATCRAFT self
function RATCRAFT:AddDepartureAirbase(airbase)
local departure={} --#RATCRAFT.Departure
if type(airbase)=="table" then
for _,ab in pairs(airbase) do
departure.name=ab
departure.type=RATCRAFT.DeType.AIRBASE
table.insert(self.departures, departure)
end
else
departure.name=airbase
departure.type=RATCRAFT.DeType.AIRBASE
table.insert(self.departures, departure)
end
return self
end
--- Add a departure for the aircraft.
-- @param #RATCRAFT self
-- @param Core.Zone#ZONE zone Zone.
-- @return #RATCRAFT self
function RATCRAFT:AddDepartureZone(zone)
local departure={} --#RATCRAFT.Departure
departure.type={}
table.insert(self.departures, zone)
return self
end
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- Departure Functions
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--- Get departure.
-- @param #RATCRAFT self
-- @return #RATCRAFT.Departure
-- @return #table Parking data table.
function RATCRAFT:GetDeparture()
local departures=UTILS.DeepCopy(self.departures)
-- Try each departure in random order.
for i=1,#departures do
-- Roll dice.
local r=math.random(#departures)
-- Get random departure
local departure=departures[r] --#RATCRAFT.Departure
-- Check if airbase or zone.
if departure.type==RATCRAFT.DeType.AIRBASE then
---
-- Airbase
---
local airbase=AIRBASE:FindByName(departure.name)
if airbase then
local group=nil --Wrapper.Group#GROUP
local parking=airbase:FindFreeParkingSpotForAircraft(group,terminaltype,scanradius,scanunits,scanstatics,scanscenery,verysafe,nspots,parkingdata)
if #parking>=#group:GetUnits() then
return departure, parking
else
-- Remove from table so it does not get selected again.
table.remove(departures, r)
end
else
self:E("ERROR: Could not find airbase!")
end
else
---
-- Zone
---
end
end
end
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- Status Functions
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--- Get number of alive groups
-- @param #RATCRAFT self
-- @return #number N live.
function RATCRAFT:_GetAliveGroups()
return 0
end