HomeWorldWarpCircles

Test Plugin: Add warp circles to homeworld before Turn #010

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         HomeWorldWarpCircles
// @namespace    http://tampermonkey.net/
// @version      0.07
// @description  Test Plugin: Add warp circles to homeworld before Turn #010
// @author       Hijk
// @include      http://planets.nu/*
// @include      https://planets.nu/*
// @include      http://*.planets.nu/*
// @include      https://*.planets.nu/*
// @grant        none
// ==/UserScript==
/*- --- --- - - --- --- ---- - - --- --- --- ---- - - - --- - -- -- ---- - - --- -
- --- --- - - --- --- ---- - - --- --- --- ---- - - - --- - -- -- ---- - - --- -
Test script to understand plugin elements.

Uses code blocks from Map Draw, Show Notes, and Planetary Management Plugin.
   A grateful thanks goes to the authors of those plugins for the work they
   invested in developing their scripts and tools.

OBJ: At TURN #001 of a new game, create a note using the "MapDraw" format for
     3 warp circles around HomeWorld @ 81 (green), 162 (green), and 243 (yellow) ly.

Given that the note body string for vgaMapMarkUp should look like:
"body": "[{\"active\":true,\"name\":\"HOME\",\"markups\":[{\"type\":\"circle\",\"x\":2363,\"y\":2690,\"r\":81,\"attr\":{\"stroke\":\"#669966\"},\"color\":\"#669966\",\"zmin\":0,\"zmax\":0},{\"type\":\"circle\",\"x\":2363,\"y\":2690,\"r\":161,\"attr\":{\"stroke\":\"#669966\"},\"color\":\"#669966\",\"zmin\":0,\"zmax\":0}]}]",


NOTE: Function is dependanet upon the vgaMapMarkUp plugin.

v0.07 - fixed a key error issue (float value instead on integer was being stored)
      - added 450ly demarcation = nearest neighbors likely boundary  (190321)
v0.06 - bug fix that prevented new Map Draw markups from being saved.
v0.05 - Put small circle at center of star map
v0.04 - Use "vgap.addOns.vgapMapMarkUp.overlays" to perform redraw.
v0.03 - Instead of using a hard-coded "note" string, create a real "overlay"
   object defining the warp circles so that the map can be refreshed with the new
   display elements.
v0.02 - The Planetary Management Plugin loads first and generates 5 Notes.
   Thus, the next 'open' note should be id == 6. A check has been added to ensure
   that the note number will be >= 6 so that there is no chance of PMP overwriting
   the warpcircle note data. *** Does not work unless PMP has executed first.
   >> Just use a hard-coded ID value of 6.

hijk.190316
- --- --- - - --- --- ---- - - --- --- --- ---- - - - --- - -- -- ---- - - --- -
- --- --- - - --- --- ---- - - --- --- --- ---- - - - --- - -- -- ---- - - --- -*/

function wrapper() { // . . . . . . . . . . . wrapper for injection
    var debug = false;
    var plgname = "HomeWorldWarpCircles";
    var plgversion = 0.07;
    var hwwc_show = true;                            // display option for left menu bar
    var hwwc_autorun = true;                         // auto-run the add Note function on game load
    var drawNoteType = -133919;                      // MapDraw type code used by vgaMapMarkUp
    var wradius = [81, 162, 243, 450]                // warp distances (ly)
    var wcolor = ["#669966", "#669966", "#ffcc00", "#990033"]   // warp ring colors

//- --- --- - - --- --- ---- - - --- --- --- ---- - - - --- - -- -- ---- - - --- -
//- --- --- - - --- --- ---- - - --- --- --- ---- - - - --- - -- -- ---- - - --- -
// START PLUGIN BLOCK . . . . . . . . . . . . . . . .
var drawWarpCircles = {
    addDrawNote: function () {
    //- --- --- - - --- --- ---- - - --- --- ---
    // 1. Get Homeworld planet by finding planet with Starbase within first 10 turns . . . . .
        var pid = vgap.player.id;
        if (vgap.settings.turn < 10) {
            for (var i = 0; i < vgap.planets.length; i++) {
                var planet = vgap.planets[i];
                if (pid == planet.ownerid && planet.isbase) {
                    if (debug) {console.log("   >>> HW location = ("+planet.x+","+planet.y+")");}
    //- --- --- - - --- --- ---- - - --- --- ---
    // 2. Create NOTE object using the MapDraw data structure . . . . . . . . . . .
                    // Create two overlay layers, 0 = HOME and 1 = ENEMY . . . . .
                    var warpz = [{"active":true,"name":"HOME","markups":[]},{"active":true,"name":"ENEMY","markups":[]}];
                    for (var j = 0; j < wradius.length; j++){
                        warpz[0].markups[j] = {"type":"circle","x":planet.x,"y":planet.y,"r":wradius[j],"attr":{"stroke":wcolor[j]},"color":wcolor[j],"zmin":0,"zmax":0}
                    }
                    // Add a reference point in the map center . . . . .
                    var center = {'x': 0, 'y': 0}
                    var pcount = 0
                    for (var k = 0; k < vgap.planets.length; k++) {
                        if (vgap.planets[k].debrisdisk == 0) {
                            center.x += vgap.planets[k].x;
                            center.y += vgap.planets[k].y;
                            pcount += 1;
                    }   } // close loops
                    center.x = (center.x/pcount + 0.5);
                    center.y = (center.y/pcount + 0.5);
                    var cx = Math.round(center.x);
                    var cy = Math.round(center.y);
                    if (debug) {console.log("       >>> Map Center = ("+cx+","+cy+")");}
                    warpz[1].markups[0] = {"type":"circle","x":cx,"y":cy,"r":8,"attr":{"stroke":"#ffcc00"},"color":"#ffcc00","zmin":0,"zmax":0}
    //- --- --- - - --- --- ---- - - --- --- ---
    // 3. Save as NoteObject and queue for draw on starmap . . . .
                    var IDnum = drawWarpCircles.getNoteIDnum();
                    vgaPlanets.prototype.saveObjectAsNote(IDnum, drawNoteType, warpz);
                    vgap.addOns.vgapMapMarkUp.overlays.push(warpz[0]);
                    vgap.addOns.vgapMapMarkUp.overlays.push(warpz[1]);
                    hwwc_show = false;
                    drawWarpCircles.loaddashboard();
    //- --- --- - - --- --- ---- - - --- --- ---
       }   }   } // end nested loops
    },
    //- --- --- - - --- --- ---- - - --- --- ---
    processload: function() {
        if (debug) { console.log("   >>> drawWarpCircles: plugin start");}
        hwwc_show = true;
    },
    //- --- --- - - --- --- ---- - - --- --- ---
    loaddashboard: function() {
        if (debug) {console.log("   >>> drawWarpCircles: plugin dashboard");}
        if(hwwc_autorun && vgap.settings.turn < 10 && drawWarpCircles.checkNoteNull(drawNoteType)) {
            drawWarpCircles.addDrawNote();
            hwwc_show = false;
        }
        if(hwwc_show && vgap.settings.turn < 10 && drawWarpCircles.checkNoteNull(drawNoteType)) {
            vgap.dash.addLeftMenuItem(" Add HW Warps »", drawWarpCircles.addDrawNote, $("#DashboardMenu").find("ul:eq(3)"));
        }
    },
    //- --- --- - - --- --- ---- - - --- --- ---
    checkNoteNull: function(type) {
        var doesNotExist = 1;
        for (var i = 0; i < vgap.notes.length; i++){
            var note = vgap.notes[i];
            if (note.id > 0){
                if (debug) {console.log("   >>>     type = >"+note.targettype+"< and id = "+note.id);}
                if (note.body.indexOf("HOME") != -1 && note.targettype == type ) {
                    doesNotExist = 0;         // false, warp circle note already exists
                    if (debug) {console.log("   >>> HW Warp Circles already exists");}
        }    }    } // close all loops
        if (doesNotExist == 1 && debug) { console.log("   >>> HW WarpCircles NOTE does not exist."); }
        return doesNotExist;
    },
    //- --- --- - - --- --- ---- - - --- --- --- ---- - - - --- - -- -- ---- - - --- -
    getNoteIDnum: function() {
        var newNoteIDnum = 0;
        for (var i = 0; i < vgap.notes.length; i++){
            var note = vgap.notes[i];
            if (note.id == 0) {
                newNoteIDnum = i+1;
                break;
        }    } // close loops
        if (debug) {console.log("   >>>     New Draw Note id# ="+newNoteIDnum);}
        return newNoteIDnum;
    },
    //- --- --- - - --- --- ---- - - --- --- --- ---- - - - --- - -- -- ---- - - --- -
    //showmap: executed when switching from dashboard to starmap
    showmap: function() {
        vgap.map.drawOverlays();
    },

}; // end of plugin block
//- --- --- - - --- --- ---- - - --- --- --- ---- - - - --- - -- -- ---- - - --- -
//- --- --- - - --- --- ---- - - --- --- --- ---- - - - --- - -- -- ---- - - --- -

//- --- --- - - --- --- ---- - - --- --- --- ---- - - - --- - -- -- ---- - - --- -
// Need to access this vgap function to save NOTE data . . . . . . . . . . . .
vgaPlanets.prototype.saveObjectAsNote = function (idnum, type, object) {
    var note = vgap.getNote(idnum, type);
        if (note == null)
            note = vgap.addNote(idnum, type);
        note.changed = 1;
        note.body = JSON.stringify(object);
        //note.body = object;
        note.targettype = type;
        note.color = "";
        note.targetid = 0;
        note.ownerid = vgap.player.id;
        note.id = idnum;
        vgap.save();
        if (debug) {console.log("   >>> warp circles saved as note . . . . \nNOTEstart>\n"+note.body+"\n<endNote\n");}
};

//- --- --- - - --- --- ---- - - --- --- --- ---- - - - --- - -- -- ---- - - --- -
//- --- --- - - --- --- ---- - - --- --- --- ---- - - - --- - -- -- ---- - - --- -

// register plugin @ NU
vgap.registerPlugin(drawWarpCircles, plgname);
console.log("Draw HomeWorldWarpCircles: v" + plgversion + " registered vgap(v"+vgap.version+")" );

} //end wrapper for injection . . . . . . . . . . . . . . . . . . . . . .
//- --- --- - - --- --- ---- - - --- --- --- ---- - - - --- - -- -- ---- - - --- -

var script = document.createElement("script");
script.type = "application/javascript";
script.textContent = "(" + wrapper + ")();";
document.body.appendChild(script);


// - --- -- --- -   -  - - --- --- - - - - - -- - --- - --- - - - -- -----  - -  -    - - -- - ---  --
// - --- -- --- -   -  - - --- --- - - - - - -- - --- - --- - - - -- -----  - -  -    - - -- - ---  --
// - --- -- --- -   -  - - --- --- - - - - - -- - --- - --- - - - -- -----  - -  -    - - -- - ---  --
// . . . . . .  B O N E   Y A R D  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
// - --- -- --- -   -  - - --- --- - - - - - -- - --- - --- - - - -- -----  - -  -    - - -- - ---  --
// - --- -- --- -   -  - - --- --- - - - - - -- - --- - --- - - - -- -----  - -  -    - - -- - ---  --
// noteType = function (name) {
//     // as computed by bigintHash in https://greasyfork.org/en/scripts/6685-planets-nu-plugin-toolkit/code
//     return -parseInt(name.replace(/[_\W]/g, ""), 36) % 2147483648;
//         }
// - --- -- --- -   -  - - --- --- - - - - - -- - --- - --- - - - -- -----  - -  -    - - -- - ---  --
// - --- -- --- -   -  - - --- --- - - - - - -- - --- - --- - - - -- -----  - -  -    - - -- - ---  --
//                     var overlay = JSON.parse(warpCircles)
//                     if (debug) {console.log("       >>> draw circle = "+overlay);}
//                     for (var j=0; j<3; j++) {
//                         if (debug) {console.log("       >>> draw circle = "+overlay.markups[j]);}
//                         var markup = overlay.markups[j];
//                         vgapMap.prototype.drawScaledCircle(markup.x, markup.y, markup.r, markup.attr, overlay);
//                     }
// - --- -- --- -   -  - - --- --- - - - - - -- - --- - --- - - - -- -----  - -  -    - - -- - ---  --
// - --- -- --- -   -  - - --- --- - - - - - -- - --- - --- - - - -- -----  - -  -    - - -- - ---  --
//- --- --- - - --- --- ---- - - --- --- ---
// NOTE: not needed when using a hard-coded note position to avoid conflict with PMP ID numbers.
//     newNoteNum: function() {
//         for (var i = 0; i < 20; i++){
//             var note = vgap.notes[i];
//             if (debug) {console.log("   >>> Note ID = "+note.id+" ("+i+")");}
//             if (note.body === ""){ return i+1;}
//         }
//         return 111;
//     },
// - --- -- --- -   -  - - --- --- - - - - - -- - --- - --- - - - -- -----  - -  -    - - -- - ---  --
// - --- -- --- -   -  - - --- --- - - - - - -- - --- - --- - - - -- -----  - -  -    - - -- - ---  --
//var xycenter = "\"x\":"+planet.x+",\"y\":"+planet.y;
//var warpCircles = "[{\"active\":true,\"name\":\"HOME\",\"markups\":[{\"type\":\"circle\","+xycenter+",\"r\":81,\"attr\":{\"stroke\":\"#669966\"},\"color\":\"#669966\",\"zmin\":0,\"zmax\":0},{\"type\":\"circle\","+xycenter+",\"r\":162,\"attr\":{\"stroke\":\"#669966\"},\"color\":\"#669966\",\"zmin\":0,\"zmax\":0},{\"type\":\"circle\","+xycenter+",\"r\":243,\"attr\":{\"stroke\":\"#ffff00\"},\"color\":\"#ffff00\",\"zmin\":0,\"zmax\":0}]}]";
// - --- -- --- -   -  - - --- --- - - - - - -- - --- - --- - - - -- -----  - -  -    - - -- - ---  --
//- --- --- - - --- --- ---- - - --- --- --- ---- - - - --- - -- -- ---- - - --- -
//                    var overlays = vgap.addOns.vgapMapMarkUp.overlays;
//                     for (j=0; j<3; j++) {
//                         var mk = warpz[0].markups[j];
//                         vgapMap.prototype.drawScaledCircle(mk.x, mk.y, mk.r, mk.attr, this.overlays);
//                     }
// - --- -- --- -   -  - - --- --- - - - - - -- - --- - --- - - - -- -----  - -  -    - - -- - ---  --
//                     for (j=0; j<3; j++) {
//                         var mk = warpz[0].markups[j];
//                         if (debug) { console.log("   >>>     Draw warp circle: "+mk.r+" ly");}
//                         vgap.map.drawScaledCircle(mk.x, mk.y, mk.r, mk.attr, vgap.map.ctx);
//                     }
// - --- -- --- -   -  - - --- --- - - - - - -- - --- - --- - - - -- -----  - -  -    - - -- - ---  --
//     //- --- --- - - --- --- ---- - - --- --- --- ---- - - - --- - -- -- ---- - - --- -
//     //showmap: executed when switching from dashboard to starmap
//     showmap: function() {
//         console.log("My ShowMap: plugin called.");
//         //console.log("Test: length of warpz = "+warpz.length);
//         if (typeof(warpz) !== 'undefined') {
//             drawWarpCircles.draw(warpz[0].markups);
//         }
//     },
//     //- --- --- - - --- --- ---- - - --- --- --- ---- - - - --- - -- -- ---- - - --- -
//     //showmap: executed when switching from dashboard to starmap
//     draw: function(markups) {
//         console.log("My draw: function called.");
//         console.log("\nmarkups>\n"+markups+"\n<end\n");
//         if (typeof(markups) !== 'undefined') {
//             for (var j=0; j<3; j++) {
//                 var mk = markups[j];
//                 if (debug) { console.log("   >>>     xDraw warp circle: "+mk.r+" ly");}
//                 drawWarpCircles.hwScaledCircle(mk.x, mk.y, mk.r, mk.attr, vgap.map.ctx);
//             }
//             if (debug) {console.log("   >>> xStarMap updated with new warp circles.");}
//         }
//     },
// - --- -- --- -   -  - - --- --- - - - - - -- - --- - --- - - - -- -----  - -  -    - - -- - ---  --
//     // Draw warp circles . . . . . . . . . . . .
//     hwScaledCircle : function(x, y, radius, attr, paperset) {
//         radius *= vgap.map.zoom;
//         if (radius < 1){ radius = 1; }
//         paperset.strokeStyle = attr.stroke;
//         paperset.lineWidth = 3;
//         paperset.beginPath();
//         paperset.arc(vgap.map.screenX(x), vgap.map.screenY(y), radius, 0, Math.PI * 2, false);
//         paperset.stroke();
//     },
// - --- -- --- -   -  - - --- --- - - - - - -- - --- - --- - - - -- -----  - -  -    - - -- - ---  --
// - --- -- --- -   -  - - --- --- - - - - - -- - --- - --- - - - -- -----  - -  -    - - -- - ---  --
// - --- -- --- -   -  - - --- --- - - - - - -- - --- - --- - - - -- -----  - -  -    - - -- - ---  --
// - --- -- --- -   -  - - --- --- - - - - - -- - --- - --- - - - -- -----  - -  -    - - -- - ---  --