From 178493dedefd2c54e06cbb9f8e0f85158c2db220 Mon Sep 17 00:00:00 2001 From: Fabian Greffrath Date: Thu, 7 Sep 2023 08:59:43 +0200 Subject: [PATCH] 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 --- src/CMakeLists.txt | 1 + src/d_deh.c | 89 ++++++++++++++++++ src/d_deh.h | 43 +++++++++ src/d_englsh.h | 45 +++++++++ src/doomstat.h | 1 + src/g_game.c | 3 +- src/hu_obituary.c | 228 +++++++++++++++++++++++++++++++++++++++++++++ src/hu_obituary.h | 37 ++++++++ src/hu_stuff.c | 2 + src/m_menu.c | 14 ++- src/m_misc.c | 15 +++ src/p_enemy.c | 12 +-- src/p_inter.c | 8 +- src/p_inter.h | 4 +- src/p_map.c | 4 +- src/p_spec.c | 24 ++++- 16 files changed, 512 insertions(+), 18 deletions(-) create mode 100644 src/hu_obituary.c create mode 100644 src/hu_obituary.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 66a97d91..6cd390e5 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -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 diff --git a/src/d_deh.c b/src/d_deh.c index ce156b69..541ee164 100644 --- a/src/d_deh.c +++ b/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 = diff --git a/src/d_deh.h b/src/d_deh.h index c99fa69e..16975483 100644 --- a/src/d_deh.h +++ b/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 //-------------------------------------------------------------------- diff --git a/src/d_englsh.h b/src/d_englsh.h index 52968122..c5f7213e 100644 --- a/src/d_englsh.h +++ b/src/d_englsh.h @@ -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 diff --git a/src/doomstat.h b/src/doomstat.h index 3704dedb..f5f2a049 100644 --- a/src/doomstat.h +++ b/src/doomstat.h @@ -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, diff --git a/src/g_game.c b/src/g_game.c index a427134d..bbfad614 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -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); diff --git a/src/hu_obituary.c b/src/hu_obituary.c new file mode 100644 index 00000000..eccf6811 --- /dev/null +++ b/src/hu_obituary.c @@ -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 + +#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); +} diff --git a/src/hu_obituary.h b/src/hu_obituary.h new file mode 100644 index 00000000..08f72e30 --- /dev/null +++ b/src/hu_obituary.h @@ -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 diff --git a/src/hu_stuff.c b/src/hu_stuff.c index f76f7240..080fb270 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -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 diff --git a/src/m_menu.c b/src/m_menu.c index 1a33021a..86cc2ea6 100644 --- a/src/m_menu.c +++ b/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 } diff --git a/src/m_misc.c b/src/m_misc.c index 3b63917f..56d26bdd 100644 --- a/src/m_misc.c +++ b/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, diff --git a/src/p_enemy.c b/src/p_enemy.c index dfe2fd9d..ade0d271 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -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) diff --git a/src/p_inter.c b/src/p_inter.c index 39269745..a4545543 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -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; } diff --git a/src/p_inter.h b/src/p_inter.h index 32401564..e1d4c598 100644 --- a/src/p_inter.h +++ b/src/p_inter.h @@ -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: diff --git a/src/p_map.c b/src/p_map.c index acd394b6..593d6c4e 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -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, diff --git a/src/p_spec.c b/src/p_spec.c index 2dd4d04b..9d0b781c 100644 --- a/src/p_spec.c +++ b/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 {