git-svn-id: https://svn.eduke32.com/eduke32@1037 1a8010ca-5511-0410-912e-c29ae57300e0

This commit is contained in:
terminx 2008-08-28 05:57:46 +00:00
parent b38cbec5c8
commit 8bbe48c219
13 changed files with 885 additions and 859 deletions

View file

@ -728,19 +728,14 @@ void polymost_glinit()
"MUL result.color, fragment.color, texsample;\n" "MUL result.color, fragment.color, texsample;\n"
"END\n"; "END\n";
#if 1 if (!Bstrcmp(glinfo.vendor, "NVIDIA Corporation"))
if (!Bstrcmp(glinfo.vendor, "ATI Technologies Inc."))
{
initprintf("polymost_glinit(): ATI detected, GL_FOG_HINT = GL_DONT_CARE\n");
bglHint(GL_FOG_HINT,GL_DONT_CARE);
}
else
{ {
bglHint(GL_FOG_HINT,GL_NICEST); bglHint(GL_FOG_HINT,GL_NICEST);
} }
#else else
{
bglHint(GL_FOG_HINT,GL_DONT_CARE); bglHint(GL_FOG_HINT,GL_DONT_CARE);
#endif }
bglFogi(GL_FOG_MODE,GL_EXP2); bglFogi(GL_FOG_MODE,GL_EXP2);
bglFogf(GL_FOG_DENSITY,1.0); //must be > 0, default is 1 bglFogf(GL_FOG_DENSITY,1.0); //must be > 0, default is 1

View file

@ -3264,9 +3264,6 @@ static int SetupOpenGL(int width, int height, int bitspp)
int err = 0; int err = 0;
glinfo.vendor = (char *)bglGetString(GL_VENDOR); glinfo.vendor = (char *)bglGetString(GL_VENDOR);
glinfo.renderer = (char *)bglGetString(GL_RENDERER);
glinfo.version = (char *)bglGetString(GL_VERSION);
glinfo.extensions = (char *)bglGetString(GL_EXTENSIONS);
// GL driver blacklist // GL driver blacklist
if (!forcegl) if (!forcegl)
@ -3274,11 +3271,13 @@ static int SetupOpenGL(int width, int height, int bitspp)
if (!Bstrcmp(glinfo.vendor,"Microsoft Corporation")) err = 1; if (!Bstrcmp(glinfo.vendor,"Microsoft Corporation")) err = 1;
else if (!Bstrcmp(glinfo.vendor,"SiS")) err = 1; else if (!Bstrcmp(glinfo.vendor,"SiS")) err = 1;
else if (!Bstrcmp(glinfo.vendor,"3Dfx Interactive Inc.")) err = 1; else if (!Bstrcmp(glinfo.vendor,"3Dfx Interactive Inc.")) err = 1;
else if (!Bstrcmp(glinfo.vendor,"Intel")) err = 1;
if (err) if (err)
{ {
OSD_Printf("Unsupported OpenGL driver. GL modes will be unavailable.\n"); OSD_Printf("Unsupported OpenGL driver. GL modes will be unavailable.\n");
ReleaseOpenGL(); ReleaseOpenGL();
unloadgldriver();
nogl = 1; nogl = 1;
modeschecked = 0; modeschecked = 0;
getvalidmodes(); getvalidmodes();
@ -3286,6 +3285,10 @@ static int SetupOpenGL(int width, int height, int bitspp)
} }
} }
glinfo.renderer = (char *)bglGetString(GL_RENDERER);
glinfo.version = (char *)bglGetString(GL_VERSION);
glinfo.extensions = (char *)bglGetString(GL_EXTENSIONS);
glinfo.maxanisotropy = 1.0; glinfo.maxanisotropy = 1.0;
glinfo.bgra = 0; glinfo.bgra = 0;
glinfo.texcompr = 0; glinfo.texcompr = 0;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

View file

@ -23,7 +23,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
//------------------------------------------------------------------------- //-------------------------------------------------------------------------
// this is checked against http://eduke32.com/VERSION // this is checked against http://eduke32.com/VERSION
#define BUILDDATE " 20080826" #define BUILDDATE " 20080827"
#define APPNAME "EDuke32" #define APPNAME "EDuke32"
#define VERSION " 1.5.0devel" #define VERSION " 1.5.0devel"
#define HEAD2 APPNAME VERSION BUILDDATE #define HEAD2 APPNAME VERSION BUILDDATE

View file

@ -205,8 +205,6 @@ extern int minitext_(int x,int y,const char *t,int s,int p,int sb);
#define gametext(x,y,t,s,dabits) gametext_z(0,STARTALPHANUM, x,y,t,s,0,dabits,0, 0, xdim-1, ydim-1, 65536) #define gametext(x,y,t,s,dabits) gametext_z(0,STARTALPHANUM, x,y,t,s,0,dabits,0, 0, xdim-1, ydim-1, 65536)
#define gametextpal(x,y,t,s,p) gametext_z(0,STARTALPHANUM, x,y,t,s,p,26,0, 0, xdim-1, ydim-1, 65536) #define gametextpal(x,y,t,s,p) gametext_z(0,STARTALPHANUM, x,y,t,s,p,26,0, 0, xdim-1, ydim-1, 65536)
#define mgametext(x,y,t,s,dabits) gametext_z(2,STARTALPHANUM, x,y,t,s,0,dabits,0, 0, xdim-1, ydim-1, 65536)
#define mgametextpal(x,y,t,s,p) gametext_z(2,STARTALPHANUM, x,y,t,s,p,26,0, 0, xdim-1, ydim-1, 65536)
extern void setupdynamictostatic(); extern void setupdynamictostatic();
extern void processnames(const char *szLabel, int lValue); extern void processnames(const char *szLabel, int lValue);

View file

@ -120,7 +120,7 @@ extern int lastvisinc;
int g_Shareware = 0; int g_Shareware = 0;
int g_GameType = 0; int g_GameType = 0;
#define MAXUSERQUOTES 4 #define MAXUSERQUOTES 6
static int quotebot, quotebotgoal; static int quotebot, quotebotgoal;
static int user_quote_time[MAXUSERQUOTES]; static int user_quote_time[MAXUSERQUOTES];
static char user_quote[MAXUSERQUOTES][178]; static char user_quote[MAXUSERQUOTES][178];
@ -366,7 +366,7 @@ int gametext_z(int small, int starttile, int x,int y,const char *t,int s,int p,i
y+=(y-oy)<<16; y+=(y-oy)<<16;
ox=x;oy=y; ox=x;oy=y;
} }
rotatesprite(x<<shift,(y<<shift)+((small&4)?ud.config.ScreenHeight<<15:0),z,0,ac,s,p,(small&1)?(8|16):(2|orientation),x1,y1,x2,y2); rotatesprite(x<<shift,(y<<shift),z,0,ac,s,p,(small&1)?(8|16|(orientation&1)|(orientation&32)):(2|orientation),x1,y1,x2,y2);
if ((*t >= '0' && *t <= '9')) if ((*t >= '0' && *t <= '9'))
x += (8)*z/65536; x += (8)*z/65536;
@ -411,9 +411,9 @@ int gametextlen(int x,const char *t)
static inline int mpgametext(int y,const char *t,int s,int dabits) static inline int mpgametext(int y,const char *t,int s,int dabits)
{ {
if (xdim >= 640 && ydim >= 480) if (xdim < 640 || ydim < 480)
return(gametext_z(5,STARTALPHANUM, 5,y,t,s,0,dabits,0, 0, xdim-1, ydim-1, 65536));
return(gametext_z(0,STARTALPHANUM, 5,y,t,s,0,dabits,0, 0, xdim-1, ydim-1, 65536)); return(gametext_z(0,STARTALPHANUM, 5,y,t,s,0,dabits,0, 0, xdim-1, ydim-1, 65536));
return(gametext_z(1,STARTALPHANUM, 5,y,t,s,0,dabits,0, 0, xdim-1, ydim-1, 65536));
} }
int minitext_(int x,int y,const char *t,int s,int p,int sb) int minitext_(int x,int y,const char *t,int s,int p,int sb)
@ -2625,30 +2625,55 @@ static void ShowCoordinates(int snum)
static void operatefta(void) static void operatefta(void)
{ {
int i, j = 200-45, k, l; int i, j, k, l;
if (ud.screen_size < 1) j = 200-8; k = 1;
if (GTFLAGS(GAMETYPE_FLAG_FRAGBAR) && ud.screen_size > 0 && ud.multimode > 1)
{
j = 0;
k += 8;
for (i=connecthead;i>=0;i=connectpoint2[i])
if (i > j) j = i;
if (j >= 4 && j <= 8) k += 8;
else if (j > 8 && j <= 12) k += 16;
else if (j > 12) k += 24;
}
if (g_player[screenpeek].ps->fta > 1 && (g_player[screenpeek].ps->ftq < 115 || g_player[screenpeek].ps->ftq > 117))
{
if (g_player[screenpeek].ps->fta > 3)
k += 7;
else k += g_player[screenpeek].ps->fta<<1; /*if (g_player[screenpeek].ps->fta > 2)
k += 3;
else k += 1; */
}
if (xdim >= 640 && ydim >= 480)
k = scale(k,ydim,200);
j = k;
quotebot = min(quotebot,j); quotebot = min(quotebot,j);
quotebotgoal = min(quotebotgoal,j); quotebotgoal = min(quotebotgoal,j);
if (g_player[myconnectindex].ps->gm&MODE_TYPE) j -= 8; // if (g_player[myconnectindex].ps->gm&MODE_TYPE) j -= 8;
quotebotgoal = j; quotebotgoal = j;
j = quotebot; j = quotebot;
for (i=0;i<MAXUSERQUOTES;i++) for (i=MAXUSERQUOTES-1;i>=0;i--)
{ {
if (user_quote_time[i] <= 0) break; if (user_quote_time[i] <= 0) continue;
k = user_quote_time[i]; k = user_quote_time[i];
if (k > 4) { mpgametext(j,user_quote[i],0,2+8+16); j += 8; }
else if (k > 2) { mpgametext(j,user_quote[i],0,2+8+16+1); j += k<<1; }
else { mpgametext(j,user_quote[i],0,2+8+16+1+32); j += k<<1; }
l = gametextlen(USERQUOTE_LEFTOFFSET,stripcolorcodes(user_quote[i],tempbuf)); l = gametextlen(USERQUOTE_LEFTOFFSET,stripcolorcodes(user_quote[i],tempbuf));
while (l > (ud.config.ScreenWidth - USERQUOTE_RIGHTOFFSET)) while (l > (ud.config.ScreenWidth - USERQUOTE_RIGHTOFFSET))
{ {
l -= (ud.config.ScreenWidth-USERQUOTE_RIGHTOFFSET); l -= (ud.config.ScreenWidth-USERQUOTE_RIGHTOFFSET);
j -= 8; if (k > 4) j += 8;
else j += k<<1;
} }
if (k > 4)
mpgametext(j,user_quote[i],0,2+8+16);
else if (k > 2) mpgametext(j,user_quote[i],0,2+8+16+1);
else mpgametext(j,user_quote[i],0,2+8+16+1+32);
j -= 8;
} }
if ((klabs(quotebotgoal-quotebot) <= 16) && (ud.screen_size <= 8)) if ((klabs(quotebotgoal-quotebot) <= 16) && (ud.screen_size <= 8))
@ -2665,7 +2690,12 @@ static void operatefta(void)
} }
k = 0; k = 0;
if (GTFLAGS(GAMETYPE_FLAG_FRAGBAR) && ud.screen_size > 0 && ud.multimode > 1)
if (g_player[screenpeek].ps->ftq == 115 || g_player[screenpeek].ps->ftq == 116 || g_player[screenpeek].ps->ftq == 117)
{
k = 140;//quotebot-8-4;
}
else if (GTFLAGS(GAMETYPE_FLAG_FRAGBAR) && ud.screen_size > 0 && ud.multimode > 1)
{ {
j = 0; j = 0;
k = 8; k = 8;
@ -2677,18 +2707,10 @@ static void operatefta(void)
else if (j > 12) k += 24; else if (j > 12) k += 24;
} }
if (g_player[screenpeek].ps->ftq == 115 || g_player[screenpeek].ps->ftq == 116 || g_player[screenpeek].ps->ftq == 117)
{
k = quotebot-8-4;
}
j = g_player[screenpeek].ps->fta; j = g_player[screenpeek].ps->fta;
if (j > 4) if (j > 4) gametext(320>>1,k,fta_quotes[g_player[screenpeek].ps->ftq],0,2+8+16);
gametext(320>>1,k,fta_quotes[g_player[screenpeek].ps->ftq],0,2+8+16); else if (j > 2) gametext(320>>1,k,fta_quotes[g_player[screenpeek].ps->ftq],0,2+8+16+1);
else else gametext(320>>1,k,fta_quotes[g_player[screenpeek].ps->ftq],0,2+8+16+1+32);
if (j > 2) gametext(320>>1,k,fta_quotes[g_player[screenpeek].ps->ftq],0,2+8+16+1);
else
gametext(320>>1,k,fta_quotes[g_player[screenpeek].ps->ftq],0,2+8+16+1+32);
} }
void FTA(int q, player_struct *p) void FTA(int q, player_struct *p)
@ -2905,7 +2927,7 @@ static int strget_(int small,int x,int y,char *t,int dalen,int c)
{ {
if (g_player[myconnectindex].ps->gm&MODE_TYPE) if (g_player[myconnectindex].ps->gm&MODE_TYPE)
x = mpgametext(y,t,c,2+8+16); x = mpgametext(y,t,c,2+8+16);
else x = mgametext(x,y,t,c,2+8+16); else x = gametext(x,y,t,c,2+8+16);
} }
c = 4-(sintable[(totalclock<<4)&2047]>>11); c = 4-(sintable[(totalclock<<4)&2047]>>11);
@ -2916,7 +2938,7 @@ static int strget_(int small,int x,int y,char *t,int dalen,int c)
y += 8; y += 8;
} }
rotatesprite((x+((small&1)?4:8))<<16,((y+((small&1)?0:4))<<16)+((small&1)?ud.config.ScreenHeight<<15:0),32768,0,SPINNINGNUKEICON+((totalclock>>3)%7),c,0,(small&1)?(8|16):2+8,0,0,xdim-1,ydim-1); rotatesprite((x+((small&1)?4:8))<<16,((y+((small&1)?0:4))<<16),32768,0,SPINNINGNUKEICON+((totalclock>>3)%7),c,0,(small&1)?(8|16):2+8,0,0,xdim-1,ydim-1);
return (0); return (0);
} }
@ -2925,16 +2947,11 @@ inline int strget(int x,int y,char *t,int dalen,int c)
return(strget_(0,x,y,t,dalen,c)); return(strget_(0,x,y,t,dalen,c));
} }
inline int strgetsm(int x,int y,char *t,int dalen,int c)
{
return(strget_(1,x,y,t,dalen,c));
}
inline int mpstrget(int x,int y,char *t,int dalen,int c) inline int mpstrget(int x,int y,char *t,int dalen,int c)
{ {
if (xdim >= 640 && ydim >= 480) if (xdim < 640 || ydim < 480)
return(strgetsm(x,y,t,dalen,c)); return(strget_(0,x,y,t,dalen,c));
return(strget(x,y,t,dalen,c)); return(strget_(1,x,y,t,dalen,c));
} }
static void typemode(void) static void typemode(void)
@ -3071,13 +3088,20 @@ static void typemode(void)
} }
else else
{ {
if (ud.screen_size > 0) j = 200-45; if (ud.screen_size > 1) j = 200-45;
else j = 200-8; else j = 200-8;
if (xdim >= 640 && ydim >= 480)
j = scale(j,ydim,200);
hitstate = mpstrget(320>>1,j,typebuf,120,1); hitstate = mpstrget(320>>1,j,typebuf,120,1);
if (hitstate == 1) if (hitstate == 1)
{ {
KB_ClearKeyDown(sc_Enter); KB_ClearKeyDown(sc_Enter);
if (Bstrlen(typebuf) == 0)
{
g_player[myconnectindex].ps->gm &= ~(MODE_TYPE|MODE_SENDTOWHOM);
return;
}
if (ud.automsg) if (ud.automsg)
{ {
if (SHIFTS_IS_PRESSED) sendmessagecommand = -1; if (SHIFTS_IS_PRESSED) sendmessagecommand = -1;
@ -3780,11 +3804,6 @@ void displayrest(int smoothratio)
if (ud.pause_on==1 && (g_player[myconnectindex].ps->gm&MODE_MENU) == 0) if (ud.pause_on==1 && (g_player[myconnectindex].ps->gm&MODE_MENU) == 0)
menutext(160,100,0,0,"GAME PAUSED"); menutext(160,100,0,0,"GAME PAUSED");
if (g_player[myconnectindex].ps->gm&MODE_TYPE)
typemode();
else
menus();
if (ud.coords) if (ud.coords)
ShowCoordinates(screenpeek); ShowCoordinates(screenpeek);
@ -3844,6 +3863,12 @@ void displayrest(int smoothratio)
else Bsprintf(tempbuf,"S:^15%d/%d", g_player[myconnectindex].ps->secret_rooms,g_player[myconnectindex].ps->max_secret_rooms); else Bsprintf(tempbuf,"S:^15%d/%d", g_player[myconnectindex].ps->secret_rooms,g_player[myconnectindex].ps->max_secret_rooms);
gametext_z(9,STARTALPHANUM, j,scale(200-i,ud.config.ScreenHeight,200)-7,tempbuf,0,10,26,0, 0, xdim-1, ydim-1, 65536); gametext_z(9,STARTALPHANUM, j,scale(200-i,ud.config.ScreenHeight,200)-7,tempbuf,0,10,26,0, 0, xdim-1, ydim-1, 65536);
} }
if (g_player[myconnectindex].ps->gm&MODE_TYPE)
typemode();
else
menus();
if (tintf > 0 || dotint) palto(tintr,tintg,tintb,tintf|128); if (tintf > 0 || dotint) palto(tintr,tintg,tintb,tintf|128);
} }

View file

@ -5682,46 +5682,46 @@ void loadefs(const char *filenam)
{ {
const char *ppdeathstrings[] = const char *ppdeathstrings[] =
{ {
"^2%s ^2WAS KICKED TO THE CURB BY %s", "^2%s ^2was kicked to the curb by %s",
"^2%s ^2WAS PICKED OFF BY %s", "^2%s ^2was picked off by %s",
"^2%s ^2TOOK %s^2'S SHOT TO THE FACE", "^2%s ^2took %s^2's shot to the face",
"^2%s ^2DANCED THE CHAINGUN CHA-CHA WITH %s", "^2%s ^did the chaingun cha-cha for %s",
"^2%s ^2TRIED TO MAKE A BONG OUT OF %s^2'S ROCKET", "^2%s ^2tried to make a bong out of %s^2's rocket",
"^2%s ^2EXPLODED. BLAME %s^2!", "^2%s ^2exploded. Blame %s^2!",
"^2%s ^2BECAME ONE WITH THE GUM ON %s^2'S SHOE", "^2%s ^2became one with the gum on %s^2's shoe",
"^2%s ^2WAS TOO COOL FOR %s", "^2%s ^2was too cool for %s",
"^2%s ^2EXPANDED HIS HORIZONS WITH HELP FROM %s", "^2%s^2's ego was inflated by %s",
"^2%s ^2THINKS %s ^2SHOULD CHECK HIS GLASSES", "^2%s ^2thinks %s ^2should check his glasses",
"^2%s ^2TOOK %s^2'S BOOT TO THE HEAD", "^2%s ^2took %s^2's boot to the head",
"^2%s ^2FELL VICTIM TO %s^2's MAGIC AUTOAIMING PISTOL", "^2%s ^2underestimated %s^2's marksmanship",
"^2%s ^2WAS CHASED OFF OF %s^2'S PORCH", "^2%s ^2was chased off of %s^2's porch",
"^2%s ^2COULDN'T DANCE FAST ENOUGH FOR %s", "^2%s ^2couldn't dance fast enough for %s",
"^2%s ^2TRIED TO OUTRUN %s^2'S ROCKET", "^2%s ^2tried to outrun %s^2's rocket",
"^2%s ^2FOUND %s^2'S HIDDEN WEAPONS OF MASS DESTRUCTION", "^2%s ^2found %s^2's hidden weapons of mass destruction",
"^2%s ^2WAS JUST TRYING TO HELP %s ^2TIE HIS SHOELACES", "^2%s ^2was just trying to help %s ^2tie his shoelaces",
"^2%s^2's IGLOO WAS WRECKED BY %s", "^2%s^2's igloo was wrecked by %s",
"^2%s ^2BECAME A STICKY FILM ON %s^2'S BOOTS", "^2%s ^2became a sticky film on %s^2's boots",
"^2%s ^2WISHES %s ^2HAD PRACTICED BEFORE PLAYING", "^2%s ^2wishes %s ^2had practiced before playing",
"^2%s ^2WAS WALKED ALL OVER BY %s", "^2%s ^2was walked all over by %s",
"^2%s ^2WAS PICKED OFF BY %s", "^2%s ^2was picked off by %s",
"^2%s ^2SUCKED %s^2'S SHOTGUN", "^2%s ^2sucked %s^2's shotgun",
"^2%s ^2ENDED UP WITH A FEW NEW HOLES FROM %s^2'S CHAINGUN", "^2%s ^2was ventilated by %s",
"^2%s ^2WAS TURNED INTO %s^2 BRAND CHUNKY SALSA", "^2%s ^2was turned into %s^2 brand chunky salsa",
"^2%s ^2FOUND A PRESENT FROM %s", "^2%s ^2found a present from %s",
"^2%s ^2WAS SCATHED BY %s^2'S SHRINK RAY", "^2%s ^2was scathed by %s^2's shrink ray",
"^2%s ^2WENT TO PIECES. %s^2, HOW COULD YOU?", "^2%s ^2went to pieces. %s^2, how could you?",
"^2%s ^2EXPANDED HIS HORIZONS WITH HELP FROM %s", "^2%s ^2expanded his horizons with help from %s",
"^2%s ^2WANTS TO KNOW WHY %s ^2IS EVEN PLAYING COOP", "^2%s ^wonders if %s ^2even knows what \"cooperative\" means",
}; };
const char *podeathstrings[] = const char *podeathstrings[] =
{ {
"^2%s ^2KILLED HIMSELF. WHAT A TOOL!", "^2%s ^2killed himself. What a tool!",
"^2%s ^2TRIED TO LEAVE", "^2%s ^2tried to leave",
"^2%s ^2GOT FRAGGED BY A MONSTER. IT WAS PROBABLY A LIZTROOP.", "^2%s ^2got fragged by a monster. It was probably a liztroop.",
"^2%s ^2SWITCHED TO TEAM %d" "^2%s ^2switched to team %d"
}; };
for (i=(sizeof(ppdeathstrings)/sizeof(ppdeathstrings[0]))-1;i>=0;i--) for (i=(sizeof(ppdeathstrings)/sizeof(ppdeathstrings[0]))-1;i>=0;i--)

View file

@ -54,6 +54,9 @@ extern int voting;
#define USERMAPENTRYLENGTH 25 #define USERMAPENTRYLENGTH 25
#define mgametext(x,y,t,s,dabits) gametext_z(2,STARTALPHANUM, x,y,t,s,0,dabits,0, 0, xdim-1, ydim-1, 65536)
#define mgametextpal(x,y,t,s,p) gametext_z(2,STARTALPHANUM, x,y,t,s,p,26,0, 0, xdim-1, ydim-1, 65536)
void cmenu(int cm) void cmenu(int cm)
{ {
current_menu = cm; current_menu = cm;
@ -1855,23 +1858,25 @@ cheat_for_port_credits:
" ", " ",
"Thanks to the following people for their contributions:", "Thanks to the following people for their contributions:",
" ", " ",
"Adam Fazakerley", "Adam Fazakerley", // netcode stuff
"Charlie Honig", "Charlie Honig", // showview command
"Ed Coolidge", "Dan Gaskill", // testing
"Hunter_rus", "Ed Coolidge", // Mapster32 improvements
"James Bentler", "Hunter_rus", // tons of shit
"Javier Martinez", "James Bentler", // Mapster32 improvements
"Jeff Hart", "Javier Martinez", // EDuke 2.1.1 stuff I think
"Jonathan Smith", "Jeff Hart", // website graphics
"Jose del Castillo", "Jonathan Smith", // testing
"Lachlan McDonald", "Jose del Castillo", // EDuke 2.1.1 stuff I think
"Matthew Palmer", "Lachlan McDonald", // official EDuke32 icon
"Ozkan Sezer", "Marcus Herbert", // OSX compatibility work
"Peter Green", "Matthew Palmer", // testing and eduke32.com domain
"Peter Veenstra", "Ozkan Sezer", // SDL/GTK version checking improvements
"Philipp Kutin", "Peter Green", // dynamic remapping, custom gametypes
"Ryan Gordon", "Peter Veenstra", // port to 64-bit
"Stephen Anthony", "Philipp Kutin", // Mapster32 improvements
"Ryan Gordon", // icculus.org Duke3D port sound code
"Stephen Anthony", // early 64-bit porting work
" ", " ",
"EDuke originally by Matt Saettler", "EDuke originally by Matt Saettler",
" ", " ",