mirror of
https://github.com/fabiangreffrath/woof.git
synced 2025-09-24 21:38:39 -04:00
add obituaries (#1198)
* add obituaries Fixes #1092 * add forgotten files * cosmetics * add Voodoo obituary * enable by default, change default color * special obituaries only for damaging slime and lava * nicer formatting * add forgotten DEH substitute for OB_VOODOO * fix constness issue * remove unnecesssary includes * remove bogus comment * ouch, add back net_client.h include
This commit is contained in:
parent
c8302ce682
commit
178493dede
@ -29,6 +29,7 @@ set(WOOF_SOURCES
|
||||
font.h
|
||||
g_game.c g_game.h
|
||||
hu_lib.c hu_lib.h
|
||||
hu_obituary.c hu_obituary.h
|
||||
hu_stuff.c hu_stuff.h
|
||||
i_3dsound.c
|
||||
i_endoom.c i_endoom.h
|
||||
|
89
src/d_deh.c
89
src/d_deh.c
@ -476,6 +476,52 @@ char* startup3 = "";
|
||||
char* startup4 = "";
|
||||
char* startup5 = "";
|
||||
|
||||
// [FG] obituaries
|
||||
|
||||
char *s_OB_CRUSH = OB_CRUSH;
|
||||
char *s_OB_SLIME = OB_SLIME;
|
||||
char *s_OB_LAVA = OB_LAVA;
|
||||
char *s_OB_KILLEDSELF = OB_KILLEDSELF;
|
||||
char *s_OB_VOODOO = OB_VOODOO;
|
||||
char *s_OB_MONTELEFRAG = OB_MONTELEFRAG;
|
||||
char *s_OB_DEFAULT = OB_DEFAULT;
|
||||
char *s_OB_MPDEFAULT = OB_MPDEFAULT;
|
||||
|
||||
char *s_OB_UNDEADHIT = OB_UNDEADHIT;
|
||||
char *s_OB_IMPHIT = OB_IMPHIT;
|
||||
char *s_OB_CACOHIT = OB_CACOHIT;
|
||||
char *s_OB_DEMONHIT = OB_DEMONHIT;
|
||||
char *s_OB_SPECTREHIT = OB_SPECTREHIT;
|
||||
char *s_OB_BARONHIT = OB_BARONHIT;
|
||||
char *s_OB_KNIGHTHIT = OB_KNIGHTHIT;
|
||||
|
||||
char *s_OB_ZOMBIE = OB_ZOMBIE;
|
||||
char *s_OB_SHOTGUY = OB_SHOTGUY;
|
||||
char *s_OB_VILE = OB_VILE;
|
||||
char *s_OB_UNDEAD = OB_UNDEAD;
|
||||
char *s_OB_FATSO = OB_FATSO;
|
||||
char *s_OB_CHAINGUY = OB_CHAINGUY;
|
||||
char *s_OB_SKULL = OB_SKULL;
|
||||
char *s_OB_IMP = OB_IMP;
|
||||
char *s_OB_CACO = OB_CACO;
|
||||
char *s_OB_BARON = OB_BARON;
|
||||
char *s_OB_KNIGHT = OB_KNIGHT;
|
||||
char *s_OB_SPIDER = OB_SPIDER;
|
||||
char *s_OB_BABY = OB_BABY;
|
||||
char *s_OB_CYBORG = OB_CYBORG;
|
||||
char *s_OB_WOLFSS = OB_WOLFSS;
|
||||
|
||||
char *s_OB_MPFIST = OB_MPFIST;
|
||||
char *s_OB_MPCHAINSAW = OB_MPCHAINSAW;
|
||||
char *s_OB_MPPISTOL = OB_MPPISTOL;
|
||||
char *s_OB_MPSHOTGUN = OB_MPSHOTGUN;
|
||||
char *s_OB_MPSSHOTGUN = OB_MPSSHOTGUN;
|
||||
char *s_OB_MPCHAINGUN = OB_MPCHAINGUN;
|
||||
char *s_OB_MPROCKET = OB_MPROCKET;
|
||||
char *s_OB_MPPLASMARIFLE = OB_MPPLASMARIFLE;
|
||||
char *s_OB_MPBFG_BOOM = OB_MPBFG_BOOM;
|
||||
char *s_OB_MPTELEFRAG = OB_MPTELEFRAG;
|
||||
|
||||
// Ty 05/03/98 - externalized
|
||||
char* savegamename;
|
||||
|
||||
@ -828,6 +874,49 @@ deh_strs deh_strlookup[] = {
|
||||
{&startup4,"STARTUP4"},
|
||||
{&startup5,"STARTUP5"},
|
||||
{&savegamename,"SAVEGAMENAME"}, // Ty 05/03/98
|
||||
|
||||
// [FG] obituaries
|
||||
|
||||
{&s_OB_CRUSH, "OB_CRUSH"},
|
||||
{&s_OB_SLIME, "OB_SLIME"},
|
||||
{&s_OB_LAVA, "OB_LAVA"},
|
||||
{&s_OB_KILLEDSELF, "OB_KILLEDSELF"},
|
||||
{&s_OB_VOODOO, "OB_VOODOO"},
|
||||
{&s_OB_MONTELEFRAG, "OB_MONTELEFRAG"},
|
||||
{&s_OB_DEFAULT, "OB_DEFAULT"},
|
||||
{&s_OB_MPDEFAULT, "OB_MPDEFAULT"},
|
||||
{&s_OB_UNDEADHIT, "OB_UNDEADHIT"},
|
||||
{&s_OB_IMPHIT, "OB_IMPHIT"},
|
||||
{&s_OB_CACOHIT, "OB_CACOHIT"},
|
||||
{&s_OB_DEMONHIT, "OB_DEMONHIT"},
|
||||
{&s_OB_SPECTREHIT, "OB_SPECTREHIT"},
|
||||
{&s_OB_BARONHIT, "OB_BARONHIT"},
|
||||
{&s_OB_KNIGHTHIT, "OB_KNIGHTHIT"},
|
||||
{&s_OB_ZOMBIE, "OB_ZOMBIE"},
|
||||
{&s_OB_SHOTGUY, "OB_SHOTGUY"},
|
||||
{&s_OB_VILE, "OB_VILE"},
|
||||
{&s_OB_UNDEAD, "OB_UNDEAD"},
|
||||
{&s_OB_FATSO, "OB_FATSO"},
|
||||
{&s_OB_CHAINGUY, "OB_CHAINGUY"},
|
||||
{&s_OB_SKULL, "OB_SKULL"},
|
||||
{&s_OB_IMP, "OB_IMP"},
|
||||
{&s_OB_CACO, "OB_CACO"},
|
||||
{&s_OB_BARON, "OB_BARON"},
|
||||
{&s_OB_KNIGHT, "OB_KNIGHT"},
|
||||
{&s_OB_SPIDER, "OB_SPIDER"},
|
||||
{&s_OB_BABY, "OB_BABY"},
|
||||
{&s_OB_CYBORG, "OB_CYBORG"},
|
||||
{&s_OB_WOLFSS, "OB_WOLFSS"},
|
||||
{&s_OB_MPFIST, "OB_MPFIST"},
|
||||
{&s_OB_MPCHAINSAW, "OB_MPCHAINSAW"},
|
||||
{&s_OB_MPPISTOL, "OB_MPPISTOL"},
|
||||
{&s_OB_MPSHOTGUN, "OB_MPSHOTGUN"},
|
||||
{&s_OB_MPSSHOTGUN, "OB_MPSSHOTGUN"},
|
||||
{&s_OB_MPCHAINGUN, "OB_MPCHAINGUN"},
|
||||
{&s_OB_MPROCKET, "OB_MPROCKET"},
|
||||
{&s_OB_MPPLASMARIFLE, "OB_MPPLASMARIFLE"},
|
||||
{&s_OB_MPBFG_BOOM, "OB_MPBFG_BOOM"},
|
||||
{&s_OB_MPTELEFRAG, "OB_MPTELEFRAG"},
|
||||
};
|
||||
|
||||
static int deh_numstrlookup =
|
||||
|
43
src/d_deh.h
43
src/d_deh.h
@ -817,6 +817,49 @@ extern char *startup5;
|
||||
// from g_game.c, prefix for savegame name like "boomsav"
|
||||
extern char *savegamename;
|
||||
|
||||
// [FG] obituaries
|
||||
|
||||
extern char *s_OB_CRUSH;
|
||||
extern char *s_OB_SLIME;
|
||||
extern char *s_OB_LAVA;
|
||||
extern char *s_OB_KILLEDSELF;
|
||||
extern char *s_OB_VOODOO;
|
||||
extern char *s_OB_MONTELEFRAG;
|
||||
extern char *s_OB_DEFAULT;
|
||||
extern char *s_OB_MPDEFAULT;
|
||||
extern char *s_OB_UNDEADHIT;
|
||||
extern char *s_OB_IMPHIT;
|
||||
extern char *s_OB_CACOHIT;
|
||||
extern char *s_OB_DEMONHIT;
|
||||
extern char *s_OB_SPECTREHIT;
|
||||
extern char *s_OB_BARONHIT;
|
||||
extern char *s_OB_KNIGHTHIT;
|
||||
extern char *s_OB_ZOMBIE;
|
||||
extern char *s_OB_SHOTGUY;
|
||||
extern char *s_OB_VILE;
|
||||
extern char *s_OB_UNDEAD;
|
||||
extern char *s_OB_FATSO;
|
||||
extern char *s_OB_CHAINGUY;
|
||||
extern char *s_OB_SKULL;
|
||||
extern char *s_OB_IMP;
|
||||
extern char *s_OB_CACO;
|
||||
extern char *s_OB_BARON;
|
||||
extern char *s_OB_KNIGHT;
|
||||
extern char *s_OB_SPIDER;
|
||||
extern char *s_OB_BABY;
|
||||
extern char *s_OB_CYBORG;
|
||||
extern char *s_OB_WOLFSS;
|
||||
extern char *s_OB_MPFIST;
|
||||
extern char *s_OB_MPCHAINSAW;
|
||||
extern char *s_OB_MPPISTOL;
|
||||
extern char *s_OB_MPSHOTGUN;
|
||||
extern char *s_OB_MPSSHOTGUN;
|
||||
extern char *s_OB_MPCHAINGUN;
|
||||
extern char *s_OB_MPROCKET;
|
||||
extern char *s_OB_MPPLASMARIFLE;
|
||||
extern char *s_OB_MPBFG_BOOM;
|
||||
extern char *s_OB_MPTELEFRAG;
|
||||
|
||||
#endif
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
|
@ -728,6 +728,51 @@
|
||||
#define CC_CYBER "THE CYBERDEMON"
|
||||
#define CC_HERO "OUR HERO"
|
||||
|
||||
// [FG] obituaries
|
||||
|
||||
#define OB_CRUSH "%o was squished."
|
||||
#define OB_SLIME "%o mutated."
|
||||
#define OB_LAVA "%o melted."
|
||||
#define OB_KILLEDSELF "%o killed %hself."
|
||||
#define OB_VOODOO "%o was killed by the power of voodoo."
|
||||
#define OB_MONTELEFRAG "%o was telefragged."
|
||||
#define OB_DEFAULT "%o died."
|
||||
#define OB_MPDEFAULT "%o was killed by %k."
|
||||
|
||||
#define OB_UNDEADHIT "%o was punched by a revenant."
|
||||
#define OB_IMPHIT "%o was slashed by an imp."
|
||||
#define OB_CACOHIT "%o got too close to a cacodemon."
|
||||
#define OB_DEMONHIT "%o was bit by a demon."
|
||||
#define OB_SPECTREHIT "%o was eaten by a spectre."
|
||||
#define OB_BARONHIT "%o was ripped open by a Baron of Hell."
|
||||
#define OB_KNIGHTHIT "%o was gutted by a Hell Knight."
|
||||
|
||||
#define OB_ZOMBIE "%o was killed by a zombieman."
|
||||
#define OB_SHOTGUY "%o was shot by a sergeant."
|
||||
#define OB_VILE "%o was incinerated by an archvile."
|
||||
#define OB_UNDEAD "%o couldn't evade a revenant's fireball."
|
||||
#define OB_FATSO "%o was squashed by a mancubus."
|
||||
#define OB_CHAINGUY "%o was perforated by a chaingunner."
|
||||
#define OB_SKULL "%o was spooked by a lost soul."
|
||||
#define OB_IMP "%o was burned by an imp."
|
||||
#define OB_CACO "%o was smitten by a cacodemon."
|
||||
#define OB_BARON "%o was bruised by a Baron of Hell."
|
||||
#define OB_KNIGHT "%o was splayed by a Hell Knight."
|
||||
#define OB_SPIDER "%o stood in awe of the spider demon."
|
||||
#define OB_BABY "%o let an arachnotron get %h."
|
||||
#define OB_CYBORG "%o was splattered by a cyberdemon."
|
||||
#define OB_WOLFSS "%o met a Nazi."
|
||||
|
||||
#define OB_MPFIST "%o chewed on %k's fist."
|
||||
#define OB_MPCHAINSAW "%o was mowed over by %k's chainsaw."
|
||||
#define OB_MPPISTOL "%o was tickled by %k's pea shooter."
|
||||
#define OB_MPSHOTGUN "%o chewed on %k's boomstick."
|
||||
#define OB_MPSSHOTGUN "%o was splattered by %k's super shotgun."
|
||||
#define OB_MPCHAINGUN "%o was mowed down by %k's chaingun."
|
||||
#define OB_MPROCKET "%o rode %k's rocket."
|
||||
#define OB_MPPLASMARIFLE "%o was melted by %k's plasma gun."
|
||||
#define OB_MPBFG_BOOM "%o was splintered by %k's BFG."
|
||||
#define OB_MPTELEFRAG "%o was telefragged by %k."
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -448,6 +448,7 @@ typedef enum {
|
||||
MESSAGES_NONE,
|
||||
MESSAGES_TOGGLE,
|
||||
MESSAGES_PICKUP,
|
||||
MESSAGES_OBITUARY
|
||||
} msg_category_t;
|
||||
|
||||
void doomprintf(player_t *player, msg_category_t category,
|
||||
|
@ -4060,7 +4060,8 @@ void doomprintf(player_t *player, msg_category_t category, const char *s, ...)
|
||||
va_list v;
|
||||
|
||||
if ((category == MESSAGES_TOGGLE && !show_toggle_messages) ||
|
||||
(category == MESSAGES_PICKUP && !show_pickup_messages))
|
||||
(category == MESSAGES_PICKUP && !show_pickup_messages) ||
|
||||
(category == MESSAGES_OBITUARY && !show_obituary_messages))
|
||||
return;
|
||||
|
||||
va_start(v,s);
|
||||
|
228
src/hu_obituary.c
Normal file
228
src/hu_obituary.c
Normal file
@ -0,0 +1,228 @@
|
||||
//
|
||||
// Copyright (C) 2023 Fabian Greffrath
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU General Public License
|
||||
// as published by the Free Software Foundation; either version 2
|
||||
// of the License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// DESCRIPTION: Obituaries
|
||||
//
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "doomtype.h"
|
||||
#include "doomstat.h"
|
||||
#include "d_deh.h"
|
||||
#include "m_misc2.h"
|
||||
#include "p_mobj.h"
|
||||
#include "net_client.h"
|
||||
|
||||
#include "hu_obituary.h"
|
||||
|
||||
int show_obituary_messages;
|
||||
int hudcolor_obituary;
|
||||
|
||||
// [FG] gender-neutral pronouns
|
||||
|
||||
struct
|
||||
{
|
||||
const char *const from;
|
||||
const char *const to;
|
||||
} static const pronouns[] = {
|
||||
{"%g", "they"}, {"%h", "them"}, {"%p", "their"},
|
||||
{"%s", "theirs"}, {"%r", "they're"},
|
||||
};
|
||||
|
||||
static char *playerstr[] = {
|
||||
"Player 1",
|
||||
"Player 2",
|
||||
"Player 3",
|
||||
"Player 4",
|
||||
};
|
||||
|
||||
void HU_InitObituaries(void)
|
||||
{
|
||||
// [FG] TODO only the server knows the names of all clients,
|
||||
// but at least we know ours...
|
||||
|
||||
playerstr[consoleplayer] = net_player_name;
|
||||
}
|
||||
|
||||
static inline char *StrReplace(char *str, const char *from, const char *to)
|
||||
{
|
||||
if (strstr(str, from) != NULL)
|
||||
{
|
||||
char *newstr;
|
||||
newstr = M_StringReplace(str, from, to);
|
||||
free(str);
|
||||
str = newstr;
|
||||
}
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
void HU_Obituary(mobj_t *target, mobj_t *source, method_t mod)
|
||||
{
|
||||
int i;
|
||||
char *ob = s_OB_DEFAULT, *str;
|
||||
|
||||
if (target->player->mo != target)
|
||||
{
|
||||
ob = s_OB_VOODOO;
|
||||
}
|
||||
else if (target == source)
|
||||
{
|
||||
ob = s_OB_KILLEDSELF;
|
||||
}
|
||||
else if (source)
|
||||
{
|
||||
if (mod == MOD_Telefrag)
|
||||
{
|
||||
ob = (source->player) ? s_OB_MPTELEFRAG : s_OB_MONTELEFRAG;
|
||||
}
|
||||
else if (source->player)
|
||||
{
|
||||
switch (source->player->readyweapon)
|
||||
{
|
||||
case wp_fist:
|
||||
ob = s_OB_MPFIST;
|
||||
break;
|
||||
case wp_pistol:
|
||||
ob = s_OB_MPPISTOL;
|
||||
break;
|
||||
case wp_shotgun:
|
||||
ob = s_OB_MPSHOTGUN;
|
||||
break;
|
||||
case wp_chaingun:
|
||||
ob = s_OB_MPCHAINGUN;
|
||||
break;
|
||||
case wp_missile:
|
||||
ob = s_OB_MPROCKET;
|
||||
break;
|
||||
case wp_plasma:
|
||||
ob = s_OB_MPPLASMARIFLE;
|
||||
break;
|
||||
case wp_bfg:
|
||||
ob = s_OB_MPBFG_BOOM;
|
||||
break;
|
||||
case wp_chainsaw:
|
||||
ob = s_OB_MPCHAINSAW;
|
||||
break;
|
||||
case wp_supershotgun:
|
||||
ob = s_OB_MPSSHOTGUN;
|
||||
break;
|
||||
default:
|
||||
ob = s_OB_MPDEFAULT;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (source->type)
|
||||
{
|
||||
case MT_POSSESSED:
|
||||
ob = s_OB_ZOMBIE;
|
||||
break;
|
||||
case MT_SHOTGUY:
|
||||
ob = s_OB_SHOTGUY;
|
||||
break;
|
||||
case MT_VILE:
|
||||
ob = s_OB_VILE;
|
||||
break;
|
||||
case MT_UNDEAD:
|
||||
ob = (mod == MOD_Melee) ? s_OB_UNDEADHIT : s_OB_UNDEAD;
|
||||
break;
|
||||
case MT_FATSO:
|
||||
ob = s_OB_FATSO;
|
||||
break;
|
||||
case MT_CHAINGUY:
|
||||
ob = s_OB_CHAINGUY;
|
||||
break;
|
||||
case MT_SKULL:
|
||||
ob = s_OB_SKULL;
|
||||
break;
|
||||
case MT_TROOP:
|
||||
ob = (mod == MOD_Melee) ? s_OB_IMPHIT : s_OB_IMP;
|
||||
break;
|
||||
case MT_HEAD:
|
||||
ob = (mod == MOD_Melee) ? s_OB_CACOHIT : s_OB_CACO;
|
||||
break;
|
||||
case MT_SERGEANT:
|
||||
ob = s_OB_DEMONHIT; // [FG] melee only
|
||||
break;
|
||||
case MT_SHADOWS:
|
||||
ob = s_OB_SPECTREHIT; // [FG] melee only
|
||||
break;
|
||||
case MT_BRUISER:
|
||||
ob = (mod == MOD_Melee) ? s_OB_BARONHIT : s_OB_BARON;
|
||||
break;
|
||||
case MT_KNIGHT:
|
||||
ob = (mod == MOD_Melee) ? s_OB_KNIGHTHIT : s_OB_KNIGHT;
|
||||
break;
|
||||
case MT_SPIDER:
|
||||
ob = s_OB_SPIDER;
|
||||
break;
|
||||
case MT_BABY:
|
||||
ob = s_OB_BABY;
|
||||
break;
|
||||
case MT_CYBORG:
|
||||
ob = s_OB_CYBORG;
|
||||
break;
|
||||
case MT_WOLFSS:
|
||||
ob = s_OB_WOLFSS;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (mod)
|
||||
{
|
||||
case MOD_Slime:
|
||||
ob = s_OB_SLIME;
|
||||
break;
|
||||
case MOD_Lava:
|
||||
ob = s_OB_LAVA;
|
||||
break;
|
||||
case MOD_Crush:
|
||||
ob = s_OB_CRUSH;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
str = M_StringDuplicate(ob);
|
||||
|
||||
for (i = 0; i < arrlen(pronouns); i++)
|
||||
{
|
||||
str = StrReplace(str, pronouns[i].from, pronouns[i].to);
|
||||
}
|
||||
|
||||
if (source && source->player)
|
||||
{
|
||||
str = StrReplace(str, "%k", playerstr[source->player - players]);
|
||||
}
|
||||
|
||||
str = StrReplace(str, "%o", playerstr[target->player - players]);
|
||||
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
{
|
||||
if (!playeringame[i])
|
||||
break;
|
||||
|
||||
doomprintf(&players[i], MESSAGES_OBITUARY, "\x1b%c%s",
|
||||
'0' + hudcolor_obituary, str);
|
||||
}
|
||||
|
||||
free(str);
|
||||
}
|
37
src/hu_obituary.h
Normal file
37
src/hu_obituary.h
Normal file
@ -0,0 +1,37 @@
|
||||
//
|
||||
// Copyright (C) 2023 Fabian Greffrath
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU General Public License
|
||||
// as published by the Free Software Foundation; either version 2
|
||||
// of the License, or (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// DESCRIPTION: Obituaries
|
||||
//
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#ifndef __HU_OBITUARY_H__
|
||||
#define __HU_OBITUARY_H__
|
||||
|
||||
typedef enum
|
||||
{
|
||||
MOD_None,
|
||||
MOD_Slime,
|
||||
MOD_Lava,
|
||||
MOD_Crush,
|
||||
MOD_Telefrag,
|
||||
MOD_Melee,
|
||||
} method_t;
|
||||
|
||||
void HU_InitObituaries(void);
|
||||
void HU_Obituary(mobj_t *target, mobj_t *source, method_t mod);
|
||||
|
||||
extern int show_obituary_messages;
|
||||
extern int hudcolor_obituary;
|
||||
|
||||
#endif
|
@ -22,6 +22,7 @@
|
||||
#include "doomstat.h"
|
||||
#include "doomkeys.h"
|
||||
#include "hu_stuff.h"
|
||||
#include "hu_obituary.h"
|
||||
#include "hu_lib.h"
|
||||
#include "st_stuff.h" /* jff 2/16/98 need loc of status bar */
|
||||
#include "w_wad.h"
|
||||
@ -460,6 +461,7 @@ void HU_Init(void)
|
||||
|
||||
HU_InitDemoProgressBar();
|
||||
|
||||
HU_InitObituaries();
|
||||
HU_ParseHUD();
|
||||
|
||||
// [Woof!] prepare player messages for colorization
|
||||
|
14
src/m_menu.c
14
src/m_menu.c
@ -36,6 +36,7 @@
|
||||
#include "v_video.h"
|
||||
#include "w_wad.h"
|
||||
#include "r_main.h"
|
||||
#include "hu_obituary.h"
|
||||
#include "hu_stuff.h"
|
||||
#include "g_game.h"
|
||||
#include "s_sound.h"
|
||||
@ -4431,7 +4432,7 @@ setup_menu_t gen_settings5[] = { // General Settings screen5
|
||||
M_Y + gen5_skill*M_SPC, {"default_skill"}, 0, NULL, default_skill_strings},
|
||||
|
||||
{"Player Name", S_STRING, m_null, M_X,
|
||||
M_Y + gen5_playername*M_SPC, {"net_player_name"}},
|
||||
M_Y + gen5_playername*M_SPC, {"net_player_name"}, 0, HU_InitObituaries},
|
||||
|
||||
{"<- PREV",S_SKIP|S_PREV, m_null, M_X_PREV, M_Y_PREVNEXT, {gen_settings4}},
|
||||
|
||||
@ -4711,6 +4712,7 @@ enum {
|
||||
mess_secret,
|
||||
mess_showtoggle,
|
||||
mess_showpickup,
|
||||
mess_showobituary,
|
||||
mess_stub1,
|
||||
mess_centered,
|
||||
mess_colorized,
|
||||
@ -4718,6 +4720,7 @@ enum {
|
||||
mess_timer,
|
||||
mess_color_chat,
|
||||
mess_chat_timer,
|
||||
mess_color_obituary,
|
||||
mess_stub2,
|
||||
mess_list,
|
||||
mess_lines
|
||||
@ -4747,6 +4750,9 @@ setup_menu_t mess_settings1[] = // Messages screen
|
||||
{"Show Pickup Messages", S_YESNO, m_null, M_X,
|
||||
M_Y + mess_showpickup*M_SPC, {"show_pickup_messages"}},
|
||||
|
||||
{"Show Obituaries", S_YESNO, m_null, M_X,
|
||||
M_Y + mess_showobituary*M_SPC, {"show_obituary_messages"}},
|
||||
|
||||
{"", S_SKIP, m_null, M_X, M_Y + mess_stub1*M_SPC},
|
||||
|
||||
{"Center Messages", S_YESNO, m_null, M_X,
|
||||
@ -4767,6 +4773,9 @@ setup_menu_t mess_settings1[] = // Messages screen
|
||||
{"Chat Message Duration (ms)", S_NUM|S_COSMETIC, m_null, M_X,
|
||||
M_Y + mess_chat_timer*M_SPC, {"chat_msg_timer"}},
|
||||
|
||||
{"Obituary Color", S_CRITEM|S_COSMETIC, m_null, M_X,
|
||||
M_Y + mess_color_obituary*M_SPC, {"hudcolor_obituary"}, 0, NULL, hudcolor_str},
|
||||
|
||||
{"", S_SKIP, m_null, M_X, M_Y + mess_stub2*M_SPC},
|
||||
|
||||
{"Multi-Line Messages", S_YESNO, m_null, M_X,
|
||||
@ -6417,6 +6426,9 @@ boolean M_Responder (event_t* ev)
|
||||
else if ((action == MENU_ENTER) ||
|
||||
(action == MENU_ESCAPE))
|
||||
{
|
||||
if (ptr1->action) // [FG] call action routine for string changes
|
||||
ptr1->action();
|
||||
// [FG] TODO reset string upon ESC
|
||||
ptr1->var.def->location->s = chat_string_buffer;
|
||||
M_SelectDone(ptr1); // phares 4/17/98
|
||||
}
|
||||
|
15
src/m_misc.c
15
src/m_misc.c
@ -33,6 +33,7 @@
|
||||
#include "i_sound.h"
|
||||
#include "i_video.h"
|
||||
#include "v_video.h"
|
||||
#include "hu_obituary.h"
|
||||
#include "hu_stuff.h"
|
||||
#include "st_stuff.h"
|
||||
#include "dstrings.h"
|
||||
@ -2461,6 +2462,13 @@ default_t defaults[] = {
|
||||
"1 to enable pickup messages"
|
||||
},
|
||||
|
||||
{
|
||||
"show_obituary_messages",
|
||||
(config_t *) &show_obituary_messages, NULL,
|
||||
{1}, {0,1}, number, ss_none, wad_no,
|
||||
"1 to enable obituaries"
|
||||
},
|
||||
|
||||
// "A secret is revealed!" message
|
||||
{
|
||||
"hud_secret_message",
|
||||
@ -2483,6 +2491,13 @@ default_t defaults[] = {
|
||||
"color range used for chat messages and entry"
|
||||
},
|
||||
|
||||
{
|
||||
"hudcolor_obituary",
|
||||
(config_t *) &hudcolor_obituary, NULL,
|
||||
{CR_GRAY}, {CR_BRICK,CR_NONE}, number, ss_mess, wad_yes,
|
||||
"color range used for obituaries"
|
||||
},
|
||||
|
||||
{ // killough 11/98
|
||||
"chat_msg_timer",
|
||||
(config_t *) &chat_msg_timer, NULL,
|
||||
|
@ -1379,7 +1379,7 @@ void A_TroopAttack(mobj_t *actor)
|
||||
int damage;
|
||||
S_StartSound(actor, sfx_claw);
|
||||
damage = (P_Random(pr_troopattack)%8+1)*3;
|
||||
P_DamageMobj(actor->target, actor, actor, damage);
|
||||
P_DamageMobjBy(actor->target, actor, actor, damage, MOD_Melee);
|
||||
return;
|
||||
}
|
||||
P_SpawnMissile(actor, actor->target, MT_TROOPSHOT); // launch a missile
|
||||
@ -1393,7 +1393,7 @@ void A_SargAttack(mobj_t *actor)
|
||||
if (P_CheckMeleeRange(actor))
|
||||
{
|
||||
int damage = ((P_Random(pr_sargattack)%10)+1)*4;
|
||||
P_DamageMobj(actor->target, actor, actor, damage);
|
||||
P_DamageMobjBy(actor->target, actor, actor, damage, MOD_Melee);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1405,7 +1405,7 @@ void A_HeadAttack(mobj_t *actor)
|
||||
if (P_CheckMeleeRange(actor))
|
||||
{
|
||||
int damage = (P_Random(pr_headattack)%6+1)*10;
|
||||
P_DamageMobj(actor->target, actor, actor, damage);
|
||||
P_DamageMobjBy(actor->target, actor, actor, damage, MOD_Melee);
|
||||
return;
|
||||
}
|
||||
P_SpawnMissile(actor, actor->target, MT_HEADSHOT); // launch a missile
|
||||
@ -1428,7 +1428,7 @@ void A_BruisAttack(mobj_t *actor)
|
||||
int damage;
|
||||
S_StartSound(actor, sfx_claw);
|
||||
damage = (P_Random(pr_bruisattack)%8+1)*10;
|
||||
P_DamageMobj(actor->target, actor, actor, damage);
|
||||
P_DamageMobjBy(actor->target, actor, actor, damage, MOD_Melee);
|
||||
return;
|
||||
}
|
||||
P_SpawnMissile(actor, actor->target, MT_BRUISERSHOT); // launch a missile
|
||||
@ -1556,7 +1556,7 @@ void A_SkelFist(mobj_t *actor)
|
||||
{
|
||||
int damage = ((P_Random(pr_skelfist)%10)+1)*6;
|
||||
S_StartSound(actor, sfx_skepch);
|
||||
P_DamageMobj(actor->target, actor, actor, damage);
|
||||
P_DamageMobjBy(actor->target, actor, actor, damage, MOD_Melee);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2716,7 +2716,7 @@ void A_Scratch(mobj_t *mo)
|
||||
return;
|
||||
mo->target && (A_FaceTarget(mo), P_CheckMeleeRange(mo)) ?
|
||||
mo->state->misc2 ? S_StartSound(mo, mo->state->misc2) : (void) 0,
|
||||
P_DamageMobj(mo->target, mo, mo, mo->state->misc1) : (void) 0;
|
||||
P_DamageMobjBy(mo->target, mo, mo, mo->state->misc1, MOD_Melee) : (void) 0;
|
||||
}
|
||||
|
||||
void A_PlaySound(mobj_t *mo)
|
||||
|
@ -649,7 +649,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher)
|
||||
//
|
||||
// killough 11/98: make static
|
||||
|
||||
static void P_KillMobj(mobj_t *source, mobj_t *target)
|
||||
static void P_KillMobj(mobj_t *source, mobj_t *target, method_t mod)
|
||||
{
|
||||
mobjtype_t item;
|
||||
mobj_t *mo;
|
||||
@ -732,6 +732,8 @@ static void P_KillMobj(mobj_t *source, mobj_t *target)
|
||||
if (target->player == &players[consoleplayer] && automapactive)
|
||||
if (!demoplayback) // killough 11/98: don't switch out in demos, though
|
||||
AM_Stop(); // don't die in auto map; switch view prior to dying
|
||||
|
||||
HU_Obituary(target, source, mod);
|
||||
}
|
||||
|
||||
if (target->health < -target->info->spawnhealth && target->info->xdeathstate)
|
||||
@ -787,7 +789,7 @@ static boolean P_InfightingImmune(mobj_t *target, mobj_t *source)
|
||||
mobjinfo[target->type].infighting_group == mobjinfo[source->type].infighting_group;
|
||||
}
|
||||
|
||||
void P_DamageMobj(mobj_t *target,mobj_t *inflictor, mobj_t *source, int damage)
|
||||
void P_DamageMobjBy(mobj_t *target,mobj_t *inflictor, mobj_t *source, int damage, method_t mod)
|
||||
{
|
||||
player_t *player;
|
||||
boolean justhit; // killough 11/98
|
||||
@ -908,7 +910,7 @@ void P_DamageMobj(mobj_t *target,mobj_t *inflictor, mobj_t *source, int damage)
|
||||
else
|
||||
if (target->health <= 0)
|
||||
{
|
||||
P_KillMobj(source, target);
|
||||
P_KillMobj(source, target, mod);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -22,6 +22,7 @@
|
||||
|
||||
#include "d_player.h"
|
||||
#include "p_mobj.h"
|
||||
#include "hu_obituary.h"
|
||||
|
||||
// Ty 03/09/98 Moved to an int in p_inter.c for deh and externalization
|
||||
#define MAXHEALTH maxhealth
|
||||
@ -31,7 +32,8 @@
|
||||
|
||||
boolean P_GivePower(player_t *, int);
|
||||
void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher);
|
||||
void P_DamageMobj(mobj_t *target,mobj_t *inflictor,mobj_t *source,int damage);
|
||||
void P_DamageMobjBy(mobj_t *target,mobj_t *inflictor,mobj_t *source,int damage,method_t method);
|
||||
#define P_DamageMobj(a,b,c,d) P_DamageMobjBy(a,b,c,d,MOD_None)
|
||||
|
||||
// killough 5/2/98: moved from d_deh.c, g_game.c, m_misc.c, others:
|
||||
|
||||
|
@ -110,7 +110,7 @@ static boolean PIT_StompThing (mobj_t *thing)
|
||||
if (!telefrag) // killough 8/9/98: make consistent across all levels
|
||||
return false;
|
||||
|
||||
P_DamageMobj (thing, tmthing, tmthing, 10000); // Stomp!
|
||||
P_DamageMobjBy (thing, tmthing, tmthing, 10000, MOD_Telefrag); // Stomp!
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -1964,7 +1964,7 @@ boolean PIT_ChangeSector(mobj_t *thing)
|
||||
{
|
||||
int t; // killough 8/10/98
|
||||
|
||||
P_DamageMobj(thing,NULL,NULL,10);
|
||||
P_DamageMobjBy(thing,NULL,NULL,10,MOD_Crush);
|
||||
|
||||
// spray blood in a random direction
|
||||
mo = P_SpawnMobj (thing->x,
|
||||
|
24
src/p_spec.c
24
src/p_spec.c
@ -2164,20 +2164,35 @@ void P_PlayerInSpecialSector (player_t *player)
|
||||
}
|
||||
else
|
||||
if (!disable_nuke) // killough 12/98: nukage disabling cheat
|
||||
{
|
||||
method_t mod = MOD_None;
|
||||
|
||||
switch (flatterrain[sector->floorpic])
|
||||
{
|
||||
case terrain_lava:
|
||||
mod = MOD_Lava;
|
||||
break;
|
||||
case terrain_slime:
|
||||
mod = MOD_Slime;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
switch (sector->special)
|
||||
{
|
||||
case 5:
|
||||
// 5/10 unit damage per 31 ticks
|
||||
if (!player->powers[pw_ironfeet])
|
||||
if (!(leveltime&0x1f))
|
||||
P_DamageMobj (player->mo, NULL, NULL, 10);
|
||||
P_DamageMobjBy (player->mo, NULL, NULL, 10, mod);
|
||||
break;
|
||||
|
||||
case 7:
|
||||
// 2/5 unit damage per 31 ticks
|
||||
if (!player->powers[pw_ironfeet])
|
||||
if (!(leveltime&0x1f))
|
||||
P_DamageMobj (player->mo, NULL, NULL, 5);
|
||||
P_DamageMobjBy (player->mo, NULL, NULL, 5, mod);
|
||||
break;
|
||||
|
||||
case 16:
|
||||
@ -2188,7 +2203,7 @@ void P_PlayerInSpecialSector (player_t *player)
|
||||
|| (P_Random(pr_slimehurt)<5) ) // even with suit, take damage
|
||||
{
|
||||
if (!(leveltime&0x1f))
|
||||
P_DamageMobj (player->mo, NULL, NULL, 20);
|
||||
P_DamageMobjBy (player->mo, NULL, NULL, 20, mod);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -2198,7 +2213,7 @@ void P_PlayerInSpecialSector (player_t *player)
|
||||
player->cheats &= ~CF_GODMODE; // on godmode cheat clearing
|
||||
// does not affect invulnerability
|
||||
if (!(leveltime&0x1f))
|
||||
P_DamageMobj (player->mo, NULL, NULL, 20);
|
||||
P_DamageMobjBy (player->mo, NULL, NULL, 20, mod);
|
||||
|
||||
if (player->health <= 10)
|
||||
G_ExitLevel();
|
||||
@ -2208,6 +2223,7 @@ void P_PlayerInSpecialSector (player_t *player)
|
||||
//jff 1/24/98 Don't exit as DOOM2 did, just ignore
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else //jff 3/14/98 handle extended sector types for secrets and damage
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user