tuxanci2-engine
Game engine for tuxanci2
Log | Files | Refs | README | LICENSE
commit 3d85c968743fbdddb4b7d24326501bb858300c39
parent ccfcc639a03022d80d16d4f9b7ac56c6014b1577
Author: Connor Thomson <connor@gnufault.org>
Date: Sun, 18 Oct 2026 15:21:01 -0700
Add xbox target
Diffstat:
4 files changed, 106 insertions(+), 0 deletions(-)
diff --git a/.gitmodules b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "platforms/xbox/nxdk"]
+ path = platforms/xbox/nxdk
+ url = https://github.com/XboxDev/nxdk.git
diff --git a/platforms/xbox/.gitignore b/platforms/xbox/.gitignore
@@ -0,0 +1,2 @@
+tuxanci2.iso
+nxdk
diff --git a/platforms/xbox/Makefile b/platforms/xbox/Makefile
@@ -0,0 +1,52 @@
+MAKEFILE_DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
+ROOT_DIR := $(abspath $(MAKEFILE_DIR)/../..)
+
+NXDK_DIR ?= $(MAKEFILE_DIR)nxdk
+NXDK_DIR := $(abspath $(NXDK_DIR))
+export NXDK_DIR
+export PATH := $(NXDK_DIR)/bin:$(PATH)
+XBOX_BUILD_DIR ?= $(ROOT_DIR)/build/xbox
+XBOX_BUILD_DIR := $(abspath $(XBOX_BUILD_DIR))
+XXD ?= xxd
+
+ROOT_SOURCES := $(shell find $(ROOT_DIR)/src -type f -name '*.c')
+STAGED_SOURCES := $(patsubst $(ROOT_DIR)/src/%.c,$(XBOX_BUILD_DIR)/src/%.c,$(ROOT_SOURCES))
+STAGED_ENTRY := $(XBOX_BUILD_DIR)/src/xbox.c
+ASSETS := $(shell find $(ROOT_DIR)/files -type f -not -name 'LICENSE')
+ASSET_PATHS := $(patsubst $(ROOT_DIR)/files/%,%,$(ASSETS))
+ASSET_SOURCES := $(addprefix $(XBOX_BUILD_DIR)/assets/,$(addsuffix .c,$(basename $(ASSET_PATHS))))
+CONFIG_HEADER := $(XBOX_BUILD_DIR)/ta_config.h
+
+SRCS := $(STAGED_ENTRY) $(STAGED_SOURCES) $(ASSET_SOURCES)
+NXDK_CFLAGS += -I$(ROOT_DIR)/include -I$(XBOX_BUILD_DIR)
+
+.DEFAULT_GOAL := all
+.PHONY: all clean
+
+all: $(STAGED_ENTRY) $(STAGED_SOURCES) $(ASSET_SOURCES) $(CONFIG_HEADER)
+ $(MAKE) -C "$(XBOX_BUILD_DIR)" -f "$(NXDK_DIR)/Makefile" NXDK_DIR="$(NXDK_DIR)" OUTPUT_DIR="$(XBOX_BUILD_DIR)" 'XBE_TITLE=Tuxanci\ 2' GEN_XISO="$(MAKEFILE_DIR)tuxanci2.iso" "SRCS=$(SRCS)" "NXDK_CFLAGS=-I$(ROOT_DIR)/include -I$(XBOX_BUILD_DIR)"
+
+$(STAGED_ENTRY): $(MAKEFILE_DIR)xbox.c
+ mkdir -p $(@D)
+ printf '#include "%s"\n' '$(abspath $<)' > $@
+
+$(XBOX_BUILD_DIR)/src/%.c: $(ROOT_DIR)/src/%.c
+ mkdir -p $(@D)
+ printf '#include "%s"\n' '$(abspath $<)' > $@
+
+define ASSET_C_RULE
+$(XBOX_BUILD_DIR)/assets/$(basename $(patsubst $(ROOT_DIR)/files/%,%,$(1))).c: $(1)
+ mkdir -p $$(dir $$@)
+ $$(XXD) -i -n ta_file_$$(notdir $$(basename $(1))) $$< $$@
+endef
+
+$(foreach asset,$(ASSETS),$(eval $(call ASSET_C_RULE,$(asset))))
+
+$(CONFIG_HEADER):
+ mkdir -p $(@D)
+ printf '#ifndef TA_CONFIG_H\n#define TA_CONFIG_H\n\n#define TA_BITS 32\n\n#endif\n' > $@
+
+clean:
+ rm -rf "$(XBOX_BUILD_DIR)"
+ rm -rf "$(MAKEFILE_DIR)build"
+ rm -f "$(MAKEFILE_DIR)main.exe" "$(MAKEFILE_DIR)Tuxanci 2.iso" "$(MAKEFILE_DIR)tuxanci2.iso"
diff --git a/platforms/xbox/xbox.c b/platforms/xbox/xbox.c
@@ -0,0 +1,49 @@
+#include "ta_api.h"
+#include <hal/video.h>
+#include <windows.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+#define SCREEN_WIDTH 640
+#define SCREEN_HEIGHT 480
+#define WINDOW_BPP 32
+#define TARGET_FPS 60
+#define FRAME_TIME_MS (1000 / TARGET_FPS)
+
+int main(void) {
+ if (!XVideoSetMode(SCREEN_WIDTH, SCREEN_HEIGHT, WINDOW_BPP, REFRESH_DEFAULT)) {
+ return 1;
+ }
+
+ ta_fb.width = SCREEN_WIDTH;
+ ta_fb.height = SCREEN_HEIGHT;
+ ta_fb.bpp = WINDOW_BPP;
+
+ ta_main_init();
+
+ while (1) {
+ ta_main_update();
+
+ uint32_t *dest = (uint32_t *)XVideoGetFB();
+ uint32_t *src = (uint32_t *)ta_fb.buffers[0];
+
+ if (dest && src) {
+ for (int i = 0; i < SCREEN_WIDTH * SCREEN_HEIGHT; i++) {
+ dest[i] = src[i];
+ }
+ }
+
+ XVideoFlushFB();
+ Sleep(FRAME_TIME_MS);
+ }
+
+ return 0;
+}
+
+void *ta_malloc(ta_size size) {
+ return malloc(size);
+}
+
+void ta_free(void *ptr) {
+ free(ptr);
+}