Ticket #3747: 3747+3801_modifiers.patch
File 3747+3801_modifiers.patch, 16.8 KB (added by , 8 years ago) |
---|
-
binaries/data/mods/public/globalscripts/Technologies.js
diff --git a/binaries/data/mods/public/globalscripts/Technologies.js b/binaries/data/mods/public/globalscripts/Technologies.js index b6783e2..b5fab79 100644
a b 4 4 * any global state, but each context should do its own caching as needed. 5 5 * Also it cannot directly access the simulation and requires data passed to it. 6 6 */ 7 7 8 /** 9 * Returns the name of the technology defining the bonus for a given rank 10 */ 11 const g_UnitBonusTechNameSuffix = "_unit_bonus"; 12 function GetUnitBonusTechName(rank = "basic") 13 { 14 return rank.toLowerCase() + g_UnitBonusTechNameSuffix; 15 } 16 8 17 /** 9 18 * Returns modified property value modified by the applicable tech 10 19 * modifications. 11 20 * 12 21 * @param currentTechModifications Object with mapping of property names to 13 22 * modification arrays, retrieved from the intended player's TechnologyManager. 14 * @param classes Array cont ianing the class list of the template.23 * @param classes Array containing the class list of the template. 15 24 * @param propertyName String encoding the name of the value. 16 25 * @param propertyValue Number storing the original value. Can also be 17 26 * non-numberic, but then only "replace" techs can be supported. … … function GetTechModifiedProperty(currentTechModifications, classes, propertyName 44 53 } 45 54 46 55 /** 56 * Derives modifications (to be applied to entities) from a given technology 57 * 58 * @param techTemplate The technology template to derive the modifications from. 59 * @return Object containing the relevant modifications. 60 */ 61 function DeriveModificationsFromTech(techTemplate) 62 { 63 if (!techTemplate.modifications) 64 return {}; 65 66 let techMods = {}; 67 let techAffects = []; 68 if (techTemplate.affects && techTemplate.affects.length > 0) 69 for (let affected of techTemplate.affects) 70 techAffects.push(affected.split(/\s+/)); 71 else 72 techAffects.push([]); 73 74 for (let mod of techTemplate.modifications) 75 { 76 let affects = techAffects.slice(); 77 if (mod.affects) 78 { 79 let specAffects = mod.affects.split(/\s+/); 80 for (let a in affects) 81 affects[a] = affects[a].concat(specAffects); 82 } 83 84 let newModifier = { 85 "affects": affects 86 }; 87 for (let idx in mod) 88 if (idx !== "value" && idx !== "affects") 89 newModifier[idx] = mod[idx]; 90 91 if (!techMods[mod.value]) 92 techMods[mod.value] = []; 93 techMods[mod.value].push(newModifier); 94 } 95 return techMods; 96 } 97 98 /** 47 99 * Returns whether the given modification applies to the entity containing the given class list 48 100 */ 49 101 function DoesModificationApply(modification, classes) -
binaries/data/mods/public/globalscripts/Templates.js
diff --git a/binaries/data/mods/public/globalscripts/Templates.js b/binaries/data/mods/public/globalscripts/Templates.js index e50cbe4..cb55e91 100644
a b function GetTemplateDataHelper(template, player, auraTemplates) 79 79 var func; 80 80 if (player) 81 81 func = ApplyValueModificationsToTemplate; 82 else if (g_Modifiers) 83 func = function(property, val, c, template) { 84 return GetTechModifiedProperty(g_Modifiers, GetIdentityClasses(template.Identity), property, val); 85 } 82 86 else 83 87 func = function(a, val, c, d) { return val; } 84 88 -
binaries/data/mods/public/gui/structree/load.js
diff --git a/binaries/data/mods/public/gui/structree/load.js b/binaries/data/mods/public/gui/structree/load.js index dee89d2..d62b96a 100644
a b function getGatherRates(templateName) 35 35 return rates; 36 36 } 37 37 38 function preloadUnit(templateName) 39 { 40 if (!Engine.TemplateExists(templateName)) 41 return; 42 let template = loadTemplate(templateName); 43 44 if (template.Builder && template.Builder.Entities._string) 45 for (let build of template.Builder.Entities._string.split(" ")) 46 { 47 build = build.replace("{civ}", g_SelectedCiv); 48 if (g_Lists.structures.indexOf(build) < 0) 49 g_Lists.structures.push(build); 50 } 51 52 if (template.ProductionQueue) 53 { 54 if (template.ProductionQueue.Entities) 55 for (let build of template.ProductionQueue.Entities._string.split(" ")) 56 { 57 build = build.replace("{civ}", g_SelectedCiv); 58 if (g_Lists.units.indexOf(build) === -1) 59 g_Lists.units.push(build); 60 } 61 62 if (template.ProductionQueue.Technologies) 63 for (let research of template.ProductionQueue.Technologies._string.split(" ")) 64 if (g_Lists.techs.indexOf(research) < 0) 65 g_Lists.techs.push(research); 66 } 67 68 if (template.Identity.Rank) 69 { 70 let promotionTech = GetUnitBonusTechName(template.Identity.Rank); 71 if (g_Lists.modifiers.indexOf(promotionTech) < 0) 72 g_Lists.modifiers.push(promotionTech); 73 74 // recurse through promotions to get all techs 75 if (template.Promotion) 76 preloadUnit(template.Promotion.Entity); 77 } 78 } 79 38 80 function loadUnit(templateName) 39 81 { 40 82 if (!Engine.TemplateExists(templateName)) … … function loadUnit(templateName) 61 103 { 62 104 unit.production.units = []; 63 105 for (let build of template.ProductionQueue.Entities._string.split(" ")) 64 { 65 build = build.replace("{civ}", g_SelectedCiv); 66 unit.production.units.push(build); 67 if (g_Lists.units.indexOf(build) < 0) 68 g_Lists.units.push(build); 69 } 106 unit.production.units.push(build.replace("{civ}", g_SelectedCiv)); 70 107 } 71 108 if (template.ProductionQueue.Technologies) 72 109 { 73 110 unit.production.techs = []; 74 111 for (let research of template.ProductionQueue.Technologies._string.split(" ")) 75 {76 112 unit.production.techs.push(research); 77 if (g_Lists.techs.indexOf(research) < 0)78 g_Lists.techs.push(research);79 }80 113 } 81 114 } 82 115 … … function loadUnit(templateName) 98 131 return unit; 99 132 } 100 133 134 function preloadStructure(templateName) 135 { 136 let template = loadTemplate(templateName); 137 138 if (template.ProductionQueue && template.ProductionQueue.Entities && template.ProductionQueue.Entities._string) 139 for (let build of template.ProductionQueue.Entities._string.split(" ")) 140 { 141 build = build.replace("{civ}", g_SelectedCiv); 142 if (g_Lists.units.indexOf(build) < 0) 143 g_Lists.units.push(build); 144 } 145 } 146 101 147 function loadStructure(templateName) 102 148 { 103 149 var template = loadTemplate(templateName); … … function loadStructure(templateName) 124 170 { 125 171 build = build.replace("{civ}", g_SelectedCiv); 126 172 structure.production.units.push(build); 127 if (g_Lists.units.indexOf(build) < 0)128 g_Lists.units.push(build);129 173 } 130 174 131 175 if (template.ProductionQueue.Technologies && template.ProductionQueue.Technologies._string) … … function loadPhase(phaseCode) 261 305 return phase; 262 306 } 263 307 308 function loadModifierTech(modCode) 309 { 310 if (!Engine.FileExists("simulation/data/technologies/"+modCode+".json")) 311 return {}; 312 return loadTechData(modCode); 313 } 314 264 315 function loadTechnologyPair(pairCode) 265 316 { 266 317 var pairInfo = loadTechData(pairCode); -
binaries/data/mods/public/gui/structree/structree.js
diff --git a/binaries/data/mods/public/gui/structree/structree.js b/binaries/data/mods/public/gui/structree/structree.js index 65bfd9e..3bfecdd 100644
a b var g_ParsedData = { 7 7 8 8 var g_Lists = {}; 9 9 var g_CivData = {}; 10 var g_Modifiers = {}; 10 11 var g_SelectedCiv = ""; 11 12 var g_CallbackSet = false; 12 13 … … function selectCiv(civCode) 58 59 g_Lists = { 59 60 "units": [], 60 61 "structures": [], 61 "techs": [] 62 "techs": [], 63 "modifiers": [] 62 64 }; 65 g_Modifiers = {}; 66 67 // Get initial modifier techs 68 if (g_CivData[g_SelectedCiv].CivBonusTechs) 69 g_Lists.modifiers = g_CivData[g_SelectedCiv].CivBonusTechs; 63 70 64 71 // get initial units 65 varstartStructs = [];72 let startStructs = []; 66 73 for (let entity of g_CivData[civCode].StartEntities) 67 74 { 68 75 if (entity.Template.slice(0, 5) == "units") … … function selectCiv(civCode) 74 81 } 75 82 } 76 83 77 // Load units and structures78 varunitCount = 0;84 // Compile lists of units and structures belonging to this civ 85 let unitCount = 0; 79 86 do 80 87 { 81 88 for (let u of g_Lists.units) 82 if (!g_ParsedData.units[u]) 83 g_ParsedData.units[u] = loadUnit(u); 89 preloadUnit(u); 84 90 85 91 unitCount = g_Lists.units.length; 86 92 87 93 for (let s of g_Lists.structures) 88 if (!g_ParsedData.structures[s]) 89 g_ParsedData.structures[s] = loadStructure(s); 94 preloadStructure(s); 90 95 91 96 } while (unitCount < g_Lists.units.length); 92 97 98 99 // Load modifiers 100 for (let modCode of g_Lists.modifiers) 101 { 102 let modTech = loadModifierTech(modCode); 103 let derivedModifiers = DeriveModificationsFromTech(modTech); 104 105 for (let modPath in derivedModifiers) 106 { 107 if (!g_Modifiers[modPath]) 108 g_Modifiers[modPath] = []; 109 g_Modifiers[modPath] = g_Modifiers[modPath].concat(derivedModifiers[modPath]); 110 } 111 } 112 113 // Properly load units and structures, now we have modifiers 114 for (let u of g_Lists.units) 115 if (!g_ParsedData.units[u]) 116 g_ParsedData.units[u] = loadUnit(u); 117 118 for (let s of g_Lists.structures) 119 if (!g_ParsedData.structures[s]) 120 g_ParsedData.structures[s] = loadStructure(s); 121 93 122 // Load technologies 94 vartechPairs = {};123 let techPairs = {}; 95 124 for (let techcode of g_Lists.techs) 96 125 { 97 126 let realcode = depath(techcode); -
binaries/data/mods/public/simulation/components/TechnologyManager.js
diff --git a/binaries/data/mods/public/simulation/components/TechnologyManager.js b/binaries/data/mods/public/simulation/components/TechnologyManager.js index f1f9cc7..ad8ff00 100644
a b TechnologyManager.prototype.ResearchTechnology = function(tech) 267 267 // store the modifications in an easy to access structure 268 268 if (template.modifications) 269 269 { 270 var affects = [];271 if (template.affects && template.affects.length > 0)270 let derivedModifiers = DeriveModificationsFromTech(template); 271 for (let modifierPath in derivedModifiers) 272 272 { 273 for (let affect of template.affects) 274 { 275 // Put the list of classes into an array for convenient access 276 affects.push(affect.split(/\s+/)); 277 } 278 } 279 else 280 { 281 affects.push([]); 282 } 283 284 // We add an item to this.modifications for every modification in the template.modifications array 285 for (var i in template.modifications) 286 { 287 var modification = template.modifications[i]; 288 if (!this.modifications[modification.value]) 289 this.modifications[modification.value] = []; 290 291 var modAffects = affects.slice(); 292 if (modification.affects) 293 { 294 var extraAffects = modification.affects.split(/\s+/); 295 for (var a in modAffects) 296 modAffects[a] = modAffects[a].concat(extraAffects); 297 } 298 299 var mod = {"affects": modAffects}; 300 301 // copy the modification data into our new data structure 302 for (var j in modification) 303 if (j !== "value" && j !== "affects") 304 mod[j] = modification[j]; 273 if (!this.modifications[modifierPath]) 274 this.modifications[modifierPath] = []; 275 this.modifications[modifierPath] = this.modifications[modifierPath].concat(derivedModifiers[modifierPath]); 305 276 306 this.modifications[modification.value].push(mod); 307 var component = modification.value.split("/")[0]; 277 let component = modifierPath.split("/")[0]; 308 278 if (!modifiedComponents[component]) 309 279 modifiedComponents[component] = []; 310 modifiedComponents[component].push(modifi cation.value);311 this.modificationCache[modifi cation.value] = {};280 modifiedComponents[component].push(modifierPath); 281 this.modificationCache[modifierPath] = {}; 312 282 } 313 283 } 314 284 -
binaries/data/mods/public/simulation/data/civs/athen.json
diff --git a/binaries/data/mods/public/simulation/data/civs/athen.json b/binaries/data/mods/public/simulation/data/civs/athen.json index 3ce6b26..58823d9 100644
a b 79 79 "Description":"Ships construct 25% faster." 80 80 } 81 81 ], 82 "CivBonusTechs": 83 [ 84 "hellenes/civbonus_hellenic_architecture" 85 ], 82 86 "Structures": 83 87 [ 84 88 { -
binaries/data/mods/public/simulation/data/civs/brit.json
diff --git a/binaries/data/mods/public/simulation/data/civs/brit.json b/binaries/data/mods/public/simulation/data/civs/brit.json index b8b12fe..8356c65 100644
a b 75 75 "Description": "Bonus to tech speed." 76 76 } 77 77 ], 78 "CivBonusTechs": 79 [ 80 "celts/civbonus_celts_wooden_struct" 81 ], 78 82 "Structures": 79 83 [ 80 84 { -
binaries/data/mods/public/simulation/data/civs/cart.json
diff --git a/binaries/data/mods/public/simulation/data/civs/cart.json b/binaries/data/mods/public/simulation/data/civs/cart.json index c6e9efb..16c7212 100644
a b 73 73 "Description": "+33% trade profit international routes." 74 74 } 75 75 ], 76 "CivBonusTechs": 77 [ 78 "carthaginians/civbonus_triple_walls" 79 ], 76 80 "Structures": 77 81 [ 78 82 { -
binaries/data/mods/public/simulation/data/civs/gaul.json
diff --git a/binaries/data/mods/public/simulation/data/civs/gaul.json b/binaries/data/mods/public/simulation/data/civs/gaul.json index 28b4953..6c549f6 100644
a b 75 75 "Description": "Bonus to tech speed." 76 76 } 77 77 ], 78 "CivBonusTechs": 79 [ 80 "celts/civbonus_celts_wooden_struct" 81 ], 78 82 "Structures": 79 83 [ 80 84 { -
binaries/data/mods/public/simulation/data/civs/iber.json
diff --git a/binaries/data/mods/public/simulation/data/civs/iber.json b/binaries/data/mods/public/simulation/data/civs/iber.json index 3039a29..65ed169 100644
a b 73 73 "Description": "Citizen-soldier infantry skirmishers and cavalry skirmishers -20% cost for allies." 74 74 } 75 75 ], 76 "CivBonusTechs": 77 [ 78 ], 76 79 "Structures": 77 80 [ 78 81 { -
binaries/data/mods/public/simulation/data/civs/mace.json
diff --git a/binaries/data/mods/public/simulation/data/civs/mace.json b/binaries/data/mods/public/simulation/data/civs/mace.json index 739da20..3b4457b 100644
a b 84 84 "Description":"+15% tribute and trade bonus on metal." 85 85 } 86 86 ], 87 "CivBonusTechs": 88 [ 89 "hellenes/civbonus_hellenic_architecture" 90 ], 87 91 "Structures": 88 92 [ 89 93 { -
binaries/data/mods/public/simulation/data/civs/maur.json
diff --git a/binaries/data/mods/public/simulation/data/civs/maur.json b/binaries/data/mods/public/simulation/data/civs/maur.json index 5d230ae..fe4e539 100644
a b 73 73 "Description": "Allied Temple techs -50% cost and research time." 74 74 } 75 75 ], 76 "CivBonusTechs": 77 [ 78 "mauryans/civbonus_maur_popcap", 79 "mauryans/wooden_walls" 80 ], 76 81 "Structures": 77 82 [ 78 83 { -
binaries/data/mods/public/simulation/data/civs/pers.json
diff --git a/binaries/data/mods/public/simulation/data/civs/pers.json b/binaries/data/mods/public/simulation/data/civs/pers.json index a0c8b7e..cd2b263 100644
a b 83 83 "Description": "+25% trade profit land routes." 84 84 } 85 85 ], 86 "CivBonusTechs": 87 [ 88 "persians/civbonus_pers_popcap" 89 ], 86 90 "Structures": 87 91 [ 88 92 { -
binaries/data/mods/public/simulation/data/civs/ptol.json
diff --git a/binaries/data/mods/public/simulation/data/civs/ptol.json b/binaries/data/mods/public/simulation/data/civs/ptol.json index a76f7b7..0f0232c 100644
a b 83 83 "Description":"All allies automatically gain a slow trickle of food income." 84 84 } 85 85 ], 86 "CivBonusTechs": 87 [ 88 ], 86 89 "Structures": 87 90 [ 88 91 { -
binaries/data/mods/public/simulation/data/civs/rome.json
diff --git a/binaries/data/mods/public/simulation/data/civs/rome.json b/binaries/data/mods/public/simulation/data/civs/rome.json index c79048a..ecb5bb9 100644
a b 68 68 "Description": "Allied citizen-soldiers gain a +15% attack when in Roman territory." 69 69 } 70 70 ], 71 "CivBonusTechs": 72 [ 73 ], 71 74 "Structures": 72 75 [ 73 76 { -
binaries/data/mods/public/simulation/data/civs/sele.json
diff --git a/binaries/data/mods/public/simulation/data/civs/sele.json b/binaries/data/mods/public/simulation/data/civs/sele.json index 39619c1..6447505 100644
a b 84 84 "Description":"Allied Civic Centers are 20% cheaper." 85 85 } 86 86 ], 87 "CivBonusTechs": 88 [ 89 ], 87 90 "Structures": 88 91 [ 89 92 { -
binaries/data/mods/public/simulation/data/civs/spart.json
diff --git a/binaries/data/mods/public/simulation/data/civs/spart.json b/binaries/data/mods/public/simulation/data/civs/spart.json index fee64cc..7029793 100644
a b 84 84 "Description":"Allies can train Spartiates." 85 85 } 86 86 ], 87 "CivBonusTechs": 88 [ 89 "hellenes/civbonus_hellenic_architecture", 90 "hellenes/civpenalty_spart_popcap" 91 ], 87 92 "Structures": 88 93 [ 89 94 {