Files
Erupe/www/erupe/js/script.js
2022-08-04 10:10:03 +10:00

541 lines
15 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

var __mhf_launcher = {};
var loginScreen = true;
var loggingIn = false;
var doingAuto = false;
var uids;
var selectedUid;
var firstChar;
var modalState = false;
function soundSel() {
window.external.playSound('IDR_WAV_SEL');
}
function soundOk() {
window.external.playSound('IDR_WAV_OK');
}
function soundPreLogin() {
window.external.playSound('IDR_WAV_PRE_LOGIN');
}
function soundLogin() {
window.external.playSound('IDR_WAV_LOGIN');
}
function soundNiku() {
window.external.playSound('IDR_NIKU');
}
function addLog(text, mode) {
switch (mode) {
case 'winsock':
text = '<span class="winsock">'+text+'</span><br>';
break;
case 'normal':
text = '<span class="white">'+text+'</span><br>';
break;
case 'good':
text = '<span class="green">'+text+'</span><br>';
break;
case 'error':
text = '<span class="red">'+text+'</span><br>';
break;
}
let logText = document.getElementById('log_p');
logText.innerHTML = logText.innerHTML + text;
let logBox = document.getElementsByClassName('log_inner')[0];
logBox.scrollTop = logBox.scrollHeight;
}
function loadAccount() {
let allowed = localStorage.getItem('saving');
if (allowed != 'null' && allowed == 'true') {
document.getElementById('username').value = localStorage.getItem('username');
document.getElementById('password').value = localStorage.getItem('password');
document.getElementById('login_save').checked = true;
let autoEnabled = localStorage.getItem('autologin');
if (autoEnabled != 'null' && autoEnabled == 'true') {
doingAuto = true;
doLogin();
}
}
}
function saveAccount() {
let checkbox = document.getElementById('login_save');
if (checkbox.checked == true) {
let username = document.getElementById('username').value;
let password = document.getElementById('password').value;
if (username[username.length - 1] == '+') {
username = username.slice(0, username.length - 1)
}
localStorage.setItem('username', username);
localStorage.setItem('password', password);
localStorage.setItem('saving', 'true');
} else {
localStorage.removeItem('username');
localStorage.removeItem('password');
localStorage.removeItem('saving');
localStorage.removeItem('uid');
}
}
function createCharItem(name, uid, weapon, hr, gr, date, sex) {
var icon;
const dateObject = new Date(date * 1000);
date = dateObject.toLocaleDateString('en-US');
let dateString = '';
for (var i = 0; i < date.length; i++) {
if (date[i] != '') { // invisible LTR char
dateString += date[i];
}
}
if (sex == 'M') {
sex = "♂";
} else {
sex = "♀";
}
if (hr > 999) {
hr = 999;
}
if (gr > 999) {
gr = 999;
}
switch (weapon) {
case '片手剣':
weapon = 'Sword & Shield';
icon = 'img/icons/ss.png';
break;
case '双剣':
weapon = 'Dual Swords';
icon = 'img/icons/db.png';
break;
case '大剣':
weapon = 'Greatsword';
icon = 'img/icons/gs.png';
break;
case '太刀':
weapon = 'Longsword';
icon = 'img/icons/ls.png';
break;
case 'ハンマー':
weapon = 'Hammer';
icon = 'img/icons/hm.png';
break;
case '狩猟笛':
weapon = 'Hunting Horn';
icon = 'img/icons/hh.png';
break;
case 'ランス':
weapon = 'Lance';
icon = 'img/icons/ln.png';
break;
case 'ガンランス':
weapon = 'Gunlance';
icon = 'img/icons/gl.png';
break;
case '穿龍棍':
weapon = 'Tonfa';
icon = 'img/icons/tf.png';
break;
case 'スラッシュアックスF':
weapon = 'Switch Axe F';
icon = 'img/icons/sa.png';
break;
case 'マグネットスパイク':
weapon = 'Magnet Spike';
icon = 'img/icons/ms.png';
break;
case 'ヘビィボウガン':
weapon = 'Heavy Bowgun';
icon = 'img/icons/hbg.png';
break;
case 'ライトボウガン':
weapon = 'Light Bowgun';
icon = 'img/icons/lbg.png';
break;
case '弓':
weapon = 'Bow';
icon = 'img/icons/bow.png';
break;
default:
weapon = 'Unknown';
icon = 'img/icons/uk.png';
}
let charElem = document.createElement('DIV');
charElem.setAttribute('href', '#');
charElem.id = uid;
charElem.classList.add('unit');
if (firstChar) {
firstChar = false;
selectedUid = uid;
charElem.classList.add('active');
}
let elemName = document.createElement('DIV');
elemName.id = 'char_name';
elemName.innerHTML = name;
charElem.appendChild(elemName);
let elemWeapon = document.createElement('DIV');
elemWeapon.id = 'char_weapon';
elemWeapon.innerHTML = weapon;
charElem.appendChild(elemWeapon);
let elemHr = document.createElement('DIV');
elemHr.id = 'char_hr';
elemHr.innerHTML = 'HR'+hr;
charElem.appendChild(elemHr);
let elemGr = document.createElement('DIV');
elemGr.id = 'char_gr';
elemGr.innerHTML = 'GR'+gr;
charElem.appendChild(elemGr);
let elemSex = document.createElement('DIV');
elemSex.id = 'char_sex';
elemSex.innerHTML = sex;
charElem.appendChild(elemSex);
let elemUid = document.createElement('DIV');
elemUid.id = 'char_uid';
elemUid.innerHTML = 'ID: '+uid;
charElem.appendChild(elemUid);
let elemLastLogin = document.createElement('DIV');
elemLastLogin.id = 'char_login';
elemLastLogin.innerHTML = 'Last Login: '+dateString;
charElem.appendChild(elemLastLogin);
let iconElem = document.createElement('IMG');
iconElem.src = icon;
charElem.appendChild(iconElem);
let unitsElem = document.getElementById('units');
unitsElem.appendChild(charElem);
}
function switchPrompt() {
loginScreen = !loginScreen;
if (loginScreen) {
document.getElementById('units').innerHTML = '';
document.getElementById('char_select').style.display = 'none';
document.getElementById('login').style.display = 'block';
} else { // Character selector
document.getElementById('login').style.display = 'none';
document.getElementById('char_select').style.display = 'block';
try {
// Example data for browser testing
//var charInfo = "<?xml version='1.0' encoding='shift_jis'?><CharacterInfo defaultUid=''><Character name='Cynthia' uid='211111' weapon='双剣' HR='7' GR='998' lastLogin='1645961490' sex='F' /><Character name='狩人申請可能' uid='311111' weapon='大剣' HR='7' GR='0' lastLogin='1650486502' sex='M' /></CharacterInfo>";
var charInfo = window.external.getCharacterInfo();
charInfo = charInfo.split("'").join('"');
charInfo = charInfo.split('&apos;').join("'");
} catch (e) {
addLog('Error getting character info: '+e, 'error');
}
try {
firstChar = true;
uids = new Array();
parser = new DOMParser();
let xml = parser.parseFromString(charInfo, 'text/xml');
let numChars = xml.getElementsByTagName('Character').length;
for (var i = 0; i < numChars; i++) {
let char = xml.getElementsByTagName('Character')[i].attributes;
createCharItem(
char.name.value,
char.uid.value,
char.weapon.value,
char.HR.value,
char.GR.value,
char.lastLogin.value,
char.sex.value
);
uids.push(char.uid.value);
}
} catch (e) {
addLog('Error parsing character info XML: '+e, 'error');
switchPrompt();
return;
}
let uid = localStorage.getItem('uid');
if (uid != 'null' && uids.indexOf(uid) >= 0) {
setUidIndex(uids.indexOf(uid));
}
}
}
function doLogin(option) {
if (loggingIn) {
return;
} else {
loggingIn = true;
}
let username = document.getElementById('username').value;
let password = document.getElementById('password').value;
if (username == '') {
addLog('Please enter Erupe ID!', 'error');
} else if (password == '') {
addLog('Please enter Password!', 'error');
} else {
document.getElementById('processing').style.display = 'block';
soundPreLogin();
addLog('Authenticating...', 'normal');
try {
if (option) {
addLog('Creating new character...', 'normal');
window.external.loginCog(username+'+', password, password);
} else {
window.external.loginCog(username, password, 'test');
}
} catch (e) {
addLog('Error on loginCog: '+e, 'error');
}
checkAuth();
}
}
function checkAuth() {
let loginResult = window.external.getLastAuthResult();
if (loginResult == 'AUTH_PROGRESS') {
setTimeout(checkAuth, 10);
return;
} else if (loginResult == 'AUTH_SUCCESS') {
loggingIn = false;
saveAccount();
addLog('Connected.', 'good');
if (doingAuto) {
let uid = localStorage.getItem('uid');
window.external.selectCharacter(uid, uid);
window.external.exitLauncher();
} else {
addLog('After selecting a character, press [Launch]', 'normal');
switchPrompt();
}
} else {
loggingIn = false;
addLog('Error logging in: '+loginResult+':'+window.external.getSignResult(), 'error');
}
document.getElementById('processing').style.display = 'none';
}
function checkDelete() {
let deleteResult = window.external.getLastAuthResult();
if (deleteResult == 'DEL_PROGRESS') {
setTimeout(checkDelete, 10);
return;
} else if (deleteResult == 'DEL_SUCCESS') {
doLogin(0);
switchPrompt();
toggleModal(0);
}
}
function launch() {
document.getElementById('game_starting').style.display = 'block';
try {
window.external.selectCharacter(selectedUid, selectedUid);
} catch (e) {
addLog('Error selecting character: '+e, 'error');
document.getElementById('game_starting').style.display = 'none';
}
let allowed = localStorage.getItem('saving');
if (allowed != 'null' && allowed == 'true') {
localStorage.setItem('uid', selectedUid);
let autoBox = document.getElementById('auto_box');
if (autoBox.checked) {
localStorage.setItem('autologin', true);
}
}
setTimeout(function () {
window.external.exitLauncher();
}, 3000);
}
function deleteCharacter(id) {
window.external.deleteCharacter(id);
checkDelete();
}
function autoWarning() {
let autoBox = document.getElementById('auto_box');
if (autoBox.checked) {
addLog('Auto-Login is for advanced users, to disable it you will need to clear your IE cache. Uncheck the box now if you are not an advanced user.', 'error');
}
}
function charselScrollUp() {
let index = uids.indexOf(selectedUid) - 1;
if (index < 0) {
index = uids.length - 1;
}
setUidIndex(index);
}
function charselScrollDown() {
let index = uids.indexOf(selectedUid) + 1;
if (index == uids.length) {
index = 0;
}
setUidIndex(index);
}
function setUidIndex(index) {
let units = document.getElementsByClassName('unit');
let numUnits = units.length;
for (var i = 0; i < numUnits; i++) {
units[i].classList.remove('active');
}
selectedUid = uids[index];
document.getElementById(selectedUid).classList.add('active');
}
function toggleModal(preset, url) {
let modal = document.getElementById('launcher_modal');
modalState = !modalState;
if (modalState) {
setModalContent(preset, url);
modal.style.display = 'block';
} else {
modal.style.display = 'none';
}
}
function setModalContent(preset, url) {
let modal = document.getElementById('launcher_modal');
switch (preset) {
case 'openLink':
modal.querySelector('.dialog p').innerHTML = ' \
Are you sure you want to open this URL? \
<br> \
<span class="uid">'+url+'</span> \
<br> \
<div class="sp"></div> \
<span class="attention">This will open in a browser</span> \
';
modal.querySelector('.dialog .btns').innerHTML = ' \
<ul> \
<li> \
<div onmouseover="soundSel()" onclick="soundOk(); window.external.openBrowser(\''+url+'\'); toggleModal(0)">Open</div> \
</li> \
<li> \
<div onmouseover="soundSel()" onclick="soundOk(); toggleModal(0)">Cancel</div> \
</li> \
</ul> \
';
break;
case 'confirmCharDelete':
modal.querySelector('.dialog p').innerHTML = ' \
Are you sure you want to delete your character? \
<br>NAME \
<span class="uid"> (ID: 000000)</span> \
<br> \
<div class="sp"></div> \
<span class="attention">You will not be able to recover this character, \
<br>it will be gone forever. \
</span> \
';
modal.querySelector(".dialog .btns").innerHTML = ' \
<ul> \
<li> \
<div onmouseover="soundSel();" onclick="soundOk(); deleteCharacter(\''+selectedUid+'\')">Yes</div> \
</li> \
<li> \
<div onmouseover="soundSel();" onclick="soundOk(); toggleModal(0)">Cancel</div> \
</li> \
</ul> \
';
break;
case 'addCharNew':
modal.querySelector('.dialog p').innerHTML = ' \
Are you sure you want to add a new character? \
<br> \
<div class="sp"></div> \
<span class="attention">Press [Add Character] to add a new slot.</span> \
';
modal.querySelector('.dialog .btns').innerHTML = ' \
<ul> \
<li> \
<div onmouseover="soundSel()" onclick="soundNiku(); doLogin(1); switchPrompt(); toggleModal(0)">Add Character</div> \
</li> \
<li> \
<div onmouseover="soundSel()" onclick="soundOk(); toggleModal(0)">Cancel</div> \
</li> \
</ul> \
';
break;
default:
return;
}
}
function charselAdd() {
toggleModal('addCharNew');
}
function charselDel() {
toggleModal('confirmCharDelete');
}
function charselLog() {
addLog('Disconnected.', 'error');
addLog('Enter Erupe ID and Password, then press [Log In]', 'normal');
switchPrompt();
}
function doEval() {
try {
addLog(eval(document.getElementById('console').value), 'error');
} catch (e) {
addLog('Error on doEval: '+e, 'error');
}
}
function init() {
document.addEventListener('keypress', function(e) {
switch (e.key) {
case '~':
document.getElementById('dev').style.display = 'block';
break;
case 'Enter':
if (loginScreen) {
doLogin()
} else {
soundLogin();launch()
}
break;
case ',':
if (!loginScreen) {
soundOk();charselScrollUp()
}
break;
case '.':
if (!loginScreen) {
soundOk();charselScrollDown()
}
}
});
let unselectable = document.getElementsByClassName('unselectable');
let unselectableLen = unselectable.length;
for (var i = 0; i < unselectableLen; i++) {
unselectable[i].setAttribute('unselectable', 'on');
unselectable[i].addEventListener('selectstart', function(){return false;});
unselectable[i].addEventListener('mouseover', function(){window.external.beginDrag(false);});
}
let grabbable = document.getElementsByClassName('grabbable');
let grabbableLen = grabbable.length;
for (var i = 0; i < grabbableLen; i++) {
grabbable[i].addEventListener('selectstart', function(){window.external.beginDrag(true);});
grabbable[i].addEventListener('mousedown', function(){window.external.beginDrag(true);});
grabbable[i].addEventListener('mouseup', function(){window.external.beginDrag(true);});
}
document.getElementById('login_save_text').addEventListener('click', function() {
let checkbox = document.getElementById('login_save');
checkbox.checked = !checkbox.checked;
});
document.getElementById('auto_text').addEventListener('click', function() {
let checkbox = document.getElementById('auto_box');
checkbox.checked = !checkbox.checked;
});
document.getElementById('username').focus();
loadAccount();
addLog('Winsock Ver. [2.2]', 'winsock');
addLog('Enter Erupe ID and Password, then press [Log In]', 'normal');
}
init();