renamed MF_* to CF_* to prevent the collision with movement flags; also added the missing CF_INACTIVE

This commit is contained in:
Zeno Rogue 2019-03-24 01:26:43 +01:00
parent 653a0af39f
commit ce8df3a0c6
3 changed files with 233 additions and 227 deletions

View File

@ -10,54 +10,55 @@ static inline void set_flag(flagtype& f, flagtype which, bool b) {
else f &= ~which;
}
static const flagtype MF_NOGHOST = Flag(0);
static const flagtype MF_RAIDER = Flag(1);
static const flagtype MF_PRINCESS = Flag(2);
static const flagtype MF_MIMIC = Flag(3);
static const flagtype MF_GOK = Flag(4);
static const flagtype MF_NONLIVING = Flag(5);
static const flagtype MF_METAL = Flag(6);
static const flagtype MF_STUNNABLE = Flag(7);
static const flagtype MF_HP = Flag(8);
static const flagtype MF_MOUNTABLE = Flag(9);
static const flagtype MF_FRIENDLY = Flag(10);
static const flagtype MF_PLAYER = Flag(11);
static const flagtype MF_BUG = Flag(12);
static const flagtype MF_IVY = Flag(13);
static const flagtype MF_PART = Flag(14);
static const flagtype MF_MUTANTIVY = Flag(15);
static const flagtype MF_ANYIVY = Flag(16);
static const flagtype MF_BULLET = Flag(17);
static const flagtype MF_DEMON = Flag(18);
static const flagtype MF_WORM = Flag(19);
static const flagtype MF_WITCH = Flag(20);
static const flagtype MF_BIRD = Flag(21);
static const flagtype MF_SLOWMOVER = Flag(22);
static const flagtype MF_MAGNETIC = Flag(23);
static const flagtype MF_SWITCH = Flag(24);
static const flagtype MF_GHOST = Flag(25);
static const flagtype MF_SHARK = Flag(26);
static const flagtype MF_SLIME = Flag(27);
static const flagtype MF_DRAGON = Flag(28);
static const flagtype MF_KRAKEN = Flag(29);
static const flagtype MF_NOBLOW = Flag(30);
static const flagtype MF_MULTITILE = Flag(31);
static const flagtype MF_LEADER = Flag(32);
static const flagtype MF_FLYING = Flag(33);
static const flagtype MF_ATTACK_THRU_VINE = Flag(34);
static const flagtype MF_ATTACK_NONADJACENT = Flag(35);
static const flagtype MF_NOHIGHLIGHT = Flag(36);
static const flagtype MF_INACTIVE = Flag(37);
static const flagtype MF_UNARMED = Flag(38);
static const flagtype MF_IGNORE_PLATE = Flag(39);
static const flagtype MF_BULL = Flag(40);
static const flagtype MF_TROLL = Flag(41);
static const flagtype MF_IGNORE_SMELL = Flag(42);
static const flagtype MF_RATLING = Flag(43);
static const flagtype MF_POWER = Flag(44);
static const flagtype MF_GHOSTMOVER = Flag(45);
static const flagtype MF_TECHNICAL = Flag(46);
static const flagtype MF_MOVED = Flag(47);
// we use CF not MF to avoid confusion with MF_ movement flags
static const flagtype CF_NOGHOST = Flag(0);
static const flagtype CF_RAIDER = Flag(1);
static const flagtype CF_PRINCESS = Flag(2);
static const flagtype CF_MIMIC = Flag(3);
static const flagtype CF_GOK = Flag(4);
static const flagtype CF_NONLIVING = Flag(5);
static const flagtype CF_METAL = Flag(6);
static const flagtype CF_STUNNABLE = Flag(7);
static const flagtype CF_HP = Flag(8);
static const flagtype CF_MOUNTABLE = Flag(9);
static const flagtype CF_FRIENDLY = Flag(10);
static const flagtype CF_PLAYER = Flag(11);
static const flagtype CF_BUG = Flag(12);
static const flagtype CF_IVY = Flag(13);
static const flagtype CF_PART = Flag(14);
static const flagtype CF_MUTANTIVY = Flag(15);
static const flagtype CF_ANYIVY = Flag(16);
static const flagtype CF_BULLET = Flag(17);
static const flagtype CF_DEMON = Flag(18);
static const flagtype CF_WORM = Flag(19);
static const flagtype CF_WITCH = Flag(20);
static const flagtype CF_BIRD = Flag(21);
static const flagtype CF_SLOWMOVER = Flag(22);
static const flagtype CF_MAGNETIC = Flag(23);
static const flagtype CF_SWITCH = Flag(24);
static const flagtype CF_GHOST = Flag(25);
static const flagtype CF_SHARK = Flag(26);
static const flagtype CF_SLIME = Flag(27);
static const flagtype CF_DRAGON = Flag(28);
static const flagtype CF_KRAKEN = Flag(29);
static const flagtype CF_NOBLOW = Flag(30);
static const flagtype CF_MULTITILE = Flag(31);
static const flagtype CF_LEADER = Flag(32);
static const flagtype CF_FLYING = Flag(33);
static const flagtype CF_ATTACK_THRU_VINE = Flag(34);
static const flagtype CF_ATTACK_NONADJACENT = Flag(35);
static const flagtype CF_NOHIGHLIGHT = Flag(36);
static const flagtype CF_INACTIVE = Flag(37);
static const flagtype CF_UNARMED = Flag(38);
static const flagtype CF_IGNORE_PLATE = Flag(39);
static const flagtype CF_BULL = Flag(40);
static const flagtype CF_TROLL = Flag(41);
static const flagtype CF_IGNORE_SMELL = Flag(42);
static const flagtype CF_RATLING = Flag(43);
static const flagtype CF_POWER = Flag(44);
static const flagtype CF_GHOSTMOVER = Flag(45);
static const flagtype CF_TECHNICAL = Flag(46);
static const flagtype CF_MOVED = Flag(47);
enum eMonster {
#define MONSTER(a,b,c,d,e,f,g,h) d,

View File

@ -21,7 +21,7 @@
#endif
MONSTER( 0, 0, "no monster" , moNone, ZERO | MF_NOGHOST | MF_NOBLOW, RESERVED, moNone, NULL)
MONSTER( 0, 0, "no monster" , moNone, ZERO | CF_NOGHOST | CF_NOBLOW, RESERVED, moNone, NULL)
MONSTER( 'Y', 0x4040FF, "Yeti" , moYeti, ZERO, RESERVED, moYeti,
"A big and quite intelligent monster living in the Icy Land."
)
@ -29,20 +29,22 @@ MONSTER( 'W', 0xD08040, "Icewolf" , moWolf, ZERO, RESERVED, moYeti,
"A nasty predator from the Icy Land. Contrary to other monsters, "
"it tracks its prey by their heat."
)
MONSTER( 'W', 0xD08040, "Icewolf" , moWolfMoved, MF_MOVED, RESERVED, moNone, "")
MONSTER( 'W', 0xD08040, "Icewolf" , moWolfMoved, CF_MOVED, RESERVED, moNone, "")
MONSTER( 'R', 0xFF8000, "Ranger" , moRanger, ZERO, RESERVED, moYeti,
"Rangers take care of the magic mirrors in the Land of Mirrors. "
"They know that rogues like to break these mirrors... so "
"they will attack you!"
)
MONSTER( 'T', 0xD0D0D0, "Rock Troll", moTroll, ZERO | MF_TROLL, RESERVED, moYeti, trollhelp)
MONSTER( 'T', 0xD0D0D0, "Rock Troll", moTroll, ZERO | CF_TROLL, RESERVED, moYeti, trollhelp)
MONSTER( 'G', 0x20D020, "Goblin", moGoblin, ZERO, RESERVED, moYeti,
"A nasty creature native to the Living Caves. They don't like you "
"for some reason."
)
MONSTER( 'S', 0xE0E040, "Sand Worm", moWorm, ZERO | MF_NOGHOST | MF_NOBLOW | MF_MOUNTABLE | MF_MULTITILE | MF_WORM, RESERVED, moNone, wormdes )
MONSTER( 's', 0x808000, "Sand Worm Tail", moWormtail, ZERO | MF_NOGHOST | MF_NOBLOW | MF_MOUNTABLE | MF_MULTITILE | MF_WORM, RESERVED, moNone, wormdes )
MONSTER( 'S', 0x808000, "Sand Worm W", moWormwait, ZERO | MF_NOGHOST | MF_NOBLOW | MF_MOUNTABLE | MF_MULTITILE | MF_WORM, RESERVED, moNone, wormdes )
MONSTER( 'S', 0xE0E040, "Sand Worm", moWorm, ZERO | CF_NOGHOST | CF_NOBLOW | CF_MOUNTABLE | CF_MULTITILE | CF_WORM, RESERVED, moNone, wormdes )
MONSTER( 's', 0x808000, "Sand Worm Tail", moWormtail, ZERO | CF_NOGHOST | CF_NOBLOW | CF_MOUNTABLE | CF_MULTITILE | CF_WORM | CF_INACTIVE, RESERVED, moNone, wormdes )
MONSTER( 'S', 0x808000, "Sand Worm W", moWormwait, ZERO | CF_NOGHOST | CF_NOBLOW | CF_MOUNTABLE | CF_MULTITILE | CF_WORM | CF_INACTIVE, RESERVED, moNone, wormdes )
MONSTER( 'H', 0x80FF00, "Hedgehog Warrior", moHedge, ZERO, RESERVED, moYeti,
"These warriors of the Forest wield exotic weapons called hedgehog blades. "
"These blades protect them from a frontal attack, but they still can be 'stabbed' "
@ -50,38 +52,40 @@ MONSTER( 'H', 0x80FF00, "Hedgehog Warrior", moHedge, ZERO, RESERVED, moYeti,
)
MONSTER( 'M', 0x806050, "Desert Man", moDesertman, ZERO, RESERVED, moYeti,
"A tribe of men native to the Desert. They have even tamed the huge Sandworms, who won't attack them.")
MONSTER( 'C', 0x00FFFF, "Ivy Root", moIvyRoot, ZERO | MF_NOGHOST | MF_NOBLOW | MF_IGNORE_SMELL | MF_MULTITILE | MF_ANYIVY | MF_IVY, RESERVED, moNone, ivydes)
MONSTER( 'C', 0xFFFF00, "Active Ivy", moIvyHead, ZERO | MF_NOGHOST | MF_NOBLOW | MF_PART | MF_IGNORE_SMELL | MF_MULTITILE | MF_ANYIVY | MF_IVY, RESERVED, moNone, ivydes)
MONSTER( 'C', 0x40FF00, "Ivy Branch", moIvyBranch, ZERO | MF_NOGHOST | MF_NOBLOW | MF_PART | MF_IGNORE_SMELL | MF_MULTITILE | MF_ANYIVY | MF_IVY, RESERVED, moNone, ivydes)
MONSTER( 'C', 0x006030, "Dormant Ivy", moIvyWait, ZERO | MF_NOGHOST | MF_NOBLOW | MF_PART | MF_NOHIGHLIGHT | MF_IGNORE_SMELL | MF_MULTITILE | MF_ANYIVY | MF_IVY, RESERVED, moNone, ivydes)
MONSTER( 'C', 0x804000, "Dead Ivy", moIvyNext, ZERO | MF_NOGHOST | MF_NOBLOW | MF_PART | MF_NOHIGHLIGHT | MF_IGNORE_SMELL | MF_MULTITILE | MF_ANYIVY | MF_IVY, RESERVED, moNone, ivydes)
MONSTER( 'C', 0x800000, "Dead Ivy", moIvyDead, ZERO | MF_NOGHOST | MF_NOBLOW | MF_PART | MF_NOHIGHLIGHT | MF_IGNORE_SMELL | MF_MULTITILE | MF_ANYIVY | MF_IVY, RESERVED, moNone, ivydes)
MONSTER( 'C', 0x00FFFF, "Ivy Root", moIvyRoot, ZERO | CF_NOGHOST | CF_NOBLOW | CF_IGNORE_SMELL | CF_MULTITILE | CF_ANYIVY | CF_IVY | CF_INACTIVE, RESERVED, moNone, ivydes)
MONSTER( 'C', 0xFFFF00, "Active Ivy", moIvyHead, ZERO | CF_NOGHOST | CF_NOBLOW | CF_PART | CF_IGNORE_SMELL | CF_MULTITILE | CF_ANYIVY | CF_IVY, RESERVED, moNone, ivydes)
MONSTER( 'C', 0x40FF00, "Ivy Branch", moIvyBranch, ZERO | CF_NOGHOST | CF_NOBLOW | CF_PART | CF_IGNORE_SMELL | CF_MULTITILE | CF_ANYIVY | CF_IVY, RESERVED, moNone, ivydes)
MONSTER( 'C', 0x006030, "Dormant Ivy", moIvyWait, ZERO | CF_NOGHOST | CF_NOBLOW | CF_PART | CF_NOHIGHLIGHT | CF_IGNORE_SMELL | CF_MULTITILE | CF_ANYIVY | CF_IVY | CF_INACTIVE, RESERVED, moNone, ivydes)
MONSTER( 'C', 0x804000, "Dead Ivy", moIvyNext, ZERO | CF_NOGHOST | CF_NOBLOW | CF_PART | CF_NOHIGHLIGHT | CF_IGNORE_SMELL | CF_MULTITILE | CF_ANYIVY | CF_IVY | CF_INACTIVE, RESERVED, moNone, ivydes)
MONSTER( 'C', 0x800000, "Dead Ivy", moIvyDead, ZERO | CF_NOGHOST | CF_NOBLOW | CF_PART | CF_NOHIGHLIGHT | CF_IGNORE_SMELL | CF_MULTITILE | CF_ANYIVY | CF_IVY | CF_INACTIVE, RESERVED, moNone, ivydes)
MONSTER( 'M', 0x804000, "Giant Ape", moMonkey, ZERO, RESERVED, moYeti,
"This giant ape thinks that you are an enemy.")
MONSTER( 'B', 0x909000, "Slime Beast", moSlime, ZERO | MF_NOBLOW | MF_SLIME | MF_IGNORE_SMELL, RESERVED, moSlime, slimehelp)
MONSTER( '@', 0xFF80FF, "Mimic", moMimic, ZERO | MF_NOGHOST | MF_NOBLOW | MF_MIMIC | MF_NONLIVING | MF_FRIENDLY, RESERVED, moNone,
MONSTER( 'B', 0x909000, "Slime Beast", moSlime, ZERO | CF_NOBLOW | CF_SLIME | CF_IGNORE_SMELL, RESERVED, moSlime, slimehelp)
MONSTER( '@', 0xFF80FF, "Mimic", moMimic, ZERO | CF_NOGHOST | CF_NOBLOW | CF_MIMIC | CF_NONLIVING | CF_FRIENDLY, RESERVED, moNone,
"A magical being which copies your movements. "
"You feel that it would be much more useful in an Euclidean space."
)
MONSTER( '@', 0xFF8080, "Mirage (REMOVED)", moREMOVED, ZERO, RESERVED, moNone,
"A magical being which copies your movements. "
)
MONSTER( '@', 0x509050, "Golem", moGolem, ZERO | MF_NOGHOST | MF_GOK | MF_NONLIVING | MF_FRIENDLY, RESERVED, moNone,
MONSTER( '@', 0x509050, "Golem", moGolem, ZERO | CF_NOGHOST | CF_GOK | CF_NONLIVING | CF_FRIENDLY, RESERVED, moNone,
"You can summon these friendly constructs with a magical process."
)
MONSTER( '@', 0x509050, "Golem", moGolemMoved, ZERO | MF_NOGHOST | MF_GOK | MF_NONLIVING | MF_FRIENDLY | MF_MOVED, RESERVED, moNone,
MONSTER( '@', 0x509050, "Golem", moGolemMoved, ZERO | CF_NOGHOST | CF_GOK | CF_NONLIVING | CF_FRIENDLY | CF_MOVED, RESERVED, moNone,
"You can summon these friendly constructs with a magical process."
)
MONSTER( 'E', 0xD09050, "Eagle", moEagle, ZERO | MF_BIRD | MF_FLYING | MF_IGNORE_PLATE, RESERVED, moEagle,
MONSTER( 'E', 0xD09050, "Eagle", moEagle, ZERO | CF_BIRD | CF_FLYING | CF_IGNORE_PLATE, RESERVED, moEagle,
"A majestic bird, who is able to fly very fast."
)
MONSTER( 'S', 0xFF8080, "Seep", moSeep, ZERO | MF_NOBLOW | MF_SLIME | MF_IGNORE_SMELL, RESERVED, moSlime,
MONSTER( 'S', 0xFF8080, "Seep", moSeep, ZERO | CF_NOBLOW | CF_SLIME | CF_IGNORE_SMELL, RESERVED, moSlime,
"A monster who is able to live inside the living cave wall."
)
MONSTER( 'Z', 0x804000, "Zombie", moZombie, ZERO | MF_NONLIVING, RESERVED, moYeti,
MONSTER( 'Z', 0x804000, "Zombie", moZombie, ZERO | CF_NONLIVING, RESERVED, moYeti,
"A typical Graveyard monster."
)
MONSTER( 'G', 0xFFFFFF, "Ghost", moGhost, ZERO | MF_NOBLOW | MF_NONLIVING | MF_GHOST | MF_FLYING | MF_ATTACK_THRU_VINE | MF_ATTACK_NONADJACENT | MF_IGNORE_PLATE | MF_IGNORE_SMELL | MF_GHOSTMOVER, RESERVED, moGhost,
MONSTER( 'G', 0xFFFFFF, "Ghost", moGhost, ZERO | CF_NOBLOW | CF_NONLIVING | CF_GHOST | CF_FLYING | CF_ATTACK_THRU_VINE | CF_ATTACK_NONADJACENT | CF_IGNORE_PLATE | CF_IGNORE_SMELL | CF_GHOSTMOVER, RESERVED, moGhost,
"A typical monster from the Graveyard, who moves through walls.\n\n"
"There are also wandering Ghosts. They will appear "
"if you do not explore any new places for a long time (about 100 turns). "
@ -90,13 +94,14 @@ MONSTER( 'G', 0xFFFFFF, "Ghost", moGhost, ZERO | MF_NOBLOW | MF_NONLIVING | MF_G
MONSTER( 'N', 0x404040, "Necromancer", moNecromancer, ZERO, RESERVED, moYeti,
"Necromancers can raise ghosts and zombies from fresh graves."
)
MONSTER( 'S', 0x404040, "Shadow", moShadow, ZERO | MF_NONLIVING, RESERVED, moNone,
MONSTER( 'S', 0x404040, "Shadow", moShadow, ZERO | CF_NONLIVING, RESERVED, moNone,
"A creepy monster who follows you everywhere in the Graveyard."
)
MONSTER( 'T', 0x40E040, "Tentacle", moTentacle, ZERO | MF_NOGHOST | MF_NOBLOW | MF_MOUNTABLE | MF_MULTITILE | MF_WORM, RESERVED, moNone, tentdes )
MONSTER( 't', 0x008000, "Tentacle Tail", moTentacletail, ZERO | MF_NOGHOST | MF_NOBLOW | MF_MOUNTABLE | MF_MULTITILE | MF_WORM, RESERVED, moNone, tentdes )
MONSTER( 'T', 0x008000, "Tentacle W", moTentaclewait, ZERO | MF_NOGHOST | MF_NOBLOW | MF_MOUNTABLE | MF_MULTITILE | MF_WORM, RESERVED, moNone, tentdes )
MONSTER( 'z', 0xC00000, "Tentacle (withdrawing)", moTentacleEscaping, ZERO | MF_NOGHOST | MF_NOBLOW | MF_MOUNTABLE | MF_MULTITILE | MF_WORM, RESERVED, moNone, tentdes )
MONSTER( 'T', 0x40E040, "Tentacle", moTentacle, ZERO | CF_NOGHOST | CF_NOBLOW | CF_MOUNTABLE | CF_MULTITILE | CF_WORM, RESERVED, moNone, tentdes )
MONSTER( 't', 0x008000, "Tentacle Tail", moTentacletail, ZERO | CF_NOGHOST | CF_NOBLOW | CF_MOUNTABLE | CF_MULTITILE | CF_WORM | CF_INACTIVE, RESERVED, moNone, tentdes )
MONSTER( 'T', 0x008000, "Tentacle W", moTentaclewait, ZERO | CF_NOGHOST | CF_NOBLOW | CF_MOUNTABLE | CF_MULTITILE | CF_WORM | CF_INACTIVE, RESERVED, moNone, tentdes )
MONSTER( 'z', 0xC00000, "Tentacle (withdrawing)", moTentacleEscaping, ZERO | CF_NOGHOST | CF_NOBLOW | CF_MOUNTABLE | CF_MULTITILE | CF_WORM, RESERVED, moNone, tentdes )
MONSTER( 'P', 0xFF8000, "Cultist", moCultist, ZERO, RESERVED, moYeti,
"People worshipping Cthulhu. They are very dangerous."
)
@ -104,18 +109,18 @@ MONSTER( 'P', 0xFFFF00, "Fire Cultist", moPyroCultist, ZERO, RESERVED, moYeti,
"People worshipping Cthulhu. This one is especially dangerous, "
"as he is armed with a weapon which launches fire from afar."
)
MONSTER( 'D', 0xFF0000, "Greater Demon", moGreater, ZERO | MF_DEMON | MF_SLOWMOVER, RESERVED, moYeti, gdemonhelp)
MONSTER( 'D', 0x800000, "Greater Demon", moGreaterM, ZERO | MF_DEMON, RESERVED, moLesser, gdemonhelp)
MONSTER( 'd', 0xFF2020, "Lesser Demon", moLesser, ZERO | MF_DEMON | MF_SLOWMOVER, RESERVED, moYeti, ldemonhelp)
MONSTER( 'd', 0x802020, "Lesser Demon", moLesserM, ZERO | MF_DEMON, RESERVED, moLesser, ldemonhelp)
MONSTER( 'S', 0x2070C0, "Ice Shark", moShark, ZERO | MF_SHARK, RESERVED, moShark,
MONSTER( 'D', 0xFF0000, "Greater Demon", moGreater, ZERO | CF_DEMON | CF_SLOWMOVER, RESERVED, moYeti, gdemonhelp)
MONSTER( 'D', 0x800000, "Greater Demon", moGreaterM, ZERO | CF_DEMON | CF_INACTIVE, RESERVED, moLesser, gdemonhelp)
MONSTER( 'd', 0xFF2020, "Lesser Demon", moLesser, ZERO | CF_DEMON | CF_SLOWMOVER, RESERVED, moYeti, ldemonhelp)
MONSTER( 'd', 0x802020, "Lesser Demon", moLesserM, ZERO | CF_DEMON | CF_INACTIVE, RESERVED, moLesser, ldemonhelp)
MONSTER( 'S', 0x2070C0, "Ice Shark", moShark, ZERO | CF_SHARK, RESERVED, moShark,
"This dangerous predator has killed many people, and has been sent to Cocytus."
)
MONSTER( 'W', 0xFFFFFF, "Running Dog", moRunDog, ZERO, RESERVED, moYeti,
"This white dog is able to run all the time. It is the only creature "
"able to survive and breed in the Land of Eternal Motion."
)
MONSTER( 'S', 0xC00040, "Demon Shark", moGreaterShark, ZERO | MF_NOBLOW | MF_SHARK | MF_IGNORE_SMELL | MF_GHOSTMOVER, RESERVED, moGreaterShark,
MONSTER( 'S', 0xC00040, "Demon Shark", moGreaterShark, ZERO | CF_NOBLOW | CF_SHARK | CF_IGNORE_SMELL | CF_GHOSTMOVER, RESERVED, moGreaterShark,
"Demons of Hell do not drown when they fall into the lake in Cocytus. "
"They turn into demonic sharks, enveloped in a cloud of steam."
)
@ -124,7 +129,7 @@ MONSTER( 'S', 0xC00040, "Fire Fairy", moFireFairy, ZERO, RESERVED, moYeti,
"The forest is infinite, after all...\n\n"
"Fire Fairies transform into fires when they die."
)
MONSTER( 'C', 0x4000C0, "Crystal Sage", moCrystalSage, ZERO | MF_UNARMED, RESERVED, moYeti,
MONSTER( 'C', 0x4000C0, "Crystal Sage", moCrystalSage, ZERO | CF_UNARMED, RESERVED, moYeti,
"This being radiates an aura of wisdom. "
"It is made of a beautiful crystal, you would love to take it home. "
"But how is it going to defend itself? Better not to think of it, "
@ -151,121 +156,121 @@ MONSTER( 'V', 0x421C52, "Vine Beast", moVineBeast, ZERO, RESERVED, moYeti,
"A beast made of vines!\n\n"
"Vine Beasts turn into vines when they die."
)
MONSTER( 'V', 0xFFC0C0, "Vine Spirit", moVineSpirit, ZERO | MF_NOBLOW | MF_SLIME | MF_ATTACK_THRU_VINE | MF_IGNORE_SMELL, RESERVED, moSlime,
MONSTER( 'V', 0xFFC0C0, "Vine Spirit", moVineSpirit, ZERO | CF_NOBLOW | CF_SLIME | CF_ATTACK_THRU_VINE | CF_IGNORE_SMELL, RESERVED, moSlime,
"A spirit living in the vines!\n\n"
"Vine Spirits destroy the vines when they die."
)
MONSTER( 'T', 0x803030, "Dark Troll", moDarkTroll, ZERO | MF_TROLL, RESERVED, moYeti,
MONSTER( 'T', 0x803030, "Dark Troll", moDarkTroll, ZERO | CF_TROLL, RESERVED, moYeti,
"A Troll without the power of Life."
)
MONSTER( 'E', 0xFFFF40, "Earth Elemental", moEarthElemental, ZERO | MF_NONLIVING, RESERVED, moEarthElemental,
MONSTER( 'E', 0xFFFF40, "Earth Elemental", moEarthElemental, ZERO | CF_NONLIVING, RESERVED, moEarthElemental,
"A rare unliving construct from the Dead Caves. "
"It instantly destroys cave walls next to its path, and also leaves "
"an impassable wall behind it. You suppose that this impassable wall helps it to "
"escape from some threats. You hope you won't meet these threats..."
)
MONSTER( 'B', 0xC04040, "Red Hyperbug", moBug0, ZERO | MF_BUG, RESERVED, moBug0, hivehelp)
MONSTER( 'B', 0x40C040, "Green Hyperbug", moBug1, ZERO | MF_BUG, RESERVED, moBug1, hivehelp)
MONSTER( 'B', 0x4040C0, "Blue Hyperbug", moBug2, ZERO | MF_BUG, RESERVED, moBug2, hivehelp)
MONSTER( 'W', 0x404040, "Witch Apprentice", moWitch, ZERO | MF_WITCH | MF_POWER, RESERVED, moYeti,
MONSTER( 'B', 0xC04040, "Red Hyperbug", moBug0, ZERO | CF_BUG, RESERVED, moBug0, hivehelp)
MONSTER( 'B', 0x40C040, "Green Hyperbug", moBug1, ZERO | CF_BUG, RESERVED, moBug1, hivehelp)
MONSTER( 'B', 0x4040C0, "Blue Hyperbug", moBug2, ZERO | CF_BUG, RESERVED, moBug2, hivehelp)
MONSTER( 'W', 0x404040, "Witch Apprentice", moWitch, ZERO | CF_WITCH | CF_POWER, RESERVED, moYeti,
"A Witch without any special powers. But watch out! She will "
"pick up any basic Orbs on her path, and use their powers."
)
MONSTER( 'W', 0xFF4040, "Speed Witch", moWitchSpeed, ZERO | MF_WITCH | MF_POWER, RESERVED, moYeti,
MONSTER( 'W', 0xFF4040, "Speed Witch", moWitchSpeed, ZERO | CF_WITCH | CF_POWER, RESERVED, moYeti,
"A Witch with a Speed spell. She moves twice as fast as you. Unless you "
"have an Orb of Speed too, of course!"
)
MONSTER( 'W', 0xFFFFFF, "Flash Witch", moWitchFlash, ZERO | MF_WITCH | MF_POWER, RESERVED, moYeti,
MONSTER( 'W', 0xFFFFFF, "Flash Witch", moWitchFlash, ZERO | CF_WITCH | CF_POWER, RESERVED, moYeti,
"A Witch with a Flash spell. Very dangerous!\n\n"
"Luckily, she never uses the spell if it would kill her friends. "
"She could destroy an Evil Golem, though."
)
MONSTER( 'W', 0xFF8000, "Fire Witch", moWitchFire, ZERO | MF_WITCH | MF_POWER, RESERVED, moYeti,
MONSTER( 'W', 0xFF8000, "Fire Witch", moWitchFire, ZERO | CF_WITCH | CF_POWER, RESERVED, moYeti,
"A Witch with a Fire spell. She will leave a trail of fire behind her."
)
MONSTER( 'W', 0x8080FF, "Winter Witch", moWitchWinter, ZERO | MF_WITCH | MF_IGNORE_SMELL | MF_GHOSTMOVER | MF_POWER, RESERVED, moWitchWinter,
MONSTER( 'W', 0x8080FF, "Winter Witch", moWitchWinter, ZERO | CF_WITCH | CF_IGNORE_SMELL | CF_GHOSTMOVER | CF_POWER, RESERVED, moWitchWinter,
"A Witch with a Winter spell. She is able to move through fire."
)
MONSTER( 'W', 0x808080, "Aether Witch", moWitchGhost, ZERO | MF_NOBLOW | MF_WITCH | MF_IGNORE_SMELL | MF_GHOSTMOVER | MF_POWER, RESERVED, moWitchGhost,
MONSTER( 'W', 0x808080, "Aether Witch", moWitchGhost, ZERO | CF_NOBLOW | CF_WITCH | CF_IGNORE_SMELL | CF_GHOSTMOVER | CF_POWER, RESERVED, moWitchGhost,
"A Witch with an Aether spell. She is able to move through fire and walls."
)
MONSTER( '@', 0x905050, "Evil Golem", moEvilGolem, ZERO | MF_NONLIVING | MF_POWER, RESERVED, moYeti,
MONSTER( '@', 0x905050, "Evil Golem", moEvilGolem, ZERO | CF_NONLIVING | CF_POWER, RESERVED, moYeti,
"Somebody has summoned these evil constructs with a magical process."
)
MONSTER( '@', 0x8080FF, "Knight", moKnight, ZERO | MF_NOGHOST | MF_GOK | MF_FRIENDLY, RESERVED, moNone, camelothelp )
MONSTER( 'P', 0xD10000, "Cult Leader", moCultistLeader, ZERO | MF_LEADER, RESERVED, moPirate,
MONSTER( '@', 0x8080FF, "Knight", moKnight, ZERO | CF_NOGHOST | CF_GOK | CF_FRIENDLY, RESERVED, moNone, camelothelp )
MONSTER( 'P', 0xD10000, "Cult Leader", moCultistLeader, ZERO | CF_LEADER, RESERVED, moPirate,
"These Cultists can push the statues, just like you."
)
MONSTER( 'B', 0x909000, "Slime Beast", moSlimeNextTurn, ZERO, RESERVED, moNone, slimehelp)
MONSTER( '@', 0x8080FF, "Knight", moKnightMoved, ZERO | MF_NOGHOST | MF_GOK | MF_FRIENDLY | MF_MOVED, RESERVED, moNone, camelothelp )
MONSTER( '@', 0x8B4513, "Illusion", moIllusion, ZERO | MF_NOGHOST | MF_NONLIVING | MF_FRIENDLY | MF_IGNORE_PLATE, RESERVED, moNone,
MONSTER( '@', 0x8080FF, "Knight", moKnightMoved, ZERO | CF_NOGHOST | CF_GOK | CF_FRIENDLY | CF_MOVED, RESERVED, moNone, camelothelp )
MONSTER( '@', 0x8B4513, "Illusion", moIllusion, ZERO | CF_NOGHOST | CF_NONLIVING | CF_FRIENDLY | CF_IGNORE_PLATE, RESERVED, moNone,
"Illusions are targeted "
"by most monsters, just like yourself, Thumpers, and your friends."
)
MONSTER( 'P', 0xD00000, "Pirate", moPirate, ZERO | MF_LEADER, RESERVED, moPirate,
MONSTER( 'P', 0xD00000, "Pirate", moPirate, ZERO | CF_LEADER, RESERVED, moPirate,
"Just a typical hyperbolic pirate." )
MONSTER( 'S', 0x8080C0, "Shark", moCShark, ZERO | MF_SHARK, RESERVED, moShark, "Just a nasty shark.")
MONSTER( 'P', 0x0000FF, "Parrot", moParrot, ZERO | MF_NOBLOW | MF_SLIME | MF_IGNORE_SMELL, RESERVED, moSlime, "Parrots feel safe in the forests of Caribbean, so they "
MONSTER( 'S', 0x8080C0, "Shark", moCShark, ZERO | CF_SHARK, RESERVED, moShark, "Just a nasty shark.")
MONSTER( 'P', 0x0000FF, "Parrot", moParrot, ZERO | CF_NOBLOW | CF_SLIME | CF_IGNORE_SMELL, RESERVED, moSlime, "Parrots feel safe in the forests of Caribbean, so they "
"never leave them. But they will help the Pirates by attacking the intruders.")
MONSTER( 'S', 0xE09000, "Rock Snake", moHexSnake, ZERO | MF_NOGHOST | MF_NOBLOW | MF_MOUNTABLE | MF_IGNORE_SMELL | MF_MULTITILE | MF_WORM, RESERVED, moNone, redsnakedes )
MONSTER( 's', 0xE09000, "Rock Snake Tail", moHexSnakeTail, ZERO | MF_NOGHOST | MF_NOBLOW | MF_MOUNTABLE | MF_MULTITILE | MF_WORM, RESERVED, moNone, redsnakedes )
MONSTER( 'T', 0xC02020, "Red Troll", moRedTroll, ZERO | MF_TROLL, RESERVED, moYeti, "A kind of Troll native to the Red Rock Valley.")
MONSTER( 'B', 0xA00000, "Bomberbird", moBomberbird, ZERO | MF_BIRD | MF_FLYING | MF_IGNORE_PLATE, RESERVED, moEagle,
MONSTER( 'S', 0xE09000, "Rock Snake", moHexSnake, ZERO | CF_NOGHOST | CF_NOBLOW | CF_MOUNTABLE | CF_IGNORE_SMELL | CF_MULTITILE | CF_WORM, RESERVED, moNone, redsnakedes )
MONSTER( 's', 0xE09000, "Rock Snake Tail", moHexSnakeTail, ZERO | CF_NOGHOST | CF_NOBLOW | CF_MOUNTABLE | CF_MULTITILE | CF_WORM | CF_INACTIVE, RESERVED, moNone, redsnakedes )
MONSTER( 'T', 0xC02020, "Red Troll", moRedTroll, ZERO | CF_TROLL, RESERVED, moYeti, "A kind of Troll native to the Red Rock Valley.")
MONSTER( 'B', 0xA00000, "Bomberbird", moBomberbird, ZERO | CF_BIRD | CF_FLYING | CF_IGNORE_PLATE, RESERVED, moEagle,
"Dark red birds who have created the minefield.\n\n"
"They create a mine on the spot where they are killed, provided "
"that the terrain is suitable. Also note that mines are triggered "
"by dead birds falling on them."
)
MONSTER( 'A', 0xFFFFFF, "Albatross", moAlbatross, ZERO | MF_BIRD | MF_FLYING | MF_IGNORE_PLATE, RESERVED, moEagle,
MONSTER( 'A', 0xFFFFFF, "Albatross", moAlbatross, ZERO | CF_BIRD | CF_FLYING | CF_IGNORE_PLATE, RESERVED, moEagle,
"Those large seabirds attack you for some reason. At least they are not "
"as fast as Eagles..."
)
MONSTER( 'B', 0x40C000, "Tame Bomberbird", moTameBomberbird, ZERO | MF_NOGHOST | MF_GOK | MF_FRIENDLY | MF_BIRD | MF_FLYING | MF_IGNORE_PLATE, RESERVED, moTameBomberbird, tamebomberdesc)
MONSTER( 'B', 0x40C000, "Tame Bomberbird", moTameBomberbirdMoved, ZERO | MF_NOGHOST | MF_GOK | MF_FRIENDLY | MF_BIRD | MF_FLYING | MF_IGNORE_PLATE | MF_MOVED, RESERVED, moTameBomberbird, tamebomberdesc)
MONSTER( 'G', 0xFF0000, "Palace Guard", moPalace, ZERO | MF_STUNNABLE | MF_HP, RESERVED, moYeti,
MONSTER( 'B', 0x40C000, "Tame Bomberbird", moTameBomberbird, ZERO | CF_NOGHOST | CF_GOK | CF_FRIENDLY | CF_BIRD | CF_FLYING | CF_IGNORE_PLATE, RESERVED, moTameBomberbird, tamebomberdesc)
MONSTER( 'B', 0x40C000, "Tame Bomberbird", moTameBomberbirdMoved, ZERO | CF_NOGHOST | CF_GOK | CF_FRIENDLY | CF_BIRD | CF_FLYING | CF_IGNORE_PLATE | CF_MOVED, RESERVED, moTameBomberbird, tamebomberdesc)
MONSTER( 'G', 0xFF0000, "Palace Guard", moPalace, ZERO | CF_STUNNABLE | CF_HP, RESERVED, moYeti,
"You have to hit Palace Guards several times to kill them. After each hit, they "
"are pushed away and stunned for some time."
)
MONSTER( 'G', 0xC06000, "Fat Guard", moFatGuard, ZERO | MF_STUNNABLE | MF_HP, RESERVED, moYeti, "Fat guards are too heavy to be pushed away by your hits.")
MONSTER( 'G', 0xFFFFFF, "Skeleton", moSkeleton, ZERO | MF_NONLIVING | MF_STUNNABLE, RESERVED, moYeti,
MONSTER( 'G', 0xC06000, "Fat Guard", moFatGuard, ZERO | CF_STUNNABLE | CF_HP, RESERVED, moYeti, "Fat guards are too heavy to be pushed away by your hits.")
MONSTER( 'G', 0xFFFFFF, "Skeleton", moSkeleton, ZERO | CF_NONLIVING | CF_STUNNABLE, RESERVED, moYeti,
"Skeletons work similar to Palace Guards, but they won't die no matter how many "
"times you hit them. Well, you have to be more creative...\n\n"
"Skeletons attacked outside of their native land, Palace, are stunned for a longer time."
)
MONSTER( 'G', 0xC000C0, "Vizier", moVizier, ZERO | MF_STUNNABLE | MF_HP, RESERVED, moYeti,
MONSTER( 'G', 0xC000C0, "Vizier", moVizier, ZERO | CF_STUNNABLE | CF_HP, RESERVED, moYeti,
"Viziers are neither pushed away nor stunned. However, you attack them automatically when "
"escaping from them.")
MONSTER( 'V', 0xC0C0C0, "Viking", moViking, ZERO | MF_LEADER, RESERVED, moPirate, "Mighty warriors from the Fjord, who can use boats.")
MONSTER( 'T', 0x00FFFF, "Fjord Troll", moFjordTroll, ZERO | MF_TROLL, RESERVED, moYeti,
MONSTER( 'V', 0xC0C0C0, "Viking", moViking, ZERO | CF_LEADER, RESERVED, moPirate, "Mighty warriors from the Fjord, who can use boats.")
MONSTER( 'T', 0x00FFFF, "Fjord Troll", moFjordTroll, ZERO | CF_TROLL, RESERVED, moYeti,
"Fjord Trolls leave a wall when they die, causing the living fjord to rise around it. "
"Contrary to Rock Trolls, items around are not destroyed."
)
MONSTER( 'E', 0x0000FF, "Water Elemental", moWaterElemental, ZERO | MF_NOBLOW | MF_NONLIVING, RESERVED, moWaterElemental,
MONSTER( 'E', 0x0000FF, "Water Elemental", moWaterElemental, ZERO | CF_NOBLOW | CF_NONLIVING, RESERVED, moWaterElemental,
"Wherever this powerful being goes, the living fjord "
"sinks below water, non-magical boats are destroyed, and fires are extinguished.\n\n"
"As a special case, you can attack the Water Elemental from the water, without drowning immediately."
)
MONSTER( 'M', 0xD0D0D0, "Mouse", moMouse, ZERO | MF_NOGHOST | MF_GOK | MF_FRIENDLY | MF_UNARMED | MF_IGNORE_PLATE, RESERVED, moNone, princessdesc)
MONSTER( 'M', 0xD0D0D0, "Mouse", moMouseMoved, ZERO | MF_NOGHOST | MF_GOK | MF_FRIENDLY | MF_UNARMED | MF_MOVED, RESERVED, moNone, princessdesc)
MONSTER( 'P', 0xFF80FF, "Prince", moPrincess, ZERO | MF_NOGHOST | MF_PRINCESS | MF_GOK | MF_STUNNABLE | MF_HP | MF_FRIENDLY | MF_UNARMED, RESERVED, moNone, princessdesc)
MONSTER( 'P', 0xFF80FF, "Princess", moPrincessMoved, ZERO | MF_NOGHOST | MF_PRINCESS | MF_GOK | MF_STUNNABLE | MF_HP | MF_FRIENDLY | MF_UNARMED | MF_MOVED, RESERVED, moNone, princessdesc)
MONSTER( 'P', 0xFF80FF, "Prince", moPrincessArmed, ZERO | MF_NOGHOST | MF_PRINCESS | MF_GOK | MF_STUNNABLE | MF_HP | MF_FRIENDLY, RESERVED, moNone, princessdesc)
MONSTER( 'P', 0xFF80FF, "Princess", moPrincessArmedMoved, ZERO | MF_NOGHOST | MF_PRINCESS | MF_GOK | MF_STUNNABLE | MF_HP | MF_FRIENDLY | MF_MOVED, RESERVED, moNone, princessdesc)
MONSTER( 'M', 0xD0D0D0, "Mouse", moMouse, ZERO | CF_NOGHOST | CF_GOK | CF_FRIENDLY | CF_UNARMED | CF_IGNORE_PLATE, RESERVED, moNone, princessdesc)
MONSTER( 'M', 0xD0D0D0, "Mouse", moMouseMoved, ZERO | CF_NOGHOST | CF_GOK | CF_FRIENDLY | CF_UNARMED | CF_MOVED, RESERVED, moNone, princessdesc)
MONSTER( 'P', 0xFF80FF, "Prince", moPrincess, ZERO | CF_NOGHOST | CF_PRINCESS | CF_GOK | CF_STUNNABLE | CF_HP | CF_FRIENDLY | CF_UNARMED, RESERVED, moNone, princessdesc)
MONSTER( 'P', 0xFF80FF, "Princess", moPrincessMoved, ZERO | CF_NOGHOST | CF_PRINCESS | CF_GOK | CF_STUNNABLE | CF_HP | CF_FRIENDLY | CF_UNARMED | CF_MOVED, RESERVED, moNone, princessdesc)
MONSTER( 'P', 0xFF80FF, "Prince", moPrincessArmed, ZERO | CF_NOGHOST | CF_PRINCESS | CF_GOK | CF_STUNNABLE | CF_HP | CF_FRIENDLY, RESERVED, moNone, princessdesc)
MONSTER( 'P', 0xFF80FF, "Princess", moPrincessArmedMoved, ZERO | CF_NOGHOST | CF_PRINCESS | CF_GOK | CF_STUNNABLE | CF_HP | CF_FRIENDLY | CF_MOVED, RESERVED, moNone, princessdesc)
MONSTER( 'F', 0xD03000, "Familiar", moFamiliar, ZERO, RESERVED, moYeti, "A simple servant of the master of the Ivory Tower.")
MONSTER( 'B', 0x707070, "Gargoyle", moGargoyle, ZERO | MF_BIRD | MF_FLYING | MF_IGNORE_PLATE, RESERVED, moEagle, gargdesc)
MONSTER( 'B', 0x707070, "Gargoyle", moGargoyle, ZERO | CF_BIRD | CF_FLYING | CF_IGNORE_PLATE, RESERVED, moEagle, gargdesc)
MONSTER( 'E', 0xFF0000, "Fire Elemental", moFireElemental, ZERO, RESERVED, moYeti,
"This monster leaves a trail of fire behind.")
MONSTER( 'E', 0xC0C0FF, "Air Elemental", moAirElemental, ZERO | MF_FLYING | MF_IGNORE_PLATE, RESERVED, moAirElemental, "An Air Elemental looks like a live tornado. Once you are three (or less) cells from it, "
MONSTER( 'E', 0xC0C0FF, "Air Elemental", moAirElemental, ZERO | CF_FLYING | CF_IGNORE_PLATE, RESERVED, moAirElemental, "An Air Elemental looks like a live tornado. Once you are three (or less) cells from it, "
"it is impossible to move closer, due to strong winds. You can stand and wait, though. "
"This also affects most monsters.")
MONSTER( 'D', 0xC06000, "Striped Dog", moOrangeDog, ZERO, RESERVED, moYeti, "A predator native to the Zebra.")
MONSTER( 'G', 0xFFFFFF, "Tentacle+Ghost", moTentacleGhost, ZERO | MF_NOGHOST | MF_NOBLOW | MF_GHOST | MF_FLYING | MF_ATTACK_THRU_VINE | MF_ATTACK_NONADJACENT | MF_IGNORE_PLATE | MF_IGNORE_SMELL | MF_MULTITILE | MF_WORM | MF_GHOSTMOVER, RESERVED, moNone, tentdes )
MONSTER( 'B', 0x8080C0, "Metal Beast", moMetalBeast, ZERO | MF_METAL | MF_STUNNABLE | MF_SLOWMOVER, RESERVED, moYeti, elecdesc )
MONSTER( 'B', 0xC060C0, "Rich Metal Beast", moMetalBeast2, ZERO | MF_METAL | MF_STUNNABLE | MF_SLOWMOVER, RESERVED, moYeti, elecdesc )
MONSTER( 'G', 0xFFFFFF, "Tentacle+Ghost", moTentacleGhost, ZERO | CF_NOGHOST | CF_NOBLOW | CF_GHOST | CF_FLYING | CF_ATTACK_THRU_VINE | CF_ATTACK_NONADJACENT | CF_IGNORE_PLATE | CF_IGNORE_SMELL | CF_MULTITILE | CF_WORM | CF_GHOSTMOVER, RESERVED, moNone, tentdes )
MONSTER( 'B', 0x8080C0, "Metal Beast", moMetalBeast, ZERO | CF_METAL | CF_STUNNABLE | CF_SLOWMOVER, RESERVED, moYeti, elecdesc )
MONSTER( 'B', 0xC060C0, "Rich Metal Beast", moMetalBeast2, ZERO | CF_METAL | CF_STUNNABLE | CF_SLOWMOVER, RESERVED, moYeti, elecdesc )
MONSTER( 'O', 0xA06020, "Outlaw", moOutlaw, ZERO, RESERVED, moYeti, wildwestdesc )
MONSTER( 'C', 0xC0C060, "Mutant Ivy", moMutant, ZERO | MF_NOGHOST | MF_NOBLOW | MF_PART | MF_IGNORE_SMELL | MF_MULTITILE | MF_ANYIVY | MF_MUTANTIVY, RESERVED, moNone, overdesc )
MONSTER( 'T', 0x0080FF, "Storm Troll", moStormTroll, ZERO | MF_TROLL, RESERVED, moYeti, elecdesc )
MONSTER( 'T', 0x00C080, "Forest Troll", moForestTroll, ZERO | MF_TROLL, RESERVED, moYeti,
MONSTER( 'C', 0xC0C060, "Mutant Ivy", moMutant, ZERO | CF_NOGHOST | CF_NOBLOW | CF_PART | CF_IGNORE_SMELL | CF_MULTITILE | CF_ANYIVY | CF_MUTANTIVY, RESERVED, moNone, overdesc )
MONSTER( 'T', 0x0080FF, "Storm Troll", moStormTroll, ZERO | CF_TROLL, RESERVED, moYeti, elecdesc )
MONSTER( 'T', 0x00C080, "Forest Troll", moForestTroll, ZERO | CF_TROLL, RESERVED, moYeti,
"Forest Trolls create an impassable wall when they die."
)
MONSTER( 'F', 0xC35817, "Giant Fox", moRedFox, ZERO, RESERVED, moYeti,
@ -275,58 +280,58 @@ MONSTER( 'F', 0xC35817, "Giant Fox", moRedFox, ZERO, RESERVED, moYeti,
"Well, this creature has chosen the second option. It won't be happy "
"if you destroy its prison.\n"
)
MONSTER( 'C', 0x8080FF, "Wind Crow", moWindCrow, ZERO | MF_BIRD | MF_FLYING | MF_IGNORE_PLATE, RESERVED, moEagle,
MONSTER( 'C', 0x8080FF, "Wind Crow", moWindCrow, ZERO | CF_BIRD | CF_FLYING | CF_IGNORE_PLATE, RESERVED, moEagle,
"A large bird who likes strong winds. Just as you, it can fly quickly in the wind."
)
MONSTER( 'G', 0xC0FFC0, "Friendly Ghost", moFriendlyGhost, ZERO | MF_NOGHOST | MF_GOK | MF_FRIENDLY | MF_GHOST | MF_FLYING | MF_ATTACK_THRU_VINE | MF_ATTACK_NONADJACENT | MF_IGNORE_PLATE, RESERVED, moFriendlyGhost,
MONSTER( 'G', 0xC0FFC0, "Friendly Ghost", moFriendlyGhost, ZERO | CF_NOGHOST | CF_GOK | CF_FRIENDLY | CF_GHOST | CF_FLYING | CF_ATTACK_THRU_VINE | CF_ATTACK_NONADJACENT | CF_IGNORE_PLATE, RESERVED, moFriendlyGhost,
"Friendly ghosts are friendly beings who can go through any obstacles. However, "
"unlike most friends, they tend to fly away from you."
)
MONSTER( 'R', 0x906030, "Ratling", moRatling, ZERO | MF_LEADER | MF_RATLING, RESERVED, moPirate,
MONSTER( 'R', 0x906030, "Ratling", moRatling, ZERO | CF_LEADER | CF_RATLING, RESERVED, moPirate,
"These warped humanoids are skilled warriors and sailors, and they "
"feel at home at the Warped Coast. Their battle experience has taught them "
"that enemies who wait without moving or attacking anything are the most deadly. "
"If they see such an enemy, they become extremely suspicious, and they also wait."
)
MONSTER( 'F', 0xC00000, "False Princess", moFalsePrincess, ZERO, RESERVED, moYeti, GENDERSWITCH )
MONSTER( 'R', 0x500050, "Rose Lady", moRoseLady, ZERO | MF_IGNORE_SMELL, RESERVED, moYeti, GENDERSWITCH )
MONSTER( 'R', 0x500050, "Rose Lady", moRoseLady, ZERO | CF_IGNORE_SMELL, RESERVED, moYeti, GENDERSWITCH )
MONSTER( 'R', 0xF0A0D0, "Rose Beauty", moRoseBeauty, ZERO, RESERVED, moYeti, GENDERSWITCH )
MONSTER( 'R', 0x806040, "Ratling Avenger", moRatlingAvenger, ZERO | MF_LEADER | MF_RATLING, RESERVED, moPirate,
MONSTER( 'R', 0x806040, "Ratling Avenger", moRatlingAvenger, ZERO | CF_LEADER | CF_RATLING, RESERVED, moPirate,
"So, you have killed a Ratling on the unwarped sea? You will be punished for this! "
"Luckily, if you run away from the Warped Sea quickly, the Ratling Avengers will lose track of you."
)
MONSTER( 'T', 0x487830, "Tortoise", moTortoise, ZERO | MF_STUNNABLE | MF_SLOWMOVER, RESERVED, moYeti, tortoisedesc)
MONSTER( 'D', 0xC03000, "Dragon", moDragonHead, ZERO | MF_NOGHOST | MF_NOBLOW | MF_STUNNABLE | MF_MOUNTABLE | MF_FLYING | MF_IGNORE_PLATE | MF_MULTITILE | MF_DRAGON | MF_WORM, RESERVED, moDragonHead, dragondesc)
MONSTER( 'd', 0xC03000, "Dragon", moDragonTail, ZERO | MF_NOGHOST | MF_NOBLOW | MF_STUNNABLE | MF_MOUNTABLE | MF_PART | MF_FLYING | MF_IGNORE_PLATE | MF_MULTITILE | MF_DRAGON | MF_WORM, RESERVED, moDragonHead, dragondesc)
MONSTER( 'F', 0x909090, "Gadfly", moGadfly, ZERO | MF_BIRD | MF_FLYING | MF_IGNORE_PLATE, RESERVED, moEagle, "Annoying insects. They can awaken Sleeping Bulls.")
MONSTER( 'T', 0x487830, "Tortoise", moTortoise, ZERO | CF_STUNNABLE | CF_SLOWMOVER, RESERVED, moYeti, tortoisedesc)
MONSTER( 'D', 0xC03000, "Dragon", moDragonHead, ZERO | CF_NOGHOST | CF_NOBLOW | CF_STUNNABLE | CF_MOUNTABLE | CF_FLYING | CF_IGNORE_PLATE | CF_MULTITILE | CF_DRAGON | CF_WORM, RESERVED, moDragonHead, dragondesc)
MONSTER( 'd', 0xC03000, "Dragon", moDragonTail, ZERO | CF_NOGHOST | CF_NOBLOW | CF_STUNNABLE | CF_MOUNTABLE | CF_PART | CF_FLYING | CF_IGNORE_PLATE | CF_MULTITILE | CF_DRAGON | CF_WORM, RESERVED, moDragonHead, dragondesc)
MONSTER( 'F', 0x909090, "Gadfly", moGadfly, ZERO | CF_BIRD | CF_FLYING | CF_IGNORE_PLATE, RESERVED, moEagle, "Annoying insects. They can awaken Sleeping Bulls.")
MONSTER( 'Y', 0xFF8000, "Yendorian Researcher", moResearcher, ZERO, RESERVED, moYeti,
"These people study gravity and infinite trees. "
"They have no special features, other than wearing a strange hat."
)
MONSTER( 'K', 0xA8A8A8, "Sparrowhawk", moSparrowhawk, ZERO | MF_BIRD | MF_FLYING | MF_IGNORE_PLATE, RESERVED, moEagle,
MONSTER( 'K', 0xA8A8A8, "Sparrowhawk", moSparrowhawk, ZERO | CF_BIRD | CF_FLYING | CF_IGNORE_PLATE, RESERVED, moEagle,
"A bird who hunts in the treetops of Yendorian Forest."
)
MONSTER( 'K', 0xD0A0A0, "Kraken", moKrakenH, ZERO | MF_NOGHOST | MF_NOBLOW | MF_MULTITILE | MF_KRAKEN, RESERVED, moNone, krakendesc)
MONSTER( 'K', 0xC07070, "Kraken Tentacle", moKrakenT, ZERO | MF_NOGHOST | MF_NOBLOW | MF_PART | MF_MULTITILE | MF_KRAKEN, RESERVED, moNone, krakendesc)
MONSTER( 'D', 0xF09090, "Draugr", moDraugr, ZERO | MF_NONLIVING | MF_SLOWMOVER, RESERVED, moYeti,
MONSTER( 'K', 0xD0A0A0, "Kraken", moKrakenH, ZERO | CF_NOGHOST | CF_NOBLOW | CF_MULTITILE | CF_KRAKEN, RESERVED, moNone, krakendesc)
MONSTER( 'K', 0xC07070, "Kraken Tentacle", moKrakenT, ZERO | CF_NOGHOST | CF_NOBLOW | CF_PART | CF_MULTITILE | CF_KRAKEN, RESERVED, moNone, krakendesc)
MONSTER( 'D', 0xF09090, "Draugr", moDraugr, ZERO | CF_NONLIVING | CF_SLOWMOVER, RESERVED, moYeti,
"Animated corpses of ancient Viking warriors. They are immune to mundane weapons, "
"but they can be destroyed by your Orb of the Sword."
)
MONSTER( 'C', 0xC08000, "Friendly Ivy", moFriendlyIvy, ZERO | MF_NOGHOST | MF_FRIENDLY | MF_ANYIVY, RESERVED, moNone, naturedesc )
MONSTER( 'V', 0xC000C0, "Vampire Bat", moVampire, ZERO | MF_BIRD | MF_FLYING | MF_UNARMED | MF_IGNORE_PLATE, RESERVED, moEagle,
MONSTER( 'C', 0xC08000, "Friendly Ivy", moFriendlyIvy, ZERO | CF_NOGHOST | CF_FRIENDLY | CF_ANYIVY, RESERVED, moNone, naturedesc )
MONSTER( 'V', 0xC000C0, "Vampire Bat", moVampire, ZERO | CF_BIRD | CF_FLYING | CF_UNARMED | CF_IGNORE_PLATE, RESERVED, moEagle,
"Vampire Bats don't attack normally, but they drain your magical powers if "
"they are at distance at most 2 from you."
)
MONSTER( 'B', 0x404040, "Bat", moBat, ZERO | MF_BIRD | MF_FLYING | MF_UNARMED | MF_IGNORE_PLATE, RESERVED, moEagle,
MONSTER( 'B', 0x404040, "Bat", moBat, ZERO | CF_BIRD | CF_FLYING | CF_UNARMED | CF_IGNORE_PLATE, RESERVED, moEagle,
"Someone has told you that one can get battle experience safely by "
"killing tons of essentially harmless creatures, such as Bats. But "
"does this make any sense?...\n\n"
"It does not. Bats cannot hurt you, but may block your movement, or "
"toggle switches if they fall on them." )
MONSTER( 'R', 0x8080C0, "Reptile", moReptile, ZERO | MF_STUNNABLE, RESERVED, moReptile, reptiledesc )
MONSTER( 'B', 0x606020, "Herd Bull", moHerdBull, ZERO | MF_BULL, RESERVED, moRagingBull,
MONSTER( 'R', 0x8080C0, "Reptile", moReptile, ZERO | CF_STUNNABLE, RESERVED, moReptile, reptiledesc )
MONSTER( 'B', 0x606020, "Herd Bull", moHerdBull, ZERO | CF_BULL, RESERVED, moRagingBull,
"Herds of these Bulls are running long distances for some reason. They become Raging Bulls if something stops them." )
MONSTER( 'B', 0xA03000, "Raging Bull", moRagingBull, ZERO | MF_BULL, RESERVED, moYeti,
MONSTER( 'B', 0xA03000, "Raging Bull", moRagingBull, ZERO | CF_BULL, RESERVED, moYeti,
"Raging Bulls charge in a straight line: on heptagons, when they can choose one of two possible directions, "
"they choose one closer to your current location. In the case of a tie, the cell where more neighbors is "
"closer to your current location is chosen; if still a tie, past locations are considered. "
@ -335,10 +340,10 @@ MONSTER( 'B', 0xA03000, "Raging Bull", moRagingBull, ZERO | MF_BULL, RESERVED, m
"which they charge at you again (in any direction). "
"Raging Bulls cannot be killed or stunned conventionally."
)
MONSTER( 'B', 0xB07000, "Sleeping Bull", moSleepBull, ZERO | MF_BULL, RESERVED, moRagingBull,
MONSTER( 'B', 0xB07000, "Sleeping Bull", moSleepBull, ZERO | CF_BULL, RESERVED, moRagingBull,
"Sleeping bulls wake up when you get into distance of two cells from them."
)
MONSTER( 'S', 0xFFD500, "Butterfly", moButterfly, ZERO | MF_BIRD | MF_FLYING | MF_IGNORE_PLATE, RESERVED, moButterfly, bulldashdesc)
MONSTER( 'S', 0xFFD500, "Butterfly", moButterfly, ZERO | CF_BIRD | CF_FLYING | CF_IGNORE_PLATE, RESERVED, moButterfly, bulldashdesc)
MONSTER( 'N', 0xFFFF80, "Narcissist", moNarciss, ZERO, RESERVED, moYeti,
"This person loves to look at their own reflection in the mirror. "
"He believes himself to be one of the most important creatures in this world, "
@ -352,12 +357,12 @@ MONSTER( 'M', 0xFFC0FF, "Mirror Spirit", moMirrorSpirit, ZERO, RESERVED, moYeti,
"more reflections will come out of the mirror. Use Mimics to destroy them."
)
MONSTER( 'W', 0x202020, "Hunting Dog", moHunterDog, ZERO, RESERVED, moYeti, huntingdesc)
MONSTER( 'T', 0xE2725B, "Terracotta Warrior", moTerraWarrior, ZERO | MF_NONLIVING | MF_STUNNABLE | MF_HP, RESERVED, moYeti, terradesc)
MONSTER( 'J', 0x50A030, "Jiangshi", moJiangshi, ZERO | MF_NONLIVING, RESERVED, moYeti,
MONSTER( 'T', 0xE2725B, "Terracotta Warrior", moTerraWarrior, ZERO | CF_NONLIVING | CF_STUNNABLE | CF_HP, RESERVED, moYeti, terradesc)
MONSTER( 'J', 0x50A030, "Jiangshi", moJiangshi, ZERO | CF_NONLIVING, RESERVED, moYeti,
"You think this was one of the people who have constructed the Terracotta Warriors and the arrow traps. "
"They have been locked inside, so that they will never divulge the secrets of the mausoleum. They would like to return their homes and families, though."
)
MONSTER( 'B', 0xA00000, "Void Beast", moVoidBeast, ZERO | MF_NONLIVING, RESERVED, moVoidBeast,
MONSTER( 'B', 0xA00000, "Void Beast", moVoidBeast, ZERO | CF_NONLIVING, RESERVED, moVoidBeast,
"Are creatures of Void actual monsters, or just monster-shaped holes in the air?\n\nVoid Beasts move simply by letting the air move into their current location -- "
"the hole will move to the place where the air came from! Void Beasts are great at moving against the wind, but they have problems "
"moving with the wind.")
@ -368,31 +373,31 @@ MONSTER( 'W', 0xA00000, "Lava Wolf", moLavaWolf, ZERO, RESERVED, moYeti,
"and try to track their prey using their other senses and intelligence."
)
MONSTER( 'W', 0x202020, "Hunting Dog (guarding)", moHunterGuard, ZERO, RESERVED, moYeti, huntingdesc)
MONSTER( 'G', 0xC0C0FF, "Ice Golem", moIceGolem, ZERO | MF_NONLIVING, RESERVED, moYeti,
MONSTER( 'G', 0xC0C0FF, "Ice Golem", moIceGolem, ZERO | CF_NONLIVING, RESERVED, moYeti,
"The Ice Golems are powered by intense magical coldness. When destroyed in the Blizzard or another icy land, they become "
"ice walls, and freeze the land around them.")
MONSTER( 'B', 0xC0C0FF, "Sand Bird", moSandBird, ZERO, RESERVED, moNone, NODESC)
MONSTER( 'S', 0xA00000, "Salamander", moSalamander, ZERO | MF_STUNNABLE, RESERVED, moYeti,
MONSTER( 'S', 0xA00000, "Salamander", moSalamander, ZERO | CF_STUNNABLE, RESERVED, moYeti,
"Salamanders are tough lizard-like creatures. Their tough skin protects them "
"from both physical attacks and heat. Salamanders "
"are stunned for a longer time if you push them into lava, fire, or a solid obstacle.")
MONSTER( 'W', 0x202020, "Hunting Dog (regrouping)", moHunterChanging, ZERO, RESERVED, moYeti,
"When your plan has clearly failed, it is better to abandon it and go to a safe place, to have a chance of succeeding next time. This dog clearly knows this.")
MONSTER( 'B', 0xC00000, "North Pole", moNorthPole, ZERO | MF_MAGNETIC, RESERVED, moYeti, NODESCYET)
MONSTER( 'B', 0x0000C0, "South Pole", moSouthPole, ZERO | MF_MAGNETIC, RESERVED, moYeti, NODESCYET)
MONSTER( 'P', 0xC03000, "Red Raider", moPair, ZERO | MF_RAIDER, RESERVED, moYeti, "Red Raiders travel in pairs. They have promised to always watch another one's back. They are able to destroy walls on their way.")
MONSTER( 'H', 0xC0C0C0, "Gray Raider", moHexDemon, ZERO | MF_RAIDER, RESERVED, moHexDemon, "Gray Raiders never step on gray cells.")
MONSTER( 'A', 0x80B080, "Green Raider", moAltDemon, ZERO | MF_RAIDER, RESERVED, moAltDemon, "Green Raiders never step from one green cell to another.")
MONSTER( 'M', 0x904000, "Brown Raider", moMonk, ZERO | MF_RAIDER, RESERVED, moMonk, "Brown Raiders never move adjacent to an item.")
MONSTER( 'C', 0x0060E0, "Blue Raider", moCrusher, ZERO | MF_RAIDER, RESERVED, moYeti, "Blue Raiders have a powerful attack which takes two turns to complete, and also makes the Blue Raider stunned "
MONSTER( 'B', 0xC00000, "North Pole", moNorthPole, ZERO | CF_MAGNETIC, RESERVED, moYeti, NODESCYET)
MONSTER( 'B', 0x0000C0, "South Pole", moSouthPole, ZERO | CF_MAGNETIC, RESERVED, moYeti, NODESCYET)
MONSTER( 'P', 0xC03000, "Red Raider", moPair, ZERO | CF_RAIDER, RESERVED, moYeti, "Red Raiders travel in pairs. They have promised to always watch another one's back. They are able to destroy walls on their way.")
MONSTER( 'H', 0xC0C0C0, "Gray Raider", moHexDemon, ZERO | CF_RAIDER, RESERVED, moHexDemon, "Gray Raiders never step on gray cells.")
MONSTER( 'A', 0x80B080, "Green Raider", moAltDemon, ZERO | CF_RAIDER, RESERVED, moAltDemon, "Green Raiders never step from one green cell to another.")
MONSTER( 'M', 0x904000, "Brown Raider", moMonk, ZERO | CF_RAIDER, RESERVED, moMonk, "Brown Raiders never move adjacent to an item.")
MONSTER( 'C', 0x0060E0, "Blue Raider", moCrusher, ZERO | CF_RAIDER, RESERVED, moYeti, "Blue Raiders have a powerful attack which takes two turns to complete, and also makes the Blue Raider stunned "
"for a long time. This attack can destroy other Raiders if it hits them.")
MONSTER( '@', 0xC00000, "Red Jelly", moSwitch1, ZERO | MF_SWITCH, RESERVED, moYeti, jellydesc)
MONSTER( '@', 0x0000C0, "Blue Jelly", moSwitch2, ZERO | MF_SWITCH, RESERVED, moYeti, jellydesc)
MONSTER( 'B', 0xE07000, "Bronze Beast", moBrownBug, ZERO | MF_STUNNABLE, RESERVED, moYeti,
MONSTER( '@', 0xC00000, "Red Jelly", moSwitch1, ZERO | CF_SWITCH, RESERVED, moYeti, jellydesc)
MONSTER( '@', 0x0000C0, "Blue Jelly", moSwitch2, ZERO | CF_SWITCH, RESERVED, moYeti, jellydesc)
MONSTER( 'B', 0xE07000, "Bronze Beast", moBrownBug, ZERO | CF_STUNNABLE, RESERVED, moYeti,
"A large bug native to the Brown Islands. Cannot be killed easily due to their tough armor; still, they can be killed by pushing them into water or from great heights. "
"Bronze Beasts are very bad at descending slopes -- it takes them extra time to get down, and they are stunned for a longer time if you push them down."
)
MONSTER( 'B', 0xE07060, "Acid Gull", moAcidBird, ZERO | MF_BIRD | MF_FLYING | MF_IGNORE_PLATE, RESERVED, moEagle,
MONSTER( 'B', 0xE07060, "Acid Gull", moAcidBird, ZERO | CF_BIRD | CF_FLYING | CF_IGNORE_PLATE, RESERVED, moEagle,
"Where did this strange bird come from?...\n\n"
"Acid Gulls dissolve the land on which they fall when they die. "
)
@ -401,7 +406,7 @@ MONSTER( 'W', 0xA04060, "Mutant", moVariantWarrior, ZERO, RESERVED, moYeti,
)
MONSTER( 'W', 0x707080, "Falling Dog", moFallingDog, ZERO, RESERVED, moYeti,
"Distant relatives of the Running Dogs.")
MONSTER( 'B', 0xC0C040, "Western Hawk", moWestHawk, ZERO | MF_BIRD | MF_FLYING | MF_IGNORE_PLATE, RESERVED, moEagle,
MONSTER( 'B', 0xC0C040, "Western Hawk", moWestHawk, ZERO | CF_BIRD | CF_FLYING | CF_IGNORE_PLATE, RESERVED, moEagle,
"Some readers misinterpreted the early maps of Free Fall, thinking that it is a land to the west from some wall. "
"The name Western Hawks remained." )
@ -1253,23 +1258,23 @@ LAND( 0x30FF30, "Irradiated Field", laVariant, ZERO, itVarTreasure, RESERVED,
// add new content here
//shmupspecials
MONSTER( '@', 0xC0C0C0, "Rogue", moPlayer, ZERO | MF_PLAYER, RESERVED, moNone, "In the Shoot'em Up mode, you are armed with thrown Knives.")
MONSTER( '*', 0xC0C0C0, "Knife", moBullet, ZERO | MF_BULLET, RESERVED, moNone, "A simple, but effective, missile, used by rogues.")
MONSTER( '*', 0xFF0000, "Flail", moFlailBullet, ZERO | MF_BULLET, RESERVED, moNone, "This attack is likely to hit the attacker.")
MONSTER( '*', 0xFFFF00, "Fireball", moFireball, ZERO | MF_BULLET, RESERVED, moNone, "This magical missile burns whatever it hits.")
MONSTER( '*', 0xFFFF00, "Tongue", moTongue, ZERO | MF_BULLET, RESERVED, moNone, "Some monsters have long tongues, which allow them to attack enemies in nearby cells.")
MONSTER( '*', 0xFFFFFF, "Airball", moAirball, ZERO | MF_BULLET, RESERVED, moNone, "This magical missile pushes back whatever it hits.")
MONSTER( '*', 0x0060E0, "Blueball", moCrushball, ZERO | MF_BULLET, RESERVED, moNone, "A powerful missile from a Blue Raider.")
MONSTER( '@', 0xC0C0C0, "Rogue", moPlayer, ZERO | CF_PLAYER, RESERVED, moNone, "In the Shoot'em Up mode, you are armed with thrown Knives.")
MONSTER( '*', 0xC0C0C0, "Knife", moBullet, ZERO | CF_BULLET, RESERVED, moNone, "A simple, but effective, missile, used by rogues.")
MONSTER( '*', 0xFF0000, "Flail", moFlailBullet, ZERO | CF_BULLET, RESERVED, moNone, "This attack is likely to hit the attacker.")
MONSTER( '*', 0xFFFF00, "Fireball", moFireball, ZERO | CF_BULLET, RESERVED, moNone, "This magical missile burns whatever it hits.")
MONSTER( '*', 0xFFFF00, "Tongue", moTongue, ZERO | CF_BULLET, RESERVED, moNone, "Some monsters have long tongues, which allow them to attack enemies in nearby cells.")
MONSTER( '*', 0xFFFFFF, "Airball", moAirball, ZERO | CF_BULLET, RESERVED, moNone, "This magical missile pushes back whatever it hits.")
MONSTER( '*', 0x0060E0, "Blueball", moCrushball, ZERO | CF_BULLET, RESERVED, moNone, "A powerful missile from a Blue Raider.")
//technical/temporary
MONSTER( '?', 0x00C000, "dead bug", moDeadBug, ZERO | MF_TECHNICAL, RESERVED, moNone, NODESC)
MONSTER( '?', 0x00C000, "dead bug", moDeadBug, ZERO | CF_TECHNICAL, RESERVED, moNone, NODESC)
// appears as 'killed by electric discharge'
MONSTER( '?', 0xFFFF00, "electric discharge", moLightningBolt, ZERO | MF_TECHNICAL, RESERVED, moNone, elecdesc)
MONSTER( '?', 0xE06000, "dead bird", moDeadBird, ZERO | MF_TECHNICAL, RESERVED, moNone, NODESC)
MONSTER( '?', 0xE06000, "Energy Sword", moEnergySword, ZERO | MF_TECHNICAL, RESERVED, moNone, NODESC)
MONSTER( '!', 0xFF0000, "Warning", moWarning, ZERO | MF_TECHNICAL, RESERVED, moNone, warningdesc)
MONSTER( '!', 0xFF0000, "arrow trap", moArrowTrap, ZERO | MF_BULLET | MF_TECHNICAL, RESERVED, moNone, arrowtrapdesc)
MONSTER( '*', 0, "vertex", moRogueviz, ZERO | MF_TECHNICAL, RESERVED, moNone, "A vertex from rogueviz.")
MONSTER( '?', 0xFFFF00, "electric discharge", moLightningBolt, ZERO | CF_TECHNICAL, RESERVED, moNone, elecdesc)
MONSTER( '?', 0xE06000, "dead bird", moDeadBird, ZERO | CF_TECHNICAL, RESERVED, moNone, NODESC)
MONSTER( '?', 0xE06000, "Energy Sword", moEnergySword, ZERO | CF_TECHNICAL, RESERVED, moNone, NODESC)
MONSTER( '!', 0xFF0000, "Warning", moWarning, ZERO | CF_TECHNICAL, RESERVED, moNone, warningdesc)
MONSTER( '!', 0xFF0000, "arrow trap", moArrowTrap, ZERO | CF_BULLET | CF_TECHNICAL, RESERVED, moNone, arrowtrapdesc)
MONSTER( '*', 0, "vertex", moRogueviz, ZERO | CF_TECHNICAL, RESERVED, moNone, "A vertex from rogueviz.")
#undef MONSTER
#undef LAND

View File

@ -76,53 +76,53 @@ LANDFLAGCHECK(isTrollLand, flag & LF_TROLL)
LANDFLAGCHECK(inmirror, flag & LF_INMIRROR)
LANDFLAGCHECK(inmirrororwall, flag & LF_INMIRRORORWALL)
MONFLAGCHECK(isGhostable, !(flag & MF_NOGHOST))
MONFLAGCHECK(isRaider, flag & MF_RAIDER)
MONFLAGCHECK(isMimic, flag & MF_MIMIC)
MONFLAGCHECK(isPrincess, flag & MF_PRINCESS)
MONFLAGCHECK(isGolemOrKnight, flag & MF_GOK)
MONFLAGCHECK(isNonliving, flag & MF_NONLIVING)
MONFLAGCHECK(isMetalBeast, flag & MF_METAL)
MONFLAGCHECK(isStunnable, flag & MF_STUNNABLE)
MONFLAGCHECK(hasHitpoints, flag & MF_HP)
MONFLAGCHECK(isMountable, flag & MF_MOUNTABLE)
MONFLAGCHECK(isFriendlyType, flag & MF_FRIENDLY)
MONFLAGCHECK(isFriendlyOrPlayer, flag & (MF_FRIENDLY | MF_PLAYER))
MONFLAGCHECK(isBug, flag & MF_BUG)
MONFLAGCHECK(isIvy, flag & MF_IVY)
MONFLAGCHECK(isMonsterPart, flag & MF_PART)
MONFLAGCHECK(isMutantIvy, flag & MF_MUTANTIVY)
MONFLAGCHECK(isAnyIvy, flag & MF_ANYIVY)
MONFLAGCHECK(isBulletType, flag & MF_BULLET)
MONFLAGCHECK(isDemon, flag & MF_DEMON)
MONFLAGCHECK(isWorm, flag & MF_WORM)
MONFLAGCHECK(isWitch, flag & MF_WITCH)
MONFLAGCHECK(isAngryBird, (flag & MF_BIRD) && !(flag & MF_FRIENDLY))
MONFLAGCHECK(isBird, flag & MF_BIRD)
MONFLAGCHECK(slowMover, flag & MF_SLOWMOVER)
MONFLAGCHECK(isMagneticPole, flag & MF_MAGNETIC)
MONFLAGCHECK(isSwitch, flag & MF_SWITCH)
MONFLAGCHECK(isGhost, flag & MF_GHOST)
MONFLAGCHECK(isShark, flag & MF_SHARK)
MONFLAGCHECK(isSlimeMover, flag & MF_SLIME)
MONFLAGCHECK(isDragon, flag & MF_DRAGON)
MONFLAGCHECK(isKraken, flag & MF_KRAKEN)
MONFLAGCHECK(isBlowableMonster, !(flag & MF_NOBLOW))
MONFLAGCHECK(isMultitile, flag & MF_MULTITILE)
MONFLAGCHECK(isLeader, flag & MF_LEADER)
MONFLAGCHECK(isFlyingType, flag & MF_FLYING)
MONFLAGCHECK(attackThruVine, flag & MF_ATTACK_THRU_VINE)
MONFLAGCHECK(attackNonAdjacent, flag & MF_ATTACK_NONADJACENT)
MONFLAGCHECK(noHighlight, flag & MF_NOHIGHLIGHT)
MONFLAGCHECK(isInactiveEnemyType, flag & MF_INACTIVE)
MONFLAGCHECK(isUnarmed, flag & MF_UNARMED)
MONFLAGCHECK(ignoresPlatesType, flag & MF_IGNORE_PLATE)
MONFLAGCHECK(isBull, flag & MF_BULL)
MONFLAGCHECK(isTroll, flag & MF_TROLL)
MONFLAGCHECK(ignoresSmellType, flag & MF_IGNORE_SMELL)
MONFLAGCHECK(isRatling, flag & MF_RATLING)
MONFLAGCHECK(isGhostMover, flag & MF_GHOSTMOVER)
MONFLAGCHECK(isPowerMonster, flag & MF_POWER)
MONFLAGCHECK(isGhostable, !(flag & CF_NOGHOST))
MONFLAGCHECK(isRaider, flag & CF_RAIDER)
MONFLAGCHECK(isMimic, flag & CF_MIMIC)
MONFLAGCHECK(isPrincess, flag & CF_PRINCESS)
MONFLAGCHECK(isGolemOrKnight, flag & CF_GOK)
MONFLAGCHECK(isNonliving, flag & CF_NONLIVING)
MONFLAGCHECK(isMetalBeast, flag & CF_METAL)
MONFLAGCHECK(isStunnable, flag & CF_STUNNABLE)
MONFLAGCHECK(hasHitpoints, flag & CF_HP)
MONFLAGCHECK(isMountable, flag & CF_MOUNTABLE)
MONFLAGCHECK(isFriendlyType, flag & CF_FRIENDLY)
MONFLAGCHECK(isFriendlyOrPlayer, flag & (CF_FRIENDLY | CF_PLAYER))
MONFLAGCHECK(isBug, flag & CF_BUG)
MONFLAGCHECK(isIvy, flag & CF_IVY)
MONFLAGCHECK(isMonsterPart, flag & CF_PART)
MONFLAGCHECK(isMutantIvy, flag & CF_MUTANTIVY)
MONFLAGCHECK(isAnyIvy, flag & CF_ANYIVY)
MONFLAGCHECK(isBulletType, flag & CF_BULLET)
MONFLAGCHECK(isDemon, flag & CF_DEMON)
MONFLAGCHECK(isWorm, flag & CF_WORM)
MONFLAGCHECK(isWitch, flag & CF_WITCH)
MONFLAGCHECK(isAngryBird, (flag & CF_BIRD) && !(flag & CF_FRIENDLY))
MONFLAGCHECK(isBird, flag & CF_BIRD)
MONFLAGCHECK(slowMover, flag & CF_SLOWMOVER)
MONFLAGCHECK(isMagneticPole, flag & CF_MAGNETIC)
MONFLAGCHECK(isSwitch, flag & CF_SWITCH)
MONFLAGCHECK(isGhost, flag & CF_GHOST)
MONFLAGCHECK(isShark, flag & CF_SHARK)
MONFLAGCHECK(isSlimeMover, flag & CF_SLIME)
MONFLAGCHECK(isDragon, flag & CF_DRAGON)
MONFLAGCHECK(isKraken, flag & CF_KRAKEN)
MONFLAGCHECK(isBlowableMonster, !(flag & CF_NOBLOW))
MONFLAGCHECK(isMultitile, flag & CF_MULTITILE)
MONFLAGCHECK(isLeader, flag & CF_LEADER)
MONFLAGCHECK(isFlyingType, flag & CF_FLYING)
MONFLAGCHECK(attackThruVine, flag & CF_ATTACK_THRU_VINE)
MONFLAGCHECK(attackNonAdjacent, flag & CF_ATTACK_NONADJACENT)
MONFLAGCHECK(noHighlight, flag & CF_NOHIGHLIGHT)
MONFLAGCHECK(isInactiveEnemyType, flag & CF_INACTIVE)
MONFLAGCHECK(isUnarmed, flag & CF_UNARMED)
MONFLAGCHECK(ignoresPlatesType, flag & CF_IGNORE_PLATE)
MONFLAGCHECK(isBull, flag & CF_BULL)
MONFLAGCHECK(isTroll, flag & CF_TROLL)
MONFLAGCHECK(ignoresSmellType, flag & CF_IGNORE_SMELL)
MONFLAGCHECK(isRatling, flag & CF_RATLING)
MONFLAGCHECK(isGhostMover, flag & CF_GHOSTMOVER)
MONFLAGCHECK(isPowerMonster, flag & CF_POWER)
ITEMFLAGCHECK(isElementalShard, flag & IF_SHARD)
ITEMFLAGCHECK(itemBurns, !(flag & IF_FIREPROOF))