Ticket #13: diffFormation-15-02-2010.patch

File diffFormation-15-02-2010.patch, 12.6 KB (added by Badmadblacksad, 13 years ago)
  • binaries/data/mods/public/gui/session/input.js

     
    10631063
    10641064    if (entity)
    10651065    {
     1066        submitChatDirectly(formationName);
    10661067        console.write(formationName);
     1068
     1069        var selection = g_Selection.toList();
     1070        Engine.PostNetworkCommand({
     1071            "type": "formation",
     1072            "entities": selection,
     1073            "name": formationName
     1074        });
     1075
    10671076    }
    10681077}
    10691078
  • binaries/data/mods/public/simulation/helpers/Commands.js

     
    236236       
    237237        var cmpGarrisonHolder = Engine.QueryInterface(cmd.garrisonHolder, IID_GarrisonHolder);
    238238        cmpGarrisonHolder.UnloadAll();
     239        break;     
     240
     241    case "formation":
     242        var cmpUnitAI = GetFormationUnitAI(cmd.entities);
     243        if(!cmpUnitAI)
     244            break;
     245        var cmpFormation = Engine.QueryInterface(cmpUnitAI.entity, IID_Formation);
     246        if (!cmpFormation)
     247            break;
     248        cmpFormation.LoadFormation(cmd.name);
     249        cmpFormation.MoveMembersIntoFormation(true);
    239250        break;
    240251       
    241252    default:
  • binaries/data/mods/public/simulation/components/Identity.js

     
    6868                        "<value>Infantry</value>" +
    6969                        "<value>Cavalry</value>" +
    7070                        "<value>Ranged</value>" +
     71                        "<value>Melee</value>" +
    7172                        "<value>Mechanical</value>" +
    7273                        "<value>Ship</value>" +
    7374                        "<value>Siege</value>" +
  • binaries/data/mods/public/simulation/components/Formation.js

     
    99{
    1010    this.members = []; // entity IDs currently belonging to this formation
    1111    this.columnar = false; // whether we're travelling in column (vs box) formation
     12    this.LoadFormation("Formation2"); // default pattern
    1213};
    1314
    1415Formation.prototype.GetMemberCount = function()
     
    114115    var active = [];
    115116    var positions = [];
    116117
    117     var types = { "Unknown": 0 }; // TODO: make this work so we put ranged behind infantry etc
     118    var types = {   "Ranged" : 0,
     119                                "Melee" : 0,
     120                                "Support" : 0,
     121                                "Hero" : 0,
     122                                "Unknown": 0
     123    }; // TODO: make this work so we put ranged behind infantry etc
    118124
    119125    for each (var ent in this.members)
    120126    {
     
    125131        active.push(ent);
    126132        positions.push(cmpPosition.GetPosition());
    127133
    128         types["Unknown"] += 1; // TODO
     134        var cmpIdentity = Engine.QueryInterface(ent, IID_Identity);
     135        var classes = cmpIdentity.GetClassesList();
     136        for each (var cla in classes)
     137        {
     138            if(cla in types)
     139            {
     140                types[cla] += 1;
     141                break;
     142            }
     143        }
    129144    }
    130145
    131146    // Work out whether this should be a column or box formation
     
    147162
    148163    for (var i = 0; i < active.length; ++i)
    149164    {
    150         var offset = offsets[i];
     165        var assigned = false;
    151166
    152         var cmpUnitAI = Engine.QueryInterface(active[i], IID_UnitAI);
    153         cmpUnitAI.ReplaceOrder("FormationWalk", {
    154             "target": this.entity,
    155             "x": offset.x - avgoffset.x,
    156             "z": offset.z - avgoffset.z
    157         });
     167        var cmpIdentity = Engine.QueryInterface(active[i], IID_Identity);
     168        var classes = cmpIdentity.GetClassesList();
     169        for(var j = 0; j < offsets.length && !assigned; ++j)
     170        {
     171            for each (var cla in classes)
     172            {
     173                if(!offsets[j].category || offsets[j].category.toString().indexOf(cla)!=-1) //ugly. TODO
     174                {
     175                    var cmpUnitAI = Engine.QueryInterface(active[i], IID_UnitAI);
     176                    cmpUnitAI.ReplaceOrder("FormationWalk", {
     177                        "target": this.entity,
     178                        "x": offsets[j].x - avgoffset.x,
     179                        "z": offsets[j].z - avgoffset.z
     180                    });
     181
     182                    offsets.splice(j,1);
     183
     184                    assigned = true;
     185                    break;
     186                }
     187            }
     188        }
    158189    }
    159190};
    160191
     
    181212{
    182213    var separation = 4; // TODO: don't hardcode this
    183214
    184     var count = types["Unknown"];
     215    var count = 0;
     216    for( var t in types )
     217        count += types[t];
    185218
    186219    // Choose a sensible width for the basic default formation
    187220    var cols;
     
    193226        else
    194227            cols = 3;
    195228    }
    196     else
    197     {
    198         // Try to have at least 5 files (so batch training gives a single line),
    199         // and at most 8
    200         if (count <= 5)
    201             cols = count;
    202         if (count <= 10)
    203             cols = 5;
    204         else if (count <= 16)
    205             cols = Math.ceil(count / 2);
    206         else
    207             cols = 8;
    208     }
    209229
    210     var ranks = Math.ceil(count / cols);
    211 
    212230    var offsets = [];
    213231
    214     var left = count;
    215     for (var r = 0; r < ranks; ++r)
     232    if(columnar)
    216233    {
    217         var n = Math.min(left, cols);
    218         for (var c = 0; c < n; ++c)
     234        var ranks = Math.ceil(count / cols);
     235        var left = count;
     236        for (var r = 0; r < ranks; ++r)
    219237        {
    220             var x = ((n-1)/2 - c) * separation;
    221             var z = -r * separation;
    222             offsets.push({"x": x, "z": z});
     238            var n = Math.min(left, cols);
     239            for (var c = 0; c < n; ++c)
     240            {
     241                var x = ((n-1)/2 - c) * separation;
     242                var z = -r * separation;
     243                offsets.push({"x": x, "z": z, "category" : undefined});
     244            }
     245            left -= n;
    223246        }
    224         left -= n;
    225247    }
     248    else
     249    {
     250        for (var s = 0; s < this.blob.slots.length; ++s)
     251        {
     252            offsets.push({"x" : this.blob.slots[s].c*this.blob.filespacing,
     253                                        "z" :-this.blob.slots[s].l*this.blob.rankspacing,
     254                                        "category" : this.blob.slots[s].category});
     255        }
     256    }
    226257
    227258    return offsets;
    228259};
     
    286317        this.RemoveMembers([msg.entity]);
    287318};
    288319
     320//
     321Formation.prototype.LoadFormation = function(formationName)
     322{
     323    var rawData = Engine.ReadJSONFile(formationName+".json");
     324    if (!rawData)
     325        return;
     326
     327    var slots = [];
     328
     329    var maxorder = 0;
     330    var ranks = rawData.Matrix.length;
     331    for(var i=0; i<ranks; ++i)
     332    {
     333        var files = rawData.Matrix[i].length;
     334        for(var j=0; j<files; ++j)
     335        {
     336            var order = rawData.Matrix[i][j].order-1;
     337            var category = rawData.Matrix[i][j].category;
     338            slots[order] = {"l":i,"c":j,"category":category};
     339            if (order>maxorder)
     340                maxorder = order;
     341        }
     342    }
     343
     344    for (var e = 1; e <= maxorder; ++e)
     345    {
     346        if(!slots[e])
     347            return;
     348    }
     349
     350    var dataFormation = {};
     351    dataFormation.name = formationName;
     352    dataFormation.slots =  slots;
     353    dataFormation.rankspacing = rawData.rankspacing;
     354    dataFormation.filespacing = rawData.filespacing;
     355
     356    this.blob = dataFormation;
     357}
     358
     359
    289360Engine.RegisterComponentType(IID_Formation, "Formation", Formation);
  • binaries/data/mods/public/simulation/data/Formation1.json

     
     1{
     2  "FormationLongName":"Formation1",
     3  "rankspacing" : 3.0,
     4  "filespacing" : 3.0,
     5  "Matrix":
     6  [
     7    [
     8      {"order":1, "category":["Melee"]},
     9      {"order":10, "category":["Melee"]},
     10      {"order":26, "category":["Melee"]},
     11      {"order":2, "category":["Melee"]},
     12      {"order":27, "category":["Melee"]},
     13      {"order":11, "category":["Melee"]},
     14      {"order":3, "category":["Melee"]}
     15    ],
     16    [
     17      {"order":12, "category":["Melee"]},
     18      {"order":18, "category":["Melee","Ranged"]},
     19      {"order":34, "category":["Melee","Ranged"]},
     20      {"order":22, "category":["Melee","Ranged"]},
     21      {"order":35, "category":["Melee","Ranged"]},
     22      {"order":19, "category":["Melee","Ranged"]},
     23      {"order":13, "category":["Melee"]}
     24    ],
     25    [
     26      {"order":28, "category":["Melee"]},
     27      {"order":36, "category":["Melee","Ranged"]},
     28      {"order":42, "category":["Melee","Ranged", "Support"]},
     29      {"order":46, "category":["Melee","Ranged", "Support"]},
     30      {"order":43, "category":["Melee","Ranged", "Support"]},
     31      {"order":37, "category":["Melee","Ranged"]},
     32      {"order":29, "category":["Melee"]}
     33    ],
     34    [
     35      {"order":4, "category":["Melee"]},
     36      {"order":23, "category":["Melee","Ranged"]},
     37      {"order":47, "category":["Melee","Ranged", "Support"]},
     38      {"order":5},
     39      {"order":48, "category":["Melee","Ranged", "Support"]},
     40      {"order":24, "category":["Melee","Ranged"]},
     41      {"order":6, "category":["Melee"]}
     42    ],
     43    [
     44      {"order":30, "category":["Melee"]},
     45      {"order":38, "category":["Melee","Ranged"]},
     46      {"order":44, "category":["Melee","Ranged", "Support"]},
     47      {"order":49, "category":["Melee","Ranged", "Support"]},
     48      {"order":45, "category":["Melee","Ranged", "Support"]},
     49      {"order":39, "category":["Melee","Ranged"]},
     50      {"order":31, "category":["Melee"]}
     51    ],
     52    [
     53      {"order":14, "category":["Melee"]},
     54      {"order":20, "category":["Melee","Ranged"]},
     55      {"order":40, "category":["Melee","Ranged"]},
     56      {"order":25, "category":["Melee","Ranged"]},
     57      {"order":41, "category":["Melee","Ranged"]},
     58      {"order":21, "category":["Melee","Ranged"]},
     59      {"order":15, "category":["Melee"]}
     60    ],
     61    [
     62      {"order":7, "category":["Melee"]},
     63      {"order":16, "category":["Melee"]},
     64      {"order":32, "category":["Melee"]},
     65      {"order":8, "category":["Melee"]},
     66      {"order":33, "category":["Melee"]},
     67      {"order":17, "category":["Melee"]},
     68      {"order":9, "category":["Melee"]}
     69    ]
     70
     71  ]
     72}
  • binaries/data/mods/public/simulation/data/Formation2.json

    Property changes on: binaries/data/mods/public/simulation/data/Formation1.json
    ___________________________________________________________________
    Added: svn:executable
       + *
    
     
     1{
     2  "FormationLongName":"Default formation",
     3  "rankspacing" : 4.0,
     4  "filespacing" : 4.0,
     5  "Matrix":
     6  [
     7    [
     8      {"order":1},
     9      {"order":2},
     10      {"order":3},
     11      {"order":4},
     12      {"order":5}
     13    ],
     14    [
     15      {"order":10},
     16      {"order":8},
     17      {"order":6},
     18      {"order":7},
     19      {"order":9}
     20    ],
     21    [
     22      {"order":15},
     23      {"order":13},
     24      {"order":11},
     25      {"order":12},
     26      {"order":14}
     27    ],
     28    [
     29      {"order":20},
     30      {"order":18},
     31      {"order":16},
     32      {"order":17},
     33      {"order":19}
     34    ]
     35  ]
     36}
  • binaries/data/mods/public/simulation/data/Formation3.json

    Property changes on: binaries/data/mods/public/simulation/data/Formation2.json
    ___________________________________________________________________
    Added: svn:executable
       + *
    
     
     1{
     2  "FormationLongName":"Formation3",
     3  "rankspacing" : 5.0,
     4  "filespacing" : 5.0,
     5  "Matrix":
     6  [
     7    [
     8      {"order":1, "category":["Melee","Ranged"]},
     9      {"order":2},
     10      {"order":3},
     11      {"order":4}
     12    ],
     13    [
     14      {"order":8},
     15      {"order":5},
     16      {"order":6},
     17      {"order":7}
     18    ],
     19    [
     20      {"order":12},
     21      {"order":9},
     22      {"order":10},
     23      {"order":11}
     24    ]
     25  ]
     26}
  • binaries/data/mods/public/simulation/templates/template_unit_infantry_ranged.xml

    Property changes on: binaries/data/mods/public/simulation/data/Formation3.json
    ___________________________________________________________________
    Added: svn:executable
       + *
    
     
    22<Entity parent="template_unit_infantry">
    33  <Identity>
    44    <GenericName>Ranged</GenericName>
     5    <Classes datatype="tokens">Ranged Infantry</Classes>
    56  </Identity>
    67  <Health>
    78    <Max>90</Max>
  • binaries/data/mods/public/simulation/templates/template_unit_infantry_melee.xml

     
    22<Entity parent="template_unit_infantry">
    33  <Identity>
    44    <GenericName>Melee Infantry</GenericName>
     5    <Classes datatype="tokens">Melee Infantry</Classes>
    56  </Identity>
    67  <Health>
    78    <Max>100</Max>