<?xml version="1.0" encoding="ISO-8859-1"?>

<PropertyList>

  <nasal>
    <load>
      <![CDATA[

      var nodeName = cmdarg().getPath();

      print("Loading Gloaster Gladiator ", nodeName);

      ##checks whether it has been initialized already; if so, just return
      if ( bombable.check_overall_initialized (nodeName) ) {
        return;
      }

      #makes the propellors spin in the AI version of the aircraft
      setprop (nodeName ~ "/engines/engine/rpm", "3000");

      ############################################
      #Bombable INITIALIZER
      var object_init = func() {
        # Datas of this object are under: cmdarg().getPath()
        var thisNodeName = cmdarg().getPath();
        var thisNode     = props.globals.getNode(thisNodeName);
        # Add some useful nodes

        ########################################################################
        ########################################################################
        # INITIALIZE BOMBABLE
        #
        # Initialize constants and main routines for maintaining altitude
        # relative to ground-level, relocating after file/reset, and
        # creating bombable/shootable objects.
        #
        # These routines are found in FG/nasal/bombable.nas
        #
        ########################################################################
        # INITIALIZE BOMBABLE Object
        # This object will be slurped in the object's node as a child
        # node named "bombable".
        # All distances are specified in meters.
        # All altitudes are relative to current ground level at the object's
        # location
        #

        thisNodeName = cmdarg().getPath();

        var bombableObject = {

          objectNodeName : thisNodeName,
          objectNode : props.globals.getNode(thisNodeName),
          updateTime_s : 1/3, #time, in seconds, between the updates that

          #keep the object at its AGL. Tradeoff is high-speed updates look more
          #realistic but slow down the framerate/cause jerkiness.  Faster-moving
          #objects will need more frequent updates to look realistic.
          #update time faster than about 1/3 seems to have a noticeable effect
          #on frame rate

          #########################################
          # ALTITUDE DEFINITIONS
          #
          altitudes : {
            # altitude correction to add to your aircraft or ship that is needed to put wheels on ground
            # (or, for a ship, make it float in the water at the correct level).  For most objects this is 0
            # but some models need a small correction to place them exactly at ground level
            wheelsOnGroundAGL_m : 1,

            # minimum altitude above ground level this object is allowed to fly
            minimumAGL_m        : 100,

            # maximum altitude AGL this object is allowed to fly, ie, operational ceiling
            maximumAGL_m        : 13715,

            # altitude AGL when crashed.  Ships will sink to this level, aircraft or vehicles will
            # sink into the ground as landing gear collapses or tires deflate. Should be negative, even just -0.001.
            crashedAGL_m        : 0.6,
          },
          #
          #########################################
          # VELOCITIES DEFINITIONS
          #
          velocities : {
            # max % to reduce speed, per step, when damaged
            maxSpeedReduce_percent                       : 0.5,

            # minimum speed to reduce to when damaged.  Ground vehicles and ships might stop completely
            # when damaged but aircraft will need a minimum speed so they keep moving until they hit the ground.
            # V (s) (stall speed) for aircraft.
            minSpeed_kt                                  : 50,

            # cruising speed, typical/optimal cruising speed, V C for aircraft
            cruiseSpeed_kt                               : 180,

            # typical/optimal speed when aggressively attacking or evading, in level flight for aircraft
            attackSpeed_kt                               : 200,

            # Maximum possible speed under dive or downhill conditions, V NE for aircraft
            # data:
            # see particularly p. 59
            # accel limits are +7 and -3 Gs in all situations, and less in some situations
            maxSpeed_kt                                  : 220,

            # max rate to sink or fly downwards when damaged, in meters/second
            damagedAltitudeChangeMaxRate_meterspersecond : 30,

            #The terminal velocities are calculated by opening the 'real' AC
            #in FG, level flight, full throttle, then putting
            #the AC at different angles of attack with the autopilot,
            #and noting the terminal airspeed & vertical speed velocities.
            #For best results, do it near sea level, under 5000 feet altitude.
            #One or two each of climb & dive velocities are probably sufficient.
            #However if you do more we may be able to use the more precise
            #data in the future.
            #Note that these are intended to be true airspeed whereas FG's
            #/velocities/airspeed-kt reports indicated airspeed, so some
            #conversion or reference to groundspeed-kt is needed.
            #For the F6F I have used indicated airspeed at 10,000 ft for all the above &
            # below values

            diveTerminalVelocities: {
              point1: { airspeed_kt : 377, vertical_speed_fps : -41.8},
              point2: { airspeed_kt : 416, vertical_speed_fps : -87.2},
              point3: { airspeed_kt : 430, vertical_speed_fps : -188.8},
              point4: { airspeed_kt : 547, vertical_speed_fps : -302},
            },

            climbTerminalVelocities: {
              point1: { airspeed_kt : 344, vertical_speed_fps : 27.6},
              point2: { airspeed_kt : 314, vertical_speed_fps : 52.6},
              point3: { airspeed_kt : 297, vertical_speed_fps : 88},
              point4: { airspeed_kt : 252, vertical_speed_fps : 88},
            },
          },
          #
          #########################################
          # EVASION DEFINITIONS
          #
          # The evasion system makes the AI aircraft dodge when they come under
          # fire.
          evasions : {
            # max time to delay/wait between dodges
            dodgeDelayMax_sec             : 15,

            # minimum time to delay/wait between dodges
            dodgeDelayMin_sec             : 5,

            # Max amount to turn when dodging
            dodgeMax_deg                  : 79,

            #  90 degrees = instant turn, unrealistic
            #  up to 80 is usually OK, somewhere in 80-85 starts to be unrealistically fast
            # >85 is usually very unrealistic.  You must test this in your scenario, however.

            # minimum amount to turn when dodging
            dodgeMin_deg                  : 58,

            # you can figure this out by rolling the corresponding FG aircraft and timing a 180 or 360 deg roll
            rollRateMax_degpersec         : 65,

            # Preference for right turns vs. left when dodging.  90% means 90% right turns, 50% means 50% right turns.
            dodgeROverLPreference_percent : 50,

            # Aircraft will begin to move up or down
            dodgeAltMax_m                 : 5000,

            # Aircraft will begin to move up or down
            dodgeAltMin_m                 : -5000,

            # Max speed to climb when evading
            dodgeVertSpeedClimb_mps       : 80,

            # Max speed to dive when evading
            dodgeVertSpeedDive_mps        : 160,
          },
          #
          #########################################
          # ATTACK DEFINITIONS
          #
          # The attack system makes the AI aircraft turn and fly towards
          # other aircraft
          attacks : {
            # max distance to turn & attack main aircraft
            maxDistance_m              : 20000,

            # min distance to turn & attack main aircraft,
            minDistance_m              : 1600,

            # ie, fly away this far before turning to attack again.  If you
            # make this short it will be more like a turning fighter (Zero),
            # longer will become more like an energy fighter that zooms
            # way out, turns around, etc.

            #when within minDistance_m, the aircraft will continue to turn towards the main aircraft and attack
            # *if* if the angle is less than this amount from dead ahead.  A wider angle will make it work more
            # like a twisty/turning fighter, narrower angle more like an energy fighter.
            continueAttackAngle_deg    : 80,

            # will attack the main aircraft unless this amount higher than it or more
            altitudeHigherCutoff_m     : 15000,

            # will attack the main aircraft unless this amount lower than it or more
            altitudeLowerCutoff_m      : 10000,

            # when turning on attack, roll to this angle min
            rollMin_deg                : 58,

            # when turning on attack, roll to this angle max
            rollMax_deg                : 79,

            #  90 degrees = instant turn, unrealistic
            #  up to 80 is usually OK, somewhere in 80-85 starts to be unrealistically fast
            # >85 is usually very unrealistic.  You must test this in your scenario, however.

            # you can figure this out by rolling the corresponding FG aircraft and timing a 180 or 360 deg roll
            rollRateMax_degpersec      : 65,

            # How powerful the aircraft is when climbing during an attack; 4000 would be typical for, say a
            # Zero--scale accordingly for others; higher is stronger
            climbPower                 : 4500,

            # How powerful the aircraft is when diving during and attack; 6000 typical of a Zero--could be
            # much more than climbPower if the aircraft is a weak climber but a strong diver
            divePower                  : 9000,

            # check for need to attack/correct course this often
            attackCheckTime_sec        : 6,

            # once engaged with enemy, check/update course this frequently
            attackCheckTimeEngaged_sec : 0.6,
          },
          #
          #########################################
          # WEAPONS DEFINITIONS
          #
          # The weapons system makes the AI aircraft fire on the main aircraft
          # You can define any number of weapons--just enclose each in curly brackets
          # and separate with commas (,).
          weapons : {
            # internal name - this can be any name you want; must be a valid nasal variable name
            front_gun_left : {

              # name presented to users, ie in on-screen messages
              name : ".50 inch M2/AN Browning Machine Gun",

              # maximum percentage damage one hit from the aircraft's main weapon/machine guns will do to an opponent
              # Based on observation from within FG, a good F6F pass can easily do 18% damage to most aircraft
              maxDamage_percent : 18,

              # maximum distance at which the aircrafts main weapon/maching guns will be able to damage an opponent.
              Making this large is very expensive for FG's framerate and the chance of a hit at great than 100 meters,
              vanishingly small.  So set it carefully.
              maxDamageDistance_m : 1500,

              # direction the aircraft's main weapon is aimed.
              weaponAngle_deg  :  { heading: 0, elevation: 0 },

              # 0,0 = straight ahead, 90,0=directly right, 0,90=directly up, 0,180=directly back, etc.
              # Offset of the weapon from the main aircraft center
              weaponOffset_m : {x:-3, y:3, z:0},

              # Visual size of the weapon's projectile, in meters, at start & end of its path
              weaponSize_m : {start:.1, end:.1},
            },
            # internal name - this can be any name you want; must be a valid nasal variable name
            front_gun_right : {

              # name presented to users, ie in on-screen messages
              name : ".50 inch M2/AN Browning Machine Gun",

              # maximum percentage damage one hit from the aircraft's main weapon/machine guns will do to an opponent
              # Based on observation from within FG, a good F6F pass can easily do 18% damage to most aircraft
              maxDamage_percent : 18,

              # maximum distance at which the aircrafts main weapon/maching guns will be able to damage an opponent.
              # Making this large is very expensive for FG's framerate and the chance of a hit at great than 100 meters,
              # vanishingly small.  So set it carefully.
              maxDamageDistance_m : 1500,

              # direction the aircraft's main weapon is aimed.
              weaponAngle_deg  :  { heading: 0, elevation: 0 },

              # 0,0 = straight ahead, 90,0=directly right, 0,90=directly up, 0,180=directly back, etc.
              # Offset of the weapon from the main aircraft center
              weaponOffset_m : {x:3, y:3, z:0},

              # Visual size of the weapon's projectile, in meters, at start & end of its path
              weaponSize_m : {start:.1, end:.1},
            },
          },
          #
          #########################################
          # DIMENSION DEFINITIONS
          #
          # All dimensions are in meters
          # Source: https://www.wikiwand.com/en/articles/Dewoitine_D.520
          dimensions : {
            # width of your object, ie, for aircraft, wingspan
            width_m             : 9.83,

            # length of your object, ie, for aircraft, distance nose to tail
            length_m            : 8.36,

            # height of your object, ie, for aircraft ground to highest point when sitting on runway
            height_m            : 3.58,

            # typically 1/2 the longest dimension of the object. Hits within this distance of the
            damageRadius_m      : 4.18,

            # center of object have some possibility of damage
            # typically the radius of the fuselage or cockpit or other most
            # vital area at the center of the object.  Always smaller than damageRadius_m
            vitalDamageRadius_m : 2,

            # It's a crash if the main aircraft hits in this area.
            crashRadius_m       : 6,
          },
          #
          #########################################
          # VULNERABILITIES DEFINITIONS
          #
          vulnerabilities : {
            # Vulnerability to damage from armament, 1=normal M1 tank; higher to make objects
            # easier to kill and lower to make them more difficult.  This is a multiplier, so
            # 5 means 5X easier to kill than an M1, 1/5 means 5X harder to kill.
            damageVulnerability               : 45,

            # Chance that a small-caliber machine-gun round will damage the engine or do something
            # else to cause a trail fo smoke.
            engineDamageVulnerability_percent : 4,

            # Vulnerability to catching on fire. 100% means even the slightest impact will set it on
            # fire; 20% means quite difficult to set on fire; 0% means set on fire only when completely
            # damaged; -1% means never set on fire.
            fireVulnerability_percent         : 5,

            # Amount of damage to add, per second, when on fire.  100%=completely damaged.
            fireDamageRate_percentpersecond   : .2,

            # Once a fire starts, for this many seconds there is a chance to put out the fire;
            # fires lasting longer than this won't be put out until the object burns out.
            fireExtinguishMaxTime_seconds     : 50,

            # Chance of the crew putting out the fire within the MaxTime above.
            fireExtinguishSuccess_percentage  : 50,

            # mass of the object in KG, but give at least a 2-10X bonus to anything carrying flammables or high explosives.
            explosiveMass_kg                  : 40772,
          },
          #
          #########################################
          # LIVERY DEFINITIONS
          #
          # Path to livery files to use at different damage levels.
          # Path is relative to the AI aircraft's directory.
          # The object will start with the first livery listed and
          # change to succeeding liveries as the damage
          # level increases. The final livery should indicate full damage/
          # object destroyed.
          #
          # If you don't want to specify any special liveries simply set
          # damageLivery : nil and the object's normal livery will be used.
          #
          damageLiveries : {
            damageLivery : [  ]
          },
        };

        #########################################
        # INITIALIZE ROUTINES
        #
        # OVERALL INITIALIZER: Needed to make all the others work
        bombable.initialize ( bombableObject );
        #
        # LOCATION: Relocate object to maintain its position after file/reset
        # (best not used for airplanes)
        # bombable.location_init ( thisNodeName );
        #
        # GROUND: Keep object at altitude relative to ground level
        bombable.ground_init ( thisNodeName );
        #
        # BOMBABLE: Make the object bombable/damageable
        bombable.bombable_init ( thisNodeName );
        #
        # ATTACK: Make the object attack the main aircraft
        bombable.attack_init ( thisNodeName );
        #
        # WEAPONS: Make the object shoot the main aircraft
        bombable.weapons_init ( thisNodeName );
        #
        # SMOKE/CONTRAIL: Start a flare, contrail, smoke trail, or exhaust
        # trail for the object.
        # Smoke types available: flare, jetcontrail, pistonexhaust, smoketrail,
        # damagedengine
        bombable.startSmoke("pistonexhaust", thisNodeName );
        #
        # END INITIALIZE BOMBABLE
        ########################################################################
        ########################################################################
      }

      object_init();
      ]]>
    </load>
    <unload>
      <![CDATA[
        print("Unload Gloaster Gladiator.");
        var nodeName= cmdarg().getPath();
        bombable.de_overall_initialize( nodeName );
        bombable.initialize_del( nodeName );
        bombable.ground_del( nodeName );
        bombable.location_del (nodeName);
        bombable.bombable_del( nodeName );
        bombable.attack_del( nodeName );
        bombable.weapons_del (nodeName);
        #  </unload>
      ]]>
    </unload>
  </nasal>

</PropertyList>
