Ticket #3899: patch.7.diff

File patch.7.diff, 6.3 KB (added by fatherbushido, 8 years ago)

more filters

  • binaries/data/mods/public/simulation/components/ProductionQueue.js

    ProductionQueue.prototype.CalculateEntit  
    139139 */
    140140ProductionQueue.prototype.GetTechnologiesList = function()
    141141{
    142142    if (!this.template.Technologies)
    143143        return [];
    144    
     144
    145145    var string = this.template.Technologies._string;
    146146    if (!string)
    147147        return [];
    148    
     148
    149149    var cmpTechnologyManager = QueryOwnerInterface(this.entity, IID_TechnologyManager);
    150150    if (!cmpTechnologyManager)
    151151        return [];
    152152   
    153153    var cmpPlayer = QueryOwnerInterface(this.entity);
    154154    var cmpIdentity = Engine.QueryInterface(this.entity, IID_Identity);
    155155    if (!cmpPlayer || !cmpIdentity)
    156156        return [];
    157157
    158158    var techs = string.split(/\s+/);
     159
     160    // Remove any technologies that can't be searched by this civ (after capture for example)
     161    techs = techs.filter(tech => {
     162        let reqs = cmpTechnologyManager.GetTechnologyTemplate(tech).requirements || null;
     163        return cmpTechnologyManager.CheckTechnologyRequirements(reqs, true);
     164    });
     165
    159166    var techList = [];
    160167    var superseded = {}; // Stores the tech which supersedes the key
    161168
    162169    var disabledTechnologies = cmpPlayer.GetDisabledTechnologies();
    163    
     170
    164171    // Add any top level technologies to an array which corresponds to the displayed icons
    165172    // Also store what a technology is superceded by in the superceded object {"tech1":"techWhichSupercedesTech1", ...}
    166173    for (var i in techs)
    167174    {
    168175        var tech = techs[i];
    ProductionQueue.prototype.GetTechnologie  
    172179        if (!template.supersedes || techs.indexOf(template.supersedes) === -1)
    173180            techList.push(tech);
    174181        else
    175182            superseded[template.supersedes] = tech;
    176183    }
    177    
     184
    178185    // Now make researched/in progress techs invisible
    179186    for (var i in techList)
    180187    {
    181188        var tech = techList[i];
    182189        while (this.IsTechnologyResearchedOrInProgress(tech))
    ProductionQueue.prototype.GetTechnologie  
    184191            tech = superseded[tech];
    185192        }
    186193       
    187194        techList[i] = tech;
    188195    }
    189    
     196
    190197    var ret = [];
    191    
     198
    192199    // This inserts the techs into the correct positions to line up the technology pairs
    193200    for (var i = 0; i < techList.length; i++)
    194201    {
    195202        var tech = techList[i];
    196203        if (!tech)
    197204        {
    198205            ret[i] = undefined;
    199206            continue;
    200207        }
    201        
     208
    202209        var template = cmpTechnologyManager.GetTechnologyTemplate(tech);
    203210        if (template.top)
    204211            ret[i] = {"pair": true, "top": template.top, "bottom": template.bottom};
    205212        else
    206213            ret[i] = tech;
    207214    }
    208    
     215
    209216    return ret;
    210217};
    211218
    212219ProductionQueue.prototype.IsTechnologyResearchedOrInProgress = function(tech)
    213220{
  • binaries/data/mods/public/simulation/components/TechnologyManager.js

    TechnologyManager.prototype.CanProduce =  
    8383    var cmpTempManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_TemplateManager);
    8484    var template = cmpTempManager.GetTemplate(templateName);
    8585
    8686    if (template.Identity && template.Identity.RequiredTechnology)
    8787        return this.IsTechnologyResearched(template.Identity.RequiredTechnology);
    88     else
    89         return true; // If there is no required technology then this entity can be produced
     88    // If there is no required technology then this entity can be produced
     89    return true;
    9090};
    9191
    9292TechnologyManager.prototype.IsTechnologyResearched = function(tech)
    9393{
    9494    return (this.researchedTechs[tech] !== undefined);
    TechnologyManager.prototype.CanResearch  
    122122        return false;
    123123
    124124    return this.CheckTechnologyRequirements(template.requirements || null);
    125125};
    126126
    127 // Private function for checking a set of requirements is met
    128 TechnologyManager.prototype.CheckTechnologyRequirements = function(reqs)
     127/**
     128 * Private function for checking a set of requirements is met
     129 * @param reqs Object of technology requirements as given by the technology template
     130 * @param civonly A boolean set to true if only the civ requirement is checked
     131 *
     132 * @return true if the requirements are checked
     133 * false otherwise
     134 */
     135TechnologyManager.prototype.CheckTechnologyRequirements = function(reqs, civonly)
    129136{
    130137    // If there are no requirements then all requirements are met
    131138    if (!reqs)
    132139        return true;
    133140
    134     if (reqs.tech)
     141    if (reqs.all)
     142        return reqs.all.every(r => this.CheckTechnologyRequirements(r, civonly));
     143    if (reqs.any)
     144        return reqs.any.some(r => this.CheckTechnologyRequirements(r, civonly));
     145    if (reqs.civ)
    135146    {
    136         return this.IsTechnologyResearched(reqs.tech);
     147        let cmpPlayer = Engine.QueryInterface(this.entity, IID_Player);
     148        return cmpPlayer && cmpPlayer.GetCiv() == reqs.civ;
    137149    }
    138     else if (reqs.all)
     150    if (reqs.notciv)
    139151    {
    140         for (var i = 0; i < reqs.all.length; i++)
    141         {
    142             if (!this.CheckTechnologyRequirements(reqs.all[i]))
    143                 return false;
    144         }
    145         return true;
     152        let cmpPlayer = Engine.QueryInterface(this.entity, IID_Player);
     153        return cmpPlayer && cmpPlayer.GetCiv() != reqs.notciv;
    146154    }
    147     else if (reqs.any)
    148     {
    149         for (var i = 0; i < reqs.any.length; i++)
    150         {
    151             if (this.CheckTechnologyRequirements(reqs.any[i]))
    152                 return true;
    153         }
    154         return false;
    155     }
    156     else if (reqs.class)
     155    if (civonly)
     156        return true;
     157    if (reqs.tech)
     158        return this.IsTechnologyResearched(reqs.tech);
     159    if (reqs.class)
    157160    {
    158161        if (reqs.numberOfTypes)
    159162        {
    160163            if (this.typeCountsByClass[reqs.class])
    161164                return (reqs.numberOfTypes <= Object.keys(this.typeCountsByClass[reqs.class]).length);
    162             else
    163                 return false;
     165            return false;
    164166        }
    165         else if (reqs.number)
     167        if (reqs.number)
    166168        {
    167169            if (this.classCounts[reqs.class])
    168170                return (reqs.number <= this.classCounts[reqs.class]);
    169             else
    170                 return false;
    171         }
    172     }
    173     else if (reqs.civ)
    174     {
    175         var cmpPlayer = Engine.QueryInterface(this.entity, IID_Player);
    176         if (cmpPlayer && cmpPlayer.GetCiv() == reqs.civ)
    177             return true;
    178         else
    179171            return false;
     172        }
    180173    }
    181     else if (reqs.notciv)
    182     {
    183         var cmpPlayer = Engine.QueryInterface(this.entity, IID_Player);
    184         if (cmpPlayer && cmpPlayer.GetCiv() == reqs.notciv)
    185             return false;
    186         else
    187             return true;
    188     }
    189 
    190174    // The technologies requirements are not a recognised format
    191175    error("Bad requirements " + uneval(reqs));
    192176    return false;
    193177};
    194178