You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
534 lines
17 KiB
JavaScript
534 lines
17 KiB
JavaScript
/*
|
|
* TerranQuest - Augmented Reality fantasy game
|
|
*
|
|
* Copyright 2016 Netsyms Technologies
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
// Important Globals
|
|
username = "";
|
|
password = "";
|
|
energy = 100;
|
|
maxenergy = 100;
|
|
level = 1;
|
|
userteamid = 0;
|
|
MUNZEE_CLIENT_ID = '616cecc70e17f4a3cb64146dce2d33f5';
|
|
MUNZEE_REDIRECT = 'http://gs.terranquest.net/munzee.php';
|
|
CODE_SCAN_COOLDOWN_SECONDS = 15; // Also change in CSS (.cooldown-fade-anim)
|
|
|
|
USER_LANGUAGE = "en-US";
|
|
|
|
currentscreen = "";
|
|
/*
|
|
* Runs when the app opens
|
|
*/
|
|
$(document).ready(function () {
|
|
document.addEventListener('deviceready', onDeviceReady, false);
|
|
});
|
|
|
|
function onDeviceReady() {
|
|
openscreen("login");
|
|
if (navigator.network.connection.type === Connection.NONE) {
|
|
navigator.notification.alert("You need an Internet connection to continue.", function () {
|
|
navigator.app.exitApp();
|
|
}, "No network", 'OK');
|
|
clientProblemsDialog("You need an Internet connection to continue.");
|
|
return;
|
|
}
|
|
$.getJSON(mkApiUrl("minclientversion"), function (data) {
|
|
if (data.status == "OK") {
|
|
if (compareVersions(window.cordova.plugins.version.getAppVersion(), data.version) < 0) {
|
|
navigator.notification.alert("Your game client is too old. You must update the app before playing.", function () {
|
|
navigator.app.exitApp();
|
|
}, "Outdated app", 'OK');
|
|
clientProblemsDialog("Your game client is too old. You must update the app before playing.");
|
|
}
|
|
}
|
|
});
|
|
setLocale();
|
|
}
|
|
|
|
function setLocale() {
|
|
navigator.globalization.getPreferredLanguage(
|
|
function (language) {
|
|
USER_LANGUAGE = language.value;
|
|
},
|
|
function () {}
|
|
);
|
|
}
|
|
|
|
// Depending on the device, a few examples are:
|
|
// - "Android"
|
|
// - "BlackBerry"
|
|
// - "iOS"
|
|
// - "webOS"
|
|
// - "WinCE"
|
|
// - "Tizen"
|
|
|
|
var DEVICE_ANDROID = 0;
|
|
var DEVICE_GOOGLEPLAY = 1;
|
|
var DEVICE_IOS = 2;
|
|
var DEVICE_WEB = 3;
|
|
var DEVICE_WINDOWS_PHONE = 5;
|
|
var DEVICE_WINDOWS = 6;
|
|
var DEVICE_OTHER = 10;
|
|
|
|
function getPlatform() {
|
|
var devicePlatform = device.platform;
|
|
switch (devicePlatform) {
|
|
case 'Android':
|
|
return DEVICE_ANDROID;
|
|
case 'iOS':
|
|
return DEVICE_IOS;
|
|
case 'WinCE':
|
|
return DEVICE_WINDOWS_PHONE;
|
|
case 'Win32NT':
|
|
return DEVICE_WINDOWS_PHONE;
|
|
case 'Windows':
|
|
return DEVICE_WINDOWS;
|
|
case 'browser':
|
|
return DEVICE_WEB;
|
|
default:
|
|
return DEVICE_OTHER;
|
|
}
|
|
}
|
|
|
|
function getDeviceVersion() {
|
|
return device.version;
|
|
}
|
|
|
|
/**
|
|
* Compare two version strings.
|
|
* http://stackoverflow.com/a/16187766/2534036
|
|
* @param {string} a
|
|
* @param {string} b
|
|
* @returns a number < 0 if a < b, a number > 0 if a > b, 0 if a = b
|
|
*/
|
|
function compareVersions(a, b) {
|
|
var i, diff;
|
|
var regExStrip0 = /(\.0+)+$/;
|
|
var segmentsA = a.replace(regExStrip0, '').split('.');
|
|
var segmentsB = b.replace(regExStrip0, '').split('.');
|
|
var l = Math.min(segmentsA.length, segmentsB.length);
|
|
|
|
for (i = 0; i < l; i++) {
|
|
diff = parseInt(segmentsA[i], 10) - parseInt(segmentsB[i], 10);
|
|
if (diff) {
|
|
return diff;
|
|
}
|
|
}
|
|
return segmentsA.length - segmentsB.length;
|
|
}
|
|
|
|
function mkApiUrl(action, server) {
|
|
if (server === 'cs') {
|
|
var chatserverurl = "http://gs.terranquest.net/";
|
|
if (localStorage.getItem("chatserv") !== null && localStorage.getItem("chatserv") !== '') {
|
|
chatserverurl = localStorage.getItem("chatserv");
|
|
}
|
|
return chatserverurl + action + ".php";
|
|
} else {
|
|
var gameserverurl = "http://gs.terranquest.net/";
|
|
if (localStorage.getItem("gameserv") !== null && localStorage.getItem("gameserv") !== '') {
|
|
gameserverurl = localStorage.getItem("gameserv");
|
|
}
|
|
return gameserverurl + action + ".php";
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Update the status bar color depending on context.
|
|
* @returns {undefined}
|
|
*/
|
|
function updateStatusBarColor() {
|
|
if (currentscreen == 'munzeelink') {
|
|
StatusBar.backgroundColorByHexString("#009444");
|
|
return;
|
|
}
|
|
if (currentscreen == 'login') {
|
|
if ($('#loading').css('display') == 'none') {
|
|
StatusBar.backgroundColorByHexString("#060606");
|
|
} else {
|
|
StatusBar.backgroundColorByHexString("#324150");
|
|
}
|
|
return;
|
|
}
|
|
if (currentscreen == 'chooseteam' || currentscreen == 'signup') {
|
|
StatusBar.backgroundColorByHexString("#060606");
|
|
return;
|
|
}
|
|
if (currentscreen == 'home') {
|
|
if ($('#loading').css('display') != 'none') {
|
|
StatusBar.backgroundColorByHexString("#324150");
|
|
} else {
|
|
if ($('#overlay-main').css('display') == 'block') {
|
|
StatusBar.backgroundColorByHexString("#060606");
|
|
} else {
|
|
StatusBar.backgroundColorByHexString("#008000");
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
StatusBar.backgroundColorByHexString("#324150");
|
|
}
|
|
|
|
/**
|
|
* Switches the app to the given screen.
|
|
* @param {String} screenname The name of the screen to show.
|
|
* @param {String} effect FADE, SLIDE, or nothing
|
|
* @returns {undefined}
|
|
*/
|
|
function openscreen(screenname, effect) {
|
|
if (effect === 'FADE') {
|
|
$('#content-zone').fadeOut('slow', function () {
|
|
$('#content-zone').load("screens/" + screenname + ".html", function () {
|
|
$('#content-zone').fadeIn('slow');
|
|
});
|
|
});
|
|
} else if (effect === 'SLIDE') {
|
|
$('#content-zone').slideToggle('400', function () {
|
|
$('#content-zone').load("screens/" + screenname + ".html", function () {
|
|
$('#content-zone').slideToggle('400');
|
|
});
|
|
});
|
|
} else {
|
|
$('#content-zone').load("screens/" + screenname + ".html");
|
|
}
|
|
currentscreen = screenname;
|
|
updateStatusBarColor();
|
|
}
|
|
|
|
/**
|
|
* Opens a modal dialog over the top of everything else.
|
|
* @param {String} filename screens/[filename].html
|
|
* @param {String} modalselector [#id-of-the-modal]
|
|
* @returns {undefined}
|
|
*/
|
|
function openmodal(filename, modalselector) {
|
|
$('#modal-load-box').load("screens/" + filename + ".html", null, function (x) {
|
|
$(modalselector).css('z-index', 9999999);
|
|
$(modalselector).modal('show');
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Close a modal (see openmodal)
|
|
* @param {String} modalselector
|
|
* @returns {undefined}
|
|
*/
|
|
function closemodal(modalselector) {
|
|
$(modalselector).modal(hide);
|
|
}
|
|
|
|
var scanCodeEnabled = true;
|
|
|
|
function startCooldown() {
|
|
scanCodeEnabled = false;
|
|
// don't do animation on old stuff
|
|
if (getPlatform() === DEVICE_ANDROID && compareVersions(getDeviceVersion(), "4.4") < 0) {
|
|
fallback_anim('#codescanbtn', 0, CODE_SCAN_COOLDOWN_SECONDS, 1000);
|
|
} else {
|
|
$('#codescanbtn').addClass('cooldown-fade-anim');
|
|
}
|
|
setTimeout(function () {
|
|
endCooldown();
|
|
}, CODE_SCAN_COOLDOWN_SECONDS * 1000);
|
|
}
|
|
|
|
function fallback_anim(selector, currstep, maxstep, interval) {
|
|
var cval = Math.round((currstep / maxstep) * 255);
|
|
$(selector).css('background-color', 'rgba(' + cval + ',' + cval + ',' + cval + ',.8)');
|
|
if (currstep < maxstep) {
|
|
setTimeout(function () {
|
|
fallback_anim(selector, currstep + 1, maxstep, interval);
|
|
}, intervalsecs);
|
|
}
|
|
}
|
|
|
|
function endCooldown() {
|
|
scanCodeEnabled = true;
|
|
$('#codescanbtn').removeClass('cooldown-fade-anim');
|
|
$('#codescanbtn').css('background-color', 'rgba(255,255,255,.8)');
|
|
}
|
|
|
|
function scanCode() {
|
|
// If code scanning disabled (cooldown, etc)
|
|
if (!scanCodeEnabled) {
|
|
return;
|
|
}
|
|
try {
|
|
cordova.plugins.barcodeScanner.scan(
|
|
function (result) {
|
|
if (!result.cancelled) {
|
|
startCooldown();
|
|
$.getJSON(mkApiUrl('code2item', 'gs'), {
|
|
code: result.text,
|
|
latitude: latitude,
|
|
longitude: longitude,
|
|
accuracy: gpsaccuracy
|
|
}, function (data) {
|
|
if (data.status === 'OK') {
|
|
if (data.messages.length >= 2) {
|
|
showFoundBox2(data.messages[0].title, data.messages[0].text, data.messages[1].title, data.messages[1].text);
|
|
} else {
|
|
showFoundBox(data.messages[0].title, data.messages[0].text);
|
|
}
|
|
} else {
|
|
endCooldown();
|
|
showFoundBox("Huh?", data.message);
|
|
}
|
|
}).fail(function () {
|
|
endCooldown();
|
|
showFoundBox("Huh?", "Nothing happened!");
|
|
//navigator.notification.alert("Nothing happened!", null, "Huh?", 'OK');
|
|
});
|
|
//navigator.notification.alert("Scanned code: " + result.text, null, "OK", 'Dismiss');
|
|
}
|
|
},
|
|
function (error) {
|
|
endCooldown();
|
|
navigator.notification.alert("Scanning failed: " + error, null, "Error", 'Dismiss');
|
|
},
|
|
{
|
|
"showFlipCameraButton": true,
|
|
"prompt": "Scan a barcode to discover an item!"
|
|
}
|
|
);
|
|
} catch (ex) {
|
|
scanCodeEnabled = true;
|
|
$('#codescanbtn').removeClass('cooldown-fade-anim');
|
|
navigator.notification.alert(ex.message, null, "Error", 'Dismiss');
|
|
}
|
|
}
|
|
|
|
function sortResults(array, prop, asc) {
|
|
array = array.sort(function (a, b) {
|
|
if (asc) {
|
|
return (a[prop] > b[prop]) ? 1 : ((a[prop] < b[prop]) ? -1 : 0);
|
|
} else {
|
|
return (b[prop] > a[prop]) ? 1 : ((b[prop] < a[prop]) ? -1 : 0);
|
|
}
|
|
});
|
|
return array;
|
|
}
|
|
|
|
//////////////////////////////////////////////
|
|
// Other things
|
|
//////////////////////////////////////////////
|
|
|
|
function closeMain() {
|
|
$('#overlay-main').slideDown(100, function () {
|
|
$('#overlay-main').css('display', 'none');
|
|
$('#main-content').html("");
|
|
updateStatusBarColor();
|
|
});
|
|
}
|
|
|
|
function getTeamInfoFromId(id) {
|
|
id = id + "";
|
|
var team_string = "None";
|
|
var team_color = "FFFFFF";
|
|
switch (id) {
|
|
case "1":
|
|
team_string = "Water";
|
|
team_color = "00BFFF";
|
|
break;
|
|
case "2":
|
|
team_string = "Fire";
|
|
team_color = "FF4000";
|
|
break;
|
|
case "3":
|
|
team_string = "Earth";
|
|
team_color = "D1A000";
|
|
break;
|
|
case "4":
|
|
team_string = "Wind";
|
|
team_color = "96FFFF";
|
|
break;
|
|
case "5":
|
|
team_string = "Light";
|
|
team_color = "FFFF96";
|
|
break;
|
|
case "6":
|
|
team_string = "Dark";
|
|
team_color = "ABABAB";
|
|
break;
|
|
default:
|
|
team_string = "None";
|
|
team_color = "FFFFFF";
|
|
break;
|
|
}
|
|
return {'name': team_string, 'color': team_color};
|
|
}
|
|
|
|
function getTeamNameFromId(id) {
|
|
return getTeamInfoFromId(id)['name'];
|
|
}
|
|
|
|
function getTeamColorFromId(id) {
|
|
return getTeamInfoFromId(id)['color'];
|
|
}
|
|
|
|
/**
|
|
* Get the actual path to the www folder. Includes trailing slash.
|
|
* http://stackoverflow.com/a/35782322/2534036
|
|
*/
|
|
function getWwwFolderPath() {
|
|
var path = window.location.pathname;
|
|
var sizefilename = path.length - (path.lastIndexOf("/") + 1);
|
|
path = path.substr(path, path.length - sizefilename);
|
|
return path;
|
|
}
|
|
;
|
|
|
|
// Handle back button to close things
|
|
document.addEventListener("backbutton", function (event) {
|
|
if (currentscreen == "munzeelink") {
|
|
openscreen("home");
|
|
}
|
|
if ($('#overlay-main').css('display') !== 'none') {
|
|
closeMain();
|
|
} else if ($('#chatmsgs').css('display') !== 'none') {
|
|
toggleChat();
|
|
}
|
|
}, false);
|
|
|
|
/*
|
|
* Konami-JS ~
|
|
* :: Now with support for touch events and multiple instances for
|
|
* :: those situations that call for multiple easter eggs!
|
|
* Code: https://github.com/snaptortoise/konami-js
|
|
* Examples: http://www.snaptortoise.com/konami-js
|
|
* Copyright (c) 2009 George Mandis (georgemandis.com, snaptortoise.com)
|
|
* Version: 1.4.6 (3/2/2016)
|
|
* Licensed under the MIT License (http://opensource.org/licenses/MIT)
|
|
* Tested in: Safari 4+, Google Chrome 4+, Firefox 3+, IE7+, Mobile Safari 2.2.1 and Dolphin Browser
|
|
*/
|
|
|
|
var Konami = function (callback) {
|
|
var konami = {
|
|
addEvent: function (obj, type, fn, ref_obj) {
|
|
if (obj.addEventListener)
|
|
obj.addEventListener(type, fn, false);
|
|
else if (obj.attachEvent) {
|
|
// IE
|
|
obj["e" + type + fn] = fn;
|
|
obj[type + fn] = function () {
|
|
obj["e" + type + fn](window.event, ref_obj);
|
|
}
|
|
obj.attachEvent("on" + type, obj[type + fn]);
|
|
}
|
|
},
|
|
input: "",
|
|
pattern: "38384040373937396665",
|
|
load: function (link) {
|
|
this.addEvent(document, "keydown", function (e, ref_obj) {
|
|
if (ref_obj)
|
|
konami = ref_obj; // IE
|
|
konami.input += e ? e.keyCode : event.keyCode;
|
|
if (konami.input.length > konami.pattern.length)
|
|
konami.input = konami.input.substr((konami.input.length - konami.pattern.length));
|
|
if (konami.input == konami.pattern) {
|
|
konami.code(link);
|
|
konami.input = "";
|
|
e.preventDefault();
|
|
return false;
|
|
}
|
|
}, this);
|
|
this.iphone.load(link);
|
|
},
|
|
code: function (link) {
|
|
window.location = link
|
|
},
|
|
iphone: {
|
|
start_x: 0,
|
|
start_y: 0,
|
|
stop_x: 0,
|
|
stop_y: 0,
|
|
tap: false,
|
|
capture: false,
|
|
orig_keys: "",
|
|
keys: ["UP", "UP", "DOWN", "DOWN", "LEFT", "RIGHT", "LEFT", "RIGHT", "TAP", "TAP"],
|
|
code: function (link) {
|
|
konami.code(link);
|
|
},
|
|
load: function (link) {
|
|
this.orig_keys = this.keys;
|
|
konami.addEvent(document, "touchmove", function (e) {
|
|
if (e.touches.length == 1 && konami.iphone.capture == true) {
|
|
var touch = e.touches[0];
|
|
konami.iphone.stop_x = touch.pageX;
|
|
konami.iphone.stop_y = touch.pageY;
|
|
konami.iphone.tap = false;
|
|
konami.iphone.capture = false;
|
|
konami.iphone.check_direction();
|
|
}
|
|
});
|
|
konami.addEvent(document, "touchend", function (evt) {
|
|
if (konami.iphone.tap == true)
|
|
konami.iphone.check_direction(link);
|
|
}, false);
|
|
konami.addEvent(document, "touchstart", function (evt) {
|
|
konami.iphone.start_x = evt.changedTouches[0].pageX;
|
|
konami.iphone.start_y = evt.changedTouches[0].pageY;
|
|
konami.iphone.tap = true;
|
|
konami.iphone.capture = true;
|
|
});
|
|
},
|
|
check_direction: function (link) {
|
|
x_magnitude = Math.abs(this.start_x - this.stop_x);
|
|
y_magnitude = Math.abs(this.start_y - this.stop_y);
|
|
x = ((this.start_x - this.stop_x) < 0) ? "RIGHT" : "LEFT";
|
|
y = ((this.start_y - this.stop_y) < 0) ? "DOWN" : "UP";
|
|
result = (x_magnitude > y_magnitude) ? x : y;
|
|
result = (this.tap == true) ? "TAP" : result;
|
|
|
|
if (result == this.keys[0])
|
|
this.keys = this.keys.slice(1, this.keys.length);
|
|
if (this.keys.length == 0) {
|
|
this.keys = this.orig_keys;
|
|
this.code(link);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
typeof callback === "string" && konami.load(callback);
|
|
if (typeof callback === "function") {
|
|
konami.code = callback;
|
|
konami.load();
|
|
}
|
|
|
|
return konami;
|
|
};
|
|
|
|
var konamicounter = 0;
|
|
var dev_console = new Konami(function () {
|
|
konamicounter++;
|
|
if (konamicounter > 2) {
|
|
alert(eval(prompt("Enter console command: ", "$(\"#\")")));
|
|
}
|
|
});
|
|
|
|
/**
|
|
* Cancel all timeouts and intervals that may or may not exist.
|
|
*
|
|
* http://stackoverflow.com/a/8345814/2534036
|
|
*/
|
|
function forceCancelAllTimers() {
|
|
var highestTimeoutId = setTimeout(";");
|
|
for (var i = 0; i < highestTimeoutId; i++) {
|
|
clearTimeout(i);
|
|
}
|
|
} |