Ticket #1184: garrisonfix-03082012.patch

File garrisonfix-03082012.patch, 18.6 KB (added by historic_bruno, 12 years ago)
  • binaries/data/mods/public/simulation/components/GarrisonHolder.js

     
    11function GarrisonHolder() {}
    22
    33GarrisonHolder.prototype.Schema =
    4     "<element name='Max'>" +
     4    "<element name='Max' a:help='Maximum number of entities which can be garrisoned inside this holder'>" +
    55        "<data type='positiveInteger'/>" +
    66    "</element>" +
    7     "<element name='List'>" +
     7    "<element name='List' a:help='Classes of entities which are allowed to garrison inside this holder (from Identity)'>" +
    88        "<attribute name='datatype'>" +
    99            "<value>tokens</value>" +
    1010        "</attribute>" +
    1111        "<text/>" +
    1212    "</element>" +
    13     "<element name='EjectHealth'>" +
     13    "<element name='EjectHealth' a:help='Percentage of maximum health below which this holder no longer allows garrisoning'>" +
    1414        "<ref name='nonNegativeDecimal'/>" +
    1515    "</element>" +
    16     "<element name='BuffHeal'>" +
     16    "<element name='BuffHeal' a:help='Number of hit points that will be restored to this holder&apos;s garrisoned units each second'>" +
    1717        "<data type='positiveInteger'/>" +
     18    "</element>" +
     19    "<element name='LoadingRange' a:help='The maximum distance from this holder at which entities are allowed to garrison. Should be about 2.0 for land entities and preferably greater for ships'>" +
     20        "<ref name='nonNegativeDecimal'/>" +
    1821    "</element>";
    1922
    2023/**
     
    3033};
    3134
    3235/**
     36 * Return range at which entities can garrison here
     37 */
     38GarrisonHolder.prototype.GetLoadingRange = function()
     39{
     40    var max = +this.template.LoadingRange;
     41    return { "max": max, "min": 0 };
     42};
     43
     44/**
    3345 * Return the list of entities garrisoned inside
    3446 */
    3547GarrisonHolder.prototype.GetEntities = function()
  • binaries/data/mods/public/simulation/components/UnitAI.js

     
    374374        }
    375375        else
    376376        {
    377             // TODO: this is probably bogus if the unit was
    378             // unable to move at all - we need to do some range checks
    379             // before actually garrisoning
     377            // We do a range check before actually garrisoning
    380378            this.StopMoving();
    381379            this.SetNextState("INDIVIDUAL.GARRISON.GARRISONED");
    382380        }
     
    12321230            "GARRISONED": {
    12331231                "enter": function() {
    12341232                    var target = this.order.data.target;
    1235                     // Check that we can still garrison here and that garrisoning succeeds
    12361233                    var cmpGarrisonHolder = Engine.QueryInterface(target, IID_GarrisonHolder);
    1237                     if (this.CanGarrison(target) && cmpGarrisonHolder.Garrison(this.entity))
     1234
     1235                    // Check that we can garrison here
     1236                    if (this.CanGarrison(target))
    12381237                    {
    1239                         this.isGarrisoned = true;
     1238                        // Check that we're in range of the garrison target
     1239                        if (this.CheckGarrisonRange(target))
     1240                        {
     1241                            // Check that garrisoning succeeds
     1242                            if (cmpGarrisonHolder.Garrison(this.entity))
     1243                            {
     1244                                this.isGarrisoned = true;
     1245                                return;
     1246                            }
     1247                        }
     1248                        else
     1249                        {
     1250                            // Unable to reach the target, try again
     1251                            // (or follow if it's a moving target)
     1252                            if (this.MoveToTarget(target))
     1253                            {
     1254                                this.SetNextState("APPROACHING");
     1255                                return;
     1256                            }
     1257                        }
    12401258                    }
    1241                     else
    1242                     {
    1243                         // Garrisoning failed for some reason, so finish the order
    1244                         if (this.FinishOrder())
    1245                             return;
    1246                     }
     1259
     1260                    // Garrisoning failed for some reason, so finish the order
     1261                    this.FinishOrder();
     1262                    return;
    12471263                },
    12481264               
    12491265                "Order.Ungarrison": function() {
     
    20082024    return cmpUnitMotion.IsInTargetRange(target, range.min, range.max);
    20092025};
    20102026
     2027UnitAI.prototype.CheckGarrisonRange = function(target)
     2028{
     2029    var cmpGarrisonHolder = Engine.QueryInterface(target, IID_GarrisonHolder);
     2030    var range = cmpGarrisonHolder.GetLoadingRange();
     2031
     2032    var cmpUnitMotion = Engine.QueryInterface(this.entity, IID_UnitMotion);
     2033    return cmpUnitMotion.IsInTargetRange(target, range.min, range.max);
     2034}
     2035
    20112036/**
    20122037 * Returns true if the target entity is visible through the FoW/SoD.
    20132038 */
     
    25162541    this.SetHeldPosition(pos.x, pos.z);
    25172542
    25182543    this.SetStance(stance);
    2519     if (stance == "stand" || stance == "defensive" || stance == "passive")
     2544    // Stop moving if switching to stand ground
     2545    // TODO: Also stop existing orders in a sensible way
     2546    if (stance == "stand")
    25202547        this.StopMoving();
    25212548
    25222549    // Reset the range query, since the range depends on stance
  • binaries/data/mods/public/simulation/templates/structures/rome_army_camp.xml

     
    3939  </Footprint>
    4040  <GarrisonHolder>
    4141    <Max>20</Max>
    42     <EjectHealth>0.1</EjectHealth>
    43     <List datatype="tokens">Support Infantry Cavalry Siege</List>
    44     <BuffHeal>1</BuffHeal>
     42    <List datatype="tokens">Support Infantry Cavalry Siege</List>
    4543  </GarrisonHolder>
    4644  <Health>
    4745    <Max>3500</Max>
  • binaries/data/mods/public/simulation/templates/template_structure_civic_civil_centre.xml

     
    4545  </Footprint>
    4646  <GarrisonHolder>
    4747    <Max>20</Max>
    48     <EjectHealth>0.1</EjectHealth>
    49     <List datatype="tokens">Support Infantry Cavalry</List>
    50     <BuffHeal>1</BuffHeal>
     48    <EjectHealth>0.1</EjectHealth>
     49    <List datatype="tokens">Support Infantry Cavalry</List>
     50    <BuffHeal>1</BuffHeal>
     51    <LoadingRange>2</LoadingRange>
    5152  </GarrisonHolder>
    5253  <Health>
    5354    <Max>3000</Max>
  • binaries/data/mods/public/simulation/templates/template_structure_civic_temple.xml

     
    2727  </Footprint>
    2828  <GarrisonHolder>
    2929    <Max>15</Max>
    30     <EjectHealth>0.1</EjectHealth>
    31     <List datatype="tokens">Support Infantry Cavalry</List>
    32     <BuffHeal>2</BuffHeal>
     30    <EjectHealth>0.1</EjectHealth>
     31    <List datatype="tokens">Support Infantry Cavalry</List>
     32    <BuffHeal>2</BuffHeal>
     33    <LoadingRange>2</LoadingRange>
    3334  </GarrisonHolder>
    3435  <Health>
    3536    <Max>2000</Max>
  • binaries/data/mods/public/simulation/templates/template_structure_defense_defense_tower.xml

     
    3737  </Footprint>
    3838  <GarrisonHolder>
    3939    <Max>5</Max>
    40     <EjectHealth>0.1</EjectHealth>
    41     <List datatype="tokens">Support Infantry</List>
    42     <BuffHeal>1</BuffHeal>
     40    <EjectHealth>0.1</EjectHealth>
     41    <List datatype="tokens">Support Infantry</List>
     42    <BuffHeal>1</BuffHeal>
     43    <LoadingRange>2</LoadingRange>
    4344  </GarrisonHolder>
    4445  <Health>
    4546    <Max>1200</Max>
  • binaries/data/mods/public/simulation/templates/template_structure_defense_outpost.xml

     
    2323  </Footprint>
    2424  <GarrisonHolder>
    2525    <Max>1</Max>
    26     <EjectHealth>0.1</EjectHealth>
    27     <List datatype="tokens">Support Infantry</List>
    28     <BuffHeal>1</BuffHeal>
     26    <EjectHealth>0.1</EjectHealth>
     27    <List datatype="tokens">Support Infantry</List>
     28    <BuffHeal>1</BuffHeal>
     29    <LoadingRange>2</LoadingRange>
    2930  </GarrisonHolder>
    3031  <Health>
    3132    <Max>800</Max>
  • binaries/data/mods/public/simulation/templates/template_structure_defense_wall_tower.xml

     
    3636  </Footprint>
    3737  <GarrisonHolder>
    3838    <Max>5</Max>
    39     <EjectHealth>0.1</EjectHealth>
    40     <List datatype="tokens">Support Infantry</List>
    41     <BuffHeal>1</BuffHeal>
     39    <EjectHealth>0.1</EjectHealth>
     40    <List datatype="tokens">Support Infantry</List>
     41    <BuffHeal>1</BuffHeal>
     42    <LoadingRange>2</LoadingRange>
    4243  </GarrisonHolder>
    4344  <Health>
    4445    <Max>2500</Max>
  • binaries/data/mods/public/simulation/templates/template_structure_military_barracks.xml

     
    2020  </Footprint>
    2121  <GarrisonHolder>
    2222    <Max>10</Max>
    23     <EjectHealth>0.1</EjectHealth>
    24     <List datatype="tokens">Infantry Cavalry</List>
    25     <BuffHeal>1</BuffHeal>
     23    <EjectHealth>0.1</EjectHealth>
     24    <List datatype="tokens">Infantry Cavalry</List>
     25    <BuffHeal>1</BuffHeal>
     26    <LoadingRange>2</LoadingRange>
    2627  </GarrisonHolder>
    2728  <Health>
    2829    <Max>2000</Max>
  • binaries/data/mods/public/simulation/templates/template_structure_military_fortress.xml

     
    3838  </Footprint>
    3939  <GarrisonHolder>
    4040    <Max>20</Max>
    41     <EjectHealth>0.1</EjectHealth>
    42     <List datatype="tokens">Support Infantry Cavalry Siege</List>
    43     <BuffHeal>1</BuffHeal>
     41    <EjectHealth>0.1</EjectHealth>
     42    <List datatype="tokens">Support Infantry Cavalry Siege</List>
     43    <BuffHeal>1</BuffHeal>
     44    <LoadingRange>2</LoadingRange>
    4445  </GarrisonHolder>
    4546  <Health>
    4647    <Max>4200</Max>
  • binaries/data/mods/public/simulation/templates/template_structure_resource_corral.xml

     
    1717  </Footprint>
    1818  <GarrisonHolder>
    1919    <Max>10</Max>
    20     <EjectHealth>0.1</EjectHealth>
    21     <List datatype="tokens">Animal</List>
    22     <BuffHeal>1</BuffHeal>
     20    <EjectHealth>0.1</EjectHealth>
     21    <List datatype="tokens">Animal</List>
     22    <BuffHeal>1</BuffHeal>
     23    <LoadingRange>2</LoadingRange>
    2324  </GarrisonHolder>
    2425  <Health>
    2526    <Max>500</Max>
  • binaries/data/mods/public/simulation/templates/template_structure_special.xml

     
    1818  </Footprint>
    1919  <GarrisonHolder>
    2020    <Max>5</Max>
    21     <EjectHealth>0.1</EjectHealth>
    22     <List datatype="tokens">Support Infantry Cavalry</List>
    23     <BuffHeal>1</BuffHeal>
     21    <EjectHealth>0.1</EjectHealth>
     22    <List datatype="tokens">Support Infantry Cavalry</List>
     23    <BuffHeal>1</BuffHeal>
     24    <LoadingRange>2</LoadingRange>
    2425  </GarrisonHolder>
    2526  <Health>
    2627    <Max>2000</Max>
  • binaries/data/mods/public/simulation/templates/template_unit_mechanical_ship_bireme.xml

     
    3333    <EjectHealth>0</EjectHealth>
    3434    <List datatype="tokens">Support Infantry Cavalry</List>
    3535    <BuffHeal>1</BuffHeal>
     36    <LoadingRange>10</LoadingRange>
    3637  </GarrisonHolder>
    3738  <Health>
    3839    <Max>800</Max>
  • binaries/data/mods/public/simulation/templates/template_unit_mechanical_ship_fishing.xml

     
    2323    <EjectHealth>0</EjectHealth>
    2424    <List datatype="tokens">Support Infantry</List>
    2525    <BuffHeal>1</BuffHeal>
     26    <LoadingRange>10</LoadingRange>
    2627  </GarrisonHolder>
    2728  <Identity>
    2829    <GenericName>Fishing Boat</GenericName>
  • binaries/data/mods/public/simulation/templates/template_unit_mechanical_ship_merchant.xml

     
    1616    <EjectHealth>0</EjectHealth>
    1717    <List datatype="tokens">Support Infantry Cavalry</List>
    1818    <BuffHeal>1</BuffHeal>
     19    <LoadingRange>10</LoadingRange>
    1920  </GarrisonHolder>
    2021  <Health>
    2122    <Max>400</Max>
  • binaries/data/mods/public/simulation/templates/template_unit_mechanical_ship_quinquereme.xml

     
    3333    <EjectHealth>0</EjectHealth>
    3434    <List datatype="tokens">Support Infantry Cavalry Siege</List>
    3535    <BuffHeal>1</BuffHeal>
     36    <LoadingRange>10</LoadingRange>
    3637  </GarrisonHolder>
    3738  <Health>
    3839    <Max>2000</Max>
  • binaries/data/mods/public/simulation/templates/template_unit_mechanical_ship_trireme.xml

     
    3737    <EjectHealth>0</EjectHealth>
    3838    <List datatype="tokens">Support Infantry Cavalry Siege</List>
    3939    <BuffHeal>1</BuffHeal>
     40    <LoadingRange>10</LoadingRange>
    4041  </GarrisonHolder>
    4142  <Health>
    4243    <Max>1400</Max>
  • binaries/data/mods/public/simulation/templates/template_unit_mechanical_siege_ram.xml

     
    4848      <metal>100</metal>
    4949    </Resources>
    5050  </Cost>
     51  <GarrisonHolder>
     52    <Max>5</Max>
     53    <EjectHealth>0.1</EjectHealth>
     54    <List datatype="tokens">Support Infantry</List>
     55    <BuffHeal>1</BuffHeal>
     56    <LoadingRange>2</LoadingRange>
     57  </GarrisonHolder>
    5158  <Health>
    5259    <Max>200</Max>
    5360  </Health>
  • binaries/data/mods/public/simulation/templates/template_unit_mechanical_siege_tower.xml

     
    2525  </Cost>
    2626  <GarrisonHolder>
    2727    <Max>20</Max>
    28     <EjectHealth>0.1</EjectHealth>
    29     <List datatype="tokens">Support Infantry</List>
    30     <BuffHeal>1</BuffHeal>
     28    <EjectHealth>0.1</EjectHealth>
     29    <List datatype="tokens">Support Infantry</List>
     30    <BuffHeal>1</BuffHeal>
     31    <LoadingRange>2</LoadingRange>
    3132  </GarrisonHolder>
    3233  <Health>
    3334    <Max>800</Max>
  • binaries/data/mods/public/simulation/templates/units/celt_mechanical_siege_ram.xml

     
    1616  </Footprint>
    1717  <GarrisonHolder>
    1818    <Max>10</Max>
    19     <EjectHealth>0.1</EjectHealth>
    20     <List datatype="tokens">Support Infantry</List>
    21     <BuffHeal>1</BuffHeal>
    2219  </GarrisonHolder>
    2320  <Health>
    2421    <Max>250</Max>
  • binaries/data/mods/public/simulation/templates/units/iber_mechanical_siege_ram.xml

     
    44    <Square width="6.75" depth="9.0"/>
    55    <Height>3.0</Height>
    66  </Footprint>
    7   <GarrisonHolder>
    8     <Max>5</Max>
    9     <EjectHealth>0.1</EjectHealth>
    10     <List datatype="tokens">Support Infantry</List>
    11     <BuffHeal>1</BuffHeal>
    12   </GarrisonHolder>
    137  <Identity>
    148    <Civ>iber</Civ>
    159    <SpecificName>Ariete</SpecificName>
  • binaries/data/mods/public/simulation/templates/units/rome_mechanical_siege_ram.xml

     
    2020    <Square width="8.0" depth="12.0"/>
    2121    <Height>3.0</Height>
    2222  </Footprint>
    23   <GarrisonHolder>
    24     <Max>5</Max>
    25     <EjectHealth>0.1</EjectHealth>
    26     <List datatype="tokens">Support Infantry</List>
    27     <BuffHeal>1</BuffHeal>
    28   </GarrisonHolder>
    2923  <Identity>
    3024    <Civ>rome</Civ>
    3125    <SpecificName>Aries</SpecificName>