ports: Add doomgeneric port
All checks were successful
Build and test / build (push) Successful in 1m34s

This commit is contained in:
apio 2024-03-31 13:40:43 +02:00
parent 7205020bac
commit 5b94217316
Signed by: apio
GPG Key ID: B8A7D06E42258954
3 changed files with 230 additions and 0 deletions

View File

@ -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

32
ports/doomgeneric/PACKAGE Normal file
View File

@ -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/
}

View File

@ -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 <string.h>
+#include <time.h>
+#include <unistd.h>
+#include <sys/time.h>
+#include <stdio.h>
+#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;
+}