mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-11-20 10:32:42 -05:00
Port of Duke Nukem 3D
This ports Fabien Sanglard's Chocolate Duke to run on a version of SDL for Rockbox. Change-Id: I8f2c4c78af19de10c1633ed7bb7a997b43256dd9
This commit is contained in:
parent
01c6dcf6c7
commit
a855d62025
994 changed files with 336924 additions and 15 deletions
320
apps/plugins/sdl/progs/duke3d/Engine/src/build.h
Normal file
320
apps/plugins/sdl/progs/duke3d/Engine/src/build.h
Normal file
|
|
@ -0,0 +1,320 @@
|
|||
/*
|
||||
* "Build Engine & Tools" Copyright (c) 1993-1997 Ken Silverman
|
||||
* Ken Silverman's official web site: "http://www.advsys.net/ken"
|
||||
* See the included license file "BUILDLIC.TXT" for license info.
|
||||
* This file has been modified from Ken Silverman's original release
|
||||
*/
|
||||
|
||||
#ifndef _INCLUDE_BUILD_H_
|
||||
#define _INCLUDE_BUILD_H_
|
||||
#ifdef _WIN32
|
||||
#include "windows/inttypes.h"
|
||||
#else
|
||||
#include <inttypes.h>
|
||||
#endif
|
||||
|
||||
#define MAXSECTORS 1024
|
||||
#define MAXWALLS 8192
|
||||
#define MAXSPRITES 4096
|
||||
#define MAXTILES 9216
|
||||
|
||||
#define MAXSTATUS 1024
|
||||
#define MAXPLAYERS 16
|
||||
#define MAXXDIM 1600
|
||||
#define MAXYDIM 1200
|
||||
#define MAXPALOOKUPS 256
|
||||
#define MAXPSKYTILES 256
|
||||
#define MAXSPRITESONSCREEN 1024
|
||||
|
||||
#define CLIPMASK0 (((1L)<<16)+1L)
|
||||
#define CLIPMASK1 (((256L)<<16)+64L)
|
||||
|
||||
|
||||
/*
|
||||
* Make all variables in BUILD.H defined in the ENGINE,
|
||||
* and externed in GAME
|
||||
* (dear lord. --ryan.)
|
||||
*/
|
||||
#ifdef ENGINE
|
||||
#define EXTERN
|
||||
#else
|
||||
#define EXTERN extern
|
||||
#endif
|
||||
|
||||
#pragma pack(1)
|
||||
|
||||
/*
|
||||
* ceilingstat/floorstat:
|
||||
* bit 0: 1 = parallaxing, 0 = not "P"
|
||||
* bit 1: 1 = groudraw, 0 = not
|
||||
* bit 2: 1 = swap x&y, 0 = not "F"
|
||||
* bit 3: 1 = double smooshiness "E"
|
||||
* bit 4: 1 = x-flip "F"
|
||||
* bit 5: 1 = y-flip "F"
|
||||
* bit 6: 1 = Align texture to first wall of sector "R"
|
||||
* bits 7-8: "T"
|
||||
* 00 = normal floors
|
||||
* 01 = masked floors
|
||||
* 10 = transluscent masked floors
|
||||
* 11 = reverse transluscent masked floors
|
||||
* bits 9-15: reserved
|
||||
*/
|
||||
|
||||
/* 40 bytes */
|
||||
typedef struct
|
||||
{
|
||||
short wallptr, wallnum;
|
||||
int32_t ceilingz, floorz;
|
||||
short ceilingstat, floorstat;
|
||||
short ceilingpicnum, ceilingheinum;
|
||||
int8_t ceilingshade;
|
||||
uint8_t ceilingpal, ceilingxpanning, ceilingypanning;
|
||||
short floorpicnum, floorheinum;
|
||||
int8_t floorshade;
|
||||
uint8_t floorpal, floorxpanning, floorypanning;
|
||||
uint8_t visibility, filler;
|
||||
short lotag, hitag, extra;
|
||||
} sectortype;
|
||||
|
||||
/*
|
||||
* cstat:
|
||||
* bit 0: 1 = Blocking wall (use with clipmove, getzrange) "B"
|
||||
* bit 1: 1 = bottoms of invisible walls swapped, 0 = not "2"
|
||||
* bit 2: 1 = align picture on bottom (for doors), 0 = top "O"
|
||||
* bit 3: 1 = x-flipped, 0 = normal "F"
|
||||
* bit 4: 1 = masking wall, 0 = not "M"
|
||||
* bit 5: 1 = 1-way wall, 0 = not "1"
|
||||
* bit 6: 1 = Blocking wall (use with hitscan / cliptype 1) "H"
|
||||
* bit 7: 1 = Transluscence, 0 = not "T"
|
||||
* bit 8: 1 = y-flipped, 0 = normal "F"
|
||||
* bit 9: 1 = Transluscence reversing, 0 = normal "T"
|
||||
* bits 10-15: reserved
|
||||
*/
|
||||
|
||||
/* 32 bytes */
|
||||
typedef struct
|
||||
{
|
||||
int32_t x, y;
|
||||
short point2, nextwall, nextsector, cstat;
|
||||
short picnum, overpicnum;
|
||||
int8_t shade;
|
||||
uint8_t pal, xrepeat, yrepeat, xpanning, ypanning;
|
||||
short lotag, hitag, extra;
|
||||
} walltype;
|
||||
|
||||
|
||||
/*
|
||||
* cstat:
|
||||
* bit 0: 1 = Blocking sprite (use with clipmove, getzrange) "B"
|
||||
* bit 1: 1 = transluscence, 0 = normal "T"
|
||||
* bit 2: 1 = x-flipped, 0 = normal "F"
|
||||
* bit 3: 1 = y-flipped, 0 = normal "F"
|
||||
* bits 5-4: 00 = FACE sprite (default) "R"
|
||||
* 01 = WALL sprite (like masked walls)
|
||||
* 10 = FLOOR sprite (parallel to ceilings&floors)
|
||||
* bit 6: 1 = 1-sided sprite, 0 = normal "1"
|
||||
* bit 7: 1 = Real centered centering, 0 = foot center "C"
|
||||
* bit 8: 1 = Blocking sprite (use with hitscan / cliptype 1) "H"
|
||||
* bit 9: 1 = Transluscence reversing, 0 = normal "T"
|
||||
* bits 10-14: reserved
|
||||
* bit 15: 1 = Invisible sprite, 0 = not invisible
|
||||
*/
|
||||
|
||||
/* 44 bytes */
|
||||
typedef struct
|
||||
{
|
||||
int32_t x, y, z;
|
||||
short cstat, picnum;
|
||||
int8_t shade;
|
||||
uint8_t pal, clipdist, filler;
|
||||
uint8_t xrepeat, yrepeat;
|
||||
int8_t xoffset, yoffset;
|
||||
short sectnum, statnum;
|
||||
short ang, owner, xvel, yvel, zvel;
|
||||
short lotag, hitag, extra;
|
||||
} spritetype;
|
||||
|
||||
#pragma pack()
|
||||
|
||||
EXTERN sectortype sector[MAXSECTORS];
|
||||
EXTERN walltype wall[MAXWALLS];
|
||||
EXTERN spritetype sprite[MAXSPRITES];
|
||||
|
||||
EXTERN uint16_t mapCRC;
|
||||
|
||||
EXTERN int32_t spritesortcnt;
|
||||
EXTERN spritetype tsprite[MAXSPRITESONSCREEN];
|
||||
|
||||
EXTERN uint8_t vidoption;
|
||||
EXTERN int32_t xdim, ydim, numpages;
|
||||
|
||||
// Fast way to retrive the start of a column in the framebuffer, given a screenspace X coordinate.
|
||||
EXTERN int32_t ylookup[MAXYDIM+1];
|
||||
|
||||
EXTERN int32_t yxaspect, viewingrange;
|
||||
|
||||
EXTERN int32_t validmodecnt;
|
||||
EXTERN short validmode[256];
|
||||
EXTERN int32_t validmodexdim[256], validmodeydim[256];
|
||||
|
||||
EXTERN short numsectors, numwalls;
|
||||
EXTERN volatile int32_t totalclock;
|
||||
EXTERN int32_t numframes, randomseed;
|
||||
EXTERN short sintable[2048];
|
||||
EXTERN uint8_t palette[768];
|
||||
EXTERN short numpalookups;
|
||||
EXTERN uint8_t *palookup[MAXPALOOKUPS];
|
||||
EXTERN uint8_t parallaxtype, showinvisibility;
|
||||
EXTERN int32_t parallaxyoffs, parallaxyscale;
|
||||
EXTERN int32_t visibility, parallaxvisibility;
|
||||
|
||||
EXTERN int32_t windowx1, windowy1, windowx2, windowy2;
|
||||
EXTERN short startumost[MAXXDIM], startdmost[MAXXDIM];
|
||||
|
||||
EXTERN short pskyoff[MAXPSKYTILES], pskybits;
|
||||
|
||||
EXTERN short headspritesect[MAXSECTORS+1], headspritestat[MAXSTATUS+1];
|
||||
EXTERN short prevspritesect[MAXSPRITES], prevspritestat[MAXSPRITES];
|
||||
EXTERN short nextspritesect[MAXSPRITES], nextspritestat[MAXSPRITES];
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* These variables are for auto-mapping with the draw2dscreen function.
|
||||
* When you load a new board, these bits are all set to 0 - since
|
||||
* you haven't mapped out anything yet. Note that these arrays are
|
||||
* bit-mapped.
|
||||
* If you want draw2dscreen() to show sprite #54 then you say:
|
||||
* spritenum = 54;
|
||||
* show2dsprite[spritenum>>3] |= (1<<(spritenum&7));
|
||||
* And if you want draw2dscreen() to not show sprite #54 then you say:
|
||||
* spritenum = 54;
|
||||
* show2dsprite[spritenum>>3] &= ~(1<<(spritenum&7));
|
||||
* Automapping defaults to 0 (do nothing). If you set automapping to 1,
|
||||
* then in 3D mode, the walls and sprites that you see will show up the
|
||||
* next time you flip to 2D mode.
|
||||
*/
|
||||
EXTERN uint8_t show2dsector[(MAXSECTORS+7)>>3];
|
||||
EXTERN uint8_t show2dwall[(MAXWALLS+7)>>3];
|
||||
EXTERN uint8_t show2dsprite[(MAXSPRITES+7)>>3];
|
||||
EXTERN uint8_t automapping;
|
||||
|
||||
|
||||
|
||||
//This is the bit vector that marks visited sector during portal flooding. Size is hence (MAXSECTORS / 8)
|
||||
EXTERN uint8_t visitedSectors[(MAXSECTORS+7)>>3];
|
||||
|
||||
/*************************************************************************
|
||||
POSITION VARIABLES:
|
||||
|
||||
POSX is your x - position ranging from 0 to 65535
|
||||
POSY is your y - position ranging from 0 to 65535
|
||||
(the length of a side of the grid in EDITBORD would be 1024)
|
||||
POSZ is your z - position (height) ranging from 0 to 65535, 0 highest.
|
||||
ANG is your angle ranging from 0 to 2047. Instead of 360 degrees, or
|
||||
2 * PI radians, I use 2048 different angles, so 90 degrees would
|
||||
be 512 in my system.
|
||||
|
||||
SPRITE VARIABLES:
|
||||
|
||||
EXTERN short headspritesect[MAXSECTORS+1], headspritestat[MAXSTATUS+1];
|
||||
EXTERN short prevspritesect[MAXSPRITES], prevspritestat[MAXSPRITES];
|
||||
EXTERN short nextspritesect[MAXSPRITES], nextspritestat[MAXSPRITES];
|
||||
|
||||
Example: if the linked lists look like the following:
|
||||
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
||||
³ Sector lists: Status lists: ³
|
||||
ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
|
||||
³ Sector0: 4, 5, 8 Status0: 2, 0, 8 ³
|
||||
³ Sector1: 16, 2, 0, 7 Status1: 4, 5, 16, 7, 3, 9 ³
|
||||
³ Sector2: 3, 9 ³
|
||||
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
|
||||
Notice that each number listed above is shown exactly once on both the
|
||||
left and right side. This is because any sprite that exists must
|
||||
be in some sector, and must have some kind of status that you define.
|
||||
|
||||
|
||||
Coding example #1:
|
||||
To go through all the sprites in sector 1, the code can look like this:
|
||||
|
||||
sectnum = 1;
|
||||
i = headspritesect[sectnum];
|
||||
while (i != -1)
|
||||
{
|
||||
nexti = nextspritesect[i];
|
||||
|
||||
//your code goes here
|
||||
//ex: printf("Sprite %d is in sector %d\n",i,sectnum);
|
||||
|
||||
i = nexti;
|
||||
}
|
||||
|
||||
Coding example #2:
|
||||
To go through all sprites with status = 1, the code can look like this:
|
||||
|
||||
statnum = 1; //status 1
|
||||
i = headspritestat[statnum];
|
||||
while (i != -1)
|
||||
{
|
||||
nexti = nextspritestat[i];
|
||||
|
||||
//your code goes here
|
||||
//ex: printf("Sprite %d has a status of 1 (active)\n",i,statnum);
|
||||
|
||||
i = nexti;
|
||||
}
|
||||
|
||||
insertsprite(short sectnum, short statnum);
|
||||
deletesprite(short spritenum);
|
||||
changespritesect(short spritenum, short newsectnum);
|
||||
changespritestat(short spritenum, short newstatnum);
|
||||
|
||||
TILE VARIABLES:
|
||||
NUMTILES - the number of tiles found TILES.DAT.
|
||||
TILESIZX[MAXTILES] - simply the x-dimension of the tile number.
|
||||
TILESIZY[MAXTILES] - simply the y-dimension of the tile number.
|
||||
WALOFF[MAXTILES] - the actual 32-bit offset pointing to the top-left
|
||||
corner of the tile.
|
||||
PICANM[MAXTILES] - flags for animating the tile.
|
||||
|
||||
TIMING VARIABLES:
|
||||
TOTALCLOCK - When the engine is initialized, TOTALCLOCK is set to zero.
|
||||
From then on, it is incremented 120 times a second by 1. That
|
||||
means that the number of seconds elapsed is totalclock / 120.
|
||||
NUMFRAMES - The number of times the draw3dscreen function was called
|
||||
since the engine was initialized. This helps to determine frame
|
||||
rate. (Frame rate = numframes * 120 / totalclock.)
|
||||
|
||||
OTHER VARIABLES:
|
||||
|
||||
STARTUMOST[320] is an array of the highest y-coordinates on each column
|
||||
that my engine is allowed to write to. You need to set it only
|
||||
once.
|
||||
STARTDMOST[320] is an array of the lowest y-coordinates on each column
|
||||
that my engine is allowed to write to. You need to set it only
|
||||
once.
|
||||
SINTABLE[2048] is a sin table with 2048 angles rather than the
|
||||
normal 360 angles for higher precision. Also since SINTABLE is in
|
||||
all integers, the range is multiplied by 16383, so instead of the
|
||||
normal -1<sin(x)<1, the range of sintable is -16383<sintable[]<16383
|
||||
If you use this sintable, you can possibly speed up your code as
|
||||
well as save space in memory. If you plan to use sintable, 2
|
||||
identities you may want to keep in mind are:
|
||||
sintable[ang&2047] = sin(ang * (3.141592/1024)) * 16383
|
||||
sintable[(ang+512)&2047] = cos(ang * (3.141592/1024)) * 16383
|
||||
NUMSECTORS - the total number of existing sectors. Modified every time
|
||||
you call the loadboard function.
|
||||
***************************************************************************/
|
||||
|
||||
#define PORTSIG "Port by Ryan C. Gordon, Andrew Henderson, Dan Olson, Fabien Sanglard and a cast of thousands."
|
||||
|
||||
//Global.c
|
||||
void Error (int errorType, char *error, ...);
|
||||
int FindDistance2D(int ix, int iy);
|
||||
|
||||
#endif /* defined _INCLUDE_BUILD_H_ */
|
||||
|
||||
/* end of build.h ... */
|
||||
|
||||
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue