assaultfish/engine/src/core.c

143 lines
3.1 KiB
C
Raw Normal View History

2026-01-09 00:40:51 +09:00
#include <GearBox/Core.h>
#include <GearBox/Version.h>
#include <GearBox/Log.h>
#include <GearBox/Client.h>
#include <GearBox/Server.h>
2026-01-09 06:12:57 +09:00
#include <GearBox/GL.h>
2026-01-10 00:55:45 +09:00
#include <GearBox/Resource.h>
#include <stb_ds.h>
2026-01-09 03:38:29 +09:00
2026-01-09 00:40:51 +09:00
void GBInit(void) {
GBVersion version;
GBVersionGet(&version);
GBLog(GBLogInfo, "GearBox Engine %s", version.string);
2026-01-09 06:12:57 +09:00
gload_init();
2026-01-09 00:40:51 +09:00
}
2026-01-10 18:23:33 +09:00
int GBEngineRegisterResource(GBEngine engine, const char* name, const char* path) {
2026-01-10 00:55:45 +09:00
GBResource resource;
2026-01-10 18:23:33 +09:00
if((resource = GBResourceOpen(engine, path)) != NULL) {
shput(engine->resource, name, resource);
return 1;
}
return 0;
}
GBEngine GBEngineCreate(GBEngineParam* param) {
GBEngine engine = malloc(sizeof(*engine));
2026-01-09 00:40:51 +09:00
memset(engine, 0, sizeof(*engine));
2026-01-09 03:38:29 +09:00
engine->param = malloc(sizeof(*engine->param));
memcpy(engine->param, param, sizeof(*param));
2026-01-11 01:36:32 +09:00
engine->width = 1024;
engine->height = 768;
if(param->ready != NULL && param->client) {
param->ready(engine->width, engine->height);
2026-01-09 03:38:29 +09:00
}
2026-01-10 00:55:45 +09:00
sh_new_strdup(engine->resource);
2026-01-10 18:23:33 +09:00
GBEngineRegisterResource(engine, "base", "base.pak");
GBEngineRegisterResource(engine, "game", "game.pak");
2026-01-10 00:55:45 +09:00
2026-01-09 00:40:51 +09:00
if(engine != NULL && param->client && (engine->client = GBClientCreate(engine)) == NULL) {
GBLog(GBLogError, "Failed to create client");
GBEngineDestroy(engine);
engine = NULL;
}
if(engine != NULL && param->server && (engine->server = GBServerCreate(engine)) == NULL) {
GBLog(GBLogError, "Failed to create server");
GBEngineDestroy(engine);
engine = NULL;
}
if(engine == NULL) {
GBLog(GBLogError, "Failed to create engine");
}
return engine;
}
void GBEngineDestroy(GBEngine engine) {
2026-01-10 01:59:34 +09:00
int i;
for(i = 0; i < shlen(engine->resource); i++) {
GBResourceClose(engine->resource[i].value);
}
2026-01-10 00:55:45 +09:00
shfree(engine->resource);
2026-01-09 00:40:51 +09:00
if(engine->server != NULL) GBServerDestroy(engine->server);
if(engine->client != NULL) GBClientDestroy(engine->client);
2026-01-09 03:38:29 +09:00
if(engine->param != NULL) free(engine->param);
2026-01-09 00:40:51 +09:00
free(engine);
}
2026-01-09 03:38:29 +09:00
void GBEngineParamInit(GBEngineParam* param) {
memset(param, 0, sizeof(*param));
2026-01-09 06:12:57 +09:00
param->server = 0;
param->client = 1;
param->gl_swapbuffer = NULL;
param->ready = NULL;
param->sleep = NULL;
param->get_tick = NULL;
2026-01-09 00:40:51 +09:00
}
void GBEngineLoop(GBEngine engine) {
2026-01-09 03:38:29 +09:00
long t = 0;
int wait_actually = 0;
int more = 0;
long wait = 1000 / 50.0;
if(engine->param->sleep == NULL || engine->param->get_tick == NULL) {
GBLog(GBLogWarn, "sleep and/or get_tick parameter are missing!");
GBLog(GBLogWarn, "This will result game to be crazy fast!!!");
} else {
t = engine->param->get_tick();
wait_actually = 1;
}
while(1) {
2026-01-09 06:12:57 +09:00
if(engine->client != NULL) GBClientStep(engine->client);
if(engine->server != NULL) GBServerStep(engine->server);
2026-01-09 03:38:29 +09:00
if(engine->param->tick != NULL) engine->param->tick();
if(wait_actually) {
int diff = (wait - more) - (engine->param->get_tick() - t);
if(diff > 0) {
engine->param->sleep(diff);
}
more -= diff;
if(more < 0) more = 0;
t = engine->param->get_tick();
}
}
}
GBClient GBEngineGetClient(GBEngine engine) {
return engine->client;
}
GBServer GBEngineGetServer(GBEngine engine) {
return engine->server;
2026-01-09 00:40:51 +09:00
}