From 5b9421731693a53fff0b0288ca45185c318d7318 Mon Sep 17 00:00:00 2001 From: apio Date: Sun, 31 Mar 2024 13:40:43 +0200 Subject: [PATCH] ports: Add doomgeneric port --- ports/README.md | 1 + ports/doomgeneric/PACKAGE | 32 +++++ ports/doomgeneric/doomgeneric.patch | 197 ++++++++++++++++++++++++++++ 3 files changed, 230 insertions(+) create mode 100644 ports/doomgeneric/PACKAGE create mode 100644 ports/doomgeneric/doomgeneric.patch diff --git a/ports/README.md b/ports/README.md index 1f6d5d5c..abb24d95 100644 --- a/ports/README.md +++ b/ports/README.md @@ -13,6 +13,7 @@ Name | Version | Description | URL ---|---|--- | --- bc | 6.6.0 | An implementation of the POSIX bc calculator | https://github.com/gavinhoward/bc binutils | 2.39 | The GNU suite of binary utilities | https://www.gnu.org/software/binutils +doomgeneric | 0.0.1 | Easily portable doom | https://github.com/ozkl/doomgeneric gcc | 12.2.0 | The GNU Compiler Collection | https://www.gnu.org/software/gcc gmp | 6.3.0 | The GNU Multiple Precision Arithmetic Library | https://gmplib.org libwind | 0.0.1 | A standalone implementation of the wind client protocol | https://git.cloudapio.eu/apio/libwind diff --git a/ports/doomgeneric/PACKAGE b/ports/doomgeneric/PACKAGE new file mode 100644 index 00000000..06b3b8db --- /dev/null +++ b/ports/doomgeneric/PACKAGE @@ -0,0 +1,32 @@ +# Basic information +name="doomgeneric" +version="0.0.1" +dependencies=(libwind) + +# Download options +format="git" +url="https://github.com/ozkl/doomgeneric.git" + +# Build instructions +do_patch() +{ + patch -ui $portdir/doomgeneric.patch -p 1 -d $srcdir +} + +do_configure() +{ + : +} + +do_build() +{ + cd $srcdir/doomgeneric + make +} + +do_install() +{ + cd $srcdir/doomgeneric + mkdir -p $installdir/usr/bin/ + cp doomgeneric $installdir/usr/bin/ +} diff --git a/ports/doomgeneric/doomgeneric.patch b/ports/doomgeneric/doomgeneric.patch new file mode 100644 index 00000000..4bb9c3f9 --- /dev/null +++ b/ports/doomgeneric/doomgeneric.patch @@ -0,0 +1,197 @@ +diff --git a/doomgeneric/Makefile b/doomgeneric/Makefile +index 503e0dc..5c44a6d 100644 +--- a/doomgeneric/Makefile ++++ b/doomgeneric/Makefile +@@ -12,17 +12,16 @@ else + endif + + +-CC=clang # gcc or g++ +-CFLAGS+=-ggdb3 -Os ++CC=$(LUNA_ARCH)-luna-gcc + LDFLAGS+=-Wl,--gc-sections +-CFLAGS+=-ggdb3 -Wall -DNORMALUNIX -DLINUX -DSNDSERV -D_DEFAULT_SOURCE # -DUSEASM +-LIBS+=-lm -lc -lX11 ++CFLAGS+=-ggdb3 -Os -Wall -fno-omit-frame-pointer -DNORMALUNIX -DLINUX -DSNDSERV -D_DEFAULT_SOURCE # -DUSEASM ++LIBS+=-lc -lwind + + # subdirectory for objects + OBJDIR=build + OUTPUT=doomgeneric + +-SRC_DOOM = dummy.o am_map.o doomdef.o doomstat.o dstrings.o d_event.o d_items.o d_iwad.o d_loop.o d_main.o d_mode.o d_net.o f_finale.o f_wipe.o g_game.o hu_lib.o hu_stuff.o info.o i_cdmus.o i_endoom.o i_joystick.o i_scale.o i_sound.o i_system.o i_timer.o memio.o m_argv.o m_bbox.o m_cheat.o m_config.o m_controls.o m_fixed.o m_menu.o m_misc.o m_random.o p_ceilng.o p_doors.o p_enemy.o p_floor.o p_inter.o p_lights.o p_map.o p_maputl.o p_mobj.o p_plats.o p_pspr.o p_saveg.o p_setup.o p_sight.o p_spec.o p_switch.o p_telept.o p_tick.o p_user.o r_bsp.o r_data.o r_draw.o r_main.o r_plane.o r_segs.o r_sky.o r_things.o sha1.o sounds.o statdump.o st_lib.o st_stuff.o s_sound.o tables.o v_video.o wi_stuff.o w_checksum.o w_file.o w_main.o w_wad.o z_zone.o w_file_stdc.o i_input.o i_video.o doomgeneric.o doomgeneric_xlib.o ++SRC_DOOM = dummy.o am_map.o doomdef.o doomstat.o dstrings.o d_event.o d_items.o d_iwad.o d_loop.o d_main.o d_mode.o d_net.o f_finale.o f_wipe.o g_game.o hu_lib.o hu_stuff.o info.o i_cdmus.o i_endoom.o i_joystick.o i_scale.o i_sound.o i_system.o i_timer.o memio.o m_argv.o m_bbox.o m_cheat.o m_config.o m_controls.o m_fixed.o m_menu.o m_misc.o m_random.o p_ceilng.o p_doors.o p_enemy.o p_floor.o p_inter.o p_lights.o p_map.o p_maputl.o p_mobj.o p_plats.o p_pspr.o p_saveg.o p_setup.o p_sight.o p_spec.o p_switch.o p_telept.o p_tick.o p_user.o r_bsp.o r_data.o r_draw.o r_main.o r_plane.o r_segs.o r_sky.o r_things.o sha1.o sounds.o statdump.o st_lib.o st_stuff.o s_sound.o tables.o v_video.o wi_stuff.o w_checksum.o w_file.o w_main.o w_wad.o z_zone.o w_file_stdc.o i_input.o i_video.o doomgeneric.o doomgeneric_luna.o + OBJS += $(addprefix $(OBJDIR)/, $(SRC_DOOM)) + + all: $(OUTPUT) +@@ -51,4 +50,3 @@ $(OBJDIR)/%.o: %.c + + print: + @echo OBJS: $(OBJS) +- +diff --git a/doomgeneric/doomgeneric_luna.c b/doomgeneric/doomgeneric_luna.c +new file mode 100644 +index 0000000..4d37ddc +--- /dev/null ++++ b/doomgeneric/doomgeneric_luna.c +@@ -0,0 +1,160 @@ ++#include "doomgeneric.h" ++#include "wind.h" ++#include ++#include ++#include ++#include ++#include ++#include "doomkeys.h" ++ ++static wind_client_t g_client; ++static wind_window_t g_window; ++ ++#define KEYQUEUE_SIZE 16 ++ ++static unsigned short s_KeyQueue[KEYQUEUE_SIZE]; ++static unsigned int s_KeyQueueWriteIndex = 0; ++static unsigned int s_KeyQueueReadIndex = 0; ++ ++static unsigned char convertToDoomKey(enum wind_keycode scancode) ++{ ++ unsigned char key = 0; ++ ++ switch (scancode) ++ { ++ case wind_key_Enter: ++ key = KEY_ENTER; ++ break; ++ case wind_key_Esc: ++ key = KEY_ESCAPE; ++ break; ++ case wind_key_LeftArrow: ++ key = KEY_LEFTARROW; ++ break; ++ case wind_key_RightArrow: ++ key = KEY_RIGHTARROW; ++ break; ++ case wind_key_UpArrow: ++ key = KEY_UPARROW; ++ break; ++ case wind_key_DownArrow: ++ key = KEY_DOWNARROW; ++ break; ++ case wind_key_LeftControl: ++ key = KEY_FIRE; ++ break; ++ case wind_key_RightControl: ++ key = KEY_USE; ++ break; ++ case wind_key_RightShift: ++ key = KEY_RSHIFT; ++ break; ++ case wind_key_CH18: ++ key = 'y'; ++ break; ++ default: ++ break; ++ } ++ ++ return key; ++} ++ ++static void addKeyToQueue(int pressed, enum wind_keycode keyCode) ++{ ++ unsigned char key = convertToDoomKey(keyCode); ++ ++ unsigned short keyData = (pressed << 8) | key; ++ ++ s_KeyQueue[s_KeyQueueWriteIndex] = keyData; ++ s_KeyQueueWriteIndex++; ++ s_KeyQueueWriteIndex %= KEYQUEUE_SIZE; ++} ++ ++static int event_handler(wind_client_t*, uint8_t event, void*) ++{ ++ switch (event) ++ { ++ case wind_MouseEvent: { ++ struct wind_mouse_event_request event_data; ++ wind_read_response(&g_client, event, &event_data, sizeof event_data); ++ break; ++ } ++ case wind_MouseLeave: { ++ struct wind_mouse_leave_request event_data; ++ wind_read_response(&g_client, event, &event_data, sizeof event_data); ++ break; ++ } ++ case wind_KeyEvent: { ++ struct wind_key_event_request event_data; ++ wind_read_response(&g_client, event, &event_data, sizeof event_data); ++ addKeyToQueue(event_data.pressed, event_data.code); ++ break; ++ } ++ ++ default: ++ break; ++ } ++ ++ return 0; ++} ++ ++void DG_Init() { ++ wind_connect(&g_client, WIND_SOCKET_PATH, 0); ++ wind_set_handler(&g_client, event_handler, NULL); ++ ++ struct wind_rect rect = { ++ .pos = {0,0}, ++ .width = DOOMGENERIC_RESX, ++ .height =DOOMGENERIC_RESY ++ }; ++ ++ int result = wind_create_window(&g_client, &g_window, rect); ++ if(result < 0) perror("wind_create_window"); ++} ++ ++void DG_DrawFrame() { ++ wind_check_for_messages(&g_client); ++ ++ memcpy(g_window.canvas, DG_ScreenBuffer, DOOMGENERIC_RESX*DOOMGENERIC_RESY*4); ++ wind_invalidate(&g_client, &g_window); ++} ++ ++int DG_GetKey(int *pressed, unsigned char *doomKey) { if (s_KeyQueueReadIndex == s_KeyQueueWriteIndex) ++ { ++ //key queue is empty ++ ++ return 0; ++ } ++ else ++ { ++ unsigned short keyData = s_KeyQueue[s_KeyQueueReadIndex]; ++ s_KeyQueueReadIndex++; ++ s_KeyQueueReadIndex %= KEYQUEUE_SIZE; ++ ++ *pressed = keyData >> 8; ++ *doomKey = keyData & 0xFF; ++ ++ return 1; ++ } } ++ ++void DG_SleepMs(uint32_t ms) { usleep(ms * 1000); } ++ ++void DG_SetWindowTitle(const char *title) { wind_set_window_title(&g_client, &g_window, title); } ++ ++uint32_t DG_GetTicksMs() { ++ struct timespec ts; ++ clock_gettime(CLOCK_MONOTONIC, &ts); ++ return (ts.tv_sec * 1000) + (ts.tv_nsec / 1000000); ++} ++ ++int main(int argc, char **argv) ++{ ++ doomgeneric_Create(argc, argv); ++ ++ while (1) ++ { ++ doomgeneric_Tick(); ++ } ++ ++ return 0; ++}