Add support for shareware 0.99/1.0/1.1, for shits and giggles.

git-svn-id: https://svn.eduke32.com/eduke32@3803 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
terminx 2013-05-23 18:28:04 +00:00
parent 6a2ffa9e47
commit 85cf8de0f3
11 changed files with 179 additions and 81 deletions

View file

@ -2980,7 +2980,7 @@ ACTOR_STATIC void G_MoveWeapons(void)
A_GetZLimits(i);
if (s->picnum == RPG && actor[i].picnum != BOSS2 && s->xrepeat >= 10 &&
sector[s->sectnum].lotag != ST_2_UNDERWATER)
sector[s->sectnum].lotag != ST_2_UNDERWATER && g_scriptVersion >= 13)
{
j = A_Spawn(i,SMALLSMOKE);
sprite[j].z += (1<<8);

View file

@ -12,6 +12,8 @@
#define GAMEFLAG_NAPALM 0x00000004
#define GAMEFLAG_WW2GI 0x00000008
#define GAMEFLAG_ADDON 0x00000010
#define GAMEFLAG_SHAREWARE 0x00000020
#define GAMEFLAG_DUKEBETA 0x00000060 // includes 0x20 since it's a shareware beta
extern int32_t g_gameType;
@ -19,6 +21,8 @@ extern int32_t g_gameType;
#define NAM (g_gameType & GAMEFLAG_NAM)
#define NAPALM (g_gameType & GAMEFLAG_NAPALM)
#define WW2GI (g_gameType & GAMEFLAG_WW2GI)
#define SHAREWARE (g_gameType & GAMEFLAG_SHAREWARE)
#define DUKEBETA (g_gameType & GAMEFLAG_DUKEBETA)
enum Games_t {
GAME_DUKE = 0,

View file

@ -2088,7 +2088,7 @@ static void G_DisplayExtraScreens(void)
S_StopMusic();
FX_StopAllSounds();
if (!VOLUMEALL || flags & LOGO_SHAREWARESCREENS)
if (!DUKEBETA && (!VOLUMEALL || flags & LOGO_SHAREWARESCREENS))
{
setview(0,0,xdim-1,ydim-1);
flushperms();
@ -5216,7 +5216,7 @@ int32_t A_Spawn(int32_t j, int32_t pn)
case LIZTROOPSTAYPUT__STATIC:
case LIZTROOPJUSTSIT__STATIC:
case LIZTROOP__STATIC:
if (g_scriptVersion == 13)
if (g_scriptVersion != 14)
default:
sp->extra <<= 1;
break;
@ -10657,11 +10657,17 @@ int32_t app_main(int32_t argc, const char **argv)
G_CleanupSearchPaths();
i = kopen4load("DUKESW.BIN",1); // JBF 20030810
if (i!=-1)
{
if (SHAREWARE)
g_Shareware = 1;
kclose(i);
else
{
i = kopen4load("DUKESW.BIN",1); // JBF 20030810
if (i != -1)
{
g_Shareware = 1;
kclose(i);
}
}
// gotta set the proper title after we compile the CONs if this is the full version
@ -11763,7 +11769,7 @@ FRAGBONUS:
{
for (ii=MapInfo[ud.volume_number*MAXLEVELS+ud.last_level-1].partime/(REALGAMETICSPERSEC*60), ij=1; ii>9; ii/=10, ij++) ;
clockpad = max(clockpad,ij);
if (!NAM)
if (!NAM && MapInfo[ud.volume_number*MAXLEVELS+ud.last_level-1].designertime)
{
for (ii=MapInfo[ud.volume_number*MAXLEVELS+ud.last_level-1].designertime/(REALGAMETICSPERSEC*60), ij=1; ii>9; ii/=10, ij++) ;
clockpad = max(clockpad,ij);
@ -11903,7 +11909,7 @@ FRAGBONUS:
gametext((320>>2)+71,yy+9,tempbuf,0,2+8+16);
yy+=10;
if (!NAM)
if (!NAM && MapInfo[ud.volume_number*MAXLEVELS+ud.last_level-1].designertime)
{
Bsprintf(tempbuf,"%0*d:%02d",clockpad,
(MapInfo[ud.volume_number*MAXLEVELS+ud.last_level-1].designertime/(REALGAMETICSPERSEC*60)),

View file

@ -91,6 +91,10 @@ static struct { uint32_t keyw; uint32_t date; } g_keywdate[] =
{ CON_ECHO, 20120304 },
{ CON_SHOWVIEWUNBIASED, 20120331 },
{ CON_ROTATESPRITEA, 20130324 },
{ CON_SHADETO, 20130522 },
{ CON_ENDOFLEVEL, 20130522 },
{ CON_IFPLAYERSL, 20130522 },
{ CON_ACTIVATE, 20130522 },
};
#endif
@ -578,6 +582,10 @@ const char *keyw[] =
"echo", // 362
"showviewunbiased", // 363
"rotatespritea", // 364
"shadeto", // 365
"endoflevel", // 366
"ifplayersl", // 367
"activate", // 368
"<null>"
};
#endif
@ -2081,16 +2089,29 @@ void G_DoGameStartup(const int32_t *params)
g_maxPlayerHealth = g_player[0].ps->max_player_health = g_player[0].ps->max_shield_amount = params[j++];
g_startArmorAmount = params[j++];
g_actorRespawnTime = params[j++];
g_itemRespawnTime = params[j++];
g_playerFriction = params[j++];
if (g_scriptVersion == 14) g_spriteGravity = params[j++];
g_rpgBlastRadius = params[j++];
g_pipebombBlastRadius = params[j++];
g_shrinkerBlastRadius = params[j++];
g_tripbombBlastRadius = params[j++];
g_morterBlastRadius = params[j++];
g_bouncemineBlastRadius = params[j++];
g_seenineBlastRadius = params[j++];
if (g_scriptVersion >= 11)
g_itemRespawnTime = params[j++];
else
g_itemRespawnTime = g_actorRespawnTime;
if (g_scriptVersion >= 11)
g_playerFriction = params[j++];
if (g_scriptVersion == 14)
g_spriteGravity = params[j++];
if (g_scriptVersion >= 11)
{
g_rpgBlastRadius = params[j++];
g_pipebombBlastRadius = params[j++];
g_shrinkerBlastRadius = params[j++];
g_tripbombBlastRadius = params[j++];
g_morterBlastRadius = params[j++];
g_bouncemineBlastRadius = params[j++];
g_seenineBlastRadius = params[j++];
}
g_player[0].ps->max_ammo_amount[PISTOL_WEAPON] = params[j++];
g_player[0].ps->max_ammo_amount[SHOTGUN_WEAPON] = params[j++];
g_player[0].ps->max_ammo_amount[CHAINGUN_WEAPON] = params[j++];
@ -2099,17 +2120,25 @@ void G_DoGameStartup(const int32_t *params)
g_player[0].ps->max_ammo_amount[SHRINKER_WEAPON] = params[j++];
g_player[0].ps->max_ammo_amount[DEVISTATOR_WEAPON] = params[j++];
g_player[0].ps->max_ammo_amount[TRIPBOMB_WEAPON] = params[j++];
g_player[0].ps->max_ammo_amount[FREEZE_WEAPON] = params[j++];
if (g_scriptVersion == 14) g_player[0].ps->max_ammo_amount[GROW_WEAPON] = params[j++];
g_damageCameras = params[j++];
g_numFreezeBounces = params[j++];
g_freezerSelfDamage = params[j++];
if (g_scriptVersion == 14)
{
g_spriteDeleteQueueSize = params[j++];
g_spriteDeleteQueueSize = clamp(g_spriteDeleteQueueSize, 0, 1024);
g_tripbombLaserMode = params[j++];
if (g_scriptVersion >= 13)
{
g_player[0].ps->max_ammo_amount[FREEZE_WEAPON] = params[j++];
if (g_scriptVersion == 14)
g_player[0].ps->max_ammo_amount[GROW_WEAPON] = params[j++];
g_damageCameras = params[j++];
g_numFreezeBounces = params[j++];
g_freezerSelfDamage = params[j++];
if (g_scriptVersion == 14)
{
g_spriteDeleteQueueSize = params[j++];
g_spriteDeleteQueueSize = clamp(g_spriteDeleteQueueSize, 0, 1024);
g_tripbombLaserMode = params[j++];
}
}
}
@ -2759,8 +2788,7 @@ static int32_t C_ParseCommand(int32_t loop)
while (j>-1)
{
bitptr[(g_scriptPtr-script)>>3] &= ~(BITPTR_POINTER<<((g_scriptPtr-script)&7));
*g_scriptPtr = 0;
g_scriptPtr++;
*g_scriptPtr++ = 0;
j--;
}
continue;
@ -3257,6 +3285,7 @@ static int32_t C_ParseCommand(int32_t loop)
case CON_CSTAT:
case CON_COUNT:
case CON_ENDOFGAME:
case CON_ENDOFLEVEL:
case CON_SPRITEPAL:
case CON_CACTOR:
case CON_MONEY:
@ -4361,6 +4390,12 @@ static int32_t C_ParseCommand(int32_t loop)
}
continue;
case CON_ACTIVATE:
*g_scriptPtr = CON_OPERATEACTIVATORS;
C_GetNextValue(LABEL_DEFINE);
*g_scriptPtr++ = g_iThisActorID;
continue;
case CON_DRAGPOINT:
case CON_GETKEYNAME:
C_GetManyVars(3);
@ -5061,6 +5096,7 @@ repeatcase:
case CON_IFMOVE:
case CON_IFP:
case CON_IFPINVENTORY:
case CON_IFPLAYERSL:
{
intptr_t offset;
intptr_t lastScriptPtr = (g_scriptPtr-&script[0]-1);
@ -5588,12 +5624,17 @@ repeatcase:
textptr += 5;
while (*textptr == ' ' || *textptr == '\t') textptr++;
MapInfo[j *MAXLEVELS+k].designertime =
(((*(textptr+0)-'0')*10+(*(textptr+1)-'0'))*REALGAMETICSPERSEC*60)+
(((*(textptr+3)-'0')*10+(*(textptr+4)-'0'))*REALGAMETICSPERSEC);
// cheap hack, 0.99 doesn't have the 3D Realms time
if (*(textptr+2) == ':')
{
MapInfo[j *MAXLEVELS+k].designertime =
(((*(textptr+0)-'0')*10+(*(textptr+1)-'0'))*REALGAMETICSPERSEC*60)+
(((*(textptr+3)-'0')*10+(*(textptr+4)-'0'))*REALGAMETICSPERSEC);
textptr += 5;
while (*textptr == ' ' || *textptr == '\t') textptr++;
textptr += 5;
while (*textptr == ' ' || *textptr == '\t') textptr++;
}
else g_scriptVersion = 9;
i = 0;
@ -5890,6 +5931,12 @@ repeatcase:
if (C_SetScriptSize(j)) return 1;
continue;
case CON_SHADETO:
g_scriptPtr--;
C_GetNextValue(LABEL_DEFINE);
g_scriptPtr--;
continue;
case CON_FALL:
case CON_TIP:
// case 21:
@ -5930,19 +5977,18 @@ repeatcase:
g_scriptPtr--;
params[j] = *g_scriptPtr;
if (j != 25) continue;
if (j != 12 && j != 21 && j != 25) continue;
if (C_GetKeyword() != -1)
{
// initprintf("Duke Nukem 3D v1.3D style CON files detected.\n");
if (j == 12)
g_scriptVersion = 10;
else if (j == 21)
g_scriptVersion = 11;
break;
}
else
{
g_scriptVersion = 14;
// initprintf("Duke Nukem 3D v1.4+ style CON files detected.\n");
}
}
/*
@ -6130,6 +6176,23 @@ void C_InitProjectiles(void)
extern int32_t g_numObituaries;
extern int32_t g_numSelfObituaries;
static char * C_ScriptVersionString(int32_t version)
{
switch (version)
{
case 9:
return "0.99";
case 10:
return "1.0";
case 11:
return "1.1";
case 13:
return "1.3D";
default:
return "1.4+";
}
}
void C_Compile(const char *filenam)
{
char *mptr;
@ -6315,8 +6378,8 @@ void C_Compile(const char *filenam)
C_SetScriptSize(g_scriptPtr-script+8);
initprintf("Script compiled in %dms, %ld*%db, version %s\n", getticks() - startcompiletime,
(unsigned long)(g_scriptPtr-script), (int32_t)sizeof(intptr_t), (g_scriptVersion == 14?"1.4+":"1.3D"));
initprintf("Script compiled in %dms, %ld*%db, language version %s\n", getticks() - startcompiletime,
(unsigned long)(g_scriptPtr-script), (int32_t)sizeof(intptr_t), C_ScriptVersionString(g_scriptVersion));
initprintf("%d/%d labels, %d/%d variables, %d/%d arrays\n", g_numLabels,
(int32_t)min((MAXSECTORS * sizeof(sectortype)/sizeof(int32_t)),

View file

@ -937,6 +937,10 @@ enum ScriptKeywords_t
CON_ECHO, // 362
CON_SHOWVIEWUNBIASED, // 363
CON_ROTATESPRITEA, // 364
CON_SHADETO, // 365
CON_ENDOFLEVEL, // 366
CON_IFPLAYERSL, // 367
CON_ACTIVATE, // 368
CON_END
};
#endif

View file

@ -1289,6 +1289,10 @@ skip_check:
vm.g_t[4] = *insptr++;
continue;
case CON_IFPLAYERSL:
VM_CONDITIONAL(numplayers < *(++insptr));
continue;
case CON_IFPDISTL:
VM_CONDITIONAL(vm.g_x < *(++insptr));
if (vm.g_x > MAXSLEEPDIST && actor[vm.g_i].timetosleep == 0)
@ -1617,6 +1621,7 @@ skip_check:
continue;
case CON_ENDOFGAME:
case CON_ENDOFLEVEL:
insptr++;
g_player[vm.g_p].ps->timebeforeexit = *insptr++;
g_player[vm.g_p].ps->customexitsound = -1;

View file

@ -57,6 +57,13 @@ int32_t g_timerTicsPerSecond = TICRATE;
int32_t g_actorRespawnTime = 768;
int32_t g_itemRespawnTime = 768;
int32_t g_rpgBlastRadius = 1780;
int32_t g_pipebombBlastRadius = 2500;
int32_t g_shrinkerBlastRadius = 650;
int32_t g_tripbombBlastRadius = 3880;
int32_t g_morterBlastRadius = 2500;
int32_t g_bouncemineBlastRadius = 2500;
int32_t g_seenineBlastRadius = 2048;
int32_t g_scriptSize = 1048576;
@ -79,7 +86,7 @@ int16_t BlimpSpawnSprites[15] =
FREEZEAMMO__STATIC
};
int32_t g_playerFriction = 0xcc00;
int32_t g_playerFriction = 0xCFD0;
int32_t g_numFreezeBounces = 3;

View file

@ -126,13 +126,6 @@ G_EXTERN uint32_t everyothertime;
G_EXTERN uint32_t g_moveThingsCount;
G_EXTERN vec3_t my,omy,myvel;
G_EXTERN volatile char g_soundlocks[MAXSOUNDS];
G_EXTERN int32_t g_rpgBlastRadius;
G_EXTERN int32_t g_pipebombBlastRadius;
G_EXTERN int32_t g_tripbombBlastRadius;
G_EXTERN int32_t g_shrinkerBlastRadius;
G_EXTERN int32_t g_morterBlastRadius;
G_EXTERN int32_t g_bouncemineBlastRadius;
G_EXTERN int32_t g_seenineBlastRadius;
G_EXTERN int32_t g_restorePalette;
G_EXTERN int32_t g_screenCapture;
G_EXTERN int32_t g_noEnemies;
@ -156,6 +149,13 @@ G_EXTERN int16_t BlimpSpawnSprites[15];
G_EXTERN int32_t g_playerFriction;
G_EXTERN int32_t g_numFreezeBounces;
G_EXTERN int32_t g_lastSaveSlot;
G_EXTERN int32_t g_rpgBlastRadius;
G_EXTERN int32_t g_pipebombBlastRadius;
G_EXTERN int32_t g_tripbombBlastRadius;
G_EXTERN int32_t g_shrinkerBlastRadius;
G_EXTERN int32_t g_morterBlastRadius;
G_EXTERN int32_t g_bouncemineBlastRadius;
G_EXTERN int32_t g_seenineBlastRadius;
G_EXTERN char CheatKeys[2];
G_EXTERN char setupfilename[BMAX_PATH];
#endif

View file

@ -33,21 +33,24 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
// custom GRP support for the startup window, file format reflects the structure below
#define GAMELISTFILE "games.list"
// name crc size flags dependency scriptname defname
// name crc size flags dependency scriptname defname
struct grpfile internalgrpfiles[NUMGRPFILES] =
{
{ "Duke Nukem 3D", DUKE13_CRC, 26524524, GAMEFLAG_DUKE, 0, NULL, NULL, NULL },
{ "Duke Nukem 3D (South Korean Censored)", DUKEKR_CRC, 26385383, GAMEFLAG_DUKE, 0, NULL, NULL, NULL },
{ "Duke Nukem 3D: Atomic Edition", DUKE15_CRC, 44356548, GAMEFLAG_DUKE, 0, NULL, NULL, NULL },
{ "Duke Nukem 3D: Plutonium Pak", DUKEPP_CRC, 44348015, GAMEFLAG_DUKE, 0, NULL, NULL, NULL },
{ "Duke Nukem 3D Shareware", DUKESW_CRC, 11035779, GAMEFLAG_DUKE, 0, NULL, NULL, NULL },
{ "Duke Nukem 3D Mac Demo", DUKEMD_CRC, 10444391, GAMEFLAG_DUKE, 0, NULL, NULL, NULL },
{ "Duke it out in D.C.", DUKEDC_CRC, 8410183 , GAMEFLAG_DUKE|GAMEFLAG_ADDON, DUKE15_CRC, NULL, NULL, NULL },
{ "Duke Caribbean: Life's a Beach", DUKECB_CRC, 22213819, GAMEFLAG_DUKE|GAMEFLAG_ADDON, DUKE15_CRC, NULL, NULL, NULL },
{ "Duke: Nuclear Winter", DUKENW_CRC, 16169365, GAMEFLAG_DUKE|GAMEFLAG_ADDON, DUKE15_CRC, "nwinter.con", NULL, NULL },
{ "NAM", NAM_CRC, 43448927, GAMEFLAG_NAM, 0, "nam.con", "nam.def", NULL },
{ "NAPALM", NAPALM_CRC, 44365728, GAMEFLAG_NAM|GAMEFLAG_NAPALM, 0, "napalm.con", "nam.def", NULL },
{ "WWII GI", WW2GI_CRC, 77939508, GAMEFLAG_WW2GI|GAMEFLAG_NAM, 0, "ww2gi.con", "ww2gi.def", NULL },
{ "Duke Nukem 3D", DUKE13_CRC, 26524524, GAMEFLAG_DUKE, 0, NULL, NULL, NULL },
{ "Duke Nukem 3D (South Korean Censored)", DUKEKR_CRC, 26385383, GAMEFLAG_DUKE, 0, NULL, NULL, NULL },
{ "Duke Nukem 3D: Atomic Edition", DUKE15_CRC, 44356548, GAMEFLAG_DUKE, 0, NULL, NULL, NULL },
{ "Duke Nukem 3D: Plutonium Pak", DUKEPP_CRC, 44348015, GAMEFLAG_DUKE, 0, NULL, NULL, NULL },
{ "Duke Nukem 3D Shareware 0.99", DUKE099_CRC, 9690241, GAMEFLAG_DUKE|GAMEFLAG_DUKEBETA, 0, NULL, NULL, NULL },
{ "Duke Nukem 3D Shareware 1.0", DUKE10_CRC, 10429258, GAMEFLAG_DUKE|GAMEFLAG_SHAREWARE, 0, NULL, NULL, NULL },
{ "Duke Nukem 3D Shareware 1.1", DUKE11_CRC, 10442980, GAMEFLAG_DUKE|GAMEFLAG_SHAREWARE, 0, NULL, NULL, NULL },
{ "Duke Nukem 3D Shareware 1.3D", DUKESW_CRC, 11035779, GAMEFLAG_DUKE|GAMEFLAG_SHAREWARE, 0, NULL, NULL, NULL },
{ "Duke Nukem 3D Mac Demo", DUKEMD_CRC, 10444391, GAMEFLAG_DUKE|GAMEFLAG_SHAREWARE, 0, NULL, NULL, NULL },
{ "Duke it out in D.C.", DUKEDC_CRC, 8410183 , GAMEFLAG_DUKE|GAMEFLAG_ADDON, DUKE15_CRC, NULL, NULL, NULL },
{ "Duke Caribbean: Life's a Beach", DUKECB_CRC, 22213819, GAMEFLAG_DUKE|GAMEFLAG_ADDON, DUKE15_CRC, NULL, NULL, NULL },
{ "Duke: Nuclear Winter", DUKENW_CRC, 16169365, GAMEFLAG_DUKE|GAMEFLAG_ADDON, DUKE15_CRC, "nwinter.con", NULL, NULL },
{ "NAM", NAM_CRC, 43448927, GAMEFLAG_NAM, 0, "nam.con", "nam.def", NULL },
{ "NAPALM", NAPALM_CRC, 44365728, GAMEFLAG_NAM|GAMEFLAG_NAPALM, 0, "napalm.con", "nam.def", NULL },
{ "WWII GI", WW2GI_CRC, 77939508, GAMEFLAG_WW2GI|GAMEFLAG_NAM, 0, "ww2gi.con", "ww2gi.def", NULL },
};
struct grpfile *foundgrps = NULL;
struct grpfile *listgrps = NULL;
@ -454,6 +457,9 @@ int32_t ScanGroups(void)
}
}
if (igrp->game && !grp->game)
grp->game = igrp->game;
grp=grp->next;
}

View file

@ -26,20 +26,23 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#define MAXLISTNAMELEN 32
// List of internally-known GRP files
#define NUMGRPFILES 12
#define NUMGRPFILES 15
#define DUKE13_CRC (int32_t)0xBBC9CE44
#define DUKEKR_CRC (int32_t)0xAA4F6A40
#define DUKE15_CRC (int32_t)0xFD3DCFF1
#define DUKEPP_CRC (int32_t)0xF514A6AC
#define DUKESW_CRC (int32_t)0x983AD923
#define DUKEMD_CRC (int32_t)0xC5F71561
#define DUKEDC_CRC (int32_t)0xA8CF80DA
#define DUKECB_CRC (int32_t)0x18F01C5B
#define DUKENW_CRC (int32_t)0xF1CAE8E4
#define NAM_CRC (int32_t)0x75C1F07B
#define NAPALM_CRC (int32_t)0x3DE1589A
#define WW2GI_CRC (int32_t)0x907B82BF
#define DUKE13_CRC (int32_t)0xBBC9CE44
#define DUKEKR_CRC (int32_t)0xAA4F6A40
#define DUKE15_CRC (int32_t)0xFD3DCFF1
#define DUKEPP_CRC (int32_t)0xF514A6AC
#define DUKE099_CRC (int32_t)0x02F18900
#define DUKE10_CRC (int32_t)0xA28AA589
#define DUKE11_CRC (int32_t)0x912E1E8D
#define DUKESW_CRC (int32_t)0x983AD923
#define DUKEMD_CRC (int32_t)0xC5F71561
#define DUKEDC_CRC (int32_t)0xA8CF80DA
#define DUKECB_CRC (int32_t)0x18F01C5B
#define DUKENW_CRC (int32_t)0xF1CAE8E4
#define NAM_CRC (int32_t)0x75C1F07B
#define NAPALM_CRC (int32_t)0x3DE1589A
#define WW2GI_CRC (int32_t)0x907B82BF
enum addon_t {
ADDON_NONE,

View file

@ -926,7 +926,7 @@ void M_DisplayMenus(void)
mgametext(160,41-8,"You are playing the shareware",0,2+8+16);
mgametext(160,50-8,"version of Duke Nukem 3D. While",0,2+8+16);
mgametext(160,59-8,"this version is really cool, you",0,2+8+16);
mgametext(160,68-8,"are missing over 75%% of the total",0,2+8+16);
mgametext(160,68-8,"are missing over 75% of the total",0,2+8+16);
mgametext(160,77-8,"game, along with other great extras",0,2+8+16);
mgametext(160,86-8,"and games, which you'll get when",0,2+8+16);
mgametext(160,95-8,"you order the complete version and",0,2+8+16);
@ -2019,7 +2019,7 @@ void M_DisplayMenus(void)
M_DrawTopBar("About EDuke32");
cheat_for_port_credits:
if (g_scriptVersion == 13) l = (-2);
if (g_scriptVersion != 14) l = (-2);
mgametext(160,38-l,"Programming and Project Management",0,2+8+16);
p = "Richard \"TerminX\" Gobeille";
minitext(161-(Bstrlen(p)<<1), 39+10-l, p, 4, 10+16+128);
@ -2060,7 +2060,7 @@ cheat_for_port_credits:
M_DrawTopBar("About EDuke32");
cheat_for_port_credits2:
if (g_scriptVersion == 13) l = (-2);
if (g_scriptVersion != 14) l = (-2);
mgametext(160,38-l,"License and Other Contributors",0,2+8+16);
{
const char *header[] =