Line data Source code
1 0 : LoadModificationTemplates(); 2 : 3 0 : var API3 = function(m) 4 : { 5 : 6 : /** Wrapper around a technology template */ 7 : 8 0 : m.Technology = function(templateName) 9 : { 10 0 : this._templateName = templateName; 11 0 : let template = TechnologyTemplates.Get(templateName); 12 : 13 : // check if this is one of two paired technologies. 14 0 : this._isPair = template.pair !== undefined; 15 0 : if (this._isPair) 16 : { 17 0 : let pairTech = TechnologyTemplates.Get(template.pair); 18 0 : this._pairedWith = pairTech.top == templateName ? pairTech.bottom : pairTech.top; 19 : } 20 : 21 : // check if it only defines a pair: 22 0 : this._definesPair = template.top !== undefined; 23 0 : this._template = template; 24 : }; 25 : 26 : /** returns generic, or specific if civ provided. */ 27 0 : m.Technology.prototype.name = function(civ) 28 : { 29 0 : if (civ === undefined) 30 0 : return this._template.genericName; 31 : 32 0 : if (this._template.specificName === undefined || this._template.specificName[civ] === undefined) 33 0 : return undefined; 34 0 : return this._template.specificName[civ]; 35 : }; 36 : 37 0 : m.Technology.prototype.pairDef = function() 38 : { 39 0 : return this._definesPair; 40 : }; 41 : 42 : /** in case this defines a pair only, returns the two paired technologies. */ 43 0 : m.Technology.prototype.getPairedTechs = function() 44 : { 45 0 : if (!this._definesPair) 46 0 : return undefined; 47 : 48 0 : return [ 49 : new m.Technology(this._template.top), 50 : new m.Technology(this._template.bottom) 51 : ]; 52 : }; 53 : 54 0 : m.Technology.prototype.pair = function() 55 : { 56 0 : if (!this._isPair) 57 0 : return undefined; 58 0 : return this._template.pair; 59 : }; 60 : 61 0 : m.Technology.prototype.pairedWith = function() 62 : { 63 0 : if (!this._isPair) 64 0 : return undefined; 65 0 : return this._pairedWith; 66 : }; 67 : 68 0 : m.Technology.prototype.cost = function(researcher) 69 : { 70 0 : if (!this._template.cost) 71 0 : return undefined; 72 0 : let cost = {}; 73 0 : for (let type in this._template.cost) 74 : { 75 0 : cost[type] = +this._template.cost[type]; 76 0 : if (researcher) 77 0 : cost[type] *= researcher.techCostMultiplier(type); 78 : } 79 0 : return cost; 80 : }; 81 : 82 0 : m.Technology.prototype.costSum = function(researcher) 83 : { 84 0 : const cost = this.cost(researcher); 85 0 : if (!cost) 86 0 : return 0; 87 0 : let ret = 0; 88 0 : for (let type in cost) 89 0 : ret += cost[type]; 90 0 : return ret; 91 : }; 92 : 93 0 : m.Technology.prototype.researchTime = function() 94 : { 95 0 : return this._template.researchTime || 0; 96 : }; 97 : 98 0 : m.Technology.prototype.requirements = function(civ) 99 : { 100 0 : return DeriveTechnologyRequirements(this._template, civ); 101 : }; 102 : 103 0 : m.Technology.prototype.autoResearch = function() 104 : { 105 0 : if (!this._template.autoResearch) 106 0 : return undefined; 107 0 : return this._template.autoResearch; 108 : }; 109 : 110 0 : m.Technology.prototype.supersedes = function() 111 : { 112 0 : if (!this._template.supersedes) 113 0 : return undefined; 114 0 : return this._template.supersedes; 115 : }; 116 : 117 0 : m.Technology.prototype.modifications = function() 118 : { 119 0 : if (!this._template.modifications) 120 0 : return undefined; 121 0 : return this._template.modifications; 122 : }; 123 : 124 0 : m.Technology.prototype.affects = function() 125 : { 126 0 : if (!this._template.affects) 127 0 : return undefined; 128 0 : return this._template.affects; 129 : }; 130 : 131 0 : m.Technology.prototype.isAffected = function(classes) 132 : { 133 0 : return this._template.affects && this._template.affects.some(affect => MatchesClassList(classes, affect)); 134 : }; 135 : 136 0 : return m; 137 : 138 : }(API3);