507 lines
No EOL
15 KiB
JavaScript
507 lines
No EOL
15 KiB
JavaScript
"use strict";
|
|
|
|
window._MEMO_PATHS = {}
|
|
|
|
function replaceSpecialSymbols(s) {
|
|
const memoized = _MEMO_PATHS[s];
|
|
if (memoized != undefined) {
|
|
return memoized;
|
|
}
|
|
if (s == null || s == undefined) {
|
|
return s;
|
|
}
|
|
try {
|
|
s = decodeURIComponent(s)
|
|
} catch (e) {
|
|
}
|
|
|
|
const result = s.replaceAll('!', '_PIDOR_').replaceAll('[', '_SUPER_').replaceAll(']', '_PEDIK_').replaceAll('$', '_SEMENCUM_').replaceAll('%', '_RAZRABI_PIDORASI').replaceAll('(', '_SOSI_').replaceAll(')', '_BEBRA_');
|
|
_MEMO_PATHS[s] = result;
|
|
return result
|
|
}
|
|
|
|
function require(libname) {
|
|
if (!libname.startsWith('/')) {
|
|
libname = `/${libname}`;
|
|
}
|
|
|
|
if (require.libs[libname] !== undefined) {
|
|
return require.libs[libname];
|
|
} else {
|
|
if (libname[0] !== "/" && require.dirstack.length > 0) {
|
|
// Solve relative path
|
|
libname = require.libs.path.join(require.dirstack[require.dirstack.length - 1], libname);
|
|
}
|
|
libname = require.libs.path._solve_dots(libname);
|
|
|
|
if (require.libs[libname] !== undefined) {
|
|
// Try to load cached version again, this time using expanded path
|
|
return require.libs[libname];
|
|
}
|
|
|
|
console.log(`First time load ${libname}`);
|
|
|
|
// Try to load the library .js file
|
|
var dirpath = require.libs.path.dirname(libname);
|
|
var xhr = new XMLHttpRequest();
|
|
|
|
let extended_name = libname.endsWith(".js") ? libname : (libname + ".js");
|
|
if (libname.startsWith('js-yaml/')) {
|
|
extended_name = "js/libs/js-yaml-master/lib/" + libname + '.js';
|
|
}
|
|
if (extended_name == "lib/js-yaml.js" || extended_name == "js/libs/js-yaml-master.js") {
|
|
extended_name = "js/libs/js-yaml-master/lib/js-yaml.js";
|
|
}
|
|
|
|
console.log(`extended name = ${extended_name}`);
|
|
xhr.open("GET", extended_name, false);
|
|
let status;
|
|
try {
|
|
xhr.send();
|
|
status = xhr.status;
|
|
} catch (e) {
|
|
if (e.message.startsWith("Failed to execute 'send'")) {
|
|
status = 404;
|
|
} else {
|
|
throw e;
|
|
}
|
|
}
|
|
if (status === 404) {
|
|
dirpath = libname;
|
|
xhr = new XMLHttpRequest();
|
|
xhr.open("GET", require.libs.path.join(libname, "index.js"), false);
|
|
try {
|
|
xhr.send();
|
|
status = xhr.status;
|
|
} catch (e) {
|
|
if (e.message.startsWith("Failed to execute 'send'")) {
|
|
status = 404;
|
|
} else {
|
|
throw e;
|
|
}
|
|
}
|
|
}
|
|
if (status !== 200 && status !== 0) {
|
|
throw `Couldn't find the ${libname} library`;
|
|
}
|
|
|
|
// Execute the library in a semi-isolated scope
|
|
require.dirstack.push(dirpath);
|
|
try {
|
|
require.libs[libname] = {};
|
|
(function (text) {
|
|
// Module scope
|
|
var module = { exports: {} };
|
|
eval(text);
|
|
require.libs[libname] = module.exports;
|
|
})(xhr.responseText);
|
|
|
|
} catch (e) {
|
|
console.log(`Loading ${libname} failed`);
|
|
throw e;
|
|
|
|
} finally {
|
|
require.dirstack.pop();
|
|
}
|
|
|
|
return require.libs[libname];
|
|
}
|
|
}
|
|
|
|
require.dirstack = [process.env.ROOT_PATH];
|
|
|
|
class Buffer extends Uint8Array {
|
|
constructor(arg) {
|
|
super(arg);
|
|
}
|
|
toString() {
|
|
return new TextDecoder().decode(this);
|
|
}
|
|
|
|
static concat(rest) {
|
|
if (rest.length == 0)
|
|
return new Buffer();
|
|
|
|
let total = 0;
|
|
for (let i = 0; i < rest.length; i++) {
|
|
total += rest[i].length;
|
|
}
|
|
let buffer = new Buffer(total);
|
|
let i = 0;
|
|
for (let argc = 0; argc < rest.length; argc++) {
|
|
for (let j = 0; j < rest[argc].length; j++) {
|
|
buffer[i] = rest[argc][j];
|
|
i++;
|
|
}
|
|
}
|
|
return buffer;
|
|
}
|
|
}
|
|
|
|
require.libs = {};
|
|
|
|
require.libs.path = {
|
|
delimiter: "/",
|
|
|
|
dirname: function (s) {
|
|
let delimiter = require.libs["path"].delimiter;
|
|
|
|
let arr = s.split(delimiter);
|
|
let out = arr.slice(0, arr.length - 1);
|
|
return out.join("/");
|
|
},
|
|
|
|
join: function (...rest) {
|
|
let delimiter = require.libs["path"].delimiter;
|
|
|
|
let path = rest.join(delimiter);
|
|
let s = "";
|
|
for (let i = 0; i < path.length; i++) {
|
|
while (i !== 0 && i < path.length && path[i - 1] === "/" && path[i] === "/")
|
|
i++;
|
|
if (i < path.length)
|
|
s += path[i];
|
|
}
|
|
|
|
return s;
|
|
},
|
|
|
|
extname: function (path) {
|
|
let arr = path.split(".");
|
|
return "." + arr[arr.length - 1];
|
|
},
|
|
|
|
basename: function (path, ext) {
|
|
let delimiter = require.libs["path"].delimiter;
|
|
|
|
if (ext !== undefined) {
|
|
while (ext[0] === ".") {
|
|
ext = ext.substr(1);
|
|
}
|
|
if (path.endsWith("." + ext)) {
|
|
path = path.substr(0, path.length - ext.length - 1);
|
|
}
|
|
}
|
|
let arr = path.split(delimiter);
|
|
return arr[arr.length - 1];
|
|
},
|
|
|
|
_solve_dots: function (path) {
|
|
let delimiter = require.libs["path"].delimiter;
|
|
|
|
let arr = path.split(delimiter);
|
|
let new_arr = [];
|
|
|
|
for (let i = 0; i < arr.length; i++) {
|
|
if (arr[i] === "..") {
|
|
new_arr.pop();
|
|
} else if (arr[i] === ".") {
|
|
// Do nothing
|
|
} else if (arr[i] === "") {
|
|
// Also do nothing
|
|
} else {
|
|
new_arr.push(arr[i]);
|
|
}
|
|
}
|
|
return new_arr.join(delimiter);
|
|
}
|
|
};
|
|
|
|
function capitalizeImpl(s) {
|
|
if (s.length == 0) {
|
|
return ""
|
|
}
|
|
return s.charAt(0).toUpperCase() + s.slice(1);
|
|
}
|
|
window.ALT_CACHE = {}
|
|
|
|
require.libs.fs = {
|
|
cachedAlternativeName: function (path) {
|
|
if (path == null || path == undefined) {
|
|
return path;
|
|
}
|
|
if (ALT_CACHE[path] != undefined) {
|
|
return ALT_CACHE[path];
|
|
}
|
|
|
|
if (require.libs.fs.existsSync(path)) {
|
|
return path;
|
|
}
|
|
|
|
const alt = require.libs.fs.findAlternativeName(path);
|
|
ALT_CACHE[path] = alt;
|
|
return alt;
|
|
},
|
|
|
|
findAlternativeName: function (path) {
|
|
const dirname = require.libs.path.dirname(path);
|
|
const basename = require.libs.path.basename(path);
|
|
|
|
const listing = require.libs.fs.readdirSync(dirname);
|
|
for (const listingFile of listing) {
|
|
if (listingFile.toLowerCase() == basename.toLowerCase()) {
|
|
const alt = require.libs.path.join(dirname, listingFile);
|
|
return alt;
|
|
}
|
|
}
|
|
|
|
return null;
|
|
},
|
|
|
|
readFileSync: function (path, options = {}) {
|
|
let tmparr = require.libs.path._solve_dots(path).split("/");
|
|
if (tmparr[tmparr.length - 2] === "save") {
|
|
console.log("Using NativeFunctions.readSaveFileUTF8");
|
|
let res = NativeFunctions.readSaveFileUTF8(path);
|
|
if (res === null || res === undefined) {
|
|
throw "Server returned status code 404";
|
|
}
|
|
return res;
|
|
}
|
|
|
|
if (typeof (path) !== "string") {
|
|
throw "Reading files by file handle not implemented yet";
|
|
}
|
|
|
|
let components = path.split('/');
|
|
let last_component = components.slice(-1)[0];
|
|
let without_last_component = components.slice(0, -1).join('/');
|
|
|
|
let variants = [
|
|
`${without_last_component}/${last_component}`,
|
|
`${without_last_component}/${capitalizeImpl(last_component)}`,
|
|
`${without_last_component}/${last_component.toLowerCase()}`
|
|
];
|
|
let error_stack = [];
|
|
|
|
for (let eblan of variants) {
|
|
let xhr = new XMLHttpRequest();
|
|
xhr.overrideMimeType('application/octet-stream; charset=x-user-defined');
|
|
xhr.open("GET", eblan, false);
|
|
try {
|
|
xhr.send();
|
|
} catch (e) {
|
|
if (e.message.startsWith("Failed to execute 'send'")) {
|
|
error_stack.push(`Server returned status code 404 (${path})`);
|
|
} else {
|
|
error_stack.push(e);
|
|
}
|
|
|
|
continue;
|
|
}
|
|
if (xhr.status !== 200 && xhr.status !== 0) {
|
|
error_stack.push(`Server returned status code ${xhr.status}`);
|
|
continue;
|
|
}
|
|
let res = Uint8Array.from(xhr.response, c => c.charCodeAt(0));
|
|
if (options.encoding === "utf8" || options.encoding === "utf-8")
|
|
return (new TextDecoder()).decode(res);
|
|
return new Buffer(res);
|
|
}
|
|
|
|
console.log(error_stack);
|
|
throw error_stack[0];
|
|
},
|
|
|
|
writeFileSync: function (path, data) {
|
|
console.log(path);
|
|
let tmparr = require.libs.path._solve_dots(path).split("/");
|
|
if (tmparr[tmparr.length - 2] === "save") {
|
|
console.log("Using NativeFunctions.writeSaveFileUTF8");
|
|
return NativeFunctions.writeSaveFileUTF8(path, data);
|
|
}
|
|
throw "Cannot write file outside of the save directory";
|
|
},
|
|
|
|
writeFile: function (path, data, callback) {
|
|
let tmparr = require.libs.path._solve_dots(path).split("/");
|
|
if (tmparr[tmparr.length - 2] === "save") {
|
|
console.log("Using NativeFunctions.writeSaveFileUTF8");
|
|
let res = NativeFunctions.writeSaveFileUTF8(path, data)
|
|
callback(null);
|
|
return res;
|
|
}
|
|
callback(new Error("Cannot write file outside of the save directory"));
|
|
},
|
|
|
|
readFile: function (path, callback) {
|
|
if (path.startsWith(".") && !path.startsWith("./")) {
|
|
path = "./" + path.substr(1);
|
|
}
|
|
let xhr = new XMLHttpRequest();
|
|
xhr.responseType = "arraybuffer";
|
|
xhr.open("GET", path, true);
|
|
xhr.onload = (_event) => {
|
|
if (xhr.status !== 200 && xhr.status !== 0) {
|
|
callback(new Error(`Server returned status code ${xhr.status}`));
|
|
|
|
} else if (xhr.response) {
|
|
var buffer = new Buffer(xhr.response);
|
|
callback(null, buffer);
|
|
|
|
} else {
|
|
callback(new Error("Empty response"));
|
|
}
|
|
};
|
|
xhr.send(null);
|
|
},
|
|
|
|
readdirSync: function (path) {
|
|
// This whole function is one big hack
|
|
let xhr = new XMLHttpRequest();
|
|
xhr.open("GET", require("path").join(path, "_DIRECTORY.json"), false);
|
|
try {
|
|
xhr.send();
|
|
} catch (e) {
|
|
if (e.message.startsWith("Failed to execute 'send'")) {
|
|
throw new Error(`Server returned status code 404 for file ${path}, either path is invalid or doesn't contain a _DIRECTORY.json file`);
|
|
} else {
|
|
throw e;
|
|
}
|
|
}
|
|
|
|
if (xhr.status === 404) {
|
|
throw new Error(`Server returned status code 404 for file ${path}, either path is invalid or doesn't contain a _DIRECTORY.json file`);
|
|
}
|
|
if (xhr.status !== 200 && xhr.status !== 0) {
|
|
throw new Error(`Server returned status code ${xhr.status}`);
|
|
}
|
|
|
|
return JSON.parse(xhr.responseText);
|
|
},
|
|
|
|
statSync: function (path) {
|
|
// TODO: Implement everything besides just "isDirectory"
|
|
let tmparr = require.libs.path._solve_dots(path).split("/");
|
|
if (tmparr[tmparr.length - 2] === "save") {
|
|
return { isDirectory: () => false };
|
|
}
|
|
if (tmparr[tmparr.length - 1] === "save") {
|
|
return { isDirectory: () => true };
|
|
}
|
|
|
|
let xhr = new XMLHttpRequest();
|
|
xhr.open("GET", require("path").join(path, "_DIRECTORY.json"), false);
|
|
try {
|
|
xhr.send();
|
|
} catch (e) {
|
|
if (e.message.startsWith("Failed to execute 'send'")) {
|
|
return { isDirectory: () => false };
|
|
}
|
|
throw e;
|
|
}
|
|
if (xhr.status === 404) {
|
|
return { isDirectory: () => false };
|
|
}
|
|
return { isDirectory: () => true };
|
|
},
|
|
|
|
existsSync: function (path) {
|
|
let tmparr = require.libs.path._solve_dots(path).split("/");
|
|
|
|
if (tmparr[tmparr.length - 2] === "save") {
|
|
return NativeFunctions.saveFileExists(`${process.env.ROOT_PATH}/save/` + tmparr[tmparr.length - 1]);
|
|
}
|
|
if (tmparr[tmparr.length - 1] === "save") {
|
|
return true;
|
|
}
|
|
|
|
let xhr = new XMLHttpRequest();
|
|
xhr.open("GET", path, false);
|
|
try {
|
|
xhr.send();
|
|
} catch (e) {
|
|
if (e.message.startsWith("Failed to execute 'send'")) {
|
|
return false;
|
|
}
|
|
throw e;
|
|
}
|
|
return xhr.status === 200 || xhr.responseText !== "";
|
|
},
|
|
|
|
unlinkSync: function () {
|
|
// Literally just do nothing
|
|
}
|
|
};
|
|
|
|
require.libs.os = {
|
|
platform: () => window.platform
|
|
};
|
|
|
|
const nw_window = {
|
|
get: () => {
|
|
return window;
|
|
},
|
|
|
|
focus: () => { },
|
|
}
|
|
const nw_impl = {
|
|
App: {
|
|
argv: "--"
|
|
},
|
|
Window: nw_window,
|
|
window: nw_window,
|
|
|
|
Screen: {
|
|
Init: function () { },
|
|
on: function (name, callback) {
|
|
//console.log("require('nw.gui').Screen.on", name, callback);
|
|
}
|
|
}
|
|
}
|
|
window.nw = nw_impl;
|
|
require.libs["nw.gui"] = nw_impl;
|
|
|
|
window.on = function (...rest) {
|
|
console.log("on", rest);
|
|
}
|
|
|
|
window.onerror = function (message, source, lineno, colno, error) {
|
|
if (error === undefined) {
|
|
console.log(message);
|
|
return;
|
|
}
|
|
|
|
console.log(error.stack)
|
|
}
|
|
|
|
// var origConsoleLog = console.log;
|
|
// console.log = function (...rest) {
|
|
// origConsoleLog(`[LOG] ${String(rest)}`)
|
|
// //origConsoleLog(...rest);
|
|
// }
|
|
|
|
var setSizesInterval;
|
|
// setSizesInterval = setInterval(function() {
|
|
// console.log("Interval fired!");
|
|
|
|
// document.getElementById("ErrorPrinter").style["font-size"] = "10px";
|
|
|
|
// document.getElementById("GameCanvas").style["width"] = `${Math.floor(window.screen.height * 4 / 3)}px`;
|
|
// document.getElementById("GameCanvas").style["height"] = `${window.screen.height}px`;
|
|
// document.getElementById("GameCanvas").style["inset"] = "0px 0px 0px 0px";
|
|
// document.getElementById("GameCanvas").style["margin"] = "0";
|
|
// document.getElementById("GameCanvas").style["margin-left"] = "auto";
|
|
// document.getElementById("GameCanvas").style["margin-right"] = "auto";
|
|
|
|
// clearInterval(setSizesInterval);
|
|
|
|
// for (let element of document.getElementsByClassName("controler-button")) {
|
|
// element.style["display"] = "inline";
|
|
// }
|
|
// }, 500);
|
|
|
|
|
|
// setTimeout(function() {
|
|
// console.log("Size is", window.innerWidth, window.innerHeight)
|
|
// }, 1000);
|
|
|
|
function button_down(event_data) {
|
|
// console.log("In button_down");
|
|
document.dispatchEvent(new KeyboardEvent("keydown", event_data));
|
|
}
|
|
|
|
function button_up(event_data) {
|
|
// console.log("In button_up");
|
|
document.dispatchEvent(new KeyboardEvent("keyup", event_data));
|
|
} |