// ==UserScript==
// @name MH Timers+
// @author Warden Slayer
// @namespace https://greasyfork.org/en/users/227259-wardenslayer
// @version 2.0.2
// @description Handy script to keep track of the various MH location timers
// @include https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js
// @resource YOUR_CSS https://cdnjs.cloudflare.com/ajax/libs/jquery-confirm/3.3.2/jquery-confirm.min.css
// @require https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.11.2/js/all.js
// @require https://cdnjs.cloudflare.com/ajax/libs/jquery-confirm/3.3.2/jquery-confirm.min.js
// @icon https://www.mousehuntgame.com/images/items/weapons/974151e440f297f1b6d55385310ac63c.jpg?cv=2
// @match http://www.mousehuntgame.com/*
// @match https://www.mousehuntgame.com/*
// @grant GM_addStyle
// @grant GM_getResourceText
// ==/UserScript==
$(document).ready(function () {
debugLog("Timers+ Started!");
const cssTxt = GM_getResourceText("YOUR_CSS");
GM_addStyle(cssTxt);
setInitialReminders();
setInitialProps();
loadFunction();
});
function loadFunction() {
updateProps("currentLocation", user.environment_type);
buildTimerBox();
buildTinkerPanel();
runTimers();
}
$(document).ajaxComplete(function (event, xhr, options) {
if (
options.url ==
"https://www.mousehuntgame.com/managers/ajax/users/changeenvironment.php"
) {
updateProps("prevLocation", getTimerProps().currentLocation);
loadFunction();
}
});
function setInitialReminders() {
const remindersObject = getReminders();
let reminders = {};
if (remindersObject) {
reminders = remindersObject;
} else {
reminders = {
grove: { master: "Y", flags: { open: "N", closed: "N" } },
cove: { master: "Y", flags: { low: "N", mid: "N", high: "N" } },
garden: {
master: "Y",
flags: { spring: "N", summer: "N", fall: "N", winter: "N" },
},
spill: {
master: "Y",
flags: {
hero: "N",
knight: "N",
lord: "N",
baron: "N",
count: "N",
duke: "N",
gduke: "N",
aduke: "N",
},
},
};
}
setReminders(reminders);
}
function getReminders() {
return JSON.parse(localStorage.getItem("ws.mh.timers.reminders"));
}
function setReminders(newReminders) {
localStorage.setItem("ws.mh.timers.reminders", JSON.stringify(newReminders));
}
function updateReminders(key, newReminderObject) {
let remindersObject = getReminders();
remindersObject[key] = newReminderObject;
setReminders(remindersObject);
}
//-----------------------------------------------------------------------------
function setInitialProps() {
const propsObject = getTimerProps();
let properties = {};
if (propsObject) {
properties = propsObject;
} else {
properties = {
hideTimers: "N",
currentLocation: user.environment_type,
prevLocation: "",
updateInterval: 5,
killSwitch: "Y",
disarmAfterTravel: "N",
};
}
setTimerProps(properties);
}
function getTimerProps() {
return JSON.parse(localStorage.getItem("ws.mh.timers.props"));
}
function setTimerProps(newProps) {
localStorage.setItem("ws.mh.timers.props", JSON.stringify(newProps));
}
function updateProps(key, newPropsObject) {
let propsObject = getTimerProps();
propsObject[key] = newPropsObject;
setTimerProps(propsObject);
}
//===================================== TimerBox ======================================
//
//
//===================================================================================
function buildTimerBox() {
if ($(".timerBox").length > 0 || $(".accordion").length > 0) return;
const container = $("#mousehuntContainer");
const accordion = document.createElement("div");
accordion.classList.add("accordion");
$(accordion).css({
background: "rgb(116,125,205)",
width: "98%",
height: "20px",
padding: "5px",
border: "2px solid black",
cursor: "pointer",
});
const accordionPrompt = document.createElement("div");
accordionPrompt.classList.add("accordionPrompt");
const accordionTitle = document.createElement("div");
accordionTitle.classList.add("accordionTitle");
$(accordionTitle).text("MouseHunt Timers+").css({
float: "left",
"text-align": "left",
"vertical-align": "middle",
padding: "1px 0",
"font-size": "12px",
"font-weight": "bold",
});
$(accordionPrompt).text("Collapse").css({
float: "right",
padding: "1px 0",
"font-size": "11px",
"font-weight": "bold",
});
accordion.appendChild(accordionTitle);
accordion.appendChild(accordionPrompt);
const timerBox = document.createElement("div");
timerBox.classList.add("timerBox");
if (getTimerProps().hideTimers == "Y") {
timerBox.classList.add("hide");
$(accordionPrompt).text("Expand");
} else {
//dont hide
}
$(timerBox).css({
background:
"linear-gradient(90deg, rgba(215,215,215,1) 2%, rgba(213,213,215,1) 71%, rgba(228,228,228,1) 100%)",
height: 150 + "px",
padding: 2 + "px",
});
let forbiddenGrove = buildForbiddenGrove();
let balacksCove = buildBalacksCove();
let seasonalGarden = buildSeasonalGarden();
let toxicSpill = buildToxicSpill();
timerBox.appendChild(forbiddenGrove);
timerBox.appendChild(balacksCove);
timerBox.appendChild(seasonalGarden);
timerBox.appendChild(toxicSpill);
//LAST
container.prepend(timerBox);
container.prepend(accordion);
}
function updateSummary() {
const fg = $(".forbiddenGroveHeaderValue").text();
const bc = $(".balacksCoveHeaderValue").text();
const sg = $(".seasonalGardenHeaderValue").text();
const ts = $(".toxicSpillHeaderValue").text();
let accordionSummary = "";
if ($(".accordionSummary").length > 0) {
accordionSummary = $(".accordionSummary");
} else {
accordionSummary = document.createElement("div");
accordionSummary.classList.add("accordionSummary");
}
$(accordionSummary)
.text("[" + fg + "/" + bc + "/" + sg + "/" + ts + "]")
.css({
float: "left",
padding: "1px 0",
"font-size": "11px",
"font-weight": "bold",
"margin-left": "100px",
});
$(".accordion").append(accordionSummary);
}
$(document).on("click", ".accordion", function () {
const props = getTimerProps();
if (props.hideTimers == "Y") {
//show
$(".timerBox").removeClass("hide");
$(".accordionPrompt").text("Collapse");
updateProps("hideTimers", "N");
} else {
//hide
$(".timerBox").find("*").removeClass("hide");
$(".timerBox").addClass("hide");
$(".accordionPrompt").text("Expand");
$(".tinkerPanel").addClass("hide");
$(".tinkerButton").text("Tinker");
updateProps("hideTimers", "Y");
}
});
function buildTravelButtons(location) {
const remindersObject = getReminders();
const thisControlPanel = document.createElement("div");
thisControlPanel.classList.add(location + "ControlPanel");
const thisButton = document.createElement("button");
thisButton.id = location + "Button";
$(thisButton).addClass("mousehuntActionButton small");
let title = "";
let isChecked = "";
let cbTitle = "";
if (location == "forbiddenGrove") {
title = "Travel to the Forbidden Grove";
cbTitle = "Remind me of time changes in the Forbidden Grove.";
if (remindersObject.grove.master == "Y") {
isChecked = "Yes";
}
} else if (location == "balacksCove") {
title = "Travel to Balack's Cove";
cbTitle = "Remind me of time changes in Balack's Cove.";
if (remindersObject.cove.master == "Y") {
isChecked = "Yes";
}
} else if (location == "seasonalGarden") {
title = "Travel to the Seasonal Garden";
cbTitle = "Remind me of time changes in the Seasonal Garden.";
if (remindersObject.garden.master == "Y") {
isChecked = "Yes";
}
} else if (location == "toxicSpill") {
title = "Travel to the Toxic Spill";
cbTitle = "Remind me of time changes in the Toxic Spill.";
if (remindersObject.spill.master == "Y") {
isChecked = "Yes";
}
}
$(thisButton).attr("title", title);
const travelText = document.createElement("span");
$(travelText).addClass("travelText").text("Travel").css({
"font-size": "12px",
});
$(thisButton).append(travelText);
thisControlPanel.append(thisButton);
$(thisControlPanel).css({
float: "left",
width: "100%",
height: "20%",
"vertical-align": "middle",
});
$(thisButton).css({
width: "75px",
height: "100%",
float: "left",
marginRight: "12px",
});
const thisCb = document.createElement("input");
thisCb.type = "checkbox";
thisCb.name = location + "Cb";
thisCb.value = "value";
thisCb.id = location + "Cb";
$(thisCb).addClass("friendsPage-friendRow-checkBox");
thisCb.checked = isChecked;
const thisCbLabel = document.createElement("label");
thisCbLabel.htmlFor = location + "CbLabel";
thisCbLabel.appendChild(document.createTextNode("Remind"));
thisControlPanel.appendChild(thisCbLabel);
thisControlPanel.appendChild(thisCb);
$(thisCbLabel).css({
float: "left",
fontSize: "14px",
width: "50px",
height: "100%",
"vertical-align": "middle",
});
$(thisCb).css({
float: "left",
width: "20px",
margin: 0,
"vertical-align": "middle",
});
$(thisCb).attr("title", cbTitle);
if (location == "toxicSpill") {
//tinker button
const tinkerButton = document.createElement("div");
tinkerButton.classList.add("tinkerButton");
$(tinkerButton).text("Tinker");
$(tinkerButton).attr("title", "Tinker Menu");
$(tinkerButton).text("Tinker");
$(tinkerButton).css({
width: "30px",
float: "right",
padding: 3 + "px",
color: "rgb(4, 44, 202)",
marginRight: "5px",
cursor: "pointer",
});
thisControlPanel.appendChild(tinkerButton);
}
return thisControlPanel;
}
//===================================== Timers ======================================
//
//
//===================================================================================
function runTimers() {
debugLog("Timers Updating");
updateText();
const updateInterval = parseInt(getTimerProps().updateInterval, 10);
if (updateInterval == null) {
setInterval(updateText, 60000);
} else {
setInterval(updateText, updateInterval * 60000);
}
}
function updateText() {
if ($(".forbiddenGrove").length > 0) updateForbiddenGroveTimer();
if ($(".balacksCove").length > 0) updateBalacksCoveTimer();
if ($(".seasonalGarden").length > 0) updateSeasonalGardenTimer();
if ($(".toxicSpill").length > 0) updateToxicSpillTimer();
updateSummary();
}
//=========================================Generics=================================================
function genericTimerBuild(name, label, value, style, subflag) {
const TimerName = document.createElement("div");
TimerName.classList.add(name);
const TimerLabel = document.createElement("div");
TimerLabel.classList.add(name + "Label");
const TimerLabelText = document.createTextNode(label);
TimerLabel.appendChild(TimerLabelText);
const TimerValue = document.createElement("div");
TimerValue.classList.add(name + "Value");
const TimerValueText = document.createTextNode(value);
TimerValue.appendChild(TimerValueText);
$(TimerLabel).css({
float: "left",
"font-weight": 700,
marginRight: "5px",
});
if (style) {
$(TimerName).css(style);
}
if (subflag) {
$(TimerValue).css({
float: "right",
});
}
TimerName.appendChild(TimerLabel);
TimerName.appendChild(TimerValue);
return TimerName;
}
function getGenericLocatonDetails(location) {
const now = todayNow();
let first = 0;
let rotaionLenght = 0;
let keyTimes = {};
if (location == "fg") {
first = 1285704000;
rotaionLenght = 20;
keyTimes = { Closed: 16, Open: rotaionLenght };
} else if (location == "bc") {
first = 1294680060;
rotaionLenght = 18.6667;
keyTimes = {
MidF: 16,
High: 17,
MidE: 17.6667,
Low: rotaionLenght,
};
} else if (location == "sg") {
first = 288000;
rotaionLenght = 320;
keyTimes = {
Fall: 80,
Winter: 160,
Spring: 240,
Summer: rotaionLenght,
};
} else if (location == "ts") {
first = 1503597600;
rotaionLenght = 302;
keyTimes = {
//https://mhwiki.hitgrab.com/wiki/index.php/Toxic_Spill#Pollution_Levels
Knight: 15,
Lord: 31,
Baron: 49,
Count: 67,
Duke: 91,
GDuke: 115,
ADuke: 139,
//Falling
ADukeF: 151,
GDukeF: 163,
DukeF: 187,
CountF: 211,
BaronF: 235,
LordF: 253,
KnightF: 271,
HeroF: 287,
Hero: rotaionLenght,
};
}
let timePassedHours = (now - first) / 3600;
const rotationsExact = timePassedHours / rotaionLenght;
const rotationsInteger = Math.trunc(rotationsExact);
const partialrotation = (rotationsExact - rotationsInteger) * rotaionLenght;
const details = {
rotationLength: rotaionLenght,
partialRotation: partialrotation,
keyTimes: keyTimes,
};
return details;
}
function getGenericSublocation(currentSub) {
let subArray = [];
if (currentSub == "fgOpen") {
subArray = ["Closes", "Opens"];
} else if (currentSub == "fgClosed") {
subArray = ["Opens", "Closes"];
} else if (currentSub == "bcLow") {
subArray = ["Mid", "High", "Low"];
} else if (currentSub == "bcMidF") {
subArray = ["High", "Mid", "Low"];
} else if (currentSub == "bcHigh") {
subArray = ["Mid", "Low", "High"];
} else if (currentSub == "bcMidE") {
subArray = ["Low", "High", "Mid"];
} else if (currentSub == "sgFall") {
subArray = ["Winter", "Spring", "Summer", "Fall"];
} else if (currentSub == "sgWinter") {
subArray = ["Spring", "Summer", "Fall", "Winter"];
} else if (currentSub == "sgSpring") {
subArray = ["Summer", "Fall", "Winter", "Spring"];
} else if (currentSub == "sgSummer") {
subArray = ["Fall", "Winter", "Spring", "Summer"];
} else if (currentSub == "tsHero") {
subArray = ["Knight", "Lord", "Baron", "Count", "Duke"];
} else if (currentSub == "tsKnight") {
subArray = ["Lord", "Baron", "Count", "Duke", "GrandDuke"];
} else if (currentSub == "tsLord") {
subArray = ["Baron", "Count", "Duke", "GrandDuke", "Archduke"];
} else if (currentSub == "tsBaron") {
subArray = ["Count", "Duke", "GrandDuke", "Archduke", "Baron"];
} else if (currentSub == "tsCount") {
subArray = ["Duke", "GrandDuke", "Archduke", "Count", "Baron"];
} else if (currentSub == "tsDuke") {
subArray = ["GrandDuke", "Archduke", "Duke", "Count", "Baron"];
} else if (currentSub == "tsGDuke") {
subArray = ["Archduke", "GrandDuke", "Duke", "Count", "Baron"];
} else if (currentSub == "tsADuke") {
//This is the same for rising and falling
subArray = ["GrandDuke", "Duke", "Count", "Baron", "Lord"];
} else if (currentSub == "tsGDukeF") {
subArray = ["Duke", "Count", "Baron", "Lord", "Knight"];
} else if (currentSub == "tsDukeF") {
subArray = ["Count", "Baron", "Lord", "Knight", "Hero"];
} else if (currentSub == "tsCountF") {
subArray = ["Baron", "Lord", "Knight", "Hero", "Count"];
} else if (currentSub == "tsBaronF") {
subArray = ["Lord", "Knight", "Hero", "Baron", "Count"];
} else if (currentSub == "tsLordF") {
subArray = ["Knight", "Hero", "Lord", "Baron", "Count"];
} else if (currentSub == "tsKnightF") {
subArray = ["Hero", "Knight", "Lord", "Baron", "Count"];
} else if (currentSub == "tsHeroF") {
subArray = ["Knight", "Lord", "Baron", "Count", "Duke"];
}
return subArray;
}
function genericOptionsHeaderBuild(name, label, style) {
const OptionsHeader = document.createElement("div");
OptionsHeader.classList.add(name);
const OptionsHeaderLabel = document.createElement("div");
OptionsHeaderLabel.classList.add(name + "Label");
const OptionsHeaderLabelText = document.createTextNode(label);
OptionsHeaderLabel.appendChild(OptionsHeaderLabelText);
$(OptionsHeaderLabel).css({
float: "left",
width: "100%",
"font-weight": 700,
marginRight: "5px",
});
if (style) {
$(OptionsHeader).css(style);
}
OptionsHeader.appendChild(OptionsHeaderLabel);
return OptionsHeader;
}
function genericOptionsBuild(
parent,
childClass,
name,
label,
checked,
labelStyle,
childStyle,
title
) {
const OptionCb = document.createElement("input");
OptionCb.type = "checkbox";
OptionCb.name = name;
OptionCb.value = "value";
OptionCb.id = name;
if (checked == "Y") {
OptionCb.checked = "Yes";
} else {
OptionCb.checked = "";
}
const OptionCbLabel = document.createElement("label");
OptionCbLabel.htmlFor = "" + name + "Label";
OptionCbLabel.appendChild(document.createTextNode(label));
if (labelStyle) {
$(OptionCbLabel).css(labelStyle);
} else {
$(OptionCbLabel).css({
float: "left",
width: "30px",
padding: "1px",
});
}
$(OptionCb).css({
float: "left",
width: "20px",
});
if (title) {
$(OptionCb).attr("title", title);
} else {
$(OptionCb).attr(
"title",
"Selecting these will limit the time change reminders to just those selected"
);
}
const child = document.createElement("div");
child.classList.add(childClass);
child.append(OptionCbLabel);
child.append(OptionCb);
if (childStyle) {
$(child).css(childStyle);
} else {
$(child).css({
float: "left",
height: "25%",
width: "100%",
});
}
parent.append(child);
return child;
}
function genericTimerUpdate(selector, currentValue, diff, label) {
const timeNext = diff.toPrecision(4);
const timeDays = 0;
const timeNextHours = Math.trunc(timeNext);
const timeNextMinutes = Math.ceil((timeNext - timeNextHours) * 60);
const timeObj = convertToDyHrMn(timeDays, timeNextHours, timeNextMinutes);
$(selector + currentValue).show();
$(selector + currentValue + "Label").text(label);
$(selector + currentValue + "Value").text(
formatOutput(timeObj.days, timeObj.hours, timeObj.minutes)
);
return timeObj;
}
function genericReminderCheck(timeObj, remindersObj, subLocation, interval) {
let result = false;
if (timeObj.days != 0 && timeObj.hours != 0) {
//Not time yet
} else if (timeObj.minutes > interval) {
//Too soon to remind
} else if (remindersObj.master != "Y") {
//I am not Y
} else if (remindersObj.flags[subLocation] == "Y") {
result = true;
} else {
let yesCount = 0;
for (const [key, value] of Object.entries(remindersObj.flags)) {
if (key == subLocation) {
//not myself
} else if (value == "Y") {
yesCount++;
}
}
if (yesCount < 1) {
result = true;
}
}
debugLog(["ReminderCheck", subLocation, result]);
return result;
}
function genericRadioBuild(
parent,
radioClass,
name,
label,
children,
checked,
title
) {
const thisRadioDiv = document.createElement("div");
thisRadioDiv.classList.add(name);
const thisRadioLabel = document.createElement("label");
thisRadioLabel.htmlFor = "" + name + "Label";
thisRadioLabel.appendChild(document.createTextNode(label));
$(thisRadioLabel).css({
"vertical-align": "middle",
});
thisRadioDiv.appendChild(thisRadioLabel);
children.forEach(function (val) {
const thisRadio = document.createElement("input");
thisRadio.type = "radio";
thisRadio.name = "timer" + radioClass + "Radio" + val;
thisRadio.value = val;
thisRadio.id = "timer" + radioClass + "Radio" + val;
if (checked == val) {
thisRadio.checked = true;
}
const thisLabel = document.createElement("label");
thisLabel.htmlFor = "timer" + radioClass + "Radio" + val + "Label";
thisLabel.appendChild(document.createTextNode(val));
$(thisLabel).css({
width: "10px",
"vertical-align": "middle",
});
$(thisRadio).css({
width: "15px",
"vertical-align": "middle",
});
thisRadioDiv.appendChild(thisRadio);
thisRadioDiv.appendChild(thisLabel);
});
if (title) {
$(thisRadioDiv).attr("title", title);
}
parent.append(thisRadioDiv);
return thisRadioDiv;
}
//===================================== Forbidden Grove ======================================
function buildForbiddenGrove() {
const forbiddenGrove = document.createElement("div");
forbiddenGrove.classList.add("forbiddenGrove");
$(forbiddenGrove).css({
float: "left",
"border-left": "2px solid black",
"border-bottom": "2px solid black",
"border-top": "2px solid black",
"border-radius": "2px",
width: "22%",
height: "95%",
padding: 2 + "px",
});
const forbiddenGroveClockBox = document.createElement("div");
forbiddenGroveClockBox.classList.add("forbiddenGroveClockBox");
forbiddenGrove.append(forbiddenGroveClockBox);
$(forbiddenGroveClockBox).css({
float: "left",
width: "100%",
height: "80%",
});
//Header
const forbiddenGroveHeader = genericTimerBuild(
"forbiddenGroveHeader",
"Forbidden Grove is:",
"Open"
);
//Close
const forbiddenGroveCloses = genericTimerBuild(
"forbiddenGroveCloses",
"Closes in:",
"?",
{ width: "100%", height: "12%" },
"right"
);
//Open
const forbiddenGroveOpens = genericTimerBuild(
"forbiddenGroveOpens",
"Opens in:",
"?",
{ width: "100%", height: "12%" },
"right"
);
//Append
forbiddenGroveClockBox.appendChild(forbiddenGroveHeader);
forbiddenGroveClockBox.appendChild(forbiddenGroveCloses);
forbiddenGroveClockBox.appendChild(forbiddenGroveOpens);
forbiddenGrove.append(buildTravelButtons("forbiddenGrove"));
return forbiddenGrove;
}
function updateForbiddenGroveTimer() {
const propsObject = getTimerProps();
const remindersObject = getReminders();
const remindInterval = parseInt(propsObject.updateInterval, 10);
const forbiddenGrove = $(".forbiddenGroveClockBox");
const fgDetails = getGenericLocatonDetails("fg");
const partialrotation = fgDetails.partialRotation;
const keyTimes = fgDetails.keyTimes;
let timeNext = 0;
if (partialrotation < keyTimes.Closed) {
//Open
$(".forbiddenGroveHeaderValue").text(" OPEN");
$(".forbiddenGroveHeaderValue").css({
color: "green",
});
const subArray = getGenericSublocation("fgOpen");
subArray.forEach(function (currentValue) {
if (currentValue == "Closes") {
timeNext = genericTimerUpdate(
".forbiddenGrove",
currentValue,
keyTimes.Closed - partialrotation,
"Closes in:"
);
if (
genericReminderCheck(
timeNext,
remindersObject.grove,
"closed",
remindInterval
)
) {
myConfirm("grove", "closing");
if (propsObject.killSwitch == "Y") {
$("#forbiddenGroveCb").click();
}
}
} else {
genericTimerUpdate(
".forbiddenGrove",
currentValue,
keyTimes.Open - partialrotation,
"Opens again in:"
);
}
forbiddenGrove.append($(".forbiddenGrove" + currentValue).detach());
});
} else {
//Closed
$(".forbiddenGroveHeaderValue").text("CLOSED");
$(".forbiddenGroveHeaderValue").css({
color: "red",
});
const subArray = getGenericSublocation("fgClosed");
subArray.forEach(function (currentValue) {
if (currentValue == "Opens") {
timeNext = genericTimerUpdate(
".forbiddenGrove",
currentValue,
keyTimes.Open - partialrotation,
"Opens in:"
);
if (
genericReminderCheck(
timeNext,
remindersObject.grove,
"open",
remindInterval
)
) {
myAlert("The forbidden grove is opening soon");
if (propsObject.killSwitch == "Y") {
$("#forbiddenGroveCb").click();
}
}
} else {
genericTimerUpdate(
".forbiddenGrove",
currentValue,
keyTimes.Open - partialrotation + keyTimes.Closed,
"Next Close in:"
);
}
forbiddenGrove.append($(".forbiddenGrove" + currentValue).detach());
});
}
}
$(".forbiddenGrove").on("change", ":input", function () {
if (this.checked) {
this.checked = "Yes";
} else {
this.checked = "";
}
tinkerCbClick("grove", this.name, this.checked);
debugLog("FG Updated");
});
//====================================== Balacks's Cove ======================================
function buildBalacksCove() {
//if ($(".balacksCove").length > 0) return;
const balacksCove = document.createElement("div");
balacksCove.classList.add("balacksCove");
$(balacksCove).css({
float: "left",
"border-left": "2px solid black",
"border-bottom": "2px solid black",
"border-top": "2px solid black",
"border-radius": "2px",
width: "22%",
height: "95%",
padding: 2 + "px",
});
const balacksCoveClockBox = document.createElement("div");
balacksCoveClockBox.classList.add("balacksCoveClockBox");
balacksCove.append(balacksCoveClockBox);
$(balacksCoveClockBox).css({
float: "left",
width: "100%",
height: "80%",
});
//Header
const balacksCoveHeader = genericTimerBuild(
"balacksCoveHeader",
"Balack's Cove is:",
"Low Tide"
);
//Low
const balacksCoveLow = genericTimerBuild(
"balacksCoveLow",
"Low Tide in:",
"?",
{ width: "100%", height: "12%" },
"right"
);
//Mid
const balacksCoveMid = genericTimerBuild(
"balacksCoveMid",
"Mid Tide in:",
"?",
{ width: "100%", height: "12%" },
"right"
);
//High
const balacksCoveHigh = genericTimerBuild(
"balacksCoveHigh",
"High Tide in:",
"?",
{ width: "100%", height: "12%" },
"right"
);
//Append
balacksCoveClockBox.appendChild(balacksCoveHeader);
balacksCoveClockBox.appendChild(balacksCoveLow);
balacksCoveClockBox.appendChild(balacksCoveMid);
balacksCoveClockBox.appendChild(balacksCoveHigh);
balacksCove.append(buildTravelButtons("balacksCove"));
return balacksCove;
}
function updateBalacksCoveTimer() {
const propsObject = getTimerProps();
const remindersObject = getReminders();
const remindInterval = parseInt(propsObject.updateInterval, 10);
const balacksCove = $(".balacksCoveClockBox");
const bcDetails = getGenericLocatonDetails("bc");
const partialrotation = bcDetails.partialRotation;
const keyTimes = bcDetails.keyTimes;
let timeNext = 0;
if (partialrotation < keyTimes.MidF) {
//Low
$(".balacksCoveHeaderValue").text("LOW");
$(".balacksCoveHeaderValue").css({
color: "green",
});
const subArray = getGenericSublocation("bcLow");
subArray.forEach(function (currentValue) {
if (currentValue == "Mid") {
timeNext = genericTimerUpdate(
".balacksCove",
currentValue,
keyTimes.MidF - partialrotation,
"Mid Tide/F in:"
);
if (
genericReminderCheck(
timeNext,
remindersObject.cove,
"mid",
remindInterval
)
) {
myConfirm("cove", "mid");
if (propsObject.killSwitch == "Y") {
$("#balacksCoveCb").click();
}
}
} else if (currentValue == "High") {
genericTimerUpdate(
".balacksCove",
currentValue,
keyTimes.High - partialrotation,
"High Tide in:"
);
} else {
genericTimerUpdate(
".balacksCove",
currentValue,
keyTimes.Low - partialrotation,
"Low Tide again in:"
);
}
balacksCove.append($(".balacksCove" + currentValue).detach());
});
} else if (
partialrotation >= keyTimes.MidF &&
partialrotation < keyTimes.High
) {
//Mid (flooding)
$(".balacksCoveHeaderValue").text("MID-Flooding");
$(".balacksCoveHeaderValue").css({
color: "orange",
});
const subArray = getGenericSublocation("bcMidF");
subArray.forEach(function (currentValue) {
if (currentValue == "High") {
timeNext = genericTimerUpdate(
".balacksCove",
currentValue,
keyTimes.High - partialrotation,
"High Tide in:"
);
if (
genericReminderCheck(
timeNext,
remindersObject.cove,
"high",
remindInterval
)
) {
myConfirm("cove", "high");
if (propsObject.killSwitch == "Y") {
$("#balacksCoveCb").click();
}
}
} else if (currentValue == "Mid") {
genericTimerUpdate(
".balacksCove",
currentValue,
keyTimes.MidE - partialrotation,
"Mid Tide/E in:"
);
} else {
genericTimerUpdate(
".balacksCove",
currentValue,
keyTimes.Low - partialrotation,
"Low Tide again in:"
);
}
balacksCove.append($(".balacksCove" + currentValue).detach());
});
} else if (
partialrotation >= keyTimes.High &&
partialrotation < keyTimes.MidE
) {
//High
$(".balacksCoveHeaderValue").text("HIGH");
$(".balacksCoveHeaderValue").css({
color: "red",
});
const subArray = getGenericSublocation("bcHigh");
subArray.forEach(function (currentValue) {
if (currentValue == "Mid") {
timeNext = genericTimerUpdate(
".balacksCove",
currentValue,
keyTimes.MidE - partialrotation,
"Mid Tide/E in:"
);
if (
genericReminderCheck(
timeNext,
remindersObject.cove,
"mid",
remindInterval
)
) {
myConfirm("cove", "mid");
if (propsObject.killSwitch == "Y") {
$("#balacksCoveCb").click();
}
}
} else if (currentValue == "Low") {
genericTimerUpdate(
".balacksCove",
currentValue,
keyTimes.Low - partialrotation,
"Low Tide in:"
);
} else {
genericTimerUpdate(
".balacksCove",
currentValue,
keyTimes.Low - partialrotation + keyTimes.High,
"High Tide again in:"
);
}
balacksCove.append($(".balacksCove" + currentValue).detach());
});
} else if (partialrotation >= keyTimes.MidE) {
//Mid (ebbing)
$(".balacksCoveHeaderValue").text("MID-Ebbing");
$(".balacksCoveHeaderValue").css({
color: "orange",
});
const subArray = getGenericSublocation("bcMidE");
subArray.forEach(function (currentValue) {
if (currentValue == "Low") {
timeNext = genericTimerUpdate(
".balacksCove",
currentValue,
keyTimes.Low - partialrotation,
"Low Tide in:"
);
if (
genericReminderCheck(
timeNext,
remindersObject.cove,
"low",
remindInterval
)
) {
myConfirm("cove", "low");
if (propsObject.killSwitch == "Y") {
$("#balacksCoveCb").click();
}
}
} else if (currentValue == "High") {
genericTimerUpdate(
".balacksCove",
currentValue,
keyTimes.Low + keyTimes.High - partialrotation,
"High Tide in:"
);
} else if (currentValue == "Mid") {
genericTimerUpdate(
".balacksCove",
currentValue,
keyTimes.Low + keyTimes.MidF - partialrotation,
"Mid Tide/F in:"
);
balacksCove.append($(".balacksCove" + currentValue).detach());
balacksCove.append($(".balacksCoveHigh").detach());
}
});
}
debugLog("BC Updated");
}
$(".balacksCove").on("change", ":input", function () {
if (this.checked) {
this.checked = "Yes";
} else {
this.checked = "";
}
tinkerCbClick("cove", this.name, this.checked);
});
//====================================== Seasonal Garden ======================================
function buildSeasonalGarden() {
const seasonalGarden = document.createElement("div");
seasonalGarden.classList.add("seasonalGarden");
$(seasonalGarden).css({
float: "left",
marginLeft: "1px",
"border-left": "2px solid black",
"border-bottom": "2px solid black",
"border-top": "2px solid black",
"border-radius": "2px",
width: "26%",
height: "95%",
padding: 2 + "px",
});
const seasonalGardenClockBox = document.createElement("div");
seasonalGardenClockBox.classList.add("seasonalGardenClockBox");
seasonalGarden.append(seasonalGardenClockBox);
$(seasonalGardenClockBox).css({
float: "left",
width: "100%",
height: "80%",
});
//Header
const seasonalGardenHeader = genericTimerBuild(
"seasonalGardenHeader",
"Seasonal Garden is:",
"Fall"
);
//Fall
const seasonalGardenFall = genericTimerBuild(
"seasonalGardenFall",
"Fall in:",
"?",
{ width: "100%", height: "12%" },
"right"
);
//Winter
const seasonalGardenWinter = genericTimerBuild(
"seasonalGardenWinter",
"Winter in:",
"?",
{ width: "100%", height: "12%" },
"right"
);
//Spring
const seasonalGardenSpring = genericTimerBuild(
"seasonalGardenSpring",
"Spring in:",
"?",
{ width: "100%", height: "12%" },
"right"
);
//Summer
const seasonalGardenSummer = genericTimerBuild(
"seasonalGardenSummer",
"Summer in:",
"?",
{ width: "100%", height: "12%" },
"right"
);
//Append
seasonalGardenClockBox.appendChild(seasonalGardenHeader);
seasonalGardenClockBox.appendChild(seasonalGardenFall);
seasonalGardenClockBox.appendChild(seasonalGardenWinter);
seasonalGardenClockBox.appendChild(seasonalGardenSpring);
seasonalGardenClockBox.appendChild(seasonalGardenSummer);
seasonalGarden.append(buildTravelButtons("seasonalGarden"));
return seasonalGarden;
}
function updateSeasonalGardenTimer() {
const propsObject = getTimerProps();
const remindersObject = getReminders();
const remindInterval = parseInt(propsObject.updateInterval, 10);
const seasonalGarden = $(".seasonalGardenClockBox");
const sgDetails = getGenericLocatonDetails("sg");
const partialrotation = sgDetails.partialRotation;
const keyTimes = sgDetails.keyTimes;
let timeNext = 0;
if (partialrotation < keyTimes.Fall) {
//Summer
$(".seasonalGardenHeaderValue").text("SUMMER");
$(".seasonalGardenHeaderValue").css({
color: "red",
});
const subArray = getGenericSublocation("sgSummer");
subArray.forEach(function (currentValue) {
if (currentValue == "Fall") {
timeNext = genericTimerUpdate(
".seasonalGarden",
currentValue,
keyTimes.Fall - partialrotation,
"Fall in:"
);
if (
genericReminderCheck(
timeNext,
remindersObject.garden,
"fall",
remindInterval
)
) {
myConfirm("garden", "fall");
if (propsObject.killSwitch == "Y") {
$("#seasonalGardenCb").click();
}
}
} else if (currentValue == "Winter") {
timeNext = genericTimerUpdate(
".seasonalGarden",
currentValue,
keyTimes.Winter - partialrotation,
"Winter in:"
);
} else if (currentValue == "Spring") {
timeNext = genericTimerUpdate(
".seasonalGarden",
currentValue,
keyTimes.Spring - partialrotation,
"Spring in:"
);
} else {
genericTimerUpdate(
".seasonalGarden",
currentValue,
keyTimes.Summer - partialrotation,
"Summer again in:"
);
}
seasonalGarden.append($(".seasonalGarden" + currentValue).detach());
});
} else if (
partialrotation >= keyTimes.Fall &&
partialrotation < keyTimes.Winter
) {
//Fall
$(".seasonalGardenHeaderValue").text("FALL");
$(".seasonalGardenHeaderValue").css({
color: "orange",
});
const subArray = getGenericSublocation("sgFall");
subArray.forEach(function (currentValue) {
if (currentValue == "Winter") {
timeNext = genericTimerUpdate(
".seasonalGarden",
currentValue,
keyTimes.Winter - partialrotation,
"Winter in:"
);
if (
genericReminderCheck(
timeNext,
remindersObject.garden,
"winter",
remindInterval
)
) {
myConfirm("garden", "winter");
if (propsObject.killSwitch == "Y") {
$("#seasonalGardenCb").click();
}
}
} else if (currentValue == "Spring") {
timeNext = genericTimerUpdate(
".seasonalGarden",
currentValue,
keyTimes.Spring - partialrotation,
"Spring in:"
);
} else if (currentValue == "Summer") {
timeNext = genericTimerUpdate(
".seasonalGarden",
currentValue,
keyTimes.Summer - partialrotation,
"Summer in:"
);
} else {
genericTimerUpdate(
".seasonalGarden",
currentValue,
keyTimes.Summer - partialrotation + keyTimes.Fall,
"Fall again in:"
);
}
seasonalGarden.append($(".seasonalGarden" + currentValue).detach());
});
} else if (
partialrotation >= keyTimes.Winter &&
partialrotation < keyTimes.Spring
) {
//Winter
$(".seasonalGardenHeaderValue").text("WINTER");
$(".seasonalGardenHeaderValue").css({
color: "blue",
});
const subArray = getGenericSublocation("sgWinter");
subArray.forEach(function (currentValue) {
if (currentValue == "Spring") {
timeNext = genericTimerUpdate(
".seasonalGarden",
currentValue,
keyTimes.Spring - partialrotation,
"Spring in:"
);
if (
genericReminderCheck(
timeNext,
remindersObject.garden,
"spring",
remindInterval
)
) {
myConfirm("garden", "spring");
if (propsObject.killSwitch == "Y") {
$("#seasonalGardenCb").click();
}
}
} else if (currentValue == "Summer") {
timeNext = genericTimerUpdate(
".seasonalGarden",
currentValue,
keyTimes.Summer - partialrotation,
"Summer in:"
);
} else if (currentValue == "Fall") {
timeNext = genericTimerUpdate(
".seasonalGarden",
currentValue,
keyTimes.Summer - partialrotation + keyTimes.Fall,
"Fall in:"
);
} else {
genericTimerUpdate(
".seasonalGarden",
currentValue,
keyTimes.Summer - partialrotation + keyTimes.Winter,
"Winter again in:"
);
}
seasonalGarden.append($(".seasonalGarden" + currentValue).detach());
});
} else if (partialrotation >= keyTimes.Spring) {
//Spring
$(".seasonalGardenHeaderValue").text("SPRING");
$(".seasonalGardenHeaderValue").css({
color: "green",
});
const subArray = getGenericSublocation("sgSpring");
subArray.forEach(function (currentValue) {
if (currentValue == "Summer") {
timeNext = genericTimerUpdate(
".seasonalGarden",
currentValue,
keyTimes.Summer - partialrotation,
"Summer in:"
);
if (
genericReminderCheck(
timeNext,
remindersObject.garden,
"summer",
remindInterval
)
) {
myConfirm("garden", "summer");
if (propsObject.killSwitch == "Y") {
$("#seasonalGardenCb").click();
}
}
} else if (currentValue == "Fall") {
timeNext = genericTimerUpdate(
".seasonalGarden",
currentValue,
keyTimes.Summer - partialrotation + keyTimes.Fall,
"Fall in:"
);
} else if (currentValue == "Winter") {
timeNext = genericTimerUpdate(
".seasonalGarden",
currentValue,
keyTimes.Summer - partialrotation + keyTimes.Winter,
"Winter in:"
);
} else {
genericTimerUpdate(
".seasonalGarden",
currentValue,
keyTimes.Summer - partialrotation + keyTimes.Spring,
"Spring again in:"
);
}
seasonalGarden.append($(".seasonalGarden" + currentValue).detach());
});
}
debugLog("SG Updated");
}
$(".seasonalGarden").on("change", ":input", function () {
if (this.checked) {
this.checked = "Yes";
} else {
this.checked = "";
}
tinkerCbClick("garden", this.name, this.checked);
});
//====================================== Toxic Spill ======================================
function buildToxicSpill() {
const toxicSpill = document.createElement("div");
toxicSpill.classList.add("toxicSpill");
$(toxicSpill).css({
float: "left",
marginLeft: "1px",
border: "2px solid black",
"border-radius": "2px",
width: "26%",
height: "95%",
padding: 2 + "px",
});
const toxicSpillClockBox = document.createElement("div");
toxicSpillClockBox.classList.add("toxicSpillClockBox");
toxicSpill.append(toxicSpillClockBox);
$(toxicSpillClockBox).css({
float: "left",
width: "100%",
height: "80%",
});
//Header
const toxicSpillHeader = genericTimerBuild(
"toxicSpillHeader",
"Current Spill Level:",
"Hero ->"
);
//Hero
const toxicSpillHero = genericTimerBuild(
"toxicSpillHero",
"Hero in:",
"?",
{
width: "100%",
height: "12%",
},
"right"
);
//Knight
const toxicSpillKnight = genericTimerBuild(
"toxicSpillKnight",
"Knight in:",
"?",
{ width: "100%", height: "12%" },
"right"
);
//Lord
const toxicSpillLord = genericTimerBuild(
"toxicSpillLord",
"Lord in:",
"?",
{
width: "100%",
height: "12%",
},
"right"
);
//Lord
const toxicSpillBaron = genericTimerBuild(
"toxicSpillBaron",
"Baron in:",
"?",
{ width: "100%", height: "12%" },
"right"
);
//Count
const toxicSpillCount = genericTimerBuild(
"toxicSpillCount",
"Count in:",
"?",
{ width: "100%", height: "12%" },
"right"
);
//Duke
const toxicSpillDuke = genericTimerBuild(
"toxicSpillDuke",
"Duke in:",
"?",
{ width: "100%", height: "12%" },
"right"
);
//GDuke
const toxicSpillGrandDuke = genericTimerBuild(
"toxicSpillGrandDuke",
"GDuke in:",
"?",
{ width: "100%", height: "12%" },
"right"
);
//ADuke
const toxicSpillArchduke = genericTimerBuild(
"toxicSpillArchduke",
"ADuke in:",
"?",
{ width: "100%", height: "12%" },
"right"
);
//Append
toxicSpillClockBox.appendChild(toxicSpillHeader);
toxicSpillClockBox.appendChild(toxicSpillHero);
toxicSpillClockBox.appendChild(toxicSpillKnight);
toxicSpillClockBox.appendChild(toxicSpillLord);
toxicSpillClockBox.appendChild(toxicSpillBaron);
toxicSpillClockBox.appendChild(toxicSpillCount);
toxicSpillClockBox.appendChild(toxicSpillDuke);
toxicSpillClockBox.appendChild(toxicSpillGrandDuke);
toxicSpillClockBox.appendChild(toxicSpillArchduke);
toxicSpill.append(buildTravelButtons("toxicSpill"));
return toxicSpill;
}
function updateToxicSpillTimer() {
const propsObject = getTimerProps();
const remindersObject = getReminders();
const remindInterval = parseInt(propsObject.updateInterval, 10);
const toxicSpill = $(".toxicSpillClockBox");
$(toxicSpill).children().hide();
$(".toxicSpillHeader").show();
const tsDetails = getGenericLocatonDetails("ts");
const rotaionLenght = tsDetails.rotationLength;
const partialrotation = tsDetails.partialRotation;
const keyTimes = tsDetails.keyTimes;
let timeNext = 0;
if (partialrotation < keyTimes.Knight) {
//Hero Rising
$(".toxicSpillHeaderValue").text("HERO-RISING");
$(".toxicSpillHeaderValue").css({
color: "red",
});
const subArray = getGenericSublocation("tsHero");
subArray.forEach(function (currentValue) {
if (currentValue == "Knight") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.Knight - partialrotation,
"Knight in:"
);
if (
genericReminderCheck(
timeNext,
remindersObject.spill,
"knight",
remindInterval
)
) {
myConfirm("spill", "knight");
if (propsObject.killSwitch == "Y") {
$("#toxicSpillCb").click();
}
}
} else if (currentValue == "Lord") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.Lord - partialrotation,
"Lord in:"
);
} else if (currentValue == "Baron") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.Baron - partialrotation,
"Baron in:"
);
} else if (currentValue == "Count") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.Count - partialrotation,
"Count in:"
);
} else if (currentValue == "Duke") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.Duke - partialrotation,
"Duke in:"
);
}
});
} else if (
partialrotation >= keyTimes.Knight &&
partialrotation < keyTimes.Lord
) {
//Knight Rising
$(".toxicSpillHeaderValue").text("KNIGHT-RISING");
$(".toxicSpillHeaderValue").css({
color: "red",
});
const subArray = getGenericSublocation("tsKnight");
subArray.forEach(function (currentValue) {
if (currentValue == "Lord") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.Lord - partialrotation,
"Lord in:"
);
if (
genericReminderCheck(
timeNext,
remindersObject.spill,
"lord",
remindInterval
)
) {
myConfirm("spill", "lord");
if (propsObject.killSwitch == "Y") {
$("#toxicSpillCb").click();
}
}
} else if (currentValue == "Baron") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.Baron - partialrotation,
"Baron in:"
);
} else if (currentValue == "Count") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.Count - partialrotation,
"Count in:"
);
} else if (currentValue == "Duke") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.Duke - partialrotation,
"Duke in:"
);
} else if (currentValue == "GrandDuke") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.GDuke - partialrotation,
"Gduke in:"
);
}
});
} else if (
partialrotation >= keyTimes.Lord &&
partialrotation < keyTimes.Baron
) {
//Lord Rising
$(".toxicSpillHeaderValue").text("LORD-RISING");
$(".toxicSpillHeaderValue").css({
color: "red",
});
const subArray = getGenericSublocation("tsLord");
subArray.forEach(function (currentValue) {
if (currentValue == "Baron") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.Baron - partialrotation,
"Baron in:"
);
if (
genericReminderCheck(
timeNext,
remindersObject.spill,
"baron",
remindInterval
)
) {
myConfirm("spill", "baron");
if (propsObject.killSwitch == "Y") {
$("#toxicSpillCb").click();
}
}
} else if (currentValue == "Count") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.Count - partialrotation,
"Count in:"
);
} else if (currentValue == "Duke") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.Duke - partialrotation,
"Duke in:"
);
} else if (currentValue == "GrandDuke") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.GDuke - partialrotation,
"Gduke in:"
);
} else if (currentValue == "Archduke") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.ADuke - partialrotation,
"ADuke in:"
);
}
toxicSpill.append($(".toxicSpill" + currentValue).detach());
});
} else if (
partialrotation >= keyTimes.Baron &&
partialrotation < keyTimes.Count
) {
//Baron Rising
$(".toxicSpillHeaderValue").text("BARON-RISING");
$(".toxicSpillHeaderValue").css({
color: "red",
});
const subArray = getGenericSublocation("tsBaron");
subArray.forEach(function (currentValue) {
if (currentValue == "Count") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.Count - partialrotation,
"Count in:"
);
if (
genericReminderCheck(
timeNext,
remindersObject.spill,
"count",
remindInterval
)
) {
myConfirm("spill", "count");
if (propsObject.killSwitch == "Y") {
$("#toxicSpillCb").click();
}
}
} else if (currentValue == "Duke") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.Duke - partialrotation,
"Duke in:"
);
} else if (currentValue == "GrandDuke") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.GDuke - partialrotation,
"Gduke in:"
);
} else if (currentValue == "Archduke") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.ADuke - partialrotation,
"ADuke in:"
);
} else if (currentValue == "Baron") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.BaronF - partialrotation,
"Baron Falling in:"
);
}
toxicSpill.append($(".toxicSpill" + currentValue).detach());
});
} else if (
partialrotation >= keyTimes.Count &&
partialrotation < keyTimes.Duke
) {
//Count Rising
$(".toxicSpillHeaderValue").text("COUNT-RISING");
$(".toxicSpillHeaderValue").css({
color: "red",
});
const subArray = getGenericSublocation("tsCount");
subArray.forEach(function (currentValue) {
if (currentValue == "Duke") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.Duke - partialrotation,
"Duke in:"
);
if (
genericReminderCheck(
timeNext,
remindersObject.spill,
"duke",
remindInterval
)
) {
myConfirm("spill", "duke");
if (propsObject.killSwitch == "Y") {
$("#toxicSpillCb").click();
}
}
} else if (currentValue == "GrandDuke") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.GDuke - partialrotation,
"Gduke in:"
);
} else if (currentValue == "Archduke") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.ADuke - partialrotation,
"ADuke in:"
);
} else if (currentValue == "Count") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.CountF - partialrotation,
"Count Falling in:"
);
} else if (currentValue == "Baron") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.BaronF - partialrotation,
"Baron in:"
);
}
toxicSpill.append($(".toxicSpill" + currentValue).detach());
});
} else if (
partialrotation >= keyTimes.Duke &&
partialrotation < keyTimes.GDuke
) {
//Duke Rising
$(".toxicSpillHeaderValue").text("DUKE-RISING");
$(".toxicSpillHeaderValue").css({
color: "red",
});
const subArray = getGenericSublocation("tsDuke");
subArray.forEach(function (currentValue) {
if (currentValue == "GrandDuke") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.GDuke - partialrotation,
"GDuke in:"
);
if (
genericReminderCheck(
timeNext,
remindersObject.spill,
"gduke",
remindInterval
)
) {
myConfirm("spill", "grand duke");
if (propsObject.killSwitch == "Y") {
$("#toxicSpillCb").click();
}
}
} else if (currentValue == "Archduke") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.ADuke - partialrotation,
"ADuke in:"
);
} else if (currentValue == "Duke") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.DukeF - partialrotation,
"Duke Falling in:"
);
} else if (currentValue == "Count") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.CountF - partialrotation,
"Count in:"
);
} else if (currentValue == "Baron") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.BaronF - partialrotation,
"Baron in:"
);
}
toxicSpill.append($(".toxicSpill" + currentValue).detach());
});
} else if (
partialrotation >= keyTimes.GDuke &&
partialrotation < keyTimes.ADuke
) {
//Grand Duke Rising
$(".toxicSpillHeaderValue").text("GD-RISING");
$(".toxicSpillHeaderValue").css({
color: "red",
});
const subArray = getGenericSublocation("tsGDuke");
subArray.forEach(function (currentValue) {
if (currentValue == "Archduke") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.ADuke - partialrotation,
"ADuke in:"
);
if (
genericReminderCheck(
timeNext,
remindersObject.spill,
"aduke",
remindInterval
)
) {
myConfirm("spill", "archduke");
if (propsObject.killSwitch == "Y") {
$("#toxicSpillCb").click();
}
}
} else if (currentValue == "GrandDuke") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.GDukeF - partialrotation,
"GDuke Falling in:"
);
} else if (currentValue == "Duke") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.DukeF - partialrotation,
"Duke in:"
);
} else if (currentValue == "Count") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.CountF - partialrotation,
"Count in:"
);
} else if (currentValue == "Baron") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.BaronF - partialrotation,
"Baron in:"
);
}
toxicSpill.append($(".toxicSpill" + currentValue).detach());
});
} else if (
partialrotation >= keyTimes.ADuke &&
partialrotation < keyTimes.ADukeF
) {
//Archduke Rising
$(".toxicSpillHeaderValue").text("AD-RISING");
$(".toxicSpillHeaderValue").css({
color: "red",
});
const subArray = getGenericSublocation("tsADuke");
subArray.forEach(function (currentValue) {
if (currentValue == "GrandDuke") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.GDukeF - partialrotation,
"GDuke Falling in:"
);
if (
genericReminderCheck(
timeNext,
remindersObject.spill,
"gduke",
remindInterval
)
) {
myConfirm("spill", "grand duke");
if (propsObject.killSwitch == "Y") {
$("#toxicSpillCb").click();
}
}
} else if (currentValue == "Duke") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.DukeF - partialrotation,
"Duke in:"
);
} else if (currentValue == "Count") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.CountF - partialrotation,
"Count in:"
);
} else if (currentValue == "Baron") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.BaronF - partialrotation,
"Baron in:"
);
} else if (currentValue == "Lord") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.LordF - partialrotation,
"Lord in:"
);
}
toxicSpill.append($(".toxicSpill" + currentValue).detach());
});
} else if (
partialrotation >= keyTimes.ADukeF &&
partialrotation < keyTimes.GDukeF
) {
//Archduke Falling
$(".toxicSpillHeaderValue").text("AD-FALLING");
$(".toxicSpillHeaderValue").css({
color: "green",
});
const subArray = getGenericSublocation("tsADuke");
subArray.forEach(function (currentValue) {
if (currentValue == "GrandDuke") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.GDukeF - partialrotation,
"GDuke Falling in:"
);
if (
genericReminderCheck(
timeNext,
remindersObject.spill,
"gduke",
remindInterval
)
) {
myConfirm("spill", "grand duke");
if (propsObject.killSwitch == "Y") {
$("#toxicSpillCb").click();
}
}
} else if (currentValue == "Duke") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.DukeF - partialrotation,
"Duke in:"
);
} else if (currentValue == "Count") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.CountF - partialrotation,
"Count in:"
);
} else if (currentValue == "Baron") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.BaronF - partialrotation,
"Baron in:"
);
} else if (currentValue == "Lord") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.LordF - partialrotation,
"Lord in:"
);
}
toxicSpill.append($(".toxicSpill" + currentValue).detach());
});
} else if (
partialrotation >= keyTimes.GDukeF &&
partialrotation < keyTimes.DukeF
) {
//Grand Duke Falling
$(".toxicSpillHeaderValue").text("GD-FALLING");
$(".toxicSpillHeaderValue").css({
color: "green",
});
const subArray = getGenericSublocation("tsGDukeF");
subArray.forEach(function (currentValue) {
if (currentValue == "Duke") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.DukeF - partialrotation,
"Duke in:"
);
if (
genericReminderCheck(
timeNext,
remindersObject.spill,
"duke",
remindInterval
)
) {
myConfirm("spill", "duke");
if (propsObject.killSwitch == "Y") {
$("#toxicSpillCb").click();
}
}
} else if (currentValue == "Count") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.CountF - partialrotation,
"Count in:"
);
} else if (currentValue == "Baron") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.BaronF - partialrotation,
"Baron in:"
);
} else if (currentValue == "Lord") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.LordF - partialrotation,
"Lord in:"
);
} else if (currentValue == "Knight") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.KnightF - partialrotation,
"Knight in:"
);
}
toxicSpill.append($(".toxicSpill" + currentValue).detach());
});
} else if (
partialrotation >= keyTimes.DukeF &&
partialrotation < keyTimes.CountF
) {
//Duke Falling
$(".toxicSpillHeaderValue").text("DUKE-FALLING");
$(".toxicSpillHeaderValue").css({
color: "green",
});
const subArray = getGenericSublocation("tsDukeF");
subArray.forEach(function (currentValue) {
if (currentValue == "Count") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.CountF - partialrotation,
"Count in:"
);
if (
genericReminderCheck(
timeNext,
remindersObject.spill,
"count",
remindInterval
)
) {
myConfirm("spill", "count");
if (propsObject.killSwitch == "Y") {
$("#toxicSpillCb").click();
}
}
} else if (currentValue == "Baron") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.BaronF - partialrotation,
"Baron in:"
);
} else if (currentValue == "Lord") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.LordF - partialrotation,
"Lord in:"
);
} else if (currentValue == "Knight") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.KnightF - partialrotation,
"Knight in:"
);
} else if (currentValue == "Hero") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.HeroF - partialrotation,
"Hero in:"
);
}
toxicSpill.append($(".toxicSpill" + currentValue).detach());
});
} else if (
partialrotation >= keyTimes.CountF &&
partialrotation < keyTimes.BaronF
) {
//Count Falling
$(".toxicSpillHeaderValue").text("COUNT-FALLING");
$(".toxicSpillHeaderValue").css({
color: "green",
});
const subArray = getGenericSublocation("tsCountF");
subArray.forEach(function (currentValue) {
if (currentValue == "Baron") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.BaronF - partialrotation,
"Baron in:"
);
if (
genericReminderCheck(
timeNext,
remindersObject.spill,
"baron",
remindInterval
)
) {
myConfirm("spill", "baron");
if (propsObject.killSwitch == "Y") {
$("#toxicSpillCb").click();
}
}
} else if (currentValue == "Lord") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.LordF - partialrotation,
"Lord in:"
);
} else if (currentValue == "Knight") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.KnightF - partialrotation,
"Knight in:"
);
} else if (currentValue == "Hero") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.HeroF - partialrotation,
"Hero in:"
);
} else if (currentValue == "Count") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
rotaionLenght - partialrotation + keyTimes.Count,
"Count Rising in:"
);
}
toxicSpill.append($(".toxicSpill" + currentValue).detach());
});
} else if (
partialrotation >= keyTimes.BaronF &&
partialrotation < keyTimes.LordF
) {
//Baron Falling
$(".toxicSpillHeaderValue").text("BARON-FALLING");
$(".toxicSpillHeaderValue").css({
color: "green",
});
const subArray = getGenericSublocation("tsBaronF");
subArray.forEach(function (currentValue) {
if (currentValue == "Lord") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.LordF - partialrotation,
"Lord in:"
);
if (
genericReminderCheck(
timeNext,
remindersObject.spill,
"lord",
remindInterval
)
) {
myConfirm("spill", "lord");
if (propsObject.killSwitch == "Y") {
$("#toxicSpillCb").click();
}
}
} else if (currentValue == "Knight") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.KnightF - partialrotation,
"Knight in:"
);
} else if (currentValue == "Hero") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.HeroF - partialrotation,
"Hero in:"
);
} else if (currentValue == "Baron") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
rotaionLenght - partialrotation + keyTimes.Baron,
"Baron Rising in:"
);
} else if (currentValue == "Count") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
rotaionLenght - partialrotation + keyTimes.Count,
"Count in:"
);
}
toxicSpill.append($(".toxicSpill" + currentValue).detach());
});
} else if (
partialrotation >= keyTimes.LordF &&
partialrotation < keyTimes.KnightF
) {
//Lord Falling
$(".toxicSpillHeaderValue").text("LORD-FALLING");
$(".toxicSpillHeaderValue").css({
color: "green",
});
const subArray = getGenericSublocation("tsLordF");
subArray.forEach(function (currentValue) {
if (currentValue == "Knight") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.KnightF - partialrotation,
"Knight in:"
);
if (
genericReminderCheck(
timeNext,
remindersObject.spill,
"knight",
remindInterval
)
) {
myConfirm("spill", "knight");
if (propsObject.killSwitch == "Y") {
$("#toxicSpillCb").click();
}
}
} else if (currentValue == "Hero") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.HeroF - partialrotation,
"Hero in:"
);
} else if (currentValue == "Lord") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
rotaionLenght - partialrotation + keyTimes.Lord,
"Lord Rising in:"
);
} else if (currentValue == "Baron") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
rotaionLenght - partialrotation + keyTimes.Baron,
"Baron in:"
);
} else if (currentValue == "Count") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
rotaionLenght - partialrotation + keyTimes.Count,
"Count in:"
);
}
toxicSpill.append($(".toxicSpill" + currentValue).detach());
});
} else if (
partialrotation >= keyTimes.KnightF &&
partialrotation < keyTimes.HeroF
) {
//Knight Falling
$(".toxicSpillHeaderValue").text("KNIGHT-FALLING");
$(".toxicSpillHeaderValue").css({
color: "green",
});
const subArray = getGenericSublocation("tsKnightF");
subArray.forEach(function (currentValue) {
if (currentValue == "Hero") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
keyTimes.HeroF - partialrotation,
"Hero in:"
);
if (
genericReminderCheck(
timeNext,
remindersObject.spill,
"hero",
remindInterval
)
) {
myConfirm("spill", "hero");
if (propsObject.killSwitch == "Y") {
$("#toxicSpillCb").click();
}
}
} else if (currentValue == "Knight") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
rotaionLenght - partialrotation + keyTimes.Knight,
"Knight Rising in:"
);
} else if (currentValue == "Lord") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
rotaionLenght - partialrotation + keyTimes.Lord,
"Lord in:"
);
} else if (currentValue == "Baron") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
rotaionLenght - partialrotation + keyTimes.Baron,
"Baron in:"
);
} else if (currentValue == "Count") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
rotaionLenght - partialrotation + keyTimes.Count,
"Count in:"
);
}
toxicSpill.append($(".toxicSpill" + currentValue).detach());
});
} else if (
partialrotation >= keyTimes.HeroF &&
partialrotation < keyTimes.Hero
) {
//Hero Falling
$(".toxicSpillHeaderValue").text("HERO-FALLING");
$(".toxicSpillHeaderValue").css({
color: "green",
});
const subArray = getGenericSublocation("tsHeroF");
subArray.forEach(function (currentValue) {
if (currentValue == "Knight") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
rotaionLenght - partialrotation + keyTimes.Knight,
"Knight Rising in:"
);
if (
genericReminderCheck(
timeNext,
remindersObject.spill,
"knight",
remindInterval
)
) {
myConfirm("spill", "knight");
if (propsObject.killSwitch == "Y") {
$("#toxicSpillCb").click();
}
}
} else if (currentValue == "Lord") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
rotaionLenght - partialrotation + keyTimes.Lord,
"Lord in:"
);
} else if (currentValue == "Baron") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
rotaionLenght - partialrotation + keyTimes.Baron,
"Baron in:"
);
} else if (currentValue == "Count") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
rotaionLenght - partialrotation + keyTimes.Count,
"Count in:"
);
} else if (currentValue == "Duke") {
timeNext = genericTimerUpdate(
".toxicSpill",
currentValue,
rotaionLenght - partialrotation + keyTimes.Duke,
"Duke in:"
);
}
toxicSpill.append($(".toxicSpill" + currentValue).detach());
});
}
debugLog("TS Updated");
}
$(".toxicSpill").on("change", ":input", function () {
if (this.checked) {
this.checked = "Yes";
} else {
this.checked = "";
}
tinkerCbClick("spill", this.name, this.checked);
});
//================================= Tinker Panel ====================================
//
function buildTinkerPanel() {
if ($(".tinkerPanel").length > 0) return;
const timerBox = $(".timerBox");
const tinkerPanel = document.createElement("div");
tinkerPanel.classList.add("tinkerPanel");
tinkerPanel.classList.add("hide");
$(tinkerPanel).css({
height: "95%",
width: "99%",
float: "left",
padding: 2 + "px",
background:
"linear-gradient(90deg, rgba(215,215,215,1) 2%, rgba(213,213,215,1) 71%, rgba(228,228,228,1) 100%)",
border: "1px solid black",
});
const remindersObject = getReminders();
const propsObject = getTimerProps();
//FG Options
const forbiddenGroveOptions = genericOptionsHeaderBuild(
"forbiddenGroveOptions",
"Forbidden Grove",
{
float: "left",
width: "14%",
padding: "2px",
}
);
genericOptionsBuild(
$(forbiddenGroveOptions),
"Open",
"forbiddenGroveOpenCb",
"Open",
remindersObject.grove.flags.open
);
genericOptionsBuild(
$(forbiddenGroveOptions),
"Closed",
"forbiddenGroveCloseCb",
"Closed",
remindersObject.grove.flags.closed
);
//BC Options
const balacksCoveOptions = genericOptionsHeaderBuild(
"balacksCoveOptions",
"Balack's Cove",
{
float: "left",
width: "14%",
padding: "2px",
}
);
genericOptionsBuild(
$(balacksCoveOptions),
"Low",
"balacksCoveLowCb",
"Low",
remindersObject.cove.flags.low
);
genericOptionsBuild(
$(balacksCoveOptions),
"Mid",
"balacksCoveMidCb",
"Mid",
remindersObject.cove.flags.mid
);
genericOptionsBuild(
$(balacksCoveOptions),
"High",
"balacksCoveHighCb",
"High",
remindersObject.cove.flags.high
);
//SG Options
const seasonalGardenOptions = genericOptionsHeaderBuild(
"seasonalGardenOptions",
"Seasonal Garden",
{
float: "left",
width: "15%",
padding: "2px",
}
);
genericOptionsBuild(
$(seasonalGardenOptions),
"Fall",
"seasonalGardenFallCb",
"Fall",
remindersObject.garden.flags.Fall
);
genericOptionsBuild(
$(seasonalGardenOptions),
"Winter",
"seasonalGardenWinterCb",
"Winter",
remindersObject.garden.flags.Winter
);
genericOptionsBuild(
$(seasonalGardenOptions),
"Spring",
"seasonalGardenSpringCb",
"Spring",
remindersObject.garden.flags.Spring
);
genericOptionsBuild(
$(seasonalGardenOptions),
"Summer",
"seasonalGardenSummerCb",
"Summer",
remindersObject.garden.flags.Summer
);
//TS Options
const toxicSpillOptions = genericOptionsHeaderBuild(
"toxicSpillOptions",
"Toxic Spill",
{
float: "left",
width: "20%",
padding: "2px",
}
);
const toxicSpillOptionsFlex = document.createElement("div");
toxicSpillOptionsFlex.classList.add("toxicSpillOptionsFlex");
$(toxicSpillOptionsFlex).css({
display: "flex",
width: "100%",
height: "100%",
});
const toxicSpillOptionsL = document.createElement("div");
toxicSpillOptionsL.classList.add("toxicSpillOptionsL");
$(toxicSpillOptionsL).css({
width: "50%",
});
const toxicSpillOptionsR = document.createElement("div");
toxicSpillOptionsR.classList.add("toxicSpillOptionsR");
$(toxicSpillOptionsR).css({
width: "50%",
});
toxicSpillOptionsFlex.appendChild(toxicSpillOptionsL);
toxicSpillOptionsFlex.appendChild(toxicSpillOptionsR);
toxicSpillOptions.appendChild(toxicSpillOptionsFlex);
genericOptionsBuild(
$(toxicSpillOptionsL),
"Hero",
"toxicSpillHeroCb",
"Hero",
remindersObject.spill.flags.hero
);
genericOptionsBuild(
$(toxicSpillOptionsL),
"Knight",
"toxicSpillKnightCb",
"Knight",
remindersObject.spill.flags.knight
);
genericOptionsBuild(
$(toxicSpillOptionsL),
"Lord",
"toxicSpillLordCb",
"Lord",
remindersObject.spill.flags.lord
);
genericOptionsBuild(
$(toxicSpillOptionsL),
"Baron",
"toxicSpillBaronCb",
"Baron",
remindersObject.spill.flags.baron
);
genericOptionsBuild(
$(toxicSpillOptionsR),
"Count",
"toxicSpillCountCb",
"Count",
remindersObject.spill.flags.count
);
genericOptionsBuild(
$(toxicSpillOptionsR),
"GDuke",
"toxicSpillDukeCb",
"GDuke",
remindersObject.spill.flags.duke
);
genericOptionsBuild(
$(toxicSpillOptionsR),
"GDuke",
"toxicSpillGrandDukeCb",
"GDuke",
remindersObject.spill.flags.gduke
);
genericOptionsBuild(
$(toxicSpillOptionsR),
"ADuke",
"toxicSpillArchdukeCb",
"ADuke",
remindersObject.spill.flags.aduke
);
//Timer Options
const timerOptions = genericOptionsHeaderBuild(
"timerOptions",
"Timer Options",
{
float: "left",
display: "flex",
"flex-direction": "column",
width: "33%",
height: "100%",
padding: "2px",
}
);
const timerOptionsUpdateFlex = document.createElement("div");
timerOptionsUpdateFlex.classList.add("timerOptionsUpdateFlex");
$(timerOptionsUpdateFlex).css({
display: "flex",
width: "100%",
height: "17%",
});
genericRadioBuild(
$(timerOptionsUpdateFlex),
"OptionsUpdate",
"updateInterval",
"Update Interval (min)",
["5", "10", "15"],
propsObject.updateInterval,
"How often the timers update."
);
const timerOptionsWindowFlex = document.createElement("div");
timerOptionsWindowFlex.classList.add("timerOptionsWindoweFlex");
$(timerOptionsWindowFlex).css({
display: "flex",
width: "100%",
height: "17%",
});
genericRadioBuild(
$(timerOptionsWindowFlex),
"OptionsWindow",
"remindInterval",
"Remind Me Within (min)",
["5", "10", "15"],
propsObject.remindInterval,
"How far ahead of time reminder do you want to be notified?"
);
timerOptions.appendChild(timerOptionsUpdateFlex);
timerOptions.appendChild(timerOptionsWindowFlex);
//Other Options
genericOptionsBuild(
$(timerOptions),
"killSwitch",
"killSwitchCb",
"Remind Me Only Once",
propsObject.killSwitch,
{
float: "left",
width: "110px",
padding: "1px",
},
{
float: "left",
height: "16%",
width: "100%",
},
"Stop reminders after the first to keep sanity in check."
);
genericOptionsBuild(
$(timerOptions),
"disarm",
"disarmCb",
"Disarm Bait After Travel",
propsObject.disarmAfterTravel,
{
float: "left",
width: "125x",
padding: "1px",
},
{
float: "left",
height: "16%",
width: "100%",
},
"Disarm bait after travel to save presious cheese from disaster."
);
//Panic Button
const panicButton = document.createElement("button");
$(panicButton).addClass("mousehuntActionButton small");
panicButton.id = "panicButton";
const reverseTravelText = document.createElement("span");
$(reverseTravelText).addClass("reverseTravelText").text("Return Trip").css({
"font-size": "12px",
});
$(panicButton).append(reverseTravelText);
$(panicButton).attr("title", "Click to go back to previous location");
timerOptions.appendChild(panicButton);
$(panicButton).css({
width: "100px",
float: "left",
});
//tinker button
const tinkerButton = document.createElement("div");
tinkerButton.classList.add("tinkerButton");
$(tinkerButton).attr("title", "Close the tinker menu");
$(tinkerButton).css({
width: "30px",
padding: 3 + "px",
color: "rgb(4, 44, 202)",
marginLeft: "200px",
cursor: "pointer",
});
timerOptions.appendChild(tinkerButton);
//
tinkerPanel.appendChild(forbiddenGroveOptions);
tinkerPanel.appendChild(balacksCoveOptions);
tinkerPanel.appendChild(seasonalGardenOptions);
tinkerPanel.appendChild(toxicSpillOptions);
tinkerPanel.appendChild(timerOptions);
//Last
timerBox.prepend(tinkerPanel);
}
$(document).on("click", ".tinkerButton", function () {
const fg = $(".forbiddenGrove");
const bc = $(".balacksCove");
const sg = $(".seasonalGarden");
const ts = $(".toxicSpill");
const tp = $(".tinkerPanel");
if (fg.hasClass("hide")) {
//show
fg.removeClass("hide");
bc.removeClass("hide");
sg.removeClass("hide");
ts.removeClass("hide");
tp.addClass("hide");
$(".tinkerButton").text("Tinker");
} else {
//hide
fg.addClass("hide");
bc.addClass("hide");
sg.addClass("hide");
ts.addClass("hide");
tp.removeClass("hide");
$(".tinkerButton").text("Close");
}
});
$(".tinkerPanel").on("change", ":input", function () {
if (this.type == "radio") {
tinkerRadioClick(this);
return false;
}
if (this.checked) {
this.checked = "Yes";
} else {
this.checked = "";
}
const name = this.name;
let location = "";
if (name.includes("forbiddenGrove")) {
location = "grove";
} else if (name.includes("balacksCove")) {
location = "cove";
} else if (name.includes("seasonalGarden")) {
location = "garden";
} else if (name.includes("toxicSpill")) {
location = "spill";
} else {
location = "options";
}
tinkerCbClick(location, this.name, this.checked);
});
function tinkerRadioClick(thisRadio) {
const parent = $(thisRadio).parent();
const siblings = $(parent).find("input");
$(siblings).each(function () {
if (thisRadio.value == this.value) {
updateProps(parent.attr("class"), thisRadio.value);
this.checked = true;
} else {
this.checked = false;
}
});
}
function tinkerCbClick(location, cb, checked) {
const remindersObject = getReminders()[location];
if (cb == "forbiddenGroveCb" && checked == true) {
remindersObject.master = "Y";
} else if (cb == "forbiddenGroveCb" && checked == false) {
remindersObject.master = "N";
} else if (cb == "forbiddenGroveOpenCb" && checked == true) {
remindersObject.flags.open = "Y";
} else if (cb == "forbiddenGroveOpenCb" && checked == false) {
remindersObject.flags.open = "N";
} else if (cb == "forbiddenGroveCloseCb" && checked == true) {
remindersObject.flags.closed = "Y";
} else if (cb == "forbiddenGroveCloseCb" && checked == false) {
remindersObject.flags.closed = "N";
//BC
} else if (cb == "balacksCoveCb" && checked == true) {
remindersObject.master = "Y";
} else if (cb == "balacksCoveCb" && checked == false) {
remindersObject.master = "N";
} else if (cb == "balacksCoveLowCb" && checked == true) {
remindersObject.flags.low = "Y";
} else if (cb == "balacksCoveLowCb" && checked == false) {
remindersObject.flags.low = "N";
} else if (cb == "balacksCoveMidCb" && checked == true) {
remindersObject.flags.mid = "Y";
} else if (cb == "balacksCoveMidCb" && checked == false) {
remindersObject.flags.mid = "N";
} else if (cb == "balacksCoveHighCb" && checked == true) {
remindersObject.flags.high = "Y";
} else if (cb == "balacksCoveHighCb" && checked == false) {
remindersObject.flags.high = "N";
//SG
} else if (cb == "seasonalGardenCb" && checked == true) {
remindersObject.master = "Y";
} else if (cb == "seasonalGardenCb" && checked == false) {
remindersObject.master = "N";
} else if (cb == "seasonalGardenFallCb" && checked == true) {
remindersObject.flags.fall = "Y";
} else if (cb == "seasonalGardenFallCb" && checked == false) {
remindersObject.flags.fall = "N";
} else if (cb == "seasonalGardenWinterCb" && checked == true) {
remindersObject.flags.winter = "Y";
} else if (cb == "seasonalGardenWinterCb" && checked == false) {
remindersObject.flags.winter = "N";
} else if (cb == "seasonalGardenSpringCb" && checked == true) {
remindersObject.flags.spring = "Y";
} else if (cb == "seasonalGardenSpringCb" && checked == false) {
remindersObject.flags.spring = "N";
} else if (cb == "seasonalGardenSummerCb" && checked == true) {
remindersObject.flags.summer = "Y";
} else if (cb == "seasonalGardenSummerCb" && checked == false) {
remindersObject.flags.summer = "N";
//TS
} else if (cb == "toxicSpillCb" && checked == true) {
remindersObject.master = "Y";
} else if (cb == "toxicSpillCb" && checked == false) {
remindersObject.master = "N";
} else if (cb == "toxicSpillHeroCb" && checked == true) {
remindersObject.flags.hero = "Y";
} else if (cb == "toxicSpillHeroCb" && checked == false) {
remindersObject.flags.hero = "N";
} else if (cb == "toxicSpillKnightCb" && checked == true) {
remindersObject.flags.knight = "Y";
} else if (cb == "toxicSpillKnightCb" && checked == false) {
remindersObject.flags.knight = "N";
} else if (cb == "toxicSpillLordCb" && checked == true) {
remindersObject.flags.lord = "Y";
} else if (cb == "toxicSpillLordCb" && checked == false) {
remindersObject.flags.lord = "N";
} else if (cb == "toxicSpillBaronCb" && checked == true) {
remindersObject.flags.baron = "Y";
} else if (cb == "toxicSpillBaronCb" && checked == false) {
remindersObject.flags.baron = "N";
} else if (cb == "toxicSpillCountCb" && checked == true) {
remindersObject.flags.count = "Y";
} else if (cb == "toxicSpillCountCb" && checked == false) {
remindersObject.flags.count = "N";
} else if (cb == "toxicSpillDukeCb" && checked == true) {
remindersObject.flags.duke = "Y";
} else if (cb == "toxicSpillDukeCb" && checked == false) {
remindersObject.flags.duke = "N";
} else if (cb == "toxicSpillGrandDukeCb" && checked == true) {
remindersObject.flags.gduke = "Y";
} else if (cb == "toxicSpillGrandDukeCb" && checked == false) {
remindersObject.flags.gduke = "N";
} else if (cb == "toxicSpillArchdukeCb" && checked == true) {
remindersObject.flags.aduke = "Y";
} else if (cb == "toxicSpillArchdukeCb" && checked == false) {
remindersObject.flags.aduke = "N";
} else if (cb == "killSwitchCb" && checked == true) {
updateProps("killSwitch", "Y");
} else if (cb == "killSwitchCb" && checked == false) {
updateProps("killSwitch", "N");
} else if (cb == "disarmCb" && checked == true) {
updateProps("disarmAfterTravel", "Y");
} else if (cb == "disarmCb" && checked == false) {
updateProps("disarmAfterTravel", "N");
}
debugLog([location, cb, checked]);
updateReminders(location, remindersObject);
}
//===================================== Utilities ======================================
function debugLog(message) {
const debug = localStorage.getItem("ws.debug");
if (debug == true) {
console.log(message);
}
}
function todayNow() {
const today = new Date();
const todayEpoch = today.getTime() / 1000.0;
return todayEpoch;
}
function convertToDyHrMn(days, hours, minutes) {
if (minutes == 60) {
hours++;
minutes = 0;
}
if (hours >= 24) {
const daysExact = hours / 24;
const daysTrunc = Math.floor(daysExact);
const partialDays = daysExact - daysTrunc;
hours = Math.round(partialDays * 24);
days = daysTrunc + days;
}
return {
days,
hours,
minutes,
};
}
function formatOutput(days, hours, minutes) {
let dayStr = "";
let hourStr = "";
let minuteStr = "";
if (days > 0) {
dayStr = days + "d";
}
if (hours > 0) {
hourStr = hours + "h";
}
if (minutes > 0) {
minuteStr = minutes + "m";
}
return dayStr + " " + hourStr + " " + minuteStr;
}
//============================== Travel Functions ==============================================
//Forbidden Grove
$(document).on("click", "#forbiddenGroveButton", function () {
updateForbiddenGroveTimer();
if ($(".forbiddenGroveHeaderValue").text() == "CLOSED") {
myAlert("The Forbiddengrove is closed now, you cannot travel there");
} else {
myConfirm("grove", "button");
}
});
function travelToGrove() {
const disarm = getTimerProps().disarmAfterTravel;
if (
$("#hudLocationContent").hasClass("hudLocationContent forbidden_grove") ==
true
) {
//Do nothing you are already there
} else if ($(".forbiddenGroveHeaderValue").text() == "CLOSED") {
myAlert("The Forbiddengrove is closed now, you cannot travel there");
} else {
app.pages.TravelPage.travel("forbidden_grove");
if (disarm == "Y") {
hg.utils.TrapControl.disarmBait().go();
}
}
}
//Balack's Cove
$(document).on("click", "#balacksCoveButton", function () {
myConfirm("cove", "button");
});
function travelToCove() {
const disarm = getTimerProps().disarmAfterTravel;
if (
$("#hudLocationContent").hasClass("hudLocationContent balacks_cove") == true
) {
//Do nothing, you are already there
} else {
app.pages.TravelPage.travel("balacks_cove");
if (disarm == "Y") {
hg.utils.TrapControl.disarmBait().go();
}
}
}
//Seasonal Garden
$(document).on("click", "#seasonalGardenButton", function () {
myConfirm("garden", "button");
});
function travelToGarden() {
const disarm = getTimerProps().disarmAfterTravel;
if (
$("#hudLocationContent").hasClass("hudLocationContent seasonal_garden") ==
true
) {
//Do nothing, you are already there
} else {
app.pages.TravelPage.travel("seasonal_garden");
if (disarm == "Y") {
hg.utils.TrapControl.disarmBait().go();
}
}
}
//Toxic Spill
$(document).on("click", "#toxicSpillButton", function () {
myConfirm("spill", "button");
});
function travelToSpill() {
const disarm = getTimerProps().disarmAfterTravel;
if (
$("#hudLocationContent").hasClass(
"hudLocationContent pollution_outbreak"
) == true
) {
//Do nothing, you are already there
} else {
app.pages.TravelPage.travel("pollution_outbreak");
if (disarm == "Y") {
hg.utils.TrapControl.disarmBait().go();
}
}
}
//Travel Back
$(document).on("click", "#panicButton", function () {
const prevLoc = getTimerProps().prevLocation;
debugLog(["prevLoc", prevLoc]);
myConfirm("back", prevLoc);
});
function travelBack() {
const disarm = getTimerProps().disarmAfterTravel;
const origin = getTimerProps().prevLocation;
if ($("#hudLocationContent").hasClass(origin) == true) {
//Do nothing, you are already there
} else {
app.pages.TravelPage.travel(origin);
if (disarm == "Y") {
hg.utils.TrapControl.disarmBait().go();
}
}
}
//========== Modals ======================//
function myConfirm(location, sub) {
let messageText = "";
let icon = "";
let travelFunction = "";
let title = "";
if (location == "grove" && sub == "closing") {
icon = "fas fa-dungeon";
messageText = "The Forbidden Grove is closing soon, travel there now?";
travelFunction = travelToGrove;
title = "Timer Reminder";
} else if (location == "grove" && sub == "opening") {
icon = "fas fa-dungeon";
messageText = "The Forbidden Grove is opening soon, travel there now?";
travelFunction = travelToGrove;
title = "Timer Reminder";
} else if (location == "grove" && sub == "button") {
icon = "fas fa-dungeon";
messageText = "Travel to the Forbidden Grove now?";
travelFunction = travelToGrove;
title = "Quick Travel";
} else if (location == "cove" && sub == "low") {
icon = "fas fa-water";
messageText = "Balacks Cove will be low tide soon, travel there now?";
travelFunction = travelToCove;
title = "Timer Reminder";
} else if (location == "cove" && sub == "mid") {
icon = "fas fa-water";
messageText = "Balacks Cove will be mid tide soon, travel there now?";
travelFunction = travelToCove;
title = "Timer Reminder";
} else if (location == "cove" && sub == "high") {
icon = "fas fa-water";
messageText = "Balacks Cove will be high tide soon, travel there now?";
travelFunction = travelToCove;
title = "Timer Reminder";
} else if (location == "cove" && sub == "button") {
icon = "fas fa-water";
messageText = "Travel to Balacks Cove now?";
travelFunction = travelToCove;
title = "Quick Travel";
} else if (location == "garden" && sub == "fall") {
icon = "fab fa-canadian-maple-leaf";
messageText = "The Seasonal Garden will be fall soon, travel there now?";
travelFunction = travelToGarden;
title = "Timer Reminder";
} else if (location == "garden" && sub == "winter") {
icon = "fas fa-icicles";
messageText = "The Seasonal Garden will be winter soon, travel there now?";
travelFunction = travelToGarden;
title = "Timer Reminder";
} else if (location == "garden" && sub == "spring") {
icon = "fas fa-seedling";
messageText = "The Seasonal Garden will be spring soon, travel there now?";
travelFunction = travelToGarden;
title = "Timer Reminder";
} else if (location == "garden" && sub == "summer") {
icon = "fas fa-sun";
messageText = "The Seasonal Garden will be summer soon, travel there now?";
travelFunction = travelToGarden;
title = "Timer Reminder";
} else if (location == "garden" && sub == "button") {
const season = $(".seasonalGardenHeaderValue").text();
if (season == "FALL") {
icon = "fab fa-canadian-maple-leaf";
} else if (season == "WINTER") {
icon = "fas fa-icicles";
} else if (season == "SPRING") {
icon = "fas fa-icicles";
} else {
icon = "fas fa-sun";
}
messageText = "Travel to the Seasonal Garden now?";
travelFunction = travelToGarden;
title = "Quick Travel";
} else if (location == "spill" && sub == "hero") {
icon = "fas fa-biohazard";
messageText =
"The Toxic Spill will be " + sub + " rank soon, travel there now?";
travelFunction = travelToSpill;
title = "Timer Reminder";
} else if (location == "spill" && sub == "knight") {
icon = "fas fa-biohazard";
messageText =
"The Toxic Spill will be " + sub + " rank soon, travel there now?";
travelFunction = travelToSpill;
title = "Timer Reminder";
} else if (location == "spill" && sub == "lord") {
icon = "fas fa-biohazard";
messageText =
"The Toxic Spill will be " + sub + " rank soon, travel there now?";
travelFunction = travelToSpill;
title = "Timer Reminder";
} else if (location == "spill" && sub == "baron") {
icon = "fas fa-biohazard";
messageText =
"The Toxic Spill will be " + sub + " rank soon, travel there now?";
travelFunction = travelToSpill;
title = "Timer Reminder";
} else if (location == "spill" && sub == "count") {
icon = "fas fa-biohazard";
messageText =
"The Toxic Spill will be " + sub + " rank soon, travel there now?";
travelFunction = travelToSpill;
title = "Timer Reminder";
} else if (location == "spill" && sub == "duke") {
icon = "fas fa-biohazard";
messageText =
"The Toxic Spill will be " + sub + " rank soon, travel there now?";
travelFunction = travelToSpill;
title = "Timer Reminder";
} else if (location == "spill" && sub == "grand duke") {
icon = "fas fa-biohazard";
messageText =
"The Toxic Spill will be " + sub + " rank soon, travel there now?";
travelFunction = travelToSpill;
title = "Timer Reminder";
} else if (location == "spill" && sub == "archduke") {
icon = "fas fa-biohazard";
messageText =
"The Toxic Spill will be " + sub + " rank soon, travel there now?";
travelFunction = travelToSpill;
title = "Timer Reminder";
} else if (location == "spill" && sub == "button") {
icon = "fas fa-biohazard";
messageText = "Travel to the Toxic Spill now?";
travelFunction = travelToSpill;
title = "Quick Travel";
} else if (location == "back") {
icon = "fas fa-history";
messageText = "Travel to the back to the " + sub + " now?";
travelFunction = travelBack;
title = "Quick Travel";
}
//
$.confirm({
autoClose: "cancel|120000",
title: title,
content: messageText,
icon: icon,
type: "dark",
typeAnimated: true,
boxWidth: "30%",
useBootstrap: false,
draggable: true,
escapeKey: "cancel",
buttons: {
confirm: {
text: "Yes",
keys: ["enter", "space"],
btnClass: "btn-green",
action: function () {
travelFunction("skip");
},
},
cancel: {
text: "No",
btnClass: "btn-red",
action: function () {},
},
},
});
}
function myAlert(messageText) {
const icon = "fas fa-exclamation-circle";
const title = "Attention!";
$.alert({
autoClose: "acknowledge|60000",
title: title,
content: messageText,
icon: icon,
type: "dark",
typeAnimated: true,
boxWidth: "30%",
useBootstrap: false,
draggable: true,
escapeKey: "aknowledge",
buttons: {
acknowledge: {
text: "Ok",
keys: ["enter", "space"],
btnClass: "btn-blue",
action: function () {},
},
},
});
}