HomeWorldWarpCircles

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

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 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();
//     },
// - --- -- --- -   -  - - --- --- - - - - - -- - --- - --- - - - -- -----  - -  -    - - -- - ---  --
// - --- -- --- -   -  - - --- --- - - - - - -- - --- - --- - - - -- -----  - -  -    - - -- - ---  --
// - --- -- --- -   -  - - --- --- - - - - - -- - --- - --- - - - -- -----  - -  -    - - -- - ---  --
// - --- -- --- -   -  - - --- --- - - - - - -- - --- - --- - - - -- -----  - -  -    - - -- - ---  --