Ticket #3899: patch.diff
File patch.diff, 6.1 KB (added by , 8 years ago) |
---|
-
binaries/data/mods/public/simulation/components/ProductionQueue.js
ProductionQueue.prototype.CalculateEntit 139 139 */ 140 140 ProductionQueue.prototype.GetTechnologiesList = function() 141 141 { 142 142 if (!this.template.Technologies) 143 143 return []; 144 144 145 145 var string = this.template.Technologies._string; 146 146 if (!string) 147 147 return []; 148 148 149 149 var cmpTechnologyManager = QueryOwnerInterface(this.entity, IID_TechnologyManager); 150 150 if (!cmpTechnologyManager) 151 151 return []; 152 152 153 153 var cmpPlayer = QueryOwnerInterface(this.entity); 154 154 var cmpIdentity = Engine.QueryInterface(this.entity, IID_Identity); 155 155 if (!cmpPlayer || !cmpIdentity) 156 156 return []; 157 157 158 158 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 159 173 var techList = []; 160 174 var superseded = {}; // Stores the tech which supersedes the key 161 175 162 176 var disabledTechnologies = cmpPlayer.GetDisabledTechnologies(); 163 177 164 178 // Add any top level technologies to an array which corresponds to the displayed icons 165 179 // Also store what a technology is superceded by in the superceded object {"tech1":"techWhichSupercedesTech1", ...} 166 180 for (var i in techs) 167 181 { 168 182 var tech = techs[i]; … … ProductionQueue.prototype.GetTechnologie 172 186 if (!template.supersedes || techs.indexOf(template.supersedes) === -1) 173 187 techList.push(tech); 174 188 else 175 189 superseded[template.supersedes] = tech; 176 190 } 177 191 178 192 // Now make researched/in progress techs invisible 179 193 for (var i in techList) 180 194 { 181 195 var tech = techList[i]; 182 196 while (this.IsTechnologyResearchedOrInProgress(tech)) … … ProductionQueue.prototype.GetTechnologie 184 198 tech = superseded[tech]; 185 199 } 186 200 187 201 techList[i] = tech; 188 202 } 189 203 190 204 var ret = []; 191 205 192 206 // This inserts the techs into the correct positions to line up the technology pairs 193 207 for (var i = 0; i < techList.length; i++) 194 208 { 195 209 var tech = techList[i]; 196 210 if (!tech) 197 211 { 198 212 ret[i] = undefined; 199 213 continue; 200 214 } 201 215 202 216 var template = cmpTechnologyManager.GetTechnologyTemplate(tech); 203 217 if (template.top) 204 218 ret[i] = {"pair": true, "top": template.top, "bottom": template.bottom}; 205 219 else 206 220 ret[i] = tech; 207 221 } 208 222 209 223 return ret; 210 224 }; 211 225 212 226 ProductionQueue.prototype.IsTechnologyResearchedOrInProgress = function(tech) 213 227 { -
binaries/data/mods/public/simulation/components/TechnologyManager.js
TechnologyManager.prototype.CanProduce = 83 83 var cmpTempManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_TemplateManager); 84 84 var template = cmpTempManager.GetTemplate(templateName); 85 85 86 86 if (template.Identity && template.Identity.RequiredTechnology) 87 87 return this.IsTechnologyResearched(template.Identity.RequiredTechnology); 88 else89 return true; // If there is no required technology then this entity can be produced88 // If there is no required technology then this entity can be produced 89 return true; 90 90 }; 91 91 92 92 TechnologyManager.prototype.IsTechnologyResearched = function(tech) 93 93 { 94 94 return (this.researchedTechs[tech] !== undefined); … … TechnologyManager.prototype.CanResearch 123 123 124 124 return this.CheckTechnologyRequirements(template.requirements || null); 125 125 }; 126 126 127 127 // Private function for checking a set of requirements is met 128 TechnologyManager.prototype.CheckTechnologyRequirements = function(reqs )128 TechnologyManager.prototype.CheckTechnologyRequirements = function(reqs, civonly) 129 129 { 130 130 // If there are no requirements then all requirements are met 131 131 if (!reqs) 132 132 return true; 133 133 134 if (reqs.tech) 135 { 136 return this.IsTechnologyResearched(reqs.tech); 137 } 138 else if (reqs.all) 134 if (reqs.all) 139 135 { 140 136 for (var i = 0; i < reqs.all.length; i++) 141 137 { 142 if (!this.CheckTechnologyRequirements(reqs.all[i]) )138 if (!this.CheckTechnologyRequirements(reqs.all[i]), civonly) 143 139 return false; 144 140 } 145 141 return true; 146 142 } 147 143 else if (reqs.any) 148 144 { 149 145 for (var i = 0; i < reqs.any.length; i++) 150 146 { 151 if (this.CheckTechnologyRequirements(reqs.any[i]) )147 if (this.CheckTechnologyRequirements(reqs.any[i]), civonly) 152 148 return true; 153 149 } 154 150 return false; 155 151 } 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); 156 166 else if (reqs.class) 157 167 { 158 168 if (reqs.numberOfTypes) 159 169 { 160 170 if (this.typeCountsByClass[reqs.class]) 161 171 return (reqs.numberOfTypes <= Object.keys(this.typeCountsByClass[reqs.class]).length); 162 else 163 return false; 172 return false; 164 173 } 165 174 else if (reqs.number) 166 175 { 167 176 if (this.classCounts[reqs.class]) 168 177 return (reqs.number <= this.classCounts[reqs.class]); 169 else170 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 else179 178 return false; 179 } 180 180 } 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 else187 return true;188 }189 190 181 // The technologies requirements are not a recognised format 191 182 error("Bad requirements " + uneval(reqs)); 192 183 return false; 193 184 }; 194 185