Jump to content

Anatomy of an Air Assault Mission


Bearfoot

Recommended Posts

Preface

 

So, I decided to put together a cookbook / recipe-style approach to building a basic bare-bones air assault mission using the fantastic CTLD library supported by MIST. As a software developer myself, I know from experience that regardless of the reams and reams and reams of documentation that you write (all of which are very appreciated), the best and fastest way to get your hard work adopted and used is to present "recipes" for common use cases. I thought I would contribute by writing one such up for the CTLD library.

 

I know there is a special thread dedicated to example CTLD missions, and will link to this thread from there. But I thought that the air assault mission should get a thread of its own. The idea is that with the air assault mission being so fundamental to helicopter operations, it would be nice to have different approaches and ideas and implementations of this show-cased, whether or not they use the CTLD library, some other library, some combination of libraries, or just "native code". In other words, the reason this is an independent thread is that its focus is the design and building of air assault missions, rather than a particular library that implements features supporting such as mission (though, of course, learning to use one library or another in building such a mission is a goal). As such, what I am presenting here is an example of a particular implementation of the air assault mission using the CTLD library.

 

I plan to work in more features into this mission, and will update this post as it goes along. In addition, I really am keen to see how I can use the MOOSE library either to extend/enhance this particular mission with interesting features, or maybe completely reimplement it from scratch. If the latter, I will add another post to this thread presenting the recipe (unless the author of the MOOSE library beats me to it!).

 

Of course, suggestions, critiques, feedbacks, advice, etc. are all appreciated! And also, I would like to take a moment to express my personal gratitude for the authors of MIST (Grimes) and CTLD (Ciribob) for their fantastic efforts in support the community.

 

Finally, I should note that I have literally spent less than an hours working with Lua, all of it with the script attached. More importantly, I have only the foggiest notion of the overwhelmingly rich DCS scripting environment. So, I have little doubt that so the code is scandalously inelegant and inefficient. Apologies in advance!

 

Introduction

 

After overwhelming the sleepy local police, insurgents are holding a small town of Oktomberi in the highlands. Government troops have been mobilized and assembled at docks near Kvemo-Merheuli. Two 4-ship lift sections have been tasked to air assault the troops into the south of Oktomberi. Two 2-ship gunship sections have been tasked to support the air assault, with one gunship section prepping the LZ, and the second escorting the lift ships in.

 

This mission will have AI lift and gunships, so that the mission, in principle, is self-contained even if no human players take part (though it is staggeringly implausible for it to succeed without human involvement). Human players will have the choice of flying either additional lift ships or gunships or both (multiplayer). Following the standard airmobile planning approach, we first set up and plan the ground operations, and then plan the lift and air support elements.

 

Initialization

 

The core scripts that allow all this goodness are:

 

 

The world is eternally grateful for the work of these as well as others whose work they, in turn, have built upon!

 

The first thing you should do in your mission creation is load the MIST and the CTLD scripts in the a specific order by creating the following two triggers:

 

  • New Trigger: "Load MIST"
     
  1. TRIGGER:
     
    1. TYPE: "ONCE"
    2. NAME: "Load Mist"
    3. EVENT: "NO EVENT"

    [*] CONDITIONS:

     

  • TYPE: TIME MORE
  • SECONDS: 1

[*] ACTIONS:

 

  • DO SCRIPT FILE: "mist.lua"

[*] New Trigger: "Load CTLD"

 

  • TRIGGER
     

    [*] CONDITIONS:

     

    • TYPE: TIME MORE
    • SECONDS: 2

    [*] ACTIONS:

     

    • DO SCRIPT FILE: "CTLD.lua"
    • SOUND TO COUNTRY:
       

      [*] SOUND TO COUNTRY:

       

      • COUNTRY: "Switzerland"
      • SOUND FILE: "beaconsilent.ogg"

       

      The CTLD and the MIST scripts are both bundled with the CTLD distribution, and can be downloaded from the CTLD GitHub site. Just download the latest release as a zip file, unzip it in your "Saved Games/Scripts" folder, and when you click on "open" to select a file for the "DO SCRIPT FILE" actions, navigate to this folder and select the proper scripts. Note that these should be loaded using timers as described rather than using the "initialization script" option: tantalizingly simpler as this might seem, this approach does not appear to work.

       

      The "SOUND TO COUNTRY" actions are required to get the homing beacons working correctly. The "beacon.ogg" and the "beaconsilent.ogg" files are required, and can be found as part of the CTLD distribution.

       

      Opposition Setup

       

      Create and deploy the enemy troops as you wish. For this, I placed two group of 10 insurgents in the village center, with another two groups of 10 insurgents each, each on either side of the bride leading into town.

       

      To up the jeopardy, you can:

       

      • Give the insurgents an RPG.
      • Give the insurgents a heavy-duty AA weapon, such as 12.7 anti-aircraft gun. Or two. Or three.
      • Give the insurgents a MANPAD.
      • Throw in some surprises en route, such as one of the above threats (RPG, 12.7 AA, or MANPADS) on a hill overlooking approaches.

       

      Ground Mission

       

      Government troops will be air assaulted into the south of the town, just east of the bridge. Troops are assembling at the docks on the coast for the air assault. Or, at least, they are in one's imagination. A perhaps weird or non-intuitive aspect to using the CTLD library (at least, the way I am using it) is that we do not actually need to create any troops at all in the mission editor. They are created (and de-created) as needed or requested by the CTLD library. So we do not actually place any "real" troops on the ground to be picked up (except for decoration or visual aesthetics, as noted below). We just imagine that they are there, and set up all the other infrastructure etc. to support them, visually and simulation-wise!

       

      Using the CTLD, the ground mission is pretty much minimally-implemented by creating a pick-up zone and a drop (landing) zone, with a transport flight directed to land in each in succession. Thus, in its most minimal form, you can put together a simple core air assault mission in about 2 minutes or less. What takes hours if not days is all the rest of the stuff: flight planning, coordination and deconfliction of multiple interacting air missions (multiple lifts, gunships, fast mover support, etc.); tasking of everyone, from other gunships to insurgents; the various reporting and command elements (flights calling out their positions at holding points, releasing flights from the holding points); the visual aesthetics (placement of FARP's etc.); and other mission niceties (surprises such as a lurking MANPADs, etc.).

       

       

      Pick-Up Zone

       

      Troops will need to be picked up at their assembly point and then air lifted into the LZ for the air assault. There are a number of different ways of doing this using the CTLD. The two main ones that I am aware of are:

       

      1. [1] using a specially-named trigger zone to serve as a pick-up zone: any (properly-named) lift-capable units landing in this zone will pick up troops
        [1] create specially-named troops: any (properly-named) lift-capable units landing near these troops will pick them up

       

      In practice, I have found (a) to be more reliable. With (b) you have the visual icing of troops waiting to be picked up and disappearing into the lift ships. But there is also some unreliability with whether or not they actually get picked up in the case of multi-unit groups. While it is easy to place the landing of the first unit close enough to the troops, it is difficult to control (as far as I know) the landings of the remaining units, and if any of these land too far from the extract troops, they will not be picked up.

       

      So, what I have opted to do is to go for (a), but create a bunch of static troops waiting around for a lot of the visual effect of (b). You do not see them actually disappearing into the lift ships, but then, I do not think a bunch of troops magically disappearing looks very good either.

       

      Create a new trigger zone named "pickzone3" at the appropriate location: e.g. near the docks on the coast. This name is a special one, defined in the (default) CTLD to create a pick-up zone with certain characteristics: an unlimited number of troops can be loaded, 11 at a time by default, into any appropriately-named lift-capable unit ("helicargo1", "helicargo2", etc.) that lands in it. Other zone names will result in slightly different options. E.g., if you call the zone "pickzone1", then blue smoke will be shown at the center of the zone as a visual reference. You can just define your own name and associated options by modifying the CTLD script. See the CTLD documentation for details.

       

      Make the size of the zone as based on what you think the flying skills of the pilots are! A bigger zone makes for an easier landing. In this mission, after lots of experimentation, I found I needed a zone of 200m to more often than not get 4 AI ships in wedge formation to land in the zone, though sometimes they can manage it with a 150m zone.

       

      For visual aesthetics, surround at least one side of the zone with appropriate decorations:

       

      • A bunch of (static) infantry lined up in neat 11-man chalks just outside the zone ... or maybe not so neat, depending on their discipline/training :)
      • A line of parked trucks
      • etc.

       

      It is your choice whether or not you want to surround the entire zone or leave half the zone open for clean approach and landing. I have found that the AI sometimes panic, over-react or otherwise do something crazy when trying to land with lots of obstacles in their path.

       

      Landing Zone

       

      Any appropriately-named unit (e.g. "helicargo1", "helicargo2") landing in any appropriately-named trigger zone (e.g., "dropzone1", "dropzone2"), will automatically disembark any virtual "troops" that it has on-board.

      Here, we create a new trigger zone named "dropzone4" at the air assault location. As with the pick-up zone, the name is one predefined in the default CTLD script with some associated properties: blue coaltion, active, no smoke. Other names are available with other qualities: refer to the CTLD documentation for details. I have chosen the area between the bridge and the town (N43 1.660, E41 13.069). Note that while some buildings provide cover for the assaulting lift ships from one group of insurgents, they are totally exposed to the insurgents holding the bridge. It will be the task of the gunships to suppress or destroy them!

       

      Waypoint Zones

       

      In some ways, it could be argued that what we have discussed so far is not so much the "ground mission" as much as elements to coordinate the air lift support of the ground mission. In fact, we have not talked very much about the actual ground mission at all. And we really are not in this example! We are pretty much going to put the boots on the ground and then let them do what they do however they do that.

       

      Well, that's not entirely true. We are going to minimally help them along a bit by getting them started in the right direction. The CTLD library provides for a simple way to direct movements of dropped or spawn troops. I think that, by default, dropped or spawned troops will move toward any visible enemy. However, for more control you can create a waypoint zone: any troops dropped or spawned within this zone will move toward the center of the zone. So we are going to create a waypoint zone to direct troops to the center of the village. We create a new trigger zone with its center in the center of the village, and adjust its size so that it covers the drop zone created above. We name this zone it "wpzone4". As with other zone names, the name is of special significance. The names are predefined in the CTLD library, and different names have different properties. The name I have picked here has no smoke and is for the blue coalition.

       

       

      FARP

       

      We are going to create a FARP close to the action so that the gunships can quickly refuel and rearm.

       

      The FARP itself is pretty easy to set-up: it is just a static structure.

       

      However, for it to function so as to actually refuel and rearm, it needs the following vehicles within a 150m radius of the FARP:

       

      • M1025 HMMWV APC for radio communications
      • M818 transport for electrical power
      • M978 HEMTT tanker for refueling
      • M818 transport for rearming
      • M818 and FARP TENT for aircraft repair. Repairs take 3 minutes after rotors stop.

       

      Place a trigger zone called "FARP London" over the 'T' representing the FARP in the ME and create a trigger zone with a 150m radius. All of your vehicles that enable Fuel, Ammunition and Repairs at FARPS, must be placed within 150m. Create the vehicles required as a 'group'. Do not place them as individual units or static objects.

       

      Lift Mission

       

      We are going to start the lift mission from the Sukhumi-Babushra airbase. You could, of course, create it almost anywhere else through placements of FARP's. Lift helicopters will take take off from the airbase, proceed to the pick-up zone, load troops, then air assault them in the designated LZ. They will then return to the pick-up zone, load up more troops, and repeat the mission.

       

      The choice of helicopter type is, also up to you. Given the geo-political context, Mi-8's would be the most authentic choice. The other player-option would be the, of course, the UH-1H Huey, though it will take some creative story-telling to explain their presence in Georgia. Personally, I consider that the fun part, and so am going to go for the Huey's! One practical difference between the Mi-8 and Huey's is that if you are running these a AI's, the MI-8's are going to do a runway take off. Same goes for any other AI helicopter with wheels: CH-47D, CH-53 etc. All AI helicopters with wheels taking off from airports or airbases with runways will do a long, slow, arduous taxi to runway, wait in line, and then a rolling take-off. Really slows things down, and getting off a 20-ship AI mission takes all day. Work arounds would be to place everything on FARP's, or simply start them off in the air. Your choice.

       

      Basic Mission Design and Creation

       

      • Create a UH-1H (or type of your choice) group called "Lift #001".
      • Name the pilot "helicargo1"
      • Place it ready to take-off from parking hot (or cold, or in the air: your choice!)
      • Set the appropriate livery and armament (door gun only or unarmed).
      • Give it a route consisting of the following waypoints:
         
      • Waypoint "Check". Waypoint #1, immediately after the actual take off (which is Waypoint #0). You will use this waypoint to deconflict the take-offs of various groups, by spacing them out horizontally and vertically. This group's "home" altitude will be 800 feet AGL, as much as possible.
      • Waypoint(s) "Rally Alpha". You will use this set of points to space out the assembly of all the flights in the air after take off, as well as a holding point for the lift ship group until you are ready for them to proceed. Following the first approach described in the appendix below (Appendix-Holding Points-Advanced Waypoint Action: Orbit), we create two (flyover) waypoints:
         
      • "Rally Alpha 0", with ADVANCED WAYPOINT ACTION:
         

        [*] Rally Alpha 1 (Dummy waypoint to guide the race-track pattern; if not needed, place really close to "Rally Alpha 0".)

        [*] Waypoint "Push Alpha". This (flyover) waypoint will clear the lift ship to approach the PZ. I've put this on the railroad track, so that players flying helicopters without advanced navigation can just follow the tracks. This waypoint serves as a "switch to" target to breakout of a holding pattern if using the two-waypoint holding pattern method.

        [*] PZ Ingress Waypoints. Use these waypoints (the waypoints from "Push Alpha" to the "PZ Initial") to get close to the Pick-Up Zone at cruising speed and altitude.

        [*] Waypoint "PZ Initial". Use this waypoint to slow down and bring the flight low enough for a landing: set the altitude to 40 ft AGL and the speed to 25 knots.

        [*] Waypoint "Pickup". This is the pick up waypoint (flyover type). Create a waypoint action as follows:

         

        • "Pickup", ADVANCED WAYPOINT ACTION:
           

          [*] IMPORTANT: The actual landing point is given by a little triangle that is shown connected to the waypoint when the waypoint is active. By default, this will be placed MILES away from the waypoint. Drag that triangle and bring it back to somewhere in the pick-up zone. Remember that there will be multiple helicopters landing in this zone simultaneously, so your placement should take into account deconfliction, not just in the landing, but in the landing approach as well as take-off!

          [*] IMPORTANT: At the same time, make sure that the landing triangle marker (which will be the place that lead ship touches down) is some distance away from the waypoint from which the landing is tasked. This allows for a sane approach by the AI. Otherwise they will overshoot and then buzz around like crazy trying to get on their marks, greatly increasing the risk of collisions. See below for discussion.

          [*] IMPORTANT: In multi-unit groups, getting the entire group into the zone without crashing into each other is TRICKY! It helps, I think, to have the aircraft slow down and get low before they attempt to land. So I make the speed/altitude something like 25 knots and 40 feet for this waypoint. Even so, getting 4 AI ships into 150m zone is touch and go. It requires a 200m for comfortable 4-ship landing.

          [*] Waypoint(s) "Rally Bravo 01". This is where the lift ships will assemble after picking up their troops. If there are gunships accompanying the lift ships, this is where the lift ships will wait for them to meet up. We create two (flyover) waypoints:

           

          • "Rally Bravo 0", with Advanced Waypoint Action:
             

            [*] Rally Bravo 1 (Dummy waypoint to guide the race-track pattern; if not needed, place really close to "Rally Bravo 0".)

            [*] Waypoint "Push Bravo". Led by the gunships, this (flyover) waypoint is where the run-in to the assault will begin!

            [*] LZ Transit/Ingress Waypoints. The exact number of these will vary based on your route, and the route should probably vary depending on what other threats you have introduced, terrain, as well as the all-important deconfliction. And, for full authenticity, you might want to create a FENCE check and IP waypoint.

            [*] Waypoint "LZ Initial". Use this waypoint to slow down and bring the flight low enough for a landing: set the altitude to 40 ft AGL and the speed to 25 knots.

            [*] Waypoint "LZ". The assault/LZ waypoint (flyover type). Create a waypoint action for this as follows:

             

            • "LZ", with Advanced Waypoint Action:
               

              [*] IMPORTANT: As before, the actual landing point is given by a little triangle that is shown connected to the waypoint when the waypoint is active. And, as before, this will be placed MILES away from the waypoint. Drag that triangle and bring it back to somewhere in the pick-up zone. Again, remember that there will be multiple helicopters landing in this zone simultaneously, so your placement should take into account deconfliction, not just in the landing, but in the landing approach as well as take-off!

              [*] Return/Egress Waypoints. As with the transit ingress waypoints, these will vary. Plan these to take into account deconfliction, threats, terrain etc. If this is going to be a single run mission (i.e., a single lift per ship), then this will terminate in a landing. If, however, you want to lift ships to return to the Pick-up Zone and load up more troops for another air assault, then create a waypoint on the return leg that is close to the "Pickup" waypoint and here:

               

              • "Repeat", with Advanced Waypoint Action:
                 

                [*] Set the ROE and other options.

                 

                • By default, the ROE is "only designated" and Reaction to Threat is "Allow Abort Mission". Under this, if AI helicopters are fired on while trying to land, they will pull back, circle, and try again. This may or may not work for you.
                • You might also want to set the unit to RTB on bingo fuel.

                 

                Other/Multiple Lift Missions

                 

                So, all the above for ONE lift ship. You can, of course, simply increase the size of a group by adding units. I have found that multi-unit groups are prone to lots of issues:

                • Multi-unit groups, and especially multiple multi-unit groups, sometimes fly into each other (whereas you can carefully control the flight routes of independent groups to deconflict ... sometimes).
                • If some units get lost it sometimes (but not always) results in derailing of the entire mission in unpredictable ways. For e.g., if tasked to land for 20 seconds to pick up troops, if a single unit in the group is lost, then sometimes the entire group never takes off again as it is perpetually waiting for the lost unit to land before continuing (i.e. the AI does not recognize the task as complete as long as one unit has not completed it, and that unit will never complete it as it as been destroyed).
                • Getting the entire group to land within some radius of each other (e.g., getting the entire group to land in a zone) is tricky. I have found that a 150m radius zone, with no obstacles/objects of any kind within it, with the landing point in the middle of the zone, works for a 3-ship flight in wedge formation, but not a 4-ship: the trailing ship often sits outside the zone. For a 4-ship, a careful placement of the landing triangle offset from the center in combination with the landing waypoint placement, speed, and altitude sometimes works, but it takes experimentation.

                 

                If you decide to add units to the existing group, things to note are:

                 

                • Make sure to set each pilot's name appropriately so it is properly treated by CTLD script: "helicargo1", "helicargo2", etc.

                 

                If you decide to create multiple serials by copying/pasting the existing lift group (whether multi-unit or not):

                 

                • Make sure to set each pilot's name appropriately so it is properly treated by CTLD script: "helicargo1", "helicargo2", etc.
                • Make sure that their call signs (e.g., "Enfield") are disambiguated properly (your pasted unit will, by default, have the same call sign as the copied unit; which makes things very confusing).
                • Deconflict! Deconflict! Deconflict! Flight paths, waypoints, landing points ... EVERYTHING. You cannot count on timings for the deconfliction. You have to deconflict in space. Space the flights out vertically using 100 feet of clearance, taking into account terrain, of course.

                 

                In the example mission, I have created multiple multi-unit lift groups. I did this by first increasing the number of units in the initial lift group that I created to its maximum of 4, and renaming units 2, 3, and 4 "helicargo2", "helicargo3", and "helicargo4", respectively. I then ran the mission through its paces (AI only, with me, as the client/player sitting on the ground watching everything in speeded-up time), and watched for problems, especially with units crashing into each other in their flight paths or orbits/landing, or not all units fitting into the pick-up or drop-off zones. Then it was back to the mission editor to adjust zone sizes and flight paths. This took a few iterations to get right. Then I copied-and-pasted this lift group to make a cloned group. For the second, cloned lift group, I first adjusted the unit names ("helicargo5", "helicargo6", "helicargo7", and "helicargo8"), then went through the laborious process of deconflicting the flight: adjusting altitudes as well as spacing of waypoints to avoid all the other flights, including the first lift group. The most important change I made was to set a different "home" altitude from all the other flights. Of course, extra care with horizontal spacing still needs to be taken at landings and take-offs. Then again, I ran the mission through its paces without actually taking part, identifying issues and fixing them in an iterative process.

                 

                Gunship Mission: Escort

                 

                This mission's objective is to accompany the lift ships on their flights, dealing with any threats on the way, and the LZ itself, suppress or otherwise destroy enemy elements attacking the lift ships.

                 

                Again, the choice of a helicopter is up to you. As with the lift ship, the most realistic is the Mi-8. A case can be made for the Ka-50, but honestly, given its deployment history this is about as unrealistic as Huey. And the Huey, as I said, can be explained away by some fun imaginative and creative back-story of assistance. So, here, I'm going for my beloved Hueys!

                 

                • Create a UH-1H (or type of your choice) group called "Weapons #001"
                • Set its task to CAS.
                • Provide suitable livery and arms (miniguns and rockets).
                • Create the following route remembering to deconflict in horizontal space as well as vertical:
                   
                • Waypoint "Check". This group's "home" altitude will be 1000 feet AGL.
                • Waypoint(s) "Rally Alpha". Create two (flyover) waypoints:
                   
                • "Rally Alpha 0", with ADVANCED WAYPOINT ACTION:
                   

                  [*] Rally Alpha 1 (Dummy waypoint to guide the race-track pattern; if not needed, place really close to "Rally Alpha 0".)

                  [*] Waypoint "Push Alpha". As above.

                  [*] Bravo Ingress Waypoints. The escorts will fly in a route that allows them to provide cover for the lift ships all the way to the PZ, and then take up station at the Bravo rally points until the lift ships have loaded up and are they themselves ready to push from their Bravo stations.This will mean that the the Bravo holding stations have to be coordinated such that the gunships are able to cover both the PZ as well as the lift ship Bravo stations.

                  [*] Waypoint(s) "Rally Bravo 01". As noted above, these waypoints should allow the escorts to cover both the PZ as well as the lift ship Bravo holding stations. We create two (flyover) waypoints:

                   

                  • "Rally Bravo 0", with Advanced Waypoint Action:
                     

                    [*] Rally Bravo 1 (Dummy waypoint to guide the race-track pattern; if not needed, place really close to "Rally Bravo 0".)

                    [*] Waypoint "Push Bravo". Led by the gunships, this (flyover) waypoint is where the run-in to the assault will begin!

                    [*] LZ Transit/Ingress Waypoints. The exact number of these will vary based on your route, and the route should probably vary depending on what other threats you have introduced, terrain, as well as the all-important deconfliction. And, for full authenticity, you might want to create a FENCE check and IP waypoint.

                    [*] Waypoint "LZ Initial". Whereas the lift ships slow down here, we have the gunship escorts speed up and dive down into the weeds. Control the timing so that this group arrives a couple of minutes or more before the lift ships.

                    [*] Waypoint "LZ". If the prep mission has left any of the dangerous opposition (i.e., troops with clear fields of fire on the landing lift ships), these need to be cleared out now.

                     

                    • Insurgent group to the east of the bridge
                       

                      [*] Insurgent group to the east of the bridge

                       

                      • Type: "Perform Task"
                      • Action: "Attack Group"
                      • Group: "Insurgents, Bridge, West" (or whatever you have named them)

                      [*] Egress Waypoints. This will take the gunship out and back, not to its base, but to FARP London for refueling and rearming before returning to action:

                       

                      • TYPE: "PERFORM TASK"
                      • ACTION: "LAND"
                      • NUMBER: 1
                      • ENABLE: YES
                      • ON LAND: YES
                      • TIME: 0:0:15/0 (15 secs)

                      [*] Return to action: fly to and then switch to waypoint "Rally Bravo 0".

                      [*] Set the ROE and other options.

                       

                      • Experiment to see what works best!

                       

                      Gunship Mission: LZ Prep

                       

                      This mission's objective is to prepare the LZ by attacking opposition infantry that might pose a threat to the lift ships. It is a relatively simple mission from a planning perspective, compared to the others: just take off, fly to the LZ, and put some fire, lead, and steel on targets. Again, choice of platform, starting location, etc. are up to you. Here, it is going to be the good old Huey's.

                       

                      • Create a UH-1H (or type of your choice) group called "Weapons #002"
                      • Set its task to CAS.
                      • Provide suitable livery and arms (miniguns and rockets).
                      • This mission is simpler than the others, without any rally/holding points, etc. (though, of course, you could always add these, following the others as an example).
                         
                      • Waypoint "Check". This group's "home" altitude will be 500 feet AGL.
                      • LZ Transit/Ingress Waypoints. The exact number of these will vary based on your route, and the route should probably vary depending on what other threats you have introduced, terrain, as well as the all-important deconfliction. And, for full authenticity, you might want to create a FENCE check and IP waypoint.
                      • Waypoint "LZ". The assault/LZ waypoint. Create waypoint actions for the gunship to attack the two groups of insurgents as desired, e.g.:
                         
                      • Insurgent group to the east of the bridge
                         

                        [*] Insurgent group to the east of the bridge

                         

                        • Type: "Perform Task"
                        • Action: "Attack Group"
                        • Group: "Insurgents, Bridge, West" (or whatever you have named them)

                        [*] Egress Waypoints. This will take the gunship out and back, not to its base, but to FARP London for refueling and rearming before returning to action, so that the penultimate waypoint (11) has:

                         

                        • TYPE: "PERFORM TASK"
                        • ACTION: "LAND"
                        • NUMBER: 1
                        • ENABLE: YES
                        • ON LAND: YES
                        • TIME: 0:0:15/0 (15 secs)

                         

                        and at the next waypoint (12):

                         

                        • TYPE: "PERFORM TASK"
                        • ACTION: "SWITCH TO WAYPOINT"
                        • NAME: "REPEAT MISSION"
                        • WAYPOINT: 3 (or whatever is the "LZ" waypoint for this group described above).

                         

                        Adding Players/Clients

                         

                        Simply create a number of single-ship lift groups and weapons groups, and assign their skill level to "client". The client lift ship unit pilots should be named "helicargo#", where "#" is any available number, e.g. "helicargo19", "helicargo20", etc. As noted in the CTLD script, "player controlled transport units should be in a group of their own and be the only unit in the group"

                         

                        Coordination: Command, Control, and Communication

                         

                        Beacons

                         

                        We set up beacons at the pick-up zone and the FARP

                         

                        • New trigger: "Beacon Loading"
                           
                        • TRIGGER:
                           

                           

                          [*] CONDITIONS:

                           

                          • TYPE: TIME MORE
                          • SECONDS: 4

                           

                          [*] ACTIONS:

                           


                          • DO SCRIPT: ctld.createRadioBeaconAtZone("pickzone3","blue", 14400, "Pick-Up Zone")
                          • DO SCRIPT: ctld.createRadioBeaconAtZone("FARP London","blue", 14400, "FARP London")

                           

                           

                          Reporting at the Rally/Holding and Push Points

                           

                          We want the various elements to report in as they get into their holding patterns at the rally points, as well as announce when they are pushing.

                           

                          Create a trigger zone around the rally/holding points, calling it, e.g. "Rally Alpha Zone", as well as the push points, calling it "Push Alpha". You may need to create dedicated zones for different groups depending on the waypoint placement and spacing. You might find it useful to make the points "flyover" rather than "turning". For each group (!!), create a switched condition trigger that sends a message when they enter the zone. E.g., for "Lift #001" at the Bravo rally point:

                           


                          - New Trigger: "Rally Bravo, Lift #001"
                          - TRIGGER:
                          - TYPE: "SWITCHED CONDITION"
                          - NAME: "Rally Bravo, Lift #001"
                          CONDITIONS:
                          - TYPE: "PART OF GROUP IN ZONE"
                          - GROUP: Lift #001
                          - VALUE: Rally Bravo Zone
                          ACTIONS:
                          - Announce Hold (something to let you know that the AI are holding)
                          - ACTION: "MESSAGE TO ALL"
                          - TEXT: "Enfield 1-1, Holding at Rally Bravo"
                          - New Trigger: "Push Bravo, Lift #001"
                          - TRIGGER:
                          - TYPE: "SWITCHED CONDITION"
                          - NAME: "Push Bravo, Lift #001"
                          CONDITIONS:
                          - TYPE: "PART OF GROUP IN ZONE"
                          - GROUP: Lift #001
                          - VALUE: Push Bravo Zone
                          ACTIONS:
                          - Announce Push (something to let you know that the AI are pushing)
                          - ACTION: "MESSAGE TO ALL"
                          - TEXT: "Enfield 1-1, Pushing from Rally Bravo"

                           

                          In the example mission, I have also added messages when the lifts come in for a pick up or are actually carrying out the air assault in the LZ.

                          I should also note that I switched off comms for all AI ships. The constant "at waypoint" reports were useless and annoying.

                           

                          Radio-Command Set Flags

                           

                          We now implement the command and control infrastructure for various triggered and waypoint actions that we have set up, such as pushing to the LZ etc.

                           

                          For each triggered action, we create a radio menu item to activate the trigger indirectly by setting a flag value, and then another trigger that responds to the flag value being set. For pushing from rally waypoints, we create a radio menu item to set the flag value appropriately, and then a switched trigger that resets the flag after a 10-second delay (to allow time for all the triggers that depend on this flag to react) so that the holding points will be respected the next time the group flies into them.

                           

                          Radio Items

                           

                          • New Trigger: "Add Radio Items"
                             
                          • TRIGGER:
                             

                            [*] CONDITIONS: N/A

                            [*] ACTIONS:

                             

                            • Push Alpha
                               

                              [*] Push Bravo

                               

                              • ACTION: "Radio Item Add"
                              • NAME: "Push Bravo"
                              • FLAG: 2
                              • VALUE: 1

                              [*] New Trigger: "Push Alpha"

                               

                              • TRIGGER:
                                 

                                [*] CONDITIONS:

                                 

                                • Type: "TIME SINCE FLAG"
                                • FLAG: 1
                                • SECONDS: 10

                                [*] ACTIONS:

                                 

                                • Set flag value to 0 (reset so that the hold will work again)
                                   

                                  [*] Announce push order (something to let you know that the actions are being triggered)

                                   

                                  • ACTION: "MESSAGE TO ALL"
                                  • TEXT: "Push from Rally Alpha"

                                  [*] New Trigger: "Push Bravo"

                                   

                                  • TRIGGER:
                                     

                                    [*] CONDITIONS:

                                     

                                    • Type: "TIME SINCE FLAG"
                                    • FLAG: 2
                                    • SECONDS: 10

                                    [*] ACTIONS:

                                     

                                    • Set flag value to 0 (reset so that the hold will work again)
                                       

                                      [*] Announce push order (something to let you know that the actions are being triggered)

                                       

                                      • ACTION: "MESSAGE TO ALL"
                                      • TEXT: "Push from Rally Bravo"

                                       

                                      Status Report

                                       

                                      The "huey troop pickup/dropoff via radio command" thread has an absolutely wonderful mission by user Deck called "HueyDrop". This is a fantastic mission to practice take-offs, landings, and landings under fire. I have clocked in many hours in it, and my skills improved with every one. The mission includes a script, "NewHuey.lua" which, apart from managing troop loadings and unloadings, also periodically reports the status of the battle by displaying the number of insurgents in the various battle zones. While perhaps not very realistic, it really was nice to be able to get an idea of the progress of the battles. I have shamelessly extracted and modified that bit of code here. With my currently rudimentary understanding of the DCS scripting environment, I hacked up a script that responds to a radio command asking for a situation report, and presents the numbers of insurgents in the various battle zones. To use it, first add the script by creating a new trigger:

                                       

                                      • New Trigger: "Load SITREP"
                                         
                                      • TRIGGER:
                                         

                                        [*] ACTIONS:

                                         

                                        • DO SCRIPT FILE: "sitrep.lua"

                                         

                                        Then add a radio item that sets a flag:

                                         

                                        • New Trigger: "Add Sitrep Radio Item"
                                           
                                        • TRIGGER:
                                           

                                          [*] ACTIONS:

                                           

                                          • New Trigger: Situation Report
                                             

                                             

                                            Then add a trigger that responds to the flag by calling the function that reports the status and then resets the flag:

                                             

                                            • New Trigger: "Sitrep"
                                               
                                            • TRIGGER:
                                               

                                              [*] CONDITIONS:

                                               

                                              • Type: "FLAG EQUALS"
                                              • Flag: 99
                                              • Value: 1

                                              [*] ACTIONS:

                                               

                                              • Set flag value to 0
                                                 

                                                [*] Report the status

                                                 

                                                • ACTION: "DO SCRIPT"
                                                • TEXT: "ReportSituation(nil)"

                                                 

                                                Finally, of course, we have to define the zones for which we want the situation reports. These zones should be named "BattleZone1", "BattleZone2", etc., and placed on the map. In the example, I create two such zones and placed them around the drop zone and the center of the village, respectively.

                                                 

                                                Discussion

                                                 

                                                Limitations and Future Improvements

                                                 

                                                • Incorporation/usage of MOOSE. The Mission Object Oriented Scripting Environment seems to be a very promising library. I still am not familiar enough with it to say for sure, but it seems like it might make a lot of the mission implementation and unit coordination above easier and less tedious to implement, in addition to allowing lots of new features. Not sure yet how to use it, or how it will work with CTLD.
                                                • Multi-unit Group Landing/Take-Off. This is tricky. A 4-ship in wedge formation usually gets it right in a 200m zone, with careful placement of the the landing waypoint and marker. Usually. Sometimes they crash into each other, or other units of another group. Sometimes one or more of the units lands outside the zone. I don't know if there is any solution to this.
                                                • Escort Mission. This needs a lot of work. In particular, the lift ships are left unescorted for their return to the pick-up zone. I think this, and, more generally, the coordination of escorts and escorted is one place where MOOSE might be most handy. Furthermore, logic needs to be put in place to have the AI ships refuel and rearm at FARPs (how??).
                                                • Battle progress/status updates. Fog of war is lost. Perhaps we can add random error to the numbers? Ideally, the reports would only take into account the number of insurgents with LOS of the friendlies ...
                                                • Insurgent reinforcements. As time progresses, more insurgent units should move into the village.
                                                • AI Behavior. Everyone makes a big deal about dynamic campaigns. Dynamic campaigns are nice and all, but I will take decent/realistic/great AI behavior any time over it!! So one thing missing in all of the above is how to get the AI to behave reasonably: escorts reacting well under fire, gunships picking out their targets, insurgents movement and formation etc. A lot of this can be controlled by good tasking, and others by ROE. I've presented only the most rudimentary AI engagement tasking. With some planning and thought, I am sure you all will come up with some MUCH better ones, and I would love to hear it. I am particularly galled by (and do not understand why) many of the liftships ending up landing in weird places around the drop zone and then shutting down, with the pilots doing nothing but look at the grass like curious ostriches for the remainder of the simulation. I suspect they took fire? I don't know. Same goes for the insurgents, which, right now, do not do very much very smartly (though, for some absolutely BIZARRE reason, some units of one group always seem to detach and go on a walkabout south!! I do not understand why!). I will work on fixing these and more, but, again, if anyone has any insights or suggestions for improvements, PLEASE let me know!

                                                 

                                                Appendices

                                                 

                                                Loading/Unloading Troops Without the CTLD Library

                                                 

                                                Troop loading/unloading can be done using "native" code, i.e., without using the CTLD:

                                                 

                                                • Create and place troop
                                                   

                                                  [*] Create lift

                                                   

                                                  • Set first waypoint (which is the pick-up point within 150m of the troops) to: "Perform Task" > "Embarking"
                                                  • Select load (Add/remove); might need to click "distribution"

                                                   

                                                  The lift will fly directly from the pick-up point to the next waypoint of the TROOP. It does not seem that you can control the flight path to the drop zon or back from the drop zone.

                                                   

                                                  The advantage of this approach is that the aircraft weight actually changes when loading troops.

                                                   

                                                  The disadvantage of this approach is everything else.

                                                   

                                                  It does not work well with multi-unit transport groups, because transport aircraft have to to land within a particular distance from the troops without killing them. While you can control the landing of the lead ship, the remainder are pretty difficult to manage, resulting in, at best, troops not getting loaded, and at worst, helicopters crashing into each other. This problem is there with the CTLD approach as well, but here you have control over the size of the pick-up zone, extending it as large as you need to fit in all the lift ships, and, in addition, you do not need to actually have troops in the zone.

                                                   

                                                  More problematic is the inability to control the flight part of the transport ingress: they go directly to the second waypoint of the ground troops and then return. This means fine control of landing approaches, egress, etc., not to mention rally/hold points does not seem possible.

                                                   

                                                  Rally/Holding Points

                                                   

                                                  A holding point is a waypoint which you will use to keep a group waiting until you are ready for them to proceed. This could be due to needing some tasks completed first (e.g., SEAD, LZ prep) or waiting for other groups to take off and form up or otherwise meet up. I typically call this hold points "rally" or "marshal" points.

                                                   

                                                  Holding at a point can be achieved in two ways. One is to create an "Advanced Waypoint Action" and the other is to set up the holding pattern yourself using two waypoints.

                                                   

                                                  Advanced Waypoint Action: Orbit

                                                   

                                                  At the holding waypoint, set up an Advanced Waypoint Action:

                                                   

                                                  • TYPE: "Perform Task"
                                                  • ACTION: "Orbit"
                                                  • NAME: "Hold Alpha"
                                                  • PATTERN: "Race Track"
                                                  • SPEED: 50 knots
                                                  • ALTITUDE: 500 ft
                                                  • STOP CONDITION: "IS USER FLAG": "1", IS: True (checked).

                                                   

                                                  If you use a "race track" pattern, then it appears that the subsequent waypoint to define, very loosely, the other end of the "race track", so I typically set the subsequent waypoint following the holding point to be place that allows for deconfliction with other flights rather than the primary route itself. A "circle" orbit gives no control at all over the flight path.

                                                   

                                                  You will then add a radio item that will set the flag "1" (or whatever you designated above) to "1":

                                                   

                                                  • New Trigger: "Radio Commands"
                                                     
                                                  • TRIGGER:
                                                     

                                                    [*] CONDITIONS: N/A

                                                    [*] ACTIONS:

                                                     

                                                    • Push Alpha
                                                       

                                                       

                                                      If you expect the holding point to be reused, you will need to add a trigger that resets the flag to 0 once switched.

                                                       

                                                      • New Trigger: "Push Alpha"
                                                         
                                                      • TRIGGER:
                                                         

                                                        [*] CONDITIONS:

                                                         

                                                        • Type: "FLAG EQUALS"
                                                        • Flag: 1
                                                        • Value: 1

                                                        [*] ACTIONS:

                                                         

                                                        • Set flag value to 0 (reset so that the hold will work again)
                                                           

                                                          [*] Announce push order (something to let you know that the actions are being triggered)

                                                           

                                                          • ACTION: "MESSAGE TO ALL"
                                                          • TEXT: "Push from Rally Alpha"

                                                           

                                                          Custom Holding Pattern

                                                           

                                                          The second approach is to create two waypoints, with a waypoint action at each that switches back to the other waypoint. E.g.: - Rally Alpha 0: with the advanced waypoint action: Switch to waypoint "Rally Alpha 1" - Rally Alpha 1: with the advanced waypoint action: Switch to waypoint "Rally Alpha 0" followed by another waypoint that will be used to "break" the group out of the holding pattern, e.g. "Push Alpha".

                                                           

                                                          A special trigger action task must be created that then switches to the next waypoint that "breaks" out of the loop, i.e. "Push to Alpha".

                                                           

                                                          • TYPE: PERFORM COMMAND
                                                          • ACTION: SWITCH TO WAYPOINT
                                                          • NAME: ALPHA PUSH
                                                          • TO WAYPOINT: 6 (FOR E.G.)

                                                           

                                                          A radio item then sets the flag value:

                                                           

                                                          • New Trigger: "Add Radio Items"
                                                             
                                                          • TRIGGER:
                                                             

                                                            [*] ACTIONS:

                                                             

                                                            • PUSH ALPHA
                                                               

                                                               

                                                              which in turn results in this triggered action being assigned through a "Push AI Task" action.

                                                               

                                                              IMPORTANT NOTE: CREATE ALL THE WAYPOINTS FIRST BEFORE CREATING ANY TRIGGERS, TASKS, OR CONDITIONS! DELETING/ADDING WAYPOINTS MESSES THINGS UP. IF YOU HAVE TO ADD/DELETE/CHANGE WAYPOINTS, MAKE SURE YOU DELETE AND THEN RECREATE THE TASKS ASSOCIATED WITH THEM (I.E., THE SPECIAL "SWITCH TO WAYPOINT" TASKS AS WELL AS THE TRIGGERS).

                                                              CTLD-Escort3.miz

                                                              sitrep.lua

                                                            • ACTION: "RADIO ITEM ADD"
                                                            • NAME: "PUSH ALPHA"
                                                            • FLAG: 1
                                                            • VALUE: 1
TYPE: "ONCE"
NAME: "ADD RADIO ITEMS"
EVENT: "NO EVENT"
ACTION: "Set Flag Value"
FLAG: 1
VALUE: 0
TYPE: "SWITCHED CONDITION"
NAME: "Push Alpha"
ACTION: "Radio Item Add"
NAME: "Push Alpha"
FLAG: 1
VALUE: 1
TYPE: "ONCE"
NAME: "Add Radio Items"
EVENT: "NO EVENT"
Set first waypoint (which is the pick-up point) to: "Perform Task" > "Embark to transport"
Set next waypoint (which is the drop-off point) to: "Perform Task" > "Disembark"
ACTION: "Set Flag Value"
FLAG: 99
VALUE: 0
TYPE: "SWITCHED CONDITION"
NAME: "Sitrep"
ACTION: "RADIO ITEM ADD"
NAME: "Situation Report"
FLAG: 99
VALUE: 1
TYPE: "ONCE"
NAME: "Add Sitrep Radio Item"
EVENT: "NO EVENT"
TYPE: "ONCE"
NAME: "Load SITREP"
EVENT: "NO EVENT"
ACTION: "Set Flag Value"
FLAG: 2
VALUE: 0
TYPE: "SWITCHED CONDITION"
NAME: "Push Bravo"
ACTION: "Set Flag Value"
FLAG: 1
VALUE: 0
TYPE: "SWITCHED CONDITION"
NAME: "Push Alpha"
ACTION: "Radio Item Add"
NAME: "Push Alpha"
FLAG: 1
VALUE: 1
TYPE: "ONCE"
NAME: "Add Radio Items"
EVENT: "NO EVENT"
TYPE: "ONCE"
NAME: "Beacon Loading"
EVENT: "NO EVENT"
Type: "Perform Task"
Action: "Attack Group"
Group: "Insurgents, Bridge, East" (or whatever you have named them)
Type: "Perform Task"
Action: "Attack Group"
Group: "Insurgents, Bridge, East" (or whatever you have named them)
TYPE: "PERFORM TASK"
ACTION: "ORBIT"
NAME: "HOLD BRAVO"
PATTERN: "RACE TRACK"
SPEED: 50 KNOTS
ALTITUDE: 1000 FT AGL
STOP CONDITION: "IS USER FLAG": "2", IS: TRUE (CHECKED).
TYPE: "PERFORM TASK"
ACTION: "ORBIT"
NAME: "HOLD ALPHA"
PATTERN: "RACE TRACK"
SPEED: 50 KNOTS
ALTITUDE: 1000 FT AGL
STOP CONDITION: "IS USER FLAG": "1", IS: TRUE (CHECKED).
TYPE: "PERFORM TASK"
ACTION: "SWITCH TO WAYPOINT"
NAME: "REPEAT MISSION"
WAYPOINT: 3 (or whatever is your "Pickup" waypoint described above). This will result the lift ship repeating the mission, i.e., landing at the pick-up zone, loading troops, then on to the rally point followed by the push point.
TYPE: "PERFORM TASK"
ACTION: "LAND"
NUMBER: 1
ENABLE: YES
ON LAND: YES
TIME: 0:0:30/0 (30 secs)
TYPE: "PERFORM TASK"
ACTION: "ORBIT"
NAME: "HOLD BRAVO"
PATTERN: "RACE TRACK"
SPEED: 50 KNOTS
ALTITUDE: 800 FT AGL
STOP CONDITION: "IS USER FLAG": "2", IS: TRUE (CHECKED).
TYPE: "PERFORM TASK"
ACTION: "LAND"
NUMBER: 1
ENABLE: YES
ON LAND: YES
TIME: 0:1:00/0 (1 minute)
TYPE: "PERFORM TASK"
ACTION: "ORBIT"
NAME: "HOLD ALPHA"
PATTERN: "RACE TRACK"
SPEED: 50 KNOTS
ALTITUDE: 800 FT AGL
STOP CONDITION: "IS USER FLAG": "1", IS: TRUE (CHECKED).
COUNTRY: "Switzerland"
SOUND FILE: "beacon.ogg"
Type: "ONCE"
Name: "Load CTLD"
Event: "NO EVENT"

Edited by Bearfoot
  • Like 1
Link to comment
Share on other sites

wow... this is a lot of work you put in this. lets discuss it tomorrow if you have some time ...

[TABLE][sIGPIC][/sIGPIC]|

[/TABLE]

Link to comment
Share on other sites

Nice work!

F-15E | AH-64 | F/A-18C | F-14B | A-10C | UH-1H | Mi-8MTV2 | Ka-50 | SA342 | Super Carrier | Nevada | Persian Gulf | Syria |

Intel Core i7 11700K - 32GB 3200MHz CL16 DDR4 - MSI GeForce RTX 3060 Gaming X 12GB - Samsung 970 EVO Plus NVMe SSD 1TB

Link to comment
Share on other sites

Wonderful resource! Sharing of your hard work and effort is greatly appreciated! I'm inspired to attempt some air assault LZ operations in my WIP missions as a learning process.

I don't need no stinkin' GPS! (except for PGMs :D) :pilotfly:

[sIGPIC][/sIGPIC]

 

Link to comment
Share on other sites

Thank you!

MSI MAG Z790 Carbon, i9-13900k, NH-D15 cooler, 64 GB CL40 6000mhz RAM, MSI RTX4090, Yamaha 5.1 A/V Receiver, 4x 2TB Samsung 980 Pro NVMe, 1x 2TB Samsung 870 EVO SSD, Win 11 Pro, TM Warthog, Virpil WarBRD, MFG Crosswinds, 43" Samsung 4K TV, 21.5 Acer VT touchscreen, TrackIR, Varjo Aero, Wheel Stand Pro Super Warthog, Phanteks Enthoo Pro2 Full Tower Case, Seasonic GX-1200 ATX3 PSU, PointCTRL, Buttkicker 2, K-51 Helicopter Collective Control

Link to comment
Share on other sites

I will edit the original post to reflect this, but I thought I would share some of what I think I've learned regarding the AI landing behavior. I complain a lot in the original post about the AI landings.

 

(1) I have found that it is (barely) possible to get a 4-ship in wedge formation to land (completely) within a 150m zone if the landing triangle is smack dead in the center. A smaller zone is out, and a 200m zone works comfortably.

 

(2) The landing triangle is the location where the lead ship lands. It is the trailing (4th) ship that usually falls out of the zone.

 

(3) In the default wedge formation, there is about 150-160 m between the lead ship and the far side of the trailing 4th ship, so, if the lead ship hits its landing target smack on and the landing target is exactly in the middle of a 150m zone, it's still touch and go whether the DCS engine considers the 4th ship within the zone or not.

 

On another note, one thing that helps the landings is to have the landing triangle point a decent distance from the waypoint at which the landing is commanded via the "perform task" option. I previously used a waypoint to slow down and line up the ships before the landing waypoint, but had the landing triangle almost underneath the landing waypoint. This results in some crazy behavior where the AI ships buzz around like mayflies on meth before landing. Having the landing waypoint some distance from the actual landing triangle marker (where the lead ship will touch down), greatly helps in having them come with a nice approach.

 

EDIT: Since the wedge formation is heavy to the right, it would seem that offsetting the landing mark from the center of the zone (forward and to the left, from the perspective of the incoming flight) will allow a 4-ship flight to reliably land completely within a 150m zone. Problem comes if you have multiple such 4-ships coming into the zone. You can get the left group in easily (since that would be offset to the left, which is a bias favorable to fitting in the group), but not the right (since you would offset them to the right, resulting in almost definitely pushing the trailing ship out of the zone).


Edited by Bearfoot
  • Like 1
Link to comment
Share on other sites

Very impressive and very detailed. Thanks for posting! :)

Scripts: Complete Transport And Logistics Deployment - CTLD / CTLD Examples - Lots of example of how to use CTLD

CSAR Script - Downed Pilot Rescue / Dedicated Server Script - Automatically launch DCS Multiplayer server at startup

Range Scoring Script - Get scores and counts hits on targets for gunnery or bombs / SimpleSlotBlock - Multiplayer dynamic Slot Blocking Script

 

Projects: DCS-SimpleRadio Standalone - DCS Radio Integration for All Aircraft - NO TeamSpeak Required! :)

DCS-SimpleRadio Troubleshooting Post / DCS-SimpleRadio Free Support Channel on Discord

Link to comment
Share on other sites

  • 2 weeks later...

A note regarding the "sound to country action". This is really a dummy action required for the sound files to be saved into the mission, which the beacons need. You pick a country that is not actually participating in the mission so that nobody hears the sounds from this action.

Link to comment
Share on other sites

  • 1 year later...
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...