Ticket #3899: patch.diff

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

thx to sanderd17 for the tricks and leper for the remarks.

  • 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    if (cmpIdentity.GetCiv() != cmpPlayer.GetCiv())
     162    {
     163        let  techList = [];
     164        for (let tech of techs)
     165        {
     166            let reqs = cmpTechnologyManager.GetTechnologyTemplate(tech).requirements || null;
     167            if (cmpTechnologyManager.CheckTechnologyRequirements(reqs, true))
     168                techList.push(tech);
     169        }
     170    techs = techList;
     171    }
     172
    159173    var techList = [];
    160174    var superseded = {}; // Stores the tech which supersedes the key
    161175
    162176    var disabledTechnologies = cmpPlayer.GetDisabledTechnologies();
    163    
     177
    164178    // Add any top level technologies to an array which corresponds to the displayed icons
    165179    // Also store what a technology is superceded by in the superceded object {"tech1":"techWhichSupercedesTech1", ...}
    166180    for (var i in techs)
    167181    {
    168182        var tech = techs[i];
    ProductionQueue.prototype.GetTechnologie  
    172186        if (!template.supersedes || techs.indexOf(template.supersedes) === -1)
    173187            techList.push(tech);
    174188        else
    175189            superseded[template.supersedes] = tech;
    176190    }
    177    
     191
    178192    // Now make researched/in progress techs invisible
    179193    for (var i in techList)
    180194    {
    181195        var tech = techList[i];
    182196        while (this.IsTechnologyResearchedOrInProgress(tech))
    ProductionQueue.prototype.GetTechnologie  
    184198            tech = superseded[tech];
    185199        }
    186200       
    187201        techList[i] = tech;
    188202    }
    189    
     203
    190204    var ret = [];
    191    
     205
    192206    // This inserts the techs into the correct positions to line up the technology pairs
    193207    for (var i = 0; i < techList.length; i++)
    194208    {
    195209        var tech = techList[i];
    196210        if (!tech)
    197211        {
    198212            ret[i] = undefined;
    199213            continue;
    200214        }
    201        
     215
    202216        var template = cmpTechnologyManager.GetTechnologyTemplate(tech);
    203217        if (template.top)
    204218            ret[i] = {"pair": true, "top": template.top, "bottom": template.bottom};
    205219        else
    206220            ret[i] = tech;
    207221    }
    208    
     222
    209223    return ret;
    210224};
    211225
    212226ProductionQueue.prototype.IsTechnologyResearchedOrInProgress = function(tech)
    213227{
  • 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  
    123123
    124124    return this.CheckTechnologyRequirements(template.requirements || null);
    125125};
    126126
    127127// Private function for checking a set of requirements is met
    128 TechnologyManager.prototype.CheckTechnologyRequirements = function(reqs)
     128TechnologyManager.prototype.CheckTechnologyRequirements = function(reqs, civonly)
    129129{
    130130    // If there are no requirements then all requirements are met
    131131    if (!reqs)
    132132        return true;
    133133
    134     if (reqs.tech)
    135     {
    136         return this.IsTechnologyResearched(reqs.tech);
    137     }
    138     else if (reqs.all)
     134    if (reqs.all)
    139135    {
    140136        for (var i = 0; i < reqs.all.length; i++)
    141137        {
    142             if (!this.CheckTechnologyRequirements(reqs.all[i]))
     138            if (!this.CheckTechnologyRequirements(reqs.all[i]), civonly)
    143139                return false;
    144140        }
    145141        return true;
    146142    }
    147143    else if (reqs.any)
    148144    {
    149145        for (var i = 0; i < reqs.any.length; i++)
    150146        {
    151             if (this.CheckTechnologyRequirements(reqs.any[i]))
     147            if (this.CheckTechnologyRequirements(reqs.any[i]), civonly)
    152148                return true;
    153149        }
    154150        return false;
    155151    }
     152    else if (reqs.civ)
     153    {
     154        let cmpPlayer = Engine.QueryInterface(this.entity, IID_Player);
     155        return cmpPlayer && cmpPlayer.GetCiv() == reqs.civ;
     156    }
     157    else if (reqs.notciv)
     158    {
     159        let cmpPlayer = Engine.QueryInterface(this.entity, IID_Player);
     160        return (cmpPlayer && cmpPlayer.GetCiv() == reqs.notciv);
     161    }
     162    else if (civonly)
     163        return true;
     164    else if (reqs.tech)
     165        return this.IsTechnologyResearched(reqs.tech);
    156166    else if (reqs.class)
    157167    {
    158168        if (reqs.numberOfTypes)
    159169        {
    160170            if (this.typeCountsByClass[reqs.class])
    161171                return (reqs.numberOfTypes <= Object.keys(this.typeCountsByClass[reqs.class]).length);
    162             else
    163                 return false;
     172            return false;
    164173        }
    165174        else if (reqs.number)
    166175        {
    167176            if (this.classCounts[reqs.class])
    168177                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
    179178            return false;
     179        }
    180180    }
    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 
    190181    // The technologies requirements are not a recognised format
    191182    error("Bad requirements " + uneval(reqs));
    192183    return false;
    193184};
    194185