Greasy Fork is available in English.
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 http://greasyfork.icu/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();