diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..45739bd --- /dev/null +++ b/.gitignore @@ -0,0 +1,16 @@ +*.d +*.o +*.a +*.lib +*.dll +*.so +*.so.* +*.dylib +*.exe +*.out +*.dSYM/ +*.su +*.idb +*.pdb +obj/ +bin/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..a479491 --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ +# scaffold + +A game engine template built on skele and stk. + diff --git a/bmake.mk b/bmake.mk new file mode 100644 index 0000000..24f9245 --- /dev/null +++ b/bmake.mk @@ -0,0 +1,139 @@ +.include "config.mk" + +GL_LIB = -lGL +LDFLAGS_PLAT = -L/usr/local/lib +CFLAGS_PLAT = -I/usr/local/include +SKELE_INC = +SKELE_LIB = + +CLIENT_BIN = ${GAME_NAME}_client +GLCLIENT_BIN = ${GAME_NAME}_glclient +SERVER_BIN = ${GAME_NAME}_server + +.if ${LINK_TYPE:Ustatic} == "dynamic" +LINK_SKELE = -lskele +LINK_GLSKELE = -lglskele +LINK_SKELESRV = -lskeleserver +LINK_STK = -lstk +.else +LINK_SKELE = -Wl,-Bstatic -lskele -Wl,-Bdynamic +LINK_GLSKELE = -Wl,-Bstatic -lglskele -Wl,-Bdynamic +LINK_SKELESRV = -Wl,-Bstatic -lskeleserver -Wl,-Bdynamic +LINK_STK = -Wl,-Bstatic -lstk -Wl,-Bdynamic +.endif + +CFLAGS_BASE = -Wall -Wpedantic -I${.CURDIR}/${INC_DIR} ${SKELE_INC} \ + -std=c99 ${CFLAGS_PLAT} ${DEBUG_FLAGS} + +SOFT_CLIENT_SRCS = src/client/main.c +GL_CLIENT_SRCS = src/gl_client/main.c +SERVER_SRCS = src/server/main.c + +ALL_SOFT_SRCS = ${GAME_SRCS} ${SOFT_CLIENT_SRCS} +ALL_GL_SRCS = ${GAME_SRCS} ${GL_CLIENT_SRCS} +ALL_SERVER_SRCS = ${GAME_SRCS} ${SERVER_SRCS} + +SOFT_DEBUG_OBJS = ${ALL_SOFT_SRCS:S/.c$/.o/:S/^/${.CURDIR}\/obj\/debug\/soft\//} +GL_DEBUG_OBJS = ${ALL_GL_SRCS:S/.c$/.o/:S/^/${.CURDIR}\/obj\/debug\/gl\//} +SERVER_DEBUG_OBJS = ${ALL_SERVER_SRCS:S/.c$/.o/:S/^/${.CURDIR}\/obj\/debug\/server\//} + +SOFT_RELEASE_OBJS = ${ALL_SOFT_SRCS:S/.c$/.o/:S/^/${.CURDIR}\/obj\/release\/soft\//} +GL_RELEASE_OBJS = ${ALL_GL_SRCS:S/.c$/.o/:S/^/${.CURDIR}\/obj\/release\/gl\//} +SERVER_RELEASE_OBJS = ${ALL_SERVER_SRCS:S/.c$/.o/:S/^/${.CURDIR}\/obj\/release\/server\//} + +PREFIX ?= /usr/local +MODE ?= debug + +.PHONY: all debug release client glclient server install uninstall clean run run_gl + +all: debug + +debug: ${.CURDIR}/${BIN_DIR}/debug/${CLIENT_BIN} \ + ${.CURDIR}/${BIN_DIR}/debug/${GLCLIENT_BIN} \ + ${.CURDIR}/${BIN_DIR}/debug/${SERVER_BIN} + +release: ${.CURDIR}/${BIN_DIR}/release/${CLIENT_BIN} \ + ${.CURDIR}/${BIN_DIR}/release/${GLCLIENT_BIN} \ + ${.CURDIR}/${BIN_DIR}/release/${SERVER_BIN} + +client: ${.CURDIR}/${BIN_DIR}/debug/${CLIENT_BIN} +glclient: ${.CURDIR}/${BIN_DIR}/debug/${GLCLIENT_BIN} +server: ${.CURDIR}/${BIN_DIR}/debug/${SERVER_BIN} + +run: client + ${.CURDIR}/${BIN_DIR}/debug/${CLIENT_BIN} + +run_gl: glclient + ${.CURDIR}/${BIN_DIR}/debug/${GLCLIENT_BIN} + +${.CURDIR}/${BIN_DIR}/debug/${CLIENT_BIN}: ${SOFT_DEBUG_OBJS} + @mkdir -p ${.TARGET:H} + ${CC} -o ${.TARGET} ${.ALLSRC} ${SKELE_LIB} ${LINK_SKELE} ${LINK_STK} -lSDL3 ${LDFLAGS_PLAT} + +${.CURDIR}/${BIN_DIR}/debug/${GLCLIENT_BIN}: ${GL_DEBUG_OBJS} + @mkdir -p ${.TARGET:H} + ${CC} -o ${.TARGET} ${.ALLSRC} ${SKELE_LIB} ${LINK_GLSKELE} ${LINK_STK} -lSDL3 ${GL_LIB} ${LDFLAGS_PLAT} + +${.CURDIR}/${BIN_DIR}/debug/${SERVER_BIN}: ${SERVER_DEBUG_OBJS} + @mkdir -p ${.TARGET:H} + ${CC} -o ${.TARGET} ${.ALLSRC} ${SKELE_LIB} ${LINK_SKELESRV} ${LINK_STK} ${LDFLAGS_PLAT} + +${.CURDIR}/${BIN_DIR}/release/${CLIENT_BIN}: ${SOFT_RELEASE_OBJS} + @mkdir -p ${.TARGET:H} + ${CC} -s -o ${.TARGET} ${.ALLSRC} ${SKELE_LIB} ${LINK_SKELE} ${LINK_STK} -lSDL3 ${LDFLAGS_PLAT} + +${.CURDIR}/${BIN_DIR}/release/${GLCLIENT_BIN}: ${GL_RELEASE_OBJS} + @mkdir -p ${.TARGET:H} + ${CC} -s -o ${.TARGET} ${.ALLSRC} ${SKELE_LIB} ${LINK_GLSKELE} ${LINK_STK} -lSDL3 ${GL_LIB} ${LDFLAGS_PLAT} + +${.CURDIR}/${BIN_DIR}/release/${SERVER_BIN}: ${SERVER_RELEASE_OBJS} + @mkdir -p ${.TARGET:H} + ${CC} -s -o ${.TARGET} ${.ALLSRC} ${SKELE_LIB} ${LINK_SKELESRV} ${LINK_STK} ${LDFLAGS_PLAT} + +.for _src in ${ALL_SOFT_SRCS} +${.CURDIR}/obj/debug/soft/${_src:S/.c$/.o/}: ${_src} + @mkdir -p ${.TARGET:H} + ${CC} ${CFLAGS_BASE} -g -O0 -MMD -MP -MT ${.TARGET} -MF ${.TARGET:S/.o$/.d/} -c ${.ALLSRC} -o ${.TARGET} +${.CURDIR}/obj/release/soft/${_src:S/.c$/.o/}: ${_src} + @mkdir -p ${.TARGET:H} + ${CC} ${CFLAGS_BASE} -O2 -MMD -MP -MT ${.TARGET} -MF ${.TARGET:S/.o$/.d/} -c ${.ALLSRC} -o ${.TARGET} +.endfor + +.for _src in ${ALL_GL_SRCS} +${.CURDIR}/obj/debug/gl/${_src:S/.c$/.o/}: ${_src} + @mkdir -p ${.TARGET:H} + ${CC} ${CFLAGS_BASE} -g -O0 -MMD -MP -MT ${.TARGET} -MF ${.TARGET:S/.o$/.d/} -c ${.ALLSRC} -o ${.TARGET} +${.CURDIR}/obj/release/gl/${_src:S/.c$/.o/}: ${_src} + @mkdir -p ${.TARGET:H} + ${CC} ${CFLAGS_BASE} -O2 -MMD -MP -MT ${.TARGET} -MF ${.TARGET:S/.o$/.d/} -c ${.ALLSRC} -o ${.TARGET} +.endfor + +.for _src in ${ALL_SERVER_SRCS} +${.CURDIR}/obj/debug/server/${_src:S/.c$/.o/}: ${_src} + @mkdir -p ${.TARGET:H} + ${CC} ${CFLAGS_BASE} -g -O0 -MMD -MP -MT ${.TARGET} -MF ${.TARGET:S/.o$/.d/} -c ${.ALLSRC} -o ${.TARGET} +${.CURDIR}/obj/release/server/${_src:S/.c$/.o/}: ${_src} + @mkdir -p ${.TARGET:H} + ${CC} ${CFLAGS_BASE} -O2 -MMD -MP -MT ${.TARGET} -MF ${.TARGET:S/.o$/.d/} -c ${.ALLSRC} -o ${.TARGET} +.endfor + +.-include "obj/debug/soft/*.d" +.-include "obj/debug/gl/*.d" +.-include "obj/debug/server/*.d" +.-include "obj/release/soft/*.d" +.-include "obj/release/gl/*.d" +.-include "obj/release/server/*.d" + +install: + install -d ${PREFIX}/bin + install -m 755 ${.CURDIR}/${BIN_DIR}/release/${CLIENT_BIN} ${PREFIX}/bin/${CLIENT_BIN} + install -m 755 ${.CURDIR}/${BIN_DIR}/release/${GLCLIENT_BIN} ${PREFIX}/bin/${GLCLIENT_BIN} + install -m 755 ${.CURDIR}/${BIN_DIR}/release/${SERVER_BIN} ${PREFIX}/bin/${SERVER_BIN} + +uninstall: + rm -f ${PREFIX}/bin/${CLIENT_BIN} + rm -f ${PREFIX}/bin/${GLCLIENT_BIN} + rm -f ${PREFIX}/bin/${SERVER_BIN} + +clean: + rm -rf ${.CURDIR}/${OBJ_DIR} ${.CURDIR}/${BIN_DIR} diff --git a/build.bat b/build.bat new file mode 100644 index 0000000..3384c4a --- /dev/null +++ b/build.bat @@ -0,0 +1,16 @@ +@echo off +if "%1"=="run" ( + if "%2"=="" ( + make -f gmake.mk run MODE=debug + ) else ( + make -f gmake.mk run MODE=%2 + ) +) else if "%1"=="run_gl" ( + if "%2"=="" ( + make -f gmake.mk run_gl MODE=debug + ) else ( + make -f gmake.mk run_gl MODE=%2 + ) +) else ( + make -f gmake.mk %* +) diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..a80e2bb --- /dev/null +++ b/build.sh @@ -0,0 +1,51 @@ +#!/bin/sh + +OS=$(uname -s | tr '[:upper:]' '[:lower:]') + +if [ "$OS" = "freebsd" ]; then + MK_FILE="bmake.mk" +else + MK_FILE="gmake.mk" +fi + +if grep -q "Raspberry Pi 5" /proc/device-tree/model 2>/dev/null; then + GL_MAJOR=3 + GL_MINOR=1 +else + GL_MAJOR=3 + GL_MINOR=3 +fi + +HAS_INSTALL=0 +HAS_UNINSTALL=0 +for arg in "$@"; do + case "$arg" in + install) HAS_INSTALL=1 ;; + uninstall) HAS_UNINSTALL=1 ;; + esac +done + +if [ "$HAS_INSTALL" = "1" ] || [ "$HAS_UNINSTALL" = "1" ]; then + if [ "$HAS_INSTALL" = "1" ]; then + make -f "$MK_FILE" release GL_MAJOR=$GL_MAJOR GL_MINOR=$GL_MINOR + fi + + if [ "$(id -u)" = "0" ]; then + PRIV="" + elif command -v doas > /dev/null 2>&1; then + PRIV="doas" + elif command -v sudo > /dev/null 2>&1; then + PRIV="sudo" + else + echo "error: install requires root. neither doas nor sudo found." >&2 + exit 1 + fi + + $PRIV make -f "$MK_FILE" "$@" GL_MAJOR=$GL_MAJOR GL_MINOR=$GL_MINOR +elif [ "$1" = "run" ]; then + make -f "$MK_FILE" run GL_MAJOR=$GL_MAJOR GL_MINOR=$GL_MINOR +elif [ "$1" = "run_gl" ]; then + make -f "$MK_FILE" run_gl GL_MAJOR=$GL_MAJOR GL_MINOR=$GL_MINOR +else + make -f "$MK_FILE" "$@" GL_MAJOR=$GL_MAJOR GL_MINOR=$GL_MINOR +fi diff --git a/compile_flags.txt b/compile_flags.txt new file mode 100644 index 0000000..4d5589f --- /dev/null +++ b/compile_flags.txt @@ -0,0 +1,6 @@ +-std=c99 +-Wall +-Wpedantic +-Iinclude +-I/usr/include/skele +-I/usr/local/include/skele diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..22643df --- /dev/null +++ b/config.mk @@ -0,0 +1,13 @@ +GAME_NAME = game + +SRC_DIR = src +INC_DIR = include +OBJ_DIR = obj +BIN_DIR = bin + +LINK_TYPE ?= static + +GAME_SRCS = \ + src/game.c + +DEBUG_FLAGS ?= diff --git a/gmake.mk b/gmake.mk new file mode 100644 index 0000000..ad1db25 --- /dev/null +++ b/gmake.mk @@ -0,0 +1,174 @@ +ifeq ($(OS),Windows_NT) + CLOCK_SRC := src/platform/clock/win32.c +else + CLOCK_SRC := src/platform/clock/posix.c +endif + +include config.mk + +ifeq ($(OS),Windows_NT) + SHELL := cmd.exe + GL_LIB := -lopengl32 + LDFLAGS_PLAT := + CFLAGS_PLAT := + SKELE_INC := -I"C:/mingw64/include" + SKELE_LIB := -L"C:/mingw64/lib" + CLIENT_BIN := $(GAME_NAME)_client.exe + GLCLIENT_BIN := $(GAME_NAME)_glclient.exe + SERVER_BIN := $(GAME_NAME)_server.exe + MKDIR = if not exist $(subst /,\,$(1)) mkdir $(subst /,\,$(1)) + RMDIR = if exist $(subst /,\,$(1)) rd /s /q $(subst /,\,$(1)) +else ifeq ($(shell uname),FreeBSD) + GL_LIB := -lGL + LDFLAGS_PLAT := -L/usr/local/lib + CFLAGS_PLAT := -I/usr/local/include + SKELE_INC := + SKELE_LIB := + CLIENT_BIN := $(GAME_NAME)_client + GLCLIENT_BIN := $(GAME_NAME)_glclient + SERVER_BIN := $(GAME_NAME)_server + MKDIR = mkdir -p $(1) + RMDIR = rm -rf $(1) +else + GL_LIB := -lGL + LDFLAGS_PLAT := + CFLAGS_PLAT := + SKELE_INC := + SKELE_LIB := + CLIENT_BIN := $(GAME_NAME)_client + GLCLIENT_BIN := $(GAME_NAME)_glclient + SERVER_BIN := $(GAME_NAME)_server + MKDIR = mkdir -p $(1) + RMDIR = rm -rf $(1) +endif + +# linking +ifeq ($(LINK_TYPE),dynamic) + LINK_SKELE := -lskele + LINK_GLSKELE := -lglskele + LINK_SKELESRV := -lskeleserver + LINK_STK := -lstk +else + LINK_SKELE := -Wl,-Bstatic -lskele -Wl,-Bdynamic + LINK_GLSKELE := -Wl,-Bstatic -lglskele -Wl,-Bdynamic + LINK_SKELESRV := -Wl,-Bstatic -lskeleserver -Wl,-Bdynamic + LINK_STK := -Wl,-Bstatic -lstk -Wl,-Bdynamic +endif + +RELEASE_LDFLAGS := -s +CFLAGS_BASE := -Wall -Wpedantic -I$(INC_DIR) -Iskele/include $(SKELE_INC) \ + -std=c99 $(CFLAGS_PLAT) $(DEBUG_FLAGS) + +SOFT_CLIENT_SRCS := src/client/main.c +GL_CLIENT_SRCS := src/gl_client/main.c +SERVER_SRCS := src/server/main.c + +ALL_SOFT_SRCS := $(GAME_SRCS) $(SOFT_CLIENT_SRCS) +ALL_GL_SRCS := $(GAME_SRCS) $(GL_CLIENT_SRCS) +ALL_SERVER_SRCS := $(GAME_SRCS) $(SERVER_SRCS) + +SOFT_DEBUG_OBJS := $(ALL_SOFT_SRCS:%.c=obj/debug/soft/%.o) +GL_DEBUG_OBJS := $(ALL_GL_SRCS:%.c=obj/debug/gl/%.o) +SERVER_DEBUG_OBJS := $(ALL_SERVER_SRCS:%.c=obj/debug/server/%.o) + +SOFT_RELEASE_OBJS := $(ALL_SOFT_SRCS:%.c=obj/release/soft/%.o) +GL_RELEASE_OBJS := $(ALL_GL_SRCS:%.c=obj/release/gl/%.o) +SERVER_RELEASE_OBJS := $(ALL_SERVER_SRCS:%.c=obj/release/server/%.o) + +PREFIX ?= /usr +MODE ?= debug + +.PHONY: all debug release client glclient server \ + install uninstall clean run run_gl + +all: debug + +debug: \ + $(BIN_DIR)/debug/$(CLIENT_BIN) \ + $(BIN_DIR)/debug/$(GLCLIENT_BIN) \ + $(BIN_DIR)/debug/$(SERVER_BIN) + +release: \ + $(BIN_DIR)/release/$(CLIENT_BIN) \ + $(BIN_DIR)/release/$(GLCLIENT_BIN) \ + $(BIN_DIR)/release/$(SERVER_BIN) + +client: $(BIN_DIR)/debug/$(CLIENT_BIN) +glclient: $(BIN_DIR)/debug/$(GLCLIENT_BIN) +server: $(BIN_DIR)/debug/$(SERVER_BIN) + +run: client + $(BIN_DIR)/debug/$(CLIENT_BIN) + +run_gl: glclient + $(BIN_DIR)/debug/$(GLCLIENT_BIN) + +$(BIN_DIR)/debug/$(CLIENT_BIN): $(SOFT_DEBUG_OBJS) + @$(call MKDIR,$(@D)) + $(CC) -o $@ $^ $(SKELE_LIB) $(LINK_SKELE) $(LINK_STK) -lSDL3 $(LDFLAGS_PLAT) + +$(BIN_DIR)/debug/$(GLCLIENT_BIN): $(GL_DEBUG_OBJS) + @$(call MKDIR,$(@D)) + $(CC) -o $@ $^ $(SKELE_LIB) $(LINK_GLSKELE) $(LINK_STK) -lSDL3 $(GL_LIB) $(LDFLAGS_PLAT) + +$(BIN_DIR)/debug/$(SERVER_BIN): $(SERVER_DEBUG_OBJS) + @$(call MKDIR,$(@D)) + $(CC) -o $@ $^ $(SKELE_LIB) $(LINK_SKELESRV) $(LINK_STK) $(LDFLAGS_PLAT) + +$(BIN_DIR)/release/$(CLIENT_BIN): $(SOFT_RELEASE_OBJS) + @$(call MKDIR,$(@D)) + $(CC) $(RELEASE_LDFLAGS) -o $@ $^ $(SKELE_LIB) $(LINK_SKELE) $(LINK_STK) -lSDL3 $(LDFLAGS_PLAT) + +$(BIN_DIR)/release/$(GLCLIENT_BIN): $(GL_RELEASE_OBJS) + @$(call MKDIR,$(@D)) + $(CC) $(RELEASE_LDFLAGS) -o $@ $^ $(SKELE_LIB) $(LINK_GLSKELE) $(LINK_STK) -lSDL3 $(GL_LIB) $(LDFLAGS_PLAT) + +$(BIN_DIR)/release/$(SERVER_BIN): $(SERVER_RELEASE_OBJS) + @$(call MKDIR,$(@D)) + $(CC) $(RELEASE_LDFLAGS) -o $@ $^ $(SKELE_LIB) $(LINK_SKELESRV) $(LINK_STK) $(LDFLAGS_PLAT) + +obj/debug/soft/%.o: %.c + @$(call MKDIR,$(@D)) + $(CC) $(CFLAGS_BASE) -g -O0 -MMD -MP -c $< -o $@ + +obj/debug/gl/%.o: %.c + @$(call MKDIR,$(@D)) + $(CC) $(CFLAGS_BASE) -g -O0 -MMD -MP -c $< -o $@ + +obj/debug/server/%.o: %.c + @$(call MKDIR,$(@D)) + $(CC) $(CFLAGS_BASE) -g -O0 -MMD -MP -c $< -o $@ + +obj/release/soft/%.o: %.c + @$(call MKDIR,$(@D)) + $(CC) $(CFLAGS_BASE) -O2 -MMD -MP -c $< -o $@ + +obj/release/gl/%.o: %.c + @$(call MKDIR,$(@D)) + $(CC) $(CFLAGS_BASE) -O2 -MMD -MP -c $< -o $@ + +obj/release/server/%.o: %.c + @$(call MKDIR,$(@D)) + $(CC) $(CFLAGS_BASE) -O2 -MMD -MP -c $< -o $@ + +-include $(wildcard obj/debug/soft/*.d) +-include $(wildcard obj/debug/gl/*.d) +-include $(wildcard obj/debug/server/*.d) +-include $(wildcard obj/release/soft/*.d) +-include $(wildcard obj/release/gl/*.d) +-include $(wildcard obj/release/server/*.d) + +install: + install -d $(PREFIX)/bin + install -m 755 $(BIN_DIR)/release/$(CLIENT_BIN) $(PREFIX)/bin/$(CLIENT_BIN) + install -m 755 $(BIN_DIR)/release/$(GLCLIENT_BIN) $(PREFIX)/bin/$(GLCLIENT_BIN) + install -m 755 $(BIN_DIR)/release/$(SERVER_BIN) $(PREFIX)/bin/$(SERVER_BIN) + +uninstall: + rm -f $(PREFIX)/bin/$(CLIENT_BIN) + rm -f $(PREFIX)/bin/$(GLCLIENT_BIN) + rm -f $(PREFIX)/bin/$(SERVER_BIN) + +clean: + @$(call RMDIR,$(OBJ_DIR)) + @$(call RMDIR,$(BIN_DIR)) diff --git a/include/game.h b/include/game.h new file mode 100644 index 0000000..5c7a65e --- /dev/null +++ b/include/game.h @@ -0,0 +1,18 @@ +#ifndef GAME_H +#define GAME_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +uint8_t game_init(void); +void game_shutdown(void); +void game_tick(void); + +#ifdef __cplusplus +} +#endif + +#endif /* GAME_H */ diff --git a/src/client/main.c b/src/client/main.c new file mode 100644 index 0000000..83ad5af --- /dev/null +++ b/src/client/main.c @@ -0,0 +1,75 @@ +#include "game.h" +#include +#include +#include +#include +#include + +static uint8_t running = 1; + +static void on_signal(void) { running = 0; } + +int main(int argc, char *argv[]) +{ + skele_video_config_t video_cfg; + uint64_t last, now, elapsed; + + (void)argc; + (void)argv; + + skele_clock_init(on_signal); + + if (skele_stk_setup() != SKELE_INIT_SUCCESS) + return 1; + + if (skele_init() != SKELE_INIT_SUCCESS) { + skele_stk_teardown(); + return 1; + } + + video_cfg.render_width = SKELE_DEFAULT_RENDER_WIDTH; + video_cfg.render_height = SKELE_DEFAULT_RENDER_HEIGHT; + video_cfg.window_width = 0; + video_cfg.window_height = 0; + video_cfg.flags = 0; + + if (skele_video_init(video_cfg) != SKELE_INIT_SUCCESS) { + skele_stk_teardown(); + skele_shutdown(); + return 1; + } + + skele_video_set_title("game"); + + if (!game_init()) { + skele_video_shutdown(); + skele_stk_teardown(); + skele_shutdown(); + return 1; + } + + last = skele_time_ns(); + + while (running) { + if (!skele_input_poll()) + break; + + stk_poll(); + + now = skele_time_ns(); + elapsed = now - last; + + if (elapsed >= skele_tick_ns) { + game_tick(); + last = now; + } + + skele_video_present(); + } + + game_shutdown(); + skele_video_shutdown(); + skele_stk_teardown(); + skele_shutdown(); + return 0; +} diff --git a/src/game.c b/src/game.c new file mode 100644 index 0000000..9db828d --- /dev/null +++ b/src/game.c @@ -0,0 +1,5 @@ +#include "game.h" + +uint8_t game_init(void) { return 1; } +void game_shutdown(void) {} +void game_tick(void) {} diff --git a/src/gl_client/main.c b/src/gl_client/main.c new file mode 100644 index 0000000..83ad5af --- /dev/null +++ b/src/gl_client/main.c @@ -0,0 +1,75 @@ +#include "game.h" +#include +#include +#include +#include +#include + +static uint8_t running = 1; + +static void on_signal(void) { running = 0; } + +int main(int argc, char *argv[]) +{ + skele_video_config_t video_cfg; + uint64_t last, now, elapsed; + + (void)argc; + (void)argv; + + skele_clock_init(on_signal); + + if (skele_stk_setup() != SKELE_INIT_SUCCESS) + return 1; + + if (skele_init() != SKELE_INIT_SUCCESS) { + skele_stk_teardown(); + return 1; + } + + video_cfg.render_width = SKELE_DEFAULT_RENDER_WIDTH; + video_cfg.render_height = SKELE_DEFAULT_RENDER_HEIGHT; + video_cfg.window_width = 0; + video_cfg.window_height = 0; + video_cfg.flags = 0; + + if (skele_video_init(video_cfg) != SKELE_INIT_SUCCESS) { + skele_stk_teardown(); + skele_shutdown(); + return 1; + } + + skele_video_set_title("game"); + + if (!game_init()) { + skele_video_shutdown(); + skele_stk_teardown(); + skele_shutdown(); + return 1; + } + + last = skele_time_ns(); + + while (running) { + if (!skele_input_poll()) + break; + + stk_poll(); + + now = skele_time_ns(); + elapsed = now - last; + + if (elapsed >= skele_tick_ns) { + game_tick(); + last = now; + } + + skele_video_present(); + } + + game_shutdown(); + skele_video_shutdown(); + skele_stk_teardown(); + skele_shutdown(); + return 0; +} diff --git a/src/server/main.c b/src/server/main.c new file mode 100644 index 0000000..0ed2d1c --- /dev/null +++ b/src/server/main.c @@ -0,0 +1,49 @@ +#include "game.h" +#include +#include +#include + +static uint8_t running = 1; + +static void on_signal(void) { running = 0; } + +int main(int argc, char *argv[]) +{ + uint64_t tick_start; + uint64_t elapsed; + + (void)argc; + (void)argv; + + skele_clock_init(on_signal); + + if (skele_stk_setup() != SKELE_INIT_SUCCESS) + return 1; + + if (skele_init() != SKELE_INIT_SUCCESS) { + skele_stk_teardown(); + return 1; + } + + if (!game_init()) { + skele_stk_teardown(); + skele_shutdown(); + return 1; + } + + while (running) { + tick_start = skele_time_ns(); + + stk_poll(); + game_tick(); + + elapsed = skele_time_ns() - tick_start; + if (elapsed < skele_tick_ns) + skele_sleep_ns(skele_tick_ns - elapsed); + } + + game_shutdown(); + skele_stk_teardown(); + skele_shutdown(); + return 0; +}