2023-12-11 16:59:59 -06:00
|
|
|
"use math";
|
2024-03-14 14:10:06 -05:00
|
|
|
|
2024-03-26 07:53:36 -05:00
|
|
|
globalThis.json = {};
|
|
|
|
json.encode = function(value, replacer, space, whitelist)
|
|
|
|
{
|
|
|
|
space ??= 1;
|
|
|
|
return JSON.stringify(value, replacer, space);
|
|
|
|
}
|
|
|
|
|
|
|
|
json.decode = function(text, reviver)
|
|
|
|
{
|
|
|
|
if (!text) return undefined;
|
|
|
|
return JSON.parse(text,reviver);
|
|
|
|
}
|
|
|
|
|
|
|
|
json.readout = function(obj)
|
|
|
|
{
|
|
|
|
var j = {};
|
|
|
|
for (var k in obj)
|
|
|
|
if (typeof obj[k] === 'function')
|
|
|
|
j[k] = 'function ' + obj[k].toString();
|
|
|
|
else
|
|
|
|
j[k] = obj[k];
|
|
|
|
|
|
|
|
return json.encode(j);
|
|
|
|
}
|
|
|
|
|
|
|
|
json.doc = {
|
|
|
|
doc: "json implementation.",
|
|
|
|
encode: "Encode a value to json.",
|
|
|
|
decode: "Decode a json string to a value.",
|
|
|
|
readout: "Encode an object fully, including function definitions."
|
|
|
|
};
|
|
|
|
|
2024-03-21 11:33:36 -05:00
|
|
|
globalThis.Resources = {};
|
|
|
|
Resources.scripts = ["jsoc", "jsc", "jso", "js"];
|
|
|
|
Resources.images = ["png", "gif", "jpg", "jpeg"];
|
|
|
|
Resources.sounds = ["wav", 'flac', 'mp3', "qoa"];
|
|
|
|
Resources.is_image = function(path) {
|
|
|
|
var ext = path.ext();
|
|
|
|
return Resources.images.any(x => x === ext);
|
|
|
|
}
|
|
|
|
|
|
|
|
function find_ext(file, ext)
|
|
|
|
{
|
|
|
|
if (io.exists(file)) return file;
|
|
|
|
for (var e of ext) {
|
|
|
|
var nf = `${file}.${e}`;
|
|
|
|
if (io.exists(nf)) return nf;
|
|
|
|
}
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
Resources.find_image = function(file) { return find_ext(file,Resources.images); }
|
|
|
|
Resources.find_sound = function(file) { return find_ext(file,Resources.sounds); }
|
|
|
|
Resources.find_script = function(file) { return find_ext(file,Resources.scripts); }
|
|
|
|
|
|
|
|
profile.best_t = function(t) {
|
|
|
|
var qq = 'ns';
|
|
|
|
if (t > 1000) {
|
|
|
|
t /= 1000;
|
|
|
|
qq = 'us';
|
|
|
|
if (t > 1000) {
|
|
|
|
t /= 1000;
|
|
|
|
qq = 'ms';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return `${t.toPrecision(4)} ${qq}`;
|
|
|
|
}
|
|
|
|
|
2024-03-14 14:10:06 -05:00
|
|
|
Object.assign(console, {
|
2024-03-24 12:44:35 -05:00
|
|
|
say(msg) { console.print(msg + "\n"); },
|
2024-03-14 14:10:06 -05:00
|
|
|
|
|
|
|
pprint(msg, lvl = 0) {
|
|
|
|
if (typeof msg === 'object')
|
|
|
|
msg = JSON.stringify(msg, null, 2);
|
|
|
|
|
|
|
|
var file = "nofile";
|
|
|
|
var line = 0;
|
|
|
|
|
|
|
|
var caller = (new Error()).stack.split('\n')[2];
|
2024-03-23 09:56:38 -05:00
|
|
|
if (caller) {
|
2024-03-18 08:16:25 -05:00
|
|
|
var md = caller.match(/\((.*)\:/);
|
|
|
|
var m = md ? md[1] : "SCRIPT";
|
2024-03-14 14:10:06 -05:00
|
|
|
if (m) file = m;
|
2024-03-18 08:16:25 -05:00
|
|
|
md = caller.match(/\:(\d*)\)/);
|
|
|
|
m = md ? md[1] : 0;
|
2024-03-14 14:10:06 -05:00
|
|
|
if (m) line = m;
|
|
|
|
}
|
|
|
|
|
|
|
|
console.rec(lvl, msg, file, line);
|
|
|
|
},
|
|
|
|
|
2024-03-18 08:16:25 -05:00
|
|
|
spam(msg) { console.pprint (msg,0); },
|
2024-03-14 14:10:06 -05:00
|
|
|
debug(msg) { console.pprint(msg,1); },
|
|
|
|
info(msg) { console.pprint(msg, 2); },
|
|
|
|
warn(msg) { console.pprint(msg, 3); },
|
|
|
|
error(msg) { console.pprint(msg + "\n" + console.stackstr(2), 4);},
|
|
|
|
panic(msg) { console.pprint(msg + "\n" + console.stackstr(2), 5); },
|
|
|
|
|
|
|
|
stackstr(skip=0) {
|
|
|
|
var err = new Error();
|
|
|
|
var stack = err.stack.split('\n');
|
|
|
|
return stack.slice(skip,stack.length).join('\n');
|
|
|
|
},
|
|
|
|
|
|
|
|
stack(skip = 0) {
|
|
|
|
console.log(console.stackstr(skip+1));
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
2024-03-23 09:56:38 -05:00
|
|
|
console.stdout_lvl = 1;
|
2024-03-14 14:10:06 -05:00
|
|
|
console.log = console.say;
|
2024-03-26 07:53:36 -05:00
|
|
|
console.trace = console.stack;
|
2024-03-14 14:10:06 -05:00
|
|
|
var say = console.say;
|
|
|
|
var print = console.print;
|
|
|
|
|
|
|
|
console.doc = {
|
|
|
|
level: "Set level to output logging to console.",
|
|
|
|
info: "Output info level message.",
|
|
|
|
warn: "Output warn level message.",
|
|
|
|
error: "Output error level message, and print stacktrace.",
|
|
|
|
critical: "Output critical level message, and exit game immediately.",
|
|
|
|
write: "Write raw text to console.",
|
|
|
|
say: "Write raw text to console, plus a newline.",
|
|
|
|
stack: "Output a stacktrace to console.",
|
|
|
|
console: "Output directly to in game console.",
|
|
|
|
clear: "Clear console."
|
|
|
|
};
|
|
|
|
|
2024-02-25 17:31:48 -06:00
|
|
|
globalThis.global = globalThis;
|
2023-05-24 20:45:50 -05:00
|
|
|
|
2024-03-21 11:33:36 -05:00
|
|
|
function use(file, env, script)
|
2024-02-27 10:09:15 -06:00
|
|
|
{
|
2024-03-21 11:33:36 -05:00
|
|
|
file = Resources.find_script(file);
|
|
|
|
var st = profile.now();
|
|
|
|
env ??= {};
|
2024-02-27 10:09:15 -06:00
|
|
|
|
2024-03-21 11:33:36 -05:00
|
|
|
if (use.cache[file]) {
|
|
|
|
var ret = use.cache[file].call(env);
|
|
|
|
console.info(`CACHE eval ${file} in ${profile.best_t(profile.now()-st)}`);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
script ??= io.slurp(file);
|
|
|
|
script = `(function() { ${script}; })`;
|
|
|
|
var fn = os.eval(file,script);
|
|
|
|
use.cache[file] = fn;
|
|
|
|
var ret = fn.call(env);
|
|
|
|
console.info(`eval ${file} in ${profile.best_t(profile.now()-st)}`);
|
|
|
|
return ret;
|
2024-02-29 13:54:33 -06:00
|
|
|
}
|
|
|
|
|
2024-03-21 11:33:36 -05:00
|
|
|
use.cache = {};
|
2024-02-29 13:54:33 -06:00
|
|
|
|
2024-03-04 15:18:11 -06:00
|
|
|
global.check_registers = function(obj)
|
|
|
|
{
|
|
|
|
if (typeof obj.update === 'function')
|
|
|
|
obj.timers.push(Register.update.register(obj.update.bind(obj)));
|
|
|
|
|
|
|
|
if (typeof obj.physupdate === 'function')
|
|
|
|
obj.timers.push(Register.physupdate.register(obj.physupdate.bind(obj)));
|
|
|
|
|
|
|
|
if (typeof obj.collide === 'function')
|
2024-03-20 16:07:23 -05:00
|
|
|
physics.collide_begin(obj.collide.bind(obj), obj);
|
2024-03-04 15:18:11 -06:00
|
|
|
|
|
|
|
if (typeof obj.separate === 'function')
|
2024-03-20 16:07:23 -05:00
|
|
|
physics.collide_separate(obj.separate.bind(obj), obj);
|
2024-03-04 15:18:11 -06:00
|
|
|
|
|
|
|
if (typeof obj.draw === 'function')
|
|
|
|
obj.timers.push(Register.draw.register(obj.draw.bind(obj), obj));
|
|
|
|
|
|
|
|
if (typeof obj.debug === 'function')
|
|
|
|
obj.timers.push(Register.debug.register(obj.debug.bind(obj)));
|
|
|
|
|
|
|
|
if (typeof obj.gui === 'function')
|
|
|
|
obj.timers.push(Register.gui.register(obj.gui.bind(obj)));
|
|
|
|
|
|
|
|
for (var k in obj) {
|
|
|
|
if (!k.startswith("on_")) continue;
|
|
|
|
var signal = k.fromfirst("on_");
|
|
|
|
Event.observe(signal, obj, obj[k]);
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2024-03-21 11:33:36 -05:00
|
|
|
Object.assign(global, use("scripts/base"));
|
2024-02-27 10:09:15 -06:00
|
|
|
global.obscure('global');
|
2024-03-21 11:33:36 -05:00
|
|
|
global.mixin("scripts/render");
|
|
|
|
global.mixin("scripts/debug");
|
2024-03-15 11:21:36 -05:00
|
|
|
|
2024-03-20 09:04:28 -05:00
|
|
|
var frame_t = profile.secs(profile.now());
|
2024-03-20 14:32:35 -05:00
|
|
|
var phys_step = 1/60;
|
2024-03-15 11:21:36 -05:00
|
|
|
|
|
|
|
var sim = {
|
|
|
|
mode: "play",
|
|
|
|
play() { this.mode = "play"; os.reindex_static(); },
|
|
|
|
playing() { return this.mode === 'play'; },
|
|
|
|
pause() { this.mode = "pause"; console.stack(); },
|
|
|
|
paused() { return this.mode === 'pause'; },
|
|
|
|
step() { this.mode = 'step'; },
|
|
|
|
stepping() { return this.mode === 'step'; }
|
|
|
|
}
|
|
|
|
|
|
|
|
var physlag = 0;
|
|
|
|
var timescale = 1;
|
2024-03-02 23:34:41 -06:00
|
|
|
|
2024-03-18 08:16:25 -05:00
|
|
|
var gggstart = game.engine_start;
|
|
|
|
game.engine_start = function(s) {
|
2024-03-21 11:33:36 -05:00
|
|
|
gggstart(function() {
|
|
|
|
world_start();
|
|
|
|
go_init();
|
2024-03-21 21:07:24 -05:00
|
|
|
window.set_icon(os.make_texture("icons/moon.gif"))
|
2024-03-21 11:33:36 -05:00
|
|
|
s();
|
|
|
|
}, process);
|
2024-03-18 08:16:25 -05:00
|
|
|
}
|
|
|
|
|
2024-03-15 10:51:04 -05:00
|
|
|
function process()
|
|
|
|
{
|
2024-03-20 09:04:28 -05:00
|
|
|
var dt = profile.secs(profile.now()) - frame_t;
|
|
|
|
frame_t = profile.secs(profile.now());
|
2024-03-15 11:21:36 -05:00
|
|
|
|
|
|
|
prosperon.appupdate(dt);
|
|
|
|
prosperon.emitters_step(dt);
|
2024-03-18 14:27:52 -05:00
|
|
|
input.procdown();
|
2024-03-15 11:21:36 -05:00
|
|
|
|
|
|
|
if (sim.mode === "play" || sim.mode === "step") {
|
|
|
|
prosperon.update(dt*game.timescale);
|
|
|
|
if (sim.mode === "step")
|
|
|
|
sim.pause();
|
|
|
|
}
|
|
|
|
|
|
|
|
physlag += dt;
|
|
|
|
|
2024-03-20 14:32:35 -05:00
|
|
|
while (physlag > phys_step) {
|
|
|
|
physlag -= phys_step;
|
|
|
|
prosperon.phys2d_step(phys_step*timescale);
|
|
|
|
prosperon.physupdate(phys_step*timescale);
|
2024-03-15 11:21:36 -05:00
|
|
|
}
|
2024-03-18 14:27:52 -05:00
|
|
|
|
2024-03-20 16:48:03 -05:00
|
|
|
if (!game.camera)
|
|
|
|
prosperon.window_render(world, 1);
|
|
|
|
else
|
|
|
|
prosperon.window_render(game.camera, game.camera.zoom);
|
2024-03-18 14:27:52 -05:00
|
|
|
render.sprites();
|
|
|
|
render.models();
|
|
|
|
render.emitters();
|
|
|
|
prosperon.draw();
|
2024-03-19 23:01:31 -05:00
|
|
|
debug.draw();
|
2024-03-18 14:27:52 -05:00
|
|
|
render.flush();
|
|
|
|
render.pass();
|
|
|
|
prosperon.gui();
|
|
|
|
render.flush_hud();
|
|
|
|
render.end_pass();
|
|
|
|
render.commit();
|
2024-03-15 10:51:04 -05:00
|
|
|
}
|
|
|
|
|
2024-03-18 08:16:25 -05:00
|
|
|
game.timescale = 1;
|
2024-03-02 23:34:41 -06:00
|
|
|
|
2024-03-19 17:00:49 -05:00
|
|
|
var eachobj = function(obj,fn)
|
|
|
|
{
|
|
|
|
fn(obj);
|
|
|
|
for (var o in obj.objects)
|
|
|
|
eachobj(obj.objects[o],fn);
|
|
|
|
}
|
|
|
|
|
2024-03-19 23:01:31 -05:00
|
|
|
game.all_objects = function(fn) { eachobj(world,fn); };
|
2024-03-02 23:34:41 -06:00
|
|
|
|
2024-03-18 08:16:25 -05:00
|
|
|
game.doc = {};
|
|
|
|
game.doc.object = "Returns the entity belonging to a given id.";
|
|
|
|
game.doc.pause = "Pause game simulation.";
|
|
|
|
game.doc.play = "Resume or start game simulation.";
|
|
|
|
game.doc.dt = "Current frame dt.";
|
|
|
|
game.doc.camera = "Current camera.";
|
2024-02-23 16:05:30 -06:00
|
|
|
|
2024-03-21 21:07:24 -05:00
|
|
|
game.texture = function(path)
|
|
|
|
{
|
2024-03-26 07:53:36 -05:00
|
|
|
if (game.texture.cache[path]) return game.texture.cache[path];
|
|
|
|
|
|
|
|
if (!io.exists(path)) {
|
|
|
|
console.warn(`Missing texture: ${path}`);
|
|
|
|
game.texture.cache[path] = game.texture("icons/no_tex.gif");
|
|
|
|
} else
|
|
|
|
game.texture.cache[path] ??= os.make_texture(path);
|
|
|
|
|
2024-03-21 21:07:24 -05:00
|
|
|
return game.texture.cache[path];
|
|
|
|
}
|
|
|
|
game.texture.cache = {};
|
|
|
|
|
|
|
|
|
2024-02-23 16:05:30 -06:00
|
|
|
prosperon.semver = {};
|
|
|
|
prosperon.semver.valid = function(v, range)
|
|
|
|
{
|
|
|
|
v = v.split('.');
|
|
|
|
range = range.split('.');
|
|
|
|
if (v.length !== 3) return undefined;
|
|
|
|
if (range.length !== 3) return undefined;
|
|
|
|
|
|
|
|
if (range[0][0] === '^') {
|
|
|
|
range[0] = range[0].slice(1);
|
|
|
|
if (parseInt(v[0]) >= parseInt(range[0])) return true;
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (range[0] === '~') {
|
|
|
|
range[0] = range[0].slice(1);
|
|
|
|
for (var i = 0; i < 2; i++)
|
|
|
|
if (parseInt(v[i]) < parseInt(range[i])) return false;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return prosperon.semver.cmp(v.join('.'), range.join('.')) === 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
prosperon.semver.cmp = function(v1, v2)
|
|
|
|
{
|
|
|
|
var ver1 = v1.split('.');
|
|
|
|
var ver2 = v2.split('.');
|
|
|
|
|
|
|
|
for (var i = 0; i < 3; i++) {
|
|
|
|
var n1 = parseInt(ver1[i]);
|
|
|
|
var n2 = parseInt(ver2[i]);
|
|
|
|
if (n1 > n2)
|
|
|
|
return 1;
|
|
|
|
else if (n1 < n2)
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
prosperon.semver.doc = "Functions for semantic versioning numbers. Semantic versioning is given as a triple digit number, as MAJOR.MINOR.PATCH.";
|
|
|
|
prosperon.semver.cmp.doc = "Compare two semantic version numbers, given like X.X.X.";
|
|
|
|
prosperon.semver.valid.doc = `Test if semantic version v is valid, given a range.
|
|
|
|
Range is given by a semantic versioning number, prefixed with nothing, a ~, or a ^.
|
|
|
|
~ means that MAJOR and MINOR must match exactly, but any PATCH greater or equal is valid.
|
|
|
|
^ means that MAJOR must match exactly, but any MINOR and PATCH greater or equal is valid.`;
|
|
|
|
|
2024-03-12 09:01:52 -05:00
|
|
|
prosperon.iconified = function(icon) {};
|
|
|
|
prosperon.focus = function(focus) {};
|
|
|
|
prosperon.resize = function(dimensions) {};
|
|
|
|
prosperon.suspended = function(sus) {};
|
|
|
|
prosperon.mouseenter = function(){};
|
|
|
|
prosperon.mouseleave = function(){};
|
|
|
|
prosperon.touchpress = function(touches){};
|
|
|
|
prosperon.touchrelease = function(touches){};
|
|
|
|
prosperon.touchmove = function(touches){};
|
|
|
|
prosperon.clipboardpaste = function(str){};
|
2024-03-20 09:04:28 -05:00
|
|
|
prosperon.quit = function(){
|
|
|
|
for (var i in debug.log.time)
|
|
|
|
console.warn(debug.log.time[i].map(x=>profile.ms(x)));
|
|
|
|
};
|
2024-03-12 09:01:52 -05:00
|
|
|
|
2024-03-21 11:33:36 -05:00
|
|
|
global.mixin("scripts/input");
|
|
|
|
global.mixin("scripts/std");
|
|
|
|
global.mixin("scripts/diff");
|
|
|
|
global.mixin("scripts/color");
|
|
|
|
global.mixin("scripts/gui");
|
2023-04-22 16:44:26 -05:00
|
|
|
|
2023-11-16 09:27:04 -06:00
|
|
|
var timer = {
|
|
|
|
update(dt) {
|
|
|
|
this.remain -= dt;
|
2023-12-26 15:39:46 -06:00
|
|
|
if (this.remain <= 0) {
|
|
|
|
this.fn();
|
|
|
|
this.kill();
|
|
|
|
}
|
2023-11-16 09:27:04 -06:00
|
|
|
},
|
|
|
|
|
|
|
|
kill() {
|
2024-01-03 14:26:42 -06:00
|
|
|
this.end();
|
2024-03-15 10:51:04 -05:00
|
|
|
delete this.fn;
|
2023-11-16 09:27:04 -06:00
|
|
|
},
|
2023-11-29 17:31:41 -06:00
|
|
|
|
|
|
|
delay(fn, secs) {
|
2023-11-16 09:27:04 -06:00
|
|
|
var t = Object.create(this);
|
|
|
|
t.time = secs;
|
|
|
|
t.remain = secs;
|
2023-12-26 15:39:46 -06:00
|
|
|
t.fn = fn;
|
2024-01-03 14:26:42 -06:00
|
|
|
t.end = Register.update.register(timer.update.bind(t));
|
2024-03-15 10:51:04 -05:00
|
|
|
var returnfn = timer.kill.bind(t);
|
|
|
|
returnfn.remain = secs;
|
|
|
|
return returnfn;
|
2023-11-16 09:27:04 -06:00
|
|
|
},
|
|
|
|
};
|
2023-04-22 16:44:26 -05:00
|
|
|
|
2024-03-21 11:33:36 -05:00
|
|
|
global.mixin("scripts/physics");
|
|
|
|
global.mixin("scripts/geometry");
|
2023-04-25 14:59:26 -05:00
|
|
|
|
2024-03-15 10:51:04 -05:00
|
|
|
/*
|
|
|
|
Factory for creating registries. Register one with 'X.register',
|
|
|
|
which returns a function that, when invoked, cancels the registry.
|
|
|
|
*/
|
2023-04-22 16:44:26 -05:00
|
|
|
var Register = {
|
2023-08-28 17:00:53 -05:00
|
|
|
registries: [],
|
2023-06-05 17:19:43 -05:00
|
|
|
|
2024-03-11 22:23:02 -05:00
|
|
|
add_cb(name) {
|
2023-08-28 17:00:53 -05:00
|
|
|
var n = {};
|
2024-01-03 14:26:42 -06:00
|
|
|
var fns = [];
|
|
|
|
|
2023-08-28 17:00:53 -05:00
|
|
|
n.register = function(fn, obj) {
|
2024-01-03 14:26:42 -06:00
|
|
|
if (typeof fn !== 'function') return;
|
|
|
|
if (typeof obj === 'object')
|
|
|
|
fn = fn.bind(obj);
|
|
|
|
fns.push(fn);
|
2024-03-18 08:16:25 -05:00
|
|
|
return function() {
|
|
|
|
fns.remove(fn);
|
|
|
|
};
|
2023-08-28 17:00:53 -05:00
|
|
|
}
|
2024-03-11 22:23:02 -05:00
|
|
|
prosperon[name] = function(...args) { fns.forEach(x => x(...args)); }
|
2024-03-18 08:16:25 -05:00
|
|
|
prosperon[name].fns = fns;
|
2024-01-03 14:26:42 -06:00
|
|
|
n.clear = function() { fns = []; }
|
2023-04-22 16:44:26 -05:00
|
|
|
|
2023-08-28 17:00:53 -05:00
|
|
|
Register[name] = n;
|
|
|
|
Register.registries.push(n);
|
|
|
|
|
|
|
|
return n;
|
|
|
|
},
|
2023-04-22 16:44:26 -05:00
|
|
|
};
|
|
|
|
|
2024-03-11 22:23:02 -05:00
|
|
|
Register.add_cb("appupdate");
|
2024-03-15 11:21:36 -05:00
|
|
|
Register.add_cb("update").doc = "Called once per frame.";
|
2024-03-11 22:23:02 -05:00
|
|
|
Register.add_cb("physupdate");
|
|
|
|
Register.add_cb("gui");
|
|
|
|
Register.add_cb("debug");
|
|
|
|
Register.add_cb("draw");
|
2023-04-22 16:44:26 -05:00
|
|
|
|
2023-11-22 03:51:43 -06:00
|
|
|
var Event = {
|
|
|
|
events: {},
|
|
|
|
|
|
|
|
observe(name, obj, fn) {
|
|
|
|
this.events[name] ??= [];
|
|
|
|
this.events[name].push([obj, fn]);
|
|
|
|
},
|
|
|
|
|
|
|
|
unobserve(name, obj) {
|
|
|
|
this.events[name] = this.events[name].filter(x => x[0] !== obj);
|
|
|
|
},
|
|
|
|
|
2023-12-20 17:20:29 -06:00
|
|
|
rm_obj(obj) {
|
|
|
|
Object.keys(this.events).forEach(name => Event.unobserve(name,obj));
|
|
|
|
},
|
|
|
|
|
2023-11-22 03:51:43 -06:00
|
|
|
notify(name) {
|
|
|
|
if (!this.events[name]) return;
|
|
|
|
this.events[name].forEach(function(x) {
|
|
|
|
x[1].call(x[0]);
|
|
|
|
});
|
|
|
|
},
|
|
|
|
};
|
|
|
|
|
2024-03-18 08:16:25 -05:00
|
|
|
window.modetypes = {
|
2024-03-13 16:30:55 -05:00
|
|
|
stretch: 0, // stretch to fill window
|
|
|
|
keep: 1, // keep exact dimensions
|
|
|
|
width: 2, // keep width
|
|
|
|
height: 3, // keep height
|
|
|
|
expand: 4, // expand width or height
|
|
|
|
full: 5 // expand out beyond window
|
2023-06-06 15:49:55 -05:00
|
|
|
};
|
|
|
|
|
2024-03-18 08:16:25 -05:00
|
|
|
window.size = [640, 480];
|
2024-03-05 00:11:34 -06:00
|
|
|
|
2024-03-18 08:16:25 -05:00
|
|
|
window.screen2world = function(screenpos) {
|
|
|
|
if (game.camera)
|
|
|
|
return game.camera.view2world(screenpos);
|
2024-02-29 13:54:33 -06:00
|
|
|
|
2024-02-25 17:31:48 -06:00
|
|
|
return screenpos;
|
|
|
|
}
|
2024-03-05 00:11:34 -06:00
|
|
|
|
2024-03-18 08:16:25 -05:00
|
|
|
window.world2screen = function(worldpos) {
|
|
|
|
return game.camera.world2view(worldpos);
|
2024-02-27 10:09:15 -06:00
|
|
|
}
|
2024-02-25 17:31:48 -06:00
|
|
|
|
2024-03-18 08:16:25 -05:00
|
|
|
window.set_icon.doc = "Set the icon of the window using the PNG image at path.";
|
2024-03-15 11:21:36 -05:00
|
|
|
|
2024-03-21 11:33:36 -05:00
|
|
|
global.mixin("scripts/spline");
|
|
|
|
global.mixin("scripts/components");
|
2023-04-22 16:44:26 -05:00
|
|
|
|
2024-03-18 08:16:25 -05:00
|
|
|
window.doc = {};
|
|
|
|
window.doc.width = "Width of the game window.";
|
|
|
|
window.doc.height = "Height of the game window.";
|
|
|
|
window.doc.dimensions = "Window width and height packaged in an array [width,height]";
|
|
|
|
window.doc.title = "Name in the title bar of the window.";
|
|
|
|
window.doc.boundingbox = "Boundingbox of the window, with top and right being its height and width.";
|
2023-04-22 16:44:26 -05:00
|
|
|
|
2024-03-21 11:33:36 -05:00
|
|
|
global.mixin("scripts/actor");
|
|
|
|
global.mixin("scripts/entity");
|
2023-05-27 07:01:17 -05:00
|
|
|
|
2023-10-23 08:08:11 -05:00
|
|
|
function world_start() {
|
2024-03-20 16:07:23 -05:00
|
|
|
globalThis.world = os.make_gameobject();
|
|
|
|
world.setref(world);
|
2024-02-29 13:54:33 -06:00
|
|
|
world.objects = {};
|
|
|
|
world.toString = function() { return "world"; };
|
|
|
|
world.ur = "world";
|
|
|
|
world.kill = function() { this.clear(); };
|
|
|
|
world.phys = 2;
|
2024-03-20 16:48:03 -05:00
|
|
|
world.zoom = 1;
|
|
|
|
game.cam = world;
|
2023-10-23 08:08:11 -05:00
|
|
|
}
|
2023-09-08 12:35:06 -05:00
|
|
|
|
2024-03-21 11:33:36 -05:00
|
|
|
global.mixin("scripts/physics");
|
2023-04-22 16:44:26 -05:00
|
|
|
|
2024-03-18 08:16:25 -05:00
|
|
|
window.title = `Prosperon v${prosperon.version}`;
|
|
|
|
window.size = [500,500];
|
2024-03-22 09:02:10 -05:00
|
|
|
window.boundingbox = function() {
|
|
|
|
var pos = game.camera.pos;
|
|
|
|
var wh = window.rendersize.scale(game.camera.zoom);
|
|
|
|
return bbox.fromcwh(pos,wh);
|
|
|
|
}
|