diff --git a/sharedPlugins/researchSync/dumpResearch.lua b/sharedPlugins/researchSync/dumpResearch.lua index 970def0d..f403f02e 100644 --- a/sharedPlugins/researchSync/dumpResearch.lua +++ b/sharedPlugins/researchSync/dumpResearch.lua @@ -1,9 +1,9 @@ /silent-command -local lines = ""; +local data = {}; for _, tech in pairs(game.forces["player"].technologies) do - lines = lines .. tech.name .. ":" .. tostring(tech.researched) .. "\n"; + table.insert(data, tech.name .. ":" .. tostring(tech.researched) .. ":" .. tostring(tech.level)); end -game.write_file("researchSync.txt",lines) +game.write_file("researchSync.txt", table.concat(data, "\n")) diff --git a/sharedPlugins/researchSync/enableResearch.lua b/sharedPlugins/researchSync/enableResearch.lua index 2231ea8e..c7ffcddb 100644 --- a/sharedPlugins/researchSync/enableResearch.lua +++ b/sharedPlugins/researchSync/enableResearch.lua @@ -1,5 +1,6 @@ /silent-command -if game.forces['player'].technologies['£key'] then - game.forces['player'].technologies['£key'].researched=true - game.print("researcSync enabled research: £key") +if game.forces['player'].technologies['{tech_name}'] then + game.forces['player'].technologies['{tech_name}}'].researched={tech_researched} + game.forces['player'].technologies['{tech_name}}'].level={tech_level} + game.print("researcSync enabled research: {tech_name} to level {tech_level}") end diff --git a/sharedPlugins/researchSync/index.js b/sharedPlugins/researchSync/index.js index 766eea22..dfac2532 100644 --- a/sharedPlugins/researchSync/index.js +++ b/sharedPlugins/researchSync/index.js @@ -33,7 +33,7 @@ class ResearchSync { this.messageInterface("got error when calling getSlaveMeta", resp.statusCode, resp.body); return; } - var allmeta = JSON.parse(resp.body); + let allmeta = JSON.parse(resp.body); let needResearch = {}; @@ -42,27 +42,34 @@ class ResearchSync { let researchList = instance.research; if(researchList){ Object.keys(researchList).forEach(researchName => { - let researched = researchList[researchName]; - if(JSON.parse(researched)){ - needResearch[researchName] = true; - } + if (needResearch.hasOwnProperty(researchName)) { + if (needResearch[researchName][0] !== false) { + needResearch[researchName][0] = researchList[researchName][0]; + } + if (needResearch[researchName][1] < researchList[researchName][1]) { + needResearch[researchName][1] = researchList[researchName][1]; + } + } + else { + needResearch[researchName] = researchList[researchName]; + } }); } } }); - var difference = this.diff(this.research, needResearch); + let difference = this.filterResearchDiff(this.research, needResearch); Object.keys(difference).forEach((key) => { - if (difference[key] == 1) { - let command = this.functions.enableResearch; - while(command.includes("£key")){ - command = command.replace("£key", key); - } - this.messageInterface(command); - this.messageInterface("Unlocking research: "+key) - // this.messageInterface("/c game.forces['player'].technologies['" + key + "'].researched=true"); + let command = this.functions.enableResearch; + while(command.includes("{tech_name}")){ + command = command.replace("{tech_name}", key); + command = command.replace("{tech_researched}", difference[key][0]); + command = command.replace("{tech_level}", difference[key][1]); } - }) - if(Object.keys(difference).length > 0){ + this.messageInterface(command); + this.messageInterface("Unlocking research: "+key); + // this.messageInterface("/c game.forces['player'].technologies['" + key + "'].researched=true"); + }); + if(Object.keys(difference).length > 0){ this.messageInterface("difference from other servers", JSON.stringify(difference)); } needle.post(this.config.masterIP + ':' + this.config.masterPort + '/api/editSlaveMeta', { @@ -75,11 +82,11 @@ class ResearchSync { }); } - diff(array1, array2) { - var diff = {}; - Object.keys(array2).forEach((element) => { - if (array2[element] != array1[element]){ - diff[element] = array2[element]; + filterResearchDiff(localResearch, remoteResearch) { + let diff = {}; + Object.keys(localResearch).forEach((key) => { + if (localResearch[key][0] != remoteResearch[key][0] || localResearch[key][1] != remoteResearch[key][1]){ + diff[key] = remoteResearch[key]; } }); return diff; @@ -99,11 +106,12 @@ class ResearchSync { try { let kv = data.split(":"); let name = kv[0]; - let value = JSON.parse(kv[1]); - this.research[name] = value; + let researched = JSON.parse(kv[1]) === 'true' ? true : false; + let level = parseInt(kv[2]); + this.research[name] = [researched, level]; } catch (e) { } } } -module.exports = ResearchSync; \ No newline at end of file +module.exports = ResearchSync; diff --git a/sharedPlugins/researchSync/index.spec.js b/sharedPlugins/researchSync/index.spec.js index 261f92f3..6ca5e15b 100644 --- a/sharedPlugins/researchSync/index.spec.js +++ b/sharedPlugins/researchSync/index.spec.js @@ -9,28 +9,28 @@ describe("researchSync/index.js", ()=>{ assert.equal(typeof researchSync, "function"); }); describe("class researchSync()", ()=>{ - it(".diff(object1, object2) returns key:value pairs that exist in object2 but not object1", ()=>{ + it(".filterResearchDiff(object1, object2) returns research that needs enabling on the local instance", ()=>{ let reSync = new researchSync({}, function(){}); let obj1 = { - a:"str", - b:123, - c:console.log, - d:"apple cake", - } + a:[true, 0], + b:[true, 0], + c:[false, 0], + d:[false, 10], + }; let obj2 = { - a:"str", - b:9999, - c:console.log, - e:"truthy", - } - assert(typeof reSync.diff == "function"); + a:[true, 0], + b:[true, 1], + c:[false, 0], + e:[false, 50], + }; + assert(typeof reSync.filterResearchDiff == "function"); - let diffResult = reSync.diff(obj1, obj2); + let diffResult = reSync.filterResearchDiff(obj1, obj2); assert(diffResult.a === undefined); - assert(diffResult.b === 9999); + assert(diffResult.b === [true, 1]); assert(diffResult.d === undefined); - assert(diffResult.e === "truthy"); + assert(diffResult.e === [false, 50]); }); it(".pollResearch() dumps a long Lua command", ()=>{ let reSync = new researchSync({}, io);