2023-01-04 18:09:42 -06:00
|
|
|
#include "yugine.h"
|
2023-05-12 13:22:05 -05:00
|
|
|
#include "font.h"
|
2023-12-04 13:38:37 -06:00
|
|
|
#include "transform.h"
|
2023-05-12 13:22:05 -05:00
|
|
|
#include "gameobject.h"
|
2022-02-04 11:36:24 -06:00
|
|
|
#include "input.h"
|
2023-09-04 09:48:44 -05:00
|
|
|
#include "render.h"
|
2023-05-12 13:22:05 -05:00
|
|
|
#include "window.h"
|
2023-08-31 17:23:24 -05:00
|
|
|
#include "sound.h"
|
|
|
|
#include "resources.h"
|
2023-12-04 13:38:37 -06:00
|
|
|
#include "spline.h"
|
2023-09-18 07:36:07 -05:00
|
|
|
#include <stdio.h>
|
2023-12-29 19:08:53 -06:00
|
|
|
#include "particle.h"
|
2024-01-02 07:55:22 -06:00
|
|
|
#include "simplex.h"
|
|
|
|
|
2023-08-30 18:22:32 -05:00
|
|
|
#include "datastream.h"
|
2023-03-24 14:01:01 -05:00
|
|
|
|
2023-04-22 14:07:37 -05:00
|
|
|
#include "quickjs/quickjs.h"
|
|
|
|
|
2023-11-03 22:01:30 -05:00
|
|
|
#include "jsffi.h"
|
2023-05-12 13:22:05 -05:00
|
|
|
#include "script.h"
|
2022-12-23 13:48:29 -06:00
|
|
|
|
2022-11-18 12:03:07 -06:00
|
|
|
#include "log.h"
|
2022-11-24 01:54:17 -06:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
2022-12-22 03:50:40 -06:00
|
|
|
#include "2dphysics.h"
|
|
|
|
|
2022-11-24 01:54:17 -06:00
|
|
|
#include <signal.h>
|
|
|
|
#include <time.h>
|
2022-02-04 11:36:24 -06:00
|
|
|
|
2023-11-20 07:49:14 -06:00
|
|
|
#ifdef STEAM
|
2023-11-20 15:57:23 -06:00
|
|
|
#include "steamffi.h"
|
2023-11-20 07:49:14 -06:00
|
|
|
#endif
|
|
|
|
|
2023-11-21 01:07:50 -06:00
|
|
|
#ifdef DISCORD
|
|
|
|
#include "discord.h"
|
|
|
|
#endif
|
|
|
|
|
2022-08-14 14:19:36 -05:00
|
|
|
#include "string.h"
|
|
|
|
|
2023-09-18 21:55:37 -05:00
|
|
|
#include "render.h"
|
2023-09-15 03:37:07 -05:00
|
|
|
|
2023-08-22 22:44:09 -05:00
|
|
|
#include "sokol/sokol_app.h"
|
2023-08-31 03:10:30 -05:00
|
|
|
#include "sokol/sokol_audio.h"
|
2023-09-02 06:53:52 -05:00
|
|
|
#include "sokol/sokol_time.h"
|
2023-09-18 07:36:07 -05:00
|
|
|
#include "sokol/sokol_args.h"
|
2024-03-04 11:15:55 -06:00
|
|
|
#include "sokol/sokol_fetch.h"
|
2023-08-31 13:00:33 -05:00
|
|
|
#include <stb_ds.h>
|
|
|
|
#include <stb_truetype.h>
|
|
|
|
#include "stb_image.h"
|
|
|
|
#include "stb_image_write.h"
|
|
|
|
#include <pl_mpeg.h>
|
|
|
|
|
2023-09-02 06:53:52 -05:00
|
|
|
#include "debug.h"
|
|
|
|
|
|
|
|
static struct d_prof prof_draw;
|
|
|
|
static struct d_prof prof_update;
|
|
|
|
static struct d_prof prof_input;
|
|
|
|
static struct d_prof prof_physics;
|
2023-08-31 13:00:33 -05:00
|
|
|
|
2022-08-12 14:03:56 -05:00
|
|
|
double physlag = 0;
|
2023-09-06 17:48:08 -05:00
|
|
|
double physMS = 1 / 60.f;
|
2023-10-30 17:41:32 -05:00
|
|
|
uint64_t physlast = 0;
|
|
|
|
|
|
|
|
double updateMS = 1/60.f;
|
|
|
|
uint64_t updatelast = 0;
|
2022-02-04 11:36:24 -06:00
|
|
|
|
2023-03-10 13:13:48 -06:00
|
|
|
static int phys_step = 0;
|
2022-08-14 14:19:36 -05:00
|
|
|
|
2023-10-30 17:41:32 -05:00
|
|
|
uint64_t start_t;
|
|
|
|
uint64_t frame_t;
|
2022-12-22 16:58:06 -06:00
|
|
|
|
2024-03-14 14:10:06 -05:00
|
|
|
double timescale = 1.f;
|
2022-12-27 17:54:39 -06:00
|
|
|
|
2023-08-29 17:11:36 -05:00
|
|
|
#define SIM_PLAY 0
|
|
|
|
#define SIM_PAUSE 1
|
|
|
|
#define SIM_STEP 2
|
|
|
|
|
|
|
|
static int sim_play = SIM_PLAY;
|
2023-09-19 12:35:12 -05:00
|
|
|
|
2023-08-31 03:10:30 -05:00
|
|
|
static int argc;
|
|
|
|
static char **args;
|
2022-08-14 14:19:36 -05:00
|
|
|
|
2024-02-23 16:05:30 -06:00
|
|
|
static JSValue c_init_fn;
|
2023-11-27 14:29:55 -06:00
|
|
|
|
2024-03-15 10:51:04 -05:00
|
|
|
static JSValue c_process_fn;
|
|
|
|
|
2024-02-23 16:05:30 -06:00
|
|
|
void c_init() {
|
2024-03-13 16:30:55 -05:00
|
|
|
mainwin.start = 1;
|
2023-10-23 08:08:11 -05:00
|
|
|
script_evalf("world_start();");
|
2023-09-04 09:48:44 -05:00
|
|
|
render_init();
|
2023-09-19 01:10:00 -05:00
|
|
|
window_set_icon("icons/moon.gif");
|
2024-01-01 17:30:42 -06:00
|
|
|
particle_init();
|
2024-02-23 16:05:30 -06:00
|
|
|
|
|
|
|
if (!JS_IsUndefined(c_init_fn))
|
2024-03-15 10:51:04 -05:00
|
|
|
script_call_sym(c_init_fn,0,NULL);
|
2023-08-22 22:44:09 -05:00
|
|
|
}
|
2023-05-12 13:22:05 -05:00
|
|
|
|
2023-12-12 08:46:27 -06:00
|
|
|
int frame_fps() { return 1.0/sapp_frame_duration(); }
|
2023-05-24 20:45:50 -05:00
|
|
|
|
2023-09-19 01:10:00 -05:00
|
|
|
static void process_frame()
|
2023-08-22 22:44:09 -05:00
|
|
|
{
|
2024-03-15 10:51:04 -05:00
|
|
|
script_call_sym(c_process_fn,0,NULL);
|
2023-10-30 17:41:32 -05:00
|
|
|
double elapsed = stm_sec(stm_laptime(&frame_t));
|
2024-03-11 22:23:02 -05:00
|
|
|
script_evalf("prosperon.appupdate(%g);", elapsed);
|
2023-10-31 12:38:23 -05:00
|
|
|
|
2023-12-29 19:08:53 -06:00
|
|
|
emitters_step(elapsed);
|
2023-11-30 10:47:59 -06:00
|
|
|
|
2023-10-31 12:38:23 -05:00
|
|
|
if (sim_play == SIM_PLAY || sim_play == SIM_STEP) {
|
|
|
|
if (stm_sec(stm_diff(frame_t, updatelast)) > updateMS) {
|
2023-10-30 17:41:32 -05:00
|
|
|
double dt = stm_sec(stm_diff(frame_t, updatelast));
|
|
|
|
updatelast = frame_t;
|
2023-12-24 09:14:46 -06:00
|
|
|
|
2023-12-21 17:21:01 -06:00
|
|
|
// prof_start(&prof_update);
|
2024-03-11 22:23:02 -05:00
|
|
|
script_evalf("prosperon.update(%g);", dt*timescale);
|
2023-12-21 17:21:01 -06:00
|
|
|
// prof_lap(&prof_update);
|
2023-09-02 06:53:52 -05:00
|
|
|
|
2023-09-19 12:35:12 -05:00
|
|
|
if (sim_play == SIM_STEP)
|
2023-09-06 17:48:08 -05:00
|
|
|
sim_pause();
|
|
|
|
}
|
2022-01-19 16:43:21 -06:00
|
|
|
|
2023-10-31 12:38:23 -05:00
|
|
|
physlag += elapsed;
|
|
|
|
while (physlag > physMS) {
|
2023-10-30 17:41:32 -05:00
|
|
|
physlag -= physMS;
|
2023-12-21 17:21:01 -06:00
|
|
|
// prof_start(&prof_physics);
|
2023-10-30 17:41:32 -05:00
|
|
|
phys_step = 1;
|
|
|
|
phys2d_update(physMS * timescale);
|
2024-03-11 22:23:02 -05:00
|
|
|
script_evalf("prosperon.physupdate(%g);", physMS*timescale);
|
2023-10-30 17:41:32 -05:00
|
|
|
phys_step = 0;
|
2023-12-21 17:21:01 -06:00
|
|
|
// prof_lap(&prof_physics);
|
2023-10-30 17:41:32 -05:00
|
|
|
}
|
2023-10-31 12:38:23 -05:00
|
|
|
}
|
2023-10-30 17:41:32 -05:00
|
|
|
|
2023-12-21 17:21:01 -06:00
|
|
|
// prof_start(&prof_draw);
|
2023-09-19 12:35:12 -05:00
|
|
|
window_render(&mainwin);
|
2023-12-21 17:21:01 -06:00
|
|
|
// prof_lap(&prof_draw);
|
2023-08-22 22:44:09 -05:00
|
|
|
}
|
|
|
|
|
2023-09-19 01:10:00 -05:00
|
|
|
void c_frame()
|
|
|
|
{
|
2024-03-13 16:30:55 -05:00
|
|
|
if (mainwin.editor) return;
|
2023-09-19 01:10:00 -05:00
|
|
|
process_frame();
|
|
|
|
}
|
|
|
|
|
2024-03-11 15:11:39 -05:00
|
|
|
void cleanup()
|
|
|
|
{
|
2024-02-23 16:05:30 -06:00
|
|
|
out_memusage(".prosperon/jsmem.txt");
|
2023-10-03 17:16:38 -05:00
|
|
|
script_stop();
|
2024-03-11 15:11:39 -05:00
|
|
|
}
|
|
|
|
|
2024-03-14 09:33:15 -05:00
|
|
|
void seghandle()
|
|
|
|
{
|
|
|
|
js_stacktrace();
|
|
|
|
cleanup();
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
2024-03-11 15:11:39 -05:00
|
|
|
void c_clean() {
|
|
|
|
cleanup();
|
|
|
|
gif_rec_end("out.gif");
|
2023-10-03 17:16:38 -05:00
|
|
|
saudio_shutdown();
|
|
|
|
sg_shutdown();
|
2023-09-12 17:19:46 -05:00
|
|
|
};
|
2022-12-22 03:50:40 -06:00
|
|
|
|
2023-08-22 22:44:09 -05:00
|
|
|
void c_event(const sapp_event *e)
|
|
|
|
{
|
|
|
|
switch (e->type) {
|
|
|
|
case SAPP_EVENTTYPE_MOUSE_MOVE:
|
2024-03-13 16:30:55 -05:00
|
|
|
script_evalf("prosperon.mousemove([%g, %g], [%g, %g]);", e->mouse_x, mainwin.size.y -e->mouse_y, e->mouse_dx, -e->mouse_dy);
|
2023-08-22 22:44:09 -05:00
|
|
|
break;
|
|
|
|
|
|
|
|
case SAPP_EVENTTYPE_MOUSE_SCROLL:
|
2024-03-11 22:23:02 -05:00
|
|
|
script_evalf("prosperon.mousescroll([%g, %g]);", e->scroll_x, e->scroll_y);
|
2023-08-22 22:44:09 -05:00
|
|
|
break;
|
|
|
|
|
|
|
|
case SAPP_EVENTTYPE_KEY_DOWN:
|
2024-03-11 22:23:02 -05:00
|
|
|
script_evalf("prosperon.keydown(%d, %d);", e->key_code, e->key_repeat);
|
2023-08-22 22:44:09 -05:00
|
|
|
break;
|
|
|
|
|
|
|
|
case SAPP_EVENTTYPE_KEY_UP:
|
2024-03-11 22:23:02 -05:00
|
|
|
script_evalf("prosperon.keyup(%d);", e->key_code);
|
2023-08-31 02:05:06 -05:00
|
|
|
break;
|
|
|
|
|
|
|
|
case SAPP_EVENTTYPE_MOUSE_UP:
|
2024-03-11 22:23:02 -05:00
|
|
|
script_evalf("prosperon.mouseup(%d);", e->mouse_button);
|
2023-08-31 02:05:06 -05:00
|
|
|
break;
|
|
|
|
|
|
|
|
case SAPP_EVENTTYPE_MOUSE_DOWN:
|
2024-03-11 22:23:02 -05:00
|
|
|
script_evalf("prosperon.mousedown(%d);", e->mouse_button);
|
2023-08-22 22:44:09 -05:00
|
|
|
break;
|
2022-12-29 04:26:21 -06:00
|
|
|
|
2023-08-22 22:44:09 -05:00
|
|
|
case SAPP_EVENTTYPE_CHAR:
|
2024-03-14 16:48:05 -05:00
|
|
|
script_evalf("prosperon.textinput(`%lc`);", e->char_code);
|
2023-08-22 22:44:09 -05:00
|
|
|
break;
|
2023-08-31 02:05:06 -05:00
|
|
|
|
|
|
|
case SAPP_EVENTTYPE_RESIZED:
|
|
|
|
window_resize(e->window_width, e->window_height);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case SAPP_EVENTTYPE_ICONIFIED:
|
|
|
|
window_iconified(1);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case SAPP_EVENTTYPE_RESTORED:
|
|
|
|
window_iconified(0);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case SAPP_EVENTTYPE_FOCUSED:
|
|
|
|
window_focused(1);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case SAPP_EVENTTYPE_UNFOCUSED:
|
|
|
|
window_focused(0);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case SAPP_EVENTTYPE_SUSPENDED:
|
|
|
|
window_suspended(1);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case SAPP_EVENTTYPE_QUIT_REQUESTED:
|
2024-03-11 15:11:39 -05:00
|
|
|
quit();
|
2023-08-31 02:05:06 -05:00
|
|
|
break;
|
2023-12-20 09:19:04 -06:00
|
|
|
|
|
|
|
case SAPP_EVENTTYPE_FILES_DROPPED:
|
|
|
|
input_dropped_files(sapp_get_num_dropped_files());
|
|
|
|
break;
|
2024-03-12 09:01:52 -05:00
|
|
|
|
|
|
|
case SAPP_EVENTTYPE_MOUSE_ENTER:
|
|
|
|
script_evalf("prosperon.mouseenter();");
|
|
|
|
break;
|
|
|
|
case SAPP_EVENTTYPE_MOUSE_LEAVE:
|
|
|
|
script_evalf("prosperon.mouseleave();");
|
|
|
|
break;
|
|
|
|
case SAPP_EVENTTYPE_TOUCHES_BEGAN:
|
|
|
|
touch_start(e->touches, e->num_touches);
|
|
|
|
break;
|
|
|
|
case SAPP_EVENTTYPE_TOUCHES_MOVED:
|
|
|
|
touch_move(e->touches, e->num_touches);
|
|
|
|
break;
|
|
|
|
case SAPP_EVENTTYPE_TOUCHES_ENDED:
|
|
|
|
touch_end(e->touches, e->num_touches);
|
|
|
|
break;
|
|
|
|
case SAPP_EVENTTYPE_TOUCHES_CANCELLED:
|
|
|
|
touch_cancelled(e->touches, e->num_touches);
|
|
|
|
break;
|
|
|
|
case SAPP_EVENTTYPE_CLIPBOARD_PASTED:
|
|
|
|
input_clipboard_paste(sapp_get_clipboard_string());
|
|
|
|
break;
|
2023-12-21 17:21:01 -06:00
|
|
|
default:
|
|
|
|
break;
|
2023-05-12 13:22:05 -05:00
|
|
|
}
|
2023-09-19 01:10:00 -05:00
|
|
|
|
2024-03-13 16:30:55 -05:00
|
|
|
if (mainwin.editor)
|
2023-09-19 01:10:00 -05:00
|
|
|
process_frame();
|
2022-12-29 04:26:21 -06:00
|
|
|
}
|
|
|
|
|
2023-02-28 17:03:28 -06:00
|
|
|
int sim_playing() { return sim_play == SIM_PLAY; }
|
|
|
|
int sim_paused() { return sim_play == SIM_PAUSE; }
|
2023-12-11 08:36:45 -06:00
|
|
|
void sim_start() { sim_play = SIM_PLAY; }
|
|
|
|
void sim_pause() { sim_play = SIM_PAUSE; }
|
2023-08-27 21:57:19 -05:00
|
|
|
int phys_stepping() { return sim_play == SIM_STEP; }
|
2023-12-11 08:36:45 -06:00
|
|
|
void sim_step() { sim_play = SIM_STEP; }
|
2023-08-22 22:44:09 -05:00
|
|
|
|
2023-09-06 12:17:16 -05:00
|
|
|
static sapp_desc start_desc = {
|
|
|
|
.width = 720,
|
|
|
|
.height = 1080,
|
|
|
|
.high_dpi = 0,
|
|
|
|
.sample_count = 1,
|
|
|
|
.fullscreen = 1,
|
2024-03-13 16:30:55 -05:00
|
|
|
.window_title = NULL,
|
2023-09-06 12:17:16 -05:00
|
|
|
.enable_clipboard = false,
|
|
|
|
.clipboard_size = 0,
|
|
|
|
.enable_dragndrop = true,
|
|
|
|
.max_dropped_files = 1,
|
|
|
|
.max_dropped_file_path_length = 2048,
|
|
|
|
.init_cb = c_init,
|
|
|
|
.frame_cb = c_frame,
|
|
|
|
.cleanup_cb = c_clean,
|
|
|
|
.event_cb = c_event,
|
|
|
|
.logger.func = sg_logging,
|
|
|
|
};
|
|
|
|
|
2023-10-23 08:08:11 -05:00
|
|
|
int main(int argc, char **argv) {
|
2023-09-04 09:48:44 -05:00
|
|
|
#ifndef NDEBUG
|
2023-09-13 07:31:00 -05:00
|
|
|
log_init();
|
2024-03-14 09:33:15 -05:00
|
|
|
|
2023-12-22 07:14:44 -06:00
|
|
|
signal(SIGSEGV, seghandle);
|
|
|
|
signal(SIGABRT, seghandle);
|
|
|
|
signal(SIGFPE, seghandle);
|
2024-01-03 08:38:17 -06:00
|
|
|
// signal(SIGBUS, seghandle);
|
2023-12-28 07:57:22 -06:00
|
|
|
|
2023-11-20 07:49:14 -06:00
|
|
|
#endif
|
|
|
|
|
2023-10-23 08:08:11 -05:00
|
|
|
resources_init();
|
2024-03-14 14:10:06 -05:00
|
|
|
stm_setup(); /* time */
|
2024-02-23 16:05:30 -06:00
|
|
|
script_startup();
|
|
|
|
|
2023-09-04 09:48:44 -05:00
|
|
|
int argsize = 0;
|
2023-09-06 17:48:08 -05:00
|
|
|
for (int i = 0; i < argc; i++) {
|
2023-09-05 09:38:52 -05:00
|
|
|
argsize += strlen(argv[i]);
|
2023-09-04 09:48:44 -05:00
|
|
|
if (argc > i+1) argsize++;
|
|
|
|
}
|
|
|
|
|
2023-12-18 17:12:05 -06:00
|
|
|
char cmdstr[argsize+1];
|
2023-09-04 09:48:44 -05:00
|
|
|
cmdstr[0] = '\0';
|
2023-08-22 22:44:09 -05:00
|
|
|
|
2023-09-04 09:48:44 -05:00
|
|
|
for (int i = 0; i < argc; i++) {
|
2023-09-05 09:38:52 -05:00
|
|
|
strcat(cmdstr, argv[i]);
|
2023-09-04 09:48:44 -05:00
|
|
|
if (argc > i+1) strcat(cmdstr, " ");
|
|
|
|
}
|
|
|
|
|
2024-03-04 11:15:55 -06:00
|
|
|
while (!LOADED_GAME)
|
|
|
|
sfetch_dowork();
|
|
|
|
|
|
|
|
script_evalf("cmd_args('%s');", cmdstr);
|
|
|
|
|
2024-02-23 16:05:30 -06:00
|
|
|
out_memusage(".prosperon/jsmem.txt");
|
|
|
|
script_stop();
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2024-03-15 10:51:04 -05:00
|
|
|
void engine_start(JSValue fn, JSValue procfn)
|
2024-02-23 16:05:30 -06:00
|
|
|
{
|
|
|
|
c_init_fn = fn;
|
2024-03-15 10:51:04 -05:00
|
|
|
c_process_fn = procfn;
|
2024-03-14 14:10:06 -05:00
|
|
|
|
2024-02-23 16:05:30 -06:00
|
|
|
start_t = frame_t = stm_now();
|
|
|
|
physlast = updatelast = start_t;
|
|
|
|
sound_init();
|
|
|
|
phys2d_init();
|
|
|
|
|
2024-03-13 16:30:55 -05:00
|
|
|
start_desc.width = mainwin.size.x;
|
|
|
|
start_desc.height = mainwin.size.y;
|
|
|
|
start_desc.window_title = mainwin.title;
|
|
|
|
start_desc.fullscreen = mainwin.fullscreen;
|
2023-10-23 08:08:11 -05:00
|
|
|
sapp_run(&start_desc);
|
2023-08-22 22:44:09 -05:00
|
|
|
}
|
2023-10-30 17:41:32 -05:00
|
|
|
|
2023-12-12 08:46:27 -06:00
|
|
|
double apptime() { return stm_sec(stm_diff(stm_now(), start_t)); }
|
2024-03-11 15:11:39 -05:00
|
|
|
|
|
|
|
void quit() {
|
2024-03-13 16:30:55 -05:00
|
|
|
if (mainwin.start)
|
2024-03-11 15:11:39 -05:00
|
|
|
sapp_quit();
|
|
|
|
else {
|
|
|
|
cleanup();
|
|
|
|
exit(0);
|
|
|
|
}
|
|
|
|
}
|