var extender = {
command: function (name, args) {
var cmd = { name: name, args: args };
$("textarea#observable").attr("command", JSON.stringify(cmd));
},
lastcommand: function () {
return $("textarea#observable").attr("command");
},
option: function (option, val) {
if (typeof option == "string") {
this.command("option", [option, val]);
} else {
error("Please specify name and value as parameters.", "COMMAND");
}
}
};
var productionQueue = [];
function attemptProduction() {
if (!productionQueue || productionQueue.length == 0) {
log('Attempted production, but queue was missing or empty. Exiting...', "PRODUCTION");
return;
}
for (var i = 0; i < userContext.buildingsData.length; i++) {
var b = userContext.buildingsData[i];
if (buildingProducing(b)) {
log("Building " + b.symbol + " is busy.", "PRODUCTION");
continue;
}
if (buildingFinished(b)) {
log("Building " + b.symbol + " finished production.", "PRODUCTION");
doFinishProduction(b.item_id, attemptProduction);
return;
}
var element = getElement(b.symbol);
if (element) {
executeElement(element, attemptProduction);
return;
}
}
};
function getElement(buildingSymbol) {
if (!productionQueue || productionQueue.length == 0) {
log('Attempted to extract item from queue, but the production queue was missing or empty. Exiting...', "PRODUCTION");
return null;
}
var element;
for (var i = 0; i < productionQueue.length; i++) {
if (productionQueue[i].activeBuildingPanel == buildingSymbol) {
element = productionQueue[i];
break;
}
}
if (!element) {
log('No elements enqueued for building ' + buildingSymbol + '. Array size: ' + productionQueue.length, "PRODUCTION");
return null;
}
return element;
};
function executeElement(element, callback) {
var index = productionQueue.indexOf(element);
log('Production of element ' + element.name + ' : ' + element.type + ' with index ' + index + ' initiated.', "PRODUCTION");
if (element.type == "item") {
userContext.recipeData = element.recipeData;
userContext.activeBuildingPanel = element.activeBuildingPanel;
doProduction(element.outputSymbol, element.recipeCategory, null, null, element.recipeName, callback);
productionQueue.splice(index, 1);
log('Production details: ' + element.name + ' at ' + element.activeBuildingPanel + ', ' + element.outputSymbol + ', ' + element.recipeCategory + ', ' + element.recipeName + ';', "PRODUCTION");
} else {
var buildingId = buildingBySymbol(element.activeBuildingPanel).id;
applySelectedUpgrade({ building_id: buildingId, id: element.upgradeId, gold: 0, silver: 0 }, null, callback);
productionQueue.splice(index, 1);
log('Production details: ' + element.name + ' : ' + element.type + ' at ' + element.activeBuildingPanel + ', ' + element.symbol + ';', "PRODUCTION");
}
};
function buildingFinished(b) {
return b.producing_archetype_id && !b.build_remaining;
}
function buildingProducing(b) {
return b.producing_archetype_id && b.build_remaining;
}
var bruteForceTimeout;
function bruteForce(enabled, once) {
var msg;
var container = $("#bruteBtn");
if (!container || container.length == 0) {
container = $(".challengerewardbox .rewarditem:last");
}
if (!container || container.length == 0) {
container = $(".challengerewards .challengerewarditems:first");
}
if (!container || container.length == 0) {
msg = "Cannot find appropriate container for messaging!";
error(msg);
return;
}
if (typeof enabled == "boolean" && !enabled) {
bruteForceTimeout = clearTimeout(bruteForceTimeout);
msg = "Bruting terminated.";
log(msg, "BRUTING");
// console.debug("Debuging message delivery: is there a container? " + (container) + ", " +
// "what's his length: " + container.length + ", append message? " + (container && container.length > 0) + ", " +
// "and what's the message: " + msg);
if (container.hasClass("btnwrap btnmed")) {
container.find("a").text("Done!");
}
container.after("<br />" + msg);
return;
}
// Do not run if bruting is disabled (but can be viewed)
if (extender_bruteWounds && extender_bruteWounds == 0) {
msg = "Disabled. Please set a positive number of max wounds from options to continue.";
warn(msg, "BRUTING");
// console.debug("Debuging message delivery: is there a container? " + (container) + ", " +
// "what's his length: " + container.length + ", append message? " + (container && container.length > 0) + ", " +
// "and what's the message: " + msg);
container.after("<br />" + msg);
bruteForce(false);
return;
}
var s = userContext.setSwornSword;
if (!s) {
msg = "Failed, no sworn sword set.";
error(msg, "BRUTING");
container.after("<br />" + msg);
bruteForce(false);
return;
}
// console.debug("Debuging sworn sword condition: s.damage: " + s.damage + ", " +
// "extender_bruteWounds: " + extender_bruteWounds + ", do bruting? " + (s.damage < extender_bruteWounds));
if (s.damage < extender_bruteWounds) {
if (!s.modifier) {
// Calculate what attack shoild we use if there ain't any
var max = Math.max(s.calc_battle, s.calc_trade, s.calc_intrigue);
if (max == s.calc_intrigue) {
s.modifier = "spy";
} else if (max == s.calc_trade) {
s.modifier = "barter";
} else {
s.modifier = "fight";
}
}
// console.debug("Attack with: " + s.modifier);
if (typeof once == "boolean" && once) {
// console.debug("Attack with: " + s.modifier);
doAdventure("", s.modifier, false, function () {
bruteForce(false);
});
} else {
// console.debug("Attack with: " + s.modifier);
doAdventure("", s.modifier, false, function () {
bruteForce(true);
});
}
return;
}
if (extender_bruteSwitchOff) {
msg = "Sworn sword recieved " + extender_bruteWounds + " wounds! Brute timer will self terminate.";
warn(msg, "BRUTING");
// console.debug("Debuging message delivery: is there a container? " + (container) + ", " +
// "what's his length: " + container.length + ", append message? " + (container && container.length > 0) + ", " +
// "and what's the message: " + msg);
container.after("<br />" + msg);
bruteForce(false);
} else {
// Add a minute to the cooldown, and then multiply by wounds
var interval = extender_bruteWounds * (s.damage_cooldown + 60);
msg = "Sworn sword recieved " + extender_bruteWounds + " wounds! " +
"Brute timer will self adjust. Wait " + extender_bruteWounds + " * (" + s.damage_cooldown + " + 60) = " + interval + " seconds.";
warn(msg, "BRUTING");
bruteForceTimeout = setTimeout(function () {
bruteForce(true);
}, interval * 1000);
// console.debug("Debuging message delivery: is there a container? " + (container) + ", " +
// "what's his length: " + container.length + ", append message? " + (container && container.length > 0) + ", " +
// "and what's the message: " + msg);
container.after("<br />" + msg);
}
};
$(document).on("keyup", function (e) {
if (e.keyCode == 27 && typeof bruteForceTimeout != "undefined") {
e.preventDefault();
e.stopPropagation();
bruteForce(false);
alert("Bruting terminated.");
}
});
function increment(me) {
var opt = $(me);
var min = parseInt(opt.attr("min"));
var max = parseInt(opt.attr("max"));
var step = parseInt(opt.attr("step"));
var val = parseInt(opt.text());
if (isNaN(min) || isNaN(max) || isNaN(step) || isNaN(val)) {
error("Parsing of attributes failed!", "number option");
return;
}
var newVal = val + step > max ? min : val + step;
opt.text(newVal);
};
function check(me) {
if (me.id === "toggleTooltips") {
userContext.tooltipsEnabled = !userContext.tooltipsEnabled;
}
$(me).toggleClass('checked');
};
function bruteSwitchToggle(me) {
var bSwitch = $(me).find("a.btngold");
bSwitch.text() == "switch off"
? bSwitch.text("adjust")
: bSwitch.text("switch off");
};
function inputIncrement(me) {
var input = $(me).parent().find("input[name='quantity']");
if (!input || input.length == 0) {
return;
}
var v = parseInt(input.val());
var max = parseInt(input.attr("maxlength"));
if (isNaN(v) || isNaN(max)) {
return;
}
if (me.id == "excountup") {
(max == 3 ? max = 999 : max = 99);
(v + 1 > max ? v = max : v = v + 1);
} else if (me.id == "excountdown") {
(v - 1 < 0 ? v = 0 : v = v - 1);
}
input.val(v);
}
function sort(a) {
if (typeof a == "undefined") {
a = playerInventory;
}
if (!(a instanceof Array)) {
error("Not an array! Sorting failed.");
return a;
}
// console.debug("Sorting of array initiated, check parameters: boons count: " + boons.length + ", " +
// "sorting property: " + extender_boonsSortBy);
a.sort(function (a, b) {
return b[extender_boonsSortBy2] - a[extender_boonsSortBy2];
});
a.sort(function (a, b) {
return b[extender_boonsSortBy] - a[extender_boonsSortBy];
});
log("Array sorted by " + extender_boonsSortBy + " and then by " + extender_boonsSortBy2 + " successfully.", "PAGE");
return a;
}
function formatStats(battle, trade, intrigue, level) {
return '<div class="exstatbox">' +
'<div id="plevel" class="statitem">' +
'<div><span></span>' +
'</div><var>' + level + '</var></div>' +
'<div id="battle" class="statitem">' +
'<div><span></span>' +
'</div><var class="battle_val" id="battle_val">' + battle + '</var></div>' +
'<div id="trade" class="statitem">' +
'<div><span></span>' +
'</div><var class="trade_val" id="trade_val">' + trade + '</var></div>' +
'<div id="intrigue" class="statitem">' +
'<div><span></span></div>' +
'<var class="intrigue_val" id="intrigue_val">' + intrigue + '</var></div>' +
'</div>';
}
function setSwornSword(id) {
if (typeof id == "undefined") {
return;
}
var s = extractItemById(playerInventory, id);
s && (userContext.setSwornSword = s);
}