- Fixed: player.damagescreencolor was not implemented for the GL renderer.

Update to ZDoom r1190:

- Gave the PlayerPawn base class a default damage fade color instead of
  hacking it into the actor when actually used.
- Fixed: The DamageFade color was not saved in savegames.
- Added Blzut3's patch for a real Chex Quest game mode.
- Fixed: SKIP_SUPER doesn't work for inventory items so it must be
  disabled for them
- Fixed: Chex Quest doesn't have a HELP2 screen so it must not be used
  in the gameinfo.
- Fixed: Default blood color is no longer red so P_DrawSplash2 must
  get it from the gameinfo instead.
- Added new French language texts by DoomKn1ght_.
- Blood default color is set in the gameinfo now so that Chex Quest
  can default to green instead of red.
- Fixed: The version of CheckNumForFullName that checks for a specific
  WAD did not work.
- Moved MAPINFO names into gameinfo structure.
- Added Chex Quest support. Credits go to fraggle for creating a 
  Dehacked patch that does most of the work. The rest includes a new
  MAPINFO and removal of the drop items from the monsters being used.
- Added Win64 support to the crash report generator. (Pity that Win32
  cannot be as informative.)
- Added and fixed Boss death submission for random spawner.
- Added functions to FActorInfo that can set the damage factors and
  pain chances to reduce the chance of new errors when working with
  these features.
- Fixed: The handling of the deprecated FIRERESIST flag didn't work.
  There were 3 problems:
  * Actor defaults have no class information so HandleDeprecatedFlags
    needs to be passed a pointer to the ActorInfo.
  * The DamageFactors list is only created when needed so the code needs to
    check if it already exists.
  * damage factors are stored as fixed_t but this set a float.
- Fixed: Timidity::Renderer::reset_voices() must completely zero the
  voices. Because this wasn't done, note_on() could try to access
  the sample for a voice that had never been played yet and access
  random memory. There may be other places where it's a problem, but
  this is where I noticed it, by chance.
- Added a traditional Strife color set for the automap.


git-svn-id: http://mancubus.net/svn/hosted/gzdoom/trunk@166 b0f79afe-0144-0410-b225-9a4edf0717df
This commit is contained in:
Christoph Oelckers 2008-09-01 19:08:19 +00:00
parent 62fa25fd63
commit 43b83f14c9
53 changed files with 1801 additions and 214 deletions

View file

@ -1,3 +1,85 @@
September 1, 2008 (Changes by Graf Zahl)
- Gave the PlayerPawn base class a default damage fade color instead of
hacking it into the actor when actually used.
- Fixed: The DamageFade color was not saved in savegames.
August 30, 2008 (Changes by Graf Zahl)
- Added Blzut3's patch for a real Chex Quest game mode.
August 29, 2008 (Changes by Graf Zahl)
- Fixed: SKIP_SUPER doesn't work for inventory items so it must be
disabled for them
- Fixed: Chex Quest doesn't have a HELP2 screen so it must not be used
in the gameinfo.
- Fixed: Default blood color is no longer red so P_DrawSplash2 must
get it from the gameinfo instead.
- Added new French language texts by DoomKn1ght_.
August 26, 2008 (Changes by Graf Zahl)
- Blood default color is set in the gameinfo now so that Chex Quest
can default to green instead of red.
- Fixed: The version of CheckNumForFullName that checks for a specific
WAD did not work.
- Moved MAPINFO names into gameinfo structure.
- Added Chex Quest support. Credits go to fraggle for creating a
Dehacked patch that does most of the work. The rest includes a new
MAPINFO and removal of the drop items from the monsters being used.
August 23, 2008
- Added Win64 support to the crash report generator. (Pity that Win32
cannot be as informative.)
August 22, 2008 (Changes by Graf Zahl)
- Added and fixed Boss death submission for random spawner.
- Added functions to FActorInfo that can set the damage factors and
pain chances to reduce the chance of new errors when working with
these features.
- Fixed: The handling of the deprecated FIRERESIST flag didn't work.
There were 3 problems:
* Actor defaults have no class information so HandleDeprecatedFlags
needs to be passed a pointer to the ActorInfo.
* The DamageFactors list is only created when needed so the code needs to
check if it already exists.
* damage factors are stored as fixed_t but this set a float.
August 22, 2008
- Fixed: Timidity::Renderer::reset_voices() must completely zero the
voices. Because this wasn't done, note_on() could try to access
the sample for a voice that had never been played yet and access
random memory. There may be other places where it's a problem, but
this is where I noticed it, by chance.
August 21, 2008 (Changes by Graf Zahl)
- Added a traditional Strife color set for the automap.
August 21, 2008 (Changes by Graf Zahl)
- Fixed: The conversion of the strings in wbstartstruct_t to FStrings
caused crashes when reloading the hub data.
- Replaced WALLF_AUTOCONTRAST with WALLF_NOFAKECONTRAST so that the
default setting for the flags is 0.
- Added: doom2day's smoothlighting
- Added: dontincrement argument to A_CheckForReload.
- Fixed: The UDMF parser wrote class filter bits into SkillFilter.
- Fixed: (SBARINFO patch) DrawInventoryBar has a missing argument in
one of its drawgraphic calls.
August 20, 2008 (Changes by Graf Zahl)
- Added Gez's patch for Heretic's GIMME cheat.
- Externalized some cheat strings.
August 19, 2008 (Changes by Graf Zahl)
- Added Gez's patch for removing MF4_FIRERESIST.
August 18, 2008 (SBARINFO patch)
- Fixed: DrawBar would not show.
- Fixed: IsSelected took string constants instead of identifiers.
August 16, 2008 (Changes by Graf Zahl)
- Put more floor/ceiling properties in sector_t into a substructure and
added wrapper functions.
- Fixed: A_Explode wants the distance parameter as an int, not a fixed_t.
- some minor DECORATE fixes.
August 14, 2008 (Changes by Graf Zahl) August 14, 2008 (Changes by Graf Zahl)
- Fixed: The count parameter of A_Jump is a constant, not an expression. - Fixed: The count parameter of A_Jump is a constant, not an expression.
- Fixed: A_Jump used a wrong index into the jump address table. - Fixed: A_Jump used a wrong index into the jump address table.
@ -36,14 +118,14 @@ August 12, 2008 (Changes by Graf Zahl)
- Removed code related to internal ActorInfo definitions from dobjtype.cpp. - Removed code related to internal ActorInfo definitions from dobjtype.cpp.
- removed unneeded file dehackedactions.h - removed unneeded file dehackedactions.h
August 11, 2008 August 11, 2008
- Ported asm_x86_64/tmap3.nas to AT&T syntax so it can be compiled with gas. - Ported asm_x86_64/tmap3.nas to AT&T syntax so it can be compiled with gas.
After finding out that gas does have directives to describe the .eh_frame After finding out that gas does have directives to describe the .eh_frame
metadata, I figured that would be significantly easier and quicker than metadata, I figured that would be significantly easier and quicker than
trying to locate all the scattered docs needed to construct it by hand. trying to locate all the scattered docs needed to construct it by hand.
Unfortunately, this now means I have to maintain two versions of exactly Unfortunately, this now means I have to maintain two versions of exactly
the same code. :( the same code. :(
August 11, 2008 (Changes by Graf Zahl) August 11, 2008 (Changes by Graf Zahl)
- Removed 'eval' modifier from DECORATE. All int, float and bool parameters are - Removed 'eval' modifier from DECORATE. All int, float and bool parameters are
'eval' now by default. 'eval' now by default.

View file

@ -229,7 +229,7 @@ void CT_Drawer (void)
} }
// draw the prompt, text, and cursor // draw the prompt, text, and cursor
ChatQueue[len] = gameinfo.gametype == GAME_Doom ? '_' : '['; ChatQueue[len] = gameinfo.gametype & GAME_DoomChex ? '_' : '[';
ChatQueue[len+1] = '\0'; ChatQueue[len+1] = '\0';
if (con_scaletext < 2) if (con_scaletext < 2)
{ {

View file

@ -2096,17 +2096,19 @@ static int DoInclude (int dummy)
return GetLine(); return GetLine();
} }
void DoDehPatch (const char *patchfile, bool autoloading) void DoDehPatch (const char *patchfile, bool autoloading, int lump)
{ {
char file[256]; char file[256];
int cont; int cont;
int filelen = 0; // Be quiet, gcc int filelen = 0; // Be quiet, gcc
int lump;
PatchFile = NULL; PatchFile = NULL;
PatchName = NULL; PatchName = NULL;
lump = Wads.CheckNumForName ("DEHACKED"); if (lump < 0)
{
lump = Wads.CheckNumForName ("DEHACKED");
}
if (lump >= 0 && autoloading) if (lump >= 0 && autoloading)
{ {

View file

@ -57,7 +57,7 @@ public:
}; };
void DoDehPatch (const char *patchfile, bool autoloading); void DoDehPatch (const char *patchfile, bool autoloading, int lumpnum=-1);
void FinishDehPatch (); void FinishDehPatch ();
#endif //__D_DEHACK_H__ #endif //__D_DEHACK_H__

View file

@ -147,6 +147,9 @@ extern gameinfo_t HexenDKGameInfo;
extern gameinfo_t StrifeGameInfo; extern gameinfo_t StrifeGameInfo;
extern gameinfo_t StrifeTeaserGameInfo; extern gameinfo_t StrifeTeaserGameInfo;
extern gameinfo_t StrifeTeaser2GameInfo; extern gameinfo_t StrifeTeaser2GameInfo;
extern gameinfo_t ChexGameInfo;
extern gameinfo_t PlutoniaGameInfo;
extern gameinfo_t TNTGameInfo;
extern int testingmode; extern int testingmode;
extern bool setmodeneeded; extern bool setmodeneeded;
@ -227,6 +230,7 @@ const IWADInfo IWADInfos[NUM_IWAD_TYPES] =
{ "Strife: Teaser (Old Version)", NULL, MAKERGB(224,173,153), MAKERGB(0,107,101) }, { "Strife: Teaser (Old Version)", NULL, MAKERGB(224,173,153), MAKERGB(0,107,101) },
{ "Strife: Teaser (New Version)", NULL, MAKERGB(224,173,153), MAKERGB(0,107,101) }, { "Strife: Teaser (New Version)", NULL, MAKERGB(224,173,153), MAKERGB(0,107,101) },
{ "Freedoom", "Freedoom", MAKERGB(50,84,67), MAKERGB(198,220,209) }, { "Freedoom", "Freedoom", MAKERGB(50,84,67), MAKERGB(198,220,209) },
{ "Chex(R) Quest", "Chex", MAKERGB(255,255,0), MAKERGB(0,192,0) },
}; };
// PRIVATE DATA DEFINITIONS ------------------------------------------------ // PRIVATE DATA DEFINITIONS ------------------------------------------------
@ -251,6 +255,7 @@ static const char *IWADNames[] =
"strife1.wad", "strife1.wad",
"strife0.wad", "strife0.wad",
"freedoom.wad", // Freedoom.wad is distributed as Doom2.wad, but this allows to have both in the same directory. "freedoom.wad", // Freedoom.wad is distributed as Doom2.wad, but this allows to have both in the same directory.
"chex.wad",
#ifdef unix #ifdef unix
"DOOM2.WAD", // Also look for all-uppercase names "DOOM2.WAD", // Also look for all-uppercase names
"PLUTONIA.WAD", "PLUTONIA.WAD",
@ -264,6 +269,7 @@ static const char *IWADNames[] =
"STRIFE1.WAD", "STRIFE1.WAD",
"STRIFE0.WAD", "STRIFE0.WAD",
"FREEDOOM.WAD", "FREEDOOM.WAD",
"CHEX.WAD",
#endif #endif
NULL NULL
}; };
@ -661,7 +667,7 @@ void D_Display ()
FTexture *tex; FTexture *tex;
int x; int x;
tex = TexMan[gameinfo.gametype & (GAME_Doom|GAME_Strife) ? "M_PAUSE" : "PAUSED"]; tex = TexMan[gameinfo.gametype & (GAME_DoomStrifeChex) ? "M_PAUSE" : "PAUSED"];
x = (SCREENWIDTH - tex->GetWidth()*CleanXfac)/2 + x = (SCREENWIDTH - tex->GetWidth()*CleanXfac)/2 +
tex->LeftOffset*CleanXfac; tex->LeftOffset*CleanXfac;
screen->DrawTexture (tex, x, 4, DTA_CleanNoMove, true, TAG_DONE); screen->DrawTexture (tex, x, 4, DTA_CleanNoMove, true, TAG_DONE);
@ -1324,8 +1330,8 @@ static void SetIWAD (const char *iwadpath, EIWADType type)
const gameinfo_t *Info; const gameinfo_t *Info;
GameMission_t Mission; GameMission_t Mission;
} Datas[NUM_IWAD_TYPES] = { } Datas[NUM_IWAD_TYPES] = {
{ commercial, &CommercialGameInfo, pack_tnt }, // Doom2TNT { commercial, &TNTGameInfo, pack_tnt }, // Doom2TNT
{ commercial, &CommercialGameInfo, pack_plut }, // Doom2Plutonia { commercial, &PlutoniaGameInfo, pack_plut }, // Doom2Plutonia
{ commercial, &HexenGameInfo, doom2 }, // Hexen { commercial, &HexenGameInfo, doom2 }, // Hexen
{ commercial, &HexenDKGameInfo, doom2 }, // HexenDK { commercial, &HexenDKGameInfo, doom2 }, // HexenDK
{ commercial, &CommercialGameInfo, doom2 }, // Doom2 { commercial, &CommercialGameInfo, doom2 }, // Doom2
@ -1339,6 +1345,7 @@ static void SetIWAD (const char *iwadpath, EIWADType type)
{ commercial, &StrifeTeaserGameInfo, doom2 }, // StrifeTeaser { commercial, &StrifeTeaserGameInfo, doom2 }, // StrifeTeaser
{ commercial, &StrifeTeaser2GameInfo, doom2 }, // StrifeTeaser2 { commercial, &StrifeTeaser2GameInfo, doom2 }, // StrifeTeaser2
{ commercial, &CommercialGameInfo, doom2 }, // FreeDoom { commercial, &CommercialGameInfo, doom2 }, // FreeDoom
{ registered, &ChexGameInfo, doom }, // Chex Quest
}; };
D_AddFile (iwadpath); D_AddFile (iwadpath);
@ -1382,10 +1389,13 @@ static EIWADType ScanIWAD (const char *iwad)
"MAP33", "MAP33",
"INVCURS", "INVCURS",
{ 'F','R','E','E','D','O','O','M' }, { 'F','R','E','E','D','O','O','M' },
"W94_1",
{ 'P','O','S','S','H','0','M','0' },
"E2M1","E2M2","E2M3","E2M4","E2M5","E2M6","E2M7","E2M8","E2M9", "E2M1","E2M2","E2M3","E2M4","E2M5","E2M6","E2M7","E2M8","E2M9",
"E3M1","E3M2","E3M3","E3M4","E3M5","E3M6","E3M7","E3M8","E3M9", "E3M1","E3M2","E3M3","E3M4","E3M5","E3M6","E3M7","E3M8","E3M9",
"DPHOOF","BFGGA0","HEADA1","CYBRA1", "DPHOOF","BFGGA0","HEADA1","CYBRA1",
{ 'S','P','I','D','A','1','D','1' }, { 'S','P','I','D','A','1','D','1' },
}; };
#define NUM_CHECKLUMPS (sizeof(checklumps)/8) #define NUM_CHECKLUMPS (sizeof(checklumps)/8)
enum enum
@ -1402,6 +1412,8 @@ static EIWADType ScanIWAD (const char *iwad)
Check_map33, Check_map33,
Check_invcurs, Check_invcurs,
Check_FreeDoom, Check_FreeDoom,
Check_W94_1,
Check_POSSH0M0,
Check_e2m1 Check_e2m1
}; };
int lumpsfound[NUM_CHECKLUMPS]; int lumpsfound[NUM_CHECKLUMPS];
@ -1512,7 +1524,14 @@ static EIWADType ScanIWAD (const char *iwad)
{ {
if (lumpsfound[Check_e4m1]) if (lumpsfound[Check_e4m1])
{ {
return IWAD_UltimateDoom; if (lumpsfound[Check_W94_1] && lumpsfound[Check_POSSH0M0])
{
return IWAD_ChexQuest;
}
else
{
return IWAD_UltimateDoom;
}
} }
else else
{ {

View file

@ -71,6 +71,7 @@ enum EIWADType
IWAD_StrifeTeaser, IWAD_StrifeTeaser,
IWAD_StrifeTeaser2, IWAD_StrifeTeaser2,
IWAD_FreeDoom, IWAD_FreeDoom,
IWAD_ChexQuest,
NUM_IWAD_TYPES NUM_IWAD_TYPES
}; };

View file

@ -120,7 +120,6 @@ public:
fixed_t AttackZOffset; // attack height, relative to player center fixed_t AttackZOffset; // attack height, relative to player center
// [CW] Fades for when you are being damaged. // [CW] Fades for when you are being damaged.
bool HasDamageFade;
float RedDamageFade; float RedDamageFade;
float GreenDamageFade; float GreenDamageFade;
float BlueDamageFade; float BlueDamageFade;

View file

@ -45,6 +45,7 @@
#include "r_draw.h" #include "r_draw.h"
#include "a_sharedglobal.h" #include "a_sharedglobal.h"
#include "r_translate.h" #include "r_translate.h"
#include "gi.h"
FDecalLib DecalLibrary; FDecalLib DecalLibrary;
@ -515,8 +516,15 @@ void FDecalLib::ParseDecal (FScanner &sc)
case DECAL_SHADE: case DECAL_SHADE:
sc.MustGetString (); sc.MustGetString ();
if (!sc.Compare("BloodDefault"))
{
newdecal.ShadeColor = V_GetColor (NULL, sc.String);
}
else
{
newdecal.ShadeColor = gameinfo.defaultbloodcolor;
}
newdecal.RenderStyle = STYLE_Shaded; newdecal.RenderStyle = STYLE_Shaded;
newdecal.ShadeColor = V_GetColor (NULL, sc.String);
newdecal.ShadeColor |= newdecal.ShadeColor |=
ColorMatcher.Pick (RPART(newdecal.ShadeColor), ColorMatcher.Pick (RPART(newdecal.ShadeColor),
GPART(newdecal.ShadeColor), BPART(newdecal.ShadeColor)) << 24; GPART(newdecal.ShadeColor), BPART(newdecal.ShadeColor)) << 24;

View file

@ -393,9 +393,9 @@ void F_TextWrite (void)
return; return;
// draw some of the text onto the screen // draw some of the text onto the screen
leftmargin = (gameinfo.gametype & (GAME_Doom|GAME_Strife|GAME_Hexen) ? 10 : 20) - 160; leftmargin = (gameinfo.gametype & (GAME_DoomStrifeChex|GAME_Hexen) ? 10 : 20) - 160;
rowheight = screen->Font->GetHeight () + rowheight = screen->Font->GetHeight () +
(gameinfo.gametype & (GAME_Doom|GAME_Strife) ? 3 : -1); (gameinfo.gametype & (GAME_DoomStrifeChex) ? 3 : -1);
scale = (CleanXfac != 1 || CleanYfac != 1); scale = (CleanXfac != 1 || CleanYfac != 1);
cx = leftmargin; cx = leftmargin;
@ -405,7 +405,7 @@ void F_TextWrite (void)
} }
else else
{ {
cy = (gameinfo.gametype & (GAME_Doom|GAME_Strife) ? 10 : 5) - 100; cy = (gameinfo.gametype & (GAME_DoomStrifeChex) ? 10 : 5) - 100;
} }
ch = FinaleText.GetChars(); ch = FinaleText.GetChars();

View file

@ -623,41 +623,12 @@ void G_ParseMapInfo ()
atterm (G_UnloadMapInfo); atterm (G_UnloadMapInfo);
// Parse the default MAPINFO for the current game. // Parse the default MAPINFO for the current game.
switch (gameinfo.gametype) for(int i=0; i<2; i++)
{ {
case GAME_Doom: if (gameinfo.mapinfo[i] != NULL)
G_DoParseMapInfo (Wads.GetNumForFullName ("mapinfo/doomcommon.txt"));
switch (gamemission)
{ {
case doom: G_DoParseMapInfo(Wads.GetNumForFullName(gameinfo.mapinfo[i]));
G_DoParseMapInfo (Wads.GetNumForFullName ("mapinfo/doom1.txt"));
break;
case pack_plut:
G_DoParseMapInfo (Wads.GetNumForFullName ("mapinfo/plutonia.txt"));
break;
case pack_tnt:
G_DoParseMapInfo (Wads.GetNumForFullName ("mapinfo/tnt.txt"));
break;
default:
G_DoParseMapInfo (Wads.GetNumForFullName ("mapinfo/doom2.txt"));
break;
} }
break;
case GAME_Heretic:
G_DoParseMapInfo (Wads.GetNumForFullName ("mapinfo/heretic.txt"));
break;
case GAME_Hexen:
G_DoParseMapInfo (Wads.GetNumForFullName ("mapinfo/hexen.txt"));
break;
case GAME_Strife:
G_DoParseMapInfo (Wads.GetNumForFullName ("mapinfo/strife.txt"));
break;
default:
break;
} }
// Parse any extra MAPINFOs. // Parse any extra MAPINFOs.
@ -1736,7 +1707,7 @@ void G_InitNew (const char *mapname, bool bTitleLevel)
{ {
int cstype = SBarInfoScript->GetGameType(); int cstype = SBarInfoScript->GetGameType();
if(cstype == GAME_Doom) //Did the user specify a "base" if(cstype == GAME_Doom || cstype == GAME_Chex) //Did the user specify a "base"
{ {
StatusBar = CreateDoomStatusBar (); StatusBar = CreateDoomStatusBar ();
} }
@ -1759,7 +1730,7 @@ void G_InitNew (const char *mapname, bool bTitleLevel)
} }
if (StatusBar == NULL) if (StatusBar == NULL)
{ {
if (gameinfo.gametype == GAME_Doom) if (gameinfo.gametype & GAME_DoomChex)
{ {
StatusBar = CreateDoomStatusBar (); StatusBar = CreateDoomStatusBar ();
} }

View file

@ -41,6 +41,7 @@ void ABasicArmor::Tick ()
{ {
switch (gameinfo.gametype) switch (gameinfo.gametype)
{ {
case GAME_Chex:
case GAME_Doom: case GAME_Doom:
Icon = TexMan.CheckForTexture (SavePercent == FRACUNIT/3 ? "ARM1A0" : "ARM2A0", FTexture::TEX_Any); Icon = TexMan.CheckForTexture (SavePercent == FRACUNIT/3 ? "ARM1A0" : "ARM2A0", FTexture::TEX_Any);
break; break;

View file

@ -211,6 +211,10 @@ static void ParseLock(FScanner &sc)
{ {
if (gameinfo.gametype != GAME_Strife) keynum=-1; if (gameinfo.gametype != GAME_Strife) keynum=-1;
} }
else if (sc.Compare("CHEX"))
{
if (gameinfo.gametype != GAME_Chex) keynum=-1;
}
else sc.UnGet(); else sc.UnGet();
ignorekey = true; ignorekey = true;

View file

@ -262,7 +262,7 @@ AAmmo *AWeapon::AddAmmo (AActor *other, const PClass *ammotype, int amount)
// [BC] This behavior is from the original Doom. Give 5/2 times as much ammo when // [BC] This behavior is from the original Doom. Give 5/2 times as much ammo when
// we pick up a weapon in deathmatch. // we pick up a weapon in deathmatch.
if (( deathmatch ) && ( gameinfo.gametype == GAME_Doom )) if (( deathmatch ) && ( gameinfo.gametype & GAME_DoomChex ))
amount = amount * 5 / 2; amount = amount * 5 / 2;
// extra ammo in baby mode and nightmare mode // extra ammo in baby mode and nightmare mode

View file

@ -1177,7 +1177,7 @@ void DBaseStatusBar::Draw (EHudState state)
{ {
int y, i, time = level.time / TICRATE, height; int y, i, time = level.time / TICRATE, height;
int totaltime = level.totaltime / TICRATE; int totaltime = level.totaltime / TICRATE;
EColorRange highlight = (gameinfo.gametype == GAME_Doom) ? EColorRange highlight = (gameinfo.gametype & GAME_DoomChex) ?
CR_UNTRANSLATED : CR_YELLOW; CR_UNTRANSLATED : CR_YELLOW;
height = screen->Font->GetHeight () * CleanYfac; height = screen->Font->GetHeight () * CleanYfac;
@ -1474,16 +1474,6 @@ void DBaseStatusBar::BlendView (float blend[4])
cnt = 228; cnt = 228;
APlayerPawn *mo = players[consoleplayer].mo; APlayerPawn *mo = players[consoleplayer].mo;
// [CW] If no damage fade is specified, assume defaults.
if (!mo->HasDamageFade)
{
mo->HasDamageFade = true;
mo->RedDamageFade = 255;
mo->GreenDamageFade = 0;
mo->BlueDamageFade = 0;
}
AddBlend (mo->RedDamageFade / 255, mo->GreenDamageFade / 255, mo->BlueDamageFade / 255, cnt / 255.f, blend); AddBlend (mo->RedDamageFade / 255, mo->GreenDamageFade / 255, mo->BlueDamageFade / 255, cnt / 255.f, blend);
} }

View file

@ -225,7 +225,7 @@ void FGameConfigFile::DoGameSetup (const char *gamename)
{ {
const char *key; const char *key;
const char *value; const char *value;
enum { Doom, Heretic, Hexen, Strife } game; enum { Doom, Heretic, Hexen, Strife, Chex } game;
if (strcmp (gamename, "Heretic") == 0) if (strcmp (gamename, "Heretic") == 0)
game = Heretic; game = Heretic;
@ -233,6 +233,8 @@ void FGameConfigFile::DoGameSetup (const char *gamename)
game = Hexen; game = Hexen;
else if (strcmp (gamename, "Strife") == 0) else if (strcmp (gamename, "Strife") == 0)
game = Strife; game = Strife;
else if (strcmp (gamename, "Chex") == 0)
game = Chex;
else else
game = Doom; game = Doom;
@ -663,6 +665,18 @@ void FGameConfigFile::SetupWeaponList (const char *gamename)
LocalWeapons.Slots[7].AddWeapon ("Mauler"); LocalWeapons.Slots[7].AddWeapon ("Mauler");
LocalWeapons.Slots[8].AddWeapon ("Sigil"); LocalWeapons.Slots[8].AddWeapon ("Sigil");
} }
else if (strcmp (gamename, "Chex") == 0)
{
LocalWeapons.Slots[1].AddWeapon ("Bootspoon");
LocalWeapons.Slots[1].AddWeapon ("SuperBootspork");
LocalWeapons.Slots[2].AddWeapon ("MiniZorcher");
LocalWeapons.Slots[3].AddWeapon ("LargeZorcher");
LocalWeapons.Slots[3].AddWeapon ("SuperLargeZorcher");
LocalWeapons.Slots[4].AddWeapon ("RapidZorcher");
LocalWeapons.Slots[5].AddWeapon ("ZorchPropulsor");
LocalWeapons.Slots[6].AddWeapon ("PhasingZorcher");
LocalWeapons.Slots[7].AddWeapon ("LAZDevice");
}
else // Doom else // Doom
{ {
LocalWeapons.Slots[1].AddWeapon ("Fist"); LocalWeapons.Slots[1].AddWeapon ("Fist");

View file

@ -36,12 +36,13 @@
#include "info.h" #include "info.h"
#include "gi.h" #include "gi.h"
#include "m_fixed.h" #include "m_fixed.h"
#include "v_palette.h"
gameinfo_t gameinfo; gameinfo_t gameinfo;
const char *GameNames[9] = const char *GameNames[17] =
{ {
NULL, "Doom", "Heretic", NULL, "Hexen", NULL, NULL, NULL, "Strife" NULL, "Doom", "Heretic", NULL, "Hexen", NULL, NULL, NULL, "Strife", NULL, NULL, NULL, NULL, NULL, NULL, NULL, "Chex"
}; };
@ -96,6 +97,8 @@ gameinfo_t HexenGameInfo =
"F_SKY", "F_SKY",
24*FRACUNIT, 24*FRACUNIT,
"xlat/heretic.txt", // not really correct but this was used before. "xlat/heretic.txt", // not really correct but this was used before.
{ "mapinfo/hexen.txt", NULL },
MAKERGB(100,0,0),
}; };
gameinfo_t HexenDKGameInfo = gameinfo_t HexenDKGameInfo =
@ -125,6 +128,8 @@ gameinfo_t HexenDKGameInfo =
"F_SKY", "F_SKY",
24*FRACUNIT, 24*FRACUNIT,
"xlat/heretic.txt", // not really correct but this was used before. "xlat/heretic.txt", // not really correct but this was used before.
{ "mapinfo/hexen.txt", NULL },
MAKERGB(100,0,0),
}; };
gameinfo_t HereticGameInfo = gameinfo_t HereticGameInfo =
@ -154,6 +159,8 @@ gameinfo_t HereticGameInfo =
"F_SKY1", "F_SKY1",
24*FRACUNIT, 24*FRACUNIT,
"xlat/heretic.txt", "xlat/heretic.txt",
{ "mapinfo/heretic.txt", NULL },
MAKERGB(100,0,0),
}; };
gameinfo_t HereticSWGameInfo = gameinfo_t HereticSWGameInfo =
@ -183,6 +190,8 @@ gameinfo_t HereticSWGameInfo =
"F_SKY1", "F_SKY1",
24*FRACUNIT, 24*FRACUNIT,
"xlat/heretic.txt", "xlat/heretic.txt",
{ "mapinfo/heretic.txt", NULL },
MAKERGB(100,0,0),
}; };
gameinfo_t SharewareGameInfo = gameinfo_t SharewareGameInfo =
@ -212,6 +221,8 @@ gameinfo_t SharewareGameInfo =
"F_SKY1", "F_SKY1",
24*FRACUNIT, 24*FRACUNIT,
"xlat/doom.txt", "xlat/doom.txt",
{ "mapinfo/doomcommon.txt", "mapinfo/doom1.txt" },
MAKERGB(100,0,0),
}; };
gameinfo_t RegisteredGameInfo = gameinfo_t RegisteredGameInfo =
@ -241,6 +252,39 @@ gameinfo_t RegisteredGameInfo =
"F_SKY1", "F_SKY1",
24*FRACUNIT, 24*FRACUNIT,
"xlat/doom.txt", "xlat/doom.txt",
{ "mapinfo/doomcommon.txt", "mapinfo/doom1.txt" },
MAKERGB(100,0,0),
};
gameinfo_t ChexGameInfo =
{
GI_CHEX_QUEST,
"TITLEPIC",
"CREDIT",
"HELP1",
"D_INTRO",
5,
0,
200/35,
"misc/chat2",
"D_VICTOR",
"FLOOR4_8",
"HELP2",
"VICTORY2",
"ENDPIC",
{ { "HELP1", "CREDIT" } },
"menu/quit1",
2,
"FLOOR7_2",
&DoomBorder,
0,
GAME_Chex,
100,
"F_SKY1",
24*FRACUNIT,
"xlat/doom.txt",
{ "mapinfo/chex.txt", NULL },
MAKERGB(95,175,87),
}; };
gameinfo_t RetailGameInfo = gameinfo_t RetailGameInfo =
@ -270,6 +314,8 @@ gameinfo_t RetailGameInfo =
"F_SKY1", "F_SKY1",
24*FRACUNIT, 24*FRACUNIT,
"xlat/doom.txt", "xlat/doom.txt",
{ "mapinfo/doomcommon.txt", "mapinfo/doom1.txt" },
MAKERGB(100,0,0),
}; };
gameinfo_t CommercialGameInfo = gameinfo_t CommercialGameInfo =
@ -299,6 +345,70 @@ gameinfo_t CommercialGameInfo =
"F_SKY1", "F_SKY1",
24*FRACUNIT, 24*FRACUNIT,
"xlat/doom.txt", "xlat/doom.txt",
{ "mapinfo/doomcommon.txt", "mapinfo/doom2.txt" },
MAKERGB(100,0,0),
};
gameinfo_t PlutoniaGameInfo =
{
GI_MAPxx | GI_MENUHACK_COMMERCIAL,
"TITLEPIC",
"CREDIT",
"CREDIT",
"D_DM2TTL",
11,
0,
200/35,
"misc/chat",
"D_READ_M",
"SLIME16",
"CREDIT",
"CREDIT",
"CREDIT",
{ { "HELP", "CREDIT" } },
"menu/quit2",
3,
"GRNROCK",
&DoomBorder,
0,
GAME_Doom,
100,
"F_SKY1",
24*FRACUNIT,
"xlat/doom.txt",
{ "mapinfo/doomcommon.txt", "mapinfo/plutonia.txt" },
MAKERGB(100,0,0),
};
gameinfo_t TNTGameInfo =
{
GI_MAPxx | GI_MENUHACK_COMMERCIAL,
"TITLEPIC",
"CREDIT",
"CREDIT",
"D_DM2TTL",
11,
0,
200/35,
"misc/chat",
"D_READ_M",
"SLIME16",
"CREDIT",
"CREDIT",
"CREDIT",
{ { "HELP", "CREDIT" } },
"menu/quit2",
3,
"GRNROCK",
&DoomBorder,
0,
GAME_Doom,
100,
"F_SKY1",
24*FRACUNIT,
"xlat/doom.txt",
{ "mapinfo/doomcommon.txt", "mapinfo/tnt.txt" },
MAKERGB(100,0,0),
}; };
gameinfo_t StrifeGameInfo = gameinfo_t StrifeGameInfo =
@ -328,6 +438,8 @@ gameinfo_t StrifeGameInfo =
"F_SKY001", "F_SKY001",
16*FRACUNIT, 16*FRACUNIT,
"xlat/strife.txt", "xlat/strife.txt",
{ "mapinfo/strife.txt", NULL },
MAKERGB(100,0,0),
}; };
gameinfo_t StrifeTeaserGameInfo = gameinfo_t StrifeTeaserGameInfo =
@ -357,6 +469,8 @@ gameinfo_t StrifeTeaserGameInfo =
"F_SKY001", "F_SKY001",
16*FRACUNIT, 16*FRACUNIT,
"xlat/strife.txt", "xlat/strife.txt",
{ "mapinfo/strife.txt", NULL },
MAKERGB(100,0,0),
}; };
gameinfo_t StrifeTeaser2GameInfo = gameinfo_t StrifeTeaser2GameInfo =
@ -386,4 +500,6 @@ gameinfo_t StrifeTeaser2GameInfo =
"F_SKY001", "F_SKY001",
16*FRACUNIT, 16*FRACUNIT,
"xlat/strife.txt", "xlat/strife.txt",
{ "mapinfo/strife.txt", NULL },
MAKERGB(100,0,0),
}; };

View file

@ -47,6 +47,7 @@
#define GI_MENUHACK_COMMERCIAL 0x00000060 #define GI_MENUHACK_COMMERCIAL 0x00000060
#define GI_ALWAYSFALLINGDAMAGE 0x00000080 #define GI_ALWAYSFALLINGDAMAGE 0x00000080
#define GI_TEASER2 0x00000100 // Alternate version of the Strife Teaser #define GI_TEASER2 0x00000100 // Alternate version of the Strife Teaser
#define GI_CHEX_QUEST 0x00000200
#ifndef EGAMETYPE #ifndef EGAMETYPE
#define EGAMETYPE #define EGAMETYPE
@ -57,13 +58,16 @@ enum EGameType
GAME_Heretic = 2, GAME_Heretic = 2,
GAME_Hexen = 4, GAME_Hexen = 4,
GAME_Strife = 8, GAME_Strife = 8,
GAME_Chex = 16, //Chex is basically Doom, but we need to have a different set of actors.
GAME_Raven = GAME_Heretic|GAME_Hexen, GAME_Raven = GAME_Heretic|GAME_Hexen,
GAME_DoomStrife = GAME_Doom|GAME_Strife GAME_DoomStrife = GAME_Doom|GAME_Strife,
GAME_DoomChex = GAME_Doom|GAME_Chex,
GAME_DoomStrifeChex = GAME_Doom|GAME_Strife|GAME_Chex
}; };
#endif #endif
extern const char *GameNames[9]; extern const char *GameNames[17];
typedef struct typedef struct
{ {
@ -114,6 +118,8 @@ typedef struct
char SkyFlatName[9]; char SkyFlatName[9];
fixed_t StepHeight; fixed_t StepHeight;
const char *translator; const char *translator;
const char *mapinfo[2];
DWORD defaultbloodcolor;
} gameinfo_t; } gameinfo_t;
extern gameinfo_t gameinfo; extern gameinfo_t gameinfo;

View file

@ -828,8 +828,9 @@ static void gl_DrawBlend(sector_t * viewsector)
{ {
if (cnt > 175) cnt = 175; // too strong and it gets too opaque if (cnt > 175) cnt = 175; // too strong and it gets too opaque
gl_AddBlend(1.0f, 0, 0, cnt/255.f, blend); gl_AddBlend (player->mo->RedDamageFade / 255,
player->mo->GreenDamageFade / 255,
player->mo->BlueDamageFade / 255, cnt / 255.f, blend);
} }
if (player->poisoncount) if (player->poisoncount)

View file

@ -1506,7 +1506,7 @@ void GLWall::Process(seg_t *seg, sector_t * frontsector, sector_t * backsector,
} }
//return; //return;
if (!backsector || !(seg->linedef->flags&ML_TWOSIDED)) /* onesided */ if (!backsector || !(seg->linedef->flags&ML_TWOSIDED)) // one sided
{ {
// sector's sky // sector's sky
SkyNormal(frontsector,v1,v2); SkyNormal(frontsector,v1,v2);
@ -1519,7 +1519,7 @@ void GLWall::Process(seg_t *seg, sector_t * frontsector, sector_t * backsector,
realfront->GetPlaneTexZ(sector_t::ceiling),realfront->GetPlaneTexZ(sector_t::floor), // must come from the original! realfront->GetPlaneTexZ(sector_t::ceiling),realfront->GetPlaneTexZ(sector_t::floor), // must come from the original!
fch1,fch2,ffh1,ffh2,0); fch1,fch2,ffh1,ffh2,0);
} }
else /* twosided */ else // two sided
{ {
fixed_t bch1; fixed_t bch1;

View file

@ -45,6 +45,7 @@ extern FStringTable GStrings;
// QuitGame messages // QuitGame messages
#define NUM_QUITDOOMMESSAGES 15 #define NUM_QUITDOOMMESSAGES 15
#define NUM_QUITSTRIFEMESSAGES 8 #define NUM_QUITSTRIFEMESSAGES 8
#define NUM_QUITCHEXMESSAGES 2
extern const char *endmsg[]; extern const char *endmsg[];

View file

@ -184,9 +184,12 @@ enum EGameType
GAME_Heretic = 2, GAME_Heretic = 2,
GAME_Hexen = 4, GAME_Hexen = 4,
GAME_Strife = 8, GAME_Strife = 8,
GAME_Chex = 16,
GAME_Raven = GAME_Heretic|GAME_Hexen, GAME_Raven = GAME_Heretic|GAME_Hexen,
GAME_DoomStrife = GAME_Doom|GAME_Strife GAME_DoomStrife = GAME_Doom|GAME_Strife,
GAME_DoomChex = GAME_Doom|GAME_Chex,
GAME_DoomStrifeChex = GAME_Doom|GAME_Strife|GAME_Chex
}; };
#endif #endif

View file

@ -81,10 +81,20 @@ void cht_DoCheat (player_t *player, int cheat)
// fall through to CHT_GOD // fall through to CHT_GOD
case CHT_GOD: case CHT_GOD:
player->cheats ^= CF_GODMODE; player->cheats ^= CF_GODMODE;
if (player->cheats & CF_GODMODE) if (gameinfo.gametype != GAME_Chex)
msg = GStrings("STSTR_DQDON"); {
if (player->cheats & CF_GODMODE)
msg = GStrings("STSTR_DQDON");
else
msg = GStrings("STSTR_DQDOFF");
}
else else
msg = GStrings("STSTR_DQDOFF"); {
if (player->cheats & CF_GODMODE)
msg = GStrings("STSTR_CDQDON");
else
msg = GStrings("STSTR_CDQDOFF");
}
SB_state = screen->GetPageCount (); SB_state = screen->GetPageCount ();
break; break;
@ -160,7 +170,10 @@ void cht_DoCheat (player_t *player, int cheat)
{ {
player->mo->GiveInventoryType (type); player->mo->GiveInventoryType (type);
} }
msg = GStrings("STSTR_CHOPPERS"); if(gameinfo.gametype != GAME_Chex)
msg = GStrings("STSTR_CHOPPERS");
else
msg = GStrings("STSTR_CCHOPPERS");
} }
// [RH] The original cheat also set powers[pw_invulnerability] to true. // [RH] The original cheat also set powers[pw_invulnerability] to true.
// Since this is a timer and not a boolean, it effectively turned off // Since this is a timer and not a boolean, it effectively turned off
@ -191,7 +204,10 @@ void cht_DoCheat (player_t *player, int cheat)
cht_Give (player, "ammo"); cht_Give (player, "ammo");
cht_Give (player, "keys"); cht_Give (player, "keys");
cht_Give (player, "armor"); cht_Give (player, "armor");
msg = GStrings("STSTR_KFAADDED"); if(gameinfo.gametype != GAME_Chex)
msg = GStrings("STSTR_KFAADDED");
else
msg = GStrings("STSTR_CKFAADDED");
break; break;
case CHT_IDFA: case CHT_IDFA:
@ -199,7 +215,10 @@ void cht_DoCheat (player_t *player, int cheat)
cht_Give (player, "weapons"); cht_Give (player, "weapons");
cht_Give (player, "ammo"); cht_Give (player, "ammo");
cht_Give (player, "armor"); cht_Give (player, "armor");
msg = GStrings("STSTR_FAADDED"); if(gameinfo.gametype != GAME_Chex)
msg = GStrings("STSTR_FAADDED");
else
msg = GStrings("STSTR_CFAADDED");
break; break;
case CHT_BEHOLDV: case CHT_BEHOLDV:
@ -622,6 +641,10 @@ void cht_Give (player_t *player, const char *name, int amount)
{ {
type = PClass::FindClass ("Backpack"); type = PClass::FindClass ("Backpack");
} }
else if (gameinfo.gametype == GAME_Chex)
{
type = PClass::FindClass ("Zorchpack");
}
else else
{ // Hexen doesn't have a backpack, foo! { // Hexen doesn't have a backpack, foo!
type = NULL; type = NULL;
@ -850,6 +873,10 @@ void cht_Take (player_t *player, const char *name, int amount)
{ {
type = PClass::FindClass ("Backpack"); type = PClass::FindClass ("Backpack");
} }
else if (gameinfo.gametype == GAME_Chex)
{
type = PClass::FindClass ("Zorchpack");
}
else else
{ // Hexen doesn't have a backpack, foo! { // Hexen doesn't have a backpack, foo!
type = NULL; type = NULL;

View file

@ -926,7 +926,7 @@ void M_NotifyNewSave (const char *file, const char *title, bool okForQuicksave)
// //
void M_DrawLoad (void) void M_DrawLoad (void)
{ {
if (gameinfo.gametype & (GAME_Doom|GAME_Strife)) if (gameinfo.gametype & (GAME_DoomStrifeChex))
{ {
FTexture *title = TexMan["M_LOADG"]; FTexture *title = TexMan["M_LOADG"];
screen->DrawTexture (title, screen->DrawTexture (title,
@ -952,7 +952,7 @@ void M_DrawLoad (void)
// //
void M_DrawSaveLoadBorder (int x, int y, int len) void M_DrawSaveLoadBorder (int x, int y, int len)
{ {
if (gameinfo.gametype & (GAME_Doom|GAME_Strife)) if (gameinfo.gametype & (GAME_DoomStrifeChex))
{ {
int i; int i;
@ -1272,7 +1272,10 @@ void M_LoadGame (int choice)
{ {
if (netgame) if (netgame)
{ {
M_StartMessage (GStrings("LOADNET"), NULL, false); if(gameinfo.gametype == GAME_Chex)
M_StartMessage (GStrings("CLOADNET"), NULL, false);
else
M_StartMessage (GStrings("LOADNET"), NULL, false);
return; return;
} }
@ -1289,7 +1292,7 @@ void M_LoadGame (int choice)
// //
void M_DrawSave() void M_DrawSave()
{ {
if (gameinfo.gametype & (GAME_Doom|GAME_Strife)) if (gameinfo.gametype & (GAME_DoomStrifeChex))
{ {
FTexture *title = TexMan["M_SAVEG"]; FTexture *title = TexMan["M_SAVEG"];
screen->DrawTexture (title, screen->DrawTexture (title,
@ -1401,7 +1404,10 @@ void M_QuickSave ()
M_SaveGame (0); M_SaveGame (0);
return; return;
} }
mysnprintf (tempstring, countof(tempstring), GStrings("QSPROMPT"), quickSaveSlot->Title); if(gameinfo.gametype == GAME_Chex)
mysnprintf (tempstring, countof(tempstring), GStrings("CQSPROMPT"), quickSaveSlot->Title);
else
mysnprintf (tempstring, countof(tempstring), GStrings("QSPROMPT"), quickSaveSlot->Title);
strcpy (savegamestring, quickSaveSlot->Title); strcpy (savegamestring, quickSaveSlot->Title);
M_StartMessage (tempstring, M_QuickSaveResponse, true); M_StartMessage (tempstring, M_QuickSaveResponse, true);
} }
@ -1425,7 +1431,10 @@ void M_QuickLoad ()
{ {
if (netgame) if (netgame)
{ {
M_StartMessage (GStrings("QLOADNET"), NULL, false); if(gameinfo.gametype == GAME_Chex)
M_StartMessage (GStrings("CQLOADNET"), NULL, false);
else
M_StartMessage (GStrings("QLOADNET"), NULL, false);
return; return;
} }
@ -1437,7 +1446,10 @@ void M_QuickLoad ()
M_LoadGame (0); M_LoadGame (0);
return; return;
} }
mysnprintf (tempstring, countof(tempstring), GStrings("QLPROMPT"), quickSaveSlot->Title); if(gameinfo.gametype == GAME_Chex)
mysnprintf (tempstring, countof(tempstring), GStrings("CQLPROMPT"), quickSaveSlot->Title);
else
mysnprintf (tempstring, countof(tempstring), GStrings("QLPROMPT"), quickSaveSlot->Title);
M_StartMessage (tempstring, M_QuickLoadResponse, true); M_StartMessage (tempstring, M_QuickLoadResponse, true);
} }
@ -1499,7 +1511,7 @@ void M_DrawReadThis ()
// //
void M_DrawMainMenu (void) void M_DrawMainMenu (void)
{ {
if (gameinfo.gametype == GAME_Doom) if (gameinfo.gametype & GAME_DoomChex)
{ {
screen->DrawTexture (TexMan["M_DOOM"], 94, 2, DTA_Clean, true, TAG_DONE); screen->DrawTexture (TexMan["M_DOOM"], 94, 2, DTA_Clean, true, TAG_DONE);
} }
@ -1542,9 +1554,9 @@ void M_DrawHereticMainMenu ()
// //
void M_DrawNewGame(void) void M_DrawNewGame(void)
{ {
if (gameinfo.gametype & (GAME_Doom|GAME_Strife)) if (gameinfo.gametype & (GAME_DoomStrifeChex))
{ {
screen->DrawTexture (TexMan[gameinfo.gametype == GAME_Doom ? "M_NEWG" : "M_NGAME"], 96, 14, DTA_Clean, true, TAG_DONE); screen->DrawTexture (TexMan[gameinfo.gametype & GAME_DoomChex ? "M_NEWG" : "M_NGAME"], 96, 14, DTA_Clean, true, TAG_DONE);
screen->DrawTexture (TexMan["M_SKILL"], 54, 38, DTA_Clean, true, TAG_DONE); screen->DrawTexture (TexMan["M_SKILL"], 54, 38, DTA_Clean, true, TAG_DONE);
} }
} }
@ -1553,12 +1565,15 @@ void M_NewGame(int choice)
{ {
if (netgame && !demoplayback) if (netgame && !demoplayback)
{ {
M_StartMessage (GStrings("NEWGAME"), NULL, false); if(gameinfo.gametype == GAME_Chex)
M_StartMessage (GStrings("CNEWGAME"), NULL, false);
else
M_StartMessage (GStrings("NEWGAME"), NULL, false);
return; return;
} }
// Set up episode menu positioning // Set up episode menu positioning
if (gameinfo.gametype & (GAME_Doom|GAME_Strife)) if (gameinfo.gametype & (GAME_DoomStrifeChex))
{ {
EpiDef.x = 48; EpiDef.x = 48;
EpiDef.y = 63; EpiDef.y = 63;
@ -1679,7 +1694,7 @@ static void M_DrawClassMenu ()
if (ClassMenuDef.numitems > 4 && gameinfo.gametype & GAME_Raven) if (ClassMenuDef.numitems > 4 && gameinfo.gametype & GAME_Raven)
tit_y = 2; tit_y = 2;
screen->DrawText (gameinfo.gametype == GAME_Doom ? CR_RED : CR_UNTRANSLATED, screen->DrawText (gameinfo.gametype & GAME_DoomChex ? CR_RED : CR_UNTRANSLATED,
160 - BigFont->StringWidth (text)/2, 160 - BigFont->StringWidth (text)/2,
tit_y, tit_y,
text, DTA_Clean, true, TAG_DONE); text, DTA_Clean, true, TAG_DONE);
@ -1738,7 +1753,7 @@ static void DrawHexenSkillMenu()
// //
void M_DrawEpisode () void M_DrawEpisode ()
{ {
if (gameinfo.gametype & (GAME_Doom|GAME_Strife)) if (gameinfo.gametype & (GAME_DoomStrifeChex))
{ {
screen->DrawTexture (TexMan["M_EPISOD"], 54, 38, DTA_Clean, true, TAG_DONE); screen->DrawTexture (TexMan["M_EPISOD"], 54, 38, DTA_Clean, true, TAG_DONE);
} }
@ -1790,6 +1805,10 @@ void M_Episode (int choice)
M_StartMessage(GStrings("SWSTRING"),NULL,false); M_StartMessage(GStrings("SWSTRING"),NULL,false);
//M_SetupNextMenu(&ReadDef); //M_SetupNextMenu(&ReadDef);
} }
else if (gameinfo.gametype == GAME_Chex)
{
M_StartMessage(GStrings("CSWSTRING"),NULL,false);
}
else else
{ {
showSharewareMessage = 3*TICRATE; showSharewareMessage = 3*TICRATE;
@ -1818,7 +1837,10 @@ static void SCClass (int option)
{ {
if (netgame) if (netgame)
{ {
M_StartMessage (GStrings("NEWGAME"), NULL, false); if(gameinfo.gametype == GAME_Chex)
M_StartMessage (GStrings("CNEWGAME"), NULL, false);
else
M_StartMessage (GStrings("NEWGAME"), NULL, false);
return; return;
} }
@ -1846,7 +1868,10 @@ static void M_ChooseClass (int choice)
{ {
if (netgame) if (netgame)
{ {
M_StartMessage (GStrings("NEWGAME"), NULL, false); if(gameinfo.gametype == GAME_Chex)
M_StartMessage (GStrings("CNEWGAME"), NULL, false);
else
M_StartMessage (GStrings("NEWGAME"), NULL, false);
return; return;
} }
@ -1899,11 +1924,17 @@ void M_EndGame(int choice)
if (netgame) if (netgame)
{ {
M_StartMessage(GStrings("NETEND"),NULL,false); if(gameinfo.gametype == GAME_Chex)
M_StartMessage(GStrings("CNETEND"),NULL,false);
else
M_StartMessage(GStrings("NETEND"),NULL,false);
return; return;
} }
M_StartMessage(GStrings("ENDGAME"),M_EndGameResponse,true); if(gameinfo.gametype == GAME_Chex)
M_StartMessage(GStrings("CENDGAME"),M_EndGameResponse,true);
else
M_StartMessage(GStrings("ENDGAME"),M_EndGameResponse,true);
} }
@ -1966,12 +1997,19 @@ void M_QuitGame (int choice)
{ {
// We pick index 0 which is language sensitive, // We pick index 0 which is language sensitive,
// or one at random, between 1 and maximum number. // or one at random, between 1 and maximum number.
if (gameinfo.gametype & (GAME_Doom|GAME_Strife)) if (gameinfo.gametype & (GAME_DoomStrifeChex))
{ {
int quitmsg = gametic % (gameinfo.gametype == GAME_Doom ? NUM_QUITDOOMMESSAGES : NUM_QUITSTRIFEMESSAGES - 1); int quitmsg = 0;
if (quitmsg != 0 || gameinfo.gametype == GAME_Strife) if (gameinfo.gametype == GAME_Doom)
quitmsg = gametic % NUM_QUITDOOMMESSAGES;
else if (gameinfo.gametype == GAME_Strife)
quitmsg = gametic % NUM_QUITSTRIFEMESSAGES - 1;
else //Chex quest has 2 messages but one is more likely to show
quitmsg = (gametic % NUM_QUITCHEXMESSAGES + 6) > NUM_QUITCHEXMESSAGES ? NUM_QUITCHEXMESSAGES - 1 : (gametic % NUM_QUITCHEXMESSAGES + 6);
if (quitmsg != 0 || gameinfo.gametype == GAME_Strife || gameinfo.gametype == GAME_Chex)
{ {
EndString.Format("QUITMSG%d", quitmsg + (gameinfo.gametype == GAME_Doom ? 0 : NUM_QUITDOOMMESSAGES + 1)); EndString.Format("QUITMSG%d", quitmsg + (gameinfo.gametype == GAME_Doom ? 0 : (gameinfo.gametype == GAME_Chex ? NUM_QUITDOOMMESSAGES + NUM_QUITSTRIFEMESSAGES : NUM_QUITDOOMMESSAGES + 1)));
EndString.Format("%s\n\n%s", GStrings(EndString), GStrings("DOSY")); EndString.Format("%s\n\n%s", GStrings(EndString), GStrings("DOSY"));
} }
else else
@ -2061,7 +2099,7 @@ static void M_PlayerSetupDrawer ()
EColorRange label, value; EColorRange label, value;
DWORD color; DWORD color;
if (!(gameinfo.gametype & (GAME_Doom|GAME_Strife))) if (!(gameinfo.gametype & (GAME_DoomStrifeChex)))
{ {
xo = 5; xo = 5;
yo = 5; yo = 5;
@ -2077,7 +2115,7 @@ static void M_PlayerSetupDrawer ()
// Draw title // Draw title
const char * text = GStrings("MNU_PLAYERSETUP"); const char * text = GStrings("MNU_PLAYERSETUP");
screen->DrawText (gameinfo.gametype == GAME_Doom ? CR_RED : CR_UNTRANSLATED, screen->DrawText (gameinfo.gametype & GAME_DoomChex ? CR_RED : CR_UNTRANSLATED,
160 - BigFont->StringWidth (text)/2, 160 - BigFont->StringWidth (text)/2,
15, 15,
text, DTA_Clean, true, TAG_DONE); text, DTA_Clean, true, TAG_DONE);
@ -3210,7 +3248,7 @@ void M_Drawer ()
if (color == CR_UNTRANSLATED) if (color == CR_UNTRANSLATED)
{ {
// The default DBIGFONT is white but Doom's default should be red. // The default DBIGFONT is white but Doom's default should be red.
if (gameinfo.gametype == GAME_Doom) if (gameinfo.gametype & GAME_DoomChex)
{ {
color = CR_RED; color = CR_RED;
} }
@ -3241,12 +3279,12 @@ void M_Drawer ()
screen->SetFont (ConFont); screen->SetFont (ConFont);
screen->DrawText (CR_RED, x - 16, screen->DrawText (CR_RED, x - 16,
currentMenu->y + itemOn*LINEHEIGHT + currentMenu->y + itemOn*LINEHEIGHT +
(!(gameinfo.gametype & (GAME_Doom|GAME_Strife)) ? 6 : -1), "\xd", (!(gameinfo.gametype & (GAME_DoomStrifeChex)) ? 6 : -1), "\xd",
DTA_Clean, true, TAG_DONE); DTA_Clean, true, TAG_DONE);
screen->SetFont (SmallFont); screen->SetFont (SmallFont);
} }
} }
else if (gameinfo.gametype == GAME_Doom) else if (gameinfo.gametype & GAME_DoomChex)
{ {
screen->DrawTexture (TexMan[skullName[whichSkull]], screen->DrawTexture (TexMan[skullName[whichSkull]],
x + SKULLXOFF, currentMenu->y - 5 + itemOn*LINEHEIGHT, x + SKULLXOFF, currentMenu->y - 5 + itemOn*LINEHEIGHT,
@ -3398,7 +3436,7 @@ void M_Init (void)
atterm (M_Deinit); atterm (M_Deinit);
if (gameinfo.gametype & (GAME_Doom|GAME_Strife)) if (gameinfo.gametype & (GAME_DoomStrifeChex))
{ {
TopLevelMenu = currentMenu = &MainDef; TopLevelMenu = currentMenu = &MainDef;
if (gameinfo.gametype == GAME_Strife) if (gameinfo.gametype == GAME_Strife)
@ -3429,10 +3467,10 @@ void M_Init (void)
lastSaveSlot = NULL; lastSaveSlot = NULL;
strcpy (NewSaveNode.Title, "<New Save Game>"); strcpy (NewSaveNode.Title, "<New Save Game>");
underscore[0] = (gameinfo.gametype & (GAME_Doom|GAME_Strife)) ? '_' : '['; underscore[0] = (gameinfo.gametype & (GAME_DoomStrifeChex)) ? '_' : '[';
underscore[1] = '\0'; underscore[1] = '\0';
if (gameinfo.gametype == GAME_Doom) if (gameinfo.gametype & GAME_DoomChex)
{ {
LINEHEIGHT = 16; LINEHEIGHT = 16;
} }
@ -3494,7 +3532,7 @@ void M_Init (void)
ClassMenuDef.numitems = 1; ClassMenuDef.numitems = 1;
} }
if (gameinfo.gametype & (GAME_Doom|GAME_Strife)) if (gameinfo.gametype & (GAME_DoomStrifeChex))
{ {
ClassMenuDef.x = 48; ClassMenuDef.x = 48;
ClassMenuDef.y = 63; ClassMenuDef.y = 63;

View file

@ -605,6 +605,7 @@ static bool FindFreeName (FString &fullname, const char *extension)
case GAME_Heretic: gamename = "Heretic_"; break; case GAME_Heretic: gamename = "Heretic_"; break;
case GAME_Hexen: gamename = "Hexen_"; break; case GAME_Hexen: gamename = "Hexen_"; break;
case GAME_Strife: gamename = "Strife_"; break; case GAME_Strife: gamename = "Strife_"; break;
case GAME_Chex: gamename = "Chex_"; break;
default: gamename = ""; break; default: gamename = ""; break;
} }

View file

@ -1681,7 +1681,7 @@ void M_OptDrawer ()
if (BigFont && CurrentMenu->texttitle) if (BigFont && CurrentMenu->texttitle)
{ {
screen->SetFont (BigFont); screen->SetFont (BigFont);
screen->DrawText (gameinfo.gametype == GAME_Doom ? CR_RED : CR_UNTRANSLATED, screen->DrawText (gameinfo.gametype & GAME_DoomChex ? CR_RED : CR_UNTRANSLATED,
160-BigFont->StringWidth (CurrentMenu->texttitle)/2, 10, 160-BigFont->StringWidth (CurrentMenu->texttitle)/2, 10,
CurrentMenu->texttitle, DTA_Clean, true, TAG_DONE); CurrentMenu->texttitle, DTA_Clean, true, TAG_DONE);
screen->SetFont (SmallFont); screen->SetFont (SmallFont);
@ -2208,7 +2208,7 @@ void M_OptResponder (event_t *ev)
{ {
maxitems = 15; maxitems = 15;
} }
if (gameinfo.gametype != GAME_Doom) if (!(gameinfo.gametype & GAME_DoomChex))
{ {
maxitems -= 2; maxitems -= 2;
rowheight = 9; rowheight = 9;

View file

@ -82,6 +82,7 @@ xx(StrifePlayer)
xx(FighterPlayer) xx(FighterPlayer)
xx(ClericPlayer) xx(ClericPlayer)
xx(MagePlayer) xx(MagePlayer)
xx(ChexPlayer)
xx(ChickenPlayer) xx(ChickenPlayer)
xx(PigPlayer) xx(PigPlayer)

View file

@ -47,6 +47,7 @@
#include "r_things.h" #include "r_things.h"
#include "s_sound.h" #include "s_sound.h"
#include "templates.h" #include "templates.h"
#include "gi.h"
CVAR (Int, cl_rockettrails, 1, CVAR_ARCHIVE); CVAR (Int, cl_rockettrails, 1, CVAR_ARCHIVE);
@ -55,7 +56,7 @@ CVAR (Int, cl_rockettrails, 1, CVAR_ARCHIVE);
static int grey1, grey2, grey3, grey4, red, green, blue, yellow, black, static int grey1, grey2, grey3, grey4, red, green, blue, yellow, black,
red1, green1, blue1, yellow1, purple, purple1, white, red1, green1, blue1, yellow1, purple, purple1, white,
rblue1, rblue2, rblue3, rblue4, orange, yorange, dred, grey5, rblue1, rblue2, rblue3, rblue4, orange, yorange, dred, grey5,
maroon1, maroon2; maroon1, maroon2, blood1, blood2;
static const struct ColorList { static const struct ColorList {
int *color; int *color;
@ -99,8 +100,13 @@ void P_InitEffects ()
*(color->color) = ColorMatcher.Pick (color->r, color->g, color->b); *(color->color) = ColorMatcher.Pick (color->r, color->g, color->b);
color++; color++;
} }
int kind = gameinfo.defaultbloodcolor;
blood1 = ColorMatcher.Pick(RPART(kind), GPART(kind), BPART(kind));
blood2 = ColorMatcher.Pick(RPART(kind)/3, GPART(kind)/3, BPART(kind)/3);
} }
void P_ThinkParticles () void P_ThinkParticles ()
{ {
int i; int i;
@ -373,8 +379,8 @@ void P_DrawSplash2 (int count, fixed_t x, fixed_t y, fixed_t z, angle_t angle, i
switch (kind) switch (kind)
{ {
case 0: // Blood case 0: // Blood
color1 = red; color1 = blood1;
color2 = dred; color2 = blood2;
break; break;
case 1: // Gunshot case 1: // Gunshot
color1 = grey3; color1 = grey3;

View file

@ -1412,7 +1412,7 @@ bool P_LookForPlayers (AActor *actor, INTBOOL allaround)
return P_LookForEnemies (actor, allaround); return P_LookForEnemies (actor, allaround);
} }
if (!(gameinfo.gametype & (GAME_Doom|GAME_Strife)) && if (!(gameinfo.gametype & (GAME_DoomStrifeChex)) &&
!multiplayer && !multiplayer &&
players[0].health <= 0) players[0].health <= 0)
{ // Single player game and player is dead; look for monsters { // Single player game and player is dead; look for monsters

View file

@ -548,7 +548,7 @@ bool P_NewLookPlayers (AActor *actor, angle_t fov, fixed_t mindist, fixed_t maxd
return P_NewLookEnemies (actor, fov, mindist, maxdist, chasegoal); return P_NewLookEnemies (actor, fov, mindist, maxdist, chasegoal);
} }
if (!(gameinfo.gametype & (GAME_Doom|GAME_Strife)) && if (!(gameinfo.gametype & (GAME_DoomStrifeChex)) &&
!multiplayer && !multiplayer &&
players[0].health <= 0) players[0].health <= 0)
{ // Single player game and player is dead; look for monsters { // Single player game and player is dead; look for monsters

View file

@ -321,7 +321,7 @@ static int GibHealth(AActor *actor)
return -abs( return -abs(
actor->GetClass()->Meta.GetMetaInt ( actor->GetClass()->Meta.GetMetaInt (
AMETA_GibHealth, AMETA_GibHealth,
gameinfo.gametype == GAME_Doom ? gameinfo.gametype & GAME_DoomChex ?
-actor->GetDefault()->health : -actor->GetDefault()->health :
-actor->GetDefault()->health/2)); -actor->GetDefault()->health/2));
} }

View file

@ -1955,7 +1955,7 @@ void P_ZMovement (AActor *mo)
if (mo->z <= mo->floorz) if (mo->z <= mo->floorz)
{ {
if ((mo->flags & MF_MISSILE) && if ((mo->flags & MF_MISSILE) &&
(gameinfo.gametype != GAME_Doom || !(mo->flags & MF_NOCLIP))) (!(gameinfo.gametype & GAME_DoomChex) || !(mo->flags & MF_NOCLIP)))
{ {
mo->z = mo->floorz; mo->z = mo->floorz;
if (mo->flags2 & MF2_BOUNCETYPE) if (mo->flags2 & MF2_BOUNCETYPE)
@ -2066,7 +2066,7 @@ void P_ZMovement (AActor *mo)
mo->momz = -mo->momz; mo->momz = -mo->momz;
} }
if (mo->flags & MF_MISSILE && if (mo->flags & MF_MISSILE &&
(gameinfo.gametype != GAME_Doom || !(mo->flags & MF_NOCLIP))) (!(gameinfo.gametype & GAME_DoomChex) || !(mo->flags & MF_NOCLIP)))
{ {
if (mo->flags3 & MF3_CEILINGHUGGER) if (mo->flags3 & MF3_CEILINGHUGGER)
{ {
@ -4151,7 +4151,7 @@ void P_SpawnBlood (fixed_t x, fixed_t y, fixed_t z, angle_t dir, int damage, AAc
th = Spawn (bloodcls, x, y, z, ALLOW_REPLACE); th = Spawn (bloodcls, x, y, z, ALLOW_REPLACE);
th->momz = FRACUNIT*2; th->momz = FRACUNIT*2;
th->angle = dir; th->angle = dir;
if (gameinfo.gametype == GAME_Doom) if (gameinfo.gametype & GAME_DoomChex)
{ {
th->tics -= pr_spawnblood() & 3; th->tics -= pr_spawnblood() & 3;
@ -4165,7 +4165,7 @@ void P_SpawnBlood (fixed_t x, fixed_t y, fixed_t z, angle_t dir, int damage, AAc
} }
// Moved out of the blood actor so that replacing blood is easier // Moved out of the blood actor so that replacing blood is easier
if (gameinfo.gametype & GAME_DoomStrife) if (gameinfo.gametype & GAME_DoomStrifeChex)
{ {
if (gameinfo.gametype == GAME_Strife) if (gameinfo.gametype == GAME_Strife)
{ {
@ -5019,7 +5019,7 @@ void AActor::Crash()
if (crashstate == NULL) if (crashstate == NULL)
{ {
int gibhealth = -abs(GetClass()->Meta.GetMetaInt (AMETA_GibHealth, int gibhealth = -abs(GetClass()->Meta.GetMetaInt (AMETA_GibHealth,
gameinfo.gametype == GAME_Doom ? -GetDefault()->health : -GetDefault()->health/2)); gameinfo.gametype & GAME_DoomChex ? -GetDefault()->health : -GetDefault()->health/2));
if (health < gibhealth) if (health < gibhealth)
{ // Extreme death { // Extreme death

View file

@ -344,7 +344,7 @@ static void ParseOuter (FScanner &sc)
break; break;
case OUT_IFDOOM: case OUT_IFDOOM:
if (gameinfo.gametype != GAME_Doom) if (!(gameinfo.gametype & GAME_DoomChex))
{ {
ifskip = true; ifskip = true;
} }

View file

@ -131,6 +131,11 @@ void SetupPlayerClasses ()
newclass.Type = PClass::FindClass (NAME_StrifePlayer); newclass.Type = PClass::FindClass (NAME_StrifePlayer);
PlayerClasses.Push (newclass); PlayerClasses.Push (newclass);
} }
else if (gameinfo.gametype == GAME_Chex)
{
newclass.Type = PClass::FindClass (NAME_ChexPlayer);
PlayerClasses.Push (newclass);
}
} }
CCMD (clearplayerclasses) CCMD (clearplayerclasses)
@ -423,7 +428,10 @@ void APlayerPawn::Serialize (FArchive &arc)
<< ScoreIcon << ScoreIcon
<< InvFirst << InvFirst
<< InvSel << InvSel
<< MorphWeapon; << MorphWeapon
<< RedDamageFade
<< GreenDamageFade
<< BlueDamageFade;
} }
//=========================================================================== //===========================================================================

View file

@ -86,7 +86,7 @@ void P_TranslateLineDef (line_t *ld, maplinedef_t *mld)
} }
else else
{ {
if (gameinfo.gametype == GAME_Doom) if (gameinfo.gametype & GAME_DoomChex)
{ {
if (flags & ML_RESERVED_ETERNITY) if (flags & ML_RESERVED_ETERNITY)
{ {

View file

@ -523,7 +523,7 @@ void R_InitSkins (void)
if (stricmp (sc.String, "heretic") == 0) if (stricmp (sc.String, "heretic") == 0)
{ {
if (gameinfo.gametype == GAME_Doom) if (gameinfo.gametype & GAME_DoomChex)
{ {
transtype = PClass::FindClass (NAME_HereticPlayer); transtype = PClass::FindClass (NAME_HereticPlayer);
skins[i].othergame = true; skins[i].othergame = true;
@ -547,7 +547,7 @@ void R_InitSkins (void)
transtype = PClass::FindClass (NAME_DoomPlayer); transtype = PClass::FindClass (NAME_DoomPlayer);
skins[i].othergame = true; skins[i].othergame = true;
} }
else if (gameinfo.gametype != GAME_Doom) else if (!(gameinfo.gametype & GAME_DoomChex))
{ {
remove = true; remove = true;
} }
@ -618,7 +618,7 @@ void R_InitSkins (void)
// [GRB] Assume Doom skin by default // [GRB] Assume Doom skin by default
if (!remove && basetype == NULL) if (!remove && basetype == NULL)
{ {
if (gameinfo.gametype == GAME_Doom) if (gameinfo.gametype & GAME_DoomChex)
{ {
basetype = transtype = PClass::FindClass (NAME_DoomPlayer); basetype = transtype = PClass::FindClass (NAME_DoomPlayer);
} }
@ -849,7 +849,7 @@ void R_InitSprites ()
clearbufshort (zeroarray, MAXWIDTH, 0); clearbufshort (zeroarray, MAXWIDTH, 0);
// [RH] Create a standard translation to map skins between Heretic and Doom // [RH] Create a standard translation to map skins between Heretic and Doom
if (gameinfo.gametype == GAME_Doom) if (gameinfo.gametype == GAME_DoomChex)
{ {
R_CreateSkinTranslation ("SPALHTIC"); R_CreateSkinTranslation ("SPALHTIC");
} }

View file

@ -363,7 +363,7 @@ void R_InitTranslationTables ()
} }
// Create the standard translation tables // Create the standard translation tables
if (gameinfo.gametype == GAME_Doom) if (gameinfo.gametype & GAME_DoomChex)
{ {
for (i = 0x70; i < 0x80; i++) for (i = 0x70; i < 0x80; i++)
{ // map green ramp to gray, brown, red { // map green ramp to gray, brown, red
@ -575,7 +575,7 @@ static void R_CreatePlayerTranslation (float h, float s, float v, FPlayerSkin *s
bases = s; bases = s;
basev = v; basev = v;
if (gameinfo.gametype == GAME_Doom || gameinfo.gametype == GAME_Strife) if (gameinfo.gametype & GAME_DoomStrifeChex)
{ {
// Build player sprite translation // Build player sprite translation
s -= 0.23f; s -= 0.23f;

View file

@ -1267,8 +1267,8 @@ static void S_AddSNDINFO (int lump)
} }
break; break;
case SI_IfDoom: case SI_IfDoom: //also Chex
if (gameinfo.gametype != GAME_Doom) if (!(gameinfo.gametype & GAME_DoomChex))
{ {
skipToEndIf = true; skipToEndIf = true;
} }

View file

@ -153,6 +153,22 @@ static BYTE CheatStoneCold[] = { 's','t','o','n','e','c','o','l','d',255 };
static BYTE CheatElvis[] = { 'e','l','v','i','s',255 }; static BYTE CheatElvis[] = { 'e','l','v','i','s',255 };
static BYTE CheatTopo[] = { 't','o','p','o',255 }; static BYTE CheatTopo[] = { 't','o','p','o',255 };
//[BL] Graf will probably get rid of this
static BYTE CheatJoelKoenigs[] = { 'j','o','e','l','k','o','e','n','i','g','s',255 };
static BYTE CheatDavidBrus[] = { 'd','a','v','i','d','b','r','u','s',255 };
static BYTE CheatScottHolman[] = { 's','c','o','t','t','h','o','l','m','a','n',255 };
static BYTE CheatMikeKoenigs[] = { 'm','i','k','e','k','o','e','n','i','g','s',255 };
static BYTE CheatCharlesJacobi[] = { 'c','h','a','r','l','e','s','j','a','c','o','b','i',255 };
static BYTE CheatAndrewBenson[] = { 'a','n','d','r','e','w','b','e','n','s','o','n',255 };
static BYTE CheatDeanHyers[] = { 'd','e','a','n','h','y','e','r','s',255 };
static BYTE CheatMaryBregi[] = { 'm','a','r','y','b','r','e','g','i',255 };
static BYTE CheatAllen[] = { 'a','l','l','e','n',255 };
static BYTE CheatDigitalCafe[] = { 'd','i','g','i','t','a','l','c','a','f','e',255 };
static BYTE CheatJoshuaStorms[] = { 'j','o','s','h','u','a','s','t','o','r','m','s',255 };
static BYTE CheatLeeSnyder[] = { 'l','e','e','s','n','y','d','e','r',0,0,255 };
static BYTE CheatKimHyers[] = { 'k','i','m','h','y','e','r','s',255 };
static BYTE CheatShrrill[] = { 's','h','r','r','i','l','l',255 };
static cheatseq_t DoomCheats[] = static cheatseq_t DoomCheats[] =
{ {
{ CheatMus, 0, 1, 0, {0,0}, Cht_Music }, { CheatMus, 0, 1, 0, {0,0}, Cht_Music },
@ -246,6 +262,25 @@ static cheatseq_t StrifeCheats[] =
{ CheatLego, 0, 0, 0, {CHT_LEGO,0}, Cht_Generic }, { CheatLego, 0, 0, 0, {CHT_LEGO,0}, Cht_Generic },
}; };
static cheatseq_t ChexCheats[] =
{
{ CheatMus, 0, 1, 0, {0,0}, Cht_Music },
{ CheatKimHyers, 0, 1, 0, {0,0}, Cht_MyPos },
{ CheatShrrill, 0, 0, 0, {0,0}, Cht_AutoMap },
{ CheatDavidBrus, 0, 0, 0, {CHT_IDDQD,0}, Cht_Generic },
{ CheatMikeKoenigs, 0, 0, 0, {CHT_IDKFA,0}, Cht_Generic },
{ CheatScottHolman, 0, 0, 0, {CHT_IDFA,0}, Cht_Generic },
{ CheatCharlesJacobi, 0, 0, 0, {CHT_NOCLIP,0}, Cht_Generic },
{ CheatAndrewBenson, 0, 0, 0, {CHT_BEHOLDV,0}, Cht_Generic },
{ CheatDeanHyers, 0, 0, 0, {CHT_BEHOLDS,0}, Cht_Generic },
{ CheatMaryBregi, 0, 0, 0, {CHT_BEHOLDI,0}, Cht_Generic },
{ CheatAllen, 0, 0, 0, {CHT_BEHOLDR,0}, Cht_Generic },
{ CheatDigitalCafe, 0, 0, 0, {CHT_BEHOLDA,0}, Cht_Generic },
{ CheatJoshuaStorms, 0, 0, 0, {CHT_BEHOLDL,0}, Cht_Generic },
{ CheatJoelKoenigs, 0, 0, 0, {CHT_CHAINSAW,0}, Cht_Generic },
{ CheatLeeSnyder, 0, 0, 0, {0,0}, Cht_ChangeLevel }
};
extern bool CheckCheatmode (); extern bool CheckCheatmode ();
// Respond to keyboard input events, intercept cheats. // Respond to keyboard input events, intercept cheats.
@ -282,6 +317,11 @@ bool ST_Responder (event_t *ev)
numcheats = countof(StrifeCheats); numcheats = countof(StrifeCheats);
break; break;
case GAME_Chex:
cheats = ChexCheats;
numcheats = countof(ChexCheats);
break;
default: default:
return false; return false;
} }

View file

@ -3,5 +3,5 @@
// This file was automatically generated by the // This file was automatically generated by the
// updaterevision tool. Do not edit by hand. // updaterevision tool. Do not edit by hand.
#define ZD_SVN_REVISION_STRING "1183" #define ZD_SVN_REVISION_STRING "1190"
#define ZD_SVN_REVISION_NUMBER 1183 #define ZD_SVN_REVISION_NUMBER 1190

View file

@ -816,6 +816,12 @@ static int ParseMorphStyle (FScanner &sc)
//========================================================================== //==========================================================================
static void ActorSkipSuper (FScanner &sc, AActor *defaults, Baggage &bag) static void ActorSkipSuper (FScanner &sc, AActor *defaults, Baggage &bag)
{ {
if (bag.Info->Class->IsDescendantOf(RUNTIME_CLASS(AInventory)))
{
sc.ScriptMessage("'skip_super' in definition of inventory item igmored.\n");
return;
}
memcpy (defaults, GetDefault<AActor>(), sizeof(AActor)); memcpy (defaults, GetDefault<AActor>(), sizeof(AActor));
if (bag.DropItemList != NULL) if (bag.DropItemList != NULL)
{ {
@ -851,6 +857,10 @@ static void ActorGame (FScanner &sc, AActor *defaults, Baggage &bag)
{ {
bag.Info->GameFilter |= GAME_Strife; bag.Info->GameFilter |= GAME_Strife;
} }
else if (sc.Compare ("Chex"))
{
bag.Info->GameFilter |= GAME_Chex;
}
else if (sc.Compare ("Any")) else if (sc.Compare ("Any"))
{ {
bag.Info->GameFilter = GAME_Any; bag.Info->GameFilter = GAME_Any;
@ -1934,8 +1944,8 @@ static void InventoryPickupflash (FScanner &sc, AInventory *defaults, Baggage &b
static void InventoryPickupmsg (FScanner &sc, AInventory *defaults, Baggage &bag) static void InventoryPickupmsg (FScanner &sc, AInventory *defaults, Baggage &bag)
{ {
// allow game specific pickup messages // allow game specific pickup messages
const char * games[] = {"Doom", "Heretic", "Hexen", "Raven", "Strife", NULL}; const char * games[] = {"Doom", "Heretic", "Hexen", "Raven", "Strife", "Chex", NULL};
int gamemode[]={GAME_Doom, GAME_Heretic, GAME_Hexen, GAME_Raven, GAME_Strife}; int gamemode[]={GAME_Doom, GAME_Heretic, GAME_Hexen, GAME_Raven, GAME_Strife, GAME_Chex};
sc.MustGetString(); sc.MustGetString();
int game = sc.MatchString(games); int game = sc.MatchString(games);
@ -2480,8 +2490,6 @@ static void PlayerCrouchSprite (FScanner &sc, APlayerPawn *defaults, Baggage &ba
//========================================================================== //==========================================================================
static void PlayerDmgScreenColor (FScanner &sc, APlayerPawn *defaults, Baggage &bag) static void PlayerDmgScreenColor (FScanner &sc, APlayerPawn *defaults, Baggage &bag)
{ {
defaults->HasDamageFade = true;
if (sc.CheckNumber ()) if (sc.CheckNumber ())
{ {
sc.MustGetNumber (); sc.MustGetNumber ();

View file

@ -286,7 +286,7 @@ FFont::FFont (const char *name, const char *nametemplate, int first, int count,
BYTE usedcolors[256], identity[256]; BYTE usedcolors[256], identity[256];
double *luminosity; double *luminosity;
int maxyoffs; int maxyoffs;
bool doomtemplate = gameinfo.gametype == GAME_Doom ? strncmp (nametemplate, "STCFN", 5) == 0 : false; bool doomtemplate = gameinfo.gametype & GAME_DoomChex ? strncmp (nametemplate, "STCFN", 5) == 0 : false;
bool stcfn121 = false; bool stcfn121 = false;
Chars = new CharData[count]; Chars = new CharData[count];
@ -2092,7 +2092,7 @@ void V_InitFonts()
} }
if (!(BigFont=FFont::FindFont("BigFont"))) if (!(BigFont=FFont::FindFont("BigFont")))
{ {
if (gameinfo.gametype == GAME_Doom) if (gameinfo.gametype & GAME_DoomChex)
{ {
BigFont = new FSingleLumpFont ("BigFont", Wads.GetNumForName ("DBIGFONT")); BigFont = new FSingleLumpFont ("BigFont", Wads.GetNumForName ("DBIGFONT"));
} }

View file

@ -77,7 +77,7 @@
// SAVESIG should match SAVEVER. // SAVESIG should match SAVEVER.
// MINSAVEVER is the minimum level snapshot version that can be loaded. // MINSAVEVER is the minimum level snapshot version that can be loaded.
#define MINSAVEVER 1181 #define MINSAVEVER 1190
#if ZD_SVN_REVISION_NUMBER < MINSAVEVER #if ZD_SVN_REVISION_NUMBER < MINSAVEVER
// Never write a savegame with a version lower than what we need // Never write a savegame with a version lower than what we need

View file

@ -953,12 +953,12 @@ int FWadCollection::CheckNumForFullName (const char *name, int wadnum)
return CheckNumForFullName (name); return CheckNumForFullName (name);
} }
i = FirstLumpIndex[MakeKey (name) % NumLumps]; i = FirstLumpIndex_FullName[MakeKey (name) % NumLumps];
while (i != NULL_INDEX && while (i != NULL_INDEX &&
(stricmp(name, LumpInfo[i].fullname) || LumpInfo[i].wadnum != wadnum)) (stricmp(name, LumpInfo[i].fullname) || LumpInfo[i].wadnum != wadnum))
{ {
i = NextLumpIndex[i]; i = NextLumpIndex_FullName[i];
} }
return i != NULL_INDEX ? i : -1; return i != NULL_INDEX ? i : -1;
@ -1412,7 +1412,7 @@ void FWadCollection::RenameSprites (int startlump)
// When not playing Doom rename all BLOD sprites to BLUD so that // When not playing Doom rename all BLOD sprites to BLUD so that
// the same blood states can be used everywhere // the same blood states can be used everywhere
if (gameinfo.gametype != GAME_Doom) if (!(gameinfo.gametype & GAME_DoomChex))
{ {
if (*(DWORD *)LumpInfo[i].name == MAKE_ID('B', 'L', 'O', 'D')) if (*(DWORD *)LumpInfo[i].name == MAKE_ID('B', 'L', 'O', 'D'))
{ {

View file

@ -64,8 +64,8 @@ CVAR (Bool, wi_noautostartmap, false, CVAR_ARCHIVE)
void WI_loadData (); void WI_loadData ();
void WI_unloadData (); void WI_unloadData ();
#define NEXTSTAGE (gameinfo.gametype == GAME_Doom ? "weapons/rocklx" : "doors/dr1_clos") #define NEXTSTAGE (gameinfo.gametype & GAME_DoomChex ? "weapons/rocklx" : "doors/dr1_clos")
#define PASTSTATS (gameinfo.gametype == GAME_Doom ? "weapons/shotgr" : "plats/pt1_stop") #define PASTSTATS (gameinfo.gametype & GAME_DoomChex ? "weapons/shotgr" : "plats/pt1_stop")
// GLOBAL LOCATIONS // GLOBAL LOCATIONS
#define WI_TITLEY 2 #define WI_TITLEY 2
@ -314,6 +314,7 @@ void WI_LoadBackground(bool isenterpic)
lumpname = NULL; lumpname = NULL;
switch(gameinfo.gametype) switch(gameinfo.gametype)
{ {
case GAME_Chex:
case GAME_Doom: case GAME_Doom:
if (gamemode != commercial) if (gamemode != commercial)
{ {
@ -688,14 +689,14 @@ static void WI_DrawCharPatch (FTexture *patch, int x, int y)
{ {
screen->DrawTexture (patch, x, y, screen->DrawTexture (patch, x, y,
DTA_Clean, true, DTA_Clean, true,
DTA_ShadowAlpha, (gameinfo.gametype == GAME_Doom) ? 0 : FRACUNIT/2, DTA_ShadowAlpha, (gameinfo.gametype & GAME_DoomChex) ? 0 : FRACUNIT/2,
TAG_DONE); TAG_DONE);
} }
else else
{ {
screen->DrawTexture (patch, x, y, screen->DrawTexture (patch, x, y,
DTA_Clean, true, DTA_Clean, true,
DTA_ShadowAlpha, (gameinfo.gametype == GAME_Doom) ? 0 : FRACUNIT/2, DTA_ShadowAlpha, (gameinfo.gametype & GAME_DoomChex) ? 0 : FRACUNIT/2,
DTA_Translation, BigFont->GetColorTranslation (CR_UNTRANSLATED), // otherwise it doesn't look good in Strife! DTA_Translation, BigFont->GetColorTranslation (CR_UNTRANSLATED), // otherwise it doesn't look good in Strife!
TAG_DONE); TAG_DONE);
} }
@ -779,7 +780,7 @@ void WI_drawLF ()
if (y < NG_STATSY - screen->Font->GetHeight()*3/4) if (y < NG_STATSY - screen->Font->GetHeight()*3/4)
{ {
// don't draw 'finished' if the level name is too high! // don't draw 'finished' if the level name is too high!
if (gameinfo.gametype == GAME_Doom) if (gameinfo.gametype & GAME_DoomChex)
{ {
screen->DrawTexture(finished, 160 - finished->GetWidth()/2, y, DTA_Clean, true, TAG_DONE); screen->DrawTexture(finished, 160 - finished->GetWidth()/2, y, DTA_Clean, true, TAG_DONE);
} }
@ -809,7 +810,7 @@ void WI_drawEL ()
// draw "entering" // draw "entering"
// be careful with the added height so that it works for oversized 'entering' patches! // be careful with the added height so that it works for oversized 'entering' patches!
if (gameinfo.gametype == GAME_Doom) if (gameinfo.gametype & GAME_DoomChex)
{ {
screen->DrawTexture(entering, (SCREENWIDTH - entering->GetWidth() * CleanXfac) / 2, y * CleanYfac, DTA_CleanNoMove, true, TAG_DONE); screen->DrawTexture(entering, (SCREENWIDTH - entering->GetWidth() * CleanXfac) / 2, y * CleanYfac, DTA_CleanNoMove, true, TAG_DONE);
y += entering->GetHeight() + screen->Font->GetHeight()/4; y += entering->GetHeight() + screen->Font->GetHeight()/4;
@ -1557,7 +1558,7 @@ void WI_drawNetgameStats ()
WI_drawLF(); WI_drawLF();
if (gameinfo.gametype == GAME_Doom) if (gameinfo.gametype & GAME_DoomChex)
{ {
// draw stat titles (top line) // draw stat titles (top line)
screen->DrawTexture (kills, NG_STATSX+NG_SPACINGX-kills->GetWidth(), NG_STATSY, DTA_Clean, true, TAG_DONE); screen->DrawTexture (kills, NG_STATSX+NG_SPACINGX-kills->GetWidth(), NG_STATSY, DTA_Clean, true, TAG_DONE);
@ -1675,7 +1676,7 @@ void WI_updateStats ()
{ {
WI_updateAnimatedBack (); WI_updateAnimatedBack ();
if ((gameinfo.gametype != GAME_Doom || acceleratestage) if ((!(gameinfo.gametype & GAME_DoomChex) || acceleratestage)
&& sp_state != 10) && sp_state != 10)
{ {
if (acceleratestage) if (acceleratestage)
@ -1694,7 +1695,7 @@ void WI_updateStats ()
if (sp_state == 2) if (sp_state == 2)
{ {
if (gameinfo.gametype == GAME_Doom) if (gameinfo.gametype & GAME_DoomChex)
{ {
cnt_kills[0] += 2; cnt_kills[0] += 2;
@ -1710,7 +1711,7 @@ void WI_updateStats ()
} }
else if (sp_state == 4) else if (sp_state == 4)
{ {
if (gameinfo.gametype == GAME_Doom) if (gameinfo.gametype & GAME_DoomChex)
{ {
cnt_items[0] += 2; cnt_items[0] += 2;
@ -1726,7 +1727,7 @@ void WI_updateStats ()
} }
else if (sp_state == 6) else if (sp_state == 6)
{ {
if (gameinfo.gametype == GAME_Doom) if (gameinfo.gametype & GAME_DoomChex)
{ {
cnt_secret[0] += 2; cnt_secret[0] += 2;
@ -1742,7 +1743,7 @@ void WI_updateStats ()
} }
else if (sp_state == 8) else if (sp_state == 8)
{ {
if (gameinfo.gametype == GAME_Doom) if (gameinfo.gametype & GAME_DoomChex)
{ {
if (!(bcnt&3)) if (!(bcnt&3))
S_Sound (CHAN_VOICE | CHAN_UI, "weapons/pistol", 1, ATTN_NONE); S_Sound (CHAN_VOICE | CHAN_UI, "weapons/pistol", 1, ATTN_NONE);
@ -1800,7 +1801,7 @@ void WI_drawStats (void)
WI_drawLF(); WI_drawLF();
if (gameinfo.gametype == GAME_Doom) if (gameinfo.gametype & GAME_DoomChex)
{ {
screen->DrawTexture (kills, SP_STATSX, SP_STATSY, DTA_Clean, true, TAG_DONE); screen->DrawTexture (kills, SP_STATSX, SP_STATSY, DTA_Clean, true, TAG_DONE);
WI_drawPercent (320 - SP_STATSX, SP_STATSY, cnt_kills[0], wbs->maxkills); WI_drawPercent (320 - SP_STATSX, SP_STATSY, cnt_kills[0], wbs->maxkills);
@ -1956,7 +1957,7 @@ void WI_loadData(void)
int i; int i;
char name[9]; char name[9];
if (gameinfo.gametype == GAME_Doom) if (gameinfo.gametype & GAME_DoomChex)
{ {
wiminus = TexMan["WIMINUS"]; // minus sign wiminus = TexMan["WIMINUS"]; // minus sign
percent = TexMan["WIPCNT"]; // percent sign percent = TexMan["WIPCNT"]; // percent sign

View file

@ -41,6 +41,9 @@
#include <richedit.h> #include <richedit.h>
#include <winuser.h> #include <winuser.h>
#include <tlhelp32.h> #include <tlhelp32.h>
#ifndef _M_IX86
#include <winternl.h>
#endif
#ifndef __GNUC__ #ifndef __GNUC__
#include <dbghelp.h> #include <dbghelp.h>
#endif #endif
@ -142,6 +145,11 @@ typedef BOOL (WINAPI *WRITEDUMP) (HANDLE, DWORD, HANDLE, int,
// TYPES ------------------------------------------------------------------- // TYPES -------------------------------------------------------------------
#ifdef _M_X64
typedef PRUNTIME_FUNCTION (WINAPI *RTLLOOKUPFUNCTIONENTRY)
(ULONG64 ControlPc, PULONG64 ImageBase, void *HistoryTable);
#endif
// Damn Microsoft for doing Get/SetWindowLongPtr half-assed. Instead of // Damn Microsoft for doing Get/SetWindowLongPtr half-assed. Instead of
// giving them proper prototypes under Win32, they are just macros for // giving them proper prototypes under Win32, they are just macros for
// Get/SetWindowLong, meaning they take LONGs and not LONG_PTRs. // Get/SetWindowLong, meaning they take LONGs and not LONG_PTRs.
@ -235,8 +243,8 @@ static void AddZipFile (HANDLE ziphandle, TarFile *whichfile, short dosdate, sho
static HANDLE CreateTempFile (); static HANDLE CreateTempFile ();
static void DumpBytes (HANDLE file, BYTE *address); static void DumpBytes (HANDLE file, BYTE *address);
static void AddStackInfo (HANDLE file, void *dumpaddress, DWORD code); static void AddStackInfo (HANDLE file, void *dumpaddress, DWORD code, CONTEXT *ctxt);
static void StackWalk (HANDLE file, void *dumpaddress, DWORD *topOfStack, DWORD *jump); static void StackWalk (HANDLE file, void *dumpaddress, DWORD *topOfStack, DWORD *jump, CONTEXT *ctxt);
static void AddToolHelp (HANDLE file); static void AddToolHelp (HANDLE file);
static HANDLE WriteTextReport (); static HANDLE WriteTextReport ();
@ -650,9 +658,9 @@ HANDLE WriteTextReport ()
if (verinfo.dwPlatformId != VER_PLATFORM_WIN32_WINDOWS) if (verinfo.dwPlatformId != VER_PLATFORM_WIN32_WINDOWS)
{ {
j += mysnprintf (CrashSummary + j, countof(CrashSummary) - j, j += mysnprintf (CrashSummary + j, countof(CrashSummary) - j,
" - tried to %s address %08lX", " - tried to %s address %p",
CrashPointers.ExceptionRecord->ExceptionInformation[0] ? "write" : "read", CrashPointers.ExceptionRecord->ExceptionInformation[0] ? "write" : "read",
CrashPointers.ExceptionRecord->ExceptionInformation[1]); (void *)CrashPointers.ExceptionRecord->ExceptionInformation[1]);
} }
} }
CrashSummary[j++] = ')'; CrashSummary[j++] = ')';
@ -741,17 +749,21 @@ HANDLE WriteTextReport ()
AddToolHelp (file); AddToolHelp (file);
#ifdef _M_IX86
Writef (file, "\r\nBytes near EIP:"); Writef (file, "\r\nBytes near EIP:");
#else
Writef (file, "\r\nBytes near RIP:");
#endif
DumpBytes (file, (BYTE *)CrashPointers.ExceptionRecord->ExceptionAddress-16); DumpBytes (file, (BYTE *)CrashPointers.ExceptionRecord->ExceptionAddress-16);
if (ctxt->ContextFlags & CONTEXT_CONTROL) if (ctxt->ContextFlags & CONTEXT_CONTROL)
{ {
#ifndef _M_X64 #ifndef _M_X64
AddStackInfo (file, (void *)(size_t)CrashPointers.ContextRecord->Esp, AddStackInfo (file, (void *)(size_t)CrashPointers.ContextRecord->Esp,
CrashPointers.ExceptionRecord->ExceptionCode); CrashPointers.ExceptionRecord->ExceptionCode, ctxt);
#else #else
AddStackInfo (file, (void *)CrashPointers.ContextRecord->Rsp, AddStackInfo (file, (void *)CrashPointers.ContextRecord->Rsp,
CrashPointers.ExceptionRecord->ExceptionCode); CrashPointers.ExceptionRecord->ExceptionCode, ctxt);
#endif #endif
} }
@ -814,7 +826,7 @@ static void AddToolHelp (HANDLE file)
if (thread.th32ThreadID == DbgThreadID) if (thread.th32ThreadID == DbgThreadID)
{ {
Writef (file, " at %08x*", CrashAddress); Writef (file, " at %p*", CrashAddress);
} }
Writef (file, "\r\n"); Writef (file, "\r\n");
} }
@ -829,7 +841,7 @@ static void AddToolHelp (HANDLE file)
{ {
do do
{ {
Writef (file, "%08x - %08x %c%s\r\n", Writef (file, "%p - %p %c%s\r\n",
module.modBaseAddr, module.modBaseAddr + module.modBaseSize - 1, module.modBaseAddr, module.modBaseAddr + module.modBaseSize - 1,
module.modBaseAddr <= CrashPointers.ExceptionRecord->ExceptionAddress && module.modBaseAddr <= CrashPointers.ExceptionRecord->ExceptionAddress &&
module.modBaseAddr + module.modBaseSize > CrashPointers.ExceptionRecord->ExceptionAddress module.modBaseAddr + module.modBaseSize > CrashPointers.ExceptionRecord->ExceptionAddress
@ -849,12 +861,16 @@ static void AddToolHelp (HANDLE file)
// //
//========================================================================== //==========================================================================
static void AddStackInfo (HANDLE file, void *dumpaddress, DWORD code) static void AddStackInfo (HANDLE file, void *dumpaddress, DWORD code, CONTEXT *ctxt)
{ {
DWORD *addr = (DWORD *)dumpaddress, *jump; DWORD *addr = (DWORD *)dumpaddress, *jump;
DWORD *topOfStack = GetTopOfStack (dumpaddress); DWORD *topOfStack = GetTopOfStack (dumpaddress);
BYTE peekb; BYTE peekb;
#ifdef _M_IX86
DWORD peekd; DWORD peekd;
#else
QWORD peekq;
#endif
jump = topOfStack; jump = topOfStack;
if (code == EXCEPTION_STACK_OVERFLOW) if (code == EXCEPTION_STACK_OVERFLOW)
@ -866,7 +882,7 @@ static void AddStackInfo (HANDLE file, void *dumpaddress, DWORD code)
} }
} }
StackWalk (file, dumpaddress, topOfStack, jump); StackWalk (file, dumpaddress, topOfStack, jump, ctxt);
Writef (file, "\r\nStack Contents:\r\n"); Writef (file, "\r\nStack Contents:\r\n");
DWORD *scan; DWORD *scan;
@ -881,6 +897,8 @@ static void AddStackInfo (HANDLE file, void *dumpaddress, DWORD code)
Writef (file, "\r\n . . . Snip . . .\r\n\r\n"); Writef (file, "\r\n . . . Snip . . .\r\n\r\n");
} }
Writef (file, "%p:", scan);
#ifdef _M_IX86
if (topOfStack - scan < 4) if (topOfStack - scan < 4)
{ {
max = topOfStack - scan; max = topOfStack - scan;
@ -890,7 +908,6 @@ static void AddStackInfo (HANDLE file, void *dumpaddress, DWORD code)
max = 4; max = 4;
} }
Writef (file, "%p:", scan);
for (i = 0; i < max; ++i) for (i = 0; i < max; ++i)
{ {
if (!SafeReadMemory (&scan[i], &peekd, 4)) if (!SafeReadMemory (&scan[i], &peekd, 4))
@ -903,8 +920,31 @@ static void AddStackInfo (HANDLE file, void *dumpaddress, DWORD code)
{ {
Writef (file, " "); Writef (file, " ");
} }
#else
if ((QWORD *)topOfStack - (QWORD *)scan < 2)
{
max = (QWORD *)topOfStack - (QWORD *)scan;
}
else
{
max = 2;
}
for (i = 0; i < max; ++i)
{
if (!SafeReadMemory (&scan[i], &peekq, 8))
{
break;
}
Writef (file, " %016x", peekq);
}
if (i < 2)
{
Writef (file, " ");
}
#endif
Writef (file, " "); Writef (file, " ");
for (i = 0; i < max*4; ++i) for (i = 0; i < int(max*sizeof(void*)); ++i)
{ {
if (!SafeReadMemory ((BYTE *)scan + i, &peekb, 1)) if (!SafeReadMemory ((BYTE *)scan + i, &peekb, 1))
{ {
@ -916,9 +956,12 @@ static void AddStackInfo (HANDLE file, void *dumpaddress, DWORD code)
} }
} }
#ifdef _M_IX86
//========================================================================== //==========================================================================
// //
// StackWalk // StackWalk
// Win32 version
// //
// Lists a possible call trace for the crashing thread to the text report. // Lists a possible call trace for the crashing thread to the text report.
// This is not very specific and just lists any pointers into the // This is not very specific and just lists any pointers into the
@ -926,7 +969,7 @@ static void AddStackInfo (HANDLE file, void *dumpaddress, DWORD code)
// //
//========================================================================== //==========================================================================
static void StackWalk (HANDLE file, void *dumpaddress, DWORD *topOfStack, DWORD *jump) static void StackWalk (HANDLE file, void *dumpaddress, DWORD *topOfStack, DWORD *jump, CONTEXT *ctxt)
{ {
DWORD *addr = (DWORD *)dumpaddress; DWORD *addr = (DWORD *)dumpaddress;
@ -947,7 +990,6 @@ static void StackWalk (HANDLE file, void *dumpaddress, DWORD *topOfStack, DWORD
Writef (file, "\r\n\r\n . . . . Snip . . . .\r\n"); Writef (file, "\r\n\r\n . . . . Snip . . . .\r\n");
} }
#ifndef _M_X64
DWORD_PTR code; DWORD_PTR code;
if (SafeReadMemory (scan, &code, sizeof(code)) && if (SafeReadMemory (scan, &code, sizeof(code)) &&
@ -1106,11 +1148,133 @@ static void StackWalk (HANDLE file, void *dumpaddress, DWORD *topOfStack, DWORD
} }
} }
} }
#endif
} }
Writef (file, "\r\n"); Writef (file, "\r\n");
} }
#else
//==========================================================================
//
// StackWalk
// Win64 version
//
// Walks the stack for the crashing thread and dumps the trace to the text
// report. Unlike the Win32 version, Win64 provides facilities for
// doing a 100% exact walk.
//
// See http://www.nynaeve.net/?p=113 for more information, and
// http://www.nynaeve.net/Code/StackWalk64.cpp in particular.
//
//==========================================================================
static void StackWalk (HANDLE file, void *dumpaddress, DWORD *topOfStack, DWORD *jump, CONTEXT *ctxt)
{
RTLLOOKUPFUNCTIONENTRY RtlLookupFunctionEntry;
HMODULE kernel;
CONTEXT context;
KNONVOLATILE_CONTEXT_POINTERS nv_context;
PRUNTIME_FUNCTION function;
PVOID handler_data;
ULONG64 establisher_frame;
ULONG64 image_base;
Writef (file, "\r\nCall trace:\r\n rip=%p <- Here it dies.\r\n", CrashAddress);
kernel = GetModuleHandle("kernel32.dll");
if (kernel == NULL || NULL == (RtlLookupFunctionEntry =
(RTLLOOKUPFUNCTIONENTRY)GetProcAddress(kernel, "RtlLookupFunctionEntry")))
{
Writef (file, " Unavailable: Could not get address of RtlLookupFunctionEntry\r\n");
return;
}
// Get the caller's context
context = *ctxt;
// This unwind loop intentionally skips the first call frame, as it
// shall correspond to the call to StackTrace64, which we aren't
// interested in.
for (ULONG frame = 0; ; ++frame)
{
// Try to look up unwind metadata for the current function.
function = RtlLookupFunctionEntry(context.Rip, &image_base, NULL);
memset(&nv_context, 0, sizeof(nv_context));
if (function == NULL)
{
// If we don't have a RUNTIME_FUNCTION, then we've encountered
// a leaf function. Adjust the stack appropriately.
context.Rip = (ULONG64)(*(PULONG64)context.Rsp);
context.Rsp += 8;
Writef(file, " Leaf function\r\n\r\n");
}
else
{
// Note that there is not a one-to-one correspondance between
// runtime functions and source functions. One source function
// may be broken into multiple runtime functions. This loop walks
// backward from the current runtime function for however many
// consecutive runtime functions precede it. There is a slight
// chance that this will walk across different source functions.
// (Or maybe not, depending on whether or not the compiler
// guarantees that there will be empty space between functions;
// it looks like VC++ might.) In practice, this seems to work
// quite well for identifying the exact address to search for in
// a map file to determine the function name.
PRUNTIME_FUNCTION function2 = function;
ULONG64 base = image_base;
while (function2 != NULL)
{
Writef(file, " Function range: %p -> %p\r\n",
(void *)(base + function2->BeginAddress),
(void *)(base + function2->EndAddress));
function2 = RtlLookupFunctionEntry(base + function2->BeginAddress - 1, &base, NULL);
}
Writef(file, "\r\n");
// Use RtlVirtualUnwind to execute the unwind for us.
RtlVirtualUnwind(0/*UNW_FLAG_NHANDLER*/, image_base, context.Rip,
function, &context, &handler_data, &establisher_frame,
&nv_context);
}
// If we reach a RIP of zero, this means we've walked off the end of
// the call stack and are done.
if (context.Rip == NULL)
{
break;
}
// Display the context. Note that we don't bother showing the XMM
// context, although we have the nonvolatile portion of it.
Writef(file, " FRAME %02d:\r\n rip=%p rsp=%p rbp=%p\r\n",
frame, context.Rip, context.Rsp, context.Rbp);
Writef(file, " r12=%p r13=%p r14=%p\r\n"
" rdi=%p rsi=%p rbx=%p\r\n",
context.R12, context.R13, context.R14,
context.Rdi, context.Rsi, context.Rbx);
static const char reg_names[16][4] =
{
"rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
"r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
};
// If we have stack-based register stores, then display them here.
for (int i = 0; i < 16; ++i)
{
if (nv_context.IntegerContext[i])
{
Writef(file, " -> '%s' saved on stack at %p (=> %p)\r\n",
reg_names[i], nv_context.IntegerContext[i], *nv_context.IntegerContext[i]);
}
}
}
}
#endif
//========================================================================== //==========================================================================
// //
// DumpBytes // DumpBytes
@ -1121,7 +1285,7 @@ static void StackWalk (HANDLE file, void *dumpaddress, DWORD *topOfStack, DWORD
static void DumpBytes (HANDLE file, BYTE *address) static void DumpBytes (HANDLE file, BYTE *address)
{ {
char line[64*3], *line_p = line; char line[68*3], *line_p = line;
DWORD len; DWORD len;
BYTE peek; BYTE peek;

View file

@ -1092,7 +1092,7 @@ void ST_Endoom()
if (showendoom == 0) exit(0); if (showendoom == 0) exit(0);
int endoom_lump = Wads.CheckNumForName ( int endoom_lump = Wads.CheckNumForName (
gameinfo.gametype == GAME_Doom? "ENDOOM" : gameinfo.gametype & GAME_DoomChex ? "ENDOOM" :
gameinfo.gametype == GAME_Heretic? "ENDTEXT" : gameinfo.gametype == GAME_Heretic? "ENDTEXT" :
gameinfo.gametype == GAME_Strife? "ENDSTRF" : NULL); gameinfo.gametype == GAME_Strife? "ENDSTRF" : NULL);

View file

@ -161,7 +161,7 @@ BEGIN
IDD_CRASHDIALOG, DIALOG IDD_CRASHDIALOG, DIALOG
BEGIN BEGIN
LEFTMARGIN, 4 LEFTMARGIN, 4
RIGHTMARGIN, 401 RIGHTMARGIN, 408
TOPMARGIN, 4 TOPMARGIN, 4
BOTTOMMARGIN, 303 BOTTOMMARGIN, 303
HORZGUIDE, 49 HORZGUIDE, 49
@ -179,7 +179,7 @@ BEGIN
IDD_CRASHDETAILS, DIALOG IDD_CRASHDETAILS, DIALOG
BEGIN BEGIN
LEFTMARGIN, 7 LEFTMARGIN, 7
RIGHTMARGIN, 384 RIGHTMARGIN, 392
TOPMARGIN, 7 TOPMARGIN, 7
HORZGUIDE, 76 HORZGUIDE, 76
END END
@ -374,19 +374,19 @@ BEGIN
PUSHBUTTON "Select None",IDC_SELECTNONE,320,31,50,14 PUSHBUTTON "Select None",IDC_SELECTNONE,320,31,50,14
END END
IDD_CRASHDIALOG DIALOGEX 0, 0, 405, 308 IDD_CRASHDIALOG DIALOGEX 0, 0, 415, 308
STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_CONTROLPARENT | WS_EX_APPWINDOW EXSTYLE WS_EX_CONTROLPARENT | WS_EX_APPWINDOW
CAPTION "ZDoom Very Fatal Error" CAPTION "ZDoom Very Fatal Error"
FONT 8, "MS Shell Dlg", 400, 0, 0x0 FONT 8, "MS Shell Dlg", 400, 0, 0x0
BEGIN BEGIN
CONTROL "",IDC_CRASHTAB,"SysTabControl32",WS_TABSTOP,4,4,397,280 CONTROL "",IDC_CRASHTAB,"SysTabControl32",WS_TABSTOP,4,4,404,280
PUSHBUTTON "&Send Error Report",IDYES,139,289,91,14,WS_DISABLED PUSHBUTTON "&Send Error Report",IDYES,146,289,91,14,WS_DISABLED
PUSHBUTTON "Save Report to Disk...",IDC_SAVEREPORT,235,289,91,14 PUSHBUTTON "Save Report to Disk...",IDC_SAVEREPORT,242,289,91,14
PUSHBUTTON "&Discard Report",IDNO,331,289,70,14 PUSHBUTTON "&Discard Report",IDNO,338,289,70,14
END END
IDD_CRASHOVERVIEW DIALOGEX 1, 13, 391, 264 IDD_CRASHOVERVIEW DIALOGEX 1, 13, 400, 264
STYLE DS_SETFONT | DS_FIXEDSYS | DS_CONTROL | WS_CHILD | WS_VISIBLE STYLE DS_SETFONT | DS_FIXEDSYS | DS_CONTROL | WS_CHILD | WS_VISIBLE
FONT 8, "MS Shell Dlg", 400, 0, 0x1 FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN BEGIN
@ -400,15 +400,15 @@ BEGIN
LTEXT "Static",IDC_CRASHSUMMARY,14,233,363,20 LTEXT "Static",IDC_CRASHSUMMARY,14,233,363,20
END END
IDD_CRASHDETAILS DIALOGEX 0, 0, 391, 164 IDD_CRASHDETAILS DIALOGEX 0, 0, 400, 164
STYLE DS_SETFONT | DS_3DLOOK | DS_FIXEDSYS | DS_CONTROL | WS_CHILD STYLE DS_SETFONT | DS_3DLOOK | DS_FIXEDSYS | DS_CONTROL | WS_CHILD
FONT 8, "MS Shell Dlg", 400, 0, 0x1 FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN BEGIN
LTEXT "The error report contains these files:",IDC_STATIC,7,5,119,8 LTEXT "The error report contains these files:",IDC_STATIC,7,5,119,8
LTEXT "The selected file contains this information:",IDC_STATIC,7,74,136,8 LTEXT "The selected file contains this information:",IDC_STATIC,7,74,136,8
RTEXT "Static",IDC_CRASHFILESIZE,329,74,55,8 RTEXT "Static",IDC_CRASHFILESIZE,337,74,55,8
LISTBOX IDC_CRASHFILES,7,15,377,53,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP LISTBOX IDC_CRASHFILES,7,15,385,53,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
CONTROL "",IDC_CRASHFILECONTENTS,"RichEdit20A",ES_MULTILINE | ES_READONLY | WS_BORDER | WS_VSCROLL | WS_TABSTOP,7,83,377,174 CONTROL "",IDC_CRASHFILECONTENTS,"RichEdit20A",ES_MULTILINE | ES_READONLY | WS_BORDER | WS_VSCROLL | WS_TABSTOP,7,83,385,174
END END
IDD_BOING DIALOGEX 0, 0, 187, 196 IDD_BOING DIALOGEX 0, 0, 187, 196

View file

@ -26,6 +26,7 @@ Actor PlayerPawn : Actor native
Player.SideMove 1,1 Player.SideMove 1,1
Player.ColorRange 0,0 Player.ColorRange 0,0
Player.SoundClass "player" Player.SoundClass "player"
Player.DamageScreenColor "ff 00 00"
} }
Actor PlayerChunk : PlayerPawn native Actor PlayerChunk : PlayerPawn native

View file

@ -108,13 +108,13 @@ decalgroup BulletChip
* Blood smears crawl down walls a bit like in Blood. * Blood smears crawl down walls a bit like in Blood.
* *
* These do not need generators; the engine will create them automatically * These do not need generators; the engine will create them automatically
* when something bleeds. In the future, the shade color will be ignored, * when something bleeds. If a blood color is set, the shade color will be ignored,
* and the actor's blood color will be used instead. * and the actor's blood color will be used instead.
*/ */
decal BloodSplat1 decal BloodSplat1
{ {
pic BSPLAT1 pic BSPLAT1
shade "68 00 00" shade "BloodDefault"
x-scale 0.75 x-scale 0.75
y-scale 0.75 y-scale 0.75
randomflipx randomflipx
@ -124,7 +124,7 @@ decal BloodSplat1
decal BloodSplat2 decal BloodSplat2
{ {
pic BSPLAT2 pic BSPLAT2
shade "68 00 00" shade "BloodDefault"
x-scale 0.75 x-scale 0.75
y-scale 0.75 y-scale 0.75
randomflipx randomflipx
@ -134,7 +134,7 @@ decal BloodSplat2
decal BloodSplat3 decal BloodSplat3
{ {
pic BSPLAT3 pic BSPLAT3
shade "68 00 00" shade "BloodDefault"
x-scale 0.75 x-scale 0.75
y-scale 0.75 y-scale 0.75
randomflipx randomflipx
@ -144,7 +144,7 @@ decal BloodSplat3
decal BloodSplat4 decal BloodSplat4
{ {
pic BSPLAT4 pic BSPLAT4
shade "68 00 00" shade "BloodDefault"
x-scale 0.75 x-scale 0.75
y-scale 0.75 y-scale 0.75
randomflipx randomflipx
@ -154,7 +154,7 @@ decal BloodSplat4
decal BloodSplat5 decal BloodSplat5
{ {
pic BSPLAT5 pic BSPLAT5
shade "68 00 00" shade "BloodDefault"
x-scale 0.75 x-scale 0.75
y-scale 0.75 y-scale 0.75
randomflipx randomflipx
@ -164,7 +164,7 @@ decal BloodSplat5
decal BloodSplat6 decal BloodSplat6
{ {
pic BSPLAT6 pic BSPLAT6
shade "68 00 00" shade "BloodDefault"
x-scale 0.75 x-scale 0.75
y-scale 0.75 y-scale 0.75
randomflipx randomflipx
@ -174,7 +174,7 @@ decal BloodSplat6
decal BloodSplat7 decal BloodSplat7
{ {
pic BSPLAT7 pic BSPLAT7
shade "68 00 00" shade "BloodDefault"
x-scale 0.75 x-scale 0.75
y-scale 0.75 y-scale 0.75
randomflipx randomflipx
@ -199,7 +199,7 @@ decal BloodSmear1
pic BSMEAR1 pic BSMEAR1
x-scale 0.625 x-scale 0.625
y-scale 0.625 y-scale 0.625
shade "68 00 00" shade "BloodDefault"
randomflipx randomflipx
animator BloodSmearer animator BloodSmearer
} }
@ -209,7 +209,7 @@ decal BloodSmear2
pic BSMEAR1 pic BSMEAR1
x-scale 0.625 x-scale 0.625
y-scale 0.625 y-scale 0.625
shade "68 00 00" shade "BloodDefault"
randomflipx randomflipx
animator BloodSmearer animator BloodSmearer
} }

View file

@ -167,3 +167,11 @@
#include "actors/strife/templar.txt" #include "actors/strife/templar.txt"
#include "actors/strife/zombie.txt" #include "actors/strife/zombie.txt"
#include "actors/strife/sigil.txt" #include "actors/strife/sigil.txt"
#include "actors/chex/chexmonsters.txt"
#include "actors/chex/chexkeys.txt"
#include "actors/chex/chexammo.txt"
#include "actors/chex/chexweapons.txt"
#include "actors/chex/chexitems.txt"
#include "actors/chex/chexdecorations.txt"
#include "actors/chex/chexplayer.txt"

View file

@ -37,6 +37,10 @@ QUITMSG20 = "fine! just kill and run!";
QUITMSG21 = "you can quit...\nbut you can't hide..."; QUITMSG21 = "you can quit...\nbut you can't hide...";
QUITMSG22 = "whaaa, what's the matter?\nmommy says dinnertime?"; QUITMSG22 = "whaaa, what's the matter?\nmommy says dinnertime?";
// Quit Chex messages
QUITMSG23 = "Don't give up now...do\nyou still wish to quit?";
QUITMSG24 = "please don't leave, we\nneed your help!"; //7 times as likely to show
LOADNET = "you can't do load while in a net game!\n\npress a key."; LOADNET = "you can't do load while in a net game!\n\npress a key.";
QLOADNET = "you can't quickload during a netgame!\n\npress a key."; QLOADNET = "you can't quickload during a netgame!\n\npress a key.";
QSAVESPOT = "you haven't picked a quicksave slot yet!\n\npress a key."; QSAVESPOT = "you haven't picked a quicksave slot yet!\n\npress a key.";
@ -1301,3 +1305,75 @@ BBA_SCROTUM = "%o suffered scrotum separation";
BBA_POPULATION = "%o volunteered for population control"; BBA_POPULATION = "%o volunteered for population control";
BBA_SUICIDE = "%o has suicided"; BBA_SUICIDE = "%o has suicided";
BBA_DARWIN = "%o received the Darwin Award"; BBA_DARWIN = "%o received the Darwin Award";
// Chex Quest Strings
CHUSTR_E1M1 = "E1M1: Landing Zone";
CHUSTR_E1M2 = "E1M2: Storage Facility";
CHUSTR_E1M3 = "E1M3: Experimental Lab";
CHUSTR_E1M4 = "E1M4: Arboretum";
CHUSTR_E1M5 = "E1M5: Caverns of Bazoik";
CE1TEXT =
"Mission accomplished.\n"
"\n"
"Are you prepared for the next mission?\n"
"\n"
"\n"
"\n"
"\n"
"\n"
"\n"
"Press the escape key to continue...";
CE2TEXT = "You've done it!";
CE3TEXT = "Wonderful Job!";
CE4TEXT = "Fantastic";
CLOADNET = "you can't do load while in a net quest!\n\npress a key.";
CQSPROMPT = "quicksave over your quest named\n\n'%s'?\n\npress y or n.";
CQLOADNET = "you can't quickload during a netquest!\n\npress a key.";
CQLPROMPT = "do you want to quickload the quest named\n\n'%s'?\n\npress y or n.";
CNEWGAME = "you can't start a new quest\nwhile in a network quest.\n\npress a key.";
CNIGHTMARE = "Careful, this will be tough.\nDo you wish to continue?\n\npress y or n.";
CSWSTRING = "this is Chex(R) Quest. look for\n\nfuture levels at www.chexquest.com.\n\npress a key.";
CNETEND = "you can't end a netquest!\n\npress a key.";
CENDGAME = "are you sure you want to end the quest?\n\npress y or n.";
GOTCHEXARMOR = "Picked up the Chex(R) Armor.";
GOTSUPERCHEXARMOR = "Picked up the Super Chex(R) Armor!";
GOTWATER = "Picked up a glass of water.";
GOTREPELLENT = "Picked up slime repellent.";
GOTBREAKFAST = "Supercharge Breakfast!";
GOTCBLUEKEY = "Picked up a blue key.";
GOTCYELLOWKEY = "Picked up a yallow key.";
GOTCREDKEY = "Picked up a red key.";
GOTFRUIT = "Picked up a bowl of fruit.";
GOTVEGETABLESNEED = "Picked up some needed vegetables!";
GOTVEGETABLES = "Picked up a bowl of vegetables.";
GOTSLIMESUIT = "Slimeproof Suit";
GOTZORCHRECHARGE = "Picked up a mini zorch recharge.";
GOTMINIZORCHPACK = "Picked up a mini zorch pack.";
GOTPROPULSORRECHARGE = "Picked up a zorch propulsor recharge.";
GOTPROPULSORPACK = "Picked up a zorch propulsor pack.";
GOTPHASINGZORCHERRECHARGE = "Picked up a phasing zorcher recharge";
GOTPHASINGZORCHERPACK = "Picked up a phasing zorcher pack.";
GOTLARGEZORCHERRECHARGE = "Picked up a large zorcher recharge.";
GOTLARGEZORCHERPACK = "Picked up a large zorcher pack.";
GOTZORCHPACK = "Picked up a Zorchpak!";
GOTLAZDEVICE = "You got the LAZ Device!";
GOTRAPIDZORCHER = "You got the Rapid Zorcher!";
GOTSUPERBOOTSPORK = "You got the Super Bootspork!";
GOTZORCHPROPULSOR = "You got the Zorch Propulsor!";
GOTPHASINGZORCHER = "You got the Phasing Zorcher!";
GOTLARGEZORCHER = "You got the Large Zorcher!";
GOTSUPERLARGEZORCHER = "You got the Super Large Zorcher!";
GOTMINIZORCHER = "Picked up a Mini Zorcher.";
STSTR_CDQDON = "Invincible Mode ON";
STSTR_CDQDOFF = "Invincible Mode OFF";
STSTR_CFAADDED = "Zorch Added";
STSTR_CKFAADDED = "Super Zorch Added";
STSTR_CCHOPPERS = "... Eat Chex(R)!";

View file

@ -1,5 +1,6 @@
/* French strings. These are just as they appeared in the original Doom source, /* French strings updated by DK
* so there's lots missing. (X-DOOM, you speak French. Want to add any?) * Special thanks to "la communauté française de Doom" :)
*
*/ */
[fr] [fr]
@ -13,6 +14,35 @@ D_CDROM = "VERSION CD-ROM: DEFAULT.CFG DANS C:\\DOOMDATA\n";
PRESSKEY = "APPUYEZ SUR UNE TOUCHE."; PRESSKEY = "APPUYEZ SUR UNE TOUCHE.";
PRESSYN = "APPUYEZ SUR Y OU N"; PRESSYN = "APPUYEZ SUR Y OU N";
QUITMSG = "VOUS VOULEZ VRAIMENT\nQUITTER CE SUPER JEU?"; QUITMSG = "VOUS VOULEZ VRAIMENT\nQUITTER CE SUPER JEU?";
// QuitDoom1 messages
QUITMSG1 = "ne partez pas,Il ya encore\ndes démons a griller!";
QUITMSG2 = "fichons le camp ,ça dégenere\nen bain de sang!";
QUITMSG3 = "Je ne quitterai pas si j'etait vous.\nos est bien pire.";
QUITMSG4 = "Vous essayez de dire que vous aimez dos\nmieux que moi ,pas vrai?";
QUITMSG5 = "Ne partez pas encore-il y a \nun demon dans le coin!";
QUITMSG6 = "vous savez ,la prochaine que vous venez ici\nje vous grille.";
QUITMSG7 = "allez y partez. regardez si j'y fais attention.";
// QuitDOOM II messages
QUITMSG8 = "vous voulez vraiment quitter?\nalors,vous avez perdus un huitieme!";
QUITMSG9 = "ne partez pas maintenent,il y a un \nportail interdimensionnel attendant\na l'ecran os";
QUITMSG10 = "tirez vous de la et retournez\na vos programmes ennuyeux.";
QUITMSG11 = "si j'etait votre patron,je vous\n tuerais dans la minute!";
QUITMSG12 = "regardez l'ami. vous partez maintenant\net vous perdez votre nombre de tues!";
QUITMSG13 = "allez partez. quand vous reviendrez\n,je vous attendrai avec une batte.";
QUITMSG14 = "vous etes chanceux je vous gifle pas\nparce que vous pensez partir.";
// Quit Strife messages
QUITMSG15 = "ou allez vous?!\nque va devenir la rebellion?";
QUITMSG16 = "carnage interruptus...\ntout un programme!";
QUITMSG17 = "mais vous etes l'espoir\n-- mon unique chance!!";
QUITMSG18 = "personne ne peut marcher sur un oiseau noir.";
QUITMSG19 = "je vous pensais different...";
QUITMSG20 = "d'accord! tuez et allez vous en!";
QUITMSG21 = "vous pouvez quitter...\nmais vous ne pouvez pas vous cacher...";
QUITMSG22 = "whaaa, quel est le probleme?\nvotre mere a dit a table?";
LOADNET = "VOUS NE POUVEZ PAS CHARGER\nUN JEU EN RESEAU!\n\nAPPUYEZ SUR UNE TOUCHE."; LOADNET = "VOUS NE POUVEZ PAS CHARGER\nUN JEU EN RESEAU!\n\nAPPUYEZ SUR UNE TOUCHE.";
QLOADNET = "CHARGEMENT RAPIDE INTERDIT EN RESEAU!\n\nAPPUYEZ SUR UNE TOUCHE."; QLOADNET = "CHARGEMENT RAPIDE INTERDIT EN RESEAU!\n\nAPPUYEZ SUR UNE TOUCHE.";
QSAVESPOT = "VOUS N'AVEZ PAS CHOISI UN EMPLACEMENT!\n\nAPPUYEZ SUR UNE TOUCHE."; QSAVESPOT = "VOUS N'AVEZ PAS CHOISI UN EMPLACEMENT!\n\nAPPUYEZ SUR UNE TOUCHE.";
@ -132,6 +162,16 @@ HUSTR_E3M7 = "E3M7: LIMBES";
HUSTR_E3M8 = "E3M8: DIS"; HUSTR_E3M8 = "E3M8: DIS";
HUSTR_E3M9 = "E3M9: CLAPIERS"; HUSTR_E3M9 = "E3M9: CLAPIERS";
HUSTR_E4M1 = "E4M1: L'ENFER EN CONTREBAS";
HUSTR_E4M2 = "E4M2: UNE HAINE PARFAITE";
HUSTR_E4M3 = "E4M3: COUPER LE MAL";
HUSTR_E4M4 = "E4M4: LE MAL INDISCIPLINE ";
HUSTR_E4M5 = "E4M5: ILS S'EN REPENTIRONT";
HUSTR_E4M6 = "E4M6: CONTRE MOI AVEC MECHANCETE";
HUSTR_E4M7 = "E4M7: ET L'ENFER SUIVI";
HUSTR_E4M8 = "E4M8: UNTO LE CRUEL";
HUSTR_E4M9 = "E4M9: PEUR";
HUSTR_1 = "NIVEAU 1: ENTREE "; HUSTR_1 = "NIVEAU 1: ENTREE ";
HUSTR_2 = "NIVEAU 2: HALLS SOUTERRAINS "; HUSTR_2 = "NIVEAU 2: HALLS SOUTERRAINS ";
HUSTR_3 = "NIVEAU 3: LE FEU NOURRI "; HUSTR_3 = "NIVEAU 3: LE FEU NOURRI ";
@ -168,6 +208,71 @@ HUSTR_30 = "NIVEAU 30: L'ICONE DU PECHE ";
HUSTR_31 = "NIVEAU 31: WOLFENSTEIN"; HUSTR_31 = "NIVEAU 31: WOLFENSTEIN";
HUSTR_32 = "NIVEAU 32: LE MASSACRE"; HUSTR_32 = "NIVEAU 32: LE MASSACRE";
PHUSTR_1 = "level 1: congo";
PHUSTR_2 = "level 2: la source des ames";
PHUSTR_3 = "level 3: aztec";
PHUSTR_4 = "level 4: mis en cage";
PHUSTR_5 = "level 5: la ville fantome";
PHUSTR_6 = "level 6: le repair des barons";
PHUSTR_7 = "level 7: caughtyard";
PHUSTR_8 = "level 8: le royaume";
PHUSTR_9 = "level 9: abattoire";
PHUSTR_10 = "level 10: l'assault";
PHUSTR_11 = "level 11: traque";
PHUSTR_12 = "level 12: vitesse";
PHUSTR_13 = "level 13: la crypte";
PHUSTR_14 = "level 14: la genese";
PHUSTR_15 = "level 15: le crepuscule";
PHUSTR_16 = "level 16: le presage";
PHUSTR_17 = "level 17: l'enceinte";
PHUSTR_18 = "level 18: la neurosphere";
PHUSTR_19 = "level 19: nme";
PHUSTR_20 = "level 20: le domaine de la mort";
PHUSTR_21 = "level 21: le pourfendeur";
PHUSTR_22 = "level 22: mission impossible";
PHUSTR_23 = "level 23: la pierre tombale";
PHUSTR_24 = "level 24: la frontiere finale";
PHUSTR_25 = "level 25: le temple des tenebres";
PHUSTR_26 = "level 26: bunker";
PHUSTR_27 = "level 27: ante-christ";
PHUSTR_28 = "level 28: l'egout";
PHUSTR_29 = "level 29: l'odyssee des bruits";
PHUSTR_30 = "level 30: la porte de l'enfer";
PHUSTR_31 = "level 31: l'antre des demons-cybernetiques";
PHUSTR_32 = "level 32: On y va!";
THUSTR_1 = "level 1: le systeme de controle";
THUSTR_2 = "level 2: le barbecue humain";
THUSTR_3 = "level 3: le controle de l'energie";
THUSTR_4 = "level 4: trous de vers";
THUSTR_5 = "level 5: la boucle";
THUSTR_6 = "level 6: la saison d'ouverture";
THUSTR_7 = "level 7: la prison";
THUSTR_8 = "level 8: metal";
THUSTR_9 = "level 9: le fief";
THUSTR_10 = "level 10: redemption";
THUSTR_11 = "level 11: le complexe de stockage";
THUSTR_12 = "level 12: le cratere";
THUSTR_13 = "level 13: l'usine de traitement des dechets nucleaires";
THUSTR_14 = "level 14: l'acierie";
THUSTR_15 = "level 15: la zone morte";
THUSTR_16 = "level 16: les echelons les plus bas";
THUSTR_17 = "level 17: la zone de traitement";
THUSTR_18 = "level 18: le moulin";
THUSTR_19 = "level 19: acheminement/production";
THUSTR_20 = "level 20: traitement central";
THUSTR_21 = "level 21: le centre administratif";
THUSTR_22 = "level 22: l'habitat";
THUSTR_23 = "level 23: le projet de mine lunaire";
THUSTR_24 = "level 24: la carrière";
THUSTR_25 = "level 25: l'antre des barons";
THUSTR_26 = "level 26: ballistyx";
THUSTR_27 = "level 27: le mont souffrance";
THUSTR_28 = "level 28: que diable?";
THUSTR_29 = "level 29: le fleuve styx";
THUSTR_30 = "level 30: le dernier appel";
THUSTR_31 = "level 31: pharaon";
THUSTR_32 = "level 32: caraibbes";
HUSTR_TALKTOSELF1 = "VOUS PARLEZ TOUT SEUL "; HUSTR_TALKTOSELF1 = "VOUS PARLEZ TOUT SEUL ";
HUSTR_TALKTOSELF2 = "QUI EST LA?"; HUSTR_TALKTOSELF2 = "QUI EST LA?";
@ -217,7 +322,7 @@ E1TEXT =
"ET NETTOYE LA BASE LUNAIRE, VOUS AVEZ\n" "ET NETTOYE LA BASE LUNAIRE, VOUS AVEZ\n"
"GAGNE, NON? PAS VRAI? OU EST DONC VOTRE\n" "GAGNE, NON? PAS VRAI? OU EST DONC VOTRE\n"
" RECOMPENSE ET VOTRE BILLET DE\n" " RECOMPENSE ET VOTRE BILLET DE\n"
"RETOUR? QU'EST-QUE CA VEUT DIRE?CE" "RETOUR? QU'EST-QUE CA VEUT DIRE? CE"
"N'EST PAS LA FIN ESPEREE!\n" "N'EST PAS LA FIN ESPEREE!\n"
"\n" "\n"
"CA SENT LA VIANDE PUTREFIEE, MAIS\n" "CA SENT LA VIANDE PUTREFIEE, MAIS\n"
@ -266,9 +371,27 @@ E3TEXT =
"COMBATTU LE DEMON. HEUREUSEMENT,\n" "COMBATTU LE DEMON. HEUREUSEMENT,\n"
"AUCUN GERME DU MAL N'A FRANCHI\n" "AUCUN GERME DU MAL N'A FRANCHI\n"
"CETTE PORTE AVEC VOUS..."; "CETTE PORTE AVEC VOUS...";
E4TEXT =
"l'araignee cerveau doit avoir envoye\n"
"ses legions de creatures de l' enfer \n"
"avant votre confrontation finale avec\n"
"cette terrible bete de l'enfer.\n"
"Mais vous avancez et mettez de suite\n"
"la damnation eternelle et souffrances\n"
"a la meute comme un hero le fairait\n"
"face de quelque chose de si malefique.\n"
"D'ailleurs,quelqu'un va devoir payer \n"
"pour ce qui est arrive a margherite, \n"
"votre lapin domestique.\n"
"\n"
"mais maintenant, vous voyez devant vous \n"
"encore plus de nouvelles souffrances \n"
"potencielles et de chairs broyees\n"
"comme une horde de demons devunus \n"
"vindicatifs parmi nos villes.\n\n"
"prochain arret,l'enfer sur terre!";
// after level 6, put this: // after level 6, put this:
C1TEXT = C1TEXT =
@ -354,6 +477,153 @@ C6TEXT =
"LE NIVEAU SUPER SECRET! VOUS FERIEZ\n" "LE NIVEAU SUPER SECRET! VOUS FERIEZ\n"
"MIEUX DE FONCER DANS CELUI-LA!\n"; "MIEUX DE FONCER DANS CELUI-LA!\n";
P1TEXT =
"Vous jubilez sur la carcass brulante \n"
"du Guardien. Avec sa mort, vous avez \n"
"arrache l'accelerateur des griffes \n"
"fetides de l'enfer. Vous vous reposez \n"
"et regardez aux alentours de l'endroit. \n"
"Mince! Il etait suppose qu'il y ait\n"
"au mois un prototype fonctionnant, \n"
"mais vous ne le voyez pas. les demons \n"
"l'on surement pris. \n\n"
"Vous devez trouver le prototype ,ou \n"
"tous vos combats auront ete vains. \n"
"continez a avancer, vous battre, tuer. \n"
"Oh oui ,a vivre ,aussi.";
P2TEXT =
"Meme le labyrinthe mortifere des \n"
"archi-infames ne vous arreta pas,\n"
"et vous arrivez au prototype \n"
"d' accelerateur qui est proche \n"
"desactive efficacement et pour toujours.\n"
"\n"
"Vous etes doue pour ces choses la.";
P3TEXT =
"Vous vous etes fraye votre chemin a \n"
"travers le coeur d'une ruche de \n"
"diables. Il est temps pour une mission\n"
"de recherche et destruction visant le \n"
"guardien de la porte ,avec sa \n"
"progeniture repugnante descendant en \n"
"cascade sur terre. Oui ,il est cruel. \n"
"Mais vous savez qui est pire!\n\n"
"Sourriant malefiquement, vous verifiez \n"
"l'equipement et vous vous preparez a\n"
"faire voir a ce fumier un petit enfer\n"
"fait de votre propre main!";
P4TEXT =
"La face malefique du gardien de la porte \n"
"est eparpillee aux alentours. Comme son \n"
"corps en lambeaux vacille ,un portail \n"
"inverse se forme et aspire les eclat du \n"
"dernier prototype d'accelerateur, sans \n"
"parler des quelques demons restants.\n"
"Vous avez termine. L'enfer a fini de\n"
"liberer des mort-vivants au lieu de \n"
"gens bien vivants.\n"
"Souvenez vous de dire a vos enfants de\n"
"mettre un lance-roquette dans votre\n"
"cercueil. Si vous allez en enfer,\n"
"quand vous serez mort, vous en aurez \n"
"besoin ,pour un nettoyage definitif...";
P5TEXT =
"Vous avez trouver notre second niveau\n"
"le plus difficile que nous avons.\n"
"J'espere que vous avez sauvegarde\n"
"au deux precendants.\n"
"Sinon, soyez prets a mourrir souvent.\n"
"Pour maitre marine seulement.";
P6TEXT =
"peut etre, vous demandiez vous quel\n"
"ETAIT le niveau le plus dure, que nous\n"
"avions prepare pour vous? Maintenant,\n"
"vous savez. Nul n'en sortira vivant.\n"
T1TEXT =
"Vous vous etes fraye un chemin vers la\n"
"sortie des labos experimentaux infestes.\n"
"Il semble que l'UAC les a encore vides. \n"
"Avec leur chiffres d'affaires eleve,\n"
"ca doit etre dur pour la pauvre vieille\n"
"UAC d' acheter des societes \n"
"d'assurance vie ,de nos jours...\n"
"\n"
"Vous avez devant vous le complexe \n"
"militaire ,cela grouille d'horreurs \n"
"morbides pres a vous enfoncer leur dents.\n"
"Avec un peu de chance ,le complexe a \n"
"encore quelques munitions de guerre,\n"
"reposant autour.";
T2TEXT =
"Vous entendez le grincement d'une grosse\n"
"machinerie devant.Vous esperez surement\n"
"qu'ils ne sont pas en train de fabriquer\n"
"de nouvelles creatures de l'enfer,\n"
"mais vous etes pret a balayer tout\n"
"un troupeau si vous le deviez.\n"
"Ils pourraient etre en train de preparer\n"
"un festin de sang ,mais vous vous sentez\n"
"pareil a deux milliers de fous dans le \n"
"corps d'un seul et meme tueur\n"
"\n"
"Vous ne pensez pas tomber si facilement.";
T3TEXT =
"La vue s'ouvrant devant vous semble \n"
"sacrement ,diablement ,familiere.\n"
"Les odeurs familieres, trop -- comme\n"
"des excrements frits. Vous n'aimiez \n"
"pas cet endroit avant, et vous etes \n"
"terriblement sur de ne pas envisager\n"
"l'aimer maintenant.\n"
"Plus vous pensiez a cette idee ,\n"
"plus vous sombriez dans la folie.\n"
"Saisissant votre arme ,un sourrire\n"
"malefique apparait sur votre visage.\n"
"Il est temps de prendre quelques noms.";
T4TEXT =
"Tout a coup, tout est silencieux ,\n"
"d'un horizon a l'autre.\n"
"L'echo agonisant de l'enfer s'estompe,\n"
"le ciel cauchemardeque tourne au bleu,\n"
"les tas de cadavres de monstres \n"
"commencent a s'evaporer avec une puanteur\n"
"nauseabonde qui remplissait l'air.\n"
"Doux jesus ,peut etre l'avez vous fait.\n"
"Avez vous reellement gagne?\n\n"
"quelque chose gronde au loin.\n"
"une lumiere bleue a commence a luire\n"
"dans le crane defonce du demon\n"
"cracheur.";
T5TEXT =
"Maintenant quoi? Cela semble \n"
"completement different.\n"
"Une Sorte de lottissement du\n"
"roi Tut.\n"
"Bon, rien ne peut-etre pire\n"
"que d'habitude. N'est-ce pas?\n"
"Ou peut etre est ce mieux\n"
"de laisser dormir les dieux,\n"
"la ou ils reposent\n"
T6TEXT =
"Vous avez besoin de vacances.\n"
"Vous avez eclates les entrailles\n"
"de l'enfer et pour sur vous etes \n"
"pres pour une pause.\n"
"Vous marmonner a vous meme:\n"
"peut-etre quelqu'un pourrait botter\n"
"le cul de l'enfer a votre place,\n"
"la prochaine fois.\n"
"Une ville tranquille reside devant, \n"
"avec le flot paisible de l'eau,\n"
"les batiments pittoresques, et\n"
"probablement plus de creatures\n"
"de l'enfer.\n"
"Quand vous descendez au dehors du \n"
"transport, vous entendez le bruit \n"
"du sabot d'acier d'un \n"
"demon-cybernetique.";
// //
// Character cast strings F_FINALE.C // Character cast strings F_FINALE.C
// //
@ -374,3 +644,668 @@ CC_ARCH = "ARCHI-INFAME";
CC_SPIDER = "L'ARAIGNEE CERVEAU"; CC_SPIDER = "L'ARAIGNEE CERVEAU";
CC_CYBER = "LE CYBERDEMON"; CC_CYBER = "LE CYBERDEMON";
CC_HERO = "NOTRE HEROS"; CC_HERO = "NOTRE HEROS";
// New strings from BOOM
PD_BLUEC = "Vous avez besoin d une carte bleu pour ouvrir cette porte";
PD_REDC = "Vous avez besoin d une carte rouge pour ouvrir cette porte";
PD_YELLOWC = "Vous avez besoin d une carte jaune pour ouvrir cette porte";
PD_BLUES = "Vous avez besoin d un crane bleu pour ouvrir cette porte";
PD_REDS = "Vous avez besoin d un crane rouge pour ouvrir cette porte";
PD_YELLOWS = "Vous avez besoin d un crane jaune pour ouvrir cette porte";
PD_ANY = "toute cle ouvrira cette porte";
PD_ANYOBJ = "toute cle activera cet objet";
PD_ALL3 = "Vous avez besoin des trois cle pour ouvrir cette porte";
PD_ALL3O = "Vous avez besoin des trois cle pour activer cet objet";
PD_ALL6 = "Vous avez besoin des six clef pour ouvrir cette porte";
PD_ALL6O = "Vous avez besoin des six clef pour activer cet objet";
PD_ALLKEYS = "Vous avez besoin de toutes les clef";
// Gameflow messages
TXT_FRAGLIMIT = "limite de frag atteinte.";
TXT_TIMELIMIT = "limite de temps atteinte.";
// Spree messages
SPREEKILLSELF = "%o etait en folie meurtriere avant que %g ne (le/la) frag!";
SPREEOVER = "La folie meurtrière %o a ete termine par %k";
SPREE5 = "%k est dans une folie meurtrière!";
SPREE10 = "%k se dechaine!";
SPREE15 = "%k domine!";
SPREE20 = "%k est inarretable!";
SPREE25 = "%k est comme un dieu!";
// Mulitkill messages
MULTI2 = "Double meurtre!";
MULTI3 = "Multi meurtre!";
MULTI4 = "Ultra meurtre!";
MULTI5 = "Meurtre monstre!";
// Obituary strings
// First the self-kills, then the other-kills
OB_SUICIDE = "%o se suicide.";
OB_FALLING = "%o est tombe trop bas.";
OB_CRUSH = "%o a ete ecrase.";
OB_EXIT = "%o a essaye de quitter.";
OB_WATER = "%o ne peut pas nager.";
OB_SLIME = "%o a mute.";
OB_LAVA = "%o a brule.";
OB_BARREL = "%o a fait boom.";
OB_SPLASH = "%o est reste au mauvais endroit.";
OB_R_SPLASH = "%o aurait du guarder ses distances.";
OB_ROCKET = "%o aurait du guarder ses distances.";
OB_KILLEDSELF = "%o se tua (lui/elle)meme.";
OB_STEALTHBABY = "%o cru voir un arachnotron.";
OB_STEALTHVILE = "%o cru voir un archi-infame.";
OB_STEALTHBARON = "%o cru voir un baron de l'enfer.";
OB_STEALTHCACO = "%o cru voir un cacodemon.";
OB_STEALTHCHAINGUY = "%o cru voir un mitrailleur.";
OB_STEALTHDEMON = "%o cru voir un demon.";
OB_STEALTHKNIGHT = "%o cru voir un chevalier de l'enfer.";
OB_STEALTHIMP = "%o cru voir un lutin.";
OB_STEALTHFATSO = "%o cru voir un mancubus.";
OB_STEALTHUNDEAD = "%o cru voir un revenant.";
OB_STEALTHSHOTGUY = "%o cru voir un type au fusil.";
OB_STEALTHZOMBIE = "%o cru voir un zombie.";
OB_UNDEADHIT = "%o a ete cogne par un revenant.";
OB_IMPHIT = "%o a ete lacere par un imp.";
OB_CACOHIT = "%o s'est approche trop pres d'un cacodemon.";
OB_DEMONHIT = "%o a ete mordu par un demon.";
OB_SPECTREHIT = "%o a ete mange par un spectre.";
OB_BARONHIT = "%o a ete dechire par un baron de l'enfer.";
OB_KNIGHTHIT = "%o a ete etrippe par un un chevalier de l'enfer.";
OB_ZOMBIE = "%o a ete tue par un zombie.";
OB_SHOTGUY = "%o a ete tire par un type au fusil.";
OB_VILE = "%o a ete incinere par un archvile.";
OB_UNDEAD = "%o n'aurais pas pu esquive cette boule de feu de revenant.";
OB_FATSO = "%o s'est fait aplatir par un mancubus.";
OB_CHAINGUY = "%o a ete perfore par un mitrailleur.";
OB_SKULL = "%o a ete hante par une ame perdue.";
OB_IMP = "%o brule par un lutin.";
OB_CACO = "%o a ete terrasse par un cacodemon.";
OB_BARON = "%o a ete meurtri par un Baron de l'Enfer.";
OB_KNIGHT = "%o a ete assassine Chevalier de l'Enfer.";
OB_SPIDER = "%o est reste en admiration devant le demon arachneen.";
OB_BABY = "%o a laisse un arachnotron l'avoir.";
OB_CYBORG = "%o a ete reduie a une eclaboussure par un demon-cybernetique.";
OB_WOLFSS = "%o a rencontre un Nazi.";
OB_CHICKEN = "%o a ete picore a mort.";
OB_BEAST = "%o a ete carbonise par un dragon-garou.";
OB_CLINK = "%o a ete entaille par un dents-de-sabres.";
OB_DSPARIL1 = "%o a ete ebouillante par un serpent de D'Sparil.";
OB_DSPARIL1HIT = "%o a ete mache par un serpent de D'Sparil.";
OB_DSPARIL2 = "%o etait trop faible pour D'Sparil.";
OB_DSPARIL2HIT = "%o a ete gifle par D'Sparil.";
OB_HERETICIMP = "%o a ete effraye par une gargouille.";
OB_HERETICIMPHIT = "%o a ete mis en pieces par une gargouille.";
OB_IRONLICH = "%o a ete devaste par une sangsue de fer.";
OB_IRONLICHHIT = "%o a fait ami-ami avec sangsue de fer.";
OB_BONEKNIGHT = "%o s'est fait hache par un guerrier mort vivant.";
OB_BONEKNIGHTHIT = "%o s'est fait pourfendre par un guerrier mort vivant.";
OB_MUMMY = "%o a ete aplati par un golem.";
OB_MUMMYLEADER = "%o a ete hurle a mort par un nitrogolem.";
OB_SNAKE = "%o s est fait entrechoque par un ophidien.";
OB_WIZARD = "%o a ete maudit par un sorcier.";
OB_WIZARDHIT = "%o a ete palpe par un sorcier.";
OB_MPFIST = "%o a bouffe le poing de %k.";
OB_MPCHAINSAW = "%o a ete tondu par la tronconneuse de %k.";
OB_MPPISTOL = "%o a ete chatouille par le pistolet a eau de %k.";
OB_MPSHOTGUN = "%o a bouffe le baton a feu de %k.";
OB_MPSSHOTGUN = "%o s est fait gicle par le super fusil de %k.";
OB_MPCHAINGUN = "%o a ete fauche par la mitrailleuse de %k.";
OB_MPROCKET = "%o a chevauche la fusee de %k.";
OB_MPR_SPLASH = "%o a presque esquive la fusee de %k.";
OB_MPPLASMARIFLE = "%o a ete bruler par le fusil a plasma de %k.";
OB_MPBFG_BOOM = "%o a ete eclate en morceaux par le BFG de %k.";
OB_MPBFG_SPLASH = "%o n a pas pu se protege du BFG de %k.";
OB_MPTELEFRAG = "%o a ete telefrague par %k.";
OB_RAILGUN = "%o a ete enraille par %k.";
// Same as OB_MPTELEFRAG, but shown when a monster telefrags you
OB_MONTELEFRAG = "%o a ete telefrague.";
OB_DEFAULT = "%o est mort.";
OB_FRIENDLY1 = "%k a terrasser un de ses equipies.";
OB_FRIENDLY2 = "%k verifie ses lunetttes.";
OB_FRIENDLY3 = "%k a obtenu un frag pour l'autre equipe.";
OB_FRIENDLY4 = "%k a perdu un autre ami.";
SAVEGAMENAME = "zdoomsv";
STARTUP1 = "";
STARTUP2 = "";
STARTUP3 = "";
STARTUP4 = "";
STARTUP5 = "";
// Heretic strings
HE1TEXT =
"avec la destruction des sangsues\n"
"de fer et leur seides, les derniers\n"
"des mort-vivants furent nettoye de\n"
"cette face de l'existence.\n\n"
"ces creatures durent venir de \n"
"quelquepart, bien que,vous eutes le\n"
"soupcon sournois que l ardent\n"
"portail de l'enfer put conduire\n"
"dans leur dimension.\n\n"
"pour etre sur que beaucoup de\n"
"mort-vivants ou pire ne viennent\n"
"par son biais, vous dutes scelle le\n"
"portail de l enfer de l'autre cote.\n"
"bien sur cela veut dire que vous\n"
"eutes pu rester coince dans un monde\n"
"tres hostile, mais personne n'a\n"
"jamais dis qu'etre un heretic eut\n"
"ete facile!";
HE2TEXT =
"les puissants massotaures eurent \n"
"prouve ne pas vous correspondre,\n"
"et leurs cadavres vaporeux glissant sur\n"
"le sol, vous sentites l effroyable\n"
"satisfaction qu ils furent\n"
"detruit.\n\n"
"les passerelles qu'ils garderent\n"
"furent ouvertes, revelant ce que vous\n"
"esperates etre le chemin du retour.\n"
"mais au fur et a mesure que vous \n"
"avancates ,un rire moqueur sonna a\n"
"vos oreilles.\n\n"
"etait ce quelqu'autre force controlant\n"
"les massotaures? eusse t'elles pu etre\n"
"plus atroces les creatures dans\n"
"cette porte? le balayage d'un dome\n"
"de crystal\n"
"depasse ou le ciel aurait du etre\n"
"ce ne fut pas de bon augure....";
HE3TEXT =
"la mort de d'sparil a liberes\n"
"les liens magiques liant\n"
"les creatures de cette face,\n"
"leurs cri en mourrant surpasserent\n"
"ses propres cris d agonie.\n\n"
"votre serment de vengeance rempli,\n"
"vous entrate dans le portail pour\n"
"votre monde, moments insignifiants\n"
"avant que la coupole ne volasse en \neclats.\n"
"mais si le pouvoir de d'sparil\n"
"fut rompu a jamais, pourquoi ne pas\n"
"ne pas vous sentir en securite?\n"
"fut ce son dernier cri\n"
"celui qui resonna comme une\n"
"malediction? une invoquation? vous\n"
"ne putes en etre sur vraiment, mais\n"
"il s'eut put n'etre qu un cri.\n\n"
"puis de nouveau, que devenirent\n"
"les autres serpents coureurs?";
HE4TEXT =
"vous crutes pouvoir retourner dans\n"
"votre monde apres que d'sparil\n"
"trepassa , mais son acte\n"
"final fut de vous bannir dans sa\n"
"propre dimension. ici vous entrates\n"
" dans des restes effondres de terres\n"
"conquisent par d'sparil. vous eutes\n"
"le dernier gardien de ces terres,\n"
"mais a ce moment vous vous tenites\n"
"devant le bastion de d'sparil."
"jusqua ce moment vous n' eutes \n"
"aucun doute sur votre capacite\n"
"d affronter tout ce que vous pouviez\n"
"rencontrer,mais derriere ce portail\n"
"git le coeur profond du mal\n"
"qui envahit votre monde. d'sparil\n"
"eut pu etre mort,mais le puit ou\n"
"il fut ne demeura. maintenant vous\n"
"dutes entrer dans ce puit dans l'espoir\n"
"de trouver une sortie.et quelque part,\n"
"dans la plus sombre partie du\n"
"royaume de d'sparil,\n"
"sa garde personnelle attendit votre\n"
"arrivee ...";
HE5TEXT =
"des que le massotaure final eu mugit\n"
"son agonie mortelle, vous realisates que\n"
"vous n'eutes jamais ete aussi proche de\n"
"votre propre destruction.meme le \n"
"combat contre d'sparil et ses\n"
"disciples n'eut ete a ce point \n"
"desespere. souriant, quand vous \n"
"regardates fixement le portail s'ouvrir \n"
"devant vous ,vous demandant s'il menait \n"
"chez vous,ou si il ouvrait sur une\n"
"innimaginable horreur. vous vous \n"
"demandates si vous eutes la force d'y aller,\n"
"si rien d'autre que souffrance\n"
"et mort vous eurent attendu.\n"
"mais que putes vous faire d'autre, si\n"
"la volonte de vous battre s'eut enfuie?\n"
"putes vous,vous meme vous forcer a \n"
"continuer face a un tel desespoir? \n"
"eutes vous le courage? vous trouvates,\n"
"a la fin ,ce ne fut pas dans votre nature\n"
"de vous rendre sans un combat. les yeux\n"
"larges ,vous partates rencontrer votre\n"
"destinee.";
// EPISODE 1 - LA CITE DES DAMNES
HHUSTR_E1M1 = "LES DOCKS";
HHUSTR_E1M2 = "LE DONGEON";
HHUSTR_E1M3 = "LA MAISON DU GARDIEN";
HHUSTR_E1M4 = "LA TOUR DE GUARDE";
HHUSTR_E1M5 = "LA CITADEL";
HHUSTR_E1M6 = "LA CATHEDRAL";
HHUSTR_E1M7 = "LA CRYPTE";
HHUSTR_E1M8 = "LA BOUCHE DE L ENFER";
HHUSTR_E1M9 = "LE CIMETIERE";
// EPISODE 2 - LA BOUCHE DE L ENFER
HHUSTR_E2M1 = "LE CRATERE";
HHUSTR_E2M2 = "LES PUITS DE LAVE";
HHUSTR_E2M3 = "LA RIVIERE DE FEU";
HHUSTR_E2M4 = "LA GROTTE DE GLACE";
HHUSTR_E2M5 = "LES CATACOMBES";
HHUSTR_E2M6 = "LE LABYRINTHE";
HHUSTR_E2M7 = "LA GRANDE PIECE";
HHUSTR_E2M8 = "LE PORTAIL DU CHAOS";
HHUSTR_E2M9 = "LE GLACIER";
// EPISODE 3 - LE DOME DE D'SPARIL
HHUSTR_E3M1 = "L' ENTREPOT";
HHUSTR_E3M2 = "LA FOSSE D AISANCES";
HHUSTR_E3M3 = "LA CONFLUENCE";
HHUSTR_E3M4 = "LA FORTRESSE D'AZUR";
HHUSTR_E3M5 = "LE REPAIRE DES OPHIDIENS";
HHUSTR_E3M6 = "LES COULOIRS DE LA PEUR";
HHUSTR_E3M7 = "LE GOUFFRE";
HHUSTR_E3M8 = "LE DONJON DE D'SPARIL";
HHUSTR_E3M9 = "L AQUIFER";
// EPISODE 4: L'OSSUAIRE
HHUSTR_E4M1 = "LE CATAFALQUE";
HHUSTR_E4M2 = "LE FORTIN";
HHUSTR_E4M3 = "LE DEAMBULATOIRE";
HHUSTR_E4M4 = "LE SEPULCHRE";
HHUSTR_E4M5 = "LE GRAND ESCALIER";
HHUSTR_E4M6 = "LE COULOIR DE L APOSTAT";
HHUSTR_E4M7 = "LES RAMPARTS DE LA PERDITION";
HHUSTR_E4M8 = "LE PONT EFFONDRE";
HHUSTR_E4M9 = "LE MAUSOLE";
// EPISODE 5: LE DOMAINE STAGNANT
HHUSTR_E5M1 = "LES FALAISES OCHRE ";
HHUSTR_E5M2 = "LES RAPIDES";
HHUSTR_E5M3 = "LE QUAI";
HHUSTR_E5M4 = "LA COUR";
HHUSTR_E5M5 = "L HYDRATYR";
HHUSTR_E5M6 = "LA COLONNADE";
HHUSTR_E5M7 = "LE PRESBYTERE FETIDE";
HHUSTR_E5M8 = "LE CHAMPS DU JUGEMENT";
HHUSTR_E5M9 = "L ECHEVAUX DE D'SPARIL";
// Keys
TXT_GOTBLUEKEY = "CLE BLEUE";
TXT_GOTYELLOWKEY = "CLE JAUNE";
TXT_GOTGREENKEY = "CLE ROUGE";
// Artifacts
TXT_ARTIHEALTH = "FLACON DE QUARTZ";
TXT_ARTIFLY = "LES AILES DU COURROUX";
TXT_ARTIINVULNERABILITY = "L'ANNEAU D'INVINCIBILITE";
TXT_ARTITOMEOFPOWER = "TOME DU POUVOIR";
TXT_ARTIINVISIBILITY = "SPHERE D'OMBRE";
TXT_ARTIEGG = "OVULE TRANSFORME";
TXT_ARTISUPERHEALTH = "URNE MYSTIQUE";
TXT_ARTITORCH = "LA TORCHE";
TXT_ARTIFIREBOMB = "BOMBE A RETARDEMENT DES ANCIENTS";
TXT_ARTITELEPORT = "L' USTENSIL DU CHAOS";
// Items
TXT_ITEMHEALTH = "CRYSTAL VIAL";
TXT_ITEMBAGOFHOLDING = "SAC DE PRISES";
TXT_ITEMSHIELD1 = "BOUCLIER D'ARGENT";
TXT_ITEMSHIELD2 = "BOUCLIER ENCHANTE";
TXT_ITEMSUPERMAP = "CARTE EN ROULEAU DEPLIANT";
// Ammo
TXT_AMMOGOLDWAND1 = "SCEPTRE DE CRYSTAL";
TXT_AMMOGOLDWAND2 = "GEODE DE CRYSTAL";
TXT_AMMOMACE1 = "SPHERES DE MASSE";
TXT_AMMOMACE2 = "PILE DE SPHERES DE MASSE";
TXT_AMMOCROSSBOW1 = "FLECHES AERIENNNES";
TXT_AMMOCROSSBOW2 = "CARQUOIS DE FLECHES AERIENNNES";
TXT_AMMOBLASTER1 = "ORB DE GRIFFE";
TXT_AMMOBLASTER2 = "ORB DE L'ENERGIE";
TXT_AMMOSKULLROD1 = "RUNES MINEURES";
TXT_AMMOSKULLROD2 = "RUNES SUPERIEURES";
TXT_AMMOPHOENIXROD1 = "ORB DE FLAMES";
TXT_AMMOPHOENIXROD2 = "ORB DE L'ENFER";
// Weapons
TXT_WPNMACE = "MASSE DE FEU";
TXT_WPNCROSSBOW = "ARBALETE AERIENNE";
TXT_WPNBLASTER = "GRIFFE DU DRAGON";
TXT_WPNSKULLROD = "LE BATON DE L'ENFER";
TXT_WPNPHOENIXROD = "LE BATON DU PHOENIX";
TXT_WPNGAUNTLETS = "LES GANTELETS DU NECROMANCIER";
TXT_NEEDBLUEKEY = "CETTE PORTE NESCESSITE UNE CLE BLEU POUR S'OUVRIR";
TXT_NEEDGREENKEY = "CETTE PORTE NESCESSITE UNE CLE VERTE POUR S'OUVRIR";
TXT_NEEDYELLOWKEY = "CETTE PORTE NESCESSITE UNE CLE JAUNE POUR S'OUVRIR";
TXT_CHEATPOWERON = "ENERGIE ACTIVEE";
TXT_CHEATPOWEROFF = "ENERGIE DESACTIVEE";
TXT_CHEATHEALTH = "PLEINE SANTE";
TXT_CHEATKEYS = "TOUTES LES CLES";
TXT_CHEATSOUNDON = "DEBOGUAGE DU SON ACTIVE";
TXT_CHEATSOUNDOFF = "DEBOGUAGE DU SON DESACTIVE";
TXT_CHEATIDDQD = "TU ESSAIE DE TRICHER, HEIN? MAINTENANT TU CREVE!";
TXT_CHEATIDKFA = "TRICHEUR - TU NE MERITE PAS D'ARMES";
TXT_CHEATTICKERON = "HORLOGE ALUMMEE";
TXT_CHEATTICKEROFF = "HORLOGE ETEINTE";
TXT_CHEATARTIFACTS3 = "VOUS L'AVEZ";
RAVENQUITMSG = "ETES VOUS SUR DE VOULOIR QUITTER?";
// Hexen strings
// Mana
TXT_MANA_1 = "MANA BLEUE";
TXT_MANA_2 = "MANA VERTE";
TXT_MANA_BOTH = "MANA COMBINEE";
// Keys
TXT_KEY_STEEL = "CLE D'ACIER";
TXT_KEY_CAVE = "CLE DE LA CAVE";
TXT_KEY_AXE = "CLE DE LA HACHE";
TXT_KEY_FIRE = "CLE DU FEU";
TXT_KEY_EMERALD = "CLE D'EMERAUDE";
TXT_KEY_DUNGEON = "CLE DU DONGEON";
TXT_KEY_SILVER = "CLE D'ARGENT";
TXT_KEY_RUSTED = "CLE ROUILLEE";
TXT_KEY_HORN = "CLE CORNE";
TXT_KEY_SWAMP = "CLE DES MARECAGES";
TXT_KEY_CASTLE = "CLE DU CHATEAU";
TXT_NEED_KEY_STEEL = "Vous avez besoin de la CLE D'ACIER";
TXT_NEED_KEY_CAVE = "Vous avez besoin de la CLE DE LA CAVE";
TXT_NEED_KEY_AXE = "Vous avez besoin de la CLE DE LA HACHE";
TXT_NEED_KEY_FIRE = "Vous avez besoin de la CLE DU FEU";
TXT_NEED_KEY_EMERALD = "Vous avez besoin de la CLE D'EMERAUDE";
TXT_NEED_KEY_DUNGEON = "Vous avez besoin de la CLE DU DONGEON";
TXT_NEED_KEY_SILVER = "Vous avez besoin de la CLE D'ARGENT";
TXT_NEED_KEY_RUSTED = "Vous avez besoin de la CLE ROUILLEE";
TXT_NEED_KEY_HORN = "Vous avez besoin de la CLE ROUILLEE";
TXT_NEED_KEY_SWAMP = "Vous avez besoin de la CLE DES MARECAGES";
TXT_NEED_KEY_CASTLE = "Vous avez besoin de la CLE DU CHATEAU";
// Artifacts
TXT_ARTIINVULNERABILITY2 = "L'ICONE DU DEFENSEUR";
TXT_ARTISUMMON = "SERVANT OBSCURE";
TXT_ARTIEGG2 = "PORKALATOR";
TXT_ARTIPOISONBAG = "FLECHETTE";
TXT_ARTITELEPORTOTHER = "L'USTENSIL DE BANISSEMENT";
TXT_ARTISPEED = "BOTTES DE VITESSE";
TXT_ARTIBOOSTMANA = "KRATER DE LA PUISSANCE";
TXT_ARTIBOOSTARMOR = "BRACELETS EN PEAU DE DRAGON";
TXT_ARTIBLASTRADIUS = "DISQUE DE REPULSION";
TXT_ARTIHEALINGRADIUS = "CADRE D' ENCHANTEMENT MYSTIQUE";
// Puzzle artifacts
TXT_ARTIPUZZSKULL = "CRANE DE YORICK";
TXT_ARTIPUZZGEMBIG = "COEUR DE D'SPARIL";
TXT_ARTIPUZZGEMRED = "PLANETE DE RUBI";
TXT_ARTIPUZZGEMGREEN1 = "PLANETE D'EMERAUDE";
TXT_ARTIPUZZGEMGREEN2 = "PLANETE D'EMERAUDE";
TXT_ARTIPUZZGEMBLUE1 = "PLANETE DE SAPPHIRE";
TXT_ARTIPUZZGEMBLUE2 = "PLANETE DE SAPPHIRE";
TXT_ARTIPUZZBOOK1 = "CODEX DEMON";
TXT_ARTIPUZZBOOK2 = "LIVRE OBSCURE";
TXT_ARTIPUZZSKULL2 = "MASQUE DE FLAMES";
TXT_ARTIPUZZFWEAPON = "LE SCEAU DE GLAIVE";
TXT_ARTIPUZZCWEAPON = "LA SAINTE RELIQUE";
TXT_ARTIPUZZMWEAPON = "SIGIL DU MAGUS";
TXT_ARTIPUZZGEAR = "ROUAGE D'HORLOGE";
TXT_USEPUZZLEFAILED = "VOUS NE POUVEZ PAS UTILISE CECI ICI";
// Items
TXT_ARMOR1 = "ARMURE DE MAILLES";
TXT_ARMOR2 = "BOUCLIER DU FAUCON";
TXT_ARMOR3 = "CASQUE DE PLATINE";
TXT_ARMOR4 = "AMULET DE L'ELOIGNEMENT";
// Weapons
TXT_WEAPON_F2 = "HACHE DE TIMON";
TXT_WEAPON_F3 = "MARTEAU DE LA VENGEANCE";
TXT_WEAPON_F4 = "QUIETUS ASSEMBLE";
TXT_WEAPON_C2 = "SCEPTRE DU SERPENT";
TXT_WEAPON_C3 = "TEMPETE DE FEU";
TXT_WEAPON_C4 = "BATON DU COURROUX ASSEMBLE";
TXT_WEAPON_M2 = "BRISURES GELEE";
TXT_WEAPON_M3 = "ARC DE LA MORT";
TXT_WEAPON_M4 = "FLEAUT SANGLANT ASSEMBLE";
TXT_WEAPONPIECE = "Une piece d'arme! C'est votre jour de chance!";
TXT_QUIETUS_PIECE = "SEGMENT DU QUIETUS";
TXT_WRAITHVERGE_PIECE = "SEGMENT DU BATON DU COURROUX";
TXT_BLOODSCOURGE_PIECE = "SEGMENT DU FLEAUT SANGLANT";
// Strife locks
TXT_NEEDKEY = "Vous n'avez pas la cle.";
TXT_NEED_PASSCARD = "Vous avez besoin de la carte passe.";
TXT_NEED_PASSCARD_DOOR = "Vous avez besoin de la cle carte passe pour ouvrir cette porte.";
TXT_NEED_IDCARD = "Vous avez besoin d'une carte ID.";
TXT_NEED_PRISONKEY = "Vous n'avez pas la cle de la prison.";
TXT_NEED_HANDPRINT = "Votre main ne s'imprime pas sur le dossier.";
TXT_NEED_GOLDKEY = "Vous avez besoin d'une clé d'or.";
TXT_NEED_IDBADGE = "Vous avez besoin d'un badge ID.";
TXT_NEED_IDBADGE_DOOR = "Vous avez besoin d'un badge ID pour ouvrir cette porte.";
TXT_NEED_SILVERKEY = "Vous avez besoin de la cle d'argent.";
TXT_NEED_BRASSKEY = "Vous avez besoin de la cle de laiton.";
TXT_NEED_REDCRYSTAL = "Vous avez besoin du crystal rouge.";
TXT_NEED_BLUECRYSTAL = "Vous avez besoin du crystal bleu.";
// Strife Quest messages
TXT_QUEST_14 = "Vous avez explose le crystal";
TXT_QUEST_16 = "Vous avez explose les portes";
TXT_QUEST_27 = "Vous avez explose l'ordinateur";
TXT_KILLED_BISHOP = "Vous avez tue l'eveque!";
TXT_KILLED_ORACLE = "Vous avez tue l'oracle!";
TXT_KILLED_MACIL = "Vous avez tue Macil!";
TXT_KILLED_LOREMASTER = "Vous avez tue le Maitre des tradition!";
// Strife pickup messages
TXT_METALARMOR = "Vous avez pris l'armure de metal.";
TXT_LEATHERARMOR = "Vous avez pris l'armure de cuir.";
TXT_MEDPATCH = "Vous avez pris le bandeau medical.";
TXT_MEDICALKIT = "Vous avez pris la trousse medical.";
TXT_SURGERYKIT = "Vous avez pris la trousse de chirurgie.";
TXT_STRIFEMAP = "Vous avez pris la carte";
TXT_BELDINSRING = "Vous avez pris l'anneau.";
TXT_OFFERINGCHALICE = "Vous avez pris le Calice d'obole.";
TXT_EAR = "Vous avez pris l'oreille.";
TXT_BROKENCOUPLING = "Vous avez pris la connexion coupee d'energie.";
TXT_SHADOWARMOR = "Vous avez pris l'armure d'ombre.";
TXT_ENVSUIT = "Vous avez pris la combinaison Environmentale.";
TXT_GUARDUNIFORM = "Vous avez pris l'Uniforme du guarde.";
TXT_OFFICERSUNIFORM = "Vous avez pris l'Uniforme de l' officier.";
TXT_FTHROWERPARTS = "Vous avez pris les pieces du lance-flames.";
TXT_REPORT = "Vous avez pris le compte-rendu.";
TXT_INFO = "Vous avez pris l'info.";
TXT_TARGETER = "Vous avez pris le cibleur.";
TXT_COMMUNICATOR = "Vous avez pris le Communicateur";
TXT_COIN = "Vous avez pris la piece.";
TXT_XGOLD = "Vous avez pris l'or de %d.";
TXT_BEACON = "Vous avez pris la balise de Teletransporteur.";
TXT_DEGNINORE = "Vous avez pris le minerai de Degnin.";
TXT_SCANNER = "Vous avez pris l'analyseur.";
TXT_NEEDMAP = "L' analyseur ne marchera pas sans une carte!\n";
TXT_PRISONPASS = "Vous avez pris le pass de la prison.";
TXT_STRIFECROSSBOW = "Vous avez pris l'arbalete";
TXT_ASSAULTGUN = "Vous avez pris le fusil d'assaut";
TXT_MMLAUNCHER = "Vous avez pris le mini lance-missile";
TXT_FLAMER = "Vous avez pris le lance-flames";
TXT_MAULER = "Vous avez pris le molesteur";
TXT_GLAUNCHER = "Vous avez pris le lance-grenade";
TXT_SIGIL = "Vous avez pris le SIGIL.";
TXT_BASEKEY = "Vous avez pris la cle Base.";
TXT_GOVSKEY = "Vous avez pris la cle Govs.";
TXT_PASSCARD = "Vous avez pris la carte-pass.";
TXT_IDBADGE = "Vous avez pris le Badge ID.";
TXT_PRISONKEY = "Vous avez pris la cle de la Prison.";
TXT_SEVEREDHAND = "Vous avez pris la main coupee.";
TXT_POWER1KEY = "Vous avez pris la cle Power1 .";
TXT_POWER2KEY = "Vous avez pris la cle Power2.";
TXT_POWER3KEY = "Vous avez pris la cle Power3.";
TXT_GOLDKEY = "Vous avez pris la cle d'or.";
TXT_IDCARD = "Vous avez pris la Carte ID .";
TXT_SILVERKEY = "Vous avez pris la cle d'argent.";
TXT_ORACLEKEY = "Vous avez pris la cle Oracle.";
TXT_MILITARYID = "Vous avez pris l'ID Militaire.";
TXT_ORDERKEY = "Vous avez pris la cle de l'Ordre.";
TXT_WAREHOUSEKEY = "Vous avez pris la cle de l'entrepot.";
TXT_BRASSKEY = "Vous avez pris la cle de bronze.";
TXT_REDCRYSTAL = "Vous avez pris la cle crystal rouge.";
TXT_BLUECRYSTAL = "Vous avez pris la cle crystal bleu.";
TXT_CHAPELKEY = "Vous avez pris la cle de la chapel.";
TXT_CATACOMBKEY = "Vous avez pris la cle des Catacombes.";
TXT_SECURITYKEY = "Vous avez pris la cle de la Securite.";
TXT_COREKEY = "Vous avez pris la cle Core.";
TXT_MAULERKEY = "Vous avez pris la cle du broyeur.";
TXT_FACTORYKEY = "Vous avez pris la cle de l'usine.";
TXT_MINEKEY = "Vous avez pris la cle de la mine.";
TXT_NEWKEY5 = "Vous avez pris la nouvelle cle 5.";
TXT_ORACLEPASS = "Vous avez pris le passe de l'Oracle.";
TXT_HEGRENADES = "Vous avez pris les HE-Grenades.";
TXT_PHGRENADES = "Vous avez pris les Phoshorus-Grenades.";
TXT_CLIPOFBULLETS = "Vous avez pris les chargeurs de balles.";
TXT_BOXOFBULLETS = "Vous avez pris la boite de balles.";
TXT_MINIMISSILES = "Vous avez pris les mini missiles.";
TXT_CRATEOFMISSILES = "Vous avez pris la caisse de missiles.";
TXT_ENERGYPOD = "Vous avez pris la gousse d'energie.";
TXT_ENERGYPACK = "Vous avez pris le paquet d'energie.";
TXT_POISONBOLTS = "Vous avez pris le carreau empoisone.";
TXT_ELECTRICBOLTS = "Vous avez pris le carreau electrique.";
TXT_AMMOSATCHEL = "Vous avez pris le sachet de munitions";
// Random dialogs
TXT_RANDOM_PEASANT_01 = "S'il vous plait ne me blessez pas.";
TXT_RANDOM_PEASANT_02 = "Si vous cherchez a me blesse, Je n' en merite pas l'effort.";
TXT_RANDOM_PEASANT_03 = "Je ne sais rien.";
TXT_RANDOM_PEASANT_04 = "Allez vous en ou j'appel les guardes!";
TXT_RANDOM_PEASANT_05 = "Je voudrais quelque fois que ces rebelles apprennent quelle est leur place et stoppent ce non-sens.";
TXT_RANDOM_PEASANT_06 = "Laisse moi seul, OK?";
TXT_RANDOM_PEASANT_07 = "Je ne suis pas sur , mais quelque fois je pense connaitre certains des acolytes.";
TXT_RANDOM_PEASANT_08 = "L' ordre maintient tout ferme aux alentours.";
TXT_RANDOM_PEASANT_09 = "Ce n'est pas possible que ce ne sois juste q'une force de securite.";
TXT_RANDOM_PEASANT_10 = "J'ai entendu que l' ordre etait tres nerveux a cause des action du front aux alentours.";
TXT_RANDOM_REBEL_01 = "Ce n'est pas possible l'ordre se dressera contre nous.";
TXT_RANDOM_REBEL_02 = "Nous sommes presque pret a frappe. Les plans de Macil echouront.";
TXT_RANDOM_REBEL_03 = "Nous sommes tous derriere vous, ne vous inquiete pas.";
TXT_RANDOM_REBEL_04 = "Ne vous approche pas trop de ces robots. Ils vous brulerons pour un rien!";
TXT_RANDOM_REBEL_05 = "Le jour de gloire arrivera bientot, et ceux qui s'opposeront a nous seront ecrases!";
TXT_RANDOM_REBEL_06 = "Ne vous reposez pas. Du travail nous attend encore.";
TXT_RANDOM_REBEL_07 = "Macil dis que tu es le nouvel espoir. Garde ca a l'esprit.";
TXT_RANDOM_REBEL_08 = "Une fois que nous auront fait chuter ces charlatans, Nous seront capable de rebatir le monde tel qu'il devrait etre.";
TXT_RANDOM_REBEL_09 = "Souvient toi tu ne te bas pas seulement pour toi meme, mais pour tous le monde ici et dehors.";
TXT_RANDOM_REBEL_10 = "Aussi longtemps qu'un de nous est debout, nous vaincront.";
TXT_RANDOM_AGUARD_01 = "Bouge de la, paysan.";
TXT_RANDOM_AGUARD_02 = "Suis la vrai foie , seulement la tu commencera a comprendre.";
TXT_RANDOM_AGUARD_03 = "C'est seulement a travers la mort que quelqu'un peut renaitre.";
TXT_RANDOM_AGUARD_04 = "Je ne suis pas interesse par tes betises inutiles.";
TXT_RANDOM_AGUARD_05 = "si j'avais voulu te parler je te l'aurais dis.";
TXT_RANDOM_AGUARD_06 = "Va ennuyer quelqu'un d'autre!";
TXT_RANDOM_AGUARD_07 = "Bouge!";
TXT_RANDOM_AGUARD_08 = "Si l'alarme s'eteind, reste en dehors de notre chemin!";
TXT_RANDOM_AGUARD_09 = "L'ordre nettoira le monde et le conduira dans une nouvelle ere.";
TXT_RANDOM_AGUARD_10 = "Un probleme? Je pense que non.";
TXT_RANDOM_BEGGAR_01 = "L'aumone pour les pauvres?";
TXT_RANDOM_BEGGAR_02 = "Qui regarde tu, surfacer?";
TXT_RANDOM_BEGGAR_03 = "Aurai tu de la nourriture en trop sur toi, n'aurais tu pas?";
TXT_RANDOM_BEGGAR_04 = "Vous les gens de la surface vous ne comprendrez jamais.";
TXT_RANDOM_BEGGAR_05 = "Ha, les guarde ne nous trouve pas, ces idiot ne savent meme pas que l'ont existent.";
TXT_RANDOM_BEGGAR_06 = "Un jour a part les membres de l'ordre sera force de nous rejoidre.";
TXT_RANDOM_BEGGAR_07 = "Reste immobile maintenant, mais tu sais que cela sera un jour pour toi aussi.";
TXT_RANDOM_BEGGAR_08 = "Ils n'y pas plus ennuyant qu'un surfacer et son comportement!";
TXT_RANDOM_BEGGAR_09 = "L'ordre n'en aura pas pour longtemps de votre front.";
TXT_RANDOM_BEGGAR_10 = "Prend guarde a toi, surfacer. Nous connaisont nos ennemis!";
TXT_RANDOM_PGUARD_01 = "Nous sommes les main du destin. Apprendre notre colere est de trouve l'oubli!";
TXT_RANDOM_PGUARD_02 = "L'ordre nettoira le monde des faibles et corrompus!";
TXT_RANDOM_PGUARD_03 = "Obei aux ordres du maitre!";
TXT_RANDOM_PGUARD_04 = "longue vies aux frere de l'ordre!";
TXT_RANDOM_PGUARD_05 = "La liberte est l'illusion qui aveugle les faible d'esprit.";
TXT_RANDOM_PGUARD_06 = "le pouvoir est le chemin de la gloire. Suivre l'ordre c'est suivre ce chemin!";
TXT_RANDOM_PGUARD_07 = "Prend ta place parmi les justes, rejoin nous!";
TXT_RANDOM_PGUARD_08 = "L'ordre protege les siens.";
TXT_RANDOM_PGUARD_09 = "Les Acolytes? Ils ont deja vus la pleine gloire de l'ordre.";
TXT_RANDOM_PGUARD_10 = "Si il y a une once de gloire dans ce corps pathetique, Tu entrera dans les armes de l'ordre.";
TXT_RANDOMGOODBYE_1 = "Au revoir!";
TXT_RANDOMGOODBYE_2 = "Merci, au revoir!";
TXT_RANDOMGOODBYE_3 = "A plus tard!";
// Bloodbath announcer
BBA_BONED = "%k desossa %o comme un poisson";
BBA_CASTRA = "%k castra %o";
BBA_CREAMED = "%k a battu a plate couture %o";
BBA_DECIMAT = "%k a decime %o";
BBA_DESTRO = "%k a detruit %o";
BBA_DICED = "%k a coupe en des %o";
BBA_DISEMBO = "%k a etripe %o";
BBA_FLATTE = "%k a aplatit %o";
BBA_JUSTICE = "%k a rendu une justice anal a %o";
BBA_MADNESS = "%k a fait une folie ANAL a %o";
BBA_KILLED = "%k a tue %o";
BBA_MINCMEAT = "%k a fait de la viande hachee de %o";
BBA_MASSACR = "%k a massacre %o";
BBA_MUTILA = "%k a mutile %o";
BBA_REAMED = "%k a decoupe en fines lamelles %o";
BBA_RIPPED = "%k a ouvert un nouvel orifice a %o";
BBA_SLAUGHT = "%k a massacre %o";
BBA_SMASHED = "%k a enfonce %o";
BBA_SODOMIZ = "%k y a sodomise n %o";
BBA_SPLATT = "%k a eclabousse les morceaux de %o";
BBA_SQUASH = "%k a ecrabouille %o";
BBA_THROTTL = "%k a etouffe %o";
BBA_WASTED = "%k a decharne %o";
BBA_BODYBAG = "%k a placer %o dans son linceul";
BBA_HELL = "%k a envoye en enfer %o";
BBA_TOAST = "%k a grille %o";
BBA_SNUFF = "%k a creve %o";
BBA_HOSED = "%k a arose %o";
BBA_SPRAYED = "%k a pulverise %o";
BBA_DOGMEAT = "%k a fait de la patee pour chien %o";
BBA_BEATEN = "%k a battu %o";
BBA_EXCREMENT = "%o est un excrement";
BBA_HAMBURGER = "%o est un hamburger";
BBA_SCROTUM = "%o a souffert d'une separation du scrotum";
BBA_POPULATION = "%o s'est propose pour un controle de la population";
BBA_SUICIDE = "%o s'est suicide";
BBA_DARWIN = "%o a recu la medaille Darwin";

View file

@ -558,3 +558,58 @@ Lock 51 Strife
Mapcolor 150 150 150 Mapcolor 150 150 150
} }
//
// Chex Locks
//
Lock 1 Chex
{
ChexRedCard
Message "$PD_REDC"
RemoteMessage "$PD_REDCO"
Mapcolor 255 0 0
}
Lock 2 Chex
{
ChexBlueCard
Message "$PD_BLUEC"
RemoteMessage "$PD_BLUECO"
Mapcolor 0 0 255
}
Lock 3 Chex
{
ChexYellowCard
Message "$PD_YELLOWC"
RemoteMessage "$PD_YELLOWCO"
Mapcolor 255 255 0
}
Lock 129 Chex
{
ChexRedCard
Message "$PD_REDK"
RemoteMessage "$PD_REDO"
Mapcolor 255 0 0
}
Lock 130 Chex
{
ChexBlueCard
Message "$PD_BLUEK"
RemoteMessage "$PD_BLUEO"
Mapcolor 0 0 255
}
Lock 131 Chex
{
ChexYellowCard
Message "$PD_YELLOWK"
RemoteMessage "$PD_YELLOWO"
Mapcolor 255 255 0
}