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:
Fabian Greffrath 2023-09-07 08:59:43 +02:00 committed by GitHub
parent c8302ce682
commit 178493dede
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 512 additions and 18 deletions

View File

@ -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

View File

@ -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 =

View File

@ -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
//--------------------------------------------------------------------

View File

@ -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

View File

@ -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,

View File

@ -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
View 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
View 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

View File

@ -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

View File

@ -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
}

View File

@ -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,

View File

@ -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)

View File

@ -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;
}

View File

@ -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:

View File

@ -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,

View File

@ -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
{