- flag setter cleanup.

# Conflicts:
#	source/games/duke/src/zz_game.cpp
This commit is contained in:
Christoph Oelckers 2020-05-16 10:13:39 +02:00
parent ebb226fdaf
commit 8a0baf3aad
7 changed files with 234 additions and 192 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -312,6 +312,15 @@ inline int actorfella(int spnum)
{
return actorflag(spnum, SFLAG_KILLCOUNT);
}
inline void setflag(int flag, const std::initializer_list<short>& 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);

View file

@ -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 *)&sector[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();