Files

557 lines
15 KiB
JavaScript

// Author: deez @discord, IGN: shidded
// credits to spadarfaar and others for large portions of code
game_log("-----------------------")
game_log("MERCHANT SCRIPT STARTED");
game_log("-----------------------")
//load_code(12); // party script
// Merchant stand variables
var have_stuff_to_sell = false; // Doesnt merchant have anything to sell?
var saySomething = false; // Should merchant say something?
var phrase = "Boop boop!"; // What merchant should say
// Exchange variables
var exchange_item_name = ["candypop", "gem0"];
var exchange_at = 10;
var exchange_at_two = 2;
// Upgrade variables
var item_name = "bow";
var upgradeMaxLevel = 9; //Max level it will stop upgrading items at if enabled
var gold_start = 1000000; // start upgrading at this much gold
var gold_limit = 50000; // stop upgrading at this much gold
// Bank variable
var bank_at_empty_slots = 1; // Bank at this many empty slots
// Various check variables
var hasBeenToBank = false;
var inTown = false;
var upgrade_status = false;
var compound_status = false;
var hasUpgraded = false;
var hasCompounded = false;
var finishedUpgrading = false;
// Define our state variables
var state = "walking_to_town";
var new_state = "";
// Credits to spadarfaar for upgrade functions, this is basically a C&P of his script
var upgradeWhitelist =
{
//ItemName, Max Level
pyjamas: upgradeMaxLevel,
bunnyears: upgradeMaxLevel,
carrotsword: upgradeMaxLevel,
firestaff: 7,
fireblade: 7,
staff: upgradeMaxLevel,
bow: upgradeMaxLevel,
sshield: 7,
shield: 7,
gloves: 7,
shoes: 7,
coat: 7,
helmet: 7,
pants: 7,
gloves1: 7,
coat1: 7,
helmet1: 7,
pants1: 7,
shoes1: 7,
harbringer: 5,
oozingterror: 5,
bataxe: 7,
spear: 7,
xmaspants: 7,
xmassweater: 7,
xmashat: 7,
xmasshoes: 7,
mittens: 7,
ornamentstaff: 7,
candycanesword: 7,
warmscarf: 7,
t2bow: 7,
pmace: 7,
basher: 7,
harmor: 5,
hgloves: 5,
wingedboots: 7
};
var combineWhitelist =
{
//ItemName, Max Level
wbook0: 3,
lostearring: 2,
hpamulet: 3,
strearring: 3,
intearring: 3,
dexearring: 2,
hpbelt: 3,
ringsj: 3,
strring: 3,
intring: 3,
dexring: 2,
vitring: 3,
dexamulet: 2,
intamulet: 3,
stramulet: 3,
vitearring: 3,
dexbelt: 2,
intbelt: 3,
strbelt: 3
}
// This function calls our state controller every 3 seconds.
// Our state controller returns a state then based on that state
// We preform a function such as banking or upgrading
setInterval(function () {
//Determine what state we should be in.
state_controller();
//Switch statement decides what we should do based on the value of 'state'
switch (state) {
case "upgrading":
upgrade_status = true;
if (!isAtBlacksmith()) {
moveTo(-190, -140); // blacksmith coords
}
break;
case "compounding":
compound_status = true;
if (!isAtBlacksmith()) {
moveTo(-190, -140); // blacksmith coords
}
break;
case "walking_to_town":
if (!isInsideBank()) {
smart_move({to: "town"});
} else {
smart_move({to: "town"});
}
break;
case "banking":
goToBank();
break;
case "merching":
break;
case "at_town":
break;
case "exchange":
if (!isAtExchange()) {
moveTo(-20, -460);
}
break;
}
}, 10000);//Execute every 10 seconds?
var loops = 0;
var oldState = ""; // for state output
var stateHolder = "";
// This is where state values are returned based on conditionals
function state_controller() {
var amount_of_exchange_itemsOne = return_item_quantity(exchange_item_name[0]);
var amount_of_exchange_itemsTwo = return_item_quantity(exchange_item_name[1]);
if (loops < 51) {
loops += 1;
}
if (loops === 1) {
loops = 0;
if (state != oldState && state != stateHolder) {
stateHolder = state;
set_message(state);
}
if (saySomething == true) {
say(phrase);
}
}
if (amount_of_exchange_itemsOne >= exchange_at || amount_of_exchange_itemsTwo >= exchange_at_two) {
new_state = "exchange";
state = "exchange";
} else if (amount_of_exchange_itemsOne < 10 && state === "exchange" || amount_of_exchange_itemsTwo === 0 && state === "exchange") {
new_state = "walking_to_town";
state = "walking_to_town";
}
// Check if we're already upgrading
if (upgrade_status === true) { // && hasUpgraded === false
new_state = "upgrading";
}
if (state === "compounding" && hasCompounded === true || state === "compounding" && returnItemsToCompound() !== "undefined") {
new_state = "walking_to_town";
}
if (compound_status === true && returnItemsToCompound() != "undefined") { // && hasUpgraded === false
new_state = "compounding";
}
if (state === "compounding" && hasCompounded === true || state === "compounding" && returnItemsToCompound() !== "undefined") {
new_state = "walking_to_town";
}
if (state === "upgrading" && hasUpgraded === true && finishedUpgrading == true) {
new_state = "walking_to_town";
}
if (state === "at_town" && character.gold > gold_start && hasUpgraded == false) {
new_state = "upgrading";
state = "upgrading";
upgradeStatus = true;
return;
}
if (state === "at_town" && returnItemsToCompound() != null && hasCompounded === false) {
game_log("set it here...")
new_state = "compounding";
state = "compounding";
compoundStatus = true;
return;
}
// If we're not at town or doing anything else, set state walking to town
if (state != "at_town" && state != "upgrading" && state != "banking" && state != "merching" && state != "exchange" && state != "compounding") {
new_state = "walking_to_town";
}
if (state === "merching" && isMerchStandActive() === false) {
openMerchStand();
}
// If character inventory empty spaces are less than or equal to 39
// and character has upgraded - set state banking
if (character.esize <= bank_at_empty_slots && state != "upgrading") {
new_state = "banking";
}
if (state === "at_town" && state != "upgrading" && state != "merching" && state != "exchange") {
if (isMerchStandActive() === false && have_stuff_to_sell == true) {
moveTo(33, 49);
new_state = "merching";
state = "merching";
}
}
if (state != "merching" && isMerchStandActive()) {
closeMerchStand();
}
if (!isAtTown() && state === "at_town" && state != "banking" && state != "upgrading" && state != "compounding" && state != "exchange") {
new_state = "walking_to_town";
}
if (isAtTown() && state != "exchange" && state != "upgrading" && state != "compounding" && upgrade_status === false && state === "walking_to_town") {
new_state = "at_town";
}
if (state === "walking_to_town" && isInsideBank() === true) {
smart_move({to: "town"});
}
// If chracter has been to bank and has more than 30 empty spaces
// walk to town
if (hasBeenToBank === true && character.esize >= 25 && upgrade_status === false) {
new_state = "walking_to_town";
hasBeenToBank = false;
}
// If in town and not upgrading set state at town
if (isAtTown() && upgrade_status === false && state != "upgrading" && state != "exchange") {
new_state = "at_town";
//inTown = false;
}
if (character.gold < gold_limit && state === "upgrading" && state != "exchange") {
new_state = "walking_to_town";
}
if (upgrade_status === false && hasUpgraded === true && state === "upgrading") {
new_state = "walking_to_town";
hasUpgraded = false;
}
if (hasUpgraded === true) {
upgrade_status = false;
}
if (state != new_state) {
oldState = state;
state = new_state;
}
}
// Move to function
function moveTo(x, y) {
if (x === character.real_x && y == character.real_y) {
} else {
smart_move({x: x, y: y});
}
}
// Exchange loop
setInterval(function exchangeInterval() {
var exchangeItemTwo = return_item_quantity(exchange_item_name[1]);
var exchangeItemOne = return_item_quantity(exchange_item_name[0]);
if (isAtExchange() && state == "exchange") {
if (exchangeItemOne > 0) {
exchange(locate_item(exchange_item_name[0]));
}
if (exchangeItemTwo > 0) {
game_log("made it here");
exchange(locate_item(exchange_item_name[1]));
}
} else {
// game_log("changing state to walking to town ?? ")
new_state = "walking_to_town";
}
}, 1000);
// Upgrade loop here
setInterval(function () {
if (parent != null && parent.socket != null && state === "upgrading" && !smart.moving && character.gold > gold_limit) {
upgrade();
compound_items();
if (character.gold < gold_limit) {
hasUpgraded = true;
}
} else if (parent != null && parent.socket != null && state === "compounding" && character.gold > 6400) {
compound_items();
if (returnItemsToCompound() === "undefined" || character.gold < 6400) {
hasCompounded = true;
compound_status = false;
}
}
}, 175);
// Upgrade function, modified to buy a specific item set at top of script.
function upgrade() {
if (locate_item(item_name) == -1) buy(item_name, 1);
for (let i = 0; i < character.items.length; i++) {
let c = character.items[i];
if (c) {
var level = upgradeWhitelist[c.name];
if (c.level === upgradeMaxLevel) {
hasUpgraded = true;
finishedUpgrading = true;
//break;
}
if (level && c.level < level) {
let grades = get_grade(c);
let scrollname;
if (c.level < grades[0])
scrollname = 'scroll0';
else if (c.level < grades[1])
scrollname = 'scroll1';
else
scrollname = 'scroll2';
if (c.level >= grades[0]) {
hasUpgraded = true;
}
let [scroll_slot, scroll] = find_item(i => i.name == scrollname);
if (!scroll) {
parent.buy(scrollname);
return;
}
parent.socket.emit('upgrade', {
item_num: i,
scroll_num: scroll_slot,
offering_num: null,
clevel: c.level
});
return;
}
}
}
}
function returnItemsToCompound() {
let to_compound = character.items.reduce((collection, item, index) => {
if (item && combineWhitelist[item.name] != null && item.level < combineWhitelist[item.name]) {
let key = item.name + item.level;
!collection.has(key) ? collection.set(key, [item.level, item_grade(item), index]) : collection.get(key).push(index);
}
return collection;
}, new Map());
for (var c of to_compound.values()) {
for (let i = 2; i + 2 < c.length; i += 3) {
return [c[i], c[i + 1], c[i + 2]];
}
//game_log([c[i], c[i + 1], c[i + 2]],)
}
}
function compound_items() {
let to_compound = character.items.reduce((collection, item, index) => {
if (item && combineWhitelist[item.name] != null && item.level < combineWhitelist[item.name]) {
let key = item.name + item.level;
!collection.has(key) ? collection.set(key, [item.level, item_grade(item), index]) : collection.get(key).push(index);
}
return collection;
}, new Map());
for (var c of to_compound.values()) {
let scroll_name = "cscroll" + c[1];
for (let i = 2; i + 2 < c.length; i += 3) {
let [scroll, _] = find_item(i => i.name == scroll_name);
if (scroll == -1) {
parent.buy(scroll_name);
return;
}
parent.socket.emit('compound', {
items: [c[i], c[i + 1], c[i + 2]],
scroll_num: scroll,
offering_num: null,
clevel: c[0]
});
return;
}
}
}
function get_grade(item) {
return parent.G.items[item.name].grades;
}
// Returns the item slot and the item given the slot to start from and a filter.
function find_item(filter) {
for (let i = 0; i < character.items.length; i++) {
let item = character.items[i];
if (item && filter(item))
return [i, character.items[i]];
}
return [-1, null];
}
// Locate items by name
function locate_item(name) {
for (var i = 0; i < 42; i++) {
if (character.items[i] && character.items[i].name == name) return i;
}
return -1;
}
// Returns an items quantity
function return_item_quantity(item) {
idx = locate_item(item);
if (idx != -1) {
return character.items[idx].q;
} else {
return 0;
}
}
// Check is inside bank by map
function isInsideBank() {
//!character.bank
return character.map === "bank";
}
// Check is inside resting coord(THESE MIGHT NEED TO BE EXPANDED) range in town.
function isAtTown() {
if (character.real_x >= -20 && character.real_y < 20 && character.real_x <= 20 && character.real_y >= -20) {
return true;
} else {
return false;
}
}
// Check if in exchange area
function isAtExchange() {
if (character.real_x >= -50 && character.real_y < -300 && character.real_x <= 50 && character.real_y >= -500) {
return true;
} else {
return false;
}
}
// Check if in black smith area
function isAtBlacksmith() {
if (character.real_x >= -200 && character.real_x <= -100 && character.real_y >= -200 && character.real_y <= -100) {
return true;
} else {
return false;
}
}
// Go to bank
function goToBank() {
if (state != "at_town" && state != "upgrading" && state != "walking_to_town") {
smart_move({to: "bank"});
if (isInsideBank()) {
depositItems();
hasBeenToBank = true;
}
}
}
// Deposit all items to bank
function depositItems() {
if (character.esize === 42) return; //empty inventory
for (item in character.items) {
if (item == 0) continue;
if (!character.items[item]) continue;
bank_store(item);
}
}
// check is merch stand is active
function isMerchStandActive() {
return character.stand !== false;
}
// Open merch stand
function openMerchStand() {
if (!isMerchStandActive()) {
parent.open_merchant(0);
}
}
// Close merch stand
function closeMerchStand() {
if (isMerchStandActive()) {
parent.close_merchant(0);
}
}
// toggle merch stand (not used yet)
function toggleMerchStand() {
if (isMerchStandActive()) {
parent.close_merchant(0);
} else {
parent.open_merchant(0);
}
}