diff --git a/source/games/duke/CMakeLists.txt b/source/games/duke/CMakeLists.txt index 7d3902bee..e8eee42aa 100644 --- a/source/games/duke/CMakeLists.txt +++ b/source/games/duke/CMakeLists.txt @@ -6,6 +6,8 @@ set( PCH_SOURCES src/actors_lava.cpp src/bowling.cpp src/dispatch.cpp + src/flags_d.cpp + src/flags_r.cpp src/gamedef.cpp src/gameexec.cpp src/gamevar.cpp diff --git a/source/games/duke/src/actors.h b/source/games/duke/src/actors.h index 080cb12b5..eceabe233 100644 --- a/source/games/duke/src/actors.h +++ b/source/games/duke/src/actors.h @@ -198,68 +198,32 @@ enum sflags_t { SFLAG_SHADOW = 0x00000001, SFLAG_NVG = 0x00000002, - SFLAG_NOSHADE = 0x00000004, - SFLAG_PROJECTILE = 0x00000008, - SFLAG_DECAL = 0x00000010, SFLAG_BADGUY = 0x00000020, SFLAG_NOPAL = 0x00000040, - SFLAG_NOEVENTCODE = 0x00000080, - SFLAG_NOLIGHT = 0x00000100, SFLAG_USEACTIVATOR = 0x00000200, - SFLAG_NULL = 0x00000400, // null sprite in multiplayer - SFLAG_NOCLIP = 0x00000800, // clipmove it with cliptype 0 SFLAG_NOFLOORSHADOW = 0x00001000, // for temp. internal use, per-tile flag not checked - SFLAG_SMOOTHMOVE = 0x00002000, - SFLAG_NOTELEPORT = 0x00004000, SFLAG_BADGUYSTAYPUT = 0x00008000, - SFLAG_CACHE = 0x00010000, - // rotation-fixed wrt a pivot point to prevent position diverging due to - // roundoff error accumulation: - SFLAG_ROTFIXED = 0x00020000, - SFLAG_HARDCODED_BADGUY = 0x00040000, - SFLAG_DIDNOSE7WATER = 0x00080000, // used temporarily + SFLAG_GREENSLIMEFOOD = 0x00800000, SFLAG_NODAMAGEPUSH = 0x00100000, SFLAG_NOWATERDIP = 0x00200000, - SFLAG_HURTSPAWNBLOOD = 0x00400000, - SFLAG_GREENSLIMEFOOD = 0x00800000, - SFLAG_REALCLIPDIST = 0x01000000, - SFLAG_WAKEUPBADGUYS = 0x02000000, - SFLAG_DAMAGEEVENT = 0x04000000, - SFLAG_BADGUY_TILE = 0x08000000, + SFLAG_INTERNAL_BADGUY = 0x08000000, // a separate flag is needed for the internal ones because SFLAG_BADGUY has additional semantics. SFLAG_KILLCOUNT = 0x10000000, SFLAG_NOCANSEECHECK = 0x20000000, + + //SFLAG_NOSHADE = 0x00000004, + //SFLAG_PROJECTILE = 0x00000008, + //SFLAG_DECAL = 0x00000010, + //SFLAG_NOEVENTCODE = 0x00000080, + //SFLAG_NOLIGHT = 0x00000100, + //SFLAG_NULL = 0x00000400, // null sprite in multiplayer + //SFLAG_NOCLIP = 0x00000800, // clipmove it with cliptype 0 + //SFLAG_SMOOTHMOVE = 0x00002000, + //SFLAG_NOTELEPORT = 0x00004000, + //SFLAG_HURTSPAWNBLOOD = 0x00400000, + //SFLAG_REALCLIPDIST = 0x01000000, + //SFLAG_WAKEUPBADGUYS = 0x02000000, }; -// Custom projectiles "workslike" flags. -// XXX: Currently not predefined from CON. -enum pflags_t -{ - PROJECTILE_HITSCAN = 0x00000001, - PROJECTILE_RPG = 0x00000002, - PROJECTILE_BOUNCESOFFWALLS = 0x00000004, - PROJECTILE_BOUNCESOFFMIRRORS = 0x00000008, - PROJECTILE_KNEE = 0x00000010, - PROJECTILE_WATERBUBBLES = 0x00000020, - PROJECTILE_TIMED = 0x00000040, - PROJECTILE_BOUNCESOFFSPRITES = 0x00000080, - PROJECTILE_SPIT = 0x00000100, - PROJECTILE_COOLEXPLOSION1 = 0x00000200, - PROJECTILE_BLOOD = 0x00000400, - PROJECTILE_LOSESVELOCITY = 0x00000800, - PROJECTILE_NOAIM = 0x00001000, - PROJECTILE_RANDDECALSIZE = 0x00002000, - PROJECTILE_EXPLODEONTIMER = 0x00004000, - PROJECTILE_RPG_IMPACT = 0x00008000, - PROJECTILE_RADIUS_PICNUM = 0x00010000, - PROJECTILE_ACCURATE_AUTOAIM = 0x00020000, - PROJECTILE_FORCEIMPACT = 0x00040000, - PROJECTILE_REALCLIPDIST = 0x00080000, - PROJECTILE_ACCURATE = 0x00100000, - PROJECTILE_NOSETOWNERSHADE = 0x00200000, - PROJECTILE_RPG_IMPACT_DAMAGE = 0x00400000, - PROJECTILE_MOVED = 0x80000000, // internal flag, do not document - PROJECTILE_TYPE_MASK = PROJECTILE_HITSCAN | PROJECTILE_RPG | PROJECTILE_KNEE | PROJECTILE_BLOOD, -}; extern ActorInfo actorinfo[MAXTILES]; extern actor_t actor[MAXSPRITES]; @@ -335,7 +299,7 @@ EXTERN_INLINE_HEADER int A_CheckEnemySprite(void const * s); ACTOR_INLINE int A_CheckEnemyTile(int const tileNum) { - return ((actorinfo[tileNum].flags & (SFLAG_BADGUY_TILE | SFLAG_BADGUY)) != 0); + return ((actorinfo[tileNum].flags & (SFLAG_INTERNAL_BADGUY | SFLAG_BADGUY)) != 0); } int ssp(short i, unsigned int cliptype); //The set sprite function diff --git a/source/games/duke/src/dispatch.cpp b/source/games/duke/src/dispatch.cpp index 70bf6a8c2..55b67f9af 100644 --- a/source/games/duke/src/dispatch.cpp +++ b/source/games/duke/src/dispatch.cpp @@ -31,6 +31,9 @@ BEGIN_DUKE_NS // //--------------------------------------------------------------------------- +void initactorflags_d(); +void initactorflags_r(); + bool isadoorwall_d(int dapic); bool isadoorwall_r(int dapic); void animatewalls_d(void); @@ -96,6 +99,7 @@ void SetDispatcher() if (!isRR()) { fi = { + initactorflags_d, isadoorwall_d, animatewalls_d, operaterespawns_d, @@ -131,6 +135,7 @@ void SetDispatcher() else { fi = { + initactorflags_r, isadoorwall_r, animatewalls_r, operaterespawns_r, diff --git a/source/games/duke/src/flags_d.cpp b/source/games/duke/src/flags_d.cpp new file mode 100644 index 000000000..695bd44d9 --- /dev/null +++ b/source/games/duke/src/flags_d.cpp @@ -0,0 +1,93 @@ +//------------------------------------------------------------------------- +/* +Copyright (C) 1996, 2003 - 3D Realms Entertainment +Copyright (C) 2000, 2003 - Matt Saettler (EDuke Enhancements) + +This file is part of Enhanced Duke Nukem 3D version 1.5 - Atomic Edition + +Duke Nukem 3D is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +Original Source: 1996 - Todd Replogle +Prepared for public release: 03/21/2003 - Charlie Wiederhold, 3D Realms + +EDuke enhancements integrated: 04/13/2003 - Matt Saettler + +Note: EDuke source was in transition. Changes are in-progress in the +source as it is released. + +*/ +//------------------------------------------------------------------------- + +#include "ns.h" +#include "global.h" +#include "actors.h" +#include "names.h" + +BEGIN_DUKE_NS + +void initactorflags_d() +{ + setflag(SFLAG_INTERNAL_BADGUY, { + SHARK, + RECON, + DRONE, + LIZTROOPONTOILET, + LIZTROOPJUSTSIT, + LIZTROOPSTAYPUT, + LIZTROOPSHOOT, + LIZTROOPJETPACK, + LIZTROOPDUCKING, + LIZTROOPRUNNING, + LIZTROOP, + OCTABRAIN, + COMMANDER, + COMMANDERSTAYPUT, + PIGCOP, + EGG, + PIGCOPSTAYPUT, + PIGCOPDIVE, + LIZMAN, + LIZMANSPITTING, + LIZMANFEEDING, + LIZMANJUMP, + ORGANTIC, + BOSS1, + BOSS2, + BOSS3, + BOSS4, + GREENSLIME, + GREENSLIME+1, + GREENSLIME+2, + GREENSLIME+3, + GREENSLIME+4, + GREENSLIME+5, + GREENSLIME+6, + GREENSLIME+7, + RAT, + ROTATEGUN }); + + // Some flags taken from RedNukem's init code. This is a good start as any to reduce the insane dependency on tile numbers for making decisions in the play code. A lot more will be added here later. + setflag(SFLAG_NODAMAGEPUSH, { TANK, BOSS1, BOSS2, BOSS3, BOSS4, RECON, ROTATEGUN }); + setflag(SFLAG_NOWATERDIP, { OCTABRAIN, COMMANDER, DRONE }); + setflag(SFLAG_GREENSLIMEFOOD, { LIZTROOP, LIZMAN, PIGCOP, NEWBEAST }); + + if (isWorldTour()) + { + setflag(SFLAG_INTERNAL_BADGUY|SFLAG_NODAMAGEPUSH, { FIREFLY, BOSS5, BOSS5STAYPUT }); + } +} + +END_DUKE_NS diff --git a/source/games/duke/src/flags_r.cpp b/source/games/duke/src/flags_r.cpp new file mode 100644 index 000000000..602bf8903 --- /dev/null +++ b/source/games/duke/src/flags_r.cpp @@ -0,0 +1,107 @@ +//------------------------------------------------------------------------- +/* +Copyright (C) 1996, 2003 - 3D Realms Entertainment +Copyright (C) 2017-2019 Nuke.YKT + +This file is part of Duke Nukem 3D version 1.5 - Atomic Edition + +Duke Nukem 3D is free software, you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation, either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY, without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program, if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +Original Source, 1996 - Todd Replogle +Prepared for public release, 03/21/2003 - Charlie Wiederhold, 3D Realms +*/ +//------------------------------------------------------------------------- + +#include "ns.h" +#include "global.h" +#include "actors.h" +#include "names_rr.h" + +BEGIN_DUKE_NS + +void initactorflags_r() +{ + setflag(SFLAG_INTERNAL_BADGUY|SFLAG_KILLCOUNT, { + BOULDER, + BOULDER1, + EGG, + RAT, + TORNADO, + BILLYCOCK, + BILLYRAY, + BILLYRAYSTAYPUT, + BRAYSNIPER, + DOGRUN, + LTH, + HULKJUMP, + BUBBASTAND, + HULK, + HULKSTAYPUT, + HEN, + DRONE, + PIG, + RECON, + MINION, + MINIONSTAYPUT, + COOT, + COOTSTAYPUT, + SHARK, + VIXEN}); + + if (isRRRA()) setflag(SFLAG_INTERNAL_BADGUY|SFLAG_KILLCOUNT, { + SBSWIPE, + BIKERB, + BIKERBV2, + BIKER, + MAKEOUT, + CHEERB, + CHEER, + CHEERSTAYPUT, + COOTPLAY, + BILLYPLAY, + MINIONBOAT, + HULKBOAT, + CHEERBOAT, + RABBIT, + MAMA, + UFO1_RRRA}); + else setflag(SFLAG_INTERNAL_BADGUY|SFLAG_KILLCOUNT, { + SBMOVE, + UFO1_RR, + UFO2, + UFO3, + UFO4, + UFO5}); + + // Why does the pig count as kill? Let's undo that. + actorinfo[PIG].flags &= ~SFLAG_KILLCOUNT; + + actorinfo[DRONE].flags |= SFLAG_NOWATERDIP; + actorinfo[VIXEN].flags |= SFLAG_NOCANSEECHECK; + if (isRRRA()) + { + setflag(SFLAG_KILLCOUNT, { ROCK, ROCK2 }); //??? + setflag(SFLAG_NODAMAGEPUSH, { HULK, MAMA, BILLYPLAY, COOTPLAY, MAMACLOUD }); + setflag(SFLAG_NOCANSEECHECK, { COOT, COOTSTAYPUT, BIKERB, BIKERBV2, CHEER, CHEERB, + CHEERSTAYPUT, MINIONBOAT, HULKBOAT, CHEERBOAT, RABBIT, COOTPLAY, BILLYPLAY, MAKEOUT, MAMA }); + } + else + { + setflag(SFLAG_NODAMAGEPUSH, { HULK, SBMOVE }); + } +} + +END_DUKE_NS \ No newline at end of file diff --git a/source/games/duke/src/game.h b/source/games/duke/src/game.h index 3bb02d6ac..f76aaa934 100644 --- a/source/games/duke/src/game.h +++ b/source/games/duke/src/game.h @@ -312,6 +312,15 @@ inline int actorfella(int spnum) { return actorflag(spnum, SFLAG_KILLCOUNT); } + +inline void setflag(int flag, const std::initializer_list& types) +{ + for (auto val : types) + { + actorinfo[val].flags |= flag; + } +} + // (unsigned)iPicnum check: AMC TC Rusty Nails, bayonet MG alt. fire, iPicnum == -1 (via aplWeaponShoots) #define A_CheckSpriteTileFlags(iPicnum, iType) (((unsigned)iPicnum < MAXTILES) && (actorinfo[iPicnum].flags & iType) != 0) #define S_StopSound(num) S_StopEnvSound(num, -1) @@ -460,6 +469,7 @@ void spawneffector(int i); struct Dispatcher { // sectors_?.cpp + void (*initactorflags)(); bool (*isadoorwall)(int dapic); void (*animatewalls)(); void (*operaterespawns)(int low); diff --git a/source/games/duke/src/zz_game.cpp b/source/games/duke/src/zz_game.cpp index a281312a7..360552944 100644 --- a/source/games/duke/src/zz_game.cpp +++ b/source/games/duke/src/zz_game.cpp @@ -3554,11 +3554,9 @@ static void G_CompileScripts(void) { label = (char *)&sprite[0]; // V8: 16384*44/64 = 11264 V7: 4096*44/64 = 2816 labelcode = (int32_t *)§or[0]; // V8: 4096*40/4 = 40960 V7: 1024*40/4 = 10240 -#if 0 - labeltype = (int32_t *)&wall[0]; // V8: 16384*32/4 = 131072 V7: 8192*32/4 = 65536 -#endif loadcons(G_ConFile()); + fi.initactorflags(); if ((uint32_t)labelcnt > MAXSPRITES*sizeof(spritetype)/64) // see the arithmetic above for why G_GameExit("Error: too many labels defined!"); @@ -3600,146 +3598,9 @@ static inline void G_CheckGametype(void) ud.m_respawn_items = ud.m_respawn_inventory = 1; } -#define SETFLAG(Tilenum, Flag) actorinfo[Tilenum].flags |= Flag - -// Has to be after setting the dynamic names (e.g. TILE_SHARK). -static void A_InitEnemyFlags(void) -{ - if (DEER) - { - int DukeEnemies[] = { - TILE_DOGRUN, TILE_PIG, TILE_VIXEN, TILE_CHEER }; - - for (bssize_t i = ARRAY_SIZE(DukeEnemies) - 1; i >= 0; i--) - SETFLAG(DukeEnemies[i], SFLAG_HARDCODED_BADGUY|SFLAG_BADGUY_TILE|SFLAG_KILLCOUNT); - } - else if (RRRA) - { - int DukeEnemies[] = { - TILE_BOULDER, TILE_BOULDER1, TILE_EGG, TILE_RAT, TILE_TORNADO, TILE_BILLYCOCK, TILE_BILLYRAY, TILE_BILLYRAYSTAYPUT, - TILE_BRAYSNIPER, TILE_DOGRUN, TILE_LTH, TILE_HULKJUMP, TILE_BUBBASTAND, TILE_HULK, TILE_HULKSTAYPUT, TILE_HEN, - TILE_DRONE, TILE_PIG, TILE_RECON, TILE_MINION, TILE_MINIONSTAYPUT, TILE_UFO1, TILE_COOT, TILE_COOTSTAYPUT, TILE_SHARK, - TILE_VIXEN, TILE_SBSWIPE, TILE_BIKERB, TILE_BIKERBV2, TILE_BIKER, TILE_MAKEOUT, TILE_CHEERB, TILE_CHEER, TILE_CHEERSTAYPUT, - TILE_COOTPLAY, TILE_BILLYPLAY, TILE_MINIONBOAT, TILE_HULKBOAT, TILE_CHEERBOAT, TILE_RABBIT, TILE_MAMA }; - - int DukeEnemiesTile[] = { - TILE_BOULDER, TILE_BOULDER1, TILE_EGG, TILE_RAT, TILE_TORNADO, TILE_BILLYCOCK, TILE_BILLYRAY, TILE_BILLYRAYSTAYPUT, - TILE_BRAYSNIPER, TILE_DOGRUN, TILE_LTH, TILE_HULKJUMP, TILE_BUBBASTAND, TILE_HULK, TILE_HULKSTAYPUT, - TILE_DRONE, TILE_PIG, TILE_RECON, TILE_MINION, TILE_MINIONSTAYPUT, TILE_UFO1, TILE_COOT, TILE_COOTSTAYPUT, TILE_SHARK, - TILE_VIXEN, TILE_SBSWIPE, TILE_BIKERB, TILE_BIKERBV2, TILE_BIKER, TILE_MAKEOUT, TILE_CHEERB, TILE_CHEER, TILE_CHEERSTAYPUT, - TILE_COOTPLAY, TILE_BILLYPLAY, TILE_MINIONBOAT, TILE_HULKBOAT, TILE_CHEERBOAT, TILE_RABBIT, TILE_MAMA }; - - int KillCountEnemies[] = { - TILE_BOULDER, TILE_BOULDER1, TILE_EGG, TILE_RAT, TILE_TORNADO, TILE_BILLYCOCK, TILE_BILLYRAY, TILE_BILLYRAYSTAYPUT, - TILE_BRAYSNIPER, TILE_DOGRUN, TILE_LTH, TILE_HULKJUMP, TILE_BUBBASTAND, TILE_HULK, TILE_HULKSTAYPUT, - TILE_DRONE, TILE_PIG, TILE_RECON, TILE_MINION, TILE_MINIONSTAYPUT, TILE_UFO1, TILE_COOT, TILE_COOTSTAYPUT, TILE_SHARK, - TILE_VIXEN, TILE_SBSWIPE, TILE_BIKERB, TILE_BIKERBV2, TILE_BIKER, TILE_MAKEOUT, TILE_CHEERB, TILE_CHEER, TILE_CHEERSTAYPUT, - TILE_COOTPLAY, TILE_BILLYPLAY, TILE_MINIONBOAT, TILE_HULKBOAT, TILE_CHEERBOAT, TILE_RABBIT, TILE_MAMA, - TILE_ROCK, TILE_ROCK2 }; - - int SolidEnemies[] = { TILE_HULK, TILE_MAMA, TILE_BILLYPLAY, TILE_COOTPLAY, TILE_MAMACLOUD }; - int NoWaterDipEnemies[] = { TILE_DRONE }; - int NoCanSeeCheck[] = { - TILE_COOT, TILE_COOTSTAYPUT, TILE_VIXEN, TILE_BIKERB, TILE_BIKERBV2, TILE_CHEER, TILE_CHEERB, - TILE_CHEERSTAYPUT, TILE_MINIONBOAT, TILE_HULKBOAT, TILE_CHEERBOAT, TILE_RABBIT, TILE_COOTPLAY, - TILE_BILLYPLAY, TILE_MAKEOUT, TILE_MAMA }; - - for (bssize_t i = ARRAY_SIZE(DukeEnemies) - 1; i >= 0; i--) - SETFLAG(DukeEnemies[i], SFLAG_HARDCODED_BADGUY); - - for (bssize_t i = ARRAY_SIZE(DukeEnemiesTile) - 1; i >= 0; i--) - SETFLAG(DukeEnemiesTile[i], SFLAG_BADGUY_TILE); - - for (bssize_t i = ARRAY_SIZE(KillCountEnemies) - 1; i >= 0; i--) - SETFLAG(KillCountEnemies[i], SFLAG_KILLCOUNT); - - for (bssize_t i = ARRAY_SIZE(SolidEnemies) - 1; i >= 0; i--) - SETFLAG(SolidEnemies[i], SFLAG_NODAMAGEPUSH); - - for (bssize_t i = ARRAY_SIZE(NoWaterDipEnemies) - 1; i >= 0; i--) - SETFLAG(NoWaterDipEnemies[i], SFLAG_NOWATERDIP); - - for (bssize_t i = ARRAY_SIZE(NoCanSeeCheck) - 1; i >= 0; i--) - SETFLAG(NoCanSeeCheck[i], SFLAG_NOCANSEECHECK); - } - else if (RR) - { - int DukeEnemies[] = { - TILE_BOULDER, TILE_BOULDER1, TILE_EGG, TILE_RAT, TILE_TORNADO, TILE_BILLYCOCK, TILE_BILLYRAY, TILE_BILLYRAYSTAYPUT, - TILE_BRAYSNIPER, TILE_DOGRUN, TILE_LTH, TILE_HULKJUMP, TILE_BUBBASTAND, TILE_HULK, TILE_HULKSTAYPUT, TILE_HEN, - TILE_DRONE, TILE_PIG, TILE_RECON, TILE_SBMOVE, TILE_MINION, TILE_MINIONSTAYPUT, TILE_UFO1, TILE_UFO2, TILE_UFO3, TILE_UFO4, TILE_UFO5, - TILE_COOT, TILE_COOTSTAYPUT, TILE_SHARK, TILE_VIXEN }; - - int DukeEnemiesTile[] = { - TILE_BOULDER, TILE_BOULDER1, TILE_EGG, TILE_RAT, TILE_TORNADO, TILE_BILLYCOCK, TILE_BILLYRAY, TILE_BILLYRAYSTAYPUT, - TILE_BRAYSNIPER, TILE_DOGRUN, TILE_LTH, TILE_HULKJUMP, TILE_BUBBASTAND, TILE_HULK, TILE_HULKSTAYPUT, - TILE_DRONE, TILE_PIG, TILE_RECON, TILE_SBMOVE, TILE_MINION, TILE_MINIONSTAYPUT, TILE_UFO1, TILE_UFO2, TILE_UFO3, TILE_UFO4, TILE_UFO5, - TILE_COOT, TILE_COOTSTAYPUT, TILE_SHARK, TILE_VIXEN }; - - int KillCountEnemies[] = { - TILE_BOULDER, TILE_BOULDER1, TILE_EGG, TILE_RAT, TILE_TORNADO, TILE_BILLYCOCK, TILE_BILLYRAY, TILE_BILLYRAYSTAYPUT, - TILE_BRAYSNIPER, TILE_DOGRUN, TILE_LTH, TILE_HULKJUMP, TILE_BUBBASTAND, TILE_HULK, TILE_HULKSTAYPUT, - TILE_DRONE, TILE_PIG, TILE_RECON, TILE_SBMOVE, TILE_MINION, TILE_MINIONSTAYPUT, TILE_UFO1, TILE_UFO2, TILE_UFO3, TILE_UFO4, TILE_UFO5, - TILE_COOT, TILE_COOTSTAYPUT, TILE_SHARK, TILE_VIXEN }; - - int SolidEnemies[] = { TILE_HULK, TILE_SBMOVE }; - int NoWaterDipEnemies[] = { TILE_DRONE }; - int NoCanSeeCheck[] = { TILE_VIXEN }; - - for (bssize_t i = ARRAY_SIZE(DukeEnemies) - 1; i >= 0; i--) - SETFLAG(DukeEnemies[i], SFLAG_HARDCODED_BADGUY); - - for (bssize_t i = ARRAY_SIZE(DukeEnemiesTile) - 1; i >= 0; i--) - SETFLAG(DukeEnemiesTile[i], SFLAG_BADGUY_TILE); - - for (bssize_t i = ARRAY_SIZE(KillCountEnemies) - 1; i >= 0; i--) - SETFLAG(KillCountEnemies[i], SFLAG_KILLCOUNT); - - for (bssize_t i = ARRAY_SIZE(SolidEnemies) - 1; i >= 0; i--) - SETFLAG(SolidEnemies[i], SFLAG_NODAMAGEPUSH); - - for (bssize_t i = ARRAY_SIZE(NoWaterDipEnemies) - 1; i >= 0; i--) - SETFLAG(NoWaterDipEnemies[i], SFLAG_NOWATERDIP); - - for (bssize_t i = ARRAY_SIZE(NoCanSeeCheck) - 1; i >= 0; i--) - SETFLAG(NoCanSeeCheck[i], SFLAG_NOCANSEECHECK); - } - else - { - int DukeEnemies[] = { - TILE_SHARK, TILE_RECON, TILE_DRONE, - TILE_LIZTROOPONTOILET, TILE_LIZTROOPJUSTSIT, TILE_LIZTROOPSTAYPUT, TILE_LIZTROOPSHOOT, - TILE_LIZTROOPJETPACK, TILE_LIZTROOPDUCKING, TILE_LIZTROOPRUNNING, TILE_LIZTROOP, - TILE_OCTABRAIN, TILE_COMMANDER, TILE_COMMANDERSTAYPUT, TILE_PIGCOP, TILE_EGG, TILE_PIGCOPSTAYPUT, TILE_PIGCOPDIVE, - TILE_LIZMAN, TILE_LIZMANSPITTING, TILE_LIZMANFEEDING, TILE_LIZMANJUMP, TILE_ORGANTIC, - TILE_BOSS1, TILE_BOSS2, TILE_BOSS3, TILE_BOSS4, TILE_RAT, TILE_ROTATEGUN }; - - int SolidEnemies[] = { TILE_TANK, TILE_BOSS1, TILE_BOSS2, TILE_BOSS3, TILE_BOSS4, TILE_RECON, TILE_ROTATEGUN }; - int NoWaterDipEnemies[] = { TILE_OCTABRAIN, TILE_COMMANDER, TILE_DRONE }; - int GreenSlimeFoodEnemies[] = { TILE_LIZTROOP, TILE_LIZMAN, TILE_PIGCOP, TILE_NEWBEAST }; - - for (bssize_t i=TILE_GREENSLIME; i<=TILE_GREENSLIME+7; i++) - SETFLAG(i, SFLAG_HARDCODED_BADGUY|SFLAG_BADGUY_TILE); - - for (bssize_t i=ARRAY_SIZE(DukeEnemies)-1; i>=0; i--) - SETFLAG(DukeEnemies[i], SFLAG_HARDCODED_BADGUY|SFLAG_BADGUY_TILE); - - for (bssize_t i=ARRAY_SIZE(SolidEnemies)-1; i>=0; i--) - SETFLAG(SolidEnemies[i], SFLAG_NODAMAGEPUSH); - - for (bssize_t i=ARRAY_SIZE(NoWaterDipEnemies)-1; i>=0; i--) - SETFLAG(NoWaterDipEnemies[i], SFLAG_NOWATERDIP); - - for (bssize_t i=ARRAY_SIZE(GreenSlimeFoodEnemies)-1; i>=0; i--) - SETFLAG(GreenSlimeFoodEnemies[i], SFLAG_GREENSLIMEFOOD); - } -} -#undef SETFLAG - void G_PostCreateGameState(void) { Net_SendClientInfo(); - A_InitEnemyFlags(); } void InitFonts();