Skip to content

Commit

Permalink
doom: update README
Browse files Browse the repository at this point in the history
  • Loading branch information
and3rson committed Feb 14, 2024
1 parent a35af8e commit e24fbab
Show file tree
Hide file tree
Showing 3 changed files with 93 additions and 56 deletions.
82 changes: 26 additions & 56 deletions firmware-doom/lib/doomgeneric/README.md
Original file line number Diff line number Diff line change
@@ -1,67 +1,37 @@
# doomgeneric
The purpose of doomgeneric is to make porting Doom easier.
Of course Doom is already portable but with doomgeneric it is possible with just a few functions.
# Doom Generic (Lilka edition)

To try it you will need a WAD file (game data). If you don't own the game, shareware version is freely available (doom1.wad).
Ця бібліотека містить модифікований код з <https://github.com/ozkl/doomgeneric>.

# porting
Create a file named doomgeneric_yourplatform.c and just implement these functions to suit your platform.
* DG_Init
* DG_DrawFrame
* DG_SleepMs
* DG_GetTicksMs
* DG_GetKey
Оскільки ESP32-S3 має всього 400 КБ SRAM, деякі масиви не поміщаються в RAM, і їх потрібно динамічно ініціалізувати в heap всередині PSRAM.
Тому найважливіша зміна - це заміна деяких стекових алокацій пам'яті на динамічну (malloc/free), наприклад:

|Functions |Description|
|---------------------|-----------|
|DG_Init |Initialize your platfrom (create window, framebuffer, etc...).
|DG_DrawFrame |Frame is ready in DG_ScreenBuffer. Copy it to your platform's screen.
|DG_SleepMs |Sleep in milliseconds.
|DG_GetTicksMs |The ticks passed since launch in milliseconds.
|DG_GetKey |Provide keyboard events.
|DG_SetWindowTitle |Not required. This is for setting the window title as Doom sets this from WAD file.
```cpp
// До:

### main loop
At start, call doomgeneric_Create().
#define MAXVISPLANES 128
visplane_t visplanes[MAXVISPLANES];
#define MAXOPENINGS SCREENWIDTH*64
short openings[MAXOPENINGS];

In a loop, call doomgeneric_Tick().
// Після:

In simplest form:
```
int main(int argc, char **argv)
#define MAXVISPLANES 128
visplane_t* visplanes;
#define MAXOPENINGS SCREENWIDTH*64
short* openings;

void R_AllocPlanes (void)
{
doomgeneric_Create(argc, argv);
visplanes = malloc (sizeof(visplane_t) * MAXVISPLANES);
openings = malloc (sizeof(short) * MAXOPENINGS);
}

while (1)
{
doomgeneric_Tick();
}
return 0;
void R_FreePlanes (void)
{
free (visplanes);
free (openings);
}
```
# sound
Sound is much harder to implement! If you need sound, take a look at SDL port. It fully supports sound and music! Where to start? Define FEATURE_SOUND, assign DG_sound_module and DG_music_module.

# platforms
Ported platforms include Windows, X11, SDL, emscripten. Just look at (doomgeneric_win.c, doomgeneric_xlib.c, doomgeneric_sdl.c).
Makefiles provided for each platform.

## emscripten
You can try it directly here:
https://ozkl.github.io/doomgeneric/

emscripten port is based on SDL port, so it supports sound and music! For music, timidity backend is used.

## Windows
![Windows](screenshots/windows.png)

## X11 - Ubuntu
![Ubuntu](screenshots/ubuntu.png)

## X11 - FreeBSD
![FreeBSD](screenshots/freebsd.png)

## SDL
![SDL](screenshots/sdl.png)
Повний перелік нових алокацій знаходиться в <./d_alloc.c>.
Він викликається в <./doomgeneric.c>.
File renamed without changes.
67 changes: 67 additions & 0 deletions firmware-doom/lib/doomgeneric/src/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
# doomgeneric
The purpose of doomgeneric is to make porting Doom easier.
Of course Doom is already portable but with doomgeneric it is possible with just a few functions.

To try it you will need a WAD file (game data). If you don't own the game, shareware version is freely available (doom1.wad).

# porting
Create a file named doomgeneric_yourplatform.c and just implement these functions to suit your platform.
* DG_Init
* DG_DrawFrame
* DG_SleepMs
* DG_GetTicksMs
* DG_GetKey

|Functions |Description|
|---------------------|-----------|
|DG_Init |Initialize your platfrom (create window, framebuffer, etc...).
|DG_DrawFrame |Frame is ready in DG_ScreenBuffer. Copy it to your platform's screen.
|DG_SleepMs |Sleep in milliseconds.
|DG_GetTicksMs |The ticks passed since launch in milliseconds.
|DG_GetKey |Provide keyboard events.
|DG_SetWindowTitle |Not required. This is for setting the window title as Doom sets this from WAD file.

### main loop
At start, call doomgeneric_Create().

In a loop, call doomgeneric_Tick().

In simplest form:
```
int main(int argc, char **argv)
{
doomgeneric_Create(argc, argv);
while (1)
{
doomgeneric_Tick();
}
return 0;
}
```

# sound
Sound is much harder to implement! If you need sound, take a look at SDL port. It fully supports sound and music! Where to start? Define FEATURE_SOUND, assign DG_sound_module and DG_music_module.

# platforms
Ported platforms include Windows, X11, SDL, emscripten. Just look at (doomgeneric_win.c, doomgeneric_xlib.c, doomgeneric_sdl.c).
Makefiles provided for each platform.

## emscripten
You can try it directly here:
https://ozkl.github.io/doomgeneric/

emscripten port is based on SDL port, so it supports sound and music! For music, timidity backend is used.

## Windows
![Windows](screenshots/windows.png)

## X11 - Ubuntu
![Ubuntu](screenshots/ubuntu.png)

## X11 - FreeBSD
![FreeBSD](screenshots/freebsd.png)

## SDL
![SDL](screenshots/sdl.png)

0 comments on commit e24fbab

Please sign in to comment.