您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
A little handy script to help with resource management and more
当前为
// ==UserScript== // @name Grepolis Resources Manager // @version 0.6_ALPHA // @include /http[s]{0,1}://[a-z]{2}[0-9]{1,2}\.grepolis\.com/game*/ // @include https://*.forum.grepolis.com/* // @require http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js // @require https://code.jquery.com/ui/1.12.1/jquery-ui.js // @description A little handy script to help with resource management and more // @author MajorOrbital // @copyright 2020+ // @grant unsafeWindow // @grant GM_addStyle // @namespace https://greasyfork.org/users/451401 // ==/UserScript== //The game window, gamedata can be accessed through this constant. const uw = unsafeWindow; //https://imgur.com/a/WmetAfe const max_levels = { main: 25, hide: 10, place: 1, lumber: 40, stoner: 40, ironer: 40, market: 30, docks: 30, barracks: 30, wall: 25, storage: 35, farm: 45, academy: 36, temple: 30 }; GM_addStyle(` :root { --main: #ffe2a2 } #GRM_window { background-color: var(--main); display: block; height: 550px; width: 780px; z-index: 1100; position: absolute; top: 100px; left: 30vw; border: 2px black solid } #GRM_toolbar { height: 30px; border-bottom: 2px black solid; } #GRM_toolbar_list { list-style-type: none; margin: 0; padding-top: 3px; padding-left: 1px; overflow: hidden; top: 10px; } #GRM_title { padding-top: 3px; float: left; width: 40%; text-align: left; } .GRM_toolbar_item { height: 25px; float: left; width: 27%; text-align: center; border-left: 1px solid black; border-right: 1px solid black; border-top: 1px solid black; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; margin: 1px } #GRM_close { padding-top: 5px; float: left; } #GRM_close_img { margin-left: 10px; } .GRM_building_image { height: 40px; width: 40px; letter-spacing: -1px; margin: 0; display: inline-grid; } .GRM_building_level { position: relative; bottom: -25px; right: -10px; color: white; max-height: 18px; font-weight: bolder; } .GRM_selector { height: 40px; width: 30px; top: 10px; display: inline; position: relative; } .GRM_troop_input { width: 36px; } .GRM_building_input { width: 35px; } input.invalid { border: 2px solid red; background-color: rgba(128, 0, 0, 0.3) } input.valid { border: 2px solid green; background-color: rgba(0, 128, 0, 0.3) } .GRM_troop_container { max-width: 50px; z-index: 5; } .GRM_special_container { width: 168px; height: 42px; border: 1px solid black; overflow: hidden; /* add this to contain floated children */ } .GRM_special_child { width: 40px; height: 40px; float: left; margin-left: 1px; margin-right: 1px; } `); function initializeGRMWindow() { $("body").append(` <div id="GRM_window"> <div id="GRM_toolbar"> <ul id="GRM_toolbar_list"> <li class="GRM_toolbar" id="GRM_title">Grepolis Resources Manager</li> <li class="GRM_toolbar_item" id="GRM_builder">City Manager</li> <li class="GRM_toolbar_item" id="GRM_resources">Resource Manager</li> <li id="GRM_close"><img id="GRM_close_img" src="https://i.imgur.com/cceOkEu.png"></li> </ul> </div> <div id="GRM_buildings"> <label id="city_name"></label> <table> <tr> <th colspan="4" id="GRM_city_name"> </th> </tr> <tr> <td colspan="4" id="GRM_main" class="building"> <div class="GRM_container"> <div class="GRM_building_image" style="background-image: url('https://gpnl.innogamescdn.com/images/game/main/main.png');"> <span class="GRM_building_level" id="GRM_main_level"></span> </div> <div class="GRM_selector" id="GRM_main_level_pick"> <input type="number" min="0" step="1" class="GRM_building_input valid" value="1" id="GRM_main_input" name="main_level"> </div> </div> </td> </tr> <tr> <td id="GRM_lumber"> <div class="GRM_container"> <div class="GRM_building_image" style="background-image: url('https://gpnl.innogamescdn.com/images/game/main/lumber.png');"> <span class="GRM_building_level" id="GRM_lumber_level"></span> </div> <div class="GRM_selector" id="GRM_lumber_selector"><input type="number" min="0" step="1" class="GRM_building_input valid" value="1" id="GRM_lumber_input" name="lumber_level"></div> </div> </td> <td id="GRM_farm"> <div class="GRM_container"> <div class="GRM_building_image" style="background-image: url('https://gpnl.innogamescdn.com/images/game/main/farm.png');"> <span class="GRM_building_level" id="GRM_farm_level"></span> </div> <div class="GRM_selector" id="GRM_lumber_farm"><input type="number" min="0" step="1" class="GRM_building_input valid" value="1" id="GRM_farm_input" name="farm_level"></div> </div> </td> <td id="GRM_stoner"> <div class="GRM_container"> <div class="GRM_building_image" style="background-image: url('https://gpnl.innogamescdn.com/images/game/main/stoner.png');"> <span class="GRM_building_level" id="GRM_stoner_level"></span> </div> <div class="GRM_selector" id="GRM_stoner_selector"><input type="number" min="0" step="1" class="GRM_building_input valid" value="1" id="GRM_stoner_input" name="stoner_level"></div> </div> </td> <td id="GRM_storage"> <div class="GRM_container"> <div class="GRM_building_image" style="background-image: url('https://gpnl.innogamescdn.com/images/game/main/storage.png');"> <span class="GRM_building_level" id="GRM_storage_level"></span> </div> <div class="GRM_selector" id="GRM_storage_selector"><input type="number" min="0" step="1" class="GRM_building_input valid" value="1" id="GRM_storage_input" name="storage_level"></div> </div> </td> </tr> <tr> <td id="GRM_ironer"> <div class="GRM_container"> <div class="GRM_building_image" style="background-image: url('https://gpnl.innogamescdn.com/images/game/main/ironer.png');"> <span class="GRM_building_level" id="GRM_ironer_level"></span> </div> <div class="GRM_selector" id="GRM_ironer_selector"><input type="number" min="0" step="1" class="GRM_building_input valid" value="1" id="GRM_ironer_input" name="ironer_level"></div> </div> </td> <td id="GRM_barracks"> <div class="GRM_container"> <div class="GRM_building_image" style="background-image: url('https://gpnl.innogamescdn.com/images/game/main/barracks.png');"> <span class="GRM_building_level" id="GRM_barracks_level"></span> </div> <div class="GRM_selector" id="GRM_barracks_selector"><input type="number" min="0" step="1" class="GRM_building_input valid" value="1" id="GRM_barracks_input" name="barracks_level"></div> </div> </td> <td id="GRM_temple"> <div class="GRM_container"> <div class="GRM_building_image" style="background-image: url('https://gpnl.innogamescdn.com/images/game/main/temple.png');"> <span class="GRM_building_level" id="GRM_temple_level"></span> </div> <div class="GRM_selector" id="GRM_temple_selector"><input type="number" min="0" step="1" class="GRM_building_input valid" value="1" id="GRM_temple_input" name="temple_level"></div> </div> </td> <td id="GRM_market"> <div class="GRM_container"> <div class="GRM_building_image" style="background-image: url('https://gpnl.innogamescdn.com/images/game/main/market.png');"> <span class="GRM_building_level" id="GRM_market_level"></span> </div> <div class="GRM_selector" id="GRM_market_selector"><input type="number" min="0" step="1" class="GRM_building_input valid" value="1" id="GRM_market_input" name="market_level"></div> </div> </td> </tr> <tr> <td id="GRM_docks"> <div class="GRM_container"> <div class="GRM_building_image" style="background-image: url('https://gpnl.innogamescdn.com/images/game/main/docks.png');"> <span class="GRM_building_level" id="GRM_docks_level"></span> </div> <div class="GRM_selector" id="GRM_docks_selector"><input type="number" min="0" step="1" class="GRM_building_input valid" value="1" id="GRM_docks_input" name="docks_level"></div> </div> </td> <td id="GRM_academy"> <div class="GRM_container"> <div class="GRM_building_image" style="background-image: url('https://gpnl.innogamescdn.com/images/game/main/academy.png');"> <span class="GRM_building_level" id="GRM_academy_level"></span> </div> <div class="GRM_selector" id="GRM_academy_selector"><input type="number" min="0" step="1" class="GRM_building_input valid" value="1" id="GRM_academy_input" name="academy_level"></div> </div> </td> <td id="GRM_wall"> <div class="GRM_container"> <div class="GRM_building_image" style="background-image: url('https://gpnl.innogamescdn.com/images/game/main/wall.png');"> <span class="GRM_building_level" id="GRM_wall_level"></span> </div> <div class="GRM_selector" id="GRM_wall_selector"><input type="number" min="0" step="1" class="GRM_building_input valid" value="1" id="GRM_wall_input" name="wall_level"></div> </div> </td> <td id="GRM_hide"> <div class="GRM_container"> <div class="GRM_building_image" style="background-image: url('https://gpnl.innogamescdn.com/images/game/main/hide.png');"> <span class="GRM_building_level" id="GRM_hide_level"></span> </div> <div class="GRM_selector" id="GRM_hide_selector"><input type="number" min="0" step="1" class="GRM_building_input valid" value="1" id="GRM_hide_input" name="hide_level"></div> </div> </td> </tr> <tr> <td colspan="2" id="GRM_special_1" class="GRM_special_container"> <div id="GRM_theater" class="GRM_special_child GRM_passive" style="background: url('https://gpnl.innogamescdn.com/images/game/main/theater_passive.png')"></div> <div id="GRM_thermal" class="GRM_special_child GRM_passive" style="background: url('https://gpnl.innogamescdn.com/images/game/main/thermal_passive.png')"></div> <div id="GRM_library" class="GRM_special_child GRM_passive" style="background: url('https://gpnl.innogamescdn.com/images/game/main/library_passive.png')"></div> <div id="GRM_lighthouse" class="GRM_special_child GRM_passive" style="background: url('https://gpnl.innogamescdn.com/images/game/main/lighthouse_passive.png')"></div> </td> <td colspan="2" id="GRM_special_2" class="GRM_special_container"> <div id="GRM_tower" class="GRM_special_child GRM_passive" style="background: url('https://gpnl.innogamescdn.com/images/game/main/tower_passive.png')"></div> <div id="GRM_statue" class="GRM_special_child GRM_passive" style="background: url('https://gpnl.innogamescdn.com/images/game/main/statue_passive.png')"></div> <div id="GRM_oracle" class="GRM_special_child GRM_passive" style="background: url('https://gpnl.innogamescdn.com/images/game/main/oracle_passive.png')"></div> <div id="GRM_trade_office" class="GRM_special_child GRM_passive" style="background: url('https://gpnl.innogamescdn.com/images/game/main/trade_office_passive.png')"></div> </td> </tr> </table> </div> <div id="GRM_troops"> <table> <tr> <td id="GRM_ls_want" class='GRM_troop_container'> <img src="https://i.imgur.com/AjYB6CO.png"/> <input type="number" name="ls_want" class='GRM_troop_input'/> </td> <td id="GRM_bir_want" class='GRM_troop_container'> <img src="https://i.imgur.com/CFrXUs3.png"/> <input type="number" name="bir_want" class='GRM_troop_input'/> </td> <td id="GRM_trir_want" class='GRM_troop_container'> <img src="https://i.imgur.com/p0y07kv.png"/> <input type="number" name="trir_want" class='GRM_troop_input'/> </td> <td id="GRM_demo_want" class='GRM_troop_container'> <img src="https://i.imgur.com/dCXH2mB.png"/> <input type="number" name="demo_want" class='GRM_troop_input'/> </td> <td id="GRM_colo_want" class='GRM_troop_container'> <img src="https://i.imgur.com/3lrcgu7.png"/> <input type="number" name="colo_want" class='GRM_troop_input'/> </td> <td id="GRM_cata_want" class='GRM_troop_container'> <img src="https://i.imgur.com/rFEtjcq.png"/> <input type="number" name="cata_want" class='GRM_troop_input'/> </td> <td id="GRM_envoy_want" class='GRM_troop_container'> <img src="https://i.imgur.com/FpoZlzN.png"/> <input type="number" name="envoy_want" class='GRM_troop_input'/> </td> <td id="GRM_myth_1_want" class='GRM_troop_container'> <img src="https://i.imgur.com/HvHHfaD.png"/> <input type="number" name="myth_1_want" class='GRM_troop_input'/> </td> <td id="GRM_myth_2_want" class='GRM_troop_container'> <img src="https://i.imgur.com/BgtcrZ5.png"/> <input type="number" name="myth_2_want" class='GRM_troop_input'/> </td> </tr> <tr> <td id="GRM_fs_pos"> </td> <td id="GRM_bir_pos"> </td> <td id="GRM_trir_pos"> </td> <td id="GRM_demo_pos"> </td> <td id="GRM_land_fast_pos"> </td> <td id="GRM_land_slow_pos"> </td> <td id="GRM_myth_1_pos"> </td> <td id="GRM_myth_2_pos"> </td> </tr> </table> </div> </div>`); addEventHandlers(); } function addEventHandlers() { console.log("Making draggable"); $("#GRM_window").draggable(); console.log("Making closable"); var close = document.querySelector("#GRM_close_img"); close.addEventListener("click", function() { $("#GRM_window").css("display", "none"); }); console.log("Making inputs work"); $(".GRM_input_building").each(function() { $(this).on("input", function() { var input = $(this); var value = input.val(); var attr_name = input.attr("name"); var name = attr_name.substring(0, attr_name.length - 6); var max = getMaxLevel(name); let int = parseInt(value); console.log(max); if (isNaN(parseInt(int)) || int < 0 || int > max) { input.removeClass("valid").addClass("invalid"); } else { input.removeClass("invalid").addClass("valid"); } updateModel(); }); }); $(".GRM_special_child").each(function() { $(this).on("click", function() { const el = $(this).first(); const name = el.attr("id").substr(4); const parent = el.parent(); if (el.hasClass("GRM_active")) { el.removeClass("GRM_active").addClass("GRM_passive"); el.css( "background", `url('https://gpnl.innogamescdn.com/images/game/main/${name}_passive.png')` ); } else if (el.hasClass("GRM_passive")) { console.log("clicked a passive"); const active_el = parent.children(".GRM_active").first(); if (active_el.length !== 0) { const active_name = active_el.attr("id").substr(4); active_el.removeClass("GRM_active").addClass("GRM_passive"); active_el.css( "background", `url('https://gpnl.innogamescdn.com/images/game/main/${active_name}_passive.png')` ); } el.removeClass("GRM_passive").addClass("GRM_active"); el.css( "background", `url('https://gpnl.innogamescdn.com/images/game/main/${name}.png')` ); } }); }); } function getMaxLevel(name) { switch (name) { case "main": return max_levels.main; case "hide": return max_levels.hide; case "place": return max_levels.place; case "lumber": return max_levels.lumber; case "stoner": return max_levels.stoner; case "ironer": return max_levels.ironer; case "market": return max_levels.market; case "docks": return max_levels.docks; case "barracks": return max_levels.barracks; case "wall": return max_levels.wall; case "storage": return max_levels.storage; case "farm": return max_levels.farm; case "academy": return max_levels.academy; case "temple": return max_levels.temple; default: return 1; } } function updateModel() { return; } function openGRMWindow() { var grmWindow = document.querySelector("#GRM_window"); if (grmWindow === null) { initializeGRMWindow(); openGRMWindow(); return; } //console.log(uw.ITowns.getCurrentTown()); fillGRMWindow(uw.ITowns.getCurrentTown()); $("#GRM_window").css("display", "block"); } function fillGRMWindow(town) { $("#GRM_city_name").text(`${town.getName()}`); const buildings = town.getBuildings().getLevels(); $("#GRM_main_level").text(`${buildings.main}`); $("#GRM_hide_level").text(`${buildings.hide}`); $("#GRM_place_level").text(`${buildings.place}`); $("#GRM_lumber_level").text(`${buildings.lumber}`); $("#GRM_stoner_level").text(`${buildings.stoner}`); $("#GRM_ironer_level").text(`${buildings.ironer}`); $("#GRM_market_level").text(`${buildings.market}`); $("#GRM_docks_level").text(`${buildings.docks}`); $("#GRM_barracks_level").text(`${buildings.barracks}`); $("#GRM_wall_level").text(`${buildings.wall}`); $("#GRM_storage_level").text(`${buildings.storage}`); $("#GRM_farm_level").text(`${buildings.farm}`); $("#GRM_academy_level").text(`${buildings.academy}`); $("#GRM_temple_level").text(`${buildings.temple}`); $("#GRM_main_input").val(`${buildings.main}`); $("#GRM_hide_input").val(`${buildings.hide}`); $("#GRM_place_input").val(`${buildings.place}`); $("#GRM_lumber_input").val(`${buildings.lumber}`); $("#GRM_stoner_input").val(`${buildings.stoner}`); $("#GRM_ironer_input").val(`${buildings.ironer}`); $("#GRM_market_input").val(`${buildings.market}`); $("#GRM_docks_input").val(`${buildings.docks}`); $("#GRM_barracks_input").val(`${buildings.barracks}`); $("#GRM_wall_input").val(`${buildings.wall}`); $("#GRM_storage_input").val(`${buildings.storage}`); $("#GRM_farm_input").val(`${buildings.farm}`); $("#GRM_academy_input").val(`${buildings.academy}`); $("#GRM_temple_input").val(`${buildings.temple}`); var json_data = uw.ITowns.getCurrentTown() .getBuildings() .getBuildings(); var result = []; var counter = 0; for (var i in json_data) { if (counter !== 14) { counter++; continue; } result.push([i, json_data[i]]); } /* var special1 = getSpecialBuilding(result.slice(0, 4)); var special2 = getSpecialBuilding(result.slice(4)); var specialImage1 = special1 === null ? 'url(https://i.imgur.com/ScMZ4ns.png)' : `url('https://gpnl.innogamescdn.com/images/game/main/${special1}.png')`; var specialImage2 = special2 === null ? 'url(https://i.imgur.com/L26ZuJ4.png)' : `url('https://gpnl.innogamescdn.com/images/game/main/${special2}.png')`; $("#GRM_special_1_background").css("background-image", specialImage1); $("#GRM_special_2_background").css("background-image", specialImage2);*/ } function getSpecialBuilding(specialList) { var specialBuilding = null; for (let i in specialList) { if (specialList[i][1] === 1) return specialList[i][0]; } return null; } function addMenuItem() { $("#ui_box > div.nui_main_menu > div.middle > div.content > ul").append( `<li id="GRM_button"> <span class="content_wrapper"> <span class="button_wrapper"> <span class="button"> <span class="icon" style="background: url("https://s19.directupload.net/images/200222/6wtpwmkp.png") no-repeat;"></span> </span> </span> <span class="name_wrapper"> <span class="name">GRM</span> </span> </span> </li>` ); $("#GRM_button").on("click", openGRMWindow); } //Main function of the code. Everything gets run from here. function startup() { "use strict"; //tbh no idea what this does, but it doesnt work without it addMenuItem(); //Adds the GRM menu item in the left of the screen to show it } startup();