From 274c693a70a5c6aa534e010329c1b02ab4a231b1 Mon Sep 17 00:00:00 2001 From: Randy Heit <> Date: Mon, 15 Mar 1999 00:00:00 +0000 Subject: [PATCH] ZDoom 1.17b. --- code/Am_map.c | 8 +- code/C_cmds.c | 44 +- code/D_dehack.c | 14 +- code/D_main.c | 703 ++-- code/D_net.c | 36 +- code/D_player.h | 3 +- code/Doomdef.h | 1 + code/Doomstat.c | 4 +- code/Doomstat.h | 24 +- code/F_finale.c | 60 +- code/F_wipe.c | 456 ++- code/G_game.c | 28 +- code/G_level.c | 27 +- code/Info.c | 543 ++-- code/Info.h | 3 +- code/M_menu.c | 155 +- code/M_misc.c | 98 +- code/M_misc.h | 7 +- code/Makefile.dj | 34 +- code/P_ceilng.c | 18 +- code/P_doors.c | 2 +- code/P_enemy.c | 99 +- code/P_floor.c | 10 +- code/P_inter.c | 13 +- code/P_lights.c | 6 +- code/P_lnspec.c | 2 +- code/P_lnspec.h | 4 +- code/P_local.h | 5 - code/P_map.c | 4 - code/P_maputl.c | 110 +- code/P_mobj.c | 176 +- code/P_mobj.h | 167 +- code/P_plats.c | 19 +- code/P_pspr.c | 9 +- code/P_saveg.c | 52 +- code/P_setup.c | 21 +- code/P_sight.c | 2 +- code/P_spec.c | 76 +- code/P_spec.h | 7 +- code/P_switch.c | 29 +- code/P_user.c | 2 +- code/P_xlat.c | 7 +- code/R_bsp.c | 10 +- code/R_data.c | 14 +- code/R_defs.h | 3 + code/R_draw.c | 164 +- code/R_draw.h | 4 +- code/R_main.c | 14 +- code/R_plane.c | 94 +- code/R_plane.h | 28 +- code/R_segs.c | 4 +- code/R_things.c | 147 +- code/R_things.h | 2 +- code/S_sound.c | 263 +- code/S_sound.h | 5 +- code/St_new.c | 48 +- code/St_stuff.c | 10 +- code/Tmap.nas | 200 -- code/V_video.c | 257 +- code/V_video.h | 4 +- code/W_wad.c | 457 +-- code/c_consol.c | 40 +- code/c_varini.c | 6 +- code/d_items.c | 4 +- code/d_main.h | 5 - code/djgpp/I_sound.c | 27 +- code/djgpp/I_system.c | 32 +- code/djgpp/I_system.h | 3 +- code/docs/Rh-log.txt | 160 + code/doominfo.lmp | 3136 ++++++++++++++++++ code/f_wipe.h | 38 +- code/gi.c | 206 ++ code/gi.h | 64 + code/hexninfo.lmp | 6963 ++++++++++++++++++++++++++++++++++++++++ code/m_option.c | 23 +- code/p_effect.c | 2 +- code/p_effect.h | 1 + code/p_things.c | 7 +- code/r_drawt.c | 189 +- code/ticinfo.lmp | 3173 ++++++++++++++++++ code/v_draw.c | 98 +- code/version.h | 2 +- code/w_wad.h | 6 +- code/win32/I_input.c | 4 +- code/win32/I_main.c | 14 +- code/win32/I_net.c | 767 +++-- code/win32/I_sound.c | 27 +- code/win32/I_system.c | 103 +- code/win32/I_system.h | 5 +- code/win32/I_video.cpp | 10 + code/win32/zdoom.rc | 8 +- code/zdoom.dsp | 29 +- readme.txt | 4 +- 93 files changed, 17288 insertions(+), 2684 deletions(-) create mode 100644 code/doominfo.lmp create mode 100644 code/gi.c create mode 100644 code/gi.h create mode 100644 code/hexninfo.lmp create mode 100644 code/ticinfo.lmp diff --git a/code/Am_map.c b/code/Am_map.c index 5ad5da0dc4..ea70b8c69e 100644 --- a/code/Am_map.c +++ b/code/Am_map.c @@ -558,14 +558,18 @@ void AM_unloadPics(void) int i; for (i = 0; i < 10; i++) - Z_ChangeTag (marknums[i], PU_CACHE); + if (marknums[i]) + { + Z_ChangeTag (marknums[i], PU_CACHE); + marknums[i] = NULL; + } } void AM_clearMarks(void) { int i; - for (i=0;i= 0; i--) markpoints[i].x = -1; // means empty markpointnum = 0; } diff --git a/code/C_cmds.c b/code/C_cmds.c index 998ce43263..b20b4eef0e 100644 --- a/code/C_cmds.c +++ b/code/C_cmds.c @@ -25,6 +25,7 @@ #include "z_zone.h" #include "w_wad.h" #include "g_level.h" +#include "gi.h" extern FILE *Logfile; @@ -229,11 +230,12 @@ void Cmd_idclev (player_t *plyr, int argc, char **argv) if ((argc > 1) && (*(argv[1] + 2) == 0) && *(argv[1] + 1) && *argv[1]) { int epsd, map; char *buf = argv[1]; + char *mapname; buf[0] -= '0'; buf[1] -= '0'; - if (gamemode == commercial) { + if (gameinfo.flags & GI_MAPxx) { epsd = 1; map = buf[0]*10 + buf[1]; } else { @@ -242,28 +244,13 @@ void Cmd_idclev (player_t *plyr, int argc, char **argv) } // Catch invalid maps. - if (epsd < 1) - return; - - if (map < 1) - return; - - if ((gamemode == retail) && ((epsd > 4) || (map > 9))) - return; - - if ((gamemode == registered) && ((epsd > 3) || (map > 9))) - return; - - if ((gamemode == shareware) && ((epsd > 1) || (map > 9))) - return; - - if ((gamemode == commercial) && (( epsd > 1) || (map > 34))) + mapname = CalcMapName (epsd, map); + if (W_CheckNumForName (mapname) == -1) return; // So be it. Printf (PRINT_HIGH, "%s\n", STSTR_CLEV); - - G_DeferedInitNew (CalcMapName (epsd, map)); + G_DeferedInitNew (mapname); } } @@ -290,21 +277,28 @@ void Cmd_idmus (player_t *plyr, int argc, char **argv) char *map; int l; - if (argc > 1) { - if (gamemode == commercial) { + if (argc > 1) + { + if (gameinfo.flags & GI_MAPxx) + { l = atoi (argv[1]); if (l <= 99) map = CalcMapName (0, l); - else { + else + { Printf (PRINT_HIGH, "%s\n", STSTR_NOMUS); return; } - } else { + } + else + { map = CalcMapName (argv[1][0] - '0', argv[1][1] - '0'); } - if ( (info = FindLevelInfo (map)) ) { - if (info->music[0]) { + if ( (info = FindLevelInfo (map)) ) + { + if (info->music[0]) + { S_ChangeMusic (info->music, 1); Printf (PRINT_HIGH, "%s\n", STSTR_MUS); } diff --git a/code/D_dehack.c b/code/D_dehack.c index 04e2c0385d..4069c09cd4 100644 --- a/code/D_dehack.c +++ b/code/D_dehack.c @@ -754,6 +754,7 @@ static int PatchThing (int thingNum) { "Mass", myoffsetof(mobjinfo_t,mass) }, { "Missile damage", myoffsetof(mobjinfo_t,damage) }, { "Respawn frame", myoffsetof(mobjinfo_t,raisestate) }, + { "Translucency", myoffsetof(mobjinfo_t,translucency) }, { NULL, } }; @@ -849,11 +850,6 @@ static int PatchThing (int thingNum) Printf (PRINT_HIGH, "Thing %d out of range.\n", thingNum + 1); } - // Turn off transparency for the mobj, since original DOOM - // didn't have any. If some is wanted, let the patch specify it. - // Uncomment this if you want to make it so. - //info->flags &= ~MF_TRANSLUCBITS; - while ((result = GetLine ()) == 1) { int sndmap = atoi (Line2); @@ -916,7 +912,13 @@ static int PatchThing (int thingNum) } } if (vchanged) + { info->flags = value; + // Bit flags are no longer used to specify translucency. + // This is just a temporary hack. + if (info->flags & 0x60000000) + info->translucency = (info->flags & 0x60000000) >> 15; + } if (v2changed) info->flags2 = value2; DPrintf ("Bits: %d,%d (0x%08x,0x%08x)\n", info->flags, info->flags2, @@ -1174,7 +1176,7 @@ static int PatchMisc (int dummy) { "Max Armor", myoffsetof(struct DehInfo,MaxArmor) }, { "Green Armor Class", myoffsetof(struct DehInfo,GreenAC) }, { "Blue Armor Class", myoffsetof(struct DehInfo,BlueAC) }, - { "Max Soulsphere", myoffsetof(struct DehInfo,BlueAC) }, + { "Max Soulsphere", myoffsetof(struct DehInfo,MaxSoulsphere) }, { "Soulsphere Health", myoffsetof(struct DehInfo,SoulsphereHealth) }, { "Megasphere Health", myoffsetof(struct DehInfo,MegasphereHealth) }, { "God Mode Health", myoffsetof(struct DehInfo,GodHealth) }, diff --git a/code/D_main.c b/code/D_main.c index eaef531258..13137aa728 100644 --- a/code/D_main.c +++ b/code/D_main.c @@ -24,163 +24,151 @@ // //----------------------------------------------------------------------------- +// HEADER FILES ------------------------------------------------------------ #ifdef _WIN32 #include -#define mkdir(a,b) mkdir (a) +#define mkdir(a,b) _mkdir (a) #else #include #endif - #include "m_alloc.h" #include "minilzo.h" - #include "doomdef.h" #include "doomstat.h" - #include "dstrings.h" - #include "z_zone.h" #include "w_wad.h" #include "s_sound.h" #include "v_video.h" - #include "f_finale.h" #include "f_wipe.h" - #include "m_argv.h" #include "m_misc.h" #include "m_menu.h" - #include "c_consol.h" #include "c_cmds.h" #include "c_dispch.h" - #include "i_system.h" #include "i_sound.h" #include "i_video.h" - #include "g_game.h" - #include "hu_stuff.h" #include "wi_stuff.h" #include "st_stuff.h" #include "am_map.h" - #include "p_setup.h" #include "r_local.h" #include "r_sky.h" - - #include "d_main.h" #include "d_dehack.h" - #include "cmdlib.h" - #include "s_sound.h" - #include "m_swap.h" +#include "v_text.h" +#include "gi.h" -cvar_t *fraglimit; -cvar_t *timelimit; +// MACROS ------------------------------------------------------------------ -cvar_t *turbo; +// TYPES ------------------------------------------------------------------- + +// EXTERNAL FUNCTION PROTOTYPES -------------------------------------------- extern void TurboCallback (cvar_t *); +extern void M_RestoreMode (void); +extern void R_ExecuteSetViewSize (void); +extern void P_MobjThinker (mobj_t *mobj); -// -// D-DoomLoop() -// Not a globally visible function, -// just included for source reference, -// called by D_DoomMain, never exits. -// Manages timing and IO, -// calls all ?_Responder, ?_Ticker, and ?_Drawer, -// calls I_GetTime, I_StartFrame, and I_StartTic -// -void D_DoomLoop (void); - - -wadlist_t *wadfiles; // [RH] remove limit on # of loaded wads -wadlist_t **wadtail = &wadfiles; - -BOOL devparm; // started game with -devparm - -int NoWipe; // [RH] Allow wipe? (Needs to be set each time) - -BOOL drone; - -BOOL singletics = false; // debug flag to cancel adaptiveness - - -char *D_DrawIcon; // [RH] Patch name of icon to draw on next refresh - - -extern BOOL inhelpscreens; - -char startmap[8]; -BOOL autostart; - -FILE* debugfile; - -BOOL advancedemo; - - - - -char wadfile[1024]; // primary wad file - +// PUBLIC FUNCTION PROTOTYPES ---------------------------------------------- void D_CheckNetGame (void); void D_ProcessEvents (void); void G_BuildTiccmd (ticcmd_t* cmd); void D_DoAdvanceDemo (void); +// PRIVATE FUNCTION PROTOTYPES --------------------------------------------- +void D_DoomLoop (void); +static void D_AddFile (char *file); +static void DoLooseFiles (void); + +// EXTERNAL DATA DECLARATIONS ---------------------------------------------- + +extern gameinfo_t SharewareGameInfo; +extern gameinfo_t RegisteredGameInfo; +extern gameinfo_t RetailGameInfo; +extern gameinfo_t CommercialGameInfo; +extern gameinfo_t HereticGameInfo; +extern gameinfo_t HereticSWGameInfo; +extern gameinfo_t HexenGameInfo; + +extern int testingmode; +extern BOOL setsizeneeded; +extern BOOL setmodeneeded; +extern int NewWidth, NewHeight, NewID, DisplayID; +extern cvar_t *st_scale; +extern BOOL gameisdead; +extern BOOL demorecording; +extern BOOL M_DemoNoPlay; // [RH] if true, then skip any demos in the loop +extern thinker_t thinkercap; + +// PUBLIC DATA DEFINITIONS ------------------------------------------------- + +cvar_t *fraglimit; +cvar_t *timelimit; +cvar_t *turbo; +wadlist_t *wadfiles; // [RH] remove limit on # of loaded wads +BOOL devparm; // started game with -devparm +char *D_DrawIcon; // [RH] Patch name of icon to draw on next refresh +int NoWipe; // [RH] Allow wipe? (Needs to be set each time) +BOOL singletics = false; // debug flag to cancel adaptiveness +char startmap[8]; +BOOL autostart; +BOOL advancedemo; +FILE *debugfile; +event_t events[MAXEVENTS]; +int eventhead; +int eventtail; +gamestate_t wipegamestate = GS_DEMOSCREEN; // can be -1 to force a wipe +char errortext[2048]; +jmp_buf errorjmp; +BOOL errorjmpable; +screen_t page; + +// PRIVATE DATA DEFINITIONS ------------------------------------------------ + +static wadlist_t **wadtail = &wadfiles; +static int demosequence; +static int pagetic; + +// CODE -------------------------------------------------------------------- + +//========================================================================== // -// EVENT HANDLING +// D_ProcessEvents // +// Send all the events of the given timestamp down the responder chain. // Events are asynchronous inputs generally generated by the game user. // Events can be discarded if no responder claims them // -event_t events[MAXEVENTS]; -int eventhead; -int eventtail; - - -// -// D_PostEvent -// Called by the I/O functions when input is detected -// -void D_PostEvent (const event_t* ev) -{ - events[eventhead] = *ev; - eventhead = (++eventhead)&(MAXEVENTS-1); -} - - -// -// D_ProcessEvents -// Send all the events of the given timestamp down the responder chain -// - -// [RH] Stuff for screenmode testing -extern int testingmode; -extern void M_RestoreMode (void); +//========================================================================== void D_ProcessEvents (void) { event_t *ev; // [RH] If testing mode, do not accept input until test is over - if (testingmode) { - if (testingmode <= I_GetTime()) { + if (testingmode) + { + if (testingmode <= I_GetTime()) + { M_RestoreMode (); } return; } - for ( ; eventtail != eventhead ; eventtail = (++eventtail)&(MAXEVENTS-1) ) + for (; eventtail != eventhead ; eventtail = (++eventtail)&(MAXEVENTS-1)) { ev = &events[eventtail]; if (C_Responder (ev)) @@ -191,10 +179,30 @@ void D_ProcessEvents (void) } } +//========================================================================== +// +// D_PostEvent +// +// Called by the I/O functions when input is detected. +// +//========================================================================== +void D_PostEvent (const event_t* ev) +{ + events[eventhead] = *ev; + eventhead = (++eventhead)&(MAXEVENTS-1); +} + +//========================================================================== +// +// DMFlagsCallback +// // [RH] Each time dmflags is changed, this function is called and // transforms it into an integer so that we don't need to make // the conversion each time we check its value. +// +//========================================================================== + void DMFlagsCallback (cvar_t *var) { dmflags = (int)var->value; @@ -208,18 +216,15 @@ void DMFlagsCallback (cvar_t *var) AddCommandString ("centerview"); } - +//========================================================================== +// // // D_Display -// draw current display, possibly wiping it from the previous // +// Draw current display, possibly wiping it from the previous +// +//========================================================================== -// wipegamestate can be set to -1 to force a wipe on the next draw -gamestate_t wipegamestate = GS_DEMOSCREEN; -extern BOOL setsizeneeded, setmodeneeded; -extern int NewWidth, NewHeight, NewID, DisplayID; -extern cvar_t *st_scale; -void R_ExecuteSetViewSize (void); void D_Display (void) { BOOL wipe; @@ -228,7 +233,8 @@ void D_Display (void) return; // for comparative timing / profiling // [RH] change the screen mode if needed - if (setmodeneeded) { + if (setmodeneeded) + { int oldwidth = screen.width; int oldheight = screen.height; int oldid = DisplayID; @@ -269,7 +275,7 @@ void D_Display (void) // save the current screen if about to wipe BorderNeedRefresh = true; wipe = true; - wipe_StartScreen(0, 0, screen.width, screen.height); + wipe_StartScreen (); wipegamestate = gamestate; } else @@ -277,7 +283,8 @@ void D_Display (void) wipe = false; } - switch (gamestate) { + switch (gamestate) + { case GS_FULLCONSOLE: C_DrawConsole (); M_Drawer (); @@ -321,11 +328,13 @@ void D_Display (void) } // [RH] Draw icon, if any - if (D_DrawIcon) { + if (D_DrawIcon) + { int lump = W_CheckNumForName (D_DrawIcon); D_DrawIcon = NULL; - if (lump >= 0) { + if (lump >= 0) + { patch_t *p = W_CacheLumpNum (lump, PU_CACHE); V_DrawPatchIndirect (160-SHORT(p->width)/2, 100-SHORT(p->height)/2, @@ -336,17 +345,20 @@ void D_Display (void) NetUpdate (); // send out any new accumulation - if (!wipe) { + if (!wipe) + { // normal update C_DrawConsole (); // draw console M_Drawer (); // menu is drawn even on top of everything I_FinishUpdate (); // page flip or blit buffer - } else { + } + else + { // wipe update int wipestart, nowtime, tics; BOOL done; - wipe_EndScreen(0, 0, screen.width, screen.height); + wipe_EndScreen (); I_FinishUpdateNoBlit (); wipestart = I_GetTime () - 1; @@ -360,8 +372,7 @@ void D_Display (void) } while (!tics); wipestart = nowtime; I_BeginUpdate (); - done = wipe_ScreenWipe(wipe_Melt, - 0, 0, screen.width, screen.height, tics); + done = wipe_ScreenWipe (tics); C_DrawConsole (); M_Drawer (); // menu is drawn even on top of wipes I_FinishUpdate (); // page flip or blit buffer @@ -369,15 +380,11 @@ void D_Display (void) } } - +//========================================================================== // -// [RH] D_ErrorLoop +// D_ErrorLoop // -char errortext[2048]; -jmp_buf errorjmp; -BOOL errorjmpable; - -extern BOOL gameisdead; +//========================================================================== static void STACK_ARGS godead (void) { @@ -419,11 +426,14 @@ void D_ErrorLoop (void) } } - +//========================================================================== // -// D_DoomLoop +// D_DoomLoop // -extern BOOL demorecording; +// Manages timing and IO, calls all ?_Responder, ?_Ticker, and ?_Drawer, +// calls I_GetTime, I_StartFrame, and I_StartTic +// +//========================================================================== void D_DoomLoop (void) { @@ -460,83 +470,86 @@ void D_DoomLoop (void) } } - - -// -// DEMO LOOP -// -int demosequence; -int pagetic; -char *pagename; - - +//========================================================================== // // D_PageTicker -// Handles timing for warped projection // +//========================================================================== + void D_PageTicker (void) { if (--pagetic < 0) D_AdvanceDemo (); } - - +//========================================================================== // // D_PageDrawer // +//========================================================================== + void D_PageDrawer (void) { - V_DrawPatchIndirect (0,0, &screen, W_CacheLumpName(pagename, PU_CACHE)); + if (page.impdata) + { + V_Blit (&page, 0, 0, page.width, page.height, + &screen, 0, 0, screen.width, screen.height); + } + else + { + V_Clear (0, 0, screen.width, screen.height, &screen, 0); + V_PrintStr (0, 0, "Page graphic goes here", 22); + } } - +//========================================================================== // // D_AdvanceDemo +// // Called after each demo or intro demosequence finishes // +//========================================================================== + void D_AdvanceDemo (void) { advancedemo = true; } - +//========================================================================== // -// This cycles through the demo sequences. -// FIXME - version dependend demo numbers? +// D_DoAdvanceDemo // -// [RH] If M_DemoNoPlay is true, then any -// demos are skipped. -extern BOOL M_DemoNoPlay; +//========================================================================== void D_DoAdvanceDemo (void) { - static char *pages[2][3] = { - { "CREDIT", "TITLEPIC", "HELP2" }, - { "CREDIT", "TITLEPIC", "CREDIT" } - }; static char demoname[8] = "DEMO1"; static int democount = 0; static int pagecount; + char *pagename = NULL; - char **page; players[consoleplayer].playerstate = PST_LIVE; // not reborn advancedemo = false; usergame = false; // no save / end game here paused = false; gameaction = ga_nothing; - if (gamemode == retail || gamemode == commercial) - { - page = pages[1]; - } - else - { - page = pages[0]; - } - switch (demosequence) { + case 3: + if (gameinfo.advisoryTime) + { + V_LockScreen (&page); + pagetic = gameinfo.advisoryTime; + if (page.impdata) + V_DrawPatch (4, 160, &page, W_CacheLumpName ("ADVISOR", PU_CACHE)); + V_UnlockScreen (&page); + demosequence = 1; + pagetic = (int)(gameinfo.advisoryTime * TICRATE); + break; + } + // fall through to case 1 if no advisory notice + case 1: if (!M_DemoNoPlay) { @@ -560,44 +573,68 @@ void D_DoAdvanceDemo (void) default: case 0: gamestate = GS_DEMOSCREEN; - pagename = "TITLEPIC"; - if (gamemode == commercial) - { - pagetic = TICRATE * 11; - if (HexenHack) - { // [RH] :-) - S_StartMusic ("hexen"); - } - else - { - S_StartMusic ("D_DM2TTL"); - } - } - else - { - pagetic = TICRATE * 5; - S_StartMusic ("D_INTRO"); - } - demosequence = 1; + pagename = gameinfo.titlePage; + pagetic = (int)(gameinfo.titleTime * TICRATE); + S_StartMusic (gameinfo.titleMusic); + demosequence = 3; pagecount = 0; C_HideConsole (); break; case 2: - pagetic = (TICRATE * 200) / 35; + pagetic = (int)(gameinfo.pageTime * TICRATE); gamestate = GS_DEMOSCREEN; - pagename = page[pagecount]; - pagecount = (pagecount+1) % 3; + if (pagecount == 0) + pagename = gameinfo.creditPage1; + else + pagename = gameinfo.creditPage2; + pagecount ^= 1; demosequence = 1; break; } + + if (pagename) + { + int width, height; + patch_t *data; + + if (gameinfo.flags & GI_PAGESARERAW) + { + data = W_CacheLumpName (pagename, PU_CACHE); + width = 320; + height = 200; + } + else + { + data = W_CacheLumpName (pagename, PU_CACHE); + width = SHORT(data->width); + height = SHORT(data->height); + } + + if (page.impdata && (page.width != width || page.height != height)) + V_FreeScreen (&page); + + if (page.impdata == NULL) + V_AllocScreen (&page, width, height, 8); + + if (page.impdata) + { + V_LockScreen (&page); + if (gameinfo.flags & GI_PAGESARERAW) + V_DrawBlock (0, 0, &page, 320, 200, (byte *)data); + else + V_DrawPatch (0, 0, &page, data); + V_UnlockScreen (&page); + } + } } - - +//========================================================================== // // D_StartTitle // +//========================================================================== + void D_StartTitle (void) { gameaction = ga_nothing; @@ -605,9 +642,14 @@ void D_StartTitle (void) D_AdvanceDemo (); } +//========================================================================== +// +// Cmd_Endgame // // [RH] Quit the current game and go to fullscreen console // +//========================================================================== + void Cmd_Endgame (player_t *plyr, int argc, char **argv) { if (!netgame) { @@ -616,12 +658,12 @@ void Cmd_Endgame (player_t *plyr, int argc, char **argv) } } - - - +//========================================================================== // // D_AddFile // +//========================================================================== + void D_AddFile (char *file) { wadlist_t *wad = Z_Malloc (sizeof(*wad) + strlen(file), PU_STATIC, 0); @@ -632,13 +674,17 @@ void D_AddFile (char *file) wadtail = &wad->next; } +//========================================================================== // // IdentifyVersion +// // Checks availability of IWAD files by name, // to determine whether registered/commercial features // should be executed (notably loading PWAD's). // [RH] Rewritten to recognize the IWAD by its contents, not its name. // +//========================================================================== + static const char *IdentifyVersion (void) { const char *titlestring = "Public DOOM - "; @@ -673,7 +719,8 @@ static const char *IdentifyVersion (void) // See if the user wants to use a different iwad instead iwadindex = M_CheckParm ("-iwad"); - if (iwadindex && iwadindex < myargc - 1) { + if (iwadindex && iwadindex < myargc - 1) + { char *custwad = Z_Malloc(strlen(myargv[++iwadindex]) + 5, PU_STATIC, 0); strcpy (custwad, myargv[iwadindex]); FixPathSeperator (custwad); @@ -684,29 +731,36 @@ static const char *IdentifyVersion (void) } // Now scan the contents of the IWAD to determine which one it is - if (iwad[0]) { - static const char checklumps[8][8] = { + if (iwad[0]) + { +#define NUM_CHECKLUMPS 9 + static const char checklumps[NUM_CHECKLUMPS][8] = { "E1M1", "E2M1", "E4M1", "MAP01", - "ANIMDEFS", "FINAL2", "REDTNT2", "CAMO1" + "ANIMDEFS", "FINAL2", "REDTNT2", "CAMO1", + "EXTENDED" }; - int lumpsfound[8]; + int lumpsfound[NUM_CHECKLUMPS]; wadinfo_t header; FILE *f; memset (lumpsfound, 0, sizeof(lumpsfound)); - if ( (f = fopen (iwad, "rb")) ) { + if ( (f = fopen (iwad, "rb")) ) + { fread (&header, sizeof(header), 1, f); if (header.identification == IWAD_ID || - header.identification == PWAD_ID) { + header.identification == PWAD_ID) + { header.numlumps = LONG(header.numlumps); - if (0 == fseek (f, LONG(header.infotableofs), SEEK_SET)) { - for (i = 0; i < header.numlumps; i++) { + if (0 == fseek (f, LONG(header.infotableofs), SEEK_SET)) + { + for (i = 0; i < header.numlumps; i++) + { filelump_t lump; int j; if (0 == fread (&lump, sizeof(lump), 1, f)) break; - for (j = 0; j < 8; j++) + for (j = 0; j < NUM_CHECKLUMPS; j++) if (!strnicmp (lump.name, checklumps[j], 8)) lumpsfound[j]++; } @@ -717,123 +771,95 @@ static const char *IdentifyVersion (void) gamemode = undetermined; - if (lumpsfound[3]) { + if (lumpsfound[3]) + { gamemode = commercial; - if (lumpsfound[6]) { + gameinfo = CommercialGameInfo; + if (lumpsfound[6]) + { gamemission = pack_tnt; titlestring = "DOOM 2: TNT - Evilution"; - } else if (lumpsfound[7]) { + } + else if (lumpsfound[7]) + { gamemission = pack_plut; titlestring = "DOOM 2: Plutonia Experiment"; - } else { + } + else + { gamemission = doom2; if (lumpsfound[4]) - titlestring = "Hexen (But It Won't Work)"; + { + gameinfo = HexenGameInfo; + titlestring = "Hexen: Beyond Heretic"; + } else titlestring = "DOOM 2: Hell on Earth"; } - } else if (lumpsfound[0]) { + } + else if (lumpsfound[0]) + { gamemission = doom; - if (lumpsfound[1]) { - if (lumpsfound[2]) { + if (lumpsfound[1]) + { + if (lumpsfound[2]) + { gamemode = retail; + gameinfo = RetailGameInfo; titlestring = "The Ultimate DOOM"; - } else { + } + else + { gamemode = registered; + gameinfo = RegisteredGameInfo; titlestring = "DOOM Registered"; } - } else { + } + else + { gamemode = shareware; + gameinfo = SharewareGameInfo; titlestring = "DOOM Shareware"; } if (lumpsfound[5]) - titlestring = "Heretic (But It Won't Work)"; + { + if (lumpsfound[1]) + { + gameinfo = HereticSWGameInfo; + titlestring = "Heretic Shareware"; + } + else + { + gameinfo = HereticGameInfo; + if (lumpsfound[8]) + { + gameinfo.flags |= GI_MENUHACK_EXTENDED; + titlestring = "Heretic: Shadow of the Serpent Riders"; + } + else + titlestring = "Heretic"; + } + } } } if (gamemode == undetermined) + { + gameinfo = SharewareGameInfo; Printf (PRINT_HIGH, "Game mode indeterminate.\n"); + } if (iwad[0]) D_AddFile (iwad); return titlestring; } -// -// Find a Response File -// -void FindResponseFile (void) -{ -#define MAXARGVS 100 - int i; - - for (i = 1; i < myargc; i++) - if (myargv[i][0] == '@') - { - FILE * handle; - int size; - int k; - int index; - int indexinfile; - char *infile; - char *file; - char *moreargs[20]; - char *firstargv; - - // READ THE RESPONSE FILE INTO MEMORY - handle = fopen (&myargv[i][1],"rb"); - if (!handle) - I_FatalError ("\nNo such response file!"); - - Printf (PRINT_HIGH, "Found response file %s!\n", &myargv[i][1]); - fseek (handle,0,SEEK_END); - size = ftell(handle); - fseek (handle,0,SEEK_SET); - file = Malloc (size); - fread (file,size,1,handle); - fclose (handle); - - // KEEP ALL CMDLINE ARGS FOLLOWING @RESPONSEFILE ARG - for (index = 0,k = i+1; k < myargc; k++) - moreargs[index++] = myargv[k]; - - firstargv = myargv[0]; - myargv = Malloc(sizeof(char *)*MAXARGVS); - memset(myargv,0,sizeof(char *)*MAXARGVS); - myargv[0] = firstargv; - - infile = file; - indexinfile = k = 0; - indexinfile++; // SKIP PAST ARGV[0] (KEEP IT) - do - { - myargv[indexinfile++] = infile+k; - while(k < size && - ((*(infile+k)>= ' '+1) && (*(infile+k)<='z'))) - k++; - *(infile+k) = 0; - while(k < size && - ((*(infile+k)<= ' ') || (*(infile+k)>'z'))) - k++; - } while(k < size); - - for (k = 0;k < index;k++) - myargv[indexinfile++] = moreargs[k]; - myargc = indexinfile; - - // DISPLAY ARGS - Printf (PRINT_HIGH, "%d command-line args:\n",myargc); - for (k = 1; k < myargc; k++) - Printf (PRINT_HIGH, "%s\n",myargv[k]); - - break; - } -} - -// [RH] Copied this from BOOM 2.02: +//========================================================================== // // DoLooseFiles // +// [RH] Copied this from BOOM 2.02: +// // Take any file names on the command line before the first switch parm // and insert the appropriate -file, -deh or -playdemo switch in front // of them. @@ -849,6 +875,9 @@ void FindResponseFile (void) // isn't important. We'll point off to the original argv[], or the // area allocated in FindResponseFile, or our own areas from copystrings. // +//========================================================================== + +#define MAXARGVS 100 static void DoLooseFiles (void) { @@ -955,68 +984,71 @@ static void DoLooseFiles (void) myargc = tmyargc; } -extern thinker_t thinkercap; -void P_MobjThinker (mobj_t *mobj); - +//========================================================================== +// +// TransSoulsCallabck +// // [RH] This function is called whenever the lost soul translucency level -// changes. It searches through the entir world for any lost souls -// and sets their translucency levels as appropriate. New skulls are -// also set to spawn with the desired translucency. +// changes. It searches through the entir world for any lost souls and sets +// their translucency levels as appropriate. New skulls are also set to +// spawn with the desired translucency. +// +//========================================================================== + void TransSoulsCallback (cvar_t *var) { - thinker_t *currentthinker; - int floop; - - if (var->value < 0.25) { + if (var->value < 0.25) + { SetCVarFloat (var, 0.25); - } else if (var->value > 1) { + } + else if (var->value > 1) + { SetCVarFloat (var, 1); - } else { - floop = ((int)(var->value * 4) << MF_TRANSLUCSHIFT) & MF_TRANSLUCBITS; + } + else + { + thinker_t *currentthinker; + fixed_t newlucent = (fixed_t)(FRACUNIT * var->value); - mobjinfo[MT_SKULL].flags = (mobjinfo[MT_SKULL].flags & ~MF_TRANSLUCBITS) | floop; - - // Find all the lost souls in the world and change them, also. + mobjinfo[MT_SKULL].translucency = newlucent; + // Find all the lost souls in the world and change them, too. currentthinker = thinkercap.next; if (!currentthinker) return; - while (currentthinker != &thinkercap) { + while (currentthinker != &thinkercap) + { if ( (currentthinker->function.acp1 == (actionf_p1)P_MobjThinker) && ((mobj_t *)currentthinker)->type == MT_SKULL ) - ((mobj_t *)currentthinker)->flags = - (((mobj_t *)currentthinker)->flags & ~MF_TRANSLUCBITS) | floop; + ((mobj_t *)currentthinker)->translucency = newlucent; currentthinker = currentthinker->next; } } } +//========================================================================== // // D_DoomMain // +//========================================================================== + void D_DoomMain (void) { - int p, flags; - char file[256]; + int p, flags; + char file[256]; gamestate = GS_STARTUP; - - // [RH] Initialize the minilzo package. - if (lzo_init () != LZO_E_OK) + M_FindResponseFile (); + DoLooseFiles(); // Ty 08/29/98 - handle "loose" files on command line + if (lzo_init () != LZO_E_OK) // [RH] Initialize the minilzo package. I_FatalError ("Could not initialize LZO routines"); C_InstallCommands (); - - M_LoadDefaults (); // load before initing other systems - - // [RH] do all +set commands on the command line - C_ExecCmdLineParams (true); - - // [RH] Set default cvar values. These will - // be overridden by the configfile. - C_SetCVars (); + C_SetCVars (); // [RH] Set default cvar values; overridden by the configfile. + M_LoadDefaults (); // load before initing other systems + C_ExecCmdLineParams (true); // [RH] do all +set commands on the command line { cvar_t *var = cvar ("transsouls", "0.75", CVAR_ARCHIVE|CVAR_CALLBACK); @@ -1024,9 +1056,6 @@ void D_DoomMain (void) TransSoulsCallback (var); } - FindResponseFile (); - DoLooseFiles(); // Ty 08/29/98 - handle "loose" files on command line - { // [RH] Make sure zdoom.wad is always loaded, // as it contains stuff we need. @@ -1147,7 +1176,7 @@ void D_DoomMain (void) SetCVarFloat (dmflagsvar, (float)flags); // get skill / episode / map from parms - strcpy (startmap, gamemode == commercial ? "MAP01" : "E1M1"); + strcpy (startmap, (gameinfo.flags & GI_MAPxx) ? "MAP01" : "E1M1"); autostart = false; p = M_CheckParm ("-skill"); @@ -1158,14 +1187,17 @@ void D_DoomMain (void) } p = M_CheckParm ("-warp"); - if (p && p < myargc-1) + if (p && p < myargc-(1+(gameinfo.flags & GI_MAPxx ? 0 : 1))) { int ep, map; - if (gamemode == commercial) { + if (gameinfo.flags & GI_MAPxx) + { ep = 1; map = atoi (myargv[p+1]); - } else { + } + else + { ep = myargv[p+1][0]-'0'; map = myargv[p+2][0]-'0'; } @@ -1235,52 +1267,9 @@ void D_DoomMain (void) S_ParseSndInfo(); // Check for -file in shareware - // [RH] Don't check for a bunch of lumps not found in shareware. - if (modifiedgame && gamemode == shareware) - I_Error("\nYou cannot -file with the shareware version. Register!"); + if (modifiedgame && (gameinfo.flags & GI_SHAREWARE)) + I_FatalError ("\nYou cannot -file with the shareware version. Register!"); -#if 0 - // Iff additonal PWAD files are used, print modified banner - if (modifiedgame) - { - /*m*/Printf (PRINT_HIGH, - "===========================================================================\n" - "ATTENTION: This version of DOOM has been modified. If you would like to\n" - "get a copy of the original game, call 1-800-IDGAMES or see the readme file.\n" - " You will not receive technical support for modified games.\n" - "===========================================================================\n" - ); - } - - - // Check and print which version is executed. - switch ( gamemode ) - { - case shareware: - case undetermined: - Printf (PRINT_HIGH, - "===========================================================================\n" - " Shareware!\n" - "===========================================================================\n" - ); - break; - case registered: - case retail: - case commercial: - Printf (PRINT_HIGH, - "===========================================================================\n" - " Commercial product - do not distribute!\n" - " Please report software piracy to the SPA: 1-800-388-PIR8\n" - "===========================================================================\n" - ); - break; - - default: - // Ouch. - break; - } -#endif - Printf (PRINT_HIGH, "M_Init: Init miscellaneous info.\n"); M_Init (); diff --git a/code/D_net.c b/code/D_net.c index bbe9ff28fb..caa76b3f15 100644 --- a/code/D_net.c +++ b/code/D_net.c @@ -39,6 +39,8 @@ #include "p_effect.h" #include "p_local.h" +#include "gi.h" + #define NCMD_EXIT 0x80000000 #define NCMD_RETRANSMIT 0x40000000 #define NCMD_SETUP 0x20000000 @@ -501,24 +503,21 @@ void NetUpdate (void) // // CheckAbort // -void CheckAbort (void) +BOOL CheckAbort (void) { event_t *ev; - int stoptic; Printf (PRINT_HIGH, ""); // [RH] Give the console a chance to redraw itself - stoptic = I_GetTime () + 2; - while (I_GetTime() < stoptic) - I_StartTic (); - + I_WaitForTic (I_GetTime () + TICRATE*2/35); I_StartTic (); for ( ; eventtail != eventhead ; eventtail = (++eventtail)&(MAXEVENTS-1) ) { ev = &events[eventtail]; if (ev->type == ev_keydown && ev->data1 == KEY_ESCAPE) - I_Error ("Network game synchronization aborted."); - } + return true; + } + return false; } @@ -548,7 +547,8 @@ void D_ArbitrateNetStart (void) Printf (PRINT_HIGH, "Waiting for %d more player%s...\n", doomcom->numnodes - 1, (doomcom->numnodes == 2) ? "" : "s"); do { - CheckAbort (); + if (CheckAbort ()) + I_FatalError ("Network game synchronization aborted."); for (i = 10; i > 0; i--) { if (HGetPacket ()) { @@ -736,7 +736,7 @@ void TryRunTics (void) int numplaying; // get real tics - entertic = I_GetTime ()/ticdup; + entertic = I_WaitForTic (oldentertics * ticdup) / ticdup; realtics = entertic - oldentertics; oldentertics = entertic; @@ -945,22 +945,12 @@ void Net_DoCommand (int type, byte **stream, int player) if ((who == 0) || players[player].userinfo.team[0] == 0) { // Said to everyone Printf (PRINT_CHAT, "%s: %s\n", players[player].userinfo.netname, s); - - if (gamemode == commercial) { - S_Sound (NULL, CHAN_VOICE, "misc/chat", 1, ATTN_NONE); - } else { - S_Sound (NULL, CHAN_VOICE, "misc/chat2", 1, ATTN_NONE); - } + S_Sound (NULL, CHAN_VOICE, gameinfo.chatSound, 1, ATTN_NONE); } else if (!stricmp (players[player].userinfo.team, players[consoleplayer].userinfo.team)) { // Said only to members of the player's team Printf (PRINT_TEAMCHAT, "(%s): %s\n", players[player].userinfo.netname, s); - - if (gamemode == commercial) { - S_Sound (NULL, CHAN_VOICE, "misc/chat", 1, ATTN_NONE); - } else { - S_Sound (NULL, CHAN_VOICE, "misc/chat2", 1, ATTN_NONE); - } + S_Sound (NULL, CHAN_VOICE, gameinfo.chatSound, 1, ATTN_NONE); } } break; @@ -1018,7 +1008,7 @@ void Net_DoCommand (int type, byte **stream, int player) free (s); } -// [RH] List ping times +// [RH] List "ping" times void Cmd_Pings (void *plyr, int argc, char **argv) { int i; diff --git a/code/D_player.h b/code/D_player.h index 1aade88bf8..5a4ecf48e7 100644 --- a/code/D_player.h +++ b/code/D_player.h @@ -126,7 +126,8 @@ typedef struct player_s int attackdown, usedown; // true if button down last tic int cheats; // bit flags - int refire; // refired shots are less accurate + short refire; // refired shots are less accurate + short inconsistant; int killcount, itemcount, secretcount; // for intermission int damagecount, bonuscount;// for screen flashing mobj_t *attacker; // who did damage (NULL for floors diff --git a/code/Doomdef.h b/code/Doomdef.h index 906a0acb03..3287a381d0 100644 --- a/code/Doomdef.h +++ b/code/Doomdef.h @@ -314,6 +314,7 @@ typedef enum #define DF_FAST_MONSTERS 32768 // Monsters are fast (replaces -fast parm) #define DF_NO_JUMP 65536 // Don't allow jumping #define DF_NO_FREELOOK 131072 // Don't allow freelook +#define DF_RESPAWN_SUPER 262144 // Respawn invulnerability and invisibility // phares 3/20/98: // diff --git a/code/Doomstat.c b/code/Doomstat.c index 17ccfb4b09..9760854034 100644 --- a/code/Doomstat.c +++ b/code/Doomstat.c @@ -46,6 +46,4 @@ cvar_t *boom_friction, *boom_pushers; // [RH] Deathmatch flags cvar_t *dmflagsvar; int dmflags; // Copy of dmflagsvar->value, but as an integer. - -// [RH] Information about the current game -gameinfo_t gameinfo; \ No newline at end of file +cvar_t *fakedmatch; \ No newline at end of file diff --git a/code/Doomstat.h b/code/Doomstat.h index c124bf77ad..bc6f8b33a9 100644 --- a/code/Doomstat.h +++ b/code/Doomstat.h @@ -85,6 +85,9 @@ extern BOOL netgame; // Flag: true only if started as net deathmatch. extern cvar_t *deathmatch; +// [RH] Pretend as deathmatch for purposes of dmflags +extern cvar_t *fakedmatch; + // [RH] Teamplay mode extern cvar_t *teamplay; @@ -317,27 +320,6 @@ extern struct DehInfo deh; extern cvar_t *dmflagsvar; extern int dmflags; -// [RH] Generic information about the current game - -struct gameinfo_s -{ - char *gameTitle; - BOOL pagesArePatches; - char *titlePage; - char *demoPage1; - char *demoPage2; - char *advisory; - float titleTime; - float demoPage1Time; - float demoPage2Time; - float advisoryTime; - char *titleSong; - char *skyFlatName; -}; -typedef struct gameinfo_s gameinfo_t; - -extern gameinfo_t gameinfo; - #endif //----------------------------------------------------------------------------- // diff --git a/code/F_finale.c b/code/F_finale.c index 925ab530bf..35300fac0a 100644 --- a/code/F_finale.c +++ b/code/F_finale.c @@ -38,6 +38,8 @@ #include "r_state.h" #include "hu_stuff.h" +#include "gi.h" + // Stage of animation: // 0 = text, 1 = art screen, 2 = character cast unsigned int finalestage; @@ -73,20 +75,15 @@ void F_StartFinale (char *music, char *flat, char *text) // determined in G_WorldDone() based on data in // a level_info_t and a cluster_info_t. - if (*music == 0) { - if (gamemode == commercial) - S_ChangeMusic ("D_READ_M", true); - else - S_ChangeMusic ("D_VICTOR", true); - } else - S_ChangeMusic (music, true); + if (*music == 0) + S_ChangeMusic (gameinfo.finaleMusic, + !(gameinfo.flags & GI_NOLOOPFINALEMUSIC)); + else + S_ChangeMusic (music, !(gameinfo.flags & GI_NOLOOPFINALEMUSIC)); - if (*flat == 0) { - if (gamemode == commercial) - finaleflat = "SLIME16"; - else - finaleflat = "FLOOR4_8"; - } else + if (*flat == 0) + finaleflat = gameinfo.finaleFlat; + else finaleflat = flat; if (text) @@ -676,7 +673,8 @@ void F_BunnyScroll (void) // void F_Drawer (void) { - switch (finalestage) { + switch (finalestage) + { case 0: F_TextWrite (); break; @@ -684,24 +682,22 @@ void F_Drawer (void) case 1: switch (level.nextmap[7]) { - case '1': - if (gamemode == retail) - V_DrawPatchIndirect (0,0,&screen,W_CacheLumpName("CREDIT",PU_CACHE)); - else - V_DrawPatchIndirect (0,0,&screen,W_CacheLumpName("HELP2",PU_CACHE)); - break; - case '2': - V_DrawPatchIndirect (0,0,&screen,W_CacheLumpName("VICTORY2",PU_CACHE)); - break; - case '3': - F_BunnyScroll (); - break; - case '4': - V_DrawPatchIndirect (0,0,&screen,W_CacheLumpName("ENDPIC",PU_CACHE)); - break; - default: - V_DrawPatchIndirect (0,0,&screen,W_CacheLumpName("HELP2",PU_CACHE)); - break; + default: + case '1': + V_DrawPatchIndirect (0, 0, &screen, + W_CacheLumpName (gameinfo.finalePage1, PU_CACHE)); + break; + case '2': + V_DrawPatchIndirect (0, 0, &screen, + W_CacheLumpName (gameinfo.finalePage2, PU_CACHE)); + break; + case '3': + F_BunnyScroll (); + break; + case '4': + V_DrawPatchIndirect (0, 0, &screen, + W_CacheLumpName (gameinfo.finalePage3, PU_CACHE)); + break; } break; diff --git a/code/F_wipe.c b/code/F_wipe.c index 60925bc263..fef8b65745 100644 --- a/code/F_wipe.c +++ b/code/F_wipe.c @@ -21,127 +21,83 @@ // //----------------------------------------------------------------------------- - - - #include "z_zone.h" #include "i_video.h" #include "v_video.h" #include "m_random.h" #include "m_alloc.h" - #include "doomdef.h" - #include "f_wipe.h" +#include "c_cvars.h" // // SCREEN WIPE PACKAGE // -// when zero, stop the wipe -static BOOL go = 0; - -short *wipe_scr_start; -short *wipe_scr_end; -screen_t *wipe_scr; - - -void wipe_shittyColMajorXform (short *array, int width, int height) +enum { - int x; - int y; - short* dest; - - dest = (short*) Z_Malloc(width*height*2, PU_STATIC, 0); - - for(y=0;ybuffer + wipe_scr->pitch * y; - wend = w + width; - while (w!=wend) - { - if (*w != *e) - { - if (*w > *e) - { - newval = *w - ticks; - if (newval < *e) - *w = *e; - else - *w = (byte)newval; - changed = true; - } - else if (*w < *e) - { - newval = *w + ticks; - if (newval > *e) - *w = *e; - else - *w = (byte)newval; - changed = true; - } - } - w++; - e++; - } - } - - return !changed; - -} - -int wipe_exitColorXForm (int width, int height, int ticks) -{ - return 0; -} + wipe_None, // don't bother + wipe_Melt, // weird screen melt + wipe_Burn, // fade in shape of fire + wipe_Fade, // crossfade from old to new + wipe_NUMWIPES +}; +cvar_t *wipetype; +static int CurrentWipeType; +static short *wipe_scr_start; +static short *wipe_scr_end; static int *y; -int wipe_initMelt (int width, int height, int ticks) +// [RH] Fire Wipe +#define FIREWIDTH 64 +#define FIREHEIGHT 64 +static byte *burnarray; +static int density; +static int burntime; + +// [RH] Crossfade +static int fade; + + +// Melt ------------------------------------------------------------- + +void wipe_shittyColMajorXform (short *array) +{ + int x, y; + short *dest; + int width = screen.width / 2; + + dest = (short*) Malloc (width*screen.height*2); + + for(y = 0; y < screen.height; y++) + for(x = 0; x < width; x++) + dest[x*screen.height+y] = array[y*width+x]; + + memcpy(array, dest, screen.width*screen.height); + + free (dest); + +} + +int wipe_initMelt (int ticks) { int i, r; // copy start screen to main screen - V_DrawBlock (0, 0, wipe_scr, width, height, (byte *)wipe_scr_start); + V_DrawBlock (0, 0, &screen, screen.width, screen.height, (byte *)wipe_scr_start); // makes this wipe faster (in theory) // to have stuff in column-major format - wipe_shittyColMajorXform (wipe_scr_start, width/2, height); - wipe_shittyColMajorXform (wipe_scr_end, width/2, height); + wipe_shittyColMajorXform (wipe_scr_start); + wipe_shittyColMajorXform (wipe_scr_end); // setup initial column positions // (y<0 => not ready to scroll yet) - y = (int *) Z_Malloc(width*sizeof(int), PU_STATIC, 0); + y = (int *) Z_Malloc (screen.width*sizeof(int), PU_STATIC, 0); y[0] = -(M_Random()&0xf); - for (i=1;i= height) dy = height - y[i]; - s = &wipe_scr_end[i*height+y[i]]; - d = &((short *)wipe_scr->buffer)[y[i]*(wipe_scr->pitch/2)+i]; + if (y[i]+dy >= screen.height) + dy = screen.height - y[i]; + s = &wipe_scr_end[i*screen.height+y[i]]; + d = &((short *)screen.buffer)[y[i]*(screen.pitch/2)+i]; idx = 0; for (j=dy;j;j--) { d[idx] = *(s++); - idx += wipe_scr->pitch/2; + idx += screen.pitch/2; } y[i] += dy; - s = &wipe_scr_start[i*height]; - d = &((short *)wipe_scr->buffer)[y[i]*(wipe_scr->pitch/2)+i]; + s = &wipe_scr_start[i*screen.height]; + d = &((short *)screen.buffer)[y[i]*(screen.pitch/2)+i]; idx = 0; - for (j=height-y[i];j;j--) + for (j=screen.height-y[i];j;j--) { d[idx] = *(s++); - idx += wipe_scr->pitch/2; + idx += screen.pitch/2; } done = false; } @@ -204,72 +161,287 @@ int wipe_doMelt (int width, int height, int ticks) } -int wipe_exitMelt (int width, int height, int ticks) +int wipe_exitMelt (int ticks) { free (wipe_scr_start); free (wipe_scr_end); - Z_Free(y); + Z_Free (y); return 0; } -int wipe_StartScreen (int x, int y, int width, int height) +// Burn ------------------------------------------------------------- + +int wipe_initBurn (int ticks) { - wipe_scr = &screen; - - if (wipe_scr->is8bit) - wipe_scr_start = (short *)Malloc (width * height); - else - wipe_scr_start = (short *)Malloc (width * height * 4); - - V_GetBlock (0, 0, wipe_scr, width, height, (byte *)wipe_scr_start); + burnarray = Z_Malloc (FIREWIDTH * (FIREHEIGHT+4), PU_STATIC, 0); + memset (burnarray, 0, FIREWIDTH * (FIREHEIGHT+4)); + density = 4; + burntime = 0; return 0; } -int wipe_EndScreen (int x, int y, int width, int height) +int wipe_doBurn (int ticks) { - if (wipe_scr->is8bit) - wipe_scr_end = (short *)Malloc (width * height); - else - wipe_scr_end = (short *)Malloc (width * height * 4); + static int voop; + BOOL done; - V_GetBlock (0, 0, wipe_scr, width, height, (byte *)wipe_scr_end); - V_DrawBlock (0, 0, wipe_scr, width, height, (byte *)wipe_scr_start); // restore start scr. + // This is a modified version of the fire from the player + // setup menu. + burntime += ticks; + ticks *= 2; - return 0; -} - -int wipe_ScreenWipe (int wipeno, int x, int y, int width, int height, int ticks) -{ - int rc; - static int (*wipes[])(int, int, int) = + // Make the fire burn + while (ticks--) { - wipe_initColorXForm, wipe_doColorXForm, wipe_exitColorXForm, - wipe_initMelt, wipe_doMelt, wipe_exitMelt - }; + int a, b; + byte *from; - void V_MarkRect(int, int, int, int); + // generator + from = burnarray + FIREHEIGHT * FIREWIDTH; + b = voop; + voop += density / 3; + for (a = 0; a < density/8; a++) + { + unsigned int offs = (a+b) % FIREWIDTH; + unsigned int v = M_Random(); + v = from[offs] + 4 + (v & 15) + (v >> 3) + (M_Random() & 31); + if (v > 255) + v = 255; + from[offs] = from[FIREWIDTH*2 + (offs + FIREWIDTH*3/2)%FIREWIDTH] = v; + } + + density += 10; + if (density > FIREWIDTH*7) + density = FIREWIDTH*7; + + from = burnarray; + for (b = 0; b <= FIREHEIGHT; b += 2) + { + byte *pixel = from; + + // special case: first pixel on line + byte *p = pixel + (FIREWIDTH << 1); + unsigned int top = *p + *(p + FIREWIDTH - 1) + *(p + 1); + unsigned int bottom = *(pixel + (FIREWIDTH << 2)); + unsigned int c1 = (top + bottom) >> 2; + if (c1 > 1) c1--; + *pixel = c1; + *(pixel + FIREWIDTH) = (c1 + bottom) >> 1; + pixel++; + + // main line loop + for (a = 1; a < FIREWIDTH-1; a++) + { + // sum top pixels + p = pixel + (FIREWIDTH << 1); + top = *p + *(p - 1) + *(p + 1); + + // bottom pixel + bottom = *(pixel + (FIREWIDTH << 2)); + + // combine pixels + c1 = (top + bottom) >> 2; + if (c1 > 1) c1--; + + // store pixels + *pixel = c1; + *(pixel + FIREWIDTH) = (c1 + bottom) >> 1; // interpolate + + // next pixel + pixel++; + } + + // special case: last pixel on line + p = pixel + (FIREWIDTH << 1); + top = *p + *(p - 1) + *(p - FIREWIDTH + 1); + bottom = *(pixel + (FIREWIDTH << 2)); + c1 = (top + bottom) >> 2; + if (c1 > 1) c1--; + *pixel = c1; + *(pixel + FIREWIDTH) = (c1 + bottom) >> 1; + + // next line + from += FIREWIDTH << 1; + } + } + + // Draw the screen + { + fixed_t xstep, ystep, firex, firey; + int x, y; + byte *to, *fromold, *fromnew; + + xstep = (FIREWIDTH * FRACUNIT) / screen.width; + ystep = (FIREHEIGHT * FRACUNIT) / screen.height; + to = screen.buffer; + fromold = (byte *)wipe_scr_start; + fromnew = (byte *)wipe_scr_end; + done = true; + + for (y = 0, firey = 0; y < screen.height; y++, firey += ystep) + { + for (x = 0, firex = 0; x < screen.width; x++, firex += xstep) + { + int fglevel; + + fglevel = burnarray[(firex>>FRACBITS)+(firey>>FRACBITS)*FIREWIDTH] / 2; + if (fglevel >= 63) + { + to[x] = fromnew[x]; + } + else if (fglevel == 0) + { + to[x] = fromold[x]; + done = false; + } + else + { + int bglevel = 64-fglevel; + unsigned int *fg2rgb = Col2RGB8[fglevel]; + unsigned int *bg2rgb = Col2RGB8[bglevel]; + unsigned int fg = fg2rgb[fromnew[x]]; + unsigned int bg = bg2rgb[fromold[x]]; + fg = (fg+bg) | 0xf07c3e1f; + to[x] = RGB8k[0][0][(fg>>5) & (fg>>19)]; + done = false; + } + } + fromold += screen.width; + fromnew += screen.width; + to += screen.pitch; + } + } + + return done || (burntime > 40); +} + +int wipe_exitBurn (int ticks) +{ + free (wipe_scr_start); + free (wipe_scr_end); + Z_Free (burnarray); + return 0; +} + +// Crossfade -------------------------------------------------------- + +int wipe_initFade (int ticks) +{ + fade = 0; + return 0; +} + +int wipe_doFade (int ticks) +{ + fade += ticks; + if (fade > 64) + { + V_DrawBlock (0, 0, &screen, screen.width, screen.height, (byte *)wipe_scr_end); + return 1; + } + else + { + int x, y; + fixed_t bglevel = 64 - fade; + unsigned int *fg2rgb = Col2RGB8[fade]; + unsigned int *bg2rgb = Col2RGB8[bglevel]; + byte *fromnew = (byte *)wipe_scr_end; + byte *fromold = (byte *)wipe_scr_start; + byte *to = screen.buffer; + + for (y = 0; y < screen.height; y++) + { + for (x = 0; x < screen.width; x++) + { + unsigned int fg = fg2rgb[fromnew[x]]; + unsigned int bg = bg2rgb[fromold[x]]; + fg = (fg+bg) | 0xf07c3e1f; + to[x] = RGB8k[0][0][(fg>>5) & (fg>>19)]; + } + fromnew += screen.width; + fromold += screen.width; + to += screen.pitch; + } + } + fade++; + return 0; +} + +int wipe_exitFade (int ticks) +{ + return 0; +} + +// General Wipe Functions ------------------------------------------- + +int wipe_StartScreen (void) +{ + CurrentWipeType = (int)wipetype->value; + if (CurrentWipeType < 0) + CurrentWipeType = 0; + else if (CurrentWipeType >= wipe_NUMWIPES) + CurrentWipeType = wipe_NUMWIPES-1; + + if (CurrentWipeType) + { + if (screen.is8bit) + wipe_scr_start = (short *)Malloc (screen.width * screen.height); + else + wipe_scr_start = (short *)Malloc (screen.width * screen.height * 4); + + V_GetBlock (0, 0, &screen, screen.width, screen.height, (byte *)wipe_scr_start); + } + + return 0; +} + +int wipe_EndScreen (void) +{ + if (CurrentWipeType) + { + if (screen.is8bit) + wipe_scr_end = (short *)Malloc (screen.width * screen.height); + else + wipe_scr_end = (short *)Malloc (screen.width * screen.height * 4); + + V_GetBlock (0, 0, &screen, screen.width, screen.height, (byte *)wipe_scr_end); + V_DrawBlock (0, 0, &screen, screen.width, screen.height, (byte *)wipe_scr_start); // restore start scr. + } + + return 0; +} + +int wipe_ScreenWipe (int ticks) +{ + static BOOL go = 0; // when zero, stop the wipe + static int (*wipes[])(int) = + { + wipe_initMelt, wipe_doMelt, wipe_exitMelt, + wipe_initBurn, wipe_doBurn, wipe_exitBurn, + wipe_initFade, wipe_doFade, wipe_exitFade + }; + int rc; + + if (CurrentWipeType == wipe_None) + return true; // initial stuff if (!go) { go = 1; - // wipe_scr = (byte *) Z_Malloc(width*height, PU_STATIC, 0); // DEBUG - wipe_scr = &screen; - (*wipes[wipeno*3])(width, height, ticks); + (*wipes[(CurrentWipeType-1)*3])(ticks); } // do a piece of wipe-in - V_MarkRect(0, 0, width, height); - rc = (*wipes[wipeno*3+1])(width, height, ticks); - // V_DrawBlock(x, y, 0, width, height, wipe_scr); // DEBUG + V_MarkRect(0, 0, screen.width, screen.height); + rc = (*wipes[(CurrentWipeType-1)*3+1])(ticks); // final stuff if (rc) { go = 0; - (*wipes[wipeno*3+2])(width, height, ticks); + (*wipes[(CurrentWipeType-1)*3+2])(ticks); } return !go; - } diff --git a/code/G_game.c b/code/G_game.c index 905c46c70e..c114ee2232 100644 --- a/code/G_game.c +++ b/code/G_game.c @@ -557,6 +557,7 @@ BOOL G_Responder (event_t *ev) stricmp (cmd, "+showscores") && stricmp (cmd, "bumpgamma") && stricmp (cmd, "screenshot"))) { + S_Sound (NULL, CHAN_VOICE, "switches/normbutn", 1, ATTN_NONE); M_StartControlPanel (); return true; } else { @@ -629,11 +630,14 @@ BOOL G_Responder (event_t *ev) // G_Ticker // Make ticcmd_ts for the players. // +extern screen_t page; + void G_Ticker (void) { int i; int buf; ticcmd_t* cmd; + gamestate_t oldgamestate; // do player reborns if needed for (i=0 ; i BACKUPTICS && consistancy[i][buf] != cmd->consistancy) { - Printf_Bold ("Consistency failure! %d: %i (!%i)\n", - i, cmd->consistancy, consistancy[i][buf]); + players[i].inconsistant = 1; } if (players[i].mo) consistancy[i][buf] = players[i].mo->x; @@ -1113,6 +1120,7 @@ void G_LoadGame (char* name) void G_DoLoadGame (void) { +extern BOOL ZDoom117aSave; int length; int i; char mapname[9]; @@ -1122,8 +1130,18 @@ void G_DoLoadGame (void) length = M_ReadFile (savename, &savebuffer); save_p = savebuffer + SAVESTRINGSIZE; // skip the description field - if (strncmp (save_p, SAVESIG, 16)) // Bad version - I_Error ("Savegame is from a different version\n"); + if (strncmp (save_p, SAVESIG, 16)) + { // Bad version + // This is a quick hack to support ZDoom 1.17 and 1.17a savegames + // with 1.17b. 1.17b mobjs have a translucency field. Earlier + // versions used flags bits to specify it. + if (strncmp (save_p, "ZDOOMSAVE117 ", 16)) + I_Error ("Savegame is from a different version\n"); + else + ZDoom117aSave = true; + } + else + ZDoom117aSave = false; save_p += 16; @@ -1663,7 +1681,7 @@ BOOL G_CheckDemoStatus (void) int endtime; if (timingdemo) - endtime = I_GetTimeReally () - starttime; + endtime = I_GetTimePolled () - starttime; C_RestoreCVars (); // [RH] Restore cvars demo might have changed diff --git a/code/G_level.c b/code/G_level.c index e3b99ab91e..e2fdf6a7dc 100644 --- a/code/G_level.c +++ b/code/G_level.c @@ -28,6 +28,7 @@ #include "v_text.h" #include "s_sndseq.h" +#include "gi.h" #include "minilzo.h" // [RH] Output buffer size for LZO compression. @@ -585,7 +586,6 @@ void G_InitNew (char *mapname) // BOOL secretexit; static int startpos; // [RH] Support for multiple starts per level -extern char* pagename; extern BOOL NoWipe; // [RH] Don't wipe when travelling in hubs // [RH] The position parameter to these next two functions should @@ -818,7 +818,7 @@ void G_DoLoadLevel (int position) static BOOL firstTime = true; if (firstTime) { - starttime = I_GetTimeReally (); + starttime = I_GetTimePolled (); firstTime = false; } } @@ -948,9 +948,12 @@ char *CalcMapName (int episode, int level) { static char lumpname[9]; - if (gamemode == commercial) { + if (gameinfo.flags & GI_MAPxx) + { sprintf (lumpname, "MAP%02d", level); - } else { + } + else + { lumpname[0] = 'E'; lumpname[1] = '0' + episode; lumpname[2] = 'M'; @@ -1095,7 +1098,7 @@ void G_SnapshotLevel (void) save_p = savebuffer = Malloc (savegamesize); if (level.info->snapshot) - Z_Free (level.info->snapshot); + free (level.info->snapshot); WriteLong (level.flags, &save_p); WriteLong (level.fadeto, &save_p); @@ -1134,7 +1137,7 @@ void G_SnapshotLevel (void) DPrintf ("Snapshot: %d .. %d bytes\n", len, outlen); } - level.info->snapshot = Z_Malloc (((outlen == 0) ? len : outlen) + sizeof(int)*2, PU_STATIC, 0); + level.info->snapshot = Malloc (((outlen == 0) ? len : outlen) + sizeof(int)*2); ((int *)(level.info->snapshot))[0] = outlen; ((int *)(level.info->snapshot))[1] = len; if (outlen == 0) @@ -1163,7 +1166,7 @@ void G_UnSnapshotLevel (BOOL keepPlayers) if (cprlen) { int r, newlen; - expand = Z_Malloc (expandsize, PU_STATIC, 0); + expand = Malloc (expandsize); r = lzo1x_decompress (level.info->snapshot + sizeof(int)*2, cprlen, expand, &newlen, NULL); if (r != LZO_E_OK || newlen != expandsize) { Printf (PRINT_HIGH, "Could not decompress snapshot"); @@ -1192,10 +1195,10 @@ void G_UnSnapshotLevel (BOOL keepPlayers) P_UnArchiveSounds (); if (expand) - Z_Free (expand); + free (expand); // No reason to keep the snapshot around once the level's been entered. - Z_Free (level.info->snapshot); + free (level.info->snapshot); level.info->snapshot = NULL; save_p = NULL; @@ -1207,13 +1210,13 @@ void G_ClearSnapshots (void) for (i = 0; i < numwadlevelinfos; i++) if (wadlevelinfos[i].snapshot) { - Z_Free (wadlevelinfos[i].snapshot); + free (wadlevelinfos[i].snapshot); wadlevelinfos[i].snapshot = NULL; } for (i = 0; LevelInfos[i].level_name; i++) if (LevelInfos[i].snapshot) { - Z_Free (LevelInfos[i].snapshot); + free (LevelInfos[i].snapshot); LevelInfos[i].snapshot = NULL; } } @@ -1266,7 +1269,7 @@ void G_UnArchiveSnapshots (void) fullsize = ((int *)save_p)[1]; savesize = (shortsize ? shortsize : fullsize) + sizeof(int)*2; if (i) { - i->snapshot = Z_Malloc (savesize, PU_STATIC, 0); + i->snapshot = Malloc (savesize); memcpy (i->snapshot, save_p, savesize); } save_p += savesize; diff --git a/code/Info.c b/code/Info.c index 03571250c1..188eac8e6e 100644 --- a/code/Info.c +++ b/code/Info.c @@ -1151,7 +1151,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SOLID|MF_SHOOTABLE|MF_DROPOFF|MF_PICKUP|MF_NOTDMATCH, // flags MF2_SLIDE|MF2_PASSMOBJ|MF2_PUSHWALL, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_POSSESSED @@ -1178,7 +1179,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { "grunt/active", // activesound MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL, // flags MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL, // flags2 - S_POSS_RAISE1 // raisestate + S_POSS_RAISE1, // raisestate + 0x10000 }, { // MT_SHOTGUY @@ -1205,7 +1207,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { "shotguy/active", // activesound MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL, // flags MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL, // flags2 - S_SPOS_RAISE1 // raisestate + S_SPOS_RAISE1, // raisestate + 0x10000 }, { // MT_VILE @@ -1232,7 +1235,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { "vile/active", // activesound MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL, // flags MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_FIRE @@ -1257,9 +1261,10 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { 100, // mass 0, // damage NULL, // activesound - MF_NOBLOCKMAP|MF_NOGRAVITY|MF_TRANSLUC50, // flags + MF_NOBLOCKMAP|MF_NOGRAVITY, // flags MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + TRANSLUC66 }, { // MT_UNDEAD @@ -1286,7 +1291,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { "skeleton/active", // activesound MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL, // flags MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL, // flags2 - S_SKEL_RAISE1 // raisestate + S_SKEL_RAISE1, // raisestate + 0x10000 }, { // MT_TRACER @@ -1311,9 +1317,10 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { 100, // mass 10, // damage NULL, // activesound - MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY|MF_TRANSLUC75, // flags + MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY, // flags MF2_PCROSS|MF2_IMPACT, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + TRANSLUC75 }, { // MT_SMOKE @@ -1338,9 +1345,10 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { 100, // mass 0, // damage NULL, // activesound - MF_NOBLOCKMAP|MF_NOGRAVITY|MF_TRANSLUC50, // flags + MF_NOBLOCKMAP|MF_NOGRAVITY, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + TRANSLUC50 }, { // MT_FATSO @@ -1367,7 +1375,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { "fatso/active", // activesound MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL, // flags MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL, // flags2 - S_FATT_RAISE1 // raisestate + S_FATT_RAISE1, // raisestate + 0x10000 }, { // MT_FATSHOT @@ -1392,9 +1401,10 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { 100, // mass 8, // damage NULL, // activesound - MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY|MF_TRANSLUC75, // flags + MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY, // flags MF2_PCROSS|MF2_IMPACT, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + TRANSLUC75 }, { // MT_CHAINGUY @@ -1421,7 +1431,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { "chainguy/active", // activesound MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL, // flags MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL, // flags2 - S_CPOS_RAISE1 // raisestate + S_CPOS_RAISE1, // raisestate + 0x10000 }, { // MT_TROOP @@ -1448,7 +1459,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { "imp/active", // activesound MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL, // flags MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL, // flags2 - S_TROO_RAISE1 // raisestate + S_TROO_RAISE1, // raisestate + 0x10000 }, { // MT_SERGEANT @@ -1475,7 +1487,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { "demon/active", // activesound MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL, // flags MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL, // flags2 - S_SARG_RAISE1 // raisestate + S_SARG_RAISE1, // raisestate + 0x10000 }, { // MT_SHADOWS @@ -1502,7 +1515,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { "spectre/active", // activesound MF_SOLID|MF_SHOOTABLE|MF_SHADOW|MF_COUNTKILL, // flags MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL, // flags2 - S_SARG_RAISE1 // raisestate + S_SARG_RAISE1, // raisestate + 0x10000 }, { // MT_HEAD @@ -1529,7 +1543,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { "caco/active", // activesound MF_SOLID|MF_SHOOTABLE|MF_FLOAT|MF_NOGRAVITY|MF_COUNTKILL, // flags MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL, // flags2 - S_HEAD_RAISE1 // raisestate + S_HEAD_RAISE1, // raisestate + 0x10000 }, { // MT_BRUISER @@ -1556,7 +1571,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { "baron/active", // activesound MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL, // flags MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL, // flags2 - S_BOSS_RAISE1 // raisestate + S_BOSS_RAISE1, // raisestate + 0x10000 }, { // MT_BRUISERSHOT @@ -1581,9 +1597,10 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { 100, // mass 8, // damage NULL, // activesound - MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY|MF_TRANSLUC75, // flags + MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY, // flags MF2_PCROSS|MF2_IMPACT, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + TRANSLUC75 }, { // MT_KNIGHT @@ -1610,7 +1627,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { "knight/active", // activesound MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL, // flags MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL, // flags2 - S_BOS2_RAISE1 // raisestate + S_BOS2_RAISE1, // raisestate + 0x10000 }, { // MT_SKULL @@ -1637,7 +1655,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { "skull/active", // activesound MF_SOLID|MF_SHOOTABLE|MF_FLOAT|MF_NOGRAVITY, // flags MF2_MCROSS|MF2_PUSHWALL|MF2_PASSMOBJ, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_SPIDER @@ -1664,7 +1683,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { "spider/active", // activesound MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL, // flags MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL|MF2_BOSS, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_BABY @@ -1691,7 +1711,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { "baby/active", // activesound MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL, // flags MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL, // flags2 - S_BSPI_RAISE1 // raisestate + S_BSPI_RAISE1, // raisestate + 0x10000 }, { // MT_CYBORG @@ -1718,7 +1739,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { "cyber/active", // activesound MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL, // flags MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL|MF2_BOSS, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_PAIN @@ -1745,7 +1767,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { "pain/active", // activesound MF_SOLID|MF_SHOOTABLE|MF_FLOAT|MF_NOGRAVITY|MF_COUNTKILL, // flags MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL, // flags2 - S_PAIN_RAISE1 // raisestate + S_PAIN_RAISE1, // raisestate + 0x10000 }, { // MT_WOLFSS @@ -1772,7 +1795,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { "wolfss/active", // activesound MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL, // flags MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL, // flags2 - S_SSWV_RAISE1 // raisestate + S_SSWV_RAISE1, // raisestate + 0x10000 }, { // MT_KEEN @@ -1799,7 +1823,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY|MF_SHOOTABLE|MF_COUNTKILL, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_BOSSBRAIN @@ -1826,7 +1851,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SOLID|MF_SHOOTABLE, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_BOSSSPIT @@ -1853,7 +1879,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_NOBLOCKMAP|MF_NOSECTOR, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_BOSSTARGET @@ -1880,7 +1907,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_NOBLOCKMAP|MF_NOSECTOR, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_SPAWNSHOT @@ -1907,7 +1935,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY|MF_NOCLIP, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_SPAWNFIRE @@ -1932,9 +1961,10 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { 100, // mass 0, // damage NULL, // activesound - MF_NOBLOCKMAP|MF_NOGRAVITY|MF_TRANSLUC75, // flags + MF_NOBLOCKMAP|MF_NOGRAVITY, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + TRANSLUC66 }, { // MT_BARREL @@ -1961,7 +1991,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SOLID|MF_SHOOTABLE|MF_NOBLOOD, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_TROOPSHOT @@ -1986,9 +2017,10 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { 100, // mass 3, // damage NULL, // activesound - MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY|MF_TRANSLUC75, // flags + MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY, // flags MF2_PCROSS|MF2_IMPACT, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + TRANSLUC75 }, { // MT_HEADSHOT @@ -2013,9 +2045,10 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { 100, // mass 5, // damage NULL, // activesound - MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY|MF_TRANSLUC75, // flags + MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY, // flags MF2_PCROSS|MF2_IMPACT, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + TRANSLUC75 }, { // MT_ROCKET @@ -2042,7 +2075,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY, // flags MF2_PCROSS|MF2_IMPACT, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_PLASMA @@ -2067,9 +2101,10 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { 100, // mass 5, // damage NULL, // activesound - MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY|MF_TRANSLUC75, // flags + MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY, // flags MF2_PCROSS|MF2_IMPACT, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + TRANSLUC66 }, { // MT_BFG @@ -2094,9 +2129,10 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { 100, // mass 100, // damage NULL, // activesound - MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY|MF_TRANSLUC75, // flags + MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY, // flags MF2_PCROSS|MF2_IMPACT, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + TRANSLUC66 }, { // MT_ARACHPLAZ @@ -2121,9 +2157,10 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { 100, // mass 5, // damage NULL, // activesound - MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY|MF_TRANSLUC75, // flags + MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY, // flags MF2_PCROSS|MF2_IMPACT, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + TRANSLUC66 }, { // MT_PUFF @@ -2148,9 +2185,10 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { 100, // mass 0, // damage NULL, // activesound - MF_NOBLOCKMAP|MF_NOGRAVITY|MF_TRANSLUC50, // flags + MF_NOBLOCKMAP|MF_NOGRAVITY, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + TRANSLUC50 }, { // MT_BLOOD @@ -2177,7 +2215,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_NOBLOCKMAP, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_TFOG @@ -2202,9 +2241,10 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { 100, // mass 0, // damage NULL, // activesound - MF_NOBLOCKMAP|MF_NOGRAVITY|MF_TRANSLUC50, // flags + MF_NOBLOCKMAP|MF_NOGRAVITY, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + TRANSLUC50 }, { // MT_IFOG @@ -2231,7 +2271,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_NOBLOCKMAP|MF_NOGRAVITY, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_TELEPORTMAN @@ -2258,7 +2299,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_NOBLOCKMAP|MF_NOSECTOR, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_EXTRABFG @@ -2283,9 +2325,10 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { 100, // mass 0, // damage NULL, // activesound - MF_NOBLOCKMAP|MF_NOGRAVITY|MF_TRANSLUC75, // flags + MF_NOBLOCKMAP|MF_NOGRAVITY, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + TRANSLUC66 }, { // MT_MISC0 @@ -2312,7 +2355,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SPECIAL, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC1 @@ -2339,7 +2383,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SPECIAL, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC2 @@ -2366,7 +2411,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SPECIAL|MF_COUNTITEM, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC3 @@ -2393,7 +2439,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SPECIAL|MF_COUNTITEM, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC4 @@ -2420,7 +2467,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SPECIAL|MF_NOTDMATCH, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC5 @@ -2447,7 +2495,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SPECIAL|MF_NOTDMATCH, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC6 @@ -2474,7 +2523,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SPECIAL|MF_NOTDMATCH, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC7 @@ -2501,7 +2551,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SPECIAL|MF_NOTDMATCH, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC8 @@ -2528,7 +2579,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SPECIAL|MF_NOTDMATCH, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC9 @@ -2555,7 +2607,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SPECIAL|MF_NOTDMATCH, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC10 @@ -2582,7 +2635,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SPECIAL, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC11 @@ -2609,7 +2663,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SPECIAL, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC12 @@ -2634,9 +2689,10 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { 100, // mass 0, // damage NULL, // activesound - MF_SPECIAL|MF_COUNTITEM|MF_TRANSLUC75, // flags + MF_SPECIAL|MF_COUNTITEM, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_INV @@ -2661,9 +2717,10 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { 100, // mass 0, // damage NULL, // activesound - MF_SPECIAL|MF_COUNTITEM|MF_TRANSLUC75, // flags + MF_SPECIAL|MF_COUNTITEM, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC13 @@ -2690,7 +2747,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SPECIAL|MF_COUNTITEM, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_INS @@ -2715,9 +2773,10 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { 100, // mass 0, // damage NULL, // activesound - MF_SPECIAL|MF_COUNTITEM|MF_TRANSLUC75, // flags + MF_SPECIAL|MF_COUNTITEM, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC14 @@ -2744,7 +2803,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SPECIAL, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC15 @@ -2771,7 +2831,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SPECIAL|MF_COUNTITEM, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC16 @@ -2798,7 +2859,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SPECIAL|MF_COUNTITEM, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MEGA @@ -2823,9 +2885,10 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { 100, // mass 0, // damage NULL, // activesound - MF_SPECIAL|MF_COUNTITEM|MF_TRANSLUC75, // flags + MF_SPECIAL|MF_COUNTITEM, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_CLIP @@ -2852,7 +2915,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SPECIAL, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC17 @@ -2879,7 +2943,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SPECIAL, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC18 @@ -2906,7 +2971,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SPECIAL, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC19 @@ -2933,7 +2999,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SPECIAL, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC20 @@ -2960,7 +3027,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SPECIAL, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC21 @@ -2987,7 +3055,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SPECIAL, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC22 @@ -3014,7 +3083,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SPECIAL, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC23 @@ -3041,7 +3111,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SPECIAL, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC24 @@ -3068,7 +3139,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SPECIAL, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC25 @@ -3095,7 +3167,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SPECIAL, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_CHAINGUN @@ -3122,7 +3195,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SPECIAL, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC26 @@ -3149,7 +3223,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SPECIAL, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC27 @@ -3176,7 +3251,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SPECIAL, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC28 @@ -3203,7 +3279,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SPECIAL, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_SHOTGUN @@ -3230,7 +3307,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SPECIAL, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_SUPERSHOTGUN @@ -3257,7 +3335,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SPECIAL, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC29 @@ -3284,7 +3363,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SOLID, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC30 @@ -3311,7 +3391,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SOLID, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC31 @@ -3338,7 +3419,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SOLID, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC32 @@ -3365,7 +3447,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SOLID, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC33 @@ -3392,7 +3475,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SOLID, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC34 @@ -3419,7 +3503,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SOLID, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC35 @@ -3446,7 +3531,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SOLID, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC36 @@ -3473,7 +3559,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SOLID, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC37 @@ -3500,7 +3587,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SOLID, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC38 @@ -3527,7 +3615,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SOLID, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC39 @@ -3554,7 +3643,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SOLID, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC40 @@ -3581,7 +3671,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SOLID, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC41 @@ -3608,7 +3699,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SOLID, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC42 @@ -3635,7 +3727,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SOLID, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC43 @@ -3662,7 +3755,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SOLID, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC44 @@ -3689,7 +3783,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SOLID, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC45 @@ -3716,7 +3811,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SOLID, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC46 @@ -3743,7 +3839,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SOLID, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC47 @@ -3770,7 +3867,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SOLID, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC48 @@ -3797,7 +3895,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SOLID, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC49 @@ -3824,7 +3923,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound 0, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC50 @@ -3851,7 +3951,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SOLID, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC51 @@ -3878,7 +3979,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC52 @@ -3905,7 +4007,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC53 @@ -3932,7 +4035,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC54 @@ -3959,7 +4063,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC55 @@ -3986,7 +4091,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC56 @@ -4013,7 +4119,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SPAWNCEILING|MF_NOGRAVITY, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC57 @@ -4040,7 +4147,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SPAWNCEILING|MF_NOGRAVITY, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC58 @@ -4067,7 +4175,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SPAWNCEILING|MF_NOGRAVITY, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC59 @@ -4094,7 +4203,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SPAWNCEILING|MF_NOGRAVITY, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC60 @@ -4121,7 +4231,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SPAWNCEILING|MF_NOGRAVITY, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC61 @@ -4148,7 +4259,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound 0, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC62 @@ -4175,7 +4287,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound 0, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC63 @@ -4202,7 +4315,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound 0, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC64 @@ -4229,7 +4343,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound 0, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC65 @@ -4256,7 +4371,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound 0, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC66 @@ -4283,7 +4399,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound 0, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC67 @@ -4310,7 +4427,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound 0, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC68 @@ -4337,7 +4455,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound 0, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC69 @@ -4364,7 +4483,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound 0, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC70 @@ -4391,7 +4511,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SOLID, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC71 @@ -4418,7 +4539,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound 0, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC72 @@ -4445,7 +4567,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SOLID, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC73 @@ -4472,7 +4595,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SOLID, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC74 @@ -4499,7 +4623,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SOLID, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC75 @@ -4526,7 +4651,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SOLID, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC76 @@ -4553,7 +4679,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SOLID, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC77 @@ -4580,7 +4707,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SOLID, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC78 @@ -4607,7 +4735,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC79 @@ -4634,7 +4763,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC80 @@ -4661,7 +4791,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC81 @@ -4688,7 +4819,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC82 @@ -4715,7 +4847,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC83 @@ -4742,7 +4875,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC84 @@ -4769,7 +4903,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_NOBLOCKMAP, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC85 @@ -4796,7 +4931,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_NOBLOCKMAP, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MISC86 @@ -4823,7 +4959,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_NOBLOCKMAP, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, // [RH] Andy Baker's stealth monsters (next 12) @@ -4852,7 +4989,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { "baby/active", // activesound MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL|MF_STEALTH, // flags MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL, // flags2 - S_BSPI_RAISE1 // raisestate + S_BSPI_RAISE1, // raisestate + 0 }, { // MT_STEALTHVILE @@ -4879,7 +5017,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { "vile/active", // activesound MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL|MF_STEALTH, // flags MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0 }, { // MT_STEALTHBRUISER (BARONOFHELL) @@ -4906,7 +5045,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { "baron/active", // activesound MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL|MF_STEALTH, // flags MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL, // flags2 - S_BOSS_RAISE1 // raisestate + S_BOSS_RAISE1, // raisestate + 0 }, { // MT_STEALTHHEAD (CACODEMON) @@ -4933,7 +5073,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { "caco/active", // activesound MF_SOLID|MF_SHOOTABLE|MF_FLOAT|MF_NOGRAVITY|MF_COUNTKILL|MF_STEALTH, // flags MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL, // flags2 - S_HEAD_RAISE1 // raisestate + S_HEAD_RAISE1, // raisestate + 0 }, { // MT_STEALTHCHAINGUY (CHAINGUNNER) @@ -4960,7 +5101,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { "chainguy/active", // activesound MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL|MF_STEALTH, // flags MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL, // flags2 - S_CPOS_RAISE1 // raisestate + S_CPOS_RAISE1, // raisestate + 0 }, { // MT_STEALTHSERGEANT (DEMON) @@ -4987,7 +5129,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { "demon/active", // activesound MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL|MF_STEALTH, // flags MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL, // flags2 - S_SARG_RAISE1 // raisestate + S_SARG_RAISE1, // raisestate + 0 }, { // MT_STEALTHKNIGHT @@ -5014,7 +5157,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { "knight/active", // activesound MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL|MF_STEALTH, // flags MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL, // flags2 - S_BOS2_RAISE1 // raisestate + S_BOS2_RAISE1, // raisestate + 0 }, { // MT_STEALTHTROOP (IMP) @@ -5041,7 +5185,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { "imp/active", // activesound MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL|MF_STEALTH, // flags MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL, // flags2 - S_TROO_RAISE1 // raisestate + S_TROO_RAISE1, // raisestate + 0 }, { // MT_STEALTHFATSO @@ -5068,7 +5213,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { "fatso/active", // activesound MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL|MF_STEALTH, // flags MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL, // flags2 - S_FATT_RAISE1 // raisestate + S_FATT_RAISE1, // raisestate + 0 }, { // MT_STEALTHUNDEAD @@ -5095,7 +5241,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { "skeleton/active", // activesound MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL|MF_STEALTH, // flags MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL, // flags2 - S_SKEL_RAISE1 // raisestate + S_SKEL_RAISE1, // raisestate + 0 }, { // MT_STEALTHSHOTGUY @@ -5122,7 +5269,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { "shotguy/active", // activesound MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL|MF_STEALTH, // flags MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL, // flags2 - S_SPOS_RAISE1 // raisestate + S_SPOS_RAISE1, // raisestate + 0 }, { // MT_STEALTHPOSSESSED @@ -5149,7 +5297,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { "grunt/active", // activesound MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL|MF_STEALTH, // flags MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL, // flags2 - S_POSS_RAISE1 // raisestate + S_POSS_RAISE1, // raisestate + 0 }, { // MT_GIB0 @@ -5176,7 +5325,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_DROPOFF|MF_CORPSE, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_GIB1 @@ -5203,7 +5353,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_DROPOFF|MF_CORPSE, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_GIB2 @@ -5230,7 +5381,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_DROPOFF|MF_CORPSE, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_GIB3 @@ -5257,7 +5409,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_DROPOFF|MF_CORPSE, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_GIB4 @@ -5284,7 +5437,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_DROPOFF|MF_CORPSE, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_GIB5 @@ -5311,7 +5465,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_DROPOFF|MF_CORPSE, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_GIB6 @@ -5338,7 +5493,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_DROPOFF|MF_CORPSE, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_GIB7 @@ -5365,7 +5521,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_DROPOFF|MF_CORPSE, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_UNKNOWNTHING @@ -5392,7 +5549,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_NOGRAVITY, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MAPSPOT @@ -5419,7 +5577,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_NOBLOCKMAP|MF_NOSECTOR|MF_NOGRAVITY, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_MAPSPOTGRAV @@ -5446,7 +5605,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound 0, // flags MF2_DONTDRAW, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // MT_BRIDGE @@ -5473,7 +5633,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_SOLID|MF_NOGRAVITY, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, // For use with wind and current effects @@ -5501,7 +5662,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_NOBLOCKMAP, // flags MF2_DONTDRAW, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, // For use with wind and current effects @@ -5529,7 +5691,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_NOBLOCKMAP, // flags MF2_DONTDRAW, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // [RH] MT_PATHNODE -- used for monster patrols @@ -5556,7 +5719,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_NOBLOCKMAP, // flags MF2_DONTDRAW, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // [RH] MT_AMBIENT (subsumes MT_AMBIENT0-MT_AMBIENT63) @@ -5583,7 +5747,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_NOBLOCKMAP|MF_NOSECTOR, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // [RH] MT_TELEPORTMAN2 - Height-sensitive teleport destination @@ -5610,7 +5775,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_NOBLOCKMAP|MF_NOSECTOR, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // [RH] MT_CAMERA @@ -5637,7 +5803,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_NOBLOCKMAP|MF_NOGRAVITY, // flags MF2_DONTDRAW, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // [RH] MT_SPARK @@ -5664,7 +5831,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_NOSECTOR|MF_NOBLOCKMAP|MF_NOGRAVITY, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 }, { // [RH] MT_FOUNTAIN @@ -5691,7 +5859,8 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { NULL, // activesound MF_NOBLOCKMAP|MF_NOGRAVITY, // flags 0, // flags2 - S_NULL // raisestate + S_NULL, // raisestate + 0x10000 } }; diff --git a/code/Info.h b/code/Info.h index c9a7947ad7..e2887a4a80 100644 --- a/code/Info.h +++ b/code/Info.h @@ -1353,7 +1353,7 @@ typedef enum { // [RH] Miscellaneous things MT_UNKNOWNTHING, MT_MAPSPOT, - MT_MAPSPOTGRAV, + MT_MAPSPOTGRAVITY, MT_BRIDGE, MT_PUSH, // Boom's push thing MT_PULL, // Boom's pull thing @@ -1393,6 +1393,7 @@ typedef struct int flags; int flags2; int raisestate; + int translucency; } mobjinfo_t; diff --git a/code/M_menu.c b/code/M_menu.c index db2c098b55..0637dd759f 100644 --- a/code/M_menu.c +++ b/code/M_menu.c @@ -35,42 +35,30 @@ #include #endif - #include "doomdef.h" #include "dstrings.h" - #include "c_consol.h" #include "c_dispch.h" - #include "d_main.h" - #include "i_system.h" #include "i_input.h" #include "i_video.h" #include "z_zone.h" #include "v_video.h" #include "w_wad.h" - #include "r_local.h" - - #include "hu_stuff.h" - #include "g_game.h" - #include "m_argv.h" #include "m_swap.h" #include "m_random.h" - #include "s_sound.h" - #include "doomstat.h" - #include "m_menu.h" - #include "v_text.h" #include "st_stuff.h" +#include "gi.h" extern patch_t* hu_font[HU_FONTSIZE]; @@ -106,7 +94,6 @@ int saveCharIndex; // which char we're editing // old save description before edit char saveOldString[SAVESTRINGSIZE]; -BOOL inhelpscreens; BOOL menuactive; #define SKULLXOFF -32 @@ -255,7 +242,7 @@ oldmenuitem_t EpisodeMenu[]= oldmenu_t EpiDef = { - ep_end, // # of menu items + ep4, // # of menu items EpisodeMenu, // oldmenuitem_t -> M_DrawEpisode, // drawing routine -> 48,63, // x,y @@ -799,21 +786,8 @@ void M_QuickLoad(void) // void M_DrawReadThis1(void) { - inhelpscreens = true; - switch ( gamemode ) - { - case commercial: - V_DrawPatchIndirect (0,0,&screen,W_CacheLumpName("HELP",PU_CACHE)); - break; - case shareware: - case registered: - case retail: - V_DrawPatchIndirect (0,0,&screen,W_CacheLumpName("HELP1",PU_CACHE)); - break; - default: - break; - } - return; + V_DrawPatchIndirect (0, 0, &screen, + W_CacheLumpName (gameinfo.info.infoPage[0], PU_CACHE)); } @@ -823,22 +797,8 @@ void M_DrawReadThis1(void) // void M_DrawReadThis2(void) { - inhelpscreens = true; - switch ( gamemode ) - { - case retail: - case commercial: - // This hack keeps us from having to change menus. - V_DrawPatchIndirect (0,0,&screen,W_CacheLumpName("CREDIT",PU_CACHE)); - break; - case shareware: - case registered: - V_DrawPatchIndirect (0,0,&screen,W_CacheLumpName("HELP2",PU_CACHE)); - break; - default: - break; - } - return; + V_DrawPatchIndirect (0, 0, &screen, + W_CacheLumpName (gameinfo.info.infoPage[1], PU_CACHE)); } @@ -870,7 +830,7 @@ void M_NewGame(int choice) return; } - if (gamemode == commercial) + if (gameinfo.flags & GI_MAPxx) M_SetupNextMenu(&NewDef); else M_SetupNextMenu(&EpiDef); @@ -915,20 +875,13 @@ void M_ChooseSkill(int choice) void M_Episode (int choice) { - if ((gamemode == shareware) && choice) + if ((gameinfo.flags & GI_SHAREWARE) && choice) { M_StartMessage(SWSTRING,NULL,false); M_SetupNextMenu(&ReadDef1); return; } - // Yet another hack... - if ((gamemode != retail) && (choice > 2)) - { - Printf (PRINT_HIGH, "M_Episode: 4th episode requires Ultimate DOOM\n"); - choice = 0; - } - epi = choice; M_SetupNextMenu(&NewDef); } @@ -1011,37 +964,9 @@ void M_FinishReadThis(int choice) M_SetupNextMenu(&MainDef); } - - - // // M_QuitDOOM // -char *quitsounds[8] = -{ - "player/male/death1", - "demon/pain", - "grunt/pain", - "misc/gibbed", - "misc/teleport", - "grunt/sight1", - "grunt/sight3", - "demon/melee" -}; - -char *quitsounds2[8] = -{ - "vile/active", - "misc/p_pkup", - "brain/cube", - "misc/gibbed", - "skeleton/swing", - "knight/death", - "baby/active", - "demon/melee" -}; - - void M_QuitResponse(int ch) { @@ -1049,19 +974,16 @@ void M_QuitResponse(int ch) return; if (!netgame) { - if (gamemode == commercial) { - S_Sound (NULL, CHAN_VOICE, quitsounds2[(gametic>>2)&7], 1, ATTN_SURROUND); - } else { - S_Sound (NULL, CHAN_VOICE, quitsounds[(gametic>>2)&7], 1, ATTN_SURROUND); + if (gameinfo.quitSounds) + { + S_Sound (NULL, CHAN_VOICE, gameinfo.quitSounds[(gametic>>2)&7], + 1, ATTN_SURROUND); + I_WaitVBL (105); } - I_WaitVBL(105); } exit (0); } - - - void M_QuitDOOM (int choice) { // We pick index 0 which is language sensitive, @@ -1787,6 +1709,8 @@ void M_StartControlPanel (void) drawSkull = true; MenuStackDepth = 0; menuactive = 1; + currentMenu = &MainDef; + itemOn = currentMenu->lastOn; C_HideConsole (); // [RH] Make sure console goes bye bye. OptionsActive = false; // [RH] Make sure none of the options menus appear. I_PauseMouse (); // [RH] Give the mouse back in windowed modes. @@ -1807,8 +1731,6 @@ void M_Drawer (void) char string[80]; int start; - inhelpscreens = false; - // Horiz. & Vertically center string and print it. if (messageToPrint) { @@ -1978,31 +1900,30 @@ void M_Init (void) // Here we could catch other version dependencies, // like HELP1/2, and four episodes. - switch ( gamemode ) + switch (gameinfo.flags & GI_MENUHACK) { - case commercial: - // This is used because DOOM 2 had only one HELP - // page. I use CREDIT as second page now, but - // kept this hack for educational purposes. - MainMenu[readthis] = MainMenu[quitdoom]; - MainDef.numitems--; - MainDef.y += 8; - ReadDef1.routine = M_DrawReadThis1; - ReadDef1.x = 330; - ReadDef1.y = 165; - ReadMenu1[0].routine = M_FinishReadThis; - break; - case shareware: - // Episode 2 and 3 are handled, - // branching to an ad screen. - case registered: - // We need to remove the fourth episode. - EpiDef.numitems--; - break; - case retail: - // We are fine. - default: - break; + case GI_MENUHACK_COMMERCIAL: + // This is used because DOOM 2 had only one HELP + // page. I use CREDIT as second page now, but + // kept this hack for educational purposes. + MainMenu[readthis] = MainMenu[quitdoom]; + MainDef.numitems--; + MainDef.y += 8; + ReadDef1.routine = M_DrawReadThis1; + ReadDef1.x = 330; + ReadDef1.y = 165; + ReadMenu1[0].routine = M_FinishReadThis; + break; + case GI_MENUHACK_RETAIL: + // add the fourth episode. + EpiDef.numitems++; + break; + case GI_MENUHACK_EXTENDED: +// EpisodeMenu.itemCount = 5; +// EpisodeMenu.y -= ITEM_HEIGHT; + break; + default: + break; } M_OptInit (); diff --git a/code/M_misc.c b/code/M_misc.c index 0519a2bc13..57b0e269db 100644 --- a/code/M_misc.c +++ b/code/M_misc.c @@ -127,6 +127,83 @@ int M_ReadFile (char const *name, byte **buffer) return length; } +//--------------------------------------------------------------------------- +// +// PROC M_FindResponseFile +// +//--------------------------------------------------------------------------- + +#define MAXARGVS 100 + +void M_FindResponseFile (void) +{ + int i; + + for (i = 1; i < myargc; i++) + { + if (myargv[i][0] == '@') + { + FILE * handle; + int size; + int k; + int index; + int indexinfile; + char *infile; + char *file; + char *moreargs[20]; + char *firstargv; + + // READ THE RESPONSE FILE INTO MEMORY + handle = fopen (&myargv[i][1],"rb"); + if (!handle) + I_FatalError ("\nNo such response file!"); + + Printf (PRINT_HIGH, "Found response file %s!\n", &myargv[i][1]); + fseek (handle,0,SEEK_END); + size = ftell(handle); + fseek (handle,0,SEEK_SET); + file = Malloc (size); + fread (file,size,1,handle); + fclose (handle); + + // KEEP ALL CMDLINE ARGS FOLLOWING @RESPONSEFILE ARG + for (index = 0,k = i+1; k < myargc; k++) + moreargs[index++] = myargv[k]; + + firstargv = myargv[0]; + myargv = Malloc(sizeof(char *)*MAXARGVS); + memset(myargv,0,sizeof(char *)*MAXARGVS); + myargv[0] = firstargv; + + infile = file; + indexinfile = k = 0; + indexinfile++; // SKIP PAST ARGV[0] (KEEP IT) + do + { + myargv[indexinfile++] = infile+k; + while(k < size && + ((*(infile+k)>= ' '+1) && (*(infile+k)<='z'))) + k++; + *(infile+k) = 0; + while(k < size && + ((*(infile+k)<= ' ') || (*(infile+k)>'z'))) + k++; + } while(k < size); + + for (k = 0;k < index;k++) + myargv[indexinfile++] = moreargs[k]; + myargc = indexinfile; + + // DISPLAY ARGS + Printf (PRINT_HIGH, "%d command-line args:\n",myargc); + for (k = 1; k < myargc; k++) + Printf (PRINT_HIGH, "%s\n",myargv[k]); + + break; + } + } +} + // // DEFAULTS @@ -194,7 +271,8 @@ void M_SaveDefaults (void) configfile = GetConfigPath (); // Make sure the user hasn't changed configver - cvar_set ("configver", VERSIONSTR); + //cvar_set ("configver", VERSIONSTR); + cvar_set ("configver", "117.2"); if ( (f = fopen (configfile, "w")) ) { fprintf (f, "// Generated by ZDOOM - don't hurt anything\n"); @@ -219,6 +297,7 @@ void M_SaveDefaults (void) // extern byte scantokey[128]; extern int cvar_defflags; +extern cvar_t *dimamount; void M_LoadDefaults (void) { @@ -234,7 +313,8 @@ void M_LoadDefaults (void) // Used to identify the version of the game that saved // a config file to compensate for new features that get // put into newer configfiles. - configver = cvar ("configver", VERSIONSTR, CVAR_ARCHIVE); +// configver = cvar ("configver", VERSIONSTR, CVAR_ARCHIVE); + configver = cvar ("configver", "117.2", CVAR_ARCHIVE); configfile = GetConfigPath (); execcommand = Malloc (strlen (configfile) + 8); @@ -251,10 +331,16 @@ void M_LoadDefaults (void) AddCommandString (execcommand); free (execcommand); - if (configver->value <= 113.0f) { - AddCommandString ("bind t messagemode; bind \\ +showscores; bind f12 spynext; bind sysrq screenshot"); - if (C_GetBinding (KEY_F5) && !stricmp (C_GetBinding (KEY_F5), "menu_video")) - AddCommandString ("bind f5 menu_display"); + if (configver->value < 117.2f) + { + SetCVarFloat (dimamount, dimamount->value / 4); + if (configver->value <= 113.0f) + { + AddCommandString ("bind t messagemode; bind \\ +showscores;" + "bind f12 spynext; bind sysrq screenshot"); + if (C_GetBinding (KEY_F5) && !stricmp (C_GetBinding (KEY_F5), "menu_video")) + AddCommandString ("bind f5 menu_display"); + } } DefaultsLoaded = true; diff --git a/code/M_misc.h b/code/M_misc.h index bfba54c836..99701f6ea0 100644 --- a/code/M_misc.h +++ b/code/M_misc.h @@ -25,15 +25,10 @@ #include "doomtype.h" -// -// MISC -// - - BOOL M_WriteFile (char const *name, void *source, int length); - int M_ReadFile (char const *name, byte **buffer); +void M_FindResponseFile (void); // [RH] M_ScreenShot now accepts a filename parameter. // Pass a NULL to get the original behavior. diff --git a/code/Makefile.dj b/code/Makefile.dj index ec61768d59..c91c757413 100644 --- a/code/Makefile.dj +++ b/code/Makefile.dj @@ -8,22 +8,21 @@ #################################################################### CC = gcc -# sorry, but the DOS version of nasm runs out of memory AS = d:/nasm/nasmw RM = del CP = copy # options common to all builds IMPDIR = djgpp -CFLAGS_common = -Wall -Winline -I. -I$(IMPDIR) -idirafter ../ptc/source +CFLAGS_common = -Wall -Winline -DUSEASM -I. -I$(IMPDIR) -idirafter ../ptc/source OUTFILE = zdoomdos.exe # options specific to the debug build -CFLAGS_debug = -g -O2 -DNOASM +CFLAGS_debug = -g -O2 -DRANGECHECK LFLAGS_debug = # options specific to the release build -CFLAGS_release = -O3 -ffast-math -fomit-frame-pointer -m486 -DUSEASM +CFLAGS_release = -O3 -ffast-math -fomit-frame-pointer -m486 LFLAGS_release = -s # libraries to link with @@ -65,6 +64,7 @@ OBJS = \ $(INTDIR)/f_wipe.o \ $(INTDIR)/g_game.o \ $(INTDIR)/g_level.o \ + $(INTDIR)/gi.o \ $(INTDIR)/i_input.o \ $(INTDIR)/i_main.o \ $(INTDIR)/i_music.o \ @@ -142,7 +142,6 @@ OBJS = \ zdoom doom release all: $(INTDIR)/$(OUTFILE) $(CP) $(IMPDIR)\$(mode)\$(OUTFILE) . -# why doesn't this work? debug: $(MAKE) mode=debug @@ -171,7 +170,7 @@ $(INTDIR)/%.o: $(IMPDIR)/%.cpp # Changing the makefile rebuilds everything else $(OBJS): Makefile.dj -# Dependencies for each file (this is why I automatically +# Dependencies for each file (which is why I automatically # generated this file instead of writing it all by hand). $(INTDIR)/am_map.o: am_map.c \ @@ -251,6 +250,7 @@ $(INTDIR)/c_cmds.o: c_cmds.c \ dstrings.h \ g_game.h \ g_level.h \ + gi.h \ info.h \ m_fixed.h \ p_inter.h \ @@ -283,6 +283,7 @@ $(INTDIR)/c_consol.o: c_consol.c \ dstrings.h \ g_game.h \ g_level.h \ + gi.h \ hu_stuff.h \ info.h \ m_alloc.h \ @@ -491,6 +492,7 @@ $(INTDIR)/d_main.o: d_main.c \ f_wipe.h \ g_game.h \ g_level.h \ + gi.h \ hu_stuff.h \ info.h \ lzoconf.h \ @@ -519,6 +521,7 @@ $(INTDIR)/d_main.o: d_main.c \ st_stuff.h \ tables.h \ v_palett.h \ + v_text.h \ v_video.h \ w_wad.h \ wi_stuff.h \ @@ -545,6 +548,7 @@ $(INTDIR)/d_net.o: d_net.c \ doomtype.h \ g_game.h \ g_level.h \ + gi.h \ info.h \ m_alloc.h \ m_cheat.h \ @@ -693,6 +697,7 @@ $(INTDIR)/f_finale.o: f_finale.c \ doomtype.h \ dstrings.h \ g_level.h \ + gi.h \ hu_stuff.h \ info.h \ m_fixed.h \ @@ -824,6 +829,7 @@ $(INTDIR)/g_level.o: g_level.c \ f_finale.h \ g_game.h \ g_level.h \ + gi.h \ hu_stuff.h \ info.h \ lzoconf.h \ @@ -861,6 +867,12 @@ $(INTDIR)/g_level.o: g_level.c \ $(IMPDIR)/i_system.h \ z_zone.h +$(INTDIR)/gi.o: gi.c \ + d_think.h \ + doomtype.h \ + gi.h \ + info.h + $(INTDIR)/info.o: info.c \ d_think.h \ doomdata.h \ @@ -954,6 +966,7 @@ $(INTDIR)/m_menu.o: m_menu.c \ dstrings.h \ g_game.h \ g_level.h \ + gi.h \ hu_stuff.h \ info.h \ m_argv.h \ @@ -1277,6 +1290,7 @@ $(INTDIR)/p_enemy.o: p_enemy.c \ doomtype.h \ g_game.h \ g_level.h \ + gi.h \ info.h \ m_fixed.h \ m_random.h \ @@ -1750,7 +1764,9 @@ $(INTDIR)/p_saveg.o: p_saveg.c \ z_zone.h $(INTDIR)/p_setup.o: p_setup.c \ + c_consol.h \ c_cvars.h \ + cmdlib.h \ d_event.h \ d_items.h \ d_net.h \ @@ -1891,6 +1907,7 @@ $(INTDIR)/p_switch.o: p_switch.c \ doomtype.h \ g_game.h \ g_level.h \ + gi.h \ info.h \ m_fixed.h \ p_lnspec.h \ @@ -2211,6 +2228,7 @@ $(INTDIR)/r_draw.o: r_draw.c \ doomstat.h \ doomtype.h \ g_level.h \ + gi.h \ info.h \ m_alloc.h \ m_fixed.h \ @@ -2255,7 +2273,9 @@ $(INTDIR)/r_drawt.o: r_drawt.c \ r_main.h \ r_state.h \ r_things.h \ - tables.h + tables.h \ + v_palett.h \ + v_video.h $(INTDIR)/r_main.o: r_main.c \ c_cvars.h \ diff --git a/code/P_ceilng.c b/code/P_ceilng.c index 6f310b4ef6..4b59cce571 100644 --- a/code/P_ceilng.c +++ b/code/P_ceilng.c @@ -204,7 +204,7 @@ BOOL EV_DoCeiling (ceiling_e type, line_t *line, sec = §ors[secnum]; manual_ceiling: // if ceiling already moving, don't start a second function on it - if (P_SectorActive (ceiling_special, sec)) //jff 2/22/98 + if (sec->ceilingdata) continue; // new door thinker @@ -406,8 +406,9 @@ manual_ceiling: // void P_AddActiveCeiling (ceiling_t *c) { - c->next = activeceilings; - c->prev = NULL; + if ( (c->next = activeceilings) ) + c->next->prev = &c->next; + c->prev = &activeceilings; activeceilings = c; } @@ -424,14 +425,9 @@ void P_RemoveActiveCeiling (ceiling_t *c) while (scan) { if (scan == c) { c->sector->ceilingdata = NULL; - if (c == activeceilings) { - activeceilings = c->next; - } else { - if (c->prev) - c->prev->next = c->next; - if (c->next) - c->next->prev = c->prev; - } + if ( (*(c->prev) = c->next) ) + c->next->prev = c->prev; + P_RemoveThinker (&c->thinker); break; } diff --git a/code/P_doors.c b/code/P_doors.c index 9a6c7a74ff..defdf9a069 100644 --- a/code/P_doors.c +++ b/code/P_doors.c @@ -294,7 +294,7 @@ BOOL EV_DoDoor (vldoor_e type, line_t *line, mobj_t *thing, { sec = §ors[secnum]; // if the ceiling already moving, don't start the door action - if (P_SectorActive (ceiling_special,sec)) //jff 2/22/98 + if (sec->ceilingdata) continue; rtn |= SpawnDoor (sec, type, speed, delay); diff --git a/code/P_enemy.c b/code/P_enemy.c index f20b7cf089..e69dc6e1ec 100644 --- a/code/P_enemy.c +++ b/code/P_enemy.c @@ -28,22 +28,18 @@ #include "m_random.h" #include "i_system.h" - #include "doomdef.h" #include "p_local.h" #include "p_lnspec.h" #include "p_effect.h" - #include "s_sound.h" - #include "g_game.h" - -// State. #include "doomstat.h" #include "r_state.h" - #include "c_cvars.h" +#include "gi.h" + cvar_t *testgibs; @@ -279,9 +275,9 @@ BOOL P_Move (mobj_t *actor) fixed_t tryx, tryy, deltax, deltay, origx, origy; BOOL try_ok; int good; + int speed; int movefactor = ORIG_FRICTION_FACTOR; int friction = ORIG_FRICTION; - int speed; if (actor->movedir == DI_NODIR) return false; @@ -289,15 +285,17 @@ BOOL P_Move (mobj_t *actor) if ((unsigned)actor->movedir >= 8) I_Error ("Weird actor->movedir!"); + speed = actor->info->speed; + +#if 0 // [RH] I'm not so sure this is such a good idea // killough 10/98: make monsters get affected by ice and sludge too: movefactor = P_GetMoveFactor (actor, &friction); - speed = actor->info->speed; - if (friction < ORIG_FRICTION && // sludge !(speed = ((ORIG_FRICTION_FACTOR - (ORIG_FRICTION_FACTOR-movefactor)/2) * speed) / ORIG_FRICTION_FACTOR)) speed = 1; // always give the monster a little bit of speed +#endif tryx = (origx = actor->x) + (deltax = speed * xspeed[actor->movedir]); tryy = (origy = actor->y) + (deltay = speed * yspeed[actor->movedir]); @@ -682,7 +680,7 @@ void A_Look (mobj_t *actor) // [RH] Andy Baker's stealth monsters if (actor->flags & MF_STEALTH) { - P_IncreaseVisibility(actor); + actor->visdir = 1; } if (targ && (targ->flags & MF_SHOOTABLE) ) @@ -745,7 +743,7 @@ void A_Chase (mobj_t *actor) // [RH] Andy Baker's stealth monsters if (actor->flags & MF_STEALTH) { - P_DecreaseVisibility(actor); + actor->visdir = -1; } if (actor->reactiontime) @@ -875,7 +873,7 @@ void A_FaceTarget (mobj_t *actor) // [RH] Andy Baker's stealth monsters if (actor->flags & MF_STEALTH) { - P_IncreaseVisibility(actor); + actor->visdir = 1; } actor->flags &= ~MF_AMBUSH; @@ -905,7 +903,7 @@ void A_MonsterRail (mobj_t *actor) // [RH] Andy Baker's stealth monsters if (actor->flags & MF_STEALTH) { - P_IncreaseVisibility(actor); + actor->visdir = 1; } actor->flags &= ~MF_AMBUSH; @@ -915,7 +913,9 @@ void A_MonsterRail (mobj_t *actor) actor->target->x, actor->target->y); - actor->pitch = FixedDiv (P_AimLineAttack (actor, actor->angle, MISSILERANGE), -40960); + // The -2000 makes the monster aim a bit higher (at your chest instead + // of your butt). + actor->pitch = FixedDiv (P_AimLineAttack (actor, actor->angle, MISSILERANGE), -40960) - 2000; // Let the aim trail behind the player actor->angle = R_PointToAngle2 (actor->x, @@ -929,7 +929,7 @@ void A_MonsterRail (mobj_t *actor) actor->angle += (t-P_Random(pr_facetarget))<<21; } - P_RailAttack (actor, actor->damage, 0); + P_RailAttack (actor, actor->info->damage, 0); } // @@ -993,7 +993,7 @@ void A_CPosAttack (mobj_t *actor) // [RH] Andy Baker's stealth monsters if (actor->flags & MF_STEALTH) { - P_IncreaseVisibility(actor); + actor->visdir = 1; } S_Sound (actor, CHAN_WEAPON, "chainguy/attack", 1, ATTN_NORM); @@ -1048,7 +1048,7 @@ void A_BspiAttack (mobj_t *actor) // [RH] Andy Baker's stealth monsters if (actor->flags & MF_STEALTH) { - P_IncreaseVisibility(actor); + actor->visdir = 1; } A_FaceTarget (actor); @@ -1373,7 +1373,10 @@ void A_VileChase (mobj_t *actor) P_SetMobjState (corpsehit,info->raisestate); corpsehit->height = info->height; // [RH] Use real mobj height corpsehit->radius = info->radius; // [RH] Use real radius - corpsehit->flags = (info->flags & ~MF_TRANSLUCBITS) | MF_TRANSLUC50; + if (corpsehit->translucency > TRANSLUC50) + corpsehit->translucency /= 2; + corpsehit->flags = info->flags; + corpsehit->flags2 = info->flags2; corpsehit->health = info->spawnhealth; corpsehit->target = NULL; @@ -1761,7 +1764,8 @@ void A_Fall (mobj_t *actor) // [RH] Andy Baker's stealth monsters if (actor->flags & MF_STEALTH) { - P_BecomeVisible(actor); + actor->translucency = FRACUNIT; + actor->visdir = 0; } // actor is on ground, it can be walked over @@ -1937,7 +1941,7 @@ void A_BossDeath (mobj_t *mo) } // [RH] If noexit, then don't end the level. - if (deathmatch->value && (dmflags & DF_NO_EXIT)) + if ((deathmatch->value || fakedmatch->value) && (dmflags & DF_NO_EXIT)) return; G_ExitLevel (0); @@ -2078,7 +2082,7 @@ void A_BrainExplode (mobj_t *mo) void A_BrainDie (mobj_t *mo) { // [RH] If noexit, then don't end the level. - if (deathmatch->value && (dmflags & DF_NO_EXIT)) + if ((deathmatch->value || fakedmatch->value) && (dmflags & DF_NO_EXIT)) return; G_ExitLevel (0); @@ -2184,8 +2188,8 @@ void A_PlayerScream (mobj_t *mo) { char nametemp[128]; char *sound; - - if ((gamemode == commercial) && (mo->health < -50)) + + if (!(gameinfo.flags & GI_NOCRAZYDEATH) && (mo->health < -50)) { // IF THE PLAYER DIES LESS THAN -50% WITHOUT GIBBING sound = "*xdeath1"; @@ -2197,52 +2201,3 @@ void A_PlayerScream (mobj_t *mo) S_Sound (mo, CHAN_VOICE, sound, 1, ATTN_NORM); } - - -/***** Start of new functions for Andy Baker's stealth monsters ******/ - -void P_BecomeVisible (mobj_t *actor) -{ - actor->flags2 &= ~MF2_DONTDRAW; - actor->flags &= ~MF_TRANSLUCBITS; -}; - -void P_IncreaseVisibility (mobj_t *actor) -{ - if (actor->flags2 & MF2_DONTDRAW) { - actor->flags2 &= ~MF2_DONTDRAW; - actor->flags |= MF_TRANSLUC25; - } else switch (actor->flags & MF_TRANSLUCBITS) { - case MF_TRANSLUC25: - actor->flags ^= MF_TRANSLUCBITS; - break; - case MF_TRANSLUC50: - actor->flags |= MF_TRANSLUC25; - break; - case MF_TRANSLUC75: - actor->flags &= ~MF_TRANSLUCBITS; - break; - } -} - -void P_DecreaseVisibility (mobj_t *actor) -{ - if (actor->flags2 & MF2_DONTDRAW) - return; // already invisible - - switch (actor->flags & MF_TRANSLUCBITS) { - case 0: - actor->flags |= MF_TRANSLUC75; - break; - case MF_TRANSLUC75: - actor->flags &= ~MF_TRANSLUC25; - break; - case MF_TRANSLUC50: - actor->flags ^= MF_TRANSLUCBITS; - break; - case MF_TRANSLUC25: - actor->flags &= ~MF_TRANSLUCBITS; - actor->flags2 |= MF2_DONTDRAW; - } -} -/***** End of new functions for Andy Baker's stealth monsters ******/ \ No newline at end of file diff --git a/code/P_floor.c b/code/P_floor.c index 222168cfdd..3828cb9d30 100644 --- a/code/P_floor.c +++ b/code/P_floor.c @@ -432,7 +432,7 @@ BOOL EV_DoFloor (floor_e floortype, line_t *line, int tag, manual_floor: // ALREADY MOVING? IF SO, KEEP GOING... - if (P_SectorActive (floor_special, sec)) //jff 2/33/98 + if (sec->floordata) continue; // new floor thinker @@ -764,7 +764,7 @@ manual_stair: // ALREADY MOVING? IF SO, KEEP GOING... //jff 2/26/98 add special lockout condition to wait for entire //staircase to build before retriggering - if (P_SectorActive (floor_special, sec) || sec->stairlock) { + if (sec->floordata || sec->stairlock) { if (!manual) continue; else @@ -815,7 +815,7 @@ manual_stair: // if sector's floor already moving, look for another //jff 2/26/98 special lockout condition for retriggering - if (P_SectorActive (floor_special,tsec) || tsec->stairlock) { + if (tsec->floordata || tsec->stairlock) { prev = sec; sec = tsec; continue; @@ -845,7 +845,7 @@ manual_stair: // if sector's floor already moving, look for another //jff 2/26/98 special lockout condition for retriggering - if (P_SectorActive (floor_special,tsec) || tsec->stairlock) + if (tsec->floordata || tsec->stairlock) continue; ok = true; @@ -922,7 +922,7 @@ int EV_DoDonut (int tag, fixed_t pillarspeed, fixed_t slimespeed) s1 = §ors[secnum]; // s1 is pillar's sector // ALREADY MOVING? IF SO, KEEP GOING... - if (P_SectorActive (floor_special, s1)) //jff 2/22/98 + if (s1->floordata) continue; rtn = 1; diff --git a/code/P_inter.c b/code/P_inter.c index f380a198a7..2e4bd76062 100644 --- a/code/P_inter.c +++ b/code/P_inter.c @@ -183,13 +183,13 @@ BOOL P_GiveWeapon (player_t *player, weapontype_t weapon, BOOL dropped) if ((state->frame & FF_FRAMEMASK) >= sprites[state->sprite].numframes) return false; - if (netgame && (!deathmatch->value || dmflags & DF_WEAPONS_STAY) && !dropped) + if (netgame && ((!deathmatch->value && !fakedmatch->value) || dmflags & DF_WEAPONS_STAY) && !dropped) { // leave placed weapons forever on net games if (player->weaponowned[weapon]) return false; - player->bonuscount += BONUSADD; + player->bonuscount = BONUSADD; player->weaponowned[weapon] = true; if (deathmatch->value) @@ -256,7 +256,7 @@ BOOL P_GiveBody (player_t *player, int num) // BOOL P_GiveArmor (player_t *player, int armortype) { - int hits; + int hits; hits = armortype*100; if (player->armorpoints >= hits) @@ -399,8 +399,6 @@ void P_TouchSpecialThing (mobj_t *special, mobj_t *toucher) break; case SPR_MEGA: - if (gamemode != commercial) - return; player->health = deh.MegasphereHealth; player->mo->health = player->health; P_GiveArmor (player,deh.BlueAC); @@ -662,7 +660,7 @@ void P_TouchSpecialThing (mobj_t *special, mobj_t *toucher) level.found_items++; } P_RemoveMobj (special); - player->bonuscount += BONUSADD; + player->bonuscount = BONUSADD; { mobj_t *ent; @@ -1170,7 +1168,8 @@ void P_DamageMobj (mobj_t *target, mobj_t *inflictor, mobj_t *source, int damage // [RH] Andy Baker's Stealth monsters if (target->flags & MF_STEALTH) { - P_BecomeVisible(target); + target->translucency = FRACUNIT; + target->visdir = -1; } if ( target->flags & MF_SKULLFLY ) diff --git a/code/P_lights.c b/code/P_lights.c index 0f1627aa70..16f546bb06 100644 --- a/code/P_lights.c +++ b/code/P_lights.c @@ -263,7 +263,7 @@ void EV_StartLightStrobing (int tag, int upper, int lower, int utics, int ltics) while ((secnum = P_FindSectorFromTag (tag,secnum)) >= 0) { sector_t *sec = §ors[secnum]; - if (P_SectorActive (lighting_special, sec)) //jff 2/22/98 + if (sec->lightingdata) continue; P_SpawnStrobeFlash (sec, upper, lower, utics, ltics, 0); @@ -453,7 +453,7 @@ void EV_StartLightGlowing (int tag, int upper, int lower, int tics) while ((secnum = P_FindSectorFromTag (tag,secnum)) >= 0) { sector_t *sec = §ors[secnum]; - if (P_SectorActive (lighting_special, sec)) + if (sec->lightingdata) continue; P_SpawnGlowingLight2 (sec, upper, lower, tics, false); @@ -468,7 +468,7 @@ void EV_StartLightFading (int tag, int value, int tics) while ((secnum = P_FindSectorFromTag (tag,secnum)) >= 0) { sector_t *sec = §ors[secnum]; - if (P_SectorActive (lighting_special, sec)) + if (sec->lightingdata) continue; // No need to fade if lightlevel is already at desired value. diff --git a/code/P_lnspec.c b/code/P_lnspec.c index b8da4b2539..743d2cf502 100644 --- a/code/P_lnspec.c +++ b/code/P_lnspec.c @@ -667,7 +667,7 @@ FUNC(LS_Teleport_EndGame) // Teleport_EndGame () { if (!TeleportSide) { - if (gamemode == commercial && CheckIfExitIsGood (it)) { + if (CheckIfExitIsGood (it)) { strncpy (level.nextmap, "EndGameC", 8); G_ExitLevel (0); return true; diff --git a/code/P_lnspec.h b/code/P_lnspec.h index 565b4b99fe..e2d9241ff8 100644 --- a/code/P_lnspec.h +++ b/code/P_lnspec.h @@ -219,8 +219,8 @@ typedef enum { Init_Gravity = 0, Init_Color = 1, Init_Damage = 2, - - NUM_STATIC_INITS + NUM_STATIC_INITS, + Init_TransferSky = 255 } staticinit_t; typedef enum { diff --git a/code/P_local.h b/code/P_local.h index 388cf1d641..db37eea50f 100644 --- a/code/P_local.h +++ b/code/P_local.h @@ -160,11 +160,6 @@ extern struct brain_s { // killough 3/26/98: global state of boss brain int easy, targeton; } brain; -// [RH] Andy Baker's stealth monsters -void P_BecomeVisible (mobj_t *actor); -void P_IncreaseVisibility (mobj_t *actor); -void P_DecreaseVisibility (mobj_t *actor); - // // P_MAPUTL diff --git a/code/P_map.c b/code/P_map.c index ebdade26e9..942cec92fa 100644 --- a/code/P_map.c +++ b/code/P_map.c @@ -223,10 +223,6 @@ int P_GetFriction (const mobj_t *mo, int *frictionfactor) const msecnode_t *m; const sector_t *sec; - // Assign the friction value to objects on the floor, non-floating, - // and clipped. Normally the object's friction value is kept at - // ORIG_FRICTION and this thinker changes it for icy or muddy floors. - // // When the object is straddling sectors with the same // floorheight that have different frictions, use the lowest // friction value (muddy has precedence over icy). diff --git a/code/P_maputl.c b/code/P_maputl.c index ac73e0bf25..a1e1b46cfe 100644 --- a/code/P_maputl.c +++ b/code/P_maputl.c @@ -281,15 +281,15 @@ void P_UnsetThingPosition (mobj_t *thing) { if (!(thing->flags & MF_NOSECTOR)) { - // inert things don't need to be in sector list + // invisible things don't need to be in sector list // unlink from subsector - if (thing->snext) - thing->snext->sprev = thing->sprev; - if (thing->sprev) - thing->sprev->snext = thing->snext; - else - thing->subsector->sector->thinglist = thing->snext; + // killough 8/11/98: simpler scheme using pointers-to-pointers for prev + // pointers, allows head node pointers to be treated like everything else + mobj_t **sprev = thing->sprev; + mobj_t *snext = thing->snext; + if ((*sprev = snext)) // unlink from sector list + snext->sprev = sprev; // phares 3/14/98 // @@ -308,61 +308,48 @@ void P_UnsetThingPosition (mobj_t *thing) thing->touching_sectorlist = NULL; //to be restored by P_SetThingPosition } - if ( ! (thing->flags & MF_NOBLOCKMAP) ) + if ( !(thing->flags & MF_NOBLOCKMAP) ) { - // inert things don't need to be in blockmap - // unlink from block map - if (thing->bnext) - thing->bnext->bprev = thing->bprev; - - if (thing->bprev) - thing->bprev->bnext = thing->bnext; - else - { - int blockx = (thing->x - bmaporgx)>>MAPBLOCKSHIFT; - int blocky = (thing->y - bmaporgy)>>MAPBLOCKSHIFT; + // killough 8/11/98: simpler scheme using pointers-to-pointers for prev + // pointers, allows head node pointers to be treated like everything else + // + // Also more robust, since it doesn't depend on current position for + // unlinking. Old method required computing head node based on position + // at time of unlinking, assuming it was the same position as during + // linking. - if (blockx>=0 && blockx < bmapwidth - && blocky>=0 && blocky bnext; - } - } + mobj_t *bnext, **bprev = thing->bprev; + if (bprev && (*bprev = bnext = thing->bnext)) // unlink from block map + bnext->bprev = bprev; } } // // P_SetThingPosition -// Links a thing into both a block and a subsector -// based on it's x y. +// Links a thing into both a block and a subsector based on it's x y. // Sets thing->subsector properly // void P_SetThingPosition (mobj_t *thing) { - subsector_t* ss; - sector_t* sec; - int blockx; - int blocky; - mobj_t** link; - - // link into subsector + subsector_t *ss; + ss = R_PointInSubsector (thing->x,thing->y); thing->subsector = ss; - if ( ! (thing->flags & MF_NOSECTOR) ) + if ( !(thing->flags & MF_NOSECTOR) ) { // invisible things don't go into the sector links - sec = ss->sector; - - thing->sprev = NULL; - thing->snext = sec->thinglist; + // killough 8/11/98: simpler scheme using pointer-to-pointer prev + // pointers, allows head nodes to be treated like everything else - if (sec->thinglist) - sec->thinglist->sprev = thing; - - sec->thinglist = thing; + mobj_t **link = &ss->sector->thinglist; + mobj_t *snext = *link; + if ((thing->snext = snext)) + snext->sprev = &thing->snext; + thing->sprev = link; + *link = thing; // phares 3/16/98 // @@ -384,30 +371,27 @@ void P_SetThingPosition (mobj_t *thing) // link into blockmap - if ( ! (thing->flags & MF_NOBLOCKMAP) ) + if ( !(thing->flags & MF_NOBLOCKMAP) ) { - // inert things don't need to be in blockmap - blockx = (thing->x - bmaporgx)>>MAPBLOCKSHIFT; - blocky = (thing->y - bmaporgy)>>MAPBLOCKSHIFT; + // inert things don't need to be in blockmap + int blockx = (thing->x - bmaporgx)>>MAPBLOCKSHIFT; + int blocky = (thing->y - bmaporgy)>>MAPBLOCKSHIFT; - if (blockx>=0 - && blockx < bmapwidth - && blocky>=0 - && blocky < bmapheight) - { - link = &blocklinks[blocky*bmapwidth+blockx]; - thing->bprev = NULL; - thing->bnext = *link; - if (*link) - (*link)->bprev = thing; + if (blockx>=0 && blockx < bmapwidth && blocky>=0 && blocky < bmapheight) + { + // killough 8/11/98: simpler scheme using pointer-to-pointer prev + // pointers, allows head nodes to be treated like everything else + mobj_t **link = &blocklinks[blocky*bmapwidth+blockx]; + mobj_t *bnext = *link; + + if ((thing->bnext = bnext)) + bnext->bprev = &thing->bnext; + thing->bprev = link; *link = thing; } - else - { - // thing is off the map - thing->bnext = thing->bprev = NULL; - } + else // thing is off the map + thing->bnext = NULL, thing->bprev = NULL; } } @@ -503,7 +487,7 @@ BOOL P_BlockThingsIterator (int x, int y, BOOL(*func)(mobj_t*)) mobj ; mobj = mobj->bnext) { - if (!func( mobj )) + if (!func (mobj)) return false; } } diff --git a/code/P_mobj.c b/code/P_mobj.c index 8deb348aef..e8e7cd4e8f 100644 --- a/code/P_mobj.c +++ b/code/P_mobj.c @@ -21,6 +21,7 @@ // //----------------------------------------------------------------------------- +// HEADER FILES ------------------------------------------------------------ #include "m_alloc.h" #include "i_system.h" @@ -37,12 +38,15 @@ #include "v_video.h" #include "c_cvars.h" -cvar_t *sv_gravity; -cvar_t *sv_friction; - +// EXTERNAL FUNCTION PROTOTYPES -------------------------------------------- void G_PlayerReborn (int player); +// PUBLIC DATA DEFINITIONS ------------------------------------------------- + +cvar_t *sv_gravity; +cvar_t *sv_friction; + fixed_t FloatBobOffsets[64] = { 0, 51389, 102283, 152192, @@ -63,11 +67,16 @@ fixed_t FloatBobOffsets[64] = -200637, -152193, -102284, -51389 }; +// CODE -------------------------------------------------------------------- +//========================================================================== // // P_SetMobjState +// // Returns true if the mobj is still present. // +//========================================================================== + BOOL P_SetMobjState (mobj_t *mobj, statenum_t state) { state_t *st; @@ -122,19 +131,21 @@ BOOL P_SetMobjState (mobj_t *mobj, statenum_t state) return ret; } +//---------------------------------------------------------------------------- +// +// PROC P_ExplodeMissile +// +//---------------------------------------------------------------------------- -// -// P_ExplodeMissile -// void P_ExplodeMissile (mobj_t* mo) { mo->momx = mo->momy = mo->momz = 0; P_SetMobjState (mo, mobjinfo[mo->type].deathstate); - // [RH] If the object isn't translucent, don't change it. - // Otherwise, make it 75% translucent. - if (TransTable && !(mo->flags & MF_TRANSLUCBITS)) - mo->flags |= MF_TRANSLUC75; + // [RH] If the object is already translucent, don't change it. + // Otherwise, make it 66% translucent. + if (mo->translucency == FRACUNIT) + mo->translucency = TRANSLUC66; mo->tics -= P_Random (pr_explodemissile) & 3; @@ -646,24 +657,20 @@ static void PlayerLandedOnThing(mobj_t *mo, mobj_t *onmobj) // void P_NightmareRespawn (mobj_t *mobj) { - fixed_t x; - fixed_t y; - subsector_t* ss; - mobj_t* mo; - mapthing2_t* mthing; + fixed_t x, y, z; + subsector_t *ss; + mobj_t *mo; + mapthing2_t *mthing; x = mobj->spawnpoint.x << FRACBITS; y = mobj->spawnpoint.y << FRACBITS; - // something is occupying it's position? if (!P_CheckPosition (mobj, x, y)) return; // no respawn // spawn a teleport fog at old spot // because of removal of the body? - mo = P_SpawnMobj (mobj->x, - mobj->y, - ONFLOORZ, MT_TFOG); + mo = P_SpawnMobj (mobj->x, mobj->y, ONFLOORZ, MT_TFOG); // initiate teleport sound S_Sound (mo, CHAN_VOICE, "misc/teleport", 1, ATTN_NORM); @@ -677,12 +684,33 @@ void P_NightmareRespawn (mobj_t *mobj) // spawn the new monster mthing = &mobj->spawnpoint; + if (mobj->info->flags & MF_SPAWNCEILING) + z = ONCEILINGZ; + else if (mobj->info->flags2 & MF2_SPAWNFLOAT) + z = FLOATRANDZ; + else if (mobj->info->flags2 & MF2_FLOATBOB) + z = mthing->z << FRACBITS; + else + z = ONFLOORZ; + // spawn it // inherit attributes from deceased one mo = P_SpawnMobj (x, y, ONFLOORZ, mobj->type); mo->spawnpoint = mobj->spawnpoint; mo->angle = ANG45 * (mthing->angle/45); + if (z == ONFLOORZ) + mobj->z += mthing->z << FRACBITS; + else if (z == ONCEILINGZ) + mobj->z -= mthing->z << FRACBITS; + mobj->spawnpoint = *mthing; + + if (mobj->flags2 & MF2_FLOATBOB) + { // Seed random starting index for bobbing motion + mobj->health = M_Random(); + mobj->special1 = mthing->z << FRACBITS; + } + if (mthing->flags & MTF_AMBUSH) mo->flags |= MF_AMBUSH; @@ -818,6 +846,49 @@ void P_MobjThinker (mobj_t *mobj) if (mobj->targettic) mobj->targettic--; + // [RH] Pulse in and out of visibility + if (mobj->effects & FX_VISIBILITYPULSE) + { + if (mobj->special2 > 0) + { + mobj->translucency += 0x800; + if (mobj->translucency >= FRACUNIT) + { + mobj->translucency = FRACUNIT; + mobj->special2 = -1; + } + } + else + { + mobj->translucency -= 0x800; + if (mobj->translucency <= TRANSLUC25) + { + mobj->translucency = TRANSLUC25; + mobj->special2 = 1; + } + } + } + + // [RH] Fade a stealth monster in and out of visibility + if (mobj->visdir > 0) + { + mobj->translucency += 2*FRACUNIT/TICRATE; + if (mobj->translucency > FRACUNIT) + { + mobj->translucency = FRACUNIT; + mobj->visdir = 0; + } + } + else if (mobj->visdir < 0) + { + mobj->translucency -= 3*FRACUNIT/TICRATE/2; + if (mobj->translucency < 0) + { + mobj->translucency = 0; + mobj->visdir = 0; + } + } + // Handle X and Y momemtums BlockingMobj = NULL; if (mobj->momx || mobj->momy || (mobj->flags & MF_SKULLFLY)) @@ -898,8 +969,7 @@ void P_MobjThinker (mobj_t *mobj) else { // check for nightmare respawn - if (!(mobj->flags & MF_COUNTKILL) || - !respawnmonsters) + if (!(mobj->flags & MF_COUNTKILL) || !respawnmonsters) return; mobj->movecount++; @@ -907,7 +977,7 @@ void P_MobjThinker (mobj_t *mobj) if (mobj->movecount < 12*TICRATE) return; - if ( level.time&31 ) + if (level.time & 31) return; if (P_Random (pr_mobjthinker) > 4) @@ -917,19 +987,18 @@ void P_MobjThinker (mobj_t *mobj) } } - +//========================================================================== // // P_SpawnMobj -// [RH] Since MapThings can now be stored with their own z-position, -// we now use a separate parameter to indicate if it should be -// spawned relative to the floor or ceiling. // +//========================================================================== + mobj_t *P_SpawnMobj (fixed_t x, fixed_t y, fixed_t z, mobjtype_t type) { - mobj_t* mobj; - state_t* st; - mobjinfo_t* info; - fixed_t space; + mobj_t *mobj; + state_t *st; + mobjinfo_t *info; + fixed_t space; mobj = Z_Malloc (sizeof(*mobj), PU_LEVEL, NULL); memset (mobj, 0, sizeof (*mobj)); @@ -943,16 +1012,23 @@ mobj_t *P_SpawnMobj (fixed_t x, fixed_t y, fixed_t z, mobjtype_t type) mobj->height = info->height; mobj->flags = info->flags; mobj->flags2 = info->flags2; + mobj->damage = info->damage; mobj->health = info->spawnhealth; - if (mobj->flags & MF_STEALTH) // [RH] Stealth monsters start out invisible - mobj->flags2 |= MF2_DONTDRAW; + mobj->translucency = info->translucency; + if (type == MT_INS) + { + mobj->effects = FX_VISIBILITYPULSE; + mobj->special2 = -1; + } if (gameskill->value != sk_nightmare) mobj->reactiontime = info->reactiontime; mobj->lastlook = P_Random (pr_spawnmobj) % MAXPLAYERS; - // do not set the state with P_SetMobjState, - // because action routines can not be called yet + + // Set the state, but do not use P_SetMobjState, because action + // routines can't be called yet. If the spawnstate has an action + // routine, it will not be called. st = &states[info->spawnstate]; mobj->state = st; mobj->tics = st->tics; @@ -962,7 +1038,6 @@ mobj_t *P_SpawnMobj (fixed_t x, fixed_t y, fixed_t z, mobjtype_t type) // set subsector and/or block links P_SetThingPosition (mobj); - mobj->floorz = mobj->subsector->sector->floorheight; mobj->ceilingz = mobj->subsector->sector->ceilingheight; @@ -1012,16 +1087,17 @@ int iquehead; int iquetail; -void P_RemoveMobj (mobj_t* mobj) +void P_RemoveMobj (mobj_t *mobj) { - if ((mobj->flags & MF_SPECIAL) - && !(mobj->flags & MF_DROPPED) - && (mobj->type != MT_INV) - && (mobj->type != MT_INS)) + if ((mobj->flags & MF_SPECIAL) && !(mobj->flags & MF_DROPPED)) { - itemrespawnque[iquehead] = mobj->spawnpoint; - itemrespawntime[iquehead] = level.time; - iquehead = (iquehead+1)&(ITEMQUESIZE-1); + if ((mobj->type != MT_INV && mobj->type != MT_INS) + || (dmflags & DF_RESPAWN_SUPER)) + { + itemrespawnque[iquehead] = mobj->spawnpoint; + itemrespawntime[iquehead] = level.time; + iquehead = (iquehead+1)&(ITEMQUESIZE-1); + } // lose one off the end? if (iquehead == iquetail) @@ -1035,10 +1111,9 @@ void P_RemoveMobj (mobj_t* mobj) P_RemoveMobjFromHash (mobj); // Delete all nodes on the current sector_list phares 3/16/98 - if (sector_list) { - P_DelSeclist(sector_list); + P_DelSeclist (sector_list); sector_list = NULL; } @@ -1068,7 +1143,7 @@ void P_RespawnSpecials (void) int i; // only respawn items in deathmatch - if (!deathmatch->value || !(dmflags & DF_ITEMS_RESPAWN)) + if ((!deathmatch->value && !fakedmatch->value) || !(dmflags & DF_ITEMS_RESPAWN)) return; // nothing left to respawn? @@ -1121,8 +1196,10 @@ void P_RespawnSpecials (void) } // [RH] Set the thing's special - mo->special = mthing->special; - memcpy (mo->args, mthing->args, sizeof(mo->args)); + // On second thought, don't. + mo->special = 0; + //mo->special = mthing->special; + //memcpy (mo->args, mthing->args, sizeof(mo->args)); // pull it from the que iquetail = (iquetail+1)&(ITEMQUESIZE-1); @@ -1182,6 +1259,7 @@ void P_SpawnPlayer (mapthing2_t *mthing) p->extralight = 0; p->fixedcolormap = 0; p->viewheight = VIEWHEIGHT; + p->inconsistant = 0; p->momx = p->momy = 0; // killough 10/98: initialize bobbing to 0. @@ -1418,7 +1496,7 @@ void P_SpawnMapThing (mapthing2_t *mthing, int position) } // [RH] Other things that shouldn't be spawned depending on dmflags - if (deathmatch->value) { + if (deathmatch->value || fakedmatch->value) { spritenum_t sprite = states[mobjinfo[i].spawnstate].sprite; if (dmflags & DF_NO_HEALTH) { diff --git a/code/P_mobj.h b/code/P_mobj.h index 63d8d3c3cf..57b045287a 100644 --- a/code/P_mobj.h +++ b/code/P_mobj.h @@ -107,133 +107,85 @@ // Any questions? // -// -// Misc. mobj flags -// -typedef enum -{ - // Call P_SpecialThing when touched. - MF_SPECIAL = 0x00000001, - // Blocks. - MF_SOLID = 0x00000002, - // Can be hit. - MF_SHOOTABLE = 0x00000004, - // Don't use the sector links (invisible but touchable). - MF_NOSECTOR = 0x00000008, - // Don't use the blocklinks (inert but displayable) - MF_NOBLOCKMAP = 0x00000010, +// --- mobj.flags --- - // Not to be activated by sound, deaf monster. - MF_AMBUSH = 0x00000020, - // Will try to attack right back. - MF_JUSTHIT = 0x00000040, - // Will take at least one step before attacking. - MF_JUSTATTACKED = 0x00000080, - // On level spawning (initial position), - // hang from ceiling instead of stand on floor. - MF_SPAWNCEILING = 0x00000100, - // Don't apply gravity (every tic), - // that is, object will float, keeping current height - // or changing it actively. - MF_NOGRAVITY = 0x00000200, +#define MF_SPECIAL 1 // call P_SpecialThing when touched +#define MF_SOLID 2 +#define MF_SHOOTABLE 4 +#define MF_NOSECTOR 8 // don't use the sector links + // (invisible but touchable) +#define MF_NOBLOCKMAP 16 // don't use the blocklinks + // (inert but displayable) +#define MF_AMBUSH 32 // not activated by sound; deaf monster +#define MF_JUSTHIT 64 // try to attack right back +#define MF_JUSTATTACKED 128 // take at least one step before attacking +#define MF_SPAWNCEILING 256 // hang from ceiling instead of floor +#define MF_NOGRAVITY 512 // don't apply gravity every tic - // Movement flags. - // This allows jumps from high places. - MF_DROPOFF = 0x00000400, - // For players, will pick up items. - MF_PICKUP = 0x00000800, - // Player cheat. ??? - MF_NOCLIP = 0x00001000, - // Player: keep info about sliding along walls. - MF_SLIDE = 0x00002000, - // Allow moves to any height, no gravity. - // For active floaters, e.g. cacodemons, pain elementals. - MF_FLOAT = 0x00004000, - // Don't cross lines - // ??? or look at heights on teleport. - MF_TELEPORT = 0x00008000, - // Don't hit same species, explode on block. - // Player missiles as well as fireballs of various kinds. - MF_MISSILE = 0x00010000, - // Dropped by a demon, not level spawned. - // E.g. ammo clips dropped by dying former humans. - MF_DROPPED = 0x00020000, - // Use fuzzy draw (shadow demons or spectres), - // temporary player invisibility powerup. - MF_SHADOW = 0x00040000, - // Flag: don't bleed when shot (use puff), - // barrels and shootable furniture shall not bleed. - MF_NOBLOOD = 0x00080000, - // Don't stop moving halfway off a step, - // that is, have dead bodies slide down all the way. - MF_CORPSE = 0x00100000, - // Floating to a height for a move, ??? - // don't auto float to target's height. - MF_INFLOAT = 0x00200000, +// movement flags +#define MF_DROPOFF 0x00000400 // allow jumps from high places +#define MF_PICKUP 0x00000800 // for players to pick up items +#define MF_NOCLIP 0x00001000 // player cheat +#define MF_SLIDE 0x00002000 // keep info about sliding along walls +#define MF_FLOAT 0x00004000 // allow moves to any height, no gravity +#define MF_TELEPORT 0x00008000 // don't cross lines or look at heights +#define MF_MISSILE 0x00010000 // don't hit same species, explode on block - // On kill, count this enemy object - // towards intermission kill total. - // Happy gathering. - MF_COUNTKILL = 0x00400000, - - // On picking up, count this item object - // towards intermission item total. - MF_COUNTITEM = 0x00800000, +#define MF_DROPPED 0x00020000 // dropped by a demon, not level spawned +#define MF_SHADOW 0x00040000 // use fuzzy draw (shadow demons / spectres) +#define MF_NOBLOOD 0x00080000 // don't bleed when shot (use puff) +#define MF_CORPSE 0x00100000 // don't stop moving halfway off a step +#define MF_INFLOAT 0x00200000 // floating to a height for a move, don't + // auto float to target's height - // Special handling: skull in flight. - // Neither a cacodemon nor a missile. - MF_SKULLFLY = 0x01000000, +#define MF_COUNTKILL 0x00400000 // count towards intermission kill total +#define MF_COUNTITEM 0x00800000 // count towards intermission item total - // Don't spawn this object - // in death match mode (e.g. key cards). - MF_NOTDMATCH = 0x02000000, +#define MF_SKULLFLY 0x01000000 // skull in flight +#define MF_NOTDMATCH 0x02000000 // don't spawn in death match (key cards) - // Player sprites in multiplayer modes are modified - // using an internal color lookup table for re-indexing. - // If 0x4 0x8 or 0xc, - // use a translation table for player colormaps - MF_TRANSLATION = 0x0c000000, - // Hmm ???. - MF_TRANSSHIFT = 26, +#define MF_TRANSLATION 0x0c000000 // if 0x4 0x8 or 0xc, use a translation +#define MF_TRANSSHIFT 26 // tablefor player colormaps - // [RH] Andy Baker's stealth monsters - //Stealth Mode - Creatures that dissappear and reappear. - MF_STEALTH = 0x10000000, +#define MF_STEALTH 0x40000000 // [RH] Andy Baker's stealth monsters +#define MF_ICECORPSE 0x80000000 // a frozen corpse (for blasting) [RH] was 0x800000 - // [RH] 3 (4 counting opaque) levels of translucency - MF_TRANSLUCSHIFT = 29, - MF_TRANSLUCBITS = 0x60000000, - MF_TRANSLUC25 = 0x20000000, - MF_TRANSLUC50 = 0x40000000, - MF_TRANSLUC75 = 0x60000000, -} mobjflag_t; -// [RH] These are all from Hexen. Very few are used. + +// --- mobj.flags2 --- + #define MF2_LOGRAV 0x00000001 // alternate gravity setting -#define MF2_WINDTHRUST 0x00000002 // gets pushed around by the wind specials +#define MF2_WINDTHRUST 0x00000002 // gets pushed around by the wind + // specials #define MF2_FLOORBOUNCE 0x00000004 // bounces off the floor #define MF2_BLASTED 0x00000008 // missile will pass through ghosts #define MF2_FLY 0x00000010 // fly mode is active #define MF2_FLOORCLIP 0x00000020 // if feet are allowed to be clipped #define MF2_SPAWNFLOAT 0x00000040 // spawn random float z #define MF2_NOTELEPORT 0x00000080 // does not teleport -#define MF2_RIP 0x00000100 // missile rips through solid targets -#define MF2_PUSHABLE 0x00000200 // can be pushed by other moving mobjs +#define MF2_RIP 0x00000100 // missile rips through solid + // targets +#define MF2_PUSHABLE 0x00000200 // can be pushed by other moving + // mobjs #define MF2_SLIDE 0x00000400 // slides against walls -#define MF2_ONMOBJ 0x00000800 // mobj is resting on top of another mobj +#define MF2_ONMOBJ 0x00000800 // mobj is resting on top of another + // mobj #define MF2_PASSMOBJ 0x00001000 // Enable z block checking. If on, // this flag will allow the mobj to // pass over/under other mobjs. #define MF2_CANNOTPUSH 0x00002000 // cannot push other pushable mobjs -#define MF2_DROPPED 0x00004000 // dropped by a demon +//#define MF2_DROPPED 0x00004000 // dropped by a demon [RH] use MF_DROPPED instead +#define MF2_THRUGHOST 0x00004000 // missile will pass through ghosts [RH] was 8 #define MF2_BOSS 0x00008000 // mobj is a major boss #define MF2_FIREDAMAGE 0x00010000 // does fire damage -#define MF2_NODMGTHRUST 0x00020000 // does not thrust target when damaging +#define MF2_NODMGTHRUST 0x00020000 // does not thrust target when + // damaging #define MF2_TELESTOMP 0x00040000 // mobj can stomp another #define MF2_FLOATBOB 0x00080000 // use float bobbing z movement #define MF2_DONTDRAW 0x00100000 // don't generate a vissprite -#define MF2_IMPACT 0x00200000 // an MF_MISSILE mobj can activate SPAC_IMPACT +#define MF2_IMPACT 0x00200000 // an MF_MISSILE mobj can activate + // SPAC_IMPACT #define MF2_PUSHWALL 0x00400000 // mobj can push walls #define MF2_MCROSS 0x00800000 // can activate monster cross lines #define MF2_PCROSS 0x01000000 // can activate projectile cross lines @@ -247,6 +199,12 @@ typedef enum #define MF2_REFLECTIVE 0x80000000 // reflects missiles +#define TRANSLUC25 (FRACUNIT/4) +#define TRANSLUC33 (FRACUNIT/3) +#define TRANSLUC50 (FRACUNIT/2) +#define TRANSLUC66 ((FRACUNIT*2)/3) +#define TRANSLUC75 ((FRACUNIT*3)/4) + // Map Object definition. typedef struct mobj_s { @@ -254,7 +212,7 @@ typedef struct mobj_s // info for drawing fixed_t x,y,z; - struct mobj_s *snext, *sprev; // links in sector (if needed) + struct mobj_s *snext, **sprev; // links in sector (if needed) angle_t angle; spritenum_t sprite; // used to find patch_t and flip value int frame; // might be ord with FF_FULLBRIGHT @@ -262,7 +220,7 @@ typedef struct mobj_s // interaction info fixed_t pitch, roll; - struct mobj_s *bnext, *bprev; // links in blocks (if needed) + struct mobj_s *bnext, **bprev; // links in blocks (if needed) struct subsector_s *subsector; fixed_t floorz, ceilingz; // closest together of contacted secs // fixed_t floorpic; // contacted sec floorpic @@ -279,7 +237,9 @@ typedef struct mobj_s int special1; // Special info int special2; // Special info int health; - int movedir; // 0-7 + byte movedir; // 0-7 + char visdir; + short pad; // hack for 1.17a saves. to be removed int movecount; // when 0, select a new dir struct mobj_s *target; // thing being chased/attacked (or NULL) // also the originator for missiles @@ -303,6 +263,7 @@ typedef struct mobj_s struct mobj_s *goal; // Monster's goal if not chasing anything unsigned targettic; // Avoid missiles blowing up in your face byte *translation; // Translation table (or NULL) + fixed_t translucency; // 65536=fully opaque, 0=fully invisible // a linked list of sectors where this object appears struct msecnode_s *touching_sectorlist; // phares 3/14/98 diff --git a/code/P_plats.c b/code/P_plats.c index e43a5405ba..09fecd62b0 100644 --- a/code/P_plats.c +++ b/code/P_plats.c @@ -201,7 +201,7 @@ BOOL EV_DoPlat (int tag, line_t *line, plattype_e type, int height, sec = §ors[secnum]; manual_plat: - if (P_SectorActive (floor_special, sec)) //jff 2/23/98 multiple thinkers + if (sec->floordata) continue; // Find lowest & highest floors around sector @@ -361,10 +361,9 @@ void EV_StopPlat (int tag) // [RH] Rewritten to use list void P_AddActivePlat (plat_t *plat) { - if (activeplats) - activeplats->prev = plat; - plat->next = activeplats; - plat->prev = NULL; + if ( (plat->next = activeplats) ) + plat->next->prev = &plat->next; + plat->prev = &activeplats; activeplats = plat; } @@ -376,14 +375,8 @@ void P_RemoveActivePlat (plat_t *plat) while (scan) { if (scan == plat) { scan->sector->floordata = NULL; - if (scan == activeplats) { - activeplats = scan->next; - } else { - if (scan->prev) - scan->prev->next = scan->next; - if (scan->next) - scan->next->prev = scan->prev; - } + if ( (*(scan->prev) = scan->next) ) + scan->next->prev = scan->prev; P_RemoveThinker (&scan->thinker); break; } diff --git a/code/P_pspr.c b/code/P_pspr.c index 9c74b64dbd..8426be9d39 100644 --- a/code/P_pspr.c +++ b/code/P_pspr.c @@ -173,14 +173,12 @@ BOOL P_CheckAmmo (player_t *player) do { if (player->weaponowned[wp_plasma] - && player->ammo[am_cell] - && (gamemode != shareware) ) + && player->ammo[am_cell]) { player->pendingweapon = wp_plasma; } else if (player->weaponowned[wp_supershotgun] - && player->ammo[am_shell]>2 - && (gamemode == commercial) ) + && player->ammo[am_shell]>2) { player->pendingweapon = wp_supershotgun; } @@ -208,8 +206,7 @@ BOOL P_CheckAmmo (player_t *player) player->pendingweapon = wp_missile; } else if (player->weaponowned[wp_bfg] - && player->ammo[am_cell]>40 - && (gamemode != shareware) ) + && player->ammo[am_cell]>40) { player->pendingweapon = wp_bfg; } diff --git a/code/P_saveg.c b/code/P_saveg.c index 1ed0ea6893..9dd68114fa 100644 --- a/code/P_saveg.c +++ b/code/P_saveg.c @@ -36,10 +36,12 @@ #include "v_palett.h" extern button_t *buttonlist; +extern byte *translationtables; byte *save_p; +BOOL ZDoom117aSave; // // P_ArchivePlayers @@ -349,6 +351,11 @@ void P_ArchiveThinkers (void) // killough 2/14/98: end changes + if (mobj->translation) + mobj->translation = (byte *)(mobj->translation - translationtables); + else + mobj->translation = (byte *)-1; + if (mobj->player) mobj->player = (player_t *)((mobj->player-players) + 1); } @@ -413,7 +420,10 @@ void P_UnArchiveThinkers (BOOL keepPlayers) for (size = 1; *save_p++ == tc_mobj; size++) // killough 2/14/98 { // skip all entries, adding up count PADSAVEP(); - save_p += sizeof(mobj_t); + if (ZDoom117aSave) // Quick hack. To be removed. + save_p += sizeof(mobj_t)-sizeof(fixed_t); + else + save_p += sizeof(mobj_t); } if (*--save_p != tc_end) @@ -433,8 +443,32 @@ void P_UnArchiveThinkers (BOOL keepPlayers) mobj_p[size] = mobj; PADSAVEP(); - memcpy (mobj, save_p, sizeof(mobj_t)); - save_p += sizeof(mobj_t); + if (ZDoom117aSave) + { // Quick hack. To be removed. + memcpy (mobj, save_p, sizeof(mobj_t)-sizeof(fixed_t)); + mobj->translucency = (mobj->flags & 0x60000000) >> 15; + mobj->flags &= ~0x60000000; + if (mobj->translucency == 0) + { + if (mobj->flags2 & MF2_DONTDRAW) + { + mobj->flags2 &= ~MF2_DONTDRAW; + } + else + { + mobj->translucency = FRACUNIT; + } + } + if (mobj->type == MT_INS) + mobj->effects |= 0x40; // FX_VISIBILITYPULSE + mobj->visdir = 0; + save_p += sizeof(mobj_t)-sizeof(fixed_t); + } + else + { + memcpy (mobj, save_p, sizeof(mobj_t)); + save_p += sizeof(mobj_t); + } mobj->state = states + (int) mobj->state; if (mobj->player) { @@ -452,6 +486,7 @@ void P_UnArchiveThinkers (BOOL keepPlayers) mobj->player->camera = mobj; // [RH] Reset the camera to the player's viewpoint } + mobj->touching_sectorlist = NULL; P_SetThingPosition (mobj); mobj->info = &mobjinfo[mobj->type]; @@ -487,12 +522,17 @@ void P_UnArchiveThinkers (BOOL keepPlayers) ((mobj_t *) th)->goal = // [RH] restore goal mobj_p[(size_t)((mobj_t *)th)->goal]; + + if (ZDoom117aSave) // Quick hack. To be removed. + ((mobj_t *)th)->translation = NULL; + else + ((mobj_t *) th)->translation = ((ptrdiff_t)((mobj_t *) th)->translation != -1) ? + translationtables + (ptrdiff_t)((mobj_t *) th)->translation : NULL; } } // killough 3/26/98: Spawn icon landings: - if (gamemode == commercial) - P_SpawnBrainTargets(); + P_SpawnBrainTargets(); } @@ -934,7 +974,7 @@ void P_UnArchiveSpecials (void) ceiling->thinker.function.acp1 = (actionf_p1)T_MoveCeiling; P_AddThinker (&ceiling->thinker); - P_AddActiveCeiling(ceiling); + P_AddActiveCeiling (ceiling); break; case tc_door: diff --git a/code/P_setup.c b/code/P_setup.c index 4f40ad36a2..ba79f739dd 100644 --- a/code/P_setup.c +++ b/code/P_setup.c @@ -40,6 +40,7 @@ #include "doomstat.h" #include "p_lnspec.h" #include "v_palett.h" +#include "c_consol.h" extern void P_SpawnMapThing (mapthing2_t *mthing, int position); @@ -367,6 +368,8 @@ void P_LoadSectors (int lump) else ss->colormap = GetSpecialLights (255,255,255, RPART(level.fadeto),GPART(level.fadeto),BPART(level.fadeto)); + + ss->sky = 0; } Z_Free (data); @@ -1271,11 +1274,13 @@ void P_SetupLevel (char *lumpname, int position) level.killed_monsters = level.found_items = level.found_secrets = wminfo.maxfrags = 0; wminfo.partime = 180; - for (i=0 ; iflags2 & MF2_DONTDRAW) + if (!ignoreInvisibility && (t2->translucency == 0) && P_Random (pr_checksight) > 50) // <- small chance of an attack being made anyway return false; diff --git a/code/P_spec.c b/code/P_spec.c index 77248fd6ee..afad66ad22 100644 --- a/code/P_spec.c +++ b/code/P_spec.c @@ -317,7 +317,8 @@ BOOL CheckIfExitIsGood (mobj_t *self) if (self == NULL) return false; - if (deathmatch->value && dmflags & DF_NO_EXIT && self) { + if ((deathmatch->value || fakedmatch->value) && dmflags & DF_NO_EXIT && self) + { while (self->health > 0) P_DamageMobj (self, self, self, 10000, MOD_EXIT); return false; @@ -416,32 +417,6 @@ sector_t *P_NextSpecialSector (sector_t *sec, int type, sector_t *nogood) return NULL; } -// -// P_SectorActive() -// -// Passed a linedef special class (floor, ceiling, lighting) and a sector -// returns whether the sector is already busy with a linedef special of the -// same class. If old demo compatibility true, all linedef special classes -// are the same. -// -// jff 2/23/98 added to prevent old demos from -// succeeding in starting multiple specials on one sector -// -int P_SectorActive(special_e t,sector_t *sec) -{ - switch (t) // return whether thinker of same type is active - { - case floor_special: - return (int)sec->floordata; - case ceiling_special: - return (int)sec->ceilingdata; - case lighting_special: - return (int)sec->lightingdata; - } - return 1; // don't know which special, must be active, shouldn't be here -} - - // // P_FindLowestFloorSurrounding() // FIND LOWEST FLOOR HEIGHT IN SURROUNDING SECTORS @@ -1403,6 +1378,10 @@ void P_SpawnSpecials (void) P_SpawnLightPhased (sector); break; + case Sky2: + sector->sky = PL_SKYFLAT; + break; + default: // [RH] Try for normal Hexen scroller if ((sector->special & 0xff) >= Scroll_North_Slow && @@ -1434,7 +1413,6 @@ void P_SpawnSpecials (void) break; } } - // Init other misc stuff @@ -1443,9 +1421,7 @@ void P_SpawnSpecials (void) activeceilings = NULL; activeplats = NULL; - buttonlist = NULL; // [RH] And buttonlist is also a singly-linked list. - ActiveQuakes = NULL; // [RH] Clear out any earthquakes. // P_InitTagLists() must be called before P_FindSectorFromTag() @@ -1508,6 +1484,20 @@ void P_SpawnSpecials (void) } } break; + + // killough 10/98: + // + // Support for sky textures being transferred from sidedefs. + // Allows scrolling and other effects (but if scrolling is + // used, then the same sector tag needs to be used for the + // sky sector, the sky-transfer linedef, and the scroll-effect + // linedef). Still requires user to use F_SKY1 for the floor + // or ceiling texture, to distinguish floor and ceiling sky. + + case Init_TransferSky: + for (s = -1; (s = P_FindSectorFromTag(lines[i].args[0],s)) >= 0;) + sectors[s].sky = (i+1) | PL_SKYFLAT; + break; } break; } @@ -1866,7 +1856,8 @@ static void P_SpawnFriction(void) { if (l->special == Sector_SetFriction) { - int length, friction, movefactor, s; + int length, s; + fixed_t friction, movefactor; if (l->args[1]) { // [RH] Allow setting friction amount from parameter @@ -1878,20 +1869,25 @@ static void P_SpawnFriction(void) } friction = (0x1EB8*length)/0x80 + 0xD000; - // The following check might seem odd. At the time of movement, - // the move distance is multiplied by 'friction/0x10000', so a - // higher friction value actually means 'less friction'. - - if (friction > ORIG_FRICTION) // ice - movefactor = ((0x10092 - friction)*(0x70))/0x158; - else - movefactor = ((friction - 0xDB34)*(0xA))/0x80; - // killough 8/28/98: prevent odd situations if (friction > FRACUNIT) friction = FRACUNIT; if (friction < 0) friction = 0; + + // The following check might seem odd. At the time of movement, + // the move distance is multiplied by 'friction/0x10000', so a + // higher friction value actually means 'less friction'. + + // [RH] Twiddled these values so that momentum on ice (with + // friction 0xf900) is the same as in Heretic/Hexen. + if (friction > ORIG_FRICTION) // ice +// movefactor = ((0x10092 - friction)*(0x70))/0x158; + movefactor = ((0x10092 - friction) * 1024) / 4352 + 568; + else + movefactor = ((friction - 0xDB34)*(0xA))/0x80; + + // killough 8/28/98: prevent odd situations if (movefactor < 32) movefactor = 32; diff --git a/code/P_spec.h b/code/P_spec.h index b15849a643..e0fee7438c 100644 --- a/code/P_spec.h +++ b/code/P_spec.h @@ -349,7 +349,7 @@ typedef struct plat_s thinker_t thinker; // [RH] Added next and prev links - struct plat_s *next, *prev; + struct plat_s *next, **prev; sector_t* sector; fixed_t speed; @@ -496,7 +496,7 @@ typedef struct ceiling_s thinker_t thinker; // [RH] Added next and prev links - struct ceiling_s *next, *prev; + struct ceiling_s *next, **prev; ceiling_e type; sector_t* sector; @@ -685,9 +685,6 @@ BOOL EV_SilentLineTeleport (line_t *line, int side, mobj_t *thing, int id, BOOL reverse); -int P_SectorActive (special_e t, sector_t *s); // [RH] from BOOM - - // // [RH] ACS (see also p_acs.h) // diff --git a/code/P_switch.c b/code/P_switch.c index de28faccbb..11dbc140c2 100644 --- a/code/P_switch.c +++ b/code/P_switch.c @@ -26,18 +26,15 @@ #include "doomdef.h" #include "p_local.h" #include "p_lnspec.h" - #include "g_game.h" - #include "s_sound.h" - -// State. #include "doomstat.h" #include "r_state.h" - #include "z_zone.h" #include "w_wad.h" +#include "gi.h" + // // CHANGE THE TEXTURE OF A WALL SWITCH TO ITS OPPOSITE // @@ -57,29 +54,25 @@ void P_InitSwitchList(void) { byte *alphSwitchList = W_CacheLumpName ("SWITCHES", PU_STATIC); byte *list_p; - int i; - int episode; for (i = 0, list_p = alphSwitchList; list_p[18] || list_p[19]; list_p += 20, i++) ; - if (i == 0) { + if (i == 0) + { switchlist = Z_Malloc (sizeof(*switchlist), PU_STATIC, 0); *switchlist = -1; numswitches = 0; - } else { + } + else + { switchlist = Z_Malloc (sizeof(*switchlist)*(i*2+1), PU_STATIC, 0); - if (gamemode == registered || gamemode == retail) - episode = 2; - else if ( gamemode == commercial ) - episode = 3; - else - episode = 1; - - for (i = 0, list_p = alphSwitchList; list_p[18] || list_p[19]; list_p += 20) { - if (episode >= (list_p[18] | (list_p[19] << 8))) + for (i = 0, list_p = alphSwitchList; list_p[18] || list_p[19]; list_p += 20) + { + if (((gameinfo.maxSwitch & 15) >= (list_p[18] & 15)) && + ((gameinfo.maxSwitch & ~15) == (list_p[18] & ~15))) { // [RH] Skip this switch if it can't be found. if (R_CheckTextureNumForName (list_p /* .name1 */) < 0) diff --git a/code/P_user.c b/code/P_user.c index a6ec8cc60c..597beaa4bc 100644 --- a/code/P_user.c +++ b/code/P_user.c @@ -333,7 +333,7 @@ void P_DeathThink (player_t *player) // [RH] Delay rebirth slightly if (level.time >= player->respawn_time) { if (player->cmd.ucmd.buttons & BT_USE || - (deathmatch->value && dmflags & DF_FORCE_RESPAWN)) + ((deathmatch->value || fakedmatch->value) && dmflags & DF_FORCE_RESPAWN)) player->playerstate = PST_REBORN; } } diff --git a/code/P_xlat.c b/code/P_xlat.c index 761f265b87..57daa844a3 100644 --- a/code/P_xlat.c +++ b/code/P_xlat.c @@ -372,9 +372,12 @@ static const xlat_t SpecialTranslation[] = { /* 266 */ { MONWALK, Teleport_Line, { TAG, TAG, 0 } }, /* 267 */ { MONWALK|REP, Teleport_Line, { TAG, TAG, 0 } }, /* 268 */ { MONWALK, Teleport_NoFog, { TAG } }, -/* 269 */ { MONWALK|REP, Teleport_NoFog, { TAG } } +/* 269 */ { MONWALK|REP, Teleport_NoFog, { TAG } }, +/* 270 */ { 0, 0, { 0 } }, +/* 271 */ { 0, Static_Init, { TAG, Init_TransferSky, 0 } }, +/* 272 */ { 0, Static_Init, { TAG, Init_TransferSky, 1 } } }; -#define NUM_SPECIALS 269 +#define NUM_SPECIALS 272 void P_TranslateLineDef (line_t *ld, maplinedef_t *mld) { diff --git a/code/R_bsp.c b/code/R_bsp.c index 362db9f452..853c9448a7 100644 --- a/code/R_bsp.c +++ b/code/R_bsp.c @@ -684,12 +684,14 @@ void R_Subsector (int num) // killough 3/7/98: Add (x,y) offsets to flats, add deep water check // killough 3/16/98: add floorlightlevel - + // killough 10/98: add support for skies transferred from sidedefs floorplane = frontsector->floorheight < viewz || // killough 3/7/98 (frontsector->heightsec != -1 && sectors[frontsector->heightsec].ceilingpic == skyflatnum) ? R_FindPlane(frontsector->floorheight, - frontsector->floorpic, + frontsector->floorpic == skyflatnum && // kilough 10/98 + frontsector->sky & PL_SKYFLAT ? frontsector->sky : + frontsector->floorpic, floorlightlevel, // killough 3/16/98 frontsector->floor_xoffs, // killough 3/7/98 frontsector->floor_yoffs @@ -700,7 +702,9 @@ void R_Subsector (int num) (frontsector->heightsec != -1 && sectors[frontsector->heightsec].floorpic == skyflatnum) ? R_FindPlane(frontsector->ceilingheight, // killough 3/8/98 - frontsector->ceilingpic, + frontsector->ceilingpic == skyflatnum && // kilough 10/98 + frontsector->sky & PL_SKYFLAT ? frontsector->sky : + frontsector->ceilingpic, ceilinglightlevel, // killough 4/11/98 frontsector->ceiling_xoffs, // killough 3/7/98 frontsector->ceiling_yoffs diff --git a/code/R_data.c b/code/R_data.c index fbb6b9dca9..ef51ac2805 100644 --- a/code/R_data.c +++ b/code/R_data.c @@ -869,18 +869,8 @@ void R_PrecacheLevel (void) for (i = numsprites - 1; i >= 0; i--) { - if (hitlist[i]) { - int j; - - for (j = sprites[i].numframes - 1; j >= 0; j--) - { - short *sflumps = sprites[i].spriteframes[j].lump; - int k; - - for (k = 7; k >= 0; k--) - W_CacheLumpNum(sflumps[k], PU_CACHE); - } - } + if (hitlist[i]) + R_CacheSprite (sprites + i); } Z_Free (hitlist); diff --git a/code/R_defs.h b/code/R_defs.h index b69ad030dd..09ea8a907d 100644 --- a/code/R_defs.h +++ b/code/R_defs.h @@ -115,6 +115,8 @@ struct sector_s mobj_t* thinglist; // list of mobjs in sector int seqType; // this sector's sound sequence + int sky; + // killough 8/28/98: friction is a sector property, not an mobj property. // these fields used to be in mobj_t, but presented performance problems // when processed as mobj properties. Fix is to make them sector properties. @@ -385,6 +387,7 @@ struct vissprite_s int mobjflags; // for shadow draw byte *translation; // [RH] for translation; int heightsec; // killough 3/27/98: height sector for underwater/fake ceiling + fixed_t translucency; }; typedef struct vissprite_s vissprite_t; diff --git a/code/R_draw.c b/code/R_draw.c index fbaa18ff08..6cd491ccc4 100644 --- a/code/R_draw.c +++ b/code/R_draw.c @@ -24,23 +24,17 @@ //----------------------------------------------------------------------------- #include "m_alloc.h" - #include "doomdef.h" - #include "i_system.h" #include "z_zone.h" #include "w_wad.h" - #include "r_local.h" - -// Needs access to LFB (guess what). #include "v_video.h" - -// State. #include "doomstat.h" - #include "st_stuff.h" +#include "gi.h" + #undef RANGECHECK // status bar height at bottom of screen @@ -379,15 +373,51 @@ void R_DrawFuzzColumnP_C (void) // // R_DrawTranlucentColumn // -byte *dc_transmap; +fixed_t dc_translevel; + +/* +[RH] This note is from DOSDoom 0.65: + +New translucency algorithm, by Erik Sandberg: + +Basically, we compute the red, green and blue values for each pixel, and +then use a RGB table to check which one of the palette colours that best +represents those RGB values. The RGB table is 8k big, with 4 R-bits, +5 G-bits and 4 B-bits. A 4k table gives a bit too bad precision, and a 32k +table takes up more memory and results in more cache misses, so an 8k +table seemed to be quite ultimate. + +The computation of the RGB for each pixel is accelerated by using two +1k tables for each translucency level. +The xth element of one of these tables contains the r, g and b values for +the colour x, weighted for the current translucency level (for example, +the weighted rgb values for background colour at 75% translucency are 1/4 +of the original rgb values). The rgb values are stored as three +low-precision fixed point values, packed into one long per colour: +Bit 0-4: Frac part of blue (5 bits) +Bit 5-8: Int part of blue (4 bits) +Bit 9-13: Frac part of red (5 bits) +Bit 14-17: Int part of red (4 bits) +Bit 18-22: Frac part of green (5 bits) +Bit 23-27: Int part of green (5 bits) +Bit 28-31: All zeros (4 bits) + +The point of this format is that the two colours now can be added, and +then be converted to a RGB table index very easily: First, we just set +all the frac bits and the four upper zero bits to 1. It's now possible +to get the RGB table index by anding the current value >> 5 with the +current value >> 19. When asm-optimised, this should be the fastest +algorithm that uses RGB tables. + +*/ -#ifndef USEASM void R_DrawTranslucentColumnP_C (void) { - int count; - byte* dest; - fixed_t frac; - fixed_t fracstep; + int count; + byte *dest; + fixed_t frac; + fixed_t fracstep; + unsigned int *fg2rgb, *bg2rgb; count = dc_yh - dc_yl; if (count < 0) @@ -402,16 +432,23 @@ void R_DrawTranslucentColumnP_C (void) I_Error ( "R_DrawTranslucentColumnP_C: %i to %i at %i", dc_yl, dc_yh, dc_x); } - #endif + { + fixed_t fglevel, bglevel; + + fglevel = dc_translevel & ~0x3ff; + bglevel = FRACUNIT-fglevel; + fg2rgb = Col2RGB8[fglevel>>10]; + bg2rgb = Col2RGB8[bglevel>>10]; + } + dest = ylookup[dc_yl] + columnofs[dc_x]; fracstep = dc_iscale; frac = dc_texturemid + (dc_yl-centery)*fracstep; { - byte *transmap = dc_transmap; byte *colormap = dc_colormap; byte *source = dc_source; int mask = dc_mask; @@ -419,14 +456,18 @@ void R_DrawTranslucentColumnP_C (void) do { - *dest = transmap[colormap[source[(frac>>FRACBITS)&mask]] | ((*dest)<<8)]; - dest += pitch; + unsigned int fg = colormap[source[(frac>>FRACBITS)&mask]]; + unsigned int bg = *dest; + fg = fg2rgb[fg]; + bg = bg2rgb[bg]; + fg = (fg+bg) | 0xf07c3e1f; + *dest = RGB8k[0][0][(fg>>5) & (fg>>19)]; + dest += pitch; frac += fracstep; } while (--count); } } -#endif // USEASM // // R_DrawTranslatedColumn @@ -465,11 +506,9 @@ void R_DrawTranslatedColumnP_C (void) dest = ylookup[dc_yl] + columnofs[dc_x]; - // Looks familiar. fracstep = dc_iscale; frac = dc_texturemid + (dc_yl-centery)*fracstep; - // Here we do an additional index re-mapping. { // [RH] Local copies of global vars to improve compiler optimizations byte *colormap = dc_colormap; @@ -480,11 +519,6 @@ void R_DrawTranslatedColumnP_C (void) do { - // Translation tables are used - // to map certain colorramps to other ones, - // used with PLAY sprites. - // Thus the "green" ramp of the player 0 sprite - // is mapped to gray, red, black/indigo. *dest = colormap[translation[source[(frac>>FRACBITS) & mask]]]; dest += pitch; @@ -493,13 +527,14 @@ void R_DrawTranslatedColumnP_C (void) } } -// [RH] Draw a column that is both translated and translucent +// Draw a column that is both translated and translucent void R_DrawTlatedLucentColumnP_C (void) { - int count; - byte* dest; - fixed_t frac; - fixed_t fracstep; + int count; + byte *dest; + fixed_t frac; + fixed_t fracstep; + unsigned int *fg2rgb, *bg2rgb; count = dc_yh - dc_yl; if (count < 0) @@ -517,6 +552,15 @@ void R_DrawTlatedLucentColumnP_C (void) #endif + { + fixed_t fglevel, bglevel; + + fglevel = dc_translevel & ~0x3ff; + bglevel = FRACUNIT-fglevel; + fg2rgb = Col2RGB8[fglevel>>10]; + bg2rgb = Col2RGB8[bglevel>>10]; + } + dest = ylookup[dc_yl] + columnofs[dc_x]; fracstep = dc_iscale; @@ -524,7 +568,6 @@ void R_DrawTlatedLucentColumnP_C (void) { byte *translation = dc_translation; - byte *transmap = dc_transmap; byte *colormap = dc_colormap; byte *source = dc_source; int mask = dc_mask; @@ -532,9 +575,14 @@ void R_DrawTlatedLucentColumnP_C (void) do { - *dest = transmap[colormap[translation[source[(frac>>FRACBITS)&mask]]] | ((*dest)<<8)]; - dest += pitch; + unsigned int fg = colormap[translation[source[(frac>>FRACBITS)&mask]]]; + unsigned int bg = *dest; + fg = fg2rgb[fg]; + bg = bg2rgb[bg]; + fg = (fg+bg) | 0xf07c3e1f; + *dest = RGB8k[0][0][(fg>>5) & (fg>>19)]; + dest += pitch; frac += fracstep; } while (--count); } @@ -1071,7 +1119,7 @@ void R_DrawBorder (int x1, int y1, int x2, int y2) { int lump; - lump = R_FlatNumForName ((gamemode == commercial) ? "GRNROCK" : "FLOOR7_2"); + lump = R_FlatNumForName (gameinfo.borderFlat); V_FlatFill (x1 & ~63, y1, x2, y2, &screen, W_CacheLumpNum (lump + firstflat, PU_CACHE)); @@ -1094,6 +1142,8 @@ void V_MarkRect (int x, int y, int width, int height); void R_DrawViewBorder (void) { int x, y; + int offset, size; + gameborder_t *border; // [RH] Redraw the status bar if SCREENWIDTH > status bar width. // Will draw borders around itself, too. @@ -1106,43 +1156,47 @@ void R_DrawViewBorder (void) return; } + border = gameinfo.border; + offset = border->offset; + size = border->size; + R_DrawBorder (0, 0, screen.width, viewwindowy); R_DrawBorder (0, viewwindowy, viewwindowx, realviewheight + viewwindowy); R_DrawBorder (viewwindowx + realviewwidth, viewwindowy, screen.width, realviewheight + viewwindowy); R_DrawBorder (0, viewwindowy + realviewheight, screen.width, ST_Y); - for (x = viewwindowx; x < viewwindowx + realviewwidth; x += 8) + for (x = viewwindowx; x < viewwindowx + realviewwidth; x += size) { - V_DrawPatch (x, viewwindowy - 8, &screen, W_CacheLumpName ("brdr_t", PU_CACHE)); - V_DrawPatch (x, viewwindowy + realviewheight, &screen, W_CacheLumpName ("brdr_b", PU_CACHE)); + V_DrawPatch (x, viewwindowy - offset, &screen, + W_CacheLumpName (border->t, PU_CACHE)); + V_DrawPatch (x, viewwindowy + realviewheight, &screen, + W_CacheLumpName (border->b, PU_CACHE)); } - for (y = viewwindowy; y < viewwindowy + realviewheight; y += 8) + for (y = viewwindowy; y < viewwindowy + realviewheight; y += size) { - V_DrawPatch (viewwindowx - 8, y, &screen, W_CacheLumpName ("brdr_l", PU_CACHE)); - V_DrawPatch (viewwindowx + realviewwidth, y, &screen, W_CacheLumpName ("brdr_r", PU_CACHE)); + V_DrawPatch (viewwindowx - offset, y, &screen, + W_CacheLumpName (border->l, PU_CACHE)); + V_DrawPatch (viewwindowx + realviewwidth, y, &screen, + W_CacheLumpName (border->r, PU_CACHE)); } // Draw beveled edge. - V_DrawPatch (viewwindowx-8, - viewwindowy-8, + V_DrawPatch (viewwindowx-offset, viewwindowy-offset, &screen, - W_CacheLumpName ("brdr_tl",PU_CACHE)); + W_CacheLumpName (border->tl, PU_CACHE)); - V_DrawPatch (viewwindowx+realviewwidth, - viewwindowy-8, + V_DrawPatch (viewwindowx+realviewwidth, viewwindowy-offset, &screen, - W_CacheLumpName ("brdr_tr",PU_CACHE)); + W_CacheLumpName (border->tr, PU_CACHE)); - V_DrawPatch (viewwindowx-8, - viewwindowy+realviewheight, + V_DrawPatch (viewwindowx-offset, viewwindowy+realviewheight, &screen, - W_CacheLumpName ("brdr_bl",PU_CACHE)); + W_CacheLumpName (border->bl, PU_CACHE)); - V_DrawPatch (viewwindowx+realviewwidth, - viewwindowy+realviewheight, + V_DrawPatch (viewwindowx+realviewwidth, viewwindowy+realviewheight, &screen, - W_CacheLumpName ("brdr_br",PU_CACHE)); + W_CacheLumpName (border->br, PU_CACHE)); - V_MarkRect (0,0,screen.width, ST_Y); + V_MarkRect (0, 0, screen.width, ST_Y); } /* @@ -1264,7 +1318,7 @@ void R_InitColumnDrawers (BOOL is8bit) R_DrawColumn = R_DrawColumnP_ASM; R_DrawColumnHoriz = R_DrawColumnHorizP_ASM; R_DrawFuzzColumn = R_DrawFuzzColumnP_ASM; - R_DrawTranslucentColumn = R_DrawTranslucentColumnP_ASM; + R_DrawTranslucentColumn = R_DrawTranslucentColumnP_C; R_DrawTranslatedColumn = R_DrawTranslatedColumnP_C; if (screen.width <= 320) R_DrawSpan = R_DrawSpanP_Unrolled; diff --git a/code/R_draw.h b/code/R_draw.h index c3644cdd3f..4f50d6f8db 100644 --- a/code/R_draw.h +++ b/code/R_draw.h @@ -149,7 +149,7 @@ void R_DrawSpanP_Unrolled (void); void R_DrawColumnHorizP_ASM (void); void R_DrawColumnP_ASM (void); void R_DrawFuzzColumnP_ASM (void); -void R_DrawTranslucentColumnP_ASM (void); +void R_DrawTranslucentColumnP_C (void); void R_DrawTranslatedColumnP_C (void); void R_DrawSpanP (void); @@ -191,7 +191,7 @@ extern int ds_color; // [RH] For flat color (no texturing) extern byte* translationtables; extern byte* dc_translation; -extern byte* dc_transmap; +extern fixed_t dc_translevel; /* [Petteri] R_DrawSpan8() optimized inner loop (does two pixels diff --git a/code/R_main.c b/code/R_main.c index 27ab3f81f8..8a7691ce70 100644 --- a/code/R_main.c +++ b/code/R_main.c @@ -1026,12 +1026,14 @@ void R_RenderPlayerView (player_t *player) colfunc = R_FillColumnP; //spanfunc = R_FillSpan; } - - hcolfunc_pre = R_DrawColumnHoriz; - colfunc = basecolfunc; - hcolfunc_post1 = rt_map1col; - hcolfunc_post2 = rt_map2cols; - hcolfunc_post4 = rt_map4cols; + else + { + hcolfunc_pre = R_DrawColumnHoriz; + colfunc = basecolfunc; + hcolfunc_post1 = rt_map1col; + hcolfunc_post2 = rt_map2cols; + hcolfunc_post4 = rt_map4cols; + } // Never draw the player unless in chasecam mode if (camera->player && !(camera->player->cheats & CF_CHASECAM)) { diff --git a/code/R_plane.c b/code/R_plane.c index 59d1592b64..6615a006a0 100644 --- a/code/R_plane.c +++ b/code/R_plane.c @@ -88,7 +88,6 @@ short *ceilingclip; // initialized to 0 at start // int *spanstart; -int *spanstop; // // texture mapping @@ -132,18 +131,14 @@ void R_InitPlanes (void) void R_MapPlane (int y, int x1, int x2) { - angle_t angle; - fixed_t distance; - fixed_t length; - unsigned index; + angle_t angle; + fixed_t distance, length; + unsigned index; #ifdef RANGECHECK - if (x2 < x1 - || x1<0 - || x2>=viewwidth - || (unsigned)y>=(unsigned)viewheight) + if (x2 < x1 || x1<0 || x2>=viewwidth || (unsigned)y>=(unsigned)viewheight) { - I_FatalError ("R_MapPlane: %i, %i at %i",x1,x2,y); + I_FatalError ("R_MapPlane: %i, %i at %i", x1, x2, y); } #endif if (planeheight != cachedheight[y]) @@ -198,8 +193,8 @@ void R_MapPlane (int y, int x1, int x2) void R_ClearPlanes (void) { - int i; - angle_t angle; + int i; + angle_t angle; // opening / clipping determination for (i = 0; i < viewwidth ; i++) @@ -214,10 +209,10 @@ void R_ClearPlanes (void) lastopening = openings; - // texture calculation + // Texture calculation memset (cachedheight, 0, sizeof(*cachedheight) * screen.height); angle = (viewangle - ANG90)>>ANGLETOFINESHIFT; // left to right mapping - // scale will be unit scale at SCREENWIDTH/2 distance + // Scale will be unit scale at SCREENWIDTH/2 distance basexscale = FixedDiv (finecosine[angle], centerxfrac); baseyscale = -FixedDiv (finesine[angle], centerxfrac); } @@ -259,8 +254,8 @@ visplane_t *R_FindPlane (fixed_t height, int picnum, int lightlevel, visplane_t *check; unsigned hash; // killough - if (picnum == skyflatnum) - height = lightlevel = 0; // all skys map together + if (picnum == skyflatnum || picnum & PL_SKYFLAT) // killough 10/98 + height = lightlevel = 0; // most skies map together // New visplane algorithm uses hash table -- killough hash = visplane_hash (picnum, lightlevel, height); @@ -282,7 +277,7 @@ visplane_t *R_FindPlane (fixed_t height, int picnum, int lightlevel, check->xoffs = xoffs; // killough 2/28/98: Save offsets check->yoffs = yoffs; check->colormap = basecolormap; // [RH] Save colormap - check->minx = screen.width; + check->minx = viewwidth; // Was SCREENWIDTH -- killough 11/98 check->maxx = -1; memset (check->top, 0xff, sizeof(*check->top) * screen.width); @@ -383,6 +378,9 @@ void R_MakeSpans (int x, int t1, int b1, int t2, int b2) //========================================================================== static visplane_t *_skypl; +static int frontskytex, backskytex; +static angle_t skyflip; +static int frontpos, backpos; static void _skycolumn (void (*drawfunc)(void), int x) { @@ -390,11 +388,11 @@ static void _skycolumn (void (*drawfunc)(void), int x) dc_yh = _skypl->bottom[x]; if (dc_yl <= dc_yh) { - int angle = ((((viewangle + xtoviewangle[x])>>(ANGLETOSKYSHIFT-16)) + sky1pos)>>16); + int angle = ((((viewangle + xtoviewangle[x])^skyflip)>>(ANGLETOSKYSHIFT-16)) + frontpos)>>16; - if (!(level.flags & LEVEL_DOUBLESKY)) + if (backskytex == -1) { - dc_source = R_GetColumn (sky1texture, angle); + dc_source = R_GetColumn (frontskytex, angle); drawfunc (); } else @@ -413,9 +411,9 @@ static void _skycolumn (void (*drawfunc)(void), int x) bottom >>= FRACBITS; count = bottom - top + 1; - source = R_GetColumn (sky1texture, angle) + top; - angle = ((((viewangle + xtoviewangle[x])>>(ANGLETOSKYSHIFT-16)) + sky2pos)>>16); - source2 = R_GetColumn (sky2texture, angle) + top; + source = R_GetColumn (frontskytex, angle) + top; + angle = ((((viewangle + xtoviewangle[x])^skyflip)>>(ANGLETOSKYSHIFT-16)) + backpos)>>16; + source2 = R_GetColumn (backskytex, angle) + top; dest = composite + top; do @@ -538,8 +536,55 @@ void R_DrawPlanes (void) continue; // sky flat - if (pl->picnum == skyflatnum) + if (pl->picnum == skyflatnum || pl->picnum & PL_SKYFLAT) { + if (pl->picnum == skyflatnum) + { // use sky1 + frontskytex = sky1texture; + if (level.flags & LEVEL_DOUBLESKY) + backskytex = sky2texture; + else + backskytex = -1; + skyflip = 0; + frontpos = sky1pos; + backpos = sky2pos; + } + else if (pl->picnum == PL_SKYFLAT) + { // use sky2 + frontskytex = sky2texture; + backskytex = -1; + skyflip = 0; + frontpos = sky2pos; + } + else + { // MBF's linedef-controlled skies + // Sky Linedef + const line_t *l = &lines[(pl->picnum & ~PL_SKYFLAT)-1]; + + // Sky transferred from first sidedef + const side_t *s = *l->sidenum + sides; + + // Texture comes from upper texture of reference sidedef + frontskytex = texturetranslation[s->toptexture]; + backskytex = -1; + + // Horizontal offset is turned into an angle offset, + // to allow sky rotation as well as careful positioning. + // However, the offset is scaled very small, so that it + // allows a long-period of sky rotation. + frontpos = (-s->textureoffset) >> (ANGLETOSKYSHIFT-16); + + // Vertical offset allows careful sky positioning. + dc_texturemid = s->rowoffset - 28*FRACUNIT; + + // We sometimes flip the picture horizontally. + // + // Doom always flipped the picture, so we make it optional, + // to make it easier to use the new feature, while to still + // allow old sky textures to be used. + skyflip = l->args[2] ? 0u : ~0u; + } + if (fixedlightlev) { dc_colormap = DefaultPalette->maps.colormaps + fixedlightlev; } else if (fixedcolormap) { @@ -616,7 +661,6 @@ BOOL R_PlaneInitData (void) ceilingclip = Malloc (screen.width * sizeof(*ceilingclip)); spanstart = Calloc (screen.height, sizeof(*spanstart)); - spanstop = Calloc (screen.height, sizeof(*spanstop)); yslopetab = Calloc ((screen.height<<1)+(screen.height>>1), sizeof(*yslopetab)); distscale = Calloc (screen.width, sizeof(*distscale)); diff --git a/code/R_plane.h b/code/R_plane.h index 4226b423ab..2178016f7c 100644 --- a/code/R_plane.h +++ b/code/R_plane.h @@ -27,6 +27,9 @@ #include "r_data.h" +// killough 10/98: special mask indicates sky flat comes from sidedef +#define PL_SKYFLAT (0x80000000) + // Visplane related. extern short* lastopening; @@ -46,35 +49,18 @@ extern fixed_t *distscale; void R_InitPlanes (void); void R_ClearPlanes (void); -void -R_MapPlane -( int y, - int x1, - int x2 ); - -void -R_MakeSpans -( int x, - int t1, - int b1, - int t2, - int b2 ); - +void R_MapPlane (int y, int x1, int x2); +void R_MakeSpans (int x, int t1, int b1, int t2, int b2); void R_DrawPlanes (void); -visplane_t* -R_FindPlane +visplane_t *R_FindPlane ( fixed_t height, int picnum, int lightlevel, fixed_t xoffs, // killough 2/28/98: add x-y offsets fixed_t yoffs ); -visplane_t* -R_CheckPlane -( visplane_t* pl, - int start, - int stop ); +visplane_t *R_CheckPlane (visplane_t *pl, int start, int stop); // [RH] Added for multires support diff --git a/code/R_segs.c b/code/R_segs.c index e7fa47c4d4..81b79e6912 100644 --- a/code/R_segs.c +++ b/code/R_segs.c @@ -164,7 +164,7 @@ void R_RenderMaskedSegRange (drawseg_t *ds, int x1, int x2) if (!r_columnmethod->value) { if (curline->linedef->lucency < 240) { colfunc = lucentcolfunc; - dc_transmap = TransTable + ((curline->linedef->lucency << 10) & 0x30000); + dc_translevel = curline->linedef->lucency << 8; } else colfunc = basecolfunc; // killough 4/11/98: end translucent 2s normal code @@ -175,7 +175,7 @@ void R_RenderMaskedSegRange (drawseg_t *ds, int x1, int x2) hcolfunc_post1 = rt_lucent1col; hcolfunc_post2 = rt_lucent2cols; hcolfunc_post4 = rt_lucent4cols; - dc_transmap = TransTable + ((curline->linedef->lucency << 10) & 0x30000); + dc_translevel = curline->linedef->lucency << 8; } else { hcolfunc_post1 = rt_map1col; hcolfunc_post2 = rt_map2cols; diff --git a/code/R_things.c b/code/R_things.c index e91d91b3b6..aa089b3b21 100644 --- a/code/R_things.c +++ b/code/R_things.c @@ -84,6 +84,7 @@ short *negonearray; short *screenheightarray; #define MAX_SPRITE_FRAMES 29 // [RH] Macro-ized as in BOOM. +#define SPRITE_NEEDS_INFO MAXINT cvar_t *r_drawplayersprites; // [RH] Draw player sprites? @@ -113,6 +114,30 @@ particle_t *Particles; cvar_t *r_particles; +void R_CacheSprite (spritedef_t *sprite) +{ + int i, r; + patch_t *patch; + + DPrintf ("cache sprite %s\n", + sprite - sprites < NUMSPRITES ? sprnames[sprite - sprites] : ""); + for (i = 0; i < sprite->numframes; i++) + { + for (r = 0; r < 8; r++) + { + if (sprite->spriteframes[i].width[r] == SPRITE_NEEDS_INFO) + { + if (sprite->spriteframes[i].lump[r] == -1) + I_Error ("Sprite %d, rotation %d has no lump", i, r); + patch = W_CacheLumpNum (sprite->spriteframes[i].lump[r], PU_CACHE); + sprite->spriteframes[i].width[r] = SHORT(patch->width)<spriteframes[i].offset[r] = SHORT(patch->leftoffset)<spriteframes[i].topoffset[r] = SHORT(patch->topoffset)<= MAX_SPRITE_FRAMES || rotation > 8) I_FatalError ("R_InstallSpriteLump: Bad frame characters in lump %i", lump); - patch = W_CacheLumpNum (lump, PU_CACHE); - if ((int)frame > maxframe) maxframe = frame; @@ -150,22 +166,14 @@ static void R_InstallSpriteLump (int lump, unsigned frame, unsigned rotation, BO sprtemp[frame].lump[r] = (short)(lump); sprtemp[frame].flip[r] = (byte)flipped; sprtemp[frame].rotate = false; - - // [RH] Need to set these, too. - sprtemp[frame].width[r] = SHORT(patch->width)<leftoffset)<topoffset)<width)<leftoffset)<topoffset)< 1) S_HashSounds (); @@ -693,9 +698,9 @@ void R_DrawVisSprite (vissprite_t *vis, int x1, int x2) { // [RH] I use MF_SHADOW to recognize fuzz effect now instead of // a NULL colormap. This allow proper substition of - // MF_TRANSLUC25 with light levels if desired. The original - // code used colormap == NULL instead. - dc_transmap = TransTable + 65536; // Just in case + // translucency with light levels if desired. The original + // code used colormap == NULL to indicate shadows. + dc_translevel = FRACUNIT/5; if (r_drawfuzz->value) { colfunc = fuzzcolfunc; } else { @@ -705,13 +710,13 @@ void R_DrawVisSprite (vissprite_t *vis, int x1, int x2) colfunc = tlatedlucentcolfunc; } } - else if ((vis->mobjflags & MF_TRANSLUCBITS) && TransTable) + else if (vis->translucency < FRACUNIT) { // [RH] draw translucent column if (colfunc == basecolfunc) colfunc = lucentcolfunc; else colfunc = tlatedlucentcolfunc; - dc_transmap = TransTable + ((vis->mobjflags & MF_TRANSLUCBITS) >> (MF_TRANSLUCSHIFT - 16)); + dc_translevel = vis->translucency; } //dc_iscale = abs(vis->xiscale)>>detailshift; @@ -870,8 +875,7 @@ void R_ProjectSprite (mobj_t *thing) int heightsec; // killough 3/27/98 - // [RH] Andy Baker's stealth monsters - if (thing->flags2 & MF2_DONTDRAW) + if (thing->flags2 & MF2_DONTDRAW || thing->translucency == 0) return; // transform the origin point @@ -913,7 +917,7 @@ void R_ProjectSprite (mobj_t *thing) return; } #endif - sprframe = &sprdef->spriteframes[ thing->frame & FF_FRAMEMASK]; + sprframe = &sprdef->spriteframes[thing->frame & FF_FRAMEMASK]; if (sprframe->rotate) { @@ -929,6 +933,9 @@ void R_ProjectSprite (mobj_t *thing) lump = sprframe->lump[rot = 0]; flip = (BOOL)sprframe->flip[0]; } + + if (sprframe->width[rot] == SPRITE_NEEDS_INFO) + R_CacheSprite (sprdef); // [RH] speeds up game startup time // calculate edges of the shape tx -= sprframe->offset[rot]; // [RH] Moved out of spriteoffset[] @@ -990,6 +997,7 @@ void R_ProjectSprite (mobj_t *thing) vis->x1 = x1 < 0 ? 0 : x1; vis->x2 = x2 >= viewwidth ? viewwidth-1 : x2; vis->translation = thing->translation; // [RH] thing translation table + vis->translucency = thing->translucency; iscale = FixedDiv (FRACUNIT, xscale); if (flip) @@ -1103,6 +1111,9 @@ void R_DrawPSprite (pspdef_t* psp, unsigned flags) lump = sprframe->lump[0]; flip = (BOOL)sprframe->flip[0]; + + if (sprframe->width[0] == SPRITE_NEEDS_INFO) + R_CacheSprite (sprdef); // [RH] speeds up game startup time // calculate edges of the shape tx = psp->sx-((320/2)<x2 = x2 >= viewwidth ? viewwidth-1 : x2; vis->scale = pspriteyscale; vis->translation = NULL; // [RH] Use default colors + vis->translucency = FRACUNIT; if (flip) { @@ -1680,7 +1692,7 @@ void R_ProjectParticle (particle_t *particle) vis->mobjflags = particle->trans; if (fixedlightlev) { - vis->colormap = basecolormap + fixedlightlev; + vis->colormap = sector->colormap->maps + fixedlightlev; } else if (fixedcolormap) { vis->colormap = fixedcolormap; } else if (sector) { @@ -1695,7 +1707,7 @@ void R_ProjectParticle (particle_t *particle) if (index >= MAXLIGHTSCALE) index = MAXLIGHTSCALE-1; - vis->colormap = scalelight[lightnum][index] + basecolormap; + vis->colormap = scalelight[lightnum][index] + sector->colormap->maps; } else { vis->colormap = realcolormaps; } @@ -1706,12 +1718,9 @@ void R_DrawParticle (vissprite_t *vis, int x1, int x2) byte color = vis->colormap[vis->startfrac]; int yl = (centeryfrac - FixedMul(vis->texturemid, vis->scale) + FRACUNIT - 1) >> FRACBITS; int yh; - int y; x1 = vis->x1; x2 = vis->x2; -// dc_transmap = TransTable + ((vis->mobjflags & MF_TRANSLUCBITS) >> (MF_TRANSLUCSHIFT - 16)); - if (x1 < 0) x1 = 0; if (x2 < x1) @@ -1731,34 +1740,46 @@ void R_DrawParticle (vissprite_t *vis, int x1, int x2) if (yl <= mceilingclip[x2]) yl = mceilingclip[x2]+1; - // vis->mobjflags holds translucency level (1-255) - if (!TransTable || vis->mobjflags >= 192) { - for (y = yl; y <= yh; y++) { - byte *dest = ylookup[y] + columnofs[x1]; - int count = x2 - x1 + 1; - do { - *dest = color; - dest += ds_colsize; - } while (--count); - } - } else { - byte *transmap; + // vis->mobjflags holds translucency level (0-255) + { + unsigned int *bg2rgb; + int countbase = x2 - x1 + 1; + int ycount; + int colsize = ds_colsize; + int spacing; + byte *dest; + unsigned int fg; - if (vis->mobjflags >= 128) - transmap = TransTable + 65536; - else if (vis->mobjflags >= 64) - transmap = TransTable + 65536*2; - else - transmap = TransTable + 65536*3; - transmap += color << 8; + ycount = yh - yl; + if (ycount < 0) + return; + ycount++; - for (y = yl; y <= yh; y++) { - byte *dest = ylookup[y] + columnofs[x1]; - int count = x2 - x1 + 1; - do { - *dest = transmap[*dest]; - dest += ds_colsize; - } while (--count); + { + fixed_t fglevel, bglevel; + unsigned int *fg2rgb; + + fglevel = ((vis->mobjflags + 1) << 8) & ~0x3ff; + bglevel = FRACUNIT-fglevel; + fg2rgb = Col2RGB8[fglevel>>10]; + bg2rgb = Col2RGB8[bglevel>>10]; + fg = fg2rgb[color]; } + + spacing = screen.pitch - (countbase << detailxshift); + dest = ylookup[yl] + columnofs[x1]; + + do + { + int count = countbase; + do + { + unsigned int bg = bg2rgb[*dest]; + bg = (fg+bg) | 0xf07c3e1f; + *dest = RGB8k[0][0][(bg>>5) & (bg>>19)]; + dest += colsize; + } while (--count); + dest += spacing; + } while (--ycount); } } diff --git a/code/R_things.h b/code/R_things.h index a964dfda8d..566013ff0d 100644 --- a/code/R_things.h +++ b/code/R_things.h @@ -88,8 +88,8 @@ extern fixed_t pspriteyscale; // [RH] Aspect ratio stuff (from Doom Legacy) void R_DrawMaskedColumn (column_t* column); +void R_CacheSprite (spritedef_t *sprite); void R_SortVisSprites (void); - void R_AddSprites (sector_t *sec, int lightlevel); void R_AddPSprites (void); void R_DrawSprites (void); diff --git a/code/S_sound.c b/code/S_sound.c index 30cd9fdddc..4d43f68ccd 100644 --- a/code/S_sound.c +++ b/code/S_sound.c @@ -40,6 +40,11 @@ #include "v_video.h" #include "v_text.h" +#define SELECT_ATTEN(a) ((a)==ATTN_NONE ? 0 : (a)==ATTN_SURROUND ? -1 : \ + (a)==ATTN_STATIC ? 3 : 1) +#ifndef FIXED2FLOAT +#define FIXED2FLOAT(f) (((float)(f))/(float)65536) +#endif #define MAX_SND_DIST 2025 #define PRIORITY_MAX_ADJUST 10 @@ -62,7 +67,7 @@ typedef struct int sound_id; int entchannel; // entity's sound channel int basepriority; - int attenuation; + float attenuation; float volume; int pitch; int priority; @@ -116,10 +121,15 @@ static fixed_t P_AproxDistance2 (mobj_t *listener, fixed_t x, fixed_t y) { // calculate the distance to sound origin // and clip it if necessary - fixed_t adx = abs (listener->x - x); - fixed_t ady = abs (listener->y - y); - // From _GG1_ p.428. Appox. eucledian distance fast. - return adx + ady - ((adx < ady ? adx : ady)>>1); + if (listener) + { + fixed_t adx = abs (listener->x - x); + fixed_t ady = abs (listener->y - y); + // From _GG1_ p.428. Appox. eucledian distance fast. + return adx + ady - ((adx < ady ? adx : ady)>>1); + } + else + return 0; } // @@ -136,9 +146,9 @@ void S_NoiseDebug (void) y += 8; V_DrawText (CR_GREY, 0, y, "name"); - V_DrawText (CR_GREY, 70, y, "mo.x"); - V_DrawText (CR_GREY, 120, y, "mo.y"); - V_DrawText (CR_GREY, 170, y, "id"); + V_DrawText (CR_GREY, 70, y, "x"); + V_DrawText (CR_GREY, 120, y, "y"); + V_DrawText (CR_GREY, 170, y, "vol"); V_DrawText (CR_GREY, 200, y, "pri"); V_DrawText (CR_GREY, 240, y, "dist"); V_DrawText (CR_GREY, 280, y, "chan"); @@ -149,14 +159,18 @@ void S_NoiseDebug (void) char temp[16]; mobj_t *origin = Channel[i].mo; - if (Channel[i].attenuation == ATTN_NONE || - Channel[i].attenuation == ATTN_SURROUND) { + if (Channel[i].attenuation <= 0) + { ox = players[consoleplayer].camera->x; oy = players[consoleplayer].camera->y; - } else if (origin) { + } + else if (origin) + { ox = origin->x; oy = origin->y; - } else { + } + else + { ox = Channel[i].x; oy = Channel[i].y; } @@ -168,7 +182,7 @@ void S_NoiseDebug (void) V_DrawText (color, 70, y, temp); sprintf (temp, "%d", oy / FRACUNIT); V_DrawText (color, 120, y, temp); - sprintf (temp, "%ld", Channel[i].sfxinfo - S_sfx); + sprintf (temp, "%g", Channel[i].volume); V_DrawText (color, 170, y, temp); sprintf (temp, "%d", Channel[i].priority); V_DrawText (color, 200, y, temp); @@ -284,8 +298,14 @@ void S_Start (void) // [RH] Split S_StartSoundAtVolume into multiple parts so that sounds can // be specified both by id and by name. Also borrowed some stuff from // Hexen and parameters from Quake. +// +// 0 attenuation means full volume over whole level +// -1 attenuation means full volume in surround over whole level +// 0 0) + attenuation = 0; + } + else if (ent == (mobj_t *)(~0)) + { ent = NULL; - } else { + } + else + { x = ent->x; y = ent->y; } @@ -313,24 +338,31 @@ static void S_StartSound (mobj_t *ent, fixed_t x, fixed_t y, int channel, if (volume > 1) volume = 1; - if (attenuation == ATTN_NONE) { + if (attenuation == 0) + { sep = NORM_SEP; dist = 0; - } else if (attenuation == ATTN_SURROUND) { + } + else if (attenuation < 0) + { sep = -1; dist = 0; - } else { + } + else + { // calculate the distance before other stuff so we can throw out // sounds that are beyond the hearing range. - dist = P_AproxDistance2 (players[consoleplayer].camera, x, y) >> FRACBITS; - if (attenuation == ATTN_STATIC) - dist *= 3; - if (dist >= MAX_SND_DIST) { + dist = (int)(FIXED2FLOAT + (P_AproxDistance2 (players[consoleplayer].camera, x, y)) + * attenuation); + if (dist >= MAX_SND_DIST) + { if (level.flags & LEVEL_NOSOUNDCLIPPING) dist = MAX_SND_DIST; else return; // sound is beyond the hearing range... - } else if (dist < 0) + } + else if (dist < 0) dist = 0; sep = -2; // Calculate separation later on } @@ -344,12 +376,18 @@ static void S_StartSound (mobj_t *ent, fixed_t x, fixed_t y, int channel, sfx = sfx->link; } - if (sfx->lumpnum == sfx_empty) { + if (sfx->lumpnum == sfx_empty) + { basepriority = -1000; - } else if (attenuation == ATTN_NONE || attenuation == ATTN_SURROUND) { + } + else if (attenuation <= 0) + { basepriority = 200; - } else { - switch (channel) { + } + else + { + switch (channel) + { case CHAN_WEAPON: basepriority = 100; break; @@ -364,7 +402,7 @@ static void S_StartSound (mobj_t *ent, fixed_t x, fixed_t y, int channel, basepriority = 25; break; } - if (attenuation == ATTN_NORM) + if (attenuation == 1) basepriority += 50; if (dist == 0) basepriority += 30; @@ -374,30 +412,41 @@ static void S_StartSound (mobj_t *ent, fixed_t x, fixed_t y, int channel, if (!S_StopSoundID (sound_id, priority)) return; // other sounds have greater priority - if (ent) { - for (i = 0; i < numChannels; i++) { + if (ent) + { + for (i = 0; i < numChannels; i++) + { if (Channel[i].sfxinfo && ent == Channel[i].mo && - Channel[i].entchannel == channel) { + Channel[i].entchannel == channel) + { break; } } - if (i < numChannels && channel != CHAN_AUTO) { + if (i < numChannels && channel != CHAN_AUTO) + { S_StopChannel (i); - } else if (channel == CHAN_AUTO) { + } + else if (channel == CHAN_AUTO) + { int chansused[8], freechan; memset (chansused, 0, sizeof(chansused)); freechan = numChannels; - for (i = 0; i < numChannels; i++) { - if (!Channel[i].sfxinfo) { + for (i = 0; i < numChannels; i++) + { + if (!Channel[i].sfxinfo) + { freechan = i; - } else if (ent == Channel[i].mo) { + } + else if (ent == Channel[i].mo) + { chansused[Channel[i].entchannel] = 1; } } - for (i = 7; i >= 0; i--) { + for (i = 7; i >= 0; i--) + { if (!chansused[i]) break; } @@ -406,31 +455,42 @@ static void S_StartSound (mobj_t *ent, fixed_t x, fixed_t y, int channel, channel = i; i = freechan; } - } else { + } + else + { i = numChannels; } - if (i >= numChannels) { - for (i = 0; i < numChannels; i++) { - if (Channel[i].sfxinfo == NULL) { + if (i >= numChannels) + { + for (i = 0; i < numChannels; i++) + { + if (Channel[i].sfxinfo == NULL) + { break; } } - if (i >= numChannels) { + if (i >= numChannels) + { // look for a lower priority sound to replace. sndcount++; if (sndcount >= numChannels) sndcount = 0; - for (chan = 0; chan < numChannels; chan++) { + for (chan = 0; chan < numChannels; chan++) + { i = (sndcount + chan) % numChannels; - if (priority >= Channel[i].priority) { + if (priority >= Channel[i].priority) + { chan = -1; //denote that sound should be replaced. break; } } - if (chan != -1) { + if (chan != -1) + { return; // no free channels. - } else { + } + else + { // replace the lower priority sound. S_StopChannel (i); } @@ -438,11 +498,15 @@ static void S_StartSound (mobj_t *ent, fixed_t x, fixed_t y, int channel, } vol = (int)(SoundCurve[dist]*volume*2); - if (sep == -2) { + if (sep == -2) + { mobj_t *listener = players[consoleplayer].camera; - if (!listener || dist == 0) { + if (!listener || dist == 0) + { sep = NORM_SEP; - } else { + } + else + { angle = R_PointToAngle2 (listener->x, listener->y, x, y); if (angle > listener->angle) angle = angle - listener->angle; @@ -482,16 +546,16 @@ static void S_StartSound (mobj_t *ent, fixed_t x, fixed_t y, int channel, void S_SoundID (mobj_t *ent, int channel, int sound_id, float volume, int attenuation) { - S_StartSound (ent, 0, 0, channel, sound_id, volume, attenuation, false); + S_StartSound (ent, 0, 0, channel, sound_id, volume, SELECT_ATTEN(attenuation), false); } void S_LoopedSoundID (mobj_t *ent, int channel, int sound_id, float volume, int attenuation) { - S_StartSound (ent, 0, 0, channel, sound_id, volume, attenuation, true); + S_StartSound (ent, 0, 0, channel, sound_id, volume, SELECT_ATTEN(attenuation), true); } static void S_StartNamedSound (mobj_t *ent, fixed_t x, fixed_t y, int channel, - char *name, float volume, int attenuation, BOOL looping) + char *name, float volume, float attenuation, BOOL looping) { int sfx_id; @@ -526,17 +590,17 @@ static void S_StartNamedSound (mobj_t *ent, fixed_t x, fixed_t y, int channel, void S_Sound (mobj_t *ent, int channel, char *name, float volume, int attenuation) { - S_StartNamedSound (ent, 0, 0, channel, name, volume, attenuation, false); + S_StartNamedSound (ent, 0, 0, channel, name, volume, SELECT_ATTEN(attenuation), false); } void S_LoopedSound (mobj_t *ent, int channel, char *name, float volume, int attenuation) { - S_StartNamedSound (ent, 0, 0, channel, name, volume, attenuation, true); + S_StartNamedSound (ent, 0, 0, channel, name, volume, SELECT_ATTEN(attenuation), true); } void S_PositionedSound (fixed_t x, fixed_t y, int channel, char *name, float volume, int attenuation) { - S_StartNamedSound ((mobj_t *)(~0), x, y, channel, name, volume, attenuation, false); + S_StartNamedSound ((mobj_t *)(~0), x, y, channel, name, volume, SELECT_ATTEN(attenuation), false); } // S_StopSoundID from Hexen (albeit, modified somewhat) @@ -675,8 +739,7 @@ void S_UpdateSounds (void *listener_p) S_StopChannel (i); } if (Channel[i].sound_id == -1 - || Channel[i].mo == listener || Channel[i].attenuation == ATTN_NONE - || Channel[i].attenuation == ATTN_SURROUND) + || Channel[i].mo == listener || Channel[i].attenuation <= 0) { continue; } @@ -689,9 +752,8 @@ void S_UpdateSounds (void *listener_p) x = Channel[i].mo->x; y = Channel[i].mo->y; } - dist = P_AproxDistance2 (listener, x, y) >> FRACBITS; - if (Channel[i].attenuation == ATTN_STATIC) - dist *= 3; + dist = (int)(FIXED2FLOAT(P_AproxDistance2 (listener, x, y)) + * Channel[i].attenuation); if (dist >= MAX_SND_DIST) { if (!(level.flags & LEVEL_NOSOUNDCLIPPING)) { @@ -864,7 +926,8 @@ static struct AmbientSound { unsigned type; // type of ambient sound int periodmin; // # of tics between repeats int periodmax; // max # of tics for random ambients - int volume; // relative volume of sound + float volume; // relative volume of sound + float attenuation; char sound[MAX_SNDNAME+1]; // Logical name of sound to play } Ambients[256]; @@ -976,7 +1039,7 @@ void S_ParseSndInfo (void) // com_token is a command if (!stricmp (com_token + 1, "ambient")) { - // $ambient [point|surround] [secs] + // $ambient [point [atten]|surround] [secs] struct AmbientSound *ambient, dummy; int index; @@ -993,16 +1056,28 @@ void S_ParseSndInfo (void) sndinfo = COM_Parse (sndinfo); strncpy (ambient->sound, com_token, MAX_SNDNAME); ambient->sound[MAX_SNDNAME] = 0; + ambient->attenuation = 0; sndinfo = COM_Parse (sndinfo); if (!stricmp (com_token, "point")) { + float attenuation; + ambient->type = POSITIONAL; sndinfo = COM_Parse (sndinfo); - } else { - if (!stricmp (com_token, "surround")) { - ambient->type = SURROUND; + attenuation = (float)atof (com_token); + if (attenuation > 0) + { + ambient->attenuation = attenuation; sndinfo = COM_Parse (sndinfo); } + else + { + ambient->attenuation = 1; + } + } else if (!stricmp (com_token, "surround")) { + ambient->type = SURROUND; + sndinfo = COM_Parse (sndinfo); + ambient->attenuation = -1; } if (!stricmp (com_token, "continuous")) { @@ -1022,9 +1097,9 @@ void S_ParseSndInfo (void) } sndinfo = COM_Parse (sndinfo); - ambient->volume = (int)(atof (com_token) * 255.0); - if (ambient->volume > 255) - ambient->volume = 255; + ambient->volume = (float)atof (com_token); + if (ambient->volume > 1) + ambient->volume = 1; else if (ambient->volume < 0) ambient->volume = 0; } else if (!stricmp (com_token + 1, "map")) { @@ -1076,10 +1151,12 @@ void Cmd_Soundlist (void *plyr, int argc, char **argv) lumpname[8] = 0; for (i = 0; i < numsfx; i++) - if (S_sfx[i].lumpnum != -1) { + if (S_sfx[i].lumpnum != -1) + { strncpy (lumpname, lumpinfo[S_sfx[i].lumpnum].name, 8); Printf (PRINT_HIGH, "%3d. %s (%s)\n", i+1, S_sfx[i].name, lumpname); - } else + } + else Printf (PRINT_HIGH, "%3d. %s **not present**\n", i+1, S_sfx[i].name); } @@ -1094,13 +1171,18 @@ void Cmd_Soundlinks (void *plyr, int argc, char **argv) static void SetTicker (int *tics, struct AmbientSound *ambient) { - if ((ambient->type & CONTINUOUS) == CONTINUOUS) { + if ((ambient->type & CONTINUOUS) == CONTINUOUS) + { *tics = 1; - } else if (ambient->type & RANDOM) { + } + else if (ambient->type & RANDOM) + { *tics = (int)(((float)rand() / (float)RAND_MAX) * (float)(ambient->periodmax - ambient->periodmin)) + ambient->periodmin; - } else { + } + else + { *tics = ambient->periodmin; } } @@ -1114,25 +1196,29 @@ void A_Ambient (mobj_t *actor) if (S_GetSoundPlayingInfo (actor, S_FindSound (ambient->sound))) return; - if (ambient->sound[0]) { - S_LoopedSound (actor, CHAN_BODY, ambient->sound, ambient->volume, - ambient->type & POSITIONAL ? ATTN_NORM : - (ambient->type & SURROUND ? ATTN_SURROUND : ATTN_NONE)); + if (ambient->sound[0]) + { + S_StartNamedSound (actor, 0, 0, CHAN_BODY, + ambient->sound, ambient->volume, ambient->attenuation, true); SetTicker (&actor->tics, ambient); - } else { + } + else + { P_RemoveMobj (actor); } } else { - if (ambient->sound[0]) { - S_Sound (actor, CHAN_BODY, ambient->sound, ambient->volume, - ambient->type & POSITIONAL ? ATTN_NORM : - (ambient->type & SURROUND ? ATTN_SURROUND : ATTN_NONE)); + if (ambient->sound[0]) + { + S_StartNamedSound (actor, 0, 0, CHAN_BODY, + ambient->sound, ambient->volume, ambient->attenuation, false); SetTicker (&actor->tics, ambient); - } else { + } + else + { P_RemoveMobj (actor); } } @@ -1142,7 +1228,8 @@ void S_ActivateAmbient (mobj_t *origin, int ambient) { struct AmbientSound *amb = &Ambients[ambient]; - if (!(amb->type & 3) && !amb->periodmin) { + if (!(amb->type & 3) && !amb->periodmin) + { sfxinfo_t *sfx = S_sfx + S_FindSound (amb->sound); // Make sure the sound has been loaded so we know how long it is diff --git a/code/S_sound.h b/code/S_sound.h index 9282443817..a9a83c7add 100644 --- a/code/S_sound.h +++ b/code/S_sound.h @@ -37,8 +37,9 @@ typedef struct sfxinfo_struct sfxinfo_t; struct sfxinfo_struct { char name[MAX_SNDNAME+1]; // [RH] Sound name defined in SNDINFO - void* data; // sound data - void* loopdata; // Sound data for looping sounds + unsigned normal; // Normal sample handle + unsigned looping; // Looping sample handle + void* data; struct sfxinfo_struct *link; diff --git a/code/St_new.c b/code/St_new.c index 97def7187c..23b9161f97 100644 --- a/code/St_new.c +++ b/code/St_new.c @@ -126,7 +126,9 @@ void ST_newDraw (void) if (plyr->armortype && plyr->armorpoints) { if (armors[plyr->armortype]) V_DrawPatchCleanNoMove (20 * CleanXfac, y - 4*CleanYfac, - &screen, armors[plyr->armortype-1]); + &screen, + plyr->armortype > 2 ? armors[1] : + armors[plyr->armortype-1]); ST_DrawNum (40*CleanXfac, y - (SHORT(armors[0]->height)+3)*CleanYfac, &screen, plyr->armorpoints); } @@ -160,19 +162,45 @@ void ST_newDraw (void) void ST_nameDraw (int y) { int x, color; + char conbuff[64], *string, pnum[4]; + BOOL inconsistant; - if (!netgame || level.time > NameUp + 5 || (level.time < TICRATE * 3 && !demoplayback)) + inconsistant = false; + for (x = 0; x < MAXPLAYERS; x++) + { + if (playeringame[x] && players[x].inconsistant) + { + if (!inconsistant) + { + strcpy (conbuff, "Consistency failure: "); + inconsistant = true; + } + pnum[0] = '0' + x; + pnum[1] = 0; + strcat (conbuff, pnum); + } + } + if (!inconsistant && (!netgame || level.time > NameUp + 5 || (level.time < TICRATE * 3 && !demoplayback))) return; - if (plyr - players == consoleplayer) - color = CR_GOLD; - else + if (inconsistant) + { color = CR_GREEN; - - x = (screen.width - V_StringWidth (plyr->userinfo.netname)*CleanXfac) >> 1; - if (level.time < NameUp) - V_DrawTextClean (color, x, y, plyr->userinfo.netname); + string = conbuff; + } else - V_DrawTextCleanLuc (color, x, y, plyr->userinfo.netname); + { + string = plyr->userinfo.netname; + if (plyr - players == consoleplayer) + color = CR_GOLD; + else + color = CR_GREEN; + } + + x = (screen.width - V_StringWidth (string)*CleanXfac) >> 1; + if (level.time < NameUp || inconsistant) + V_DrawTextClean (color, x, y, string); + else + V_DrawTextCleanLuc (color, x, y, string); BorderNeedRefresh = true; } \ No newline at end of file diff --git a/code/St_stuff.c b/code/St_stuff.c index f2c8bfc974..8b0844556d 100644 --- a/code/St_stuff.c +++ b/code/St_stuff.c @@ -929,7 +929,8 @@ void ST_updateWidgets(void) void ST_Ticker (void) { - +//FIXME +//return; st_clock++; st_randomnumber = M_Random(); ST_updateWidgets(); @@ -1084,6 +1085,8 @@ void ST_Drawer (void) "Demo was recorded with a different version\n" "of ZDoom. Expect it to go out of sync."); +//FIXME +//return; if (realviewheight == screen.height && viewactive) { if (DrawNewHUD) @@ -1485,7 +1488,8 @@ static BOOL st_stopped = true; void ST_Start (void) { - +// FIXME +//return; if (!st_stopped) ST_Stop(); @@ -1535,6 +1539,8 @@ void ST_ChangeScale (cvar_t *var) void ST_Init (void) { +//FIXME +//return; veryfirsttime = 0; if (!V_AllocScreen (&stbarscreen, 320, 32, 8) || diff --git a/code/Tmap.nas b/code/Tmap.nas index aaf6ddd845..cf33595582 100644 --- a/code/Tmap.nas +++ b/code/Tmap.nas @@ -17,7 +17,6 @@ BITS 32 ; External variables: EXTERN _columnofs -EXTERN _TransTable EXTERN _ylookup EXTERN _centery EXTERN _fuzzpos @@ -27,7 +26,6 @@ EXTERN _realviewheight EXTERN _dc_pitch EXTERN _dc_colormap -EXTERN _dc_transmap EXTERN _dc_iscale EXTERN _dc_texturemid EXTERN _dc_source @@ -193,27 +191,20 @@ _ASM_PatchPitch: mov [rdcp1+2],edx mov [f1a+3],edx mov [f1b+2],edx - mov [l1a+2],edx - mov [l1b+2],edx ; 2 * dc_pitch add edx,[_dc_pitch] mov [f2a+3],edx mov [f2b+2],edx - mov [l2a+2],edx - mov [l2b+2],edx ; 3 * dc_pitch add edx,[_dc_pitch] mov [f3a+3],edx mov [f3b+2],edx - mov [l3a+2],edx - mov [l3b+2],edx ; 4 * dc_pitch add edx,[_dc_pitch] mov [f4+2],edx - mov [l4+2],edx jmp _PatchUnrolled @@ -461,197 +452,6 @@ dfcdone: pop ebx ret -;*---------------------------------------------------------------------- -;* -;* R_DrawTranslucentColumnP -;* -;*---------------------------------------------------------------------- - -GLOBAL _R_DrawTranslucentColumnP_ASM -GLOBAL @R_DrawTranslucentColumnP_ASM@0 - - align 16 - -_R_DrawTranslucentColumnP_ASM: -@R_DrawTranslucentColumnP_ASM@0: -; -; dest = ylookup[dc_yl] + columnofs[dc_x]; -; - push ebp - push ebx - push edi - push esi - - mov ebp,[_dc_yl] -; -; pixelcount = yh - yl + 1 -; - mov eax,[_dc_yh] - mov ebx,ebp - inc eax - sub eax,ebp ; pixel count - mov [pixelcount],eax ; save for final pixel - jle near ldone ; nothing to scale - - mov edi,[_ylookup] - push ebp ; make space for ystep frac. later - mov edi,[edi+ebx*4] - - mov esi,[_columnofs] - mov ebx,[_dc_x] - add edi,[esi+ebx*4] ; edi = dest - - -; -; frac = dc_texturemid - (centery-dc_yl)*fracstep; -; - mov ecx,[_dc_iscale] ; fracstep - mov eax,[_centery] - sub eax,ebp - imul eax,ecx - mov edx,[_dc_texturemid] - sub edx,eax - mov ebx,edx - shr ebx,16 ; frac int. - and ebx,[_dc_mask] - shl edx,16 ; y frac up - - mov ebp,ecx - shl ebp,16 ; fracstep f. up - shr ecx,16 ; fracstep i. ->cl - and cl,[_dc_mask] - - mov esi,[_dc_source] - - mov eax,[pixelcount] - mov [esp],ebp - mov ebp,edx - mov ch,al - shr eax,2 - mov edx,[_dc_transmap] - test ch,3 - jz .l4quadloop - mov eax,[_dc_colormap] - -; -; [esp] : ystep frac. upper 24 bits -; ebp : y frac. upper 24 bits -; ebx : y i. lower 8 bits, masked for index -; ecx : ch = counter, cl = y step i. -; eax : colormap aligned 256 -; edx : transtable aligned 65536 -; esi : source texture column -; edi : dest screen -; - -; -; do un-even pixel -; - test ch,1 - jz .lc2 - - mov al,[esi+ebx] - mov dh,[edi] - mov dl,[eax] - add ebp,[esp] - mov al,[edx] - adc bl,cl - mov [edi],al - and ebx,[_dc_mask] - add edi,[_dc_pitch] - - -; -; do two non-quad-aligned pixels -; -.lc2: - test ch,2 - jz .lc3 - - mov al,[esi+ebx] - mov dh,[edi] - mov dl,[eax] - add ebp,[esp] - mov al,[edx] - adc bl,cl - mov [edi],al - and ebx,[_dc_mask] - - mov al,[esi+ebx] - mov dh,[edi] - add edi,[_dc_pitch] - mov dl,[eax] - add ebp,[esp] - mov al,[edx] - adc bl,cl - mov [edi],al - and ebx,[_dc_mask] - add edi,[_dc_pitch] - -; -; test if there were at least 4 pixels -; -.lc3: - mov eax,[pixelcount] - shr eax,2 - test eax,eax ; test quad count - jz near ldone - -.l4quadloop: - mov ch,al - mov eax,[_dc_colormap] - -; .align 4 -lquadloop: - mov al,[esi+ebx] - mov dh,[edi] - mov dl,[eax] - add ebp,[esp] - mov al,[edx] - adc bl,cl - mov [edi],al - and ebx,[_dc_mask] - - mov al,[esi+ebx] -l1a: mov dh,[edi+0x12345678] - mov dl,[eax] - add ebp,[esp] - mov al,[edx] - adc bl,cl -l1b: mov [edi+0x12345678],al - and ebx,[_dc_mask] - - mov al,[esi+ebx] -l2a: mov dh,[edi+2*0x12345678] - mov dl,[eax] - add ebp,[esp] - mov al,[edx] - adc bl,cl -l2b: mov [edi+2*0x12345678],al - and ebx,[_dc_mask] - - mov al,[esi+ebx] -l3a: mov dh,[edi+3*0x12345678] - mov dl,[eax] - add ebp,[esp] - mov al,[edx] - adc bl,cl -l3b: mov [edi+3*0x12345678],al - and ebx,[_dc_mask] - -l4: add edi,4*0x12345678 - - dec ch - jnz lquadloop - -ldone: - pop ebp - pop esi - pop edi - pop ebx - pop ebp - ret - ;*---------------------------------------------------------------------- ;* diff --git a/code/V_video.c b/code/V_video.c index 39ab65c678..e70eaac210 100644 --- a/code/V_video.c +++ b/code/V_video.c @@ -61,12 +61,13 @@ #include "c_dispch.h" #include "cmdlib.h" - extern void STACK_ARGS DimScreenPLoop (byte *colormap, byte *screen, int width, int modulo, int height); extern char *IdStrings[22]; extern int DisplayID; +unsigned int Col2RGB8[65][256]; +byte RGB8k[16][32][16]; // [RH] The framebuffer is no longer a mere byte array. @@ -78,8 +79,6 @@ int dirtybox[4]; cvar_t *vid_defwidth, *vid_defheight, *vid_defid; cvar_t *dimamount, *dimcolor; -byte *TransTable; - palette_t *DefaultPalette; @@ -203,44 +202,40 @@ void V_Clear (int left, int top, int right, int bottom, screen_t *scrn, int colo void V_DimScreen (screen_t *screen) { - byte *fadetable; + if (dimamount->value < 0) + SetCVarFloat (dimamount, 0); + else if (dimamount->value > 1) + SetCVarFloat (dimamount, 1); - if (dimamount->value < 0.0) - SetCVarFloat (dimamount, 0.0); - else if (dimamount->value > 3.0) - SetCVarFloat (dimamount, 3.0); - - if (dimamount->value == 0.0) + if (dimamount->value == 0) return; if (screen->is8bit) { - if (!TransTable) - fadetable = DefaultPalette->maps.colormaps + (NUMCOLORMAPS/2) * 256; - else - fadetable = TransTable + 65536*(4-(int)dimamount->value) + - 256*V_GetColorFromString (DefaultPalette->basecolors, dimcolor->string); + unsigned int *bg2rgb; + unsigned int fg; + int gap; + byte *spot; + int x, y; { -#ifdef USEASM - DimScreenPLoop (fadetable, screen->buffer, screen->width, screen->pitch-screen->width, screen->height); -#else - unsigned int *spot, s; - int x, y; - byte a, b, c, d; + unsigned int *fg2rgb; + fixed_t amount; - spot = (unsigned int *)(screen->buffer); - for (y = 0; y < screen->height; y++) { - for (x = 0; x < (screen->width >> 2); x++) { - s = *spot; - a = fadetable[s & 0xff]; - b = fadetable[(s >> 8) & 0xff]; - c = fadetable[(s >> 16) & 0xff]; - d = fadetable[s >> 24]; - *spot++ = a | (b << 8) | (c << 16) | (d << 24); - } - spot += (screen->pitch - screen->width) >> 2; + amount = (fixed_t)(dimamount->value * 64); + fg2rgb = Col2RGB8[amount]; + bg2rgb = Col2RGB8[64-amount]; + fg = fg2rgb[V_GetColorFromString (DefaultPalette->basecolors, dimcolor->string)]; + } + + spot = screen->buffer; + gap = screen->pitch - screen->width; + for (y = 0; y < screen->height; y++) { + for (x = 0; x < screen->width; x++) { + unsigned int bg = bg2rgb[*spot]; + bg = (fg+bg) | 0xf07c3e1f; + *spot++ = RGB8k[0][0][(bg>>5) & (bg>>19)]; } -#endif + spot += gap; } } else { int x, y; @@ -412,57 +407,30 @@ void Cmd_SetColor (void *plyr, int argc, char **argv) } } -void BuildTransTable (byte *transtab, unsigned int *palette) +// This is DOSDoom 0.65's translucency table code, cleaned up. +// I also removed the use of Allegro's RGB table code, because +// it just wasn't accurate enough. +void BuildTransTable (unsigned int *palette) { - int a, b, c, count; - byte *trans25, *trans50, *trans75, *mtrans, *trans; - - trans25 = transtab; - trans50 = transtab + 65536; - trans75 = transtab + 131072; - count = 0; + { + int r, g, b; - C_InitTicker ("translucency", 98176); - - // Build the 50% translucency table - trans = trans50; - for (a = 0; a < 256; a++) { - mtrans = trans50 + a; - for (b = 0; b < a; b++) { - c = BestColor (palette, - (RPART(palette[a]) + RPART(palette[b])) >> 1, - (GPART(palette[a]) + GPART(palette[b])) >> 1, - (BPART(palette[a]) + BPART(palette[b])) >> 1, - 256); - *trans++ = c; - *mtrans = c; - mtrans += 256; - } - *trans = a; - trans += 256 - a; - if ((count & ~8191) != ((count + a) & ~8191)) - C_SetTicker (count); - count += a; + // create the small RGB table + for (r = 0; r < 16; r++) + for (g = 0; g < 32; g++) + for (b = 0; b < 16; b++) + RGB8k[r][g][b] = BestColor (palette, r * 16, g * 8, b * 16, 256); } - // Build the 25% and 75% tables - trans = trans75; - for (a = 0; a < 256; a++) { - for (b = 0; b < 256; b++) { - c = BestColor (palette, - (RPART(palette[a]) + RPART(palette[b]) * 3) >> 2, - (GPART(palette[a]) + GPART(palette[b]) * 3) >> 2, - (BPART(palette[a]) + BPART(palette[b]) * 3) >> 2, - 256); - *trans++ = c; - trans25[(b << 8) | a] = c; - } - count += 256; - if (!(a & 31)) - C_SetTicker (count); - } + { + int x, y; - C_InitTicker (NULL, 0); + for (x = 0; x < 65; x++) + for (y = 0; y < 256; y++) + Col2RGB8[x][y] = (((RPART(palette[y])*x)>>5)<<9) | + (((GPART(palette[y])*x)>>4)<<18) | + ((BPART(palette[y])*x)>>5); + } } void V_LockScreen (screen_t *scrn) @@ -644,7 +612,6 @@ static int IdNameToId (char *name) void V_Init (void) { - static const char tag[] = "LZO-Compressed ZDoom Translucency Cache File v01"; int i; int width, height, id; @@ -696,135 +663,7 @@ void V_Init (void) V_Palette = DefaultPalette->colors; - if (!M_CheckParm ("-notrans")) { - char cachename[256]; - byte *palette; - FILE *cache; - int i; - - // Align TransTable on a 64k boundary - TransTable = Malloc (65536*3+65535); - TransTable = (byte *)(((unsigned int)TransTable + 0xffff) & 0xffff0000); - - i = M_CheckParm("-transfile"); - if (i && i < myargc - 1) { - strcpy (cachename, myargv[i+1]); - FixPathSeperator (cachename); - DefaultExtension (cachename, ".tch"); - } else { - sprintf (cachename, "%stranstab.tch", progdir); - } - palette = W_CacheLumpName ("PLAYPAL", PU_CACHE); - - { // Check for cached translucency table - byte *cachemem; - byte *out; - int newlen; - int cachelen; - int insidelen; - int r; - - cache = fopen (cachename, "rb"); - if (cache) { - fseek (cache, 0, SEEK_END); - cachelen = ftell (cache); - fseek (cache, 0, SEEK_SET); - - if (cachelen <= strlen(tag) + sizeof(int)) { - fclose (cache); - cache = NULL; - goto maketable; - } - - cachemem = Z_Malloc (cachelen, PU_STATIC, 0); - if (fread (cachemem, 1, cachelen, cache) != cachelen) { - fclose (cache); - cache = NULL; - Printf (PRINT_HIGH, "Trouble reading tranlucency cache\n"); - goto maketable; - } - - fclose (cache); - - if (strncmp (tag, cachemem, strlen(tag)) != 0) { - Printf (PRINT_HIGH, "Regenerating old translucency cache\n"); - cache = NULL; - goto maketable; - } - - // So far, so good. Try expanding the cached data. - memcpy (&insidelen, cachemem + strlen(tag), sizeof(int)); - if (insidelen != cachelen - strlen(tag) - sizeof(int)) { - Printf (PRINT_HIGH, "Translucency cache wrong size\n"); - cache = NULL; - goto maketable; - } - - out = Z_Malloc (65536*3+768, PU_STATIC, 0); - - r = lzo1x_decompress (cachemem + strlen(tag) + sizeof(int), - insidelen, out, &newlen, NULL); - - if (r != LZO_E_OK || newlen != 65536*3+768) { - Printf (PRINT_HIGH, "Bad translucency cache\n"); - cache = NULL; - Z_Free (out); - goto maketable; - } - - // Check to make sure if the cache was generated from the - // current PLAYPAL. If not, we need to generate it, but - // don't bother replacing this one. - if (memcmp (out, palette, 768)) { - Printf (PRINT_HIGH, "Translucency cache was generated with a different palette\n"); - Z_Free (out); - goto maketable; - } - - // Everything's good. Use the cached data. - memcpy (TransTable, out+768, 65536*3); - TransTable -= 65536; - Z_Free (out); - return; - } - } - - maketable: - Printf (PRINT_HIGH, "Creating translucency tables\n"); - BuildTransTable (TransTable, DefaultPalette->basecolors); - - if (!cache) { - byte *out, *wrkmem, *in; - int outlen, r; - - wrkmem = Malloc (LZO1X_1_MEM_COMPRESS); - in = Malloc (768 + 65536*3); - out = Malloc (768 + 65536*3); - - strncpy (in, tag, strlen (tag)); - memcpy (in, palette, 768); - memcpy (in+768, TransTable, 65536*3); - - r = lzo1x_1_compress (in, 768+65536*3, out, &outlen, wrkmem); - - free (wrkmem); - free (in); - - if (r == LZO_E_OK) { - cache = fopen (cachename, "wb"); - - if (cache) { - fwrite (tag, 1, strlen(tag), cache); - fwrite (&outlen, sizeof(outlen), 1, cache); - fwrite (out, 1, outlen, cache); - fclose (cache); - } - } - free (out); - } - - TransTable -= 65536; - } + BuildTransTable (DefaultPalette->basecolors); } void V_AttachPalette (screen_t *scrn, palette_t *pal) diff --git a/code/V_video.h b/code/V_video.h index 129330bb7f..df8d956cca 100644 --- a/code/V_video.h +++ b/code/V_video.h @@ -70,7 +70,9 @@ extern int dirtybox[4]; extern byte newgamma[256]; extern cvar_t *gammalevel; -extern byte* TransTable; // Translucency tables (minus 65536) +// DOSDoom 0.65's neat-o translucency tables +extern unsigned int Col2RGB8[65][256]; +extern byte RGB8k[16][32][16]; extern int CleanWidth, CleanHeight, CleanXfac, CleanYfac; diff --git a/code/W_wad.c b/code/W_wad.c index ea401bb416..2ae7d8ea71 100644 --- a/code/W_wad.c +++ b/code/W_wad.c @@ -1,27 +1,16 @@ -// Emacs style mode select -*- C++ -*- -//----------------------------------------------------------------------------- -// -// $Id:$ -// -// Copyright (C) 1993-1996 by id Software, Inc. -// -// This source is available for distribution and/or modification -// only under the terms of the DOOM Source Code License as -// published by id Software. All rights reserved. -// -// The source is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License -// for more details. -// -// $Log:$ -// -// DESCRIPTION: -// Handles WAD file header, directory, lump I/O. -// [RH] Changed to use buffered I/O (fread, etc) -// -//----------------------------------------------------------------------------- +//************************************************************************** +//** +//** w_wad.c : Heretic 2 : Raven Software, Corp. +//** +//** $RCSfile: w_wad.c,v $ +//** $Revision: 1.6 $ +//** $Date: 95/10/06 20:56:47 $ +//** $Author: cjr $ +//** +//************************************************************************** + +// HEADER FILES ------------------------------------------------------------ #include #include @@ -31,6 +20,10 @@ #include #include +#ifndef _WIN32 +#include +#endif + #include "m_alloc.h" #include "doomtype.h" #include "doomstat.h" @@ -40,40 +33,74 @@ #include "i_system.h" #include "z_zone.h" #include "cmdlib.h" - #include "w_wad.h" -#ifndef _WIN32 -#include +// MACROS ------------------------------------------------------------------ + +#ifdef NeXT +// NeXT doesn't need a binary flag in open call +#define O_BINARY 0 +#define strcmpi strcasecmp #endif +// TYPES ------------------------------------------------------------------- + +// EXTERNAL FUNCTION PROTOTYPES -------------------------------------------- + +// PUBLIC FUNCTION PROTOTYPES ---------------------------------------------- + +// PRIVATE FUNCTION PROTOTYPES --------------------------------------------- + +// EXTERNAL DATA DECLARATIONS ---------------------------------------------- + +// PUBLIC DATA DEFINITIONS ------------------------------------------------- + +lumpinfo_t *lumpinfo; +int numlumps; +void **lumpcache; + +// PRIVATE DATA DEFINITIONS ------------------------------------------------ + +// CODE -------------------------------------------------------------------- + +#ifdef NeXT +//========================================================================== // -// GLOBALS +// strupr // +//========================================================================== -// Location of each lump on disk. -lumpinfo_t* lumpinfo; -int numlumps; - -void** lumpcache; - - -int W_filelength (FILE *handle) +void strupr (char *s) { - int len; - - if (fseek (handle, 0, SEEK_END)) - I_Error ("Error fseeking"); - - len = ftell (handle); - - if (fseek (handle, 0, SEEK_SET)) - I_Error ("Error fseeking"); - - return len; + while (*s) + *s++ = toupper (*s); } +//========================================================================== +// +// filelength +// +//========================================================================== + +int filelength (int handle) +{ + struct stat fileinfo; + + if (fstat (handle, &fileinfo) == -1) + { + close (handle); + I_Error ("Error fstating"); + } + return fileinfo.st_size; +} +#endif + +//========================================================================== +// +// uppercoppy +// // [RH] Copy up to 8 chars, upper-casing them in the process +//========================================================================== void uppercopy (char *to, const char *from) { @@ -85,22 +112,15 @@ void uppercopy (char *to, const char *from) to[i] = 0; } - - -// -// LUMP BASED ROUTINES. -// - +//========================================================================== // // W_AddFile -// All files are optional, but at least one file must be -// found (PWAD, if all required lumps are present). -// Files with a .wad extension are wadlink files -// with multiple lumps. -// Other files are single lumps with the base filename -// for the lump name. +// +// Files with a .wad extension are wadlink files with multiple lumps, +// other files are single lumps with the base filename for the lump name. // // [RH] Removed reload hack +//========================================================================== void W_AddFile (char *filename) { @@ -108,7 +128,7 @@ void W_AddFile (char *filename) wadinfo_t header; lumpinfo_t* lump_p; unsigned i; - FILE *handle; + int handle; int length; int startlump; filelump_t* fileinfo, *fileinfo2free; @@ -121,9 +141,8 @@ void W_AddFile (char *filename) DefaultExtension (name, ".wad"); // open the file and add to directory - - if ((handle = fopen (name, "rb")) == NULL) - { + if ((handle = open (name, O_RDONLY|O_BINARY)) == -1) + { // Didn't find file Printf (PRINT_HIGH, " couldn't open %s\n",filename); return; } @@ -132,27 +151,27 @@ void W_AddFile (char *filename) startlump = numlumps; // [RH] Determine if file is a WAD based on its signature, not its name. - fread (&header, sizeof(header), 1, handle); + read (handle, &header, sizeof(header)); - if (header.identification == IWAD_ID || - header.identification == PWAD_ID) { - // This is a WAD file + if (header.identification == IWAD_ID || header.identification == PWAD_ID) + { // This is a WAD file header.numlumps = LONG(header.numlumps); header.infotableofs = LONG(header.infotableofs); length = header.numlumps * sizeof(filelump_t); fileinfo = fileinfo2free = Z_Malloc (length, PU_STATIC, 0); - fseek (handle, header.infotableofs, SEEK_SET); - fread (fileinfo, 1, length, handle); + lseek (handle, header.infotableofs, SEEK_SET); + read (handle, fileinfo, length); numlumps += header.numlumps; Printf (PRINT_HIGH, " (%d lumps)", header.numlumps); - } else { - // This is just a single lump file + } + else + { // This is just a single lump file fileinfo2free = NULL; fileinfo = &singleinfo; singleinfo.filepos = 0; - singleinfo.size = LONG(W_filelength(handle)); + singleinfo.size = LONG(filelength(handle)); ExtractFileBase (filename, name); strupr (name); strncpy (singleinfo.name, name, 8); @@ -162,15 +181,12 @@ void W_AddFile (char *filename) // Fill in lumpinfo lumpinfo = Realloc (lumpinfo, numlumps*sizeof(lumpinfo_t)); - lump_p = &lumpinfo[startlump]; - - for (i=startlump ; ihandle = handle; lump_p->position = LONG(fileinfo->filepos); lump_p->size = LONG(fileinfo->size); - // [RH] Convert name to uppercase during copy uppercopy (lump_p->name, fileinfo->name); } @@ -181,30 +197,27 @@ void W_AddFile (char *filename) +//========================================================================== // // W_InitMultipleFiles -// Pass a null terminated list of files to use. -// All files are optional, but at least one file -// must be found. -// Files with a .wad extension are idlink files -// with multiple lumps. -// Other files are single lumps with the base filename -// for the lump name. -// Lump names can appear multiple times. -// The name searcher looks backwards, so a later file -// does override all earlier ones. // +// Pass a null terminated list of files to use. All files are optional, +// but at least one file must be found. Lump names can appear multiple +// times. The name searcher looks backwards, so a later file can +// override an earlier one. +// +//========================================================================== + void W_InitMultipleFiles (wadlist_t **filenames) { int i; // open all the files, load headers, and count lumps numlumps = 0; + lumpinfo = NULL; // will be realloced as lumps are added - // will be realloced as lumps are added - lumpinfo = NULL; // [RH] Start out as NULL - - while (*filenames) { + while (*filenames) + { wadlist_t *next = (*filenames)->next; W_AddFile ((*filenames)->name); @@ -213,7 +226,9 @@ void W_InitMultipleFiles (wadlist_t **filenames) } if (!numlumps) - I_FatalError ("W_InitFiles: no files found"); + { + I_FatalError ("W_InitMultipleFiles: no files found"); + } // [RH] Set namespace markers to global for everything for (i = 0; i < numlumps; i++) @@ -222,11 +237,8 @@ void W_InitMultipleFiles (wadlist_t **filenames) // [RH] Merge sprite and flat groups. // (We don't need to bother with patches, since // Doom doesn't use markers to identify them.) - W_Profile ("waddump1.txt"); W_MergeLumps ("S_START", "S_END", ns_sprites); - W_Profile ("waddump2.txt"); W_MergeLumps ("F_START", "F_END", ns_flats); - W_Profile ("waddump3.txt"); W_MergeLumps ("C_START", "C_END", ns_colormaps); // [RH] Set up hash table @@ -238,13 +250,14 @@ void W_InitMultipleFiles (wadlist_t **filenames) memset (lumpcache, 0, i); } - - - +//=========================================================================== // // W_InitFile -// Just initialize from a single file. // +// Initialize the primary from a single file. +// +//========================================================================== + void W_InitFile (char *filename) { wadlist_t *names = Z_Malloc (sizeof(*names)+strlen(filename), PU_STATIC, 0); @@ -254,25 +267,27 @@ void W_InitFile (char *filename) W_InitMultipleFiles (&names); } - - +//========================================================================== // // W_NumLumps // +//========================================================================== + int W_NumLumps (void) { return numlumps; } - - +//========================================================================== // // W_CheckNumForName +// // Returns -1 if name not found. // // [RH] Changed to use hash lookup ala BOOM instead of a linear search -// and namespace parameter -// +// and namespace parameter +//========================================================================== + int (W_CheckNumForName) (const char *name, int space) { char uname[8]; @@ -281,7 +296,8 @@ int (W_CheckNumForName) (const char *name, int space) uppercopy (uname, name); i = lumpinfo[W_LumpNameHash (uname) % (unsigned)numlumps].index; - while (i != -1) { + while (i != -1) + { if (!strncmp (lumpinfo[i].name, uname, 8) && lumpinfo[i].namespc == space) break; i = lumpinfo[i].next; @@ -290,13 +306,14 @@ int (W_CheckNumForName) (const char *name, int space) return i; } - - - +//========================================================================== // // W_GetNumForName +// // Calls W_CheckNumForName, but bombs out if not found. // +//========================================================================== + int W_GetNumForName (const char *name) { int i; @@ -310,10 +327,14 @@ int W_GetNumForName (const char *name) } +//========================================================================== // // W_LumpLength +// // Returns the buffer size needed to load the given lump. // +//========================================================================== + int W_LumpLength (int lump) { if (lump >= numlumps) @@ -322,44 +343,50 @@ int W_LumpLength (int lump) return lumpinfo[lump].size; } - - +//========================================================================== // // W_ReadLump -// Loads the lump into the given buffer, -// which must be >= W_LumpLength(). // -// [RH] Removed reload hack +// Loads the lump into the given buffer, which must be >= W_LumpLength(). // +//========================================================================== + void W_ReadLump (int lump, void *dest) { - int c; - lumpinfo_t* l; + int c; + lumpinfo_t *l; if (lump >= numlumps) + { I_Error ("W_ReadLump: %i >= numlumps",lump); - + } l = lumpinfo + lump; - - fseek (l->handle, l->position, SEEK_SET); - c = fread (dest, 1, l->size, l->handle); - + //I_BeginRead(); + lseek (l->handle, l->position, SEEK_SET); + c = read (l->handle, dest, l->size); if (c < l->size) + { I_Error ("W_ReadLump: only read %i of %i on lump %i", - c,l->size,lump); + c, l->size, lump); + } + //I_EndRead(); } +//========================================================================== // // W_CacheLumpNum // +//========================================================================== + void *W_CacheLumpNum (int lump, int tag) { byte *ptr; int lumplen; if ((unsigned)lump >= numlumps) + { I_Error ("W_CacheLumpNum: %u >= numlumps",lump); - + } if (!lumpcache[lump]) { // read the lump in @@ -378,13 +405,13 @@ void *W_CacheLumpNum (int lump, int tag) //DPrintf ("cache hit on lump %i\n",lump); Z_ChangeTag (lumpcache[lump],tag); } - return lumpcache[lump]; } -// [RH] W_CacheLumpName macro-ized - - +//========================================================================== +// +// W_LumpNameHash +// // [RH] This is from Boom. // NOTE: s should already be uppercase. // This is different from the BOOM version. @@ -393,6 +420,8 @@ void *W_CacheLumpNum (int lump, int tag) // Must be mod'ed with table size. // Can be used for any 8-character names. // by Lee Killough +// +//========================================================================== unsigned W_LumpNameHash (const char *s) { @@ -410,10 +439,14 @@ unsigned W_LumpNameHash (const char *s) return hash; } -// [RH] W_InitHashChains +//========================================================================== +// +// W_InitHashChains // // Prepares the lumpinfos for hashing. // (Hey! This looks suspiciously like something from Boom! :-) +// +//========================================================================== void W_InitHashChains (void) { @@ -426,7 +459,8 @@ void W_InitHashChains (void) lumpinfo[i].index = -1; // Now set up the chains - for (i = 0; i < numlumps; i++) { + for (i = 0; i < numlumps; i++) + { uppercopy (name, lumpinfo[i].name); j = W_LumpNameHash (name) % (unsigned) numlumps; lumpinfo[i].next = lumpinfo[j].index; @@ -434,17 +468,29 @@ void W_InitHashChains (void) } } -// [RH] From Boom also +//========================================================================== +// +// IsMarker +// +// (from BOOM) +// +//========================================================================== + static BOOL IsMarker (const lumpinfo_t *lump, const char *marker) { return (lump->namespc == ns_global) && (!strncmp (lump->name, marker, 8) || (*(lump->name) == *marker && !strncmp (lump->name + 1, marker, 7))); } -// [RH] Merge multiple tagged groups into one +//========================================================================== // -// Basically from Boom, too, although I tried to write -// it independently. +// W_MergeLumps +// +// Merge multiple tagged groups into one +// Basically from BOOM, too, although I tried to write it independently. +// +//========================================================================== + void W_MergeLumps (const char *start, const char *end, int space) { char ustart[8], uend[8]; @@ -459,7 +505,8 @@ void W_MergeLumps (const char *start, const char *end, int space) // Some pwads use an icky hack to get flats with regular Doom. // This tries to detect them. flatHack = 0; - if (!strcmp ("F_START", ustart) && !M_CheckParm ("-noflathack")) { + if (!strcmp ("F_START", ustart) && !M_CheckParm ("-noflathack")) + { int fudge = 0, start = 0; for (i = 0; i < numlumps; i++) { @@ -480,48 +527,69 @@ void W_MergeLumps (const char *start, const char *end, int space) oldlumps = 0; insideBlock = false; - for (i = 0; i < numlumps; i++) { - if (!insideBlock) { + for (i = 0; i < numlumps; i++) + { + if (!insideBlock) + { // Check if this is the start of a block - if (IsMarker (lumpinfo + i, ustart)) { + if (IsMarker (lumpinfo + i, ustart)) + { insideBlock = true; // Create start marker if we haven't already - if (!newlumps) { + if (!newlumps) + { newlumps++; strncpy (newlumpinfos[0].name, ustart, 8); - newlumpinfos[0].handle = NULL; + newlumpinfos[0].handle = -1; newlumpinfos[0].position = newlumpinfos[0].size = 0; newlumpinfos[0].namespc = ns_global; } - } else { + } + else + { // Copy lumpinfo down this list lumpinfo[oldlumps++] = lumpinfo[i]; } - } else { + } + else + { // Check if this is the end of a block - if (flatHack) { - if (flatHack == i) { + if (flatHack) + { + if (flatHack == i) + { insideBlock = false; flatHack = 0; - } else { - if (lumpinfo[i].size != 4096) { + } + else + { + if (lumpinfo[i].size != 4096) + { lumpinfo[oldlumps++] = lumpinfo[i]; - } else { + } + else + { newlumpinfos[newlumps] = lumpinfo[i]; newlumpinfos[newlumps++].namespc = space; } } - } else if (i && lumpinfo[i].handle != lumpinfo[i-1].handle) { + } + else if (i && lumpinfo[i].handle != lumpinfo[i-1].handle) + { // Blocks cannot span multiple files insideBlock = false; lumpinfo[oldlumps++] = lumpinfo[i]; - } else if (IsMarker (lumpinfo + i, uend)) { + } + else if (IsMarker (lumpinfo + i, uend)) + { // It is. We'll add the end marker once // we've processed everything. insideBlock = false; - } else { + } + else + { newlumpinfos[newlumps] = lumpinfo[i]; newlumpinfos[newlumps++].namespc = space; } @@ -531,7 +599,8 @@ void W_MergeLumps (const char *start, const char *end, int space) // Now copy the merged lumps to the end of the old list // and create the end marker entry. - if (newlumps) { + if (newlumps) + { if (oldlumps + newlumps > numlumps) lumpinfo = Realloc (lumpinfo, oldlumps + newlumps); @@ -540,7 +609,7 @@ void W_MergeLumps (const char *start, const char *end, int space) numlumps = oldlumps + newlumps; strncpy (lumpinfo[numlumps].name, uend, 8); - lumpinfo[numlumps].handle = NULL; + lumpinfo[numlumps].handle = -1; lumpinfo[numlumps].position = lumpinfo[numlumps].size = 0; lumpinfo[numlumps].namespc = ns_global; @@ -550,9 +619,12 @@ void W_MergeLumps (const char *start, const char *end, int space) free (newlumpinfos); } +//========================================================================== // // W_Profile // +//========================================================================== + // [RH] Unused void W_Profile (const char *fname) { @@ -599,49 +671,47 @@ void W_Profile (const char *fname) } -// [RH] Find a named lump. Specifically allows duplicates for -// merging of e.g. SNDINFO lumps. Sorry, this uses a linear -// search. (Not a big deal, since it only gets called -// a few times during game setup.) +//========================================================================== +// +// W_FindLump +// +// Find a named lump. Specifically allows duplicates for merging of e.g. +// SNDINFO lumps. +// +//========================================================================== + int W_FindLump (const char *name, int *lastlump) { - int lump; - - union { - char s[8]; - int x[2]; - } name8; - - int v1; - int v2; - lumpinfo_t* lump_p; + char name8[8]; + int v1, v2; + lumpinfo_t *lump_p; // make the name into two integers for easy compares - uppercopy (name8.s, name); - - v1 = name8.x[0]; - v2 = name8.x[1]; + uppercopy (name8, name); + v1 = *(int *)name8; + v2 = *(int *)&name8[4]; lump_p = lumpinfo + *lastlump; - while (lump_p < lumpinfo + numlumps) { - if ( *(int *)lump_p->name == v1 && *(int *)&lump_p->name[4] == v2) - break; + while (lump_p < lumpinfo + numlumps) + { + if (*(int *)lump_p->name == v1 && *(int *)&lump_p->name[4] == v2) + { + int lump = lump_p - lumpinfo; + *lastlump = lump + 1; + return lump; + } lump_p++; } - lump = lump_p - lumpinfo; - - if (lump < numlumps) { - *lastlump = lump + 1; - return lump; - } else { - *lastlump = numlumps; - return -1; - } + *lastlump = numlumps; + return -1; } -// [RH] Used by P_SetupLevel() to check for the presence of -// a BEHAVIOR lump and adjust its behavior accordingly. +//========================================================================== +// +// W_CheckLumpName +// +//========================================================================== BOOL W_CheckLumpName (int lump, const char *name) { @@ -651,7 +721,12 @@ BOOL W_CheckLumpName (int lump, const char *name) return !strnicmp (lumpinfo[lump].name, name, 8); } -// [RH] Copies the lump name to to using uppercopy +//========================================================================== +// +// W_GetLumpName +// +//========================================================================== + void W_GetLumpName (char *to, int lump) { if (lump >= numlumps) @@ -660,16 +735,26 @@ void W_GetLumpName (char *to, int lump) uppercopy (to, lumpinfo[lump].name); } -// [RH] Returns file ptr for specified lump -FILE *W_GetLumpFile (int lump) +//========================================================================== +// +// W_GetLumpHandle +// +//========================================================================== + +int W_GetLumpHandle (int lump) { if (lump >= numlumps) - return NULL; + return -1; else return lumpinfo[lump].handle; } -// [RH] Put a lump in a certain namespace +//========================================================================== +// +// W_SetLumpNamespace +// +//========================================================================== + void W_SetLumpNamespace (int lump, int nmspace) { if (lump < numlumps) diff --git a/code/c_consol.c b/code/c_consol.c index fbd1c3ae9e..ff469d790a 100644 --- a/code/c_consol.c +++ b/code/c_consol.c @@ -25,9 +25,10 @@ #include "st_stuff.h" #include "s_sound.h" #include "s_sndseq.h" - #include "doomstat.h" +#include "gi.h" + static void C_TabComplete (void); static BOOL TabbedLast; // Last key pressed was tab @@ -151,21 +152,33 @@ void C_InitConsole (int width, int height, BOOL ingame) if ( (vidactive = ingame) ) { if (!gotconback) { BOOL stylize = false; - patch_t *patch; + BOOL isRaw = false; + patch_t *bg; int num; num = W_CheckNumForName ("CONBACK"); if (num == -1) { stylize = true; - num = W_GetNumForName ("TITLEPIC"); + num = W_GetNumForName (gameinfo.titlePage); + isRaw = gameinfo.flags & GI_PAGESARERAW; } - patch = W_CacheLumpNum (num, PU_CACHE); + bg = W_CacheLumpNum (num, PU_CACHE); + + if (isRaw) + V_AllocScreen (&conback, 320, 200, 8); + else + V_AllocScreen (&conback, SHORT(bg->width), SHORT(bg->height), 8); + + if (!conback.impdata) + I_FatalError ("No memory for console backdrop"); - V_AllocScreen (&conback, SHORT(patch->width), SHORT(patch->height), 8); V_LockScreen (&conback); - V_DrawPatch (0, 0, &conback, patch); + if (isRaw) + V_DrawBlock (0, 0, &conback, 320, 200, (byte *)bg); + else + V_DrawPatch (0, 0, &conback, bg); if (stylize) { byte *fadetable = W_CacheLumpName ("COLORMAP", PU_CACHE), f, *v, *i; @@ -1117,14 +1130,19 @@ void C_MidPrint (char *msg) if (MidMsg) V_FreeBrokenLines (MidMsg); - if ( (MidMsg = V_BreakLines (con_scaletext->value ? screen.width / CleanXfac : screen.width, msg)) ) { - MidTicker = (int)(con_midtime->value * TICRATE) + gametic; + if (msg) + { + if ( (MidMsg = V_BreakLines (con_scaletext->value ? screen.width / CleanXfac : screen.width, msg)) ) { + MidTicker = (int)(con_midtime->value * TICRATE) + gametic; - for (i = 0; MidMsg[i].width != -1; i++) - ; + for (i = 0; MidMsg[i].width != -1; i++) + ; - MidLines = i; + MidLines = i; + } } + else + MidMsg = NULL; } void C_DrawMid (void) diff --git a/code/c_varini.c b/code/c_varini.c index d91e7a08cf..a7c02d561b 100644 --- a/code/c_varini.c +++ b/code/c_varini.c @@ -12,6 +12,7 @@ typedef struct { } cvarinit_t; extern cvar_t *gammalevel, + *wipetype, *st_scale, *gameskill, *crosshair, @@ -94,6 +95,7 @@ extern cvar_t *gammalevel, *teamplay, *deathmatch, + *fakedmatch, *dmflagsvar, *fraglimit, *timelimit, @@ -119,9 +121,10 @@ extern cvar_t *gammalevel, static const cvarinit_t Initializers[] = { { &gammalevel, "gamma", "1", CVAR_ARCHIVE|CVAR_CALLBACK }, + { &wipetype, "wipetype", "1", CVAR_ARCHIVE }, { &testgibs, "testgibs", "0", 0 }, { &st_scale, "st_scale", "0", CVAR_ARCHIVE|CVAR_CALLBACK }, - { &dimamount, "dimamount", "1", CVAR_ARCHIVE }, + { &dimamount, "dimamount", "0.2", CVAR_ARCHIVE }, { &dimcolor, "dimcolor", "ff d7 00", CVAR_ARCHIVE }, { &crosshair, "crosshair", "0", CVAR_ARCHIVE }, { &developer, "developer", "0", 0 }, @@ -210,6 +213,7 @@ static const cvarinit_t Initializers[] = { { &teamplay, "teamplay", "0", CVAR_SERVERINFO }, { &deathmatch, "deathmatch", "0", CVAR_SERVERINFO|CVAR_LATCH }, + { &fakedmatch, "alwaysapplydmflags", "0", CVAR_SERVERINFO }, { &dmflagsvar, "dmflags", "0", CVAR_SERVERINFO|CVAR_CALLBACK }, { &timelimit, "timelimit", "0", CVAR_SERVERINFO }, { &fraglimit, "fraglimit", "0", CVAR_SERVERINFO }, diff --git a/code/d_items.c b/code/d_items.c index 7b24bbe34a..deb0b096db 100644 --- a/code/d_items.c +++ b/code/d_items.c @@ -381,7 +381,7 @@ gitem_t itemlist[] = { IT_POWERUP, pw_invisibility, 0, - "Partial Invisibility" + "Invisibility" }, { @@ -391,7 +391,7 @@ gitem_t itemlist[] = { IT_POWERUP, pw_ironfeet, 0, - "Iron Feet" + "Radiation Suit" }, { diff --git a/code/d_main.h b/code/d_main.h index b67b14b004..5b681ff0f6 100644 --- a/code/d_main.h +++ b/code/d_main.h @@ -28,11 +28,6 @@ #include #include "d_event.h" - -void D_AddFile (char *file); - - - // // D_DoomMain() // Not a globally visible function, just included for source reference, diff --git a/code/djgpp/I_sound.c b/code/djgpp/I_sound.c index 6bee76d7b3..bcb8afa4c5 100644 --- a/code/djgpp/I_sound.c +++ b/code/djgpp/I_sound.c @@ -153,7 +153,8 @@ badwave: sfx->link = S_sfx + i; sfx->ms = S_sfx[i].ms; sfx->data = S_sfx[i].data; - sfx->loopdata = S_sfx[i].loopdata; + sfx->normal = S_sfx[i].normal; + sfx->looping = S_sfx[i].looping; return; } @@ -290,7 +291,7 @@ badwave: smp.loop1Start = smp.loop1End = 0; smp.loop1Type = loopNone; - if ( (error = blargh (&smp, 0, (unsigned *)&sfx->data)) != OK) + if ( (error = blargh (&smp, 0, (unsigned *)&sfx->normal)) != OK) I_FatalError ("getsfx: AddSample failed: %s", MIDASgetErrorMessage(error)); /* With loop: */ @@ -299,7 +300,7 @@ badwave: smp.loop1End = smp.sampleLength; smp.loop1Type = loopUnidir; - if ( (error = blargh (&smp, 0, (unsigned *)&sfx->loopdata)) != OK) + if ( (error = blargh (&smp, 0, (unsigned *)&sfx->looping)) != OK) I_FatalError ("getsfx: AddSample failed: %s", MIDASgetErrorMessage(error)); } @@ -308,6 +309,7 @@ badwave: if (sfx->frequency == 0) sfx->frequency = 11025; sfx->ms = (sfx->ms * 1000) / (sfx->frequency); + sfx->data = sfxcopy; } @@ -383,8 +385,8 @@ int I_StartSound (sfxinfo_t *sfx, int vol, int sep, int pitch, int channel, BOOL } ChannelMap[channel].playHandle = MIDASplaySample ( - looping ? (MIDASsample)sfx->loopdata - : (MIDASsample)sfx->data, + looping ? (MIDASsample)sfx->looping + : (MIDASsample)sfx->normal, ChannelMap[channel].midasChannel, 0, PITCH(sfx->frequency,pitch), @@ -593,7 +595,6 @@ void STACK_ARGS I_ShutdownSound (void) size_t len = 0; if (MidasInited) { - Printf (PRINT_HIGH, "I_ShutdownSound: Stopping sounds\n"); if (ChannelMap) { for (i = 0; i < numChannels; i++ ) { if (ChannelMap[i].playHandle) { @@ -607,23 +608,23 @@ void STACK_ARGS I_ShutdownSound (void) I_ShutdownMusic(); - Printf (PRINT_HIGH, "I_ShutdownSound: Uninitializing MIDAS\n"); - // [RH] Free all loaded samples for (i = 0; i < numsfx; i++) { if (!S_sfx[i].link) { - if (S_sfx[i].data) { - MIDASfreeSample ((MIDASsample)S_sfx[i].data); + if (S_sfx[i].normal) { + MIDASfreeSample ((MIDASsample)S_sfx[i].normal); len += S_sfx[i].length; c++; } - if (S_sfx[i].loopdata) { - MIDASfreeSample ((MIDASsample)S_sfx[i].loopdata); + if (S_sfx[i].looping) { + MIDASfreeSample ((MIDASsample)S_sfx[i].looping); + } + if (S_sfx[i].data) { + free (S_sfx[i].data); } } S_sfx[i].data = S_sfx[i].link = NULL; } - Printf (PRINT_HIGH, "%d sounds expunged (%d bytes)\n", c, len); if ( !MIDASstopBackgroundPlay() ) MIDASerror(); diff --git a/code/djgpp/I_system.c b/code/djgpp/I_system.c index 68a443cad9..ae15d5e773 100644 --- a/code/djgpp/I_system.c +++ b/code/djgpp/I_system.c @@ -54,7 +54,7 @@ typedef unsigned long DWORD; #include "../../midas/src/midas/midasdll.h" #ifdef USEASM -BOOL MIDAS_CALL CheckMMX (char *vendorid); +BOOL STACK_ARGS CheckMMX (char *vendorid); #endif BOOL UseMMX; @@ -63,6 +63,7 @@ BOOL fastdemo; float mb_used = 6.0; int (*I_GetTime) (void); +int (*I_WaitForTic) (int); void I_Tactile (int on, int off, int total) @@ -144,18 +145,30 @@ static void MIDAS_CALL TimerCallback (void) } static void TimerEnd (void) { } -int I_GetTimeReally (void) +int I_GetTimePolled (void) { return counter; } +int I_WaitForTicPolled (int prevtic) +{ + while (counter <= prevtic) + ; + return counter; +} + // [RH] Increments the time count every time it gets called. // Used only by -fastdemo (just like BOOM). +static int faketic = 0; + int I_GetTimeFake (void) { - static int tic = 0; + return faketic++; +} - return tic++; +int I_WaitForTicFake (int whocares) +{ + return faketic++; } @@ -202,9 +215,15 @@ void I_Init(void) // [RH] Support for BOOM's -fastdemo if (fastdemo) + { I_GetTime = I_GetTimeFake; + I_WaitForTic = I_WaitForTicFake; + } else - I_GetTime = I_GetTimeReally; + { + I_GetTime = I_GetTimePolled; + I_WaitForTic = I_WaitForTicPolled; + } I_InitSound(); @@ -284,9 +303,6 @@ void I_Error (const char *error, ...) I_FatalError ("humph"); } -// killough 2/22/98: Add support for ENDBOOM, which is PC-specific -// [RH] Use ENDOOM if ENDBOOM not found. - void I_EndDoom(void) { int lump = W_CheckNumForName ("ENDOOM"); diff --git a/code/djgpp/I_system.h b/code/djgpp/I_system.h index 9ed39f2a5f..46ab2a2b16 100644 --- a/code/djgpp/I_system.h +++ b/code/djgpp/I_system.h @@ -40,8 +40,9 @@ byte *I_ZoneBase (int *size); // Called by D_DoomLoop, // returns current time in tics. int (*I_GetTime) (void); +int (*I_WaitForTic) (int); -int I_GetTimeReally (void); +int I_GetTimePolled (void); int I_GetTimeFake (void); // diff --git a/code/docs/Rh-log.txt b/code/docs/Rh-log.txt index d5dd481e13..7c23ddda01 100644 --- a/code/docs/Rh-log.txt +++ b/code/docs/Rh-log.txt @@ -1,4 +1,164 @@ +March 15, 1999 +- Added support for custom ambient sound attenuations. This is an optional + floating point value that follows the point keyword. +- For 1.17, I had changed the sound volumes in s_sound.c to floats + *except* for the ambient sounds which were still being treated as byte + values between 0-255, so they would always play at full volume. Fixed. + +March 14, 1999 +- Discovered a savegame bug: An mobj's translation table was being saved + improperly and could point to invalid memory on reload. Fixed. +- Added another dmflag, DF_RESPAWN_SUPER, to cause invulnerability and + invisibility to respawn. No room in menu, so you have to set it by hand. +- Added an alwaysapplydmflags cvar that can be used to cause dmflags that + normally only affect deathmatch to apply to single player and coop games + as well. +- Changed P_Thing_Spawn() so that it can spawns things anywhere and not + just at map spots. (Useful for making it look like a monster was carrying + an item.) +- Added support for MBF's sky texture transfer linedefs. Also added support + for Hexen's Sky2 sector special. +- In r_plane.c, spanstop was never used anywhere. Removed it. + +March 10, 1999 +- Made the network code "better." htons is used in the appropriate places, + and the port a packet is sent from is used to determine which node sent + a packet (so now I can test more than two-player games on my machine). +- Added an event-driven timer routine. Instead of busy waiting for a new tic, + I can wait on an event and give other processes some CPU time. This makes + two-player games on one machine run much more smoothly on Windows 95/98. + (It was already smooth for the foreground player on NT.) + +March 8, 1999 +- Fixed a problem with R_DrawPSprite. It was leaving vis->translucency unset, + which could produce odd results depending on the contents of the stack. + +March 7, 1999 +- Discovered a big problem with my linked list of ceiling_t's implementation. + Fixed. + +March 6, 1999 +- Added two new screen wipes: burn and crossfade. +- The mid-screen message gets cleared out on level load now. +- Stopped using the zone heap to store level snapshots. +- Enhanced the stealth monsters so that they will take advantage of all + translucency levels available. +- Fixed the damage for A_MonsterRail. I guess DOOM doesn't copy the damage + amount out of the mobjinfo when an mobj is spawned. +- Added a check to the fullscreen HUD to prevent it from going outside the + array of armor pictures if the AC was above 2. +- The DeHackEd code was setting the Blue AC for max soulsphere health. Fixed. +- Tried out Rick Clark's toxplant.wad and discovered a bug with the + particles: They were colored by whichever sector was drawn last and not + the sector they were in. Fixed. +- Pulled the old info.h from the 1.17a source so I could get things in a + working state to put up a fixed DeHackEd version for the Ground Zero TC. + +March 4, 1999 +- Word of advice: When you have 2847 states and 399 mobjinfos (from Hexen) + to reformat, don't try to do it all by hand. I was smart enough to use a + program to convert all the states into the multigen format, but I thought + I could handle the mobjs myself. Ha ha ha ha ha ha! After a few hours, + my arm was aching, and I had only done about one fourth of the mobjinfos. + Then I wrote a program to convert the ones from Hexen's info.c into + multigen format, and all I had to do was drag them to the correct place + with my mouse. Much easier, and much less strenuous. (Also much less + error-prone.) + + For comparison, Heretic has 161 mobjinfos and 1205 states. + Doom 2 has a mere 137 mobjinfos and 967 states. + +March 3, 1999 +- Had a change of plans about how I want to implement multiple games in a + single executable. All the data in info.c and info.h will be moved to an + external data file whose format is based on that used by multigen (the + tool id used to generate info.c). The list of spawnable things will also + be moved out of p_things.c and into this file. + + This means that everything I did in info.h on March 1 was wasted. Oh well. + +March 1, 1999 +- Pasted labels for the Heretic and Hexen things into info.c. Had to + shuffle a few of them around: + + --- Things renamed --- + MT_MISC* -> MT_DMISC* (if Doom) + MT_HMISC* (if Heretic) + MT_XMISC* (if Hexen) + MT_BARREL -> MT_HBARREL (for Heretic) + MT_DBARREL (for Doom) + MT_TFOG -> MT_DTFOG, MT_HTFOG, MT_XTFOG + created a new MT_TFOG elsewhere. the others should be + copied on top of it as appropriate. + MT_HEAD -> renamed Doom's to MT_CACODEMON + MT_KNIGHT -> renamed Doom's to MT_HELLKNIGHT + MT_FIREBOMB -> MT_HFIREBOMB, MT_XFIREBOMB + + --- Things moved into common Heretic/Hexen section --- + MT_ARTIFLY + MT_ARTIINVULNERABILITY -> ditto + MT_ARTIEGG -> ditto + MT_EGGFX -> ditto + MT_ARTISUPERHEAL -> ditto + MT_ARTITELEPORT -> ditto + MT_SPLASH + MT_SPLASHBASE + MT_LAVASPLASH + MT_LAVASMAKE + MT_SLUDGECHUNK + MT_SLUDGESPLASH + MT_BLOODSPLATTER + MT_BLOODYSKULL + MT_MNTRFX1 + MT_MNTRFX2 (deathsound is sfx_phohit in Heretic, no sound in Hexen) + MT_MNTRFX3 + MT_SOUNDWATERFALL + + --- Things moved to global section --- + MT_BLOOD (note that Hexen's blood has mass 5, not 100. was #38) + MT_TELEPORTMAN (was #41) + MT_PLAYER (was #0) Hexen's is name differently, so it didn't move. + + (Hexen things renamed) + MT_MINOTAUR -> MT_MAULATOR + MT_SOUNDWIND -> MT_XSOUNDWIND + +- Added a pulsating effect for the invisibility powerup that slowly + "pulses" it in and out of visibility, but never going below 25%, so it's + never totally invisible. +- Spent a few hours with the DOSDoom translucency code. I think the + greenness of it is probably more the fault of DOOM's limited palette, + particularly after comparing the 25% translucency table from before + with 25% translucency now. Very low levels of translucency with one + of the colors being dark are still too green, though. + +February 28, 1999 +- Added DOSDoom 0.65's translucency code. I'm not sure if it was really + worth it, though. I tried Allegro's RGB table code to speed up the + generation of the translucency table, but it didn't seem to produce + very satisfactory results, so I use BestColor to find palette colors + to use. The results are satisfactory, but they seem a bit too green. +- Delayed gathering of data on a sprite's patches (width, topoffset, and + offset) until it is needed (either when the level is precached, or when + the sprite is first seen). Game startup is a great deal quicker without + any noticable performance hit elsewhere. Cool. + +February 27, 1999 +- Note: Hexen's friction is roughly equivalent to a Sector_SetFriction of + 171 (ends up as 0xf909, Hexen uses 0xf900). Player movement thrust should + be halved at this level. Changed the calculation of sector->movefactor + accordingly. (With the BOOM code, player thrust was nearly one fourth + normal with that level of friction.) +- Discovered that MBF's code to affect monsters with friction doesn't + work without the change it made to how mobjs are linked into the blockmap. + +February 24, 1999 +- Stopped using stdio in w_wad.c. +- Had left some calls to W_Profile in W_InitMultipleFiles(). Removed. + February 21, 1999 +- Added support for real looping sounds, because Herian 2 used so many of + them, and the old method sounded pretty bad with them. - Found a problem with sliding polyobj doors: If, when they try to close, they can't move anywhere from their open position, they would move slightly further open and leave a gap when they managed to close. Fixed. diff --git a/code/doominfo.lmp b/code/doominfo.lmp new file mode 100644 index 0000000000..aec6061cdb --- /dev/null +++ b/code/doominfo.lmp @@ -0,0 +1,3136 @@ +// This file describes the state definitions and info declarations used for +// all incarnations of the games DOOM and DOOM 2. The format of this file is +// based on the format used by the original infogen with modifications to +// suit the way things are done internally by ZDoom. +// +// Much of this file comes unmodified from the multigen.txt file, which is +// included with the DOOM Utilities package available for download from +// DOSDoom's homepage (http://frag.com/dosdoom). +// +// Original header follows: +// +//============================================================================ +// If the first two characters of a line are S_, it is a state definition +// line. Otherwise, it is part of an info declaration. +// +//============================================================================ +// state data is: +// +// statename sprite frame tics action nextstate [optional1] [optional2] +// a * after the frame letter causes full bright +// +//============================================================================ +// An info definition is: +// +// $ MOBJNAME +// field data +// +// if MOBJNAME is +, a new unique name will be generated +// if fieldname starts with str_, it will be made a char * instead of an int +//============================================================================ + +multigen +{ +// +// info default MUST be first in file +// + +$ DEFAULT +doomednum -1 //number to spawn this object +spawnstate S_NULL // +spawnhealth 1000 // +seestate S_NULL //when player sighted or enemy shot +seesound "" //also launch sound for missiles +reactiontime 8 //wait time before attacking +attacksound "" // +painstate S_NULL // +painchance 0 //out of 256 +painsound "" // +meleestate S_NULL // +missilestate S_NULL // +crashstate S_NULL // +deathstate S_NULL //also explodestate for missiles +xdeathstate S_NULL //when knocked to -spawnhelath or lower +deathsound "" //also explosion sound for missiles +speed 0 // +radius 20 // +height 16 // +mass 100 // +damage 0 //missile damage in d8s +activesound "" // +flags 0 // +flags2 0 //Heretic/Hexen flags +raisestate S_NULL //vile resurection state +translucency 1 //0=invisible, 1=opaque +item NULL //inventory item, implies pickup-able + + +// when a state cycles to S_NULL, the actor will be removed + +S_NULL TROO A -1 NULL S_NULL + +// +// map spots +// + +$ MT_MAPSPOT +doomednum 9001 +spawnstate S_MAPSPOT +flags MF_NOBLOCKMAP|MF_NOSECTOR|MF_NOGRAVITY + +$ MT_MAPSPOTGRAVITY +doomednum 9013 +spawnstate S_MAPSPOT +flags2 MF2_DONTDRAW + +S_MAPSPOT TNT1 A -1 NULL S_NULL + + + +//============================================================================ +// player sprites +//============================================================================ + +// all flashes go to S_LIGHTDONE to reset the light then remove self +S_LIGHTDONE SHTG E 0 A_Light0 S_NULL + + +// +// fist +// +S_PUNCH PUNG A 1 A_WeaponReady S_PUNCH +S_PUNCHDOWN PUNG A 1 A_Lower S_PUNCHDOWN +S_PUNCHUP PUNG A 1 A_Raise S_PUNCHUP + +S_PUNCH1 PUNG B 4 NULL S_PUNCH2 +S_PUNCH2 PUNG C 4 A_Punch S_PUNCH3 +S_PUNCH3 PUNG D 5 NULL S_PUNCH4 +S_PUNCH4 PUNG C 4 NULL S_PUNCH5 +S_PUNCH5 PUNG B 5 A_ReFire S_PUNCH + + +// +// pistol +// +S_PISTOL PISG A 1 A_WeaponReady S_PISTOL +S_PISTOLDOWN PISG A 1 A_Lower S_PISTOLDOWN +S_PISTOLUP PISG A 1 A_Raise S_PISTOLUP +S_PISTOL1 PISG A 4 NULL S_PISTOL2 +S_PISTOL2 PISG B 6 A_FirePistol S_PISTOL3 +S_PISTOL3 PISG C 4 NULL S_PISTOL4 +S_PISTOL4 PISG B 5 A_ReFire S_PISTOL + +S_PISTOLFLASH PISF A* 7 A_Light1 S_LIGHTDONE + + +// +// shotgun +// +S_SGUN SHTG A 1 A_WeaponReady S_SGUN +S_SGUNDOWN SHTG A 1 A_Lower S_SGUNDOWN +S_SGUNUP SHTG A 1 A_Raise S_SGUNUP + +S_SGUN1 SHTG A 3 NULL S_SGUN2 +S_SGUN2 SHTG A 7 A_FireShotgun S_SGUN3 +S_SGUN3 SHTG B 5 NULL S_SGUN4 +S_SGUN4 SHTG C 5 NULL S_SGUN5 +S_SGUN5 SHTG D 4 NULL S_SGUN6 +S_SGUN6 SHTG C 5 NULL S_SGUN7 +S_SGUN7 SHTG B 5 NULL S_SGUN8 +S_SGUN8 SHTG A 3 NULL S_SGUN9 +S_SGUN9 SHTG A 7 A_ReFire S_SGUN + +S_SGUNFLASH1 SHTF A* 4 A_Light1 S_SGUNFLASH2 +S_SGUNFLASH2 SHTF B* 3 A_Light2 S_LIGHTDONE + + +// +// double shotgun +// +S_DSGUN SHT2 A 1 A_WeaponReady S_DSGUN +S_DSGUNDOWN SHT2 A 1 A_Lower S_DSGUNDOWN +S_DSGUNUP SHT2 A 1 A_Raise S_DSGUNUP + +S_DSGUN1 SHT2 A 3 NULL S_DSGUN2 +S_DSGUN2 SHT2 A 7 A_FireShotgun2 S_DSGUN3 +S_DSGUN3 SHT2 B 7 NULL S_DSGUN4 +S_DSGUN4 SHT2 C 7 A_CheckReload S_DSGUN5 + +S_DSGUN5 SHT2 D 7 A_OpenShotgun2 S_DSGUN6 +S_DSGUN6 SHT2 E 7 NULL S_DSGUN7 +S_DSGUN7 SHT2 F 7 A_LoadShotgun2 S_DSGUN8 +S_DSGUN8 SHT2 G 6 NULL S_DSGUN9 +S_DSGUN9 SHT2 H 6 A_CloseShotgun2 S_DSGUN10 +S_DSGUN10 SHT2 A 5 A_ReFire S_DSGUN + +S_DSNR1 SHT2 B 7 NULL S_DSNR2 +S_DSNR2 SHT2 A 3 NULL S_DSGUNDOWN + +S_DSGUNFLASH1 SHT2 I* 5 A_Light1 S_DSGUNFLASH2 +S_DSGUNFLASH2 SHT2 J* 4 A_Light2 S_LIGHTDONE + + +// +// chaingun +// +S_CHAIN CHGG A 1 A_WeaponReady S_CHAIN +S_CHAINDOWN CHGG A 1 A_Lower S_CHAINDOWN +S_CHAINUP CHGG A 1 A_Raise S_CHAINUP + +S_CHAIN1 CHGG A 4 A_FireCGun S_CHAIN2 +S_CHAIN2 CHGG B 4 A_FireCGun S_CHAIN3 +S_CHAIN3 CHGG B 0 A_ReFire S_CHAIN + +S_CHAINFLASH1 CHGF A* 5 A_Light1 S_LIGHTDONE +S_CHAINFLASH2 CHGF B* 5 A_Light2 S_LIGHTDONE + + +// +// missile +// +S_MISSILE MISG A 1 A_WeaponReady S_MISSILE +S_MISSILEDOWN MISG A 1 A_Lower S_MISSILEDOWN +S_MISSILEUP MISG A 1 A_Raise S_MISSILEUP + +S_MISSILE1 MISG B 8 A_GunFlash S_MISSILE2 +S_MISSILE2 MISG B 12 A_FireMissile S_MISSILE3 +S_MISSILE3 MISG B 0 A_ReFire S_MISSILE + +S_MISSILEFLASH1 MISF A* 3 A_Light1 S_MISSILEFLASH2 +S_MISSILEFLASH2 MISF B* 4 NULL S_MISSILEFLASH3 +S_MISSILEFLASH3 MISF C* 4 A_Light2 S_MISSILEFLASH4 +S_MISSILEFLASH4 MISF D* 4 A_Light2 S_LIGHTDONE + + +// +// chainsaw +// +S_SAW SAWG C 4 A_WeaponReady S_SAWB +S_SAWB SAWG D 4 A_WeaponReady S_SAW +S_SAWDOWN SAWG C 1 A_Lower S_SAWDOWN +S_SAWUP SAWG C 1 A_Raise S_SAWUP + +S_SAW1 SAWG A 4 A_Saw S_SAW2 +S_SAW2 SAWG B 4 A_Saw S_SAW3 +S_SAW3 SAWG B 0 A_ReFire S_SAW + + +// +// plasma +// +S_PLASMA PLSG A 1 A_WeaponReady S_PLASMA +S_PLASMADOWN PLSG A 1 A_Lower S_PLASMADOWN +S_PLASMAUP PLSG A 1 A_Raise S_PLASMAUP + +S_PLASMA1 PLSG A 3 A_FirePlasma S_PLASMA2 +S_PLASMA2 PLSG B 20 A_Refire S_PLASMA + +S_PLASMAFLASH1 PLSF A* 4 A_Light1 S_LIGHTDONE +S_PLASMAFLASH2 PLSF B* 4 A_Light1 S_LIGHTDONE + + +// +// BFG +// +S_BFG BFGG A 1 A_WeaponReady S_BFG +S_BFGDOWN BFGG A 1 A_Lower S_BFGDOWN +S_BFGUP BFGG A 1 A_Raise S_BFGUP + +S_BFG1 BFGG A 20 A_BFGsound S_BFG2 +S_BFG2 BFGG B 10 A_GunFlash S_BFG3 +S_BFG3 BFGG B 10 A_FireBFG S_BFG4 +S_BFG4 BFGG B 20 A_ReFire S_BFG + +S_BFGFLASH1 BFGF A* 11 A_Light1 S_BFGFLASH2 +S_BFGFLASH2 BFGF B* 6 A_Light2 S_LIGHTDONE + + + +//============================================================================ +// world objects +//============================================================================ + +S_BLOOD1 BLUD C 8 NULL S_BLOOD2 +S_BLOOD2 BLUD B 8 NULL S_BLOOD3 +S_BLOOD3 BLUD A 8 NULL S_NULL + +S_PUFF1 PUFF A* 4 NULL S_PUFF2 +S_PUFF2 PUFF B 4 NULL S_PUFF3 +S_PUFF3 PUFF C 4 NULL S_PUFF4 +S_PUFF4 PUFF D 4 NULL S_NULL + + +// fireballs + +S_TBALL1 BAL1 A* 4 NULL S_TBALL2 +S_TBALL2 BAL1 B* 4 NULL S_TBALL1 + +S_TBALLX1 BAL1 C* 6 NULL S_TBALLX2 +S_TBALLX2 BAL1 D* 6 NULL S_TBALLX3 +S_TBALLX3 BAL1 E* 6 NULL S_NULL + + +S_RBALL1 BAL2 A* 4 NULL S_RBALL2 +S_RBALL2 BAL2 B* 4 NULL S_RBALL1 + +S_RBALLX1 BAL2 C* 6 NULL S_RBALLX2 +S_RBALLX2 BAL2 D* 6 NULL S_RBALLX3 +S_RBALLX3 BAL2 E* 6 NULL S_NULL + + + +// plasma balls + +S_PLASBALL PLSS A* 6 NULL S_PLASBALL2 +S_PLASBALL2 PLSS B* 6 NULL S_PLASBALL + +// +// Plasma explosion on an object +// +S_PLASEXP PLSE A* 4 NULL S_PLASEXP2 +S_PLASEXP2 PLSE B* 4 NULL S_PLASEXP3 +S_PLASEXP3 PLSE C* 4 NULL S_PLASEXP4 +S_PLASEXP4 PLSE D* 4 NULL S_PLASEXP5 +S_PLASEXP5 PLSE E* 4 NULL S_NULL + +// +// Rocket +// +S_ROCKET MISL A* 1 NULL S_ROCKET + +// +// BFG shot +// +S_BFGSHOT BFS1 A* 4 NULL S_BFGSHOT2 +S_BFGSHOT2 BFS1 B* 4 NULL S_BFGSHOT + +// +// BFG explosion when shot lands +// +S_BFGLAND BFE1 A* 8 NULL S_BFGLAND2 +S_BFGLAND2 BFE1 B* 8 NULL S_BFGLAND3 +S_BFGLAND3 BFE1 C* 8 A_BFGSpray S_BFGLAND4 +S_BFGLAND4 BFE1 D* 8 NULL S_BFGLAND5 +S_BFGLAND5 BFE1 E* 8 NULL S_BFGLAND6 +S_BFGLAND6 BFE1 F* 8 NULL S_NULL + +// +// BFG explosion on an object +// +S_BFGEXP BFE2 A* 8 NULL S_BFGEXP2 +S_BFGEXP2 BFE2 B* 8 NULL S_BFGEXP3 +S_BFGEXP3 BFE2 C* 8 NULL S_BFGEXP4 +S_BFGEXP4 BFE2 D* 8 NULL S_NULL + +// explosions + +S_EXPLODE1 MISL B* 8 A_Explode S_EXPLODE2 +S_EXPLODE2 MISL C* 6 NULL S_EXPLODE3 +S_EXPLODE3 MISL D* 4 NULL S_NULL + +// +// Teleport Fog +// +S_TFOG TFOG A* 6 NULL S_TFOG01 +S_TFOG01 TFOG B* 6 NULL S_TFOG02 +S_TFOG02 TFOG A* 6 NULL S_TFOG2 +S_TFOG2 TFOG B* 6 NULL S_TFOG3 +S_TFOG3 TFOG C* 6 NULL S_TFOG4 +S_TFOG4 TFOG D* 6 NULL S_TFOG5 +S_TFOG5 TFOG E* 6 NULL S_TFOG6 +S_TFOG6 TFOG F* 6 NULL S_TFOG7 +S_TFOG7 TFOG G* 6 NULL S_TFOG8 +S_TFOG8 TFOG H* 6 NULL S_TFOG9 +S_TFOG9 TFOG I* 6 NULL S_TFOG10 +S_TFOG10 TFOG J* 6 NULL S_NULL + +// +// Item Teleport Fog +// +S_IFOG IFOG A* 6 NULL S_IFOG01 +S_IFOG01 IFOG B* 6 NULL S_IFOG02 +S_IFOG02 IFOG A* 6 NULL S_IFOG2 +S_IFOG2 IFOG B* 6 NULL S_IFOG3 +S_IFOG3 IFOG C* 6 NULL S_IFOG4 +S_IFOG4 IFOG D* 6 NULL S_IFOG5 +S_IFOG5 IFOG E* 6 NULL S_NULL + + +//============================================================================== + +// player + +$ MT_PLAYER +spawnstate S_PLAY +seestate S_PLAY_RUN1 +spawnhealth 100 +painstate S_PLAY_PAIN +painchance 255 +painsound *pain100_1 +reactiontime 0 +missilestate S_PLAY_ATK1 +deathstate S_PLAY_DIE1 +xdeathstate S_PLAY_XDIE1 +deathsound *death1 +radius 16 +height 56 +flags MF_SOLID|MF_SHOOTABLE|MF_DROPOFF|MF_PICKUP|MF_NOTDMATCH +flags2 MF2_WINDTHRUST|MF2_FLOORCLIP|MF2_TELESTOMP|MF2_SLIDE|MF2_PASSMOBJ|MF2_PUSHWALL + + +S_PLAY PLAY A -1 NULL S_NULL + +S_PLAY_RUN1 PLAY A 4 NULL S_PLAY_RUN2 +S_PLAY_RUN2 PLAY B 4 NULL S_PLAY_RUN3 +S_PLAY_RUN3 PLAY C 4 NULL S_PLAY_RUN4 +S_PLAY_RUN4 PLAY D 4 NULL S_PLAY_RUN1 + +S_PLAY_ATK1 PLAY E 12 NULL S_PLAY +S_PLAY_ATK2 PLAY F* 6 NULL S_PLAY_ATK1 + +S_PLAY_PAIN PLAY G 4 NULL S_PLAY_PAIN2 +S_PLAY_PAIN2 PLAY G 4 A_Pain S_PLAY + +S_PLAY_DIE1 PLAY H 10 NULL S_PLAY_DIE2 +S_PLAY_DIE2 PLAY I 10 A_PlayerScream S_PLAY_DIE3 +S_PLAY_DIE3 PLAY J 10 A_Fall S_PLAY_DIE4 +S_PLAY_DIE4 PLAY K 10 NULL S_PLAY_DIE5 +S_PLAY_DIE5 PLAY L 10 NULL S_PLAY_DIE6 +S_PLAY_DIE6 PLAY M 10 NULL S_PLAY_DIE7 +S_PLAY_DIE7 PLAY N -1 NULL S_NULL + +S_PLAY_XDIE1 PLAY O 5 NULL S_PLAY_XDIE2 +S_PLAY_XDIE2 PLAY P 5 A_XScream S_PLAY_XDIE3 +S_PLAY_XDIE3 PLAY Q 5 A_Fall S_PLAY_XDIE4 +S_PLAY_XDIE4 PLAY R 5 NULL S_PLAY_XDIE5 +S_PLAY_XDIE5 PLAY S 5 NULL S_PLAY_XDIE6 +S_PLAY_XDIE6 PLAY T 5 NULL S_PLAY_XDIE7 +S_PLAY_XDIE7 PLAY U 5 NULL S_PLAY_XDIE8 +S_PLAY_XDIE8 PLAY V 5 NULL S_PLAY_XDIE9 +S_PLAY_XDIE9 PLAY W -1 NULL S_NULL + +//============================================================================== +// Former Humans +//============================================================================== + +// possesed humans + +$ MT_POSSESSED +doomednum 3004 +spawnstate S_POSS_STND +spawnhealth 20 +seestate S_POSS_RUN1 +seesound grunt/sight1 +attacksound grunt/attack +painstate S_POSS_PAIN +painchance 200 +painsound grunt/pain +missilestate S_POSS_ATK1 +deathstate S_POSS_DIE1 +xdeathstate S_POSS_XDIE1 +raisestate S_POSS_RAISE1 +deathsound grunt/death1 +speed 8 +radius 20 +height 56 +activesound grunt/active +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL +flags2 MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL + +$ MT_STEALTHPOSSESSED +doomednum 9061 +spawnstate S_POSS_STND +spawnhealth 20 +seestate S_POSS_RUN1 +seesound grunt/sight1 +attacksound grunt/attack +painstate S_POSS_PAIN +painchance 200 +painsound grunt/pain +missilestate S_POSS_ATK1 +deathstate S_POSS_DIE1 +xdeathstate S_POSS_XDIE1 +raisestate S_POSS_RAISE1 +deathsound grunt/death1 +speed 8 +radius 20 +height 56 +activesound grunt/active +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL|MF_STEALTH +flags2 MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL +translucency 0 + + +S_POSS_STND POSS A 10 A_Look S_POSS_STND2 +S_POSS_STND2 POSS B 10 A_Look S_POSS_STND + +S_POSS_RUN1 POSS A 4 A_Chase S_POSS_RUN2 +S_POSS_RUN2 POSS A 4 A_Chase S_POSS_RUN3 +S_POSS_RUN3 POSS B 4 A_Chase S_POSS_RUN4 +S_POSS_RUN4 POSS B 4 A_Chase S_POSS_RUN5 +S_POSS_RUN5 POSS C 4 A_Chase S_POSS_RUN6 +S_POSS_RUN6 POSS C 4 A_Chase S_POSS_RUN7 +S_POSS_RUN7 POSS D 4 A_Chase S_POSS_RUN8 +S_POSS_RUN8 POSS D 4 A_Chase S_POSS_RUN1 + +S_POSS_ATK1 POSS E 10 A_FaceTarget S_POSS_ATK2 +S_POSS_ATK2 POSS F 8 A_PosAttack S_POSS_ATK3 +S_POSS_ATK3 POSS E 8 NULL S_POSS_RUN1 + +S_POSS_PAIN POSS G 3 NULL S_POSS_PAIN2 +S_POSS_PAIN2 POSS G 3 A_Pain S_POSS_RUN1 + +S_POSS_DIE1 POSS H 5 NULL S_POSS_DIE2 +S_POSS_DIE2 POSS I 5 A_Scream S_POSS_DIE3 +S_POSS_DIE3 POSS J 5 A_Fall S_POSS_DIE4 +S_POSS_DIE4 POSS K 5 NULL S_POSS_DIE5 +S_POSS_DIE5 POSS L -1 NULL S_NULL + +S_POSS_XDIE1 POSS M 5 NULL S_POSS_XDIE2 +S_POSS_XDIE2 POSS N 5 A_XScream S_POSS_XDIE3 +S_POSS_XDIE3 POSS O 5 A_Fall S_POSS_XDIE4 +S_POSS_XDIE4 POSS P 5 NULL S_POSS_XDIE5 +S_POSS_XDIE5 POSS Q 5 NULL S_POSS_XDIE6 +S_POSS_XDIE6 POSS R 5 NULL S_POSS_XDIE7 +S_POSS_XDIE7 POSS S 5 NULL S_POSS_XDIE8 +S_POSS_XDIE8 POSS T 5 NULL S_POSS_XDIE9 +S_POSS_XDIE9 POSS U -1 NULL S_NULL + +S_POSS_RAISE1 POSS K 5 NULL S_POSS_RAISE2 +S_POSS_RAISE2 POSS J 5 NULL S_POSS_RAISE3 +S_POSS_RAISE3 POSS I 5 NULL S_POSS_RAISE4 +S_POSS_RAISE4 POSS H 5 NULL S_POSS_RUN1 + + +//============================================================================== +// Former Human Sergeants +//============================================================================== + +// shotgun possesed humans + +$ MT_SHOTGUY +doomednum 9 +spawnstate S_SPOS_STND +spawnhealth 30 +seestate S_SPOS_RUN1 +seesound shotguy/sight1 +painstate S_SPOS_PAIN +painchance 170 +painsound shotguy/pain +missilestate S_SPOS_ATK1 +deathstate S_SPOS_DIE1 +xdeathstate S_SPOS_XDIE1 +raisestate S_SPOS_RAISE1 +deathsound shotguy/death1 +speed 8 +radius 20 +height 56 +activesound shotguy/active +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL +flags2 MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL + +$ MT_STEALTHSHOTGUY +doomednum 9060 +spawnstate S_SPOS_STND +spawnhealth 30 +seestate S_SPOS_RUN1 +seesound shotguy/sight1 +painstate S_SPOS_PAIN +painchance 170 +painsound shotguy/pain +missilestate S_SPOS_ATK1 +deathstate S_SPOS_DIE1 +xdeathstate S_SPOS_XDIE1 +raisestate S_SPOS_RAISE1 +deathsound shotguy/death1 +speed 8 +radius 20 +height 56 +activesound shotguy/active +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL|MF_STEALTH +flags2 MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL +translucency 0 + +S_SPOS_STND SPOS A 10 A_Look S_SPOS_STND2 +S_SPOS_STND2 SPOS B 10 A_Look S_SPOS_STND + +S_SPOS_RUN1 SPOS A 3 A_Chase S_SPOS_RUN2 +S_SPOS_RUN2 SPOS A 3 A_Chase S_SPOS_RUN3 +S_SPOS_RUN3 SPOS B 3 A_Chase S_SPOS_RUN4 +S_SPOS_RUN4 SPOS B 3 A_Chase S_SPOS_RUN5 +S_SPOS_RUN5 SPOS C 3 A_Chase S_SPOS_RUN6 +S_SPOS_RUN6 SPOS C 3 A_Chase S_SPOS_RUN7 +S_SPOS_RUN7 SPOS D 3 A_Chase S_SPOS_RUN8 +S_SPOS_RUN8 SPOS D 3 A_Chase S_SPOS_RUN1 + +S_SPOS_ATK1 SPOS E 10 A_FaceTarget S_SPOS_ATK2 +S_SPOS_ATK2 SPOS F* 10 A_SPosAttack S_SPOS_ATK3 +S_SPOS_ATK3 SPOS E 10 NULL S_SPOS_RUN1 + +S_SPOS_PAIN SPOS G 3 NULL S_SPOS_PAIN2 +S_SPOS_PAIN2 SPOS G 3 A_Pain S_SPOS_RUN1 + +S_SPOS_DIE1 SPOS H 5 NULL S_SPOS_DIE2 +S_SPOS_DIE2 SPOS I 5 A_Scream S_SPOS_DIE3 +S_SPOS_DIE3 SPOS J 5 A_Fall S_SPOS_DIE4 +S_SPOS_DIE4 SPOS K 5 NULL S_SPOS_DIE5 +S_SPOS_DIE5 SPOS L -1 NULL S_NULL + +S_SPOS_XDIE1 SPOS M 5 NULL S_SPOS_XDIE2 +S_SPOS_XDIE2 SPOS N 5 A_XScream S_SPOS_XDIE3 +S_SPOS_XDIE3 SPOS O 5 A_Fall S_SPOS_XDIE4 +S_SPOS_XDIE4 SPOS P 5 NULL S_SPOS_XDIE5 +S_SPOS_XDIE5 SPOS Q 5 NULL S_SPOS_XDIE6 +S_SPOS_XDIE6 SPOS R 5 NULL S_SPOS_XDIE7 +S_SPOS_XDIE7 SPOS S 5 NULL S_SPOS_XDIE8 +S_SPOS_XDIE8 SPOS T 5 NULL S_SPOS_XDIE9 +S_SPOS_XDIE9 SPOS U -1 NULL S_NULL + +S_SPOS_RAISE1 SPOS L 5 NULL S_SPOS_RAISE2 +S_SPOS_RAISE2 SPOS K 5 NULL S_SPOS_RAISE3 +S_SPOS_RAISE3 SPOS J 5 NULL S_SPOS_RAISE4 +S_SPOS_RAISE4 SPOS I 5 NULL S_SPOS_RAISE5 +S_SPOS_RAISE5 SPOS H 5 NULL S_SPOS_RUN1 + +//============================================================================== +// The Archvile +//============================================================================== + +$ MT_VILE +doomednum 64 +spawnstate S_VILE_STND +spawnhealth 700 +seestate S_VILE_RUN1 +seesound vile/sight +painstate S_VILE_PAIN +painchance 10 +painsound vile/pain +missilestate S_VILE_ATK1 +deathstate S_VILE_DIE1 +deathsound vile/death +speed 15 +radius 20 +height 56 +activesound vile/active +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL +flags2 MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL +mass 500 + +// stealth + +$ MT_STEALTHVILE +doomednum 9051 +spawnstate S_VILE_STND +spawnhealth 700 +seestate S_VILE_RUN1 +seesound vile/sight +painstate S_VILE_PAIN +painchance 10 +painsound vile/pain +missilestate S_VILE_ATK1 +deathstate S_VILE_DIE1 +deathsound vile/death +speed 15 +radius 20 +height 56 +activesound vile/active +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL|MF_STEALTH +flags2 MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL +mass 500 +translucency 0 + +S_VILE_STND VILE A 10 A_Look S_VILE_STND2 +S_VILE_STND2 VILE B 10 A_Look S_VILE_STND + +S_VILE_RUN1 VILE A 2 A_VileChase S_VILE_RUN2 +S_VILE_RUN2 VILE A 2 A_VileChase S_VILE_RUN3 +S_VILE_RUN3 VILE B 2 A_VileChase S_VILE_RUN4 +S_VILE_RUN4 VILE B 2 A_VileChase S_VILE_RUN5 +S_VILE_RUN5 VILE C 2 A_VileChase S_VILE_RUN6 +S_VILE_RUN6 VILE C 2 A_VileChase S_VILE_RUN7 +S_VILE_RUN7 VILE D 2 A_VileChase S_VILE_RUN8 +S_VILE_RUN8 VILE D 2 A_VileChase S_VILE_RUN9 +S_VILE_RUN9 VILE E 2 A_VileChase S_VILE_RUN10 +S_VILE_RUN10 VILE E 2 A_VileChase S_VILE_RUN11 +S_VILE_RUN11 VILE F 2 A_VileChase S_VILE_RUN12 +S_VILE_RUN12 VILE F 2 A_VileChase S_VILE_RUN1 + +S_VILE_ATK1 VILE G* 0 A_VileStart S_VILE_ATK2 +S_VILE_ATK2 VILE G* 10 A_FaceTarget S_VILE_ATK3 +S_VILE_ATK3 VILE H* 8 A_VileTarget S_VILE_ATK4 +S_VILE_ATK4 VILE I* 8 A_FaceTarget S_VILE_ATK5 +S_VILE_ATK5 VILE J* 8 A_FaceTarget S_VILE_ATK6 +S_VILE_ATK6 VILE K* 8 A_FaceTarget S_VILE_ATK7 +S_VILE_ATK7 VILE L* 8 A_FaceTarget S_VILE_ATK8 +S_VILE_ATK8 VILE M* 8 A_FaceTarget S_VILE_ATK9 +S_VILE_ATK9 VILE N* 8 A_FaceTarget S_VILE_ATK10 +S_VILE_ATK10 VILE O* 8 A_VileAttack S_VILE_ATK11 +S_VILE_ATK11 VILE P* 20 NULL S_VILE_RUN1 + +S_VILE_HEAL1 VILE [* 10 NULL S_VILE_HEAL2 +S_VILE_HEAL2 VILE \* 10 NULL S_VILE_HEAL3 +S_VILE_HEAL3 VILE ]* 10 NULL S_VILE_RUN1 + +S_VILE_PAIN VILE Q 5 NULL S_VILE_PAIN2 +S_VILE_PAIN2 VILE Q 5 A_Pain S_VILE_RUN1 + +S_VILE_DIE1 VILE Q 7 NULL S_VILE_DIE2 +S_VILE_DIE2 VILE R 7 A_Scream S_VILE_DIE3 +S_VILE_DIE3 VILE S 7 A_Fall S_VILE_DIE4 +S_VILE_DIE4 VILE T 7 NULL S_VILE_DIE5 +S_VILE_DIE5 VILE U 7 NULL S_VILE_DIE6 +S_VILE_DIE6 VILE V 7 NULL S_VILE_DIE7 +S_VILE_DIE7 VILE W 7 NULL S_VILE_DIE8 +S_VILE_DIE8 VILE X 5 NULL S_VILE_DIE9 +S_VILE_DIE9 VILE Y 5 NULL S_VILE_DIE10 +S_VILE_DIE10 VILE Z -1 NULL S_NULL + + +// +// hellfire +// +$ MT_FIRE +spawnstate S_FIRE1 +flags MF_NOBLOCKMAP|MF_NOGRAVITY + +S_FIRE1 FIRE A* 2 A_StartFire S_FIRE2 +S_FIRE2 FIRE B* 2 A_Fire S_FIRE3 +S_FIRE3 FIRE A* 2 A_Fire S_FIRE4 +S_FIRE4 FIRE B* 2 A_Fire S_FIRE5 + +S_FIRE5 FIRE C* 2 A_FireCrackle S_FIRE6 +S_FIRE6 FIRE B* 2 A_Fire S_FIRE7 +S_FIRE7 FIRE C* 2 A_Fire S_FIRE8 +S_FIRE8 FIRE B* 2 A_Fire S_FIRE9 + +S_FIRE9 FIRE C* 2 A_Fire S_FIRE10 +S_FIRE10 FIRE D* 2 A_Fire S_FIRE11 +S_FIRE11 FIRE C* 2 A_Fire S_FIRE12 +S_FIRE12 FIRE D* 2 A_Fire S_FIRE13 +S_FIRE13 FIRE C* 2 A_Fire S_FIRE14 + +S_FIRE14 FIRE D* 2 A_Fire S_FIRE15 +S_FIRE15 FIRE E* 2 A_Fire S_FIRE16 +S_FIRE16 FIRE D* 2 A_Fire S_FIRE17 +S_FIRE17 FIRE E* 2 A_Fire S_FIRE18 +S_FIRE18 FIRE D* 2 A_Fire S_FIRE19 + +S_FIRE19 FIRE E* 2 A_FireCrackle S_FIRE20 +S_FIRE20 FIRE F* 2 A_Fire S_FIRE21 +S_FIRE21 FIRE E* 2 A_Fire S_FIRE22 +S_FIRE22 FIRE F* 2 A_Fire S_FIRE23 +S_FIRE23 FIRE E* 2 A_Fire S_FIRE24 +S_FIRE24 FIRE F* 2 A_Fire S_FIRE25 + +S_FIRE25 FIRE G* 2 A_Fire S_FIRE26 +S_FIRE26 FIRE H* 2 A_Fire S_FIRE27 +S_FIRE27 FIRE G* 2 A_Fire S_FIRE28 +S_FIRE28 FIRE H* 2 A_Fire S_FIRE29 +S_FIRE29 FIRE G* 2 A_Fire S_FIRE30 +S_FIRE30 FIRE H* 2 A_Fire S_NULL + + +//============================================================================== +// The Revenant +//============================================================================== + +$ MT_UNDEAD +doomednum 66 +spawnstate S_SKEL_STND +spawnhealth 300 +seestate S_SKEL_RUN1 +seesound skeleton/sight +painstate S_SKEL_PAIN +painchance 100 +painsound skeleton/pain +meleestate S_SKEL_FIST1 +missilestate S_SKEL_MISS1 +deathstate S_SKEL_DIE1 +raisestate S_SKEL_RAISE1 +deathsound skeleton/death +speed 10 +radius 20 +height 56 +activesound skeleton/active +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL +flags2 MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL +mass 500 + +$ MT_STEALTHUNDEAD +doomednum 9059 +spawnstate S_SKEL_STND +spawnhealth 300 +seestate S_SKEL_RUN1 +seesound skeleton/sight +painstate S_SKEL_PAIN +painchance 100 +painsound skeleton/pain +meleestate S_SKEL_FIST1 +missilestate S_SKEL_MISS1 +deathstate S_SKEL_DIE1 +raisestate S_SKEL_RAISE1 +deathsound skeleton/death +speed 10 +radius 20 +height 56 +activesound skeleton/active +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL|MF_STEALTH +flags2 MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL +mass 500 +translucency 0 + +$ MT_TRACER +spawnstate S_TRACER +deathstate S_TRACEEXP1 +speed 10 +damage 10 +seesound skeleton/attack +deathsound skeleton/tracex +radius 11 +height 8 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_PCROSS|MF2_IMPACT +translucency .75 + +//S_TRACER MISL A* 1 A_Tracer S_TRACER + +// explosions + +//S_TRACEEXP1 MISL B* 8 NULL S_TRACEEXP2 +//S_TRACEEXP2 MISL C* 6 NULL S_TRACEEXP3 +//S_TRACEEXP3 MISL D* 4 NULL S_NULL + + +$ MT_SMOKE +spawnstate S_SMOKE1 +flags MF_NOBLOCKMAP|MF_NOGRAVITY +translucency .50 + +// trailing smoke + +S_SMOKE1 PUFF B 4 NULL S_SMOKE2 +S_SMOKE2 PUFF C 4 NULL S_SMOKE3 +S_SMOKE3 PUFF B 4 NULL S_SMOKE4 +S_SMOKE4 PUFF C 4 NULL S_SMOKE5 +S_SMOKE5 PUFF D 4 NULL S_NULL + +// Revenant shot + +S_TRACER FATB A* 2 A_Tracer S_TRACER2 +S_TRACER2 FATB B* 2 A_Tracer S_TRACER + +S_TRACEEXP1 FBXP A* 8 NULL S_TRACEEXP2 +S_TRACEEXP2 FBXP B* 6 NULL S_TRACEEXP3 +S_TRACEEXP3 FBXP C* 4 NULL S_NULL + + + +S_SKEL_STND SKEL A 10 A_Look S_SKEL_STND2 +S_SKEL_STND2 SKEL B 10 A_Look S_SKEL_STND + +S_SKEL_RUN1 SKEL A 2 A_Chase S_SKEL_RUN2 +S_SKEL_RUN2 SKEL A 2 A_Chase S_SKEL_RUN3 +S_SKEL_RUN3 SKEL B 2 A_Chase S_SKEL_RUN4 +S_SKEL_RUN4 SKEL B 2 A_Chase S_SKEL_RUN5 +S_SKEL_RUN5 SKEL C 2 A_Chase S_SKEL_RUN6 +S_SKEL_RUN6 SKEL C 2 A_Chase S_SKEL_RUN7 +S_SKEL_RUN7 SKEL D 2 A_Chase S_SKEL_RUN8 +S_SKEL_RUN8 SKEL D 2 A_Chase S_SKEL_RUN9 +S_SKEL_RUN9 SKEL E 2 A_Chase S_SKEL_RUN10 +S_SKEL_RUN10 SKEL E 2 A_Chase S_SKEL_RUN11 +S_SKEL_RUN11 SKEL F 2 A_Chase S_SKEL_RUN12 +S_SKEL_RUN12 SKEL F 2 A_Chase S_SKEL_RUN1 + +S_SKEL_FIST1 SKEL G 0 A_FaceTarget S_SKEL_FIST2 +S_SKEL_FIST2 SKEL G 6 A_SkelWhoosh S_SKEL_FIST3 +S_SKEL_FIST3 SKEL H 6 A_FaceTarget S_SKEL_FIST4 +S_SKEL_FIST4 SKEL I 6 A_SkelFist S_SKEL_RUN1 + +S_SKEL_MISS1 SKEL J* 0 A_FaceTarget S_SKEL_MISS2 +S_SKEL_MISS2 SKEL J* 10 A_FaceTarget S_SKEL_MISS3 +S_SKEL_MISS3 SKEL K 10 A_SkelMissile S_SKEL_MISS4 +S_SKEL_MISS4 SKEL K 10 A_FaceTarget S_SKEL_RUN1 + +S_SKEL_PAIN SKEL L 5 NULL S_SKEL_PAIN2 +S_SKEL_PAIN2 SKEL L 5 A_Pain S_SKEL_RUN1 + +S_SKEL_DIE1 SKEL L 7 NULL S_SKEL_DIE2 +S_SKEL_DIE2 SKEL M 7 NULL S_SKEL_DIE3 +S_SKEL_DIE3 SKEL N 7 A_Scream S_SKEL_DIE4 +S_SKEL_DIE4 SKEL O 7 A_Fall S_SKEL_DIE5 +S_SKEL_DIE5 SKEL P 7 NULL S_SKEL_DIE6 +S_SKEL_DIE6 SKEL Q -1 NULL S_NULL + +S_SKEL_RAISE1 SKEL Q 5 NULL S_SKEL_RAISE2 +S_SKEL_RAISE2 SKEL P 5 NULL S_SKEL_RAISE3 +S_SKEL_RAISE3 SKEL O 5 NULL S_SKEL_RAISE4 +S_SKEL_RAISE4 SKEL N 5 NULL S_SKEL_RAISE5 +S_SKEL_RAISE5 SKEL M 5 NULL S_SKEL_RAISE6 +S_SKEL_RAISE6 SKEL L 5 NULL S_SKEL_RUN1 + + +//============================================================================== +// The Mancubus +//============================================================================== + +$ MT_FATSO +doomednum 67 +spawnstate S_FATT_STND +spawnhealth 600 +seestate S_FATT_RUN1 +seesound fatso/sight +painstate S_FATT_PAIN +painchance 80 +painsound fatso/pain +missilestate S_FATT_ATK1 +deathstate S_FATT_DIE1 +raisestate S_FATT_RAISE1 +deathsound fatso/death +speed 8 +radius 48 +height 64 +activesound fatso/active +mass 1000 +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL +flags2 MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL + +$ MT_STEALTHFATSO +doomednum 9058 +spawnstate S_FATT_STND +spawnhealth 600 +seestate S_FATT_RUN1 +seesound fatso/sight +painstate S_FATT_PAIN +painchance 80 +painsound fatso/pain +missilestate S_FATT_ATK1 +deathstate S_FATT_DIE1 +raisestate S_FATT_RAISE1 +deathsound fatso/death +speed 8 +radius 48 +height 64 +activesound fatso/active +mass 1000 +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL|MF_STEALTH +flags2 MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL +translucency 0 + +$ MT_FATSHOT +spawnstate S_FATSHOT1 +deathstate S_FATSHOTX1 +speed 20 +damage 8 +seesound fatso/attack +deathsound fatso/shotx +radius 6 +height 8 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_PCROSS|MF2_IMPACT +translucency .75 + +// fatso shot (Mancubus) + +S_FATSHOT1 MANF A* 4 NULL S_FATSHOT2 +S_FATSHOT2 MANF B* 4 NULL S_FATSHOT1 + +S_FATSHOTX1 MISL B* 8 NULL S_FATSHOTX2 +S_FATSHOTX2 MISL C* 6 NULL S_FATSHOTX3 +S_FATSHOTX3 MISL D* 4 NULL S_NULL + +//================================================== + +S_FATT_STND FATT A 15 A_Look S_FATT_STND2 +S_FATT_STND2 FATT B 15 A_Look S_FATT_STND + +S_FATT_RUN1 FATT A 4 A_Chase S_FATT_RUN2 +S_FATT_RUN2 FATT A 4 A_Chase S_FATT_RUN3 +S_FATT_RUN3 FATT B 4 A_Chase S_FATT_RUN4 +S_FATT_RUN4 FATT B 4 A_Chase S_FATT_RUN5 +S_FATT_RUN5 FATT C 4 A_Chase S_FATT_RUN6 +S_FATT_RUN6 FATT C 4 A_Chase S_FATT_RUN7 +S_FATT_RUN7 FATT D 4 A_Chase S_FATT_RUN8 +S_FATT_RUN8 FATT D 4 A_Chase S_FATT_RUN9 +S_FATT_RUN9 FATT E 4 A_Chase S_FATT_RUN10 +S_FATT_RUN10 FATT E 4 A_Chase S_FATT_RUN11 +S_FATT_RUN11 FATT F 4 A_Chase S_FATT_RUN12 +S_FATT_RUN12 FATT F 4 A_Chase S_FATT_RUN1 + +S_FATT_ATK1 FATT G 20 A_FatRaise S_FATT_ATK2 +S_FATT_ATK2 FATT H* 10 A_FatAttack1 S_FATT_ATK3 +S_FATT_ATK3 FATT I 5 A_FaceTarget S_FATT_ATK4 +S_FATT_ATK4 FATT G 5 A_FaceTarget S_FATT_ATK5 +S_FATT_ATK5 FATT H* 10 A_FatAttack2 S_FATT_ATK6 +S_FATT_ATK6 FATT I 5 A_FaceTarget S_FATT_ATK7 +S_FATT_ATK7 FATT G 5 A_FaceTarget S_FATT_ATK8 +S_FATT_ATK8 FATT H* 10 A_FatAttack3 S_FATT_ATK9 +S_FATT_ATK9 FATT I 5 A_FaceTarget S_FATT_ATK10 +S_FATT_ATK10 FATT G 5 A_FaceTarget S_FATT_RUN1 + +S_FATT_PAIN FATT J 3 NULL S_FATT_PAIN2 +S_FATT_PAIN2 FATT J 3 A_Pain S_FATT_RUN1 + +S_FATT_DIE1 FATT K 6 NULL S_FATT_DIE2 +S_FATT_DIE2 FATT L 6 A_Scream S_FATT_DIE3 +S_FATT_DIE3 FATT M 6 A_Fall S_FATT_DIE4 +S_FATT_DIE4 FATT N 6 NULL S_FATT_DIE5 +S_FATT_DIE5 FATT O 6 NULL S_FATT_DIE6 +S_FATT_DIE6 FATT P 6 NULL S_FATT_DIE7 +S_FATT_DIE7 FATT Q 6 NULL S_FATT_DIE8 +S_FATT_DIE8 FATT R 6 NULL S_FATT_DIE9 +S_FATT_DIE9 FATT S 6 NULL S_FATT_DIE10 +S_FATT_DIE10 FATT T -1 A_BossDeath S_NULL + +S_FATT_RAISE1 FATT R 5 NULL S_FATT_RAISE2 +S_FATT_RAISE2 FATT Q 5 NULL S_FATT_RAISE3 +S_FATT_RAISE3 FATT P 5 NULL S_FATT_RAISE4 +S_FATT_RAISE4 FATT O 5 NULL S_FATT_RAISE5 +S_FATT_RAISE5 FATT N 5 NULL S_FATT_RAISE6 +S_FATT_RAISE6 FATT M 5 NULL S_FATT_RAISE7 +S_FATT_RAISE7 FATT L 5 NULL S_FATT_RAISE8 +S_FATT_RAISE8 FATT K 5 NULL S_FATT_RUN1 + +//============================================================================== +// Former Human Commando +//============================================================================== + +// chaingun possesed humans + +$ MT_CHAINGUY +doomednum 65 +spawnstate S_CPOS_STND +spawnhealth 70 +seestate S_CPOS_RUN1 +seesound chainguy/sight1 +painstate S_CPOS_PAIN +painchance 170 +painsound chainguy/pain +missilestate S_CPOS_ATK1 +deathstate S_CPOS_DIE1 +xdeathstate S_CPOS_XDIE1 +raisestate S_CPOS_RAISE1 +deathsound chainguy/death1 +speed 8 +radius 20 +height 56 +activesound chainguy/active +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL +flags2 MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL + +$ MT_STEALTHCHAINGUY +doomednum 9054 +spawnstate S_CPOS_STND +spawnhealth 70 +seestate S_CPOS_RUN1 +seesound chainguy/sight1 +painstate S_CPOS_PAIN +painchance 170 +painsound chainguy/pain +missilestate S_CPOS_ATK1 +deathstate S_CPOS_DIE1 +xdeathstate S_CPOS_XDIE1 +raisestate S_CPOS_RAISE1 +deathsound chainguy/death1 +speed 8 +radius 20 +height 56 +activesound chainguy/active +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL|MF_STEALTH +flags2 MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL +translucency 0 + + +S_CPOS_STND CPOS A 10 A_Look S_CPOS_STND2 +S_CPOS_STND2 CPOS B 10 A_Look S_CPOS_STND + +S_CPOS_RUN1 CPOS A 3 A_Chase S_CPOS_RUN2 +S_CPOS_RUN2 CPOS A 3 A_Chase S_CPOS_RUN3 +S_CPOS_RUN3 CPOS B 3 A_Chase S_CPOS_RUN4 +S_CPOS_RUN4 CPOS B 3 A_Chase S_CPOS_RUN5 +S_CPOS_RUN5 CPOS C 3 A_Chase S_CPOS_RUN6 +S_CPOS_RUN6 CPOS C 3 A_Chase S_CPOS_RUN7 +S_CPOS_RUN7 CPOS D 3 A_Chase S_CPOS_RUN8 +S_CPOS_RUN8 CPOS D 3 A_Chase S_CPOS_RUN1 + +S_CPOS_ATK1 CPOS E 10 A_FaceTarget S_CPOS_ATK2 +S_CPOS_ATK2 CPOS F* 4 A_CPosAttack S_CPOS_ATK3 +S_CPOS_ATK3 CPOS E* 4 A_CPosAttack S_CPOS_ATK4 +S_CPOS_ATK4 CPOS F 1 A_CPosRefire S_CPOS_ATK2 + +S_CPOS_PAIN CPOS G 3 NULL S_CPOS_PAIN2 +S_CPOS_PAIN2 CPOS G 3 A_Pain S_CPOS_RUN1 + +S_CPOS_DIE1 CPOS H 5 NULL S_CPOS_DIE2 +S_CPOS_DIE2 CPOS I 5 A_Scream S_CPOS_DIE3 +S_CPOS_DIE3 CPOS J 5 A_Fall S_CPOS_DIE4 +S_CPOS_DIE4 CPOS K 5 NULL S_CPOS_DIE5 +S_CPOS_DIE5 CPOS L 5 NULL S_CPOS_DIE6 +S_CPOS_DIE6 CPOS M 5 NULL S_CPOS_DIE7 +S_CPOS_DIE7 CPOS N -1 NULL S_NULL + +S_CPOS_XDIE1 CPOS O 5 NULL S_CPOS_XDIE2 +S_CPOS_XDIE2 CPOS P 5 A_XScream S_CPOS_XDIE3 +S_CPOS_XDIE3 CPOS Q 5 A_Fall S_CPOS_XDIE4 +S_CPOS_XDIE4 CPOS R 5 NULL S_CPOS_XDIE5 +S_CPOS_XDIE5 CPOS S 5 NULL S_CPOS_XDIE6 +S_CPOS_XDIE6 CPOS T -1 NULL S_NULL + +S_CPOS_RAISE1 CPOS N 5 NULL S_CPOS_RAISE2 +S_CPOS_RAISE2 CPOS M 5 NULL S_CPOS_RAISE3 +S_CPOS_RAISE3 CPOS L 5 NULL S_CPOS_RAISE4 +S_CPOS_RAISE4 CPOS K 5 NULL S_CPOS_RAISE5 +S_CPOS_RAISE5 CPOS J 5 NULL S_CPOS_RAISE6 +S_CPOS_RAISE6 CPOS I 5 NULL S_CPOS_RAISE7 +S_CPOS_RAISE7 CPOS H 5 NULL S_CPOS_RUN1 + +//============================================================================== +// Imps +//============================================================================== + +// troops + +$ MT_TROOP +doomednum 3001 +spawnstate S_TROO_STND +spawnhealth 60 +seestate S_TROO_RUN1 +seesound imp/sight1 +painstate S_TROO_PAIN +painchance 200 +painsound imp/pain +meleestate S_TROO_ATK1 +missilestate S_TROO_ATK1 +deathstate S_TROO_DIE1 +xdeathstate S_TROO_XDIE1 +raisestate S_TROO_RAISE1 +deathsound imp/death1 +speed 8 +radius 20 +height 56 +activesound imp/active +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL +flags2 MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL + +$ MT_STEALTHTROOP +doomednum 9057 +spawnstate S_TROO_STND +spawnhealth 60 +seestate S_TROO_RUN1 +seesound imp/sight1 +painstate S_TROO_PAIN +painchance 200 +painsound imp/pain +meleestate S_TROO_ATK1 +missilestate S_TROO_ATK1 +deathstate S_TROO_DIE1 +xdeathstate S_TROO_XDIE1 +raisestate S_TROO_RAISE1 +deathsound imp/death1 +speed 8 +radius 20 +height 56 +activesound imp/active +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL|MF_STEALTH +flags2 MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL +translucency 0 + + +S_TROO_STND TROO A 10 A_Look S_TROO_STND2 +S_TROO_STND2 TROO B 10 A_Look S_TROO_STND + +S_TROO_RUN1 TROO A 3 A_Chase S_TROO_RUN2 +S_TROO_RUN2 TROO A 3 A_Chase S_TROO_RUN3 +S_TROO_RUN3 TROO B 3 A_Chase S_TROO_RUN4 +S_TROO_RUN4 TROO B 3 A_Chase S_TROO_RUN5 +S_TROO_RUN5 TROO C 3 A_Chase S_TROO_RUN6 +S_TROO_RUN6 TROO C 3 A_Chase S_TROO_RUN7 +S_TROO_RUN7 TROO D 3 A_Chase S_TROO_RUN8 +S_TROO_RUN8 TROO D 3 A_Chase S_TROO_RUN1 + +S_TROO_ATK1 TROO E 8 A_FaceTarget S_TROO_ATK2 +S_TROO_ATK2 TROO F 8 A_FaceTarget S_TROO_ATK3 +S_TROO_ATK3 TROO G 6 A_TroopAttack S_TROO_RUN1 + +S_TROO_PAIN TROO H 2 NULL S_TROO_PAIN2 +S_TROO_PAIN2 TROO H 2 A_Pain S_TROO_RUN1 + +S_TROO_DIE1 TROO I 8 NULL S_TROO_DIE2 +S_TROO_DIE2 TROO J 8 A_Scream S_TROO_DIE3 +S_TROO_DIE3 TROO K 6 NULL S_TROO_DIE4 +S_TROO_DIE4 TROO L 6 A_FALL S_TROO_DIE5 +S_TROO_DIE5 TROO M -1 NULL S_NULL + +S_TROO_XDIE1 TROO N 5 NULL S_TROO_XDIE2 +S_TROO_XDIE2 TROO O 5 A_XScream S_TROO_XDIE3 +S_TROO_XDIE3 TROO P 5 NULL S_TROO_XDIE4 +S_TROO_XDIE4 TROO Q 5 A_FALL S_TROO_XDIE5 +S_TROO_XDIE5 TROO R 5 NULL S_TROO_XDIE6 +S_TROO_XDIE6 TROO S 5 NULL S_TROO_XDIE7 +S_TROO_XDIE7 TROO T 5 NULL S_TROO_XDIE8 +S_TROO_XDIE8 TROO U -1 NULL S_NULL + +S_TROO_RAISE1 TROO M 8 NULL S_TROO_RAISE2 +S_TROO_RAISE2 TROO L 8 NULL S_TROO_RAISE3 +S_TROO_RAISE3 TROO K 6 NULL S_TROO_RAISE4 +S_TROO_RAISE4 TROO J 6 NULL S_TROO_RAISE5 +S_TROO_RAISE5 TROO I 6 NULL S_TROO_RUN1 + +//============================================================================== +// Spectre +//============================================================================== + +// sargeant/ shadow sargeant + +$ MT_SERGEANT +doomednum 3002 +spawnstate S_SARG_STND +spawnhealth 150 +seestate S_SARG_RUN1 +seesound demon/sight +attacksound demon/melee +painstate S_SARG_PAIN +painchance 180 +painsound demon/pain +meleestate S_SARG_ATK1 +deathstate S_SARG_DIE1 +raisestate S_SARG_RAISE1 +deathsound demon/death +speed 10 +radius 30 +height 56 +mass 400 +activesound demon/active +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL +flags2 MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL + +$ MT_SHADOWS +doomednum 58 +spawnstate S_SARG_STND +spawnhealth 150 +seestate S_SARG_RUN1 +seesound spectre/sight +attacksound spectre/attack +painstate S_SARG_PAIN +painchance 180 +painsound spectre/pain +meleestate S_SARG_ATK1 +deathstate S_SARG_DIE1 +deathsound spectre/death +raisestate S_SARG_RAISE1 +speed 10 +radius 30 +height 56 +mass 400 +activesound spectre/active +flags MF_SOLID|MF_SHOOTABLE|MF_SHADOW|MF_COUNTKILL +flags2 MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL + +$ MT_STEALTHSERGEANT +doomednum 9055 +spawnstate S_SARG_STND +spawnhealth 150 +seestate S_SARG_RUN1 +seesound demon/sight +attacksound demon/melee +painstate S_SARG_PAIN +painchance 180 +painsound demon/pain +meleestate S_SARG_ATK1 +deathstate S_SARG_DIE1 +raisestate S_SARG_RAISE1 +deathsound demon/death +speed 10 +radius 30 +height 56 +mass 400 +activesound demon/active +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL|MF_STEALTH +flags2 MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL +translucency 0 + + +S_SARG_STND SARG A 10 A_Look S_SARG_STND2 +S_SARG_STND2 SARG B 10 A_Look S_SARG_STND + +S_SARG_RUN1 SARG A 2 A_Chase S_SARG_RUN2 +S_SARG_RUN2 SARG A 2 A_Chase S_SARG_RUN3 +S_SARG_RUN3 SARG B 2 A_Chase S_SARG_RUN4 +S_SARG_RUN4 SARG B 2 A_Chase S_SARG_RUN5 +S_SARG_RUN5 SARG C 2 A_Chase S_SARG_RUN6 +S_SARG_RUN6 SARG C 2 A_Chase S_SARG_RUN7 +S_SARG_RUN7 SARG D 2 A_Chase S_SARG_RUN8 +S_SARG_RUN8 SARG D 2 A_Chase S_SARG_RUN1 + +S_SARG_ATK1 SARG E 8 A_FaceTarget S_SARG_ATK2 +S_SARG_ATK2 SARG F 8 A_FaceTarget S_SARG_ATK3 +S_SARG_ATK3 SARG G 8 A_SargAttack S_SARG_RUN1 + +S_SARG_PAIN SARG H 2 NULL S_SARG_PAIN2 +S_SARG_PAIN2 SARG H 2 A_Pain S_SARG_RUN1 + +S_SARG_DIE1 SARG I 8 NULL S_SARG_DIE2 +S_SARG_DIE2 SARG J 8 A_Scream S_SARG_DIE3 +S_SARG_DIE3 SARG K 4 NULL S_SARG_DIE4 +S_SARG_DIE4 SARG L 4 A_Fall S_SARG_DIE5 +S_SARG_DIE5 SARG M 4 NULL S_SARG_DIE6 +S_SARG_DIE6 SARG N -1 NULL S_NULL + +S_SARG_RAISE1 SARG N 5 NULL S_SARG_RAISE2 +S_SARG_RAISE2 SARG M 5 NULL S_SARG_RAISE3 +S_SARG_RAISE3 SARG L 5 NULL S_SARG_RAISE4 +S_SARG_RAISE4 SARG K 5 NULL S_SARG_RAISE5 +S_SARG_RAISE5 SARG J 5 NULL S_SARG_RAISE6 +S_SARG_RAISE6 SARG I 5 NULL S_SARG_RUN1 + +//============================================================================== +// Cacodemon +//============================================================================== + +// demon head + +$ MT_HEAD +doomednum 3005 +spawnstate S_HEAD_STND +spawnhealth 400 +seestate S_HEAD_RUN1 +seesound caco/sight +painstate S_HEAD_PAIN +painchance 128 +painsound caco/pain +missilestate S_HEAD_ATK1 +deathstate S_HEAD_DIE1 +raisestate S_HEAD_RAISE1 +deathsound caco/death +speed 8 +radius 31 +height 56 +mass 400 +activesound caco/active +flags MF_SOLID|MF_SHOOTABLE|MF_FLOAT|MF_NOGRAVITY|MF_COUNTKILL +flags2 MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL + +$ MT_STEALTHHEAD +doomednum 9053 +spawnstate S_HEAD_STND +spawnhealth 400 +seestate S_HEAD_RUN1 +seesound caco/sight +painstate S_HEAD_PAIN +painchance 128 +painsound caco/pain +missilestate S_HEAD_ATK1 +deathstate S_HEAD_DIE1 +raisestate S_HEAD_RAISE1 +deathsound caco/death +speed 8 +radius 31 +height 56 +mass 400 +activesound caco/active +flags MF_SOLID|MF_SHOOTABLE|MF_FLOAT|MF_NOGRAVITY|MF_COUNTKILL|MF_STEALTH +flags2 MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL +translucency 0 + +S_HEAD_STND HEAD A 10 A_Look S_HEAD_STND + +S_HEAD_RUN1 HEAD A 3 A_Chase S_HEAD_RUN1 + +S_HEAD_ATK1 HEAD B 5 A_FaceTarget S_HEAD_ATK2 +S_HEAD_ATK2 HEAD C 5 A_FaceTarget S_HEAD_ATK3 +S_HEAD_ATK3 HEAD D* 5 A_HeadAttack S_HEAD_RUN1 + +S_HEAD_PAIN HEAD E 3 NULL S_HEAD_PAIN2 +S_HEAD_PAIN2 HEAD E 3 A_Pain S_HEAD_PAIN3 +S_HEAD_PAIN3 HEAD F 6 NULL S_HEAD_RUN1 + +S_HEAD_DIE1 HEAD G 8 NULL S_HEAD_DIE2 +S_HEAD_DIE2 HEAD H 8 A_Scream S_HEAD_DIE3 +S_HEAD_DIE3 HEAD I 8 NULL S_HEAD_DIE4 +S_HEAD_DIE4 HEAD J 8 NULL S_HEAD_DIE5 +S_HEAD_DIE5 HEAD K 8 A_Fall S_HEAD_DIE6 +S_HEAD_DIE6 HEAD L -1 NULL S_NULL + +S_HEAD_RAISE1 HEAD L 8 NULL S_HEAD_RAISE2 +S_HEAD_RAISE2 HEAD K 8 NULL S_HEAD_RAISE3 +S_HEAD_RAISE3 HEAD J 8 NULL S_HEAD_RAISE4 +S_HEAD_RAISE4 HEAD I 8 NULL S_HEAD_RAISE5 +S_HEAD_RAISE5 HEAD H 8 NULL S_HEAD_RAISE6 +S_HEAD_RAISE6 HEAD G 8 NULL S_HEAD_RUN1 + +//============================================================================== +// Baron of Hell +//============================================================================== + +// bruiser + +$ MT_BRUISER +doomednum 3003 +spawnstate S_BOSS_STND +spawnhealth 1000 +seestate S_BOSS_RUN1 +seesound baron/sight +painstate S_BOSS_PAIN +painchance 50 +painsound baron/pain +meleestate S_BOSS_ATK1 +missilestate S_BOSS_ATK1 +deathstate S_BOSS_DIE1 +raisestate S_BOSS_RAISE1 +deathsound baron/death +speed 8 +radius 24 +height 64 +mass 1000 +activesound baron/active +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL +flags2 MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL + +$ MT_STEALTHBRUISER +doomednum 9052 +spawnstate S_BOSS_STND +spawnhealth 1000 +seestate S_BOSS_RUN1 +seesound baron/sight +painstate S_BOSS_PAIN +painchance 50 +painsound baron/pain +meleestate S_BOSS_ATK1 +missilestate S_BOSS_ATK1 +deathstate S_BOSS_DIE1 +raisestate S_BOSS_RAISE1 +deathsound baron/death +speed 8 +radius 24 +height 64 +mass 1000 +activesound baron/active +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL|MF_STEALTH +flags2 MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL +translucency 0 + +$ MT_BRUISERSHOT +spawnstate S_BRBALL1 +deathstate S_BRBALLX1 +speed 15 +damage 8 +seesound baron/attack +deathsound baron/shotx +radius 6 +height 8 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_PCROSS|MF2_IMPACT +translucency .75 + +// bruiser shot + +S_BRBALL1 BAL7 A* 4 NULL S_BRBALL2 +S_BRBALL2 BAL7 B* 4 NULL S_BRBALL1 + +S_BRBALLX1 BAL7 C* 6 NULL S_BRBALLX2 +S_BRBALLX2 BAL7 D* 6 NULL S_BRBALLX3 +S_BRBALLX3 BAL7 E* 6 NULL S_NULL + + + +S_BOSS_STND BOSS A 10 A_Look S_BOSS_STND2 +S_BOSS_STND2 BOSS B 10 A_Look S_BOSS_STND + +S_BOSS_RUN1 BOSS A 3 A_Chase S_BOSS_RUN2 +S_BOSS_RUN2 BOSS A 3 A_Chase S_BOSS_RUN3 +S_BOSS_RUN3 BOSS B 3 A_Chase S_BOSS_RUN4 +S_BOSS_RUN4 BOSS B 3 A_Chase S_BOSS_RUN5 +S_BOSS_RUN5 BOSS C 3 A_Chase S_BOSS_RUN6 +S_BOSS_RUN6 BOSS C 3 A_Chase S_BOSS_RUN7 +S_BOSS_RUN7 BOSS D 3 A_Chase S_BOSS_RUN8 +S_BOSS_RUN8 BOSS D 3 A_Chase S_BOSS_RUN1 + +S_BOSS_ATK1 BOSS E 8 A_FaceTarget S_BOSS_ATK2 +S_BOSS_ATK2 BOSS F 8 A_FaceTarget S_BOSS_ATK3 +S_BOSS_ATK3 BOSS G 8 A_BruisAttack S_BOSS_RUN1 + +S_BOSS_PAIN BOSS H 2 NULL S_BOSS_PAIN2 +S_BOSS_PAIN2 BOSS H 2 A_Pain S_BOSS_RUN1 + +S_BOSS_DIE1 BOSS I 8 NULL S_BOSS_DIE2 +S_BOSS_DIE2 BOSS J 8 A_Scream S_BOSS_DIE3 +S_BOSS_DIE3 BOSS K 8 NULL S_BOSS_DIE4 +S_BOSS_DIE4 BOSS L 8 A_Fall S_BOSS_DIE5 +S_BOSS_DIE5 BOSS M 8 NULL S_BOSS_DIE6 +S_BOSS_DIE6 BOSS N 8 NULL S_BOSS_DIE7 +S_BOSS_DIE7 BOSS O -1 A_BossDeath S_NULL + +S_BOSS_RAISE1 BOSS O 8 NULL S_BOSS_RAISE2 +S_BOSS_RAISE2 BOSS N 8 NULL S_BOSS_RAISE3 +S_BOSS_RAISE3 BOSS M 8 NULL S_BOSS_RAISE4 +S_BOSS_RAISE4 BOSS L 8 NULL S_BOSS_RAISE5 +S_BOSS_RAISE5 BOSS K 8 NULL S_BOSS_RAISE6 +S_BOSS_RAISE6 BOSS J 8 NULL S_BOSS_RAISE7 +S_BOSS_RAISE7 BOSS I 8 NULL S_BOSS_RUN1 + +//============================================================================== +// Hell Knight +//============================================================================== + +$ MT_KNIGHT +doomednum 69 +spawnstate S_BOS2_STND +spawnhealth 500 +seestate S_BOS2_RUN1 +seesound knight/sight +painstate S_BOS2_PAIN +painchance 50 +painsound knight/pain +meleestate S_BOS2_ATK1 +missilestate S_BOS2_ATK1 +deathstate S_BOS2_DIE1 +raisestate S_BOS2_RAISE1 +deathsound knight/death +speed 8 +radius 24 +height 64 +mass 1000 +activesound knight/active +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL +flags2 MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL + +$ MT_STEALTHKNIGHT +doomednum 9056 +spawnstate S_BOS2_STND +spawnhealth 500 +seestate S_BOS2_RUN1 +seesound knight/sight +painstate S_BOS2_PAIN +painchance 50 +painsound knight/pain +meleestate S_BOS2_ATK1 +missilestate S_BOS2_ATK1 +deathstate S_BOS2_DIE1 +raisestate S_BOS2_RAISE1 +deathsound knight/death +speed 8 +radius 24 +height 64 +mass 1000 +activesound knight/active +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL|MF_STEALTH +flags2 MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL +translucency 0 + + +S_BOS2_STND BOS2 A 10 A_Look S_BOS2_STND2 +S_BOS2_STND2 BOS2 B 10 A_Look S_BOS2_STND + +S_BOS2_RUN1 BOS2 A 3 A_Chase S_BOS2_RUN2 +S_BOS2_RUN2 BOS2 A 3 A_Chase S_BOS2_RUN3 +S_BOS2_RUN3 BOS2 B 3 A_Chase S_BOS2_RUN4 +S_BOS2_RUN4 BOS2 B 3 A_Chase S_BOS2_RUN5 +S_BOS2_RUN5 BOS2 C 3 A_Chase S_BOS2_RUN6 +S_BOS2_RUN6 BOS2 C 3 A_Chase S_BOS2_RUN7 +S_BOS2_RUN7 BOS2 D 3 A_Chase S_BOS2_RUN8 +S_BOS2_RUN8 BOS2 D 3 A_Chase S_BOS2_RUN1 + +S_BOS2_ATK1 BOS2 E 8 A_FaceTarget S_BOS2_ATK2 +S_BOS2_ATK2 BOS2 F 8 A_FaceTarget S_BOS2_ATK3 +S_BOS2_ATK3 BOS2 G 8 A_BruisAttack S_BOS2_RUN1 + +S_BOS2_PAIN BOS2 H 2 NULL S_BOS2_PAIN2 +S_BOS2_PAIN2 BOS2 H 2 A_Pain S_BOS2_RUN1 + +S_BOS2_DIE1 BOS2 I 8 NULL S_BOS2_DIE2 +S_BOS2_DIE2 BOS2 J 8 A_Scream S_BOS2_DIE3 +S_BOS2_DIE3 BOS2 K 8 NULL S_BOS2_DIE4 +S_BOS2_DIE4 BOS2 L 8 A_Fall S_BOS2_DIE5 +S_BOS2_DIE5 BOS2 M 8 NULL S_BOS2_DIE6 +S_BOS2_DIE6 BOS2 N 8 NULL S_BOS2_DIE7 +S_BOS2_DIE7 BOS2 O -1 NULL S_NULL + +S_BOS2_RAISE1 BOS2 O 8 NULL S_BOS2_RAISE2 +S_BOS2_RAISE2 BOS2 N 8 NULL S_BOS2_RAISE3 +S_BOS2_RAISE3 BOS2 M 8 NULL S_BOS2_RAISE4 +S_BOS2_RAISE4 BOS2 L 8 NULL S_BOS2_RAISE5 +S_BOS2_RAISE5 BOS2 K 8 NULL S_BOS2_RAISE6 +S_BOS2_RAISE6 BOS2 J 8 NULL S_BOS2_RAISE7 +S_BOS2_RAISE7 BOS2 I 8 NULL S_BOS2_RUN1 + +//============================================================================== +// Lost Soul +//============================================================================== + +// demon skull + +$ MT_SKULL +doomednum 3006 +spawnstate S_SKULL_STND +spawnhealth 100 +seestate S_SKULL_RUN1 +attacksound skull/melee +painstate S_SKULL_PAIN +painchance 256 +painsound skull/pain +missilestate S_SKULL_ATK1 +deathstate S_SKULL_DIE1 +deathsound skull/death +speed 8 +radius 16 +height 56 +damage 3 // when attacking as a missile +mass 50 +activesound skull/active +flags MF_SOLID|MF_SHOOTABLE|MF_FLOAT|MF_NOGRAVITY +flags2 MF2_MCROSS|MF2_PUSHWALL|MF2_PASSMOBJ + + +S_SKULL_STND SKUL A* 10 A_Look S_SKULL_STND2 +S_SKULL_STND2 SKUL B* 10 A_Look S_SKULL_STND + +S_SKULL_RUN1 SKUL A* 6 A_Chase S_SKULL_RUN2 +S_SKULL_RUN2 SKUL B* 6 A_Chase S_SKULL_RUN1 + +S_SKULL_ATK1 SKUL C* 10 A_FaceTarget S_SKULL_ATK2 +S_SKULL_ATK2 SKUL D* 4 A_SkullAttack S_SKULL_ATK3 +S_SKULL_ATK3 SKUL C* 4 NULL S_SKULL_ATK4 +S_SKULL_ATK4 SKUL D* 4 NULL S_SKULL_ATK3 + +S_SKULL_PAIN SKUL E* 3 NULL S_SKULL_PAIN2 +S_SKULL_PAIN2 SKUL E* 3 A_Pain S_SKULL_RUN1 + +S_SKULL_DIE1 SKUL F* 6 NULL S_SKULL_DIE2 +S_SKULL_DIE2 SKUL G* 6 A_Scream S_SKULL_DIE3 +S_SKULL_DIE3 SKUL H* 6 NULL S_SKULL_DIE4 +S_SKULL_DIE4 SKUL I* 6 A_Fall S_SKULL_DIE5 +S_SKULL_DIE5 SKUL J 6 NULL S_SKULL_DIE6 +S_SKULL_DIE6 SKUL K 6 NULL S_NULL + + +//============================================================================== +// Spider Mastermind +//============================================================================== + +// spider boss + +$ MT_SPIDER +doomednum 7 +spawnstate S_SPID_STND +spawnhealth 3000 +seestate S_SPID_RUN1 +seesound spider/sight +attacksound spider/attack +painstate S_SPID_PAIN +painchance 40 +painsound spider/pain +missilestate S_SPID_ATK1 +deathstate S_SPID_DIE1 +deathsound spider/death +speed 12 +radius 128 +height 100 +mass 1000 +activesound spider/active +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL +flags2 MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL|MF2_BOSS + + +S_SPID_STND SPID A 10 A_Look S_SPID_STND2 +S_SPID_STND2 SPID B 10 A_Look S_SPID_STND + +S_SPID_RUN1 SPID A 3 A_Metal S_SPID_RUN2 +S_SPID_RUN2 SPID A 3 A_Chase S_SPID_RUN3 +S_SPID_RUN3 SPID B 3 A_Chase S_SPID_RUN4 +S_SPID_RUN4 SPID B 3 A_Chase S_SPID_RUN5 +S_SPID_RUN5 SPID C 3 A_Metal S_SPID_RUN6 +S_SPID_RUN6 SPID C 3 A_Chase S_SPID_RUN7 +S_SPID_RUN7 SPID D 3 A_Chase S_SPID_RUN8 +S_SPID_RUN8 SPID D 3 A_Chase S_SPID_RUN9 +S_SPID_RUN9 SPID E 3 A_Metal S_SPID_RUN10 +S_SPID_RUN10 SPID E 3 A_Chase S_SPID_RUN11 +S_SPID_RUN11 SPID F 3 A_Chase S_SPID_RUN12 +S_SPID_RUN12 SPID F 3 A_Chase S_SPID_RUN1 + +S_SPID_ATK1 SPID A* 20 A_FaceTarget S_SPID_ATK2 +S_SPID_ATK2 SPID G* 4 A_SPosAttack S_SPID_ATK3 +S_SPID_ATK3 SPID H* 4 A_SPosAttack S_SPID_ATK4 +S_SPID_ATK4 SPID H* 1 A_SpidRefire S_SPID_ATK2 + +S_SPID_PAIN SPID I 3 NULL S_SPID_PAIN2 +S_SPID_PAIN2 SPID I 3 A_Pain S_SPID_RUN1 + +S_SPID_DIE1 SPID J 20 A_Scream S_SPID_DIE2 +S_SPID_DIE2 SPID K 10 A_Fall S_SPID_DIE3 +S_SPID_DIE3 SPID L 10 NULL S_SPID_DIE4 +S_SPID_DIE4 SPID M 10 NULL S_SPID_DIE5 +S_SPID_DIE5 SPID N 10 NULL S_SPID_DIE6 +S_SPID_DIE6 SPID O 10 NULL S_SPID_DIE7 +S_SPID_DIE7 SPID P 10 NULL S_SPID_DIE8 +S_SPID_DIE8 SPID Q 10 NULL S_SPID_DIE9 +S_SPID_DIE9 SPID R 10 NULL S_SPID_DIE10 +S_SPID_DIE10 SPID S 30 NULL S_SPID_DIE11 +S_SPID_DIE11 SPID S -1 A_BossDeath S_NULL + +//============================================================================== +// Arachnotron +//============================================================================== + +// baby spider + +$ MT_BABY +doomednum 68 +spawnstate S_BSPI_STND +spawnhealth 500 +seestate S_BSPI_SIGHT +seesound baby/sight +painstate S_BSPI_PAIN +painchance 128 +painsound baby/pain +missilestate S_BSPI_ATK1 +deathstate S_BSPI_DIE1 +raisestate S_BSPI_RAISE1 +deathsound baby/death +speed 12 +radius 64 +height 64 +mass 600 +activesound baby/active +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL +flags2 MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL + +// stealth baby spider + +$ MT_STEALTHBABY +doomednum 9050 +spawnstate S_BSPI_STND +spawnhealth 500 +seestate S_BSPI_SIGHT +seesound baby/sight +painstate S_BSPI_PAIN +painchance 128 +painsound baby/pain +missilestate S_BSPI_ATK1 +deathstate S_BSPI_DIE1 +raisestate S_BSPI_RAISE1 +deathsound baby/death +speed 12 +radius 64 +height 64 +mass 600 +activesound baby/active +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL|MF_STEALTH +flags2 MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL +translucency 0 + +S_BSPI_STND BSPI A 10 A_Look S_BSPI_STND2 +S_BSPI_STND2 BSPI B 10 A_Look S_BSPI_STND + +S_BSPI_SIGHT BSPI A 20 NULL S_BSPI_RUN1 + +S_BSPI_RUN1 BSPI A 3 A_BabyMetal S_BSPI_RUN2 +S_BSPI_RUN2 BSPI A 3 A_Chase S_BSPI_RUN3 +S_BSPI_RUN3 BSPI B 3 A_Chase S_BSPI_RUN4 +S_BSPI_RUN4 BSPI B 3 A_Chase S_BSPI_RUN5 +S_BSPI_RUN5 BSPI C 3 A_Chase S_BSPI_RUN6 +S_BSPI_RUN6 BSPI C 3 A_Chase S_BSPI_RUN7 +S_BSPI_RUN7 BSPI D 3 A_BabyMetal S_BSPI_RUN8 +S_BSPI_RUN8 BSPI D 3 A_Chase S_BSPI_RUN9 +S_BSPI_RUN9 BSPI E 3 A_Chase S_BSPI_RUN10 +S_BSPI_RUN10 BSPI E 3 A_Chase S_BSPI_RUN11 +S_BSPI_RUN11 BSPI F 3 A_Chase S_BSPI_RUN12 +S_BSPI_RUN12 BSPI F 3 A_Chase S_BSPI_RUN1 + +S_BSPI_ATK1 BSPI A* 20 A_FaceTarget S_BSPI_ATK2 +S_BSPI_ATK2 BSPI G* 4 A_BspiAttack S_BSPI_ATK3 +S_BSPI_ATK3 BSPI H* 4 NULL S_BSPI_ATK4 +S_BSPI_ATK4 BSPI H* 1 A_SpidRefire S_BSPI_ATK2 + +S_BSPI_PAIN BSPI I 3 NULL S_BSPI_PAIN2 +S_BSPI_PAIN2 BSPI I 3 A_Pain S_BSPI_RUN1 + +S_BSPI_DIE1 BSPI J 20 A_Scream S_BSPI_DIE2 +S_BSPI_DIE2 BSPI K 7 A_Fall S_BSPI_DIE3 +S_BSPI_DIE3 BSPI L 7 NULL S_BSPI_DIE4 +S_BSPI_DIE4 BSPI M 7 NULL S_BSPI_DIE5 +S_BSPI_DIE5 BSPI N 7 NULL S_BSPI_DIE6 +S_BSPI_DIE6 BSPI O 7 NULL S_BSPI_DIE7 +S_BSPI_DIE7 BSPI P -1 A_BossDeath S_NULL + +S_BSPI_RAISE1 BSPI P 5 NULL S_BSPI_RAISE2 +S_BSPI_RAISE2 BSPI O 5 NULL S_BSPI_RAISE3 +S_BSPI_RAISE3 BSPI N 5 NULL S_BSPI_RAISE4 +S_BSPI_RAISE4 BSPI M 5 NULL S_BSPI_RAISE5 +S_BSPI_RAISE5 BSPI L 5 NULL S_BSPI_RAISE6 +S_BSPI_RAISE6 BSPI K 5 NULL S_BSPI_RAISE7 +S_BSPI_RAISE7 BSPI J 5 NULL S_BSPI_RUN1 + +// Plasma bolt +S_ARACH_PLAZ APLS A* 5 NULL S_ARACH_PLAZ2 +S_ARACH_PLAZ2 APLS B* 5 NULL S_ARACH_PLAZ + +// Explosion +S_ARACH_PLEX APBX A* 5 NULL S_ARACH_PLEX2 +S_ARACH_PLEX2 APBX B* 5 NULL S_ARACH_PLEX3 +S_ARACH_PLEX3 APBX C* 5 NULL S_ARACH_PLEX4 +S_ARACH_PLEX4 APBX D* 5 NULL S_ARACH_PLEX5 +S_ARACH_PLEX5 APBX E* 5 NULL S_NULL + + +//============================================================================== +// Cyberdemon +//============================================================================== + +// cyber boss + +$ MT_CYBORG +doomednum 16 +spawnstate S_CYBER_STND +spawnhealth 4000 +seestate S_CYBER_RUN1 +seesound cyber/sight +painstate S_CYBER_PAIN +painchance 20 +painsound cyber/pain +missilestate S_CYBER_ATK1 +deathstate S_CYBER_DIE1 +deathsound cyber/death +speed 16 +radius 40 +height 110 +mass 1000 +activesound cyber/active +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL +flags2 MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL|MF2_BOSS + +S_CYBER_STND CYBR A 10 A_Look S_CYBER_STND2 +S_CYBER_STND2 CYBR B 10 A_Look S_CYBER_STND + +S_CYBER_RUN1 CYBR A 3 A_Hoof S_CYBER_RUN2 +S_CYBER_RUN2 CYBR A 3 A_Chase S_CYBER_RUN3 +S_CYBER_RUN3 CYBR B 3 A_Chase S_CYBER_RUN4 +S_CYBER_RUN4 CYBR B 3 A_Chase S_CYBER_RUN5 +S_CYBER_RUN5 CYBR C 3 A_Chase S_CYBER_RUN6 +S_CYBER_RUN6 CYBR C 3 A_Chase S_CYBER_RUN7 +S_CYBER_RUN7 CYBR D 3 A_Metal S_CYBER_RUN8 +S_CYBER_RUN8 CYBR D 3 A_Chase S_CYBER_RUN1 + +S_CYBER_ATK1 CYBR E 6 A_FaceTarget S_CYBER_ATK2 +S_CYBER_ATK2 CYBR F 12 A_CyberAttack S_CYBER_ATK3 +S_CYBER_ATK3 CYBR E 12 A_FaceTarget S_CYBER_ATK4 +S_CYBER_ATK4 CYBR F 12 A_CyberAttack S_CYBER_ATK5 +S_CYBER_ATK5 CYBR E 12 A_FaceTarget S_CYBER_ATK6 +S_CYBER_ATK6 CYBR F 12 A_CyberAttack S_CYBER_RUN1 + +S_CYBER_PAIN CYBR G 10 A_Pain S_CYBER_RUN1 + +S_CYBER_DIE1 CYBR H 10 NULL S_CYBER_DIE2 +S_CYBER_DIE2 CYBR I 10 A_Scream S_CYBER_DIE3 +S_CYBER_DIE3 CYBR J 10 NULL S_CYBER_DIE4 +S_CYBER_DIE4 CYBR K 10 NULL S_CYBER_DIE5 +S_CYBER_DIE5 CYBR L 10 NULL S_CYBER_DIE6 +S_CYBER_DIE6 CYBR M 10 A_Fall S_CYBER_DIE7 +S_CYBER_DIE7 CYBR N 10 NULL S_CYBER_DIE8 +S_CYBER_DIE8 CYBR O 10 NULL S_CYBER_DIE9 +S_CYBER_DIE9 CYBR P 30 NULL S_CYBER_DIE10 +S_CYBER_DIE10 CYBR P -1 A_BossDeath S_NULL + +//============================================================================== +// Pain Elemental +//============================================================================== + +$ MT_PAIN +doomednum 71 +spawnstate S_PAIN_STND +spawnhealth 400 +seestate S_PAIN_RUN1 +seesound pain/sight +painstate S_PAIN_PAIN +painchance 128 +painsound pain/pain +missilestate S_PAIN_ATK1 +deathstate S_PAIN_DIE1 +raisestate S_PAIN_RAISE1 +deathsound pain/death +speed 8 +radius 31 +height 56 +mass 400 +activesound pain/active +flags MF_SOLID|MF_SHOOTABLE|MF_FLOAT|MF_NOGRAVITY|MF_COUNTKILL +flags2 MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL + + +S_PAIN_STND PAIN A 10 A_Look S_PAIN_STND + +S_PAIN_RUN1 PAIN A 3 A_Chase S_PAIN_RUN2 +S_PAIN_RUN2 PAIN A 3 A_Chase S_PAIN_RUN3 +S_PAIN_RUN3 PAIN B 3 A_Chase S_PAIN_RUN4 +S_PAIN_RUN4 PAIN B 3 A_Chase S_PAIN_RUN5 +S_PAIN_RUN5 PAIN C 3 A_Chase S_PAIN_RUN6 +S_PAIN_RUN6 PAIN C 3 A_Chase S_PAIN_RUN1 + +S_PAIN_ATK1 PAIN D 5 A_FaceTarget S_PAIN_ATK2 +S_PAIN_ATK2 PAIN E 5 A_FaceTarget S_PAIN_ATK3 +S_PAIN_ATK3 PAIN F* 5 A_FaceTarget S_PAIN_ATK4 +S_PAIN_ATK4 PAIN F* 0 A_PainAttack S_PAIN_RUN1 + +S_PAIN_PAIN PAIN G 6 NULL S_PAIN_PAIN2 +S_PAIN_PAIN2 PAIN G 6 A_Pain S_PAIN_RUN1 + +S_PAIN_DIE1 PAIN H* 8 NULL S_PAIN_DIE2 +S_PAIN_DIE2 PAIN I* 8 A_Scream S_PAIN_DIE3 +S_PAIN_DIE3 PAIN J* 8 NULL S_PAIN_DIE4 +S_PAIN_DIE4 PAIN K* 8 NULL S_PAIN_DIE5 +S_PAIN_DIE5 PAIN L* 8 A_PainDie S_PAIN_DIE6 +S_PAIN_DIE6 PAIN M* 8 NULL S_NULL + +S_PAIN_RAISE1 PAIN M 8 NULL S_PAIN_RAISE2 +S_PAIN_RAISE2 PAIN L 8 NULL S_PAIN_RAISE3 +S_PAIN_RAISE3 PAIN K 8 NULL S_PAIN_RAISE4 +S_PAIN_RAISE4 PAIN J 8 NULL S_PAIN_RAISE5 +S_PAIN_RAISE5 PAIN I 8 NULL S_PAIN_RAISE6 +S_PAIN_RAISE6 PAIN H 8 NULL S_PAIN_RUN1 + +//============================================================================== +// Wolfenstein SS +//============================================================================== + +$ MT_WOLFSS +doomednum 84 +spawnstate S_SSWV_STND +spawnhealth 50 +seestate S_SSWV_RUN1 +seesound wolfss/sight +painstate S_SSWV_PAIN +painchance 170 +painsound wolfss/pain +missilestate S_SSWV_ATK1 +deathstate S_SSWV_DIE1 +xdeathstate S_SSWV_XDIE1 +raisestate S_SSWV_RAISE1 +deathsound wolfss/death +speed 8 +radius 20 +height 56 +activesound wolfss/active +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL +flags2 MF2_MCROSS|MF2_PASSMOBJ|MF2_PUSHWALL + + +S_SSWV_STND SSWV A 10 A_Look S_SSWV_STND2 +S_SSWV_STND2 SSWV B 10 A_Look S_SSWV_STND + +S_SSWV_RUN1 SSWV A 3 A_Chase S_SSWV_RUN2 +S_SSWV_RUN2 SSWV A 3 A_Chase S_SSWV_RUN3 +S_SSWV_RUN3 SSWV B 3 A_Chase S_SSWV_RUN4 +S_SSWV_RUN4 SSWV B 3 A_Chase S_SSWV_RUN5 +S_SSWV_RUN5 SSWV C 3 A_Chase S_SSWV_RUN6 +S_SSWV_RUN6 SSWV C 3 A_Chase S_SSWV_RUN7 +S_SSWV_RUN7 SSWV D 3 A_Chase S_SSWV_RUN8 +S_SSWV_RUN8 SSWV D 3 A_Chase S_SSWV_RUN1 + +S_SSWV_ATK1 SSWV E 10 A_FaceTarget S_SSWV_ATK2 +S_SSWV_ATK2 SSWV F 10 A_FaceTarget S_SSWV_ATK3 +S_SSWV_ATK3 SSWV G* 4 A_CPosAttack S_SSWV_ATK4 +S_SSWV_ATK4 SSWV F 6 A_FaceTarget S_SSWV_ATK5 +S_SSWV_ATK5 SSWV G* 4 A_CPosAttack S_SSWV_ATK6 +S_SSWV_ATK6 SSWV F 1 A_CPosRefire S_SSWV_ATK2 + +S_SSWV_PAIN SSWV H 3 NULL S_SSWV_PAIN2 +S_SSWV_PAIN2 SSWV H 3 A_Pain S_SSWV_RUN1 + +S_SSWV_DIE1 SSWV I 5 NULL S_SSWV_DIE2 +S_SSWV_DIE2 SSWV J 5 A_Scream S_SSWV_DIE3 +S_SSWV_DIE3 SSWV K 5 A_Fall S_SSWV_DIE4 +S_SSWV_DIE4 SSWV L 5 NULL S_SSWV_DIE5 +S_SSWV_DIE5 SSWV M -1 NULL S_NULL + +S_SSWV_XDIE1 SSWV N 5 NULL S_SSWV_XDIE2 +S_SSWV_XDIE2 SSWV O 5 A_XScream S_SSWV_XDIE3 +S_SSWV_XDIE3 SSWV P 5 A_Fall S_SSWV_XDIE4 +S_SSWV_XDIE4 SSWV Q 5 NULL S_SSWV_XDIE5 +S_SSWV_XDIE5 SSWV R 5 NULL S_SSWV_XDIE6 +S_SSWV_XDIE6 SSWV S 5 NULL S_SSWV_XDIE7 +S_SSWV_XDIE7 SSWV T 5 NULL S_SSWV_XDIE8 +S_SSWV_XDIE8 SSWV U 5 NULL S_SSWV_XDIE9 +S_SSWV_XDIE9 SSWV V -1 NULL S_NULL + +S_SSWV_RAISE1 SSWV M 5 NULL S_SSWV_RAISE2 +S_SSWV_RAISE2 SSWV L 5 NULL S_SSWV_RAISE3 +S_SSWV_RAISE3 SSWV K 5 NULL S_SSWV_RAISE4 +S_SSWV_RAISE4 SSWV J 5 NULL S_SSWV_RAISE5 +S_SSWV_RAISE5 SSWV I 5 NULL S_SSWV_RUN1 + +//============================================================================== +// Commander Keen +//============================================================================== + +$ MT_KEEN +doomednum 72 +spawnstate S_KEENSTND +flags MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY|MF_SHOOTABLE|MF_COUNTKILL +height 72 +radius 16 +spawnhealth 100 +painchance 256 +painstate S_KEENPAIN +deathstate S_COMMKEEN +deathsound keen/death +painsound keen/pain +mass 10000000 + +S_KEENSTND KEEN A -1 NULL S_KEENSTND + +S_COMMKEEN KEEN A 6 NULL S_COMMKEEN2 +S_COMMKEEN2 KEEN B 6 NULL S_COMMKEEN3 +S_COMMKEEN3 KEEN C 6 A_Scream S_COMMKEEN4 +S_COMMKEEN4 KEEN D 6 NULL S_COMMKEEN5 +S_COMMKEEN5 KEEN E 6 NULL S_COMMKEEN6 +S_COMMKEEN6 KEEN F 6 NULL S_COMMKEEN7 +S_COMMKEEN7 KEEN G 6 NULL S_COMMKEEN8 +S_COMMKEEN8 KEEN H 6 NULL S_COMMKEEN9 +S_COMMKEEN9 KEEN I 6 NULL S_COMMKEEN10 +S_COMMKEEN10 KEEN J 6 NULL S_COMMKEEN11 +S_COMMKEEN11 KEEN K 6 A_KeenDie S_COMMKEEN12 +S_COMMKEEN12 KEEN L -1 NULL S_NULL + +S_KEENPAIN KEEN M 4 NULL S_KEENPAIN2 +S_KEENPAIN2 KEEN M 8 A_Pain S_KEENSTND + +//============================================================================== + +$ MT_BOSSBRAIN +doomednum 88 +spawnstate S_BRAIN +spawnhealth 250 +deathstate S_BRAIN_DIE1 +deathsound brain/death +painstate S_BRAIN_PAIN +painchance 255 +painsound brain/pain +speed 0 +radius 16 +height 16 +flags MF_SOLID|MF_SHOOTABLE +mass 10000000 + +// stay in state until killed +S_BRAIN BBRN A -1 NULL S_NULL + +S_BRAIN_PAIN BBRN B 36 A_BrainPain S_BRAIN + +S_BRAIN_DIE1 BBRN A 100 A_BrainScream S_BRAIN_DIE2 +S_BRAIN_DIE2 BBRN A 10 NULL S_BRAIN_DIE3 +S_BRAIN_DIE3 BBRN A 10 NULL S_BRAIN_DIE4 +S_BRAIN_DIE4 BBRN A -1 A_BrainDie S_NULL + + +// source (invisible) for boss to spit MT_SPAWNSHOTS and look for player +$ MT_BOSSSPIT +doomednum 89 +spawnstate S_BRAINEYE +seestate S_BRAINEYESEE +height 32 +flags MF_NOBLOCKMAP|MF_NOSECTOR + +S_BRAINEYE SSWV A 10 A_Look S_BRAINEYE + +S_BRAINEYESEE SSWV A 181 A_BrainAwake S_BRAINEYE1 + +S_BRAINEYE1 SSWV A 150 A_BrainSpit S_BrainEye1 + + +// targets (invisible) for boss to spit at +$ MT_BOSSTARGET +doomednum 87 +height 32 +flags MF_NOBLOCKMAP|MF_NOSECTOR + + +// spinning demon cube to shoot from MT_BOSSSPIT to MT_BOSSTARGET +$ MT_SPAWNSHOT +spawnstate S_SPAWN1 +speed 10 +damage 3 +seesound brain/spit +deathsound brain/spawn +radius 6 +height 32 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY|MF_NOCLIP + +S_SPAWN1 BOSF A* 3 A_SpawnSound S_SPAWN2 +S_SPAWN2 BOSF B* 3 A_SpawnFly S_SPAWN3 +S_SPAWN3 BOSF C* 3 A_SpawnFly S_SPAWN4 +S_SPAWN4 BOSF D* 3 A_SpawnFly S_SPAWN1 + + +$ MT_SPAWNFIRE +spawnstate S_SPAWNFIRE1 +flags MF_NOBLOCKMAP|MF_NOGRAVITY +translucency .66 + +S_SPAWNFIRE1 FIRE A* 4 A_Fire S_SPAWNFIRE2 +S_SPAWNFIRE2 FIRE B* 4 A_Fire S_SPAWNFIRE3 +S_SPAWNFIRE3 FIRE C* 4 A_Fire S_SPAWNFIRE4 +S_SPAWNFIRE4 FIRE D* 4 A_Fire S_SPAWNFIRE5 +S_SPAWNFIRE5 FIRE E* 4 A_Fire S_SPAWNFIRE6 +S_SPAWNFIRE6 FIRE F* 4 A_Fire S_SPAWNFIRE7 +S_SPAWNFIRE7 FIRE G* 4 A_Fire S_SPAWNFIRE8 +S_SPAWNFIRE8 FIRE H* 4 A_Fire S_NULL + +S_BRAINEXPLODE1 MISL B* 10 NULL S_BRAINEXPLODE2 +S_BRAINEXPLODE2 MISL C* 10 NULL S_BRAINEXPLODE3 +S_BRAINEXPLODE3 MISL D* 10 A_BrainExplode S_NULL + + +//============================================================================== + +$ MT_BARREL +doomednum 2035 +spawnstate S_BAR1 +spawnhealth 20 +deathstate S_BEXP +deathsound world/barrelx +speed 0 +radius 10 +height 42 +flags MF_SOLID|MF_SHOOTABLE|MF_NOBLOOD + +// =========================== +// +// missiles +// +// =========================== + +$ MT_TROOPSHOT +spawnstate S_TBALL1 +deathstate S_TBALLX1 +speed 10 +damage 3 +seesound imp/attack +deathsound imp/shotx +radius 6 +height 8 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_PCROSS|MF2_IMPACT +translucency .75 + +$ MT_HEADSHOT +spawnstate S_RBALL1 +deathstate S_RBALLX1 +speed 10 +damage 5 +seesound caco/attack +deathsound caco/shotx +radius 6 +height 8 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_PCROSS|MF2_IMPACT +translucency .75 + +$ MT_ROCKET +spawnstate S_ROCKET +deathstate S_EXPLODE1 +speed 20 +damage 20 +seesound weapons/rocklf +deathsound weapons/rocklx +radius 11 +height 8 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_PCROSS|MF2_IMPACT + +$ MT_PLASMA +spawnstate S_PLASBALL +deathstate S_PLASEXP +speed 25 +damage 5 +seesound weapons/plasmaf +deathsound weapons/plasmax +radius 13 +height 8 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_PCROSS|MF2_IMPACT +translucency .66 + +$ MT_BFG +spawnstate S_BFGSHOT +deathstate S_BFGLAND +speed 25 +damage 100 +deathsound weapons/bfgx +radius 13 +height 8 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_PCROSS|MF2_IMPACT +translucency .66 + +$ MT_ARACHPLAZ +spawnstate S_ARACH_PLAZ +deathstate S_ARACH_PLEX +speed 25 +damage 5 +seesound baby/attack +deathsound baby/shotx +radius 13 +height 8 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_PCROSS|MF2_IMPACT +translucency .66 + + +// =================== +// +// misc +// +// =================== + +$ MT_PUFF +spawnstate S_PUFF1 +flags MF_NOBLOCKMAP|MF_NOGRAVITY +translucency .50 + +$ MT_BLOOD +spawnstate S_BLOOD1 +flags MF_NOBLOCKMAP + +$ MT_TFOG +spawnstate S_TFOG +flags MF_NOBLOCKMAP|MF_NOGRAVITY +translucency .66 + +$ MT_IFOG +spawnstate S_IFOG +flags MF_NOBLOCKMAP|MF_NOGRAVITY + +$ MT_TELEPORTMAN +doomednum 14 +flags MF_NOBLOCKMAP|MF_NOSECTOR + +$ MT_EXTRABFG // explosion for all other visible monsters +spawnstate S_BFGEXP +flags MF_NOBLOCKMAP|MF_NOGRAVITY +translucency .66 + + +// =================== +// +// static sprites +// +// =================== + +$ MT_ARMOR1 + doomednum 2018 spawnstate S_ARM1 flags MF_SPECIAL + item "Basic Armor" + +$ MT_ARMOR2 + doomednum 2019 spawnstate S_ARM2 flags MF_SPECIAL + item "Mega Armor" + +$ MT_HEALTHBONUS + doomednum 2014 spawnstate S_BON1 flags MF_SPECIAL|MF_COUNTITEM + item "Health Bonus" + +$ MT_ARMORBONUS + doomednum 2015 spawnstate S_BON2 flags MF_SPECIAL|MF_COUNTITEM + item "Armor Bonus" + +$ MT_BKEY + doomednum 5 spawnstate S_BKEY flags MF_SPECIAL|MF_NOTDMATCH + item "Blue Keycard" + +$ MT_RKEY + doomednum 13 spawnstate S_RKEY flags MF_SPECIAL|MF_NOTDMATCH + item "Red Keycard" + +$ MT_YKEY + doomednum 6 spawnstate S_YKEY flags MF_SPECIAL|MF_NOTDMATCH + item "Yellow Keycard" + +$ MT_YSKULL + doomednum 39 spawnstate S_YSKULL flags MF_SPECIAL|MF_NOTDMATCH + item "Yellow Skull Key" + +$ MT_RSKULL + doomednum 38 spawnstate S_RSKULL flags MF_SPECIAL|MF_NOTDMATCH + item "Red Skull Key" + +$ MT_BSKULL + doomednum 40 spawnstate S_BSKULL flags MF_SPECIAL|MF_NOTDMATCH + item "Blue Skull Key" + +$ MT_STIMPACK + doomednum 2011 spawnstate S_STIM flags MF_SPECIAL + item "Stim Pack" + +$ MT_MEDIKIT + doomednum 2012 spawnstate S_MEDI flags MF_SPECIAL + item "Medikit" + +$ MT_SOULSPHERE + doomednum 2013 spawnstate S_SOUL flags MF_SPECIAL|MF_COUNTITEM + item "Soul Sphere" + +$ MT_INV + doomednum 2022 spawnstate S_PINV flags MF_SPECIAL|MF_COUNTITEM + item "Invulnerability" + +$ MT_STRENGTH + doomednum 2023 spawnstate S_PSTR flags MF_SPECIAL|MF_COUNTITEM + item "Berserk" + +$ MT_INS + doomednum 2024 spawnstate S_PINS flags MF_SPECIAL|MF_COUNTITEM + item "Invisibility" + +$ MT_SUIT + doomednum 2025 spawnstate S_SUIT flags MF_SPECIAL + height 46 + item "Radiation Suit" + +$ MT_MAP + doomednum 2026 spawnstate S_PMAP flags MF_SPECIAL|MF_COUNTITEM + item "Computer Map" + +$ MT_LIGHTAMP + doomednum 2045 spawnstate S_PVIS flags MF_SPECIAL|MF_COUNTITEM + height 10 + item "Light Amplification Visor" + +$ MT_MEGA + doomednum 83 spawnstate S_MEGA flags MF_SPECIAL|MF_COUNTITEM + item "Mega Health" + +$ MT_CLIP + doomednum 2007 spawnstate S_CLIP flags MF_SPECIAL + height 10 + item "Bullets" + spawnhealth 10 + +$ MT_AMMOBOX + doomednum 2048 spawnstate S_AMMO flags MF_SPECIAL + item "Bullets" + spawnhealth 50 + +$ MT_ROCKETPICKUP + doomednum 2010 spawnstate S_ROCK flags MF_SPECIAL + item "Rockets" + spawnhealth 1 + +$ MT_ROCKETBOX + doomednum 2046 spawnstate S_BROK flags MF_SPECIAL + height 26 + item "Rockets" + spawnhealth 5 + +$ MT_CELL + doomednum 2047 spawnstate S_CELL flags MF_SPECIAL + height 10 + item "Cells" + spawnhealth 20 + +$ MT_CELLPACK + doomednum 17 spawnstate S_CELP flags MF_SPECIAL + height 18 + item "Cells" + spawnhealth 100 + +$ MT_SHELLS + doomednum 2008 spawnstate S_SHEL flags MF_SPECIAL + height 8 + item "Shells" + spawnhealth 4 + +$ MT_SHELLBOX + doomednum 2049 spawnstate S_SBOX flags MF_SPECIAL + height 10 + item "Shells" + spawnhealth 20 + +$ MT_BACKPACK + doomednum 8 spawnstate S_BPAK flags MF_SPECIAL + height 26 + item "Backpack" + +$ MT_BFGGUN + doomednum 2006 spawnstate S_BFUG flags MF_SPECIAL + height 20 + item "BFG 9000" + +$ MT_CHAINGUN + doomednum 2002 spawnstate S_MGUN flags MF_SPECIAL + item "Chaingun" + +$ MT_CHAINSAW + doomednum 2005 spawnstate S_CSAW flags MF_SPECIAL + item "Chainsaw" + +$ MT_ROCKETLAUNCHER + doomednum 2003 spawnstate S_LAUN flags MF_SPECIAL + item "Rocket Launcher" + +$ MT_PLASMAGUN + doomednum 2004 spawnstate S_PLAS flags MF_SPECIAL + item "Plasma Rifle" + +$ MT_SHOTGUN + doomednum 2001 spawnstate S_SHOT flags MF_SPECIAL + item "Shotgun" + +$ MT_SUPERSHOTGUN + doomednum 82 spawnstate S_SHOT2 flags MF_SPECIAL + item "Super Shotgun" + +$ + doomednum 85 spawnstate S_TECHLAMP flags MF_SOLID radius 16 height 80 +$ + doomednum 86 spawnstate S_TECH2LAMP flags MF_SOLID radius 16 height 60 + +$ + doomednum 2028 spawnstate S_COLU flags MF_SOLID radius 16 height 48 +$ + doomednum 30 spawnstate S_TALLGRNCOL flags MF_SOLID radius 16 height 52 +$ + doomednum 31 spawnstate S_SHRTGRNCOL flags MF_SOLID radius 16 height 40 +$ + doomednum 32 spawnstate S_TALLREDCOL flags MF_SOLID radius 16 height 52 +$ + doomednum 33 spawnstate S_SHRTREDCOL flags MF_SOLID radius 16 height 40 +$ + doomednum 37 spawnstate S_SKULLCOL flags MF_SOLID radius 16 height 40 +$ + doomednum 36 spawnstate S_HEARTCOL flags MF_SOLID radius 16 height 40 +$ + doomednum 41 spawnstate S_EVILEYE flags MF_SOLID radius 16 height 54 +$ + doomednum 42 spawnstate S_FLOATSKULL flags MF_SOLID radius 16 height 26 +$ + doomednum 43 spawnstate S_TORCHTREE flags MF_SOLID radius 16 height 56 +$ + doomednum 44 spawnstate S_BLUETORCH flags MF_SOLID radius 16 height 68 +$ + doomednum 45 spawnstate S_GREENTORCH flags MF_SOLID radius 16 height 68 +$ + doomednum 46 spawnstate S_REDTORCH flags MF_SOLID radius 16 height 68 +$ + doomednum 55 spawnstate S_BTORCHSHRT flags MF_SOLID radius 16 height 37 +$ + doomednum 56 spawnstate S_GTORCHSHRT flags MF_SOLID radius 16 height 37 +$ + doomednum 57 spawnstate S_RTORCHSHRT flags MF_SOLID radius 16 height 37 +$ + doomednum 47 spawnstate S_STALAGTITE flags MF_SOLID radius 16 height 40 +$ + doomednum 48 spawnstate S_TECHPILLAR flags MF_SOLID radius 16 height 128 + + +$ + doomednum 34 spawnstate S_CANDLESTIK height 14 +$ + doomednum 35 spawnstate S_CANDELABRA flags MF_SOLID radius 16 height 60 + +$ + doomednum 49 spawnstate S_BLOODYTWITCH + flags MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY + height 68 radius 16 +$ + doomednum 50 spawnstate S_MEAT2 + flags MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY + height 84 radius 16 +$ + doomednum 51 spawnstate S_MEAT3 + flags MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY + height 84 radius 16 +$ + doomednum 52 spawnstate S_MEAT4 + flags MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY + height 68 radius 16 +$ + doomednum 53 spawnstate S_MEAT5 + flags MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY + height 52 radius 16 +$ + doomednum 59 spawnstate S_MEAT2 + flags MF_SPAWNCEILING|MF_NOGRAVITY + height 84 +$ + doomednum 60 spawnstate S_MEAT4 + flags MF_SPAWNCEILING|MF_NOGRAVITY + height 68 +$ + doomednum 61 spawnstate S_MEAT3 + flags MF_SPAWNCEILING|MF_NOGRAVITY + height 52 +$ + doomednum 62 spawnstate S_MEAT5 + flags MF_SPAWNCEILING|MF_NOGRAVITY + height 52 +$ + doomednum 63 spawnstate S_BLOODYTWITCH + flags MF_SPAWNCEILING|MF_NOGRAVITY + height 68 +$ + doomednum 22 spawnstate S_HEAD_DIE6 height 38 +$ + doomednum 15 spawnstate S_PLAY_DIE7 height 12 +$ + doomednum 18 spawnstate S_POSS_DIE5 height 14 +$ + doomednum 21 spawnstate S_SARG_DIE6 height 14 +$ + doomednum 23 spawnstate S_SKULL_DIE6 height 16 +$ + doomednum 20 spawnstate S_TROO_DIE5 height 18 +$ + doomednum 19 spawnstate S_SPOS_DIE5 height 16 +$ MT_GUTS + doomednum 10 spawnstate S_PLAY_XDIE9 height 8 +$ + doomednum 12 spawnstate S_PLAY_XDIE9 height 8 +$ + doomednum 28 spawnstate S_HEADSONSTICK flags MF_SOLID radius 16 height 64 +$ MT_GIBS + doomednum 24 spawnstate S_GIBS height 8 +$ + doomednum 27 spawnstate S_HEADONASTICK flags MF_SOLID radius 16 height 56 +$ + doomednum 29 spawnstate S_HEADCANDLES flags MF_SOLID radius 16 height 42 +$ + doomednum 25 spawnstate S_DEADSTICK flags MF_SOLID radius 16 height 64 +$ + doomednum 26 spawnstate S_LIVESTICK flags MF_SOLID radius 16 height 64 +$ + doomednum 54 spawnstate S_BIGTREE flags MF_SOLID radius 32 height 108 +$ MT_BURNINGBARREL + doomednum 70 spawnstate S_BBAR1 flags MF_SOLID radius 16 height 32 +$ + doomednum 73 spawnstate S_HANGNOGUTS +flags MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY +height 88 radius 16 +$ + doomednum 74 spawnstate S_HANGBNOBRAIN +flags MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY +height 88 radius 16 +$ + doomednum 75 spawnstate S_HANGTLOOKDN +flags MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY +height 64 radius 16 +$ + doomednum 76 spawnstate S_HANGTSKULL +flags MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY +height 64 radius 16 +$ + doomednum 77 spawnstate S_HANGTLOOKUP +flags MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY +height 64 radius 16 +$ + doomednum 78 spawnstate S_HANGTNOBRAIN +flags MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY +height 64 radius 16 +$ MT_COLONGIBS + doomednum 79 spawnstate S_COLONGIBS flags MF_NOBLOCKMAP height 4 +$ MT_SMALLPOOL + doomednum 80 spawnstate S_SMALLPOOL flags MF_NOBLOCKMAP height 1 +$ MT_BRAINSTEM + doomednum 81 spawnstate S_BRAINSTEM flags MF_NOBLOCKMAP height 4 + +// +// items +// +S_ARM1 ARM1 A 6 NULL S_ARM1A +S_ARM1A ARM1 B* 7 NULL S_ARM1 + +S_ARM2 ARM2 A 6 NULL S_ARM2A +S_ARM2A ARM2 B* 6 NULL S_ARM2 + +// +// Innocent barrel - bubbling 2 frames +// +S_BAR1 BAR1 A 6 NULL S_BAR2 +S_BAR2 BAR1 B 6 NULL S_BAR1 + +// +// Barrel explosion +// +S_BEXP BEXP A* 5 NULL S_BEXP2 +S_BEXP2 BEXP B* 5 A_Scream S_BEXP3 +S_BEXP3 BEXP C* 5 NULL S_BEXP4 +S_BEXP4 BEXP D* 10 A_Explode S_BEXP5 +S_BEXP5 BEXP E* 10 NULL S_NULL + +// +// Burning barrel +// +S_BBAR1 FCAN A* 4 NULL S_BBAR2 +S_BBAR2 FCAN B* 4 NULL S_BBAR3 +S_BBAR3 FCAN C* 4 NULL S_BBAR1 + +// +// 2 bonus items +// +S_BON1 BON1 A 6 NULL S_BON1A +S_BON1A BON1 B 6 NULL S_BON1B +S_BON1B BON1 C 6 NULL S_BON1C +S_BON1C BON1 D 6 NULL S_BON1D +S_BON1D BON1 C 6 NULL S_BON1E +S_BON1E BON1 B 6 NULL S_BON1 + +S_BON2 BON2 A 6 NULL S_BON2A +S_BON2A BON2 B 6 NULL S_BON2B +S_BON2B BON2 C 6 NULL S_BON2C +S_BON2C BON2 D 6 NULL S_BON2D +S_BON2D BON2 C 6 NULL S_BON2E +S_BON2E BON2 B 6 NULL S_BON2 + +// +// Blue key +// +S_BKEY BKEY A 10 NULL S_BKEY2 +S_BKEY2 BKEY B* 10 NULL S_BKEY + +// +// Red key +// +S_RKEY RKEY A 10 NULL S_RKEY2 +S_RKEY2 RKEY B* 10 NULL S_RKEY + +// +// Yellow key +// +S_YKEY YKEY A 10 NULL S_YKEY2 +S_YKEY2 YKEY B* 10 NULL S_YKEY + +// +// Blue skull key +// +S_BSKULL BSKU A 10 NULL S_BSKULL2 +S_BSKULL2 BSKU B* 10 NULL S_BSKULL + +// +// Red skull key +// +S_RSKULL RSKU A 10 NULL S_RSKULL2 +S_RSKULL2 RSKU B* 10 NULL S_RSKULL + +// +// Yellow skull key +// +S_YSKULL YSKU A 10 NULL S_YSKULL2 +S_YSKULL2 YSKU B* 10 NULL S_YSKULL + +// +// Health stimpack/medikit +// +S_STIM STIM A -1 NULL S_NULL +S_MEDI MEDI A -1 NULL S_NULL + +// +// Soul Sphere +// +S_SOUL SOUL A* 6 NULL S_SOUL2 +S_SOUL2 SOUL B* 6 NULL S_SOUL3 +S_SOUL3 SOUL C* 6 NULL S_SOUL4 +S_SOUL4 SOUL D* 6 NULL S_SOUL5 +S_SOUL5 SOUL C* 6 NULL S_SOUL6 +S_SOUL6 SOUL B* 6 NULL S_SOUL + +// +// Invincibility +// +S_PINV PINV A* 6 NULL S_PINV2 +S_PINV2 PINV B* 6 NULL S_PINV3 +S_PINV3 PINV C* 6 NULL S_PINV4 +S_PINV4 PINV D* 6 NULL S_PINV + +// +// Strength (Berserk) +// +S_PSTR PSTR A* -1 NULL S_NULL + +// +// Invisibility +// +S_PINS PINS A* 6 NULL S_PINS2 +S_PINS2 PINS B* 6 NULL S_PINS3 +S_PINS3 PINS C* 6 NULL S_PINS4 +S_PINS4 PINS D* 6 NULL S_PINS + +// +// Mega sphere +// +S_MEGA MEGA A* 6 NULL S_MEGA2 +S_MEGA2 MEGA B* 6 NULL S_MEGA3 +S_MEGA3 MEGA C* 6 NULL S_MEGA4 +S_MEGA4 MEGA D* 6 NULL S_MEGA + +// +// Ironfeet (Radiation Shielding) +// +S_SUIT SUIT A* -1 NULL S_NULL +// +// Super Map +// +S_PMAP PMAP A* 6 NULL S_PMAP2 +S_PMAP2 PMAP B* 6 NULL S_PMAP3 +S_PMAP3 PMAP C* 6 NULL S_PMAP4 +S_PMAP4 PMAP D* 6 NULL S_PMAP5 +S_PMAP5 PMAP C* 6 NULL S_PMAP6 +S_PMAP6 PMAP B* 6 NULL S_PMAP + +// +// InfraVisor (Light Amp.) +// +S_PVIS PVIS A* 6 NULL S_PVIS2 +S_PVIS2 PVIS B 6 NULL S_PVIS + +// +// Ammo +// +S_CLIP CLIP A -1 NULL S_NULL +S_AMMO AMMO A -1 NULL S_NULL +S_ROCK ROCK A -1 NULL S_NULL +S_BROK BROK A -1 NULL S_NULL +S_CELL CELL A -1 NULL S_NULL +S_CELP CELP A -1 NULL S_NULL +S_SHEL SHEL A -1 NULL S_NULL +S_SBOX SBOX A -1 NULL S_NULL + +// Backpack +S_BPAK BPAK A -1 NULL S_NULL + +// +// Weapons +// +S_BFUG BFUG A -1 NULL S_NULL +S_MGUN MGUN A -1 NULL S_NULL +S_CSAW CSAW A -1 NULL S_NULL +S_LAUN LAUN A -1 NULL S_NULL +S_PLAS PLAS A -1 NULL S_NULL +S_SHOT SHOT A -1 NULL S_NULL +S_SHOT2 SGN2 A -1 NULL S_NULL + +// +// Freds +// +S_COLU COLU A* -1 NULL S_NULL + +S_STALAG SMT2 A -1 NULL S_NULL + +// Bloody, twitching G.I.Joe +S_BLOODYTWITCH GOR1 A 10 NULL S_BLOODYTWITCH2 +S_BLOODYTWITCH2 GOR1 B 15 NULL S_BLOODYTWITCH3 +S_BLOODYTWITCH3 GOR1 C 8 NULL S_BLOODYTWITCH4 +S_BLOODYTWITCH4 GOR1 B 6 NULL S_BLOODYTWITCH + +// Dead, torso me +S_DEADTORSO PLAY N -1 NULL S_NULL +// Dead, bottom me +S_DEADBOTTOM PLAY S -1 NULL S_NULL +// Fred, Bunch o' heads +S_HEADSONSTICK POL2 A -1 NULL S_NULL +// Dead, gibs +S_GIBS POL5 A -1 NULL S_NULL +// Fred, head on a stick +S_HEADONASTICK POL4 A -1 NULL S_NULL +// Fred, Heads & Candles +S_HEADCANDLES POL3 A* 6 NULL S_HEADCANDLES2 +S_HEADCANDLES2 POL3 B* 6 NULL S_HEADCANDLES +// Fred, on a stick, dead +S_DEADSTICK POL1 A -1 NULL S_NULL +// Fred, on a stick, live +S_LIVESTICK POL6 A 6 NULL S_LIVESTICK2 +S_LIVESTICK2 POL6 B 8 NULL S_LIVESTICK + +S_MEAT2 GOR2 A -1 NULL S_NULL +S_MEAT3 GOR3 A -1 NULL S_NULL +S_MEAT4 GOR4 A -1 NULL S_NULL +S_MEAT5 GOR5 A -1 NULL S_NULL +S_STALAGTITE SMIT A -1 NULL S_NULL +S_TALLGRNCOL COL1 A -1 NULL S_NULL +S_SHRTGRNCOL COL2 A -1 NULL S_NULL +S_TALLREDCOL COL3 A -1 NULL S_NULL +S_SHRTREDCOL COL4 A -1 NULL S_NULL +S_CANDLESTIK CAND A* -1 NULL S_NULL +S_CANDELABRA CBRA A* -1 NULL S_NULL +S_SKULLCOL COL6 A -1 NULL S_NULL +S_TORCHTREE TRE1 A -1 NULL S_NULL +S_BIGTREE TRE2 A -1 NULL S_NULL +S_TECHPILLAR ELEC A -1 NULL S_NULL + +S_EVILEYE CEYE A* 6 NULL S_EVILEYE2 +S_EVILEYE2 CEYE B* 6 NULL S_EVILEYE3 +S_EVILEYE3 CEYE C* 6 NULL S_EVILEYE4 +S_EVILEYE4 CEYE B* 6 NULL S_EVILEYE + +S_FLOATSKULL FSKU A* 6 NULL S_FLOATSKULL2 +S_FLOATSKULL2 FSKU B* 6 NULL S_FLOATSKULL3 +S_FLOATSKULL3 FSKU C* 6 NULL S_FLOATSKULL + +S_HEARTCOL COL5 A 14 NULL S_HEARTCOL2 +S_HEARTCOL2 COL5 B 14 NULL S_HEARTCOL + +S_BLUETORCH TBLU A* 4 NULL S_BLUETORCH2 +S_BLUETORCH2 TBLU B* 4 NULL S_BLUETORCH3 +S_BLUETORCH3 TBLU C* 4 NULL S_BLUETORCH4 +S_BLUETORCH4 TBLU D* 4 NULL S_BLUETORCH + +S_GREENTORCH TGRN A* 4 NULL S_GREENTORCH2 +S_GREENTORCH2 TGRN B* 4 NULL S_GREENTORCH3 +S_GREENTORCH3 TGRN C* 4 NULL S_GREENTORCH4 +S_GREENTORCH4 TGRN D* 4 NULL S_GREENTORCH + +S_REDTORCH TRED A* 4 NULL S_REDTORCH2 +S_REDTORCH2 TRED B* 4 NULL S_REDTORCH3 +S_REDTORCH3 TRED C* 4 NULL S_REDTORCH4 +S_REDTORCH4 TRED D* 4 NULL S_REDTORCH + +S_BTORCHSHRT SMBT A* 4 NULL S_BTORCHSHRT2 +S_BTORCHSHRT2 SMBT B* 4 NULL S_BTORCHSHRT3 +S_BTORCHSHRT3 SMBT C* 4 NULL S_BTORCHSHRT4 +S_BTORCHSHRT4 SMBT D* 4 NULL S_BTORCHSHRT + +S_GTORCHSHRT SMGT A* 4 NULL S_GTORCHSHRT2 +S_GTORCHSHRT2 SMGT B* 4 NULL S_GTORCHSHRT3 +S_GTORCHSHRT3 SMGT C* 4 NULL S_GTORCHSHRT4 +S_GTORCHSHRT4 SMGT D* 4 NULL S_GTORCHSHRT + +S_RTORCHSHRT SMRT A* 4 NULL S_RTORCHSHRT2 +S_RTORCHSHRT2 SMRT B* 4 NULL S_RTORCHSHRT3 +S_RTORCHSHRT3 SMRT C* 4 NULL S_RTORCHSHRT4 +S_RTORCHSHRT4 SMRT D* 4 NULL S_RTORCHSHRT + +S_HANGNOGUTS HDB1 A -1 NULL S_NULL +S_HANGBNOBRAIN HDB2 A -1 NULL S_NULL +S_HANGTLOOKDN HDB3 A -1 NULL S_NULL +S_HANGTSKULL HDB4 A -1 NULL S_NULL +S_HANGTLOOKUP HDB5 A -1 NULL S_NULL +S_HANGTNOBRAIN HDB6 A -1 NULL S_NULL +S_COLONGIBS POB1 A -1 NULL S_NULL +S_SMALLPOOL POB2 A -1 NULL S_NULL +S_BRAINSTEM BRS1 A -1 NULL S_NULL + +// New Tech Lamps (tall) +S_TECHLAMP TLMP A* 4 NULL S_TECHLAMP2 +S_TECHLAMP2 TLMP B* 4 NULL S_TECHLAMP3 +S_TECHLAMP3 TLMP C* 4 NULL S_TECHLAMP4 +S_TECHLAMP4 TLMP D* 4 NULL S_TECHLAMP + +// New Tech Lamps (short) +S_TECH2LAMP TLP2 A* 4 NULL S_TECH2LAMP2 +S_TECH2LAMP2 TLP2 B* 4 NULL S_TECH2LAMP3 +S_TECH2LAMP3 TLP2 C* 4 NULL S_TECH2LAMP4 +S_TECH2LAMP4 TLP2 D* 4 NULL S_TECH2LAMP + + +// BOOM's point pusher and puller +$ MT_PUSH +doomednum 5001 +spawnstate S_MAPSPOT +flags MF_NOBLOCKMAP +flags2 MF2_DONTDRAW + +$ MT_PUSH +doomednum 5002 +spawnstate S_MAPSPOT +flags MF_NOBLOCKMAP +flags2 MF2_DONTDRAW + +// Other types of map spots for ZDoom +$ MT_PATHNODE +doomednum 9024 +spawnstate S_MAPSPOT +flags MF_NOBLOCKMAP +flags2 MF2_DONTDRAW + +$ MT_CAMERA +doomednum 9025 +spawnstate S_MAPSPOT +flags MF_NOBLOCKMAP|MF_NOGRAVITY +flags2 MF2_DONTDRAW + +$ MT_SPARK +doomednum 9026 +spawnstate S_MAPSPOT +flags MF_NOSECTOR|MF_NOBLOCKMAP|MF_NOGRAVITY + +// The fountain is created for types 9027-9033. +$ MT_FOUNTAIN +spawnstate S_MAPSPOT +height 1 +flags MF_NOBLOCKMAP|MF_NOGRAVITY + +$ MT_TELEPORTMAN2 +doomednum 9044 +flags MF_NOBLOCKMAP|MF2_DONTDRAW + +$ MT_AMBIENT +doomednum 14065 +spawnstate S_AMBIENTSOUND +flags MF_NOBLOCKMAP|MF_NOSECTOR +flags2 MF2_DONTDRAW + +S_AMBIENTSOUND TROO A 1 A_Ambient S_AMBIENTSOUND + +} // end multigen + +//========================================================================== + +// Things that can be spawned with the Thing_Spawn +// and Thing_Projectile specials + +spawnables +{ +MT_SHOTGUY = 1 +MT_CHAINGUY +MT_BRUISER +MT_POSSESSED +MT_TROOP +MT_BABY +MT_SPIDER +MT_SERGEANT +MT_SHADOWS +MT_TROOPSHOT +MT_CLIP +MT_SHELLS +MT_CACODEMON = 19 +MT_UNDEAD +MT_BRIDGE +MT_ARMORBONUS +MT_STIMPACK +MT_MEDIKIT +MT_SOULSPHERE +MT_SHOTGUN = 27 +MT_CHAINGUN +MT_ROCKETLAUNCHER +MT_PLASMAGUN +MT_BFGGUN +MT_CHAINSAW +MT_SUPERSHOTGUN +MT_PLASMA = 51 +MT_TRACER = 53 +MT_ARMOR1 = 68 +MT_ARMOR2 +MT_CELL = 75 +MT_BKEY = 85 +MT_RKEY +MT_YKEY +MT_YSKULL +MT_RSKULL +MT_BSKULL +MT_FIRE = 98 +MT_STEALTHBRUISER = 100 +MT_STEALTHKNIGHT +MT_STEALTHZOMBIE +MT_STEALTHSHOTGUY +MT_SKULL = 110 +MT_VILE +MT_FATSO +MT_HELLKNIGHT +MT_CYBORG +MT_PAIN +MT_WOLFSS +MT_STEALTHBABY +MT_STEALTHVILE +MT_STEALTHHEAD +MT_STEALTHCHAINGUY +MT_STEALTHSERGEANT +MT_STEALTHIMP +MT_STEALTHFATSO +MT_STEALTHUNDEAD +MT_DBARREL +MT_HEADSHOT +MT_ROCKET +MT_BFG +MT_ARACHPLAZ +MT_BLOOD +MT_PUFF +MT_MEGA +MT_INV +MT_STRENGTH +MT_INS +MT_SUIT +MT_MAP +MT_LIGHTAMP +MT_AMMOBOX +MT_ROCKETPICKUP +MT_ROCKETBOX +MT_CELLPACK +MT_SHELLBOX +MT_BACKPACK +MT_GUTS +MT_GIBS +MT_COLONGIBS +MT_SMALLPOOL +MT_BURNINGBARREL +MT_BRAINSTEM +} // end spawnables + +// weapon definitions + +weapons +{ + // { + // + // + // + // + // + // + // + // + // } + + { + "Fist" + NULL + NULL + S_PUNCHUP + S_PUNCHDOWN + S_PUNCH + S_PUNCH1 + S_NULL + } + + { + "Chainsaw" + "A chainsaw! Find some meat!" + NULL + S_SAWUP + S_SAWDOWN + S_SAW + S_SAW1 + S_NULL + } + + { + "Pistol" + NULL + "Bullets" + S_PISTOLUP + S_PISTOLDOWN + S_PISTOL + S_PISTOL1 + S_PISTOLFLASH + } + + { + "Shotgun" + "You got the shotgun!" + "Shells" + S_SGUNUP + S_SGUNDOWN + S_SGUN + S_SGUN1 + S_SGUNFLASH + } + + { + "Super Shotgun" + "You got the super shotgun!" + "Shells" + S_DSGUNUP + S_DSGUNDOWN + S_DSGUN + S_DSGUN1 + S_DSGUNFLASH1 + } + + { + "chaingun" + "You got the chaingun!" + "Bullets" + S_CHAINUP + S_CHAINDOWN + S_CHAIN + S_CHAIN1 + S_CHAINFLASH1 + } + + { + "Rocket Laucher" + "You got the rocket launcher!" + "Rockets" + S_MISSILEUP + S_MISSILEDOWN + S_MISSILE + S_MISSILE1 + S_MISSILEFLASH1 + } + + { + "Plasma Rifle" + "You got the plasma gun!" + "Cells" + S_PLASMAUP + S_PLASMADOWN + S_PLASMA + S_PLASMA1 + S_PLASMAFLASH + } + + { + "BFG 9000" + "You got the BFG9000! Oh, yes." + "Cells" + S_BFGUP + S_BFGDOWN + S_BFG + S_BFG1 + S_BFGFLASH1 + } + +} + +// ammo definitions + +ammo +{ + // { + // name + // pickup message + // big pickup message + // status bar picture + // clipammo (a weapon has two clips) + // maxammo (a backpack doubles this) + //} + + { + "Bullets" + "Picked up a clip." + "Picked up a box of bullets." + CLIPA0 + 10 + 200 + } + + { + "Shells" + "Picked up 4 shotgun shells." + "Picked up a box of shotgun shells." + SHELA0 + 4 + 50 + } + + { + "Cells" + "Picked up an energy cell." + "Picked up an energy cell pack." + CELLA0 + 20 + 300 + } + + { + "Rockets" + "Picked up a rocket." + "Picked up a box of rockets." + ROCKA0 + 1 + 50 + } +} + +// key definitions + +keys +{ + // { + // name + // pickup message + // status bar picture + // id (for ACS_ExecuteLocked and Door_RaiseLocked) + // class (e.g. yellow keycard and yellow skull are in the same class) + // } + + { + "Blue Keycard" + "Picked up a blue keycard." + STKEYS0 + 1 + 0 + } + + { + "Yellow Keycard" + "Picked up a yellow keycard." + STKEYS1 + 2 + 1 + } + + { + "Red Keycard" + "Picked up a red keycard." + STKEYS2 + 3 + 2 + } + + { + "Blue Skull Key" + "Picked up a blue skull key." + STEYS3 + 4 + 0 + } + + { + "Yellow Skull Key" + "Picked up a yellow skull key." + STKEYS4 + 5 + 1 + } + + { + "Red Skull Key" + "Picked up a red skull key." + STKEYS5 + 6 + 2 + } +} \ No newline at end of file diff --git a/code/f_wipe.h b/code/f_wipe.h index ca2d7e3628..f5dae7fcf5 100644 --- a/code/f_wipe.h +++ b/code/f_wipe.h @@ -27,41 +27,9 @@ // SCREEN WIPE PACKAGE // -enum -{ - // simple gradual pixel change for 8-bit only - wipe_ColorXForm, - - // weird screen melt - wipe_Melt, - - wipe_NUMWIPES -}; - -int -wipe_StartScreen -( int x, - int y, - int width, - int height ); - - -int -wipe_EndScreen -( int x, - int y, - int width, - int height ); - - -int -wipe_ScreenWipe -( int wipeno, - int x, - int y, - int width, - int height, - int ticks ); +int wipe_StartScreen (void); +int wipe_EndScreen (void); +int wipe_ScreenWipe (int ticks); #endif //----------------------------------------------------------------------------- diff --git a/code/gi.c b/code/gi.c new file mode 100644 index 0000000000..11d9668f64 --- /dev/null +++ b/code/gi.c @@ -0,0 +1,206 @@ +#include +#include "info.h" +#include "gi.h" + +gameinfo_t gameinfo; + +static char *quitsounds[8] = +{ + "player/male/death1", + "demon/pain", + "grunt/pain", + "misc/gibbed", + "misc/teleport", + "grunt/sight1", + "grunt/sight3", + "demon/melee" +}; + +static char *quitsounds2[8] = +{ + "vile/active", + "misc/p_pkup", + "brain/cube", + "misc/gibbed", + "skeleton/swing", + "knight/death", + "baby/active", + "demon/melee" +}; + +static gameborder_t DoomBorder = +{ + 8, 8, + "brdr_tl", "brdr_t", "brdr_tr", + "brdr_l", "brdr_r", + "brdr_bl", "brdr_b", "brdr_br" +}; + +static gameborder_t HereticBorder = +{ + 4, 16, + "bordtl", "bordt", "bordtr", + "bordl", "bordr", + "bordbl", "bordb", "bordbr" +}; + +gameinfo_t HexenGameInfo = +{ + GI_PAGESARERAW | GI_MAPxx | GI_NOLOOPFINALEMUSIC | GI_INFOINDEXED, + "TITLE", + "CREDIT", + "CREDIT", + "HEXEN", + 280/35, + 210/35, + 200/35, + "Chat", + "hall", + "-NOFLAT-", + "CREDIT", + "CREDIT", + "CREDIT", + { { "TITLE", 4 } }, + NULL, + 33, + "F_022", + &HereticBorder +}; + +gameinfo_t HereticGameInfo = +{ + GI_PAGESARERAW | GI_INFOINDEXED, + "TITLE", + "CREDIT", + "CREDIT", + "MUS_TITL", + 280/35, + 210/35, + 200/35, + "misc/chat", + "MUS_CPTD", + "FLOOR25", + "CREDIT", + "CREDIT", + "CREDIT", + { { "TITLE", 4 } }, + NULL, + 17, + "FLAT513", + &HereticBorder +}; + +gameinfo_t HereticSWGameInfo = +{ + GI_PAGESARERAW | GI_SHAREWARE | GI_INFOINDEXED, + "TITLE", + "CREDIT", + "ORDER", + "MUS_TITL", + 280/35, + 210/35, + 200/35, + "misc/chat", + "MUS_CPTD", + "FLOOR25", + "ORDER", + "CREDIT", + "CREDIT", + { { "TITLE", 5 } }, + NULL, + 17, + "FLOOR04", + &HereticBorder +}; + +gameinfo_t SharewareGameInfo = +{ + GI_SHAREWARE | GI_NOCRAZYDEATH, + "TITLEPIC", + "CREDIT", + "HELP2", + "D_INTRO", + 5, + 0, + 200/35, + "misc/chat2", + "D_VICTOR", + "FLOOR4_8", + "HELP2", + "VICTORY2", + "ENDPIC", + { { "HELP1", "HELP2" } }, + quitsounds, + 1, + "FLOOR7_2", + &DoomBorder +}; + +gameinfo_t RegisteredGameInfo = +{ + GI_NOCRAZYDEATH, + "TITLEPIC", + "CREDIT", + "HELP2", + "D_INTRO", + 5, + 0, + 200/35, + "misc/chat2", + "D_VICTOR", + "FLOOR4_8", + "HELP2", + "VICTORY2", + "ENDPIC", + { { "HELP1", "HELP2" } }, + quitsounds, + 2, + "FLOOR7_2", + &DoomBorder +}; + +gameinfo_t RetailGameInfo = +{ + GI_MENUHACK_RETAIL | GI_NOCRAZYDEATH, + "TITLEPIC", + "CREDIT", + "CREDIT", + "D_INTRO", + 5, + 0, + 200/35, + "misc/chat2", + "D_VICTOR", + "FLOOR4_8", + "CREDIT", + "VICTORY2", + "ENDPIC", + { { "HELP1", "CREDIT" } }, + quitsounds, + 2, + "FLOOR7_2", + &DoomBorder +}; + +gameinfo_t CommercialGameInfo = +{ + 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" } }, + quitsounds2, + 3, + "GRNROCK", + &DoomBorder +}; diff --git a/code/gi.h b/code/gi.h new file mode 100644 index 0000000000..f04bf5b1ca --- /dev/null +++ b/code/gi.h @@ -0,0 +1,64 @@ +#ifndef __GI_H__ +#define __GI_H__ + +#include "doomtype.h" + +#define GI_MAPxx 0x00000001 +#define GI_PAGESARERAW 0x00000002 +#define GI_SHAREWARE 0x00000004 +#define GI_NOLOOPFINALEMUSIC 0x00000008 +#define GI_INFOINDEXED 0x00000010 +#define GI_MENUHACK 0x00000060 +#define GI_MENUHACK_RETAIL 0x00000020 +#define GI_MENUHACK_EXTENDED 0x00000040 // (Heretic) +#define GI_MENUHACK_COMMERCIAL 0x00000060 +#define GI_NOCRAZYDEATH 0x00000080 + +typedef struct +{ + byte offset; + byte size; + char tl[8]; + char t[8]; + char tr[8]; + char l[8]; + char r[8]; + char bl[8]; + char b[8]; + char br[8]; +} gameborder_t; + +typedef struct +{ + int flags; + char titlePage[8]; + char creditPage1[8]; + char creditPage2[8]; + char titleMusic[8]; + float titleTime; + float advisoryTime; + float pageTime; + char chatSound[16]; + char finaleMusic[8]; + char finaleFlat[8]; + char finalePage1[8]; + char finalePage2[8]; + char finalePage3[8]; + union + { + char infoPage[2][8]; + struct + { + char basePage[8]; + int numPages; + } indexed; + } info; + char **quitSounds; + int maxSwitch; + char borderFlat[8]; + gameborder_t *border; +} gameinfo_t; + +extern gameinfo_t gameinfo; + +#endif //__GI_H__ \ No newline at end of file diff --git a/code/hexninfo.lmp b/code/hexninfo.lmp new file mode 100644 index 0000000000..c6176599ab --- /dev/null +++ b/code/hexninfo.lmp @@ -0,0 +1,6963 @@ +// This file describes the state definitions and info declarations used for +// Hexen. The format of this file is based on the format used by the original +// multigen with modifications to suit the way things are done internally by +// ZDoom. +// +//============================================================================ +// If the first two characters of a line are S_, it is a state definition +// line. Otherwise, it is part of an info declaration. +// +//============================================================================ +// state data is: +// +// statename sprite frame tics action nextstate [optional1] [optional2] +// a * after the frame letter causes full bright +// +//============================================================================ +// An info definition is: +// +// $ MOBJNAME +// field data +// +// if MOBJNAME is +, a new unique name will be generated +// if fieldname starts with str_, it will be made a char * instead of an int +//============================================================================ + +// +// info default MUST be first in file +// + +$ DEFAULT +doomednum -1 //number to spawn this object +spawnstate S_NULL // +spawnhealth 1000 // +seestate S_NULL //when player sighted or enemy shot +seesound "" //also launch sound for missiles +reactiontime 8 //wait time before attacking +attacksound "" // +painstate S_NULL // +painchance 0 //out of 256 +painsound "" // +meleestate S_NULL // +missilestate S_NULL // +crashstate S_NULL // +deathstate S_NULL //also explodestate for missiles +xdeathstate S_NULL //when knocked to -spawnhelath or lower +deathsound "" //also explosion sound for missiles +speed 0 // +radius 20 // +height 16 // +mass 100 // +damage 0 //missile damage in d8s +activesound "" // +flags 0 // +flags2 0 //Heretic/Hexen flags +raisestate S_NULL //vile resurection state +translucency 1 //0=invisible, 1=opaque + + +// when a state cycles to S_NULL, the actor will be removed + +S_NULL MAN1 A -1 NULL S_NULL + +S_FREETARGMOBJ ACLO D 1050 A_FreeTargMobj S_NULL + +// +// map spots +// + +$ MT_MAPSPOT +doomednum 9001 +spawnstate S_MAPSPOT +flags MF_NOBLOCKMAP|MF_NOSECTOR|MF_NOGRAVITY + +$ MT_MAPSPOTGRAVITY +doomednum 9013 +spawnstate S_MAPSPOT +flags2 MF2_DONTDRAW + +S_MAPSPOT TLGL A -1 NULL S_NULL + +// +// traps +// + +$ MT_FIREBALL1 +spawnstate S_FIREBALL1_1 +deathstate S_FIREBALL1_X1 +deathsound Fireball +speed 2 +radius 8 +height 8 +damage 4 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_NOTELEPORT|MF2_FIREDAMAGE + +S_FIREBALL1_1 FBL1 A* 4 NULL S_FIREBALL1_2 +S_FIREBALL1_2 FBL1 B* 4 NULL S_FIREBALL1_1 + +S_FIREBALL1_X1 XPL1 A* 4 NULL S_FIREBALL1_X2 +S_FIREBALL1_X2 XPL1 B* 4 NULL S_FIREBALL1_X3 +S_FIREBALL1_X3 XPL1 C* 4 NULL S_FIREBALL1_X4 +S_FIREBALL1_X4 XPL1 D* 4 NULL S_FIREBALL1_X5 +S_FIREBALL1_X5 XPL1 E* 4 NULL S_FIREBALL1_X6 +S_FIREBALL1_X6 XPL1 F* 4 NULL S_NULL + +$ MT_ARROW +spawnstate S_ARROW_1 +deathstate S_ARROW_X1 +speed 6 +radius 8 +height 4 +damage 4 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_NOTELEPORT + +S_ARROW_1 ARRW A -1 NULL S_NULL + +S_ARROW_X1 ARRW A 1 NULL S_NULL + +$ MT_DART +spawnstate S_DART_1 +deathstate S_DART_X1 +speed 6 +radius 8 +height 4 +damage 2 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_NOTELEPORT + +S_DART_1 DART A -1 NULL S_NULL + +S_DART_X1 DART A 1 NULL S_NULL + +$ MT_POISONDART +spawnstate S_POISONDART_1 +deathstate S_POISONDART_X1 +speed 6 +radius 8 +height 4 +damage 2 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_NOTELEPORT + +S_POISONDART_1 DART A -1 NULL S_NULL + +S_POISONDART_X1 DART A 1 NULL S_NULL + +$ MT_RIPPERBALL +spawnstate S_RIPPERBALL_1 +deathstate S_RIPPERBALL_X1 +speed 6 +radius 8 +height 16 +damage 2 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_NOTELEPORT|MF2_RIP + +S_RIPPERBALL_1 RIPP A 3 NULL S_RIPPERBALL_2 +S_RIPPERBALL_2 RIPP B 3 NULL S_RIPPERBALL_3 +S_RIPPERBALL_3 RIPP C 3 NULL S_RIPPERBALL_1 + +S_RIPPERBALL_X1 CFCF Q* 4 NULL S_RIPPERBALL_X2 +S_RIPPERBALL_X2 CFCF R* 3 NULL S_RIPPERBALL_X3 +S_RIPPERBALL_X3 CFCF S* 4 NULL S_RIPPERBALL_X4 +S_RIPPERBALL_X4 CFCF T* 3 NULL S_RIPPERBALL_X5 +S_RIPPERBALL_X5 CFCF U* 4 NULL S_RIPPERBALL_X6 +S_RIPPERBALL_X6 CFCF V* 3 NULL S_RIPPERBALL_X7 +S_RIPPERBALL_X7 CFCF W* 4 NULL S_RIPPERBALL_X8 +S_RIPPERBALL_X8 CFCF X* 3 NULL S_RIPPERBALL_X9 +S_RIPPERBALL_X9 CFCF Y* 4 NULL S_RIPPERBALL_X10 +S_RIPPERBALL_X10 CFCF Z* 3 NULL S_NULL + +$ MT_PROJECTILE_BLADE +spawnstate S_PRJ_BLADE1 +deathstate S_PRJ_BLADE_X1 +speed 6 +radius 6 +height 6 +damage 3 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_NOTELEPORT + +S_PRJ_BLADE1 BLAD A -1 NULL S_NULL + +S_PRJ_BLADE_X1 BLAD A 1 NULL S_NULL + +$ MT_ICESHARD +spawnstate S_ICESHARD1 +deathstate S_SHARDFXE1_1 +deathsound MageShardsExplode +speed 25 +radius 13 +height 8 +damage 1 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_NOTELEPORT|MF2_ICEDAMAGE + +S_ICESHARD1 SHRD A* 3 NULL S_ICESHARD2 +S_ICESHARD2 SHRD B* 3 NULL S_ICESHARD3 +S_ICESHARD3 SHRD C* 3 NULL S_ICESHARD1 + +// +// fires of many shapes and sizes +// + +$ MT_FLAME_SMALL_TEMP +doomednum 10500 +spawnstate S_FLAME_TSMALL1 +flags2 MF2_NOTELEPORT + +S_FLAME_TSMALL1 FFSM A* 3 NULL S_FLAME_TSMALL2 +S_FLAME_TSMALL2 FFSM B* 3 NULL S_FLAME_TSMALL3 +S_FLAME_TSMALL3 FFSM C* 2 A_FlameCheck S_FLAME_TSMALL4 +S_FLAME_TSMALL4 FFSM C* 2 NULL S_FLAME_TSMALL5 +S_FLAME_TSMALL5 FFSM D* 3 NULL S_FLAME_TSMALL6 +S_FLAME_TSMALL6 FFSM E* 3 A_FlameCheck S_FLAME_TSMALL1 + +$ MT_FLAME_LARGE_TEMP +doomednum 10502 +spawnstate S_FLAME_TLARGE1 +flags2 MF2_NOTELEPORT + +S_FLAME_TLARGE1 FFLG A* 4 NULL S_FLAME_TLARGE2 +S_FLAME_TLARGE2 FFLG B* 4 A_FlameCheck S_FLAME_TLARGE3 +S_FLAME_TLARGE3 FFLG C* 4 NULL S_FLAME_TLARGE4 +S_FLAME_TLARGE4 FFLG D* 4 A_FlameCheck S_FLAME_TLARGE5 +S_FLAME_TLARGE5 FFLG E* 4 NULL S_FLAME_TLARGE6 +S_FLAME_TLARGE6 FFLG F* 4 A_FlameCheck S_FLAME_TLARGE7 +S_FLAME_TLARGE7 FFLG G* 4 NULL S_FLAME_TLARGE8 +S_FLAME_TLARGE8 FFLG H* 4 A_FlameCheck S_FLAME_TLARGE9 +S_FLAME_TLARGE9 FFLG I* 4 NULL S_FLAME_TLARGE10 +S_FLAME_TLARGE10 FFLG J* 4 A_FlameCheck S_FLAME_TLARGE11 +S_FLAME_TLARGE11 FFLG K* 4 NULL S_FLAME_TLARGE12 +S_FLAME_TLARGE12 FFLG L* 4 A_FlameCheck S_FLAME_TLARGE13 +S_FLAME_TLARGE13 FFLG M* 4 NULL S_FLAME_TLARGE14 +S_FLAME_TLARGE14 FFLG N* 4 A_FlameCheck S_FLAME_TLARGE15 +S_FLAME_TLARGE15 FFLG O* 4 NULL S_FLAME_TLARGE16 +S_FLAME_TLARGE16 FFLG P* 4 A_FlameCheck S_FLAME_TLARGE5 + +$ MT_FLAME_SMALL +doomednum 10501 +spawnstate S_FLAME_SMALL1 +flags2 MF2_NOTELEPORT|MF2_DONTDRAW + +// The small flame enters state S_FLAME_SDORM1 when deactivated +S_FLAME_SDORM1 FFSM A 2 NULL S_FLAME_SDORM2 +S_FLAME_SDORM2 FFSM B 2 A_HideThing S_FLAME_SDORM3 +S_FLAME_SDORM3 FFSM C 200 NULL S_FLAME_SDORM3 + +S_FLAME_SMALL1 FFSM A* 3 NULL S_FLAME_SMALL2 +S_FLAME_SMALL2 FFSM A* 3 A_UnHideThing S_FLAME_SMALL3 +S_FLAME_SMALL3 FFSM A* 3 NULL S_FLAME_SMALL4 +S_FLAME_SMALL4 FFSM B* 3 NULL S_FLAME_SMALL5 +S_FLAME_SMALL5 FFSM C* 3 NULL S_FLAME_SMALL6 +S_FLAME_SMALL6 FFSM D* 3 NULL S_FLAME_SMALL7 +S_FLAME_SMALL7 FFSM E* 3 NULL S_FLAME_SMALL3 + +$ MT_FLAME_LARGE +doomednum 10503 +spawnstate S_FLAME_LARGE1 +flags2 MF2_NOTELEPORT|MF2_DONTDRAW + +// S_FLAME_LDORM1 is entered when the large frame is deactivated +S_FLAME_LDORM1 FFLG D 2 NULL S_FLAME_LDORM2 +S_FLAME_LDORM2 FFLG C 2 NULL S_FLAME_LDORM3 +S_FLAME_LDORM3 FFLG B 2 NULL S_FLAME_LDORM4 +S_FLAME_LDORM4 FFLG A 2 A_HideThing S_FLAME_LDORM5 +S_FLAME_LDORM5 FFLG A 200 NULL S_FLAME_LDORM5 + +S_FLAME_LARGE1 FFLG A* 2 NULL S_FLAME_LARGE2 +S_FLAME_LARGE2 FFLG A* 2 A_UnHideThing S_FLAME_LARGE3 +S_FLAME_LARGE3 FFLG A* 4 NULL S_FLAME_LARGE4 +S_FLAME_LARGE4 FFLG B* 4 NULL S_FLAME_LARGE5 +S_FLAME_LARGE5 FFLG C* 4 NULL S_FLAME_LARGE6 +S_FLAME_LARGE6 FFLG D* 4 NULL S_FLAME_LARGE7 +S_FLAME_LARGE7 FFLG E* 4 NULL S_FLAME_LARGE8 +S_FLAME_LARGE8 FFLG F* 4 NULL S_FLAME_LARGE9 +S_FLAME_LARGE9 FFLG G* 4 NULL S_FLAME_LARGE10 +S_FLAME_LARGE10 FFLG H* 4 NULL S_FLAME_LARGE11 +S_FLAME_LARGE11 FFLG I* 4 NULL S_FLAME_LARGE12 +S_FLAME_LARGE12 FFLG J* 4 NULL S_FLAME_LARGE13 +S_FLAME_LARGE13 FFLG K* 4 NULL S_FLAME_LARGE14 +S_FLAME_LARGE14 FFLG L* 4 NULL S_FLAME_LARGE15 +S_FLAME_LARGE15 FFLG M* 4 NULL S_FLAME_LARGE16 +S_FLAME_LARGE16 FFLG N* 4 NULL S_FLAME_LARGE17 +S_FLAME_LARGE17 FFLG O* 4 NULL S_FLAME_LARGE18 +S_FLAME_LARGE18 FFLG P* 4 NULL S_FLAME_LARGE7 + +// +// items / artifacts +// + +$ MT_HEALINGBOTTLE +doomednum 81 +spawnstate S_ITEM_PTN1_1 +flags MF_SPECIAL +flags2 MF2_FLOATBOB + +S_ITEM_PTN1_1 PTN1 A 3 NULL S_ITEM_PTN1_2 +S_ITEM_PTN1_2 PTN1 B 3 NULL S_ITEM_PTN1_3 +S_ITEM_PTN1_3 PTN1 C 3 NULL S_ITEM_PTN1_1 + +// When an item is picked up and should later respawn, Hexen hides it and +// puts it into the S_HIDESPECIAL1 state. A_RestoreSpecialThing1 makes it +// visible again as an effect, and A_RestoreSpecialThing2 puts it back +// in its spawnstate. + +S_HIDESPECIAL1 ACLO E 1400 NULL S_HIDESPECIAL2 +S_HIDESPECIAL2 ACLO A 4 A_RestoreSpecialThing1 S_HIDESPECIAL3 +S_HIDESPECIAL3 ACLO B 4 NULL S_HIDESPECIAL4 +S_HIDESPECIAL4 ACLO A 4 NULL S_HIDESPECIAL5 +S_HIDESPECIAL5 ACLO B 4 NULL S_HIDESPECIAL6 +S_HIDESPECIAL6 ACLO C 4 NULL S_HIDESPECIAL7 +S_HIDESPECIAL7 ACLO B 4 NULL S_HIDESPECIAL8 +S_HIDESPECIAL8 ACLO C 4 NULL S_HIDESPECIAL9 +S_HIDESPECIAL9 ACLO D 4 NULL S_HIDESPECIAL10 +S_HIDESPECIAL10 ACLO C 4 NULL S_HIDESPECIAL11 +S_HIDESPECIAL11 ACLO D 4 A_RestoreSpecialThing2 S_NULL + +// Dormant artifacts are artifacts that have been picked up in a deathmatch +// game and will later respawn. Which state is used depends on the artifact: +// +// summon maulator, flight => S_DORMANTARTI2_1 +// invulnerability => S_DORMANTARTI3_1 +// everything else => S_DORMANTARTI1_1 +// +// If the artifact should not respawn, then it enters the S_DEADARTI1 state +// instead. It just plays the pickup animation and then removes the mobj. + +S_DORMANTARTI1_1 ACLO D 3 NULL S_DORMANTARTI1_2 +S_DORMANTARTI1_2 ACLO C 3 NULL S_DORMANTARTI1_3 +S_DORMANTARTI1_3 ACLO D 3 NULL S_DORMANTARTI1_4 +S_DORMANTARTI1_4 ACLO C 3 NULL S_DORMANTARTI1_5 +S_DORMANTARTI1_5 ACLO B 3 NULL S_DORMANTARTI1_6 +S_DORMANTARTI1_6 ACLO C 3 NULL S_DORMANTARTI1_7 +S_DORMANTARTI1_7 ACLO B 3 NULL S_DORMANTARTI1_8 +S_DORMANTARTI1_8 ACLO A 3 NULL S_DORMANTARTI1_9 +S_DORMANTARTI1_9 ACLO B 3 NULL S_DORMANTARTI1_10 +S_DORMANTARTI1_10 ACLO A 3 NULL S_DORMANTARTI1_11 +S_DORMANTARTI1_11 ACLO A 1400 A_HideThing S_DORMANTARTI1_12 +S_DORMANTARTI1_12 ACLO A 3 A_UnHideThing S_DORMANTARTI1_13 +S_DORMANTARTI1_13 ACLO B 3 NULL S_DORMANTARTI1_14 +S_DORMANTARTI1_14 ACLO A 3 NULL S_DORMANTARTI1_15 +S_DORMANTARTI1_15 ACLO B 3 NULL S_DORMANTARTI1_16 +S_DORMANTARTI1_16 ACLO C 3 NULL S_DORMANTARTI1_17 +S_DORMANTARTI1_17 ACLO B 3 NULL S_DORMANTARTI1_18 +S_DORMANTARTI1_18 ACLO C 3 NULL S_DORMANTARTI1_19 +S_DORMANTARTI1_19 ACLO D 3 NULL S_DORMANTARTI1_20 +S_DORMANTARTI1_20 ACLO C 3 NULL S_DORMANTARTI1_21 +S_DORMANTARTI1_21 ACLO D 3 A_RestoreArtifact S_NULL + +S_DORMANTARTI2_1 ACLO D 3 NULL S_DORMANTARTI2_2 +S_DORMANTARTI2_2 ACLO C 3 NULL S_DORMANTARTI2_3 +S_DORMANTARTI2_3 ACLO D 3 NULL S_DORMANTARTI2_4 +S_DORMANTARTI2_4 ACLO C 3 NULL S_DORMANTARTI2_5 +S_DORMANTARTI2_5 ACLO B 3 NULL S_DORMANTARTI2_6 +S_DORMANTARTI2_6 ACLO C 3 NULL S_DORMANTARTI2_7 +S_DORMANTARTI2_7 ACLO B 3 NULL S_DORMANTARTI2_8 +S_DORMANTARTI2_8 ACLO A 3 NULL S_DORMANTARTI2_9 +S_DORMANTARTI2_9 ACLO B 3 NULL S_DORMANTARTI2_10 +S_DORMANTARTI2_10 ACLO A 3 NULL S_DORMANTARTI2_11 +S_DORMANTARTI2_11 ACLO A 4200 A_HideThing S_DORMANTARTI2_12 +S_DORMANTARTI2_12 ACLO A 3 A_UnHideThing S_DORMANTARTI2_13 +S_DORMANTARTI2_13 ACLO B 3 NULL S_DORMANTARTI2_14 +S_DORMANTARTI2_14 ACLO A 3 NULL S_DORMANTARTI2_15 +S_DORMANTARTI2_15 ACLO B 3 NULL S_DORMANTARTI2_16 +S_DORMANTARTI2_16 ACLO C 3 NULL S_DORMANTARTI2_17 +S_DORMANTARTI2_17 ACLO B 3 NULL S_DORMANTARTI2_18 +S_DORMANTARTI2_18 ACLO C 3 NULL S_DORMANTARTI2_19 +S_DORMANTARTI2_19 ACLO D 3 NULL S_DORMANTARTI2_20 +S_DORMANTARTI2_20 ACLO C 3 NULL S_DORMANTARTI2_21 +S_DORMANTARTI2_21 ACLO D 3 A_RestoreArtifact S_NULL + +S_DORMANTARTI3_1 ACLO D 3 NULL S_DORMANTARTI3_2 +S_DORMANTARTI3_2 ACLO C 3 NULL S_DORMANTARTI3_3 +S_DORMANTARTI3_3 ACLO D 3 NULL S_DORMANTARTI3_4 +S_DORMANTARTI3_4 ACLO C 3 NULL S_DORMANTARTI3_5 +S_DORMANTARTI3_5 ACLO B 3 NULL S_DORMANTARTI3_6 +S_DORMANTARTI3_6 ACLO C 3 NULL S_DORMANTARTI3_7 +S_DORMANTARTI3_7 ACLO B 3 NULL S_DORMANTARTI3_8 +S_DORMANTARTI3_8 ACLO A 3 NULL S_DORMANTARTI3_9 +S_DORMANTARTI3_9 ACLO B 3 NULL S_DORMANTARTI3_10 +S_DORMANTARTI3_10 ACLO A 3 NULL S_DORMANTARTI3_11 +S_DORMANTARTI3_11 ACLO A 21000 A_HideThing S_DORMANTARTI3_12 +S_DORMANTARTI3_12 ACLO A 3 A_UnHideThing S_DORMANTARTI3_13 +S_DORMANTARTI3_13 ACLO B 3 NULL S_DORMANTARTI3_14 +S_DORMANTARTI3_14 ACLO A 3 NULL S_DORMANTARTI3_15 +S_DORMANTARTI3_15 ACLO B 3 NULL S_DORMANTARTI3_16 +S_DORMANTARTI3_16 ACLO C 3 NULL S_DORMANTARTI3_17 +S_DORMANTARTI3_17 ACLO B 3 NULL S_DORMANTARTI3_18 +S_DORMANTARTI3_18 ACLO C 3 NULL S_DORMANTARTI3_19 +S_DORMANTARTI3_19 ACLO D 3 NULL S_DORMANTARTI3_20 +S_DORMANTARTI3_20 ACLO C 3 NULL S_DORMANTARTI3_21 +S_DORMANTARTI3_21 ACLO D 3 A_RestoreArtifact S_NULL + +S_DEADARTI1 ACLO D 3 NULL S_DEADARTI2 +S_DEADARTI2 ACLO C 3 NULL S_DEADARTI3 +S_DEADARTI3 ACLO D 3 NULL S_DEADARTI4 +S_DEADARTI4 ACLO C 3 NULL S_DEADARTI5 +S_DEADARTI5 ACLO B 3 NULL S_DEADARTI6 +S_DEADARTI6 ACLO C 3 NULL S_DEADARTI7 +S_DEADARTI7 ACLO B 3 NULL S_DEADARTI8 +S_DEADARTI8 ACLO A 3 NULL S_DEADARTI9 +S_DEADARTI9 ACLO B 3 NULL S_DEADARTI10 +S_DEADARTI10 ACLO A 3 NULL S_NULL + +$ MT_HEALTHFLASK +doomednum 82 +spawnstate S_ARTI_PTN2_1 +flags MF_SPECIAL +flags2 MF2_FLOATBOB + +S_ARTI_PTN2_1 PTN2 A 4 NULL S_ARTI_PTN2_2 +S_ARTI_PTN2_2 PTN2 B 4 NULL S_ARTI_PTN2_3 +S_ARTI_PTN2_3 PTN2 C 4 NULL S_ARTI_PTN2_1 + +$MT_ARTIFLY +doomednum 83 +spawnstate S_ARTI_SOAR1 +flags MF_SPECIAL +flags2 MF2_FLOATBOB + +S_ARTI_SOAR1 SOAR A 5 NULL S_ARTI_SOAR2 +S_ARTI_SOAR2 SOAR B 5 NULL S_ARTI_SOAR3 +S_ARTI_SOAR3 SOAR C 5 NULL S_ARTI_SOAR4 +S_ARTI_SOAR4 SOAR B 5 NULL S_ARTI_SOAR1 + +$MT_ARTIINVULNERABILITY +doomednum 84 +spawnstate S_ARTI_INVU1 +flags MF_SPECIAL +flags2 MF2_FLOATBOB + +S_ARTI_INVU1 INVU A 3 NULL S_ARTI_INVU2 +S_ARTI_INVU2 INVU B 3 NULL S_ARTI_INVU3 +S_ARTI_INVU3 INVU C 3 NULL S_ARTI_INVU4 +S_ARTI_INVU4 INVU D 3 NULL S_ARTI_INVU1 + +$MT_SUMMONMAULATOR +doomednum 86 +spawnstate S_ARTI_SUMMON +flags MF_SPECIAL +flags2 MF2_FLOATBOB + +S_ARTI_SUMMON SUMN A 350 NULL S_ARTI_SUMMON + +$MT_SUMMON_FX +spawnstate S_SUMMON_FX1_1 +deathstate S_SUMMON_FX2_1 +speed 20 +flags MF_MISSILE|MF_DROPOFF|MF_NOBLOCKMAP +flags2 MF2_NOTELEPORT + +S_SUMMON_FX1_1 SUMN A 4 NULL S_SUMMON_FX1_1 +S_SUMMON_FX2_1 SUMN A 4 NULL S_SUMMON_FX2_2 +S_SUMMON_FX2_2 SUMN A 4 NULL S_SUMMON_FX2_3 +S_SUMMON_FX2_3 SUMN A 4 A_Summon S_NULL + +// +// thrust floor (spike) things +// + +$MT_THRUSTFLOOR_UP +doomednum 10091 +spawnstate S_THRUSTINIT2_1 +height 128 +flags MF_SOLID +flags2 MF2_NOTELEPORT|MF2_FLOORCLIP + +// up +S_THRUSTINIT2_1 TSPK A 3 NULL S_THRUSTINIT2_2 +S_THRUSTINIT2_2 TSPK A 4 A_ThrustInitUp S_THRUSTBLOCK + +// bloody, up +S_BTHRUSTINIT2_1 TSPK B 3 NULL S_BTHRUSTINIT2_2 +S_BTHRUSTINIT2_2 TSPK B 4 A_ThrustInitUp S_BTHRUSTBLOCK + +$ MT_THRUSTFLOOR_DOWN +doomednum 10090 +spawnstate S_THRUSTINIT1_1 +height 128 +flags2 MF2_NOTELEPORT|MF2_FLOORCLIP|MF2_DONTDRAW + +// down +S_THRUSTINIT1_1 TSPK A 3 NULL S_THRUSTINIT1_2 +S_THRUSTINIT1_2 TSPK A 4 A_ThrustInitDn S_THRUSTSTAY + +// down, bloody +S_BTHRUSTINIT1_1 TSPK B 3 NULL S_BTHRUSTINIT1_2 +S_BTHRUSTINIT1_2 TSPK B 4 A_ThrustInitDn S_BTHRUSTSTAY + +// activated; moving up +S_THRUSTRAISE1 TSPK A 8 A_ThrustRaise S_THRUSTRAISE2 +S_THRUSTRAISE2 TSPK A 6 A_ThrustRaise S_THRUSTRAISE3 +S_THRUSTRAISE3 TSPK A 4 A_ThrustRaise S_THRUSTRAISE4 +S_THRUSTRAISE4 TSPK A 3 A_ThrustBlock S_THRUSTIMPALE + +// activated; moving up, bloody +S_BTHRUSTRAISE1 TSPK B 8 A_ThrustRaise S_BTHRUSTRAISE2 +S_BTHRUSTRAISE2 TSPK B 6 A_ThrustRaise S_BTHRUSTRAISE3 +S_BTHRUSTRAISE3 TSPK B 4 A_ThrustRaise S_BTHRUSTRAISE4 +S_BTHRUSTRAISE4 TSPK B 3 A_ThrustBlock S_BTHRUSTIMPALE + +// kill anything in the way. makes the spike bloody if necessary +S_THRUSTIMPALE TSPK A 2 A_ThrustImpale S_THRUSTRAISE +S_BTHRUSTIMPALE TSPK B 2 A_ThrustImpale S_BTHRUSTRAISE + +// raise some more +S_THRUSTRAISE TSPK A 2 A_ThrustRaise S_THRUSTRAISE +S_BTHRUSTRAISE TSPK B 2 A_ThrustRaise S_BTHRUSTRAISE + +// become blocking +S_THRUSTBLOCK TSPK A 10 NULL S_THRUSTBLOCK +S_BTHRUSTBLOCK TSPK B 10 NULL S_BTHRUSTBLOCK + +// go back down +S_THRUSTLOWER TSPK A 2 A_ThrustLower S_THRUSTLOWER +S_BTHRUSTLOWER TSPK B 2 A_ThrustLower S_BTHRUSTLOWER + +// wait for another activation +S_THRUSTSTAY TSPK A -1 NULL S_THRUSTSTAY +S_BTHRUSTSTAY TSPK B -1 NULL S_BTHRUSTSTAY + +// +// banishment device +// + +$ MT_TELEPORTOTHER +doomednum 10040 +spawnstate S_ARTI_TELOTHER1 +flags MF_SPECIAL +flags2 MF2_FLOATBOB + +$ MT_TELOTHER_FX1 +spawnstate S_TELO_FX1 +deathstate S_TELO_FX9 +speed 20 +radius 16 +damage 10001 +flags MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY|MF_NOBLOCKMAP +flags2 MF2_NOTELEPORT + +// These other effects are spawned by MT_TELOTHER_FX1 to create the +// consentric circles when a thing is teleported. + +$ MT_TELOTHER_FX2 +spawnstate S_TELO_FX2_1 +deathstate S_TELO_FX9 +speed 16 +radius 16 +damage 10001 +flags MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY|MF_NOBLOCKMAP +flags2 MF2_NOTELEPORT + +$ MT_TELOTHER_FX3 +spawnstate S_TELO_FX3_1 +deathstate S_TELO_FX9 +speed 16 +radius 16 +damage 10001 +flags MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY|MF_NOBLOCKMAP +flags2 MF2_NOTELEPORT + +$ MT_TELOTHER_FX4 +spawnstate S_TELO_FX4_1 +deathstate S_TELO_FX9 +speed 16 +radius 16 +damage 10001 +flags MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY|MF_NOBLOCKMAP +flags2 MF2_NOTELEPORT + +$ MT_TELOTHER_FX5 +spawnstate S_TELO_FX5_1 +deathstate S_TELO_FX9 +speed 16 +radius 16 +damage 10001 +flags MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY|MF_NOBLOCKMAP +flags2 MF2_NOTELEPORT + +S_ARTI_TELOTHER1 TELO A 5 NULL S_ARTI_TELOTHER2 +S_ARTI_TELOTHER2 TELO B 5 NULL S_ARTI_TELOTHER3 +S_ARTI_TELOTHER3 TELO C 5 NULL S_ARTI_TELOTHER4 +S_ARTI_TELOTHER4 TELO D 5 NULL S_ARTI_TELOTHER1 + +S_TELO_FX1 TRNG E* 5 NULL S_TELO_FX2 +S_TELO_FX2 TRNG D* 4 NULL S_TELO_FX3 +S_TELO_FX3 TRNG C* 3 A_TeloSpawnC S_TELO_FX4 +S_TELO_FX4 TRNG B* 3 A_TeloSpawnB S_TELO_FX5 +S_TELO_FX5 TRNG A* 3 A_TeloSpawnA S_TELO_FX6 +S_TELO_FX6 TRNG B* 3 A_TeloSpawnB S_TELO_FX7 +S_TELO_FX7 TRNG C* 3 A_TeloSpawnC S_TELO_FX8 +S_TELO_FX8 TRNG D* 3 A_TeloSpawnD S_TELO_FX3 +S_TELO_FX9 TRNG E* 3 NULL S_NULL + +S_TELO_FX2_1 TRNG B* 4 NULL S_TELO_FX2_2 +S_TELO_FX2_2 TRNG C* 4 NULL S_TELO_FX2_3 +S_TELO_FX2_3 TRNG D* 4 NULL S_TELO_FX2_4 +S_TELO_FX2_4 TRNG C* 4 NULL S_TELO_FX2_5 +S_TELO_FX2_5 TRNG B* 4 NULL S_TELO_FX2_6 +S_TELO_FX2_6 TRNG A* 4 A_CheckTeleRing S_TELO_FX2_1 + +S_TELO_FX3_1 TRNG C* 4 NULL S_TELO_FX3_2 +S_TELO_FX3_2 TRNG D* 4 NULL S_TELO_FX3_3 +S_TELO_FX3_3 TRNG C* 4 NULL S_TELO_FX3_4 +S_TELO_FX3_4 TRNG B* 4 NULL S_TELO_FX3_5 +S_TELO_FX3_5 TRNG A* 4 NULL S_TELO_FX3_6 +S_TELO_FX3_6 TRNG B* 4 A_CheckTeleRing S_TELO_FX3_1 + +S_TELO_FX4_1 TRNG D* 4 NULL S_TELO_FX4_2 +S_TELO_FX4_2 TRNG C* 4 NULL S_TELO_FX4_3 +S_TELO_FX4_3 TRNG B* 4 NULL S_TELO_FX4_4 +S_TELO_FX4_4 TRNG A* 4 NULL S_TELO_FX4_5 +S_TELO_FX4_5 TRNG B* 4 NULL S_TELO_FX4_6 +S_TELO_FX4_6 TRNG C* 4 A_CheckTeleRing S_TELO_FX4_1 + +S_TELO_FX5_1 TRNG C* 4 NULL S_TELO_FX5_2 +S_TELO_FX5_2 TRNG B* 4 NULL S_TELO_FX5_3 +S_TELO_FX5_3 TRNG A* 4 NULL S_TELO_FX5_4 +S_TELO_FX5_4 TRNG B* 4 NULL S_TELO_FX5_5 +S_TELO_FX5_5 TRNG C* 4 NULL S_TELO_FX5_6 +S_TELO_FX5_6 TRNG D* 4 A_CheckTeleRing S_TELO_FX5_1 + +// +// dirt +// + +$ MT_DIRT1 +spawnstate S_DIRT1_1 +deathstate S_DIRT1_D +flags MF_NOBLOCKMAP|MF_DROPOFF|MF_MISSILE +flags2 MF2_NOTELEPORT + +S_DIRT1_1 ROCK D 20 NULL S_DIRT1_1 +S_DIRT1_D ROCK D 10 NULL S_NULL + +$ MT_DIRT2 +spawnstate S_DIRT2_1 +deathstate S_DIRT2_D +flags MF_NOBLOCKMAP|MF_DROPOFF|MF_MISSILE +flags2 MF2_NOTELEPORT + +S_DIRT2_1 ROCK E 20 NULL S_DIRT2_1 +S_DIRT2_D ROCK E 10 NULL S_NULL + +$ MT_DIRT3 +spawnstate S_DIRT3_1 +deathstate S_DIRT3_D +flags MF_NOBLOCKMAP|MF_DROPOFF|MF_MISSILE +flags2 MF2_NOTELEPORT + +S_DIRT3_1 ROCK F 20 NULL S_DIRT3_1 +S_DIRT3_D ROCK F 10 NULL S_NULL + +$ MT_DIRT4 +spawnstate S_DIRT4_1 +deathstate S_DIRT4_D +flags MF_NOBLOCKMAP|MF_DROPOFF|MF_MISSILE +flags2 MF2_NOTELEPORT|MF2_LOGRAV + +S_DIRT4_1 ROCK G 20 NULL S_DIRT4_1 +S_DIRT4_D ROCK G 10 NULL S_NULL + +$ MT_DIRT5 +spawnstate S_DIRT5_1 +deathstate S_DIRT5_D +flags MF_NOBLOCKMAP|MF_DROPOFF|MF_MISSILE +flags2 MF2_NOTELEPORT|MF2_LOGRAV + +S_DIRT5_1 ROCK H 20 NULL S_DIRT5_1 +S_DIRT5_D ROCK H 10 NULL S_NULL + +$ MT_DIRT6 +spawnstate S_DIRT6_1 +deathstate S_DIRT6_D +flags MF_NOBLOCKMAP|MF_DROPOFF|MF_MISSILE +flags2 MF2_NOTELEPORT|MF2_LOGRAV + +S_DIRT6_1 ROCK I 20 NULL S_DIRT6_1 +S_DIRT6_D ROCK I 10 NULL S_NULL + +$ MT_DIRTCLUMP +spawnstate S_DIRTCLUMP1 +flags MF_NOBLOCKMAP +flags2 MF2_NOTELEPORT + +S_DIRTCLUMP1 TSPK C 20 NULL S_DIRTCLUMP1 + +// +// rocks +// + +$ MT_ROCK1 +spawnstate S_ROCK1_1 +deathstate S_ROCK1_D +flags MF_NOBLOCKMAP|MF_DROPOFF|MF_MISSILE +flags2 MF2_NOTELEPORT + +S_ROCK1_1 ROCK A 20 NULL S_ROCK1_1 +S_ROCK1_D ROCK A 10 NULL S_NULL + +$ MT_ROCK2 +spawnstate S_ROCK2_1 +deathstate S_ROCK2_D +flags MF_NOBLOCKMAP|MF_DROPOFF|MF_MISSILE +flags2 MF2_NOTELEPORT + +S_ROCK2_1 ROCK B 20 NULL S_ROCK2_1 +S_ROCK2_D ROCK B 10 NULL S_NULL + +$ MT_ROCK3 +spawnstate S_ROCK3_1 +deathstate S_ROCK3_D +flags MF_NOBLOCKMAP|MF_DROPOFF|MF_MISSILE +flags2 MF2_NOTELEPORT + +S_ROCK3_1 ROCK C 20 NULL S_ROCK3_1 +S_ROCK3_D ROCK C 10 NULL S_NULL + +// +// fog +// + +$ MT_FOGSPAWNER +doomednum 10000 +spawnstate S_SPAWNFOG1 +flags MF_NOBLOCKMAP|MF_NOSECTOR +flags2 MF2_DONTDRAW|MF2_FLOATBOB + +$ MT_FOGPATCHS +doomednum 10001 +spawnstate S_FOGPATCHS1 +deathstate S_FOGPATCHS0 +flags MF_NOBLOCKMAP|MF_FLOAT|MF_NOGRAVITY|MF_NOCLIP +flags2 MF2_NOTELEPORT +translucency 0.33 + +$ MT_FOGPATCHM +doomednum 10002 +spawnstate S_FOGPATCHM1 +deathstate S_FOGPATCHM0 +flags MF_NOBLOCKMAP|MF_FLOAT|MF_NOGRAVITY|MF_NOCLIP +flags2 MF2_NOTELEPORT +translucency 0.33 + +$ MT_FOGPATCHL +doomednum 10003 +spawnstate S_FOGPATCHL1 +deathstate S_FOGPATCHL0 +flags MF_NOBLOCKMAP|MF_FLOAT|MF_NOGRAVITY|MF_NOCLIP +flags2 MF2_NOTELEPORT +translucency 0.33 + + +S_SPAWNFOG1 MAN1 A 20 A_FogSpawn S_SPAWNFOG1 + +S_FOGPATCHS1 FOGS A 7 A_FogMove S_FOGPATCHS2 +S_FOGPATCHS2 FOGS B 7 A_FogMove S_FOGPATCHS3 +S_FOGPATCHS3 FOGS C 7 A_FogMove S_FOGPATCHS4 +S_FOGPATCHS4 FOGS D 7 A_FogMove S_FOGPATCHS5 +S_FOGPATCHS5 FOGS E 7 A_FogMove S_FOGPATCHS1 + +S_FOGPATCHS0 FOGS E 5 NULL S_NULL + +S_FOGPATCHM1 FOGM A 7 A_FogMove S_FOGPATCHM2 +S_FOGPATCHM2 FOGM B 7 A_FogMove S_FOGPATCHM3 +S_FOGPATCHM3 FOGM C 7 A_FogMove S_FOGPATCHM4 +S_FOGPATCHM4 FOGM D 7 A_FogMove S_FOGPATCHM5 +S_FOGPATCHM5 FOGM E 7 A_FogMove S_FOGPATCHM1 + +S_FOGPATCHM0 FOGS A 5 NULL S_FOGPATCHMA +S_FOGPATCHMA FOGS B 5 NULL S_FOGPATCHMB +S_FOGPATCHMB FOGS C 5 NULL S_FOGPATCHMC +S_FOGPATCHMC FOGS D 5 NULL S_FOGPATCHMD +S_FOGPATCHMD FOGS E 5 NULL S_FOGPATCHS0 + +S_FOGPATCHL1 FOGL A 7 A_FogMove S_FOGPATCHL2 +S_FOGPATCHL2 FOGL B 7 A_FogMove S_FOGPATCHL3 +S_FOGPATCHL3 FOGL C 7 A_FogMove S_FOGPATCHL4 +S_FOGPATCHL4 FOGL D 7 A_FogMove S_FOGPATCHL5 +S_FOGPATCHL5 FOGL E 7 A_FogMove S_FOGPATCHL1 + +S_FOGPATCHL0 FOGM A 4 NULL S_FOGPATCHLA +S_FOGPATCHLA FOGM B 4 NULL S_FOGPATCHLB +S_FOGPATCHLB FOGM C 4 NULL S_FOGPATCHLC +S_FOGPATCHLC FOGM D 4 NULL S_FOGPATCHLD +S_FOGPATCHLD FOGM E 4 NULL S_FOGPATCHM0 + +// +// earthquake +// + +$ MT_QUAKE_FOCUS +spawnstate S_QUAKE_ACTIVE1 +flags MF_NOBLOCKMAP|MF_NOSECTOR +flags2 MF2_DONTDRAW + +S_QUAKE_ACTIVE1 MAN1 A 2 A_Quake S_QUAKE_ACTIVE2 +S_QUAKE_ACTIVE2 MAN1 A 1 A_ContMobjSound S_QUAKE_ACTIVE3 +S_QUAKE_ACTIVE3 MAN1 A 2 A_Quake S_QUAKE_ACTIVE4 +S_QUAKE_ACTIVE4 MAN1 A 2 A_Quake S_QUAKE_ACTIVE5 +S_QUAKE_ACTIVE5 MAN1 A 2 A_Quake S_QUAKE_ACTIVE6 +S_QUAKE_ACTIVE6 MAN1 A 2 A_Quake S_QUAKE_ACTIVE7 +S_QUAKE_ACTIVE7 MAN1 A 2 A_Quake S_QUAKE_ACTIVE8 +S_QUAKE_ACTIVE8 MAN1 A 2 A_Quake S_QUAKE_ACTIVE9 +S_QUAKE_ACTIVE9 MAN1 A 2 A_Quake S_QUAKE_ACTIVE0 +S_QUAKE_ACTIVE0 MAN1 A 2 A_Quake S_QUAKE_ACTIVEA +S_QUAKE_ACTIVEA MAN1 A 2 A_Quake S_QUAKE_ACTIVEB +S_QUAKE_ACTIVEB MAN1 A 2 A_Quake S_QUAKE_ACTIVEC +S_QUAKE_ACTIVEC MAN1 A 2 A_Quake S_QUAKE_ACTIVED +S_QUAKE_ACTIVED MAN1 A 2 A_Quake S_QUAKE_ACTIVEE +S_QUAKE_ACTIVEE MAN1 A 2 A_Quake S_QUAKE_ACTIVEF +S_QUAKE_ACTIVEF MAN1 A 2 A_Quake S_QUAKE_ACTIVEG +S_QUAKE_ACTIVEG MAN1 A 2 A_Quake S_QUAKE_ACTIVEH +S_QUAKE_ACTIVEH MAN1 A 2 A_Quake S_QUAKE_ACTIVEI +S_QUAKE_ACTIVEI MAN1 A 2 A_Quake S_QUAKE_ACTIVEJ +S_QUAKE_ACTIVEJ MAN1 A 2 A_Quake S_QUAKE_ACTIVEK +S_QUAKE_ACTIVEK MAN1 A 2 A_Quake S_QUAKE_ACTIVEL +S_QUAKE_ACTIVEL MAN1 A 2 A_Quake S_QUAKE_ACTIVEM +S_QUAKE_ACTIVEM MAN1 A 2 A_Quake S_QUAKE_ACTIVEN +S_QUAKE_ACTIVEN MAN1 A 2 A_Quake S_QUAKE_ACTIVEO +S_QUAKE_ACTIVEO MAN1 A 2 A_Quake S_QUAKE_ACTIVEP +S_QUAKE_ACTIVEP MAN1 A 2 A_Quake S_QUAKE_ACTIVEQ +S_QUAKE_ACTIVEQ MAN1 A 2 A_Quake S_QUAKE_ACTIVER +S_QUAKE_ACTIVER MAN1 A 2 A_Quake S_QUAKE_ACTIVES +S_QUAKE_ACTIVES MAN1 A 2 A_Quake S_QUAKE_ACTIVET +S_QUAKE_ACTIVET MAN1 A 2 A_Quake S_QUAKE_ACTIVEU +S_QUAKE_ACTIVEU MAN1 A 2 A_Quake S_QUAKE_ACTIVEV +S_QUAKE_ACTIVEV MAN1 A 2 A_Quake S_QUAKE_ACTIVEW +S_QUAKE_ACTIVEW MAN1 A 2 A_Quake S_QUAKE_ACTIVEX +S_QUAKE_ACTIVEX MAN1 A 2 A_Quake S_QUAKE_ACTIVEY +S_QUAKE_ACTIVEY MAN1 A 2 A_Quake S_QUAKE_ACTIVEZ +S_QUAKE_ACTIVEZ MAN1 A 2 A_Quake S_QUAKE_ACT1 +S_QUAKE_ACT1 MAN1 A 2 A_Quake S_QUAKE_ACT2 +S_QUAKE_ACT2 MAN1 A 2 A_Quake S_QUAKE_ACT3 +S_QUAKE_ACT3 MAN1 A 2 A_Quake S_QUAKE_ACT4 +S_QUAKE_ACT4 MAN1 A 2 A_Quake S_QUAKE_ACT5 +S_QUAKE_ACT5 MAN1 A 2 A_Quake S_QUAKE_ACT6 +S_QUAKE_ACT6 MAN1 A 2 A_Quake S_QUAKE_ACT7 +S_QUAKE_ACT7 MAN1 A 2 A_Quake S_QUAKE_ACT8 +S_QUAKE_ACT8 MAN1 A 2 A_Quake S_QUAKE_ACT9 +S_QUAKE_ACT9 MAN1 A 2 A_Quake S_QUAKE_ACT0 +S_QUAKE_ACT0 MAN1 A 2 A_Quake S_QUAKE_ACTIVE1 + +// +// stained glass +// + +$ MT_SGSHARD1 +spawnstate S_SGSHARD1_1 +deathstate S_SGSHARD1_D +radius 5 +height 16 +mass 5 +flags MF_NOBLOCKMAP|MF_DROPOFF|MF_MISSILE|MF_NOGRAVITY +flags2 MF2_NOTELEPORT|MF2_FLOORBOUNCE + +$ MT_SGSHARD2 +spawnstate S_SGSHARD2_1 +deathstate S_SGSHARD2_D +radius 5 +height 16 +mass 5 +flags MF_NOBLOCKMAP|MF_DROPOFF|MF_MISSILE|MF_NOGRAVITY +flags2 MF2_NOTELEPORT|MF2_FLOORBOUNCE + +$ MT_SGSHARD3 +spawnstate S_SGSHARD3_1 +deathstate S_SGSHARD3_D +radius 5 +height 16 +mass 5 +flags MF_NOBLOCKMAP|MF_DROPOFF|MF_MISSILE|MF_NOGRAVITY +flags2 MF2_NOTELEPORT|MF2_FLOORBOUNCE + +$ MT_SGSHARD4 +spawnstate S_SGSHARD4_1 +deathstate S_SGSHARD4_D +radius 5 +height 16 +mass 5 +flags MF_NOBLOCKMAP|MF_DROPOFF|MF_MISSILE|MF_NOGRAVITY +flags2 MF2_NOTELEPORT|MF2_FLOORBOUNCE + +$ MT_SGSHARD5 +spawnstate S_SGSHARD5_1 +deathstate S_SGSHARD5_D +radius 5 +height 16 +mass 5 +flags MF_NOBLOCKMAP|MF_DROPOFF|MF_MISSILE|MF_NOGRAVITY +flags2 MF2_NOTELEPORT|MF2_FLOORBOUNCE + +$ MT_SGSHARD6 +spawnstate S_SGSHARD6_1 +deathstate S_SGSHARD6_D +radius 5 +height 16 +mass 5 +flags MF_NOBLOCKMAP|MF_DROPOFF|MF_MISSILE|MF_NOGRAVITY +flags2 MF2_NOTELEPORT|MF2_FLOORBOUNCE + +$ MT_SGSHARD7 +spawnstate S_SGSHARD7_1 +deathstate S_SGSHARD7_D +radius 5 +height 16 +mass 5 +flags MF_NOBLOCKMAP|MF_DROPOFF|MF_MISSILE|MF_NOGRAVITY +flags2 MF2_NOTELEPORT|MF2_FLOORBOUNCE + +$ MT_SGSHARD8 +spawnstate S_SGSHARD8_1 +deathstate S_SGSHARD8_D +radius 5 +height 16 +mass 5 +flags MF_NOBLOCKMAP|MF_DROPOFF|MF_MISSILE|MF_NOGRAVITY +flags2 MF2_NOTELEPORT|MF2_FLOORBOUNCE + +$ MT_SGSHARD9 +spawnstate S_SGSHARD9_1 +deathstate S_SGSHARD9_D +radius 5 +height 16 +mass 5 +flags MF_NOBLOCKMAP|MF_DROPOFF|MF_MISSILE|MF_NOGRAVITY +flags2 MF2_NOTELEPORT|MF2_FLOORBOUNCE + +$ MT_SGSHARD0 +spawnstate S_SGSHARD0_1 +deathstate S_SGSHARD0_D +radius 5 +height 16 +mass 5 +flags MF_NOBLOCKMAP|MF_DROPOFF|MF_MISSILE|MF_NOGRAVITY +flags2 MF2_NOTELEPORT|MF2_FLOORBOUNCE + + +S_SGSHARD1_1 SGSA A 4 NULL S_SGSHARD1_2 +S_SGSHARD1_2 SGSA B 4 NULL S_SGSHARD1_3 +S_SGSHARD1_3 SGSA C 4 NULL S_SGSHARD1_4 +S_SGSHARD1_4 SGSA D 4 NULL S_SGSHARD1_5 +S_SGSHARD1_5 SGSA E 4 NULL S_SGSHARD1_1 + +S_SGSHARD1_D SGSA E 30 NULL S_NULL + +S_SGSHARD2_1 SGSA F 4 NULL S_SGSHARD2_2 +S_SGSHARD2_2 SGSA G 4 NULL S_SGSHARD2_3 +S_SGSHARD2_3 SGSA H 4 NULL S_SGSHARD2_4 +S_SGSHARD2_4 SGSA I 4 NULL S_SGSHARD2_5 +S_SGSHARD2_5 SGSA J 4 NULL S_SGSHARD2_1 + +S_SGSHARD2_D SGSA J 30 NULL S_NULL + +S_SGSHARD3_1 SGSA K 4 NULL S_SGSHARD3_2 +S_SGSHARD3_2 SGSA L 4 NULL S_SGSHARD3_3 +S_SGSHARD3_3 SGSA M 4 NULL S_SGSHARD3_4 +S_SGSHARD3_4 SGSA N 4 NULL S_SGSHARD3_5 +S_SGSHARD3_5 SGSA O 4 NULL S_SGSHARD3_1 + +S_SGSHARD3_D SGSA O 30 NULL S_NULL + +S_SGSHARD4_1 SGSA P 4 NULL S_SGSHARD4_2 +S_SGSHARD4_2 SGSA Q 4 NULL S_SGSHARD4_3 +S_SGSHARD4_3 SGSA R 4 NULL S_SGSHARD4_4 +S_SGSHARD4_4 SGSA S 4 NULL S_SGSHARD4_5 +S_SGSHARD4_5 SGSA T 4 NULL S_SGSHARD4_1 + +S_SGSHARD4_D SGSA T 30 NULL S_NULL + +S_SGSHARD5_1 SGSA U 4 NULL S_SGSHARD5_2 +S_SGSHARD5_2 SGSA V 4 NULL S_SGSHARD5_3 +S_SGSHARD5_3 SGSA W 4 NULL S_SGSHARD5_4 +S_SGSHARD5_4 SGSA X 4 NULL S_SGSHARD5_5 +S_SGSHARD5_5 SGSA Y 4 NULL S_SGSHARD5_1 + +S_SGSHARD5_D SGSA Y 30 NULL S_NULL + +S_SGSHARD6_1 SGSB A 4 NULL S_SGSHARD6_1 +S_SGSHARD6_D SGSB A 30 NULL S_NULL + +S_SGSHARD7_1 SGSB B 4 NULL S_SGSHARD7_1 +S_SGSHARD7_D SGSB B 30 NULL S_NULL + +S_SGSHARD8_1 SGSB C 4 NULL S_SGSHARD8_1 +S_SGSHARD8_D SGSB C 30 NULL S_NULL + +S_SGSHARD9_1 SGSB D 4 NULL S_SGSHARD9_1 +S_SGSHARD9_D SGSB D 30 NULL S_NULL + +S_SGSHARD0_1 SGSB E 4 NULL S_SGSHARD0_1 +S_SGSHARD0_D SGSB E 30 NULL S_NULL + +// +// porkalator +// + +$ MT_ARTIEGG +doomednum 30 +spawnstate S_ARTI_EGGC1 +flags MF_SPECIAL +flags2 MF2_FLOATBOB + +$ MT_EGGFX +spawnstate S_EGGFX1 +deathstate S_EGGFXI1_1 +speed 18 +radius 8 +height 8 +damage 1 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_NOTELEPORT + + +S_ARTI_EGGC1 PORK A 5 NULL S_ARTI_EGGC2 +S_ARTI_EGGC2 PORK B 5 NULL S_ARTI_EGGC3 +S_ARTI_EGGC3 PORK C 5 NULL S_ARTI_EGGC4 +S_ARTI_EGGC4 PORK D 5 NULL S_ARTI_EGGC5 +S_ARTI_EGGC5 PORK E 5 NULL S_ARTI_EGGC6 +S_ARTI_EGGC6 PORK F 5 NULL S_ARTI_EGGC7 +S_ARTI_EGGC7 PORK G 5 NULL S_ARTI_EGGC8 +S_ARTI_EGGC8 PORK H 5 NULL S_ARTI_EGGC1 + +S_EGGFX1 EGGM A 4 NULL S_EGGFX2 +S_EGGFX2 EGGM B 4 NULL S_EGGFX3 +S_EGGFX3 EGGM C 4 NULL S_EGGFX4 +S_EGGFX4 EGGM D 4 NULL S_EGGFX5 +S_EGGFX5 EGGM E 4 NULL S_EGGFX1 + +S_EGGFXI1_1 FHFX I* 3 NULL S_EGGFXI1_2 +S_EGGFXI1_2 FHFX J* 3 NULL S_EGGFXI1_3 +S_EGGFXI1_3 FHFX K* 3 NULL S_EGGFXI1_4 +S_EGGFXI1_4 FHFX L* 3 NULL S_NULL + +// +// super health +// + +$ MT_ARTISUPERHEAL +doomednum 32 +spawnstate S_ARTI_SPHL1 +flags MF_SPECIAL +flags2 MF2_FLOATBOB + +S_ARTI_SPHL1 SPHL A 350 NULL S_ARTI_SPHL1 + +// +// winged statue (headless) +// + +$ MT_ZWINGEDSTATUENOSKULL +doomednum 9011 +spawnstate S_ZWINGEDSTATUENOSKULL +radius 10 +height 62 +flags MF_SOLID + +S_ZWINGEDSTATUENOSKULL STWN A -1 NULL S_NULL +S_ZWINGEDSTATUENOSKULL2 STWN B -1 NULL S_NULL + +// gem pedestal + +$ MT_ZGEMPEDESTAL +doomednum 9012 +spawnstate S_ZGEMPEDESTAL1 +radius 10 +height 40 +flags MF_SOLID + +S_ZGEMPEDESTAL1 GMPD A -1 NULL S_NULL +S_ZGEMPEDESTAL2 GMPD B -1 NULL S_NULL + +// +// puzzle items +// + +$ MT_ARTIPUZZSKULL +doomednum 9002 +spawnstate S_ARTIPUZZSKULL +flags MF_SPECIAL|MF_NOGRAVITY + +S_ARTIPUZZSKULL ASKU A -1 NULL S_NULL + +$ MT_ARTIPUZZGEMBIG +doomednum 9003 +spawnstate S_ARTIPUZZGEMBIG +flags MF_SPECIAL|MF_NOGRAVITY + +$ MT_ARTIPUZZGEMRED +doomednum 9004 +spawnstate S_ARTIPUZZGEMRED +flags MF_SPECIAL|MF_NOGRAVITY + +$ MT_ARTIPUZZGEMGREEN1 +doomednum 9005 +spawnstate S_ARTIPUZZGEMGREEN1 +flags MF_SPECIAL|MF_NOGRAVITY + +$ MT_ARTIPUZZGEMGREEN2 +doomednum 9009 +spawnstate S_ARTIPUZZGEMGREEN2 +flags MF_SPECIAL|MF_NOGRAVITY + +$ MT_ARTIPUZZGEMBLUE1 +doomednum 9006 +spawnstate S_ARTIPUZZGEMBLUE1 +flags MF_SPECIAL|MF_NOGRAVITY + +$ MT_ARTIPUZZGEMBLUE2 +doomednum 9010 +spawnstate S_ARTIPUZZGEMBLUE2 +flags MF_SPECIAL|MF_NOGRAVITY + + +S_ARTIPUZZGEMBIG ABGM A -1 NULL S_NULL + +S_ARTIPUZZGEMRED AGMR A -1 NULL S_NULL + +S_ARTIPUZZGEMGREEN1 AGMG A -1 NULL S_NULL + +S_ARTIPUZZGEMGREEN2 AGG2 A -1 NULL S_NULL + +S_ARTIPUZZGEMBLUE1 AGMB A -1 NULL S_NULL + +S_ARTIPUZZGEMBLUE2 AGB2 A -1 NULL S_NULL + + +$ MT_ARTIPUZZBOOK1 +doomednum 9007 +spawnstate S_ARTIPUZZBOOK1 +flags MF_SPECIAL|MF_NOGRAVITY + +$ MT_ARTIPUZZBOOK2 +doomednum 9008 +spawnstate S_ARTIPUZZBOOK2 +flags MF_SPECIAL|MF_NOGRAVITY + + +S_ARTIPUZZBOOK1 ABK1 A -1 NULL S_NULL + +S_ARTIPUZZBOOK2 ABK2 A -1 NULL S_NULL + + +$ MT_ARTIPUZZSKULL2 +doomednum 9014 +spawnstate S_ARTIPUZZSKULL2 +flags MF_SPECIAL|MF_NOGRAVITY + +S_ARTIPUZZSKULL2 ASK2 A -1 NULL S_NULL + + +$ MT_ARTIPUZZFWEAPON +doomednum 9015 +spawnstate S_ARTIPUZZFWEAPON +flags MF_SPECIAL|MF_NOGRAVITY + +$ MT_ARTIPUZZCWEAPON +doomednum 9016 +spawnstate S_ARTIPUZZCWEAPON +flags MF_SPECIAL|MF_NOGRAVITY + +$ MT_ARTIPUZZMWEAPON +doomednum 9017 +spawnstate S_ARTIPUZZMWEAPON +flags MF_SPECIAL|MF_NOGRAVITY + +S_ARTIPUZZFWEAPON AFWP A -1 NULL S_NULL + +S_ARTIPUZZCWEAPON ACWP A -1 NULL S_NULL + +S_ARTIPUZZMWEAPON AMWP A -1 NULL S_NULL + + +$ MT_ARTIPUZZGEAR +doomednum 9018 +spawnstate S_ARTIPUZZGEAR_1 +flags MF_SPECIAL|MF_NOGRAVITY + +$ MT_ARTIPUZZGEAR2 +doomednum 9019 +spawnstate S_ARTIPUZZGEAR2_1 +flags MF_SPECIAL|MF_NOGRAVITY + +$ MT_ARTIPUZZGEAR3 +doomednum 9020 +spawnstate S_ARTIPUZZGEAR3_1 +flags MF_SPECIAL|MF_NOGRAVITY + +$ MT_ARTIPUZZGEAR4 +doomednum 9021 +spawnstate S_ARTIPUZZGEAR4_1 +flags MF_SPECIAL|MF_NOGRAVITY + + +S_ARTIPUZZGEAR_1 AGER A* 4 NULL S_ARTIPUZZGEAR_2 +S_ARTIPUZZGEAR_2 AGER B* 4 NULL S_ARTIPUZZGEAR_3 +S_ARTIPUZZGEAR_3 AGER C* 4 NULL S_ARTIPUZZGEAR_4 +S_ARTIPUZZGEAR_4 AGER D* 4 NULL S_ARTIPUZZGEAR_5 +S_ARTIPUZZGEAR_5 AGER E* 4 NULL S_ARTIPUZZGEAR_6 +S_ARTIPUZZGEAR_6 AGER F* 4 NULL S_ARTIPUZZGEAR_7 +S_ARTIPUZZGEAR_7 AGER G* 4 NULL S_ARTIPUZZGEAR_8 +S_ARTIPUZZGEAR_8 AGER H* 4 NULL S_ARTIPUZZGEAR_1 + +S_ARTIPUZZGEAR2_1 AGR2 A* 4 NULL S_ARTIPUZZGEAR2_2 +S_ARTIPUZZGEAR2_2 AGR2 B* 4 NULL S_ARTIPUZZGEAR2_3 +S_ARTIPUZZGEAR2_3 AGR2 C* 4 NULL S_ARTIPUZZGEAR2_4 +S_ARTIPUZZGEAR2_4 AGR2 D* 4 NULL S_ARTIPUZZGEAR2_5 +S_ARTIPUZZGEAR2_5 AGR2 E* 4 NULL S_ARTIPUZZGEAR2_6 +S_ARTIPUZZGEAR2_6 AGR2 F* 4 NULL S_ARTIPUZZGEAR2_7 +S_ARTIPUZZGEAR2_7 AGR2 G* 4 NULL S_ARTIPUZZGEAR2_8 +S_ARTIPUZZGEAR2_8 AGR2 H* 4 NULL S_ARTIPUZZGEAR2_1 + +S_ARTIPUZZGEAR3_1 AGR3 A* 4 NULL S_ARTIPUZZGEAR3_2 +S_ARTIPUZZGEAR3_2 AGR3 B* 4 NULL S_ARTIPUZZGEAR3_3 +S_ARTIPUZZGEAR3_3 AGR3 C* 4 NULL S_ARTIPUZZGEAR3_4 +S_ARTIPUZZGEAR3_4 AGR3 D* 4 NULL S_ARTIPUZZGEAR3_5 +S_ARTIPUZZGEAR3_5 AGR3 E* 4 NULL S_ARTIPUZZGEAR3_6 +S_ARTIPUZZGEAR3_6 AGR3 F* 4 NULL S_ARTIPUZZGEAR3_7 +S_ARTIPUZZGEAR3_7 AGR3 G* 4 NULL S_ARTIPUZZGEAR3_8 +S_ARTIPUZZGEAR3_8 AGR3 H* 4 NULL S_ARTIPUZZGEAR3_1 + +S_ARTIPUZZGEAR4_1 AGR4 A* 4 NULL S_ARTIPUZZGEAR4_2 +S_ARTIPUZZGEAR4_2 AGR4 B* 4 NULL S_ARTIPUZZGEAR4_3 +S_ARTIPUZZGEAR4_3 AGR4 C* 4 NULL S_ARTIPUZZGEAR4_4 +S_ARTIPUZZGEAR4_4 AGR4 D* 4 NULL S_ARTIPUZZGEAR4_5 +S_ARTIPUZZGEAR4_5 AGR4 E* 4 NULL S_ARTIPUZZGEAR4_6 +S_ARTIPUZZGEAR4_6 AGR4 F* 4 NULL S_ARTIPUZZGEAR4_7 +S_ARTIPUZZGEAR4_7 AGR4 G* 4 NULL S_ARTIPUZZGEAR4_8 +S_ARTIPUZZGEAR4_8 AGR4 H* 4 NULL S_ARTIPUZZGEAR4_1 + + +// +// more artifacts (not puzzle pieces) +// + +$ MT_ARTITORCH +doomednum 33 +spawnstate S_ARTI_TRCH1 +flags MF_SPECIAL +flags2 MF2_FLOATBOB + +S_ARTI_TRCH1 TRCH A* 3 NULL S_ARTI_TRCH2 +S_ARTI_TRCH2 TRCH B* 3 NULL S_ARTI_TRCH3 +S_ARTI_TRCH3 TRCH C* 3 NULL S_ARTI_TRCH1 + + +// A fire bomb is produced when a mage uses a flechette +$ MT_FIREBOMB +spawnstate S_FIREBOMB1 +deathsound FlechetteExplode +flags MF_NOGRAVITY +flags2 MF2_FIREDAMAGE +translucency 0.66 + +S_FIREBOMB1 PSBG A 20 NULL S_FIREBOMB2 +S_FIREBOMB2 PSBG A 10 NULL S_FIREBOMB3 +S_FIREBOMB3 PSBG A 10 NULL S_FIREBOMB4 +S_FIREBOMB4 PSBG B 4 NULL S_FIREBOMB5 +S_FIREBOMB5 PSBG C 4 A_Scream S_FIREBOMB6 +S_FIREBOMB6 XPL1 A* 4 A_Explode S_FIREBOMB7 +S_FIREBOMB7 XPL1 B* 4 NULL S_FIREBOMB8 +S_FIREBOMB8 XPL1 C* 4 NULL S_FIREBOMB9 +S_FIREBOMB9 XPL1 D* 4 NULL S_FIREBOMB10 +S_FIREBOMB10 XPL1 E* 4 NULL S_FIREBOMB11 +S_FIREBOMB11 XPL1 F* 4 NULL S_NULL + + +$ MT_ARTITELEPORT +doomednum 36 +spawnstate S_ARTI_ATLP1 +flags MF_SPECIAL +flags2 MF2_FLOATBOB + +S_ARTI_ATLP1 ATLP A 4 NULL S_ARTI_ATLP2 +S_ARTI_ATLP2 ATLP B 4 NULL S_ARTI_ATLP3 +S_ARTI_ATLP3 ATLP C 4 NULL S_ARTI_ATLP4 +S_ARTI_ATLP4 ATLP B 4 NULL S_ARTI_ATLP1 + + +$ MT_ARTIPOISONBAG +doomednum 8000 +spawnstate S_ARTI_PSBG1 +flags MF_SPECIAL +flags2 MF2_FLOATBOB + +S_ARTI_PSBG1 PSBG A -1 NULL S_NULL + + +$ MT_POISONBAG +spawnstate S_POISONBAG1 +radius 5 +height 5 +flags MF_NOGRAVITY|MF_NOBLOCKMAP + +$ MT_POISONCLOUD +spawnstate S_POISONCLOUD1 +deathsound PoisonShroomDeath +radius 1 +height 1 +mass 0x7fffffff +flags MF_NOGRAVITY|MF_NOBLOCKMAP|MF_NOCLIP|MF_DROPOFF +flags2 MF2_NODMGTHRUST +translucency 0.33 + +S_POISONBAG1 PSBG A* 18 NULL S_POISONBAG2 +S_POISONBAG2 PSBG B* 4 NULL S_POISONBAG3 +S_POISONBAG3 PSBG C 3 NULL S_POISONBAG4 +S_POISONBAG4 PSBG C 1 A_PoisonBagInit S_NULL + +S_POISONCLOUD1 PSBG D 1 NULL S_POISONCLOUD2 +S_POISONCLOUD2 PSBG D 1 A_Scream S_POISONCLOUD3 +S_POISONCLOUD3 PSBG D 2 A_PoisonBagDamage S_POISONCLOUD4 +S_POISONCLOUD4 PSBG E 2 A_PoisonBagDamage S_POISONCLOUD5 +S_POISONCLOUD5 PSBG E 2 A_PoisonBagDamage S_POISONCLOUD6 +S_POISONCLOUD6 PSBG E 2 A_PoisonBagDamage S_POISONCLOUD7 +S_POISONCLOUD7 PSBG F 2 A_PoisonBagDamage S_POISONCLOUD8 +S_POISONCLOUD8 PSBG F 2 A_PoisonBagDamage S_POISONCLOUD9 +S_POISONCLOUD9 PSBG F 2 A_PoisonBagDamage S_POISONCLOUD10 +S_POISONCLOUD10 PSBG G 2 A_PoisonBagDamage S_POISONCLOUD11 +S_POISONCLOUD11 PSBG G 2 A_PoisonBagDamage S_POISONCLOUD12 +S_POISONCLOUD12 PSBG G 2 A_PoisonBagDamage S_POISONCLOUD13 +S_POISONCLOUD13 PSBG H 2 A_PoisonBagDamage S_POISONCLOUD14 +S_POISONCLOUD14 PSBG H 2 A_PoisonBagDamage S_POISONCLOUD15 +S_POISONCLOUD15 PSBG H 2 A_PoisonBagDamage S_POISONCLOUD16 +S_POISONCLOUD16 PSBG I 2 A_PoisonBagDamage S_POISONCLOUD17 +S_POISONCLOUD17 PSBG I 1 A_PoisonBagDamage S_POISONCLOUD18 +S_POISONCLOUD18 PSBG I 1 A_PoisonBagCheck S_POISONCLOUD4 + +S_POISONCLOUD_X1 PSBG H 7 NULL S_POISONCLOUD_X2 +S_POISONCLOUD_X2 PSBG G 7 NULL S_POISONCLOUD_X3 +S_POISONCLOUD_X3 PSBG F 6 NULL S_POISONCLOUD_X4 +S_POISONCLOUD_X4 PSBG D 6 NULL S_NULL + + +$ MT_THROWINGBOMB +spawnstate S_THROWINGBOMB1 +deathstate S_THROWINGBOMB_X1 +seesound FlechetteBounce +deathsound FlechetteExplode +spawnhealth 48 +speed 12 +radius 8 +height 10 +flags MF_NOBLOCKMAP|MF_DROPOFF|MF_MISSILE +flags2 MF2_FLOORBOUNCE|MF2_FIREDAMAGE + +S_THROWINGBOMB1 THRW A 4 A_CheckThrowBomb S_THROWINGBOMB2 +S_THROWINGBOMB2 THRW B 3 A_CheckThrowBomb S_THROWINGBOMB3 +S_THROWINGBOMB3 THRW C 3 A_CheckThrowBomb S_THROWINGBOMB4 +S_THROWINGBOMB4 THRW D 3 A_CheckThrowBomb S_THROWINGBOMB5 +S_THROWINGBOMB5 THRW E 3 A_CheckThrowBomb S_THROWINGBOMB6 +S_THROWINGBOMB6 THRW F 3 A_CheckThrowBomb S_THROWINGBOMB1 +S_THROWINGBOMB7 THRW G 6 A_CheckThrowBomb S_THROWINGBOMB8 +S_THROWINGBOMB8 THRW F 4 A_CheckThrowBomb S_THROWINGBOMB9 +S_THROWINGBOMB9 THRW H 6 A_CheckThrowBomb S_THROWINGBOMB10 +S_THROWINGBOMB10 THRW F 4 A_CheckThrowBomb S_THROWINGBOMB11 +S_THROWINGBOMB11 THRW G 6 A_CheckThrowBomb S_THROWINGBOMB12 +S_THROWINGBOMB12 THRW F 3 A_CheckThrowBomb S_THROWINGBOMB12 + +S_THROWINGBOMB_X1 CFCF Q* 4 A_NoGravity S_THROWINGBOMB_X2 +S_THROWINGBOMB_X2 CFCF R* 3 A_Scream S_THROWINGBOMB_X3 +S_THROWINGBOMB_X3 CFCF S* 4 A_Explode S_THROWINGBOMB_X4 +S_THROWINGBOMB_X4 CFCF T* 3 NULL S_THROWINGBOMB_X5 +S_THROWINGBOMB_X5 CFCF U* 4 NULL S_THROWINGBOMB_X6 +S_THROWINGBOMB_X6 CFCF W* 3 NULL S_THROWINGBOMB_X7 +S_THROWINGBOMB_X7 CFCF X* 4 NULL S_THROWINGBOMB_X8 +S_THROWINGBOMB_X8 CFCF Z* 3 NULL S_NULL + + +$ MT_SPEEDBOOTS +doomednum 8002 +spawnstate S_ARTI_BOOTS1 +flags MF_SPECIAL +flags2 MF2_FLOATBOB + +S_ARTI_BOOTS1 SPED A* 3 NULL S_ARTI_BOOTS2 +S_ARTI_BOOTS2 SPED B* 3 NULL S_ARTI_BOOTS3 +S_ARTI_BOOTS3 SPED C* 3 NULL S_ARTI_BOOTS4 +S_ARTI_BOOTS4 SPED D* 3 NULL S_ARTI_BOOTS5 +S_ARTI_BOOTS5 SPED E* 3 NULL S_ARTI_BOOTS6 +S_ARTI_BOOTS6 SPED F* 3 NULL S_ARTI_BOOTS7 +S_ARTI_BOOTS7 SPED G* 3 NULL S_ARTI_BOOTS8 +S_ARTI_BOOTS8 SPED H* 3 NULL S_ARTI_BOOTS1 + + +$ MT_BOOSTMANA +doomednum 8003 +spawnstate S_ARTI_MANA +flags MF_SPECIAL +flags2 MF2_FLOATBOB + +S_ARTI_MANA BMAN A* -1 NULL S_NULL + + +$ MT_BOOSTARMOR +doomednum 8041 +spawnstate S_ARTI_ARMOR1 +flags MF_SPECIAL +flags2 MF2_FLOATBOB + +S_ARTI_ARMOR1 BRAC A* 4 NULL S_ARTI_ARMOR2 +S_ARTI_ARMOR2 BRAC B* 4 NULL S_ARTI_ARMOR3 +S_ARTI_ARMOR3 BRAC C* 4 NULL S_ARTI_ARMOR4 +S_ARTI_ARMOR4 BRAC D* 4 NULL S_ARTI_ARMOR5 +S_ARTI_ARMOR5 BRAC E* 4 NULL S_ARTI_ARMOR6 +S_ARTI_ARMOR6 BRAC F* 4 NULL S_ARTI_ARMOR7 +S_ARTI_ARMOR7 BRAC G* 4 NULL S_ARTI_ARMOR8 +S_ARTI_ARMOR8 BRAC H* 4 NULL S_ARTI_ARMOR1 + + +$ MT_BLASTRADIUS +doomednum 10110 +spawnstate S_ARTI_BLAST1 +flags MF_SPECIAL +flags2 MF2_FLOATBOB + +S_ARTI_BLAST1 BLST A* 4 NULL S_ARTI_BLAST2 +S_ARTI_BLAST2 BLST B* 4 NULL S_ARTI_BLAST3 +S_ARTI_BLAST3 BLST C* 4 NULL S_ARTI_BLAST4 +S_ARTI_BLAST4 BLST D* 4 NULL S_ARTI_BLAST5 +S_ARTI_BLAST5 BLST E* 4 NULL S_ARTI_BLAST6 +S_ARTI_BLAST6 BLST F* 4 NULL S_ARTI_BLAST7 +S_ARTI_BLAST7 BLST G* 4 NULL S_ARTI_BLAST8 +S_ARTI_BLAST8 BLST H* 4 NULL S_ARTI_BLAST1 + + +$ MT_HEALRADIUS +doomednum 10120 +spawnstate S_ARTI_HEALRAD1 +flags MF_SPECIAL +flags2 MF2_FLOATBOB + +S_ARTI_HEALRAD1 HRAD A* 4 NULL S_ARTI_HEALRAD2 +S_ARTI_HEALRAD2 HRAD B* 4 NULL S_ARTI_HEALRAD3 +S_ARTI_HEALRAD3 HRAD C* 4 NULL S_ARTI_HEALRAD4 +S_ARTI_HEALRAD4 HRAD D* 4 NULL S_ARTI_HEALRAD5 +S_ARTI_HEALRAD5 HRAD E* 4 NULL S_ARTI_HEALRAD6 +S_ARTI_HEALRAD6 HRAD F* 4 NULL S_ARTI_HEALRAD7 +S_ARTI_HEALRAD7 HRAD G* 4 NULL S_ARTI_HEALRAD8 +S_ARTI_HEALRAD8 HRAD H* 4 NULL S_ARTI_HEALRAD9 +S_ARTI_HEALRAD9 HRAD I* 4 NULL S_ARTI_HEALRAD0 +S_ARTI_HEALRAD0 HRAD J* 4 NULL S_ARTI_HEALRADA +S_ARTI_HEALRADA HRAD K* 4 NULL S_ARTI_HEALRADB +S_ARTI_HEALRADB HRAD L* 4 NULL S_ARTI_HEALRADC +S_ARTI_HEALRADC HRAD M* 4 NULL S_ARTI_HEALRADD +S_ARTI_HEALRADD HRAD N* 4 NULL S_ARTI_HEALRADE +S_ARTI_HEALRADE HRAD O* 4 NULL S_ARTI_HEALRADF +S_ARTI_HEALRADF HRAD P* 4 NULL S_ARTI_HEALRAD1 + +// +// environment effects +// + +$ MT_SPLASH +spawnstate S_SPLASH1 +deathstatk S_SPLASHX +radius 2 +height 4 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF +flags2 MF2_NOTELEPORT|MF2_LOGRAV|MF2_CANNOTPUSH + +$ MT_SPLASHBASE +spawnstate S_SPLASHBASE1 +flags MF_NOBLOCKMAP + +$ MT_LAVASPLASH +spawnstate S_LAVASPLASH1 +flags MF_NOBLOCKMAP + +$ MT_LAVASMOKE +spawnstate S_LAVASMOKE1 +flags MF_NOBLOCKMAP|MF_NOGRAVITY +translucency 0.33 + +$ MT_SLUDGECHUNK +spawnstate S_SLUDGECHUNK1 +deathstate S_SLUDGECHUNKX +radius 2 +height 4 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF +flags2 MF2_NOTELEPORT|MF2_LOGRAV|MF2_CANNOTPUSH + +$ MT_SLUDGESPLASH +spawnstate S_SLUDGESPLASH1 +flags MF_NOBLOCKMAP + +S_SPLASH1 SPSH A 8 NULL S_SPLASH2 +S_SPLASH2 SPSH B 8 NULL S_SPLASH3 +S_SPLASH3 SPSH C 8 NULL S_SPLASH4 +S_SPLASH4 SPSH D 16 NULL S_NULL + +S_SPLASHX SPSH D 10 NULL S_NULL + +S_SPLASHBASE1 SPSH E 5 NULL S_SPLASHBASE2 +S_SPLASHBASE2 SPSH F 5 NULL S_SPLASHBASE3 +S_SPLASHBASE3 SPSH G 5 NULL S_SPLASHBASE4 +S_SPLASHBASE4 SPSH H 5 NULL S_SPLASHBASE5 +S_SPLASHBASE5 SPSH I 5 NULL S_SPLASHBASE6 +S_SPLASHBASE6 SPSH J 5 NULL S_SPLASHBASE7 +S_SPLASHBASE7 SPSH K 5 NULL S_NULL + +S_LAVASPLASH1 LVAS A* 5 NULL S_LAVASPLASH2 +S_LAVASPLASH2 LVAS B* 5 NULL S_LAVASPLASH3 +S_LAVASPLASH3 LVAS C* 5 NULL S_LAVASPLASH4 +S_LAVASPLASH4 LVAS D* 5 NULL S_LAVASPLASH5 +S_LAVASPLASH5 LVAS E* 5 NULL S_LAVASPLASH6 +S_LAVASPLASH6 LVAS F* 5 NULL S_NULL + +S_LAVASMOKE1 LVAS G* 5 NULL S_LAVASMOKE2 +S_LAVASMOKE2 LVAS H* 5 NULL S_LAVASMOKE3 +S_LAVASMOKE3 LVAS I* 5 NULL S_LAVASMOKE4 +S_LAVASMOKE4 LVAS J* 5 NULL S_LAVASMOKE5 +S_LAVASMOKE5 LVAS K* 5 NULL S_NULL + +S_SLUDGECHUNK1 SLDG A 8 NULL S_SLUDGECHUNK2 +S_SLUDGECHUNK2 SLDG B 8 NULL S_SLUDGECHUNK3 +S_SLUDGECHUNK3 SLDG C 8 NULL S_SLUDGECHUNK4 +S_SLUDGECHUNK4 SLDG D 8 NULL S_NULL + +S_SLUDGECHUNKX SLDG D 6 NULL S_NULL + +S_SLUDGESPLASH1 SLDG E 6 NULL S_SLUDGESPLASH2 +S_SLUDGESPLASH2 SLDG F 6 NULL S_SLUDGESPLASH3 +S_SLUDGESPLASH3 SLDG G 6 NULL S_SLUDGESPLASH4 +S_SLUDGESPLASH4 SLDG H 6 NULL S_NULL + + +// +// miscellaneous scenery +// + +$ + +doomednum 5 +spawnstate S_ZWINGEDSTATUE1 +radius 10 +height 62 +flags MF_SOLID + +S_ZWINGEDSTATUE1 STTW A -1 NULL S_NULL + +$ + doomednum 6 spawnstate S_ZROCK1_1 +$ + doomednum 7 spawnstate S_ZROCK2_1 +$ + doomednum 9 spawnstate S_ZROCK3_1 +$ + doomednum 15 spawnstate S_ZROCK4_1 flags MF_SOLID + +S_ZROCK1_1 RCK1 A -1 NULL S_NULL +S_ZROCK2_1 RCK2 A -1 NULL S_NULL +S_ZROCK3_1 RCK3 A -1 NULL S_NULL +S_ZROCK4_1 RCK4 A -1 NULL S_NULL + + +$ + +doomednum 17 +spawnstate S_ZCHANDELIER1 +height 60 +flags MF_SPAWNCEILING|MF_NOGRAVITY + +$ + +doomednum 8063 +spawnstate S_ZCHANDELIER_U +height 60 +flags MF_SPAWNCEILING|MF_NOGRAVITY + +S_ZCHANDELIER1 CDLR A 4 NULL S_ZCHANDELIER2 +S_ZCHANDELIER2 CDLR B 4 NULL S_ZCHANDELIER3 +S_ZCHANDELIER3 CDLR C 4 NULL S_ZCHANDELIER1 + +S_ZCHANDELIER_U CDLR D -1 NULL S_NULL + + +$ + +doomednum 24 +spawnstate S_ZTREEDEAD1 +radius 10 +height 96 +flags MF_SOLID + +$ + +doomednum 25 +spawnstate S_ZTREE +radius 15 +height 128 +flags MF_SOLID + +S_ZTREEDEAD1 TRE1 A -1 NULL S_NULL +S_ZTREE TRE1 A -1 NULL S_NULL + + +$ MT_TREEDESTRUCTIBLE +doomednum 8062 +spawnstate S_ZTREEDESTRUCTIBLE1 +spawnhealth 70 +deathstate S_ZTREEDES_D1 +deathsound TreeBreak +radius 15 +height 180 +mass 0x7fffffff +flags MF_SOLID|MF_SHOOTABLE|MF_NOBLOOD + +S_ZTREEDESTRUCTIBLE1 TRDT A -1 NULL S_NULL + +// tree falling apart +S_ZTREEDES_D1 TRDT B 5 NULL S_ZTREEDES_D2 +S_ZTREEDES_D2 TRDT C 5 A_Scream S_ZTREEDES_D3 +S_ZTREEDES_D3 TRDT D 5 NULL S_ZTREEDES_D4 +S_ZTREEDES_D4 TRDT E 5 NULL S_ZTREEDES_D5 +S_ZTREEDES_D5 TRDT F 5 NULL S_ZTREEDES_D6 +S_ZTREEDES_D6 TRDT G -1 NULL S_NULL + +// tree burning up +S_ZTREEDES_X1 TRDT H* 5 NULL S_ZTREEDES_X2 +S_ZTREEDES_X2 TRDT I* 5 NULL S_ZTREEDES_X3 +S_ZTREEDES_X3 TRDT J* 5 NULL S_ZTREEDES_X4 +S_ZTREEDES_X4 TRDT K* 5 NULL S_ZTREEDES_X5 +S_ZTREEDES_X5 TRDT L* 5 NULL S_ZTREEDES_X6 +S_ZTREEDES_X6 TRDT M* 5 A_Explode S_ZTREEDES_X7 +S_ZTREEDES_X7 TRDT N* 5 NULL S_ZTREEDES_X8 +S_ZTREEDES_X8 TRDT O 5 NULL S_ZTREEDES_X9 +S_ZTREEDES_X9 TRDT P 5 NULL S_ZTREEDES_X10 +S_ZTREEDES_X10 TRDT Q -1 NULL S_NULL + + +$ + +doomednum 26 +spawnstate S_ZTREESWAMP182_1 +radius 10 +height 150 +flags MF_SOLID + +$ + +doomednum 27 +spawnstate S_ZTREESWAMP172_1 +radius 10 +height 120 +flags MF_SOLID + +S_ZTREESWAMP182_1 TRE2 A -1 NULL S_NULL +S_ZTREESWAMP172_1 TRE3 A -1 NULL S_NULL + + +$ + +doomednum 28 +spawnstate S_ZSTUMPBURNED1 +radius 12 +height 20 +flags MF_SOLID + +$ + +doomednum 29 +spawnstate S_ZSTUMPBARE1 +radius 12 +height 20 +flags MF_SOLID + +$ + doomednum 37 spawnstate S_ZSTUMPSWAMP1_1 +$ + doomednum 38 spawnstate S_ZSTUMPSWAMP2_1 + +S_ZSTUMPBURNED1 STM1 A -1 NULL S_NULL +S_ZSTUMPBARE1 STM2 A -1 NULL S_NULL +S_ZSTUMPSWAMP1_1 STM3 A -1 NULL S_NULL +S_ZSTUMPSWAMP2_1 STM4 A -1 NULL S_NULL + + +$ + doomednum 39 spawnstate S_ZSHROOMLARGE1_1 +$ + doomednum 40 spawnstate S_ZSHROOMLARGE2_1 +$ + doomednum 41 spawnstate S_ZSHROOMLARGE3_1 +$ + doomednum 42 spawnstate S_ZSHROOMSMALL1_1 +$ + doomednum 44 spawnstate S_ZSHROOMSMALL2_1 +$ + doomednum 45 spawnstate S_ZSHROOMSMALL3_1 +$ + doomednum 46 spawnstate S_ZSHROOMSMALL4_1 +$ + doomednum 47 spawnstate S_ZSHROOMSMALL5_1 + +S_ZSHROOMLARGE1_1 MSH1 A -1 NULL S_NULL +S_ZSHROOMLARGE2_1 MSH2 A -1 NULL S_NULL +S_ZSHROOMLARGE3_1 MSH3 A -1 NULL S_NULL +S_ZSHROOMSMALL1_1 MSH4 A -1 NULL S_NULL +S_ZSHROOMSMALL2_1 MSH5 A -1 NULL S_NULL +S_ZSHROOMSMALL3_1 MSH6 A -1 NULL S_NULL +S_ZSHROOMSMALL4_1 MSH7 A -1 NULL S_NULL +S_ZSHROOMSMALL5_1 MSH8 A -1 NULL S_NULL + + +$ + +doomednum 48 +spawnstate S_ZSTALAGMITEPILLAR1 +radius 8 +height 138 +flags MF_SOLID + +$ + +doomednum 49 +spawnstate S_ZSTALAGMITELARGE1 +radius 8 +height 48 +flags MF_SOLID + +$ + +doomednum 50 +spawnstate S_ZSTALAGMITEMEDIUM1 +radius 6 +height 40 +flags MF_SOLID + +$ + +doomednum 51 +spawnstate S_ZSTALAGMITESMALL1 +radius 8 +height 36 +flags MF_SOLID + +$ + +doomednum 52 +spawnstate S_ZSTALACTITELARGE1 +radius 8 +height 66 +flags MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY + +$ + +doomednum 56 +spawnstate S_ZSTALACTITEMEDIUM1 +radius 6 +height 50 +flags MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY + +$ + +doomednum 57 +spawnstate S_ZSTALACTITESMALL1 +radius 8 +height 40 +flags MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY + +S_ZSTALAGMITEPILLAR1 SGMP A -1 NULL S_NULL +S_ZSTALAGMITELARGE1 SGM1 A -1 NULL S_NULL +S_ZSTALAGMITEMEDIUM1 SGM2 A -1 NULL S_NULL +S_ZSTALAGMITESMALL1 SGM3 A -1 NULL S_NULL +S_ZSTALACTITELARGE1 SLC1 A -1 NULL S_NULL +S_ZSTALACTITEMEDIUM1 SLC2 A -1 NULL S_NULL +S_ZSTALACTITESMALL1 SLC3 A -1 NULL S_NULL + + +$ + +doomednum 58 +spawnstate S_ZMOSSCEILING1_1 +height 20 +flags MF_SPAWNCEILING|MF_NOGRAVITY + +$ + +doomednum 59 +spawnstate S_ZMOSSCEILING2_1 +height 24 +flags MF_SPAWNCEILING|MF_NOGRAVITY + +S_ZMOSSCEILING1_1 MSS1 A -1 NULL S_NULL +S_ZMOSSCEILING2_1 MSS2 A -1 NULL S_NULL + + +$ + +doomednum 60 +spawnstate S_ZSWAMPVINE1 +radius 8 +height 52 +flags MF_SOLID + +S_ZSWAMPVINE1 SWMV A -1 NULL S_NULL + + +$ + +doomednum 61 +spawnstate S_ZCORPSEKABOB1 +radius 10 +height 92 +flags MF_SOLID + +$ + +doomednum 62 +spawnstate S_ZCORPSESLEEPING1 + +S_ZCORPSEKABOB1 CPS1 A -1 NULL S_NULL +S_ZCORPSESLEEPING1 CPS2 A -1 NULL S_NULL + + +$ + +doomednum 63 +spawnstate S_ZTOMBSTONERIP1 +radius 10 +height 46 +flags MF_SOLID + +$ + +doomednum 64 +spawnstate S_ZTOMBSTONESHANE1 +radius 10 +height 46 +flags MF_SOLID + +$ + +doomednum 65 +spawnstate S_ZTOMBSTONEBIGCROSS1 +radius 10 +height 46 +flags MF_SOLID + +$ + +doomednum 66 +spawnstate S_ZTOMBSTONEBRIANR1 +radius 10 +height 52 +flags MF_SOLID + +$ + +doomednum 67 +spawnstate S_ZTOMBSTONECROSSCIRCLE1 +radius 10 +height 52 +flags MF_SOLID + +$ + +doomednum 68 +spawnstate S_ZTOMBSTONESMALLCROSS1 +radius 8 +height 46 +flags MF_SOLID + +$ + +doomednum 69 +spawnstate S_ZTOMBSTONEBRIANP1 +radius 8 +height 46 +flags MF_SOLID + +S_ZTOMBSTONERIP1 TMS1 A -1 NULL S_NULL +S_ZTOMBSTONESHANE1 TMS2 A -1 NULL S_NULL +S_ZTOMBSTONEBIGCROSS1 TMS3 A -1 NULL S_NULL +S_ZTOMBSTONEBRIANR1 TMS4 A -1 NULL S_NULL +S_ZTOMBSTONECROSSCIRCLE1 TMS5 A -1 NULL S_NULL +S_ZTOMBSTONESMALLCROSS1 TMS6 A -1 NULL S_NULL +S_ZTOMBSTONEBRIANP1 TMS7 A -1 NULL S_NULL + + +$ + +doomednum 71 +spawnstate S_CORPSEHANGING_1 +radius 6 +height 75 +flags MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY + +S_CORPSEHANGING_1 CPS3 A -1 NULL S_NULL + + +$ + +doomednum 72 +spawnstate S_ZSTATUEGARGOYLEGREENTALL_1 +radius 14 +height 108 +flags MF_SOLID + +$ + +doomednum 73 +spawnstate S_ZSTATUEGARGOYLEBLUETALL_1 +radius 14 +height 108 +flags MF_SOLID + +$ + +doomednum 74 +spawnstate S_ZSTATUEGARGOYLEGREENSHORT_1 +radius 14 +height 62 +flags MF_SOLID + +$ + +doomednum 76 +spawnstate S_ZSTATUEGARGOYLEBLUESHORT_1 +radius 14 +height 62 +flags MF_SOLID + +$ + +doomednum 8044 +spawnstate S_ZSTATUEGARGOYLESTRIPETALL_1 +radius 14 +height 108 +flags MF_SOLID + +$ + +doomednum 8045 +spawnstate S_ZSTATUEGARGOYLEDARKREDTALL_1 +radius 14 +height 108 +flags MF_SOLID + +$ + +doomednum 8046 +spawnstate S_ZSTATUEGARGOYLEREDTALL_1 +radius 14 +height 108 +flags MF_SOLID + +$ + +doomednum 8047 +spawnstate S_ZSTATUEGARGOYLETANTALL_1 +radius 14 +height 108 +flags MF_SOLID + +$ + +doomednum 8048 +spawnstate S_ZSTATUEGARGOYLERUSTTALL_1 +radius 14 +height 108 +flags MF_SOLID + +$ + +doomednum 8049 +spawnstate S_ZSTATUEGARGOYLEDARKREDSHORT_1 +radius 14 +height 62 +flags MF_SOLID + +$ + +doomednum 8050 +spawnstate S_ZSTATUEGARGOYLEREDSHORT_1 +radius 14 +height 62 +flags MF_SOLID + +$ + +doomednum 8051 +spawnstate S_ZSTATUEGARGOYLETANSHORT_1 +radius 14 +height 62 +flags MF_SOLID + +$ + +doomednum 8052 +spawnstate S_ZSTATUEGARGOYLERUSTSHORT_1 +radius 14 +height 62 +flags MF_SOLID + +S_ZSTATUEGARGOYLEGREENTALL_1 STT2 A -1 NULL S_NULL +S_ZSTATUEGARGOYLEBLUETALL_1 STT3 A -1 NULL S_NULL +S_ZSTATUEGARGOYLEGREENSHORT_1 STT4 A -1 NULL S_NULL +S_ZSTATUEGARGOYLEBLUESHORT_1 STT5 A -1 NULL S_NULL +S_ZSTATUEGARGOYLESTRIPETALL_1 GAR1 A -1 NULL S_NULL +S_ZSTATUEGARGOYLEDARKREDTALL_1 GAR2 A -1 NULL S_NULL +S_ZSTATUEGARGOYLEREDTALL_1 GAR3 A -1 NULL S_NULL +S_ZSTATUEGARGOYLETANTALL_1 GAR4 A -1 NULL S_NULL +S_ZSTATUEGARGOYLERUSTTALL_1 GAR5 A -1 NULL S_NULL +S_ZSTATUEGARGOYLEDARKREDSHORT_1 GAR6 A -1 NULL S_NULL +S_ZSTATUEGARGOYLEREDSHORT_1 GAR7 A -1 NULL S_NULL +S_ZSTATUEGARGOYLETANSHORT_1 GAR8 A -1 NULL S_NULL +S_ZSTATUEGARGOYLERUSTSHORT_1 GAR9 A -1 NULL S_NULL + + +$ + +doomednum 77 +spawnstate S_ZBANNERTATTERED_1 +radius 8 +height 120 +flags MF_SOLID + +S_ZBANNERTATTERED_1 BNR1 A -1 NULL S_NULL + + +$ + +doomednum 78 +spawnstate S_ZTREELARGE1 +deathstate S_ZTREELARGE1 +radius 15 +height 180 +flags MF_SOLID + +$ + +doomednum 79 +spawnstate S_ZTREELARGE2 +deathstate S_ZTREELARGE2 +radius 15 +height 180 +flags MF_SOLID + +$ + +doomednum 80 +spawnstate S_ZTREEGNARLED1 +radius 22 +height 100 +flags MF_SOLID + +$ + +doomednum 87 +spawnstate S_ZTREEGNARLED2 +radius 22 +height 100 +flags MF_SOLID + +$ + +doomednum 88 +spawnstate S_ZLOG +height 25 +flags MF_SOLID + +S_ZTREELARGE1 TRE4 A -1 NULL S_NULL +S_ZTREELARGE2 TRE5 A -1 NULL S_NULL +S_ZTREEGNARLED1 TRE6 A -1 NULL S_NULL +S_ZTREEGNARLED2 TRE7 A -1 NULL S_NULL +S_ZLOG LOGG A -1 NULL S_NULL + + +$ + +doomednum 89 +spawnstate S_ZSTALACTITEICELARGE +radius 8 +height 66 +flags MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY + +$ + +doomednum 90 +spawnstate S_ZSTALACTITEICEMEDIUM +radius 5 +height 50 +flags MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY + +$ + +doomednum 91 +spawnstate S_ZSTALACTITEICESMALL +radius 4 +height 32 +flags MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY + +$ + +doomednum 92 +spawnstate S_ZSTALACTITEICETINY +radius 4 +height 8 +flags MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY + +$ + +doomednum 93 +spawnstate S_ZSTALAGMITEICELARGE +radius 8 +height 66 +flags MF_SOLID + +$ + +doomednum 94 +spawnstate S_ZSTALAGMITEICEMEDIUM +radius 5 +height 50 +flags MF_SOLID + +$ + +doomednum 95 +spawnstate S_ZSTALAGMITEICESMALL +radius 4 +height 32 +flags MF_SOLID + +$ + +doomednum 96 +spawnstate S_ZSTALAGMITEICETINY +radius 4 +height 8 +flags MF_SOLID + +S_ZSTALACTITEICELARGE ICT1 A -1 NULL S_NULL +S_ZSTALACTITEICEMEDIUM ICT2 A -1 NULL S_NULL +S_ZSTALACTITEICESMALL ICT3 A -1 NULL S_NULL +S_ZSTALACTITEICETINY ICT4 A -1 NULL S_NULL +S_ZSTALAGMITEICELARGE ICM1 A -1 NULL S_NULL +S_ZSTALAGMITEICEMEDIUM ICM2 A -1 NULL S_NULL +S_ZSTALAGMITEICESMALL ICM3 A -1 NULL S_NULL +S_ZSTALAGMITEICETINY ICM4 A -1 NULL S_NULL + + +$ + doomednum 97 spawnstate S_ZROCKBROWN1 radius 17 height 72 flags MF_SOLID +$ + doomednum 98 spawnstate S_ZROCKBROWN2 radius 15 height 50 flags MF_SOLID +$ + doomednum 99 spawnstate S_ZROCKBLACK radius 20 height 40 flags MF_SOLID +$ + doomednum 100 spawnstate S_ZRUBBLE1 +$ + doomednum 101 spawnstate S_ZRUBBLE2 +$ + doomednum 102 spawnstate S_ZRUBBLE3 + +S_ZROCKBROWN1 RKBL A -1 NULL S_NULL +S_ZROCKBROWN2 RKBS A -1 NULL S_NULL +S_ZROCKBLACK RKBK A -1 NULL S_NULL +S_ZRUBBLE1 RBL1 A -1 NULL S_NULL +S_ZRUBBLE2 RBL2 A -1 NULL S_NULL +S_ZRUBBLE3 RBL3 A -1 NULL S_NULL + + +$ + +doomednum 103 +spawnstate S_ZVASEPILLAR +radius 12 +height 54 +flags MF_SOLID + +$ MT_POTTERY1 +doomednum 104 +spawnstate S_ZPOTTERY1 +spawnhealth 15 +deathstate S_ZPOTTERY_EXPLODE +radius 10 +height 32 +flags MF_SOLID|MF_SHOOTABLE|MF_NOBLOOD|MF_DROPOFF +flags2 MF2_SLIDE|MF2_PUSHABLE|MF2_TELESTOMP|MF2_PASSMOBJ + +$ MT_POTTERY2 +doomednum 105 +spawnstate S_ZPOTTERY2 +spawnhealth 15 +deathstate S_ZPOTTERY_EXPLODE +radius 10 +height 25 +flags MF_SOLID|MF_SHOOTABLE|MF_NOBLOOD|MF_DROPOFF +flags2 MF2_SLIDE|MF2_PUSHABLE|MF2_TELESTOMP|MF2_PASSMOBJ + +$ MT_POTTERY3 +doomednum 106 +spawnstate S_ZPOTTERY3 +spawnhealth 15 +deathstate S_ZPOTTERY_EXPLODE +radius 15 +height 25 +flags MF_SOLID|MF_SHOOTABLE|MF_NOBLOOD|MF_DROPOFF +flags2 MF2_SLIDE|MF2_PUSHABLE|MF2_TELESTOMP|MF2_PASSMOBJ + +$ MT_POTTERYBIT1 +spawnstate S_POTTERYBIT_1 +deathstate S_POTTERYBIT_EX0 +radius 5 +height 5 +flags MF_MISSILE +flags2 MF2_NOTELEPORT + +S_ZVASEPILLAR VASE A -1 NULL S_NULL + +S_ZPOTTERY1 POT1 A -1 NULL S_NULL +S_ZPOTTERY2 POT2 A -1 NULL S_NULL +S_ZPOTTERY3 POT3 A -1 NULL S_NULL +S_ZPOTTERY_EXPLODE POT1 A 0 A_PotteryExplode S_NULL + +S_POTTERYBIT_1 PBIT A -1 NULL S_NULL +S_POTTERYBIT_2 PBIT B -1 NULL S_NULL +S_POTTERYBIT_3 PBIT C -1 NULL S_NULL +S_POTTERYBIT_4 PBIT D -1 NULL S_NULL +S_POTTERYBIT_5 PBIT E -1 NULL S_NULL + +S_POTTERYBIT_EX0 PBIT F 0 A_PotteryChooseBit S_NULL + +S_POTTERYBIT_EX1 PBIT F 140 NULL S_POTTERYBIT_EX1_2 +S_POTTERYBIT_EX1_2 PBIT F 1 A_PotteryCheck S_NULL + +S_POTTERYBIT_EX2 PBIT G 140 NULL S_POTTERYBIT_EX2_2 +S_POTTERYBIT_EX2_2 PBIT G 1 A_PotteryCheck S_NULL + +S_POTTERYBIT_EX3 PBIT H 140 NULL S_POTTERYBIT_EX3_2 +S_POTTERYBIT_EX3_2 PBIT H 1 A_PotteryCheck S_NULL + +S_POTTERYBIT_EX4 PBIT I 140 NULL S_POTTERYBIT_EX4_2 +S_POTTERYBIT_EX4_2 PBIT I 1 A_PotteryCheck S_NULL + +S_POTTERYBIT_EX5 PBIT J 140 NULL S_POTTERYBIT_EX5_2 +S_POTTERYBIT_EX5_2 PBIT J 1 A_PotteryCheck S_NULL + + +$ + +doomednum 108 +spawnstate S_ZCORPSELYNCHED1 +radius 11 +height 95 +flags MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY + +$ MT_ZLYNCHED_NOHEART +doomednum 109 +spawnstate S_ZCORPSELYNCHED2 +radius 10 +height 100 +flags MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY + +$ + +doomednum 110 +spawnstate S_ZCORPSESITTING +spawnhealth 30 +deathstate S_ZCORPSESITTING_X +radius 15 +height 35 +flags MF_SOLID|MF_SHOOTABLE|MF_NOBLOOD + +$ MT_CORPSEBIT +spawnstate S_CORPSEBIT_1 +radius 5 +height 5 +flags MF_NOBLOCKMAP +flags2 MF2_TELESTOMP + +$ MT_CORPSEBLOODDRIP +spawnstate S_CORPSEBLOODDRIP +deathstate S_CORPSEBLOODDRIP_X1 +deathsound Drip +radius 1 +height 4 +flags MF_MISSILE +flags2 MF2_LOGRAV + +$ MT_BLOODPOOL +doomednum 111 +spawnstate S_BLOODPOOL +flags MF_NOBLOCKMAP + +S_ZCORPSELYNCHED1 CPS4 A -1 NULL S_NULL +S_ZCORPSELYNCHED2 CPS5 A 140 A_CorpseBloodDrip S_ZCORPSELYNCHED2 +S_ZCORPSESITTING CPS6 A -1 NULL S_NULL +S_ZCORPSESITTING_X CPS6 A 1 A_CorpseExplode S_NULL + +S_CORPSEBIT_1 CPB1 A -1 NULL S_NULL +S_CORPSEBIT_2 CPB2 A -1 NULL S_NULL +S_CORPSEBIT_3 CPB3 A -1 NULL S_NULL +S_CORPSEBIT_4 CPB4 A -1 NULL S_NULL + +S_CORPSEBLOODDRIP BDRP A -1 NULL S_NULL +S_CORPSEBLOODDRIP_X1 BDSH A 3 NULL S_CORPSEBLOODDRIP_X2 +S_CORPSEBLOODDRIP_X2 BDSH B 3 NULL S_CORPSEBLOODDRIP_X3 +S_CORPSEBLOODDRIP_X3 BDSH C 2 NULL S_CORPSEBLOODDRIP_X4 +S_CORPSEBLOODDRIP_X4 BDSH D 2 NULL S_NULL + +S_BLOODPOOL BDPL A -1 NULL S_NULL + + +$ + +doomednum 119 +spawnstate S_ZCANDLE1 +flags MF_NOBLOCKMAP|MF_NOGRAVITY + +S_ZCANDLE1 CNDL A* 4 NULL S_ZCANDLE2 +S_ZCANDLE2 CNDL B* 4 NULL S_ZCANDLE3 +S_ZCANDLE3 CNDL C* 4 NULL S_ZCANDLE1 + + +$ + +doomednum 113 +spawnstate S_ZLEAFSPAWNER +flags MF_NOBLOCKMAP|MF_NOSECTOR +flags2 MF2_DONTDRAW + +$ MT_LEAF1 +spawnstate S_LEAF1_1 +deathstate S_LEAF_X1 +radius 2 +height 4 +flags MF_NOBLOCKMAP|MF_MISSILE +flags2 MF2_NOTELEPORT|MF2_LOGRAV + +$ MT_LEAF2 +spawnstate S_LEAF2_1 +deathstate S_LEAF_X1 +radius 2 +height 4 +flags MF_NOBLOCKMAP|MF_MISSILE +flags2 MF2_NOTELEPORT|MF2_LOGRAV + +S_ZLEAFSPAWNER MAN1 A 20 A_LeafSpawn S_ZLEAFSPAWNER + +S_LEAF1_1 LEF1 A 4 NULL S_LEAF1_2 +S_LEAF1_2 LEF1 B 4 NULL S_LEAF1_3 +S_LEAF1_3 LEF1 C 4 NULL S_LEAF1_4 +S_LEAF1_4 LEF1 D 4 A_LeafThrust S_LEAF1_5 +S_LEAF1_5 LEF1 E 4 NULL S_LEAF1_6 +S_LEAF1_6 LEF1 F 4 NULL S_LEAF1_7 +S_LEAF1_7 LEF1 G 4 NULL S_LEAF1_8 +S_LEAF1_8 LEF1 H 4 A_LeafThrust S_LEAF1_9 +S_LEAF1_9 LEF1 I 4 NULL S_LEAF1_10 +S_LEAF1_10 LEF1 A 4 NULL S_LEAF1_11 +S_LEAF1_11 LEF1 B 4 NULL S_LEAF1_12 +S_LEAF1_12 LEF1 C 4 A_LeafThrust S_LEAF1_13 +S_LEAF1_13 LEF1 D 4 NULL S_LEAF1_14 +S_LEAF1_14 LEF1 E 4 NULL S_LEAF1_15 +S_LEAF1_15 LEF1 F 4 NULL S_LEAF1_16 +S_LEAF1_16 LEF1 G 4 A_LeafThrust S_LEAF1_17 +S_LEAF1_17 LEF1 H 4 NULL S_LEAF1_18 +S_LEAF1_18 LEF1 I 4 NULL S_NULL + +S_LEAF_X1 LEF3 D 10 A_LeafCheck S_LEAF_X1 + +S_LEAF2_1 LEF2 A 4 NULL S_LEAF2_2 +S_LEAF2_2 LEF2 B 4 NULL S_LEAF2_3 +S_LEAF2_3 LEF2 C 4 NULL S_LEAF2_4 +S_LEAF2_4 LEF2 D 4 A_LeafThrust S_LEAF2_5 +S_LEAF2_5 LEF2 E 4 NULL S_LEAF2_6 +S_LEAF2_6 LEF2 F 4 NULL S_LEAF2_7 +S_LEAF2_7 LEF2 G 4 NULL S_LEAF2_8 +S_LEAF2_8 LEF2 H 4 A_LeafThrust S_LEAF2_9 +S_LEAF2_9 LEF2 I 4 NULL S_LEAF2_10 +S_LEAF2_10 LEF2 A 4 NULL S_LEAF2_11 +S_LEAF2_11 LEF2 B 4 NULL S_LEAF2_12 +S_LEAF2_12 LEF2 C 4 A_LeafThrust S_LEAF2_13 +S_LEAF2_13 LEF2 D 4 NULL S_LEAF2_14 +S_LEAF2_14 LEF2 E 4 NULL S_LEAF2_15 +S_LEAF2_15 LEF2 F 4 NULL S_LEAF2_16 +S_LEAF2_16 LEF2 G 4 A_LeafThrust S_LEAF2_17 +S_LEAF2_17 LEF2 H 4 NULL S_LEAF2_18 +S_LEAF2_18 LEF2 I 4 NULL S_NULL + + +$ MT_ZTWINEDTORCH +doomednum 116 +spawnstate S_ZTWINEDTORCH_1 +radius 10 +height 64 +flags MF_SOLID + +$ MT_ZTWINEDTORCH_UNLIT +doomednum 117 +spawnstate S_ZTWINEDTORCH_UNLIT +radius 10 +height 64 +flags MF_SOLID + +S_ZTWINEDTORCH_1 TWTR A* 4 NULL S_ZTWINEDTORCH_2 +S_ZTWINEDTORCH_2 TWTR B* 4 NULL S_ZTWINEDTORCH_3 +S_ZTWINEDTORCH_3 TWTR C* 4 NULL S_ZTWINEDTORCH_4 +S_ZTWINEDTORCH_4 TWTR D* 4 NULL S_ZTWINEDTORCH_5 +S_ZTWINEDTORCH_5 TWTR E* 4 NULL S_ZTWINEDTORCH_6 +S_ZTWINEDTORCH_6 TWTR F* 4 NULL S_ZTWINEDTORCH_7 +S_ZTWINEDTORCH_7 TWTR G* 4 NULL S_ZTWINEDTORCH_8 +S_ZTWINEDTORCH_8 TWTR H* 4 NULL S_ZTWINEDTORCH_1 + +S_ZTWINEDTORCH_UNLIT TWTR I -1 NULL S_NULL + + +$ MT_BRIDGE +doomednum 118 +spawnstate S_BRIDGE1 +radius 32 +height 2 +flags MF_SOLID|MF_NOGRAVITY +flags2 MF2_DONTDRAW + +$ MT_BRIDGEBALL +spawnstate S_BBALL1 +flags MF_NOBLOCKMAP|MF_NOGRAVITY +flags2 MF2_NOTELEPORT + +S_BRIDGE1 TLGL A 2 NULL S_BRIDGE2 +S_BRIDGE2 TLGL A 2 A_BridgeInit S_BRIDGE3 +S_BRIDGE3 TLGL A -1 NULL S_NULL + +S_FREE_BRIDGE1 TLGL A 2 NULL S_FREE_BRIDGE2 +S_FREE_BRIDGE2 TLGL A 300 NULL S_NULL + +S_BBALL1 TLGL A 2 NULL S_BBALL2 +S_BBALL2 TLGL A 5 A_BridgeOrbit S_BBALL2 + + +$ MT_ZWALLTORCH +doomednum 54 +spawnstate S_ZWALLTORCH1 +flags MF_NOBLOCKMAP|MF_NOGRAVITY + +$ MT_ZWALLTORCH_UNLIT +doomednum 55 +spawnstate S_ZWALLTORCH_U +flags MF_NOBLOCKMAP|MF_NOGRAVITY + +S_ZWALLTORCH1 WLTR A* 5 NULL S_ZWALLTORCH2 +S_ZWALLTORCH2 WLTR B* 5 NULL S_ZWALLTORCH3 +S_ZWALLTORCH3 WLTR C* 5 NULL S_ZWALLTORCH4 +S_ZWALLTORCH4 WLTR D* 5 NULL S_ZWALLTORCH5 +S_ZWALLTORCH5 WLTR E* 5 NULL S_ZWALLTORCH6 +S_ZWALLTORCH6 WLTR F* 5 NULL S_ZWALLTORCH7 +S_ZWALLTORCH7 WLTR G* 5 NULL S_ZWALLTORCH8 +S_ZWALLTORCH8 WLTR H* 5 NULL S_ZWALLTORCH1 + +S_ZWALLTORCH_U WLTR I -1 NULL S_NULL + + +$ MT_ZBARREL +doomednum 8100 +spawnstate S_ZBARREL1 +radius 15 +height 32 +flags MF_SOLID + +S_ZBARREL1 BARL A -1 NULL S_NULL + + +$ MT_ZSHRUB1 +doomednum 8101 +spawnstate S_ZSHRUB1 +spawnhealth 20 +meleestate S_ZSHRUB1_X1 +deathstate S_ZSHRUB1_DIE +deathsound TreeExplode +radius 8 +height 24 +mass 0x7fffffff +flags MF_SOLID|MF_SHOOTABLE|MF_NOBLOOD + +$ MT_ZSHRUB2 +doomednum 8102 +spawnstate S_ZSHRUB2 +spawnhealth 10 +meleestate S_ZSHRUB2_X1 +deathstate S_ZSHRUB2_DIE +deathsound TreeExplode +radius 16 +height 40 +mass 0x7fffffff +flags MF_SOLID|MF_SHOOTABLE|MF_NOBLOOD + +S_ZSHRUB1 SHB1 A -1 NULL S_NULL + +S_ZSHRUB1_DIE SHB1 A 1 A_TreeDeath S_ZSHRUB1 + +S_ZSHRUB1_X1 SHB1 B* 7 NULL S_ZSHRUB1_X2 +S_ZSHRUB1_X2 SHB1 C* 6 A_Scream S_ZSHRUB1_X3 +S_ZSHRUB1_X3 SHB1 D* 5 NULL S_NULL + +S_ZSHRUB2 SHB2 A -1 NULL S_NULL + +S_ZSHRUB2_DIE SHB2 A 1 A_TreeDeath S_ZSHRUB2 + +S_ZSHRUB2_X1 SHB2 B* 7 NULL S_ZSHRUB2_X2 +S_ZSHRUB2_X2 SHB2 C* 6 A_Scream S_ZSHRUB2_X3 +S_ZSHRUB2_X3 SHB2 D* 5 A_Explode S_ZSHRUB2_X4 +S_ZSHRUB2_X4 SHB2 E* 5 NULL S_NULL + + +$ MT_ZBUCKET +doomednum 8103 +spawnstate S_ZBUCKET1 +radius 8 +height 72 +flags MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY + +S_ZBUCKET1 BCKT A -1 NULL S_NULL + + +$ MT_ZPOISONSHROOM +doomednum 8104 +spawnstate S_ZPOISONSHROOM1 +spawnhealth 30 +painstate S_ZPOISONSHROOM_P1 +painchance 255 +painsound PoisonShroomPain +deathstate S_ZPOISONSHROOM_X1 +deathsound PoisonShroomDeath +radius 6 +height 20 +mass 0x7fffffff +flags MF_SHOOTABLE|MF_SOLID|MF_NOBLOOD + +S_ZPOISONSHROOM1 SHRM A 5 A_PoisonShroom S_ZPOISONSHROOM_P2 +S_ZPOISONSHROOM_P1 SHRM A 6 NULL S_ZPOISONSHROOM_P2 +S_ZPOISONSHROOM_P2 SHRM B 8 A_Pain S_ZPOISONSHROOM1 + +S_ZPOISONSHROOM_X1 SHRM C 5 NULL S_ZPOISONSHROOM_X2 +S_ZPOISONSHROOM_X2 SHRM D 5 NULL S_ZPOISONSHROOM_X3 +S_ZPOISONSHROOM_X3 SHRM E 5 A_PoisonBagInit S_ZPOISONSHROOM_X4 +S_ZPOISONSHROOM_X4 SHRM F -1 NULL S_NULL + + +$ MT_ZFIREBULL +doomednum 8042 +spawnstate S_ZFIREBULL1 +height 80 +flags MF_SOLID + +$ MT_ZFIREBULL_UNLIT +doomednum 8043 +spawnstate S_ZFIREBULL_U +height 80 +flags MF_SOLID + +S_ZFIREBULL1 FBUL A* 4 NULL S_ZFIREBULL2 +S_ZFIREBULL2 FBUL B* 4 NULL S_ZFIREBULL3 +S_ZFIREBULL3 FBUL C* 4 NULL S_ZFIREBULL4 +S_ZFIREBULL4 FBUL D* 4 NULL S_ZFIREBULL5 +S_ZFIREBULL5 FBUL E* 4 NULL S_ZFIREBULL6 +S_ZFIREBULL6 FBUL F* 4 NULL S_ZFIREBULL7 +S_ZFIREBULL7 FBUL G* 4 NULL S_ZFIREBULL1 + +S_ZFIREBULL_DEATH FBUL J* 4 NULL S_ZFIREBULL_DEATH2 +S_ZFIREBULL_DEATH2 FBUL I* 4 NULL S_ZFIREBULL_U +S_ZFIREBULL_U FBUL H -1 NULL S_NULL + +S_ZFIREBULL_BIRTH FBUL I* 4 NULL S_ZFIREBULL_BIRTH2 +S_ZFIREBULL_BIRTH2 FBUL J* 4 NULL S_ZFIREBULL1 + + +$ MT_FIRETHING +doomednum 8060 +spawnstate S_ZFIRETHING1 +radius 5 +height 10 +flags MF_SOLID + +S_ZFIRETHING1 FSKL A* 4 NULL S_ZFIRETHING2 +S_ZFIRETHING2 FSKL B* 3 NULL S_ZFIRETHING3 +S_ZFIRETHING3 FSKL C* 4 NULL S_ZFIRETHING4 +S_ZFIRETHING4 FSKL D* 3 NULL S_ZFIRETHING5 +S_ZFIRETHING5 FSKL E* 4 NULL S_ZFIRETHING6 +S_ZFIRETHING6 FSKL F* 3 NULL S_ZFIRETHING7 +S_ZFIRETHING7 FSKL G* 4 NULL S_ZFIRETHING8 +S_ZFIRETHING8 FSKL H* 3 NULL S_ZFIRETHING9 +S_ZFIRETHING9 FSKL I* 4 NULL S_ZFIRETHING1 + + +$ MT_BRASSTORCH +doomednum 8061 +spawnstate S_ZBRASSTORCH1 +radius 6 +height 35 +flags MF_SOLID + +S_ZBRASSTORCH1 BRTR A* 4 NULL S_ZBRASSTORCH2 +S_ZBRASSTORCH2 BRTR B* 4 NULL S_ZBRASSTORCH3 +S_ZBRASSTORCH3 BRTR C* 4 NULL S_ZBRASSTORCH4 +S_ZBRASSTORCH4 BRTR D* 4 NULL S_ZBRASSTORCH5 +S_ZBRASSTORCH5 BRTR E* 4 NULL S_ZBRASSTORCH6 +S_ZBRASSTORCH6 BRTR F* 4 NULL S_ZBRASSTORCH7 +S_ZBRASSTORCH7 BRTR G* 4 NULL S_ZBRASSTORCH8 +S_ZBRASSTORCH8 BRTR H* 4 NULL S_ZBRASSTORCH9 +S_ZBRASSTORCH9 BRTR I* 4 NULL S_ZBRASSTORCH10 +S_ZBRASSTORCH10 BRTR J* 4 NULL S_ZBRASSTORCH11 +S_ZBRASSTORCH11 BRTR K* 4 NULL S_ZBRASSTORCH12 +S_ZBRASSTORCH12 BRTR L* 4 NULL S_ZBRASSTORCH13 +S_ZBRASSTORCH13 BRTR M* 4 NULL S_ZBRASSTORCH1 + + +$ MT_ZSUITOFARMOR +doomednum 8064 +spawnstate S_ZSUITOFARMOR +spawnhealth 60 +deathstate S_ZSUITOFARMOR_X1 +deathsound SuitofArmorBreak +radius 16 +height 72 +mass 0x7fffffff +flags MF_SOLID|MF_SHOOTABLE|MF_NOBLOOD + +$ MT_ZARMORCHUNK +spawnstate S_ZARMORCHUNK1 +radius 4 +height 8 + +S_ZSUITOFARMOR SUIT A -1 NULL S_NULL + +S_ZSUITOFARMOR_X1 SUIT A 1 A_SoAExplode S_NULL + +S_ZARMORCHUNK1 SUIT B -1 NULL S_NULL +S_ZARMORCHUNK2 SUIT C -1 NULL S_NULL +S_ZARMORCHUNK3 SUIT D -1 NULL S_NULL +S_ZARMORCHUNK4 SUIT E -1 NULL S_NULL +S_ZARMORCHUNK5 SUIT F -1 NULL S_NULL +S_ZARMORCHUNK6 SUIT G -1 NULL S_NULL +S_ZARMORCHUNK7 SUIT H -1 NULL S_NULL +S_ZARMORCHUNK8 SUIT I -1 NULL S_NULL +S_ZARMORCHUNK9 SUIT J -1 NULL S_NULL +S_ZARMORCHUNK10 SUIT K -1 NULL S_NULL + + +$ MT_ZBELL +doomednum 8065 +spawnstate S_ZBELL +spawnhealth 5 +deathstate S_ZBELL_X1 +deathsound BellRing +radius 56 +height 120 +mass 0x7fffffff +flags MF_SOLID|MF_SHOOTABLE|MF_NOBLOOD|MF_NOGRAVITY|MF_SPAWNCEILING + +S_ZBELL BBLL F -1 NULL S_NULL + +S_ZBELL_X1 BBLL A 4 A_BellReset1 S_ZBELL_X2 +S_ZBELL_X2 BBLL B 4 NULL S_ZBELL_X3 +S_ZBELL_X3 BBLL C 4 NULL S_ZBELL_X4 +S_ZBELL_X4 BBLL D 5 A_Scream S_ZBELL_X5 +S_ZBELL_X5 BBLL C 4 NULL S_ZBELL_X6 +S_ZBELL_X6 BBLL B 4 NULL S_ZBELL_X7 +S_ZBELL_X7 BBLL A 3 NULL S_ZBELL_X8 +S_ZBELL_X8 BBLL E 4 NULL S_ZBELL_X9 +S_ZBELL_X9 BBLL F 5 NULL S_ZBELL_X10 +S_ZBELL_X10 BBLL G 6 A_Scream S_ZBELL_X11 +S_ZBELL_X11 BBLL F 5 NULL S_ZBELL_X12 +S_ZBELL_X12 BBLL E 4 NULL S_ZBELL_X13 +S_ZBELL_X13 BBLL A 4 NULL S_ZBELL_X14 +S_ZBELL_X14 BBLL B 5 NULL S_ZBELL_X15 +S_ZBELL_X15 BBLL C 5 NULL S_ZBELL_X16 +S_ZBELL_X16 BBLL D 6 A_Scream S_ZBELL_X17 +S_ZBELL_X17 BBLL C 5 NULL S_ZBELL_X18 +S_ZBELL_X18 BBLL B 5 NULL S_ZBELL_X19 +S_ZBELL_X19 BBLL A 4 NULL S_ZBELL_X20 +S_ZBELL_X20 BBLL E 5 NULL S_ZBELL_X21 +S_ZBELL_X21 BBLL F 5 NULL S_ZBELL_X22 +S_ZBELL_X22 BBLL G 7 A_Scream S_ZBELL_X23 +S_ZBELL_X23 BBLL F 5 NULL S_ZBELL_X24 +S_ZBELL_X24 BBLL E 5 NULL S_ZBELL_X25 +S_ZBELL_X25 BBLL A 5 NULL S_ZBELL_X26 +S_ZBELL_X26 BBLL B 6 NULL S_ZBELL_X27 +S_ZBELL_X27 BBLL C 6 NULL S_ZBELL_X28 +S_ZBELL_X28 BBLL D 7 A_Scream S_ZBELL_X29 +S_ZBELL_X29 BBLL C 6 NULL S_ZBELL_X30 +S_ZBELL_X30 BBLL B 6 NULL S_ZBELL_X31 +S_ZBELL_X31 BBLL A 5 NULL S_ZBELL_X32 +S_ZBELL_X32 BBLL E 6 NULL S_ZBELL_X33 +S_ZBELL_X33 BBLL F 6 NULL S_ZBELL_X34 +S_ZBELL_X34 BBLL G 7 A_Scream S_ZBELL_X35 +S_ZBELL_X35 BBLL F 6 NULL S_ZBELL_X36 +S_ZBELL_X36 BBLL E 6 NULL S_ZBELL_X37 +S_ZBELL_X37 BBLL A 6 NULL S_ZBELL_X38 +S_ZBELL_X38 BBLL B 6 NULL S_ZBELL_X39 +S_ZBELL_X39 BBLL C 6 NULL S_ZBELL_X40 +S_ZBELL_X40 BBLL B 7 NULL S_ZBELL_X41 +S_ZBELL_X41 BBLL A 8 NULL S_ZBELL_X42 +S_ZBELL_X42 BBLL E 12 NULL S_ZBELL_X43 +S_ZBELL_X43 BBLL A 10 NULL S_ZBELL_X44 +S_ZBELL_X44 BBLL B 12 NULL S_ZBELL_X45 +S_ZBELL_X45 BBLL A 12 NULL S_ZBELL_X46 +S_ZBELL_X46 BBLL E 14 NULL S_ZBELL_X47 +S_ZBELL_X47 BBLL A 1 A_BellReset2 S_ZBELL + + +$ MT_ZBLUE_CANDLE +doomednum 8066 +spawnstate S_ZBLUE_CANDLE1 +flags MF_NOBLOCKMAP + +S_ZBLUE_CANDLE1 CAND A* 5 NULL S_ZBLUE_CANDLE2 +S_ZBLUE_CANDLE2 CAND B* 5 NULL S_ZBLUE_CANDLE3 +S_ZBLUE_CANDLE3 CAND C* 5 NULL S_ZBLUE_CANDLE4 +S_ZBLUE_CANDLE4 CAND D* 5 NULL S_ZBLUE_CANDLE5 +S_ZBLUE_CANDLE5 CAND E* 5 NULL S_ZBLUE_CANDLE1 + + +$ MT_ZIRON_MAIDEN +doomednum 8067 +spawnstate S_ZIRON_MAIDEN +radius 12 +height 60 +flags MF_SOLID + +S_ZIRON_MAIDEN IRON A -1 NULL S_NULL + + +$ MT_ZXMAS_TREE +doomednum 8068 +spawnstate S_ZXMAS_TREE +spawnhealth 20 +meleestate S_ZXMAS_TREE_X1 +deathstate S_ZXMAS_TREE_DIE +deathsound TreeExplode +radius 11 +height 130 +mass 0x7fffffff +flags MF_SOLID|MF_SHOOTABLE|MF_NOBLOOD + +S_ZXMAS_TREE XMAS A -1 NULL S_NULL +S_ZXMAS_TREE_DIE XMAS A 4 A_TreeDeath S_ZXMAS_TREE + +S_ZXMAS_TREE_X1 XMAS B* 6 NULL S_ZXMAS_TREE_X2 +S_ZXMAS_TREE_X2 XMAS C* 6 A_Scream S_ZXMAS_TREE_X3 +S_ZXMAS_TREE_X3 XMAS D* 5 NULL S_ZXMAS_TREE_X4 +S_ZXMAS_TREE_X4 XMAS E* 5 A_Explode S_ZXMAS_TREE_X5 +S_ZXMAS_TREE_X5 XMAS F* 5 NULL S_ZXMAS_TREE_X6 +S_ZXMAS_TREE_X6 XMAS G* 4 NULL S_ZXMAS_TREE_X7 +S_ZXMAS_TREE_X7 XMAS H 5 NULL S_ZXMAS_TREE_X8 +S_ZXMAS_TREE_X8 XMAS I 4 A_NoBlocking S_ZXMAS_TREE_X9 +S_ZXMAS_TREE_X9 XMAS J 4 NULL S_ZXMAS_TREE_X10 +S_ZXMAS_TREE_X10 XMAS K -1 NULL S_NULL + + +$ MT_ZCAULDRON +doomednum 8069 +spawnstate S_ZCAULDRON1 +radius 12 +height 26 +flags MF_SOLID + +$ MT_ZCAULDRON_UNLIT +doomednum 8070 +spawnstate S_ZCAULDRON_U +radius 12 +height 26 +flags MF_SOLID + +S_ZCAULDRON1 CDRN B* 4 NULL S_ZCAULDRON2 +S_ZCAULDRON2 CDRN C* 4 NULL S_ZCAULDRON3 +S_ZCAULDRON3 CDRN D* 4 NULL S_ZCAULDRON4 +S_ZCAULDRON4 CDRN E* 4 NULL S_ZCAULDRON5 +S_ZCAULDRON5 CDRN F* 4 NULL S_ZCAULDRON6 +S_ZCAULDRON6 CDRN G* 4 NULL S_ZCAULDRON7 +S_ZCAULDRON7 CDRN H* 4 NULL S_ZCAULDRON1 + +S_ZCAULDRON_U CDRN A -1 NULL S_NULL + + +$ MT_ZCHAINBIT32 +doomednum 8071 +spawnstate S_ZCHAINBIT32 +radius 4 +height 32 +flags MF_NOBLOCKMAP|MF_NOGRAVITY|MF_SPAWNCEILING + +$ MT_ZCHAINBIT64 +doomednum 8072 +spawnstate S_ZCHAINBIT64 +radius 4 +height 64 +flags MF_NOBLOCKMAP|MF_NOGRAVITY|MF_SPAWNCEILING + +$ MT_ZCHAINEND_HEART +doomednum 8073 +spawnstate S_ZCHAINEND_HEART +radius 4 +height 32 +flags MF_NOBLOCKMAP|MF_NOGRAVITY|MF_SPAWNCEILING + +$ MT_ZCHAINEND_HOOK1 +doomednum 8074 +spawnstate S_ZCHAINEND_HOOK1 +radius 4 +height 32 +flags MF_NOBLOCKMAP|MF_NOGRAVITY|MF_SPAWNCEILING + +$ MT_ZCHAINEND_HOOK2 +doomednum 8075 +spawnstate S_ZCHAINEND_HOOK2 +radius 4 +height 32 +flags MF_NOBLOCKMAP|MF_NOGRAVITY|MF_SPAWNCEILING + +$ MT_ZCHAINEND_SPIKE +doomednum 8076 +spawnstate S_ZCHAINEND_SPIKE +radius 4 +height 32 +flags MF_NOBLOCKMAP|MF_NOGRAVITY|MF_SPAWNCEILING + +$ MT_ZCHAINEND_SKULL +doomednum 8077 +spawnstate S_ZCHAINEND_SKULL +radius 4 +height 32 +flags MF_NOBLOCKMAP|MF_NOGRAVITY|MF_SPAWNCEILING + +S_ZCHAINBIT32 CHNS A -1 NULL S_NULL +S_ZCHAINBIT64 CHNS B -1 NULL S_NULL +S_ZCHAINEND_HEART CHNS C -1 NULL S_NULL +S_ZCHAINEND_HOOK1 CHNS D -1 NULL S_NULL +S_ZCHAINEND_HOOK2 CHNS E -1 NULL S_NULL +S_ZCHAINEND_SPIKE CHNS F -1 NULL S_NULL +S_ZCHAINEND_SKULL CHNS G -1 NULL S_NULL + + +$ MT_TABLE_SHIT1 +doomednum 8500 +spawnstate S_TABLE_SHIT1 +flags MF_NOBLOCKMAP + +$ MT_TABLE_SHIT2 +doomednum 8501 +spawnstate S_TABLE_SHIT2 +flags MF_NOBLOCKMAP + +$ MT_TABLE_SHIT3 +doomednum 8502 +spawnstate S_TABLE_SHIT3 +flags MF_NOBLOCKMAP + +$ MT_TABLE_SHIT4 +doomednum 8503 +spawnstate S_TABLE_SHIT4 +flags MF_NOBLOCKMAP + +$ MT_TABLE_SHIT5 +doomednum 8504 +spawnstate S_TABLE_SHIT5 +flags MF_NOBLOCKMAP + +$ MT_TABLE_SHIT6 +doomednum 8505 +spawnstate S_TABLE_SHIT6 +flags MF_NOBLOCKMAP + +$ MT_TABLE_SHIT7 +doomednum 8506 +spawnstate S_TABLE_SHIT7 +flags MF_NOBLOCKMAP + +$ MT_TABLE_SHIT8 +doomednum 8507 +spawnstate S_TABLE_SHIT8 +flags MF_NOBLOCKMAP + +$ MT_TABLE_SHIT9 +doomednum 8508 +spawnstate S_TABLE_SHIT9 +flags MF_NOBLOCKMAP + +$ MT_TABLE_SHIT10 +doomednum 8509 +spawnstate S_TABLE_SHIT10 +flags MF_NOBLOCKMAP + +S_TABLE_SHIT1 TST1 A -1 NULL S_NULL +S_TABLE_SHIT2 TST2 A -1 NULL S_NULL +S_TABLE_SHIT3 TST3 A -1 NULL S_NULL +S_TABLE_SHIT4 TST4 A -1 NULL S_NULL +S_TABLE_SHIT5 TST5 A -1 NULL S_NULL +S_TABLE_SHIT6 TST6 A -1 NULL S_NULL +S_TABLE_SHIT7 TST7 A -1 NULL S_NULL +S_TABLE_SHIT8 TST8 A -1 NULL S_NULL +S_TABLE_SHIT9 TST9 A -1 NULL S_NULL +S_TABLE_SHIT10 TST0 A -1 NULL S_NULL + + +$ MT_TFOG +spawnstate S_TFOG1 +flags MF_NOBLOCKMAP|MF_NOGRAVITY + +S_TFOG1 TELE A* 6 NULL S_TFOG2 +S_TFOG2 TELE B* 6 NULL S_TFOG3 +S_TFOG3 TELE C* 6 NULL S_TFOG4 +S_TFOG4 TELE D* 6 NULL S_TFOG5 +S_TFOG5 TELE E* 6 NULL S_TFOG6 +S_TFOG6 TELE F* 6 NULL S_TFOG7 +S_TFOG7 TELE G* 6 NULL S_TFOG8 +S_TFOG8 TELE H* 6 NULL S_TFOG9 +S_TFOG9 TELE G* 6 NULL S_TFOG10 +S_TFOG10 TELE F* 6 NULL S_TFOG11 +S_TFOG11 TELE E* 6 NULL S_TFOG12 +S_TFOG12 TELE D* 6 NULL S_TFOG13 +S_TFOG13 TELE C* 6 NULL S_NULL + + +$ + +doomednum 140 +spawnstate S_TELESMOKE1 +flags MF_NOBLOCKMAP|MF_NOGRAVITY + +S_TELESMOKE1 TSMK A 4 NULL S_TELESMOKE2 +S_TELESMOKE2 TSMK B 3 NULL S_TELESMOKE3 +S_TELESMOKE3 TSMK C 4 NULL S_TELESMOKE4 +S_TELESMOKE4 TSMK D 3 NULL S_TELESMOKE5 +S_TELESMOKE5 TSMK E 4 NULL S_TELESMOKE6 +S_TELESMOKE6 TSMK F 3 NULL S_TELESMOKE7 +S_TELESMOKE7 TSMK G 4 NULL S_TELESMOKE8 +S_TELESMOKE8 TSMK H 3 NULL S_TELESMOKE9 +S_TELESMOKE9 TSMK I 4 NULL S_TELESMOKE10 +S_TELESMOKE10 TSMK J 3 NULL S_TELESMOKE11 +S_TELESMOKE11 TSMK K 4 NULL S_TELESMOKE12 +S_TELESMOKE12 TSMK L 3 NULL S_TELESMOKE13 +S_TELESMOKE13 TSMK M 4 NULL S_TELESMOKE14 +S_TELESMOKE14 TSMK N 3 NULL S_TELESMOKE15 +S_TELESMOKE15 TSMK O 4 NULL S_TELESMOKE16 +S_TELESMOKE16 TSMK P 3 NULL S_TELESMOKE17 +S_TELESMOKE17 TSMK Q 4 NULL S_TELESMOKE18 +S_TELESMOKE18 TSMK R 3 NULL S_TELESMOKE19 +S_TELESMOKE19 TSMK S 4 NULL S_TELESMOKE20 +S_TELESMOKE20 TSMK T 3 NULL S_TELESMOKE21 +S_TELESMOKE21 TSMK U 4 NULL S_TELESMOKE22 +S_TELESMOKE22 TSMK V 3 NULL S_TELESMOKE23 +S_TELESMOKE23 TSMK W 4 NULL S_TELESMOKE24 +S_TELESMOKE24 TSMK X 3 NULL S_TELESMOKE25 +S_TELESMOKE25 TSMK Y 4 NULL S_TELESMOKE26 +S_TELESMOKE26 TSMK Z 3 NULL S_TELESMOKE1 + + +$ MT_TELEPORTMAN +doomednum 14 +flags MF_NOBLOCKMAP|MF_NOSECTOR + +// +// Player sprite animations +// + +S_LIGHTDONE FPCH A 0 A_Light0 S_NULL + +// +// Fighter fist +// + +$ MT_PUNCHPUFF +spawnstate S_PUNCHPUFF1 +seesound FighterPunchHitThing +attacksound FighterPunchHitWall +flags MF_NOBLOCKMAP|MF_NOGRAVITY +translucency 0.66 + +S_PUNCHREADY FPCH A 1 A_WeaponReady S_PUNCHREADY +S_PUNCHDOWN FPCH A 1 A_Lower S_PUNCHDOWN +S_PUNCHUP FPCH A 1 A_Raise S_PUNCHUP + +S_PUNCHATK1_1 FPCH B 5 NULL S_PUNCHATK1_2 5 40 +S_PUNCHATK1_2 FPCH C 4 NULL S_PUNCHATK1_3 5 40 +S_PUNCHATK1_3 FPCH D 4 A_FPunchAttack S_PUNCHATK1_4 5 40 +S_PUNCHATK1_4 FPCH C 4 NULL S_PUNCHATK1_5 5 40 +S_PUNCHATK1_5 FPCH B 5 A_ReFire S_PUNCHREADY 5 40 +S_PUNCHATK2_1 FPCH D 4 NULL S_PUNCHATK2_2 5 40 +S_PUNCHATK2_2 FPCH E 4 NULL S_PUNCHATK2_3 5 40 +S_PUNCHATK2_3 FPCH E 1 NULL S_PUNCHATK2_4 15 50 +S_PUNCHATK2_4 FPCH E 1 NULL S_PUNCHATK2_5 25 60 +S_PUNCHATK2_5 FPCH E 1 NULL S_PUNCHATK2_6 35 70 +S_PUNCHATK2_6 FPCH E 1 NULL S_PUNCHATK2_7 45 80 +S_PUNCHATK2_7 FPCH E 1 NULL S_PUNCHATK2_8 55 90 +S_PUNCHATK2_8 FPCH E 1 NULL S_PUNCHATK2_9 65 100 +S_PUNCHATK2_9 FPCH E 10 NULL S_PUNCHREADY 0 150 + +S_PUNCHPUFF1 FHFX S 4 NULL S_PUNCHPUFF2 +S_PUNCHPUFF2 FHFX T 4 NULL S_PUNCHPUFF3 +S_PUNCHPUFF3 FHFX U 4 NULL S_PUNCHPUFF4 +S_PUNCHPUFF4 FHFX V 4 NULL S_PUNCHPUFF5 +S_PUNCHPUFF5 FHFX W 4 NULL S_NULL + +// +// Fighter axe +// + +$ MT_FW_AXE +doomednum 8010 +spawnstate S_AXE +flags MF_SPECIAL + +$ MT_AXEPUFF +spawnstate S_HAMMERPUFF1 +seesound FighterAxeHitThing +attacksound FighterHammerHitWall +flags MF_NOBLOCKMAP|MF_NOGRAVITY +translucency 0.33 + +$ MT_AXEPUFF_GLOW +spawnstate S_AXEPUFF_GLOW1 +seesound FighterAxeHitThing +attacksound FighterHammerHitWall +flags MF_NOBLOCKMAP|MF_NOGRAVITY + +$ MT_AXEBLOOD +spawnstate S_AXEBLOOD1 +deathstate S_AXEBLOOD6 +radius 2 +height 4 +flags MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF +flags2 MF2_NOTELEPORT|MF2_CANNOTPUSH + +S_AXE WFAX A -1 NULL S_NULL + +S_FAXEREADY FAXE A 1 A_WeaponReady S_FAXEREADY +S_FAXEDOWN FAXE A 1 A_Lower S_FAXEDOWN +S_FAXEUP FAXE A 1 A_Raise S_FAXEUP + +S_FAXEATK_1 FAXE B 4 NULL S_FAXEATK_2 15 32 +S_FAXEATK_2 FAXE C 3 NULL S_FAXEATK_3 15 32 +S_FAXEATK_3 FAXE D 2 NULL S_FAXEATK_4 15 32 +S_FAXEATK_4 FAXE D 1 A_FAxeAttack S_FAXEATK_5 -5 70 +S_FAXEATK_5 FAXE D 2 NULL S_FAXEATK_6 -25 90 +S_FAXEATK_6 FAXE E 1 NULL S_FAXEATK_7 15 32 +S_FAXEATK_7 FAXE E 2 NULL S_FAXEATK_8 10 54 +S_FAXEATK_8 FAXE E 7 NULL S_FAXEATK_9 10 150 +S_FAXEATK_9 FAXE A 1 A_ReFire S_FAXEATK_10 0 60 +S_FAXEATK_10 FAXE A 1 NULL S_FAXEATK_11 0 52 +S_FAXEATK_11 FAXE A 1 NULL S_FAXEATK_12 0 44 +S_FAXEATK_12 FAXE A 1 NULL S_FAXEATK_13 0 36 +S_FAXEATK_13 FAXE A 1 NULL S_FAXEREADY + +S_FAXEREADY_G FAXE L 1 A_WeaponReady S_FAXEREADY_G1 +S_FAXEREADY_G1 FAXE L 1 A_WeaponReady S_FAXEREADY_G2 +S_FAXEREADY_G2 FAXE L 1 A_WeaponReady S_FAXEREADY_G3 +S_FAXEREADY_G3 FAXE M 1 A_WeaponReady S_FAXEREADY_G4 +S_FAXEREADY_G4 FAXE M 1 A_WeaponReady S_FAXEREADY_G5 +S_FAXEREADY_G5 FAXE M 1 A_WeaponReady S_FAXEREADY_G + +S_FAXEDOWN_G FAXE L 1 A_Lower S_FAXEDOWN_G + +S_FAXEUP_G FAXE L 1 A_Raise S_FAXEUP_G + +S_FAXEATK_G1 FAXE N 4 NULL S_FAXEATK_G2 15 32 +S_FAXEATK_G2 FAXE O 3 NULL S_FAXEATK_G3 15 32 +S_FAXEATK_G3 FAXE P 2 NULL S_FAXEATK_G4 15 32 +S_FAXEATK_G4 FAXE P 1 A_FAxeAttack S_FAXEATK_G5 -5 70 +S_FAXEATK_G5 FAXE P 2 NULL S_FAXEATK_G6 -25 90 +S_FAXEATK_G6 FAXE Q 1 NULL S_FAXEATK_G7 15 32 +S_FAXEATK_G7 FAXE Q 2 NULL S_FAXEATK_G8 10 54 +S_FAXEATK_G8 FAXE Q 7 NULL S_FAXEATK_G9 10 150 +S_FAXEATK_G9 FAXE A 1 A_ReFire S_FAXEATK_G10 0 60 +S_FAXEATK_G10 FAXE A 1 NULL S_FAXEATK_G11 0 52 +S_FAXEATK_G11 FAXE A 1 NULL S_FAXEATK_G12 0 44 +S_FAXEATK_G12 FAXE A 1 NULL S_FAXEATK_G13 0 36 +S_FAXEATK_G13 FAXE A 1 NULL S_FAXEREADY_G + +S_AXEPUFF_GLOW1 FAXE R* 4 NULL S_AXEPUFF_GLOW2 +S_AXEPUFF_GLOW2 FAXE S* 4 NULL S_AXEPUFF_GLOW3 +S_AXEPUFF_GLOW3 FAXE T* 4 NULL S_AXEPUFF_GLOW4 +S_AXEPUFF_GLOW4 FAXE U* 4 NULL S_AXEPUFF_GLOW5 +S_AXEPUFF_GLOW5 FAXE V* 4 NULL S_AXEPUFF_GLOW6 +S_AXEPUFF_GLOW6 FAXE W* 4 NULL S_AXEPUFF_GLOW7 +S_AXEPUFF_GLOW7 FAXE X* 4 NULL S_NULL + +S_AXEBLOOD1 FAXE F 3 NULL S_AXEBLOOD2 +S_AXEBLOOD2 FAXE G 3 NULL S_AXEBLOOD3 +S_AXEBLOOD3 FAXE H 3 NULL S_AXEBLOOD4 +S_AXEBLOOD4 FAXE I 3 NULL S_AXEBLOOD5 +S_AXEBLOOD5 FAXE J 3 NULL S_AXEBLOOD6 +S_AXEBLOOD6 FAXE K 3 NULL S_NULL + +// +// Fighter hammer +// + +$ MT_FW_HAMMER +doomednum 123 +spawnstate S_HAMM +flags MF_SPECIAL + +$ MT_HAMMER_MISSILE +spawnstate S_HAMMER_MISSILE_1 +deathstate S_HAMMER_MISSILE_X1 +deathsound FighterHammerExplode +speed 25 +radius 14 +height 20 +damage 10 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_NOTELEPORT|MF2_IMPACT|MF2_PCROSS|MF2_FIREDAMAGE + +$ MT_HAMMERPUFF +spawnstate S_HAMMERPUFF1 +seesound FighterHammerHitThing +attacksound FighterHammerHitWall +flags MF_NOBLOCKMAP|MF_NOGRAVITY +translucency 0.33 + +S_HAMM WFHM A -1 NULL S_NULL + +S_FHAMMERREADY FHMR A 1 A_WeaponReady S_FHAMMERREADY +S_FHAMMERDOWN FHMR A 1 A_Lower S_FHAMMERDOWN +S_FHAMMERUP FHMR A 1 A_Raise S_FHAMMERUP + +S_FHAMMERATK_1 FHMR B 6 NULL S_FHAMMERATK_2 5 +S_FHAMMERATK_2 FHMR C 3 A_FHammerAttack S_FHAMMERATK_3 5 +S_FHAMMERATK_3 FHMR D 3 NULL S_FHAMMERATK_4 5 +S_FHAMMERATK_4 FHMR E 2 NULL S_FHAMMERATK_5 5 +S_FHAMMERATK_5 FHMR E 10 A_FHammerThrow S_FHAMMERATK_6 5 150 +S_FHAMMERATK_6 FHMR A 1 NULL S_FHAMMERATK_7 0 60 +S_FHAMMERATK_7 FHMR A 1 NULL S_FHAMMERATK_8 0 55 +S_FHAMMERATK_8 FHMR A 1 NULL S_FHAMMERATK_9 0 50 +S_FHAMMERATK_9 FHMR A 1 NULL S_FHAMMERATK_10 0 45 +S_FHAMMERATK_10 FHMR A 1 NULL S_FHAMMERATK_11 0 40 +S_FHAMMERATK_11 FHMR A 1 NULL S_FHAMMERATK_12 0 35 +S_FHAMMERATK_12 FHMR A 1 NULL S_FHAMMERREADY + +S_HAMMER_MISSILE_1 FHFX A* 2 NULL S_HAMMER_MISSILE_2 +S_HAMMER_MISSILE_2 FHFX B* 2 A_ContMobjSound S_HAMMER_MISSILE_3 +S_HAMMER_MISSILE_3 FHFX C* 2 NULL S_HAMMER_MISSILE_4 +S_HAMMER_MISSILE_4 FHFX D* 2 NULL S_HAMMER_MISSILE_5 +S_HAMMER_MISSILE_5 FHFX E* 2 NULL S_HAMMER_MISSILE_6 +S_HAMMER_MISSILE_6 FHFX F* 2 NULL S_HAMMER_MISSILE_7 +S_HAMMER_MISSILE_7 FHFX G* 2 NULL S_HAMMER_MISSILE_8 +S_HAMMER_MISSILE_8 FHFX H* 2 NULL S_HAMMER_MISSILE_1 +S_HAMMER_MISSILE_X1 FHFX I* 3 NULL S_HAMMER_MISSILE_X2 +S_HAMMER_MISSILE_X2 FHFX J* 3 NULL S_HAMMER_MISSILE_X3 +S_HAMMER_MISSILE_X3 FHFX K* 3 A_Explode S_HAMMER_MISSILE_X4 +S_HAMMER_MISSILE_X4 FHFX L* 3 NULL S_HAMMER_MISSILE_X5 +S_HAMMER_MISSILE_X5 FHFX M* 3 NULL S_HAMMER_MISSILE_X6 +S_HAMMER_MISSILE_X6 FHFX N 3 NULL S_HAMMER_MISSILE_X7 +S_HAMMER_MISSILE_X7 FHFX O* 3 NULL S_HAMMER_MISSILE_X8 +S_HAMMER_MISSILE_X8 FHFX P* 3 NULL S_HAMMER_MISSILE_X9 +S_HAMMER_MISSILE_X9 FHFX Q* 3 NULL S_HAMMER_MISSILE_X10 +S_HAMMER_MISSILE_X10 FHFX R* 3 NULL S_NULL + +S_HAMMERPUFF1 FHFX S 4 NULL S_HAMMERPUFF2 +S_HAMMERPUFF2 FHFX T 4 NULL S_HAMMERPUFF3 +S_HAMMERPUFF3 FHFX U 4 NULL S_HAMMERPUFF4 +S_HAMMERPUFF4 FHFX V 4 NULL S_HAMMERPUFF5 +S_HAMMERPUFF5 FHFX W 4 NULL S_NULL + +// +// Fighter sword +// + +$ MT_FSWORD_MISSILE +spawnstate S_FSWORD_MISSILE1 +deathstate S_FSWORD_MISSILE_X1 +deathsound FighterSwordExplode +speed 30 +radius 16 +height 8 +damage 8 +flags MF_MISSILE|MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF +flags2 MF2_NOTELEPORT|MF2_IMPACT|MF2_PCROSS + +$ MT_FSWORD_FLAME +spawnstate S_FSWORD_FLAME1 +flags MF_NOBLOCKMAP|MF_NOGRAVITY +translucency 0.33 + +S_FSWORDREADY FSRD A* 1 A_WeaponReady S_FSWORDREADY1 +S_FSWORDREADY1 FSRD A* 1 A_WeaponReady S_FSWORDREADY2 +S_FSWORDREADY2 FSRD A* 1 A_WeaponReady S_FSWORDREADY3 +S_FSWORDREADY3 FSRD A* 1 A_WeaponReady S_FSWORDREADY4 +S_FSWORDREADY4 FSRD B* 1 A_WeaponReady S_FSWORDREADY5 +S_FSWORDREADY5 FSRD B* 1 A_WeaponReady S_FSWORDREADY6 +S_FSWORDREADY6 FSRD B* 1 A_WeaponReady S_FSWORDREADY7 +S_FSWORDREADY7 FSRD B* 1 A_WeaponReady S_FSWORDREADY8 +S_FSWORDREADY8 FSRD C* 1 A_WeaponReady S_FSWORDREADY9 +S_FSWORDREADY9 FSRD C* 1 A_WeaponReady S_FSWORDREADY10 +S_FSWORDREADY10 FSRD C* 1 A_WeaponReady S_FSWORDREADY11 +S_FSWORDREADY11 FSRD C* 1 A_WeaponReady S_FSWORDREADY + +S_FSWORDDOWN FSRD A* 1 A_Lower S_FSWORDDOWN +S_FSWORDUP FSRD A* 1 A_Raise S_FSWORDUP + +S_FSWORDATK_1 FSRD D* 3 NULL S_FSWORDATK_2 5 36 +S_FSWORDATK_2 FSRD E* 3 NULL S_FSWORDATK_3 5 36 +S_FSWORDATK_3 FSRD F* 2 NULL S_FSWORDATK_4 5 36 +S_FSWORDATK_4 FSRD G* 3 A_FSwordAttack S_FSWORDATK_5 5 36 +S_FSWORDATK_5 FSRD H* 2 NULL S_FSWORDATK_6 5 36 +S_FSWORDATK_6 FSRD I* 2 NULL S_FSWORDATK_7 5 36 +S_FSWORDATK_7 FSRD I* 10 NULL S_FSWORDATK_8 5 150 +S_FSWORDATK_8 FSRD A* 1 NULL S_FSWORDATK_9 5 60 +S_FSWORDATK_9 FSRD B* 1 NULL S_FSWORDATK_10 5 55 +S_FSWORDATK_10 FSRD C* 1 NULL S_FSWORDATK_11 5 50 +S_FSWORDATK_11 FSRD A* 1 NULL S_FSWORDATK_12 5 45 +S_FSWORDATK_12 FSRD B* 1 NULL S_FSWORDREADY 5 40 + +S_FSWORD_MISSILE1 FSFX A* 3 NULL S_FSWORD_MISSILE2 +S_FSWORD_MISSILE2 FSFX B* 3 NULL S_FSWORD_MISSILE3 +S_FSWORD_MISSILE3 FSFX C* 3 NULL S_FSWORD_MISSILE1 +S_FSWORD_MISSILE_X1 FSFX D* 4 NULL S_FSWORD_MISSILE_X2 +S_FSWORD_MISSILE_X2 FSFX E* 3 A_FSwordFlames S_FSWORD_MISSILE_X3 +S_FSWORD_MISSILE_X3 FSFX F* 4 A_Explode S_FSWORD_MISSILE_X4 +S_FSWORD_MISSILE_X4 FSFX G* 3 NULL S_FSWORD_MISSILE_X5 +S_FSWORD_MISSILE_X5 FSFX H* 4 NULL S_FSWORD_MISSILE_X6 +S_FSWORD_MISSILE_X6 FSFX I* 3 NULL S_FSWORD_MISSILE_X7 +S_FSWORD_MISSILE_X7 FSFX J* 4 NULL S_FSWORD_MISSILE_X8 +S_FSWORD_MISSILE_X8 FSFX K* 3 NULL S_FSWORD_MISSILE_X9 +S_FSWORD_MISSILE_X9 FSFX L* 3 NULL S_FSWORD_MISSILE_X10 +S_FSWORD_MISSILE_X10 FSFX M* 3 NULL S_NULL + +S_FSWORD_FLAME1 FSFX N* 3 NULL S_FSWORD_FLAME2 +S_FSWORD_FLAME2 FSFX O* 3 NULL S_FSWORD_FLAME3 +S_FSWORD_FLAME3 FSFX P* 3 NULL S_FSWORD_FLAME4 +S_FSWORD_FLAME4 FSFX Q* 3 NULL S_FSWORD_FLAME5 +S_FSWORD_FLAME5 FSFX R* 3 NULL S_FSWORD_FLAME6 +S_FSWORD_FLAME6 FSFX S* 3 NULL S_FSWORD_FLAME7 +S_FSWORD_FLAME7 FSFX T* 3 NULL S_FSWORD_FLAME8 +S_FSWORD_FLAME8 FSFX U* 3 NULL S_FSWORD_FLAME9 +S_FSWORD_FLAME9 FSFX V* 3 NULL S_FSWORD_FLAME10 +S_FSWORD_FLAME10 FSFX W* 3 NULL S_NULL + +// +// Cleric mace +// + +S_CMACEREADY CMCE A 1 A_WeaponReady S_CMACEREADY +S_CMACEDOWN CMCE A 1 A_Lower S_CMACEDOWN +S_CMACEUP CMCE A 1 A_Raise S_CMACEUP + +S_CMACEATK_1 CMCE B 2 NULL S_CMACEATK_2 60 20 +S_CMACEATK_2 CMCE B 1 NULL S_CMACEATK_3 30 33 +S_CMACEATK_3 CMCE B 2 NULL S_CMACEATK_4 8 45 +S_CMACEATK_4 CMCE C 1 NULL S_CMACEATK_5 8 45 +S_CMACEATK_5 CMCE D 1 NULL S_CMACEATK_6 8 45 +S_CMACEATK_6 CMCE E 1 NULL S_CMACEATK_7 8 45 +S_CMACEATK_7 CMCE E 1 A_CMaceAttack S_CMACEATK_8 -11 58 +S_CMACEATK_8 CMCE F 1 NULL S_CMACEATK_9 8 45 +S_CMACEATK_9 CMCE F 2 NULL S_CMACEATK_10 -8 74 +S_CMACEATK_10 CMCE F 1 NULL S_CMACEATK_11 -20 96 +S_CMACEATK_11 CMCE F 8 NULL S_CMACEATK_12 -33 160 +S_CMACEATK_12 CMCE A 2 A_ReFire S_CMACEATK_13 8 75 +S_CMACEATK_13 CMCE A 1 NULL S_CMACEATK_14 8 65 +S_CMACEATK_14 CMCE A 2 NULL S_CMACEATK_15 8 60 +S_CMACEATK_15 CMCE A 1 NULL S_CMACEATK_16 8 55 +S_CMACEATK_16 CMCE A 2 NULL S_CMACEATK_17 8 50 +S_CMACEATK_17 CMCE A 1 NULL S_CMACEREADY 8 45 + +// +// Cleric serpeant staff +// + +$ MT_CW_SERPSTAFF +doomednum 10 +spawnstate S_CSTAFF +flags MF_SPECIAL + +$ MT_CSTAFF_MISSILE +spawnstate S_CSTAFF_MISSILE1 +deathstate S_CSTAFF_MISSILE_X1 +deathsound ClericCStaffExplode +speed 22 +radius 12 +height 10 +damage 5 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_NOTELEPORT|MF2_IMPACT|MF2_PCROSS + +$ MT_CSTAFFPUFF +spawnstate S_CSTAFFPUFF1 +seesound ClericCStaffHitThing +flags MF_NOBLOCKMAP|MF_NOGRAVITY +translucency 0.33 + +S_CSTAFF WCSS A -1 NULL S_NULL + +S_CSTAFFREADY CSSF C 4 NULL S_CSTAFFREADY1 +S_CSTAFFREADY1 CSSF B 3 A_CStaffInitBlink S_CSTAFFREADY2 +S_CSTAFFREADY2 CSSF A 1 A_WeaponReady S_CSTAFFREADY3 +S_CSTAFFREADY3 CSSF A 1 A_WeaponReady S_CSTAFFREADY4 +S_CSTAFFREADY4 CSSF A 1 A_WeaponReady S_CSTAFFREADY5 +S_CSTAFFREADY5 CSSF A 1 A_WeaponReady S_CSTAFFREADY6 +S_CSTAFFREADY6 CSSF A 1 A_WeaponReady S_CSTAFFREADY7 +S_CSTAFFREADY7 CSSF A 1 A_WeaponReady S_CSTAFFREADY8 +S_CSTAFFREADY8 CSSF A 1 A_WeaponReady S_CSTAFFREADY9 +S_CSTAFFREADY9 CSSF A 1 A_CStaffCheckBlink S_CSTAFFREADY2 + +S_CSTAFFBLINK1 CSSF B 1 A_WeaponReady S_CSTAFFBLINK2 +S_CSTAFFBLINK2 CSSF B 1 A_WeaponReady S_CSTAFFBLINK3 +S_CSTAFFBLINK3 CSSF B 1 A_WeaponReady S_CSTAFFBLINK4 +S_CSTAFFBLINK4 CSSF C 1 A_WeaponReady S_CSTAFFBLINK5 +S_CSTAFFBLINK5 CSSF C 1 A_WeaponReady S_CSTAFFBLINK6 +S_CSTAFFBLINK6 CSSF C 1 A_WeaponReady S_CSTAFFBLINK7 +S_CSTAFFBLINK7 CSSF C 1 A_WeaponReady S_CSTAFFBLINK8 +S_CSTAFFBLINK8 CSSF C 1 A_WeaponReady S_CSTAFFBLINK9 +S_CSTAFFBLINK9 CSSF B 1 A_WeaponReady S_CSTAFFBLINK10 +S_CSTAFFBLINK10 CSSF B 1 A_WeaponReady S_CSTAFFBLINK11 +S_CSTAFFBLINK11 CSSF B 1 A_WeaponReady S_CSTAFFREADY2 + +S_CSTAFFDOWN CSSF B 3 NULL S_CSTAFFDOWN2 +S_CSTAFFDOWN2 CSSF C 4 NULL S_CSTAFFDOWN3 +S_CSTAFFDOWN3 CSSF C 1 A_Lower S_CSTAFFDOWN3 + +S_CSTAFFUP CSSF C 1 A_Raise S_CSTAFFUP + +S_CSTAFFATK_1 CSSF A 1 A_CStaffCheck S_CSTAFFATK_2 0 45 +S_CSTAFFATK_2 CSSF J 1 A_CStaffAttack S_CSTAFFATK_3 0 50 +S_CSTAFFATK_3 CSSF J 2 NULL S_CSTAFFATK_4 0 50 +S_CSTAFFATK_4 CSSF J 2 NULL S_CSTAFFATK_5 0 45 +S_CSTAFFATK_5 CSSF A 2 NULL S_CSTAFFATK_6 0 40 +S_CSTAFFATK_6 CSSF A 2 NULL S_CSTAFFREADY2 0 36 +S_CSTAFFATK2_1 CSSF K 10 NULL S_CSTAFFREADY2 0 36 + +S_CSTAFF_MISSILE1 CSSF D* 1 A_CStaffMissileSlither S_CSTAFF_MISSILE2 +S_CSTAFF_MISSILE2 CSSF D* 1 A_CStaffMissileSlither S_CSTAFF_MISSILE3 +S_CSTAFF_MISSILE3 CSSF E* 1 A_CStaffMissileSlither S_CSTAFF_MISSILE4 +S_CSTAFF_MISSILE4 CSSF E* 1 A_CStaffMissileSlither S_CSTAFF_MISSILE1 +S_CSTAFF_MISSILE_X1 CSSF F* 4 NULL S_CSTAFF_MISSILE_X2 +S_CSTAFF_MISSILE_X2 CSSF G* 4 NULL S_CSTAFF_MISSILE_X3 +S_CSTAFF_MISSILE_X3 CSSF H* 3 NULL S_CSTAFF_MISSILE_X4 +S_CSTAFF_MISSILE_X4 CSSF I* 3 NULL S_NULL + +S_CSTAFFPUFF1 FHFX S 4 NULL S_CSTAFFPUFF2 +S_CSTAFFPUFF2 FHFX T 4 NULL S_CSTAFFPUFF3 +S_CSTAFFPUFF3 FHFX U 4 NULL S_CSTAFFPUFF4 +S_CSTAFFPUFF4 FHFX V 4 NULL S_CSTAFFPUFF5 +S_CSTAFFPUFF5 FHFX W 4 NULL S_NULL + +// +// Cleric fire +// + +$ MT_CW_FLAME +doomednum 8009 +spawnstate S_CFLAME1 +flags MF_SPECIAL|MF_NOGRAVITY + +$ MT_CFLAMEFLOOR +spawnstate S_CFLAMEFLOOR1 +flags MF_NOBLOCKMAP|MF_NOGRAVITY + +$ MT_FLAMEPUFF +spawnstate S_FLAMEPUFF1 +seesound ClericFlameExplode +attacksound ClericFlameExplode +radius 1 +height 1 +flags MF_NOBLOCKMAP|MF_NOGRAVITY + +$ MT_FLAMEPUFF2 +spawnstate S_FLAMEPUFF2_1 +seesound ClericFlameExplode +attacksound ClericFlameExplode +radius 1 +height 1 +flags MF_NOBLOCKMAP|MF_NOGRAVITY + +$ MT_CIRCLEFLAME +spawnstate S_CIRCLE_FLAME1 +deathstate S_CIRCLE_FLAME_X1 +deathsound ClericFlameCircle +radius 6 +damage 2 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_NOTELEPORT|MF2_FIREDAMAGE + +$ MT_CFLAME_MISSILE +spawnstate S_CFLAME_MISSILE1 +deathstate S_CFLAME_MISSILE_X +speed 200 +radius 14 +height 8 +damage 8 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_NOTELEPORT|MF2_IMPACT|MF2_PCROSS|MF2_DONTDRAW|MF2_FIREDAMAGE + +S_CFLAME1 WCFM A* 4 NULL S_CFLAME2 +S_CFLAME2 WCFM B* 4 NULL S_CFLAME3 +S_CFLAME3 WCFM C* 4 NULL S_CFLAME4 +S_CFLAME4 WCFM D* 4 NULL S_CFLAME5 +S_CFLAME5 WCFM E* 4 NULL S_CFLAME6 +S_CFLAME6 WCFM F* 4 NULL S_CFLAME7 +S_CFLAME7 WCFM G* 4 NULL S_CFLAME8 +S_CFLAME8 WCFM H* 4 NULL S_CFLAME1 + +S_CFLAMEREADY1 CFLM A 1 A_WeaponReady S_CFLAMEREADY2 +S_CFLAMEREADY2 CFLM A 1 A_WeaponReady S_CFLAMEREADY3 +S_CFLAMEREADY3 CFLM A 1 A_WeaponReady S_CFLAMEREADY4 +S_CFLAMEREADY4 CFLM A 1 A_WeaponReady S_CFLAMEREADY5 +S_CFLAMEREADY5 CFLM B 1 A_WeaponReady S_CFLAMEREADY6 +S_CFLAMEREADY6 CFLM B 1 A_WeaponReady S_CFLAMEREADY7 +S_CFLAMEREADY7 CFLM B 1 A_WeaponReady S_CFLAMEREADY8 +S_CFLAMEREADY8 CFLM B 1 A_WeaponReady S_CFLAMEREADY9 +S_CFLAMEREADY9 CFLM C 1 A_WeaponReady S_CFLAMEREADY10 +S_CFLAMEREADY10 CFLM C 1 A_WeaponReady S_CFLAMEREADY11 +S_CFLAMEREADY11 CFLM C 1 A_WeaponReady S_CFLAMEREADY12 +S_CFLAMEREADY12 CFLM C 1 A_WeaponReady S_CFLAMEREADY1 + +S_CFLAMEDOWN CFLM A 1 A_Lower S_CFLAMEDOWN +S_CFLAMEUP CFLM A 1 A_Raise S_CFLAMEUP + +S_CFLAMEATK_1 CFLM A 2 NULL S_CFLAMEATK_2 0 40 +S_CFLAMEATK_2 CFLM D 2 NULL S_CFLAMEATK_3 0 50 +S_CFLAMEATK_3 CFLM D 2 NULL S_CFLAMEATK_4 0 36 +S_CFLAMEATK_4 CFLM E* 4 NULL S_CFLAMEATK_5 +S_CFLAMEATK_5 CFLM F* 4 A_CFlameAttack S_CFLAMEATK_6 +S_CFLAMEATK_6 CFLM E* 4 NULL S_CFLAMEATK_7 +S_CFLAMEATK_7 CFLM G 2 NULL S_CFLAMEATK_8 0 40 +S_CFLAMEATK_8 CFLM G 2 NULL S_CFLAMEREADY1 + +S_CFLAMEFLOOR1 CFFX N* 5 NULL S_CFLAMEFLOOR2 +S_CFLAMEFLOOR2 CFFX O* 4 NULL S_CFLAMEFLOOR3 +S_CFLAMEFLOOR3 CFFX P* 3 NULL S_NULL + +S_FLAMEPUFF1 CFFX A* 3 NULL S_FLAMEPUFF2 +S_FLAMEPUFF2 CFFX B* 3 NULL S_FLAMEPUFF3 +S_FLAMEPUFF3 CFFX C* 3 NULL S_FLAMEPUFF4 +S_FLAMEPUFF4 CFFX D* 4 NULL S_FLAMEPUFF5 +S_FLAMEPUFF5 CFFX E* 3 NULL S_FLAMEPUFF6 +S_FLAMEPUFF6 CFFX F* 4 NULL S_FLAMEPUFF7 +S_FLAMEPUFF7 CFFX G* 3 NULL S_FLAMEPUFF8 +S_FLAMEPUFF8 CFFX H* 4 NULL S_FLAMEPUFF9 +S_FLAMEPUFF9 CFFX I* 3 NULL S_FLAMEPUFF10 +S_FLAMEPUFF10 CFFX J* 4 NULL S_FLAMEPUFF11 +S_FLAMEPUFF11 CFFX K* 3 NULL S_FLAMEPUFF12 +S_FLAMEPUFF12 CFFX L* 4 NULL S_FLAMEPUFF13 +S_FLAMEPUFF13 CFFX M* 3 NULL S_NULL + +S_FLAMEPUFF2_1 CFFX A* 3 NULL S_FLAMEPUFF2_2 +S_FLAMEPUFF2_2 CFFX B* 3 NULL S_FLAMEPUFF2_3 +S_FLAMEPUFF2_3 CFFX C* 3 NULL S_FLAMEPUFF2_4 +S_FLAMEPUFF2_4 CFFX D* 4 NULL S_FLAMEPUFF2_5 +S_FLAMEPUFF2_5 CFFX E* 3 NULL S_FLAMEPUFF2_6 +S_FLAMEPUFF2_6 CFFX F* 4 NULL S_FLAMEPUFF2_7 +S_FLAMEPUFF2_7 CFFX G* 3 NULL S_FLAMEPUFF2_8 +S_FLAMEPUFF2_8 CFFX H* 4 NULL S_FLAMEPUFF2_9 +S_FLAMEPUFF2_9 CFFX I* 3 NULL S_FLAMEPUFF2_10 +S_FLAMEPUFF2_10 CFFX C* 3 NULL S_FLAMEPUFF2_11 +S_FLAMEPUFF2_11 CFFX D* 4 NULL S_FLAMEPUFF2_12 +S_FLAMEPUFF2_12 CFFX E* 3 NULL S_FLAMEPUFF2_13 +S_FLAMEPUFF2_13 CFFX F* 4 NULL S_FLAMEPUFF2_14 +S_FLAMEPUFF2_14 CFFX G* 3 NULL S_FLAMEPUFF2_15 +S_FLAMEPUFF2_15 CFFX H* 4 NULL S_FLAMEPUFF2_16 +S_FLAMEPUFF2_16 CFFX I* 3 NULL S_FLAMEPUFF2_17 +S_FLAMEPUFF2_17 CFFX J* 4 NULL S_FLAMEPUFF2_18 +S_FLAMEPUFF2_18 CFFX K* 3 NULL S_FLAMEPUFF2_19 +S_FLAMEPUFF2_19 CFFX L* 4 NULL S_FLAMEPUFF2_20 +S_FLAMEPUFF2_20 CFFX M* 3 NULL S_NULL + +S_CIRCLE_FLAME1 CFCF A* 4 NULL S_CIRCLE_FLAME2 +S_CIRCLE_FLAME2 CFCF B* 2 A_CFlameRotate S_CIRCLE_FLAME3 +S_CIRCLE_FLAME3 CFCF C* 2 NULL S_CIRCLE_FLAME4 +S_CIRCLE_FLAME4 CFCF D* 1 NULL S_CIRCLE_FLAME5 +S_CIRCLE_FLAME5 CFCF E* 2 NULL S_CIRCLE_FLAME6 +S_CIRCLE_FLAME6 CFCF F* 2 A_CFlameRotate S_CIRCLE_FLAME7 +S_CIRCLE_FLAME7 CFCF G* 1 NULL S_CIRCLE_FLAME8 +S_CIRCLE_FLAME8 CFCF H* 2 NULL S_CIRCLE_FLAME9 +S_CIRCLE_FLAME9 CFCF I* 2 NULL S_CIRCLE_FLAME10 +S_CIRCLE_FLAME10 CFCF J* 1 A_CFlameRotate S_CIRCLE_FLAME11 +S_CIRCLE_FLAME11 CFCF K* 2 NULL S_CIRCLE_FLAME12 +S_CIRCLE_FLAME12 CFCF L* 3 NULL S_CIRCLE_FLAME13 +S_CIRCLE_FLAME13 CFCF M* 3 NULL S_CIRCLE_FLAME14 +S_CIRCLE_FLAME14 CFCF N* 2 A_CFlameRotate S_CIRCLE_FLAME15 +S_CIRCLE_FLAME15 CFCF O* 3 NULL S_CIRCLE_FLAME16 +S_CIRCLE_FLAME16 CFCF P* 2 NULL S_NULL + +S_CIRCLE_FLAME_X1 CFCF Q* 3 NULL S_CIRCLE_FLAME_X2 +S_CIRCLE_FLAME_X2 CFCF R* 3 NULL S_CIRCLE_FLAME_X3 +S_CIRCLE_FLAME_X3 CFCF S* 3 A_Explode S_CIRCLE_FLAME_X4 +S_CIRCLE_FLAME_X4 CFCF T* 3 NULL S_CIRCLE_FLAME_X5 +S_CIRCLE_FLAME_X5 CFCF U* 3 NULL S_CIRCLE_FLAME_X6 +S_CIRCLE_FLAME_X6 CFCF V* 3 NULL S_CIRCLE_FLAME_X7 +S_CIRCLE_FLAME_X7 CFCF W* 3 NULL S_CIRCLE_FLAME_X8 +S_CIRCLE_FLAME_X8 CFCF X* 3 NULL S_CIRCLE_FLAME_X9 +S_CIRCLE_FLAME_X9 CFCF Y* 3 NULL S_CIRCLE_FLAME_X10 +S_CIRCLE_FLAME_X10 CFCF Z* 3 NULL S_NULL + +S_CFLAME_MISSILE1 CFFX A* 4 NULL S_CFLAME_MISSILE2 +S_CFLAME_MISSILE2 CFFX A 1 A_CFlamePuff S_FLAMEPUFF1 +S_CFLAME_MISSILE_X CFFX A* 1 A_CFlameMissile S_FLAMEPUFF1 + +// +// Cleric (is quite a) holy (guy, yes?) +// + +$ MT_HOLY_FX +spawnstate S_HOLY_FX1 +spawnhealth 105 +deathstate S_HOLY_FX_X1 +deathsound SpiritDie +speed 12 +radius 10 +height 6 +damage 3 +flags MF_NOBLOCKMAP|MF_DROPOFF|MF_NOGRAVITY|MF_MISSILE +flags2 MF2_NOTELEPORT|MF2_SEEKERMISSILE|MF2_RIP|MF2_IMPACT|MF2_PCROSS +translucency 0.66 + +$ MT_HOLY_TAIL +spawnstate S_HOLY_TAIL1 +radius 1 +height 1 +flags MF_NOBLOCKMAP|MF_DROPOFF|MF_NOGRAVITY|MF_NOCLIP +flags2 MF2_NOTELEPORT +translucency 0.66 + +$ MT_HOLY_PUFF +spawnstate S_HOLY_PUFF1 +flags MF_NOBLOCKMAP|MF_NOGRAVITY +translucency 0.33 + +$ MT_HOLY_MISSILE +spawnstate S_HOLY_MISSILE1 +deathstate S_HOLY_MISSILE_X +speed 30 +radius 15 +height 8 +damage 4 +flags MF_NOBLOCKMAP|MF_DROPOFF|MF_NOGRAVITY|MF_MISSILE +flags2 MF2_NOTELEPORT + +$ MT_HOLY_MISSILE_PUFF +spawnstate S_HOLY_MISSILE_P1 +radius 4 +height 8 +flags MF_NOBLOCKMAP|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_NOTELEPORT +translucency 0.66 + +S_CHOLYREADY CHLY A 1 A_WeaponReady S_CHOLYREADY +S_CHOLYDOWN CHLY A 1 A_Lower S_CHOLYDOWN +S_CHOLYUP CHLY A 1 A_Raise S_CHOLYUP + +S_CHOLYATK_1 CHLY A* 1 NULL S_CHOLYATK_2 0 40 +S_CHOLYATK_2 CHLY B* 1 NULL S_CHOLYATK_3 0 40 +S_CHOLYATK_3 CHLY C* 2 NULL S_CHOLYATK_4 0 43 +S_CHOLYATK_4 CHLY D* 2 NULL S_CHOLYATK_5 0 43 +S_CHOLYATK_5 CHLY E* 2 NULL S_CHOLYATK_6 0 45 +S_CHOLYATK_6 CHLY F* 6 A_CHolyAttack S_CHOLYATK_7 0 48 +S_CHOLYATK_7 CHLY G* 2 A_CHolyPalette S_CHOLYATK_8 0 40 +S_CHOLYATK_8 CHLY G* 2 A_CHolyPalette S_CHOLYATK_9 0 40 +S_CHOLYATK_9 CHLY G* 2 A_CHolyPalette S_CHOLYREADY 0 36 + +S_HOLY_FX1 SPIR A 2 A_CHolySeek S_HOLY_FX2 +S_HOLY_FX2 SPIR A 2 A_CHolySeek S_HOLY_FX3 +S_HOLY_FX3 SPIR B 2 A_CHolySeek S_HOLY_FX4 +S_HOLY_FX4 SPIR B 2 A_CHolyCheckScream S_HOLY_FX1 + +S_HOLY_FX_X1 SPIR D 4 NULL S_HOLY_FX_X2 +S_HOLY_FX_X2 SPIR E 4 A_Scream S_HOLY_FX_X3 +S_HOLY_FX_X3 SPIR F 4 NULL S_HOLY_FX_X4 +S_HOLY_FX_X4 SPIR G 4 NULL S_HOLY_FX_X5 +S_HOLY_FX_X5 SPIR H 4 NULL S_HOLY_FX_X6 +S_HOLY_FX_X6 SPIR I 4 NULL S_NULL + +S_HOLY_TAIL1 SPIR C 1 A_CHolyTail S_HOLY_TAIL1 +S_HOLY_TAIL2 SPIR D -1 NULL S_NULL + +S_HOLY_PUFF1 SPIR K 3 NULL S_HOLY_PUFF2 +S_HOLY_PUFF2 SPIR L 3 NULL S_HOLY_PUFF3 +S_HOLY_PUFF3 SPIR M 3 NULL S_HOLY_PUFF4 +S_HOLY_PUFF4 SPIR N 3 NULL S_HOLY_PUFF5 +S_HOLY_PUFF5 SPIR O 3 NULL S_NULL + +S_HOLY_MISSILE1 SPIR P* 3 A_CHolySpawnPuff S_HOLY_MISSILE2 +S_HOLY_MISSILE2 SPIR P* 3 A_CHolySpawnPuff S_HOLY_MISSILE3 +S_HOLY_MISSILE3 SPIR P* 3 A_CHolySpawnPuff S_HOLY_MISSILE4 +S_HOLY_MISSILE4 SPIR P* 3 A_CHolySpawnPuff S_HOLY_MISSILE_X +S_HOLY_MISSILE_X SPIR P* 1 A_CHolyAttack2 S_NULL + +S_HOLY_MISSILE_P1 SPIR Q 3 NULL S_HOLY_MISSILE_P2 +S_HOLY_MISSILE_P2 SPIR R 3 NULL S_HOLY_MISSILE_P3 +S_HOLY_MISSILE_P3 SPIR S 3 NULL S_HOLY_MISSILE_P4 +S_HOLY_MISSILE_P4 SPIR T 3 NULL S_HOLY_MISSILE_P5 +S_HOLY_MISSILE_P5 SPIR U 3 NULL S_NULL + +// +// Mage wand +// + +$ MT_MWANDPUFF +spawnstate S_MWANDPUFF1 +flags MF_NOBLOCKMAP|MF_NOGRAVITY +flags2 MF2_NOTELEPORT|MF2_CANNOTPUSH|MF2_NODMGTHRUST + +$ MT_MWANDSMOKE +spawnstate S_MWANDSMOKE1 +flags MF_NOBLOCKMAP|MF_NOGRAVITY|MF_SHADO +flags2 MF2_NOTELEPORT|MF2_CANNOTPUSH|MF2_NODMGTHRUST + +$ MT_MWAND_MISSILE +spawnstate S_MWAND_MISSILE1 +deathstate S_MWANDPUFF1 +speed 184 +radius 12 +height 8 +damage 2 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_NOTELEPORT|MF2_RIP|MF2_IMPACT|MF2_PCROSS|MF2_NODMGTHRUST|MF2_CANNOTPUSH + +S_MWANDREADY MWND A 1 A_WeaponReady S_MWANDREADY +S_MWANDDOWN MWND A 1 A_Lower S_MWANDDOWN +S_MWANDUP MWND A 1 A_Raise S_MWANDUP + +S_MWANDATK_1 MWND A 6 NULL S_MWANDATK_2 +S_MWANDATK_2 MWND B* 6 A_MWandAttack S_MWANDATK_3 0 48 +S_MWANDATK_3 MWND A 3 NULL S_MWANDATK_4 0 40 +S_MWANDATK_4 MWND A 3 A_ReFire S_MWANDREADY 0 36 + +S_MWANDPUFF1 MWND E* 4 NULL S_MWANDPUFF2 +S_MWANDPUFF2 MWND F* 3 NULL S_MWANDPUFF3 +S_MWANDPUFF3 MWND G* 4 NULL S_MWANDPUFF4 +S_MWANDPUFF4 MWND H* 3 NULL S_MWANDPUFF5 +S_MWANDPUFF5 MWND I* 4 NULL S_NULL + +S_MWANDSMOKE1 MWND C 4 NULL S_MWANDSMOKE2 +S_MWANDSMOKE2 MWND D 4 NULL S_MWANDSMOKE3 +S_MWANDSMOKE3 MWND C 4 NULL S_MWANDSMOKE4 +S_MWANDSMOKE4 MWND D 4 NULL S_NULL + +S_MWAND_MISSILE1 MWND C* 4 NULL S_MWAND_MISSILE2 +S_MWAND_MISSILE2 MWND D* 4 NULL S_MWAND_MISSILE1 + +// +// Mage lightning +// + +$ MT_MW_LIGHTNING +doomednum 8040 +spawnstate S_MW_LIGHTNING1 +flags MF_SPECIAL|MF_NOGRAVITY + +$ MT_LIGHTNING_CEILING +spawnstate S_LIGHTNING_CEILING1 +spawnhealth 144 +deathstate S_LIGHTNING_C_X1 +speed 25 +radius 16 +height 40 +damage 8 +flags MF_NOBLOCKMAP|MF_NOGRAVITY|MF_MISSILE|MF_DROPOFF +flags2 MF2_NOTELEPORT|MF2_IMPACT|MF2_PCROSS + +$ MT_LIGHTNING_FLOOR +spawnstate S_LIGHTNING_FLOOR1 +spawnhealth 144 +deathstate S_LIGHTNING_F_X1 +speed 25 +radius 16 +height 40 +damage 8 +flags MF_NOBLOCKMAP|MF_NOGRAVITY|MF_MISSILE|MF_DROPOFF +flags2 MF2_NOTELEPORT|MF2_IMPACT|MF2_PCROSS + +$ MT_LIGHTNING_ZAP +spawnstate S_LIGHTNING_ZAP1 +deathstate S_LIGHTNING_ZAP_X8 +radius 15 +height 35 +damage 2 +flags MF_NOBLOCKMAP|MF_NOGRAVITY|MF_MISSILE|MF_DROPOFF + +S_MW_LIGHTNING1 WMLG A* 4 NULL S_MW_LIGHTNING2 +S_MW_LIGHTNING2 WMLG B* 4 NULL S_MW_LIGHTNING3 +S_MW_LIGHTNING3 WMLG C* 4 NULL S_MW_LIGHTNING4 +S_MW_LIGHTNING4 WMLG D* 4 NULL S_MW_LIGHTNING5 +S_MW_LIGHTNING5 WMLG E* 4 NULL S_MW_LIGHTNING6 +S_MW_LIGHTNING6 WMLG F* 4 NULL S_MW_LIGHTNING7 +S_MW_LIGHTNING7 WMLG G* 4 NULL S_MW_LIGHTNING8 +S_MW_LIGHTNING8 WMLG H* 4 NULL S_MW_LIGHTNING1 + +S_MLIGHTNINGREADY MLNG A* 1 A_WeaponReady S_MLIGHTNINGREADY2 +S_MLIGHTNINGREADY2 MLNG A* 1 A_WeaponReady S_MLIGHTNINGREADY3 +S_MLIGHTNINGREADY3 MLNG A* 1 A_WeaponReady S_MLIGHTNINGREADY4 +S_MLIGHTNINGREADY4 MLNG A* 1 A_WeaponReady S_MLIGHTNINGREADY5 +S_MLIGHTNINGREADY5 MLNG A* 1 A_WeaponReady S_MLIGHTNINGREADY6 +S_MLIGHTNINGREADY6 MLNG A* 1 A_LightningReady S_MLIGHTNINGREADY7 +S_MLIGHTNINGREADY7 MLNG B* 1 A_WeaponReady S_MLIGHTNINGREADY8 +S_MLIGHTNINGREADY8 MLNG B* 1 A_WeaponReady S_MLIGHTNINGREADY9 +S_MLIGHTNINGREADY9 MLNG B* 1 A_WeaponReady S_MLIGHTNINGREADY10 +S_MLIGHTNINGREADY10 MLNG B* 1 A_WeaponReady S_MLIGHTNINGREADY11 +S_MLIGHTNINGREADY11 MLNG B* 1 A_WeaponReady S_MLIGHTNINGREADY12 +S_MLIGHTNINGREADY12 MLNG B* 1 A_WeaponReady S_MLIGHTNINGREADY13 +S_MLIGHTNINGREADY13 MLNG C* 1 A_WeaponReady S_MLIGHTNINGREADY14 +S_MLIGHTNINGREADY14 MLNG C* 1 A_WeaponReady S_MLIGHTNINGREADY15 +S_MLIGHTNINGREADY15 MLNG C* 1 A_WeaponReady S_MLIGHTNINGREADY16 +S_MLIGHTNINGREADY16 MLNG C* 1 A_WeaponReady S_MLIGHTNINGREADY17 +S_MLIGHTNINGREADY17 MLNG C* 1 A_WeaponReady S_MLIGHTNINGREADY18 +S_MLIGHTNINGREADY18 MLNG C* 1 A_LightningReady S_MLIGHTNINGREADY19 +S_MLIGHTNINGREADY19 MLNG B* 1 A_WeaponReady S_MLIGHTNINGREADY20 +S_MLIGHTNINGREADY20 MLNG B* 1 A_WeaponReady S_MLIGHTNINGREADY21 +S_MLIGHTNINGREADY21 MLNG B* 1 A_WeaponReady S_MLIGHTNINGREADY22 +S_MLIGHTNINGREADY22 MLNG B* 1 A_WeaponReady S_MLIGHTNINGREADY23 +S_MLIGHTNINGREADY23 MLNG B* 1 A_WeaponReady S_MLIGHTNINGREADY24 +S_MLIGHTNINGREADY24 MLNG B* 1 A_WeaponReady S_MLIGHTNINGREADY + +S_MLIGHTNINGDOWN MLNG A* 1 A_Lower S_MLIGHTNINGDOWN +S_MLIGHTNINGUP MLNG A* 1 A_Raise S_MLIGHTNINGUP + +S_MLIGHTNINGATK_1 MLNG D* 3 NULL S_MLIGHTNINGATK_2 +S_MLIGHTNINGATK_2 MLNG E* 3 NULL S_MLIGHTNINGATK_3 +S_MLIGHTNINGATK_3 MLNG F* 4 A_MLightningAttack S_MLIGHTNINGATK_4 +S_MLIGHTNINGATK_4 MLNG G* 4 NULL S_MLIGHTNINGATK_5 +S_MLIGHTNINGATK_5 MLNG H* 3 NULL S_MLIGHTNINGATK_6 +S_MLIGHTNINGATK_6 MLNG I* 3 NULL S_MLIGHTNINGATK_7 +S_MLIGHTNINGATK_7 MLNG I* 6 NULL S_MLIGHTNINGATK_8 0 199 +S_MLIGHTNINGATK_8 MLNG C* 2 NULL S_MLIGHTNINGATK_9 0 55 +S_MLIGHTNINGATK_9 MLNG B* 2 NULL S_MLIGHTNINGATK_10 0 50 +S_MLIGHTNINGATK_10 MLNG B* 2 NULL S_MLIGHTNINGATK_11 0 45 +S_MLIGHTNINGATK_11 MLNG B* 2 NULL S_MLIGHTNINGREADY 0 40 + +S_LIGHTNING_CEILING1 MLFX A* 2 A_LightningZap S_LIGHTNING_CEILING2 +S_LIGHTNING_CEILING2 MLFX B* 2 A_LightningClip S_LIGHTNING_CEILING3 +S_LIGHTNING_CEILING3 MLFX C* 2 A_LightningClip S_LIGHTNING_CEILING4 +S_LIGHTNING_CEILING4 MLFX D* 2 A_LightningClip S_LIGHTNING_CEILING1 + +S_LIGHTNING_C_X1 MLF2 A* 2 A_LightningRemove S_LIGHTNING_C_X2 +S_LIGHTNING_C_X2 MLF2 B* 3 NULL S_LIGHTNING_C_X3 +S_LIGHTNING_C_X3 MLF2 C* 3 NULL S_LIGHTNING_C_X4 +S_LIGHTNING_C_X4 MLF2 D* 3 NULL S_LIGHTNING_C_X5 +S_LIGHTNING_C_X5 MLF2 E* 3 NULL S_LIGHTNING_C_X6 +S_LIGHTNING_C_X6 MLF2 K* 3 NULL S_LIGHTNING_C_X7 +S_LIGHTNING_C_X7 MLF2 L* 3 NULL S_LIGHTNING_C_X8 +S_LIGHTNING_C_X8 MLF2 M* 3 NULL S_LIGHTNING_C_X9 +S_LIGHTNING_C_X9 ACLO E 35 NULL S_LIGHTNING_C_X10 +S_LIGHTNING_C_X10 MLF2 N* 3 NULL S_LIGHTNING_C_X11 +S_LIGHTNING_C_X11 MLF2 O* 3 NULL S_LIGHTNING_C_X12 +S_LIGHTNING_C_X12 MLF2 P* 4 NULL S_LIGHTNING_C_X13 +S_LIGHTNING_C_X13 MLF2 Q* 3 NULL S_LIGHTNING_C_X14 +S_LIGHTNING_C_X14 MLF2 P* 3 NULL S_LIGHTNING_C_X15 +S_LIGHTNING_C_X15 MLF2 Q* 4 NULL S_LIGHTNING_C_X16 +S_LIGHTNING_C_X16 MLF2 P* 3 NULL S_LIGHTNING_C_X17 +S_LIGHTNING_C_X17 MLF2 O* 3 NULL S_LIGHTNING_C_X18 +S_LIGHTNING_C_X18 MLF2 P* 3 NULL S_LIGHTNING_C_X19 +S_LIGHTNING_C_X19 MLF2 P* 1 A_HideThing S_FREETARGMOBJ + +S_LIGHTNING_FLOOR1 MLFX E* 2 A_LightningZap S_LIGHTNING_FLOOR2 +S_LIGHTNING_FLOOR2 MLFX F* 2 A_LightningClip S_LIGHTNING_FLOOR3 +S_LIGHTNING_FLOOR3 MLFX G* 2 A_LightningClip S_LIGHTNING_FLOOR4 +S_LIGHTNING_FLOOR4 MLFX H* 2 A_LightningClip S_LIGHTNING_FLOOR1 + +S_LIGHTNING_F_X1 MLF2 F* 2 A_LightningRemove S_LIGHTNING_F_X2 +S_LIGHTNING_F_X2 MLF2 G* 3 NULL S_LIGHTNING_F_X3 +S_LIGHTNING_F_X3 MLF2 H* 3 NULL S_LIGHTNING_F_X4 +S_LIGHTNING_F_X4 MLF2 I* 3 NULL S_LIGHTNING_F_X5 +S_LIGHTNING_F_X5 MLF2 J* 3 NULL S_LIGHTNING_F_X6 +S_LIGHTNING_F_X6 MLF2 K* 3 NULL S_LIGHTNING_F_X7 +S_LIGHTNING_F_X7 MLF2 L* 3 NULL S_LIGHTNING_F_X8 +S_LIGHTNING_F_X8 MLF2 M* 3 NULL S_LIGHTNING_F_X9 +S_LIGHTNING_F_X9 ACLO E 20 NULL S_LIGHTNING_F_X10 +S_LIGHTNING_F_X10 MLF2 N* 3 NULL S_LIGHTNING_F_X11 +S_LIGHTNING_F_X11 MLF2 O* 3 NULL S_LIGHTNING_F_X12 +S_LIGHTNING_F_X12 MLF2 P* 4 NULL S_LIGHTNING_F_X13 +S_LIGHTNING_F_X13 MLF2 Q* 3 NULL S_LIGHTNING_F_X14 +S_LIGHTNING_F_X14 MLF2 P* 3 NULL S_LIGHTNING_F_X15 +S_LIGHTNING_F_X15 MLF2 Q* 4 A_LastZap S_LIGHTNING_F_X16 +S_LIGHTNING_F_X16 MLF2 P* 3 NULL S_LIGHTNING_F_X17 +S_LIGHTNING_F_X17 MLF2 O* 3 NULL S_LIGHTNING_F_X18 +S_LIGHTNING_F_X18 MLF2 P* 3 NULL S_LIGHTNING_F_X19 +S_LIGHTNING_F_X19 MLF2 P* 1 A_HideThing S_FREETARGMOBJ + +S_LIGHTNING_ZAP1 MLFX I* 2 A_ZapMimic S_LIGHTNING_ZAP2 +S_LIGHTNING_ZAP2 MLFX J* 2 A_ZapMimic S_LIGHTNING_ZAP3 +S_LIGHTNING_ZAP3 MLFX K* 2 A_ZapMimic S_LIGHTNING_ZAP4 +S_LIGHTNING_ZAP4 MLFX L* 2 A_ZapMimic S_LIGHTNING_ZAP5 +S_LIGHTNING_ZAP5 MLFX M* 2 A_ZapMimic S_LIGHTNING_ZAP1 + +S_LIGHTNING_ZAP_X1 MLFX N* 2 NULL S_LIGHTNING_ZAP_X2 +S_LIGHTNING_ZAP_X2 MLFX O* 2 NULL S_LIGHTNING_ZAP_X3 +S_LIGHTNING_ZAP_X3 MLFX P* 2 NULL S_LIGHTNING_ZAP_X4 +S_LIGHTNING_ZAP_X4 MLFX Q* 2 NULL S_LIGHTNING_ZAP_X5 +S_LIGHTNING_ZAP_X5 MLFX R* 2 NULL S_LIGHTNING_ZAP_X6 +S_LIGHTNING_ZAP_X6 MLFX S* 2 NULL S_LIGHTNING_ZAP_X7 +S_LIGHTNING_ZAP_X7 MLFX T* 2 NULL S_LIGHTNING_ZAP_X8 +S_LIGHTNING_ZAP_X8 MLFX U* 2 NULL S_NULL + +// +// Mage staff +// + +$ MT_MSTAFF_FX +spawnstate S_MSTAFF_FX1_1 +deathstate S_MSTAFF_FX_X1 +deathsound MageStaffExplode +speed 20 +radius 16 +height 8 +damage 6 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_NOTELEPORT|MF2_FIREDAMAGE|MF2_RIP|MF2_IMPACT|MF2_PCROSS + +$ MT_MSTAFF_FX2 +spawnstate S_MSTAFF_FX2_1 +deathstate S_MSTAFF_FX2_X1 +deathsound MageStaffExplode +speed 17 +height 8 +damage 4 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_NOTELEPORT|MF2_FIREDAMAGE|MF2_IMPACT|MF2_PCROSS|MF2_SEEKERMISSILE + +S_MSTAFFREADY MSTF A 1 A_WeaponReady S_MSTAFFREADY2 +S_MSTAFFREADY2 MSTF A 1 A_WeaponReady S_MSTAFFREADY3 +S_MSTAFFREADY3 MSTF A 1 A_WeaponReady S_MSTAFFREADY4 +S_MSTAFFREADY4 MSTF A 1 A_WeaponReady S_MSTAFFREADY5 +S_MSTAFFREADY5 MSTF A 1 A_WeaponReady S_MSTAFFREADY6 +S_MSTAFFREADY6 MSTF A 1 A_WeaponReady S_MSTAFFREADY7 +S_MSTAFFREADY7 MSTF B 1 A_WeaponReady S_MSTAFFREADY8 +S_MSTAFFREADY8 MSTF B 1 A_WeaponReady S_MSTAFFREADY9 +S_MSTAFFREADY9 MSTF B 1 A_WeaponReady S_MSTAFFREADY10 +S_MSTAFFREADY10 MSTF B 1 A_WeaponReady S_MSTAFFREADY11 +S_MSTAFFREADY11 MSTF B 1 A_WeaponReady S_MSTAFFREADY12 +S_MSTAFFREADY12 MSTF B 1 A_WeaponReady S_MSTAFFREADY13 +S_MSTAFFREADY13 MSTF C 1 A_WeaponReady S_MSTAFFREADY14 +S_MSTAFFREADY14 MSTF C 1 A_WeaponReady S_MSTAFFREADY15 +S_MSTAFFREADY15 MSTF C 1 A_WeaponReady S_MSTAFFREADY16 +S_MSTAFFREADY16 MSTF C 1 A_WeaponReady S_MSTAFFREADY17 +S_MSTAFFREADY17 MSTF C 1 A_WeaponReady S_MSTAFFREADY18 +S_MSTAFFREADY18 MSTF C 1 A_WeaponReady S_MSTAFFREADY19 +S_MSTAFFREADY19 MSTF D 1 A_WeaponReady S_MSTAFFREADY20 +S_MSTAFFREADY20 MSTF D 1 A_WeaponReady S_MSTAFFREADY21 +S_MSTAFFREADY21 MSTF D 1 A_WeaponReady S_MSTAFFREADY22 +S_MSTAFFREADY22 MSTF D 1 A_WeaponReady S_MSTAFFREADY23 +S_MSTAFFREADY23 MSTF D 1 A_WeaponReady S_MSTAFFREADY24 +S_MSTAFFREADY24 MSTF D 1 A_WeaponReady S_MSTAFFREADY25 +S_MSTAFFREADY25 MSTF E 1 A_WeaponReady S_MSTAFFREADY26 +S_MSTAFFREADY26 MSTF E 1 A_WeaponReady S_MSTAFFREADY27 +S_MSTAFFREADY27 MSTF E 1 A_WeaponReady S_MSTAFFREADY28 +S_MSTAFFREADY28 MSTF E 1 A_WeaponReady S_MSTAFFREADY29 +S_MSTAFFREADY29 MSTF E 1 A_WeaponReady S_MSTAFFREADY30 +S_MSTAFFREADY30 MSTF E 1 A_WeaponReady S_MSTAFFREADY31 +S_MSTAFFREADY31 MSTF F 1 A_WeaponReady S_MSTAFFREADY32 +S_MSTAFFREADY32 MSTF F 1 A_WeaponReady S_MSTAFFREADY33 +S_MSTAFFREADY33 MSTF F 1 A_WeaponReady S_MSTAFFREADY34 +S_MSTAFFREADY34 MSTF F 1 A_WeaponReady S_MSTAFFREADY35 +S_MSTAFFREADY35 MSTF F 1 A_WeaponReady S_MSTAFFREADY + +S_MSTAFFDOWN MSTF A 1 A_Lower S_MSTAFFDOWN +S_MSTAFFUP MSTF A 1 A_Raise S_MSTAFFUP + +S_MSTAFFATK_1 MSTF G 4 NULL S_MSTAFFATK_2 0 40 +S_MSTAFFATK_2 MSTF H* 4 A_MStaffAttack S_MSTAFFATK_3 0 48 +S_MSTAFFATK_3 MSTF H* 2 A_MStaffPalette S_MSTAFFATK_4 0 48 +S_MSTAFFATK_4 MSTF I 2 A_MStaffPalette S_MSTAFFATK_5 0 48 +S_MSTAFFATK_5 MSTF I 2 A_MStaffPalette S_MSTAFFATK_6 0 48 +S_MSTAFFATK_6 MSTF I 1 NULL S_MSTAFFATK_7 0 40 +S_MSTAFFATK_7 MSTF J 5 NULL S_MSTAFFREADY 0 36 + +S_MSTAFF_FX1_1 MSP1 A* 3 A_MStaffWeave S_MSTAFF_FX1_2 +S_MSTAFF_FX1_2 MSP1 B* 3 A_MStaffWeave S_MSTAFF_FX1_3 +S_MSTAFF_FX1_3 MSP1 C* 3 A_MStaffWeave S_MSTAFF_FX1_4 +S_MSTAFF_FX1_4 MSP1 D* 3 A_MStaffWeave S_MSTAFF_FX1_5 +S_MSTAFF_FX1_5 MSP1 E* 3 A_MStaffWeave S_MSTAFF_FX1_6 +S_MSTAFF_FX1_6 MSP1 F* 3 A_MStaffWeave S_MSTAFF_FX1_1 + +S_MSTAFF_FX_X1 MSP1 G* 4 NULL S_MSTAFF_FX_X2 +S_MSTAFF_FX_X2 MSP1 H* 5 A_Explode S_MSTAFF_FX_X3 +S_MSTAFF_FX_X3 MSP1 I* 4 NULL S_MSTAFF_FX_X4 +S_MSTAFF_FX_X4 MSP1 J* 5 NULL S_MSTAFF_FX_X5 +S_MSTAFF_FX_X5 MSP1 K* 4 NULL S_MSTAFF_FX_X6 +S_MSTAFF_FX_X6 MSP1 L* 5 NULL S_MSTAFF_FX_X7 +S_MSTAFF_FX_X7 MSP1 M* 4 NULL S_MSTAFF_FX_X8 +S_MSTAFF_FX_X8 MSP1 N* 5 NULL S_MSTAFF_FX_X9 +S_MSTAFF_FX_X9 MSP1 O* 4 NULL S_MSTAFF_FX_X10 +S_MSTAFF_FX_X10 MSP1 P* 4 NULL S_NULL + +S_MSTAFF_FX2_1 MSP2 A* 2 A_MStaffTrack S_MSTAFF_FX2_2 +S_MSTAFF_FX2_2 MSP2 B* 2 A_MStaffTrack S_MSTAFF_FX2_3 +S_MSTAFF_FX2_3 MSP2 C* 2 A_MStaffTrack S_MSTAFF_FX2_4 +S_MSTAFF_FX2_4 MSP2 D* 2 A_MStaffTrack S_MSTAFF_FX2_1 + +S_MSTAFF_FX2_X1 MSP2 E* 4 NULL S_MSTAFF_FX2_X2 +S_MSTAFF_FX2_X2 MSP2 F* 5 A_Explode S_MSTAFF_FX2_X3 +S_MSTAFF_FX2_X3 MSP2 G* 5 NULL S_MSTAFF_FX2_X4 +S_MSTAFF_FX2_X4 MSP2 H* 5 NULL S_MSTAFF_FX2_X5 +S_MSTAFF_FX2_X5 MSP2 I* 4 NULL S_NULL + +// +// super weapon pieces +// + +$ MT_FW_SWORD1 +doomednum 12 +spawnstate S_FSWORD1 +flags MF_SPECIAL +flags2 MF2_FLOATBOB + +$ MT_FW_SWORD2 +doomednum 13 +spawnstate S_FSWORD2 +flags MF_SPECIAL +flags2 MF2_FLOATBOB + +$ MT_FW_SWORD3 +doomednum 16 +spawnstate S_FSWORD3 +flags MF_SPECIAL +flags2 MF2_FLOATBOB + +S_FSWORD1 WFR1 A* -1 NULL S_NULL +S_FSWORD2 WFR2 A* -1 NULL S_NULL +S_FSWORD3 WFR3 A* -1 NULL S_NULL + + +$ MT_CW_HOLY1 +doomednum 18 +spawnstate S_CHOLY1 +flags MF_SPECIAL +flags2 MF2_FLOATBOB + +$ MT_CW_HOLY2 +doomednum 19 +spawnstate S_CHOLY2 +flags MF_SPECIAL +flags2 MF2_FLOATBOB + +$ MT_CW_HOLY3 +doomednum 20 +spawnstate S_CHOLY3 +flags MF_SPECIAL +flags2 MF2_FLOATBOB + +S_CHOLY1 WCH1 A* -1 NULL S_NULL +S_CHOLY2 WCH2 A* -1 NULL S_NULL +S_CHOLY3 WCH3 A* -1 NULL S_NULL + + +$ MT_MW_STAFF1 +doomednum 21 +spawnstate S_MSTAFF1 +flags MF_SPECIAL +flags2 MF2_FLOATBOB + +$ MT_MW_STAFF2 +doomednum 22 +spawnstate S_MSTAFF2 +flags MF_SPECIAL +flags2 MF2_FLOATBOB + +$ MT_MW_STAFF3 +doomednum 23 +spawnstate S_MSTAFF3 +flags MF_SPECIAL +flags2 MF2_FLOATBOB + +S_MSTAFF1 WMS1 A* -1 NULL S_NULL +S_MSTAFF2 WMS2 A* -1 NULL S_NULL +S_MSTAFF3 WMS3 A* -1 NULL S_NULL + +// +// Pig view +// + +$ MT_SNOUTPUFF +spawnstate S_PUNCHPUFF1 +flags MF_NOBLOCKMAP|MF_NOGRAVITY +translucency 0.33 + +S_SNOUTREADY WPIG A 1 A_WeaponReady S_SNOUTREADY +S_SNOUTDOWN WPIG A 1 A_Lower S_SNOUTDOWN +S_SNOUTUP WPIG A 1 A_Raise S_SNOUTUP + +S_SNOUTATK1 WPIG A 4 A_SnoutAttack S_SNOUTATK2 +S_SNOUTATK2 WPIG B 8 A_SnoutAttack S_SNOUTREADY + +// +// Mage frost shards +// + +$ MT_MW_CONE +doomednum 53 +spawnstate S_COS1 +flags MF_SPECIAL + +$ MT_SHARDFX1 +spawnstate S_SHARDFX1_1 +deathstate S_SHARDFXE1_1 +deathsound MageShardsExplode +speed 25 +radius 13 +height 8 +damage 1 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_NOTELEPORT|MF2_IMPACT|MF2_PCROSS|MF2_ICEDAMAGE + +S_COS1 WMCS A* 8 NULL S_COS2 +S_COS2 WMCS B* 8 NULL S_COS3 +S_COS3 WMCS C* 8 NULL S_COS1 + +S_CONEREADY CONE A 1 A_WeaponReady S_CONEREADY +S_CONEDOWN CONE A 1 A_Lower S_CONEDOWN +S_CONEUP CONE A 1 A_Raise S_CONEUP + +S_CONEATK1_1 CONE B 3 NULL S_CONEATK1_2 +S_CONEATK1_2 CONE C 4 NULL S_CONEATK1_3 +S_CONEATK1_3 CONE D 3 NULL S_CONEATK1_4 +S_CONEATK1_4 CONE E 5 NULL S_CONEATK1_5 +S_CONEATK1_5 CONE F 3 A_FireConePL1 S_CONEATK1_6 +S_CONEATK1_6 CONE G 3 NULL S_CONEATK1_7 +S_CONEATK1_7 CONE A 9 NULL S_CONEATK1_8 +S_CONEATK1_8 CONE A 10 A_ReFire S_CONEREADY + +S_SHARDFX1_1 SHRD A* 2 NULL S_SHARDFX1_2 +S_SHARDFX1_2 SHRD A* 3 A_ShedShard S_SHARDFX1_3 +S_SHARDFX1_3 SHRD B* 3 NULL S_SHARDFX1_4 +S_SHARDFX1_4 SHRD C* 3 NULL S_SHARDFX1_1 + +S_SHARDFXE1_1 SHEX A* 5 NULL S_SHARDFXE1_2 +S_SHARDFXE1_2 SHEX B* 5 NULL S_SHARDFXE1_3 +S_SHARDFXE1_3 SHEX C* 5 NULL S_SHARDFXE1_4 +S_SHARDFXE1_4 SHEX D* 5 NULL S_SHARDFXE1_5 +S_SHARDFXE1_5 SHEX E* 5 NULL S_NULL + +// +// bloody stuff +// + + +$ MT_BLOOD +spawnstate S_BLOOD1 +mass 5 +flags MF_NOBLOCKMAP + +$ MT_BLOODSPLATTER +spawnstate S_BLOODSPLATTER1 +deathstate S_BLOODSPLATTERX +radius 2 +height 4 +mass 5 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF +flags2 MF2_NOTELEPORT|MF2_CANNOTPUSH + +$ MT_GIBS +spawnstate S_GIBS1 +flags MF_NOBLOCKMAP|MF_DROPOFF|MF_CORPSE +flags2 MF2_NOTELEPORT +S_BLOOD1 BLOD C 8 NULL S_BLOOD2 +S_BLOOD2 BLOD B 8 NULL S_BLOOD3 +S_BLOOD3 BLOD A 8 NULL S_NULL + +S_BLOODSPLATTER1 BLOD C 8 NULL S_BLOODSPLATTER2 +S_BLOODSPLATTER2 BLOD B 8 NULL S_BLOODSPLATTER3 +S_BLOODSPLATTER3 BLOD A 8 NULL S_NULL + +S_BLOODSPLATTERX BLOD A 6 NULL S_NULL + +S_GIBS1 GIBS A -1 NULL S_NULL + + +// +// The Fighter +// + +$ MT_PLAYER_FIGHTER +spawnstate S_FPLAY +spawnhealth 100 +seestate S_FPLAY_RUN1 +reactiontime 0 +painstate S_FPLAY_PAIN +painchance 255 +painsound PlayerFighterPain +missilestate S_FPLAY_ATK1 +deathstate S_FPLAY_DIE1 +xdeathstate S_FPLAY_XDIE1 +radius 16 +height 64 +flags MF_SOLID|MF_SHOOTABLE|MF_DROPOFF|MF_PICKUP|MF_NOTDMATCH +flags2 MF2_WINDTHRUST|MF2_FLOORCLIP|MF2_SLIDE|MF2_PASSMOBJ|MF2_TELESTOMP|MF2_PUSHWALL + +S_FPLAY PLAY A -1 NULL S_NULL + +S_FPLAY_RUN1 PLAY A 4 NULL S_FPLAY_RUN2 +S_FPLAY_RUN2 PLAY B 4 NULL S_FPLAY_RUN3 +S_FPLAY_RUN3 PLAY C 4 NULL S_FPLAY_RUN4 +S_FPLAY_RUN4 PLAY D 4 NULL S_FPLAY_RUN1 + +S_FPLAY_ATK1 PLAY E 8 NULL S_FPLAY_ATK2 +S_FPLAY_ATK2 PLAY F 8 NULL S_FPLAY + +S_FPLAY_PAIN PLAY G 4 NULL S_FPLAY_PAIN2 +S_FPLAY_PAIN2 PLAY G 4 A_Pain S_FPLAY + +S_FPLAY_DIE1 PLAY H 6 NULL S_FPLAY_DIE2 +S_FPLAY_DIE2 PLAY I 6 A_Scream S_FPLAY_DIE3 +S_FPLAY_DIE3 PLAY J 6 NULL S_FPLAY_DIE4 +S_FPLAY_DIE4 PLAY K 6 NULL S_FPLAY_DIE5 +S_FPLAY_DIE5 PLAY L 6 A_NoBlocking S_FPLAY_DIE6 +S_FPLAY_DIE6 PLAY M 6 NULL S_FPLAY_DIE7 +S_FPLAY_DIE7 PLAY N -1 A_AddPlayerCorpse S_NULL + +S_FPLAY_XDIE1 PLAY O 5 A_Scream S_FPLAY_XDIE2 +S_FPLAY_XDIE2 PLAY P 5 A_SkullPop S_FPLAY_XDIE3 +S_FPLAY_XDIE3 PLAY R 5 A_NoBlocking S_FPLAY_XDIE4 +S_FPLAY_XDIE4 PLAY S 5 NULL S_FPLAY_XDIE5 +S_FPLAY_XDIE5 PLAY T 5 NULL S_FPLAY_XDIE6 +S_FPLAY_XDIE6 PLAY U 5 NULL S_FPLAY_XDIE7 +S_FPLAY_XDIE7 PLAY V 5 NULL S_FPLAY_XDIE8 +S_FPLAY_XDIE8 PLAY W -1 A_AddPlayerCorpse S_NULL + +S_FPLAY_ICE PLAY X 5 A_FreezeDeath S_FPLAY_ICE2 +S_FPLAY_ICE2 PLAY X 1 A_FreezeDeathChunks S_FPLAY_ICE2 + +// fighter fire death +S_PLAY_F_FDTH1 FDTH A* 5 NULL S_PLAY_F_FDTH2 +S_PLAY_F_FDTH2 FDTH B* 4 NULL S_PLAY_FDTH3 + +// cleric fire death +S_PLAY_C_FDTH1 FDTH C* 5 NULL S_PLAY_C_FDTH2 +S_PLAY_C_FDTH2 FDTH D* 4 NULL S_PLAY_FDTH3 + +// mage fire death +S_PLAY_M_FDTH1 FDTH E* 5 NULL S_PLAY_M_FDTH2 +S_PLAY_M_FDTH2 FDTH F* 4 NULL S_PLAY_FDTH3 + +// generic fire death +S_PLAY_FDTH3 FDTH G* 5 NULL S_PLAY_FDTH4 +S_PLAY_FDTH4 FDTH H* 4 A_Scream S_PLAY_FDTH5 +S_PLAY_FDTH5 FDTH I* 5 NULL S_PLAY_FDTH6 +S_PLAY_FDTH6 FDTH J* 4 NULL S_PLAY_FDTH7 +S_PLAY_FDTH7 FDTH K* 5 NULL S_PLAY_FDTH8 +S_PLAY_FDTH8 FDTH L* 4 NULL S_PLAY_FDTH9 +S_PLAY_FDTH9 FDTH M* 5 NULL S_PLAY_FDTH10 +S_PLAY_FDTH10 FDTH N* 4 NULL S_PLAY_FDTH11 +S_PLAY_FDTH11 FDTH O* 5 NULL S_PLAY_FDTH12 +S_PLAY_FDTH12 FDTH P* 4 NULL S_PLAY_FDTH13 +S_PLAY_FDTH13 FDTH Q* 5 NULL S_PLAY_FDTH14 +S_PLAY_FDTH14 FDTH R* 4 NULL S_PLAY_FDTH15 +S_PLAY_FDTH15 FDTH S* 5 A_NoBlocking S_PLAY_FDTH16 +S_PLAY_FDTH16 FDTH T* 4 NULL S_PLAY_FDTH17 +S_PLAY_FDTH17 FDTH U* 5 NULL S_PLAY_FDTH18 +S_PLAY_FDTH18 FDTH V* 4 NULL S_PLAY_FDTH19 +S_PLAY_FDTH19 ACLO E 35 A_CheckBurnGone S_PLAY_FDTH19 +S_PLAY_FDTH20 ACLO E 8 NULL S_NULL + +// +// a player's skull +// + +$ MT_BLOODYSKULL +spawnstate S_BLOODYSKULL1 +radius 4 +height 4 +flags MF_NOBLOCKMAP|MF_DROPOFF +flags2 MF2_LOGRAV|MF2_CANNOTPUSH + +S_BLOODYSKULL1 BSKL A 5 A_CheckSkullFloor S_BLOODYSKULL2 +S_BLOODYSKULL2 BSKL B 5 A_CheckSkullFloor S_BLOODYSKULL3 +S_BLOODYSKULL3 BSKL C 5 A_CheckSkullFloor S_BLOODYSKULL4 +S_BLOODYSKULL4 BSKL D 5 A_CheckSkullFloor S_BLOODYSKULL5 +S_BLOODYSKULL5 BSKL F 5 A_CheckSkullFloor S_BLOODYSKULL6 +S_BLOODYSKULL6 BSKL G 5 A_CheckSkullFloor S_BLOODYSKULL7 +S_BLOODYSKULL7 BSKL H 5 A_CheckSkullFloor S_BLOODYSKULL1 +S_BLOODYSKULLX1 BSKL I 16 A_CheckSkullDone S_BLOODYSKULLX1 +S_BLOODYSKULLX2 BSKL I 1050 NULL S_NULL + +// +// a speeding player's blur +// +$ MT_PLAYER_SPEED +spawnstate S_PLAYER_SPEED1 +flags MF_NOBLOCKMAP|MF_NOGRAVITY +translucency 0.66 + +S_PLAYER_SPEED1 PLAY A 5 NULL S_PLAYER_SPEED2 +S_PLAYER_SPEED2 PLAY A 3 A_SpeedFade S_NULL + +// +// ice chunk +// + +$ MT_ICECHUNK +spawnstate S_ICECHUNK1 +radius 3 +height 4 +flags MF_NOBLOCKMAP|MF_DROPOFF +flags2 MF2_LOGRAV|MF2_CANNOTPUSH|MF2_FLOORCLIP + +S_ICECHUNK1 ICEC A 10 NULL S_ICECHUNK2 +S_ICECHUNK2 ICEC B 10 A_IceSetTics S_ICECHUNK3 +S_ICECHUNK3 ICEC C 10 A_IceSetTics S_ICECHUNK4 +S_ICECHUNK4 ICEC D 10 A_IceSetTics S_NULL + +// an ice chunk containing the player's eyes +S_ICECHUNK_HEAD ICEC A 10 A_IceCheckHeadDone S_ICECHUNK_HEAD +S_ICECHUNK_HEAD2 ICEC A 1050 NULL S_NULL + + +// +// The Cleric +// + +$ MT_PLAYER_CLERIC +spawnstate S_CPLAY +spawnhealth 100 +seestate S_CPLAY_RUN1 +reactiontime 0 +painstate S_CPLAY_PAIN +painchance 255 +painsound PlayerClericPain +missilestate S_CPLAY_ATK1 +deathstate S_CPLAY_DIE1 +xdeathstate S_CPLAY_XDIE1 +radius 16 +height 64 +flags MF_SOLID|MF_SHOOTABLE|MF_DROPOFF|MF_PICKUP|MF_NOTDMATCH +flags2 MF2_WINDTHRUST|MF2_FLOORCLIP|MF2_SLIDE|MF2_PASSMOBJ|MF2_TELESTOMP|MF2_PUSHWALL + +S_CPLAY CLER A -1 NULL S_NULL + +S_CPLAY_RUN1 CLER A 4 NULL S_CPLAY_RUN2 +S_CPLAY_RUN2 CLER B 4 NULL S_CPLAY_RUN3 +S_CPLAY_RUN3 CLER C 4 NULL S_CPLAY_RUN4 +S_CPLAY_RUN4 CLER D 4 NULL S_CPLAY_RUN1 + +S_CPLAY_ATK1 CLER E 6 NULL S_CPLAY_ATK2 +S_CPLAY_ATK2 CLER F 6 NULL S_CPLAY_ATK3 +S_CPLAY_ATK3 CLER G 6 NULL S_CPLAY + +S_CPLAY_PAIN CLER H 4 NULL S_CPLAY_PAIN2 +S_CPLAY_PAIN2 CLER H 4 A_Pain S_CPLAY + +S_CPLAY_DIE1 CLER I 6 NULL S_CPLAY_DIE2 +S_CPLAY_DIE2 CLER K 6 A_Scream S_CPLAY_DIE3 +S_CPLAY_DIE3 CLER L 6 NULL S_CPLAY_DIE4 +S_CPLAY_DIE4 CLER L 6 NULL S_CPLAY_DIE5 +S_CPLAY_DIE5 CLER M 6 A_NoBlocking S_CPLAY_DIE6 +S_CPLAY_DIE6 CLER N 6 NULL S_CPLAY_DIE7 +S_CPLAY_DIE7 CLER O 6 NULL S_CPLAY_DIE8 +S_CPLAY_DIE8 CLER P 6 NULL S_CPLAY_DIE9 +S_CPLAY_DIE9 CLER Q -1 A_AddPlayerCorpse S_NULL + +S_CPLAY_XDIE1 CLER R 5 A_Scream S_CPLAY_XDIE2 +S_CPLAY_XDIE2 CLER S 5 NULL S_CPLAY_XDIE3 +S_CPLAY_XDIE3 CLER T 5 A_NoBlocking S_CPLAY_XDIE4 +S_CPLAY_XDIE4 CLER U 5 NULL S_CPLAY_XDIE5 +S_CPLAY_XDIE5 CLER V 5 NULL S_CPLAY_XDIE6 +S_CPLAY_XDIE6 CLER W 5 NULL S_CPLAY_XDIE7 +S_CPLAY_XDIE7 CLER X 5 NULL S_CPLAY_XDIE8 +S_CPLAY_XDIE8 CLER Y 5 NULL S_CPLAY_XDIE9 +S_CPLAY_XDIE9 CLER Z 5 NULL S_CPLAY_XDIE10 +S_CPLAY_XDIE10 CLER [ -1 A_AddPlayerCorpse S_NULL + +S_CPLAY_ICE CLER \ 5 A_FreezeDeath S_CPLAY_ICE2 +S_CPLAY_ICE2 CLER \ 1 A_FreezeDeathChunks S_CPLAY_ICE2 + + +// +// The Mage +// + +$ MT_PLAYER_MAGE +spawnstate S_MPLAY +spawnhealth 100 +seestate S_MPLAY_RUN1 +reactiontime 0 +painstate S_MPLAY_PAIN +painchance 255 +painsound PlayerMagePain +missilestate S_MPLAY_ATK1 +deathstate S_MPLAY_DIE1 +xdeathstate S_MPLAY_XDIE1 +radius 16 +height 64 +flags MF_SOLID|MF_SHOOTABLE|MF_DROPOFF|MF_PICKUP|MF_NOTDMATCH +flags2 MF2_WINDTHRUST|MF2_FLOORCLIP|MF2_SLIDE|MF2_PASSMOBJ|MF2_TELESTOMP|MF2_PUSHWALL + +S_MPLAY MAGE A -1 NULL S_NULL +S_MPLAY_RUN1 MAGE A 4 NULL S_MPLAY_RUN2 +S_MPLAY_RUN2 MAGE B 4 NULL S_MPLAY_RUN3 +S_MPLAY_RUN3 MAGE C 4 NULL S_MPLAY_RUN4 +S_MPLAY_RUN4 MAGE D 4 NULL S_MPLAY_RUN1 + +S_MPLAY_ATK1 MAGE E 8 NULL S_MPLAY_ATK2 +S_MPLAY_ATK2 MAGE F* 8 NULL S_MPLAY + +S_MPLAY_PAIN MAGE G 4 NULL S_MPLAY_PAIN2 +S_MPLAY_PAIN2 MAGE G 4 A_Pain S_MPLAY + +S_MPLAY_DIE1 MAGE H 6 NULL S_MPLAY_DIE2 +S_MPLAY_DIE2 MAGE I 6 A_Scream S_MPLAY_DIE3 +S_MPLAY_DIE3 MAGE J 6 NULL S_MPLAY_DIE4 +S_MPLAY_DIE4 MAGE K 6 NULL S_MPLAY_DIE5 +S_MPLAY_DIE5 MAGE L 6 A_NoBlocking S_MPLAY_DIE6 +S_MPLAY_DIE6 MAGE M 6 NULL S_MPLAY_DIE7 +S_MPLAY_DIE7 MAGE N -1 A_AddPlayerCorpse S_NULL + +S_MPLAY_XDIE1 MAGE O 5 A_Scream S_MPLAY_XDIE2 +S_MPLAY_XDIE2 MAGE P 5 NULL S_MPLAY_XDIE3 +S_MPLAY_XDIE3 MAGE R 5 A_NoBlocking S_MPLAY_XDIE4 +S_MPLAY_XDIE4 MAGE S 5 NULL S_MPLAY_XDIE5 +S_MPLAY_XDIE5 MAGE T 5 NULL S_MPLAY_XDIE6 +S_MPLAY_XDIE6 MAGE U 5 NULL S_MPLAY_XDIE7 +S_MPLAY_XDIE7 MAGE V 5 NULL S_MPLAY_XDIE8 +S_MPLAY_XDIE8 MAGE W 5 NULL S_MPLAY_XDIE9 +S_MPLAY_XDIE9 MAGE X -1 A_AddPlayerCorpse S_NULL + +S_MPLAY_ICE MAGE Y 5 A_FreezeDeath S_MPLAY_ICE2 +S_MPLAY_ICE2 MAGE Y 1 A_FreezeDeathChunks S_MPLAY_ICE2 + + +// +// The Pig +// + +$ MT_PIGPLAYER +spawnstate S_PIGPLAY +spawnhealth 100 +seestate S_PIGPLAY_RUN1 +reactiontime 0 +painstate S_PIGPLAY_PAIN +painchance 255 +painsound PigPain +missilestate S_PIGPLAY_ATK1 +deathstate S_PIG_DIE1 +deathsound PigDeath +radius 16 +height 24 +flags MF_SOLID|MF_SHOOTABLE|MF_DROPOFF|MF_NOTDMATCH +flags2 MF2_WINDTHRUST|MF2_SLIDE|MF2_PASSMOBJ|MF2_FLOORCLIP|MF2_TELESTOMP|MF2_PUSHWALL + +$ MT_PIG +spawnstate S_PIG_LOOK1 +spawnhealth 25 +seestate S_PIG_WALK1 +seesound PigActive1 +painstate S_PIG_PAIN +painchance 128 +painsound PigPain +meleestate S_PIG_ATK1 +missilestate 0 +deathstate S_PIG_DIE1 +deathsound PigDeath +speed 10 +radius 12 +height 22 +mass 60 +activesound PigActive1 +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL +flags2 MF2_WINDTHRUST|MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_PUSHWALL|MF2_TELESTOMP + +S_PIGPLAY PIGY A -1 NULL S_NULL + +S_PIGPLAY_RUN1 PIGY A 3 NULL S_PIGPLAY_RUN2 +S_PIGPLAY_RUN2 PIGY B 3 NULL S_PIGPLAY_RUN3 +S_PIGPLAY_RUN3 PIGY C 3 NULL S_PIGPLAY_RUN4 +S_PIGPLAY_RUN4 PIGY D 3 NULL S_PIGPLAY_RUN1 + +S_PIGPLAY_ATK1 PIGY A 12 NULL S_PIGPLAY + +S_PIGPLAY_PAIN PIGY D 4 A_PigPain S_PIGPLAY + +S_PIG_LOOK1 PIGY B 10 A_PigLook S_PIG_LOOK1 + +S_PIG_WALK1 PIGY A 3 A_PigChase S_PIG_WALK2 +S_PIG_WALK2 PIGY B 3 A_PigChase S_PIG_WALK3 +S_PIG_WALK3 PIGY C 3 A_PigChase S_PIG_WALK4 +S_PIG_WALK4 PIGY D 3 A_PigChase S_PIG_WALK1 + +S_PIG_PAIN PIGY D 4 A_PigPain S_PIG_WALK1 + +S_PIG_ATK1 PIGY A 5 A_FaceTarget S_PIG_ATK2 +S_PIG_ATK2 PIGY A 10 A_PigAttack S_PIG_WALK1 + +S_PIG_DIE1 PIGY E 4 A_Scream S_PIG_DIE2 +S_PIG_DIE2 PIGY F 3 A_NoBlocking S_PIG_DIE3 +S_PIG_DIE3 PIGY G 4 A_QueueCorpse S_PIG_DIE4 +S_PIG_DIE4 PIGY H 3 NULL S_PIG_DIE5 +S_PIG_DIE5 PIGY I 4 NULL S_PIG_DIE6 +S_PIG_DIE6 PIGY J 4 NULL S_PIG_DIE7 +S_PIG_DIE7 PIGY K 4 NULL S_PIG_DIE8 +S_PIG_DIE8 PIGY L -1 NULL S_NULL + +S_PIG_ICE PIGY M 5 A_FreezeDeath S_PIG_ICE2 +S_PIG_ICE2 PIGY M 1 A_FreezeDeathChunks S_PIG_ICE2 + + +// +// Centaur +// + +$ MT_CENTAUR +doomednum 107 +spawnstate S_CENTAUR_LOOK1 +spawnhealth 200 +seestate S_CENTAUR_WALK1 +seesound CentaurSight +attacksound CentaurAttack +painstate S_CENTAUR_PAIN1 +painchance 135 +painsound CentaurPain +meleestate S_CENTAUR_ATK1 +missilestate 0 +deathstate S_CENTAUR_DEATH1 +xdeathstate S_CENTAUR_DEATH_X1 +deathsound CentaurDeath +speed 13 +height 64 +mass 120 +activesound CentaurActive +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL +flags2 MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_PUSHWALL|MF2_MCROSS|MF2_TELESTOMP + +$ MT_CENTAURLEADER +doomednum 115 +spawnstate S_CENTAUR_LOOK1 +spawnhealth 250 +seestate S_CENTAUR_WALK1 +seesound CentaurSight +attacksound CentaurAttack +painstate S_CENTAUR_PAIN1 +painchance 96 +painsound CentaurPain +meleestate S_CENTAUR_ATK1 +missilestate S_CENTAUR_MISSILE1 +deathstate S_CENTAUR_DEATH1 +xdeathstate S_CENTAUR_DEATH_X1 +deathsound CentaurDeath +speed 10 +height 64 +mass 120 +activesound CentaurActive +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL +flags2 MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_PUSHWALL|MF2_MCROSS|MF2_TELESTOMP + +$ MT_CENTAUR_FX +spawnstate S_CENTAUR_FX1 +deathstate S_CENTAUR_FX_X1 +deathsound CentaurMissileExplode +speed 20 +damage 4 +flags MF_MISSILE|MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF +flags2 MF2_NOTELEPORT|MF2_IMPACT|MF2_PCROSS + +$ MT_CENTAUR_SHIELD +spawnstate S_CENTAUR_SHIELD1 +deathstate S_CENTAUR_SHIELD_X1 +flags MF_DROPOFF|MF_CORPSE +flags2 MF2_NOTELEPORT + +$ MT_CENTAUR_SWORD +spawnstate S_CENTAUR_SWORD1 +deathstate S_CENTAUR_SWORD_X1 +flags MF_DROPOFF|MF_CORPSE +flags2 MF2_NOTELEPORT + +S_CENTAUR_LOOK1 CENT A 10 A_Look S_CENTAUR_LOOK2 +S_CENTAUR_LOOK2 CENT B 10 A_Look S_CENTAUR_LOOK1 + +S_CENTAUR_WALK1 CENT A 4 A_Chase S_CENTAUR_WALK2 +S_CENTAUR_WALK2 CENT B 4 A_Chase S_CENTAUR_WALK3 +S_CENTAUR_WALK3 CENT C 4 A_Chase S_CENTAUR_WALK4 +S_CENTAUR_WALK4 CENT D 4 A_Chase S_CENTAUR_WALK1 + +S_CENTAUR_ATK1 CENT H 5 A_FaceTarget S_CENTAUR_ATK2 +S_CENTAUR_ATK2 CENT I 4 A_FaceTarget S_CENTAUR_ATK3 +S_CENTAUR_ATK3 CENT J 7 A_CentaurAttack S_CENTAUR_WALK1 + +S_CENTAUR_MISSILE1 CENT E 10 A_FaceTarget S_CENTAUR_MISSILE2 +S_CENTAUR_MISSILE2 CENT F* 8 A_CentaurAttack2 S_CENTAUR_MISSILE3 +S_CENTAUR_MISSILE3 CENT E 10 A_FaceTarget S_CENTAUR_MISSILE4 +S_CENTAUR_MISSILE4 CENT F* 8 A_CentaurAttack2 S_CENTAUR_WALK1 + +S_CENTAUR_PAIN1 CENT G 6 A_Pain S_CENTAUR_PAIN2 +S_CENTAUR_PAIN2 CENT G 6 A_SetReflective S_CENTAUR_PAIN3 +S_CENTAUR_PAIN3 CENT E 15 A_CentaurDefend S_CENTAUR_PAIN4 +S_CENTAUR_PAIN4 CENT E 15 A_CentaurDefend S_CENTAUR_PAIN5 +S_CENTAUR_PAIN5 CENT E 15 A_CentaurDefend S_CENTAUR_PAIN6 +S_CENTAUR_PAIN6 CENT E 1 A_UnSetReflective S_CENTAUR_WALK1 + +S_CENTAUR_DEATH1 CENT K 4 NULL S_CENTAUR_DEATH2 +S_CENTAUR_DEATH2 CENT L 4 A_Scream S_CENTAUR_DEATH3 +S_CENTAUR_DEATH3 CENT M 4 NULL S_CENTAUR_DEATH4 +S_CENTAUR_DEATH4 CENT N 4 NULL S_CENTAUR_DEATH5 +S_CENTAUR_DEATH5 CENT O 4 A_NoBlocking S_CENTAUR_DEATH6 +S_CENTAUR_DEATH6 CENT P 4 NULL S_CENTAUR_DEATH7 +S_CENTAUR_DEATH7 CENT Q 4 NULL S_CENTAUR_DEATH8 +S_CENTAUR_DEATH8 CENT R 4 A_QueueCorpse S_CENTAUR_DEATH9 +S_CENTAUR_DEATH9 CENT S 4 NULL S_CENTAUR_DEATH0 +S_CENTAUR_DEATH0 CENT T -1 NULL S_NULL + +S_CENTAUR_DEATH_X1 CTXD A 4 NULL S_CENTAUR_DEATH_X2 +S_CENTAUR_DEATH_X2 CTXD B 4 A_NoBlocking S_CENTAUR_DEATH_X3 +S_CENTAUR_DEATH_X3 CTXD C 4 A_CentaurDropStuff S_CENTAUR_DEATH_X4 +S_CENTAUR_DEATH_X4 CTXD D 3 A_Scream S_CENTAUR_DEATH_X5 +S_CENTAUR_DEATH_X5 CTXD E 4 A_QueueCorpse S_CENTAUR_DEATH_X6 +S_CENTAUR_DEATH_X6 CTXD F 3 NULL S_CENTAUR_DEATH_X7 +S_CENTAUR_DEATH_X7 CTXD G 4 NULL S_CENTAUR_DEATH_X8 +S_CENTAUR_DEATH_X8 CTXD H 3 NULL S_CENTAUR_DEATH_X9 +S_CENTAUR_DEATH_X9 CTXD I 4 NULL S_CENTAUR_DEATH_X10 +S_CENTAUR_DEATH_X10 CTXD J 3 NULL S_CENTAUR_DEATH_X11 +S_CENTAUR_DEATH_X11 CTXD K -1 NULL S_NULL + +S_CENTAUR_ICE CENT U 5 A_FreezeDeath S_CENTAUR_ICE2 +S_CENTAUR_ICE2 CENT U 1 A_FreezeDeathChunks S_CENTAUR_ICE2 + +S_CENTAUR_FX1 CTFX A* -1 NULL S_NULL + +S_CENTAUR_FX_X1 CTFX B* 4 NULL S_CENTAUR_FX_X2 +S_CENTAUR_FX_X2 CTFX C* 3 NULL S_CENTAUR_FX_X3 +S_CENTAUR_FX_X3 CTFX D* 4 NULL S_CENTAUR_FX_X4 +S_CENTAUR_FX_X4 CTFX E* 3 NULL S_CENTAUR_FX_X5 +S_CENTAUR_FX_X5 CTFX F* 2 NULL S_NULL + +S_CENTAUR_SHIELD1 CTDP A 3 A_CheckFloor S_CENTAUR_SHIELD2 +S_CENTAUR_SHIELD2 CTDP B 3 A_CheckFloor S_CENTAUR_SHIELD3 +S_CENTAUR_SHIELD3 CTDP C 3 A_CheckFloor S_CENTAUR_SHIELD4 +S_CENTAUR_SHIELD4 CTDP D 3 A_CheckFloor S_CENTAUR_SHIELD5 +S_CENTAUR_SHIELD5 CTDP E 3 A_CheckFloor S_CENTAUR_SHIELD6 +S_CENTAUR_SHIELD6 CTDP F 3 A_CheckFloor S_CENTAUR_SHIELD3 + +S_CENTAUR_SHIELD_X1 CTDP G 4 NULL S_CENTAUR_SHIELD_X2 +S_CENTAUR_SHIELD_X2 CTDP H 4 A_QueueCorpse S_CENTAUR_SHIELD_X3 +S_CENTAUR_SHIELD_X3 CTDP I 4 NULL S_CENTAUR_SHIELD_X4 +S_CENTAUR_SHIELD_X4 CTDP J -1 NULL S_NULL + +S_CENTAUR_SWORD1 CTDP K 3 A_CheckFloor S_CENTAUR_SWORD2 +S_CENTAUR_SWORD2 CTDP L 3 A_CheckFloor S_CENTAUR_SWORD3 +S_CENTAUR_SWORD3 CTDP M 3 A_CheckFloor S_CENTAUR_SWORD4 +S_CENTAUR_SWORD4 CTDP N 3 A_CheckFloor S_CENTAUR_SWORD5 +S_CENTAUR_SWORD5 CTDP O 3 A_CheckFloor S_CENTAUR_SWORD6 +S_CENTAUR_SWORD6 CTDP P 3 A_CheckFloor S_CENTAUR_SWORD7 +S_CENTAUR_SWORD7 CTDP Q 3 A_CheckFloor S_CENTAUR_SWORD3 + +S_CENTAUR_SWORD_X1 CTDP R 4 NULL S_CENTAUR_SWORD_X2 +S_CENTAUR_SWORD_X2 CTDP S 4 A_QueueCorpse S_CENTAUR_SWORD_X3 +S_CENTAUR_SWORD_X3 CTDP T -1 NULL S_NULL + + +// +// Demon +// +$ MT_DEMON +doomednum 31 +spawnstate S_DEMN_LOOK1 +spawnhealth 250 +seestate S_DEMN_CHASE1 +seesound DemonSight +attacksound DemonAttack +painstate S_DEMN_PAIN1 +painchance 50 +painsound DemonPain +meleestate S_DEMN_ATK1_1 +missilestate S_DEMN_ATK2_1 +deathstate S_DEMN_DEATH1 +xdeathstate S_DEMN_XDEATH1 +deathsound DemonDeath +speed 13 +radius 32 +height 64 +mass 220 +activesound DemonActive +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL +flags2 MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_MCROSS|MF2_TELESTOMP + +$ MT_DEMONCHUNK1 +spawnstate S_DEMONCHUNK1_1 +deathstate S_DEMONCHUNK1_4 +radius 5 +height 5 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_CORPSE +flags2 MF2_NOTELEPORT|MF2_FLOORCLIP + +$ MT_DEMONCHUNK2 +spawnstate S_DEMONCHUNK2_1 +deathstate S_DEMONCHUNK2_4 +radius 5 +height 5 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_CORPSE +flags2 MF2_NOTELEPORT|MF2_FLOORCLIP + +$ MT_DEMONCHUNK3 +spawnstate S_DEMONCHUNK3_1 +deathstate S_DEMONCHUNK3_4 +radius 5 +height 5 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_CORPSE +flags2 MF2_NOTELEPORT|MF2_FLOORCLIP + +$ MT_DEMONCHUNK4 +spawnstate S_DEMONCHUNK4_1 +deathstate S_DEMONCHUNK4_4 +radius 5 +height 5 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_CORPSE +flags2 MF2_NOTELEPORT|MF2_FLOORCLIP + +$ MT_DEMONCHUNK5 +spawnstate S_DEMONCHUNK5_1 +deathstate S_DEMONCHUNK5_4 +radius 5 +height 5 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_CORPSE +flags2 MF2_NOTELEPORT|MF2_FLOORCLIP + +$ MT_DEMONFX1 +spawnstate S_DEMONFX_MOVE1 +deathstate S_DEMONFX_BOOM1 +deathsound DemonMissileExplode +speed 15 +radius 10 +height 6 +damage 5 +flags MF_MISSILE|MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF +flags2 MF2_NOTELEPORT|MF2_IMPACT|MF2_PCROSS|MF2_FIREDAMAGE + +S_DEMN_LOOK1 DEMN A 10 A_Look S_DEMN_LOOK2 +S_DEMN_LOOK2 DEMN A 10 A_Look S_DEMN_LOOK1 + +S_DEMN_CHASE1 DEMN A 4 A_Chase S_DEMN_CHASE2 +S_DEMN_CHASE2 DEMN B 4 A_Chase S_DEMN_CHASE3 +S_DEMN_CHASE3 DEMN C 4 A_Chase S_DEMN_CHASE4 +S_DEMN_CHASE4 DEMN D 4 A_Chase S_DEMN_CHASE1 + +S_DEMN_ATK1_1 DEMN E 6 A_FaceTarget S_DEMN_ATK1_2 +S_DEMN_ATK1_2 DEMN F 8 A_FaceTarget S_DEMN_ATK1_3 +S_DEMN_ATK1_3 DEMN G 6 A_DemonAttack1 S_DEMN_CHASE1 + +S_DEMN_ATK2_1 DEMN E 5 A_FaceTarget S_DEMN_ATK2_2 +S_DEMN_ATK2_2 DEMN F 6 A_FaceTarget S_DEMN_ATK2_3 +S_DEMN_ATK2_3 DEMN G 5 A_DemonAttack2 S_DEMN_CHASE1 + +S_DEMN_PAIN1 DEMN E 4 NULL S_DEMN_PAIN2 +S_DEMN_PAIN2 DEMN E 4 A_Pain S_DEMN_CHASE1 + +S_DEMN_DEATH1 DEMN H 6 NULL S_DEMN_DEATH2 +S_DEMN_DEATH2 DEMN I 6 NULL S_DEMN_DEATH3 +S_DEMN_DEATH3 DEMN J 6 A_Scream S_DEMN_DEATH4 +S_DEMN_DEATH4 DEMN K 6 A_NoBlocking S_DEMN_DEATH5 +S_DEMN_DEATH5 DEMN L 6 A_QueueCorpse S_DEMN_DEATH6 +S_DEMN_DEATH6 DEMN M 6 NULL S_DEMN_DEATH7 +S_DEMN_DEATH7 DEMN N 6 NULL S_DEMN_DEATH8 +S_DEMN_DEATH8 DEMN O 6 NULL S_DEMN_DEATH9 +S_DEMN_DEATH9 DEMN P -1 NULL S_NULL + +S_DEMN_XDEATH1 DEMN H 6 NULL S_DEMN_XDEATH2 +S_DEMN_XDEATH2 DEMN I 6 A_DemonDeath S_DEMN_XDEATH3 +S_DEMN_XDEATH3 DEMN J 6 A_Scream S_DEMN_XDEATH4 +S_DEMN_XDEATH4 DEMN K 6 A_NoBlocking S_DEMN_XDEATH5 +S_DEMN_XDEATH5 DEMN L 6 A_QueueCorpse S_DEMN_XDEATH6 +S_DEMN_XDEATH6 DEMN M 6 NULL S_DEMN_XDEATH7 +S_DEMN_XDEATH7 DEMN N 6 NULL S_DEMN_XDEATH8 +S_DEMN_XDEATH8 DEMN O 6 NULL S_DEMN_XDEATH9 +S_DEMN_XDEATH9 DEMN P -1 NULL S_NULL + +S_DEMON_ICE DEMN Q 5 A_FreezeDeath S_DEMON_ICE2 +S_DEMON_ICE2 DEMN Q 1 A_FreezeDeathChunks S_DEMON_ICE2 + +S_DEMONCHUNK1_1 DEMA A 4 NULL S_DEMONCHUNK1_2 +S_DEMONCHUNK1_2 DEMA A 10 A_QueueCorpse S_DEMONCHUNK1_3 +S_DEMONCHUNK1_3 DEMA A 20 NULL S_DEMONCHUNK1_3 +S_DEMONCHUNK1_4 DEMA A -1 NULL S_NULL + +S_DEMONCHUNK2_1 DEMB A 4 NULL S_DEMONCHUNK2_2 +S_DEMONCHUNK2_2 DEMB A 10 A_QueueCorpse S_DEMONCHUNK2_3 +S_DEMONCHUNK2_3 DEMB A 20 NULL S_DEMONCHUNK2_3 +S_DEMONCHUNK2_4 DEMB A -1 NULL S_NULL + +S_DEMONCHUNK3_1 DEMC A 4 NULL S_DEMONCHUNK3_2 +S_DEMONCHUNK3_2 DEMC A 10 A_QueueCorpse S_DEMONCHUNK3_3 +S_DEMONCHUNK3_3 DEMC A 20 NULL S_DEMONCHUNK3_3 +S_DEMONCHUNK3_4 DEMC A -1 NULL S_NULL + +S_DEMONCHUNK4_1 DEMD A 4 NULL S_DEMONCHUNK4_2 +S_DEMONCHUNK4_2 DEMD A 10 A_QueueCorpse S_DEMONCHUNK4_3 +S_DEMONCHUNK4_3 DEMD A 20 NULL S_DEMONCHUNK4_3 +S_DEMONCHUNK4_4 DEMD A -1 NULL S_NULL + +S_DEMONCHUNK5_1 DEME A 4 NULL S_DEMONCHUNK5_2 +S_DEMONCHUNK5_2 DEME A 10 A_QueueCorpse S_DEMONCHUNK5_3 +S_DEMONCHUNK5_3 DEME A 20 NULL S_DEMONCHUNK5_3 +S_DEMONCHUNK5_4 DEME A -1 NULL S_NULL + +S_DEMONFX_MOVE1 DMFX A* 4 NULL S_DEMONFX_MOVE2 +S_DEMONFX_MOVE2 DMFX B* 4 NULL S_DEMONFX_MOVE3 +S_DEMONFX_MOVE3 DMFX C* 4 NULL S_DEMONFX_MOVE1 + +S_DEMONFX_BOOM1 DMFX D* 4 NULL S_DEMONFX_BOOM2 +S_DEMONFX_BOOM2 DMFX E* 4 NULL S_DEMONFX_BOOM3 +S_DEMONFX_BOOM3 DMFX F* 3 NULL S_DEMONFX_BOOM4 +S_DEMONFX_BOOM4 DMFX G* 3 NULL S_DEMONFX_BOOM5 +S_DEMONFX_BOOM5 DMFX H* 3 NULL S_NULL + + +// +// Another demon +// + +$ MT_DEMON2 +doomednum 8080 +spawnstate S_DEMN2_LOOK1 +spawnhealth 250 +seestate S_DEMN2_CHASE1 +seesound DemonSight +attacksound DemonAttack +painstate S_DEMN2_PAIN1 +painchance 50 +painsound DemonPain +meleestate S_DEMN2_ATK1_1 +missilestate S_DEMN2_ATK2_1 +deathstate S_DEMN2_DEATH1 +xdeathstate S_DEMN2_XDEATH1 +deathsound DemonDeath +speed 13 +radius 32 +height 64 +mass 220 +activesound DemonActive +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL +flags2 MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_MCROSS|MF2_TELESTOMP + +$ MT_DEMON2CHUNK1 +spawnstate S_DEMON2CHUNK1_1 +deathstate S_DEMON2CHUNK1_4 +radius 5 +height 5 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_CORPSE +flags2 MF2_NOTELEPORT|MF2_FLOORCLIP + +$ MT_DEMON2CHUNK2 +spawnstate S_DEMON2CHUNK2_1 +deathstate S_DEMON2CHUNK2_4 +radius 5 +height 5 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_CORPSE +flags2 MF2_NOTELEPORT|MF2_FLOORCLIP + +$ MT_DEMON2CHUNK3 +spawnstate S_DEMON2CHUNK3_1 +deathstate S_DEMON2CHUNK3_4 +radius 5 +height 5 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_CORPSE +flags2 MF2_NOTELEPORT|MF2_FLOORCLIP + +$ MT_DEMON2CHUNK4 +spawnstate S_DEMON2CHUNK4_1 +deathstate S_DEMON2CHUNK4_4 +radius 5 +height 5 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_CORPSE +flags2 MF2_NOTELEPORT|MF2_FLOORCLIP + +$ MT_DEMON2CHUNK5 +spawnstate S_DEMON2CHUNK5_1 +deathstate S_DEMON2CHUNK5_4 +radius 5 +height 5 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_CORPSE +flags2 MF2_NOTELEPORT|MF2_FLOORCLIP + +$ MT_DEMON2FX1 +spawnstate S_DEMON2FX_MOVE1 +deathstate S_DEMON2FX_BOOM1 +deathsound DemonMissileExplode +speed 15 +radius 10 +height 6 +damage 5 +flags MF_MISSILE|MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF +flags2 MF2_NOTELEPORT|MF2_IMPACT|MF2_PCROSS|MF2_FIREDAMAGE + +S_DEMN2_LOOK1 DEM2 A 10 A_Look S_DEMN2_LOOK2 +S_DEMN2_LOOK2 DEM2 A 10 A_Look S_DEMN2_LOOK1 + +S_DEMN2_CHASE1 DEM2 A 4 A_Chase S_DEMN2_CHASE2 +S_DEMN2_CHASE2 DEM2 B 4 A_Chase S_DEMN2_CHASE3 +S_DEMN2_CHASE3 DEM2 C 4 A_Chase S_DEMN2_CHASE4 +S_DEMN2_CHASE4 DEM2 D 4 A_Chase S_DEMN2_CHASE1 + +S_DEMN2_ATK1_1 DEM2 E 6 A_FaceTarget S_DEMN2_ATK1_2 +S_DEMN2_ATK1_2 DEM2 F 8 A_FaceTarget S_DEMN2_ATK1_3 +S_DEMN2_ATK1_3 DEM2 G 6 A_DemonAttack1 S_DEMN2_CHASE1 + +S_DEMN2_ATK2_1 DEM2 E 5 A_FaceTarget S_DEMN2_ATK2_2 +S_DEMN2_ATK2_2 DEM2 F 6 A_FaceTarget S_DEMN2_ATK2_3 +S_DEMN2_ATK2_3 DEM2 G 5 A_DemonAttack2 S_DEMN2_CHASE1 + +S_DEMN2_PAIN1 DEM2 E 4 NULL S_DEMN2_PAIN2 +S_DEMN2_PAIN2 DEM2 E 4 A_Pain S_DEMN2_CHASE1 + +S_DEMN2_DEATH1 DEM2 H 6 NULL S_DEMN2_DEATH2 +S_DEMN2_DEATH2 DEM2 I 6 NULL S_DEMN2_DEATH3 +S_DEMN2_DEATH3 DEM2 J 6 A_Scream S_DEMN2_DEATH4 +S_DEMN2_DEATH4 DEM2 K 6 A_NoBlocking S_DEMN2_DEATH5 +S_DEMN2_DEATH5 DEM2 L 6 A_QueueCorpse S_DEMN2_DEATH6 +S_DEMN2_DEATH6 DEM2 M 6 NULL S_DEMN2_DEATH7 +S_DEMN2_DEATH7 DEM2 N 6 NULL S_DEMN2_DEATH8 +S_DEMN2_DEATH8 DEM2 O 6 NULL S_DEMN2_DEATH9 +S_DEMN2_DEATH9 DEM2 P -1 NULL S_NULL + +S_DEMN2_XDEATH1 DEM2 H 6 NULL S_DEMN2_XDEATH2 +S_DEMN2_XDEATH2 DEM2 I 6 A_Demon2Death S_DEMN2_XDEATH3 +S_DEMN2_XDEATH3 DEM2 J 6 A_Scream S_DEMN2_XDEATH4 +S_DEMN2_XDEATH4 DEM2 K 6 A_NoBlocking S_DEMN2_XDEATH5 +S_DEMN2_XDEATH5 DEM2 L 6 A_QueueCorpse S_DEMN2_XDEATH6 +S_DEMN2_XDEATH6 DEM2 M 6 NULL S_DEMN2_XDEATH7 +S_DEMN2_XDEATH7 DEM2 N 6 NULL S_DEMN2_XDEATH8 +S_DEMN2_XDEATH8 DEM2 O 6 NULL S_DEMN2_XDEATH9 +S_DEMN2_XDEATH9 DEM2 P -1 NULL S_NULL + +S_DEMON2CHUNK1_1 DMBA A 4 NULL S_DEMON2CHUNK1_2 +S_DEMON2CHUNK1_2 DMBA A 10 A_QueueCorpse S_DEMON2CHUNK1_3 +S_DEMON2CHUNK1_3 DMBA A 20 NULL S_DEMON2CHUNK1_3 +S_DEMON2CHUNK1_4 DMBA A -1 NULL S_NULL + +S_DEMON2CHUNK2_1 DMBB A 4 NULL S_DEMON2CHUNK2_2 +S_DEMON2CHUNK2_2 DMBB A 10 A_QueueCorpse S_DEMON2CHUNK2_3 +S_DEMON2CHUNK2_3 DMBB A 20 NULL S_DEMON2CHUNK2_3 +S_DEMON2CHUNK2_4 DMBB A -1 NULL S_NULL + +S_DEMON2CHUNK3_1 DMBC A 4 NULL S_DEMON2CHUNK3_2 +S_DEMON2CHUNK3_2 DMBC A 10 A_QueueCorpse S_DEMON2CHUNK3_3 +S_DEMON2CHUNK3_3 DMBC A 20 NULL S_DEMON2CHUNK3_3 +S_DEMON2CHUNK3_4 DMBC A -1 NULL S_NULL + +S_DEMON2CHUNK4_1 DMBD A 4 NULL S_DEMON2CHUNK4_2 +S_DEMON2CHUNK4_2 DMBD A 10 A_QueueCorpse S_DEMON2CHUNK4_3 +S_DEMON2CHUNK4_3 DMBD A 20 NULL S_DEMON2CHUNK4_3 +S_DEMON2CHUNK4_4 DMBD A -1 NULL S_NULL + +S_DEMON2CHUNK5_1 DMBE A 4 NULL S_DEMON2CHUNK5_2 +S_DEMON2CHUNK5_2 DMBE A 10 NULL S_DEMON2CHUNK5_3 +S_DEMON2CHUNK5_3 DMBE A 20 NULL S_DEMON2CHUNK5_3 +S_DEMON2CHUNK5_4 DMBE A -1 NULL S_NULL + +S_DEMON2FX_MOVE1 D2FX A* 4 NULL S_DEMON2FX_MOVE2 +S_DEMON2FX_MOVE2 D2FX B* 4 NULL S_DEMON2FX_MOVE3 +S_DEMON2FX_MOVE3 D2FX C* 4 NULL S_DEMON2FX_MOVE4 +S_DEMON2FX_MOVE4 D2FX D* 4 NULL S_DEMON2FX_MOVE5 +S_DEMON2FX_MOVE5 D2FX E* 4 NULL S_DEMON2FX_MOVE6 +S_DEMON2FX_MOVE6 D2FX F* 4 NULL S_DEMON2FX_MOVE1 + +S_DEMON2FX_BOOM1 D2FX G* 4 NULL S_DEMON2FX_BOOM2 +S_DEMON2FX_BOOM2 D2FX H* 4 NULL S_DEMON2FX_BOOM3 +S_DEMON2FX_BOOM3 D2FX I* 4 NULL S_DEMON2FX_BOOM4 +S_DEMON2FX_BOOM4 D2FX J* 4 NULL S_DEMON2FX_BOOM5 +S_DEMON2FX_BOOM5 D2FX K* 3 NULL S_DEMON2FX_BOOM6 +S_DEMON2FX_BOOM6 D2FX L* 3 NULL S_NULL + + +// +// Wraith +// + +$ MT_WRAITHB +doomednum 10011 +spawnstate S_WRAITH_LOOK1 +spawnhealth 150 +seestate S_WRAITH_RAISE1 +seesound WraithSight +attacksound WraithAttack +painstate S_WRAITH_PAIN1 +painchance 25 +painsound WraithPain +meleestate S_WRAITH_ATK1_1 +missilestate S_WRAITH_ATK2_1 +deathstate S_WRAITH_DEATH1_1 +xdeathstate S_WRAITH_DEATH2_1 +deathsound WraithDeath +speed 11 +height 68 +damage 10 +mass 75 +activesound WraithActive +flags MF_DROPOFF|MF_NOGRAVITY|MF_FLOAT|MF_COUNTKILL +flags2 MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_PUSHWALL|MF2_TELESTOMP|MF2_DONTDRAW + +$ MT_WRAITH +doomednum 34 +spawnstate S_WRAITH_INIT1 +spawnhealth 150 +seestate S_WRAITH_CHASE1 +seesound WraithSight +attacksound WraithAttack +painstate S_WRAITH_PAIN1 +painchance 25 +painsound WraithPain +meleestate S_WRAITH_ATK1_1 +missilestate S_WRAITH_ATK2_1 +deathstate S_WRAITH_DEATH1_1 +xdeathstate S_WRAITH_DEATH2_1 +deathsound WraithDeath +speed 11 +height 55 +damage 10 +mass 75 +activesound WraithActive +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL|MF_DROPOFF|MF_NOGRAVITY|MF_FLOAT +flags2 MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_PUSHWALL|MF2_TELESTOMP + +$ MT_WRAITHFX1 +spawnstate S_WRTHFX_MOVE1 +deathstate S_WRTHFX_BOOM1 +deathsound WraithMissileExplode +speed 14 +radius 10 +height 6 +damage 5 +mass 5 +flags MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE +flags2 MF2_NOTELEPORT|MF2_IMPACT|MF2_PCROSS|MF2_FLOORCLIP|MF2_FIREDAMAGE + +$ MT_WRAITHFX2 +spawnstate S_WRTHFX_SIZZLE1 +radius 2 +height 5 +mass 5 +flags MF_NOBLOCKMAP|MF_DROPOFF +flags2 MF2_NOTELEPORT|MF2_FLOORCLIP + +$ MT_WRAITHFX3 +spawnstate S_WRTHFX_DROP1 +deathstate S_WRTHFX_DEAD1 +deathsound Drip +radius 2 +height 5 +mass 5 +flags MF_NOBLOCKMAP|MF_DROPOFF|MF_MISSILE +flags2 MF2_NOTELEPORT|MF2_FLOORCLIP + +$ MT_WRAITHFX4 +spawnstate S_WRTHFX_ADROP1 +deathstate S_WRTHFX_ADEAD1 +deathsound Drip +radius 2 +height 5 +mass 5 +flags MF_NOBLOCKMAP|MF_DROPOFF|MF_MISSILE +flags2 MF2_NOTELEPORT + +$ MT_WRAITHFX5 +spawnstate S_WRTHFX_BDROP1 +deathstate S_WRTHFX_BDEAD1 +deathsound Drip +radius 2 +height 5 +mass 5 +flags MF_NOBLOCKMAP|MF_DROPOFF|MF_MISSILE +flags2 MF2_NOTELEPORT + +S_WRAITH_RAISE1 WRTH A 2 A_WraithRaiseInit S_WRAITH_RAISE2 +S_WRAITH_RAISE2 WRTH A 2 A_WraithRaise S_WRAITH_RAISE3 +S_WRAITH_RAISE3 WRTH A 2 A_FaceTarget S_WRAITH_RAISE4 +S_WRAITH_RAISE4 WRTH B 2 A_WraithRaise S_WRAITH_RAISE5 +S_WRAITH_RAISE5 WRTH B 2 A_WraithRaise S_WRAITH_RAISE2 + +S_WRAITH_INIT1 WRTH A 10 NULL S_WRAITH_INIT2 +S_WRAITH_INIT2 WRTH B 5 A_WraithInit S_WRAITH_LOOK1 +S_WRAITH_LOOK1 WRTH A 15 A_WraithLook S_WRAITH_LOOK2 +S_WRAITH_LOOK2 WRTH B 15 A_WraithLook S_WRAITH_LOOK1 + +S_WRAITH_CHASE1 WRTH A 4 A_WraithChase S_WRAITH_CHASE2 +S_WRAITH_CHASE2 WRTH B 4 A_WraithChase S_WRAITH_CHASE3 +S_WRAITH_CHASE3 WRTH C 4 A_WraithChase S_WRAITH_CHASE4 +S_WRAITH_CHASE4 WRTH D 4 A_WraithChase S_WRAITH_CHASE1 + +S_WRAITH_ATK1_1 WRTH E 6 A_FaceTarget S_WRAITH_ATK1_2 +S_WRAITH_ATK1_2 WRTH F 6 A_WraithFX3 S_WRAITH_ATK1_3 +S_WRAITH_ATK1_3 WRTH G 6 A_WraithMelee S_WRAITH_CHASE1 + +S_WRAITH_ATK2_1 WRTH E 6 A_FaceTarget S_WRAITH_ATK2_2 +S_WRAITH_ATK2_2 WRTH F 6 NULL S_WRAITH_ATK2_3 +S_WRAITH_ATK2_3 WRTH G 6 A_WraithMissile S_WRAITH_CHASE1 + +S_WRAITH_PAIN1 WRTH A 2 NULL S_WRAITH_PAIN2 +S_WRAITH_PAIN2 WRTH H 6 A_Pain S_WRAITH_CHASE1 + +S_WRAITH_DEATH1_1 WRTH I 4 NULL S_WRAITH_DEATH1_2 +S_WRAITH_DEATH1_2 WRTH J 4 A_Scream S_WRAITH_DEATH1_3 +S_WRAITH_DEATH1_3 WRTH K 4 NULL S_WRAITH_DEATH1_4 +S_WRAITH_DEATH1_4 WRTH L 4 NULL S_WRAITH_DEATH1_5 +S_WRAITH_DEATH1_5 WRTH M 4 A_NoBlocking S_WRAITH_DEATH1_6 +S_WRAITH_DEATH1_6 WRTH N 4 A_QueueCorpse S_WRAITH_DEATH1_7 +S_WRAITH_DEATH1_7 WRTH O 4 NULL S_WRAITH_DEATH1_8 +S_WRAITH_DEATH1_8 WRTH P 5 NULL S_WRAITH_DEATH1_9 +S_WRAITH_DEATH1_9 WRTH Q 5 NULL S_WRAITH_DEATH1_0 +S_WRAITH_DEATH1_0 WRTH R -1 NULL S_NULL + +S_WRAITH_DEATH2_1 WRT2 A 5 NULL S_WRAITH_DEATH2_2 +S_WRAITH_DEATH2_2 WRT2 B 5 A_Scream S_WRAITH_DEATH2_3 +S_WRAITH_DEATH2_3 WRT2 C 5 NULL S_WRAITH_DEATH2_4 +S_WRAITH_DEATH2_4 WRT2 D 5 NULL S_WRAITH_DEATH2_5 +S_WRAITH_DEATH2_5 WRT2 E 5 A_NoBlocking S_WRAITH_DEATH2_6 +S_WRAITH_DEATH2_6 WRT2 F 5 A_QueueCorpse S_WRAITH_DEATH2_7 +S_WRAITH_DEATH2_7 WRT2 G 5 NULL S_WRAITH_DEATH2_8 +S_WRAITH_DEATH2_8 WRT2 H -1 NULL S_NULL + +S_WRAITH_ICE WRT2 I 5 A_FreezeDeath S_WRAITH_ICE2 +S_WRAITH_ICE2 WRT2 I 1 A_FreezeDeathChunks S_WRAITH_ICE2 + +S_WRTHFX_MOVE1 WRBL A* 3 NULL S_WRTHFX_MOVE2 +S_WRTHFX_MOVE2 WRBL B* 3 A_WraithFX2 S_WRTHFX_MOVE3 +S_WRTHFX_MOVE3 WRBL C* 3 NULL S_WRTHFX_MOVE1 +S_WRTHFX_BOOM1 WRBL D* 4 NULL S_WRTHFX_BOOM2 +S_WRTHFX_BOOM2 WRBL E* 4 A_WraithFX2 S_WRTHFX_BOOM3 +S_WRTHFX_BOOM3 WRBL F* 4 NULL S_WRTHFX_BOOM4 +S_WRTHFX_BOOM4 WRBL G* 3 A_WraithFX2 S_WRTHFX_BOOM5 +S_WRTHFX_BOOM5 WRBL H* 3 A_WraithFX2 S_WRTHFX_BOOM6 +S_WRTHFX_BOOM6 WRBL I* 3 NULL S_NULL + +S_WRTHFX_SIZZLE1 WRBL J* 4 NULL S_WRTHFX_SIZZLE2 +S_WRTHFX_SIZZLE2 WRBL K* 4 NULL S_WRTHFX_SIZZLE3 +S_WRTHFX_SIZZLE3 WRBL L* 4 NULL S_WRTHFX_SIZZLE4 +S_WRTHFX_SIZZLE4 WRBL M* 4 NULL S_WRTHFX_SIZZLE5 +S_WRTHFX_SIZZLE5 WRBL N* 4 NULL S_WRTHFX_SIZZLE6 +S_WRTHFX_SIZZLE6 WRBL O* 4 NULL S_WRTHFX_SIZZLE7 +S_WRTHFX_SIZZLE7 WRBL P* 4 NULL S_NULL + +S_WRTHFX_DROP1 WRBL Q* 4 NULL S_WRTHFX_DROP2 +S_WRTHFX_DROP2 WRBL R* 4 NULL S_WRTHFX_DROP3 +S_WRTHFX_DROP3 WRBL S* 4 NULL S_WRTHFX_DROP1 +S_WRTHFX_DEAD1 WRBL S* 4 NULL S_NULL + +S_WRTHFX_ADROP1 WRBL T 4 NULL S_WRTHFX_ADROP2 +S_WRTHFX_ADROP2 WRBL U 4 NULL S_WRTHFX_ADROP3 +S_WRTHFX_ADROP3 WRBL V 4 NULL S_WRTHFX_ADROP4 +S_WRTHFX_ADROP4 WRBL W 4 NULL S_WRTHFX_ADROP1 + +S_WRTHFX_ADEAD1 WRBL W 10 NULL S_NULL + +S_WRTHFX_BDROP1 WRBL X 7 NULL S_WRTHFX_BDROP2 +S_WRTHFX_BDROP2 WRBL Y 7 NULL S_WRTHFX_BDROP3 +S_WRTHFX_BDROP3 WRBL Z 7 NULL S_WRTHFX_BDROP1 +S_WRTHFX_BDEAD1 WRBL Z 35 NULL S_NULL + + +// +// Minotaur / Maulator +// + +$ MT_MINOTAUR +doomednum 9 +spawnstate S_MNTR_SPAWN1 +spawnhealth 2500 +seestate S_MNTR_WALK1 +seesound MaulatorSight +attacksound MaulatorHamSwing +painstate S_MNTR_PAIN1 +painchance 25 +painsound MaulatorPain +meleestate S_MNTR_ATK1_1 +missilestate S_MNTR_ATK2_1 +deathstate S_MNTR_DIE1 +deathsound MaulatorDeath +speed 16 +radius 28 +height 100 +damage 7 +mass 800 +activesound MaulatorActive +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL +flags2 MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_PUSHWALL|MF2_TELESTOMP +translucency 0.33 + +$ MT_MNTRFX1 +spawnstate S_MNTRFX1_1 +deathstate S_MNTRFXI1_1 +speed 20 +radius 10 +height 6 +damage 3 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_NOTELEPORT|MF2_FIREDAMAGE + +$ MT_MNTRFX2 +spawnstate S_MNTRFX2_1 +deathstate S_MNTRFXI2_1 +speed 14 +radius 5 +height 12 +damage 4 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_NOTELEPORT|MF2_FIREDAMAGE + +$ MT_MNTRFX3 +spawnstate S_MNTRFX3_1 +deathstate S_MNTRFXI2_1 +radius 8 +damage 4 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_NOTELEPORT|MF2_FIREDAMAGE + +$ MT_MNTRSMOKE +spawnstate S_MINOSMOKE1 +flags MF_NOBLOCKMAP|MF_NOGRAVITY +flags2 MF2_NOTELEPORT +translucency 0.33 + +$ MT_MNTRSMOKEEXIT +spawnstate S_MINOSMOKEX1 +flags MF_NOBLOCKMAP|MF_NOGRAVITY +flags2 MF2_NOTELEPORT +translucency 0.33 + +S_MNTR_SPAWN1 MNTR A 15 NULL S_MNTR_SPAWN2 +S_MNTR_SPAWN2 MNTR A 15 A_MinotaurFade1 S_MNTR_SPAWN3 +S_MNTR_SPAWN3 MNTR A 3 A_MinotaurFade2 S_MNTR_LOOK1 + +S_MNTR_LOOK1 MNTR A 10 A_MinotaurLook S_MNTR_LOOK2 +S_MNTR_LOOK2 MNTR B 10 A_MinotaurLook S_MNTR_LOOK1 + +S_MNTR_WALK1 MNTR A 5 A_MinotaurChase S_MNTR_WALK2 +S_MNTR_WALK2 MNTR B 5 A_MinotaurChase S_MNTR_WALK3 +S_MNTR_WALK3 MNTR C 5 A_MinotaurChase S_MNTR_WALK4 +S_MNTR_WALK4 MNTR D 5 A_MinotaurChase S_MNTR_WALK1 + +S_MNTR_ROAM1 MNTR A 5 A_MinotaurRoam S_MNTR_ROAM2 +S_MNTR_ROAM2 MNTR B 5 A_MinotaurRoam S_MNTR_ROAM3 +S_MNTR_ROAM3 MNTR C 5 A_MinotaurRoam S_MNTR_ROAM4 +S_MNTR_ROAM4 MNTR D 5 A_MinotaurRoam S_MNTR_ROAM1 + +S_MNTR_ATK1_1 MNTR G 10 A_FaceTarget S_MNTR_ATK1_2 +S_MNTR_ATK1_2 MNTR H 7 A_FaceTarget S_MNTR_ATK1_3 +S_MNTR_ATK1_3 MNTR I 12 A_MinotaurAtk1 S_MNTR_WALK1 + +S_MNTR_ATK2_1 MNTR G 10 A_MinotaurDecide S_MNTR_ATK2_2 +S_MNTR_ATK2_2 MNTR J 4 A_FaceTarget S_MNTR_ATK2_3 +S_MNTR_ATK2_3 MNTR K 9 A_MinotaurAtk2 S_MNTR_WALK1 + +S_MNTR_ATK3_1 MNTR G 10 A_FaceTarget S_MNTR_ATK3_2 +S_MNTR_ATK3_2 MNTR H 7 A_FaceTarget S_MNTR_ATK3_3 +S_MNTR_ATK3_3 MNTR I 12 A_MinotaurAtk3 S_MNTR_WALK1 +S_MNTR_ATK3_4 MNTR I 12 NULL S_MNTR_ATK3_1 + +S_MNTR_ATK4_1 MNTR F 2 A_MinotaurCharge S_MNTR_ATK4_1 + +S_MNTR_PAIN1 MNTR E 3 NULL S_MNTR_PAIN2 +S_MNTR_PAIN2 MNTR E 6 A_Pain S_MNTR_WALK1 + +S_MNTR_DIE1 MNTR E 6 NULL S_MNTR_DIE2 +S_MNTR_DIE2 MNTR E 2 A_Scream S_MNTR_DIE3 +S_MNTR_DIE3 MNTR E 5 A_SmokePuffExit S_MNTR_DIE4 +S_MNTR_DIE4 MNTR E 5 NULL S_MNTR_DIE5 +S_MNTR_DIE5 MNTR E 5 A_NoBlocking S_MNTR_DIE6 +S_MNTR_DIE6 MNTR E 5 NULL S_MNTR_DIE7 +S_MNTR_DIE7 MNTR E 5 A_MinotaurFade1 S_MNTR_DIE8 +S_MNTR_DIE8 MNTR E 5 A_MinotaurFade0 S_MNTR_DIE9 +S_MNTR_DIE9 MNTR E 10 NULL S_NULL + +S_MNTRFX1_1 FX12 A* 6 NULL S_MNTRFX1_2 +S_MNTRFX1_2 FX12 B* 6 NULL S_MNTRFX1_1 + +S_MNTRFXI1_1 FX12 C* 5 NULL S_MNTRFXI1_2 +S_MNTRFXI1_2 FX12 D* 5 NULL S_MNTRFXI1_3 +S_MNTRFXI1_3 FX12 E* 5 NULL S_MNTRFXI1_4 +S_MNTRFXI1_4 FX12 F* 5 NULL S_MNTRFXI1_5 +S_MNTRFXI1_5 FX12 G* 5 NULL S_MNTRFXI1_6 +S_MNTRFXI1_6 FX12 H* 5 NULL S_NULL + +S_MNTRFX2_1 FX13 A 2 A_MntrFloorFire S_MNTRFX2_1 + +S_MNTRFXI2_1 FX13 I* 4 A_Explode S_MNTRFXI2_2 +S_MNTRFXI2_2 FX13 J* 4 NULL S_MNTRFXI2_3 +S_MNTRFXI2_3 FX13 K* 4 NULL S_MNTRFXI2_4 +S_MNTRFXI2_4 FX13 L* 4 NULL S_MNTRFXI2_5 +S_MNTRFXI2_5 FX13 M* 4 NULL S_NULL + +S_MNTRFX3_1 FX13 D* 4 NULL S_MNTRFX3_2 +S_MNTRFX3_2 FX13 C* 4 NULL S_MNTRFX3_3 +S_MNTRFX3_3 FX13 B* 5 NULL S_MNTRFX3_4 +S_MNTRFX3_4 FX13 C* 5 NULL S_MNTRFX3_5 +S_MNTRFX3_5 FX13 D* 5 NULL S_MNTRFX3_6 +S_MNTRFX3_6 FX13 E* 5 NULL S_MNTRFX3_7 +S_MNTRFX3_7 FX13 F* 4 NULL S_MNTRFX3_8 +S_MNTRFX3_8 FX13 G* 4 NULL S_MNTRFX3_9 +S_MNTRFX3_9 FX13 H* 4 NULL S_NULL + +S_MINOSMOKE1 MNSM A 3 NULL S_MINOSMOKE2 +S_MINOSMOKE2 MNSM B 3 NULL S_MINOSMOKE3 +S_MINOSMOKE3 MNSM C 3 NULL S_MINOSMOKE4 +S_MINOSMOKE4 MNSM D 3 NULL S_MINOSMOKE5 +S_MINOSMOKE5 MNSM E 3 NULL S_MINOSMOKE6 +S_MINOSMOKE6 MNSM F 3 NULL S_MINOSMOKE7 +S_MINOSMOKE7 MNSM G 3 NULL S_MINOSMOKE8 +S_MINOSMOKE8 MNSM H 3 NULL S_MINOSMOKE9 +S_MINOSMOKE9 MNSM I 3 NULL S_MINOSMOKE0 +S_MINOSMOKE0 MNSM J 3 NULL S_MINOSMOKEA +S_MINOSMOKEA MNSM K 3 NULL S_MINOSMOKEB +S_MINOSMOKEB MNSM L 3 NULL S_MINOSMOKEC +S_MINOSMOKEC MNSM M 3 NULL S_MINOSMOKED +S_MINOSMOKED MNSM N 3 NULL S_MINOSMOKEE +S_MINOSMOKEE MNSM O 3 NULL S_MINOSMOKEF +S_MINOSMOKEF MNSM P 3 NULL S_MINOSMOKEG +S_MINOSMOKEG MNSM Q 3 NULL S_NULL + +S_MINOSMOKEX1 MNSM A 3 NULL S_MINOSMOKEX2 +S_MINOSMOKEX2 MNSM B 3 NULL S_MINOSMOKEX3 +S_MINOSMOKEX3 MNSM C 3 NULL S_MINOSMOKEX4 +S_MINOSMOKEX4 MNSM D 3 NULL S_MINOSMOKEX5 +S_MINOSMOKEX5 MNSM E 3 NULL S_MINOSMOKEX6 +S_MINOSMOKEX6 MNSM F 3 NULL S_MINOSMOKEX7 +S_MINOSMOKEX7 MNSM G 3 NULL S_MINOSMOKEX8 +S_MINOSMOKEX8 MNSM H 3 NULL S_MINOSMOKEX9 +S_MINOSMOKEX9 MNSM I 3 NULL S_MINOSMOKEX0 +S_MINOSMOKEX0 MNSM J 3 NULL S_MINOSMOKEXA +S_MINOSMOKEXA MNSM I 3 NULL S_MINOSMOKEXB +S_MINOSMOKEXB MNSM H 3 NULL S_MINOSMOKEXC +S_MINOSMOKEXC MNSM G 3 NULL S_MINOSMOKEXD +S_MINOSMOKEXD MNSM F 3 NULL S_MINOSMOKEXE +S_MINOSMOKEXE MNSM E 3 NULL S_MINOSMOKEXF +S_MINOSMOKEXF MNSM D 3 NULL S_MINOSMOKEXG +S_MINOSMOKEXG MNSM C 3 NULL S_MINOSMOKEXH +S_MINOSMOKEXH MNSM B 3 NULL S_MINOSMOKEXI +S_MINOSMOKEXI MNSM A 3 NULL S_NULL + + +// +// Sepent +// + +$ MT_SERPENT +doomednum 121 +spawnstate S_SERPENT_LOOK1 +spawnhealth 90 +seestate S_SERPENT_SWIM1 +seesound SerpentSight +attacksound SerpentAttack +painstate S_SERPENT_PAIN1 +painchance 96 +painsound SerpentPain +meleestate S_SERPENT_SURFACE1 +deathstate S_SERPENT_DIE1 +xdeathstate S_SERPENT_XDIE1 +deathsound SerpentDeath +speed 12 +radius 32 +height 70 +mass 0x7fffffff +flags MF_SOLID|MF_COUNTKILL|MF_NOBLOOD +flags2 MF2_PASSMOBJ|MF2_DONTDRAW|MF2_CANTLEAVEFLOORPIC|MF2_NONSHOOTABLE|MF2_MCROSS + +$ MT_SERPENTLEADER +doomednum 120 +spawnstate S_SERPENT_LOOK1 +spawnhealth 90 +seestate S_SERPENT_SWIM1 +seesound SerpentSight +attacksound SerpentAttack +painstate S_SERPENT_PAIN1 +painchance 96 +painsound SerpentPain +meleestate S_SERPENT_SURFACE1 +deathstate S_SERPENT_DIE1 +xdeathstate S_SERPENT_XDIE1 +deathsound SerpentDeath +speed 12 +radius 32 +height 70 +mass 200 +flags MF_SOLID|MF_COUNTKILL|MF_NOBLOOD +flags2 MF2_PASSMOBJ|MF2_DONTDRAW|MF2_CANTLEAVEFLOORPIC|MF2_NONSHOOTABLE|MF2_MCROSS + +$ MT_SERPENTFX +spawnstate S_SERPENT_FX1 +deathstate S_SERPENT_FX_X1 +deathsound SerpentFXHit +speed 15 +radius 8 +height 10 +damage 4 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_NOTELEPORT + +$ MT_SERPENT_HEAD +spawnstate S_SERPENT_HEAD1 +radius 5 +height 10 +flags MF_NOBLOCKMAP +flags2 MF2_LOGRAV + +$ MT_SERPENT_GIB1 +spawnstate S_SERPENT_GIB1_1 +radius 3 +height 3 +flags MF_NOBLOCKMAP|MF_NOGRAVITY + +$ MT_SERPENT_GIB2 +spawnstate S_SERPENT_GIB2_1 +radius 3 +height 3 +flags MF_NOBLOCKMAP|MF_NOGRAVITY + +$ MT_SERPENT_GIB3 +spawnstate S_SERPENT_GIB3_1 +radius 3 +height 3 +flags MF_NOBLOCKMAP|MF_NOGRAVITY + +S_SERPENT_LOOK1 SSPT H 10 A_Look S_SERPENT_LOOK1 + +S_SERPENT_SWIM1 SSPT H 1 A_SerpentChase S_SERPENT_SWIM2 +S_SERPENT_SWIM2 SSPT H 1 A_SerpentChase S_SERPENT_SWIM3 +S_SERPENT_SWIM3 SSPT H 2 A_SerpentHumpDecide S_SERPENT_SWIM1 + +S_SERPENT_HUMP1 SSPT H 3 A_SerpentUnHide S_SERPENT_HUMP2 +S_SERPENT_HUMP2 SSPT E 3 A_SerpentRaiseHump S_SERPENT_HUMP3 +S_SERPENT_HUMP3 SSPT F 3 A_SerpentRaiseHump S_SERPENT_HUMP4 +S_SERPENT_HUMP4 SSPT G 3 A_SerpentRaiseHump S_SERPENT_HUMP5 +S_SERPENT_HUMP5 SSPT E 3 A_SerpentRaiseHump S_SERPENT_HUMP6 +S_SERPENT_HUMP6 SSPT F 3 A_SerpentRaiseHump S_SERPENT_HUMP7 +S_SERPENT_HUMP7 SSPT G 3 NULL S_SERPENT_HUMP8 +S_SERPENT_HUMP8 SSPT E 3 NULL S_SERPENT_HUMP9 +S_SERPENT_HUMP9 SSPT F 3 NULL S_SERPENT_HUMP10 +S_SERPENT_HUMP10 SSPT G 3 A_SerpentLowerHump S_SERPENT_HUMP11 +S_SERPENT_HUMP11 SSPT E 3 A_SerpentLowerHump S_SERPENT_HUMP12 +S_SERPENT_HUMP12 SSPT F 3 A_SerpentLowerHump S_SERPENT_HUMP13 +S_SERPENT_HUMP13 SSPT G 3 A_SerpentLowerHump S_SERPENT_HUMP14 +S_SERPENT_HUMP14 SSPT E 3 A_SerpentLowerHump S_SERPENT_HUMP15 +S_SERPENT_HUMP15 SSPT F 3 A_SerpentHide S_SERPENT_SWIM1 + +S_SERPENT_SURFACE1 SSPT A 1 A_UnHideThing S_SERPENT_SURFACE2 +S_SERPENT_SURFACE2 SSPT A 1 A_SerpentBirthScream S_SERPENT_SURFACE3 +S_SERPENT_SURFACE3 SSPT B 3 A_SetShootable S_SERPENT_SURFACE4 +S_SERPENT_SURFACE4 SSPT C 3 NULL S_SERPENT_SURFACE5 +S_SERPENT_SURFACE5 SSPT D 4 A_SerpentCheckForAttack S_SERPENT_DIVE1 + +S_SERPENT_DIVE1 SSDV A 4 NULL S_SERPENT_DIVE2 +S_SERPENT_DIVE2 SSDV B 4 NULL S_SERPENT_DIVE3 +S_SERPENT_DIVE3 SSDV C 4 NULL S_SERPENT_DIVE4 +S_SERPENT_DIVE4 SSDV D 4 A_UnSetShootable S_SERPENT_DIVE5 +S_SERPENT_DIVE5 SSDV E 3 A_SerpentDiveSound S_SERPENT_DIVE6 +S_SERPENT_DIVE6 SSDV F 3 NULL S_SERPENT_DIVE7 +S_SERPENT_DIVE7 SSDV G 4 NULL S_SERPENT_DIVE8 +S_SERPENT_DIVE8 SSDV H 4 NULL S_SERPENT_DIVE9 +S_SERPENT_DIVE9 SSDV I 3 NULL S_SERPENT_DIVE10 +S_SERPENT_DIVE10 SSDV J 3 A_SerpentHide S_SERPENT_SWIM1 + +S_SERPENT_WALK1 SSPT I 5 A_SerpentWalk S_SERPENT_WALK2 +S_SERPENT_WALK2 SSPT J 5 A_SerpentWalk S_SERPENT_WALK3 +S_SERPENT_WALK3 SSPT I 5 A_SerpentWalk S_SERPENT_WALK4 +S_SERPENT_WALK4 SSPT J 5 A_SerpentCheckForAttack S_SERPENT_DIVE1 + +S_SERPENT_PAIN1 SSPT L 5 NULL S_SERPENT_PAIN2 +S_SERPENT_PAIN2 SSPT L 5 A_Pain S_SERPENT_DIVE1 + +S_SERPENT_ATK1 SSPT K 6 A_FaceTarget S_SERPENT_ATK2 +S_SERPENT_ATK2 SSPT L 5 A_SerpentChooseAttack S_SERPENT_MELEE1 +S_SERPENT_MELEE1 SSPT N 5 A_SerpentMeleeAttack S_SERPENT_DIVE1 + +S_SERPENT_MISSILE1 SSPT N 5 A_SerpentMissileAttack S_SERPENT_DIVE1 + +S_SERPENT_DIE1 SSPT O 4 NULL S_SERPENT_DIE2 +S_SERPENT_DIE2 SSPT P 4 A_Scream S_SERPENT_DIE3 +S_SERPENT_DIE3 SSPT Q 4 A_NoBlocking S_SERPENT_DIE4 +S_SERPENT_DIE4 SSPT R 4 NULL S_SERPENT_DIE5 +S_SERPENT_DIE5 SSPT S 4 NULL S_SERPENT_DIE6 +S_SERPENT_DIE6 SSPT T 4 NULL S_SERPENT_DIE7 +S_SERPENT_DIE7 SSPT U 4 NULL S_SERPENT_DIE8 +S_SERPENT_DIE8 SSPT V 4 NULL S_SERPENT_DIE9 +S_SERPENT_DIE9 SSPT W 4 NULL S_SERPENT_DIE10 +S_SERPENT_DIE10 SSPT X 4 NULL S_SERPENT_DIE11 +S_SERPENT_DIE11 SSPT Y 4 NULL S_SERPENT_DIE12 +S_SERPENT_DIE12 SSPT Z 4 NULL S_NULL + +S_SERPENT_XDIE1 SSXD A 4 NULL S_SERPENT_XDIE2 +S_SERPENT_XDIE2 SSXD B 4 A_SerpentHeadPop S_SERPENT_XDIE3 +S_SERPENT_XDIE3 SSXD C 4 A_NoBlocking S_SERPENT_XDIE4 +S_SERPENT_XDIE4 SSXD D 4 NULL S_SERPENT_XDIE5 +S_SERPENT_XDIE5 SSXD E 4 NULL S_SERPENT_XDIE6 +S_SERPENT_XDIE6 SSXD F 3 NULL S_SERPENT_XDIE7 +S_SERPENT_XDIE7 SSXD G 3 NULL S_SERPENT_XDIE8 +S_SERPENT_XDIE8 SSXD H 3 A_SerpentSpawnGibs S_NULL + +S_SERPENT_ICE SSPT [ 5 A_FreezeDeath S_SERPENT_ICE2 +S_SERPENT_ICE2 SSPT [ 1 A_FreezeDeathChunks S_SERPENT_ICE2 + +S_SERPENT_FX1 SSFX A* 3 A_ContMobjSound S_SERPENT_FX2 +S_SERPENT_FX2 SSFX B* 3 NULL S_SERPENT_FX3 +S_SERPENT_FX3 SSFX A* 3 NULL S_SERPENT_FX4 +S_SERPENT_FX4 SSFX B* 3 NULL S_SERPENT_FX1 + +S_SERPENT_FX_X1 SSFX C* 4 NULL S_SERPENT_FX_X2 +S_SERPENT_FX_X2 SSFX D* 4 NULL S_SERPENT_FX_X3 +S_SERPENT_FX_X3 SSFX E* 4 NULL S_SERPENT_FX_X4 +S_SERPENT_FX_X4 SSFX F* 4 NULL S_SERPENT_FX_X5 +S_SERPENT_FX_X5 SSFX G* 4 NULL S_SERPENT_FX_X6 +S_SERPENT_FX_X6 SSFX H* 4 NULL S_NULL + +S_SERPENT_HEAD1 SSXD I 4 A_SerpentHeadCheck S_SERPENT_HEAD2 +S_SERPENT_HEAD2 SSXD J 4 A_SerpentHeadCheck S_SERPENT_HEAD3 +S_SERPENT_HEAD3 SSXD K 4 A_SerpentHeadCheck S_SERPENT_HEAD4 +S_SERPENT_HEAD4 SSXD L 4 A_SerpentHeadCheck S_SERPENT_HEAD5 +S_SERPENT_HEAD5 SSXD M 4 A_SerpentHeadCheck S_SERPENT_HEAD6 +S_SERPENT_HEAD6 SSXD N 4 A_SerpentHeadCheck S_SERPENT_HEAD7 +S_SERPENT_HEAD7 SSXD O 4 A_SerpentHeadCheck S_SERPENT_HEAD8 +S_SERPENT_HEAD8 SSXD P 4 A_SerpentHeadCheck S_SERPENT_HEAD1 + +S_SERPENT_HEAD_X1 SSXD S -1 NULL S_SERPENT_HEAD_X1 + +S_SERPENT_GIB1_1 SSXD Q 6 NULL S_SERPENT_GIB1_2 +S_SERPENT_GIB1_2 SSXD Q 6 A_FloatGib S_SERPENT_GIB1_3 +S_SERPENT_GIB1_3 SSXD Q 8 A_FloatGib S_SERPENT_GIB1_4 +S_SERPENT_GIB1_4 SSXD Q 8 A_FloatGib S_SERPENT_GIB1_5 +S_SERPENT_GIB1_5 SSXD Q 12 A_FloatGib S_SERPENT_GIB1_6 +S_SERPENT_GIB1_6 SSXD Q 12 A_FloatGib S_SERPENT_GIB1_7 +S_SERPENT_GIB1_7 SSXD Q 232 A_DelayGib S_SERPENT_GIB1_8 +S_SERPENT_GIB1_8 SSXD Q 12 A_SinkGib S_SERPENT_GIB1_9 +S_SERPENT_GIB1_9 SSXD Q 12 A_SinkGib S_SERPENT_GIB1_10 +S_SERPENT_GIB1_10 SSXD Q 8 A_SinkGib S_SERPENT_GIB1_11 +S_SERPENT_GIB1_11 SSXD Q 8 A_SinkGib S_SERPENT_GIB1_12 +S_SERPENT_GIB1_12 SSXD Q 8 A_SinkGib S_NULL + +S_SERPENT_GIB2_1 SSXD R 6 NULL S_SERPENT_GIB2_2 +S_SERPENT_GIB2_2 SSXD R 6 A_FloatGib S_SERPENT_GIB2_3 +S_SERPENT_GIB2_3 SSXD R 8 A_FloatGib S_SERPENT_GIB2_4 +S_SERPENT_GIB2_4 SSXD R 8 A_FloatGib S_SERPENT_GIB2_5 +S_SERPENT_GIB2_5 SSXD R 12 A_FloatGib S_SERPENT_GIB2_6 +S_SERPENT_GIB2_6 SSXD R 12 A_FloatGib S_SERPENT_GIB2_7 +S_SERPENT_GIB2_7 SSXD R 232 A_DelayGib S_SERPENT_GIB2_8 +S_SERPENT_GIB2_8 SSXD R 12 A_SinkGib S_SERPENT_GIB2_9 +S_SERPENT_GIB2_9 SSXD R 12 A_SinkGib S_SERPENT_GIB2_10 +S_SERPENT_GIB2_10 SSXD R 8 A_SinkGib S_SERPENT_GIB2_11 +S_SERPENT_GIB2_11 SSXD R 8 A_SinkGib S_SERPENT_GIB2_12 +S_SERPENT_GIB2_12 SSXD R 8 A_SinkGib S_NULL + +S_SERPENT_GIB3_1 SSXD T 6 NULL S_SERPENT_GIB3_2 +S_SERPENT_GIB3_2 SSXD T 6 A_FloatGib S_SERPENT_GIB3_3 +S_SERPENT_GIB3_3 SSXD T 8 A_FloatGib S_SERPENT_GIB3_4 +S_SERPENT_GIB3_4 SSXD T 8 A_FloatGib S_SERPENT_GIB3_5 +S_SERPENT_GIB3_5 SSXD T 12 A_FloatGib S_SERPENT_GIB3_6 +S_SERPENT_GIB3_6 SSXD T 12 A_FloatGib S_SERPENT_GIB3_7 +S_SERPENT_GIB3_7 SSXD T 232 A_DelayGib S_SERPENT_GIB3_8 +S_SERPENT_GIB3_8 SSXD T 12 A_SinkGib S_SERPENT_GIB3_9 +S_SERPENT_GIB3_9 SSXD T 12 A_SinkGib S_SERPENT_GIB3_10 +S_SERPENT_GIB3_10 SSXD T 8 A_SinkGib S_SERPENT_GIB3_11 +S_SERPENT_GIB3_11 SSXD T 8 A_SinkGib S_SERPENT_GIB3_12 +S_SERPENT_GIB3_12 SSXD T 8 A_SinkGib S_NULL + + +// +// Dark Bishop +// + +$ MT_BISHOP +doomednum 114 +spawnstate S_BISHOP_LOOK1 +spawnhealth 130 +seestate S_BISHOP_WALK1 +seesound BishopSight +attacksound BishopAttack +painstate S_BISHOP_PAIN1 +painchance 110 +painsound BishopPain +meleestate 0 +missilestate S_BISHOP_ATK1 +deathstate S_BISHOP_DEATH1 +deathsound BishopDeath +speed 10 +radius 22 +height 65 +activesound BishopActive +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL|MF_FLOAT|MF_NOGRAVITY|MF_NOBLOOD +flags2 MF2_PASSMOBJ|MF2_PUSHWALL|MF2_TELESTOMP + +$ MT_BISHOP_PUFF +spawnstate S_BISHOP_PUFF1 +flags MF_NOBLOCKMAP|MF_NOGRAVITY +translucency 0.33 + +$ MT_BISHOPBLUR +spawnstate S_BISHOPBLUR1 +flags MF_NOBLOCKMAP|MF_NOGRAVITY +translucency 0.33 + +$ MT_BISHOPPAINBLUR +spawnstate S_BISHOPPAINBLUR1 +flags MF_NOBLOCKMAP|MF_NOGRAVITY +translucency 0.33 + +$ MT_BISH_FX +spawnstate S_BISHFX1_1 +deathstate S_BISHFXI1_1 +deathsound BishopMissileExplode +speed 10 +radius 10 +height 6 +damage 1 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_NOTELEPORT|MF2_SEEKERMISSILE + +S_BISHOP_LOOK1 BISH A 10 A_Look S_BISHOP_LOOK1 + +S_BISHOP_DECIDE BISH A 1 A_BishopDecide S_BISHOP_WALK1 + +S_BISHOP_BLUR1 BISH A 2 A_BishopDoBlur S_BISHOP_BLUR2 +S_BISHOP_BLUR2 BISH A 4 A_BishopSpawnBlur S_BISHOP_BLUR2 + +S_BISHOP_WALK1 BISH A 2 A_Chase S_BISHOP_WALK2 +S_BISHOP_WALK2 BISH A 2 A_BishopChase S_BISHOP_WALK3 +S_BISHOP_WALK3 BISH A 2 NULL S_BISHOP_WALK4 +S_BISHOP_WALK4 BISH B 2 A_BishopChase S_BISHOP_WALK5 +S_BISHOP_WALK5 BISH B 2 A_Chase S_BISHOP_WALK6 +S_BISHOP_WALK6 BISH B 2 A_BishopChase S_BISHOP_DECIDE + +S_BISHOP_ATK1 BISH A 3 A_FaceTarget S_BISHOP_ATK2 +S_BISHOP_ATK2 BISH D* 3 A_FaceTarget S_BISHOP_ATK3 +S_BISHOP_ATK3 BISH E* 3 A_FaceTarget S_BISHOP_ATK4 +S_BISHOP_ATK4 BISH F* 3 A_BishopAttack S_BISHOP_ATK5 +S_BISHOP_ATK5 BISH F* 5 A_BishopAttack2 S_BISHOP_ATK5 + +S_BISHOP_PAIN1 BISH C 6 A_Pain S_BISHOP_PAIN2 +S_BISHOP_PAIN2 BISH C 6 A_BishopPainBlur S_BISHOP_PAIN3 +S_BISHOP_PAIN3 BISH C 6 A_BishopPainBlur S_BISHOP_PAIN4 +S_BISHOP_PAIN4 BISH C 6 A_BishopPainBlur S_BISHOP_PAIN5 +S_BISHOP_PAIN5 BISH C 0 NULL S_BISHOP_WALK1 + +S_BISHOP_DEATH1 BISH G 6 NULL S_BISHOP_DEATH2 +S_BISHOP_DEATH2 BISH H* 6 A_Scream S_BISHOP_DEATH3 +S_BISHOP_DEATH3 BISH I* 5 A_NoBlocking S_BISHOP_DEATH4 +S_BISHOP_DEATH4 BISH J* 5 A_Explode S_BISHOP_DEATH5 +S_BISHOP_DEATH5 BISH K* 5 NULL S_BISHOP_DEATH6 +S_BISHOP_DEATH6 BISH L* 4 NULL S_BISHOP_DEATH7 +S_BISHOP_DEATH7 BISH M* 4 NULL S_BISHOP_DEATH8 +S_BISHOP_DEATH8 BISH N 4 A_BishopPuff S_BISHOP_DEATH9 +S_BISHOP_DEATH9 BISH O 4 A_QueueCorpse S_BISHOP_DEATH10 +S_BISHOP_DEATH10 BISH P -1 NULL S_NULL + +S_BISHOP_ICE BISH X 5 A_FreezeDeath S_BISHOP_ICE2 +S_BISHOP_ICE2 BISH X 1 A_FreezeDeathChunks S_BISHOP_ICE2 + +S_BISHOP_PUFF1 BISH Q 5 NULL S_BISHOP_PUFF2 +S_BISHOP_PUFF2 BISH R 5 NULL S_BISHOP_PUFF3 +S_BISHOP_PUFF3 BISH S 5 NULL S_BISHOP_PUFF4 +S_BISHOP_PUFF4 BISH T 5 NULL S_BISHOP_PUFF5 +S_BISHOP_PUFF5 BISH U 6 NULL S_BISHOP_PUFF6 +S_BISHOP_PUFF6 BISH V 6 NULL S_BISHOP_PUFF7 +S_BISHOP_PUFF7 BISH W 5 NULL S_NULL + +S_BISHOPBLUR1 BISH A 16 NULL S_BISHOPBLUR2 +S_BISHOPBLUR2 BISH A 8 A_SetAltShadow S_NULL + +S_BISHOPPAINBLUR1 BISH C 8 NULL S_NULL + +S_BISHFX1_1 BPFX A* 1 A_BishopMissileWeave S_BISHFX1_2 +S_BISHFX1_2 BPFX B* 1 A_BishopMissileWeave S_BISHFX1_3 +S_BISHFX1_3 BPFX A* 1 A_BishopMissileWeave S_BISHFX1_4 +S_BISHFX1_4 BPFX B* 1 A_BishopMissileWeave S_BISHFX1_5 +S_BISHFX1_5 BPFX B* 0 A_BishopMissileSeek S_BISHFX1_1 + +S_BISHFXI1_1 BPFX C* 4 NULL S_BISHFXI1_2 +S_BISHFXI1_2 BPFX D* 4 NULL S_BISHFXI1_3 +S_BISHFXI1_3 BPFX E* 4 NULL S_BISHFXI1_4 +S_BISHFXI1_4 BPFX F* 4 NULL S_BISHFXI1_5 +S_BISHFXI1_5 BPFX G* 3 NULL S_BISHFXI1_6 +S_BISHFXI1_6 BPFX H* 3 NULL S_NULL + + +// +// Dragon +// + +$ MT_DRAGON +doomednum 254 +spawnstate S_DRAGON_LOOK1 +spawnhealth 640 +seestate S_DRAGON_INIT +seesound DragonSight +attacksound DragonAttack +painstate S_DRAGON_PAIN1 +painchance 128 +painsound DragonPain +missilestate S_DRAGON_ATK1 +deathstate S_DRAGON_DEATH1 +deathsound DragonDeath +speed 10 +height 65 +mass 0x7fffffff +activesound DragonActive +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL|MF_FLOAT|MF_NOGRAVITY|MF_NOBLOOD +flags2 MF2_PASSMOBJ|MF2_BOSS + +$ MT_DRAGON_FX +spawnstate S_DRAGON_FX1_1 +deathstate S_DRAGON_FX1_X1 +deathsound DragonFireballExplode +speed 24 +radius 12 +height 10 +damage 6 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_NOTELEPORT|MF2_FIREDAMAGE + +$ MT_DRAGON_FX2 +spawnstate S_DRAGON_FX2_1 +deathsound DragonFireballExplode +radius 8 +height 8 +flags MF_NOBLOCKMAP +flags2 MF2_NOTELEPORT|MF2_FIREDAMAGE|MF2_DONTDRAW + +S_DRAGON_LOOK1 DRAG D 10 A_Look S_DRAGON_LOOK1 + +S_DRAGON_INIT DRAG C 5 NULL S_DRAGON_INIT2 +S_DRAGON_INIT2 DRAG B 5 NULL S_DRAGON_INIT3 +S_DRAGON_INIT3 DRAG A 5 A_DragonInitFlight S_DRAGON_WALK1 +S_DRAGON_WALK1 DRAG B 3 A_DragonFlap S_DRAGON_WALK2 +S_DRAGON_WALK2 DRAG B 3 A_DragonFlight S_DRAGON_WALK3 +S_DRAGON_WALK3 DRAG C 3 A_DragonFlight S_DRAGON_WALK4 +S_DRAGON_WALK4 DRAG C 3 A_DragonFlight S_DRAGON_WALK5 +S_DRAGON_WALK5 DRAG D 3 A_DragonFlight S_DRAGON_WALK6 +S_DRAGON_WALK6 DRAG D 3 A_DragonFlight S_DRAGON_WALK7 +S_DRAGON_WALK7 DRAG C 3 A_DragonFlight S_DRAGON_WALK8 +S_DRAGON_WALK8 DRAG C 3 A_DragonFlight S_DRAGON_WALK9 +S_DRAGON_WALK9 DRAG B 3 A_DragonFlight S_DRAGON_WALK10 +S_DRAGON_WALK10 DRAG B 3 A_DragonFlight S_DRAGON_WALK11 +S_DRAGON_WALK11 DRAG A 3 A_DragonFlight S_DRAGON_WALK12 +S_DRAGON_WALK12 DRAG A 3 A_DragonFlight S_DRAGON_WALK1 + +S_DRAGON_ATK1 DRAG E 8 A_DragonAttack S_DRAGON_WALK1 + +S_DRAGON_PAIN1 DRAG F 10 A_DragonPain S_DRAGON_WALK1 + +S_DRAGON_DEATH1 DRAG G 5 A_Scream S_DRAGON_DEATH2 +S_DRAGON_DEATH2 DRAG H 4 A_NoBlocking S_DRAGON_DEATH3 +S_DRAGON_DEATH3 DRAG I 4 NULL S_DRAGON_DEATH4 +S_DRAGON_DEATH4 DRAG J 4 A_DragonCheckCrash S_DRAGON_DEATH4 + +S_DRAGON_CRASH1 DRAG K 5 NULL S_DRAGON_CRASH2 +S_DRAGON_CRASH2 DRAG L 5 NULL S_DRAGON_CRASH3 +S_DRAGON_CRASH3 DRAG M -1 NULL S_NULL + +S_DRAGON_FX1_1 DRFX A* 4 NULL S_DRAGON_FX1_2 +S_DRAGON_FX1_2 DRFX B* 4 NULL S_DRAGON_FX1_3 +S_DRAGON_FX1_3 DRFX C* 4 NULL S_DRAGON_FX1_4 +S_DRAGON_FX1_4 DRFX D* 4 NULL S_DRAGON_FX1_5 +S_DRAGON_FX1_5 DRFX E* 4 NULL S_DRAGON_FX1_6 +S_DRAGON_FX1_6 DRFX F* 4 NULL S_DRAGON_FX1_1 + +S_DRAGON_FX1_X1 DRFX G* 4 NULL S_DRAGON_FX1_X2 +S_DRAGON_FX1_X2 DRFX H* 4 NULL S_DRAGON_FX1_X3 +S_DRAGON_FX1_X3 DRFX I* 4 NULL S_DRAGON_FX1_X4 +S_DRAGON_FX1_X4 DRFX J* 4 A_DragonFX2 S_DRAGON_FX1_X5 +S_DRAGON_FX1_X5 DRFX K* 3 NULL S_DRAGON_FX1_X6 +S_DRAGON_FX1_X6 DRFX L* 3 NULL S_NULL + +S_DRAGON_FX2_1 CFCF Q* 1 NULL S_DRAGON_FX2_2 +S_DRAGON_FX2_2 CFCF Q* 4 A_UnHideThing S_DRAGON_FX2_3 +S_DRAGON_FX2_3 CFCF R* 3 A_Scream S_DRAGON_FX2_4 +S_DRAGON_FX2_4 CFCF S* 4 NULL S_DRAGON_FX2_5 +S_DRAGON_FX2_5 CFCF T* 3 A_Explode S_DRAGON_FX2_6 +S_DRAGON_FX2_6 CFCF U* 4 NULL S_DRAGON_FX2_7 +S_DRAGON_FX2_7 CFCF V* 3 NULL S_DRAGON_FX2_8 +S_DRAGON_FX2_8 CFCF W* 4 NULL S_DRAGON_FX2_9 +S_DRAGON_FX2_9 CFCF X* 3 NULL S_DRAGON_FX2_10 +S_DRAGON_FX2_10 CFCF Y* 4 NULL S_DRAGON_FX2_11 +S_DRAGON_FX2_11 CFCF Z* 3 NULL S_NULL + + +// +// armor +// + +$ MT_ARMOR_1 +doomednum 8005 +spawnstate S_ARMOR_1 +flags MF_SPECIAL|MF_NOGRAVITY + +$ MT_ARMOR_2 +doomednum 8006 +spawnstate S_ARMOR_2 +flags MF_SPECIAL|MF_NOGRAVITY + +$ MT_ARMOR_3 +doomednum 8007 +spawnstate S_ARMOR_3 +flags MF_SPECIAL|MF_NOGRAVITY + +$ MT_ARMOR_4 +doomednum 8008 +spawnstate S_ARMOR_4 +flags MF_SPECIAL|MF_NOGRAVITY + +S_ARMOR_1 ARM1 A -1 NULL S_NULL +S_ARMOR_2 ARM2 A -1 NULL S_NULL +S_ARMOR_3 ARM3 A -1 NULL S_NULL +S_ARMOR_4 ARM4 A -1 NULL S_NULL + + +// +// mana +// + +$ MT_MANA1 +doomednum 122 +spawnstate S_MANA1_1 +spawnhealth 10 +radius 8 +height 8 +flags MF_SPECIAL +flags2 MF2_FLOATBOB + +$ MT_MANA2 +doomednum 124 +spawnstate S_MANA2_1 +spawnhealth 10 +radius 8 +height 8 +flags MF_SPECIAL +flags2 MF2_FLOATBOB + +$ MT_MANA3 +doomednum 8004 +spawnstate S_MANA3_1 +spawnhealth 20 +radius 8 +height 8 +flags MF_SPECIAL +flags2 MF2_FLOATBOB + +S_MANA1_1 MAN1 A* 4 NULL S_MANA1_2 +S_MANA1_2 MAN1 B* 4 NULL S_MANA1_3 +S_MANA1_3 MAN1 C* 4 NULL S_MANA1_4 +S_MANA1_4 MAN1 D* 4 NULL S_MANA1_5 +S_MANA1_5 MAN1 E* 4 NULL S_MANA1_6 +S_MANA1_6 MAN1 F* 4 NULL S_MANA1_7 +S_MANA1_7 MAN1 G* 4 NULL S_MANA1_8 +S_MANA1_8 MAN1 H* 4 NULL S_MANA1_9 +S_MANA1_9 MAN1 I* 4 NULL S_MANA1_1 + +S_MANA2_1 MAN2 A* 4 NULL S_MANA2_2 +S_MANA2_2 MAN2 B* 4 NULL S_MANA2_3 +S_MANA2_3 MAN2 C* 4 NULL S_MANA2_4 +S_MANA2_4 MAN2 D* 4 NULL S_MANA2_5 +S_MANA2_5 MAN2 E* 4 NULL S_MANA2_6 +S_MANA2_6 MAN2 F* 4 NULL S_MANA2_7 +S_MANA2_7 MAN2 G* 4 NULL S_MANA2_8 +S_MANA2_8 MAN2 H* 4 NULL S_MANA2_9 +S_MANA2_9 MAN2 I* 4 NULL S_MANA2_10 +S_MANA2_10 MAN2 J* 4 NULL S_MANA2_11 +S_MANA2_11 MAN2 K* 4 NULL S_MANA2_12 +S_MANA2_12 MAN2 L* 4 NULL S_MANA2_13 +S_MANA2_13 MAN2 M* 4 NULL S_MANA2_14 +S_MANA2_14 MAN2 N* 4 NULL S_MANA2_15 +S_MANA2_15 MAN2 O* 4 NULL S_MANA2_16 +S_MANA2_16 MAN2 P* 4 NULL S_MANA2_1 + +S_MANA3_1 MAN3 A* 4 NULL S_MANA3_2 +S_MANA3_2 MAN3 B* 4 NULL S_MANA3_3 +S_MANA3_3 MAN3 C* 4 NULL S_MANA3_4 +S_MANA3_4 MAN3 D* 4 NULL S_MANA3_5 +S_MANA3_5 MAN3 E* 4 NULL S_MANA3_6 +S_MANA3_6 MAN3 F* 4 NULL S_MANA3_7 +S_MANA3_7 MAN3 G* 4 NULL S_MANA3_8 +S_MANA3_8 MAN3 H* 4 NULL S_MANA3_9 +S_MANA3_9 MAN3 I* 4 NULL S_MANA3_10 +S_MANA3_10 MAN3 J* 4 NULL S_MANA3_11 +S_MANA3_11 MAN3 K* 4 NULL S_MANA3_12 +S_MANA3_12 MAN3 L* 4 NULL S_MANA3_13 +S_MANA3_13 MAN3 M* 4 NULL S_MANA3_14 +S_MANA3_14 MAN3 N* 4 NULL S_MANA3_15 +S_MANA3_15 MAN3 O* 4 NULL S_MANA3_16 +S_MANA3_16 MAN3 P* 4 NULL S_MANA3_1 + + +// +// keys +// + +$ MT_KEY1 +doomednum 8030 +spawnstate S_KEY1 +radius 8 +height 20 +flags MF_SPECIAL + +$ MT_KEY2 +doomednum 8031 +spawnstate S_KEY2 +radius 8 +height 20 +flags MF_SPECIAL + +$ MT_KEY3 +doomednum 8032 +spawnstate S_KEY3 +radius 8 +height 20 +flags MF_SPECIAL + +$ MT_KEY4 +doomednum 8033 +spawnstate S_KEY4 +radius 8 +height 20 +flags MF_SPECIAL + +$ MT_KEY5 +doomednum 8034 +spawnstate S_KEY5 +radius 8 +height 20 +flags MF_SPECIAL + +$ MT_KEY6 +doomednum 8035 +spawnstate S_KEY6 +radius 8 +height 20 +flags MF_SPECIAL + +$ MT_KEY7 +doomednum 8036 +spawnstate S_KEY7 +radius 8 +height 20 +flags MF_SPECIAL + +$ MT_KEY8 +doomednum 8037 +spawnstate S_KEY8 +radius 8 +height 20 +flags MF_SPECIAL + +$ MT_KEY9 +doomednum 8038 +spawnstate S_KEY9 +radius 8 +height 20 +flags MF_SPECIAL + +$ MT_KEYA +doomednum 8039 +spawnstate S_KEYA +radius 8 +height 20 +flags MF_SPECIAL + +$ MT_KEYB +doomednum 8200 +spawnstate S_KEYB +radius 8 +height 20 +flags MF_SPECIAL + +S_KEY1 KEY1 A -1 NULL S_NULL +S_KEY2 KEY2 A -1 NULL S_NULL +S_KEY3 KEY3 A -1 NULL S_NULL +S_KEY4 KEY4 A -1 NULL S_NULL +S_KEY5 KEY5 A -1 NULL S_NULL +S_KEY6 KEY6 A -1 NULL S_NULL +S_KEY7 KEY7 A -1 NULL S_NULL +S_KEY8 KEY8 A -1 NULL S_NULL +S_KEY9 KEY9 A -1 NULL S_NULL +S_KEYA KEYA A -1 NULL S_NULL +S_KEYB KEYB A -1 NULL S_NULL + +// +// ambience +// + +$ MT_SOUNDWIND +doomednum 1410 +spawnstate S_SND_WIND1 +flags MF_NOBLOCKMAP|MF_NOSECTOR + +$ MT_SOUNDWATERFALL +doomednum 41 +spawnstate S_SND_WATERFALL +flags MF_NOBLOCKMAP|MF_NOSECTOR + +S_SND_WIND1 TLGL A 1 NULL S_SND_WIND2 +S_SND_WIND2 TLGL A 200 A_ESound S_SND_WIND2 + +S_SND_WATERFALL TLGL A 85 A_ESound S_SND_WATERFALL + + +// +// Ettin +// + +$ MT_ETTIN +doomednum 10030 +spawnstate S_ETTIN_LOOK1 +spawnhealth 175 +seestate S_ETTIN_CHASE1 +seesound EttinSight +attacksound EttinAttack +painstate S_ETTIN_PAIN1 +painchance 60 +painsound EttinPain +meleestate S_ETTIN_ATK1_1 +deathstate S_ETTIN_DEATH1_1 +xdeathstate S_ETTIN_DEATH2_1 +deathsound EttinDeath +speed 13 +radius 25 +height 68 +damage 3 +mass 175 +activesound EttinActive +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL +flags2 MF2_FLOORCLIP|MF2_PUSHWALL|MF2_MCROSS|MF2_TELESTOMP + +$ MT_ETTIN_MACE +spawnstate S_ETTIN_MACE1 +deathstate S_ETTIN_MACE5 +radius 5 +height 5 +flags MF_DROPOFF|MF_CORPSE +flags2 MF2_NOTELEPORT|MF2_FLOORCLIP + +S_ETTIN_LOOK1 ETTN A 10 A_Look S_ETTIN_LOOK2 +S_ETTIN_LOOK2 ETTN A 10 A_Look S_ETTIN_LOOK1 + +S_ETTIN_CHASE1 ETTN A 5 A_Chase S_ETTIN_CHASE2 +S_ETTIN_CHASE2 ETTN B 5 A_Chase S_ETTIN_CHASE3 +S_ETTIN_CHASE3 ETTN C 5 A_Chase S_ETTIN_CHASE4 +S_ETTIN_CHASE4 ETTN D 5 A_Chase S_ETTIN_CHASE1 + +S_ETTIN_PAIN1 ETTN H 7 A_Pain S_ETTIN_CHASE1 + +S_ETTIN_ATK1_1 ETTN E 6 A_FaceTarget S_ETTIN_ATK1_2 +S_ETTIN_ATK1_2 ETTN F 6 A_FaceTarget S_ETTIN_ATK1_3 +S_ETTIN_ATK1_3 ETTN G 8 A_EttinAttack S_ETTIN_CHASE1 + +S_ETTIN_DEATH1_1 ETTN I 4 NULL S_ETTIN_DEATH1_2 +S_ETTIN_DEATH1_2 ETTN J 4 NULL S_ETTIN_DEATH1_3 +S_ETTIN_DEATH1_3 ETTN K 4 A_Scream S_ETTIN_DEATH1_4 +S_ETTIN_DEATH1_4 ETTN L 4 A_NoBlocking S_ETTIN_DEATH1_5 +S_ETTIN_DEATH1_5 ETTN M 4 A_QueueCorpse S_ETTIN_DEATH1_6 +S_ETTIN_DEATH1_6 ETTN N 4 NULL S_ETTIN_DEATH1_7 +S_ETTIN_DEATH1_7 ETTN O 4 NULL S_ETTIN_DEATH1_8 +S_ETTIN_DEATH1_8 ETTN P 4 NULL S_ETTIN_DEATH1_9 +S_ETTIN_DEATH1_9 ETTN Q -1 NULL S_NULL + +S_ETTIN_DEATH2_1 ETTB A 4 NULL S_ETTIN_DEATH2_2 +S_ETTIN_DEATH2_2 ETTB B 4 A_NoBlocking S_ETTIN_DEATH2_3 +S_ETTIN_DEATH2_3 ETTB C 4 A_DropMace S_ETTIN_DEATH2_4 +S_ETTIN_DEATH2_4 ETTB D 4 A_Scream S_ETTIN_DEATH2_5 +S_ETTIN_DEATH2_5 ETTB E 4 A_QueueCorpse S_ETTIN_DEATH2_6 +S_ETTIN_DEATH2_6 ETTB F 4 NULL S_ETTIN_DEATH2_7 +S_ETTIN_DEATH2_7 ETTB G 4 NULL S_ETTIN_DEATH2_8 +S_ETTIN_DEATH2_8 ETTB H 4 NULL S_ETTIN_DEATH2_9 +S_ETTIN_DEATH2_9 ETTB I 4 NULL S_ETTIN_DEATH2_0 +S_ETTIN_DEATH2_0 ETTB J 4 NULL S_ETTIN_DEATH2_A +S_ETTIN_DEATH2_A ETTB K 4 NULL S_ETTIN_DEATH2_B +S_ETTIN_DEATH2_B ETTB L -1 NULL S_NULL + +S_ETTIN_ICE1 ETTN R 5 A_FreezeDeath S_ETTIN_ICE2 +S_ETTIN_ICE2 ETTN R 1 A_FreezeDeathChunks S_ETTIN_ICE2 + +S_ETTIN_MACE1 ETTB M 5 A_CheckFloor S_ETTIN_MACE2 +S_ETTIN_MACE2 ETTB N 5 A_CheckFloor S_ETTIN_MACE3 +S_ETTIN_MACE3 ETTB O 5 A_CheckFloor S_ETTIN_MACE4 +S_ETTIN_MACE4 ETTB P 5 A_CheckFloor S_ETTIN_MACE1 +S_ETTIN_MACE5 ETTB Q 5 NULL S_ETTIN_MACE6 +S_ETTIN_MACE6 ETTB R 5 A_QueueCorpse S_ETTIN_MACE7 +S_ETTIN_MACE7 ETTB S -1 NULL S_NULL + + +// +// Fire Demon +// + +$ MT_FIREDEMON +doomednum 10060 +spawnstate S_FIRED_SPAWN1 +spawnhealth 80 +seestate S_FIRED_LOOK4 +seesound FireDemonSpawn +painstate S_FIRED_PAIN1 +painchance 1 +painsound FireDemonPain +missilestate S_FIRED_ATTACK1 +crashstate S_FIRED_XDEATH1 +deathstate S_FIRED_DEATH1 +xdeathstate S_FIRED_XDEATH1 +deathsound FireDemonDeath +speed 13 +height 68 +damage 1 +mass 75 +activesound FireDemonActive +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL|MF_DROPOFF|MF_NOGRAVITY|MF_FLOAT +flags2 MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_PUSHWALL|MF2_INVULNERABLE|MF2_MCROSS|MF2_TELESTOMP + +$ MT_FIREDEMON_SPLOTCH1 +spawnstate S_FIRED_CORPSE1 +radius 3 +flags MF_DROPOFF|MF_CORPSE +flags2 MF2_NOTELEPORT|MF2_FLOORCLIP + +$ MT_FIREDEMON_SPLOTCH2 +spawnstate S_FIRED_CORPSE4 +radius 3 +flags MF_DROPOFF|MF_CORPSE +flags2 MF2_NOTELEPORT|MF2_FLOORCLIP + +$ MT_FIREDEMON_FX1 +spawnstate S_FIRED_RDROP1 +deathstate S_FIRED_RDEAD1_1 +xdeathstate S_FIRED_RDEAD1_2 +radius 3 +height 5 +mass 16 +flags MF_NOBLOCKMAP|MF_DROPOFF|MF_MISSILE +flags2 MF2_NOTELEPORT + +$ MT_FIREDEMON_FX2 +spawnstate S_FIRED_RDROP2 +deathstate S_FIRED_RDEAD2_1 +xdeathstate S_FIRED_RDEAD2_2 +radius 3 +height 5 +mass 16 +flags MF_NOBLOCKMAP|MF_DROPOFF|MF_MISSILE +flags2 MF2_NOTELEPORT + +$ MT_FIREDEMON_FX3 +spawnstate S_FIRED_RDROP3 +deathstate S_FIRED_RDEAD3_1 +xdeathstate S_FIRED_RDEAD3_2 +radius 3 +height 5 +mass 16 +flags MF_NOBLOCKMAP|MF_DROPOFF|MF_MISSILE +flags2 MF2_NOTELEPORT + +$ MT_FIREDEMON_FX4 +spawnstate S_FIRED_RDROP4 +deathstate S_FIRED_RDEAD4_1 +xdeathstate S_FIRED_RDEAD4_2 +radius 3 +height 5 +mass 16 +flags MF_NOBLOCKMAP|MF_DROPOFF|MF_MISSILE +flags2 MF2_NOTELEPORT + +$ MT_FIREDEMON_FX5 +spawnstate S_FIRED_RDROP5 +deathstate S_FIRED_RDEAD5_1 +xdeathstate S_FIRED_RDEAD5_2 +radius 3 +height 5 +mass 16 +flags MF_NOBLOCKMAP|MF_DROPOFF|MF_MISSILE +flags2 MF2_NOTELEPORT + +$ MT_FIREDEMON_FX6 +spawnstate S_FIRED_FX6_1 +deathstate S_FIRED_FX6_2 +deathsound FireDemonMissileHit +speed 10 +radius 10 +height 6 +damage 1 +mass 15 +flags MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE +flags2 MF2_NOTELEPORT|MF2_IMPACT|MF2_PCROSS|MF2_FLOORCLIP|MF2_FIREDAMAGE + +S_FIRED_SPAWN1 FDMN X* 5 NULL S_FIRED_LOOK1 +S_FIRED_LOOK1 FDMN E* 10 A_Look S_FIRED_LOOK2 +S_FIRED_LOOK2 FDMN F* 10 A_Look S_FIRED_LOOK3 +S_FIRED_LOOK3 FDMN G* 10 A_Look S_FIRED_LOOK1 +S_FIRED_LOOK4 FDMN E* 8 NULL S_FIRED_LOOK5 +S_FIRED_LOOK5 FDMN F* 6 NULL S_FIRED_LOOK6 +S_FIRED_LOOK6 FDMN G* 5 NULL S_FIRED_LOOK7 +S_FIRED_LOOK7 FDMN F* 8 NULL S_FIRED_LOOK8 +S_FIRED_LOOK8 FDMN E* 6 NULL S_FIRED_LOOK9 +S_FIRED_LOOK9 FDMN F* 7 A_FiredRocks S_FIRED_LOOK0 +S_FIRED_LOOK0 FDMN H* 5 NULL S_FIRED_LOOKA +S_FIRED_LOOKA FDMN I* 5 NULL S_FIRED_LOOKB +S_FIRED_LOOKB FDMN J* 5 A_UnSetInvulnerable S_FIRED_WALK1 + +S_FIRED_WALK1 FDMN A* 5 A_FiredChase S_FIRED_WALK2 +S_FIRED_WALK2 FDMN B* 5 A_FiredChase S_FIRED_WALK3 +S_FIRED_WALK3 FDMN C* 5 A_FiredChase S_FIRED_WALK1 + +S_FIRED_PAIN1 FDMN D* 6 A_Pain S_FIRED_WALK1 + +S_FIRED_ATTACK1 FDMN K* 3 A_FaceTarget S_FIRED_ATTACK2 +S_FIRED_ATTACK2 FDMN K* 5 A_FiredAttack S_FIRED_ATTACK3 +S_FIRED_ATTACK3 FDMN K* 5 A_FiredAttack S_FIRED_ATTACK4 +S_FIRED_ATTACK4 FDMN K* 5 A_FiredAttack S_FIRED_WALK1 + +S_FIRED_DEATH1 FDMN D* 4 A_FaceTarget S_FIRED_DEATH2 +S_FIRED_DEATH2 FDMN L* 4 A_Scream S_FIRED_DEATH3 +S_FIRED_DEATH3 FDMN L* 4 A_NoBlocking S_FIRED_DEATH4 +S_FIRED_DEATH4 FDMN L* 200 NULL S_NULL + +S_FIRED_XDEATH1 FDMN M 5 A_FaceTarget S_FIRED_XDEATH2 +S_FIRED_XDEATH2 FDMN N 5 A_NoBlocking S_FIRED_XDEATH3 +S_FIRED_XDEATH3 FDMN O 5 A_FiredSplotch S_NULL + +S_FIRED_ICE1 FDMN R 5 A_FreezeDeath S_FIRED_ICE2 +S_FIRED_ICE2 FDMN R 1 A_FreezeDeathChunks S_FIRED_ICE2 + +S_FIRED_CORPSE1 FDMN P 3 NULL S_FIRED_CORPSE2 +S_FIRED_CORPSE2 FDMN P 6 A_QueueCorpse S_FIRED_CORPSE3 +S_FIRED_CORPSE3 FDMN Y -1 NULL S_NULL + +S_FIRED_CORPSE4 FDMN Q 3 NULL S_FIRED_CORPSE5 +S_FIRED_CORPSE5 FDMN Q 6 A_QueueCorpse S_FIRED_CORPSE6 +S_FIRED_CORPSE6 FDMN Z -1 NULL S_NULL + +S_FIRED_RDROP1 FDMN S 4 NULL S_FIRED_RDROP1 +S_FIRED_RDEAD1_1 FDMN S 5 A_SmBounce S_FIRED_RDEAD1_2 +S_FIRED_RDEAD1_2 FDMN S 200 NULL S_NULL + +S_FIRED_RDROP2 FDMN T 4 NULL S_FIRED_RDROP2 +S_FIRED_RDEAD2_1 FDMN T 5 A_SmBounce S_FIRED_RDEAD2_2 +S_FIRED_RDEAD2_2 FDMN T 200 NULL S_NULL + +S_FIRED_RDROP3 FDMN U 4 NULL S_FIRED_RDROP3 +S_FIRED_RDEAD3_1 FDMN U 5 A_SmBounce S_FIRED_RDEAD3_2 +S_FIRED_RDEAD3_2 FDMN U 200 NULL S_NULL + +S_FIRED_RDROP4 FDMN V 4 NULL S_FIRED_RDROP4 +S_FIRED_RDEAD4_1 FDMN V 5 A_SmBounce S_FIRED_RDEAD4_2 +S_FIRED_RDEAD4_2 FDMN V 200 NULL S_NULL + +S_FIRED_RDROP5 FDMN W 4 NULL S_FIRED_RDROP5 +S_FIRED_RDEAD5_1 FDMN W 5 A_SmBounce S_FIRED_RDEAD5_2 +S_FIRED_RDEAD5_2 FDMN W 200 NULL S_NULL + +S_FIRED_FX6_1 FDMB A* 5 NULL S_FIRED_FX6_1 +S_FIRED_FX6_2 FDMB B* 5 NULL S_FIRED_FX6_3 +S_FIRED_FX6_3 FDMB C* 5 NULL S_FIRED_FX6_4 +S_FIRED_FX6_4 FDMB D* 5 NULL S_FIRED_FX6_5 +S_FIRED_FX6_5 FDMB E* 5 NULL S_NULL + + +// +// "Ice Guy" +// + +$ MT_ICEGUY +doomednum 8020 +spawnstate S_ICEGUY_LOOK +spawnhealth 120 +seestate S_ICEGUY_WALK1 +seesound IceGuySight +attacksound IceGuyAttack +painstate S_ICEGUY_PAIN1 +painchance 144 +meleestate 0 +missilestate S_ICEGUY_ATK1 +deathstate S_ICEGUY_DEATH +speed 14 +radius 22 +height 75 +mass 150 +activesound IceGuyActive +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL|MF_NOBLOOD +flags2 MF2_PASSMOBJ|MF2_PUSHWALL|MF2_ICEDAMAGE|MF2_MCROSS|MF2_TELESTOMP + +$ MT_ICEGUY_FX +spawnstate S_ICEGUY_FX1 +deathstate S_ICEGUY_FX_X1 +deathsound IceGuyMissileExplode +speed 14 +radius 8 +height 10 +damage 1 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_NOTELEPORT|MF2_ICEDAMAGE + +$ MT_ICEFX_PUFF +spawnstate S_ICEFX_PUFF1 +radius 1 +height 1 +flags MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF +flags2 MF2_NOTELEPORT +translucency 0.33 + +$ MT_ICEGUY_FX2 +spawnstate S_ICEGUY_FX2_1 +speed 10 +radius 4 +height 4 +damage 1 +flags MF_NOBLOCKMAP|MF_DROPOFF|MF_MISSILE +flags2 MF2_NOTELEPORT|MF2_LOGRAV|MF2_ICEDAMAGE + +$ MT_ICEGUY_BIT +spawnstate S_ICEGUY_BIT1 +radius 1 +height 1 +flags MF_NOBLOCKMAP|MF_DROPOFF +flags2 MF2_NOTELEPORT|MF2_LOGRAV + +$ MT_ICEGUY_WISP1 +spawnstate S_ICEGUY_WISP1_1 +flags MF_NOBLOCKMAP|MF_DROPOFF|MF_NOGRAVITY|MF_MISSILE +flags2 MF2_NOTELEPORT +translucency 0.66 + +$ MT_ICEGUY_WISP2 +spawnstate S_ICEGUY_WISP2_1 +flags MF_NOBLOCKMAP|MF_DROPOFF|MF_NOGRAVITY|MF_MISSILE +flags2 MF2_NOTELEPORT +translucency 0.66 + +S_ICEGUY_LOOK ICEY A 10 A_IceGuyLook S_ICEGUY_LOOK + +S_ICEGUY_DORMANT ICEY A -1 NULL S_ICEGUY_LOOK + +S_ICEGUY_WALK1 ICEY A 4 A_Chase S_ICEGUY_WALK2 +S_ICEGUY_WALK2 ICEY B 4 A_IceGuyChase S_ICEGUY_WALK3 +S_ICEGUY_WALK3 ICEY C 4 A_Chase S_ICEGUY_WALK4 +S_ICEGUY_WALK4 ICEY D 4 A_Chase S_ICEGUY_WALK1 + +S_ICEGUY_ATK1 ICEY E 3 A_FaceTarget S_ICEGUY_ATK2 +S_ICEGUY_ATK2 ICEY F 3 A_FaceTarget S_ICEGUY_ATK3 +S_ICEGUY_ATK3 ICEY G* 8 A_IceGuyAttack S_ICEGUY_ATK4 +S_ICEGUY_ATK4 ICEY F 4 A_FaceTarget S_ICEGUY_WALK1 + +S_ICEGUY_PAIN1 ICEY A 1 A_Pain S_ICEGUY_WALK1 + +S_ICEGUY_DEATH ICEY A 1 A_IceGuyDie S_NULL + +S_ICEGUY_FX1 ICPR A* 3 A_IceGuyMissilePuff S_ICEGUY_FX2 +S_ICEGUY_FX2 ICPR B* 3 A_IceGuyMissilePuff S_ICEGUY_FX3 +S_ICEGUY_FX3 ICPR C* 3 A_IceGuyMissilePuff S_ICEGUY_FX1 + +S_ICEGUY_FX_X1 ICPR D* 4 NULL S_ICEGUY_FX_X2 +S_ICEGUY_FX_X2 ICPR E* 4 A_IceGuyMissileExplode S_ICEGUY_FX_X3 +S_ICEGUY_FX_X3 ICPR F* 4 NULL S_ICEGUY_FX_X4 +S_ICEGUY_FX_X4 ICPR G* 4 NULL S_ICEGUY_FX_X5 +S_ICEGUY_FX_X5 ICPR H* 3 NULL S_NULL + +S_ICEFX_PUFF1 ICPR I 3 NULL S_ICEFX_PUFF2 +S_ICEFX_PUFF2 ICPR J 3 NULL S_ICEFX_PUFF3 +S_ICEFX_PUFF3 ICPR K 3 NULL S_ICEFX_PUFF4 +S_ICEFX_PUFF4 ICPR L 2 NULL S_ICEFX_PUFF5 +S_ICEFX_PUFF5 ICPR M 2 NULL S_NULL + +S_ICEGUY_FX2_1 ICPR N* 3 NULL S_ICEGUY_FX2_2 +S_ICEGUY_FX2_2 ICPR O* 3 NULL S_ICEGUY_FX2_3 +S_ICEGUY_FX2_3 ICPR P* 3 NULL S_ICEGUY_FX2_1 + +S_ICEGUY_BIT1 ICPR Q* 50 NULL S_NULL +S_ICEGUY_BIT2 ICPR R* 50 NULL S_NULL + +S_ICEGUY_WISP1_1 ICWS A 2 NULL S_ICEGUY_WISP1_2 +S_ICEGUY_WISP1_2 ICWS B 2 NULL S_ICEGUY_WISP1_3 +S_ICEGUY_WISP1_3 ICWS C 2 NULL S_ICEGUY_WISP1_4 +S_ICEGUY_WISP1_4 ICWS D 2 NULL S_ICEGUY_WISP1_5 +S_ICEGUY_WISP1_5 ICWS E 2 NULL S_ICEGUY_WISP1_6 +S_ICEGUY_WISP1_6 ICWS F 2 NULL S_ICEGUY_WISP1_7 +S_ICEGUY_WISP1_7 ICWS G 2 NULL S_ICEGUY_WISP1_8 +S_ICEGUY_WISP1_8 ICWS H 2 NULL S_ICEGUY_WISP1_9 +S_ICEGUY_WISP1_9 ICWS I 2 NULL S_NULL + +S_ICEGUY_WISP2_1 ICWS J 2 NULL S_ICEGUY_WISP2_2 +S_ICEGUY_WISP2_2 ICWS K 2 NULL S_ICEGUY_WISP2_3 +S_ICEGUY_WISP2_3 ICWS L 2 NULL S_ICEGUY_WISP2_4 +S_ICEGUY_WISP2_4 ICWS M 2 NULL S_ICEGUY_WISP2_5 +S_ICEGUY_WISP2_5 ICWS N 2 NULL S_ICEGUY_WISP2_6 +S_ICEGUY_WISP2_6 ICWS O 2 NULL S_ICEGUY_WISP2_7 +S_ICEGUY_WISP2_7 ICWS P 2 NULL S_ICEGUY_WISP2_8 +S_ICEGUY_WISP2_8 ICWS Q 2 NULL S_ICEGUY_WISP2_9 +S_ICEGUY_WISP2_9 ICWS R 2 NULL S_NULL + + +// +// Fighter Boss +// + +$ MT_FIGHTER_BOSS +doomednum 10100 +spawnstate S_FIGHTER +spawnhealth 800 +seestate S_FIGHTER_RUN1 +painstate S_FIGHTER_PAIN +painchance 50 +painsound PlayerFighterPain +meleestate S_FIGHTER_ATK1 +missilestate S_FIGHTER_ATK1 +deathstate S_FIGHTER_DIE1 +xdeathstate S_FIGHTER_XDIE1 +deathsound PlayerFighterCrazyDeath +speed 25 +radius 16 +height 64 +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL +flags2 MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_TELESTOMP|MF2_PUSHWALL|MF2_MCROSS + +S_FIGHTER PLAY A 2 NULL S_FIGHTER2 +S_FIGHTER2 PLAY A 3 A_ClassBossHealth S_FIGHTERLOOK + +S_FIGHTERLOOK PLAY A 5 A_Look S_FIGHTERLOOK + +S_FIGHTER_RUN1 PLAY A 4 A_FastChase S_FIGHTER_RUN2 +S_FIGHTER_RUN2 PLAY B 4 A_FastChase S_FIGHTER_RUN3 +S_FIGHTER_RUN3 PLAY C 4 A_FastChase S_FIGHTER_RUN4 +S_FIGHTER_RUN4 PLAY D 4 A_FastChase S_FIGHTER_RUN1 + +S_FIGHTER_ATK1 PLAY E 8 A_FaceTarget S_FIGHTER_ATK2 +S_FIGHTER_ATK2 PLAY F 8 A_FighterAttack S_FIGHTER_RUN1 + +S_FIGHTER_PAIN PLAY G 4 NULL S_FIGHTER_PAIN2 +S_FIGHTER_PAIN2 PLAY G 4 A_Pain S_FIGHTER_RUN1 + +S_FIGHTER_DIE1 PLAY H 6 NULL S_FIGHTER_DIE2 +S_FIGHTER_DIE2 PLAY I 6 A_Scream S_FIGHTER_DIE3 +S_FIGHTER_DIE3 PLAY J 6 NULL S_FIGHTER_DIE4 +S_FIGHTER_DIE4 PLAY K 6 NULL S_FIGHTER_DIE5 +S_FIGHTER_DIE5 PLAY L 6 A_NoBlocking S_FIGHTER_DIE6 +S_FIGHTER_DIE6 PLAY M 6 NULL S_FIGHTER_DIE7 +S_FIGHTER_DIE7 PLAY N -1 NULL S_NULL + +S_FIGHTER_XDIE1 PLAY O 5 A_Scream S_FIGHTER_XDIE2 +S_FIGHTER_XDIE2 PLAY P 5 A_SkullPop S_FIGHTER_XDIE3 +S_FIGHTER_XDIE3 PLAY R 5 A_NoBlocking S_FIGHTER_XDIE4 +S_FIGHTER_XDIE4 PLAY S 5 NULL S_FIGHTER_XDIE5 +S_FIGHTER_XDIE5 PLAY T 5 NULL S_FIGHTER_XDIE6 +S_FIGHTER_XDIE6 PLAY U 5 NULL S_FIGHTER_XDIE7 +S_FIGHTER_XDIE7 PLAY V 5 NULL S_FIGHTER_XDIE8 +S_FIGHTER_XDIE8 PLAY W -1 NULL S_NULL + +S_FIGHTER_ICE PLAY X 5 A_FreezeDeath S_FIGHTER_ICE2 +S_FIGHTER_ICE2 PLAY X 1 A_FreezeDeathChunks S_FIGHTER_ICE2 + + +// +// Cleric Boss +// + +$ MT_CLERIC_BOSS +doomednum 10101 +spawnstate S_CLERIC +spawnhealth 800 +seestate S_CLERIC_RUN1 +painstate S_CLERIC_PAIN +painchance 50 +painsound PlayerClericPain +meleestate S_CLERIC_ATK1 +missilestate S_CLERIC_ATK1 +deathstate S_CLERIC_DIE1 +xdeathstate S_CLERIC_XDIE1 +deathsound PlayerClericCrazyDeath +speed 25 +radius 16 +height 64 +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL +flags2 MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_TELESTOMP|MF2_PUSHWALL|MF2_MCROSS + +S_CLERIC CLER A 2 NULL S_CLERIC2 +S_CLERIC2 CLER A 3 A_ClassBossHealth S_CLERICLOOK +S_CLERICLOOK CLER A 5 A_Look S_CLERICLOOK + +S_CLERIC_RUN1 CLER A 4 A_FastChase S_CLERIC_RUN2 +S_CLERIC_RUN2 CLER B 4 A_FastChase S_CLERIC_RUN3 +S_CLERIC_RUN3 CLER C 4 A_FastChase S_CLERIC_RUN4 +S_CLERIC_RUN4 CLER D 4 A_FastChase S_CLERIC_RUN1 + +S_CLERIC_ATK1 CLER E 8 A_FaceTarget S_CLERIC_ATK2 +S_CLERIC_ATK2 CLER F 8 A_FaceTarget S_CLERIC_ATK3 +S_CLERIC_ATK3 CLER G 10 A_ClericAttack S_CLERIC_RUN1 + +S_CLERIC_PAIN CLER H 4 NULL S_CLERIC_PAIN2 +S_CLERIC_PAIN2 CLER H 4 A_Pain S_CLERIC_RUN1 + +S_CLERIC_DIE1 CLER I 6 NULL S_CLERIC_DIE2 +S_CLERIC_DIE2 CLER K 6 A_Scream S_CLERIC_DIE3 +S_CLERIC_DIE3 CLER L 6 NULL S_CLERIC_DIE4 +S_CLERIC_DIE4 CLER L 6 NULL S_CLERIC_DIE5 +S_CLERIC_DIE5 CLER M 6 A_NoBlocking S_CLERIC_DIE6 +S_CLERIC_DIE6 CLER N 6 NULL S_CLERIC_DIE7 +S_CLERIC_DIE7 CLER O 6 NULL S_CLERIC_DIE8 +S_CLERIC_DIE8 CLER P 6 NULL S_CLERIC_DIE9 +S_CLERIC_DIE9 CLER Q -1 NULL S_NULL + +S_CLERIC_XDIE1 CLER R 5 A_Scream S_CLERIC_XDIE2 +S_CLERIC_XDIE2 CLER S 5 NULL S_CLERIC_XDIE3 +S_CLERIC_XDIE3 CLER T 5 A_NoBlocking S_CLERIC_XDIE4 +S_CLERIC_XDIE4 CLER U 5 NULL S_CLERIC_XDIE5 +S_CLERIC_XDIE5 CLER V 5 NULL S_CLERIC_XDIE6 +S_CLERIC_XDIE6 CLER W 5 NULL S_CLERIC_XDIE7 +S_CLERIC_XDIE7 CLER X 5 NULL S_CLERIC_XDIE8 +S_CLERIC_XDIE8 CLER Y 5 NULL S_CLERIC_XDIE9 +S_CLERIC_XDIE9 CLER Z 5 NULL S_CLERIC_XDIE10 +S_CLERIC_XDIE10 CLER [ -1 NULL S_NULL + +S_CLERIC_ICE CLER \ 5 A_FreezeDeath S_CLERIC_ICE2 +S_CLERIC_ICE2 CLER \ 1 A_FreezeDeathChunks S_CLERIC_ICE2 + + +// +// Mage Boss +// + +$ MT_MAGE_BOSS +doomednum 10102 +spawnstate S_MAGE +spawnhealth 800 +seestate S_MAGE_RUN1 +painstate S_MAGE_PAIN +painchance 50 +painsound PlayerMagePain +meleestate S_MAGE_ATK1 +missilestate S_MAGE_ATK1 +deathstate S_MAGE_DIE1 +xdeathstate S_MAGE_XDIE1 +deathsound PlayerMageCrazyDeath +speed 25 +radius 16 +height 64 +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL +flags2 MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_TELESTOMP|MF2_PUSHWALL|MF2_MCROSS + +S_MAGE MAGE A 2 NULL S_MAGE2 +S_MAGE2 MAGE A 3 A_ClassBossHealth S_MAGELOOK +S_MAGELOOK MAGE A 5 A_Look S_MAGELOOK + +S_MAGE_RUN1 MAGE A 4 A_FastChase S_MAGE_RUN2 +S_MAGE_RUN2 MAGE B 4 A_FastChase S_MAGE_RUN3 +S_MAGE_RUN3 MAGE C 4 A_FastChase S_MAGE_RUN4 +S_MAGE_RUN4 MAGE D 4 A_FastChase S_MAGE_RUN1 + +S_MAGE_ATK1 MAGE E 8 A_FaceTarget S_MAGE_ATK2 +S_MAGE_ATK2 MAGE F* 8 A_MageAttack S_MAGE_RUN1 + +S_MAGE_PAIN MAGE G 4 NULL S_MAGE_PAIN2 +S_MAGE_PAIN2 MAGE G 4 A_Pain S_MAGE_RUN1 + +S_MAGE_DIE1 MAGE H 6 NULL S_MAGE_DIE2 +S_MAGE_DIE2 MAGE I 6 A_Scream S_MAGE_DIE3 +S_MAGE_DIE3 MAGE J 6 NULL S_MAGE_DIE4 +S_MAGE_DIE4 MAGE K 6 NULL S_MAGE_DIE5 +S_MAGE_DIE5 MAGE L 6 A_NoBlocking S_MAGE_DIE6 +S_MAGE_DIE6 MAGE M 6 NULL S_MAGE_DIE7 +S_MAGE_DIE7 MAGE N -1 NULL S_NULL + +S_MAGE_XDIE1 MAGE O 5 A_Scream S_MAGE_XDIE2 +S_MAGE_XDIE2 MAGE P 5 NULL S_MAGE_XDIE3 +S_MAGE_XDIE3 MAGE R 5 A_NoBlocking S_MAGE_XDIE4 +S_MAGE_XDIE4 MAGE S 5 NULL S_MAGE_XDIE5 +S_MAGE_XDIE5 MAGE T 5 NULL S_MAGE_XDIE6 +S_MAGE_XDIE6 MAGE U 5 NULL S_MAGE_XDIE7 +S_MAGE_XDIE7 MAGE V 5 NULL S_MAGE_XDIE8 +S_MAGE_XDIE8 MAGE W 5 NULL S_MAGE_XDIE9 +S_MAGE_XDIE9 MAGE X -1 NULL S_NULL + +S_MAGE_ICE MAGE Y 5 A_FreezeDeath S_MAGE_ICE2 +S_MAGE_ICE2 MAGE Y 1 A_FreezeDeathChunks S_MAGE_ICE2 + + +// +// Sorcerer Boss (Heresiarch) +// + +$ MT_SORCBOSS +doomednum 10080 +spawnstate S_SORC_SPAWN1 +spawnhealth 5000 +seestate S_SORC_WALK1 +seesound SorcererSight +painstate S_SORC_PAIN1 +painchance 10 +painsound SorcererPain +missilestate S_SORC_ATK2_1 +deathstate S_SORC_DIE1 +deathsound SorcererDeathScream +speed 16 +radius 40 +height 110 +damage 9 +mass 500 +activesound SorcererActive +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL|MF_NOBLOOD +flags2 MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_PUSHWALL|MF2_BOSS|MF2_MCROSS + +$ MT_SORCBALL1 +spawnstate S_SORCBALL1_1 +seesound SorcererBallBounce +painstate S_SORCBALL1_D1 +deathstate S_SORCBALL1_D5 +speed 10 +radius 5 +height 5 +flags MF_NOBLOCKMAP|MF_NOGRAVITY|MF_MISSILE +flags2 MF2_NOTELEPORT|MF2_FLOORBOUNCE + +$ MT_SORCBALL2 +spawnstate S_SORCBALL2_1 +seesound SorcererBallBounce +painstate S_SORCBALL2_D1 +deathstate S_SORCBALL2_D5 +speed 10 +radius 5 +height 5 +flags MF_NOBLOCKMAP|MF_NOGRAVITY|MF_MISSILE +flags2 MF2_NOTELEPORT|MF2_FLOORBOUNCE + +$ MT_SORCBALL3 +spawnstate S_SORCBALL3_1 +seesound SorcererBallBounce +painstate S_SORCBALL3_D1 +deathstate S_SORCBALL3_D5 +speed 10 +radius 5 +height 5 +flags MF_NOBLOCKMAP|MF_NOGRAVITY|MF_MISSILE +flags2 MF2_NOTELEPORT|MF2_FLOORBOUNCE + +$ MT_SORCFX1 +spawnstate S_SORCFX1_1 +seesound SorcererBallBounce +deathstate S_SORCFX1_D1 +xdeathstate S_SORCFX1_D1 +speed 7 +radius 5 +height 5 +flags MF_NOBLOCKMAP|MF_MISSILE +flags2 MF2_NOTELEPORT|MF2_FLOORBOUNCE + +$ MT_SORCFX2 +spawnstate S_SORCFX2_SPLIT1 +deathstate S_SORCFX2T1 +speed 15 +radius 5 +height 5 +flags MF_NOBLOCKMAP|MF_NOGRAVITY +flags2 MF2_NOTELEPORT + +$ MT_SORCFX2_T1 +spawnstate S_SORCFX2T1 +flags MF_NOBLOCKMAP|MF_NOGRAVITY +flags2 MF2_NOTELEPORT +translucency 0.66 + +$ MT_SORCFX3 +spawnstate S_SORCFX3_1 +seesound SorcererBishopSpawn +deathstate S_BISHMORPH1 +speed 15 +radius 22 +height 65 +flags MF_NOBLOCKMAP|MF_MISSILE +flags2 MF2_NOTELEPORT + +$ MT_SORCFX3_EXPLOSION +spawnstate S_SORCFX3_EXP1 +flags MF_NOBLOCKMAP|MF_NOGRAVITY +flags2 MF2_NOTELEPORT +translucency 0.66 + +$ MT_SORCFX4 +spawnstate S_SORCFX4_1 +deathstate S_SORCFX4_D1 +deathsound SorcererBallExplode +speed 12 +radius 10 +height 10 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_NOGRAVITY +flags2 MF2_NOTELEPORT + +$ MT_SORCSPARK1 +spawnstate S_SORCSPARK1 +radius 5 +height 5 +flags MF_NOBLOCKMAP|MF_DROPOFF +flags2 MF2_NOTELEPORT|MF2_LOGRAV + +S_SORC_SPAWN1 SORC A 3 NULL S_SORC_SPAWN2 +S_SORC_SPAWN2 SORC A 2 A_SorcSpinBalls S_SORC_LOOK1 +S_SORC_LOOK1 SORC A 10 A_Look S_SORC_LOOK1 + +S_SORC_WALK1 SORC A 5 A_Chase S_SORC_WALK2 +S_SORC_WALK2 SORC B 5 A_Chase S_SORC_WALK3 +S_SORC_WALK3 SORC C 5 A_Chase S_SORC_WALK4 +S_SORC_WALK4 SORC D 5 A_Chase S_SORC_WALK1 + +S_SORC_PAIN1 SORC G 8 NULL S_SORC_PAIN2 +S_SORC_PAIN2 SORC G 8 A_Pain S_SORC_WALK1 + +S_SORC_ATK2_1 SORC F* 6 A_FaceTarget S_SORC_ATK2_2 +S_SORC_ATK2_2 SORC F* 6 A_SpeedBalls S_SORC_ATK2_3 +S_SORC_ATK2_3 SORC F* 6 A_FaceTarget S_SORC_ATK2_3 + +S_SORC_ATTACK1 SORC E* 6 NULL S_SORC_ATTACK2 +S_SORC_ATTACK2 SORC E* 6 A_SpawnFizzle S_SORC_ATTACK3 +S_SORC_ATTACK3 SORC E* 5 A_FaceTarget S_SORC_ATTACK2 +S_SORC_ATTACK4 SORC E* 2 NULL S_SORC_ATTACK5 +S_SORC_ATTACK5 SORC E* 2 A_SorcBossAttack S_SORC_WALK1 + +S_SORC_DIE1 SORC H* 5 NULL S_SORC_DIE2 +S_SORC_DIE2 SORC I* 5 A_FaceTarget S_SORC_DIE3 +S_SORC_DIE3 SORC J* 5 A_Scream S_SORC_DIE4 +S_SORC_DIE4 SORC K* 5 NULL S_SORC_DIE5 +S_SORC_DIE5 SORC L* 5 NULL S_SORC_DIE6 +S_SORC_DIE6 SORC M* 5 NULL S_SORC_DIE7 +S_SORC_DIE7 SORC N* 5 NULL S_SORC_DIE8 +S_SORC_DIE8 SORC O* 5 NULL S_SORC_DIE9 +S_SORC_DIE9 SORC P* 5 NULL S_SORC_DIE0 +S_SORC_DIE0 SORC Q* 5 NULL S_SORC_DIEA +S_SORC_DIEA SORC R* 5 NULL S_SORC_DIEB +S_SORC_DIEB SORC S* 5 NULL S_SORC_DIEC +S_SORC_DIEC SORC T* 5 NULL S_SORC_DIED +S_SORC_DIED SORC U* 5 A_NoBlocking S_SORC_DIEE +S_SORC_DIEE SORC V* 5 NULL S_SORC_DIEF +S_SORC_DIEF SORC W* 5 NULL S_SORC_DIEG +S_SORC_DIEG SORC X* 5 NULL S_SORC_DIEH +S_SORC_DIEH SORC Y* 5 NULL S_SORC_DIEI +S_SORC_DIEI SORC Z* -1 NULL S_NULL + +S_SORCBALL1_1 SBMP A 2 A_SorcBallOrbit S_SORCBALL1_2 +S_SORCBALL1_2 SBMP B 2 A_SorcBallOrbit S_SORCBALL1_3 +S_SORCBALL1_3 SBMP C 2 A_SorcBallOrbit S_SORCBALL1_4 +S_SORCBALL1_4 SBMP D 2 A_SorcBallOrbit S_SORCBALL1_5 +S_SORCBALL1_5 SBMP E 2 A_SorcBallOrbit S_SORCBALL1_6 +S_SORCBALL1_6 SBMP F 2 A_SorcBallOrbit S_SORCBALL1_7 +S_SORCBALL1_7 SBMP G 2 A_SorcBallOrbit S_SORCBALL1_8 +S_SORCBALL1_8 SBMP H 2 A_SorcBallOrbit S_SORCBALL1_9 +S_SORCBALL1_9 SBMP I 2 A_SorcBallOrbit S_SORCBALL1_0 +S_SORCBALL1_0 SBMP J 2 A_SorcBallOrbit S_SORCBALL1_A +S_SORCBALL1_A SBMP K 2 A_SorcBallOrbit S_SORCBALL1_B +S_SORCBALL1_B SBMP L 2 A_SorcBallOrbit S_SORCBALL1_C +S_SORCBALL1_C SBMP M 2 A_SorcBallOrbit S_SORCBALL1_D +S_SORCBALL1_D SBMP N 2 A_SorcBallOrbit S_SORCBALL1_E +S_SORCBALL1_E SBMP O 2 A_SorcBallOrbit S_SORCBALL1_F +S_SORCBALL1_F SBMP P 2 A_SorcBallOrbit S_SORCBALL1_1 + +S_SORCBALL1_D1 SBMP A 5 A_SorcBallPop S_SORCBALL1_D2 +S_SORCBALL1_D2 SBMP B 2 A_BounceCheck S_SORCBALL1_D2 +S_SORCBALL1_D5 SBS4 D 5 A_Explode S_SORCBALL1_D6 +S_SORCBALL1_D6 SBS4 E 5 NULL S_SORCBALL1_D7 +S_SORCBALL1_D7 SBS4 F 6 NULL S_SORCBALL1_D8 +S_SORCBALL1_D8 SBS4 G 6 NULL S_SORCBALL1_D9 +S_SORCBALL1_D9 SBS4 H 6 NULL S_NULL + +S_SORCBALL2_1 SBMB A 2 A_SorcBallOrbit S_SORCBALL2_2 +S_SORCBALL2_2 SBMB B 2 A_SorcBallOrbit S_SORCBALL2_3 +S_SORCBALL2_3 SBMB C 2 A_SorcBallOrbit S_SORCBALL2_4 +S_SORCBALL2_4 SBMB D 2 A_SorcBallOrbit S_SORCBALL2_5 +S_SORCBALL2_5 SBMB E 2 A_SorcBallOrbit S_SORCBALL2_6 +S_SORCBALL2_6 SBMB F 2 A_SorcBallOrbit S_SORCBALL2_7 +S_SORCBALL2_7 SBMB G 2 A_SorcBallOrbit S_SORCBALL2_8 +S_SORCBALL2_8 SBMB H 2 A_SorcBallOrbit S_SORCBALL2_9 +S_SORCBALL2_9 SBMB I 2 A_SorcBallOrbit S_SORCBALL2_0 +S_SORCBALL2_0 SBMB J 2 A_SorcBallOrbit S_SORCBALL2_A +S_SORCBALL2_A SBMB K 2 A_SorcBallOrbit S_SORCBALL2_B +S_SORCBALL2_B SBMB L 2 A_SorcBallOrbit S_SORCBALL2_C +S_SORCBALL2_C SBMB M 2 A_SorcBallOrbit S_SORCBALL2_D +S_SORCBALL2_D SBMB N 2 A_SorcBallOrbit S_SORCBALL2_E +S_SORCBALL2_E SBMB O 2 A_SorcBallOrbit S_SORCBALL2_F +S_SORCBALL2_F SBMB P 2 A_SorcBallOrbit S_SORCBALL2_1 +S_SORCBALL2_D1 SBMB A 5 A_SorcBallPop S_SORCBALL2_D2 +S_SORCBALL2_D2 SBMB B 2 A_BounceCheck S_SORCBALL2_D2 +S_SORCBALL2_D5 SBS3 D 5 A_Explode S_SORCBALL2_D6 +S_SORCBALL2_D6 SBS3 E 5 NULL S_SORCBALL2_D7 +S_SORCBALL2_D7 SBS3 F 6 NULL S_SORCBALL2_D8 +S_SORCBALL2_D8 SBS3 G 6 NULL S_SORCBALL2_D9 +S_SORCBALL2_D9 SBS3 H 6 NULL S_NULL + +S_SORCBALL3_1 SBMG A 2 A_SorcBallOrbit S_SORCBALL3_2 +S_SORCBALL3_2 SBMG B 2 A_SorcBallOrbit S_SORCBALL3_3 +S_SORCBALL3_3 SBMG C 2 A_SorcBallOrbit S_SORCBALL3_4 +S_SORCBALL3_4 SBMG D 2 A_SorcBallOrbit S_SORCBALL3_5 +S_SORCBALL3_5 SBMG E 2 A_SorcBallOrbit S_SORCBALL3_6 +S_SORCBALL3_6 SBMG F 2 A_SorcBallOrbit S_SORCBALL3_7 +S_SORCBALL3_7 SBMG G 2 A_SorcBallOrbit S_SORCBALL3_8 +S_SORCBALL3_8 SBMG H 2 A_SorcBallOrbit S_SORCBALL3_9 +S_SORCBALL3_9 SBMG I 2 A_SorcBallOrbit S_SORCBALL3_0 +S_SORCBALL3_0 SBMG J 2 A_SorcBallOrbit S_SORCBALL3_A +S_SORCBALL3_A SBMG K 2 A_SorcBallOrbit S_SORCBALL3_B +S_SORCBALL3_B SBMG L 2 A_SorcBallOrbit S_SORCBALL3_C +S_SORCBALL3_C SBMG M 2 A_SorcBallOrbit S_SORCBALL3_D +S_SORCBALL3_D SBMG N 2 A_SorcBallOrbit S_SORCBALL3_E +S_SORCBALL3_E SBMG O 2 A_SorcBallOrbit S_SORCBALL3_F +S_SORCBALL3_F SBMG P 2 A_SorcBallOrbit S_SORCBALL3_1 +S_SORCBALL3_D1 SBMG A 5 A_SorcBallPop S_SORCBALL3_D2 +S_SORCBALL3_D2 SBMG B 2 A_BounceCheck S_SORCBALL3_D2 +S_SORCBALL3_D5 SBS3 D 5 A_Explode S_SORCBALL3_D6 +S_SORCBALL3_D6 SBS3 E 5 NULL S_SORCBALL3_D7 +S_SORCBALL3_D7 SBS3 F 6 NULL S_SORCBALL3_D8 +S_SORCBALL3_D8 SBS3 G 6 NULL S_SORCBALL3_D9 +S_SORCBALL3_D9 SBS3 H 6 NULL S_NULL + +S_SORCFX1_1 SBS1 A* 2 NULL S_SORCFX1_2 +S_SORCFX1_2 SBS1 B* 3 A_SorcFX1Seek S_SORCFX1_3 +S_SORCFX1_3 SBS1 C* 3 A_SorcFX1Seek S_SORCFX1_4 +S_SORCFX1_4 SBS1 D* 3 A_SorcFX1Seek S_SORCFX1_1 +S_SORCFX1_D1 FHFX S* 2 A_Explode S_SORCFX1_D2 +S_SORCFX1_D2 FHFX S* 6 NULL S_SORCFX1_D3 +S_SORCFX1_D3 FHFX S* 6 NULL S_NULL + +S_SORCFX2_SPLIT1 SBS2 A* 3 A_SorcFX2Split S_SORCFX2_SPLIT1 + +S_SORCFX2_ORBIT1 SBS2 A* 2 A_SorcFX2Orbit S_SORCFX2_ORBIT2 +S_SORCFX2_ORBIT2 SBS2 B* 2 A_SorcFX2Orbit S_SORCFX2_ORBIT3 +S_SORCFX2_ORBIT3 SBS2 C* 2 A_SorcFX2Orbit S_SORCFX2_ORBIT4 +S_SORCFX2_ORBIT4 SBS2 D* 2 A_SorcFX2Orbit S_SORCFX2_ORBIT5 +S_SORCFX2_ORBIT5 SBS2 E* 2 A_SorcFX2Orbit S_SORCFX2_ORBIT6 +S_SORCFX2_ORBIT6 SBS2 F* 2 A_SorcFX2Orbit S_SORCFX2_ORBIT7 +S_SORCFX2_ORBIT7 SBS2 G* 2 A_SorcFX2Orbit S_SORCFX2_ORBIT8 +S_SORCFX2_ORBIT8 SBS2 H* 2 A_SorcFX2Orbit S_SORCFX2_ORBIT9 +S_SORCFX2_ORBIT9 SBS2 I* 2 A_SorcFX2Orbit S_SORCFX2_ORBIT0 +S_SORCFX2_ORBIT0 SBS2 J* 2 A_SorcFX2Orbit S_SORCFX2_ORBITA +S_SORCFX2_ORBITA SBS2 K* 2 A_SorcFX2Orbit S_SORCFX2_ORBITB +S_SORCFX2_ORBITB SBS2 L* 2 A_SorcFX2Orbit S_SORCFX2_ORBITC +S_SORCFX2_ORBITC SBS2 M* 2 A_SorcFX2Orbit S_SORCFX2_ORBITD +S_SORCFX2_ORBITD SBS2 N* 2 A_SorcFX2Orbit S_SORCFX2_ORBITE +S_SORCFX2_ORBITE SBS2 O* 2 A_SorcFX2Orbit S_SORCFX2_ORBITF +S_SORCFX2_ORBITF SBS2 P* 2 A_SorcFX2Orbit S_SORCFX2_ORBIT1 +S_SORCFX2T1 SBS2 A 10 NULL S_NULL + +S_SORCFX3_1 SBS3 A* 2 NULL S_SORCFX3_2 +S_SORCFX3_2 SBS3 B* 2 NULL S_SORCFX3_3 +S_SORCFX3_3 SBS3 C* 2 NULL S_SORCFX3_1 + +S_BISHMORPH1 SBS3 A* 4 NULL S_BISHMORPHA +S_BISHMORPHA BISH P 4 A_SorcererBishopEntry S_BISHMORPHB +S_BISHMORPHB BISH O 4 NULL S_BISHMORPHC +S_BISHMORPHC BISH N 4 NULL S_BISHMORPHD +S_BISHMORPHD BISH M 3 NULL S_BISHMORPHE +S_BISHMORPHE BISH L 3 NULL S_BISHMORPHF +S_BISHMORPHF BISH K 3 NULL S_BISHMORPHG +S_BISHMORPHG BISH J 3 NULL S_BISHMORPHH +S_BISHMORPHH BISH I 3 NULL S_BISHMORPHI +S_BISHMORPHI BISH H 3 NULL S_BISHMORPHJ +S_BISHMORPHJ BISH G 3 A_SpawnBishop S_NULL +S_SORCFX3_EXP1 SBS3 D 3 NULL S_SORCFX3_EXP2 +S_SORCFX3_EXP2 SBS3 E 3 NULL S_SORCFX3_EXP3 +S_SORCFX3_EXP3 SBS3 F 3 NULL S_SORCFX3_EXP4 +S_SORCFX3_EXP4 SBS3 G 3 NULL S_SORCFX3_EXP5 +S_SORCFX3_EXP5 SBS3 H 3 NULL S_NULL +S_SORCFX4_1 SBS4 A* 2 A_SorcFX4Check S_SORCFX4_2 +S_SORCFX4_2 SBS4 B* 2 A_SorcFX4Check S_SORCFX4_3 +S_SORCFX4_3 SBS4 C* 2 A_SorcFX4Check S_SORCFX4_1 +S_SORCFX4_D1 SBS4 D* 2 NULL S_SORCFX4_D2 +S_SORCFX4_D2 SBS4 E* 2 A_Explode S_SORCFX4_D3 +S_SORCFX4_D3 SBS4 F* 2 NULL S_SORCFX4_D4 +S_SORCFX4_D4 SBS4 G* 2 NULL S_SORCFX4_D5 +S_SORCFX4_D5 SBS4 H* 2 NULL S_NULL +S_SORCSPARK1 SBFX A* 4 NULL S_SORCSPARK2 +S_SORCSPARK2 SBFX B* 4 NULL S_SORCSPARK3 +S_SORCSPARK3 SBFX C* 4 NULL S_SORCSPARK4 +S_SORCSPARK4 SBFX D* 4 NULL S_SORCSPARK5 +S_SORCSPARK5 SBFX E* 4 NULL S_SORCSPARK6 +S_SORCSPARK6 SBFX F* 4 NULL S_SORCSPARK7 +S_SORCSPARK7 SBFX G* 4 NULL S_NULL + + +// +// blast effect +// + +$ MT_BLASTEFFECT +spawnstate S_BLASTEFFECT1 +flags MF_NOBLOCKMAP|MF_NOGRAVITY|MF_NOCLIP +flags2 MF2_NOTELEPORT +translucency 0.66 + +S_BLASTEFFECT1 RADE A 4 NULL S_BLASTEFFECT2 +S_BLASTEFFECT2 RADE B 4 NULL S_BLASTEFFECT3 +S_BLASTEFFECT3 RADE C 4 NULL S_BLASTEFFECT4 +S_BLASTEFFECT4 RADE D 4 NULL S_BLASTEFFECT5 +S_BLASTEFFECT5 RADE E 4 NULL S_BLASTEFFECT6 +S_BLASTEFFECT6 RADE F 4 NULL S_BLASTEFFECT7 +S_BLASTEFFECT7 RADE G 4 NULL S_BLASTEFFECT8 +S_BLASTEFFECT8 RADE H 4 NULL S_BLASTEFFECT9 +S_BLASTEFFECT9 RADE I 4 NULL S_NULL + +// +// dripping water +// + +$ MT_WATER_DRIP +spawnstate S_WATERDRIP1 +deathsound Drip +mass 1 +flags MF_MISSILE +flags2 MF2_LOGRAV|MF2_NOTELEPORT + +S_WATERDRIP1 WATR A 5 NULL S_WATERDRIP1 + + +// +// KORAX! +// + +$ MT_KORAX +doomednum 10200 +spawnstate S_KORAX_LOOK1 +spawnhealth 5000 +seestate S_KORAX_CHASE2 +seesound KoraxSight +attacksound KoraxAttack +painstate S_KORAX_PAIN1 +painchance 20 +painsound KoraxPain +missilestate S_KORAX_ATTACK1 +deathstate S_KORAX_DEATH1 +deathsound KoraxDeath +speed 10 +radius 65 +height 115 +damage 15 +mass 2000 +activesound KoraxActive +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL +flags2 MF2_FLOORCLIP|MF2_PUSHWALL|MF2_MCROSS|MF2_TELESTOMP|MF2_BOSS + +$ MT_KORAX_SPIRIT1 +spawnstate S_KSPIRIT_ROAM1 +speed 8 +flags MF_NOBLOCKMAP|MF_DROPOFF|MF_NOGRAVITY|MF_MISSILE|MF_NOCLIP +flags2 MF2_NOTELEPORT +translucency 0.66 + +$ MT_KORAX_SPIRIT2 +spawnstate S_KSPIRIT_ROAM1 +speed 8 +flags MF_NOBLOCKMAP|MF_DROPOFF|MF_NOGRAVITY|MF_MISSILE|MF_NOCLIP +flags2 MF2_NOTELEPORT +translucency 0.66 + +$ MT_KORAX_SPIRIT3 +spawnstate S_KSPIRIT_ROAM1 +speed 8 +flags MF_NOBLOCKMAP|MF_DROPOFF|MF_NOGRAVITY|MF_MISSILE|MF_NOCLIP +flags2 MF2_NOTELEPORT +translucency 0.66 + +$ MT_KORAX_SPIRIT4 +spawnstate S_KSPIRIT_ROAM1 +speed 8 +flags MF_NOBLOCKMAP|MF_DROPOFF|MF_NOGRAVITY|MF_MISSILE|MF_NOCLIP +flags2 MF2_NOTELEPORT +translucency 0.66 + +$ MT_KORAX_SPIRIT5 +spawnstate S_KSPIRIT_ROAM1 +speed 8 +flags MF_NOBLOCKMAP|MF_DROPOFF|MF_NOGRAVITY|MF_MISSILE|MF_NOCLIP +flags2 MF2_NOTELEPORT +translucency 0.66 + +$ MT_KORAX_SPIRIT6 +spawnstate S_KSPIRIT_ROAM1 +speed 8 +flags MF_NOBLOCKMAP|MF_DROPOFF|MF_NOGRAVITY|MF_MISSILE|MF_NOCLIP +flags2 MF2_NOTELEPORT +translucency 0.66 + +$ MT_KORAX_BOLT +spawnstate S_KBOLT1 +radius 15 +height 35 +flags MF_NOBLOCKMAP|MF_NOGRAVITY|MF_MISSILE|MF_DROPOFF +flags2 MF2_NOTELEPORT + +S_KORAX_LOOK1 KORX A 5 A_Look S_KORAX_LOOK1 + +S_KORAX_CHASE1 KORX A 3 A_KoraxStep2 S_KORAX_CHASE2 +S_KORAX_CHASE2 KORX A 3 A_KoraxChase S_KORAX_CHASE3 +S_KORAX_CHASE3 KORX A 3 A_KoraxChase S_KORAX_CHASE4 +S_KORAX_CHASE4 KORX A 3 A_KoraxChase S_KORAX_CHASE5 +S_KORAX_CHASE5 KORX B 3 A_KoraxStep S_KORAX_CHASE6 +S_KORAX_CHASE6 KORX B 3 A_KoraxChase S_KORAX_CHASE7 +S_KORAX_CHASE7 KORX B 3 A_KoraxChase S_KORAX_CHASE8 +S_KORAX_CHASE8 KORX B 3 A_KoraxChase S_KORAX_CHASE9 +S_KORAX_CHASE9 KORX C 3 A_KoraxStep2 S_KORAX_CHASE0 +S_KORAX_CHASE0 KORX C 3 A_KoraxChase S_KORAX_CHASEA +S_KORAX_CHASEA KORX C 3 A_KoraxChase S_KORAX_CHASEB +S_KORAX_CHASEB KORX C 3 A_KoraxChase S_KORAX_CHASEC +S_KORAX_CHASEC KORX D 3 A_KoraxStep S_KORAX_CHASED +S_KORAX_CHASED KORX D 3 A_KoraxChase S_KORAX_CHASEE +S_KORAX_CHASEE KORX D 3 A_KoraxChase S_KORAX_CHASEF +S_KORAX_CHASEF KORX D 3 A_KoraxChase S_KORAX_CHASE1 + +S_KORAX_PAIN1 KORX H 5 A_Pain S_KORAX_PAIN2 +S_KORAX_PAIN2 KORX H 5 NULL S_KORAX_CHASE2 + +S_KORAX_ATTACK1 KORX E* 2 A_FaceTarget S_KORAX_ATTACK2 +S_KORAX_ATTACK2 KORX E* 5 A_KoraxDecide S_KORAX_ATTACK2 + +S_KORAX_MISSILE1 KORX E* 4 A_FaceTarget S_KORAX_MISSILE2 +S_KORAX_MISSILE2 KORX F* 8 A_KoraxMissile S_KORAX_MISSILE3 +S_KORAX_MISSILE3 KORX E* 8 NULL S_KORAX_CHASE2 + +S_KORAX_COMMAND1 KORX E* 5 A_FaceTarget S_KORAX_COMMAND2 +S_KORAX_COMMAND2 KORX W* 10 A_FaceTarget S_KORAX_COMMAND3 +S_KORAX_COMMAND3 KORX G* 15 A_KoraxCommand S_KORAX_COMMAND4 +S_KORAX_COMMAND4 KORX W* 10 NULL S_KORAX_COMMAND5 +S_KORAX_COMMAND5 KORX E* 5 NULL S_KORAX_CHASE2 + +S_KORAX_DEATH1 KORX I 5 NULL S_KORAX_DEATH2 +S_KORAX_DEATH2 KORX J 5 A_FaceTarget S_KORAX_DEATH3 +S_KORAX_DEATH3 KORX K 5 A_Scream S_KORAX_DEATH4 +S_KORAX_DEATH4 KORX L 5 NULL S_KORAX_DEATH5 +S_KORAX_DEATH5 KORX M 5 NULL S_KORAX_DEATH6 +S_KORAX_DEATH6 KORX N 5 NULL S_KORAX_DEATH7 +S_KORAX_DEATH7 KORX O 5 NULL S_KORAX_DEATH8 +S_KORAX_DEATH8 KORX P 5 NULL S_KORAX_DEATH9 +S_KORAX_DEATH9 KORX Q 10 NULL S_KORAX_DEATH0 +S_KORAX_DEATH0 KORX R 5 A_KoraxBonePop S_KORAX_DEATHA +S_KORAX_DEATHA KORX S 5 A_NoBlocking S_KORAX_DEATHB +S_KORAX_DEATHB KORX T 5 NULL S_KORAX_DEATHC +S_KORAX_DEATHC KORX U 5 NULL S_KORAX_DEATHD +S_KORAX_DEATHD KORX V -1 NULL S_NULL + +S_KSPIRIT_ROAM1 SPIR A 5 A_KSpiritRoam S_KSPIRIT_ROAM2 +S_KSPIRIT_ROAM2 SPIR B 5 A_KSpiritRoam S_KSPIRIT_ROAM1 + +S_KSPIRIT_DEATH1 SPIR D 5 NULL S_KSPIRIT_DEATH2 +S_KSPIRIT_DEATH2 SPIR E 5 NULL S_KSPIRIT_DEATH3 +S_KSPIRIT_DEATH3 SPIR F 5 NULL S_KSPIRIT_DEATH4 +S_KSPIRIT_DEATH4 SPIR G 5 NULL S_KSPIRIT_DEATH5 +S_KSPIRIT_DEATH5 SPIR H 5 NULL S_KSPIRIT_DEATH6 +S_KSPIRIT_DEATH6 SPIR I 5 NULL S_NULL + +S_KBOLT1 MLFX I* 2 NULL S_KBOLT2 +S_KBOLT2 MLFX J* 2 A_KBoltRaise S_KBOLT3 +S_KBOLT3 MLFX I* 2 A_KBolt S_KBOLT4 +S_KBOLT4 MLFX J* 2 A_KBolt S_KBOLT5 +S_KBOLT5 MLFX K* 2 A_KBolt S_KBOLT6 +S_KBOLT6 MLFX L* 2 A_KBolt S_KBOLT7 +S_KBOLT7 MLFX M* 2 A_KBolt S_KBOLT3 + + +// +// some mash monsters (what does the mash mean?) +// + +$ MT_DEMON_MASH +spawnstate S_DEMN_LOOK1 +spawnhealth 250 +seestate S_DEMN_CHASE1 +seesound DemonSight +attacksound DemonAttack +painstate S_DEMN_PAIN1 +painchance 50 +painsound DemonPain +meleestate S_DEMN_ATK1_1 +missilestate S_DEMN_ATK2_1 +deathsound DemonDeath +speed 13 +radius 32 +height 64 +mass 220 +activesound DemonActive +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL|MF_NOBLOOD +flags2 MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_MCROSS|MF2_PUSHWALL|MF2_BLASTED +translucency 0.66 + +$ MT_DEMON2_MASH +spawnstate S_DEMN2_LOOK1 +spawnhealth 250 +seestate S_DEMN2_CHASE1 +seesound DemonSight +attacksound DemonAttack +painstate S_DEMN2_PAIN1 +painchance 50 +painsound DemonPain +meleestate S_DEMN2_ATK1_1 +missilestate S_DEMN2_ATK2_1 +deathsound DemonDeath +speed 13 +radius 32 +height 64 +mass 220 +activesound DemonActive +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL|MF_NOBLOOD +flags2 MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_MCROSS|MF2_PUSHWALL|MF2_BLASTED +translucency 0.66 + +$ MT_ETTIN_MASH +spawnstate S_ETTIN_LOOK1 +spawnhealth 175 +seestate S_ETTIN_CHASE1 +seesound EttinSight +attacksound EttinAttack +painstate S_ETTIN_PAIN1 +painchance 60 +painsound EttinPain +meleestate S_ETTIN_ATK1_1 +deathsound EttinDeath +speed 13 +radius 25 +height 68 +damage 3 +mass 175 +activesound EttinActive +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL|MF_NOBLOOD +flags2 MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_MCROSS|MF2_PUSHWALL|MF2_BLASTED +translucency 0.66 + +$ MT_CENTAUR_MASH +spawnstate S_CENTAUR_LOOK1 +spawnhealth 200 +seestate S_CENTAUR_WALK1 +seesound CentaurSight +attacksound CentaurAttack +painstate S_CENTAUR_PAIN1 +painchance 135 +painsound CentaurPain +meleestate S_CENTAUR_ATK1 +missilestate 0 +deathsound CentaurDeath +speed 13 +height 64 +mass 120 +activesound CentaurActive +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL|MF_NOBLOOD +flags2 MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_MCROSS|MF2_PUSHWALL|MF2_BLASTED +translucency 0.66 + + +// +// bats +// + +$ MT_BAT_SPAWNER +doomednum 10225 +spawnstate S_SPAWNBATS1 +flags MF_NOBLOCKMAP|MF_NOSECTOR|MF_NOGRAVITY +flags2 MF2_DONTDRAW + +$ MT_BAT +spawnstate S_BAT1 +deathstate S_BAT_DEATH +speed 5 +radius 3 +height 3 +flags MF_NOBLOCKMAP|MF_NOGRAVITY|MF_MISSILE +flags2 MF2_PASSMOBJ|MF2_NOTELEPORT + +S_SPAWNBATS1 MAN1 A 2 NULL S_SPAWNBATS2 +S_SPAWNBATS2 MAN1 A 2 A_BatSpawnInit S_SPAWNBATS3 +S_SPAWNBATS3 MAN1 A 2 A_BatSpawn S_SPAWNBATS3 + +S_SPAWNBATS_OFF MAN1 A -1 NULL S_NULL + +S_BAT1 ABAT A 2 A_BatMove S_BAT2 +S_BAT2 ABAT B 2 A_BatMove S_BAT3 +S_BAT3 ABAT C 2 A_BatMove S_BAT1 + +S_BAT_DEATH ABAT A 2 NULL S_NULL diff --git a/code/m_option.c b/code/m_option.c index dabade07b6..88ffb489cd 100644 --- a/code/m_option.c +++ b/code/m_option.c @@ -200,7 +200,9 @@ extern cvar_t *am_rotate, *r_drawfuzz, *cl_rockettrails, *cl_pufftype, - *cl_bloodtype; + *cl_bloodtype, + *wipetype, + *vid_palettehack; static value_t Crosshairs[] = { { 0.0, "None" }, @@ -237,6 +239,13 @@ static value_t PuffTypes[] = { { 1.0, "Particles" } }; +static value_t Wipes[] = { + { 0.0, "None" }, + { 1.0, "Melt" }, + { 2.0, "Burn" }, + { 3.0, "Crossfade" } +}; + static menuitem_t VideoItems[] = { { more, "Messages", NULL, 0.0, 0.0, 0.0, (value_t *)StartMessagesMenu }, { redtext, " ", NULL, 0.0, 0.0, 0.0, NULL }, @@ -246,7 +255,11 @@ static menuitem_t VideoItems[] = { { discrete, "Column render mode", (cvar_t **)&r_columnmethod,2.0,0.0, 0.0, ColumnMethods }, { discrete, "Detail mode", (cvar_t **)&r_detail, 4.0, 0.0, 0.0, DetailModes }, { discrete, "Stretch short skies", (cvar_t **)&r_stretchsky, 2.0,0.0, 0.0, OnOff }, - { discrete, "Scale status bar", (cvar_t **)&st_scale, 2.0, 0.0, 0.0, OnOff }, + { discrete, "Stretch status bar", (cvar_t **)&st_scale, 2.0, 0.0, 0.0, OnOff }, + { discrete, "Screen wipe style", (cvar_t **)&wipetype, 4.0, 0.0, 0.0, Wipes }, +#ifdef _WIN32 + { discrete, "DirectDraw palette hack", (cvar_t **)&vid_palettehack, 2.0,0.0,0.0,OnOff }, +#endif { redtext, " ", NULL, 0.0, 0.0, 0.0, NULL }, { discrete, "Use fuzz effect", (cvar_t **)&r_drawfuzz, 2.0, 0.0, 0.0, YesNo }, { discrete, "Rocket Trails", (cvar_t **)&cl_rockettrails, 2.0, 0.0, 0.0, OnOff }, @@ -261,7 +274,11 @@ static menuitem_t VideoItems[] = { menu_t VideoMenu = { "M_VIDEO", 0, - 17, +#ifdef _WIN32 + 20, +#else + 19, +#endif 0, VideoItems, }; diff --git a/code/p_effect.c b/code/p_effect.c index 3be03666cc..f1a99af7de 100644 --- a/code/p_effect.c +++ b/code/p_effect.c @@ -465,7 +465,7 @@ void P_DisconnectEffect (mobj_t *actor) int i; for (i = 64; i; i--) { - particle_t *p = JitterParticle (40); + particle_t *p = JitterParticle (TICRATE*2); if (!p) break; diff --git a/code/p_effect.h b/code/p_effect.h index 10e2b30c51..c467248f08 100644 --- a/code/p_effect.h +++ b/code/p_effect.h @@ -2,6 +2,7 @@ #define FX_ROCKET 0x00000001 #define FX_GRENADE 0x00000002 +#define FX_VISIBILITYPULSE 0x00000040 #define FX_FOUNTAINMASK 0x00070000 #define FX_FOUNTAINSHIFT 16 diff --git a/code/p_things.c b/code/p_things.c index 9f5984816e..9119b28b4d 100644 --- a/code/p_things.c +++ b/code/p_things.c @@ -184,9 +184,6 @@ BOOL P_Thing_Spawn (int tid, int type, angle_t angle, BOOL fog) return false; while ( (spot = P_FindMobjByTid (spot, tid)) ) { - if (spot->type != MT_MAPSPOT && spot->type != MT_MAPSPOTGRAV) - continue; - if (mobjinfo[kind].flags2 & MF2_FLOATBOB) { z = spot->z - spot->floorz; } else { @@ -201,7 +198,7 @@ BOOL P_Thing_Spawn (int tid, int type, angle_t angle, BOOL fog) if (fog) S_Sound (P_SpawnMobj (spot->x, spot->y, spot->z, MT_TFOG), CHAN_VOICE, "misc/teleport", 1, ATTN_NORM); - mobj->flags2 |= MF2_DROPPED; // Don't respawn + mobj->flags |= MF_DROPPED; // Don't respawn if (mobj->flags2 & MF2_FLOATBOB) { mobj->special1 = mobj->z - mobj->floorz; } @@ -233,7 +230,7 @@ BOOL P_Thing_Projectile (int tid, int type, angle_t angle, return false; while ( (spot = P_FindMobjByTid (spot, tid)) ) { - if (spot->type != MT_MAPSPOT && spot->type != MT_MAPSPOTGRAV) + if (spot->type != MT_MAPSPOT && spot->type != MT_MAPSPOTGRAVITY) continue; mobj = P_SpawnMobj (spot->x, spot->y, spot->z, kind); diff --git a/code/r_drawt.c b/code/r_drawt.c index 09a951a150..c87a197def 100644 --- a/code/r_drawt.c +++ b/code/r_drawt.c @@ -13,6 +13,7 @@ #include "r_draw.h" #include "r_main.h" #include "r_things.h" +#include "v_video.h" byte dc_temp[1200*4]; unsigned int dc_tspans[4][256]; @@ -339,23 +340,37 @@ void rt_lucent1col (int hx, int sx, int yl, int yh) byte *colormap; byte *source; byte *dest; - byte *transmap; int count; int pitch; + unsigned int *fg2rgb, *bg2rgb; count = yh-yl; if (count < 0) return; count++; + { + fixed_t fglevel, bglevel; + + fglevel = dc_translevel & ~0x3ff; + bglevel = FRACUNIT-fglevel; + fg2rgb = Col2RGB8[fglevel>>10]; + bg2rgb = Col2RGB8[bglevel>>10]; + } + dest = ylookup[yl] + columnofs[sx]; source = &dc_temp[yl*4 + hx]; pitch = dc_pitch; - transmap = dc_transmap; colormap = dc_colormap; do { - *dest = transmap[colormap[*source] | ((*dest) << 8)]; + unsigned int fg = colormap[*source]; + unsigned int bg = *dest; + + fg = fg2rgb[fg]; + bg = bg2rgb[bg]; + fg = (fg+bg) | 0xf07c3e1f; + *dest = RGB8k[0][0][(fg>>5) & (fg>>19)]; source += 4; dest += pitch; } while (--count); @@ -367,24 +382,44 @@ void rt_lucent2cols (int hx, int sx, int yl, int yh) byte *colormap; byte *source; byte *dest; - byte *transmap; int count; int pitch; + unsigned int *fg2rgb, *bg2rgb; count = yh-yl; if (count < 0) return; count++; + { + fixed_t fglevel, bglevel; + + fglevel = dc_translevel & ~0x3ff; + bglevel = FRACUNIT-fglevel; + fg2rgb = Col2RGB8[fglevel>>10]; + bg2rgb = Col2RGB8[bglevel>>10]; + } + dest = ylookup[yl] + columnofs[sx]; source = &dc_temp[yl*4 + hx]; pitch = dc_pitch; - transmap = dc_transmap; colormap = dc_colormap; do { - dest[0] = transmap[colormap[source[0]] | (dest[0] << 8)]; - dest[1] = transmap[colormap[source[1]] | (dest[1] << 8)]; + unsigned int fg = colormap[source[0]]; + unsigned int bg = dest[0]; + fg = fg2rgb[fg]; + bg = bg2rgb[bg]; + fg = (fg+bg) | 0xf07c3e1f; + dest[0] = RGB8k[0][0][(fg>>5) & (fg>>19)]; + + fg = colormap[source[1]]; + bg = dest[1]; + fg = fg2rgb[fg]; + bg = bg2rgb[bg]; + fg = (fg+bg) | 0xf07c3e1f; + dest[1] = RGB8k[0][0][(fg>>5) & (fg>>19)]; + source += 4; dest += pitch; } while (--count); @@ -396,26 +431,59 @@ void rt_lucent4cols (int sx, int yl, int yh) byte *colormap; byte *source; byte *dest; - byte *transmap; int count; int pitch; + unsigned int *fg2rgb, *bg2rgb; count = yh-yl; if (count < 0) return; count++; + { + fixed_t fglevel, bglevel; + + fglevel = dc_translevel & ~0x3ff; + bglevel = FRACUNIT-fglevel; + fg2rgb = Col2RGB8[fglevel>>10]; + bg2rgb = Col2RGB8[bglevel>>10]; + } + dest = ylookup[yl] + columnofs[sx]; source = &dc_temp[yl*4]; pitch = dc_pitch; - transmap = dc_transmap; colormap = dc_colormap; do { - dest[0] = transmap[colormap[source[0]] | (dest[0] << 8)]; - dest[1] = transmap[colormap[source[1]] | (dest[1] << 8)]; - dest[2] = transmap[colormap[source[2]] | (dest[2] << 8)]; - dest[3] = transmap[colormap[source[3]] | (dest[3] << 8)]; + unsigned int fg = colormap[source[0]]; + unsigned int bg = dest[0]; + fg = fg2rgb[fg]; + bg = bg2rgb[bg]; + fg = (fg+bg) | 0xf07c3e1f; + dest[0] = RGB8k[0][0][(fg>>5) & (fg>>19)]; + + fg = colormap[source[1]]; + bg = dest[1]; + fg = fg2rgb[fg]; + bg = bg2rgb[bg]; + fg = (fg+bg) | 0xf07c3e1f; + dest[1] = RGB8k[0][0][(fg>>5) & (fg>>19)]; + + + fg = colormap[source[2]]; + bg = dest[2]; + fg = fg2rgb[fg]; + bg = bg2rgb[bg]; + fg = (fg+bg) | 0xf07c3e1f; + dest[2] = RGB8k[0][0][(fg>>5) & (fg>>19)]; + + fg = colormap[source[3]]; + bg = dest[3]; + fg = fg2rgb[fg]; + bg = bg2rgb[bg]; + fg = (fg+bg) | 0xf07c3e1f; + dest[3] = RGB8k[0][0][(fg>>5) & (fg>>19)]; + source += 4; dest += pitch; } while (--count); @@ -424,20 +492,28 @@ void rt_lucent4cols (int sx, int yl, int yh) // Translates and mixes one span at hx to the screen at sx. void rt_tlatelucent1col (int hx, int sx, int yl, int yh) { - byte *transmap; byte *translation; byte *colormap; byte *source; byte *dest; int count; int pitch; + unsigned int *fg2rgb, *bg2rgb; count = yh-yl; if (count < 0) return; count++; - transmap = dc_transmap; + { + fixed_t fglevel, bglevel; + + fglevel = dc_translevel & ~0x3ff; + bglevel = FRACUNIT-fglevel; + fg2rgb = Col2RGB8[fglevel>>10]; + bg2rgb = Col2RGB8[bglevel>>10]; + } + translation = dc_translation; colormap = dc_colormap; dest = ylookup[yl] + columnofs[sx]; @@ -445,7 +521,13 @@ void rt_tlatelucent1col (int hx, int sx, int yl, int yh) pitch = dc_pitch; do { - *dest = transmap[colormap[translation[*source]] | ((*dest) << 8)]; + unsigned int fg = colormap[translation[*source]]; + unsigned int bg = *dest; + + fg = fg2rgb[fg]; + bg = bg2rgb[bg]; + fg = (fg+bg) | 0xf07c3e1f; + *dest = RGB8k[0][0][(fg>>5) & (fg>>19)]; source += 4; dest += pitch; } while (--count); @@ -454,20 +536,28 @@ void rt_tlatelucent1col (int hx, int sx, int yl, int yh) // Translates and mixes two spans at hx and hx+1 to the screen at sx and sx+1. void rt_tlatelucent2cols (int hx, int sx, int yl, int yh) { - byte *transmap; byte *translation; byte *colormap; byte *source; byte *dest; int count; int pitch; + unsigned int *fg2rgb, *bg2rgb; count = yh-yl; if (count < 0) return; count++; - transmap = dc_transmap; + { + fixed_t fglevel, bglevel; + + fglevel = dc_translevel & ~0x3ff; + bglevel = FRACUNIT-fglevel; + fg2rgb = Col2RGB8[fglevel>>10]; + bg2rgb = Col2RGB8[bglevel>>10]; + } + translation = dc_translation; colormap = dc_colormap; dest = ylookup[yl] + columnofs[sx]; @@ -475,8 +565,20 @@ void rt_tlatelucent2cols (int hx, int sx, int yl, int yh) pitch = dc_pitch; do { - dest[0] = transmap[colormap[translation[source[0]]] | (dest[0] << 8)]; - dest[1] = transmap[colormap[translation[source[1]]] | (dest[1] << 8)]; + unsigned int fg = colormap[translation[source[0]]]; + unsigned int bg = dest[0]; + fg = fg2rgb[fg]; + bg = bg2rgb[bg]; + fg = (fg+bg) | 0xf07c3e1f; + dest[0] = RGB8k[0][0][(fg>>5) & (fg>>19)]; + + fg = colormap[translation[source[1]]]; + bg = dest[1]; + fg = fg2rgb[fg]; + bg = bg2rgb[bg]; + fg = (fg+bg) | 0xf07c3e1f; + dest[1] = RGB8k[0][0][(fg>>5) & (fg>>19)]; + source += 4; dest += pitch; } while (--count); @@ -485,31 +587,64 @@ void rt_tlatelucent2cols (int hx, int sx, int yl, int yh) // Translates and mixes all four spans to the screen starting at sx. void rt_tlatelucent4cols (int sx, int yl, int yh) { - byte *transmap; byte *translation; byte *colormap; byte *source; byte *dest; int count; int pitch; + unsigned int *fg2rgb, *bg2rgb; - transmap = dc_transmap; - translation = dc_translation; count = yh-yl; if (count < 0) return; count++; + { + fixed_t fglevel, bglevel; + + fglevel = dc_translevel & ~0x3ff; + bglevel = FRACUNIT-fglevel; + fg2rgb = Col2RGB8[fglevel>>10]; + bg2rgb = Col2RGB8[bglevel>>10]; + } + + translation = dc_translation; colormap = dc_colormap; dest = ylookup[yl] + columnofs[sx]; source = &dc_temp[yl*4]; pitch = dc_pitch; do { - dest[0] = transmap[colormap[translation[source[0]]] | (dest[0] << 8)]; - dest[1] = transmap[colormap[translation[source[1]]] | (dest[1] << 8)]; - dest[2] = transmap[colormap[translation[source[2]]] | (dest[2] << 8)]; - dest[3] = transmap[colormap[translation[source[3]]] | (dest[3] << 8)]; + unsigned int fg = colormap[translation[source[0]]]; + unsigned int bg = dest[0]; + fg = fg2rgb[fg]; + bg = bg2rgb[bg]; + fg = (fg+bg) | 0xf07c3e1f; + dest[0] = RGB8k[0][0][(fg>>5) & (fg>>19)]; + + fg = colormap[translation[source[1]]]; + bg = dest[1]; + fg = fg2rgb[fg]; + bg = bg2rgb[bg]; + fg = (fg+bg) | 0xf07c3e1f; + dest[1] = RGB8k[0][0][(fg>>5) & (fg>>19)]; + + + fg = colormap[translation[source[2]]]; + bg = dest[2]; + fg = fg2rgb[fg]; + bg = bg2rgb[bg]; + fg = (fg+bg) | 0xf07c3e1f; + dest[2] = RGB8k[0][0][(fg>>5) & (fg>>19)]; + + fg = colormap[translation[source[3]]]; + bg = dest[3]; + fg = fg2rgb[fg]; + bg = bg2rgb[bg]; + fg = (fg+bg) | 0xf07c3e1f; + dest[3] = RGB8k[0][0][(fg>>5) & (fg>>19)]; + source += 4; dest += pitch; } while (--count); diff --git a/code/ticinfo.lmp b/code/ticinfo.lmp new file mode 100644 index 0000000000..a6e96a66de --- /dev/null +++ b/code/ticinfo.lmp @@ -0,0 +1,3173 @@ +// This file describes the state definitions and info declarations used for +// Heretic. The format of this file is based on the format used by the +// original multigen with modifications to suit the way things are done +// internally by ZDoom. +// +//============================================================================ +// If the first two characters of a line are S_, it is a state definition +// line. Otherwise, it is part of an info declaration. +// +//============================================================================ +// state data is: +// +// statename sprite frame tics action nextstate [optional1] [optional2] +// a * after the frame letter causes full bright +// +//============================================================================ +// An info definition is: +// +// $ MOBJNAME +// field data +// +// if MOBJNAME is +, a new unique name will be generated +// if fieldname starts with str_, it will be made a char * instead of an int +//============================================================================ + +// +// info default MUST be first in file +// + +$ DEFAULT +doomednum -1 //number to spawn this object +spawnstate S_NULL // +spawnhealth 1000 // +seestate S_NULL //when player sighted or enemy shot +seesound "" //also launch sound for missiles +reactiontime 8 //wait time before attacking +attacksound "" // +painstate S_NULL // +painchance 0 //out of 256 +painsound "" // +meleestate S_NULL // +missilestate S_NULL // +crashstate S_NULL // +deathstate S_NULL //also explodestate for missiles +xdeathstate S_NULL //when knocked to -spawnhelath or lower +deathsound "" //also explosion sound for missiles +speed 0 // +radius 20 // +height 16 // +mass 100 // +damage 0 //missile damage in d8s +activesound "" // +flags 0 // +flags2 0 //Heretic/Hexen flags +raisestate S_NULL //vile resurection state +translucency 1 //0=invisible, 1=opaque + + +// when a state cycles to S_NULL, the actor will be removed + +S_NULL IMPX A -1 NULL S_NULL +S_FREETARGMOBJ ACLO E 1050 A_FreeTargMobj S_NULL + +// +// Items +// + +// healing vial +$ + +doomednum 81 +spawnstate S_ITEM_PTN1_1 +flags MF_SPECIAL +flags2 MF2_FLOATBOB + +S_ITEM_PTN1_1 PTN1 A 3 NULL S_ITEM_PTN1_2 +S_ITEM_PTN1_2 PTN1 B 3 NULL S_ITEM_PTN1_3 +S_ITEM_PTN1_3 PTN1 C 3 NULL S_ITEM_PTN1_1 + +// shields +$ MT_ITEMSHIELD1 +doomednum 85 +spawnstate S_ITEM_SHLD1 +flags MF_SPECIAL +flags2 MF2_FLOATBOB + +$ MT_ITEMSHIELD2 +doomednum 31 +spawnstate S_ITEM_SHD2_1 +flags MF_SPECIAL +flags2 MF2_FLOATBOB + +S_ITEM_SHLD1 SHLD A -1 NULL S_NULL + +S_ITEM_SHD2_1 SHD2 A -1 NULL S_NULL + +// bag of holding +$ + +doomednum 8 +spawnstate S_ITEM_BAGH1 +flags MF_SPECIAL|MF_COUNTITEM +flags2 MF2_FLOATBOB + +S_ITEM_BAGH1 BAGH A -1 NULL S_NULL + +// super map +$ + +doomednum 35 +spawnstate S_ITEM_SPMP1 +flags MF_SPECIAL|MF_COUNTITEM +flags2 MF2_FLOATBOB + +S_ITEM_SPMP1 SPMP A -1 NULL S_NULL + +// +// hiding/removing items +// +S_HIDESPECIAL1 ACLO E 1400 NULL S_HIDESPECIAL2 +S_HIDESPECIAL2 ACLO A 4 A_RestoreSpecialThing1 S_HIDESPECIAL3 +S_HIDESPECIAL3 ACLO B 4 NULL S_HIDESPECIAL4 +S_HIDESPECIAL4 ACLO A 4 NULL S_HIDESPECIAL5 +S_HIDESPECIAL5 ACLO B 4 NULL S_HIDESPECIAL6 +S_HIDESPECIAL6 ACLO C 4 NULL S_HIDESPECIAL7 +S_HIDESPECIAL7 ACLO B 4 NULL S_HIDESPECIAL8 +S_HIDESPECIAL8 ACLO C 4 NULL S_HIDESPECIAL9 +S_HIDESPECIAL9 ACLO D 4 NULL S_HIDESPECIAL10 +S_HIDESPECIAL10 ACLO C 4 NULL S_HIDESPECIAL11 +S_HIDESPECIAL11 ACLO D 4 A_RestoreSpecialThing2 S_NULL + +S_DORMANTARTI1 ACLO D 3 NULL S_DORMANTARTI2 +S_DORMANTARTI2 ACLO C 3 NULL S_DORMANTARTI3 +S_DORMANTARTI3 ACLO D 3 NULL S_DORMANTARTI4 +S_DORMANTARTI4 ACLO C 3 NULL S_DORMANTARTI5 +S_DORMANTARTI5 ACLO B 3 NULL S_DORMANTARTI6 +S_DORMANTARTI6 ACLO C 3 NULL S_DORMANTARTI7 +S_DORMANTARTI7 ACLO B 3 NULL S_DORMANTARTI8 +S_DORMANTARTI8 ACLO A 3 NULL S_DORMANTARTI9 +S_DORMANTARTI9 ACLO B 3 NULL S_DORMANTARTI10 +S_DORMANTARTI10 ACLO A 3 NULL S_DORMANTARTI11 +S_DORMANTARTI11 ACLO A 1400 A_HideThing S_DORMANTARTI12 +S_DORMANTARTI12 ACLO A 3 A_UnHideThing S_DORMANTARTI13 +S_DORMANTARTI13 ACLO B 3 NULL S_DORMANTARTI14 +S_DORMANTARTI14 ACLO A 3 NULL S_DORMANTARTI15 +S_DORMANTARTI15 ACLO B 3 NULL S_DORMANTARTI16 +S_DORMANTARTI16 ACLO C 3 NULL S_DORMANTARTI17 +S_DORMANTARTI17 ACLO B 3 NULL S_DORMANTARTI18 +S_DORMANTARTI18 ACLO C 3 NULL S_DORMANTARTI19 +S_DORMANTARTI19 ACLO D 3 NULL S_DORMANTARTI20 +S_DORMANTARTI20 ACLO C 3 NULL S_DORMANTARTI21 +S_DORMANTARTI21 ACLO D 3 A_RestoreArtifact S_NULL + +S_DEADARTI1 ACLO D 3 NULL S_DEADARTI2 +S_DEADARTI2 ACLO C 3 NULL S_DEADARTI3 +S_DEADARTI3 ACLO D 3 NULL S_DEADARTI4 +S_DEADARTI4 ACLO C 3 NULL S_DEADARTI5 +S_DEADARTI5 ACLO B 3 NULL S_DEADARTI6 +S_DEADARTI6 ACLO C 3 NULL S_DEADARTI7 +S_DEADARTI7 ACLO B 3 NULL S_DEADARTI8 +S_DEADARTI8 ACLO A 3 NULL S_DEADARTI9 +S_DEADARTI9 ACLO B 3 NULL S_DEADARTI10 +S_DEADARTI10 ACLO A 3 NULL S_NULL + +// +// more items +// + +// invisibility +$ MT_ARTIINVISIBILITY +doomednum 75 +spawnstate S_ARTI_INVS1 +flags MF_SPECIAL|MF_COUNTITEM +flags2 MF2_FLOATBOB +translucency 0.33 + +S_ARTI_INVS1 INVS A* 350 NULL S_ARTI_INVS1 + +// healing potion +$ + +doomednum 82 +spawnstate S_ARTI_PTN2_1 +flags MF_SPECIAL|MF_COUNTITEM +flags2 MF2_FLOATBOB + +S_ARTI_PTN2_1 PTN2 A 4 NULL S_ARTI_PTN2_2 +S_ARTI_PTN2_2 PTN2 B 4 NULL S_ARTI_PTN2_3 +S_ARTI_PTN2_3 PTN2 C 4 NULL S_ARTI_PTN2_1 + +// flight +$ MT_ARTIFLY +doomednum 83 +spawnstate S_ARTI_SOAR1 +flags MF_SPECIAL|MF_COUNTITEM +flags2 MF2_FLOATBOB + +S_ARTI_SOAR1 SOAR A 5 NULL S_ARTI_SOAR2 +S_ARTI_SOAR2 SOAR B 5 NULL S_ARTI_SOAR3 +S_ARTI_SOAR3 SOAR C 5 NULL S_ARTI_SOAR4 +S_ARTI_SOAR4 SOAR B 5 NULL S_ARTI_SOAR1 + +// invulnerability +$ MT_ARTIINVULNERABILITY +doomednum 84 +spawnstate S_ARTI_INVU1 +flags MF_SPECIAL|MF_COUNTITEM +flags2 MF2_FLOATBOB + +S_ARTI_INVU1 INVU A 3 NULL S_ARTI_INVU2 +S_ARTI_INVU2 INVU B 3 NULL S_ARTI_INVU3 +S_ARTI_INVU3 INVU C 3 NULL S_ARTI_INVU4 +S_ARTI_INVU4 INVU D 3 NULL S_ARTI_INVU1 + +// tome of power +$ MT_ARTITOMEOFPOWER +doomednum 86 +spawnstate S_ARTI_PWBK1 +flags MF_SPECIAL|MF_COUNTITEM +flags2 MF2_FLOATBOB + +S_ARTI_PWBK1 PWBK A 350 NULL S_ARTI_PWBK1 + +// morph ovum +$ MT_ARTIEGG +doomednum 30 +spawnstate S_ARTI_EGGC1 +flags MF_SPECIAL|MF_COUNTITEM +flags2 MF2_FLOATBOB + +$ MT_EGGFX +spawnstate S_EGGFX1 +seesound 0 +deathstate S_EGGFXI1_1 +deathsound 0 +speed 18 +radius 8 +height 8 +damage 1 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_NOTELEPORT + +S_ARTI_EGGC1 EGGC A 6 NULL S_ARTI_EGGC2 +S_ARTI_EGGC2 EGGC B 6 NULL S_ARTI_EGGC3 +S_ARTI_EGGC3 EGGC C 6 NULL S_ARTI_EGGC4 +S_ARTI_EGGC4 EGGC B 6 NULL S_ARTI_EGGC1 + +S_EGGFX1 EGGM A 4 NULL S_EGGFX2 +S_EGGFX2 EGGM B 4 NULL S_EGGFX3 +S_EGGFX3 EGGM C 4 NULL S_EGGFX4 +S_EGGFX4 EGGM D 4 NULL S_EGGFX5 +S_EGGFX5 EGGM E 4 NULL S_EGGFX1 + +S_EGGFXI1_1 FX01 E* 3 NULL S_EGGFXI1_2 +S_EGGFXI1_2 FX01 F* 3 NULL S_EGGFXI1_3 +S_EGGFXI1_3 FX01 G* 3 NULL S_EGGFXI1_4 +S_EGGFXI1_4 FX01 H* 3 NULL S_NULL + +// super health +$ MT_ARTISUPERHEAL +doomednum 32 +spawnstate S_ARTI_SPHL1 +flags MF_SPECIAL|MF_COUNTITEM +flags2 MF2_FLOATBOB + +S_ARTI_SPHL1 SPHL A 350 NULL S_ARTI_SPHL1 + +// torch +$ + +doomednum 33 +spawnstate S_ARTI_TRCH1 +flags MF_SPECIAL|MF_COUNTITEM +flags2 MF2_FLOATBOB + +S_ARTI_TRCH1 TRCH A* 3 NULL S_ARTI_TRCH2 +S_ARTI_TRCH2 TRCH B* 3 NULL S_ARTI_TRCH3 +S_ARTI_TRCH3 TRCH C* 3 NULL S_ARTI_TRCH1 + +// fire bomb +$ + +doomednum 34 +spawnstate S_ARTI_FBMB1 +flags MF_SPECIAL|MF_COUNTITEM +flags2 MF2_FLOATBOB + +$ MT_FIREBOMB +spawnstate S_FIREBOMB1 +deathsound sfx_phohit +flags MF_NOGRAVITY +translucency 0.33 + +S_ARTI_FBMB1 FBMB E 350 NULL S_ARTI_FBMB1 + +S_FIREBOMB1 FBMB A 10 NULL S_FIREBOMB2 +S_FIREBOMB2 FBMB B 10 NULL S_FIREBOMB3 +S_FIREBOMB3 FBMB C 10 NULL S_FIREBOMB4 +S_FIREBOMB4 FBMB D 10 NULL S_FIREBOMB5 +S_FIREBOMB5 FBMB E 6 A_Scream S_FIREBOMB6 +S_FIREBOMB6 XPL1 A* 4 A_Explode S_FIREBOMB7 +S_FIREBOMB7 XPL1 B* 4 NULL S_FIREBOMB8 +S_FIREBOMB8 XPL1 C* 4 NULL S_FIREBOMB9 +S_FIREBOMB9 XPL1 D* 4 NULL S_FIREBOMB10 +S_FIREBOMB10 XPL1 E* 4 NULL S_FIREBOMB11 +S_FIREBOMB11 XPL1 F* 4 NULL S_NULL + +// teleportation +$ MT_ARTITELEPORT +doomednum 36 +spawnstate S_ARTI_ATLP1 +flags MF_SPECIAL|MF_COUNTITEM +flags2 MF2_FLOATBOB + +S_ARTI_ATLP1 ATLP A 4 NULL S_ARTI_ATLP2 +S_ARTI_ATLP2 ATLP B 4 NULL S_ARTI_ATLP3 +S_ARTI_ATLP3 ATLP C 4 NULL S_ARTI_ATLP4 +S_ARTI_ATLP4 ATLP B 4 NULL S_ARTI_ATLP1 + + +// +// exploding pod +// + +$ MT_POD +doomednum 2035 +spawnstate S_POD_WAIT1 +spawnhealth 45 +painstate S_POD_PAIN1 +painchance 255 +deathstate S_POD_DIE1 +deathsound sfx_podexp +radius 16 +height 54 +flags MF_SOLID|MF_NOBLOOD|MF_SHOOTABLE|MF_DROPOFF +flags2 MF2_WINDTHRUST|MF2_PUSHABLE|MF2_SLIDE|MF2_PASSMOBJ|MF2_TELESTOMP + +$ MT_PODGOO +spawnstate S_PODGOO1 +deathstate S_PODGOOX +radius 2 +height 4 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF +flags2 MF2_NOTELEPORT|MF2_LOGRAV|MF2_CANNOTPUSH + +$ MT_PODGENERATOR +doomednum 43 +spawnstate S_PODGENERATOR +flags MF_NOBLOCKMAP|MF_NOSECTOR + +S_POD_WAIT1 PPOD A 10 NULL S_POD_WAIT1 +S_POD_PAIN1 PPOD B 14 A_PodPain S_POD_WAIT1 + +S_POD_DIE1 PPOD C* 5 A_RemovePod S_POD_DIE2 +S_POD_DIE2 PPOD D* 5 A_Scream S_POD_DIE3 +S_POD_DIE3 PPOD E* 5 A_Explode S_POD_DIE4 +S_POD_DIE4 PPOD F* 10 NULL S_FREETARGMOBJ + +S_POD_GROW1 PPOD I 3 NULL S_POD_GROW2 +S_POD_GROW2 PPOD J 3 NULL S_POD_GROW3 +S_POD_GROW3 PPOD K 3 NULL S_POD_GROW4 +S_POD_GROW4 PPOD L 3 NULL S_POD_GROW5 +S_POD_GROW5 PPOD M 3 NULL S_POD_GROW6 +S_POD_GROW6 PPOD N 3 NULL S_POD_GROW7 +S_POD_GROW7 PPOD O 3 NULL S_POD_GROW8 +S_POD_GROW8 PPOD P 3 NULL S_POD_WAIT1 + +S_PODGOO1 PPOD G 8 NULL S_PODGOO2 +S_PODGOO2 PPOD H 8 NULL S_PODGOO1 + +S_PODGOOX PPOD G 10 NULL S_NULL + +S_PODGENERATOR AMG1 A 35 A_MakePod S_PODGENERATOR + + +// +// environmental effects +// + +$ MT_SPLASH +spawnstate S_SPLASH1 +deathstate S_SPLASHX +radius 2 +height 4 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF +flags2 MF2_NOTELEPORT|MF2_LOGRAV|MF2_CANNOTPUSH + +$ MT_SPLASHBASE +spawnstate S_SPLASHBASE1 +flags MF_NOBLOCKMAP + +$ MT_LAVASPLASH +spawnstate S_LAVASPLASH1 +flags MF_NOBLOCKMAP + +$ MT_LAVASMOKE +spawnstate S_LAVASMOKE1 +flags MF_NOBLOCKMAP|MF_NOGRAVITY +translucency 0.33 + +$ MT_SLUDGECHUNK +spawnstate S_SLUDGECHUNK1 +deathstate S_SLUDGECHUNKX +radius 2 +height 4 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF +flags2 MF2_NOTELEPORT|MF2_LOGRAV|MF2_CANNOTPUSH + +$ MT_SLUDGESPLASH +spawnstate S_SLUDGESPLASH1 +flags MF_NOBLOCKMAP + +S_SPLASH1 SPSH A 8 NULL S_SPLASH2 +S_SPLASH2 SPSH B 8 NULL S_SPLASH3 +S_SPLASH3 SPSH C 8 NULL S_SPLASH4 +S_SPLASH4 SPSH D 16 NULL S_NULL + +S_SPLASHX SPSH D 10 NULL S_NULL + +S_SPLASHBASE1 SPSH E 5 NULL S_SPLASHBASE2 +S_SPLASHBASE2 SPSH F 5 NULL S_SPLASHBASE3 +S_SPLASHBASE3 SPSH G 5 NULL S_SPLASHBASE4 +S_SPLASHBASE4 SPSH H 5 NULL S_SPLASHBASE5 +S_SPLASHBASE5 SPSH I 5 NULL S_SPLASHBASE6 +S_SPLASHBASE6 SPSH J 5 NULL S_SPLASHBASE7 +S_SPLASHBASE7 SPSH K 5 NULL S_NULL + +S_LAVASPLASH1 LVAS A* 5 NULL S_LAVASPLASH2 +S_LAVASPLASH2 LVAS B* 5 NULL S_LAVASPLASH3 +S_LAVASPLASH3 LVAS C* 5 NULL S_LAVASPLASH4 +S_LAVASPLASH4 LVAS D* 5 NULL S_LAVASPLASH5 +S_LAVASPLASH5 LVAS E* 5 NULL S_LAVASPLASH6 +S_LAVASPLASH6 LVAS F* 5 NULL S_NULL + +S_LAVASMOKE1 LVAS G* 5 NULL S_LAVASMOKE2 +S_LAVASMOKE2 LVAS H* 5 NULL S_LAVASMOKE3 +S_LAVASMOKE3 LVAS I* 5 NULL S_LAVASMOKE4 +S_LAVASMOKE4 LVAS J* 5 NULL S_LAVASMOKE5 +S_LAVASMOKE5 LVAS K* 5 NULL S_NULL + +S_SLUDGECHUNK1 SLDG A 8 NULL S_SLUDGECHUNK2 +S_SLUDGECHUNK2 SLDG B 8 NULL S_SLUDGECHUNK3 +S_SLUDGECHUNK3 SLDG C 8 NULL S_SLUDGECHUNK4 +S_SLUDGECHUNK4 SLDG D 8 NULL S_NULL + +S_SLUDGECHUNKX SLDG D 6 NULL S_NULL + +S_SLUDGESPLASH1 SLDG E 5 NULL S_SLUDGESPLASH2 +S_SLUDGESPLASH2 SLDG F 5 NULL S_SLUDGESPLASH3 +S_SLUDGESPLASH3 SLDG G 5 NULL S_SLUDGESPLASH4 +S_SLUDGESPLASH4 SLDG H 5 NULL S_NULL + + +// +// scenery +// + +$ MT_SKULLHANG70 +doomednum 17 +spawnstate S_SKULLHANG70_1 +height 70 +flags MF_SPAWNCEILING|MF_NOGRAVITY + +$ MT_SKULLHANG60 +doomednum 24 +spawnstate S_SKULLHANG60_1 +height 60 +flags MF_SPAWNCEILING|MF_NOGRAVITY + +$ MT_SKULLHANG45 +doomednum 25 +spawnstate S_SKULLHANG45_1 +height 45 +flags MF_SPAWNCEILING|MF_NOGRAVITY + +$ MT_SKULLHANG35 +doomednum 26 +spawnstate S_SKULLHANG35_1 +height 35 +flags MF_SPAWNCEILING|MF_NOGRAVITY + +$ MT_CHANDELIER +doomednum 28 +spawnstate S_CHANDELIER1 +height 60 +flags MF_SPAWNCEILING|MF_NOGRAVITY + +$ MT_SERPTORCH +doomednum 27 +spawnstate S_SERPTORCH1 +radius 12 +height 54 +flags MF_SOLID + +$ MT_SMALLPILLAR +doomednum 29 +spawnstate S_SMALLPILLAR +radius 16 +height 34 +flags MF_SOLID + +$ MT_STALAGMITESMALL +doomednum 37 +spawnstate S_STALAGMITESMALL +radius 8 +height 32 +flags MF_SOLID + +$ MT_STALAGMITELARGE +doomednum 38 +spawnstate S_STALAGMITELARGE +radius 12 +height 64 +flags MF_SOLID + +$ MT_STALACTITESMALL +doomednum 39 +spawnstate S_STALACTITESMALL +radius 8 +height 36 +flags MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY + +$ MT_STALACTITELARGE +doomednum 40 +spawnstate S_STALACTITELARGE +radius 12 +height 68 +flags MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY + +$ + +doomednum 76 +spawnstate S_FIREBRAZIER1 +radius 16 +height 44 +flags MF_SOLID + +$ MT_BARREL +doomednum 44 +spawnstate S_BARREL +radius 12 +height 32 +flags MF_SOLID + +$ + +doomednum 47 +spawnstate S_BRPILLAR +radius 14 +height 128 +flags MF_SOLID + +$ + +doomednum 48 +spawnstate S_MOSS1 +height 23 +flags MF_SPAWNCEILING|MF_NOGRAVITY + +$ + +doomednum 49 +spawnstate S_MOSS2 +height 27 +flags MF_SPAWNCEILING|MF_NOGRAVITY + +$ + +doomednum 50 +spawnstate S_WALLTORCH1 +flags MF_NOGRAVITY + +$ + +doomednum 51 +spawnstate S_HANGINGCORPSE +radius 8 +height 104 +flags MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY + + +S_SKULLHANG70_1 SKH1 A -1 NULL S_NULL +S_SKULLHANG60_1 SKH2 A -1 NULL S_NULL +S_SKULLHANG45_1 SKH3 A -1 NULL S_NULL +S_SKULLHANG35_1 SKH4 A -1 NULL S_NULL + +S_CHANDELIER1 CHDL A 4 NULL S_CHANDELIER2 +S_CHANDELIER2 CHDL B 4 NULL S_CHANDELIER3 +S_CHANDELIER3 CHDL C 4 NULL S_CHANDELIER1 + +S_SERPTORCH1 SRTC A 4 NULL S_SERPTORCH2 +S_SERPTORCH2 SRTC B 4 NULL S_SERPTORCH3 +S_SERPTORCH3 SRTC C 4 NULL S_SERPTORCH1 + +S_SMALLPILLAR SMPL A -1 NULL S_NULL + +S_STALAGMITESMALL STGS A -1 NULL S_NULL +S_STALAGMITELARGE STGL A -1 NULL S_NULL +S_STALACTITESMALL STCS A -1 NULL S_NULL +S_STALACTITELARGE STCL A -1 NULL S_NULL + +S_FIREBRAZIER1 KFR1 A* 3 NULL S_FIREBRAZIER2 +S_FIREBRAZIER2 KFR1 B* 3 NULL S_FIREBRAZIER3 +S_FIREBRAZIER3 KFR1 C* 3 NULL S_FIREBRAZIER4 +S_FIREBRAZIER4 KFR1 D* 3 NULL S_FIREBRAZIER5 +S_FIREBRAZIER5 KFR1 E* 3 NULL S_FIREBRAZIER6 +S_FIREBRAZIER6 KFR1 F* 3 NULL S_FIREBRAZIER7 +S_FIREBRAZIER7 KFR1 G* 3 NULL S_FIREBRAZIER8 +S_FIREBRAZIER8 KFR1 H* 3 NULL S_FIREBRAZIER1 + +S_BARREL BARL A -1 NULL S_NULL + +S_BRPILLAR BRPL A -1 NULL S_NULL + +S_MOSS1 MOS1 A -1 NULL S_NULL +S_MOSS2 MOS2 A -1 NULL S_NULL + +S_WALLTORCH1 WTRH A* 6 NULL S_WALLTORCH2 +S_WALLTORCH2 WTRH B* 6 NULL S_WALLTORCH3 +S_WALLTORCH3 WTRH C* 6 NULL S_WALLTORCH1 + +S_HANGINGCORPSE HCOR A -1 NULL S_NULL + + +// +// key gizmo +// + +$ MT_KEYGIZMOBLUE +doomednum 94 +spawnstate S_KEYGIZMO1 +radius 16 +height 50 +flags MF_SOLID + +$ MT_KEYGIZMOGREEN +doomednum 95 +spawnstate S_KEYGIZMO1 +radius 16 +height 50 +flags MF_SOLID + +$ MT_KEYGIZMOYELLOW +doomednum 96 +spawnstate S_KEYGIZMO1 +radius 16 +height 50 +flags MF_SOLID + +$ MT_KEYGIZMOFLOAT +spawnstate S_KGZ_START +radius 16 +flags MF_SOLID|MF_NOGRAVITY + +S_KEYGIZMO1 KGZ1 A 1 NULL S_KEYGIZMO2 +S_KEYGIZMO2 KGZ1 A 1 A_InitKeyGizmo S_KEYGIZMO3 +S_KEYGIZMO3 KGZ1 A -1 NULL S_NULL + +S_KGZ_START KGZB A 1 NULL S_KGZ_START + +S_KGZ_BLUEFLOAT1 KGZB A* -1 NULL S_NULL +S_KGZ_GREENFLOAT1 KGZG A* -1 NULL S_NULL +S_KGZ_YELLOWFLOAT1 KGZY A* -1 NULL S_NULL + + +// +// volcano +// + +$ + +doomednum 87 +spawnstate S_VOLCANO1 +radius 12 +height 20 +flags MF_SOLID + +$ MT_VOLCANOBLAST +spawnstate S_VOLCANOBALL1 +deathstate S_VOLCANOBALLX1 +deathsound sfx_volhit +speed 2 +radius 8 +height 8 +damage 2 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF +flags2 MF2_LOGRAV|MF2_NOTELEPORT|MF2_FIREDAMAGE + +$ MT_VOLCANOTBLAST +spawnstate S_VOLCANOTBALL1 +deathstate S_VOLCANOTBALLX1 +speed 2 +radius 8 +height 6 +damage 1 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF +flags2 MF2_LOGRAV|MF2_NOTELEPORT|MF2_FIREDAMAGE + + +S_VOLCANO1 VLCO A 350 NULL S_VOLCANO2 +S_VOLCANO2 VLCO A 35 A_VolcanoSet S_VOLCANO3 +S_VOLCANO3 VLCO B 3 NULL S_VOLCANO4 +S_VOLCANO4 VLCO C 3 NULL S_VOLCANO5 +S_VOLCANO5 VLCO D 3 NULL S_VOLCANO6 +S_VOLCANO6 VLCO B 3 NULL S_VOLCANO7 +S_VOLCANO7 VLCO C 3 NULL S_VOLCANO8 +S_VOLCANO8 VLCO D 3 NULL S_VOLCANO9 +S_VOLCANO9 VLCO E 10 A_VolcanoBlast S_VOLCANO2 + +S_VOLCANOBALL1 VFBL A 4 A_BeastPuff S_VOLCANOBALL2 +S_VOLCANOBALL2 VFBL B 4 A_BeastPuff S_VOLCANOBALL1 + +S_VOLCANOBALLX1 XPL1 A 4 A_VolcBallImpact S_VOLCANOBALLX2 +S_VOLCANOBALLX2 XPL1 B 4 NULL S_VOLCANOBALLX3 +S_VOLCANOBALLX3 XPL1 C 4 NULL S_VOLCANOBALLX4 +S_VOLCANOBALLX4 XPL1 D 4 NULL S_VOLCANOBALLX5 +S_VOLCANOBALLX5 XPL1 E 4 NULL S_VOLCANOBALLX6 +S_VOLCANOBALLX6 XPL1 F 4 NULL S_NULL + +S_VOLCANOTBALL1 VTFB A 4 NULL S_VOLCANOTBALL2 +S_VOLCANOTBALL2 VTFB B 4 NULL S_VOLCANOTBALL1 + +S_VOLCANOTBALLX1 SFFI C 4 NULL S_VOLCANOTBALLX2 +S_VOLCANOTBALLX2 SFFI B 4 NULL S_VOLCANOTBALLX3 +S_VOLCANOTBALLX3 SFFI A 4 NULL S_VOLCANOTBALLX4 +S_VOLCANOTBALLX4 SFFI B 4 NULL S_VOLCANOTBALLX5 +S_VOLCANOTBALLX5 SFFI C 4 NULL S_VOLCANOTBALLX6 +S_VOLCANOTBALLX6 SFFI D 4 NULL S_VOLCANOTBALLX7 +S_VOLCANOTBALLX7 SFFI E 4 NULL S_NULL + + +// +// teleporter stuff +// + +$ MT_TELEGLITGEN +doomednum 74 +spawnstate S_TELEGLITGEN1 +flags MF_NOBLOCKMAP|MF_NOGRAVITY|MF_NOSECTOR + +$ MT_TELEGLITGEN2 +doomednum 52 +spawnstate S_TELEGLITGEN2 +flags MF_NOBLOCKMAP|MF_NOGRAVITY|MF_NOSECTOR + +$ MT_TELEGLITTER +spawnstate S_TELEGLITTER1_1 +flags MF_NOBLOCKMAP|MF_NOGRAVITY|MF_MISSILE + +$ MT_TELEGLITTER2 +spawnstate S_TELEGLITTER2_1 +flags MF_NOBLOCKMAP|MF_NOGRAVITY|MF_MISSILE + +$ MT_TFOG +spawnstate S_TFOG1 +flags MF_NOBLOCKMAP|MF_NOGRAVITY + +$ MT_TELEPORTMAN +doomednum 14 +flags MF_NOBLOCKMAP|MF_NOSECTOR + +S_TELEGLITGEN1 TGLT A 8 A_SpawnTeleGlitter S_TELEGLITGEN1 +S_TELEGLITGEN2 TGLT F 8 A_SpawnTeleGlitter2 S_TELEGLITGEN2 + +S_TELEGLITTER1_1 TGLT A* 2 NULL S_TELEGLITTER1_2 +S_TELEGLITTER1_2 TGLT B* 2 A_AccTeleGlitter S_TELEGLITTER1_3 +S_TELEGLITTER1_3 TGLT C* 2 NULL S_TELEGLITTER1_4 +S_TELEGLITTER1_4 TGLT D* 2 A_AccTeleGlitter S_TELEGLITTER1_5 +S_TELEGLITTER1_5 TGLT E* 2 NULL S_TELEGLITTER1_1 + +S_TELEGLITTER2_1 TGLT F* 2 NULL S_TELEGLITTER2_2 +S_TELEGLITTER2_2 TGLT G* 2 A_AccTeleGlitter S_TELEGLITTER2_3 +S_TELEGLITTER2_3 TGLT H* 2 NULL S_TELEGLITTER2_4 +S_TELEGLITTER2_4 TGLT I* 2 A_AccTeleGlitter S_TELEGLITTER2_5 +S_TELEGLITTER2_5 TGLT J* 2 NULL S_TELEGLITTER2_1 + +S_TFOG1 TELE A* 6 NULL S_TFOG2 +S_TFOG2 TELE B* 6 NULL S_TFOG3 +S_TFOG3 TELE C* 6 NULL S_TFOG4 +S_TFOG4 TELE D* 6 NULL S_TFOG5 +S_TFOG5 TELE E* 6 NULL S_TFOG6 +S_TFOG6 TELE F* 6 NULL S_TFOG7 +S_TFOG7 TELE G* 6 NULL S_TFOG8 +S_TFOG8 TELE H* 6 NULL S_TFOG9 +S_TFOG9 TELE G* 6 NULL S_TFOG10 +S_TFOG10 TELE F* 6 NULL S_TFOG11 +S_TFOG11 TELE E* 6 NULL S_TFOG12 +S_TFOG12 TELE D* 6 NULL S_TFOG13 +S_TFOG13 TELE C* 6 NULL S_NULL + + +//============================================================================ +// player sprites +//============================================================================ + +// all flashes go to S_LIGHTDONE to reset the light then remove self +S_LIGHTDONE STFF A 0 A_Light0 S_NULL + +// +// staff +// +$ MT_STAFFPUFF +spawnstate S_STAFFPUFF1 +attacksound sfx_stfhit +flags MF_NOBLOCKMAP|MF_NOGRAVITY + +$ MT_STAFFPUFF2 +spawnstate S_STAFFPUFF2_1 +attacksound sfx_stfpow +flags MF_NOBLOCKMAP|MF_NOGRAVITY + +S_STAFFREADY STFF A 1 A_WeaponReady S_STAFFREADY +S_STAFFDOWN STFF A 1 A_Lower S_STAFFDOWN +S_STAFFUP STFF A 1 A_Raise S_STAFFUP + +S_STAFFREADY2_1 STFF D 4 A_WeaponReady S_STAFFREADY2_2 +S_STAFFREADY2_2 STFF E 4 A_WeaponReady S_STAFFREADY2_3 +S_STAFFREADY2_3 STFF F 4 A_WeaponReady S_STAFFREADY2_1 + +S_STAFFDOWN2 STFF D 1 A_Lower S_STAFFDOWN2 +S_STAFFUP2 STFF D 1 A_Raise S_STAFFUP2 + +S_STAFFATK1_1 STFF B 6 NULL S_STAFFATK1_2 +S_STAFFATK1_2 STFF C 8 A_StaffAttackPL1 S_STAFFATK1_3 +S_STAFFATK1_3 STFF B 8 A_ReFire S_STAFFREADY + +S_STAFFATK2_1 STFF G 6 NULL S_STAFFATK2_2 +S_STAFFATK2_2 STFF H 8 A_StaffAttackPL2 S_STAFFATK2_3 +S_STAFFATK2_3 STFF G 8 A_ReFire S_STAFFREADY2_1 + +S_STAFFPUFF1 PUF3 A* 4 NULL S_STAFFPUFF2 +S_STAFFPUFF2 PUF3 B 4 NULL S_STAFFPUFF3 +S_STAFFPUFF3 PUF3 C 4 NULL S_STAFFPUFF4 +S_STAFFPUFF4 PUF3 D 4 NULL S_NULL + +S_STAFFPUFF2_1 PUF4 A* 4 NULL S_STAFFPUFF2_2 +S_STAFFPUFF2_2 PUF4 B* 4 NULL S_STAFFPUFF2_3 +S_STAFFPUFF2_3 PUF4 C* 4 NULL S_STAFFPUFF2_4 +S_STAFFPUFF2_4 PUF4 D* 4 NULL S_STAFFPUFF2_5 +S_STAFFPUFF2_5 PUF4 E* 4 NULL S_STAFFPUFF2_6 +S_STAFFPUFF2_6 PUF4 F* 4 NULL S_NULL + + +// +// beak +// +$ MT_BEAKPUFF +spawnstate S_STAFFPUFF1 +attacksound sfx_chicatk +flags MF_NOBLOCKMAP|MF_NOGRAVITY + +S_BEAKREADY BEAK A 1 A_BeakReady S_BEAKREADY +S_BEAKDOWN BEAK A 1 A_Lower S_BEAKDOWN +S_BEAKUP BEAK A 1 A_BeakRaise S_BEAKUP + +S_BEAKATK1_1 BEAK A 18 A_BeakAttackPL1 S_BEAKREADY +S_BEAKATK2_1 BEAK A 12 A_BeakAttackPL2 S_BEAKREADY + + +// +// gauntlets +// +$ + +doomednum 2005 +spawnstate S_WGNT +flags MF_SPECIAL + +$ MT_GAUNTLETPUFF1 +spawnstate S_GAUNTLETPUFF1_1 +flags MF_NOBLOCKMAP|MF_NOGRAVITY +translucency 0.33 + +$ MT_GAUNTLETPUFF2 +spawnstate S_GAUNTLETPUFF2_1 +flags MF_NOBLOCKMAP|MF_NOGRAVITY +translucency 0.33 + +S_WGNT WGNT A -1 NULL S_NULL + +S_GAUNTLETREADY GAUN A 1 A_WeaponReady S_GAUNTLETREADY +S_GAUNTLETDOWN GAUN A 1 A_Lower S_GAUNTLETDOWN +S_GAUNTLETUP GAUN A 1 A_Raise S_GAUNTLETUP + +S_GAUNTLETREADY2_1 GAUN G 4 A_WeaponReady S_GAUNTLETREADY2_2 +S_GAUNTLETREADY2_2 GAUN H 4 A_WeaponReady S_GAUNTLETREADY2_3 +S_GAUNTLETREADY2_3 GAUN I 4 A_WeaponReady S_GAUNTLETREADY2_1 + +S_GAUNTLETDOWN2 GAUN G 1 A_Lower S_GAUNTLETDOWN2 +S_GAUNTLETUP2 GAUN G 1 A_Raise S_GAUNTLETUP2 + +S_GAUNTLETATK1_1 GAUN B 4 NULL S_GAUNTLETATK1_2 +S_GAUNTLETATK1_2 GAUN C 4 NULL S_GAUNTLETATK1_3 +S_GAUNTLETATK1_3 GAUN D* 4 A_GauntletAttack S_GAUNTLETATK1_4 +S_GAUNTLETATK1_4 GAUN E* 4 A_GauntletAttack S_GAUNTLETATK1_5 +S_GAUNTLETATK1_5 GAUN F* 4 A_GauntletAttack S_GAUNTLETATK1_6 +S_GAUNTLETATK1_6 GAUN C 4 A_ReFire S_GAUNTLETATK1_7 +S_GAUNTLETATK1_7 GAUN B 4 A_Light0 S_GAUNTLETREADY +S_GAUNTLETATK2_1 GAUN J 4 NULL S_GAUNTLETATK2_2 +S_GAUNTLETATK2_2 GAUN K 4 NULL S_GAUNTLETATK2_3 +S_GAUNTLETATK2_3 GAUN L* 4 A_GauntletAttack S_GAUNTLETATK2_4 +S_GAUNTLETATK2_4 GAUN M* 4 A_GauntletAttack S_GAUNTLETATK2_5 +S_GAUNTLETATK2_5 GAUN N* 4 A_GauntletAttack S_GAUNTLETATK2_6 +S_GAUNTLETATK2_6 GAUN K 4 A_ReFire S_GAUNTLETATK2_7 +S_GAUNTLETATK2_7 GAUN J 4 A_Light0 S_GAUNTLETREADY2_1 + +S_GAUNTLETPUFF1_1 PUF1 A* 4 NULL S_GAUNTLETPUFF1_2 +S_GAUNTLETPUFF1_2 PUF1 B* 4 NULL S_GAUNTLETPUFF1_3 +S_GAUNTLETPUFF1_3 PUF1 C* 4 NULL S_GAUNTLETPUFF1_4 +S_GAUNTLETPUFF1_4 PUF1 D* 4 NULL S_NULL + +S_GAUNTLETPUFF2_1 PUF1 E* 4 NULL S_GAUNTLETPUFF2_2 +S_GAUNTLETPUFF2_2 PUF1 F* 4 NULL S_GAUNTLETPUFF2_3 +S_GAUNTLETPUFF2_3 PUF1 G* 4 NULL S_GAUNTLETPUFF2_4 +S_GAUNTLETPUFF2_4 PUF1 H* 4 NULL S_NULL + + +// +// blaster +// +$ + +doomednum 53 +spawnstate S_BLSR +flags MF_SPECIAL + +$ MT_BLASTERFX1 +spawnstate S_BLASTERFX1_1 +deathstate S_BLASTERFXI1_1 +deathsound sfx_blshit +speed 184 +radius 12 +height 8 +damage 2 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_NOTELEPORT + +$ MT_BLASTERSMOKE +spawnstate S_BLASTERSMOKE1 +flags MF_NOBLOCKMAP|MF_NOGRAVITY +flags2 MF2_NOTELEPORT|MF2_CANNOTPUSH +translucency 0.33 + +$ MT_RIPPER +spawnstate S_RIPPER1 +seesound 0 +deathstate S_RIPPERX1 +deathsound sfx_hrnhit +speed 14 +radius 8 +height 6 +damage 1 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_NOTELEPORT|MF2_RIP + +$ MT_BLASTERPUFF1 +spawnstate S_BLASTERPUFF1_1 +flags MF_NOBLOCKMAP|MF_NOGRAVITY + +$ MT_BLASTERPUFF2 +spawnstate S_BLASTERPUFF2_1 +flags MF_NOBLOCKMAP|MF_NOGRAVITY + +S_BLSR WBLS A -1 NULL S_NULL + +S_BLASTERREADY BLSR A 1 A_WeaponReady S_BLASTERREADY +S_BLASTERDOWN BLSR A 1 A_Lower S_BLASTERDOWN +S_BLASTERUP BLSR A 1 A_Raise S_BLASTERUP + +S_BLASTERATK1_1 BLSR B 3 NULL S_BLASTERATK1_2 +S_BLASTERATK1_2 BLSR C 3 NULL S_BLASTERATK1_3 +S_BLASTERATK1_3 BLSR D 2 A_FireBlasterPL1 S_BLASTERATK1_4 +S_BLASTERATK1_4 BLSR C 2 NULL S_BLASTERATK1_5 +S_BLASTERATK1_5 BLSR B 2 NULL S_BLASTERATK1_6 +S_BLASTERATK1_6 BLSR A 0 A_ReFire S_BLASTERREADY + +S_BLASTERATK2_1 BLSR B 0 NULL S_BLASTERATK2_2 +S_BLASTERATK2_2 BLSR C 0 NULL S_BLASTERATK2_3 +S_BLASTERATK2_3 BLSR D 3 A_FireBlasterPL2 S_BLASTERATK2_4 +S_BLASTERATK2_4 BLSR C 4 NULL S_BLASTERATK2_5 +S_BLASTERATK2_5 BLSR B 4 NULL S_BLASTERATK2_6 +S_BLASTERATK2_6 BLSR A 0 A_ReFire S_BLASTERREADY + +S_BLASTERFX1_1 ACLO E 200 NULL S_BLASTERFX1_1 + +S_BLASTERFXI1_1 FX18 A* 3 A_SpawnRippers S_BLASTERFXI1_2 +S_BLASTERFXI1_2 FX18 B* 3 NULL S_BLASTERFXI1_3 +S_BLASTERFXI1_3 FX18 C* 4 NULL S_BLASTERFXI1_4 +S_BLASTERFXI1_4 FX18 D* 4 NULL S_BLASTERFXI1_5 +S_BLASTERFXI1_5 FX18 E* 4 NULL S_BLASTERFXI1_6 +S_BLASTERFXI1_6 FX18 F* 4 NULL S_BLASTERFXI1_7 +S_BLASTERFXI1_7 FX18 G* 4 NULL S_NULL + +S_BLASTERSMOKE1 FX18 H 4 NULL S_BLASTERSMOKE2 +S_BLASTERSMOKE2 FX18 I 4 NULL S_BLASTERSMOKE3 +S_BLASTERSMOKE3 FX18 J 4 NULL S_BLASTERSMOKE4 +S_BLASTERSMOKE4 FX18 K 4 NULL S_BLASTERSMOKE5 +S_BLASTERSMOKE5 FX18 L 4 NULL S_NULL + +S_RIPPER1 FX18 M 4 NULL S_RIPPER2 +S_RIPPER2 FX18 N 5 NULL S_RIPPER1 + +S_RIPPERX1 FX18 O* 4 NULL S_RIPPERX2 +S_RIPPERX2 FX18 P* 4 NULL S_RIPPERX3 +S_RIPPERX3 FX18 Q* 4 NULL S_RIPPERX4 +S_RIPPERX4 FX18 R* 4 NULL S_RIPPERX5 +S_RIPPERX5 FX18 S* 4 NULL S_NULL + +S_BLASTERPUFF1_1 FX17 A* 4 NULL S_BLASTERPUFF1_2 +S_BLASTERPUFF1_2 FX17 B* 4 NULL S_BLASTERPUFF1_3 +S_BLASTERPUFF1_3 FX17 C* 4 NULL S_BLASTERPUFF1_4 +S_BLASTERPUFF1_4 FX17 D* 4 NULL S_BLASTERPUFF1_5 +S_BLASTERPUFF1_5 FX17 E* 4 NULL S_NULL + +S_BLASTERPUFF2_1 FX17 F* 3 NULL S_BLASTERPUFF2_2 +S_BLASTERPUFF2_2 FX17 G* 3 NULL S_BLASTERPUFF2_3 +S_BLASTERPUFF2_3 FX17 H* 4 NULL S_BLASTERPUFF2_4 +S_BLASTERPUFF2_4 FX17 I* 4 NULL S_BLASTERPUFF2_5 +S_BLASTERPUFF2_5 FX17 J* 4 NULL S_BLASTERPUFF2_6 +S_BLASTERPUFF2_6 FX17 K* 4 NULL S_BLASTERPUFF2_7 +S_BLASTERPUFF2_7 FX17 L* 4 NULL S_NULL + + +// +// mace +// +$ MT_WMACE +doomednum 2002 +spawnstate S_WMCE +flags MF_SPECIAL + +$ MT_MACEFX1 +spawnstate S_MACEFX1_1 +seesound sfx_lobsht +deathstate S_MACEFXI1_1 +deathsound 0 +speed 20 +radius 8 +height 6 +damage 2 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_FLOORBOUNCE|MF2_THRUGHOST|MF2_NOTELEPORT + +$ MT_MACEFX2 +spawnstate S_MACEFX2_1 +seesound 0 +deathstate S_MACEFXI2_1 +deathsound 0 +speed 10 +radius 8 +height 6 +damage 6 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF +flags2 MF2_LOGRAV|MF2_FLOORBOUNCE|MF2_THRUGHOST|MF2_NOTELEPORT + +$ MT_MACEFX3 +spawnstate S_MACEFX3_1 +seesound 0 +deathstate S_MACEFXI1_1 +deathsound 0 +speed 7 +radius 8 +height 6 +damage 4 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF +flags2 MF2_LOGRAV|MF2_FLOORBOUNCE|MF2_THRUGHOST|MF2_NOTELEPORT + +$ MT_MACEFX4 +spawnstate S_MACEFX4_1 +seesound 0 +deathstate S_MACEFXI4_1 +deathsound 0 +speed 7 +radius 8 +height 6 +damage 18 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF +flags2 MF2_LOGRAV|MF2_FLOORBOUNCE|MF2_THRUGHOST|MF2_TELESTOMP + +S_WMCE WMCE A -1 NULL S_NULL + +S_MACEREADY MACE A 1 A_WeaponReady S_MACEREADY +S_MACEDOWN MACE A 1 A_Lower S_MACEDOWN +S_MACEUP MACE A 1 A_Raise S_MACEUP + +S_MACEATK1_1 MACE B 4 NULL S_MACEATK1_2 +S_MACEATK1_2 MACE C 3 A_FireMacePL1 S_MACEATK1_3 +S_MACEATK1_3 MACE D 3 A_FireMacePL1 S_MACEATK1_4 +S_MACEATK1_4 MACE E 3 A_FireMacePL1 S_MACEATK1_5 +S_MACEATK1_5 MACE F 3 A_FireMacePL1 S_MACEATK1_6 +S_MACEATK1_6 MACE C 4 A_ReFire S_MACEATK1_7 +S_MACEATK1_7 MACE D 4 NULL S_MACEATK1_8 +S_MACEATK1_8 MACE E 4 NULL S_MACEATK1_9 +S_MACEATK1_9 MACE F 4 NULL S_MACEATK1_10 +S_MACEATK1_10 MACE B 4 NULL S_MACEREADY + +S_MACEATK2_1 MACE B 4 NULL S_MACEATK2_2 +S_MACEATK2_2 MACE D 4 A_FireMacePL2 S_MACEATK2_3 +S_MACEATK2_3 MACE B 4 NULL S_MACEATK2_4 +S_MACEATK2_4 MACE A 8 A_ReFire S_MACEREADY + +S_MACEFX1_1 FX02 A 4 A_MacePL1Check S_MACEFX1_2 +S_MACEFX1_2 FX02 B 4 A_MacePL1Check S_MACEFX1_1 + +S_MACEFXI1_1 FX02 F* 4 A_MaceBallImpact S_MACEFXI1_2 +S_MACEFXI1_2 FX02 G* 4 NULL S_MACEFXI1_3 +S_MACEFXI1_3 FX02 H* 4 NULL S_MACEFXI1_4 +S_MACEFXI1_4 FX02 I* 4 NULL S_MACEFXI1_5 +S_MACEFXI1_5 FX02 J* 4 NULL S_NULL + +S_MACEFX2_1 FX02 C 4 NULL S_MACEFX2_2 +S_MACEFX2_2 FX02 D 4 NULL S_MACEFX2_1 + +S_MACEFXI2_1 FX02 F* 4 A_MaceBallImpact2 S_MACEFXI1_2 + +S_MACEFX3_1 FX02 A 4 NULL S_MACEFX3_2 +S_MACEFX3_2 FX02 B 4 NULL S_MACEFX3_1 + +S_MACEFX4_1 FX02 E 99 NULL S_MACEFX4_1 + +S_MACEFXI4_1 FX02 C* 4 A_DeathBallImpact S_MACEFXI1_2 + + +// +// skull rod +// +$ MT_WSKULLROD +doomednum 2004 +spawnstate S_WSKL +flags MF_SPECIAL + +$ MT_HORNRODFX1 +spawnstate S_HRODFX1_1 +seesound sfx_hrnsht +deathstate S_HRODFXI1_1 +deathsound sfx_hrnhit +speed 22 +radius 12 +height 8 +damage 3 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_WINDTHRUST|MF2_NOTELEPORT + +$ MT_HORNRODFX2 +spawnstate S_HRODFX2_1 +spawnhealth 140 +seesound sfx_hrnsht +deathstate S_HRODFXI2_1 +deathsound sfx_ramphit +speed 22 +radius 12 +height 8 +damage 10 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_NOTELEPORT + +$ MT_RAINPLR1 +spawnstate S_RAINPLR1_1 +seesound 0 +deathstate S_RAINPLR1X_1 +deathsound 0 +speed 12 +radius 5 +height 12 +damage 5 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_NOTELEPORT + +$ MT_RAINPLR2 +spawnstate S_RAINPLR2_1 +seesound 0 +deathstate S_RAINPLR2X_1 +deathsound 0 +speed 12 +radius 5 +height 12 +damage 5 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_NOTELEPORT + +$ MT_RAINPLR3 +spawnstate S_RAINPLR3_1 +seesound 0 +deathstate S_RAINPLR3X_1 +deathsound 0 +speed 12 +radius 5 +height 12 +damage 5 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_NOTELEPORT + +$ MT_RAINPLR4 +spawnstate S_RAINPLR4_1 +seesound 0 +deathstate S_RAINPLR4X_1 +deathsound 0 +speed 12 +radius 5 +height 12 +damage 5 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_NOTELEPORT + +S_WSKL WSKL A -1 NULL S_NULL + +S_HORNRODREADY HROD A 1 A_WeaponReady S_HORNRODREADY +S_HORNRODDOWN HROD A 1 A_Lower S_HORNRODDOWN +S_HORNRODUP HROD A 1 A_Raise S_HORNRODUP + +S_HORNRODATK1_1 HROD A 4 A_FireSkullRodPL1 S_HORNRODATK1_2 +S_HORNRODATK1_2 HROD B 4 A_FireSkullRodPL1 S_HORNRODATK1_3 +S_HORNRODATK1_3 HROD B 0 A_ReFire S_HORNRODREADY +S_HORNRODATK2_1 HROD C 2 NULL S_HORNRODATK2_2 +S_HORNRODATK2_2 HROD D 3 NULL S_HORNRODATK2_3 +S_HORNRODATK2_3 HROD E 2 NULL S_HORNRODATK2_4 +S_HORNRODATK2_4 HROD F 3 NULL S_HORNRODATK2_5 +S_HORNRODATK2_5 HROD G 4 A_FireSkullRodPL2 S_HORNRODATK2_6 +S_HORNRODATK2_6 HROD F 2 NULL S_HORNRODATK2_7 +S_HORNRODATK2_7 HROD E 3 NULL S_HORNRODATK2_8 +S_HORNRODATK2_8 HROD D 2 NULL S_HORNRODATK2_9 +S_HORNRODATK2_9 HROD C 2 A_ReFire S_HORNRODREADY + +S_HRODFX1_1 FX00 A* 6 NULL S_HRODFX1_2 +S_HRODFX1_2 FX00 B* 6 NULL S_HRODFX1_1 + +S_HRODFXI1_1 FX00 H* 5 NULL S_HRODFXI1_2 +S_HRODFXI1_2 FX00 I* 5 NULL S_HRODFXI1_3 +S_HRODFXI1_3 FX00 J* 4 NULL S_HRODFXI1_4 +S_HRODFXI1_4 FX00 K* 4 NULL S_HRODFXI1_5 +S_HRODFXI1_5 FX00 L* 3 NULL S_HRODFXI1_6 +S_HRODFXI1_6 FX00 M* 3 NULL S_NULL + +S_HRODFX2_1 FX00 C* 3 NULL S_HRODFX2_2 +S_HRODFX2_2 FX00 D* 3 A_SkullRodPL2Seek S_HRODFX2_3 +S_HRODFX2_3 FX00 E* 3 NULL S_HRODFX2_4 +S_HRODFX2_4 FX00 F* 3 A_SkullRodPL2Seek S_HRODFX2_1 + +S_HRODFXI2_1 FX00 H* 5 A_AddPlayerRain S_HRODFXI2_2 +S_HRODFXI2_2 FX00 I* 5 NULL S_HRODFXI2_3 +S_HRODFXI2_3 FX00 J* 4 NULL S_HRODFXI2_4 +S_HRODFXI2_4 FX00 K* 3 NULL S_HRODFXI2_5 +S_HRODFXI2_5 FX00 L* 3 NULL S_HRODFXI2_6 +S_HRODFXI2_6 FX00 M* 3 NULL S_HRODFXI2_7 +S_HRODFXI2_7 FX00 G 1 A_HideInCeiling S_HRODFXI2_8 +S_HRODFXI2_8 FX00 G 1 A_SkullRodStorm S_HRODFXI2_8 + +S_RAINPLR1_1 FX20 A* -1 NULL S_NULL +S_RAINPLR2_1 FX21 A* -1 NULL S_NULL +S_RAINPLR3_1 FX22 A* -1 NULL S_NULL +S_RAINPLR4_1 FX23 A* -1 NULL S_NULL + +S_RAINPLR1X_1 FX20 B* 4 A_RainImpact S_RAINPLR1X_2 +S_RAINPLR1X_2 FX20 C* 4 NULL S_RAINPLR1X_3 +S_RAINPLR1X_3 FX20 D* 4 NULL S_RAINPLR1X_4 +S_RAINPLR1X_4 FX20 E* 4 NULL S_RAINPLR1X_5 +S_RAINPLR1X_5 FX20 F* 4 NULL S_NULL + +S_RAINPLR2X_1 FX21 B* 4 A_RainImpact S_RAINPLR2X_2 +S_RAINPLR2X_2 FX21 C* 4 NULL S_RAINPLR2X_3 +S_RAINPLR2X_3 FX21 D* 4 NULL S_RAINPLR2X_4 +S_RAINPLR2X_4 FX21 E* 4 NULL S_RAINPLR2X_5 +S_RAINPLR2X_5 FX21 F* 4 NULL S_NULL + +S_RAINPLR3X_1 FX22 B* 4 A_RainImpact S_RAINPLR3X_2 +S_RAINPLR3X_2 FX22 C* 4 NULL S_RAINPLR3X_3 +S_RAINPLR3X_3 FX22 D* 4 NULL S_RAINPLR3X_4 +S_RAINPLR3X_4 FX22 E* 4 NULL S_RAINPLR3X_5 +S_RAINPLR3X_5 FX22 F* 4 NULL S_NULL + +S_RAINPLR4X_1 FX23 B* 4 A_RainImpact S_RAINPLR4X_2 +S_RAINPLR4X_2 FX23 C* 4 NULL S_RAINPLR4X_3 +S_RAINPLR4X_3 FX23 D* 4 NULL S_RAINPLR4X_4 +S_RAINPLR4X_4 FX23 E* 4 NULL S_RAINPLR4X_5 +S_RAINPLR4X_5 FX23 F* 4 NULL S_NULL + +S_RAINAIRXPLR1_1 FX20 G* 4 NULL S_RAINAIRXPLR1_2 +S_RAINAIRXPLR2_1 FX21 G* 4 NULL S_RAINAIRXPLR2_2 +S_RAINAIRXPLR3_1 FX22 G* 4 NULL S_RAINAIRXPLR3_2 +S_RAINAIRXPLR4_1 FX23 G* 4 NULL S_RAINAIRXPLR4_2 +S_RAINAIRXPLR1_2 FX20 H* 4 NULL S_RAINAIRXPLR1_3 +S_RAINAIRXPLR2_2 FX21 H* 4 NULL S_RAINAIRXPLR2_3 +S_RAINAIRXPLR3_2 FX22 H* 4 NULL S_RAINAIRXPLR3_3 +S_RAINAIRXPLR4_2 FX23 H* 4 NULL S_RAINAIRXPLR4_3 +S_RAINAIRXPLR1_3 FX20 I* 4 NULL S_NULL +S_RAINAIRXPLR2_3 FX21 I* 4 NULL S_NULL +S_RAINAIRXPLR3_3 FX22 I* 4 NULL S_NULL +S_RAINAIRXPLR4_3 FX23 I* 4 NULL S_NULL + + +// +// gold wand +// +$ MT_GOLDWANDFX1 +spawnstate S_GWANDFX1_1 +seesound 0 +deathstate S_GWANDFXI1_1 +deathsound sfx_gldhit +speed 22 +radius 10 +height 6 +damage 2 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_NOTELEPORT + +$ MT_GOLDWANDFX2 +spawnstate S_GWANDFX2_1 +seesound 0 +deathstate S_GWANDFXI1_1 +deathsound 0 +speed 18 +radius 10 +height 6 +damage 1 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_NOTELEPORT + +$ MT_GOLDWANDPUFF1 +spawnstate S_GWANDPUFF1_1 +flags MF_NOBLOCKMAP|MF_NOGRAVITY + +$ MT_GOLDWANDPUFF2 +spawnstate S_GWANDFXI1_1 +flags MF_NOBLOCKMAP|MF_NOGRAVITY + +S_GOLDWANDREADY GWND A 1 A_WeaponReady S_GOLDWANDREADY +S_GOLDWANDDOWN GWND A 1 A_Lower S_GOLDWANDDOWN +S_GOLDWANDUP GWND A 1 A_Raise S_GOLDWANDUP + +S_GOLDWANDATK1_1 GWND B 3 NULL S_GOLDWANDATK1_2 +S_GOLDWANDATK1_2 GWND C 5 A_FireGoldWandPL1 S_GOLDWANDATK1_3 +S_GOLDWANDATK1_3 GWND D 3 NULL S_GOLDWANDATK1_4 +S_GOLDWANDATK1_4 GWND D 0 A_ReFire S_GOLDWANDREADY + +S_GOLDWANDATK2_1 GWND B 3 NULL S_GOLDWANDATK2_2 +S_GOLDWANDATK2_2 GWND C 4 A_FireGoldWandPL2 S_GOLDWANDATK2_3 +S_GOLDWANDATK2_3 GWND D 3 NULL S_GOLDWANDATK2_4 +S_GOLDWANDATK2_4 GWND D 0 A_ReFire S_GOLDWANDREADY + +S_GWANDFX1_1 FX01 A* 6 NULL S_GWANDFX1_2 +S_GWANDFX1_2 FX01 B* 6 NULL S_GWANDFX1_1 + +S_GWANDFXI1_1 FX01 E* 3 NULL S_GWANDFXI1_2 +S_GWANDFXI1_2 FX01 F* 3 NULL S_GWANDFXI1_3 +S_GWANDFXI1_3 FX01 G* 3 NULL S_GWANDFXI1_4 +S_GWANDFXI1_4 FX01 H* 3 NULL S_NULL + +S_GWANDFX2_1 FX01 C* 6 NULL S_GWANDFX2_2 +S_GWANDFX2_2 FX01 D* 6 NULL S_GWANDFX2_1 + +S_GWANDPUFF1_1 PUF2 A* 3 NULL S_GWANDPUFF1_2 +S_GWANDPUFF1_2 PUF2 B* 3 NULL S_GWANDPUFF1_3 +S_GWANDPUFF1_3 PUF2 C* 3 NULL S_GWANDPUFF1_4 +S_GWANDPUFF1_4 PUF2 D* 3 NULL S_GWANDPUFF1_5 +S_GWANDPUFF1_5 PUF2 E* 3 NULL S_NULL + + +// +// phoenix rod +// +$ MT_WPHOENIXROD +doomednum 2003 +spawnstate S_WPHX +flags MF_SPECIAL + +$ MT_PHOENIXFX1 +spawnstate S_PHOENIXFX1_1 +seesound sfx_phosht +deathstate S_PHOENIXFXI1_1 +deathsound sfx_phohit +speed 20 +radius 11 +height 8 +damage 20 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_THRUGHOST|MF2_NOTELEPORT + +$ MT_PHOENIXPUFF +spawnstate S_PHOENIXPUFF1 +flags MF_NOBLOCKMAP|MF_NOGRAVITY +flags2 MF2_NOTELEPORT|MF2_CANNOTPUSH +translucency 0.33 + +$ MT_PHOENIXFX2 +spawnstate S_PHOENIXFX2_1 +seesound 0 +deathstate S_PHOENIXFXI2_1 +deathsound 0 +speed 10 +radius 6 +height 8 +damage 2 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_NOTELEPORT|MF2_FIREDAMAGE + +S_WPHX WPHX A -1 NULL S_NULL + +S_PHOENIXREADY PHNX A 1 A_WeaponReady S_PHOENIXREADY +S_PHOENIXDOWN PHNX A 1 A_Lower S_PHOENIXDOWN +S_PHOENIXUP PHNX A 1 A_Raise S_PHOENIXUP + +S_PHOENIXATK1_1 PHNX B 5 NULL S_PHOENIXATK1_2 +S_PHOENIXATK1_2 PHNX C 7 A_FirePhoenixPL1 S_PHOENIXATK1_3 +S_PHOENIXATK1_3 PHNX D 4 NULL S_PHOENIXATK1_4 +S_PHOENIXATK1_4 PHNX B 4 NULL S_PHOENIXATK1_5 +S_PHOENIXATK1_5 PHNX B 0 A_ReFire S_PHOENIXREADY + +S_PHOENIXATK2_1 PHNX B 3 A_InitPhoenixPL2 S_PHOENIXATK2_2 +S_PHOENIXATK2_2 PHNX C* 1 A_FirePhoenixPL2 S_PHOENIXATK2_3 +S_PHOENIXATK2_3 PHNX B 4 A_ReFire S_PHOENIXATK2_4 +S_PHOENIXATK2_4 PHNX B 4 A_ShutdownPhoenixPL2 S_PHOENIXREADY + +S_PHOENIXFX1_1 FX04 A* 4 A_PhoenixPuff S_PHOENIXFX1_1 + +S_PHOENIXFXI1_1 FX08 A* 6 A_Explode S_PHOENIXFXI1_2 +S_PHOENIXFXI1_2 FX08 B* 5 NULL S_PHOENIXFXI1_3 +S_PHOENIXFXI1_3 FX08 C* 5 NULL S_PHOENIXFXI1_4 +S_PHOENIXFXI1_4 FX08 D* 4 NULL S_PHOENIXFXI1_5 +S_PHOENIXFXI1_5 FX08 E* 4 NULL S_PHOENIXFXI1_6 +S_PHOENIXFXI1_6 FX08 F* 4 NULL S_PHOENIXFXI1_7 +S_PHOENIXFXI1_7 FX08 G* 4 NULL S_PHOENIXFXI1_8 +S_PHOENIXFXI1_8 FX08 H* 4 NULL S_NULL + +S_PHOENIXPUFF1 FX04 B 4 NULL S_PHOENIXPUFF2 +S_PHOENIXPUFF2 FX04 C 4 NULL S_PHOENIXPUFF3 +S_PHOENIXPUFF3 FX04 D 4 NULL S_PHOENIXPUFF4 +S_PHOENIXPUFF4 FX04 E 4 NULL S_PHOENIXPUFF5 +S_PHOENIXPUFF5 FX04 F 4 NULL S_NULL + +S_PHOENIXFX2_1 FX09 A* 2 NULL S_PHOENIXFX2_2 +S_PHOENIXFX2_2 FX09 B* 2 NULL S_PHOENIXFX2_3 +S_PHOENIXFX2_3 FX09 A* 2 NULL S_PHOENIXFX2_4 +S_PHOENIXFX2_4 FX09 B* 2 NULL S_PHOENIXFX2_5 +S_PHOENIXFX2_5 FX09 A* 2 NULL S_PHOENIXFX2_6 +S_PHOENIXFX2_6 FX09 B* 2 A_FlameEnd S_PHOENIXFX2_7 +S_PHOENIXFX2_7 FX09 C* 2 NULL S_PHOENIXFX2_8 +S_PHOENIXFX2_8 FX09 D* 2 NULL S_PHOENIXFX2_9 +S_PHOENIXFX2_9 FX09 E* 2 NULL S_PHOENIXFX2_10 +S_PHOENIXFX2_10 FX09 F* 2 NULL S_NULL + +S_PHOENIXFXI2_1 FX09 G* 3 NULL S_PHOENIXFXI2_2 +S_PHOENIXFXI2_2 FX09 H* 3 A_FloatPuff S_PHOENIXFXI2_3 +S_PHOENIXFXI2_3 FX09 I* 4 NULL S_PHOENIXFXI2_4 +S_PHOENIXFXI2_4 FX09 J* 5 NULL S_PHOENIXFXI2_5 +S_PHOENIXFXI2_5 FX09 K* 5 NULL S_NULL + + +// +// crossbow +// +$ + +doomednum 2001 +spawnstate S_WBOW +flags MF_SPECIAL + +$ MT_CRBOWFX1 +spawnstate S_CRBOWFX1 +seesound sfx_bowsht +deathstate S_CRBOWFXI1_1 +deathsound sfx_hrnhit +speed 30 +radius 11 +height 8 +damage 10 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_NOTELEPORT + +$ MT_CRBOWFX2 +spawnstate S_CRBOWFX2 +seesound sfx_bowsht +deathstate S_CRBOWFXI1_1 +deathsound sfx_hrnhit +speed 32 +radius 11 +height 8 +damage 6 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_NOTELEPORT + +$ MT_CRBOWFX3 +spawnstate S_CRBOWFX3 +seesound 0 +deathstate S_CRBOWFXI3_1 +deathsound sfx_hrnhit +speed 20 +radius 11 +height 8 +damage 2 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_WINDTHRUST|MF2_THRUGHOST|MF2_NOTELEPORT + +$ MT_CRBOWFX4 +spawnstate S_CRBOWFX4_1 +flags MF_NOBLOCKMAP +flags2 MF2_LOGRAV + +S_WBOW WBOW A -1 NULL S_NULL + +S_CRBOW1 CRBW A 1 A_WeaponReady S_CRBOW2 +S_CRBOW2 CRBW A 1 A_WeaponReady S_CRBOW3 +S_CRBOW3 CRBW A 1 A_WeaponReady S_CRBOW4 +S_CRBOW4 CRBW A 1 A_WeaponReady S_CRBOW5 +S_CRBOW5 CRBW A 1 A_WeaponReady S_CRBOW6 +S_CRBOW6 CRBW A 1 A_WeaponReady S_CRBOW7 +S_CRBOW7 CRBW B 1 A_WeaponReady S_CRBOW8 +S_CRBOW8 CRBW B 1 A_WeaponReady S_CRBOW9 +S_CRBOW9 CRBW B 1 A_WeaponReady S_CRBOW10 +S_CRBOW10 CRBW B 1 A_WeaponReady S_CRBOW11 +S_CRBOW11 CRBW B 1 A_WeaponReady S_CRBOW12 +S_CRBOW12 CRBW B 1 A_WeaponReady S_CRBOW13 +S_CRBOW13 CRBW C 1 A_WeaponReady S_CRBOW14 +S_CRBOW14 CRBW C 1 A_WeaponReady S_CRBOW15 +S_CRBOW15 CRBW C 1 A_WeaponReady S_CRBOW16 +S_CRBOW16 CRBW C 1 A_WeaponReady S_CRBOW17 +S_CRBOW17 CRBW C 1 A_WeaponReady S_CRBOW18 +S_CRBOW18 CRBW C 1 A_WeaponReady S_CRBOW1 + +S_CRBOWDOWN CRBW A 1 A_Lower S_CRBOWDOWN +S_CRBOWUP CRBW A 1 A_Raise S_CRBOWUP + +S_CRBOWATK1_1 CRBW D 6 A_FireCrossbowPL1 S_CRBOWATK1_2 +S_CRBOWATK1_2 CRBW E 3 NULL S_CRBOWATK1_3 +S_CRBOWATK1_3 CRBW F 3 NULL S_CRBOWATK1_4 +S_CRBOWATK1_4 CRBW G 3 NULL S_CRBOWATK1_5 +S_CRBOWATK1_5 CRBW H 3 NULL S_CRBOWATK1_6 +S_CRBOWATK1_6 CRBW A 4 NULL S_CRBOWATK1_7 +S_CRBOWATK1_7 CRBW B 4 NULL S_CRBOWATK1_8 +S_CRBOWATK1_8 CRBW C 5 A_ReFire S_CRBOW1 + +S_CRBOWATK2_1 CRBW D 5 A_FireCrossbowPL2 S_CRBOWATK2_2 +S_CRBOWATK2_2 CRBW E 3 NULL S_CRBOWATK2_3 +S_CRBOWATK2_3 CRBW F 2 NULL S_CRBOWATK2_4 +S_CRBOWATK2_4 CRBW G 3 NULL S_CRBOWATK2_5 +S_CRBOWATK2_5 CRBW H 2 NULL S_CRBOWATK2_6 +S_CRBOWATK2_6 CRBW A 3 NULL S_CRBOWATK2_7 +S_CRBOWATK2_7 CRBW B 3 NULL S_CRBOWATK2_8 +S_CRBOWATK2_8 CRBW C 4 A_ReFire S_CRBOW1 + +S_CRBOWFX1 FX03 B* 1 NULL S_CRBOWFX1 + +S_CRBOWFXI1_1 FX03 H* 8 NULL S_CRBOWFXI1_2 +S_CRBOWFXI1_2 FX03 I* 8 NULL S_CRBOWFXI1_3 +S_CRBOWFXI1_3 FX03 J* 8 NULL S_NULL + +S_CRBOWFX2 FX03 B* 1 A_BoltSpark S_CRBOWFX2 +S_CRBOWFX3 FX03 A* 1 NULL S_CRBOWFX3 + +S_CRBOWFXI3_1 FX03 C* 8 NULL S_CRBOWFXI3_2 +S_CRBOWFXI3_2 FX03 D* 8 NULL S_CRBOWFXI3_3 +S_CRBOWFXI3_3 FX03 E* 8 NULL S_NULL + +S_CRBOWFX4_1 FX03 F* 8 NULL S_CRBOWFX4_2 +S_CRBOWFX4_2 FX03 G* 8 NULL S_NULL + + +// +// blood +// +$ MT_BLOOD +spawnstate S_BLOOD1 +flags MF_NOBLOCKMAP + +$ MT_BLOODSPLATTER +spawnstate S_BLOODSPLATTER1 +deathstate S_BLOODSPLATTERX +radius 2 +height 4 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF +flags2 MF2_NOTELEPORT|MF2_CANNOTPUSH + +S_BLOOD1 BLOD C 8 NULL S_BLOOD2 +S_BLOOD2 BLOD B 8 NULL S_BLOOD3 +S_BLOOD3 BLOD A 8 NULL S_NULL + +S_BLOODSPLATTER1 BLOD C 8 NULL S_BLOODSPLATTER2 +S_BLOODSPLATTER2 BLOD B 8 NULL S_BLOODSPLATTER3 +S_BLOODSPLATTER3 BLOD A 8 NULL S_NULL + +S_BLOODSPLATTERX BLOD A 6 NULL S_NULL + + +// +// the player +// +$ MT_PLAYER +spawnstate S_PLAY +spawnhealth 100 +seestate S_PLAY_RUN1 +reactiontime 0 +painstate S_PLAY_PAIN +painchance 255 +painsound sfx_plrpai +missilestate S_PLAY_ATK1 +deathstate S_PLAY_DIE1 +xdeathstate S_PLAY_XDIE1 +deathsound sfx_plrdth +radius 16 +height 56 +flags MF_SOLID|MF_SHOOTABLE|MF_DROPOFF|MF_PICKUP|MF_NOTDMATCH +flags2 MF2_WINDTHRUST|MF2_FOOTCLIP|MF2_SLIDE|MF2_PASSMOBJ|MF2_TELESTOMP + +$ MT_BLOODYSKULL +spawnstate S_BLOODYSKULL1 +radius 4 +height 4 +flags MF_NOBLOCKMAP|MF_DROPOFF +flags2 MF2_LOGRAV|MF2_CANNOTPUSH + +$ MT_CHICPLAYER +spawnstate S_CHICPLAY +spawnhealth 100 +seestate S_CHICPLAY_RUN1 +reactiontime 0 +painstate S_CHICPLAY_PAIN +painchance 255 +painsound sfx_chicpai +missilestate S_CHICPLAY_ATK1 +deathstate S_CHICKEN_DIE1 +deathsound sfx_chicdth +radius 16 +height 24 +flags MF_SOLID|MF_SHOOTABLE|MF_DROPOFF|MF_NOTDMATCH +flags2 MF2_WINDTHRUST|MF2_SLIDE|MF2_PASSMOBJ|MF2_FOOTCLIP|MF2_LOGRAV|MF2_TELESTOMP + +// not a player, but still a chicken +$ MT_CHICKEN +spawnstate S_CHICKEN_LOOK1 +spawnhealth 10 +seestate S_CHICKEN_WALK1 +seesound sfx_chicpai +attacksound sfx_chicatk +painstate S_CHICKEN_PAIN1 +painchance 200 +painsound sfx_chicpai +meleestate S_CHICKEN_ATK1 +missilestate 0 +deathstate S_CHICKEN_DIE1 +deathsound sfx_chicdth +speed 4 +radius 9 +height 22 +mass 40 +activesound sfx_chicact +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL|MF_DROPOFF +flags2 MF2_WINDTHRUST|MF2_FOOTCLIP|MF2_PASSMOBJ + +$ MT_FEATHER +spawnstate S_FEATHER1 +deathstate S_FEATHERX +radius 2 +height 4 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF +flags2 MF2_NOTELEPORT|MF2_LOGRAV|MF2_CANNOTPUSH|MF2_WINDTHRUST + +S_PLAY PLAY A -1 NULL S_NULL + +S_PLAY_RUN1 PLAY A 4 NULL S_PLAY_RUN2 +S_PLAY_RUN2 PLAY B 4 NULL S_PLAY_RUN3 +S_PLAY_RUN3 PLAY C 4 NULL S_PLAY_RUN4 +S_PLAY_RUN4 PLAY D 4 NULL S_PLAY_RUN1 + +S_PLAY_ATK1 PLAY E 12 NULL S_PLAY +S_PLAY_ATK2 PLAY F* 6 NULL S_PLAY_ATK1 + +S_PLAY_PAIN PLAY G 4 NULL S_PLAY_PAIN2 +S_PLAY_PAIN2 PLAY G 4 A_Pain S_PLAY + +S_PLAY_DIE1 PLAY H 6 NULL S_PLAY_DIE2 +S_PLAY_DIE2 PLAY I 6 A_Scream S_PLAY_DIE3 +S_PLAY_DIE3 PLAY J 6 NULL S_PLAY_DIE4 +S_PLAY_DIE4 PLAY K 6 NULL S_PLAY_DIE5 +S_PLAY_DIE5 PLAY L 6 A_NoBlocking S_PLAY_DIE6 +S_PLAY_DIE6 PLAY M 6 NULL S_PLAY_DIE7 +S_PLAY_DIE7 PLAY N 6 NULL S_PLAY_DIE8 +S_PLAY_DIE8 PLAY O 6 NULL S_PLAY_DIE9 +S_PLAY_DIE9 PLAY P -1 A_AddPlayerCorpse S_NULL + +S_PLAY_XDIE1 PLAY Q 5 A_Scream S_PLAY_XDIE2 +S_PLAY_XDIE2 PLAY R 5 A_SkullPop S_PLAY_XDIE3 +S_PLAY_XDIE3 PLAY S 5 A_NoBlocking S_PLAY_XDIE4 +S_PLAY_XDIE4 PLAY T 5 NULL S_PLAY_XDIE5 +S_PLAY_XDIE5 PLAY U 5 NULL S_PLAY_XDIE6 +S_PLAY_XDIE6 PLAY V 5 NULL S_PLAY_XDIE7 +S_PLAY_XDIE7 PLAY W 5 NULL S_PLAY_XDIE8 +S_PLAY_XDIE8 PLAY X 5 NULL S_PLAY_XDIE9 +S_PLAY_XDIE9 PLAY Y -1 A_AddPlayerCorpse S_NULL + +S_PLAY_FDTH1 FDTH A* 5 A_FlameSnd S_PLAY_FDTH2 +S_PLAY_FDTH2 FDTH B* 4 NULL S_PLAY_FDTH3 +S_PLAY_FDTH3 FDTH C* 5 NULL S_PLAY_FDTH4 +S_PLAY_FDTH4 FDTH D* 4 A_Scream S_PLAY_FDTH5 +S_PLAY_FDTH5 FDTH E* 5 NULL S_PLAY_FDTH6 +S_PLAY_FDTH6 FDTH F* 4 NULL S_PLAY_FDTH7 +S_PLAY_FDTH7 FDTH G* 5 A_FlameSnd S_PLAY_FDTH8 +S_PLAY_FDTH8 FDTH H* 4 NULL S_PLAY_FDTH9 +S_PLAY_FDTH9 FDTH I* 5 NULL S_PLAY_FDTH10 +S_PLAY_FDTH10 FDTH J* 4 NULL S_PLAY_FDTH11 +S_PLAY_FDTH11 FDTH K* 5 NULL S_PLAY_FDTH12 +S_PLAY_FDTH12 FDTH L* 4 NULL S_PLAY_FDTH13 +S_PLAY_FDTH13 FDTH M* 5 NULL S_PLAY_FDTH14 +S_PLAY_FDTH14 FDTH N* 4 NULL S_PLAY_FDTH15 +S_PLAY_FDTH15 FDTH O* 5 A_NoBlocking S_PLAY_FDTH16 +S_PLAY_FDTH16 FDTH P* 4 NULL S_PLAY_FDTH17 +S_PLAY_FDTH17 FDTH Q* 5 NULL S_PLAY_FDTH18 +S_PLAY_FDTH18 FDTH R* 4 NULL S_PLAY_FDTH19 +S_PLAY_FDTH19 ACLO E 35 A_CheckBurnGone S_PLAY_FDTH19 +S_PLAY_FDTH20 ACLO E 8 NULL S_NULL + +S_BLOODYSKULL1 BSKL A 5 A_CheckSkullFloor S_BLOODYSKULL2 +S_BLOODYSKULL2 BSKL B 5 A_CheckSkullFloor S_BLOODYSKULL3 +S_BLOODYSKULL3 BSKL C 5 A_CheckSkullFloor S_BLOODYSKULL4 +S_BLOODYSKULL4 BSKL D 5 A_CheckSkullFloor S_BLOODYSKULL5 +S_BLOODYSKULL5 BSKL E 5 A_CheckSkullFloor S_BLOODYSKULL1 +S_BLOODYSKULLX1 BSKL F 16 A_CheckSkullDone S_BLOODYSKULLX1 +S_BLOODYSKULLX2 BSKL F 1050 NULL S_NULL + +S_CHICPLAY CHKN A -1 NULL S_NULL + +S_CHICPLAY_RUN1 CHKN A 3 NULL S_CHICPLAY_RUN2 +S_CHICPLAY_RUN2 CHKN B 3 NULL S_CHICPLAY_RUN3 +S_CHICPLAY_RUN3 CHKN A 3 NULL S_CHICPLAY_RUN4 +S_CHICPLAY_RUN4 CHKN B 3 NULL S_CHICPLAY_RUN1 + +S_CHICPLAY_ATK1 CHKN C 12 NULL S_CHICPLAY + +S_CHICPLAY_PAIN CHKN D 4 A_Feathers S_CHICPLAY_PAIN2 +S_CHICPLAY_PAIN2 CHKN C 4 A_Pain S_CHICPLAY + +S_CHICKEN_LOOK1 CHKN A 10 A_ChicLook S_CHICKEN_LOOK2 +S_CHICKEN_LOOK2 CHKN B 10 A_ChicLook S_CHICKEN_LOOK1 + +S_CHICKEN_WALK1 CHKN A 3 A_ChicChase S_CHICKEN_WALK2 +S_CHICKEN_WALK2 CHKN B 3 A_ChicChase S_CHICKEN_WALK1 + +S_CHICKEN_PAIN1 CHKN D 5 A_Feathers S_CHICKEN_PAIN2 +S_CHICKEN_PAIN2 CHKN C 5 A_ChicPain S_CHICKEN_WALK1 + +S_CHICKEN_ATK1 CHKN A 8 A_FaceTarget S_CHICKEN_ATK2 +S_CHICKEN_ATK2 CHKN C 10 A_ChicAttack S_CHICKEN_WALK1 + +S_CHICKEN_DIE1 CHKN E 6 A_Scream S_CHICKEN_DIE2 +S_CHICKEN_DIE2 CHKN F 6 A_Feathers S_CHICKEN_DIE3 +S_CHICKEN_DIE3 CHKN G 6 NULL S_CHICKEN_DIE4 +S_CHICKEN_DIE4 CHKN H 6 A_NoBlocking S_CHICKEN_DIE5 +S_CHICKEN_DIE5 CHKN I 6 NULL S_CHICKEN_DIE6 +S_CHICKEN_DIE6 CHKN J 6 NULL S_CHICKEN_DIE7 +S_CHICKEN_DIE7 CHKN K 6 NULL S_CHICKEN_DIE8 +S_CHICKEN_DIE8 CHKN L -1 NULL S_NULL + +S_FEATHER1 CHKN M 3 NULL S_FEATHER2 +S_FEATHER2 CHKN N 3 NULL S_FEATHER3 +S_FEATHER3 CHKN O 3 NULL S_FEATHER4 +S_FEATHER4 CHKN P 3 NULL S_FEATHER5 +S_FEATHER5 CHKN Q 3 NULL S_FEATHER6 +S_FEATHER6 CHKN P 3 NULL S_FEATHER7 +S_FEATHER7 CHKN O 3 NULL S_FEATHER8 +S_FEATHER8 CHKN N 3 NULL S_FEATHER1 + +S_FEATHERX CHKN N 6 NULL S_NULL + + +// +// mummy +// +$ MT_MUMMY +doomednum 68 +spawnstate S_MUMMY_LOOK1 +spawnhealth 80 +seestate S_MUMMY_WALK1 +seesound sfx_mumsit +attacksound sfx_mumat1 +painstate S_MUMMY_PAIN1 +painchance 128 +painsound sfx_mumpai +meleestate S_MUMMY_ATK1 +missilestate 0 +deathstate S_MUMMY_DIE1 +deathsound sfx_mumdth +speed 12 +radius 22 +height 62 +mass 75 +activesound sfx_mumact +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL +flags2 MF2_FOOTCLIP|MF2_PASSMOBJ + +$ MT_MUMMYLEADER +doomednum 45 +spawnstate S_MUMMY_LOOK1 +spawnhealth 100 +seestate S_MUMMY_WALK1 +seesound sfx_mumsit +attacksound sfx_mumat1 +painstate S_MUMMY_PAIN1 +painchance 64 +painsound sfx_mumpai +meleestate S_MUMMY_ATK1 +missilestate S_MUMMYL_ATK1 +deathstate S_MUMMY_DIE1 +deathsound sfx_mumdth +speed 12 +radius 22 +height 62 +mass 75 +activesound sfx_mumact +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL +flags2 MF2_FOOTCLIP|MF2_PASSMOBJ + +$ MT_MUMMYGHOST +doomednum 69 +spawnstate S_MUMMY_LOOK1 +spawnhealth 80 +seestate S_MUMMY_WALK1 +seesound sfx_mumsit +attacksound sfx_mumat1 +painstate S_MUMMY_PAIN1 +painchance 128 +painsound sfx_mumpai +meleestate S_MUMMY_ATK1 +missilestate 0 +deathstate S_MUMMY_DIE1 +deathsound sfx_mumdth +speed 12 +radius 22 +height 62 +mass 75 +activesound sfx_mumact +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL|MF_SHADOW +flags2 MF2_FOOTCLIP|MF2_PASSMOBJ + +$ MT_MUMMYLEADERGHOST +doomednum 46 +spawnstate S_MUMMY_LOOK1 +spawnhealth 100 +seestate S_MUMMY_WALK1 +seesound sfx_mumsit +attacksound sfx_mumat1 +painstate S_MUMMY_PAIN1 +painchance 64 +painsound sfx_mumpai +meleestate S_MUMMY_ATK1 +missilestate S_MUMMYL_ATK1 +deathstate S_MUMMY_DIE1 +deathsound sfx_mumdth +speed 12 +radius 22 +height 62 +mass 75 +activesound sfx_mumact +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL|MF_SHADOW +flags2 MF2_FOOTCLIP|MF2_PASSMOBJ + +$ MT_MUMMYSOUL +spawnstate S_MUMMY_SOUL1 +flags MF_NOBLOCKMAP|MF_NOGRAVITY + +$ MT_MUMMYFX1 +spawnstate S_MUMMYFX1_1 +seesound 0 +deathstate S_MUMMYFXI1_1 +deathsound 0 +speed 9 +radius 8 +height 14 +damage 4 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_NOTELEPORT + +S_MUMMY_LOOK1 MUMM A 10 A_Look S_MUMMY_LOOK2 +S_MUMMY_LOOK2 MUMM B 10 A_Look S_MUMMY_LOOK1 + +S_MUMMY_WALK1 MUMM A 4 A_Chase S_MUMMY_WALK2 +S_MUMMY_WALK2 MUMM B 4 A_Chase S_MUMMY_WALK3 +S_MUMMY_WALK3 MUMM C 4 A_Chase S_MUMMY_WALK4 +S_MUMMY_WALK4 MUMM D 4 A_Chase S_MUMMY_WALK1 + +S_MUMMY_ATK1 MUMM E 6 A_FaceTarget S_MUMMY_ATK2 +S_MUMMY_ATK2 MUMM F 6 A_MummyAttack S_MUMMY_ATK3 +S_MUMMY_ATK3 MUMM G 6 A_FaceTarget S_MUMMY_WALK1 + +S_MUMMYL_ATK1 MUMM X 5 A_FaceTarget S_MUMMYL_ATK2 +S_MUMMYL_ATK2 MUMM Y* 5 A_FaceTarget S_MUMMYL_ATK3 +S_MUMMYL_ATK3 MUMM X 5 A_FaceTarget S_MUMMYL_ATK4 +S_MUMMYL_ATK4 MUMM Y* 5 A_FaceTarget S_MUMMYL_ATK5 +S_MUMMYL_ATK5 MUMM X 5 A_FaceTarget S_MUMMYL_ATK6 +S_MUMMYL_ATK6 MUMM Y* 15 A_MummyAttack2 S_MUMMY_WALK1 + +S_MUMMY_PAIN1 MUMM H 4 NULL S_MUMMY_PAIN2 +S_MUMMY_PAIN2 MUMM H 4 A_Pain S_MUMMY_WALK1 + +S_MUMMY_DIE1 MUMM I 5 NULL S_MUMMY_DIE2 +S_MUMMY_DIE2 MUMM J 5 A_Scream S_MUMMY_DIE3 +S_MUMMY_DIE3 MUMM K 5 A_MummySoul S_MUMMY_DIE4 +S_MUMMY_DIE4 MUMM L 5 NULL S_MUMMY_DIE5 +S_MUMMY_DIE5 MUMM M 5 A_NoBlocking S_MUMMY_DIE6 +S_MUMMY_DIE6 MUMM N 5 NULL S_MUMMY_DIE7 +S_MUMMY_DIE7 MUMM O 5 NULL S_MUMMY_DIE8 +S_MUMMY_DIE8 MUMM P -1 NULL S_NULL + +S_MUMMY_SOUL1 MUMM Q 5 NULL S_MUMMY_SOUL2 +S_MUMMY_SOUL2 MUMM R 5 NULL S_MUMMY_SOUL3 +S_MUMMY_SOUL3 MUMM S 5 NULL S_MUMMY_SOUL4 +S_MUMMY_SOUL4 MUMM T 9 NULL S_MUMMY_SOUL5 +S_MUMMY_SOUL5 MUMM U 5 NULL S_MUMMY_SOUL6 +S_MUMMY_SOUL6 MUMM V 5 NULL S_MUMMY_SOUL7 +S_MUMMY_SOUL7 MUMM W 5 NULL S_NULL + +S_MUMMYFX1_1 FX15 A* 5 A_ContMobjSound S_MUMMYFX1_2 +S_MUMMYFX1_2 FX15 B* 5 A_MummyFX1Seek S_MUMMYFX1_3 +S_MUMMYFX1_3 FX15 C* 5 NULL S_MUMMYFX1_4 +S_MUMMYFX1_4 FX15 B* 5 A_MummyFX1Seek S_MUMMYFX1_1 + +S_MUMMYFXI1_1 FX15 D* 5 NULL S_MUMMYFXI1_2 +S_MUMMYFXI1_2 FX15 E* 5 NULL S_MUMMYFXI1_3 +S_MUMMYFXI1_3 FX15 F* 5 NULL S_MUMMYFXI1_4 +S_MUMMYFXI1_4 FX15 G* 5 NULL S_NULL + + +// +// beast +// +$ MT_BEAST +doomednum 70 +spawnstate S_BEAST_LOOK1 +spawnhealth 220 +seestate S_BEAST_WALK1 +seesound sfx_bstsit +attacksound sfx_bstatk +painstate S_BEAST_PAIN1 +painchance 100 +painsound sfx_bstpai +meleestate 0 +missilestate S_BEAST_ATK1 +deathstate S_BEAST_DIE1 +xdeathstate S_BEAST_XDIE1 +deathsound sfx_bstdth +speed 14 +radius 32 +height 74 +mass 200 +activesound sfx_bstact +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL +flags2 MF2_FOOTCLIP|MF2_PASSMOBJ + +$ MT_BEASTBALL +spawnstate S_BEASTBALL1 +seesound 0 +deathstate S_BEASTBALLX1 +deathsound 0 +speed 12 +radius 9 +height 8 +damage 4 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_WINDTHRUST|MF2_NOTELEPORT + +$ MT_BURNBALL +spawnstate S_BURNBALL1 +seesound 0 +deathstate S_BEASTBALLX1 +deathsound 0 +speed 10 +radius 6 +height 8 +damage 2 +flags MF_NOBLOCKMAP|MF_NOGRAVITY|MF_MISSILE +flags2 MF2_NOTELEPORT + +$ MT_BURNBALLFB +spawnstate S_BURNBALLFB1 +seesound 0 +deathstate S_BEASTBALLX1 +deathsound 0 +speed 10 +radius 6 +height 8 +damage 2 +flags MF_NOBLOCKMAP|MF_NOGRAVITY|MF_MISSILE +flags2 MF2_NOTELEPORT + +$ MT_PUFFY +spawnstate S_PUFFY1 +seesound 0 +deathstate S_PUFFY1 +deathsound 0 +speed 10 +radius 6 +height 8 +damage 2 +flags MF_NOBLOCKMAP|MF_NOGRAVITY|MF_MISSILE +flags2 MF2_NOTELEPORT + +S_BEAST_LOOK1 BEAS A 10 A_Look S_BEAST_LOOK2 +S_BEAST_LOOK2 BEAS B 10 A_Look S_BEAST_LOOK1 + +S_BEAST_WALK1 BEAS A 3 A_Chase S_BEAST_WALK2 +S_BEAST_WALK2 BEAS B 3 A_Chase S_BEAST_WALK3 +S_BEAST_WALK3 BEAS C 3 A_Chase S_BEAST_WALK4 +S_BEAST_WALK4 BEAS D 3 A_Chase S_BEAST_WALK5 +S_BEAST_WALK5 BEAS E 3 A_Chase S_BEAST_WALK6 +S_BEAST_WALK6 BEAS F 3 A_Chase S_BEAST_WALK1 + +S_BEAST_ATK1 BEAS H 10 A_FaceTarget S_BEAST_ATK2 +S_BEAST_ATK2 BEAS I 10 A_BeastAttack S_BEAST_WALK1 + +S_BEAST_PAIN1 BEAS G 3 NULL S_BEAST_PAIN2 +S_BEAST_PAIN2 BEAS G 3 A_Pain S_BEAST_WALK1 + +S_BEAST_DIE1 BEAS R 6 NULL S_BEAST_DIE2 +S_BEAST_DIE2 BEAS S 6 A_Scream S_BEAST_DIE3 +S_BEAST_DIE3 BEAS T 6 NULL S_BEAST_DIE4 +S_BEAST_DIE4 BEAS U 6 NULL S_BEAST_DIE5 +S_BEAST_DIE5 BEAS V 6 NULL S_BEAST_DIE6 +S_BEAST_DIE6 BEAS W 6 A_NoBlocking S_BEAST_DIE7 +S_BEAST_DIE7 BEAS X 6 NULL S_BEAST_DIE8 +S_BEAST_DIE8 BEAS Y 6 NULL S_BEAST_DIE9 +S_BEAST_DIE9 BEAS Z -1 NULL S_NULL + +S_BEAST_XDIE1 BEAS J 5 NULL S_BEAST_XDIE2 +S_BEAST_XDIE2 BEAS K 6 A_Scream S_BEAST_XDIE3 +S_BEAST_XDIE3 BEAS L 5 NULL S_BEAST_XDIE4 +S_BEAST_XDIE4 BEAS M 6 NULL S_BEAST_XDIE5 +S_BEAST_XDIE5 BEAS N 5 NULL S_BEAST_XDIE6 +S_BEAST_XDIE6 BEAS O 6 A_NoBlocking S_BEAST_XDIE7 +S_BEAST_XDIE7 BEAS P 5 NULL S_BEAST_XDIE8 +S_BEAST_XDIE8 BEAS Q -1 NULL S_NULL + +S_BEASTBALL1 FRB1 A 2 A_BeastPuff S_BEASTBALL2 +S_BEASTBALL2 FRB1 A 2 A_BeastPuff S_BEASTBALL3 +S_BEASTBALL3 FRB1 B 2 A_BeastPuff S_BEASTBALL4 +S_BEASTBALL4 FRB1 B 2 A_BeastPuff S_BEASTBALL5 +S_BEASTBALL5 FRB1 C 2 A_BeastPuff S_BEASTBALL6 +S_BEASTBALL6 FRB1 C 2 A_BeastPuff S_BEASTBALL1 + +S_BEASTBALLX1 FRB1 D 4 NULL S_BEASTBALLX2 +S_BEASTBALLX2 FRB1 E 4 NULL S_BEASTBALLX3 +S_BEASTBALLX3 FRB1 F 4 NULL S_BEASTBALLX4 +S_BEASTBALLX4 FRB1 G 4 NULL S_BEASTBALLX5 +S_BEASTBALLX5 FRB1 H 4 NULL S_NULL + +S_BURNBALL1 FRB1 A 4 NULL S_BURNBALL2 +S_BURNBALL2 FRB1 B 4 NULL S_BURNBALL3 +S_BURNBALL3 FRB1 C 4 NULL S_BURNBALL4 +S_BURNBALL4 FRB1 D 4 NULL S_BURNBALL5 +S_BURNBALL5 FRB1 E 4 NULL S_BURNBALL6 +S_BURNBALL6 FRB1 F 4 NULL S_BURNBALL7 +S_BURNBALL7 FRB1 G 4 NULL S_BURNBALL8 +S_BURNBALL8 FRB1 H 4 NULL S_NULL + +S_BURNBALLFB1 FRB1 A* 4 NULL S_BURNBALLFB2 +S_BURNBALLFB2 FRB1 B* 4 NULL S_BURNBALLFB3 +S_BURNBALLFB3 FRB1 C* 4 NULL S_BURNBALLFB4 +S_BURNBALLFB4 FRB1 D* 4 NULL S_BURNBALLFB5 +S_BURNBALLFB5 FRB1 E* 4 NULL S_BURNBALLFB6 +S_BURNBALLFB6 FRB1 F* 4 NULL S_BURNBALLFB7 +S_BURNBALLFB7 FRB1 G* 4 NULL S_BURNBALLFB8 +S_BURNBALLFB8 FRB1 H* 4 NULL S_NULL + +S_PUFFY1 FRB1 D 4 NULL S_PUFFY2 +S_PUFFY2 FRB1 E 4 NULL S_PUFFY3 +S_PUFFY3 FRB1 F 4 NULL S_PUFFY4 +S_PUFFY4 FRB1 G 4 NULL S_PUFFY5 +S_PUFFY5 FRB1 H 4 NULL S_NULL + + +// +// snake +// +$ MT_SNAKE +doomednum 92 +spawnstate S_SNAKE_LOOK1 +spawnhealth 280 +seestate S_SNAKE_WALK1 +seesound sfx_snksit +attacksound sfx_snkatk +painstate S_SNAKE_PAIN1 +painchance 48 +painsound sfx_snkpai +meleestate 0 +missilestate S_SNAKE_ATK1 +deathstate S_SNAKE_DIE1 +deathsound sfx_snkdth +speed 10 +radius 22 +height 70 +activesound sfx_snkact +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL +flags2 MF2_FOOTCLIP|MF2_PASSMOBJ + +$ MT_SNAKEPRO_A +spawnstate S_SNAKEPRO_A1 +seesound 0 +deathstate S_SNAKEPRO_AX1 +deathsound 0 +speed 14 +radius 12 +height 8 +damage 1 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_WINDTHRUST|MF2_NOTELEPORT + +$ MT_SNAKEPRO_B +spawnstate S_SNAKEPRO_B1 +seesound 0 +deathstate S_SNAKEPRO_BX1 +deathsound 0 +speed 14 +radius 12 +height 8 +damage 3 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_NOTELEPORT + +S_SNAKE_LOOK1 SNKE A 10 A_Look S_SNAKE_LOOK2 +S_SNAKE_LOOK2 SNKE B 10 A_Look S_SNAKE_LOOK1 + +S_SNAKE_WALK1 SNKE A 4 A_Chase S_SNAKE_WALK2 +S_SNAKE_WALK2 SNKE B 4 A_Chase S_SNAKE_WALK3 +S_SNAKE_WALK3 SNKE C 4 A_Chase S_SNAKE_WALK4 +S_SNAKE_WALK4 SNKE D 4 A_Chase S_SNAKE_WALK1 + +S_SNAKE_ATK1 SNKE F 5 A_FaceTarget S_SNAKE_ATK2 +S_SNAKE_ATK2 SNKE F 5 A_FaceTarget S_SNAKE_ATK3 +S_SNAKE_ATK3 SNKE F 4 A_SnakeAttack S_SNAKE_ATK4 +S_SNAKE_ATK4 SNKE F 4 A_SnakeAttack S_SNAKE_ATK5 +S_SNAKE_ATK5 SNKE F 4 A_SnakeAttack S_SNAKE_ATK6 +S_SNAKE_ATK6 SNKE F 5 A_FaceTarget S_SNAKE_ATK7 +S_SNAKE_ATK7 SNKE F 5 A_FaceTarget S_SNAKE_ATK8 +S_SNAKE_ATK8 SNKE F 5 A_FaceTarget S_SNAKE_ATK9 +S_SNAKE_ATK9 SNKE F 4 A_SnakeAttack2 S_SNAKE_WALK1 + +S_SNAKE_PAIN1 SNKE E 3 NULL S_SNAKE_PAIN2 +S_SNAKE_PAIN2 SNKE E 3 A_Pain S_SNAKE_WALK1 + +S_SNAKE_DIE1 SNKE G 5 NULL S_SNAKE_DIE2 +S_SNAKE_DIE2 SNKE H 5 A_Scream S_SNAKE_DIE3 +S_SNAKE_DIE3 SNKE I 5 NULL S_SNAKE_DIE4 +S_SNAKE_DIE4 SNKE J 5 NULL S_SNAKE_DIE5 +S_SNAKE_DIE5 SNKE K 5 NULL S_SNAKE_DIE6 +S_SNAKE_DIE6 SNKE L 5 NULL S_SNAKE_DIE7 +S_SNAKE_DIE7 SNKE M 5 A_NoBlocking S_SNAKE_DIE8 +S_SNAKE_DIE8 SNKE N 5 NULL S_SNAKE_DIE9 +S_SNAKE_DIE9 SNKE O 5 NULL S_SNAKE_DIE10 +S_SNAKE_DIE10 SNKE P -1 NULL S_NULL + +S_SNAKEPRO_A1 SNFX A* 5 NULL S_SNAKEPRO_A2 +S_SNAKEPRO_A2 SNFX B* 5 NULL S_SNAKEPRO_A3 +S_SNAKEPRO_A3 SNFX C* 5 NULL S_SNAKEPRO_A4 +S_SNAKEPRO_A4 SNFX D* 5 NULL S_SNAKEPRO_A1 + +S_SNAKEPRO_AX1 SNFX E* 5 NULL S_SNAKEPRO_AX2 +S_SNAKEPRO_AX2 SNFX F* 5 NULL S_SNAKEPRO_AX3 +S_SNAKEPRO_AX3 SNFX G* 4 NULL S_SNAKEPRO_AX4 +S_SNAKEPRO_AX4 SNFX H* 3 NULL S_SNAKEPRO_AX5 +S_SNAKEPRO_AX5 SNFX I* 3 NULL S_NULL + +S_SNAKEPRO_B1 SNFX J* 6 NULL S_SNAKEPRO_B2 +S_SNAKEPRO_B2 SNFX K* 6 NULL S_SNAKEPRO_B1 + +S_SNAKEPRO_BX1 SNFX L* 5 NULL S_SNAKEPRO_BX2 +S_SNAKEPRO_BX2 SNFX M* 5 NULL S_SNAKEPRO_BX3 +S_SNAKEPRO_BX3 SNFX N* 4 NULL S_SNAKEPRO_BX4 +S_SNAKEPRO_BX4 SNFX O* 3 NULL S_NULL + + +// +// head +// +$ MT_HEAD +doomednum 6 +spawnstate S_HEAD_LOOK +spawnhealth 700 +seestate S_HEAD_FLOAT +seesound sfx_hedsit +attacksound sfx_hedat1 +painstate S_HEAD_PAIN1 +painchance 32 +painsound sfx_hedpai +meleestate 0 +missilestate S_HEAD_ATK1 +deathstate S_HEAD_DIE1 +deathsound sfx_heddth +speed 6 +radius 40 +height 72 +mass 325 +activesound sfx_hedact +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL|MF_NOBLOOD +flags2 MF2_PASSMOBJ + +$ MT_HEADFX1 +spawnstate S_HEADFX1_1 +seesound 0 +deathstate S_HEADFXI1_1 +deathsound 0 +speed 13 +radius 12 +height 6 +damage 1 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_NOTELEPORT|MF2_THRUGHOST + +$ MT_HEADFX2 +spawnstate S_HEADFX2_1 +seesound 0 +deathstate S_HEADFXI2_1 +deathsound 0 +speed 8 +radius 12 +height 6 +damage 3 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_NOTELEPORT + +$ MT_HEADFX3 +spawnstate S_HEADFX3_1 +seesound 0 +deathstate S_HEADFXI3_1 +deathsound 0 +speed 10 +radius 14 +height 12 +damage 5 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_WINDTHRUST|MF2_NOTELEPORT + +$ MT_WHIRLWIND +spawnstate S_HEADFX4_1 +seesound 0 +deathstate S_HEADFXI4_1 +deathsound 0 +speed 10 +radius 16 +height 74 +damage 1 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_NOTELEPORT +translucency 0.33 + +S_HEAD_LOOK HEAD A 10 A_Look S_HEAD_LOOK + +S_HEAD_FLOAT HEAD A 4 A_Chase S_HEAD_FLOAT + +S_HEAD_ATK1 HEAD A 5 A_FaceTarget S_HEAD_ATK2 +S_HEAD_ATK2 HEAD B 20 A_HeadAttack S_HEAD_FLOAT + +S_HEAD_PAIN1 HEAD A 4 NULL S_HEAD_PAIN2 +S_HEAD_PAIN2 HEAD A 4 A_Pain S_HEAD_FLOAT + +S_HEAD_DIE1 HEAD C 7 NULL S_HEAD_DIE2 +S_HEAD_DIE2 HEAD D 7 A_Scream S_HEAD_DIE3 +S_HEAD_DIE3 HEAD E 7 NULL S_HEAD_DIE4 +S_HEAD_DIE4 HEAD F 7 NULL S_HEAD_DIE5 +S_HEAD_DIE5 HEAD G 7 A_NoBlocking S_HEAD_DIE6 +S_HEAD_DIE6 HEAD H 7 NULL S_HEAD_DIE7 +S_HEAD_DIE7 HEAD I -1 A_BossDeath S_NULL + +S_HEADFX1_1 FX05 A 6 NULL S_HEADFX1_2 +S_HEADFX1_2 FX05 B 6 NULL S_HEADFX1_3 +S_HEADFX1_3 FX05 C 6 NULL S_HEADFX1_1 + +S_HEADFXI1_1 FX05 D 5 A_HeadIceImpact S_HEADFXI1_2 +S_HEADFXI1_2 FX05 E 5 NULL S_HEADFXI1_3 +S_HEADFXI1_3 FX05 F 5 NULL S_HEADFXI1_4 +S_HEADFXI1_4 FX05 G 5 NULL S_NULL + +S_HEADFX2_1 FX05 H 6 NULL S_HEADFX2_2 +S_HEADFX2_2 FX05 I 6 NULL S_HEADFX2_3 +S_HEADFX2_3 FX05 J 6 NULL S_HEADFX2_1 + +S_HEADFXI2_1 FX05 D 5 NULL S_HEADFXI2_2 +S_HEADFXI2_2 FX05 E 5 NULL S_HEADFXI2_3 +S_HEADFXI2_3 FX05 F 5 NULL S_HEADFXI2_4 +S_HEADFXI2_4 FX05 G 5 NULL S_NULL + +S_HEADFX3_1 FX06 A 4 A_HeadFireGrow S_HEADFX3_2 +S_HEADFX3_2 FX06 B 4 A_HeadFireGrow S_HEADFX3_3 +S_HEADFX3_3 FX06 C 4 A_HeadFireGrow S_HEADFX3_1 +S_HEADFX3_4 FX06 A 5 NULL S_HEADFX3_5 +S_HEADFX3_5 FX06 B 5 NULL S_HEADFX3_6 +S_HEADFX3_6 FX06 C 5 NULL S_HEADFX3_4 + +S_HEADFXI3_1 FX06 D 5 NULL S_HEADFXI3_2 +S_HEADFXI3_2 FX06 E 5 NULL S_HEADFXI3_3 +S_HEADFXI3_3 FX06 F 5 NULL S_HEADFXI3_4 +S_HEADFXI3_4 FX06 G 5 NULL S_NULL + +S_HEADFX4_1 FX07 D 3 NULL S_HEADFX4_2 +S_HEADFX4_2 FX07 E 3 NULL S_HEADFX4_3 +S_HEADFX4_3 FX07 F 3 NULL S_HEADFX4_4 +S_HEADFX4_4 FX07 G 3 NULL S_HEADFX4_5 +S_HEADFX4_5 FX07 A 3 A_WhirlwindSeek S_HEADFX4_6 +S_HEADFX4_6 FX07 B 3 A_WhirlwindSeek S_HEADFX4_7 +S_HEADFX4_7 FX07 C 3 A_WhirlwindSeek S_HEADFX4_5 + +S_HEADFXI4_1 FX07 G 4 NULL S_HEADFXI4_2 +S_HEADFXI4_2 FX07 F 4 NULL S_HEADFXI4_3 +S_HEADFXI4_3 FX07 E 4 NULL S_HEADFXI4_4 +S_HEADFXI4_4 FX07 D 4 NULL S_NULL + + +// +// clink +// +$ MT_CLINK +doomednum 90 +spawnstate S_CLINK_LOOK1 +spawnhealth 150 +seestate S_CLINK_WALK1 +seesound sfx_clksit +attacksound sfx_clkatk +painstate S_CLINK_PAIN1 +painchance 32 +painsound sfx_clkpai +meleestate S_CLINK_ATK1 +missilestate 0 +deathstate S_CLINK_DIE1 +deathsound sfx_clkdth +speed 14 +height 64 +mass 75 +activesound sfx_clkact +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL|MF_NOBLOOD +flags2 MF2_FOOTCLIP|MF2_PASSMOBJ + +S_CLINK_LOOK1 CLNK A 10 A_Look S_CLINK_LOOK2 +S_CLINK_LOOK2 CLNK B 10 A_Look S_CLINK_LOOK1 + +S_CLINK_WALK1 CLNK A 3 A_Chase S_CLINK_WALK2 +S_CLINK_WALK2 CLNK B 3 A_Chase S_CLINK_WALK3 +S_CLINK_WALK3 CLNK C 3 A_Chase S_CLINK_WALK4 +S_CLINK_WALK4 CLNK D 3 A_Chase S_CLINK_WALK1 + +S_CLINK_ATK1 CLNK E 5 A_FaceTarget S_CLINK_ATK2 +S_CLINK_ATK2 CLNK F 4 A_FaceTarget S_CLINK_ATK3 +S_CLINK_ATK3 CLNK G 7 A_ClinkAttack S_CLINK_WALK1 + +S_CLINK_PAIN1 CLNK H 3 NULL S_CLINK_PAIN2 +S_CLINK_PAIN2 CLNK H 3 A_Pain S_CLINK_WALK1 + +S_CLINK_DIE1 CLNK I 6 NULL S_CLINK_DIE2 +S_CLINK_DIE2 CLNK J 6 NULL S_CLINK_DIE3 +S_CLINK_DIE3 CLNK K 5 A_Scream S_CLINK_DIE4 +S_CLINK_DIE4 CLNK L 5 A_NoBlocking S_CLINK_DIE5 +S_CLINK_DIE5 CLNK M 5 NULL S_CLINK_DIE6 +S_CLINK_DIE6 CLNK N 5 NULL S_CLINK_DIE7 +S_CLINK_DIE7 CLNK O -1 NULL S_NULL + + +// +// wizard +// +$ MT_WIZARD +doomednum 15 +spawnstate S_WIZARD_LOOK1 +spawnhealth 180 +seestate S_WIZARD_WALK1 +seesound sfx_wizsit +attacksound sfx_wizatk +painstate S_WIZARD_PAIN1 +painchance 64 +painsound sfx_wizpai +meleestate 0 +missilestate S_WIZARD_ATK1 +deathstate S_WIZARD_DIE1 +deathsound sfx_wizdth +speed 12 +radius 16 +height 68 +activesound sfx_wizact +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL|MF_FLOAT|MF_NOGRAVITY +flags2 MF2_PASSMOBJ + +$ MT_WIZFX1 +spawnstate S_WIZFX1_1 +seesound 0 +deathstate S_WIZFXI1_1 +deathsound 0 +speed 18 +radius 10 +height 6 +damage 3 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_NOTELEPORT + +S_WIZARD_LOOK1 WZRD A 10 A_Look S_WIZARD_LOOK2 +S_WIZARD_LOOK2 WZRD B 10 A_Look S_WIZARD_LOOK1 + +S_WIZARD_WALK1 WZRD A 3 A_Chase S_WIZARD_WALK2 +S_WIZARD_WALK2 WZRD A 4 A_Chase S_WIZARD_WALK3 +S_WIZARD_WALK3 WZRD A 3 A_Chase S_WIZARD_WALK4 +S_WIZARD_WALK4 WZRD A 4 A_Chase S_WIZARD_WALK5 +S_WIZARD_WALK5 WZRD B 3 A_Chase S_WIZARD_WALK6 +S_WIZARD_WALK6 WZRD B 4 A_Chase S_WIZARD_WALK7 +S_WIZARD_WALK7 WZRD B 3 A_Chase S_WIZARD_WALK8 +S_WIZARD_WALK8 WZRD B 4 A_Chase S_WIZARD_WALK1 + +S_WIZARD_ATK1 WZRD C 4 A_WizAtk1 S_WIZARD_ATK2 +S_WIZARD_ATK2 WZRD C 4 A_WizAtk2 S_WIZARD_ATK3 +S_WIZARD_ATK3 WZRD C 4 A_WizAtk1 S_WIZARD_ATK4 +S_WIZARD_ATK4 WZRD C 4 A_WizAtk2 S_WIZARD_ATK5 +S_WIZARD_ATK5 WZRD C 4 A_WizAtk1 S_WIZARD_ATK6 +S_WIZARD_ATK6 WZRD C 4 A_WizAtk2 S_WIZARD_ATK7 +S_WIZARD_ATK7 WZRD C 4 A_WizAtk1 S_WIZARD_ATK8 +S_WIZARD_ATK8 WZRD C 4 A_WizAtk2 S_WIZARD_ATK9 +S_WIZARD_ATK9 WZRD D 12 A_WizAtk3 S_WIZARD_WALK1 + +S_WIZARD_PAIN1 WZRD E 3 A_GhostOff S_WIZARD_PAIN2 +S_WIZARD_PAIN2 WZRD E 3 A_Pain S_WIZARD_WALK1 + +S_WIZARD_DIE1 WZRD F 6 A_GhostOff S_WIZARD_DIE2 +S_WIZARD_DIE2 WZRD G 6 A_Scream S_WIZARD_DIE3 +S_WIZARD_DIE3 WZRD H 6 NULL S_WIZARD_DIE4 +S_WIZARD_DIE4 WZRD I 6 NULL S_WIZARD_DIE5 +S_WIZARD_DIE5 WZRD J 6 A_NoBlocking S_WIZARD_DIE6 +S_WIZARD_DIE6 WZRD K 6 NULL S_WIZARD_DIE7 +S_WIZARD_DIE7 WZRD L 6 NULL S_WIZARD_DIE8 +S_WIZARD_DIE8 WZRD M -1 NULL S_NULL + +S_WIZFX1_1 FX11 A* 6 NULL S_WIZFX1_2 +S_WIZFX1_2 FX11 B* 6 NULL S_WIZFX1_1 +S_WIZFXI1_1 FX11 C* 5 NULL S_WIZFXI1_2 +S_WIZFXI1_2 FX11 D* 5 NULL S_WIZFXI1_3 +S_WIZFXI1_3 FX11 E* 5 NULL S_WIZFXI1_4 +S_WIZFXI1_4 FX11 F* 5 NULL S_WIZFXI1_5 +S_WIZFXI1_5 FX11 G* 5 NULL S_NULL + + +// +// imp +// +$ MT_IMP +doomednum 66 +spawnstate S_IMP_LOOK1 +spawnhealth 40 +seestate S_IMP_FLY1 +seesound sfx_impsit +attacksound sfx_impat1 +painstate S_IMP_PAIN1 +painchance 200 +painsound sfx_imppai +meleestate S_IMP_MEATK1 +missilestate S_IMP_MSATK1_1 +crashstate S_IMP_CRASH1 +deathstate S_IMP_DIE1 +xdeathstate S_IMP_XDIE1 +deathsound sfx_impdth +speed 10 +radius 16 +height 36 +mass 50 +activesound sfx_impact +flags MF_SOLID|MF_SHOOTABLE|MF_FLOAT|MF_NOGRAVITY|MF_COUNTKILL +flags2 MF2_SPAWNFLOAT|MF2_PASSMOBJ + +$ MT_IMPLEADER +doomednum 5 +spawnstate S_IMP_LOOK1 +spawnhealth 80 +seestate S_IMP_FLY1 +seesound sfx_impsit +attacksound sfx_impat2 +painstate S_IMP_PAIN1 +painchance 200 +painsound sfx_imppai +meleestate 0 +missilestate S_IMP_MSATK2_1 +crashstate S_IMP_CRASH1 +deathstate S_IMP_DIE1 +xdeathstate S_IMP_XDIE1 +deathsound sfx_impdth +speed 10 +radius 16 +height 36 +mass 50 +activesound sfx_impact +flags MF_SOLID|MF_SHOOTABLE|MF_FLOAT|MF_NOGRAVITY|MF_COUNTKILL +flags2 MF2_SPAWNFLOAT|MF2_PASSMOBJ + +$ MT_IMPCHUNK1 +spawnstate S_IMP_CHUNKA1 +flags MF_NOBLOCKMAP + +$ MT_IMPCHUNK2 +spawnstate S_IMP_CHUNKB1 +flags MF_NOBLOCKMAP + +$ MT_IMPBALL +spawnstate S_IMPFX1 +seesound 0 +deathstate S_IMPFXI1 +deathsound 0 +speed 10 +radius 8 +height 8 +damage 1 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_WINDTHRUST|MF2_NOTELEPORT + +S_IMP_LOOK1 IMPX A 10 A_Look S_IMP_LOOK2 +S_IMP_LOOK2 IMPX B 10 A_Look S_IMP_LOOK3 +S_IMP_LOOK3 IMPX C 10 A_Look S_IMP_LOOK4 +S_IMP_LOOK4 IMPX B 10 A_Look S_IMP_LOOK1 + +S_IMP_FLY1 IMPX A 3 A_Chase S_IMP_FLY2 +S_IMP_FLY2 IMPX A 3 A_Chase S_IMP_FLY3 +S_IMP_FLY3 IMPX B 3 A_Chase S_IMP_FLY4 +S_IMP_FLY4 IMPX B 3 A_Chase S_IMP_FLY5 +S_IMP_FLY5 IMPX C 3 A_Chase S_IMP_FLY6 +S_IMP_FLY6 IMPX C 3 A_Chase S_IMP_FLY7 +S_IMP_FLY7 IMPX B 3 A_Chase S_IMP_FLY8 +S_IMP_FLY8 IMPX B 3 A_Chase S_IMP_FLY1 + +S_IMP_MEATK1 IMPX D 6 A_FaceTarget S_IMP_MEATK2 +S_IMP_MEATK2 IMPX E 6 A_FaceTarget S_IMP_MEATK3 +S_IMP_MEATK3 IMPX F 6 A_ImpMeAttack S_IMP_FLY1 + +S_IMP_MSATK1_1 IMPX A 10 A_FaceTarget S_IMP_MSATK1_2 +S_IMP_MSATK1_2 IMPX B 6 A_ImpMsAttack S_IMP_MSATK1_3 +S_IMP_MSATK1_3 IMPX C 6 NULL S_IMP_MSATK1_4 +S_IMP_MSATK1_4 IMPX B 6 NULL S_IMP_MSATK1_5 +S_IMP_MSATK1_5 IMPX A 6 NULL S_IMP_MSATK1_6 +S_IMP_MSATK1_6 IMPX B 6 NULL S_IMP_MSATK1_3 +S_IMP_MSATK2_1 IMPX D 6 A_FaceTarget S_IMP_MSATK2_2 +S_IMP_MSATK2_2 IMPX E 6 A_FaceTarget S_IMP_MSATK2_3 +S_IMP_MSATK2_3 IMPX F 6 A_ImpMsAttack2 S_IMP_FLY1 + +S_IMP_PAIN1 IMPX G 3 NULL S_IMP_PAIN2 +S_IMP_PAIN2 IMPX G 3 A_Pain S_IMP_FLY1 + +S_IMP_DIE1 IMPX G 4 A_ImpDeath S_IMP_DIE2 +S_IMP_DIE2 IMPX H 5 NULL S_IMP_DIE2 + +S_IMP_XDIE1 IMPX S 5 A_ImpXDeath1 S_IMP_XDIE2 +S_IMP_XDIE2 IMPX T 5 NULL S_IMP_XDIE3 +S_IMP_XDIE3 IMPX U 5 NULL S_IMP_XDIE4 +S_IMP_XDIE4 IMPX V 5 A_ImpXDeath2 S_IMP_XDIE5 +S_IMP_XDIE5 IMPX W 5 NULL S_IMP_XDIE5 + +S_IMP_CRASH1 IMPX I 7 A_ImpExplode S_IMP_CRASH2 +S_IMP_CRASH2 IMPX J 7 A_Scream S_IMP_CRASH3 +S_IMP_CRASH3 IMPX K 7 NULL S_IMP_CRASH4 +S_IMP_CRASH4 IMPX L -1 NULL S_NULL + +S_IMP_XCRASH1 IMPX X 7 NULL S_IMP_XCRASH2 +S_IMP_XCRASH2 IMPX Y 7 NULL S_IMP_XCRASH3 +S_IMP_XCRASH3 IMPX Z -1 NULL S_NULL + +S_IMP_CHUNKA1 IMPX M 5 NULL S_IMP_CHUNKA2 +S_IMP_CHUNKA2 IMPX N 700 NULL S_IMP_CHUNKA3 +S_IMP_CHUNKA3 IMPX O 700 NULL S_NULL + +S_IMP_CHUNKB1 IMPX P 5 NULL S_IMP_CHUNKB2 +S_IMP_CHUNKB2 IMPX Q 700 NULL S_IMP_CHUNKB3 +S_IMP_CHUNKB3 IMPX R 700 NULL S_NULL + +S_IMPFX1 FX10 A* 6 NULL S_IMPFX2 +S_IMPFX2 FX10 B* 6 NULL S_IMPFX3 +S_IMPFX3 FX10 C* 6 NULL S_IMPFX1 + +S_IMPFXI1 FX10 D* 5 NULL S_IMPFXI2 +S_IMPFXI2 FX10 E* 5 NULL S_IMPFXI3 +S_IMPFXI3 FX10 F* 5 NULL S_IMPFXI4 +S_IMPFXI4 FX10 G* 5 NULL S_NULL + + +// +// knight +// +$ MT_KNIGHT +doomednum 64 +spawnstate S_KNIGHT_STND1 +spawnhealth 200 +seestate S_KNIGHT_WALK1 +seesound sfx_kgtsit +attacksound sfx_kgtatk +painstate S_KNIGHT_PAIN1 +painchance 100 +painsound sfx_kgtpai +meleestate S_KNIGHT_ATK1 +missilestate S_KNIGHT_ATK1 +deathstate S_KNIGHT_DIE1 +deathsound sfx_kgtdth +speed 12 +radius 24 +height 78 +mass 150 +activesound sfx_kgtact +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL +flags2 MF2_FOOTCLIP|MF2_PASSMOBJ + +$ MT_KNIGHTGHOST +doomednum 65 +spawnstate S_KNIGHT_STND1 +spawnhealth 200 +seestate S_KNIGHT_WALK1 +seesound sfx_kgtsit +attacksound sfx_kgtatk +painstate S_KNIGHT_PAIN1 +painchance 100 +painsound sfx_kgtpai +meleestate S_KNIGHT_ATK1 +missilestate S_KNIGHT_ATK1 +deathstate S_KNIGHT_DIE1 +deathsound sfx_kgtdth +speed 12 +radius 24 +height 78 +mass 150 +activesound sfx_kgtact +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL|MF_SHADOW +flags2 MF2_FOOTCLIP|MF2_PASSMOBJ + +$ MT_KNIGHTAXE +spawnstate S_SPINAXE1 +seesound 0 +deathstate S_SPINAXEX1 +deathsound sfx_hrnhit +speed 9 +radius 10 +height 8 +damage 2 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_WINDTHRUST|MF2_NOTELEPORT|MF2_THRUGHOST + +$ MT_REDAXE +spawnstate S_REDAXE1 +seesound 0 +deathstate S_REDAXEX1 +deathsound sfx_hrnhit +speed 9 +radius 10 +height 8 +damage 7 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_NOTELEPORT|MF2_THRUGHOST + +S_KNIGHT_STND1 KNIG A 10 A_Look S_KNIGHT_STND2 +S_KNIGHT_STND2 KNIG B 10 A_Look S_KNIGHT_STND1 + +S_KNIGHT_WALK1 KNIG A 4 A_Chase S_KNIGHT_WALK2 +S_KNIGHT_WALK2 KNIG B 4 A_Chase S_KNIGHT_WALK3 +S_KNIGHT_WALK3 KNIG C 4 A_Chase S_KNIGHT_WALK4 +S_KNIGHT_WALK4 KNIG D 4 A_Chase S_KNIGHT_WALK1 + +S_KNIGHT_ATK1 KNIG E 10 A_FaceTarget S_KNIGHT_ATK2 +S_KNIGHT_ATK2 KNIG F 8 A_FaceTarget S_KNIGHT_ATK3 +S_KNIGHT_ATK3 KNIG G 8 A_KnightAttack S_KNIGHT_ATK4 +S_KNIGHT_ATK4 KNIG E 10 A_FaceTarget S_KNIGHT_ATK5 +S_KNIGHT_ATK5 KNIG F 8 A_FaceTarget S_KNIGHT_ATK6 +S_KNIGHT_ATK6 KNIG G 8 A_KnightAttack S_KNIGHT_WALK1 + +S_KNIGHT_PAIN1 KNIG H 3 NULL S_KNIGHT_PAIN2 +S_KNIGHT_PAIN2 KNIG H 3 A_Pain S_KNIGHT_WALK1 + +S_KNIGHT_DIE1 KNIG I 6 NULL S_KNIGHT_DIE2 +S_KNIGHT_DIE2 KNIG J 6 A_Scream S_KNIGHT_DIE3 +S_KNIGHT_DIE3 KNIG K 6 NULL S_KNIGHT_DIE4 +S_KNIGHT_DIE4 KNIG L 6 A_NoBlocking S_KNIGHT_DIE5 +S_KNIGHT_DIE5 KNIG M 6 NULL S_KNIGHT_DIE6 +S_KNIGHT_DIE6 KNIG N 6 NULL S_KNIGHT_DIE7 +S_KNIGHT_DIE7 KNIG O -1 NULL S_NULL + +S_SPINAXE1 SPAX A* 3 A_ContMobjSound S_SPINAXE2 +S_SPINAXE2 SPAX B* 3 NULL S_SPINAXE3 +S_SPINAXE3 SPAX C* 3 NULL S_SPINAXE1 +S_SPINAXEX1 SPAX D* 6 NULL S_SPINAXEX2 +S_SPINAXEX2 SPAX E* 6 NULL S_SPINAXEX3 +S_SPINAXEX3 SPAX F* 6 NULL S_NULL + +S_REDAXE1 RAXE A* 5 A_DripBlood S_REDAXE2 +S_REDAXE2 RAXE B* 5 A_DripBlood S_REDAXE1 +S_REDAXEX1 RAXE C* 6 NULL S_REDAXEX2 +S_REDAXEX2 RAXE D* 6 NULL S_REDAXEX3 +S_REDAXEX3 RAXE E* 6 NULL S_NULL + + +// +// sorcerer +// +$ MT_SORCERER1 +doomednum 7 +spawnstate S_SRCR1_LOOK1 +spawnhealth 2000 +seestate S_SRCR1_WALK1 +seesound sfx_sbtsit +attacksound sfx_sbtatk +painstate S_SRCR1_PAIN1 +painchance 56 +painsound sfx_sbtpai +meleestate 0 +missilestate S_SRCR1_ATK1 +deathstate S_SRCR1_DIE1 +deathsound sfx_sbtdth +speed 16 +radius 28 +height 100 +mass 800 +activesound sfx_sbtact +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL +flags2 MF2_FOOTCLIP|MF2_PASSMOBJ|MF2_BOSS + +$ MT_SRCRFX1 +spawnstate S_SRCRFX1_1 +seesound 0 +deathstate S_SRCRFXI1_1 +deathsound 0 +speed 20 +radius 10 +height 10 +damage 10 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_NOTELEPORT|MF2_FIREDAMAGE + +$ MT_SORCERER2 +spawnstate S_SOR2_LOOK1 +spawnhealth 3500 +seestate S_SOR2_WALK1 +seesound sfx_sorsit +attacksound sfx_soratk +painstate S_SOR2_PAIN1 +painchance 32 +painsound sfx_sorpai +meleestate 0 +missilestate S_SOR2_ATK1 +deathstate S_SOR2_DIE1 +deathsound 0 +speed 14 +radius 16 +height 70 +mass 300 +activesound sfx_soract +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL|MF_DROPOFF +flags2 MF2_FOOTCLIP|MF2_PASSMOBJ|MF2_BOSS + +$ MT_SOR2FX1 +spawnstate S_SOR2FX1_1 +seesound 0 +deathstate S_SOR2FXI1_1 +deathsound 0 +speed 20 +radius 10 +height 6 +damage 1 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_NOTELEPORT + +$ MT_SOR2FXSPARK +spawnstate S_SOR2FXSPARK1 +flags MF_NOBLOCKMAP|MF_NOGRAVITY +flags2 MF2_NOTELEPORT|MF2_CANNOTPUSH + +$ MT_SOR2FX2 +spawnstate S_SOR2FX2_1 +seesound 0 +deathstate S_SOR2FXI2_1 +deathsound 0 +speed 6 +radius 10 +height 6 +damage 10 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_NOTELEPORT + +$ MT_SOR2TELEFADE +spawnstate S_SOR2TELEFADE1 +flags MF_NOBLOCKMAP + +S_SRCR1_LOOK1 SRCR A 10 A_Look S_SRCR1_LOOK2 +S_SRCR1_LOOK2 SRCR B 10 A_Look S_SRCR1_LOOK1 + +S_SRCR1_WALK1 SRCR A 5 A_Sor1Chase S_SRCR1_WALK2 +S_SRCR1_WALK2 SRCR B 5 A_Sor1Chase S_SRCR1_WALK3 +S_SRCR1_WALK3 SRCR C 5 A_Sor1Chase S_SRCR1_WALK4 +S_SRCR1_WALK4 SRCR D 5 A_Sor1Chase S_SRCR1_WALK1 + +S_SRCR1_PAIN1 SRCR Q 6 A_Sor1Pain S_SRCR1_WALK1 + +S_SRCR1_ATK1 SRCR Q 7 A_FaceTarget S_SRCR1_ATK2 +S_SRCR1_ATK2 SRCR R 6 A_FaceTarget S_SRCR1_ATK3 +S_SRCR1_ATK3 SRCR S 10 A_Srcr1Attack S_SRCR1_WALK1 + +S_SRCR1_ATK4 SRCR S 10 A_FaceTarget S_SRCR1_ATK5 +S_SRCR1_ATK5 SRCR Q 7 A_FaceTarget S_SRCR1_ATK6 +S_SRCR1_ATK6 SRCR R 6 A_FaceTarget S_SRCR1_ATK7 +S_SRCR1_ATK7 SRCR S 10 A_Srcr1Attack S_SRCR1_WALK1 + +S_SRCR1_DIE1 SRCR E 7 NULL S_SRCR1_DIE2 +S_SRCR1_DIE2 SRCR F 7 A_Scream S_SRCR1_DIE3 +S_SRCR1_DIE3 SRCR G 7 NULL S_SRCR1_DIE4 +S_SRCR1_DIE4 SRCR H 6 NULL S_SRCR1_DIE5 +S_SRCR1_DIE5 SRCR I 6 NULL S_SRCR1_DIE6 +S_SRCR1_DIE6 SRCR J 6 NULL S_SRCR1_DIE7 +S_SRCR1_DIE7 SRCR K 6 NULL S_SRCR1_DIE8 +S_SRCR1_DIE8 SRCR L 25 A_SorZap S_SRCR1_DIE9 +S_SRCR1_DIE9 SRCR M 5 NULL S_SRCR1_DIE10 +S_SRCR1_DIE10 SRCR N 5 NULL S_SRCR1_DIE11 +S_SRCR1_DIE11 SRCR O 4 NULL S_SRCR1_DIE12 +S_SRCR1_DIE12 SRCR L 20 A_SorZap S_SRCR1_DIE13 +S_SRCR1_DIE13 SRCR M 5 NULL S_SRCR1_DIE14 +S_SRCR1_DIE14 SRCR N 5 NULL S_SRCR1_DIE15 +S_SRCR1_DIE15 SRCR O 4 NULL S_SRCR1_DIE16 +S_SRCR1_DIE16 SRCR L 12 NULL S_SRCR1_DIE17 +S_SRCR1_DIE17 SRCR P -1 A_SorcererRise S_NULL + +S_SRCRFX1_1 FX14 A* 6 NULL S_SRCRFX1_2 +S_SRCRFX1_2 FX14 B* 6 NULL S_SRCRFX1_3 +S_SRCRFX1_3 FX14 C* 6 NULL S_SRCRFX1_1 + +S_SRCRFXI1_1 FX14 D* 5 NULL S_SRCRFXI1_2 +S_SRCRFXI1_2 FX14 E* 5 NULL S_SRCRFXI1_3 +S_SRCRFXI1_3 FX14 F* 5 NULL S_SRCRFXI1_4 +S_SRCRFXI1_4 FX14 G* 5 NULL S_SRCRFXI1_5 +S_SRCRFXI1_5 FX14 H* 5 NULL S_NULL + +S_SOR2_RISE1 SOR2 A 4 NULL S_SOR2_RISE2 +S_SOR2_RISE2 SOR2 B 4 NULL S_SOR2_RISE3 +S_SOR2_RISE3 SOR2 C 4 A_SorRise S_SOR2_RISE4 +S_SOR2_RISE4 SOR2 D 4 NULL S_SOR2_RISE5 +S_SOR2_RISE5 SOR2 E 4 NULL S_SOR2_RISE6 +S_SOR2_RISE6 SOR2 F 4 NULL S_SOR2_RISE7 +S_SOR2_RISE7 SOR2 G 12 A_SorSightSnd S_SOR2_WALK1 + +S_SOR2_LOOK1 SOR2 M 10 A_Look S_SOR2_LOOK2 +S_SOR2_LOOK2 SOR2 N 10 A_Look S_SOR2_LOOK1 + +S_SOR2_WALK1 SOR2 M 4 A_Chase S_SOR2_WALK2 +S_SOR2_WALK2 SOR2 N 4 A_Chase S_SOR2_WALK3 +S_SOR2_WALK3 SOR2 O 4 A_Chase S_SOR2_WALK4 +S_SOR2_WALK4 SOR2 P 4 A_Chase S_SOR2_WALK1 + +S_SOR2_PAIN1 SOR2 Q 3 NULL S_SOR2_PAIN2 +S_SOR2_PAIN2 SOR2 Q 6 A_Pain S_SOR2_WALK1 + +S_SOR2_ATK1 SOR2 R 9 A_Srcr2Decide S_SOR2_ATK2 +S_SOR2_ATK2 SOR2 S 9 A_FaceTarget S_SOR2_ATK3 +S_SOR2_ATK3 SOR2 T 20 A_Srcr2Attack S_SOR2_WALK1 + +S_SOR2_TELE1 SOR2 L 6 NULL S_SOR2_TELE2 +S_SOR2_TELE2 SOR2 K 6 NULL S_SOR2_TELE3 +S_SOR2_TELE3 SOR2 J 6 NULL S_SOR2_TELE4 +S_SOR2_TELE4 SOR2 I 6 NULL S_SOR2_TELE5 +S_SOR2_TELE5 SOR2 H 6 NULL S_SOR2_TELE6 +S_SOR2_TELE6 SOR2 G 6 NULL S_SOR2_WALK1 + +S_SOR2_DIE1 SDTH A 8 A_Sor2DthInit S_SOR2_DIE2 +S_SOR2_DIE2 SDTH B 8 NULL S_SOR2_DIE3 +S_SOR2_DIE3 SDTH C 8 A_SorDSph S_SOR2_DIE4 +S_SOR2_DIE4 SDTH D 7 NULL S_SOR2_DIE5 +S_SOR2_DIE5 SDTH E 7 NULL S_SOR2_DIE6 +S_SOR2_DIE6 SDTH F 7 A_Sor2DthLoop S_SOR2_DIE7 +S_SOR2_DIE7 SDTH G 6 A_SorDExp S_SOR2_DIE8 +S_SOR2_DIE8 SDTH H 6 NULL S_SOR2_DIE9 +S_SOR2_DIE9 SDTH I 18 NULL S_SOR2_DIE10 +S_SOR2_DIE10 SDTH J 6 A_NoBlocking S_SOR2_DIE11 +S_SOR2_DIE11 SDTH K 6 A_SorDBon S_SOR2_DIE12 +S_SOR2_DIE12 SDTH L 6 NULL S_SOR2_DIE13 +S_SOR2_DIE13 SDTH M 6 NULL S_SOR2_DIE14 +S_SOR2_DIE14 SDTH N 6 NULL S_SOR2_DIE15 +S_SOR2_DIE15 SDTH O -1 A_BossDeath S_NULL + +S_SOR2FX1_1 FX16 A* 3 A_BlueSpark S_SOR2FX1_2 +S_SOR2FX1_2 FX16 B* 3 A_BlueSpark S_SOR2FX1_3 +S_SOR2FX1_3 FX16 C* 3 A_BlueSpark S_SOR2FX1_1 + +S_SOR2FXI1_1 FX16 G* 5 A_Explode S_SOR2FXI1_2 +S_SOR2FXI1_2 FX16 H* 5 NULL S_SOR2FXI1_3 +S_SOR2FXI1_3 FX16 I* 5 NULL S_SOR2FXI1_4 +S_SOR2FXI1_4 FX16 J* 5 NULL S_SOR2FXI1_5 +S_SOR2FXI1_5 FX16 K* 5 NULL S_SOR2FXI1_6 +S_SOR2FXI1_6 FX16 L* 5 NULL S_NULL + +S_SOR2FXSPARK1 FX16 D* 12 NULL S_SOR2FXSPARK2 +S_SOR2FXSPARK2 FX16 E* 12 NULL S_SOR2FXSPARK3 +S_SOR2FXSPARK3 FX16 F* 12 NULL S_NULL + +S_SOR2FX2_1 FX11 A* 35 NULL S_SOR2FX2_2 +S_SOR2FX2_2 FX11 A* 5 A_GenWizard S_SOR2FX2_3 +S_SOR2FX2_3 FX11 B* 5 NULL S_SOR2FX2_2 + +S_SOR2FXI2_1 FX11 C* 5 NULL S_SOR2FXI2_2 +S_SOR2FXI2_2 FX11 D* 5 NULL S_SOR2FXI2_3 +S_SOR2FXI2_3 FX11 E* 5 NULL S_SOR2FXI2_4 +S_SOR2FXI2_4 FX11 F* 5 NULL S_SOR2FXI2_5 +S_SOR2FXI2_5 FX11 G* 5 NULL S_NULL + +S_SOR2TELEFADE1 SOR2 G 8 NULL S_SOR2TELEFADE2 +S_SOR2TELEFADE2 SOR2 H 6 NULL S_SOR2TELEFADE3 +S_SOR2TELEFADE3 SOR2 I 6 NULL S_SOR2TELEFADE4 +S_SOR2TELEFADE4 SOR2 J 6 NULL S_SOR2TELEFADE5 +S_SOR2TELEFADE5 SOR2 K 6 NULL S_SOR2TELEFADE6 +S_SOR2TELEFADE6 SOR2 L 6 NULL S_NULL + + +// +// minotaur +// +$ MT_MINOTAUR +doomednum 9 +spawnstate S_MNTR_LOOK1 +spawnhealth 3000 +seestate S_MNTR_WALK1 +seesound sfx_minsit +attacksound sfx_minat1 +painstate S_MNTR_PAIN1 +painchance 25 +painsound sfx_minpai +meleestate S_MNTR_ATK1_1 +missilestate S_MNTR_ATK2_1 +deathstate S_MNTR_DIE1 +deathsound sfx_mindth +speed 16 +radius 28 +height 100 +damage 7 +mass 800 +activesound sfx_minact +flags MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL|MF_DROPOFF +flags2 MF2_FOOTCLIP|MF2_PASSMOBJ|MF2_BOSS + +$ MT_MNTRFX1 +spawnstate S_MNTRFX1_1 +seesound 0 +deathstate S_MNTRFXI1_1 +deathsound 0 +speed 20 +radius 10 +height 6 +damage 3 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_NOTELEPORT|MF2_FIREDAMAGE + +$ MT_MNTRFX2 +spawnstate S_MNTRFX2_1 +seesound 0 +deathstate S_MNTRFXI2_1 +deathsound sfx_phohit +speed 14 +radius 5 +height 12 +damage 4 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_NOTELEPORT|MF2_FIREDAMAGE + +$ MT_MNTRFX3 +spawnstate S_MNTRFX3_1 +seesound 0 +deathstate S_MNTRFXI2_1 +deathsound sfx_phohit +radius 8 +damage 4 +flags MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY +flags2 MF2_NOTELEPORT|MF2_FIREDAMAGE + +S_MNTR_LOOK1 MNTR A 10 A_Look S_MNTR_LOOK2 +S_MNTR_LOOK2 MNTR B 10 A_Look S_MNTR_LOOK1 + +S_MNTR_WALK1 MNTR A 5 A_Chase S_MNTR_WALK2 +S_MNTR_WALK2 MNTR B 5 A_Chase S_MNTR_WALK3 +S_MNTR_WALK3 MNTR C 5 A_Chase S_MNTR_WALK4 +S_MNTR_WALK4 MNTR D 5 A_Chase S_MNTR_WALK1 + +S_MNTR_ATK1_1 MNTR V 10 A_FaceTarget S_MNTR_ATK1_2 +S_MNTR_ATK1_2 MNTR W 7 A_FaceTarget S_MNTR_ATK1_3 +S_MNTR_ATK1_3 MNTR X 12 A_MinotaurAtk1 S_MNTR_WALK1 + +S_MNTR_ATK2_1 MNTR V 10 A_MinotaurDecide S_MNTR_ATK2_2 +S_MNTR_ATK2_2 MNTR Y 4 A_FaceTarget S_MNTR_ATK2_3 +S_MNTR_ATK2_3 MNTR Z 9 A_MinotaurAtk2 S_MNTR_WALK1 + +S_MNTR_ATK3_1 MNTR V 10 A_FaceTarget S_MNTR_ATK3_2 +S_MNTR_ATK3_2 MNTR W 7 A_FaceTarget S_MNTR_ATK3_3 +S_MNTR_ATK3_3 MNTR X 12 A_MinotaurAtk3 S_MNTR_WALK1 +S_MNTR_ATK3_4 MNTR X 12 NULL S_MNTR_ATK3_1 + +S_MNTR_ATK4_1 MNTR U 2 A_MinotaurCharge S_MNTR_ATK4_1 + +S_MNTR_PAIN1 MNTR E 3 NULL S_MNTR_PAIN2 +S_MNTR_PAIN2 MNTR E 6 A_Pain S_MNTR_WALK1 + +S_MNTR_DIE1 MNTR F 6 NULL S_MNTR_DIE2 +S_MNTR_DIE2 MNTR G 5 NULL S_MNTR_DIE3 +S_MNTR_DIE3 MNTR H 6 A_Scream S_MNTR_DIE4 +S_MNTR_DIE4 MNTR I 5 NULL S_MNTR_DIE5 +S_MNTR_DIE5 MNTR J 6 NULL S_MNTR_DIE6 +S_MNTR_DIE6 MNTR K 5 NULL S_MNTR_DIE7 +S_MNTR_DIE7 MNTR L 6 NULL S_MNTR_DIE8 +S_MNTR_DIE8 MNTR M 5 A_NoBlocking S_MNTR_DIE9 +S_MNTR_DIE9 MNTR N 6 NULL S_MNTR_DIE10 +S_MNTR_DIE10 MNTR O 5 NULL S_MNTR_DIE11 +S_MNTR_DIE11 MNTR P 6 NULL S_MNTR_DIE12 +S_MNTR_DIE12 MNTR Q 5 NULL S_MNTR_DIE13 +S_MNTR_DIE13 MNTR R 6 NULL S_MNTR_DIE14 +S_MNTR_DIE14 MNTR S 5 NULL S_MNTR_DIE15 +S_MNTR_DIE15 MNTR T -1 A_BossDeath S_NULL + +S_MNTRFX1_1 FX12 A* 6 NULL S_MNTRFX1_2 +S_MNTRFX1_2 FX12 B* 6 NULL S_MNTRFX1_1 + +S_MNTRFXI1_1 FX12 C* 5 NULL S_MNTRFXI1_2 +S_MNTRFXI1_2 FX12 D* 5 NULL S_MNTRFXI1_3 +S_MNTRFXI1_3 FX12 E* 5 NULL S_MNTRFXI1_4 +S_MNTRFXI1_4 FX12 F* 5 NULL S_MNTRFXI1_5 +S_MNTRFXI1_5 FX12 G* 5 NULL S_MNTRFXI1_6 +S_MNTRFXI1_6 FX12 H* 5 NULL S_NULL + +S_MNTRFX2_1 FX13 A 2 A_MntrFloorFire S_MNTRFX2_1 +S_MNTRFXI2_1 FX13 I* 4 A_Explode S_MNTRFXI2_2 +S_MNTRFXI2_2 FX13 J* 4 NULL S_MNTRFXI2_3 +S_MNTRFXI2_3 FX13 K* 4 NULL S_MNTRFXI2_4 +S_MNTRFXI2_4 FX13 L* 4 NULL S_MNTRFXI2_5 +S_MNTRFXI2_5 FX13 M* 4 NULL S_NULL + +S_MNTRFX3_1 FX13 D* 4 NULL S_MNTRFX3_2 +S_MNTRFX3_2 FX13 C* 4 NULL S_MNTRFX3_3 +S_MNTRFX3_3 FX13 B* 5 NULL S_MNTRFX3_4 +S_MNTRFX3_4 FX13 C* 5 NULL S_MNTRFX3_5 +S_MNTRFX3_5 FX13 D* 5 NULL S_MNTRFX3_6 +S_MNTRFX3_6 FX13 E* 5 NULL S_MNTRFX3_7 +S_MNTRFX3_7 FX13 F* 4 NULL S_MNTRFX3_8 +S_MNTRFX3_8 FX13 G* 4 NULL S_MNTRFX3_9 +S_MNTRFX3_9 FX13 H* 4 NULL S_NULL + + +// +// keys +// +$ MT_AKYY doomednum 73 spawnstate S_AKYY1 flags MF_SPECIAL|MF_NOTDMATCH +$ MT_BKYY doomednum 79 spawnstate S_BKYY1 flags MF_SPECIAL|MF_NOTDMATCH +$ MT_CKEY doomednum 80 spawnstate S_CKYY1 flags MF_SPECIAL|MF_NOTDMATCH + +S_AKYY1 AKYY A* 3 NULL S_AKYY2 +S_AKYY2 AKYY B* 3 NULL S_AKYY3 +S_AKYY3 AKYY C* 3 NULL S_AKYY4 +S_AKYY4 AKYY D* 3 NULL S_AKYY5 +S_AKYY5 AKYY E* 3 NULL S_AKYY6 +S_AKYY6 AKYY F* 3 NULL S_AKYY7 +S_AKYY7 AKYY G* 3 NULL S_AKYY8 +S_AKYY8 AKYY H* 3 NULL S_AKYY9 +S_AKYY9 AKYY I* 3 NULL S_AKYY10 +S_AKYY10 AKYY J* 3 NULL S_AKYY1 + +S_BKYY1 BKYY A* 3 NULL S_BKYY2 +S_BKYY2 BKYY B* 3 NULL S_BKYY3 +S_BKYY3 BKYY C* 3 NULL S_BKYY4 +S_BKYY4 BKYY D* 3 NULL S_BKYY5 +S_BKYY5 BKYY E* 3 NULL S_BKYY6 +S_BKYY6 BKYY F* 3 NULL S_BKYY7 +S_BKYY7 BKYY G* 3 NULL S_BKYY8 +S_BKYY8 BKYY H* 3 NULL S_BKYY9 +S_BKYY9 BKYY I* 3 NULL S_BKYY10 +S_BKYY10 BKYY J* 3 NULL S_BKYY1 + +S_CKYY1 CKYY A* 3 NULL S_CKYY2 +S_CKYY2 CKYY B* 3 NULL S_CKYY3 +S_CKYY3 CKYY C* 3 NULL S_CKYY4 +S_CKYY4 CKYY D* 3 NULL S_CKYY5 +S_CKYY5 CKYY E* 3 NULL S_CKYY6 +S_CKYY6 CKYY F* 3 NULL S_CKYY7 +S_CKYY7 CKYY G* 3 NULL S_CKYY8 +S_CKYY8 CKYY H* 3 NULL S_CKYY9 +S_CKYY9 CKYY I* 3 NULL S_CKYY1 + + +// +// ammo +// +$ MT_AMGWNDWIMPY +doomednum 10 +spawnstate S_AMG1 +spawnhealth 10 +flags MF_SPECIAL + +$ MT_AMGWNDHEFTY +doomednum 12 +spawnstate S_AMG2_1 +spawnhealth 50 +flags MF_SPECIAL + +$ MT_AMMACEWIMPY +doomednum 13 +spawnstate S_AMM1 +spawnhealth 20 +flags MF_SPECIAL + +$ MT_AMMACEHEFTY +doomednum 16 +spawnstate S_AMM2 +spawnhealth 100 +flags MF_SPECIAL + +$ MT_AMCBOWWIMPY +doomednum 18 +spawnstate S_AMC1 +spawnhealth 5 +flags MF_SPECIAL + +$ MT_AMCBOWHEFTY +doomednum 19 +spawnstate S_AMC2_1 +spawnhealth 20 +flags MF_SPECIAL + +$ MT_AMSKRDWIMPY +doomednum 20 +spawnstate S_AMS1_1 +spawnhealth 20 +flags MF_SPECIAL + +$ MT_AMSKRDHEFTY +doomednum 21 +spawnstate S_AMS2_1 +spawnhealth 100 +flags MF_SPECIAL + +$ MT_AMPHRDWIMPY +doomednum 22 +spawnstate S_AMP1_1 +spawnhealth 1 +flags MF_SPECIAL + +$ MT_AMPHRDHEFTY +doomednum 23 +spawnstate S_AMP2_1 +spawnhealth 10 +flags MF_SPECIAL + +$ MT_AMBLSRWIMPY +doomednum 54 +spawnstate S_AMB1_1 +spawnhealth 10 +flags MF_SPECIAL + +$ MT_AMBLSRHEFTY +doomednum 55 +spawnstate S_AMB2_1 +spawnhealth 25 +flags MF_SPECIAL + +S_AMG1 AMG1 A -1 NULL S_NULL + +S_AMG2_1 AMG2 A 4 NULL S_AMG2_2 +S_AMG2_2 AMG2 B 4 NULL S_AMG2_3 +S_AMG2_3 AMG2 C 4 NULL S_AMG2_1 + +S_AMM1 AMM1 A -1 NULL S_NULL +S_AMM2 AMM2 A -1 NULL S_NULL + +S_AMC1 AMC1 A -1 NULL S_NULL +S_AMC2_1 AMC2 A 5 NULL S_AMC2_2 +S_AMC2_2 AMC2 B 5 NULL S_AMC2_3 +S_AMC2_3 AMC2 C 5 NULL S_AMC2_1 + +S_AMS1_1 AMS1 A 5 NULL S_AMS1_2 +S_AMS1_2 AMS1 B 5 NULL S_AMS1_1 +S_AMS2_1 AMS2 A 5 NULL S_AMS2_2 +S_AMS2_2 AMS2 B 5 NULL S_AMS2_1 + +S_AMP1_1 AMP1 A 4 NULL S_AMP1_2 +S_AMP1_2 AMP1 B 4 NULL S_AMP1_3 +S_AMP1_3 AMP1 C 4 NULL S_AMP1_1 +S_AMP2_1 AMP2 A 4 NULL S_AMP2_2 +S_AMP2_2 AMP2 B 4 NULL S_AMP2_3 +S_AMP2_3 AMP2 C 4 NULL S_AMP2_1 + +S_AMB1_1 AMB1 A 4 NULL S_AMB1_2 +S_AMB1_2 AMB1 B 4 NULL S_AMB1_3 +S_AMB1_3 AMB1 C 4 NULL S_AMB1_1 +S_AMB2_1 AMB2 A 4 NULL S_AMB2_2 +S_AMB2_2 AMB2 B 4 NULL S_AMB2_3 +S_AMB2_3 AMB2 C 4 NULL S_AMB2_1 + + +// +// sounds +// +$ MT_SOUNDWIND +doomednum 42 +spawnstate S_SND_WIND +flags MF_NOBLOCKMAP|MF_NOSECTOR + +$ MT_SOUNDWATERFALL +doomednum 41 +spawnstate S_SND_WATERFALL +flags MF_NOBLOCKMAP|MF_NOSECTOR + +S_SND_WIND AMG1 A 100 A_ESound S_SND_WIND +S_SND_WATERFALL AMG1 A 85 A_ESound S_SND_WATERFALL diff --git a/code/v_draw.c b/code/v_draw.c index 14ef95282f..30f90823f0 100644 --- a/code/v_draw.c +++ b/code/v_draw.c @@ -116,23 +116,53 @@ void V_DrawPatchSP (byte *source, byte *dest, int count, int pitch, int yinc) // Translucent patch drawers (always 50%) void V_DrawLucentPatchP (byte *source, byte *dest, int count, int pitch) { - byte *map = TransTable + 65536 * 2; + unsigned int *fg2rgb, *bg2rgb; + + { + fixed_t fglevel, bglevel; + + fglevel = 0x8000 & ~0x3ff; + bglevel = FRACUNIT-fglevel; + fg2rgb = Col2RGB8[fglevel>>10]; + bg2rgb = Col2RGB8[bglevel>>10]; + } do { - *dest = map[(*dest)|((*source++)<<8)]; + unsigned int fg = *source++; + unsigned int bg = *dest; + + fg = fg2rgb[fg]; + bg = bg2rgb[bg]; + fg = (fg+bg) | 0xf07c3e1f; + *dest = RGB8k[0][0][(fg>>5) & (fg>>19)]; dest += pitch; } while (--count); } void V_DrawLucentPatchSP (byte *source, byte *dest, int count, int pitch, int yinc) { - byte *map = TransTable + 65536 * 2; + unsigned int *fg2rgb, *bg2rgb; int c = 0; + { + fixed_t fglevel, bglevel; + + fglevel = 0x8000 & ~0x3ff; + bglevel = FRACUNIT-fglevel; + fg2rgb = Col2RGB8[fglevel>>10]; + bg2rgb = Col2RGB8[bglevel>>10]; + } + do { - *dest = map[(*dest)|((source[c >> 16])<<8)]; + unsigned int fg = source[c >> 16]; + unsigned int bg = *dest; + + fg = fg2rgb[fg]; + bg = bg2rgb[bg]; + fg = (fg+bg) | 0xf07c3e1f; + *dest = RGB8k[0][0][(fg>>5) & (fg>>19)]; dest += pitch; c += yinc; } while (--count); @@ -165,23 +195,55 @@ void V_DrawTranslatedPatchSP (byte *source, byte *dest, int count, int pitch, in // Translated, translucent patch drawers void V_DrawTlatedLucentPatchP (byte *source, byte *dest, int count, int pitch) { - byte *map = TransTable + 65536 * 2; + unsigned int *fg2rgb, *bg2rgb; + byte *colormap = V_ColorMap; + + { + fixed_t fglevel, bglevel; + + fglevel = 0x8000 & ~0x3ff; + bglevel = FRACUNIT-fglevel; + fg2rgb = Col2RGB8[fglevel>>10]; + bg2rgb = Col2RGB8[bglevel>>10]; + } do { - *dest = map[(*dest)|(V_ColorMap[*source++]<<8)]; + unsigned int fg = colormap[*source++]; + unsigned int bg = *dest; + + fg = fg2rgb[fg]; + bg = bg2rgb[bg]; + fg = (fg+bg) | 0xf07c3e1f; + *dest = RGB8k[0][0][(fg>>5) & (fg>>19)]; dest += pitch; } while (--count); } void V_DrawTlatedLucentPatchSP (byte *source, byte *dest, int count, int pitch, int yinc) { - byte *map = TransTable + 65536 * 2; int c = 0; + unsigned int *fg2rgb, *bg2rgb; + byte *colormap = V_ColorMap; + + { + fixed_t fglevel, bglevel; + + fglevel = 0x8000 & ~0x3ff; + bglevel = FRACUNIT-fglevel; + fg2rgb = Col2RGB8[fglevel>>10]; + bg2rgb = Col2RGB8[bglevel>>10]; + } do { - *dest = map[(*dest)|(V_ColorMap[source[c >> 16]]<<8)]; + unsigned int fg = colormap[source[c >> 16]]; + unsigned int bg = *dest; + + fg = fg2rgb[fg]; + bg = bg2rgb[bg]; + fg = (fg+bg) | 0xf07c3e1f; + *dest = RGB8k[0][0][(fg>>5) & (fg>>19)]; dest += pitch; c += yinc; } while (--count); @@ -210,12 +272,26 @@ void V_DrawColoredPatchP (byte *source, byte *dest, int count, int pitch) // care about the patch's actual contents, just it's outline. void V_DrawColorLucentPatchP (byte *source, byte *dest, int count, int pitch) { - byte *map = TransTable + 65536 * 2; - int fill = V_ColorFill << 8; + unsigned int *bg2rgb; + unsigned int fg; + byte *colormap = V_ColorMap; + + { + unsigned int *fg2rgb; + fixed_t fglevel, bglevel; + + fglevel = 0x8000 & ~0x3ff; + bglevel = FRACUNIT-fglevel; + fg2rgb = Col2RGB8[fglevel>>10]; + bg2rgb = Col2RGB8[bglevel>>10]; + fg = fg2rgb[V_ColorFill]; + } do { - *dest = map[(*dest)|fill]; + unsigned int bg = bg2rgb[*dest]; + bg = (bg+bg) | 0xf07c3e1f; + *dest = RGB8k[0][0][(bg>>5) & (bg>>19)]; dest += pitch; } while (--count); } diff --git a/code/version.h b/code/version.h index 0514760dbb..0dede396fd 100644 --- a/code/version.h +++ b/code/version.h @@ -6,6 +6,6 @@ enum { VERSION = 117 }; #define VERSIONSTR "117" #define DOTVERSIONSTR "1.17:" #define GAMEVER (0x0111) -#define SAVESIG "ZDOOMSAVE117 " // Needs to be exactly 16 chars long +#define SAVESIG "ZDOOMSAVE117b " // Needs to be exactly 16 chars long #endif //__VERSION_H__ \ No newline at end of file diff --git a/code/w_wad.h b/code/w_wad.h index 74fdcf7e26..66627e6dc1 100644 --- a/code/w_wad.h +++ b/code/w_wad.h @@ -68,7 +68,7 @@ typedef struct typedef struct lumpinfo_s { char name[8]; - FILE *handle; // [RH] Use stdio routines + int handle; int position; int size; @@ -124,8 +124,8 @@ void uppercopy (char *to, const char *from); // [RH] Copies the lump name to to using uppercopy void W_GetLumpName (char *to, int lump); -// [RH] Returns file ptr for specified lump -FILE *W_GetLumpFile (int lump); +// [RH] Returns file handle for specified lump +int W_GetLumpFile (int lump); // [RH] Put a lump in a certain namespace void W_SetLumpNamespace (int lump, int nmspace); diff --git a/code/win32/I_input.c b/code/win32/I_input.c index 94f9f235cd..ceb623c827 100644 --- a/code/win32/I_input.c +++ b/code/win32/I_input.c @@ -1096,6 +1096,8 @@ void I_GetEvent(void) else MouseRead_Win32 (); } + if (usejoystick->value) + DI_JoyCheck (); } @@ -1112,6 +1114,4 @@ void I_StartTic (void) // void I_StartFrame (void) { - if (usejoystick->value) - DI_JoyCheck (); } diff --git a/code/win32/I_main.c b/code/win32/I_main.c index a89698c28a..4357e36fd5 100644 --- a/code/win32/I_main.c +++ b/code/win32/I_main.c @@ -21,11 +21,9 @@ // //----------------------------------------------------------------------------- - - - #define WIN32_LEAN_AND_MEAN #include +#include #include "resource.h" #include @@ -52,17 +50,27 @@ HWND Window; HINSTANCE hInstance; extern float mb_used; +extern UINT TimerPeriod; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE nothing, LPSTR cmdline, int nCmdShow) { LONG WinWidth, WinHeight; int height, width; RECT cRect; + TIMECAPS tc; g_hInst = hInstance; myargc = __argc; myargv = __argv; + // Set the timer to be as accurate as possible + if (timeGetDevCaps (&tc, sizeof(tc) != TIMERR_NOERROR)) + TimerPeriod = 1; // Assume minimum resolution of 1 ms + else + TimerPeriod = tc.wPeriodMin; + + timeBeginPeriod (TimerPeriod); + /* killough 1/98: diff --git a/code/win32/I_net.c b/code/win32/I_net.c index a5bd7e5eed..3c533ca885 100644 --- a/code/win32/I_net.c +++ b/code/win32/I_net.c @@ -14,18 +14,8 @@ // FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License // for more details. // -// $Log: i_net.c,v $ -// Revision 1.2 1997/12/29 19:50:54 pekangas -// Ported to WinNT/95 environment using Watcom C 10.6. -// Everything expect joystick support is implemented, but networking is -// untested. Crashes way too often with problems in FixedDiv(). -// Compiles with no warnings at warning level 3, uses MIDAS 1.1.1. -// -// Revision 1.1.1.1 1997/12/28 12:59:03 pekangas -// Initial DOOM source release from id Software -// -// // DESCRIPTION: +// Low-level networking code. Uses BSD sockets for UDP networking. // //----------------------------------------------------------------------------- @@ -74,12 +64,15 @@ typedef int SOCKET; #define SOCKET_ERROR -1 #define INVALID_SOCKET -1 #define closesocket close +#define ioctlsocket ioctl #endif #ifdef __WIN32__ # define IPPORT_USERRESERVED 5000 #endif +extern BOOL CheckAbort (void); + static void NetSend (void); static BOOL NetListen (void); @@ -88,64 +81,91 @@ static BOOL NetListen (void); // NETWORKING // -static int DOOMPORT = (IPPORT_USERRESERVED +0x1d ); +static u_short DOOMPORT = (IPPORT_USERRESERVED + 0x1d); +static SOCKET mysocket = INVALID_SOCKET; +static struct sockaddr_in sendaddress[MAXNETNODES]; -static int sendsocket; -static int insocket; - -static struct sockaddr_in sendaddress[MAXNETNODES]; - -void (*netget) (void); -void (*netsend) (void); +void (*netget) (void); +void (*netsend) (void); #ifdef __WIN32__ char *neterror (void); +#else +#define neterror() strerror(errno) #endif +enum +{ + PRE_CONNECT, + PRE_DISCONNECT, + PRE_ALLHERE, + PRE_CONACK, + PRE_ALLHEREACK, + PRE_GO, + PRE_GOACK +}; + +struct PreGamePacket +{ + u_short message; + u_short numnodes; + struct + { + u_long address; + u_short port; + } machines[MAXNETNODES]; +}; // // UDPsocket // -int UDPsocket (void) +SOCKET UDPsocket (void) { SOCKET s; // allocate a socket s = socket (PF_INET, SOCK_DGRAM, IPPROTO_UDP); -#ifdef __WIN32__ - if ( s == INVALID_SOCKET ) - I_FatalError ("can't create socket: %s", neterror()); -#else - if (s<0) - I_FatalError ("can't create socket: %s",strerror(errno)); -#endif - - return (int) s; + if (s == INVALID_SOCKET) + I_FatalError ("can't create socket: %s", neterror ()); + + return s; } // // BindToLocalPort // -void BindToLocalPort (int s, int port) +void BindToLocalPort (SOCKET s, u_short port) { - int v; - struct sockaddr_in address; + int v; + struct sockaddr_in address; memset (&address, 0, sizeof(address)); address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; - address.sin_port = (USHORT)port; + address.sin_port = htons(port); - v = bind ((SOCKET) s, (void *)&address, sizeof(address)); -#ifdef __WIN32__ - if (v == -1) - I_FatalError ("BindToPort: bind: %s", neterror()); -#else - if (v == -1) - I_FatalError ("BindToPort: bind: %s", strerror(errno)); -#endif + v = bind (s, (void *)&address, sizeof(address)); + if (v == SOCKET_ERROR) + I_FatalError ("BindToPort: %s", neterror ()); } +int FindNode (struct sockaddr_in *address) +{ + int i; + + // find remote node number + for (i = 0; inumnodes; i++) + if (address->sin_addr.s_addr == sendaddress[i].sin_addr.s_addr + && address->sin_port == sendaddress[i].sin_port) + break; + + if (i == doomcom->numnodes) + { + // packet is not from one of the players (new game broadcast?) + i = -1; + } + return i; +} // // PacketSend @@ -153,17 +173,12 @@ void BindToLocalPort (int s, int port) void PacketSend (void) { int c; - - // byte swap - netbuffer->checksum = LONG(netbuffer->checksum); - - //printf ("sending %i\n",gametic); - c = sendto (sendsocket , (const char*)netbuffer, doomcom->datalength + + //printf ("sending %i\n",gametic); + c = sendto (mysocket , (const char*)netbuffer, doomcom->datalength ,0,(void *)&sendaddress[doomcom->remotenode] ,sizeof(sendaddress[doomcom->remotenode])); - netbuffer->checksum = LONG(netbuffer->checksum); - // if (c == -1) // I_Error ("SendPacket error: %s",strerror(errno)); } @@ -174,93 +189,435 @@ void PacketSend (void) // void PacketGet (void) { - int i; - int c; - struct sockaddr_in fromaddress; - int fromlen; - + int c, fromlen; + struct sockaddr_in fromaddress; + fromlen = sizeof(fromaddress); - c = recvfrom (insocket, (char*)netbuffer, sizeof(doomdata_t), 0 - , (struct sockaddr *)&fromaddress, &fromlen ); - if (c == -1 ) + c = recvfrom (mysocket, (char*)netbuffer, sizeof(doomdata_t), 0 + , (struct sockaddr *)&fromaddress, &fromlen); + + if (c == SOCKET_ERROR) { #ifdef __WIN32__ - if ( WSAGetLastError() != WSAEWOULDBLOCK ) - I_Error("GetPacket: %s",neterror()); + if (WSAGetLastError() != WSAEWOULDBLOCK) + I_Error ("GetPacket: %s", neterror ()); #else if (errno != EWOULDBLOCK) - I_Error ("GetPacket: %s",strerror(errno)); + I_Error ("GetPacket: %s", neterror ()); #endif doomcom->remotenode = -1; // no packet return; } - // find remote node number - for (i = 0; inumnodes; i++) - if ( fromaddress.sin_addr.s_addr == sendaddress[i].sin_addr.s_addr ) - break; - - if (i == doomcom->numnodes) - { - // packet is not from one of the players (new game broadcast) - doomcom->remotenode = -1; // no packet - return; - } - - doomcom->remotenode = (short)i; // good packet from a game player + doomcom->remotenode = (short)FindNode (&fromaddress); doomcom->datalength = (short)c; - - // byte swap - netbuffer->checksum = LONG(netbuffer->checksum); } - - -int GetLocalAddress (void) +/* +struct sockaddr_in *PreGet (void *buffer, int bufferlen) { - char hostname[1024]; - struct hostent* hostentry; // host information entry - int v; + static struct sockaddr_in fromaddress; + int fromlen; + int c; - // get local address - v = gethostname (hostname, sizeof(hostname)); + fromlen = sizeof(fromaddress); + c = recvfrom (mysocket, buffer, bufferlen, 0, + (struct sockaddr *)&fromaddress, &fromlen); + + if (c == SOCKET_ERROR) + { #ifdef __WIN32__ - if (v == -1) - I_FatalError ("GetLocalAddress : gethostname: %s", neterror()); + if (WSAGetLastError() != WSAEWOULDBLOCK) + I_Error ("PreGet: %s", neterror ()); #else - if (v == -1) - I_FatalError ("GetLocalAddress : gethostname: errno %d",errno); -#endif - - hostentry = gethostbyname (hostname); -#ifdef __WIN32__ - if (!hostentry) - I_FatalError ("GetLocalAddress : gethostbyname: %s", neterror()); -#else - if (!hostentry) - I_FatalError ("GetLocalAddress : gethostbyname: couldn't get local host"); -#endif - - return *(int *)hostentry->h_addr_list[0]; + if (errno != EWOULDBLOCK) + I_Error ("PreGet: %s", neterror ()); +#endif + return NULL; // no packet + } + return &fromaddress; } +void PreSend (void *buffer, int bufferlen, struct sockaddr_in *to) +{ + sendto (mysocket, buffer, bufferlen, 0, (void *)to, sizeof(*to)); +} +*/ + +void BuildAddress (struct sockaddr_in *address, char *name) +{ + struct hostent *hostentry; // host information entry + u_short port; + char *portpart; + BOOL isnamed = false; + int curchar; + char c; + + address->sin_family = AF_INET; + + if (portpart = strchr (name, ':')) + { + *portpart = 0; + port = atoi (portpart + 1); + if (!port) + { + Printf (PRINT_HIGH, "Weird port: %s (using %d)\n", portpart + 1, DOOMPORT); + port = DOOMPORT; + } + } + else + { + port = DOOMPORT; + } + address->sin_port = htons(port); + + for (curchar = 0; c = name[curchar]; curchar++) + { + if ((c < '0' || c > '9') && c != '.') + { + isnamed = true; + break; + } + } + + if (!isnamed) + { + address->sin_addr.s_addr = inet_addr (name); + Printf (PRINT_HIGH, "Node number %d address %s\n", doomcom->numnodes, name); + } + else + { + hostentry = gethostbyname (name); + if (!hostentry) + I_FatalError ("gethostbyname: couldn't find %s\n%s", name, neterror()); + address->sin_addr.s_addr = *(int *)hostentry->h_addr_list[0]; + Printf (PRINT_HIGH, "Node number %d hostname %s\n", + doomcom->numnodes, hostentry->h_name); + } + + if (portpart) + *portpart = ':'; +} + +void STACK_ARGS CloseNetwork (void) +{ + if (mysocket != INVALID_SOCKET) + { + closesocket (mysocket); + mysocket = INVALID_SOCKET; + } +#ifdef __WIN32__ + WSACleanup (); +#endif +} + +void StartNetwork (void) +{ + u_long trueval = 1; +#ifdef __WIN32__ + WSADATA wsad; + + if (WSAStartup (0x0101, &wsad)) + { + I_FatalError ("Could not initialize Windows Sockets"); + } +#endif + + atexit (CloseNetwork); + + netsend = PacketSend; + netget = PacketGet; + netgame = true; + + // create communication socket + mysocket = UDPsocket (); + BindToLocalPort (mysocket, DOOMPORT); + ioctlsocket (mysocket, FIONBIO, &trueval); + +} + +void WaitForPlayers (int i) +{ + if (i == myargc - 1) + I_FatalError ("Not enough parameters after -net"); + + StartNetwork (); + + // parse player number and host list + doomcom->consoleplayer = (short)(myargv[i+1][0]-'1'); + Printf (PRINT_HIGH, "Console player number: %d\n", doomcom->consoleplayer); + + doomcom->numnodes = 1; // this node for sure + + i++; + while (++i < myargc && myargv[i][0] != '-' && myargv[i][0] != '+') + { + BuildAddress (&sendaddress[doomcom->numnodes], myargv[i]); + doomcom->numnodes++; + } + + Printf (PRINT_HIGH, "Total players: %d\n", doomcom->numnodes); + + doomcom->id = DOOMCOM_ID; + doomcom->numplayers = doomcom->numnodes; +} + +/* +void SendAbort (void) +{ + u_short dis = htons (PRE_DISCONNECT); + + doomcom->numnodes--; + while (doomcom->numnodes) + { + PreSend (&dis, 2, &sendaddress[--doomcom->numnodes]); + PreSend (&dis, 2, &sendaddress[doomcom->numnodes]); + PreSend (&dis, 2, &sendaddress[doomcom->numnodes]); + PreSend (&dis, 2, &sendaddress[doomcom->numnodes]); + } + I_FatalError ("Network game synchronization aborted."); +} + +void HostGame (int i) +{ + struct PreGamePacket packet; + int numplayers; + BOOL gotack[MAXNETNODES]; + int ackcount; + struct sockaddr_in *from; + int node; + + if ((i == myargc - 1) || !(numplayers = atoi (myargv[i+1]))) + { // No player count specified, assume 2 + numplayers = 2; + } + + StartNetwork (); + doomcom->numnodes = 1; + Printf (PRINT_HIGH, "Waiting for players...\n"); + + // Wait for numplayers-1 different connections + while (doomcom->numnodes < numplayers) + { + while (doomcom->numnodes < numplayers) + { + if (CheckAbort ()) + { + SendAbort (); + } + + while (from = PreGet (&packet, sizeof(packet))) + { + switch (ntohs (packet.message)) + { + case PRE_CONNECT: + node = FindNode (from); + if (node == -1) + { + node = doomcom->numnodes++; + sendaddress[node] = *from; + } + Printf (PRINT_HIGH, "Got connect from node %d\n", node); + packet.message = htons (PRE_CONACK); + PreSend (&packet, 2, from); + break; + case PRE_DISCONNECT: + node = FindNode (from); + if (node >= 0) + { + Printf (PRINT_HIGH, "Got disconnect from node %d\n", node); + doomcom->numnodes--; + while (node < doomcom->numnodes) + { + sendaddress[node] = sendaddress[node+1]; + node++; + } + } + break; + } + } + } + + // It's possible somebody bailed out after all players were found. + // Unfortunately, this isn't guaranteed to catch all of them. + // Oh well. Better than nothing. + while ( (from = PreGet (&packet, sizeof(packet))) ) + { + if (ntohs (packet.message) == PRE_DISCONNECT) + { + node = FindNode (from); + if (node >= 0) + { + doomcom->numnodes--; + while (node < doomcom->numnodes) + { + sendaddress[node] = sendaddress[node+1]; + node++; + } + } + break; + } + } + } + + // Now inform everyone of all machines involved in the game + ackcount = 0; + memset (gotack, 0, sizeof(gotack)); + Printf (PRINT_HIGH, "Sending all here\n"); + while (ackcount < doomcom->numnodes - 1) + { + packet.message = htons (PRE_ALLHERE); + packet.numnodes = htons ((u_short)(doomcom->numnodes - 1)); + for (node = 0; node < doomcom->numnodes - 1; node++) + { + int machine, spot; + + if (!gotack[node]) + { + for (spot = machine = 0; machine < doomcom->numnodes; machine++) + { + if (node != machine) + { + packet.machines[spot].address = + sendaddress[machine].sin_addr.s_addr; + packet.machines[spot].port = + sendaddress[machine].sin_port; + } + } + } + PreSend (&packet, sizeof(packet), &sendaddress[node]); + } + if (CheckAbort ()) + SendAbort (); + + while (from = PreGet (&packet, sizeof(packet))) + { + if (ntohs (packet.message) == PRE_ALLHEREACK) + { + node = FindNode (from); + if (node >= 0) + { + if (!gotack[node]) + { + gotack[node] = true; + ackcount++; + } + } + PreSend (&packet, 2, from); + } + } + } + + // Now go + Printf (PRINT_HIGH, "Go\n"); + packet.message = htons (PRE_GO); + for (node = 0; node < doomcom->numnodes - 1; node++) + { + PreSend (&packet, sizeof(packet), &sendaddress[node]); + PreSend (&packet, sizeof(packet), &sendaddress[node]); + PreSend (&packet, sizeof(packet), &sendaddress[node]); + PreSend (&packet, sizeof(packet), &sendaddress[node]); + } +} + +void SendToHost (u_short message, u_short ackmess, BOOL abortable) +{ + struct sockaddr_in *from; + BOOL waiting = true; + u_short packet; + + message = htons (message); + ackmess = htons (ackmess); + while (waiting) + { + if (abortable && CheckAbort ()) + SendAbort (); + + // Let host know we are here + PreSend (&message, 2, &sendaddress[0]); + + Sleep (300); + // Listen for acknowledgement + while ( (from = PreGet (&packet, sizeof(packet))) ) + { + if (packet == ackmess) + waiting = false; + } + } +} + +void JoinGame (int i) +{ + struct sockaddr_in *from; + BOOL waiting; + struct PreGamePacket packet; + + if ((i == myargc - 1) || (myargv[i+1][0] == '-') || (myargv[i+1][0] == '+')) + I_FatalError ("You need to specify the host machine's address"); + + StartNetwork (); + + // Host is always node 0 + BuildAddress (&sendaddress[0], myargv[i+1]); + + // Let host know we are here + SendToHost (PRE_CONNECT, PRE_CONACK, true); + + // Wait for everyone else to connect + waiting = true; + doomcom->numnodes = 0; + while (waiting) + { + if (CheckAbort ()) + SendAbort (); + Sleep (300); + while (from = PreGet (&packet, sizeof(packet))) + { + switch (ntohs (packet.message)) + { + case PRE_ALLHERE: + if (doomcom->numnodes == 0) + { + int node; + + packet.numnodes = ntohs (packet.numnodes); + doomcom->numnodes = packet.numnodes + 1; + for (node = 0; node < packet.numnodes; node++) + { + sendaddress[node+1].sin_addr.s_addr = + packet.machines[node].address; + sendaddress[node+1].sin_port = + packet.machines[node].port; + } + } + packet.message = htons (PRE_ALLHEREACK); + PreSend (&packet, 2, &sendaddress[0]); + break; + case PRE_GO: + waiting = false; + break; + case PRE_DISCONNECT: + I_FatalError ("Host cancelled the game"); + break; + } + } + } + + // Clear out any waiting packets + while (PreGet (&packet, sizeof(packet))) + ; +} +*/ // // I_InitNetwork // void I_InitNetwork (void) { - u_long trueval = true; - int i; - int p; - struct hostent* hostentry; // host information entry + int i, p; -#ifdef __WIN32__ - WSADATA wsad; -#endif - - doomcom = Malloc (sizeof (*doomcom) ); - memset (doomcom, 0, sizeof(*doomcom) ); + doomcom = Malloc (sizeof (*doomcom)); + memset (doomcom, 0, sizeof(*doomcom)); // set up for network i = M_CheckParm ("-dup"); @@ -284,12 +641,24 @@ void I_InitNetwork (void) if (p && p ... - if ( !(i = M_CheckParm ("-net")) ) { + // -net ... + // -or- + // player 1: -host + // player x: -join + if ( (i = M_CheckParm ("-net")) ) + WaitForPlayers (i); +/* + else if ( (i = M_CheckParm ("-host")) ) + HostGame (i); + else if ( (i = M_CheckParm ("-join")) ) + JoinGame (i); +*/ + else + { // single player game netgame = false; doomcom->id = DOOMCOM_ID; @@ -297,92 +666,6 @@ void I_InitNetwork (void) doomcom->consoleplayer = 0; return; } - -#ifdef __WIN32__ - WSAStartup( 0x0101, &wsad ); -#endif - - netsend = PacketSend; - netget = PacketGet; - netgame = true; - - // parse player number and host list - doomcom->consoleplayer = (short)(myargv[i+1][0]-'1'); - Printf (PRINT_HIGH, "Console player number: %d\n", doomcom->consoleplayer); - - doomcom->numnodes = 1; // this node for sure - - i++; - while (++i < myargc && myargv[i][0] != '-' && myargv[i][0] != '+') - { - int port; - char *portpart; - BOOL isnamed = false; - int curchar; - char c; - - sendaddress[doomcom->numnodes].sin_family = AF_INET; - - if (portpart = strchr (myargv[i], ':')) { - *portpart = 0; - port = atoi (portpart + 1); - if (!port) { - Printf (PRINT_HIGH, "Weird port: %s (using %d)\n", portpart + 1, DOOMPORT); - port = DOOMPORT; - } - } else { - port = DOOMPORT; - } - sendaddress[doomcom->numnodes].sin_port = (USHORT)port; - - for (curchar = 0; c = myargv[i][curchar]; curchar++) { - if ((c < '0' || c > '9') && c != '.') { - isnamed = true; - break; - } - } - - if (!isnamed) - { - sendaddress[doomcom->numnodes].sin_addr.s_addr - = inet_addr (myargv[i]); - Printf (PRINT_HIGH, "Node number %d address %s\n", doomcom->numnodes, myargv[i]); - } - else - { - hostentry = gethostbyname (myargv[i]); - if (!hostentry) -#ifdef __WIN32__ - I_FatalError ("gethostbyname: couldn't find %s\n%s", myargv[i], neterror()); -#else - I_FatalError ("gethostbyname: couldn't find %s\n%s", myargv[i], strerror(errno)); -#endif - sendaddress[doomcom->numnodes].sin_addr.s_addr - = *(int *)hostentry->h_addr_list[0]; - Printf (PRINT_HIGH, "Node number %d hostname %s\n", doomcom->numnodes, hostentry->h_name); - } - - if (portpart) - *portpart = ':'; - - doomcom->numnodes++; - } - - Printf (PRINT_HIGH, "Total players: %d\n", doomcom->numnodes); - - doomcom->id = DOOMCOM_ID; - doomcom->numplayers = doomcom->numnodes; - - // build message to receive - insocket = UDPsocket (); - BindToLocalPort (insocket, DOOMPORT); -#ifdef __WIN32__ - ioctlsocket (insocket, FIONBIO, &trueval); -#else - ioctl (insocket, FIONBIO, &trueval); -#endif - - sendsocket = UDPsocket (); } @@ -401,55 +684,54 @@ void I_NetCmd (void) } #ifdef __WIN32__ -#ifdef _DEBUG char *neterror (void) { static char neterr[16]; int code; switch (code = WSAGetLastError ()) { - case WSAEACCES: return "Permission denied"; - case WSAEADDRINUSE: return "Address already in use"; - case WSAEADDRNOTAVAIL: return "Cannot assign requested address"; - case WSAEAFNOSUPPORT: return "Address family not supported by protocol family"; - case WSAEALREADY: return "Operation already in progress"; - case WSAECONNABORTED: return "Software caused connection abort"; - case WSAECONNREFUSED: return "Connection refused"; - case WSAECONNRESET: return "Connection reset by peer"; - case WSAEDESTADDRREQ: return "Destination address required"; - case WSAEFAULT: return "Bad address"; - case WSAEHOSTDOWN: return "Host is down"; - case WSAEHOSTUNREACH: return "No route to host"; - case WSAEINPROGRESS: return "Operation now in progress"; - case WSAEINTR: return "Interrupted function call"; - case WSAEINVAL: return "Invalid argument"; - case WSAEISCONN: return "Socket is already connected"; - case WSAEMFILE: return "Too many open files"; - case WSAEMSGSIZE: return "Message too long"; - case WSAENETDOWN: return "Network is down"; - case WSAENETRESET: return "Network dropped connection or reset"; - case WSAENETUNREACH: return "Network is unreachable"; - case WSAENOBUFS: return "No buffer space available"; - case WSAENOPROTOOPT: return "Bad protocol option"; - case WSAENOTCONN: return "Socket is not connected"; - case WSAENOTSOCK: return "Socket operation on non-socket"; - case WSAEOPNOTSUPP: return "Operation not supported"; - case WSAEPFNOSUPPORT: return "Protocol family not supported"; - case WSAEPROCLIM: return "Too many processes"; - case WSAEPROTONOSUPPORT: return "Protocol not supported"; - case WSAEPROTOTYPE: return "Protocol wrong type for socket"; - case WSAESHUTDOWN: return "Cannot send after socket shutdown"; - case WSAESOCKTNOSUPPORT: return "Socket type not supported"; - case WSAETIMEDOUT: return "Connection timed out"; - case WSAEWOULDBLOCK: return "Resource temporarily unavailable"; - case WSAHOST_NOT_FOUND: return "Host not found"; - case WSANOTINITIALISED: return "Successful WSAStartup not yet performed"; - case WSANO_DATA: return "Valid name, no data record of requested type"; - case WSANO_RECOVERY: return "This is a non-recoverable error"; - case WSASYSNOTREADY: return "Network subsystem is unavailable"; - case WSATRY_AGAIN: return "Non-authoritative host not found"; - case WSAVERNOTSUPPORTED: return "WINSOCK.DLL version out of range"; - case WSAEDISCON: return "Graceful shutdown in progress"; + case WSAEACCES: return "EACCES"; + case WSAEADDRINUSE: return "EADDRINUSE"; + case WSAEADDRNOTAVAIL: return "EADDRNOTAVAIL"; + case WSAEAFNOSUPPORT: return "EAFNOSUPPORT"; + case WSAEALREADY: return "EALREADY"; + case WSAECONNABORTED: return "ECONNABORTED"; + case WSAECONNREFUSED: return "ECONNREFUSED"; + case WSAECONNRESET: return "ECONNRESET"; + case WSAEDESTADDRREQ: return "EDESTADDRREQ"; + case WSAEFAULT: return "EFAULT"; + case WSAEHOSTDOWN: return "EHOSTDOWN"; + case WSAEHOSTUNREACH: return "EHOSTUNREACH"; + case WSAEINPROGRESS: return "EINPROGRESS"; + case WSAEINTR: return "EINTR"; + case WSAEINVAL: return "EINVAL"; + case WSAEISCONN: return "EISCONN"; + case WSAEMFILE: return "EMFILE"; + case WSAEMSGSIZE: return "EMSGSIZE"; + case WSAENETDOWN: return "ENETDOWN"; + case WSAENETRESET: return "ENETRESET"; + case WSAENETUNREACH: return "ENETUNREACH"; + case WSAENOBUFS: return "ENOBUFS"; + case WSAENOPROTOOPT: return "ENOPROTOOPT"; + case WSAENOTCONN: return "ENOTCONN"; + case WSAENOTSOCK: return "ENOTSOCK"; + case WSAEOPNOTSUPP: return "EOPNOTSUPP"; + case WSAEPFNOSUPPORT: return "EPFNOSUPPORT"; + case WSAEPROCLIM: return "EPROCLIM"; + case WSAEPROTONOSUPPORT: return "EPROTONOSUPPORT"; + case WSAEPROTOTYPE: return "EPROTOTYPE"; + case WSAESHUTDOWN: return "ESHUTDOWN"; + case WSAESOCKTNOSUPPORT: return "ESOCKTNOSUPPORT"; + case WSAETIMEDOUT: return "ETIMEDOUT"; + case WSAEWOULDBLOCK: return "EWOULDBLOCK"; + case WSAHOST_NOT_FOUND: return "HOST_NOT_FOUND"; + case WSANOTINITIALISED: return "NOTINITIALISED"; + case WSANO_DATA: return "NO_DATA"; + case WSANO_RECOVERY: return "NO_RECOVERY"; + case WSASYSNOTREADY: return "SYSNOTREADY"; + case WSATRY_AGAIN: return "TRY_AGAIN"; + case WSAVERNOTSUPPORTED: return "VERNOTSUPPORTED"; + case WSAEDISCON: return "EDISCON"; default: sprintf (neterr, "%d", code); @@ -465,4 +747,3 @@ char *neterror (void) return neterr; } #endif -#endif diff --git a/code/win32/I_sound.c b/code/win32/I_sound.c index 6bee76d7b3..bcb8afa4c5 100644 --- a/code/win32/I_sound.c +++ b/code/win32/I_sound.c @@ -153,7 +153,8 @@ badwave: sfx->link = S_sfx + i; sfx->ms = S_sfx[i].ms; sfx->data = S_sfx[i].data; - sfx->loopdata = S_sfx[i].loopdata; + sfx->normal = S_sfx[i].normal; + sfx->looping = S_sfx[i].looping; return; } @@ -290,7 +291,7 @@ badwave: smp.loop1Start = smp.loop1End = 0; smp.loop1Type = loopNone; - if ( (error = blargh (&smp, 0, (unsigned *)&sfx->data)) != OK) + if ( (error = blargh (&smp, 0, (unsigned *)&sfx->normal)) != OK) I_FatalError ("getsfx: AddSample failed: %s", MIDASgetErrorMessage(error)); /* With loop: */ @@ -299,7 +300,7 @@ badwave: smp.loop1End = smp.sampleLength; smp.loop1Type = loopUnidir; - if ( (error = blargh (&smp, 0, (unsigned *)&sfx->loopdata)) != OK) + if ( (error = blargh (&smp, 0, (unsigned *)&sfx->looping)) != OK) I_FatalError ("getsfx: AddSample failed: %s", MIDASgetErrorMessage(error)); } @@ -308,6 +309,7 @@ badwave: if (sfx->frequency == 0) sfx->frequency = 11025; sfx->ms = (sfx->ms * 1000) / (sfx->frequency); + sfx->data = sfxcopy; } @@ -383,8 +385,8 @@ int I_StartSound (sfxinfo_t *sfx, int vol, int sep, int pitch, int channel, BOOL } ChannelMap[channel].playHandle = MIDASplaySample ( - looping ? (MIDASsample)sfx->loopdata - : (MIDASsample)sfx->data, + looping ? (MIDASsample)sfx->looping + : (MIDASsample)sfx->normal, ChannelMap[channel].midasChannel, 0, PITCH(sfx->frequency,pitch), @@ -593,7 +595,6 @@ void STACK_ARGS I_ShutdownSound (void) size_t len = 0; if (MidasInited) { - Printf (PRINT_HIGH, "I_ShutdownSound: Stopping sounds\n"); if (ChannelMap) { for (i = 0; i < numChannels; i++ ) { if (ChannelMap[i].playHandle) { @@ -607,23 +608,23 @@ void STACK_ARGS I_ShutdownSound (void) I_ShutdownMusic(); - Printf (PRINT_HIGH, "I_ShutdownSound: Uninitializing MIDAS\n"); - // [RH] Free all loaded samples for (i = 0; i < numsfx; i++) { if (!S_sfx[i].link) { - if (S_sfx[i].data) { - MIDASfreeSample ((MIDASsample)S_sfx[i].data); + if (S_sfx[i].normal) { + MIDASfreeSample ((MIDASsample)S_sfx[i].normal); len += S_sfx[i].length; c++; } - if (S_sfx[i].loopdata) { - MIDASfreeSample ((MIDASsample)S_sfx[i].loopdata); + if (S_sfx[i].looping) { + MIDASfreeSample ((MIDASsample)S_sfx[i].looping); + } + if (S_sfx[i].data) { + free (S_sfx[i].data); } } S_sfx[i].data = S_sfx[i].link = NULL; } - Printf (PRINT_HIGH, "%d sounds expunged (%d bytes)\n", c, len); if ( !MIDASstopBackgroundPlay() ) MIDASerror(); diff --git a/code/win32/I_system.c b/code/win32/I_system.c index 64a885a1d1..b0ae18bfec 100644 --- a/code/win32/I_system.c +++ b/code/win32/I_system.c @@ -57,12 +57,16 @@ BOOL STACK_ARGS CheckMMX (char *vendorid); extern HWND Window; -BOOL UseMMX; -BOOL fastdemo; +BOOL UseMMX; +BOOL fastdemo; +UINT TimerPeriod; +UINT TimerEventID; +HANDLE NewTicArrived; -float mb_used = 8.0; +float mb_used = 8.0; int (*I_GetTime) (void); +int (*I_WaitForTic) (int); os_t OSPlatform; @@ -72,19 +76,18 @@ void I_Tactile (int on, int off, int total) on = off = total = 0; } -ticcmd_t emptycmd; -ticcmd_t* I_BaseTiccmd(void) +ticcmd_t emptycmd; +ticcmd_t *I_BaseTiccmd(void) { return &emptycmd; } - -int I_GetHeapSize (void) +int I_GetHeapSize (void) { return (int)(mb_used*1024*1024); } -byte* I_ZoneBase (int *size) +byte *I_ZoneBase (int *size) { int i; @@ -103,7 +106,7 @@ void I_EndRead(void) { } -byte* I_AllocLow(int length) +byte *I_AllocLow(int length) { byte* mem; @@ -133,7 +136,7 @@ unsigned int I_MSTime (void) // I_GetTime // returns time in 1/35th second tics // -int I_GetTimeReally (void) +int I_GetTimePolled (void) { DWORD tm; @@ -144,20 +147,59 @@ int I_GetTimeReally (void) return ((tm-basetime)*TICRATE)/1000; } +int I_WaitForTicPolled (int prevtic) +{ + int time; + + while ((time = I_GetTimePolled()) <= prevtic) + ; + + return time; +} + + +static int tics; + +int I_GetTimeEventDriven (void) +{ + return tics; +} + +int I_WaitForTicEvent (int prevtic) +{ + if (prevtic >= tics) + do + { + WaitForSingleObject (NewTicArrived, INFINITE); + } while (prevtic >= tics); + + return tics; +} + +void CALLBACK TimerTicked (UINT id, UINT msg, DWORD user, DWORD dw1, DWORD dw2) +{ + tics++; + SetEvent (NewTicArrived); +} + // [RH] Increments the time count every time it gets called. // Used only by -fastdemo (just like BOOM). +static int faketic = 0; + int I_GetTimeFake (void) { - static int tic = 0; + return faketic++; +} - return tic++; +int I_WaitForTicFake (int whocares) +{ + return faketic++; } void I_WaitVBL (int count) { // I_WaitVBL is never used to actually synchronize to the // vertical blank. Instead, it's used for delay purposes. - Sleep (1000 * count / 70); } @@ -233,9 +275,35 @@ void I_Init (void) // [RH] Support for BOOM's -fastdemo if (fastdemo) + { I_GetTime = I_GetTimeFake; + I_WaitForTic = I_WaitForTicFake; + } else - I_GetTime = I_GetTimeReally; + { // Use a timer event if possible + NewTicArrived = CreateEvent (NULL, FALSE, FALSE, NULL); + if (NewTicArrived) + { + TimerEventID = timeSetEvent + ( + 1000/TICRATE, + 0, + TimerTicked, + 0, + TIME_PERIODIC + ); + } + if (TimerEventID != 0) + { + I_GetTime = I_GetTimeEventDriven; + I_WaitForTic = I_WaitForTicEvent; + } + else + { // Otherwise, busy-loop with timeGetTime + I_GetTime = I_GetTimePolled; + I_WaitForTic = I_WaitForTicPolled; + } + } I_InitSound(); I_InitInput (Window); @@ -250,6 +318,13 @@ void STACK_ARGS I_Quit (void) { has_exited = 1; /* Prevent infinitely recursive exits -- killough */ + if (TimerEventID) + timeKillEvent (TimerEventID); + if (NewTicArrived) + CloseHandle (NewTicArrived); + + timeEndPeriod (TimerPeriod); + if (demorecording) G_CheckDemoStatus(); M_SaveDefaults (); diff --git a/code/win32/I_system.h b/code/win32/I_system.h index 74ecbcfc34..7b0e10e3c2 100644 --- a/code/win32/I_system.h +++ b/code/win32/I_system.h @@ -56,7 +56,10 @@ byte *I_ZoneBase (int *size); // returns current time in tics. int (*I_GetTime) (void); -int I_GetTimeReally (void); +// like I_GetTime, except it waits for a new tic before returning +int (*I_WaitForTic) (int); + +int I_GetTimePolled (void); int I_GetTimeFake (void); diff --git a/code/win32/I_video.cpp b/code/win32/I_video.cpp index 8b6e16e822..44de8efeee 100644 --- a/code/win32/I_video.cpp +++ b/code/win32/I_video.cpp @@ -104,6 +104,7 @@ cvar_t *ticker; cvar_t *win_stretchx; cvar_t *win_stretchy; cvar_t *fullscreen; +cvar_t *vid_palettehack; BOOL Fullscreen; static modelist_t *IteratorMode; static int IteratorID; @@ -390,6 +391,14 @@ void I_FinishUpdate (void) } lastms = ms; + if (vid_palettehack->value) + { + if (NeedPalChange <= 0) + NeedPalChange = 1; + else + NeedPalChange++; + } + // draws little dots on the bottom of the screen if (ticker->value) { i = I_GetTime(); @@ -710,6 +719,7 @@ void I_InitGraphics (void) win_stretchy = cvar ("win_stretchy", "1.0", CVAR_ARCHIVE|CVAR_CALLBACK); fullscreen = cvar ("fullscreen", "1", CVAR_ARCHIVE|CVAR_CALLBACK); vid_noptc = cvar ("vid_noptc", "0", CVAR_ARCHIVE); + vid_palettehack = cvar ("vid_palettehack", "0", CVAR_ARCHIVE); Fullscreen = (BOOL)fullscreen->value; diff --git a/code/win32/zdoom.rc b/code/win32/zdoom.rc index 711b5ef8df..3c10614963 100644 --- a/code/win32/zdoom.rc +++ b/code/win32/zdoom.rc @@ -100,8 +100,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,17,0,0 - PRODUCTVERSION 1,17,0,0 + FILEVERSION 1,17,2,0 + PRODUCTVERSION 1,17,2,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -119,13 +119,13 @@ BEGIN VALUE "Comments", "Thanks to id Software for creating DOOM and then releasing the source code. Thanks also to TeamTNT for creating BOOM, which ZDoom is partially based on.\0" VALUE "CompanyName", " \0" VALUE "FileDescription", "ZDoom\0" - VALUE "FileVersion", "1.17\0" + VALUE "FileVersion", "1.17b\0" VALUE "InternalName", "ZDoom\0" VALUE "LegalCopyright", "Copyright © 1999, id Software & Randy Heit\0" VALUE "LegalTrademarks", "Doom® is a Registered Trademark of id Software, Inc.\0" VALUE "OriginalFilename", "zdoom.exe\0" VALUE "ProductName", "ZDoom\0" - VALUE "ProductVersion", "1.17\0" + VALUE "ProductVersion", "1.17b\0" END END BLOCK "VarFileInfo" diff --git a/code/zdoom.dsp b/code/zdoom.dsp index 7617a975e7..51103bc4ca 100644 --- a/code/zdoom.dsp +++ b/code/zdoom.dsp @@ -394,6 +394,10 @@ SOURCE=.\g_level.c # End Source File # Begin Source File +SOURCE=.\gi.c +# End Source File +# Begin Source File + SOURCE=.\info.c !IF "$(CFG)" == "zdoom - Win32 Release" @@ -1410,6 +1414,10 @@ SOURCE=.\g_level.h # End Source File # Begin Source File +SOURCE=.\gi.h +# End Source File +# Begin Source File + SOURCE=.\hu_stuff.h # End Source File # Begin Source File @@ -1741,8 +1749,20 @@ SOURCE=..\commands.txt # End Source File # Begin Source File +SOURCE=.\doominfo.lmp +# End Source File +# Begin Source File + +SOURCE=.\hexninfo.lmp +# End Source File +# Begin Source File + SOURCE=".\docs\Rh-log.txt" # End Source File +# Begin Source File + +SOURCE=.\ticinfo.lmp +# End Source File # End Group # Begin Group "Win32 Files" @@ -1830,15 +1850,6 @@ SOURCE=.\win32\resource.h # Begin Source File SOURCE=.\win32\zdoom.rc - -!IF "$(CFG)" == "zdoom - Win32 Release" - -!ELSEIF "$(CFG)" == "zdoom - Win32 Debug" - -!ELSEIF "$(CFG)" == "zdoom - Win32 Profiling" - -!ENDIF - # End Source File # End Group # End Target diff --git a/readme.txt b/readme.txt index 4b92562ed1..cc883acfbf 100644 --- a/readme.txt +++ b/readme.txt @@ -1,4 +1,4 @@ -This is the source code for ZDoom 1.17a released on 21 February 1999. +This is the source code for ZDoom 1.17b released on 15 March 1999. It is based on the Linux DOOM sources that were prepared by B. Krenheimer and generously released by John Carmack shortly before Christmas, 1997. If @@ -88,7 +88,7 @@ If you want to recompile the DOS code, you need DJGPP and allegro. Allegro is only needed because MIDAS uses its interrupt wrappers. I don't use it for anything myself. The makefile.dj file can be used with make to generate either a release or debug build. (Create the appropriate -subdirectories in the code/djgpp directory first.) +subdirectories under code/djgpp first.) Randy Heit