JS globbing; remove glob b/c windows; pregame script hooks
This commit is contained in:
parent
009609458b
commit
94c2a3c143
|
@ -79,10 +79,10 @@ JSValue str2js(const char *c) {
|
||||||
return JS_NewString(js, c);
|
return JS_NewString(js, c);
|
||||||
}
|
}
|
||||||
|
|
||||||
JSValue strarr2js(const char **c, int len)
|
JSValue strarr2js(const char **c)
|
||||||
{
|
{
|
||||||
JSValue arr = JS_NewArray(js);
|
JSValue arr = JS_NewArray(js);
|
||||||
for (int i = 0; i < len; i++)
|
for (int i = 0; i < arrlen(c); i++)
|
||||||
JS_SetPropertyUint32(js, arr, i, JS_NewString(js, c[i]));
|
JS_SetPropertyUint32(js, arr, i, JS_NewString(js, c[i]));
|
||||||
|
|
||||||
return arr;
|
return arr;
|
||||||
|
@ -421,19 +421,6 @@ JSValue duk_nuke(JSContext *js, JSValueConst this, int argc, JSValueConst *argv)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
JSValue duk_win_make(JSContext *js, JSValueConst this, int argc, JSValueConst *argv) {
|
|
||||||
/*
|
|
||||||
const char *title = JS_ToCString(js, argv[0]);
|
|
||||||
int w = js2int(argv[1]);
|
|
||||||
int h = js2int(argv[2]);
|
|
||||||
struct window *win = MakeSDLWindow(title, w, h, 0);
|
|
||||||
JS_FreeCString(js, title);
|
|
||||||
|
|
||||||
return JS_NewInt64(js, win->id);
|
|
||||||
*/
|
|
||||||
return JS_NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
JSValue duk_spline_cmd(JSContext *js, JSValueConst this, int argc, JSValueConst *argv) {
|
JSValue duk_spline_cmd(JSContext *js, JSValueConst this, int argc, JSValueConst *argv) {
|
||||||
static_assert(sizeof(tsReal) * 2 == sizeof(cpVect));
|
static_assert(sizeof(tsReal) * 2 == sizeof(cpVect));
|
||||||
|
|
||||||
|
@ -575,25 +562,6 @@ int file_exists(char *path) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
static int duk2path(const char *path, const struct stat *sb, int typeflag) {
|
|
||||||
if (typeflag == FTW_F) {
|
|
||||||
char *ext = strrchr(path, '.');
|
|
||||||
if (ext && !strcmp(ext, dukext))
|
|
||||||
JS_SetPropertyUint32(js, dukarr, dukidx++, JS_NewString(js, &path[2]));
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
JSValue dukext2paths(char *ext) {
|
|
||||||
char *paths = NULL;
|
|
||||||
|
|
||||||
fill_extensions(paths, ".", ext);
|
|
||||||
// return dukarr;
|
|
||||||
return JS_NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
JSValue duk_cmd(JSContext *js, JSValueConst this, int argc, JSValueConst *argv) {
|
JSValue duk_cmd(JSContext *js, JSValueConst this, int argc, JSValueConst *argv) {
|
||||||
int cmd = js2int(argv[0]);
|
int cmd = js2int(argv[0]);
|
||||||
const char *str = NULL;
|
const char *str = NULL;
|
||||||
|
@ -865,8 +833,7 @@ JSValue duk_cmd(JSContext *js, JSValueConst this, int argc, JSValueConst *argv)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 66:
|
case 66:
|
||||||
str = JS_ToCString(js, argv[1]);
|
ret = strarr2js(ls(","));
|
||||||
ret = dukext2paths(str);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 67:
|
case 67:
|
||||||
|
@ -1122,6 +1089,11 @@ JSValue duk_cmd(JSContext *js, JSValueConst this, int argc, JSValueConst *argv)
|
||||||
case 133:
|
case 133:
|
||||||
ret = JS_NewFloat64(js, appTime);
|
ret = JS_NewFloat64(js, appTime);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 134:
|
||||||
|
str = JS_ToCString(js,argv[1]);
|
||||||
|
app_name(str);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (str)
|
if (str)
|
||||||
|
@ -1687,7 +1659,6 @@ void ffi_load() {
|
||||||
DUK_FUNC(q_body, 2)
|
DUK_FUNC(q_body, 2)
|
||||||
|
|
||||||
DUK_FUNC(sys_cmd, 1)
|
DUK_FUNC(sys_cmd, 1)
|
||||||
DUK_FUNC(win_make, 3)
|
|
||||||
|
|
||||||
DUK_FUNC(make_sprite, 3)
|
DUK_FUNC(make_sprite, 3)
|
||||||
DUK_FUNC(make_anim2d, 3)
|
DUK_FUNC(make_anim2d, 3)
|
||||||
|
|
|
@ -109,6 +109,29 @@ void fill_extensions(char *paths, const char *path, const char *ext) {
|
||||||
ext_paths = paths;
|
ext_paths = paths;
|
||||||
ftw(".", ext_check, 10);
|
ftw(".", ext_check, 10);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char **ls_paths = NULL;
|
||||||
|
|
||||||
|
static int ls_ftw(const char *path, const struct stat *sb, int typeflag)
|
||||||
|
{
|
||||||
|
if (typeflag == FTW_F && strlen(path) > 2)
|
||||||
|
arrpush(ls_paths, strdup(&path[2]));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
char **ls(char *path)
|
||||||
|
{
|
||||||
|
if (ls_paths) {
|
||||||
|
for (int i = 0; i < arrlen(ls_paths); i++)
|
||||||
|
free(ls_paths[i]);
|
||||||
|
|
||||||
|
arrfree(ls_paths);
|
||||||
|
}
|
||||||
|
ftw(".", ls_ftw, 10);
|
||||||
|
return ls_paths;
|
||||||
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
void fill_extensions(char *paths, const char *path, const char *ext)
|
void fill_extensions(char *paths, const char *path, const char *ext)
|
||||||
{};
|
{};
|
||||||
|
@ -140,12 +163,6 @@ char *make_path(const char *file) {
|
||||||
return pathbuf;
|
return pathbuf;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *strdup(const char *s) {
|
|
||||||
char *new = malloc(sizeof(char) * (strlen(s) + 1));
|
|
||||||
strcpy(new, s);
|
|
||||||
return new;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char *slurp_file(const char *filename, size_t *size)
|
unsigned char *slurp_file(const char *filename, size_t *size)
|
||||||
{
|
{
|
||||||
if (cdb_find(&game_cdb, filename, strlen(filename))) {
|
if (cdb_find(&game_cdb, filename, strlen(filename))) {
|
||||||
|
@ -181,6 +198,7 @@ char *slurp_text(const char *filename, size_t *size)
|
||||||
{
|
{
|
||||||
size_t len;
|
size_t len;
|
||||||
char *str = slurp_file(filename, &len);
|
char *str = slurp_file(filename, &len);
|
||||||
|
if (!str) return NULL;
|
||||||
char *retstr = malloc(len+1);
|
char *retstr = malloc(len+1);
|
||||||
memcpy(retstr, str, len);
|
memcpy(retstr, str, len);
|
||||||
retstr[len] = '\0';
|
retstr[len] = '\0';
|
||||||
|
|
|
@ -13,8 +13,7 @@ char *str_replace_ext(const char *s, const char *newext);
|
||||||
FILE *res_open(char *path, const char *tag);
|
FILE *res_open(char *path, const char *tag);
|
||||||
FILE *path_open(const char *tag, const char *fmt, ...);
|
FILE *path_open(const char *tag, const char *fmt, ...);
|
||||||
char *make_path(const char *file);
|
char *make_path(const char *file);
|
||||||
|
char **ls(char *path);
|
||||||
char *strdup(const char *s);
|
|
||||||
|
|
||||||
unsigned char *slurp_file(const char *filename, size_t *size);
|
unsigned char *slurp_file(const char *filename, size_t *size);
|
||||||
char *slurp_text(const char *filename, size_t *size);
|
char *slurp_text(const char *filename, size_t *size);
|
||||||
|
|
|
@ -131,6 +131,7 @@ JSValue script_runfile(const char *file)
|
||||||
{
|
{
|
||||||
size_t len;
|
size_t len;
|
||||||
const char *script = slurp_text(file, &len);
|
const char *script = slurp_text(file, &len);
|
||||||
|
if (!script) return JS_NULL;
|
||||||
|
|
||||||
JSValue obj = JS_Eval(js, script, len, file, JS_EVAL_FLAGS);
|
JSValue obj = JS_Eval(js, script, len, file, JS_EVAL_FLAGS);
|
||||||
js_print_exception(obj);
|
js_print_exception(obj);
|
||||||
|
|
|
@ -310,6 +310,11 @@ static sapp_desc start_desc = {
|
||||||
.logger.func = sg_logging,
|
.logger.func = sg_logging,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void app_name(char *name)
|
||||||
|
{
|
||||||
|
start_desc.window_title = strdup(name);
|
||||||
|
}
|
||||||
|
|
||||||
sapp_desc sokol_main(int argc, char **argv) {
|
sapp_desc sokol_main(int argc, char **argv) {
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
|
@ -366,6 +371,8 @@ sapp_desc sokol_main(int argc, char **argv) {
|
||||||
sound_init();
|
sound_init();
|
||||||
input_init();
|
input_init();
|
||||||
|
|
||||||
|
script_dofile("warmup.js");
|
||||||
|
|
||||||
start_desc.width = mainwin.width;
|
start_desc.width = mainwin.width;
|
||||||
start_desc.height = mainwin.height;
|
start_desc.height = mainwin.height;
|
||||||
start_desc.fullscreen = 0;
|
start_desc.fullscreen = 0;
|
||||||
|
|
|
@ -12,6 +12,7 @@ void set_timescale(float val);
|
||||||
void print_stacktrace();
|
void print_stacktrace();
|
||||||
|
|
||||||
const char *engine_info();
|
const char *engine_info();
|
||||||
|
void app_name(char *name);
|
||||||
|
|
||||||
int frame_fps();
|
int frame_fps();
|
||||||
double get_timescale();
|
double get_timescale();
|
||||||
|
|
|
@ -13,7 +13,7 @@ load("scripts/std.js");
|
||||||
|
|
||||||
function initialize()
|
function initialize()
|
||||||
{
|
{
|
||||||
if (Cmdline.play)
|
if (!Game.edit)
|
||||||
run("scripts/play.js");
|
run("scripts/play.js");
|
||||||
else
|
else
|
||||||
run("scripts/editor.js");
|
run("scripts/editor.js");
|
||||||
|
@ -360,6 +360,7 @@ var Window = {
|
||||||
get width() { return cmd(48); },
|
get width() { return cmd(48); },
|
||||||
get height() { return cmd(49); },
|
get height() { return cmd(49); },
|
||||||
get dimensions() { return [this.width, this.height]; },
|
get dimensions() { return [this.width, this.height]; },
|
||||||
|
set name(str) { cmd(134, str); },
|
||||||
};
|
};
|
||||||
|
|
||||||
Window.icon = function(path) { cmd(90, path); };
|
Window.icon = function(path) { cmd(90, path); };
|
||||||
|
@ -447,6 +448,7 @@ var Game = {
|
||||||
objects: [],
|
objects: [],
|
||||||
resolution: [1200,720],
|
resolution: [1200,720],
|
||||||
name: "Untitled",
|
name: "Untitled",
|
||||||
|
edit: true,
|
||||||
register_obj(obj) {
|
register_obj(obj) {
|
||||||
this.objects[obj.body] = obj;
|
this.objects[obj.body] = obj;
|
||||||
},
|
},
|
||||||
|
@ -645,7 +647,6 @@ Game.view_camera = function(cam)
|
||||||
|
|
||||||
Game.view_camera(Primum.spawn(ur.camera2d));
|
Game.view_camera(Primum.spawn(ur.camera2d));
|
||||||
|
|
||||||
win_make(Game.title, Game.resolution[0], Game.resolution[1]);
|
Window.name = "Primum Machinam (V0.1)";
|
||||||
|
|
||||||
Window.width = 1280;
|
Window.width = 1280;
|
||||||
Window.height = 720;
|
Window.height = 720;
|
||||||
|
|
|
@ -588,8 +588,7 @@ prototypes.from_obj("sprite", {
|
||||||
|
|
||||||
prototypes.generate_ur = function(path)
|
prototypes.generate_ur = function(path)
|
||||||
{
|
{
|
||||||
var ob = IO.glob("*.js");
|
var ob = IO.glob("**.js");
|
||||||
ob = ob.concat(IO.glob("**/*.js"));
|
|
||||||
ob = ob.filter(function(str) { return !str.startsWith("scripts"); });
|
ob = ob.filter(function(str) { return !str.startsWith("scripts"); });
|
||||||
|
|
||||||
ob.forEach(function(name) {
|
ob.forEach(function(name) {
|
||||||
|
|
|
@ -78,8 +78,22 @@ var IO = {
|
||||||
return cmd(38,file);
|
return cmd(38,file);
|
||||||
},
|
},
|
||||||
slurpwrite(str, file) { return cmd(39, str, file); },
|
slurpwrite(str, file) { return cmd(39, str, file); },
|
||||||
extensions(ext) { return cmd(66, "." + ext); },
|
extensions(ext) {
|
||||||
glob(pat) { return cmd(122, pat); },
|
var paths = IO.ls();
|
||||||
|
paths = paths.filter(function(str) { return str.ext() === ext; });
|
||||||
|
return paths;
|
||||||
|
},
|
||||||
|
ls() { return cmd(66); },
|
||||||
|
glob(pat) {
|
||||||
|
var paths = IO.ls();
|
||||||
|
pat = pat.replaceAll(/([\[\]\(\)\^\$\.\|\+])/g, "\\$1");
|
||||||
|
pat = pat.replaceAll('**', '.*');
|
||||||
|
pat = pat.replaceAll(/[^\.]\*/g, '[^\\/]*');
|
||||||
|
pat = pat.replaceAll('?', '.');
|
||||||
|
|
||||||
|
var regex = new RegExp("^"+pat+"$", "");
|
||||||
|
return paths.filter(str => str.match(regex));
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
var Cmdline = {};
|
var Cmdline = {};
|
||||||
|
@ -98,8 +112,6 @@ function cmd_args(cmdargs)
|
||||||
var play = false;
|
var play = false;
|
||||||
var cmds = cmdargs.split(" ");
|
var cmds = cmdargs.split(" ");
|
||||||
|
|
||||||
Cmdline.play = false;
|
|
||||||
|
|
||||||
for (var i = 1; i < cmds.length; i++) {
|
for (var i = 1; i < cmds.length; i++) {
|
||||||
if (cmds[i][0] !== '-') {
|
if (cmds[i][0] !== '-') {
|
||||||
Log.warn(`Command '${cmds[i]}' should start with a '-'.`);
|
Log.warn(`Command '${cmds[i]}' should start with a '-'.`);
|
||||||
|
@ -125,7 +137,7 @@ function cmd_args(cmdargs)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Cmdline.register_cmd("p", function() { Cmdline.play = true; }, "Launch engine in play mode.");
|
Cmdline.register_cmd("p", function() { Game.edit = false; }, "Launch engine in play mode.");
|
||||||
Cmdline.register_cmd("v", function() { Log.say(cmd(120)); Game.quit(); }, "Display engine info.");
|
Cmdline.register_cmd("v", function() { Log.say(cmd(120)); Game.quit(); }, "Display engine info.");
|
||||||
Cmdline.register_cmd("c", function() {}, "Redirect logging to console.");
|
Cmdline.register_cmd("c", function() {}, "Redirect logging to console.");
|
||||||
Cmdline.register_cmd("l", function(n) {
|
Cmdline.register_cmd("l", function(n) {
|
||||||
|
|
Loading…
Reference in a new issue