Ticket #3899: patch.4.diff

File patch.4.diff, 6.4 KB (added by fatherbushido, 8 years ago)

notciv case was broken with last changes

  • 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    let  techsCivChecked = [];
     162    for (let tech of techs)
     163    {
     164        let reqs = cmpTechnologyManager.GetTechnologyTemplate(tech).requirements || null;
     165        if (cmpTechnologyManager.CheckTechnologyRequirements(reqs, true))
     166            techsCivChecked.push(tech);
     167    }
     168    techs = techsCivChecked;
     169
    159170    var techList = [];
    160171    var superseded = {}; // Stores the tech which supersedes the key
    161172
    162173    var disabledTechnologies = cmpPlayer.GetDisabledTechnologies();
    163    
     174
    164175    // Add any top level technologies to an array which corresponds to the displayed icons
    165176    // Also store what a technology is superceded by in the superceded object {"tech1":"techWhichSupercedesTech1", ...}
    166177    for (var i in techs)
    167178    {
    168179        var tech = techs[i];
    ProductionQueue.prototype.GetTechnologie  
    172183        if (!template.supersedes || techs.indexOf(template.supersedes) === -1)
    173184            techList.push(tech);
    174185        else
    175186            superseded[template.supersedes] = tech;
    176187    }
    177    
     188
    178189    // Now make researched/in progress techs invisible
    179190    for (var i in techList)
    180191    {
    181192        var tech = techList[i];
    182193        while (this.IsTechnologyResearchedOrInProgress(tech))
    ProductionQueue.prototype.GetTechnologie  
    184195            tech = superseded[tech];
    185196        }
    186197       
    187198        techList[i] = tech;
    188199    }
    189    
     200
    190201    var ret = [];
    191    
     202
    192203    // This inserts the techs into the correct positions to line up the technology pairs
    193204    for (var i = 0; i < techList.length; i++)
    194205    {
    195206        var tech = techList[i];
    196207        if (!tech)
    197208        {
    198209            ret[i] = undefined;
    199210            continue;
    200211        }
    201        
     212
    202213        var template = cmpTechnologyManager.GetTechnologyTemplate(tech);
    203214        if (template.top)
    204215            ret[i] = {"pair": true, "top": template.top, "bottom": template.bottom};
    205216        else
    206217            ret[i] = tech;
    207218    }
    208    
     219
    209220    return ret;
    210221};
    211222
    212223ProductionQueue.prototype.IsTechnologyResearchedOrInProgress = function(tech)
    213224{
  • 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)
    135     {
    136         return this.IsTechnologyResearched(reqs.tech);
    137     }
    138     else if (reqs.all)
     141    if (reqs.all)
    139142    {
    140143        for (var i = 0; i < reqs.all.length; i++)
    141144        {
    142             if (!this.CheckTechnologyRequirements(reqs.all[i]))
     145            if (!this.CheckTechnologyRequirements(reqs.all[i], civonly))
    143146                return false;
    144147        }
    145148        return true;
    146149    }
    147     else if (reqs.any)
     150    if (reqs.any)
    148151    {
    149152        for (var i = 0; i < reqs.any.length; i++)
    150153        {
    151             if (this.CheckTechnologyRequirements(reqs.any[i]))
     154            if (this.CheckTechnologyRequirements(reqs.any[i], civonly))
    152155                return true;
    153156        }
    154157        return false;
    155158    }
    156     else if (reqs.class)
     159    if (reqs.civ)
     160    {
     161        let cmpPlayer = Engine.QueryInterface(this.entity, IID_Player);
     162        return cmpPlayer && cmpPlayer.GetCiv() == reqs.civ;
     163    }
     164    if (reqs.notciv)
     165    {
     166        let cmpPlayer = Engine.QueryInterface(this.entity, IID_Player);
     167        return cmpPlayer && cmpPlayer.GetCiv() != reqs.notciv;
     168    }
     169    if (civonly)
     170        return true;
     171    if (reqs.tech)
     172        return this.IsTechnologyResearched(reqs.tech);
     173    if (reqs.class)
    157174    {
    158175        if (reqs.numberOfTypes)
    159176        {
    160177            if (this.typeCountsByClass[reqs.class])
    161178                return (reqs.numberOfTypes <= Object.keys(this.typeCountsByClass[reqs.class]).length);
    162             else
    163                 return false;
     179            return false;
    164180        }
    165         else if (reqs.number)
     181        if (reqs.number)
    166182        {
    167183            if (this.classCounts[reqs.class])
    168184                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
    179185            return false;
     186        }
    180187    }
    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 
    190188    // The technologies requirements are not a recognised format
    191189    error("Bad requirements " + uneval(reqs));
    192190    return false;
    193191};
    194192