dehacked: run through simplecpp, cheat replacements for Phase 1 only

Deduplicates effort from copying between multiple patch files, and we
now have unique outputs for each of our IWADs.

Having just "No Clipping 1 = idclip" proved to be troublesome with at
least prboom-plus, the engine running its cheat detecting twice and
becoming unable to activate no-clipping mode.  Worked around it by
also defining "No Clipping 2 = idspispopd", restoring that cheat's
functionality in most source ports and keeping both variants unique.
Chocolate Doom will only use the "idclip" version.
master
Mike Swanson 2019-09-01 17:25:15 -07:00
parent d4c5b3ab48
commit 8e9ce31b70
7 changed files with 104 additions and 449 deletions

View File

@ -16,6 +16,7 @@ OBJS=$(FREEDM) $(FREEDOOM1) $(FREEDOOM2)
all: $(OBJS)
subdirs:
$(MAKE) -C lumps
$(MAKE) VERSION=$(VERSION) -C graphics/text
$(MAKE) -C lumps/playpal
$(MAKE) -C lumps/colormap

View File

@ -157,7 +157,11 @@ ZMAPINFO = fdmmpinf
ENDOOM = endoomdm
FREEDM
#else
DEHACKED
#ifdef ULTDOOM
DEHACKED = p1_deh
#else
DEHACKED = p2_deh
#endif
ENDOOM
#endif

View File

@ -234,7 +234,7 @@ def update_level_name(lumpname, bexdata, bexname):
levelname = re.sub('^\w*\d:\s*', '', bexdata[bexname])
white_graphics[lumpname] = levelname
freedoom_bex = read_bex_lump('../../lumps/dehacked.lmp')
freedoom_bex = read_bex_lump('../../lumps/p2_deh.lmp')
freedm_bex = read_bex_lump('../../lumps/fdm_deh.lmp')
for e in range(4):

5
lumps/.gitignore vendored
View File

@ -10,3 +10,8 @@ genmidi.lmp
???pname.lmp
???txtr1.lmp
???txtr2.lmp
# Generated dehacked files
fdm_deh.lmp
p1_deh.lmp
p2_deh.lmp

12
lumps/Makefile Normal file
View File

@ -0,0 +1,12 @@
CPP=../scripts/simplecpp
all: fdm_deh.lmp p1_deh.lmp p2_deh.lmp
fdm_deh.lmp: dehacked.lmp
$(CPP) -DFREEDM < $< > $@
p1_deh.lmp: dehacked.lmp
$(CPP) -DPHASE1 < $< > $@
p2_deh.lmp: dehacked.lmp
$(CPP) -DPHASE2 < $< > $@

View File

@ -33,6 +33,7 @@ Sprite subnumber = 32773
# *allow-extended-strings*
[PARS]
#ifndef FREEDM
# Par times. The BEX format requires these to be specified in number
# of seconds, but for convenience we include the min:sec value in a
# comment. Comment also indicates when the run was done - ideally
@ -97,6 +98,41 @@ par 29 300 # 05:00 - Voros for v0.11 - 2017/02
par 30 60 # 01:00 - Voros for v0.11 - 2017/02
par 31 60 # 01:00 - Voros for v0.11 - 2017/02
par 32 210 # 03:30 - Voros for v0.11 - 2017/02
#else
# Par times don't matter so much for FreeDM, just set all to zero.
par 1 0
par 2 0
par 3 0
par 4 0
par 5 0
par 6 0
par 7 0
par 8 0
par 9 0
par 10 0
par 11 0
par 12 0
par 13 0
par 14 0
par 15 0
par 16 0
par 17 0
par 18 0
par 19 0
par 20 0
par 21 0
par 22 0
par 23 0
par 24 0
par 25 0
par 26 0
par 27 0
par 28 0
par 29 0
par 30 0
par 31 0
par 32 0
#endif
[STRINGS]
# Text shown on startup in Boom-compatible ports. This is all in
@ -215,6 +251,40 @@ CC_ARCH = necromancer
CC_SPIDER = large technospider
CC_CYBER = assault tripod
CC_HERO = savior of humanity
#ifdef FREEDM
HUSTR_1 = DM01: Tech Test
HUSTR_2 = DM02: Natural Station
HUSTR_3 = DM03: Issues of Claveria
HUSTR_4 = DM04: Steel
HUSTR_5 = DM05: Xindage Hideout
HUSTR_6 = DM06: Tomb of Ledemir
HUSTR_7 = DM07: Main Stronghold
HUSTR_8 = DM08: Artifact Base
HUSTR_9 = DM09: Forgotten Ruins
HUSTR_10 = DM10: Substation 45
HUSTR_11 = DM11: Gate for Hell
HUSTR_12 = DM12: Up 'n Down Canyon
HUSTR_13 = DM13: Sacred Dead
HUSTR_14 = DM14: Hazard Store
HUSTR_15 = DM15: AGM Ammo Depot
HUSTR_16 = DM16: Single Barreled
HUSTR_17 = DM17: Punk Tech
HUSTR_18 = DM18: Energy Facility
HUSTR_19 = DM19: Tech Isle
HUSTR_20 = DM20: Warehouse
HUSTR_21 = DM21: Water Recycling
HUSTR_22 = DM22: Fourplay
HUSTR_23 = DM23: Confrontation
HUSTR_24 = DM24: Flooded Base
HUSTR_25 = DM25: Mansion Yard
HUSTR_26 = DM26: All Green
HUSTR_27 = DM27: The Exile
HUSTR_28 = DM28: Weapons Factory
HUSTR_29 = DM29: Tag Deathmatch
HUSTR_30 = DM30: Last Man Standing
HUSTR_31 = DM31: Fort Macabre
HUSTR_32 = DM32: Aberration
#else
HUSTR_1 = MAP01: Hydroelectric Plant
HUSTR_2 = MAP02: Filtration Tunnels
HUSTR_3 = MAP03: Crude Processing Center
@ -247,6 +317,8 @@ HUSTR_29 = MAP29: Last Stand
HUSTR_30 = MAP30: Jaws of Defeat
HUSTR_31 = MAP31: Be Quiet
HUSTR_32 = MAP32: Not Sure
#endif
# Final Doom level strings, left blank
PHUSTR_1 = MAP01
PHUSTR_2 = MAP02
PHUSTR_3 = MAP03
@ -334,22 +406,6 @@ STSTR_BEHOLD = v=invuln, s=steroids, i=invis, r=hazard, a=map, l=night vision
NIGHTMARE = This is the highest skill level.\n\
Not recommended unless you're experienced.\n\n\
(Press Y to confirm)
#HUSTR_CHATMACRO1
#HUSTR_CHATMACRO2
#HUSTR_CHATMACRO3
#HUSTR_CHATMACRO4
#HUSTR_CHATMACRO5
#HUSTR_CHATMACRO6
#HUSTR_CHATMACRO7
#HUSTR_CHATMACRO8
#HUSTR_CHATMACRO9
#HUSTR_CHATMACRO0
#HUSTR_TALKTOSELF1
#HUSTR_TALKTOSELF2
#HUSTR_TALKTOSELF3
#HUSTR_TALKTOSELF4
#HUSTR_TALKTOSELF5
#HUSTR_MESSAGESENT
# End-of-chapter texts, now with a consistent story. Feel free to edit them.
E1TEXT = You've made it out of the outpost.\n\
But you're still stuck on this rock.\n\
@ -386,7 +442,7 @@ E3TEXT = The abomination explodes into\n\
rotted away for years in. Meaning\n\
you're still trapped.\n\n\
An AGM teleporter is here somehow.\n\
They must have been here then.\n\
They must have been here, then.\n\
The teleporter is set for a facility\n\
called "Double Impact," which is a\n\
ridiculous name. Who cares? All\n\
@ -481,18 +537,6 @@ C6TEXT = The world dissipitates around\n\
The monsters you fought before\n\
raise their weapons,\n\n\
aiming for your head.
#P1TEXT
#P2TEXT
#P3TEXT
#P4TEXT
#P5TEXT
#P6TEXT
#T1TEXT
#T2TEXT
#T3TEXT
#T4TEXT
#T5TEXT
#T6TEXT
BGFLATE1 = AQF051
BGFLATE2 = AQF054
BGFLATE3 = FLAT5_2
@ -503,13 +547,6 @@ BGFLAT20 = FLAT5_6
BGFLAT30 = SLIME13
BGFLAT15 = AQF004
BGFLAT31 = AQF021
#BGCASTCALL
#STARTUP1
#STARTUP2
#STARTUP3
#STARTUP4
#STARTUP5
#SAVEGAMENAME
# Obituary texts, for ZDoom-based ports.
OB_STEALTHBABY=%o thought %g saw a technospider.
OB_STEALTHVILE=%o thought %g saw a necromancer.
@ -560,7 +597,12 @@ OB_MPTELEFRAG=%o stood where %k was teleporting.
OB_RAILGUN=%o was railed by %k.
OB_MPBFG_MBF=%o had %p ass kicked by %k's SKAG!
# Redefine IDSPISPOPD to IDCLIP, so it works the same in Phase 1 and 2
# Probably unnecessary for anything thats not Chocolate Doom
#ifdef PHASE1
# Redefine the no-clipping cheats, so that IDCLIP may be used in Phase 1.
# IDSPISPOPD is swapped into the slot normally for Phase 2, in case of
# engines that would otherwise try to apply the cheat twice.
Cheat 0
No Clipping 1 = idclip
No Clipping 2 = idspispopd
#endif

View File

@ -1,409 +0,0 @@
Patch File for DeHackEd v3.0
Doom version = 19
Patch format = 6
# SPDX-License-Identifier: BSD-3-Clause
# This is a magic comment recognized by Chocolate Doom, so that the
# BEX [STRINGS] section below will be parsed:
#
# *allow-extended-strings*
[PARS]
# Par times don't matter so much for FreeDM, just set all to zero.
par 1 0
par 2 0
par 3 0
par 4 0
par 5 0
par 6 0
par 7 0
par 8 0
par 9 0
par 10 0
par 11 0
par 12 0
par 13 0
par 14 0
par 15 0
par 16 0
par 17 0
par 18 0
par 19 0
par 20 0
par 21 0
par 22 0
par 23 0
par 24 0
par 25 0
par 26 0
par 27 0
par 28 0
par 29 0
par 30 0
par 31 0
par 32 0
[STRINGS]
# Text shown on startup in Boom-compatible ports. This is all in
# STARTUP5, so if a mod replaces STARTUP1-4, it will still be shown.
STARTUP5============================================================================\nThis is FreeDM, the free content deathmatch FPS.\n\nFreeDM is freely redistributable under the terms of the modified BSD\nlicense. Check out the Freedoom website for more information:\n\n https://freedoom.github.io/\n============================================================================
GOTARMOR = picked up a light armor vest.
GOTMEGA = picked up a heavy armor vest.
GOTHTHBONUS = got a 1% health bonus.
GOTARMBONUS = got a 1% armor bonus.
GOTSTIM = picked up a small health pack.
GOTMEDINEED = found a large health pack, just in time!
GOTMEDIKIT = picked up a large health pack.
GOTSUPER = you got the overdrive sphere!
GOTBLUECARD = picked up a blue passcard.
GOTYELWCARD = picked up a yellow passcard.
GOTREDCARD = picked up a red passcard.
GOTBLUESKUL = picked up a blue skeleton key.
GOTYELWSKUL = picked up a yellow skeleton key.
GOTREDSKULL = picked up a red skeleton key.
GOTINVUL = you are untouchable!
GOTBERSERK = punch 'em to death!
GOTINVIS = you got the stealth sphere!
GOTSUIT = picked up a hazard suit.
GOTMAP = got the tactical survey map.
GOTVISOR = got the night vision goggles.
GOTMSPHERE = you got the ultra-overdrive sphere!
GOTCLIP = picked up an ammo clip.
GOTCLIPBOX = picked up a box of ammo.
GOTROCKET = picked up a missile.
GOTROCKBOX = picked up a crate of missiles.
GOTCELL = picked up a small energy recharge.
GOTCELLBOX = picked up a large energy recharge.
GOTSHELLS = picked up some shotgun shells.
GOTSHELLBOX = picked up a box of shotgun shells.
GOTBACKPACK = you found a backpack!
GOTBFG9000 = the SKAG 1337 ... time to kick some ass!
GOTCHAINGUN = you got the minigun!
GOTCHAINSAW = you got the angle grinder!
GOTLAUNCHER = you got the missile launcher!
GOTPLASMA = you got the polaric energy cannon!
GOTSHOTGUN = you got the pump-action shotgun!
GOTSHOTGUN2 = you got the double-barrelled shotgun!
PD_BLUEO = this object requires a blue key.
PD_REDO = this object requires a red key.
PD_YELLOWO = this object requires a yellow key.
PD_BLUEK = this door requires a blue key.
PD_REDK = this door requires a red key.
PD_YELLOWK = this door requires a yellow key.
PD_BLUEC = this door requires the blue passcard.
PD_REDC = this door requires the red passcard.
PD_YELLOWC = this door requires the yellow passcard.
PD_BLUES = this door requires the blue skeleton key.
PD_REDS = this door requires the red skeleton key.
PD_YELLOWS = this door requires the yellow skeleton key.
PD_ANY = this door requires any key.
PD_ALL3 = this door requires all three keys.
PD_ALL6 = this door requires all six keys!
HUSTR_E1M1 = E1M1
HUSTR_E1M2 = E1M2
HUSTR_E1M3 = E1M3
HUSTR_E1M4 = E1M4
HUSTR_E1M5 = E1M5
HUSTR_E1M6 = E1M6
HUSTR_E1M7 = E1M7
HUSTR_E1M8 = E1M8
HUSTR_E1M9 = E1M9
HUSTR_E2M1 = E2M1
HUSTR_E2M2 = E2M2
HUSTR_E2M3 = E2M3
HUSTR_E2M4 = E2M4
HUSTR_E2M5 = E2M5
HUSTR_E2M6 = E2M6
HUSTR_E2M7 = E2M7
HUSTR_E2M8 = E2M8
HUSTR_E2M9 = E2M9
HUSTR_E3M1 = E3M1
HUSTR_E3M2 = E3M2
HUSTR_E3M3 = E3M3
HUSTR_E3M4 = E3M4
HUSTR_E3M5 = E3M5
HUSTR_E3M6 = E3M6
HUSTR_E3M7 = E3M7
HUSTR_E3M8 = E3M8
HUSTR_E3M9 = E3M9
HUSTR_E4M1 = E4M1
HUSTR_E4M2 = E4M2
HUSTR_E4M3 = E4M3
HUSTR_E4M4 = E4M4
HUSTR_E4M5 = E4M5
HUSTR_E4M6 = E4M6
HUSTR_E4M7 = E4M7
HUSTR_E4M8 = E4M8
HUSTR_E4M9 = E4M9
CC_ZOMBIE = zombie
CC_SHOTGUN = shotgun zombie
CC_HEAVY = minigun zombie
CC_IMP = serpentipede
CC_DEMON = flesh worm
CC_LOST = deadflare
CC_CACO = trilobite
CC_HELL = pain bringer
CC_BARON = pain lord
CC_ARACH = technospider
CC_PAIN = summoner
CC_REVEN = dark soldier
CC_MANCU = combat slug
CC_ARCH = necromancer
CC_SPIDER = large technospider
CC_CYBER = assault tripod
CC_HERO = savior of humanity
HUSTR_1 = DM01: Tech Test
HUSTR_2 = DM02: Natural Station
HUSTR_3 = DM03: Issues of Claveria
HUSTR_4 = DM04: Steel
HUSTR_5 = DM05: Xindage Hideout
HUSTR_6 = DM06: Tomb of Ledemir
HUSTR_7 = DM07: Main Stronghold
HUSTR_8 = DM08: Artifact Base
HUSTR_9 = DM09: Forgotten Ruins
HUSTR_10 = DM10: Substation 45
HUSTR_11 = DM11: Gate for Hell
HUSTR_12 = DM12: Up 'n Down Canyon
HUSTR_13 = DM13: Sacred Dead
HUSTR_14 = DM14: Hazard Store
HUSTR_15 = DM15: AGM Ammo Depot
HUSTR_16 = DM16: Single Barreled
HUSTR_17 = DM17: Punk Tech
HUSTR_18 = DM18: Energy Facility
HUSTR_19 = DM19: Tech Isle
HUSTR_20 = DM20: Warehouse
HUSTR_21 = DM21: Water Recycling
HUSTR_22 = DM22: Fourplay
HUSTR_23 = DM23: Confrontation
HUSTR_24 = DM24: Flooded Base
HUSTR_25 = DM25: Mansion Yard
HUSTR_26 = DM26: All Green
HUSTR_27 = DM27: The Exile
HUSTR_28 = DM28: Weapons Factory
HUSTR_29 = DM29: Tag Deathmatch
HUSTR_30 = DM30: Last Man Standing
HUSTR_31 = DM31: Fort Macabre
HUSTR_32 = DM32: Aberration
PHUSTR_1 = DM01
PHUSTR_2 = DM02
PHUSTR_3 = DM03
PHUSTR_4 = DM04
PHUSTR_5 = DM05
PHUSTR_6 = DM06
PHUSTR_7 = DM07
PHUSTR_8 = DM08
PHUSTR_9 = DM09
PHUSTR_10 = DM10
PHUSTR_11 = DM11
PHUSTR_12 = DM12
PHUSTR_13 = DM13
PHUSTR_14 = DM14
PHUSTR_15 = DM15
PHUSTR_16 = DM16
PHUSTR_17 = DM17
PHUSTR_18 = DM18
PHUSTR_19 = DM19
PHUSTR_20 = DM20
PHUSTR_21 = DM21
PHUSTR_22 = DM22
PHUSTR_23 = DM23
PHUSTR_24 = DM24
PHUSTR_25 = DM25
PHUSTR_26 = DM26
PHUSTR_27 = DM27
PHUSTR_28 = DM28
PHUSTR_29 = DM29
PHUSTR_30 = DM30
PHUSTR_31 = DM31
PHUSTR_32 = DM32
THUSTR_1 = DM01
THUSTR_2 = DM02
THUSTR_3 = DM03
THUSTR_4 = DM04
THUSTR_5 = DM05
THUSTR_6 = DM06
THUSTR_7 = DM07
THUSTR_8 = DM08
THUSTR_9 = DM09
THUSTR_10 = DM10
THUSTR_11 = DM11
THUSTR_12 = DM12
THUSTR_13 = DM13
THUSTR_14 = DM14
THUSTR_15 = DM15
THUSTR_16 = DM16
THUSTR_17 = DM17
THUSTR_18 = DM18
THUSTR_19 = DM19
THUSTR_20 = DM20
THUSTR_21 = DM21
THUSTR_22 = DM22
THUSTR_23 = DM23
THUSTR_24 = DM24
THUSTR_25 = DM25
THUSTR_26 = DM26
THUSTR_27 = DM27
THUSTR_28 = DM28
THUSTR_29 = DM29
THUSTR_30 = DM30
THUSTR_31 = DM31
THUSTR_32 = DM32
HUSTR_PLRGREEN = g:
HUSTR_PLRINDIGO = i:
HUSTR_PLRBROWN = b:
HUSTR_PLRRED = r:
AMSTR_FOLLOWON = map following player
AMSTR_FOLLOWOFF = map no longer following player
AMSTR_GRIDON = map grid on
AMSTR_GRIDOFF = map grid off
AMSTR_MARKEDSPOT = added map bookmark
AMSTR_MARKSCLEARED = all map bookmarks cleared.
STSTR_MUS = music changed
STSTR_NOMUS = unknown music track?
STSTR_DQDON = god mode on
STSTR_DQDOFF = god mode off
STSTR_KFAADDED = keys, weapons and ammo added.
STSTR_FAADDED = weapons and ammo added.
STSTR_NCON = noclip on
STSTR_NCOFF = noclip off
STSTR_CHOPPERS = vroom!
STSTR_BEHOLD = v=invuln, s=steroids, i=invis, r=hazard, a=map, l=night vision
NIGHTMARE = this is the highest skill level.\n\
not recommended unless you're experienced.\n\n\
(press y to confirm)
#HUSTR_CHATMACRO1
#HUSTR_CHATMACRO2
#HUSTR_CHATMACRO3
#HUSTR_CHATMACRO4
#HUSTR_CHATMACRO5
#HUSTR_CHATMACRO6
#HUSTR_CHATMACRO7
#HUSTR_CHATMACRO8
#HUSTR_CHATMACRO9
#HUSTR_CHATMACRO0
#HUSTR_TALKTOSELF1
#HUSTR_TALKTOSELF2
#HUSTR_TALKTOSELF3
#HUSTR_TALKTOSELF4
#HUSTR_TALKTOSELF5
#HUSTR_MESSAGESENT
# For FreeDM we shouldn't be seeing these...
E1TEXT = You've finished chapter 1!
E2TEXT = You've finished chapter 2!
E3TEXT = You've finished chapter 3!
E4TEXT = You've finished chapter 4!
# After MAP06, before MAP07:
C1TEXT = You're playing FreeDM, the Freedoom\n\
deathmatch spinoff project.\n\n\
For more information about Freedoom\n\
and FreeDM, see:\n\n\
https://freedoom.github.io/
# After MAP11, before MAP12:
C2TEXT = You're playing FreeDM, the Freedoom\n\
deathmatch spinoff project.\n\n\
For more information about Freedoom\n\
and FreeDM, see:\n\n\
https://freedoom.github.io/
# After MAP20, before MAP21:
C3TEXT = You're playing FreeDM, the Freedoom\n\
deathmatch spinoff project.\n\n\
For more information about Freedoom\n\
and FreeDM, see:\n\n\
https://freedoom.github.io/
# After MAP30 (endgame text):
C4TEXT = Thank you for playing FreeDM, the\n\
Freedoom deathmatch spinoff project.\n\n\
For more information about Freedoom\n\
and FreeDM, see:\n\n\
https://freedoom.github.io/
# Before MAP31 (secret level #1):
C5TEXT = You're playing FreeDM, the Freedoom\n\
deathmatch spinoff project.\n\n\
For more information about Freedoom\n\
and FreeDM, see:\n\n\
https://freedoom.github.io/
# Before MAP32 (secret level #2):
C6TEXT = You're playing FreeDM, the Freedoom\n\
deathmatch spinoff project.\n\n\
For more information about Freedoom\n\
and FreeDM, see:\n\n\
https://freedoom.github.io/
#P1TEXT
#P2TEXT
#P3TEXT
#P4TEXT
#P5TEXT
#P6TEXT
#T1TEXT
#T2TEXT
#T3TEXT
#T4TEXT
#T5TEXT
#T6TEXT
#BGFLATE1
#BGFLATE2
#BGFLATE3
#BGFLATE4
BGFLAT06 = AQF057
BGFLAT11 = AQF057
BGFLAT20 = AQF057
BGFLAT30 = AQF057
BGFLAT15 = AQF057
BGFLAT31 = AQF057
#BGCASTCALL
#STARTUP1
#STARTUP2
#STARTUP3
#STARTUP4
#STARTUP5
#SAVEGAMENAME
# Obituary texts, for ZDoom-based ports.
OB_STEALTHBABY=%o thought %g saw a technospider.
OB_STEALTHVILE=%o thought %g saw a necromancer.
OB_STEALTHBARON=%o thought %g saw a pain lord.
OB_STEALTHCACO=%o thought %g saw a trilobite.
OB_STEALTHCHAINGUY=%o thought %g saw a minigun zombie.
OB_STEALTHDEMON=%o thought %g saw a flesh worm.
OB_STEALTHKNIGHT=%o thought %g saw a pain bringer.
OB_STEALTHIMP=%o thought %g saw a serpentipede.
OB_STEALTHFATSO=%o thought %g saw a combat slug.
OB_STEALTHUNDEAD=%o thought %g saw a dark soldier.
OB_STEALTHSHOTGUY=%o thought %g saw a shotgun zombie.
OB_STEALTHZOMBIE=%o thought %g saw a zombie.
OB_UNDEADHIT=%o was punched by a dark soldier.
OB_IMPHIT=%o was slashed by a serpentipede.
OB_CACOHIT=%o got too close to a trilobite.
OB_DEMONHIT=%o was bitten by a flesh worm.
OB_SPECTREHIT=%o was eaten by a stealth worm.
OB_BARONHIT=%o was torn open by a pain lord.
OB_KNIGHTHIT=%o was gutted by a pain bringer.
OB_ZOMBIE=%o was killed by a zombie.
OB_SHOTGUY=%o was gunned down by a shotgun zombie.
OB_VILE=%o was incinerated by a necromancer.
OB_UNDEAD=%o couldn't evade the dark soldier's fireball.
OB_FATSO=%o was blasted by a combat slug.
OB_CHAINGUY=%o was perforated by a minigun zombie.
OB_SKULL=%o was slammed by a deadflare.
OB_IMP=%o was burned by a serpentipede.
OB_CACO=%o was smitten by a trilobite.
OB_BARON=%o was bruised by a pain lord.
OB_KNIGHT=%o was splayed by a pain bringer.
OB_SPIDER=%o stood in awe of the large technospider.
OB_BABY=%o let a technospider get %h.
OB_CYBORG=%o was splattered by an assault tripod.
OB_WOLFSS=%o met a sailor.
OB_MPFIST=%k punched %o to death.
OB_MPCHAINSAW=%o was shredded by %k's angle grinder.
OB_MPPISTOL=%o was tickled by %k's handgun.
OB_MPSHOTGUN=%o chewed on %k's boomstick.
OB_MPSSHOTGUN=%k swapped two barrels upside %o's head.
OB_MPCHAINGUN=%o was perforated by %k's minigun.
OB_MPROCKET=%o was mutilated by %k's missile.
OB_MPR_SPLASH=%o couldn't dodge %k's missile.
OB_MPPLASMARIFLE=%o swallowed too much of %k's polaric energy.
OB_MPBFG_BOOM=%o had %p ass kicked by %k's SKAG!
OB_MPBFG_SPLASH=%o couldn't hide from %k's SKAG.
OB_MPTELEFRAG=%o stood where %k was teleporting.
OB_RAILGUN=%o was railed by %k.
OB_MPBFG_MBF=%o had %p ass kicked by %k's SKAG!