Είναι bug. Άλλο χρόνο δείχνει όταν πας να κάνεις τη μεταφορά και άλλο χρόνο κάνει στην πραγματικότητα όταν πατήσεις να γίνει η μεταφορά.
Το ίδιο γίνεται και με τα υλικά.
Απ'οτι είδα στο αγγλικό φόρουμ, το γνωρίζουν το bug και το έχουν αναφέρει.
Είναι bug. Άλλο χρόνο δείχνει όταν πας να κάνεις τη μεταφορά και άλλο χρόνο κάνει στην πραγματικότητα όταν πατήσεις να γίνει η μεταφορά.
Το ίδιο γίνεται και με τα υλικά.
Απ'οτι είδα στο αγγλικό φόρουμ, το γνωρίζουν το bug και το έχουν αναφέρει.
Question:
After the merge what happens to Gods' Grace and to Favour points from daily tasks?
Do they reset or you get to keep the percentages and the points you had before?
P.S.
Sorry if this question has already been answered!
Question: If I go into vacation mode some ours before the beggining of the merge will I have to wait 2 days to log in and merge?
EDIT: For god sake anyone asking for fighter nerfs on the marble/wood server NO NO NO
This should be bonuses some of us like to do a bit of building and a bit of fighting
I don't want one to be may berry and the other to be a viper pit.. too extreme, some of us only get 2 out of those 4 options.
I only suggested the disadvantages for the Four Setting servers where there is the option of a balanced no setting world.
The Two Setting servers should not have disadvantages I agree.
I personally believe that it is good to have a "builder" server (Setting 2) and a "fighter" server (Setting 4). But I would like to see the settings on the "builder" server become more unfavorable to fighting (perhaps by adding something like +25% troop building cost) and vice versa the "fighter" server to become more unfavorable to building (for example with +25% building time).
By adding disadvantages to the "builder" and "fighter" servers it makes more sense for Server 1 to exist with no settings for people who want a more balanced gameplay.
The "research" server (Setting 3)in order to become more enticing in the long run (because researches are finite) should have also some settings to boost also other aspects of the game like trade (for example faster merchant ships).
Since there is a pause to the merge in order to rethink the process I would like to make a proposition.
How about giving extra donation tokens to old players? Older players can be identified by their Player ID.
Some of us started playing this game back in 2008. That's over 15 years ago. Since then hunderds of players have come and gone leaving back their donations to our islands. That means that our donation level does not reflect the mine levels. For many old players it will be close to imposible to reach the same mine levels. Perhaps many years will be needed and even then I am not sure if these levels will be reached.
Are donations from an island that I moved my cities from and now I have no cities on that island going to be added as donation tokens after the merge?
Will the new target servers have the same Wonders on the same islands as the old servers?
So that maybe we can choose beforehand the exact coordinates we are going to move our cites (if we are fast enough that is).
ΟΡΙΖΟΝΤΙΑ
3 Σε βλέπει πάντα χωρίς να το ξέρεις. - ΚΑΤΑΣΚΟΠΟΣ
4 Η ισχύ στους λίγους. - ΟΛΙΓΑΡΧΙΑ
5 Συνήθως ακούμε τί έχουν να μας πουν. - ΣΥΜΒΟΥΛΟΙ
7 Εκεί φτιάχνεται κάτι ωραίο για τις εορταστικές στιγμές. - ΑΠΟΣΤΑΚΤΗΡΙΟ
9 Σε διάφορες μορφές στο παιχνίδι και όλοι χρήσιμοι. - ΠΟΡΟΙ
12 Ταύρος εκεί μέσα, θα ήταν καταστροφή. - ΥΑΛΟΥΡΓΕΙΟ
16 Μπορεί να είναι εμπορευματικό. - ΛΙΜΑΝΙ
17 Καθεστώς χάους. - ΑΝΑΡΧΙΑ
18 Μέρος διασκέδασης. - ΤΑΒΕΡΝΑ
19 Η μάστιγα των θαλασσών. - ΠΕΙΡΑΤΕΙΑ
20 Προστατεύετε τα υλικά σας από αυτήν. - ΛΕΗΛΑΣΙΑ
ΚΑΘΕΤΑ
1 Πολλοί μαζί, με κοινό στόχο. - ΣΥΜΜΑΧΙΑ
2 Πρώτοι στην μάχη. - ΣΠΑΡΤΙΑΤΕΣ
6 Ιπτάμενη απειλή αυτό. - ΓΥΡΟΚΟΠΤΕΡΟ
8 Ψεκάζει φωτιά. - ΦΛΟΓΟΒΟΛΟ
10 Τομέας ερευνών. - ΝΑΥΤΙΛΙΑ
11 Επιστήμονες και αυτοί. - ΕΡΕΥΝΗΤΕΣ
13 Πρέπει να τους κρατάτε χαρούμενους. - ΠΟΛΙΤΕΣ
14 Οι άγριοι γείτονες. - ΒΑΡΒΑΡΟΙ
15 Είναι και ζώδιο. - ΚΡΙΟΣ
ΚΑΛΑ ΧΡΙΣΤΟΥΓΕΝΝΑ !!! ![]()
i already have 1000/1000. don't need to donate? if i donate 100. will it be 100/1000?
It won't give you more blessing effect. But the blessing duration will increase if you do.
By how much does the duration increase every time you give 100 more?
And also, what happens if the timer gets to zero?
It is not very clear from the announcement: Is it one God per city with the option to choose a different God for each city or every city has to worship the same God?
I believe that by now developers know that the daily tasks system needs more tweaking in order to meet players' expectations. They can understad this both on their own (even if they don't want to admit it publicly) and by all the negative feedback from players.
BUT
If tweaking the daily tasks system means that they have to push further back multiple and more important changes to the game (as they repeatedly told us they plan to apply) then they should leave it as it is and prioritize those. We can live with a weak daily tasks system but we urgently need other more important improvements.
Concerning the 7 day redemption period, this will make a lot more sense when the next parts of this update will be ready for release.
I really hope it will make more sense in the future because right now it makes no sense.
On the contrary, it's like punishing active players that login daily and complete the tasks.
Hello,
In order for someone to get a battle report from a city with full army, which is the minimum army he has to send so that it won't be declared missing?
Thank you in advance for your help.
Display MoreGreetings,
need some testers to test my <beta>-Tampermonkey script, which brings the functionality + improvements for the Buttons. I almost restored the UI how it was before + I added an option to edit own presets-options, which can be selected later.
What you need: The extension "Tampermonkey", then click on "Create a new Script" and paste this script there and safe with "Ctrl+S". Do not modify the code unless you know what you do!
After this script has been run at least once, you get preinstalled amounts: 500, 1000 and 10000. You can go to the "Option" and edit/remove more.
DISCLAIMER: Use at Your Own Risk
Display MoreCode
- // ==UserScript==
- // @name Ikariam trading buttons for 8.11.0+
- // @version 1.0
- // @description Buttons everywhere! DISCLAIMER: Use at Your Own Risk!
- // @author srbinas
- // @match https://*.ikariam.gameforge.com/*
- // @icon https://gf1.geo.gfsrv.net/cdn03/c931195193f8b4a2d6efea089cf3c4.ico
- // @grant none
- // ==/UserScript==
- class MyObjLocalStorage {
- #storage = {};
- #id;
- #persist = () => {
- window.localStorage.setItem( this.#id, JSON.stringify( this.#storage ));
- }
- constructor(id, defaultValues = {}) {
- if (!window.localStorage) throw "NO LOCALSTORAGE, HOW OLD IS YOUR BROWSER?! IE6?!";
- this.#id = id;
- const items = window.localStorage.getItem(id);
- if (!items) {
- this.#storage = defaultValues;
- this.#persist();
- } else {
- this.#storage = JSON.parse( window.localStorage.getItem(id) );
- }
- }
- set(key, value) {
- this.add(key, value);
- }
- add(key, value) {
- this.#storage[key] = value;
- this.#persist();
- }
- get(key) {
- return this.#storage[key];
- }
- get storage() {
- return this.#storage;
- }
- remove(key) {
- if (this.#storage[key]) {
- delete this.#storage[key];
- this.#persist();
- }
- }
- }
- function restoreConsole() {
- let iframe = document.createElement("iframe");
- document.body.appendChild(iframe);
- window.console = iframe.contentWindow.console;
- }
- function getCurrentContentBox() {
- return document.querySelector("[id].mainContentBox.contentBox01h");
- }
- function $objToArr(obj) {
- return Object.entries(obj).flat();
- }
- function _showIkariamBubbleTip(type, txt, relativeToTheElement) {
- if (!relativeToTheElement) return;
- let bounds = relativeToTheElement.getBoundingClientRect();
- const specificStyles = {
- error: {
- feedBackTipClass: "feedbackTip bubbleTooltip redTip",
- styled: "errorCross"
- },
- success: {
- feedBackTipClass: "feedbackTip bubbleTooltip greenTip",
- styled: "confirmCheckmark"
- }
- }
- let bubbleTip = $createElement("span", "bubble_tip", null, {"z-index": 6520000, position: "absolute", left: (bounds.left-10)+"px", top: (bounds.top+20)+"px", transition: "opacity ease-in 0.5s"});
- let feedbackTip = $createElement("div", specificStyles[type]["feedBackTipClass"], null, {opacity: 0});
- let feedBackTipTop = $createElement("div", "top");
- let feedBackTipRepeat = $createElement("div", "repeat", null, null, {innerText: txt});
- let feedBackTipBottom = $createElement("div", "bottom");
- let feedBackTipErrorCross = $createElement("span", specificStyles[type]["styled"]);
- feedbackTip.appendChild( feedBackTipTop );
- feedbackTip.appendChild( feedBackTipRepeat );
- feedbackTip.appendChild( feedBackTipBottom );
- feedbackTip.appendChild( feedBackTipErrorCross );
- bubbleTip.appendChild( feedbackTip );
- document.body.appendChild( bubbleTip );
- feedbackTip.style.setProperty("opacity", "0.9");
- setTimeout(() => {
- feedbackTip.style.setProperty("opacity", "0");
- setTimeout(() => bubbleTip.remove(), 500);
- }, 3000);
- }
- function showAndVanishError(txt, relativeToTheElement) {
- _showIkariamBubbleTip("error", txt, relativeToTheElement);
- }
- function showAndVanishSuccess(txt, relativeToTheElement) {
- _showIkariamBubbleTip("success", txt, relativeToTheElement);
- }
- function $createElement(tagName, className = null, id = null, styles = {}, attributes = {}) {
- let newElement = document.createElement(tagName);
- className && (newElement.className = className);
- id && (newElement.id = id);
- styles && Object.entries(styles).forEach(([key, value]) => newElement.style.setProperty(key, value, ""));
- attributes && Object.entries(attributes).forEach(([key, value]) => {
- if (key.toLocaleLowerCase() === "innertext") {
- newElement.innerText = value;
- } else if (key.toLocaleLowerCase() === "innerhtml") {
- newElement.innerHTML = value;
- } else {
- newElement.setAttribute(key, value);
- }
- });
- return newElement;
- }
- function createButtone(opt) {
- let newButton = document.createElement("button");
- opt.class && (newButton.classList.add(opt.class));
- opt.innerText && (newButton.innerText = opt.innerText);
- opt.cssText && (newButton.style.cssText = opt.cssText);
- typeof opt.event === "function" && (newButton.addEventListener("click", (e) => {
- e.preventDefault();
- opt.event(e);
- }));
- return newButton;
- }
- function applyFeaturesForView(opt) {
- if (!opt) return;
- let [viewId, fn] = $objToArr(opt);
- let currentView = getCurrentContentBox();
- fn(currentView);
- }
- function addRealMissingButtonBefore_8_11_0(view) {
- const myLocalStorage = new MyObjLocalStorage("tradingLoc", {_500: 500, _1000: 1_000, _10000: 10_000});
- const latestSelection = new MyObjLocalStorage("tradingLatestSelection", {id: null});
- let ikaGoodsElement = document.querySelector("#transportGoods ul.resourceAssign");
- let ikaGoodsEntries = ikaGoodsElement.querySelectorAll("li");
- ikaGoodsEntries.forEach((good) => {
- let input = good.querySelector("input.textfield");
- input.style.cssText = "width: 50px; left: 470px;";
- input.addEventListener("keydown", (e) => {
- e.preventDefault();
- document.querySelectorAll(".centerButton > input#submit")?.[0].click();
- });
- let buttonBox = $createElement("div", null, null, {position: "absolute", left: "411px", top: "3px"});
- let lessButton = createButtone({class: "button", innerText: "-", cssText: "width: 28px; height: 26px; padding: 0", event: (e) => {
- e.stopPropagation();
- e.preventDefault();
- let focussedOption = selectButtone.children[ selectButtone.selectedIndex ];
- if (!focussedOption) {
- showAndVanishError("You should add some presets, before adding/decreasing goods!", selectButtone);
- return;
- }
- input.value = "" + (parseInt(input.value) - parseInt(focussedOption.dataset.value));
- input.click();
- }});
- let moreButton = createButtone({class: "button", innerText: "+", cssText: "width: 28px; height: 26px; padding: 0", event: (e) => {
- e.stopPropagation();
- e.preventDefault();
- let focussedOption = selectButtone.children[ selectButtone.selectedIndex ];
- if (!focussedOption) {
- showAndVanishError("You should add some presets, before adding/decreasing goods!", selectButtone);
- return;
- }
- input.value = "" + (parseInt(input.value) + parseInt(focussedOption.dataset.value));
- input.click();
- }});
- buttonBox.appendChild(lessButton);
- buttonBox.appendChild(moreButton);
- input.insertAdjacentElement("beforeBegin", buttonBox);
- });
- let backgroundMaskElement = $createElement("div", null, null, {position: "absolute", width: "125px", height: (27+35+(40*(ikaGoodsEntries.length-1)))+"px", background: "#F3D3A0", left: "527px", top: "33px"})
- ikaGoodsElement.insertAdjacentElement("beforeBegin", backgroundMaskElement);
- let selectButtone = $createElement("select", null, "selectButtone", {position: "absolute", left: "528px", "z-index": 1, top: "34px", width: "118px"});
- backgroundMaskElement.insertAdjacentElement("beforeBegin", selectButtone);
- selectButtone.addEventListener("change", (e) => selectButtoneAction(e, "change"));
- let selectButtoneAction = (e, type) => {
- if (e.target.children.length === 0) {
- showAndVanishError("You don't have any presets defined! Go to the options to define some!", e.target);
- } else {
- latestSelection.set("id", selectButtone[e.target.selectedIndex].id);
- }
- }
- Object.entries(myLocalStorage.storage).forEach(([key, value]) => {
- let option = $createElement("option", null, key, null, {"data-key": key, "data-value": value, innerText: value});
- selectButtone.appendChild(option);
- });
- let firstAttempt = selectButtone.selectedIndex;
- if (firstAttempt > -1) {
- let optionId = latestSelection.get("id");
- if (!optionId) {
- let viewedOption = selectButtone.options[firstAttempt];
- latestSelection.set("id", viewedOption.id);
- } else {
- let myPreferredOption = selectButtone.querySelector(`#${optionId}`);
- if (myPreferredOption) {
- myPreferredOption.selected = true;
- } else {
- let nextOption = selectButtone.children[0];
- if (nextOption) {
- nextOption.selected = true;
- latestSelection.set("id", nextOption.id);
- } else {
- latestSelection.set("id", null);
- }
- }
- }
- }
- }
- function addTraidingPortOptions(view) {
- const myLocalStorage = new MyObjLocalStorage("tradingLoc", {_500: 500, _1000: 1_000, _10000: 10_000});
- let injector = view.querySelector("form > table.options.table01 tbody");
- let areaWrapper = $createElement("tr");
- let area = $createElement("td", null, null, null, {colspan: "2"});
- area.appendChild( $createElement("hr") );
- area.appendChild( $createElement("div", null, null, {"text-align": "center", "color": "blue", "font-weight": "bold"}, {innerText: "== TRAIDING PORT Preferences =="}));
- area.appendChild( $createElement("div", null, null, {"text-align": "center", "color": "blue"}, {innerText: "ADD/Remove your preferred amount of goods presets:"}));
- let presets = $createElement("div", null, "presets");
- let showSavedPresets = () => {
- let presetStyles = $createElement("style", null, null, null, {innerHTML: `
- #presets {
- font-size: 14px;
- user-select: none;
- }
- #presets .left-column {
- display: inline-table;
- width: 50%;
- float: left;
- }
- #presets .right-column {
- display: inline-table;
- width: 50%;
- float: left;
- text-align: left;
- }
- #presets .preset-content {
- padding-left: 10px;
- padding-right: 10px;
- }
- #presets .left-column .preset-content {
- cursor: pointer;
- width: fit-content;
- float: right;
- }
- #presets #add_preset {
- display: inline-table;
- font-size: 17px;
- margin-left: 3px;
- cursor: pointer;
- }
- `});
- Object.values(myLocalStorage.storage).forEach((num) => {
- let leftColumn = $createElement("div", "left-column");
- leftColumn.appendChild( $createElement("div", "preset-content remove-button", null, null, {innerHTML: "❌", title: "Remove preset?"}) );
- leftColumn.addEventListener("click", (e) => {
- let myRow = e.target.parentElement.parentElement;
- if (myRow.dataset.id) {
- myLocalStorage.remove(myRow.dataset.id);
- showAndVanishSuccess("Successfully removed!", presets);
- // Hacky: Clean all presets and do a "reload here":
- [...presets.children].forEach(e => e.remove());
- showSavedPresets();
- }
- });
- let rightColumn = $createElement("div", "right-column");
- rightColumn.appendChild( $createElement("div", "preset-content", null, null, {innerText: num}) );
- let row = $createElement("div");
- row.dataset.id = "_"+num;
- row.dataset.value = num;
- row.appendChild(leftColumn);
- row.appendChild(rightColumn);
- presets.appendChild(row);
- });
- let addPresetRow = $createElement("div");
- let leftColumnInput = $createElement("div", "left-column");
- leftColumnInput.appendChild( $createElement("div", "preset-content not-a-remove-button", null, null, {innerHTML: "➕", title: "To add the new preset, press ✅!"}) );
- let rightColumnInput = $createElement("div", "right-column");
- let rightColumnWrapper = $createElement("div", "preset-content");
- let inputField = $createElement("input", null, null, null, {type: "text", title: "Do a new preset input here!", placeholder: "0", value: "0"});
- inputField.addEventListener("keydown", (e) => {
- e.stopPropagation();
- if (e.keyCode === 13) {
- e.preventDefault();
- let value = inputField.value;
- if (/^[\d]+$/m.test(value)) {
- myLocalStorage.add("_"+value, value);
- showAndVanishSuccess("Successfully added value!", presets);
- // Hacky: Clean all presets and do a "reload here":
- [...presets.children].forEach(e => e.remove());
- showSavedPresets();
- }
- }
- });
- let addPresetButton = $createElement("div", null, "add_preset", null, {innerHTML: "✅", title: "Add preset!"});
- rightColumnWrapper.appendChild(inputField);
- rightColumnWrapper.appendChild(addPresetButton);
- rightColumnInput.appendChild(rightColumnWrapper);
- addPresetRow.appendChild(leftColumnInput);
- addPresetRow.appendChild(rightColumnInput);
- presets.appendChild(addPresetRow);
- addPresetButton.addEventListener("click", (e) => {
- let inputElement = e.target.previousElementSibling;
- let newPossibleValue = inputElement.value;
- if (/^[\d]+$/m.test(newPossibleValue)) {
- myLocalStorage.add("_"+newPossibleValue, newPossibleValue);
- showAndVanishSuccess("Successfully added value!", presets);
- // Hacky: Clean all presets and do a "reload here":
- [...presets.children].forEach(e => e.remove());
- showSavedPresets();
- } else {
- showAndVanishError("I only accept numbers! Its empty or input field has invalid characters :P!", inputElement);
- }
- e.preventDefault();
- });
- presets.appendChild( presetStyles );
- };
- showSavedPresets();
- area.appendChild( presets );
- area.appendChild( $createElement("hr") );
- areaWrapper.appendChild( area );
- let areaWrapper2 = $createElement("tr");
- let area2 = $createElement("td", null, null, null, {colspan: "2"});
- area2.appendChild( $createElement("hr") );
- areaWrapper2.appendChild( area2 );
- // Final inject
- injector.insertAdjacentElement("afterBegin", areaWrapper2);
- injector.insertAdjacentElement("afterBegin", areaWrapper);
- }
- /* MAIN AREA */
- const views = {
- transport: addRealMissingButtonBefore_8_11_0,
- options: addTraidingPortOptions
- }
- function main() {
- if (window.top !== window.self) return; // Iframes out!
- setInterval(() => {
- let currentView = getCurrentContentBox();
- if (currentView && window.__LAST_VIEW__ !== currentView && views[currentView.id]) {
- window.__LAST_VIEW__ = currentView;
- applyFeaturesForView({ [currentView.id]: views[currentView.id] });
- }
- }, 50);
- }
- main();
Code is not perfect at all, but hopefully it does not look so ugly for other OS, like Windows/MAC
Can we use this script or is it against the Rules?
The bad part, in my opinion, is that the only downside of moving a town to a different resource island would be eliminated if you pay. That would put paying users in even more advantage compared with free to play ones.
You do have a point here. But when you demolish a building you take back some of the resources you spent. So, the main advantage of the transformation feature a paying user practically gets, is the amount of time needed to have his production building up and running again. Which in my opinion doesn't affect the gameplay that much. Both users will get there eventually.
Hello everyone,
I propose a new premium feature: The ability to transform the Production Building of a city which has been transfered to an island with a differerent luxury resource than it had before.
For example: a city from a Wine island with a Winegrower is being transfered to a Marble island. With this feature, instead of having to demolish the Winegrower, you will be able to instantly transform it into a Stonemason.
The cost of this feature can be calculated according the level of the production building you want to transform, with a higher cost for higher levels.
Thank you for your time.![]()
Δεν ταιριάζει η εικόνα Δ
<iframe src="https://www.jigsawplanet.com/?rc=play&pid=26bd902c20a9&view=iframe" style="width:100%;height:600px" frameborder="0" allowfullscreen></iframe>