Ticket #3993: notciv_v3-3.patch

File notciv_v3-3.patch, 9.3 KB (added by s0600204, 8 years ago)

Suggestions from elexis from irc

  • binaries/data/mods/public/gui/structree/helper.js

    diff --git a/binaries/data/mods/public/gui/structree/helper.js b/binaries/data/mods/public/gui/structree/helper.js
    index eef5c6c..ef17e62 100644
    a b function GetTemplateData(templateName)  
    107107    var template = loadTemplate(templateName);
    108108    return GetTemplateDataHelper(template, null, g_AuraData);
    109109}
     110
     111/**
     112 * Determines and returns the phase of a given technology. Works
     113 * recursively through the given tech's pre-requisite and superseded
     114 * techs if necessary.
     115 *
     116 * @param {string} techName - The Technology's name
     117 * @return The name of the phase the technology belongs to, or false if
     118 *         the current civ can't research this tech
     119 */
     120function GetPhaseOfTechnology(techName)
     121{
     122    let phaseIdx = -1;
     123
     124    if (depath(techName).slice(0, 5) === "phase")
     125    {
     126        phaseIdx = g_ParsedData.phaseList.indexOf(g_ParsedData.phases[techName].actualPhase);
     127        if (phaseIdx > 0)
     128            return g_ParsedData.phaseList[phaseIdx - 1];
     129        warn("Unrecognised phase (" + techName + ")");
     130        return false;
     131    }
     132
     133    let techReqs = g_ParsedData.techs[techName].reqs;
     134    let reqs = [];
     135
     136    if (g_SelectedCiv in techReqs)
     137    {
     138        if (techReqs[g_SelectedCiv] === false)
     139            return false;
     140        reqs = techReqs[g_SelectedCiv];
     141    }
     142    else if ("generic" in techReqs)
     143        reqs = techReqs.generic;
     144
     145    for (let req of reqs)
     146    {
     147        if (depath(req).slice(0, 5) === "phase")
     148            return req;
     149        phaseIdx = Math.max(phaseIdx, g_ParsedData.phaseList.indexOf(GetPhaseOfTechnology(req)));
     150    }
     151    return g_ParsedData.phaseList[phaseIdx] || false;
     152}
  • binaries/data/mods/public/gui/structree/load.js

    diff --git a/binaries/data/mods/public/gui/structree/load.js b/binaries/data/mods/public/gui/structree/load.js
    index 534747b..de44619 100644
    a b function loadTechnology(techName)  
    188188
    189189    if (template.requirements !== undefined)
    190190    {
    191         for (let op in template.requirements)
    192         {
    193             let val = template.requirements[op];   
    194             let req = calcReqs(op, val);
    195 
    196             switch (op)
    197             {
    198             case "tech":
    199                 tech.reqs.generic = req;
    200                 break;
    201 
    202             case "civ":
    203                 tech.reqs[req] = [];
    204                 break;
    205 
    206             case "any":
    207                 if (req[0].length > 0)
    208                     for (let r of req[0])
    209                     {
    210                         let v = req[0][r];
    211                         if (typeof r == "number")
    212                             tech.reqs[v] = [];
    213                         else
    214                             tech.reqs[r] = v;
    215                     }
    216                 if (req[1].length > 0)
    217                     tech.reqs.generic = req[1];
    218                 break;
    219 
    220             case "all":
    221                 if (!req[0].length)
    222                     tech.reqs.generic = req[1];
    223                 else
    224                     for (let r of req[0])
    225                         tech.reqs[r] = req[1];
    226                 break;
    227             }
    228         }
     191        let op = Object.keys(template.requirements)[0];
     192        let val = template.requirements[op];
     193        tech.reqs = calcReqs(op, val);
    229194    }
    230195
    231196    if (template.supersedes !== undefined)
    232197    {
    233198        if (tech.reqs.generic !== undefined)
    234199            tech.reqs.generic.push(template.supersedes);
     200        else if (!Object.keys(tech.reqs).length)
     201            tech.reqs.generic = [template.supersedes];
    235202        else
    236203            for (let ck of Object.keys(tech.reqs))
    237                 tech.reqs[ck].push(template.supersedes);
     204                if (tech.reqs[ck])
     205                    tech.reqs[ck].push(template.supersedes);
    238206    }
    239207
    240208    return tech;
    function loadTechnologyPair(pairCode)  
    266234 * Calculate the prerequisite requirements of a technology.
    267235 * Works recursively if needed.
    268236 *
    269  * @param op The base operation. Can be "civ", "tech", "all" or "any".
    270  * @param val The value associated with the above operation.
     237 * @param {string} operator - The base operation. Can be "civ", "notciv", "tech", "all" or "any".
     238 * @param {mixed} value - The value associated with the above operation.
    271239 *
    272  * @return Sorted requirments.
     240 * @return Object containing the requirements, sorted.
    273241 */
    274 function calcReqs(op, val)
     242function calcReqs(operator, value)
    275243{
    276     switch (op)
     244    let requirements = {};
     245
     246    switch (operator)
    277247    {
    278248    case "civ":
    279     case "class":
     249        requirements[value] = [];
     250        break;
     251
    280252    case "notciv":
     253        requirements[value] = false;
     254        break;
     255
     256    case "class":
    281257    case "number":
    282         // nothing needs doing
     258        // do nothing
    283259        break;
    284260
    285261    case "tech":
    286         if (depath(val).slice(0,4) === "pair")
    287             return loadTechnologyPair(val).techs;
    288         return [ val ];
     262        if (depath(value).slice(0,4) === "pair")
     263            return { "generic": loadTechnologyPair(value).techs };
     264        return { "generic": [ value ] };
    289265
    290266    case "all":
    291     case "any":
    292         let t = [];
    293         let c = [];
    294         for (let nv of val)
    295         {
    296             for (let o in nv)
     267    {
     268        let civs = [];
     269        let techs = [];
     270        for (let subvalue of value)
     271            for (let newOper in subvalue)
    297272            {
    298                 let v = nv[o];
    299                 let r = calcReqs(o, v);
    300                 switch (o)
     273                let newValue = subvalue[newOper];
     274                let result = calcReqs(newOper, newValue)
     275
     276                switch (newOper)
    301277                {
    302278                case "civ":
     279                    civs.push(Object.keys(result)[0]);
     280                    break;
     281
    303282                case "notciv":
    304                     c.push(r);
     283                    requirements[Object.keys(result)[0]] = false;
    305284                    break;
    306285
    307286                case "tech":
    308                     t = t.concat(r);
     287                    techs = techs.concat(result.generic);
    309288                    break;
    310289
    311290                case "any":
    312                     c = c.concat(r[0]);
    313                     t = t.concat(r[1]);
     291                case "all":
     292                {
     293                    if (result.generic)
     294                        techs = techs.concat(result.generic);
     295                    else
     296                        for (let civ in result)
     297                            if (result[civ] === false)
     298                                requirements[civ] = false;
     299                            else if (newOper === "any")
     300                                civs.push(civ);
     301                            else
     302                                warn("Incomprehensible technology requirements - "+operator +":"+uneval(value));
     303                }
     304                break;
     305
     306                }
     307            }
     308        if (!civs.length && techs.length)
     309            requirements.generic = techs;
     310        else
     311            for (let civ of civs)
     312                requirements[civ] = techs;
     313    }
     314    break;
     315
     316    case "any":
     317    {
     318        for (let subvalue of value)
     319            for (let newOper in subvalue)
     320            {
     321                let newValue = subvalue[newOper];
     322                let result = calcReqs(newOper, newValue)
     323
     324                switch (newOper)
     325                {
     326                case "civ":
     327                    requirements[Object.keys(result)[0]] = [];
     328                    break;
     329
     330                case "notciv":
     331                    requirements[Object.keys(result)[0]] = false;
     332                    break;
     333
     334                case "tech":
     335                    if (!requirements.generic)
     336                        requirements.generic = [];
     337                    requirements.generic.push(result.generic);
    314338                    break;
    315339
    316340                case "all":
    317                     for (let ci in r[0])
    318                         c[ci] = r[1];
    319                     t = t;
     341                    for (let civ in result)
     342                        requirements[civ] = result[civ];
     343                    break;
     344
     345                case "any":
     346                    for (let civ in result)
     347                    {
     348                        if (!requirements[civ])
     349                        {
     350                            warn("Possible any/all req operator problem - "+operator +":"+uneval(value));
     351                            requirements[civ] = [];
     352                        }
     353                        for (let val of result[civ])
     354                            requirements.generic.push(val);
     355                    }
     356                    break;
    320357                }
    321358            }
    322         }
    323         return [ c, t ];
     359    }
     360    break;
    324361
    325362    default:
    326         warn("Unknown reqs operator: "+op);
     363        warn("Unknown requirement operator: "+operator);
    327364    }
    328     return val;
     365
     366    return requirements;
    329367}
    330368
    331369/**
    function unravelPhases(techs)  
    364402        let reqPhasePos = phaseList.indexOf(reqPhase);
    365403        let myPhasePos = phaseList.indexOf(myPhase);
    366404
    367         if (phaseList.length === 0)
     405        if (!phaseList.length)
    368406            phaseList = [reqPhase, myPhase];
    369407        else if (reqPhasePos < 0 && myPhasePos > -1)
    370408            phaseList.splice(myPhasePos, 0, reqPhase);
  • binaries/data/mods/public/gui/structree/structree.js

    diff --git a/binaries/data/mods/public/gui/structree/structree.js b/binaries/data/mods/public/gui/structree/structree.js
    index 65bfd9e..1415022 100644
    a b function selectCiv(civCode)  
    188188        let newProdTech = {};
    189189        for (let prod of structInfo.production.technology)
    190190        {
    191             let phase = "";
     191            let phase = GetPhaseOfTechnology(prod);
    192192
    193             if (depath(prod).slice(0,5) === "phase")
    194             {
    195                 phase = g_ParsedData.phaseList.indexOf(g_ParsedData.phases[prod].actualPhase);
    196                 if (phase > 0)
    197                     phase = g_ParsedData.phaseList[phase - 1];
    198             }
    199             else if (g_SelectedCiv in g_ParsedData.techs[prod].reqs)
    200             {
    201                 for (let req of g_ParsedData.techs[prod].reqs[g_SelectedCiv])
    202                     if (depath(req).slice(0,5) === "phase")
    203                         phase = req;
    204             }
    205             else if ("generic" in g_ParsedData.techs[prod].reqs)
    206             {
    207                 for (let req of g_ParsedData.techs[prod].reqs.generic)
    208                     if (depath(req).slice(0,5) === "phase")
    209                         phase = req;
    210             }
     193            if (phase === false)
     194                continue;
    211195
    212             if (depath(phase).slice(0,5) !== "phase" ||
    213                 g_ParsedData.phaseList.indexOf(phase) < structPhaseIdx)
     196            if (g_ParsedData.phaseList.indexOf(phase) < structPhaseIdx)
    214197            {
    215198                if (structInfo.phase !== false)
    216199                    phase = structInfo.phase;
    function selectCiv(civCode)  
    243226            }
    244227            else if (unit.required !== undefined)
    245228            {
    246                 if (g_ParsedData.phases[unit.required])
    247                     phase = g_ParsedData.phases[unit.required].actualPhase;
    248                 else if (g_ParsedData.techs[unit.required])
    249                 {
    250                     let reqs = g_ParsedData.techs[unit.required].reqs;
    251                     if (reqs[g_SelectedCiv])
    252                         phase = reqs[g_SelectedCiv][0];
    253                     else if (reqs.generic)
    254                         phase = reqs.generic[0];
    255                     else
    256                         warn("Empty requirements found on technology " + unit.required);
    257                 }
    258                 else
    259                     warn("Technology " + unit.required + " for " + prod + " not found.");
     229                phase = GetPhaseOfTechnology(unit.required);
     230                if (phase === false)
     231                    continue;
    260232            }
    261233
    262234            if (depath(phase).slice(0,5) !== "phase" || g_ParsedData.phaseList.indexOf(phase) < structPhaseIdx)