您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
randomize names and FCs for planets.nu and replaces the builtin random generator
// ==UserScript== // @name randomizeFCs // // @description randomize names and FCs for planets.nu and replaces the builtin random generator // to eliminate command codes it only replaces FCs in the format 0a0. // ship names get changed only if they contain capital letters. // // @include http://play.planets.nu/* // @include http://test.planets.nu/* // @include http://planets.nu/* // @version 3.0.0 // @homepage https://gf.qytechs.cn/en/users/32642-stephen-piper // @namespace https://gf.qytechs.cn/en/users/32642-stephen-piper // ==/UserScript== function wrapper() { var defaultplanet = new dataObject(); var execplanets = []; var builtfact = []; var builtmine = []; var ready = []; var taxrate = []; function setRandom() { } setRandom.prototype = { loadControls : function() { // debugger; this.clearData(); if (vgapMap.prototype.spMenuItem != undefined) { vgapMap.prototype.spMenuItem("Random FCs", "setRandom", function() { setRandom.prototype.setRandomFC(); }); vgapMap.prototype.spMenuItem("Random Ship Names", "setRandom", function() { setRandom.prototype.setRandomShipNames(); }); vgapMap.prototype.spMenuItem("Exec Notes", "setRandom", function() { setRandom.prototype.parsenotes(); }); vgapMap.prototype.spMenuItem("Clear", "_massClear", function() { setRandom.prototype.clearData(); }); } }, clearData : function() { execplanets = []; builtfact = []; builtmine = []; builtdef = []; ready = []; taxrate = []; defaultplanet = new dataObject(); }, setRandomFC : function() { for (var i = 0; i < vgap.myplanets.length; ++i) { var planet = vgap.myplanets[i]; if (vgap.player.id == planet.ownerid && planet.readystatus == 0) { if (planet.friendlycode == /[0-9][a-zA-Z][0-9]/) { planet.friendlycode = vgap.randomFC(); planet.changed = true; } } } for (var i = 0; i < vgap.myships.length; ++i) { var ship = vgap.myships[i]; if (vgap.player.id == ship.ownerid && ship.readystatus == 0) { if (ship.friendlycode == /[0-9][a-zA-Z][0-9]/) { ship.friendlycode = vgap.randomFC(); ship.changed = true; } } } vgap.indicator.text("done"); vgap.indicateOn(); }, setRandomShipNames : function() { var url = "http://api.wordnik.com:80/v4/words.json/randomWord"; var data = { "hasDictionaryDef" : "true", "includePartOfSpeech" : "verb-intransitive", "minLength" : "5", "maxLength" : "16", "limit" : "1", "api_key" : "a2a73e7b926c924fad7001ca3111acd55af2ffabf50eb4ae5", }; var pat = /.*?[A-Z]/; for (var i = 0; i < vgap.myships.length; ++i) { var ship = vgap.myships[i]; if (vgap.player.id == ship.ownerid && pat.test(ship.name)) { $.ajax({ async : false, type : 'GET', url : url, data : data, success : function(data) { ship.name = data.word; ship.changed = 1; } }); } } vgap.indicator.text("done"); vgap.indicateOn(); }, // **** commands are executed in the following order **** // { ["defaultplanet":{] // used for all planets that don't have notes // "checkready":"", // don't execute if planet.readystatus > 0 // "buildfact":"xxx", // phaze 1, can skip any build in any phaze // "builddef":"xxx", // "fcdef":"aaa", // once planet.defenses >= builddef // "fc":["random","aaa"], // set random or a fixed value if !fcdef // "buildmines":"xxx", // "buildfact2":"xxx", // phaze 2, after all phaze 1 builds // "builddef2":"xxx", // "minerate2":"xxx", // miningrate/turn // "resground2":"xxxx", // minerals in ground // "buildmines2":"xxx", // dependant on native type, miningrate && resground // "minbuildtax3:"xxx", // native supported tax < minbuildtax // "buildfact3":"xxx", // dependant on native type // "minerate3":"xxx", // "resground3":"xxxx", // "buildmines3":"xxx", // "natmaxtax":"xxx", // "nathappy":"xxx", // "natmaxhappych":"xxx", // "natmintaxamt":"xxx", // "ready":"1" // set planet.readystatus // [}] } // close default // **** "minerate3[neu,dur,tri,mol]":"xxx" // minimum miningrate/turn // **** "resground3[neu,dur,tri,mol]":"xxxx" // minimum minerals in ground nativetaxrate : function(l, c) { tax = Math.floor((-c * 100 + 1000 - Math.sqrt(l.nativeclans) - (l.factories + l.mines) / 2 - 50 * (10 - l.nativegovernment)) / 85); return tax; }, nativesupport : function(c) { ns = c.clans; ns *= c.race == 1 ? 2 : 1; // feds == 1 ns *= c.nativetype == 6 ? 2 : 1; // insect == 6 return ns; }, nativeTaxAmount : function(c, ntr) { var nt = 0; if (c.nativeclans > 0) { if (c.race == 6 && ntr > 20) { // borg == 6 ntr = 20; } nt = (c.nativeclans / 100) * (ntr / 10) * (c.nativegovernment / 5); nt = c.nativetype == 5 ? 0 : nt; // amorphous == 5 nt = c.nativetype == 6 ? 2 * nt : nt; // insect == 6 nt = c.race == 1 ? 2 * nt : nt; // feds == 1 nt = Math.round(nt); // nt = Math.min(this.nativesupport(c), nt); } return nt; }, nativesupportedtax : function (l, ntr) { nt = this.nativeTaxAmount(l, ntr); ns = this.nativesupport(l); nt = Math.min( nt , ns); return nt; }, parsenotes : function() { for (var f = 0; f < vgap.myplanets.length; f++) { var l = vgap.myplanets[f]; if (l.note != undefined && l.note.body != "") { try { var jn = JSON.parse(l.note.body // , function(h, k) {console.log(h+" "+k)} ); } catch (e) { console.log("parse error " + l.id + " " + l.note.body); continue; } if (jn.defaultplanet != undefined) { defaultplanet = jn.defaultplanet; // console.log("found default"); } else { l.execute = jn; // console.log("found explicit " + l.id) } } } this.execute(); for (var f = 0; f < vgap.myplanets.length; f++) { var l = vgap.myplanets[f]; if (l.note != undefined && l.note.body != "") { vgap.indicator.text("done"); vgap.indicateOn(); } } }, execute : function() { for (var f = 0; f < vgap.myplanets.length; f++) { var l = vgap.myplanets[f]; if (l.execute != undefined) { // console.log(l.id + " single"); this.executesingle(l, l.execute); } else if (defaultplanet != null) { // console.log(l.id + " default"); this.executesingle(l, defaultplanet); } } vgap.map.draw(); }, executesingle : function(l, jn) { // this has to be first if (jn.readonly != undefined) { vgap.readOnly = true; vgap.indicator.text("Read Only"); vgap.indicateOn(); } // this has to be first if (jn.checkready != undefined && l.readystatus > 0) { // console.log(l.id + " checkReady"); ready.push(l.id); return; } if (jn.buildfact != undefined) { // 1st phaze this.buildFactories(l, jn.buildfact); } fcdef = false; if (jn.builddef != undefined) { // 1st phaze this.buildDefense(l, jn.builddef); if (l.defense >= jn.builddef && jn.fcdef != undefined) { fcdef = true; if (l.friendlycode != jn.fcdef) { l.friendlycode = jn.fcdef; l.changed = true; // console.log(l.id + " deffc " + l.friendlycode); } } } if (jn.fc != undefined && !fcdef) { if (jn.fc == "random") { l.friendlycode = vgap.randomFC(); l.changed = true; // console.log(l.id + " rndfc " + l.friendlycode); } else if (jn.fc != l.friendlycode) { l.friendlycode = jn.fc; l.changed = true; // console.log(l.id + " fc " + l.friendlycode); } } if (jn.builddef2 != undefined) { // 2nd phaze this.buildDefense(l, jn.builddef2); } var minbuildtax = 0; if (jn.minbuildtax2 != undefined) minbuildtax = jn.minbuildtax2 if (jn.buildfact2 != undefined) { if (this.nativesupportedtax(l, 10) < minbuildtax) { if (l.nativeclans == 0 || l.nativetype == 5 || l.nativetype == 4) { this.buildFactories(l, jn.buildfact2); } } } if (jn.buildmines2 != undefined) { // 2nd phaze if (this.nativesupportedtax(l, 10) < minbuildtax) { if (l.nativeclans == 0 || l.nativetype == 3 || l.nativetype == 5 || l.nativetype == 4) { this.buildMines(l, jn.buildmines2); } else { var q = 0; var m = 0; var r = 0; var s = 0; if (jn.minerate2 != undefined) { m += jn.minerate2; q += l.densityneutronium > m ? 1 : 0; q += l.densityduranium > m ? 1 : 0; q += l.densitytritanium > m ? 1 : 0; q += l.densitymolybdenum > m ? 1 : 0; } if (jn.resground2 != undefined) { r += jn.resground2; s += l.groundneutronium > r ? 1 : 0; s += l.groundduranium > r ? 1 : 0; s += l.groundtritanium > r ? 1 : 0; s += l.groundmolybdenum > r ? 1 : 0; } if ((q > 0 || m == 0) && (s > 0 || r == 0)) this.buildMines(l, jn.buildmines2); } } } var minbuildtax = 0; if (jn.minbuildtax3 != undefined) minbuildtax = jn.minbuildtax3 if (jn.buildfact3 != undefined) { // 3nd phaze if (this.nativesupportedtax(l, 10) < minbuildtax) { if (l.nativeclans == 0 || l.nativetype == 5 || l.nativetype == 4) { this.buildFactories(l, jn.buildfact3); } } } // 1 Humanoid - Any starbase that is built around a humanoid planet will // have tech 10 hull technology automatically. // 7 Amphibian - Any starbase that is built around a amphibian planet will // have tech 10 beam technology automatically. // 8 Ghipsoldal - Any starbase that is built around a ghipsoldal planet will // have tech 10 engine technology automatically. // 9 Siliconoid - Any starbase that is built around a siliconoid planet will // have tech 10 torpedo technology automatically. // 2 Bovinoid - Bovinoids are very valuable. Every 10000 Bovinoids will // produce 1 supply unit per turn. // 3 Reptilian - If there Reptilians living on a planet then your mining // rate will be doubled. // 4 Avian - Are quick to forgive you for overtaxing them. They will allow // you to slightly overtax them without growing unhappy. // 5 Amorphous - The only bad natives. The Amorphous lifeforms eat 500 // colonists (5 clans) per turn. // 6 Insectoid - Insectoids produce twice the normal amount of credits per // turn per percentage as other native races. if (jn.buildmines3 != undefined) { // 3nd phaze if (this.nativesupportedtax(l, 10) < minbuildtax) { if (l.nativeclans == 0 || l.nativetype == 3 || l.nativetype == 5 || l.nativetype == 4) { this.buildMines(l, jn.buildmines3); } else { q = 0; m = 0; r = 0; s = 0; if (jn.minerate3 != undefined) { m += jn.minerate3; q += l.densityneutronium > m ? 1 : 0; q += l.densityduranium > m ? 1 : 0; q += l.densitytritanium > m ? 1 : 0; q += l.densitymolybdenum > m ? 1 : 0; } if (jn.resground3 != undefined) { r += jn.resground3; s += l.groundneutronium > r ? 1 : 0; s += l.groundduranium > r ? 1 : 0; s += l.groundtritanium > r ? 1 : 0; s += l.groundmolybdenum > r ? 1 : 0; } if ((q > 0 || m == 0) && (s > 0 || r == 0)) this.buildMines(l, jn.buildmines3); } } } // "nathappy":"xxx", // "natmaxhappych":"xxx", // "natmintaxamt":"xxx", var nativetaxrate = l.nativetaxrate; if (jn.nathappy != undefined) { var nathappych = jn.nathappy - l.nativehappypoints; if (nathappych != 0) { var maxhappych = nathappych; if (jn.natmaxhappych != undefined) { maxhappych = jn.natmaxhappych; if (nathappych > maxhappych) { nathappych = maxhappych; } else if (nathappych < -maxhappych) { nathappych = -maxhappych; } } l.nativetaxrate = this.nativetaxrate(l, nathappych); if (l.nativetaxrate < 0) { l.nativetaxrate = 0; } } } // "natmintaxamt":"xxx", if (jn.natmintaxamt != undefined) { var taxamt = this.nativesupportedtax(l, l.nativetaxrate); if (taxamt < jn.natmintaxamt) { l.nativetaxrate = 0; } } // "natmaxtax":"xxx", if (jn.natmaxtax != undefined) { if (l.nativetaxrate > jn.natmaxtax) { l.nativetaxrate = parseInt(jn.natmaxtax); } } if (l.nativetaxrate != nativetaxrate) { var nativetaxamt = this.nativesupportedtax(l, l.nativetaxrate); l.nativehappychange = vgap.nativeTaxChange(l); taxrate.push({id:l.id, tax:l.nativetaxrate, happy:l.nativehappychange, taxamt:nativetaxamt}); l.changed = true; } if (l.changed) { execplanets.push(l.id); // console.log(l.id + " changed"); } // has to be last if (jn.ready != undefined) { l.readystatus = jn.ready; l.changed = true; ready.push(l.id); // console.log("ready " + l.id); } }, buildFactories : function(d, a) { var c = this.maxBuilding(d, 100); a = Math.min(a - d.factories, d.supplies, Math.floor((d.supplies + d.megacredits) / 4), c - d.factories); if (a > 0) { this.spendSuppliesMC(d, a, a * 3) d.builtfactories += a; d.factories += a; d.changed = true; // console.log(d.id + " factories " + a + " = " + d.factories); builtfact.push({id:d.id, qty:a}); } return a; }, spendSuppliesMC : function(d, c, a) { if (c + a <= d.supplies + d.megacredits && c <= d.supplies) { if (d.megacredits < a) { var b = a - d.megacredits; d.megacredits += b; d.supplies -= b; d.suppliessold += b; // console.log(d.id + " supplies "+d.suppliessold +" mc " + // d.megacredits); } d.megacredits -= a; d.supplies -= c; d.changed = true; } }, miningRate (p, ground, density) { m = vgap.miningRate(p, density); m = m > ground ? ground : Math.round(m); return m; }, buildMines : function(d, a) { var c = this.maxBuilding(d, 200); a = Math.min(a - d.mines, d.supplies, Math.floor((d.supplies + d.megacredits) / 5), c - d.mines); if (a > 0) { this.spendSuppliesMC(d, a, a * 4); d.builtmines += a; d.mines += a; d.changed = true; // console.log(d.id + " mines " + a + " = " + d.mines); // builtmine.push(d.id); builtmine.push({id:d.id, qty:a}); } return a; }, buildDefense : function(d, a) { var c = this.maxBuilding(d, 50); a = Math.min(a - d.defense, d.supplies, Math.floor((d.supplies + d.megacredits) / 11), c - d.defense); if (a > 0) { this.spendSuppliesMC(d, a, a * 10); d.builtdefense += a; d.defense += a; d.changed = true; // console.log(d.id + " defense " + a + " = " + d.defense); builtdef.push({id:d.id, qty:a}); } return a; }, maxBuilding : function(d, a) { if (d.clans <= a) { return d.clans } else { return Math.floor(a + Math.sqrt(d.clans - a)) } }, }; var oldDrawPlanet = vgapMap.prototype.drawPlanet; vgapMap.prototype.drawPlanet = function(planet, ctx, fullrender) { var note = planet.note; planet.note = ""; oldDrawPlanet.apply(this, arguments); planet.note = note; var x = this.screenX(planet.x); var y = this.screenY(planet.y); // planets with script executed for (i = 0; i < ready.length; ++i) { if (ready[i] == planet.id) { this.drawCircle(ctx, x, y, 8 * this.zoom, "lightgreen", 2); } } // for (i = 0; i < execplanets.length; ++i) { // if (execplanets[i] == planet.id) { // this.drawCircle(ctx, x, y, 7 * this.zoom, "green", 2); // } // } x2 = this.screenX(planet.x + 11 * 1.5); q = 0; for (i = 0; i < builtfact.length; ++i) { if (builtfact[i].id == planet.id) { q += builtfact[i].qty; // this.drawCircle(ctx, x, y, 12 * this.zoom, "yellow", 2); } } if (q != 0) { ctx.fillStyle = "orange"; y2 = this.screenY(planet.y - (2 - 2) * 6 * 1.5); ctx.fillText("F+"+q, x2, y2); } q = 0; for (i = 0; i < builtmine.length; ++i) { if (builtmine[i].id == planet.id) { q += builtmine[i].qty; // this.drawCircle(ctx, x, y, 9 * this.zoom, "orange", 2); } } if (q != 0) { ctx.fillStyle = "orange"; y2 = this.screenY(planet.y - (3 - 2) * 6 * 1.5); ctx.fillText("M+"+q, x2, y2); } q = 0; for (i = 0; i < builtdef.length; ++i) { if (builtdef[i].id == planet.id) { q += builtdef[i].qty; // this.drawCircle(ctx, x, y, 9 * this.zoom, "orange", 2); } } if (q != 0) { ctx.fillStyle = "orange"; y2 = this.screenY(planet.y - (4 - 2) * 6 * 1.5); ctx.fillText("D+"+q, x2, y2); } ctx.fillStyle = "lightgreen"; y2 = this.screenY(planet.y - (5 - 2) * 6 * 1.5); for (i = 0; i < taxrate.length; ++i) { if (taxrate[i].id == planet.id) { // taxrate.push({id:l.id, tax:l.nativetaxrate, happy:l.nativehappychange, taxamt:nativetaxamount}); ctx.fillText("t%"+taxrate[i].tax+" hc" + taxrate[i].happy + " $" + taxrate[i].taxamt, x2, y2); break; } } if (planet.note && planet.note.body.length > 0) { this.drawCircle(ctx, x, y, 3.5 * this.zoom, "blue", 1); } }; // vgaPlanets.prototype.randomFC() can generate commands var oldRandomFC = vgaPlanets.prototype.randomFC; vgaPlanets.prototype.randomFC = function() { // replace function, old function is broken // randomFC.apply(this, arguments); c = ""; c += Math.floor(Math.random() * 10); var b = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; c += b.charAt(Math.floor(Math.random() * b.length)) c += Math.floor(Math.random() * 10); return c }; var oldLoadControls = vgapMap.prototype.loadControls; vgapMap.prototype.loadControls = function() { oldLoadControls.apply(this, arguments); setRandom.prototype.loadControls(); }; }; var script = document.createElement("script"); script.type = "application/javascript"; script.textContent = "(" + wrapper + ")();"; document.body.appendChild(script);
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址