cdb command line options; packing and playing game; add stb_vorbis
This commit is contained in:
parent
1e9b5f6341
commit
0054c7ab2e
2
Makefile
2
Makefile
|
@ -178,7 +178,7 @@ endif
|
|||
WARNING_FLAGS = -Wno-incompatible-function-pointer-types
|
||||
|
||||
NAME = primum$(EXT)
|
||||
SEM = 0.0.1
|
||||
SEM = 0.3.0
|
||||
COM != fossil describe
|
||||
VER = $(SEM)
|
||||
|
||||
|
|
|
@ -146,6 +146,8 @@ Object.assign(performance, {
|
|||
},
|
||||
});
|
||||
|
||||
performance.now = performance.tick_now;
|
||||
|
||||
performance.test = {
|
||||
barecall() { performance(0); },
|
||||
unpack_num(n) { performance(1,n); },
|
||||
|
|
|
@ -376,7 +376,7 @@ 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.name = "Name in the title bar of the window.";
|
||||
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.";
|
||||
|
||||
Register.update.register(Game.exec, Game);
|
||||
|
|
|
@ -780,8 +780,14 @@ var resani = function(ur, path)
|
|||
return restry;
|
||||
}
|
||||
|
||||
var ur = {};
|
||||
var ur;
|
||||
|
||||
if (io.exists(".prosperon/ur.json"))
|
||||
ur = json.decode(io.slurp(".prosperon/ur.json"));
|
||||
else {
|
||||
ur = {};
|
||||
ur._list = [];
|
||||
}
|
||||
|
||||
/* UR OBJECT
|
||||
ur {
|
||||
|
@ -852,15 +858,19 @@ function file2fqn(file)
|
|||
|
||||
/* FIND ALL URS IN A PROJECT */
|
||||
for (var file of io.glob("**.jso")) {
|
||||
if (file[0] === '.' || file[0] === '_') continue;
|
||||
var topur = file2fqn(file);
|
||||
topur.text = file;
|
||||
}
|
||||
|
||||
for (var file of io.glob("**.json")) {
|
||||
if (file[0] === '.' || file[0] === '_') continue;
|
||||
var topur = file2fqn(file);
|
||||
topur.data = file;
|
||||
}
|
||||
|
||||
io.slurpwrite(".prosperon/ur.json", json.encode(ur));
|
||||
|
||||
ur.empty = {
|
||||
name: "empty"
|
||||
};
|
||||
|
|
|
@ -9,7 +9,7 @@ audio.sound = {
|
|||
return;
|
||||
}
|
||||
var src = audio.dsp.source(file);
|
||||
bus ??= sound.bus.master;
|
||||
bus ??= audio.sound.bus.master;
|
||||
// src.plugin(bus);
|
||||
return src;
|
||||
},
|
||||
|
@ -106,6 +106,8 @@ Object.mixin(cmd(180).__proto__, {
|
|||
set volume(x) { this.gain = x; },
|
||||
});
|
||||
|
||||
audio.sound.bus.master = cmd(180);
|
||||
|
||||
/*Object.mixin(audio.dsp.source().__proto__, {
|
||||
frames() { return cmd(197,this); },
|
||||
length() { return this.frames()/sound.samplerate(); },
|
||||
|
|
114
scripts/std.js
114
scripts/std.js
|
@ -1,9 +1,11 @@
|
|||
os.cwd.doc = "Get the absolute path of the current working directory.";
|
||||
os.env.doc = "Return the value of the environment variable v.";
|
||||
|
||||
var projectfile = ".prosperon/project.json";
|
||||
|
||||
var Resources = {};
|
||||
Resources.images = ["png", "jpg", "jpeg", "gif"];
|
||||
Resources.sounds = ["wav", "mp3", "flac"];
|
||||
Resources.sounds = ["wav", "mp3", "flac", "qoa"];
|
||||
Resources.scripts = "js";
|
||||
Resources.is_image = function(path) {
|
||||
var ext = path.ext();
|
||||
|
@ -109,7 +111,6 @@ var console = {
|
|||
console.write(err.name);
|
||||
console.write(err.message);
|
||||
console.write(err.stack);
|
||||
// console.write(stack);
|
||||
},
|
||||
|
||||
clear() {
|
||||
|
@ -148,6 +149,11 @@ console.doc = {
|
|||
"/": game path
|
||||
*/
|
||||
|
||||
var tmp = io.chmod;
|
||||
io.chmod = function(file,mode) {
|
||||
return tmp(file,parseInt(mode,8));
|
||||
}
|
||||
|
||||
io.mixin({
|
||||
extensions(ext) {
|
||||
var paths = io.ls();
|
||||
|
@ -213,7 +219,7 @@ Cmdline.register_order("edit", function() {
|
|||
}
|
||||
|
||||
Game.engine_start(function() {
|
||||
global.mixin(use("scripts/editor.js"));
|
||||
global.mixin("scripts/editor.js");
|
||||
use("editorconfig.js");
|
||||
editor.enter_editor();
|
||||
});
|
||||
|
@ -234,7 +240,7 @@ Cmdline.register_order("init", function() {
|
|||
var project = {};
|
||||
project.version = prosperon.version;
|
||||
project.revision = prosperon.revision;
|
||||
io.slurpwrite(".prosperon/project", json.encode(project));
|
||||
io.slurpwrite(projectfile, json.encode(project));
|
||||
|
||||
}, "Turn the directory into a Prosperon game.");
|
||||
|
||||
|
@ -243,25 +249,25 @@ Cmdline.register_order("debug", function() {
|
|||
}, "Play the game with debugging enabled.");
|
||||
|
||||
Cmdline.register_order("play", function() {
|
||||
if (!io.exists(".prosperon/project")) {
|
||||
if (!io.exists(projectfile)) {
|
||||
say("No game to play. Try making one with 'prosperon init'.");
|
||||
return;
|
||||
}
|
||||
|
||||
var project = json.decode(io.slurp(".prosperon/project"));
|
||||
var project = json.decode(io.slurp(projectfile));
|
||||
global.mixin("config.js");
|
||||
if (project.title) Window.title(project.title);
|
||||
|
||||
Game.engine_start(function() {
|
||||
global.mixin("config.js");
|
||||
global.mixin("game.js");
|
||||
if (project.icon) Window.icon(project.icon);
|
||||
if (project.title) Window.title(project.title);
|
||||
});
|
||||
}, "Play the game present in this folder.");
|
||||
|
||||
Cmdline.register_order("pack", function(str) {
|
||||
var packname;
|
||||
if (str.length === 0)
|
||||
packname = "test.cdb";
|
||||
packname = "game.cdb";
|
||||
else if (str.length > 1) {
|
||||
console.warn("Give me a single filename for the pack.");
|
||||
return;
|
||||
|
@ -271,8 +277,71 @@ Cmdline.register_order("pack", function(str) {
|
|||
say(`Packing into ${packname}`);
|
||||
|
||||
cmd(124, packname);
|
||||
io.chmod(packname, 666);
|
||||
}, "Pack the game into the given name.", "NAME");
|
||||
|
||||
Cmdline.register_order("cdb", function(argv) {
|
||||
var cdb = "game.cdb";
|
||||
if (!io.exists(cdb)) {
|
||||
say(`No 'game.cdb' present.`);
|
||||
return;
|
||||
}
|
||||
if (argv.length === 0) {
|
||||
say(`cdb name: ${cdb}`);
|
||||
|
||||
}
|
||||
}, "CDB commands.");
|
||||
|
||||
Cmdline.register_order("qoa", function(argv) {
|
||||
var sounds = Resources.sounds.filter(x => x !== "qoa");
|
||||
for (var file of argv) {
|
||||
if (!sounds.includes(file.ext())) continue;
|
||||
say(`converting ${file}`);
|
||||
cmd(262,file);
|
||||
}
|
||||
}, "Convert file(s) to qoa.");
|
||||
|
||||
Cmdline.register_order("about", function(argv) {
|
||||
|
||||
if (!argv[0]) {
|
||||
say('About your game');
|
||||
say(`Prosperon version ${prosperon.version}`);
|
||||
say(`Total entities ${ur._list.length}`);
|
||||
}
|
||||
switch (argv[0]) {
|
||||
case "entities":
|
||||
for (var i of ur._list) say(i);
|
||||
break;
|
||||
}
|
||||
}, "Get information about this game.");
|
||||
|
||||
Cmdline.register_order("ur", function(argv) {
|
||||
for (var i of ur._list.sort()) say(i);
|
||||
}, "Get information about the ur types in your game.");
|
||||
|
||||
Cmdline.register_order("env", function(argv) {
|
||||
if (argv.length > 2) return;
|
||||
var gg = json.decode(io.slurp(projectfile));
|
||||
if (argv.length === 0) {
|
||||
say(json.encode(gg,null,1));
|
||||
return;
|
||||
}
|
||||
|
||||
if (argv.length === 1) {
|
||||
var v = gg[argv[0]];
|
||||
if (!v) {
|
||||
say(`Value ${argv[0]} not found.`);
|
||||
return;
|
||||
}
|
||||
say(`${argv[0]}:${v}`);
|
||||
} else {
|
||||
gg[argv[0]] = argv[1];
|
||||
say(`Set ${argv[0]}:${v}`);
|
||||
say(json.encode(gg,null,1));
|
||||
io.slurpwrite(projectfile, json.encode(gg));
|
||||
}
|
||||
}, "Get or set game variables.");
|
||||
|
||||
Cmdline.register_order("unpack", function() {
|
||||
say("Unpacking not implemented.");
|
||||
}, "Unpack this binary's contents into this folder for editing.");
|
||||
|
@ -281,6 +350,32 @@ Cmdline.register_order("build", function() {
|
|||
say("Building not implemented.");
|
||||
}, "Build static assets for this project.");
|
||||
|
||||
Cmdline.register_order("nota", function(argv) {
|
||||
for (var file of argv) {
|
||||
if (!io.exists(file)) {
|
||||
say(`File ${file} does not exist.`);
|
||||
continue;
|
||||
}
|
||||
|
||||
var obj = json.decode(io.slurp(file));
|
||||
var nn = nota.encode(obj);
|
||||
io.slurpwrite(file.set_ext(".nota"), nn);
|
||||
}
|
||||
}, "Create a nota file from a json.");
|
||||
|
||||
Cmdline.register_order("json", function(argv) {
|
||||
for (var file of argv) {
|
||||
if (!io.exists(file)) {
|
||||
say(`File ${file} does not exist.`);
|
||||
continue;
|
||||
}
|
||||
say(file.ext());
|
||||
var obj = nota.decode(io.slurp(file));
|
||||
var nn = json.encode(obj);
|
||||
io.slurpwrite(file.set_ext(".json", nn));
|
||||
}
|
||||
}, "Create a JSON from a nota.");
|
||||
|
||||
Cmdline.register_order("api", function(obj) {
|
||||
if (!obj[0]) {
|
||||
Cmdline.print_order("api");
|
||||
|
@ -381,6 +476,7 @@ function cmd_args(cmdargs)
|
|||
Cmdline.orders[cmds[0]](cmds.slice(1));
|
||||
}
|
||||
|
||||
|
||||
Cmdline.register_order("clean", function(argv) {
|
||||
say("Cleaning not implemented.");
|
||||
}, "Clean up a given object file.", "JSON ...");
|
||||
|
|
|
@ -1448,6 +1448,10 @@ JSValue duk_cmd(JSContext *js, JSValueConst this, int argc, JSValueConst *argv)
|
|||
d1 = slurp_file(str, &plen);
|
||||
return script_run_bytecode(d1, plen);
|
||||
break;
|
||||
case 262:
|
||||
str = js2str(argv[1]);
|
||||
save_qoa(str);
|
||||
break;
|
||||
}
|
||||
|
||||
if (str) JS_FreeCString(js, str);
|
||||
|
@ -1999,6 +2003,14 @@ JSValue js_io_slurpwrite(JSContext *js, JSValueConst this, int argc, JSValue *ar
|
|||
return ret;
|
||||
}
|
||||
|
||||
JSValue js_io_chmod(JSContext *js, JSValueConst this, int argc, JSValue *argv)
|
||||
{
|
||||
char *f = js2str(argv[0]);
|
||||
int mod = js2int(argv[1]);
|
||||
chmod(f, mod);
|
||||
return JS_UNDEFINED;
|
||||
}
|
||||
|
||||
static const JSCFunctionListEntry js_io_funcs[] = {
|
||||
MIST_CFUNC_DEF("exists", 1, js_io_exists),
|
||||
MIST_CFUNC_DEF("ls", 0, js_io_ls),
|
||||
|
@ -2006,6 +2018,7 @@ static const JSCFunctionListEntry js_io_funcs[] = {
|
|||
MIST_CFUNC_DEF("mv", 2, js_io_mv),
|
||||
MIST_CFUNC_DEF("rm", 1, js_io_rm),
|
||||
MIST_CFUNC_DEF("mkdir", 1, js_io_mkdir),
|
||||
MIST_CFUNC_DEF("chmod", 2, js_io_chmod),
|
||||
MIST_CFUNC_DEF("slurp", 1, js_io_slurp),
|
||||
MIST_CFUNC_DEF("slurpbytes", 1, js_io_slurpbytes),
|
||||
MIST_CFUNC_DEF("slurpwrite", 2, js_io_slurpwrite),
|
||||
|
|
|
@ -36,7 +36,7 @@ static struct cdb corecdb;
|
|||
static struct cdb game_cdb;
|
||||
|
||||
void resources_init() {
|
||||
int fd = open("test.cdb", O_RDONLY);
|
||||
int fd = open("game.cdb", O_RDONLY);
|
||||
cdb_init(&game_cdb, fd);
|
||||
cdb_initf(&corecdb, core_cdb, core_cdb_len);
|
||||
}
|
||||
|
@ -254,7 +254,7 @@ int slurp_write(const char *txt, const char *filename, size_t len) {
|
|||
#ifndef __EMSCRIPTEN__
|
||||
static struct cdb_make cdbm;
|
||||
|
||||
static const char *pack_ext[] = {".qoi", ".qoa", ".js", ".wav", ".mp3", ".png", ".sf2", ".midi", ".lvl", ".glsl", ".ttf"};
|
||||
static const char *pack_ext[] = {".qoi", ".qoa", ".js", ".wav", ".mp3", ".png", ".sf2", ".midi", ".lvl", ".glsl", ".ttf", ".json", ".jso"};
|
||||
|
||||
static int ftw_pack(const char *path, const struct stat *sb, int flag)
|
||||
{
|
||||
|
@ -265,7 +265,7 @@ static int ftw_pack(const char *path, const struct stat *sb, int flag)
|
|||
if (!ext)
|
||||
return 0;
|
||||
|
||||
for (int i = 0; i < 11; i++) {
|
||||
for (int i = 0; i < 13; i++) {
|
||||
if (!strcmp(ext, pack_ext[i])) {
|
||||
pack = 1;
|
||||
break;
|
||||
|
@ -288,10 +288,15 @@ void pack_engine(const char *fname)
|
|||
int fd;
|
||||
char *key, *va;
|
||||
unsigned klen, vlen;
|
||||
fd = open(fname, O_RDWR|O_CREAT);
|
||||
fd = creat(fname, O_RDWR);
|
||||
if (fd == -1) {
|
||||
YughError("Couldn't make file at %s.", fname);
|
||||
return;
|
||||
}
|
||||
cdb_make_start(&cdbm, fd);
|
||||
ftw(".", ftw_pack, 20);
|
||||
cdb_make_finish(&cdbm);
|
||||
close(fd);
|
||||
}
|
||||
#else
|
||||
void pack_engine(const char *fname){
|
||||
|
|
|
@ -4,7 +4,6 @@
|
|||
#include "math.h"
|
||||
#include "music.h"
|
||||
#include "resources.h"
|
||||
#include "stb_vorbis.h"
|
||||
#include "string.h"
|
||||
#include "time.h"
|
||||
#include <stdlib.h>
|
||||
|
@ -182,7 +181,6 @@ struct wav *make_sound(const char *wav) {
|
|||
|
||||
if (!strcmp(ext, "wav"))
|
||||
mwav->data = drwav_open_memory_and_read_pcm_frames_f32(raw, rawlen, &mwav->ch, &mwav->samplerate, &mwav->frames, NULL);
|
||||
|
||||
else if (!strcmp(ext, "flac")) {
|
||||
#ifndef NFLAC
|
||||
mwav->data = drflac_open_memory_and_read_pcm_frames_f32(raw, rawlen, &mwav->ch, &mwav->samplerate, &mwav->frames, NULL);
|
||||
|
@ -230,6 +228,22 @@ struct wav *make_sound(const char *wav) {
|
|||
return mwav;
|
||||
}
|
||||
|
||||
void save_qoa(char *file)
|
||||
{
|
||||
wav *wav = make_sound(file);
|
||||
qoa_desc q;
|
||||
q.channels = wav->ch;
|
||||
q.samples = wav->frames;
|
||||
q.samplerate = wav->samplerate;
|
||||
unsigned int len;
|
||||
void *raw = qoa_encode(wav->data, &q, &len);
|
||||
|
||||
file = str_replace_ext(file, ".qoa");
|
||||
slurp_write(raw, file, len);
|
||||
free(raw);
|
||||
free_sound(wav);
|
||||
}
|
||||
|
||||
void free_sound(const char *wav) {
|
||||
struct wav *w = shget(wavhash, wav);
|
||||
if (w == NULL) return;
|
||||
|
|
|
@ -33,10 +33,6 @@ typedef struct mp3 {
|
|||
|
||||
} mp3;
|
||||
|
||||
typedef struct qoa {
|
||||
// struct qoa_desc desc;
|
||||
} qoa;
|
||||
|
||||
void sound_init();
|
||||
void audio_open(const char *device);
|
||||
void audio_close();
|
||||
|
@ -61,4 +57,6 @@ float db2float(float db);
|
|||
float pct2db(float pct);
|
||||
float pct2mult(float pct);
|
||||
|
||||
void save_qoa(char *file);
|
||||
|
||||
#endif
|
||||
|
|
5166
source/engine/thirdparty/stb/include/stb_vorbis.h
vendored
5166
source/engine/thirdparty/stb/include/stb_vorbis.h
vendored
File diff suppressed because it is too large
Load diff
|
@ -259,7 +259,10 @@ static sapp_desc start_desc = {
|
|||
.logger.func = sg_logging,
|
||||
};
|
||||
|
||||
void app_name(const char *name) { sapp_set_window_title(name); }
|
||||
void app_name(const char *name) {
|
||||
start_desc.window_title = strdup(name);
|
||||
sapp_set_window_title(name);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
#ifndef NDEBUG
|
||||
|
|
Loading…
Reference in a new issue