From 0c15f92210849d4abe7b3386c6d7309fbf2bf335 Mon Sep 17 00:00:00 2001 From: Sven Van de Velde Date: Mon, 15 Aug 2016 18:44:04 +0200 Subject: [PATCH] Progress - Added change logs of API changes in MOOSE documentation. - Added ZONE_BASE:GetName() method. - Added ZONE_BASE:GetZoneProbability() method. - Added ZONE_BASE:SetZoneProbability() method. - Added ZONE_BASE:GetZoneMaybe() method. - Added SPAWN:InitRandomizeZones() method. --- Moose Development/Moose/Point.lua | 22 ++- Moose Development/Moose/Spawn.lua | 176 ++++++++++++++++-- Moose Development/Moose/Zone.lua | 67 +++++-- .../Release Notes/ReleaseNotes.txt | 12 ++ .../Moose_Test_SPAWN_InitRandomizeZones.lua | 33 ++++ .../Moose_Test_SPAWN_InitRandomizeZones.miz | Bin 0 -> 25968 bytes Moose Training/Documentation/Point.html | 43 ++++- Moose Training/Documentation/Spawn.html | 102 +++++++++- Moose Training/Documentation/Zone.html | 27 ++- 9 files changed, 438 insertions(+), 44 deletions(-) create mode 100644 Moose Test Missions/Moose_Test_SPAWN/Moose_Test_SPAWN_InitRandomizeZones/Moose_Test_SPAWN_InitRandomizeZones.lua create mode 100644 Moose Test Missions/Moose_Test_SPAWN/Moose_Test_SPAWN_InitRandomizeZones/Moose_Test_SPAWN_InitRandomizeZones.miz diff --git a/Moose Development/Moose/Point.lua b/Moose Development/Moose/Point.lua index 1a4b2d7be..08dd9daa7 100644 --- a/Moose Development/Moose/Point.lua +++ b/Moose Development/Moose/Point.lua @@ -25,7 +25,27 @@ -- -- * @{#POINT_VEC2.New}(): a 2D point, taking an additional height parameter. -- * @{#POINT_VEC2.NewFromVec2}(): a 2D point created from a @{DCSTypes#Vec2}. --- +-- +-- === +-- +-- **API CHANGE HISTORY** +-- ====================== +-- +-- The underlying change log documents the API changes. Please read this carefully. The following notation is used: +-- +-- * **Added** parts are expressed in bold type face. +-- * _Removed_ parts are expressed in italic type face. +-- +-- Hereby the change log: +-- +-- 2016-08-12: POINT_VEC3:**Translate( Distance, Angle )** added. +-- +-- 2016-08-06: Made PointVec3 and Vec3, PointVec2 and Vec2 terminology used in the code consistent. +-- +-- * Replaced method _Point_Vec3() to **Vec3**() where the code manages a Vec3. Replaced all references to the method. +-- * Replaced method _Point_Vec2() to **Vec2**() where the code manages a Vec2. Replaced all references to the method. +-- * Replaced method Random_Point_Vec3() to **RandomVec3**() where the code manages a Vec3. Replaced all references to the method. +-- . -- === -- -- ### Authors: diff --git a/Moose Development/Moose/Spawn.lua b/Moose Development/Moose/Spawn.lua index e2366cb90..3c4b2fc9d 100644 --- a/Moose Development/Moose/Spawn.lua +++ b/Moose Development/Moose/Spawn.lua @@ -45,6 +45,7 @@ -- * @{#SPAWN.InitArray}: Make groups visible before they are actually activated, and order these groups like a batallion in an array. -- * @{#SPAWN.InitRepeat}: Re-spawn groups when they land at the home base. Similar methods are @{#SPAWN.InitRepeatOnLanding} and @{#SPAWN.InitRepeatOnEngineShutDown}. -- * @{#SPAWN.InitRandomizeUnits}: Randomizes the @{Unit}s in the @{Group} that is spawned within a **radius band**, given an Outer and Inner radius. +-- * @{#SPAWN.InitRandomizeZones}: Randomizes the spawning between a predefined list of @{Zone}s that are declared using this function. Each zone can be given a probability factor. -- -- 1.3) SPAWN spawning methods -- --------------------------- @@ -87,7 +88,7 @@ -- This models AI that has succesfully returned to their airbase, to restart their combat activities. -- Check the @{#SPAWN.CleanUp} for further info. -- --- 1.6) Catch the @{Group} Spawn event. +-- 1.6) Catch the @{Group} Spawn event! -- ------------------------------------ -- When using the SpawnScheduled method, new @{Group}s are created following the schedule timing parameters. -- When a new @{Group} is spawned, you maybe want to execute actions with that group spawned at the spawn event. @@ -98,9 +99,84 @@ -- -- ==== -- +-- **API CHANGE HISTORY** +-- ====================== +-- +-- The underlying change log documents the API changes. Please read this carefully. The following notation is used: +-- +-- * **Added** parts are expressed in bold type face. +-- * _Removed_ parts are expressed in italic type face. +-- +-- Hereby the change log: +-- +-- 2016-08-15: SPAWN:**InitRandomizeZones( SpawnZones ) added. +-- +-- * This method provides the functionality to randomize the spawning of the Groups at a given list of zones of different types. +-- +-- 2016-08-14: SPAWN:**OnSpawnGroup**( SpawnCallBackFunction, ... ) replaces SPAWN:_SpawnFunction_( SpawnCallBackFunction, ... ). +-- +-- 2016-08-14: SPAWN.SpawnInZone( Zone, __RandomizeGroup__, SpawnIndex ) replaces SpawnInZone( Zone, _RandomizeUnits, OuterRadius, InnerRadius,_ SpawnIndex ). +-- +-- * The RandomizeUnits, OuterRadius and InnerRadius have been replaced with a new method @{#SPAWN.InitRandomizeUnits}( RandomizeUnits, OuterRadius, InnerRadius ). +-- * A new parameter RandomizeGroup to reflect the randomization of the starting position of the Spawned @{Group}. +-- +-- 2016-08-14: SPAWN.SpawnFromVec3( Vec3, SpawnIndex ) replaces SpawnFromVec3( Vec3, _RandomizeUnits, OuterRadius, InnerRadius,_ SpawnIndex ): +-- +-- * The RandomizeUnits, OuterRadius and InnerRadius have been replaced with a new method @{#SPAWN.InitRandomizeUnits}( RandomizeUnits, OuterRadius, InnerRadius ). +-- * A new parameter RandomizeGroup to reflect the randomization of the starting position of the Spawned @{Group}. +-- +-- 2016-08-14: SPAWN.SpawnFromVec2( Vec2, SpawnIndex ) replaces SpawnFromVec2( Vec2, _RandomizeUnits, OuterRadius, InnerRadius,_ SpawnIndex ): +-- +-- * The RandomizeUnits, OuterRadius and InnerRadius have been replaced with a new method @{#SPAWN.InitRandomizeUnits}( RandomizeUnits, OuterRadius, InnerRadius ). +-- * A new parameter RandomizeGroup to reflect the randomization of the starting position of the Spawned @{Group}. +-- +-- 2016-08-14: SPAWN.SpawnFromUnit( SpawnUnit, SpawnIndex ) replaces SpawnFromUnit( SpawnUnit, _RandomizeUnits, OuterRadius, InnerRadius,_ SpawnIndex ): +-- +-- * The RandomizeUnits, OuterRadius and InnerRadius have been replaced with a new method @{#SPAWN.InitRandomizeUnits}( RandomizeUnits, OuterRadius, InnerRadius ). +-- * A new parameter RandomizeGroup to reflect the randomization of the starting position of the Spawned @{Group}. +-- +-- 2016-08-14: SPAWN.SpawnFromUnit( SpawnUnit, SpawnIndex ) replaces SpawnFromStatic( SpawnStatic, _RandomizeUnits, OuterRadius, InnerRadius,_ SpawnIndex ): +-- +-- * The RandomizeUnits, OuterRadius and InnerRadius have been replaced with a new method @{#SPAWN.InitRandomizeUnits}( RandomizeUnits, OuterRadius, InnerRadius ). +-- * A new parameter RandomizeGroup to reflect the randomization of the starting position of the Spawned @{Group}. +-- +-- 2016-08-14: SPAWN.**InitRandomizeUnits( RandomizeUnits, OuterRadius, InnerRadius )** added: +-- +-- * This method enables the randomization of units at the first route point in a radius band at a spawn event. +-- +-- 2016-08-14: SPAWN.**Init**Limit( SpawnMaxUnitsAlive, SpawnMaxGroups ) replaces SPAWN._Limit_( SpawnMaxUnitsAlive, SpawnMaxGroups ): +-- +-- * Want to ensure that the methods starting with **Init** are the first called methods before any _Spawn_ method is called! +-- * This notation makes it now more clear which methods are initialization methods and which methods are Spawn enablement methods. +-- +-- 2016-08-14: SPAWN.**Init**Array( SpawnAngle, SpawnWidth, SpawnDeltaX, SpawnDeltaY ) replaces SPAWN._Array_( SpawnAngle, SpawnWidth, SpawnDeltaX, SpawnDeltaY ). +-- +-- * Want to ensure that the methods starting with **Init** are the first called methods before any _Spawn_ method is called! +-- * This notation makes it now more clear which methods are initialization methods and which methods are Spawn enablement methods. +-- +-- 2016-08-14: SPAWN.**Init**RandomizeRoute( SpawnStartPoint, SpawnEndPoint, SpawnRadius, SpawnHeight ) replaces SPAWN._RandomizeRoute_( SpawnStartPoint, SpawnEndPoint, SpawnRadius, SpawnHeight ). +-- +-- * Want to ensure that the methods starting with **Init** are the first called methods before any _Spawn_ method is called! +-- * This notation makes it now more clear which methods are initialization methods and which methods are Spawn enablement methods. +-- +-- 2016-08-14: SPAWN.**Init**RandomizeTemplate( SpawnTemplatePrefixTable ) replaces SPAWN._RandomizeTemplate_( SpawnTemplatePrefixTable ). +-- +-- * Want to ensure that the methods starting with **Init** are the first called methods before any _Spawn_ method is called! +-- * This notation makes it now more clear which methods are initialization methods and which methods are Spawn enablement methods. +-- +-- 2016-08-14: SPAWN.**Init**UnControlled() replaces SPAWN._UnControlled_(). +-- +-- * Want to ensure that the methods starting with **Init** are the first called methods before any _Spawn_ method is called! +-- * This notation makes it now more clear which methods are initialization methods and which methods are Spawn enablement methods. +-- +-- === +-- +-- AUTHORS and CONTRIBUTIONS +-- ========================= +-- -- ### Contributions: -- --- * Aaron: +-- * Aaron: Posed the idea for Group position randomization at SpawnInZone and make the Unit randomization separate from the Group randomization. -- -- ### Authors: -- @@ -120,12 +196,15 @@ -- @field #number MaxAliveUnits -- @field #number SpawnIndex -- @field #number MaxAliveGroups +-- @field #SPAWN.SpawnZoneTable SpawnZoneTable SPAWN = { ClassName = "SPAWN", SpawnTemplatePrefix = nil, SpawnAliasPrefix = nil, } +--- @type SPAWN.SpawnZoneTable +-- @list SpawnZone --- Creates the main object to spawn a @{Group} defined in the DCS ME. @@ -203,7 +282,7 @@ end --- Limits the Maximum amount of Units that can be alive at the same time, and the maximum amount of groups that can be spawned. -- Note that this method is exceptionally important to balance the performance of the mission. Depending on the machine etc, a mission can only process a maximum amount of units. --- If the time interval must be short, but there should not be more Units or Groups alive than a maximum amount of units, then this function should be used... +-- If the time interval must be short, but there should not be more Units or Groups alive than a maximum amount of units, then this method should be used... -- When a @{#SPAWN.New} is executed and the limit of the amount of units alive is reached, then no new spawn will happen of the group, until some of these units of the spawn object will be destroyed. -- @param #SPAWN self -- @param #number SpawnMaxUnitsAlive The maximum amount of units that can be alive at runtime. @@ -287,8 +366,8 @@ function SPAWN:InitRandomizeUnits( RandomizeUnits, OuterRadius, InnerRadius ) return self end ---- This function is rather complicated to understand. But I'll try to explain. --- This function becomes useful when you need to spawn groups with random templates of groups defined within the mission editor, +--- This method is rather complicated to understand. But I'll try to explain. +-- This method becomes useful when you need to spawn groups with random templates of groups defined within the mission editor, -- but they will all follow the same Template route and have the same prefix name. -- In other words, this method randomizes between a defined set of groups the template to be used for each new spawn of a group. -- @param #SPAWN self @@ -319,12 +398,33 @@ function SPAWN:InitRandomizeTemplate( SpawnTemplatePrefixTable ) return self end +--TODO: Add example. +--- This method provides the functionality to randomize the spawning of the Groups at a given list of zones of different types. +-- @param #SPAWN self +-- @param #table SpawnZoneTable A table with @{Zone} objects. If this table is given, then each spawn will be executed within the given list of @{Zone}s objects. +-- @return #SPAWN +-- @usage +-- -- NATO Tank Platoons invading Gori. +-- -- Choose between 3 different zones for each new SPAWN the Group to be executed, regardless of the zone type. +function SPAWN:InitRandomizeZones( SpawnZoneTable ) + self:F( { self.SpawnTemplatePrefix, SpawnZoneTable } ) + + self.SpawnZoneTable = SpawnZoneTable + self.SpawnRandomizeZones = true + + for SpawnGroupID = 1, self.SpawnMaxGroups do + self:_RandomizeZones( SpawnGroupID ) + end + + return self +end + --- For planes and helicopters, when these groups go home and land on their home airbases and farps, they normally would taxi to the parking spot, shut-down their engines and wait forever until the Group is removed by the runtime environment. --- This function is used to re-spawn automatically (so no extra call is needed anymore) the same group after it has landed. +-- This method is used to re-spawn automatically (so no extra call is needed anymore) the same group after it has landed. -- This will enable a spawned group to be re-spawned after it lands, until it is destroyed... -- Note: When the group is respawned, it will re-spawn from the original airbase where it took off. -- So ensure that the routes for groups that respawn, always return to the original airbase, or players may get confused ... @@ -585,7 +685,7 @@ function SPAWN:SpawnScheduled( SpawnTime, SpawnTimeVariation ) end --- Will re-start the spawning scheduler. --- Note: This function is only required to be called when the schedule was stopped. +-- Note: This method is only required to be called when the schedule was stopped. function SPAWN:SpawnScheduleStart() self:F( { self.SpawnTemplatePrefix } ) @@ -601,7 +701,7 @@ end --- Allows to place a CallFunction hook when a new group spawns. --- The provided function will be called when a new group is spawned, including its given parameters. +-- The provided method will be called when a new group is spawned, including its given parameters. -- The first parameter of the SpawnFunction is the @{Group#GROUP} that was spawned. -- @param #SPAWN self -- @param #function SpawnCallBackFunction The function to be called when a group spawns. @@ -632,7 +732,7 @@ end --- Will spawn a group from a Vec3 in 3D space. --- This function is mostly advisable to be used if you want to simulate spawning units in the air, like helicopters or airplanes. +-- This method is mostly advisable to be used if you want to simulate spawning units in the air, like helicopters or airplanes. -- Note that each point in the route assigned to the spawning group is reset to the point of the spawn. -- You can use the returned group to further define the route to be followed. -- @param #SPAWN self @@ -690,7 +790,7 @@ function SPAWN:SpawnFromVec3( Vec3, SpawnIndex ) end --- Will spawn a group from a Vec2 in 3D space. --- This function is mostly advisable to be used if you want to simulate spawning groups on the ground from air units, like vehicles. +-- This method is mostly advisable to be used if you want to simulate spawning groups on the ground from air units, like vehicles. -- Note that each point in the route assigned to the spawning group is reset to the point of the spawn. -- You can use the returned group to further define the route to be followed. -- @param #SPAWN self @@ -706,7 +806,7 @@ function SPAWN:SpawnFromVec2( Vec2, SpawnIndex ) end ---- Will spawn a group from a hosting unit. This function is mostly advisable to be used if you want to simulate spawning from air units, like helicopters, which are dropping infantry into a defined Landing Zone. +--- Will spawn a group from a hosting unit. This method is mostly advisable to be used if you want to simulate spawning from air units, like helicopters, which are dropping infantry into a defined Landing Zone. -- Note that each point in the route assigned to the spawning group is reset to the point of the spawn. -- You can use the returned group to further define the route to be followed. -- @param #SPAWN self @@ -724,7 +824,7 @@ function SPAWN:SpawnFromUnit( HostUnit, SpawnIndex ) return nil end ---- Will spawn a group from a hosting static. This function is mostly advisable to be used if you want to simulate spawning from buldings and structures (static buildings). +--- Will spawn a group from a hosting static. This method is mostly advisable to be used if you want to simulate spawning from buldings and structures (static buildings). -- You can use the returned group to further define the route to be followed. -- @param #SPAWN self -- @param Static#STATIC HostStatic The static dropping or unloading the group. @@ -833,7 +933,7 @@ end --- Will find the next alive @{Group} object from a given Index, and return a reference to the alive @{Group} object and the next Index where the alive @{Group} has been found. -- @param #SPAWN self --- @param #number SpawnIndexStart A Index holding the start position to search from. This function can also be used to find the first alive @{Group} object from the given Index. +-- @param #number SpawnIndexStart A Index holding the start position to search from. This method can also be used to find the first alive @{Group} object from the given Index. -- @return Group#GROUP, #number The next alive @{Group} object found, the next Index where the next alive @{Group} object was found. -- @return #nil, #nil When no alive @{Group} object is found from the start Index position, #nil is returned. -- @usage @@ -1168,6 +1268,54 @@ function SPAWN:_RandomizeTemplate( SpawnIndex ) return self end +--- Private method that randomizes the @{Zone}s where the Group will be spawned. +-- @param #SPAWN self +-- @param #number SpawnIndex +-- @return #SPAWN self +function SPAWN:_RandomizeZones( SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, SpawnIndex, self.SpawnRandomizeZones } ) + + if self.SpawnRandomizeZones then + local SpawnZone = nil -- Zone#ZONE_BASE + while not SpawnZone do + self:T( { SpawnZoneTableCount = #self.SpawnZoneTable, self.SpawnZoneTable } ) + local ZoneID = math.random( #self.SpawnZoneTable ) + self:T( ZoneID ) + SpawnZone = self.SpawnZoneTable[ ZoneID ]:GetZoneMaybe() + end + + self:T( "Preparing Spawn in Zone", SpawnZone:GetName() ) + + local SpawnVec2 = SpawnZone:GetRandomVec2() + + local SpawnTemplate = self.SpawnGroups[SpawnIndex].SpawnTemplate + + for UnitID = 1, #SpawnTemplate.units do + local UnitTemplate = SpawnTemplate.units[UnitID] + self:T( 'Before Translation SpawnTemplate.units['..UnitID..'].x = ' .. UnitTemplate.x .. ', SpawnTemplate.units['..UnitID..'].y = ' .. UnitTemplate.y ) + local SX = UnitTemplate.x + local SY = UnitTemplate.y + local BX = SpawnTemplate.route.points[1].x + local BY = SpawnTemplate.route.points[1].y + local TX = SpawnVec2.x + ( SX - BX ) + local TY = SpawnVec2.y + ( SY - BY ) + UnitTemplate.x = TX + UnitTemplate.y = TY + -- TODO: Manage altitude based on landheight... + --SpawnTemplate.units[UnitID].alt = SpawnVec2: + self:T( 'After Translation SpawnTemplate.units['..UnitID..'].x = ' .. UnitTemplate.x .. ', SpawnTemplate.units['..UnitID..'].y = ' .. UnitTemplate.y ) + end + SpawnTemplate.x = SpawnVec2.x + SpawnTemplate.y = SpawnVec2.y + SpawnTemplate.route.points[1].x = SpawnVec2.x + SpawnTemplate.route.points[1].y = SpawnVec2.y + end + + self:_RandomizeRoute( SpawnIndex ) + + return self +end + function SPAWN:_TranslateRotate( SpawnIndex, SpawnRootX, SpawnRootY, SpawnX, SpawnY, SpawnAngle ) self:F( { self.SpawnTemplatePrefix, SpawnIndex, SpawnRootX, SpawnRootY, SpawnX, SpawnY, SpawnAngle } ) @@ -1211,7 +1359,7 @@ function SPAWN:_TranslateRotate( SpawnIndex, SpawnRootX, SpawnRootY, SpawnX, Spa return self end ---- Get the next index of the groups to be spawned. This function is complicated, as it is used at several spaces. +--- Get the next index of the groups to be spawned. This method is complicated, as it is used at several spaces. function SPAWN:_GetSpawnIndex( SpawnIndex ) self:F2( { self.SpawnTemplatePrefix, SpawnIndex, self.SpawnMaxGroups, self.SpawnMaxUnitsAlive, self.AliveUnits, #self.SpawnTemplate.units } ) diff --git a/Moose Development/Moose/Zone.lua b/Moose Development/Moose/Zone.lua index ca2a8f0bd..d326cfec0 100644 --- a/Moose Development/Moose/Zone.lua +++ b/Moose Development/Moose/Zone.lua @@ -28,27 +28,31 @@ -- ================================================ -- This class is an abstract BASE class for derived classes, and is not meant to be instantiated. -- --- ### 1.1) Each zone implements two polymorphic functions defined in @{Zone#ZONE_BASE}: +-- ### 1.1) Each zone has a name: +-- +-- * @{#ZONE_BASE.GetName}(): Returns the name of the zone. +-- +-- ### 1.2) Each zone implements two polymorphic functions defined in @{Zone#ZONE_BASE}: -- -- * @{#ZONE_BASE.IsPointVec2InZone}(): Returns if a @{Point#POINT_VEC2} is within the zone. -- * @{#ZONE_BASE.IsPointVec3InZone}(): Returns if a @{Point#POINT_VEC3} is within the zone. -- --- ### 1.2) A zone has a probability factor that can be set to randomize a selection between zones: +-- ### 1.3) A zone has a probability factor that can be set to randomize a selection between zones: -- -- * @{#ZONE_BASE.SetRandomizeProbability}(): Set the randomization probability of a zone to be selected, taking a value between 0 and 1 ( 0 = 0%, 1 = 100% ) -- * @{#ZONE_BASE.GetRandomizeProbability}(): Get the randomization probability of a zone to be selected, passing a value between 0 and 1 ( 0 = 0%, 1 = 100% ) --- * @{#ZONE_BASE.GetZoneRandomize}(): Get the zone taking into account the randomization probability. nil is returned if this zone is not a candidate. +-- * @{#ZONE_BASE.GetZoneMaybe}(): Get the zone taking into account the randomization probability. nil is returned if this zone is not a candidate. -- --- ### 1.3) A zone manages Vectors: +-- ### 1.4) A zone manages Vectors: -- -- * @{#ZONE_BASE.GetVec2}(): Returns the @{DCSTypes#Vec2} coordinate of the zone. -- * @{#ZONE_BASE.GetRandomVec2}(): Define a random @{DCSTypes#Vec2} within the zone. -- --- ### 1.4) A zone has a bounding square: +-- ### 1.5) A zone has a bounding square: -- -- * @{#ZONE_BASE.GetBoundingSquare}(): Get the outer most bounding square of the zone. -- --- ### 1.5) A zone can be marked: +-- ### 1.6) A zone can be marked: -- -- * @{#ZONE_BASE.SmokeZone}(): Smokes the zone boundaries in a color. -- * @{#ZONE_BASE.FlareZone}(): Flares the zone boundaries in a color. @@ -111,6 +115,26 @@ -- The ZONE_POLYGON class defined by a sequence of @{Group#GROUP} waypoints within the Mission Editor, forming a polygon. -- This class implements the inherited functions from @{Zone#ZONE_RADIUS} taking into account the own zone format and properties. -- +-- ==== +-- +-- **API CHANGE HISTORY** +-- ====================== +-- +-- The underlying change log documents the API changes. Please read this carefully. The following notation is used: +-- +-- * **Added** parts are expressed in bold type face. +-- * _Removed_ parts are expressed in italic type face. +-- +-- Hereby the change log: +-- +-- 2016-08-15: ZONE_BASE:**GetName()** added. +-- +-- 2016-08-15: ZONE_BASE:**SetZoneProbability( ZoneProbability )** added. +-- +-- 2016-08-15: ZONE_BASE:**GetZoneProbability()** added. +-- +-- 2016-08-15: ZONE_BASE:**GetZoneMaybe()** added. +-- -- === -- -- @module Zone @@ -120,12 +144,12 @@ --- The ZONE_BASE class -- @type ZONE_BASE -- @field #string ZoneName Name of the zone. --- @field #number RandomizationProbability A value between 0 and 1. 0 = 0% and 1 = 100% probability. +-- @field #number ZoneProbability A value between 0 and 1. 0 = 0% and 1 = 100% probability. -- @extends Base#BASE ZONE_BASE = { ClassName = "ZONE_BASE", ZoneName = "", - RandomizationProbability = 1, + ZoneProbability = 1, } @@ -150,6 +174,14 @@ function ZONE_BASE:New( ZoneName ) return self end +--- Returns the name of the zone. +-- @param #ZONE_BASE self +-- @return #string The name of the zone. +function ZONE_BASE:GetName() + self:F2() + + return self.ZoneName +end --- Returns if a location is within the zone. -- @param #ZONE_BASE self -- @param DCSTypes#Vec2 Vec2 The location to test. @@ -182,7 +214,7 @@ function ZONE_BASE:GetVec2() end --- Define a random @{DCSTypes#Vec2} within the zone. -- @param #ZONE_BASE self --- @return #nil The Vec2 coordinates. +-- @return DCSTypes#Vec2 The Vec2 coordinates. function ZONE_BASE:GetRandomVec2() return nil end @@ -206,31 +238,32 @@ end --- Set the randomization probability of a zone to be selected. -- @param #ZONE_BASE self --- @param RandomizationProbability A value between 0 and 1. 0 = 0% and 1 = 100% probability. -function ZONE_BASE:SetRandomizationProbability( RandomizationProbability ) - self:F2( RandomizationProbability ) +-- @param ZoneProbability A value between 0 and 1. 0 = 0% and 1 = 100% probability. +function ZONE_BASE:SetZoneProbability( ZoneProbability ) + self:F2( ZoneProbability ) - self.RandomizationProbability = RandomizationProbability or 1 + self.ZoneProbability = ZoneProbability or 1 + return self end --- Get the randomization probability of a zone to be selected. -- @param #ZONE_BASE self -- @return #number A value between 0 and 1. 0 = 0% and 1 = 100% probability. -function ZONE_BASE:GetRandomizationProbability() +function ZONE_BASE:GetZoneProbability() self:F2() - return self.RandomizationProbability + return self.ZoneProbability end --- Get the zone taking into account the randomization probability of a zone to be selected. -- @param #ZONE_BASE self -- @return #ZONE_BASE The zone is selected taking into account the randomization probability factor. -- @return #nil The zone is not selected taking into account the randomization probability factor. -function ZONE_BASE:GetZoneRandomized() +function ZONE_BASE:GetZoneMaybe() self:F2() local Randomization = math.random() - if Randomization <= self.RandomizationProbability then + if Randomization <= self.ZoneProbability then return self else return nil diff --git a/Moose Development/Release Notes/ReleaseNotes.txt b/Moose Development/Release Notes/ReleaseNotes.txt index 6bfee0ff7..3965dcd5f 100644 --- a/Moose Development/Release Notes/ReleaseNotes.txt +++ b/Moose Development/Release Notes/ReleaseNotes.txt @@ -10,6 +10,18 @@ - Changed and removed the POINT_VEC3 SmokeColor and FlareColor structure. Replaced with SMOKECOLOR and FLARECOLOR types. -- Replaced also code in test missions with SMOKECOLOR and FLARECOLOR references. + + - Added change logs of API changes in MOOSE documentation. + + - Added ZONE_BASE:GetName() method. + + - Added ZONE_BASE:GetZoneProbability() method. + + - Added ZONE_BASE:SetZoneProbability() method. + + - Added ZONE_BASE:GetZoneMaybe() method. + + - Added SPAWN:InitRandomizeZones() method. 2016-08-14 diff --git a/Moose Test Missions/Moose_Test_SPAWN/Moose_Test_SPAWN_InitRandomizeZones/Moose_Test_SPAWN_InitRandomizeZones.lua b/Moose Test Missions/Moose_Test_SPAWN/Moose_Test_SPAWN_InitRandomizeZones/Moose_Test_SPAWN_InitRandomizeZones.lua new file mode 100644 index 000000000..900d910f0 --- /dev/null +++ b/Moose Test Missions/Moose_Test_SPAWN/Moose_Test_SPAWN_InitRandomizeZones/Moose_Test_SPAWN_InitRandomizeZones.lua @@ -0,0 +1,33 @@ +-- This test will create 3 different zones of different types. +-- 100 groups of 1 unit will be spawned. +-- The test is about testing the zone randomization, and the place where the units are created. + + +local Iterations = 100 +local Iteration = 1 + + +local ZoneUnit = UNIT:FindByName( "ZoneUnit" ) +local ZonePolygonGroup = GROUP:FindByName( "ZonePolygon" ) + +local SpawnZones = { + ZONE:New( "GroundZone1" ):SetZoneProbability( 0.2 ), + ZONE_UNIT:New( "GroundZone2", ZoneUnit, 1000 ):SetZoneProbability( 0.6 ), + ZONE_POLYGON:New( "GroundZone3", ZonePolygonGroup ):SetZoneProbability( 0.8 ) + } + +HeightLimit = 500 + +SpawnGrounds = SPAWN:New("Ground"):InitLimit( 100, 100 ):InitRandomizeZones( SpawnZones ) + +--- Spawns these groups slowly. +SCHEDULER:New( nil, + + function( Interation, Iterations ) + do + -- Spawn Ground + SpawnGrounds:Spawn() + end + + end, {}, 0, 1, 0 +) diff --git a/Moose Test Missions/Moose_Test_SPAWN/Moose_Test_SPAWN_InitRandomizeZones/Moose_Test_SPAWN_InitRandomizeZones.miz b/Moose Test Missions/Moose_Test_SPAWN/Moose_Test_SPAWN_InitRandomizeZones/Moose_Test_SPAWN_InitRandomizeZones.miz new file mode 100644 index 0000000000000000000000000000000000000000..f86d275a1766de562ec71c770a33b57c6c7fd158 GIT binary patch literal 25968 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 literal 0 HcmV?d00001 diff --git a/Moose Training/Documentation/Point.html b/Moose Training/Documentation/Point.html index cf5137687..19c92dab8 100644 --- a/Moose Training/Documentation/Point.html +++ b/Moose Training/Documentation/Point.html @@ -97,24 +97,57 @@ In order to keep the credibility of the the author, I want to emphasize that the of the MIST framework was created by Grimes, who you can find on the Eagle Dynamics Forums.

1.1) POINT_VEC3 constructor

- -

A new POINT instance can be created with:

+

A new POINT_VEC3 instance can be created with:

+

2) Point#POINT_VEC2 class, extends Point#POINT_VEC3

The Point#POINT_VEC2 class defines a 2D point in the simulator. The height coordinate (if needed) will be the land height + an optional added height specified.

2.1) POINT_VEC2 constructor

- -

A new POINT instance can be created with:

+

A new POINT_VEC2 instance can be created with:

+
+ +

API CHANGE HISTORY

+ +

The underlying change log documents the API changes. Please read this carefully. The following notation is used:

+ +
    +
  • Added parts are expressed in bold type face.
  • +
  • Removed parts are expressed in italic type face.
  • +
+ +

Hereby the change log:

+ +

2016-08-12: POINT_VEC3:Translate( Distance, Angle ) added.

+ +

2016-08-06: Made PointVec3 and Vec3, PointVec2 and Vec2 terminology used in the code consistent.

+ +
    +
  • Replaced method PointVec3() to Vec3() where the code manages a Vec3. Replaced all references to the method.
  • +
  • Replaced method PointVec2() to Vec2() where the code manages a Vec2. Replaced all references to the method.
  • +
  • Replaced method RandomPointVec3() to RandomVec3() where the code manages a Vec3. Replaced all references to the method. + .
  • +
+ +

Authors:

+ +
    +
  • FlightControl : Design & Programming
  • +
+ +

Contributions:

+

Global(s)

diff --git a/Moose Training/Documentation/Spawn.html b/Moose Training/Documentation/Spawn.html index 5fd465f9d..c59bb3ea9 100644 --- a/Moose Training/Documentation/Spawn.html +++ b/Moose Training/Documentation/Spawn.html @@ -183,7 +183,7 @@ In such a case, when the inactive group is cleaned, a new group will Re-spawned This models AI that has succesfully returned to their airbase, to restart their combat activities. Check the SPAWN.CleanUp for further info.

-

1.6) Catch the Group Spawn event.

+

1.6) Catch the Group Spawn event!

When using the SpawnScheduled method, new Groups are created following the schedule timing parameters. When a new Group is spawned, you maybe want to execute actions with that group spawned at the spawn event. To SPAWN class supports this functionality through the SPAWN.OnSpawnGroup( *function( SpawnedGroup ) end * ) method, which takes a function as a parameter that you can define locally. @@ -193,10 +193,103 @@ A coding example is provided at the description of the SPAWN.InitRandomizeUnits( RandomizeUnits, OuterRadius, InnerRadius ). +

  • A new parameter RandomizeGroup to reflect the randomization of the starting position of the Spawned Group.
  • + + +

    2016-08-14: SPAWN.SpawnFromVec3( Vec3, SpawnIndex ) replaces SpawnFromVec3( Vec3, RandomizeUnits, OuterRadius, InnerRadius, SpawnIndex ):

    + +
      +
    • The RandomizeUnits, OuterRadius and InnerRadius have been replaced with a new method SPAWN.InitRandomizeUnits( RandomizeUnits, OuterRadius, InnerRadius ).
    • +
    • A new parameter RandomizeGroup to reflect the randomization of the starting position of the Spawned Group.
    • +
    + +

    2016-08-14: SPAWN.SpawnFromVec2( Vec2, SpawnIndex ) replaces SpawnFromVec2( Vec2, RandomizeUnits, OuterRadius, InnerRadius, SpawnIndex ):

    + +
      +
    • The RandomizeUnits, OuterRadius and InnerRadius have been replaced with a new method SPAWN.InitRandomizeUnits( RandomizeUnits, OuterRadius, InnerRadius ).
    • +
    • A new parameter RandomizeGroup to reflect the randomization of the starting position of the Spawned Group.
    • +
    + +

    2016-08-14: SPAWN.SpawnFromUnit( SpawnUnit, SpawnIndex ) replaces SpawnFromUnit( SpawnUnit, RandomizeUnits, OuterRadius, InnerRadius, SpawnIndex ):

    + +
      +
    • The RandomizeUnits, OuterRadius and InnerRadius have been replaced with a new method SPAWN.InitRandomizeUnits( RandomizeUnits, OuterRadius, InnerRadius ).
    • +
    • A new parameter RandomizeGroup to reflect the randomization of the starting position of the Spawned Group.
    • +
    + +

    2016-08-14: SPAWN.SpawnFromUnit( SpawnUnit, SpawnIndex ) replaces SpawnFromStatic( SpawnStatic, RandomizeUnits, OuterRadius, InnerRadius, SpawnIndex ):

    + +
      +
    • The RandomizeUnits, OuterRadius and InnerRadius have been replaced with a new method SPAWN.InitRandomizeUnits( RandomizeUnits, OuterRadius, InnerRadius ).
    • +
    • A new parameter RandomizeGroup to reflect the randomization of the starting position of the Spawned Group.
    • +
    + +

    2016-08-14: SPAWN.InitRandomizeUnits( RandomizeUnits, OuterRadius, InnerRadius ) added:

    + +
      +
    • This function enables the randomization of units at the first route point in a radius band at a spawn event.
    • +
    + +

    2016-08-14: SPAWN.InitLimit( SpawnMaxUnitsAlive, SpawnMaxGroups ) replaces SPAWN.Limit( SpawnMaxUnitsAlive, SpawnMaxGroups ):

    + +
      +
    • Want to ensure that the methods starting with Init are the first called methods before any Spawn method is called!
    • +
    • This notation makes it now more clear which methods are initialization methods and which methods are Spawn enablement methods.
    • +
    + +

    2016-08-14: SPAWN.InitArray( SpawnAngle, SpawnWidth, SpawnDeltaX, SpawnDeltaY ) replaces SPAWN.Array( SpawnAngle, SpawnWidth, SpawnDeltaX, SpawnDeltaY ).

    + +
      +
    • Want to ensure that the methods starting with Init are the first called methods before any Spawn method is called!
    • +
    • This notation makes it now more clear which methods are initialization methods and which methods are Spawn enablement methods.
    • +
    + +

    2016-08-14: SPAWN.InitRandomizeRoute( SpawnStartPoint, SpawnEndPoint, SpawnRadius, SpawnHeight ) replaces SPAWN.RandomizeRoute( SpawnStartPoint, SpawnEndPoint, SpawnRadius, SpawnHeight ).

    + +
      +
    • Want to ensure that the methods starting with Init are the first called methods before any Spawn method is called!
    • +
    • This notation makes it now more clear which methods are initialization methods and which methods are Spawn enablement methods.
    • +
    + +

    2016-08-14: SPAWN.InitRandomizeTemplate( SpawnTemplatePrefixTable ) replaces SPAWN.RandomizeTemplate( SpawnTemplatePrefixTable ).

    + +
      +
    • Want to ensure that the methods starting with Init are the first called methods before any Spawn method is called!
    • +
    • This notation makes it now more clear which methods are initialization methods and which methods are Spawn enablement methods.
    • +
    + +

    2016-08-14: SPAWN.InitUnControlled() replaces SPAWN.UnControlled().

    + +
      +
    • Want to ensure that the methods starting with Init are the first called methods before any Spawn method is called!
    • +
    • This notation makes it now more clear which methods are initialization methods and which methods are Spawn enablement methods.
    • +
    + +
    + +

    AUTHORS and CONTRIBUTIONS

    +

    Contributions:

      -
    • Aaron:
    • +
    • Aaron: Posed the idea for Group position randomization at SpawnInZone and make the Unit randomization separate from the Group randomization.

    Authors:

    @@ -1547,6 +1640,9 @@ The group that was spawned. You can use this group for further actions.

    + +

    Don't repeat the group from Take-Off till Landing and back Take-Off by ReSpawning.

    +
    @@ -2341,7 +2437,7 @@ Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):Schedule( 600, 0.5 ) -

    Flag that indicates if all the Groups of the SpawnGroup need to be visible when Spawned.

    +

    When the first Spawn executes, all the Groups need to be made visible before start.

    diff --git a/Moose Training/Documentation/Zone.html b/Moose Training/Documentation/Zone.html index f90d1eb9a..9ec1bc215 100644 --- a/Moose Training/Documentation/Zone.html +++ b/Moose Training/Documentation/Zone.html @@ -135,7 +135,7 @@
    • ZONE_BASE.SetRandomizeProbability(): Set the randomization probability of a zone to be selected, taking a value between 0 and 1 ( 0 = 0%, 1 = 100% )
    • ZONE_BASE.GetRandomizeProbability(): Get the randomization probability of a zone to be selected, passing a value between 0 and 1 ( 0 = 0%, 1 = 100% )
    • -
    • ZONE_BASE.GetZoneRandomize(): Get the zone taking into account the randomization probability. nil is returned if this zone is not a candidate.
    • +
    • ZONE_BASE.GetZoneMaybe(): Get the zone taking into account the randomization probability. nil is returned if this zone is not a candidate.

    1.3) A zone manages Vectors:

    @@ -216,6 +216,25 @@ This class is an abstract BASE class for derived classes, and is not meant to be

    The ZONE_POLYGON class defined by a sequence of Group#GROUP waypoints within the Mission Editor, forming a polygon. This class implements the inherited functions from Zone#ZONE_RADIUS taking into account the own zone format and properties.

    +
    + +

    API CHANGE HISTORY

    + +

    The underlying change log documents the API changes. Please read this carefully. The following notation is used:

    + +
      +
    • Added parts are expressed in bold type face.
    • +
    • Removed parts are expressed in italic type face.
    • +
    + +

    Hereby the change log:

    + +

    2016-08-15: ZONE_BASE:SetRandomizationProbability( RandomizationProbability ) added.

    + +

    2016-08-15: ZONE_BASE:GetRandomizationProbability() added.

    + +

    2016-08-15: ZONE_BASE:GetZoneMaybe() added.

    +
    @@ -313,7 +332,7 @@ This class implements the inherited functions from ZONE_BASE:GetZoneRandomized() + @@ -873,8 +892,8 @@ A value between 0 and 1. 0 = 0% and 1 = 100% probability.

    - -ZONE_BASE:GetZoneRandomized() + +ZONE_BASE:GetZoneMaybe()
    ZONE_BASE:GetZoneMaybe()

    Get the zone taking into account the randomization probability of a zone to be selected.