2018-06-07 02:25:54 +00:00
/*
* UNPUBLISHED - - Rights reserved under the copyright laws of the
* United States . Use of a copyright notice is precautionary only and
* does not imply publication or disclosure .
*
* THIS DOCUMENTATION CONTAINS CONFIDENTIAL AND PROPRIETARY INFORMATION
* OF BLIZZARD ENTERTAINMENT . ANY DUPLICATION , MODIFICATION ,
* DISTRIBUTION , OR DISCLOSURE IS STRICTLY PROHIBITED WITHOUT THE PRIOR
* EXPRESS WRITTEN PERMISSION OF BLIZZARD ENTERTAINMENT .
*/
# include "../types.h"
int MissileFileFlag ; // weak
int monster_cpp_init_value ; // weak
int monstkills [ 200 ] ;
int monstactive [ 200 ] ;
int nummonsters ;
int sgbSaveSoundOn ; // weak
MonsterStruct monster [ 200 ] ;
int totalmonsters ; // weak
CMonster Monsters [ 16 ] ;
// int END_Monsters_17; // weak
int monstimgtot ; // weak
int uniquetrans ;
int nummtypes ;
int monster_inf = 0x7F800000 ; // weak
char plr2monst [ 9 ] = { 0 , 5 , 3 , 7 , 1 , 4 , 6 , 0 , 2 } ;
unsigned char counsmiss [ 4 ] = { MIS_FIREBOLT , MIS_CBOLT , MIS_LIGHTCTRL , MIS_FIREBALL } ;
/* rdata */
MonsterData monsterdata [ 112 ] =
{
{ 128 , 799 , " Monsters \\ Zombie \\ Zombie%c.CL2 " , 0 , " Monsters \\ Zombie \\ Zombie%c%i.WAV " , 0 , 0 , NULL , { 11 , 24 , 12 , 6 , 16 , 0 } , { 4 , 0 , 0 , 0 , 0 , 0 } , " Zombie " , 1 , 3 , 1 , 4 , 7 , AI_ZOMBIE , 0 , 0 , 10 , 8 , 2 , 5 , 0 , 0 , 0 , 0 , 5 , MC_UNDEAD , 72 , 72 , 0 , 3 , 54 } ,
{ 128 , 799 , " Monsters \\ Zombie \\ Zombie%c.CL2 " , 0 , " Monsters \\ Zombie \\ Zombie%c%i.WAV " , 0 , 1 , " Monsters \\ Zombie \\ Bluered.TRN " , { 11 , 24 , 12 , 6 , 16 , 0 } , { 4 , 0 , 0 , 0 , 0 , 0 } , " Ghoul " , 2 , 4 , 2 , 7 , 11 , AI_ZOMBIE , 0 , 1 , 10 , 8 , 3 , 10 , 0 , 0 , 0 , 0 , 10 , MC_UNDEAD , 72 , 72 , 0 , 3 , 58 } ,
{ 128 , 799 , " Monsters \\ Zombie \\ Zombie%c.CL2 " , 0 , " Monsters \\ Zombie \\ Zombie%c%i.WAV " , 0 , 1 , " Monsters \\ Zombie \\ Grey.TRN " , { 11 , 24 , 12 , 6 , 16 , 0 } , { 4 , 0 , 0 , 0 , 0 , 0 } , " Rotting Carcass " , 2 , 6 , 4 , 15 , 25 , AI_ZOMBIE , 0 , 2 , 25 , 8 , 5 , 15 , 0 , 0 , 0 , 0 , 15 , MC_UNDEAD , 72 , 74 , 0 , 3 , 136 } ,
{ 128 , 799 , " Monsters \\ Zombie \\ Zombie%c.CL2 " , 0 , " Monsters \\ Zombie \\ Zombie%c%i.WAV " , 0 , 1 , " Monsters \\ Zombie \\ Yellow.TRN " , { 11 , 24 , 12 , 6 , 16 , 0 } , { 4 , 0 , 0 , 0 , 0 , 0 } , " Black Death " , 4 , 8 , 6 , 25 , 40 , AI_ZOMBIE , 0 , 3 , 30 , 8 , 6 , 22 , 0 , 0 , 0 , 0 , 20 , MC_UNDEAD , 72 , 76 , 0 , 3 , 240 } ,
{ 128 , 543 , " Monsters \\ FalSpear \\ Phall%c.CL2 " , 1 , " Monsters \\ FalSpear \\ Phall%c%i.WAV " , 1 , 1 , " Monsters \\ FalSpear \\ FallenT.TRN " , { 11 , 11 , 13 , 11 , 18 , 13 } , { 3 , 0 , 0 , 0 , 0 , 0 } , " Fallen One " , 1 , 3 , 1 , 1 , 4 , AI_FALLEN , 0 , 0 , 15 , 7 , 1 , 3 , 0 , 5 , 0 , 0 , 0 , MC_ANIMAL , 0 , 0 , 0 , 3 , 46 } ,
{ 128 , 543 , " Monsters \\ FalSpear \\ Phall%c.CL2 " , 1 , " Monsters \\ FalSpear \\ Phall%c%i.WAV " , 1 , 1 , " Monsters \\ FalSpear \\ Dark.TRN " , { 11 , 11 , 13 , 11 , 18 , 13 } , { 3 , 0 , 0 , 0 , 0 , 0 } , " Carver " , 2 , 5 , 3 , 4 , 8 , AI_FALLEN , 0 , 2 , 20 , 7 , 2 , 5 , 0 , 5 , 0 , 0 , 5 , MC_ANIMAL , 0 , 0 , 0 , 3 , 80 } ,
{ 128 , 543 , " Monsters \\ FalSpear \\ Phall%c.CL2 " , 1 , " Monsters \\ FalSpear \\ Phall%c%i.WAV " , 1 , 0 , NULL , { 11 , 11 , 13 , 11 , 18 , 13 } , { 3 , 0 , 0 , 0 , 0 , 0 } , " Devil Kin " , 3 , 7 , 5 , 12 , 24 , AI_FALLEN , 0 , 2 , 25 , 7 , 3 , 7 , 0 , 5 , 0 , 0 , 10 , MC_ANIMAL , 0 , 2 , 0 , 3 , 155 } ,
{ 128 , 543 , " Monsters \\ FalSpear \\ Phall%c.CL2 " , 1 , " Monsters \\ FalSpear \\ Phall%c%i.WAV " , 1 , 1 , " Monsters \\ FalSpear \\ Blue.TRN " , { 11 , 11 , 13 , 11 , 18 , 13 } , { 3 , 0 , 0 , 0 , 0 , 0 } , " Dark One " , 5 , 9 , 7 , 20 , 36 , AI_FALLEN , 0 , 3 , 30 , 7 , 4 , 8 , 0 , 5 , 0 , 0 , 15 , MC_ANIMAL , 64 , 68 , 0 , 3 , 255 } ,
{ 128 , 553 , " Monsters \\ SkelAxe \\ SklAx%c.CL2 " , 1 , " Monsters \\ SkelAxe \\ SklAx%c%i.WAV " , 0 , 1 , " Monsters \\ SkelAxe \\ White.TRN " , { 12 , 8 , 13 , 6 , 17 , 16 } , { 5 , 0 , 0 , 0 , 0 , 0 } , " Skeleton " , 1 , 3 , 1 , 2 , 4 , AI_SKELSD , 0 , 0 , 20 , 8 , 1 , 4 , 0 , 0 , 0 , 0 , 0 , MC_UNDEAD , 72 , 72 , 0 , 3 , 64 } ,
{ 128 , 553 , " Monsters \\ SkelAxe \\ SklAx%c.CL2 " , 1 , " Monsters \\ SkelAxe \\ SklAx%c%i.WAV " , 0 , 1 , " Monsters \\ SkelAxe \\ Skelt.TRN " , { 12 , 8 , 13 , 6 , 17 , 16 } , { 4 , 0 , 0 , 0 , 0 , 0 } , " Corpse Axe " , 2 , 5 , 2 , 4 , 7 , AI_SKELSD , 0 , 1 , 25 , 8 , 3 , 5 , 0 , 0 , 0 , 0 , 0 , MC_UNDEAD , 72 , 72 , 0 , 3 , 68 } ,
{ 128 , 553 , " Monsters \\ SkelAxe \\ SklAx%c.CL2 " , 1 , " Monsters \\ SkelAxe \\ SklAx%c%i.WAV " , 0 , 0 , NULL , { 12 , 8 , 13 , 6 , 17 , 16 } , { 2 , 0 , 0 , 0 , 0 , 0 } , " Burning Dead " , 2 , 6 , 4 , 8 , 12 , AI_SKELSD , 0 , 2 , 30 , 8 , 3 , 7 , 0 , 0 , 0 , 0 , 5 , MC_UNDEAD , 74 , 88 , 0 , 3 , 154 } ,
{ 128 , 553 , " Monsters \\ SkelAxe \\ SklAx%c.CL2 " , 1 , " Monsters \\ SkelAxe \\ SklAx%c%i.WAV " , 0 , 1 , " Monsters \\ SkelAxe \\ Black.TRN " , { 12 , 8 , 13 , 6 , 17 , 16 } , { 3 , 0 , 0 , 0 , 0 , 0 } , " Horror " , 4 , 8 , 6 , 12 , 20 , AI_SKELSD , 0 , 3 , 35 , 8 , 4 , 9 , 0 , 0 , 0 , 0 , 15 , MC_UNDEAD , 76 , 76 , 0 , 3 , 264 } ,
{ 128 , 623 , " Monsters \\ FalSword \\ Fall%c.CL2 " , 1 , " Monsters \\ FalSword \\ Fall%c%i.WAV " , 1 , 1 , " Monsters \\ FalSword \\ FallenT.TRN " , { 12 , 12 , 13 , 11 , 14 , 15 } , { 3 , 0 , 0 , 0 , 0 , 0 } , " Fallen One " , 1 , 3 , 1 , 2 , 5 , AI_FALLEN , 0 , 0 , 15 , 8 , 1 , 4 , 0 , 5 , 0 , 0 , 10 , MC_ANIMAL , 0 , 0 , 0 , 3 , 52 } ,
{ 128 , 623 , " Monsters \\ FalSword \\ Fall%c.CL2 " , 1 , " Monsters \\ FalSword \\ Fall%c%i.WAV " , 1 , 1 , " Monsters \\ FalSword \\ Dark.TRN " , { 12 , 12 , 13 , 11 , 14 , 15 } , { 3 , 0 , 0 , 0 , 0 , 0 } , " Carver " , 2 , 5 , 3 , 5 , 9 , AI_FALLEN , 0 , 1 , 20 , 8 , 2 , 7 , 0 , 5 , 0 , 0 , 15 , MC_ANIMAL , 0 , 0 , 0 , 3 , 90 } ,
{ 128 , 623 , " Monsters \\ FalSword \\ Fall%c.CL2 " , 1 , " Monsters \\ FalSword \\ Fall%c%i.WAV " , 1 , 0 , NULL , { 12 , 12 , 13 , 11 , 14 , 15 } , { 3 , 0 , 0 , 0 , 0 , 0 } , " Devil Kin " , 3 , 7 , 5 , 16 , 24 , AI_FALLEN , 0 , 2 , 25 , 8 , 4 , 10 , 0 , 5 , 0 , 0 , 20 , MC_ANIMAL , 0 , 2 , 0 , 3 , 180 } ,
{ 128 , 623 , " Monsters \\ FalSword \\ Fall%c.CL2 " , 1 , " Monsters \\ FalSword \\ Fall%c%i.WAV " , 1 , 1 , " Monsters \\ FalSword \\ Blue.TRN " , { 12 , 12 , 13 , 11 , 14 , 15 } , { 3 , 0 , 0 , 0 , 0 , 0 } , " Dark One " , 5 , 9 , 7 , 24 , 36 , AI_FALLEN , 0 , 3 , 30 , 8 , 4 , 12 , 0 , 5 , 0 , 0 , 25 , MC_ANIMAL , 64 , 68 , 0 , 3 , 280 } ,
{ 128 , 410 , " Monsters \\ Scav \\ Scav%c.CL2 " , 1 , " Monsters \\ Scav \\ Scav%c%i.WAV " , 0 , 0 , NULL , { 12 , 8 , 12 , 6 , 20 , 11 } , { 2 , 0 , 0 , 0 , 0 , 0 } , " Scavenger " , 1 , 4 , 2 , 3 , 6 , AI_SCAV , 0 , 0 , 20 , 7 , 1 , 5 , 0 , 0 , 0 , 0 , 10 , MC_ANIMAL , 0 , 2 , 0 , 3 , 80 } ,
{ 128 , 410 , " Monsters \\ Scav \\ Scav%c.CL2 " , 1 , " Monsters \\ Scav \\ Scav%c%i.WAV " , 0 , 1 , " Monsters \\ Scav \\ ScavBr.TRN " , { 12 , 8 , 12 , 6 , 20 , 11 } , { 2 , 0 , 0 , 0 , 0 , 0 } , " Plague Eater " , 3 , 6 , 4 , 12 , 24 , AI_SCAV , 0 , 1 , 30 , 7 , 1 , 8 , 0 , 0 , 0 , 0 , 20 , MC_ANIMAL , 0 , 4 , 0 , 3 , 188 } ,
{ 128 , 410 , " Monsters \\ Scav \\ Scav%c.CL2 " , 1 , " Monsters \\ Scav \\ Scav%c%i.WAV " , 0 , 1 , " Monsters \\ Scav \\ ScavBe.TRN " , { 12 , 8 , 12 , 6 , 20 , 11 } , { 2 , 0 , 0 , 0 , 0 , 0 } , " Shadow Beast " , 4 , 8 , 6 , 24 , 36 , AI_SCAV , 0 , 2 , 35 , 7 , 3 , 12 , 0 , 0 , 0 , 0 , 25 , MC_ANIMAL , 64 , 66 , 0 , 3 , 375 } ,
{ 128 , 410 , " Monsters \\ Scav \\ Scav%c.CL2 " , 1 , " Monsters \\ Scav \\ Scav%c%i.WAV " , 0 , 1 , " Monsters \\ Scav \\ ScavW.TRN " , { 12 , 8 , 12 , 6 , 20 , 11 } , { 2 , 0 , 0 , 0 , 0 , 0 } , " Bone Gasher " , 6 , 10 , 8 , 28 , 40 , AI_SCAV , 0 , 3 , 35 , 7 , 5 , 15 , 0 , 0 , 0 , 0 , 30 , MC_ANIMAL , 65 , 68 , 0 , 3 , 552 } ,
{ 128 , 567 , " Monsters \\ SkelBow \\ SklBw%c.CL2 " , 1 , " Monsters \\ SkelBow \\ SklBw%c%i.WAV " , 0 , 1 , " Monsters \\ SkelBow \\ White.TRN " , { 9 , 8 , 16 , 5 , 16 , 16 } , { 4 , 0 , 0 , 0 , 0 , 0 } , " Skeleton " , 2 , 5 , 3 , 2 , 4 , AI_SKELBOW , 0 , 0 , 15 , 12 , 1 , 2 , 0 , 0 , 0 , 0 , 0 , MC_UNDEAD , 72 , 72 , 0 , 3 , 110 } ,
{ 128 , 567 , " Monsters \\ SkelBow \\ SklBw%c.CL2 " , 1 , " Monsters \\ SkelBow \\ SklBw%c%i.WAV " , 0 , 1 , " Monsters \\ SkelBow \\ Skelt.TRN " , { 9 , 8 , 16 , 5 , 16 , 16 } , { 4 , 0 , 0 , 0 , 0 , 0 } , " Corpse Bow " , 3 , 7 , 5 , 8 , 16 , AI_SKELBOW , 0 , 1 , 25 , 12 , 1 , 4 , 0 , 0 , 0 , 0 , 0 , MC_UNDEAD , 72 , 72 , 0 , 3 , 210 } ,
{ 128 , 567 , " Monsters \\ SkelBow \\ SklBw%c.CL2 " , 1 , " Monsters \\ SkelBow \\ SklBw%c%i.WAV " , 0 , 0 , NULL , { 9 , 8 , 16 , 5 , 16 , 16 } , { 2 , 0 , 0 , 0 , 0 , 0 } , " Burning Dead " , 5 , 9 , 7 , 10 , 24 , AI_SKELBOW , 0 , 2 , 30 , 12 , 1 , 6 , 0 , 0 , 0 , 0 , 5 , MC_UNDEAD , 74 , 88 , 0 , 3 , 364 } ,
{ 128 , 567 , " Monsters \\ SkelBow \\ SklBw%c.CL2 " , 1 , " Monsters \\ SkelBow \\ SklBw%c%i.WAV " , 0 , 1 , " Monsters \\ SkelBow \\ Black.TRN " , { 9 , 8 , 16 , 5 , 16 , 16 } , { 3 , 0 , 0 , 0 , 0 , 0 } , " Horror " , 7 , 11 , 9 , 15 , 45 , AI_SKELBOW , 0 , 3 , 35 , 12 , 2 , 9 , 0 , 0 , 0 , 0 , 15 , MC_UNDEAD , 76 , 76 , 0 , 3 , 594 } ,
{ 128 , 575 , " Monsters \\ SkelSd \\ SklSr%c.CL2 " , 1 , " Monsters \\ SkelSd \\ SklSr%c%i.WAV " , 1 , 1 , " Monsters \\ SkelSd \\ White.TRN " , { 13 , 8 , 12 , 7 , 15 , 16 } , { 4 , 0 , 0 , 0 , 0 , 0 } , " Skeleton Captain " , 1 , 4 , 2 , 3 , 6 , AI_SKELSD , 0 , 0 , 20 , 8 , 2 , 7 , 0 , 0 , 0 , 0 , 10 , MC_UNDEAD , 72 , 72 , 0 , 3 , 90 } ,
{ 128 , 575 , " Monsters \\ SkelSd \\ SklSr%c.CL2 " , 1 , " Monsters \\ SkelSd \\ SklSr%c%i.WAV " , 0 , 1 , " Monsters \\ SkelSd \\ Skelt.TRN " , { 13 , 8 , 12 , 7 , 15 , 16 } , { 4 , 0 , 0 , 0 , 0 , 0 } , " Corpse Captain " , 2 , 6 , 4 , 12 , 20 , AI_SKELSD , 0 , 1 , 30 , 8 , 3 , 9 , 0 , 0 , 0 , 0 , 5 , MC_UNDEAD , 72 , 72 , 0 , 3 , 200 } ,
{ 128 , 575 , " Monsters \\ SkelSd \\ SklSr%c.CL2 " , 1 , " Monsters \\ SkelSd \\ SklSr%c%i.WAV " , 0 , 0 , NULL , { 13 , 8 , 12 , 7 , 15 , 16 } , { 4 , 0 , 0 , 0 , 0 , 0 } , " Burning Dead Captain " , 4 , 8 , 6 , 16 , 30 , AI_SKELSD , 0 , 2 , 35 , 8 , 4 , 10 , 0 , 0 , 0 , 0 , 15 , MC_UNDEAD , 74 , 88 , 0 , 3 , 393 } ,
{ 128 , 575 , " Monsters \\ SkelSd \\ SklSr%c.CL2 " , 1 , " Monsters \\ SkelSd \\ SklSr%c%i.WAV " , 0 , 1 , " Monsters \\ SkelSd \\ Black.TRN " , { 13 , 8 , 12 , 7 , 15 , 16 } , { 4 , 0 , 0 , 0 , 0 , 0 } , " Horror Captain " , 6 , 10 , 8 , 35 , 50 , AI_SKELSD , 256 , 3 , 40 , 8 , 5 , 14 , 0 , 0 , 0 , 0 , 30 , MC_UNDEAD , 76 , 76 , 0 , 3 , 604 } ,
{ 128 , 2000 , " Monsters \\ TSneak \\ TSneak%c.CL2 " , 0 , " Monsters \\ TSneak \\ Sneakl%c%i.WAV " , 0 , 0 , NULL , { 13 , 13 , 15 , 11 , 16 , 0 } , { 2 , 0 , 0 , 0 , 0 , 0 } , " Invisible Lord " , 14 , 14 , 14 , 278 , 278 , AI_SKELSD , 256 , 3 , 65 , 8 , 16 , 30 , 0 , 0 , 0 , 0 , 60 , MC_DEMON , 71 , 71 , 0 , 3 , 2000 } ,
{ 128 , 992 , " Monsters \\ Sneak \\ Sneak%c.CL2 " , 1 , " Monsters \\ Sneak \\ Sneak%c%i.WAV " , 0 , 0 , NULL , { 16 , 8 , 12 , 8 , 24 , 15 } , { 2 , 0 , 0 , 0 , 0 , 0 } , " Hidden " , 3 , 8 , 5 , 8 , 24 , AI_SNEAK , 1 , 0 , 35 , 8 , 3 , 6 , 0 , 0 , 0 , 0 , 25 , MC_DEMON , 0 , 64 , 0 , 3 , 278 } ,
{ 128 , 992 , " Monsters \\ Sneak \\ Sneak%c.CL2 " , 1 , " Monsters \\ Sneak \\ Sneak%c%i.WAV " , 0 , 1 , " Monsters \\ Sneak \\ Sneakv2.TRN " , { 16 , 8 , 12 , 8 , 24 , 15 } , { 2 , 0 , 0 , 0 , 0 , 0 } , " Stalker " , 8 , 12 , 9 , 30 , 45 , AI_SNEAK , 257 , 1 , 40 , 8 , 8 , 16 , 0 , 0 , 0 , 0 , 30 , MC_DEMON , 0 , 64 , 0 , 3 , 630 } ,
{ 128 , 992 , " Monsters \\ Sneak \\ Sneak%c.CL2 " , 1 , " Monsters \\ Sneak \\ Sneak%c%i.WAV " , 0 , 1 , " Monsters \\ Sneak \\ Sneakv3.TRN " , { 16 , 8 , 12 , 8 , 24 , 15 } , { 2 , 0 , 0 , 0 , 0 , 0 } , " Unseen " , 10 , 14 , 11 , 35 , 50 , AI_SNEAK , 257 , 2 , 45 , 8 , 12 , 20 , 0 , 0 , 0 , 0 , 30 , MC_DEMON , 65 , 72 , 0 , 3 , 935 } ,
{ 128 , 992 , " Monsters \\ Sneak \\ Sneak%c.CL2 " , 1 , " Monsters \\ Sneak \\ Sneak%c%i.WAV " , 0 , 1 , " Monsters \\ Sneak \\ Sneakv1.TRN " , { 16 , 8 , 12 , 8 , 24 , 15 } , { 2 , 0 , 0 , 0 , 0 , 0 } , " Illusion Weaver " , 14 , 18 , 13 , 40 , 60 , AI_SNEAK , 257 , 3 , 60 , 8 , 16 , 24 , 0 , 0 , 0 , 0 , 30 , MC_DEMON , 3 , 74 , 0 , 3 , 1500 } ,
{ 160 , 2000 , " Monsters \\ GoatLord \\ GoatL%c.CL2 " , 0 , " Monsters \\ GoatLord \\ Goatl%c%i.WAV " , 0 , 0 , NULL , { 13 , 13 , 14 , 9 , 16 , 0 } , { 2 , 0 , 0 , 0 , 0 , 0 } , " Lord Sayter " , 13 , 13 , 12 , 351 , 351 , AI_SKELSD , 256 , 3 , 80 , 8 , 14 , 24 , 0 , 0 , 0 , 0 , 60 , MC_DEMON , 67 , 67 , 0 , 3 , 1500 } ,
{ 128 , 1030 , " Monsters \\ GoatMace \\ Goat%c.CL2 " , 1 , " Monsters \\ GoatMace \\ Goat%c%i.WAV " , 0 , 0 , NULL , { 12 , 8 , 12 , 6 , 20 , 12 } , { 2 , 0 , 0 , 0 , 1 , 0 } , " Flesh Clan " , 6 , 10 , 8 , 30 , 45 , AI_GOATMC , 768 , 0 , 50 , 8 , 4 , 10 , 0 , 0 , 0 , 0 , 40 , MC_DEMON , 0 , 0 , 0 , 3 , 460 } ,
{ 128 , 1030 , " Monsters \\ GoatMace \\ Goat%c.CL2 " , 1 , " Monsters \\ GoatMace \\ Goat%c%i.WAV " , 0 , 1 , " Monsters \\ GoatMace \\ Beige.TRN " , { 12 , 8 , 12 , 6 , 20 , 12 } , { 2 , 0 , 0 , 0 , 1 , 0 } , " Stone Clan " , 8 , 12 , 10 , 40 , 55 , AI_GOATMC , 768 , 1 , 60 , 8 , 6 , 12 , 0 , 0 , 0 , 0 , 40 , MC_DEMON , 65 , 72 , 0 , 3 , 685 } ,
{ 128 , 1030 , " Monsters \\ GoatMace \\ Goat%c.CL2 " , 1 , " Monsters \\ GoatMace \\ Goat%c%i.WAV " , 0 , 1 , " Monsters \\ GoatMace \\ Red.TRN " , { 12 , 8 , 12 , 6 , 20 , 12 } , { 2 , 0 , 0 , 0 , 1 , 0 } , " Fire Clan " , 10 , 14 , 12 , 50 , 65 , AI_GOATMC , 768 , 2 , 70 , 8 , 8 , 16 , 0 , 0 , 0 , 0 , 45 , MC_DEMON , 2 , 16 , 0 , 3 , 906 } ,
{ 128 , 1030 , " Monsters \\ GoatMace \\ Goat%c.CL2 " , 1 , " Monsters \\ GoatMace \\ Goat%c%i.WAV " , 0 , 1 , " Monsters \\ GoatMace \\ Gray.TRN " , { 12 , 8 , 12 , 6 , 20 , 12 } , { 2 , 0 , 0 , 0 , 1 , 0 } , " Night Clan " , 12 , 16 , 14 , 55 , 70 , AI_GOATMC , 768 , 3 , 80 , 8 , 10 , 20 , 15 , 0 , 30 , 30 , 50 , MC_DEMON , 65 , 72 , 0 , 3 , 1190 } ,
{ 96 , 364 , " Monsters \\ Bat \\ Bat%c.CL2 " , 0 , " Monsters \\ Bat \\ Bat%c%i.WAV " , 0 , 1 , " Monsters \\ Bat \\ red.trn " , { 9 , 13 , 10 , 9 , 13 , 0 } , { 0 , 0 , 0 , 0 , 0 , 0 } , " Fiend " , 2 , 5 , 3 , 3 , 6 , AI_BAT , 0 , 0 , 35 , 5 , 1 , 6 , 0 , 0 , 0 , 0 , 0 , MC_ANIMAL , 0 , 0 , 16384 , 6 , 102 } ,
{ 96 , 364 , " Monsters \\ Bat \\ Bat%c.CL2 " , 0 , " Monsters \\ Bat \\ Bat%c%i.WAV " , 0 , 0 , NULL , { 9 , 13 , 10 , 9 , 13 , 0 } , { 0 , 0 , 0 , 0 , 0 , 0 } , " Blink " , 5 , 9 , 7 , 12 , 28 , AI_BAT , 0 , 1 , 45 , 5 , 1 , 8 , 0 , 0 , 0 , 0 , 15 , MC_ANIMAL , 0 , 0 , 16384 , 6 , 340 } ,
{ 96 , 364 , " Monsters \\ Bat \\ Bat%c.CL2 " , 0 , " Monsters \\ Bat \\ Bat%c%i.WAV " , 0 , 1 , " Monsters \\ Bat \\ grey.trn " , { 9 , 13 , 10 , 9 , 13 , 0 } , { 0 , 0 , 0 , 0 , 0 , 0 } , " Gloom " , 7 , 11 , 9 , 28 , 36 , AI_BAT , 256 , 2 , 70 , 5 , 4 , 12 , 0 , 0 , 0 , 0 , 35 , MC_ANIMAL , 1 , 65 , 16384 , 6 , 509 } ,
{ 96 , 364 , " Monsters \\ Bat \\ Bat%c.CL2 " , 0 , " Monsters \\ Bat \\ Bat%c%i.WAV " , 0 , 1 , " Monsters \\ Bat \\ orange.trn " , { 9 , 13 , 10 , 9 , 13 , 0 } , { 0 , 0 , 0 , 0 , 0 , 0 } , " Familiar " , 11 , 15 , 13 , 20 , 35 , AI_BAT , 256 , 3 , 50 , 5 , 4 , 16 , 0 , 0 , 0 , 0 , 35 , MC_DEMON , 33 , 97 , 16384 , 6 , 448 } ,
{ 128 , 1040 , " Monsters \\ GoatBow \\ GoatB%c.CL2 " , 0 , " Monsters \\ GoatBow \\ GoatB%c%i.WAV " , 0 , 0 , NULL , { 12 , 8 , 16 , 6 , 20 , 0 } , { 3 , 0 , 0 , 0 , 0 , 0 } , " Flesh Clan " , 6 , 10 , 8 , 20 , 35 , AI_GOATBOW , 512 , 0 , 35 , 13 , 1 , 7 , 0 , 0 , 0 , 0 , 35 , MC_DEMON , 0 , 0 , 0 , 3 , 448 } ,
{ 128 , 1040 , " Monsters \\ GoatBow \\ GoatB%c.CL2 " , 0 , " Monsters \\ GoatBow \\ GoatB%c%i.WAV " , 0 , 1 , " Monsters \\ GoatBow \\ Beige.TRN " , { 12 , 8 , 16 , 6 , 20 , 0 } , { 3 , 0 , 0 , 0 , 0 , 0 } , " Stone Clan " , 8 , 12 , 10 , 30 , 40 , AI_GOATBOW , 512 , 1 , 40 , 13 , 2 , 9 , 0 , 0 , 0 , 0 , 35 , MC_DEMON , 65 , 72 , 0 , 3 , 645 } ,
{ 128 , 1040 , " Monsters \\ GoatBow \\ GoatB%c.CL2 " , 0 , " Monsters \\ GoatBow \\ GoatB%c%i.WAV " , 0 , 1 , " Monsters \\ GoatBow \\ Red.TRN " , { 12 , 8 , 16 , 6 , 20 , 0 } , { 3 , 0 , 0 , 0 , 0 , 0 } , " Fire Clan " , 10 , 14 , 12 , 40 , 50 , AI_GOATBOW , 768 , 2 , 45 , 13 , 3 , 11 , 0 , 0 , 0 , 0 , 35 , MC_DEMON , 2 , 16 , 0 , 3 , 822 } ,
{ 128 , 1040 , " Monsters \\ GoatBow \\ GoatB%c.CL2 " , 0 , " Monsters \\ GoatBow \\ GoatB%c%i.WAV " , 0 , 1 , " Monsters \\ GoatBow \\ Gray.TRN " , { 12 , 8 , 16 , 6 , 20 , 0 } , { 3 , 0 , 0 , 0 , 0 , 0 } , " Night Clan " , 12 , 16 , 14 , 50 , 65 , AI_GOATBOW , 768 , 3 , 50 , 13 , 4 , 13 , 15 , 0 , 0 , 0 , 40 , MC_DEMON , 65 , 72 , 0 , 3 , 1092 } ,
{ 128 , 716 , " Monsters \\ Acid \\ Acid%c.CL2 " , 1 , " Monsters \\ Acid \\ Acid%c%i.WAV " , 1 , 0 , NULL , { 13 , 8 , 12 , 8 , 16 , 12 } , { 0 , 0 , 0 , 0 , 0 , 0 } , " Acid Beast " , 10 , 14 , 11 , 40 , 66 , AI_ACID , 0 , 0 , 40 , 8 , 4 , 12 , 25 , 8 , 0 , 0 , 30 , MC_ANIMAL , 128 , 136 , 0 , 3 , 846 } ,
{ 128 , 716 , " Monsters \\ Acid \\ Acid%c.CL2 " , 1 , " Monsters \\ Acid \\ Acid%c%i.WAV " , 1 , 1 , " Monsters \\ Acid \\ AcidBlk.TRN " , { 13 , 8 , 12 , 8 , 16 , 12 } , { 0 , 0 , 0 , 0 , 0 , 0 } , " Poison Spitter " , 14 , 18 , 15 , 60 , 85 , AI_ACID , 0 , 1 , 45 , 8 , 4 , 16 , 25 , 8 , 0 , 0 , 30 , MC_ANIMAL , 128 , 136 , 0 , 3 , 1248 } ,
{ 128 , 716 , " Monsters \\ Acid \\ Acid%c.CL2 " , 1 , " Monsters \\ Acid \\ Acid%c%i.WAV " , 1 , 1 , " Monsters \\ Acid \\ AcidB.TRN " , { 13 , 8 , 12 , 8 , 16 , 12 } , { 0 , 0 , 0 , 0 , 0 , 0 } , " Pit Beast " , 18 , 22 , 21 , 80 , 110 , AI_ACID , 0 , 2 , 55 , 8 , 8 , 18 , 35 , 8 , 0 , 0 , 35 , MC_ANIMAL , 129 , 140 , 0 , 3 , 2060 } ,
{ 128 , 716 , " Monsters \\ Acid \\ Acid%c.CL2 " , 1 , " Monsters \\ Acid \\ Acid%c%i.WAV " , 1 , 1 , " Monsters \\ Acid \\ AcidR.TRN " , { 13 , 8 , 12 , 8 , 16 , 12 } , { 0 , 0 , 0 , 0 , 0 , 0 } , " Lava Maw " , 22 , 27 , 25 , 100 , 150 , AI_ACID , 0 , 3 , 65 , 8 , 10 , 20 , 40 , 8 , 0 , 0 , 35 , MC_ANIMAL , 145 , 152 , 0 , 3 , 2940 } ,
{ 160 , 1010 , " Monsters \\ SKing \\ SKing%c.CL2 " , 1 , " Monsters \\ SKing \\ SKing%c%i.WAV " , 1 , 1 , " Monsters \\ SkelAxe \\ White.TRN " , { 8 , 6 , 16 , 6 , 16 , 6 } , { 2 , 0 , 0 , 0 , 0 , 2 } , " Skeleton King " , 6 , 6 , 9 , 140 , 140 , AI_SKELKING , 768 , 3 , 60 , 8 , 6 , 16 , 0 , 0 , 0 , 0 , 70 , MC_UNDEAD , 78 , 120 , 32769 , 7 , 570 } ,
{ 128 , 980 , " Monsters \\ FatC \\ FatC%c.CL2 " , 0 , " Monsters \\ FatC \\ FatC%c%i.WAV " , 0 , 0 , NULL , { 10 , 8 , 12 , 6 , 16 , 0 } , { 1 , 0 , 0 , 0 , 0 , 0 } , " The Butcher " , 0 , 0 , 1 , 320 , 320 , AI_CLEAVER , 0 , 3 , 50 , 8 , 6 , 12 , 0 , 0 , 0 , 0 , 50 , MC_DEMON , 6 , 49 , 32768 , 3 , 710 } ,
{ 128 , 1130 , " Monsters \\ Fat \\ Fat%c.CL2 " , 1 , " Monsters \\ Fat \\ Fat%c%i.WAV " , 0 , 0 , NULL , { 8 , 10 , 15 , 6 , 16 , 10 } , { 4 , 0 , 0 , 0 , 0 , 0 } , " Overlord " , 8 , 12 , 10 , 60 , 80 , AI_FAT , 0 , 0 , 55 , 8 , 6 , 12 , 0 , 0 , 0 , 0 , 55 , MC_DEMON , 0 , 2 , 0 , 3 , 635 } ,
{ 128 , 1130 , " Monsters \\ Fat \\ Fat%c.CL2 " , 1 , " Monsters \\ Fat \\ Fat%c%i.WAV " , 0 , 1 , " Monsters \\ Fat \\ Blue.TRN " , { 8 , 10 , 15 , 6 , 16 , 10 } , { 4 , 0 , 0 , 0 , 0 , 0 } , " Mud Man " , 13 , 17 , 14 , 100 , 125 , AI_FAT , 256 , 1 , 60 , 8 , 8 , 16 , 0 , 0 , 0 , 0 , 60 , MC_DEMON , 0 , 32 , 0 , 3 , 1165 } ,
{ 128 , 1130 , " Monsters \\ Fat \\ Fat%c.CL2 " , 1 , " Monsters \\ Fat \\ Fat%c%i.WAV " , 0 , 1 , " Monsters \\ Fat \\ FatB.TRN " , { 8 , 10 , 15 , 6 , 16 , 10 } , { 4 , 0 , 0 , 0 , 0 , 0 } , " Toad Demon " , 15 , 19 , 16 , 135 , 160 , AI_FAT , 256 , 2 , 70 , 8 , 8 , 16 , 40 , 0 , 8 , 20 , 65 , MC_DEMON , 8 , 12 , 0 , 3 , 1380 } ,
{ 128 , 1130 , " Monsters \\ Fat \\ Fat%c.CL2 " , 1 , " Monsters \\ Fat \\ Fat%c%i.WAV " , 0 , 1 , " Monsters \\ Fat \\ FatF.TRN " , { 8 , 10 , 15 , 6 , 16 , 10 } , { 4 , 0 , 0 , 0 , 0 , 0 } , " Flayed One " , 19 , 23 , 20 , 160 , 200 , AI_FAT , 256 , 3 , 85 , 8 , 10 , 20 , 0 , 0 , 0 , 0 , 70 , MC_DEMON , 17 , 24 , 0 , 3 , 2058 } ,
{ 160 , 2420 , " Monsters \\ Worm \\ Worm%c.CL2 " , 0 , " Monsters \\ Fat \\ Fat%c%i.WAV " , 0 , 0 , NULL , { 13 , 13 , 13 , 11 , 19 , 0 } , { 0 , 0 , 0 , 0 , 0 , 0 } , " Wyrm " , 9 , 13 , 11 , 60 , 90 , AI_SKELSD , 0 , 0 , 40 , 8 , 4 , 10 , 0 , 0 , 0 , 0 , 25 , MC_ANIMAL , 1 , 1 , 0 , 3 , 660 } ,
{ 160 , 2420 , " Monsters \\ Worm \\ Worm%c.CL2 " , 0 , " Monsters \\ Fat \\ Fat%c%i.WAV " , 0 , 0 , NULL , { 13 , 13 , 13 , 11 , 19 , 0 } , { 0 , 0 , 0 , 0 , 0 , 0 } , " Cave Slug " , 11 , 15 , 13 , 75 , 110 , AI_SKELSD , 0 , 1 , 50 , 8 , 6 , 13 , 0 , 0 , 0 , 0 , 30 , MC_ANIMAL , 1 , 1 , 0 , 3 , 994 } ,
{ 160 , 2420 , " Monsters \\ Worm \\ Worm%c.CL2 " , 0 , " Monsters \\ Fat \\ Fat%c%i.WAV " , 0 , 0 , NULL , { 13 , 13 , 13 , 11 , 19 , 0 } , { 0 , 0 , 0 , 0 , 0 , 0 } , " Devil Wyrm " , 13 , 17 , 15 , 100 , 140 , AI_SKELSD , 0 , 2 , 55 , 8 , 8 , 16 , 0 , 0 , 0 , 0 , 30 , MC_ANIMAL , 3 , 3 , 0 , 3 , 1320 } ,
{ 160 , 2420 , " Monsters \\ Worm \\ Worm%c.CL2 " , 0 , " Monsters \\ Fat \\ Fat%c%i.WAV " , 0 , 0 , NULL , { 13 , 13 , 13 , 11 , 19 , 0 } , { 0 , 0 , 0 , 0 , 0 , 0 } , " Devourer " , 15 , 19 , 17 , 125 , 200 , AI_SKELSD , 0 , 3 , 60 , 8 , 10 , 20 , 0 , 0 , 0 , 0 , 35 , MC_ANIMAL , 67 , 67 , 0 , 3 , 1827 } ,
{ 128 , 1680 , " Monsters \\ Magma \\ Magma%c.CL2 " , 1 , " Monsters \\ Magma \\ Magma%c%i.WAV " , 1 , 0 , NULL , { 8 , 10 , 14 , 7 , 18 , 18 } , { 2 , 0 , 0 , 0 , 1 , 0 } , " Magma Demon " , 14 , 17 , 13 , 50 , 70 , AI_MAGMA , 768 , 0 , 45 , 4 , 2 , 10 , 50 , 13 , 0 , 0 , 45 , MC_DEMON , 10 , 24 , 0 , 7 , 1076 } ,
{ 128 , 1680 , " Monsters \\ Magma \\ Magma%c.CL2 " , 1 , " Monsters \\ Magma \\ Magma%c%i.WAV " , 1 , 1 , " Monsters \\ Magma \\ Yellow.TRN " , { 8 , 10 , 14 , 7 , 18 , 18 } , { 2 , 0 , 0 , 0 , 1 , 0 } , " Blood Stone " , 15 , 19 , 14 , 55 , 75 , AI_MAGMA , 768 , 1 , 50 , 4 , 2 , 12 , 50 , 14 , 0 , 0 , 45 , MC_DEMON , 24 , 24 , 0 , 7 , 1309 } ,
{ 128 , 1680 , " Monsters \\ Magma \\ Magma%c.CL2 " , 1 , " Monsters \\ Magma \\ Magma%c%i.WAV " , 1 , 1 , " Monsters \\ Magma \\ Blue.TRN " , { 8 , 10 , 14 , 7 , 18 , 18 } , { 2 , 0 , 0 , 0 , 1 , 0 } , " Hell Stone " , 16 , 20 , 16 , 60 , 80 , AI_MAGMA , 768 , 2 , 60 , 4 , 2 , 20 , 60 , 14 , 0 , 0 , 50 , MC_DEMON , 24 , 24 , 0 , 7 , 1680 } ,
{ 128 , 1680 , " Monsters \\ Magma \\ Magma%c.CL2 " , 1 , " Monsters \\ Magma \\ Magma%c%i.WAV " , 1 , 1 , " Monsters \\ Magma \\ Wierd.TRN " , { 8 , 10 , 14 , 7 , 18 , 18 } , { 2 , 0 , 0 , 0 , 1 , 0 } , " Lava Lord " , 17 , 21 , 18 , 70 , 85 , AI_MAGMA , 768 , 3 , 75 , 4 , 4 , 24 , 60 , 14 , 0 , 0 , 60 , MC_DEMON , 24 , 24 , 0 , 7 , 2124 } ,
{ 160 , 1630 , " Monsters \\ Rhino \\ Rhino%c.CL2 " , 1 , " Monsters \\ Rhino \\ Rhino%c%i.WAV " , 1 , 0 , NULL , { 8 , 8 , 14 , 6 , 16 , 6 } , { 2 , 0 , 0 , 0 , 0 , 0 } , " Horned Demon " , 12 , 16 , 13 , 40 , 80 , AI_RHINO , 768 , 0 , 60 , 7 , 2 , 16 , 100 , 0 , 5 , 32 , 40 , MC_ANIMAL , 0 , 2 , 0 , 7 , 1172 } ,
{ 160 , 1630 , " Monsters \\ Rhino \\ Rhino%c.CL2 " , 1 , " Monsters \\ Rhino \\ Rhino%c%i.WAV " , 1 , 1 , " Monsters \\ Rhino \\ Orange.TRN " , { 8 , 8 , 14 , 6 , 16 , 6 } , { 2 , 0 , 0 , 0 , 0 , 0 } , " Mud Runner " , 14 , 18 , 15 , 50 , 90 , AI_RHINO , 768 , 1 , 70 , 7 , 6 , 18 , 100 , 0 , 12 , 36 , 45 , MC_ANIMAL , 0 , 2 , 0 , 7 , 1404 } ,
{ 160 , 1630 , " Monsters \\ Rhino \\ Rhino%c.CL2 " , 1 , " Monsters \\ Rhino \\ Rhino%c%i.WAV " , 1 , 1 , " Monsters \\ Rhino \\ Blue.TRN " , { 8 , 8 , 14 , 6 , 16 , 6 } , { 2 , 0 , 0 , 0 , 0 , 0 } , " Frost Charger " , 16 , 20 , 17 , 60 , 100 , AI_RHINO , 768 , 2 , 80 , 7 , 8 , 20 , 100 , 0 , 20 , 40 , 50 , MC_ANIMAL , 12 , 12 , 0 , 7 , 1720 } ,
{ 160 , 1630 , " Monsters \\ Rhino \\ Rhino%c.CL2 " , 1 , " Monsters \\ Rhino \\ Rhino%c%i.WAV " , 1 , 1 , " Monsters \\ Rhino \\ RhinoB.TRN " , { 8 , 8 , 14 , 6 , 16 , 6 } , { 2 , 0 , 0 , 0 , 0 , 0 } , " Obsidian Lord " , 18 , 22 , 19 , 70 , 110 , AI_RHINO , 768 , 3 , 90 , 7 , 10 , 22 , 100 , 0 , 20 , 50 , 55 , MC_ANIMAL , 12 , 56 , 0 , 7 , 1809 } ,
{ 128 , 1740 , " Monsters \\ Demskel \\ Demskl%c.CL2 " , 1 , " Monsters \\ Thin \\ Thin%c%i.WAV " , 1 , 0 , " Monsters \\ Thin \\ Thinv3.TRN " , { 10 , 8 , 20 , 6 , 24 , 16 } , { 3 , 0 , 0 , 0 , 0 , 0 } , " Bone Demon " , 10 , 14 , 12 , 70 , 70 , AI_STORM , 0 , 0 , 60 , 8 , 6 , 14 , 12 , 0 , 0 , 0 , 50 , MC_DEMON , 72 , 72 , 0 , 7 , 1344 } ,
{ 160 , 1740 , " Monsters \\ Thin \\ Thin%c.CL2 " , 1 , " Monsters \\ Thin \\ Thin%c%i.WAV " , 1 , 1 , " Monsters \\ Thin \\ Thinv3.TRN " , { 8 , 8 , 18 , 4 , 17 , 14 } , { 3 , 0 , 0 , 0 , 0 , 0 } , " Red Death " , 14 , 18 , 16 , 96 , 96 , AI_STORM , 0 , 1 , 75 , 5 , 10 , 20 , 0 , 0 , 0 , 0 , 60 , MC_DEMON , 24 , 24 , 0 , 7 , 2168 } ,
{ 160 , 1740 , " Monsters \\ Thin \\ Thin%c.CL2 " , 1 , " Monsters \\ Thin \\ Thin%c%i.WAV " , 1 , 1 , " Monsters \\ Thin \\ Thinv3.TRN " , { 8 , 8 , 18 , 4 , 17 , 14 } , { 3 , 0 , 0 , 0 , 0 , 0 } , " Litch Demon " , 16 , 20 , 18 , 110 , 110 , AI_STORM , 0 , 2 , 80 , 5 , 10 , 24 , 0 , 0 , 0 , 0 , 45 , MC_DEMON , 104 , 104 , 0 , 7 , 2736 } ,
{ 160 , 1740 , " Monsters \\ Thin \\ Thin%c.CL2 " , 1 , " Monsters \\ Thin \\ Thin%c%i.WAV " , 1 , 1 , " Monsters \\ Thin \\ Thinv3.TRN " , { 8 , 8 , 18 , 4 , 17 , 14 } , { 3 , 0 , 0 , 0 , 0 , 0 } , " Undead Balrog " , 20 , 24 , 22 , 130 , 130 , AI_STORM , 0 , 3 , 85 , 5 , 12 , 30 , 0 , 0 , 0 , 0 , 65 , MC_DEMON , 78 , 78 , 0 , 7 , 3575 } ,
{ 128 , 1460 , " Monsters \\ Fireman \\ FireM%c.CL2 " , 1 , " Monsters \\ Acid \\ Acid%c%i.WAV " , 0 , 0 , NULL , { 14 , 19 , 20 , 8 , 14 , 23 } , { 0 , 0 , 0 , 0 , 0 , 0 } , " Incinerator " , 14 , 18 , 16 , 30 , 45 , AI_FIREMAN , 0 , 0 , 75 , 8 , 8 , 16 , 0 , 0 , 0 , 0 , 25 , MC_DEMON , 24 , 24 , 0 , 3 , 1888 } ,
{ 128 , 1460 , " Monsters \\ Fireman \\ FireM%c.CL2 " , 1 , " Monsters \\ Acid \\ Acid%c%i.WAV " , 0 , 0 , NULL , { 14 , 19 , 20 , 8 , 14 , 23 } , { 0 , 0 , 0 , 0 , 0 , 0 } , " Flame Lord " , 16 , 20 , 18 , 40 , 55 , AI_FIREMAN , 0 , 1 , 75 , 8 , 10 , 20 , 0 , 0 , 0 , 0 , 25 , MC_DEMON , 24 , 24 , 0 , 3 , 2250 } ,
{ 128 , 1460 , " Monsters \\ Fireman \\ FireM%c.CL2 " , 1 , " Monsters \\ Acid \\ Acid%c%i.WAV " , 0 , 0 , NULL , { 14 , 19 , 20 , 8 , 14 , 23 } , { 0 , 0 , 0 , 0 , 0 , 0 } , " Doom Fire " , 18 , 22 , 20 , 50 , 65 , AI_FIREMAN , 0 , 2 , 80 , 8 , 12 , 24 , 0 , 0 , 0 , 0 , 30 , MC_DEMON , 28 , 28 , 0 , 3 , 2740 } ,
{ 128 , 1460 , " Monsters \\ Fireman \\ FireM%c.CL2 " , 1 , " Monsters \\ Acid \\ Acid%c%i.WAV " , 0 , 0 , NULL , { 14 , 19 , 20 , 8 , 14 , 23 } , { 0 , 0 , 0 , 0 , 0 , 0 } , " Hell Burner " , 20 , 24 , 22 , 60 , 80 , AI_FIREMAN , 0 , 3 , 85 , 8 , 15 , 30 , 0 , 0 , 0 , 0 , 30 , MC_DEMON , 28 , 28 , 0 , 3 , 3355 } ,
{ 160 , 1740 , " Monsters \\ Thin \\ Thin%c.CL2 " , 1 , " Monsters \\ Thin \\ Thin%c%i.WAV " , 1 , 1 , " Monsters \\ Thin \\ Thinv3.TRN " , { 8 , 8 , 18 , 4 , 17 , 14 } , { 3 , 0 , 0 , 0 , 0 , 0 } , " Red Storm " , 17 , 21 , 18 , 55 , 110 , AI_STORM , 768 , 0 , 80 , 5 , 8 , 18 , 75 , 8 , 4 , 16 , 30 , MC_DEMON , 12 , 40 , 0 , 7 , 2160 } ,
{ 160 , 1740 , " Monsters \\ Thin \\ Thin%c.CL2 " , 1 , " Monsters \\ Thin \\ Thin%c%i.WAV " , 1 , 0 , NULL , { 8 , 8 , 18 , 4 , 17 , 14 } , { 3 , 0 , 0 , 0 , 0 , 0 } , " Storm Rider " , 19 , 23 , 20 , 60 , 120 , AI_STORM , 768 , 1 , 80 , 5 , 8 , 18 , 80 , 8 , 4 , 16 , 30 , MC_DEMON , 33 , 40 , 0 , 7 , 2391 } ,
{ 160 , 1740 , " Monsters \\ Thin \\ Thin%c.CL2 " , 1 , " Monsters \\ Thin \\ Thin%c%i.WAV " , 1 , 1 , " Monsters \\ Thin \\ Thinv2.TRN " , { 8 , 8 , 18 , 4 , 17 , 14 } , { 3 , 0 , 0 , 0 , 0 , 0 } , " Storm Lord " , 21 , 25 , 22 , 75 , 135 , AI_STORM , 768 , 2 , 85 , 5 , 12 , 24 , 75 , 8 , 4 , 16 , 35 , MC_DEMON , 33 , 40 , 0 , 7 , 2775 } ,
{ 160 , 1740 , " Monsters \\ Thin \\ Thin%c.CL2 " , 1 , " Monsters \\ Thin \\ Thin%c%i.WAV " , 1 , 1 , " Monsters \\ Thin \\ Thinv1.TRN " , { 8 , 8 , 18 , 4 , 17 , 14 } , { 3 , 0 , 0 , 0 , 0 , 0 } , " Maelstorm " , 23 , 27 , 24 , 90 , 150 , AI_STORM , 768 , 3 , 90 , 5 , 12 , 28 , 75 , 8 , 4 , 16 , 40 , MC_DEMON , 97 , 104 , 0 , 7 , 3177 } ,
{ 128 , 1650 , " Monsters \\ BigFall \\ Fallg%c.CL2 " , 1 , " Monsters \\ BigFall \\ Bfal%c%i.WAV " , 0 , 0 , NULL , { 10 , 8 , 11 , 8 , 17 , 0 } , { 0 , 0 , 0 , 0 , 2 , 2 } , " Devil Kin Brute " , 20 , 20 , 24 , 160 , 220 , AI_SKELSD , 768 , 3 , 100 , 6 , 18 , 24 , 0 , 0 , 0 , 0 , 75 , MC_ANIMAL , 0 , 0 , 0 , 6 , 2000 } ,
{ 160 , 1650 , " Monsters \\ Gargoyle \\ Gargo%c.CL2 " , 1 , " Monsters \\ Gargoyle \\ Gargo%c%i.WAV " , 0 , 0 , NULL , { 14 , 14 , 14 , 10 , 18 , 14 } , { 0 , 0 , 0 , 0 , 0 , 2 } , " Winged-Demon " , 8 , 12 , 9 , 45 , 60 , AI_GARG , 512 , 0 , 50 , 7 , 10 , 16 , 0 , 0 , 0 , 0 , 45 , MC_DEMON , 74 , 88 , 0 , 6 , 662 } ,
{ 160 , 1650 , " Monsters \\ Gargoyle \\ Gargo%c.CL2 " , 1 , " Monsters \\ Gargoyle \\ Gargo%c%i.WAV " , 0 , 1 , " Monsters \\ Gargoyle \\ GarE.TRN " , { 14 , 14 , 14 , 10 , 18 , 14 } , { 0 , 0 , 0 , 0 , 0 , 2 } , " Gargoyle " , 12 , 16 , 13 , 60 , 90 , AI_GARG , 512 , 1 , 65 , 7 , 10 , 16 , 0 , 0 , 0 , 0 , 45 , MC_DEMON , 76 , 104 , 0 , 6 , 1205 } ,
{ 160 , 1650 , " Monsters \\ Gargoyle \\ Gargo%c.CL2 " , 1 , " Monsters \\ Gargoyle \\ Gargo%c%i.WAV " , 0 , 1 , " Monsters \\ Gargoyle \\ GargBr.TRN " , { 14 , 14 , 14 , 10 , 18 , 14 } , { 0 , 0 , 0 , 0 , 0 , 0 } , " Blood Claw " , 16 , 20 , 19 , 75 , 125 , AI_GARG , 512 , 2 , 80 , 7 , 14 , 22 , 0 , 0 , 0 , 0 , 50 , MC_DEMON , 88 , 92 , 0 , 6 , 1873 } ,
{ 160 , 1650 , " Monsters \\ Gargoyle \\ Gargo%c.CL2 " , 1 , " Monsters \\ Gargoyle \\ Gargo%c%i.WAV " , 0 , 1 , " Monsters \\ Gargoyle \\ GargB.TRN " , { 14 , 14 , 14 , 10 , 18 , 14 } , { 0 , 0 , 0 , 0 , 0 , 0 } , " Death Wing " , 18 , 22 , 23 , 90 , 150 , AI_GARG , 512 , 3 , 95 , 7 , 16 , 28 , 0 , 0 , 0 , 0 , 60 , MC_DEMON , 104 , 106 , 0 , 6 , 2278 } ,
{ 160 , 2220 , " Monsters \\ Mega \\ Mega%c.CL2 " , 1 , " Monsters \\ Mega \\ Mega%c%i.WAV " , 1 , 0 , NULL , { 6 , 7 , 14 , 1 , 24 , 5 } , { 3 , 0 , 0 , 0 , 2 , 0 } , " Slayer " , 19 , 23 , 20 , 120 , 140 , AI_MEGA , 768 , 0 , 100 , 8 , 12 , 20 , 0 , 3 , 0 , 0 , 60 , MC_DEMON , 17 , 17 , 0 , 7 , 2300 } ,
{ 160 , 2220 , " Monsters \\ Mega \\ Mega%c.CL2 " , 1 , " Monsters \\ Mega \\ Mega%c%i.WAV " , 1 , 1 , " Monsters \\ Mega \\ Guard.TRN " , { 6 , 7 , 14 , 1 , 24 , 5 } , { 3 , 0 , 0 , 0 , 2 , 0 } , " Guardian " , 21 , 25 , 22 , 140 , 160 , AI_MEGA , 768 , 1 , 110 , 8 , 14 , 22 , 0 , 3 , 0 , 0 , 65 , MC_DEMON , 17 , 17 , 0 , 7 , 2714 } ,
{ 160 , 2220 , " Monsters \\ Mega \\ Mega%c.CL2 " , 1 , " Monsters \\ Mega \\ Mega%c%i.WAV " , 1 , 1 , " Monsters \\ Mega \\ Vtexl.TRN " , { 6 , 7 , 14 , 1 , 24 , 5 } , { 3 , 0 , 0 , 0 , 2 , 0 } , " Vortex Lord " , 23 , 26 , 24 , 160 , 180 , AI_MEGA , 768 , 2 , 120 , 8 , 18 , 24 , 0 , 3 , 0 , 0 , 70 , MC_DEMON , 81 , 85 , 0 , 7 , 3252 } ,
{ 160 , 2220 , " Monsters \\ Mega \\ Mega%c.CL2 " , 1 , " Monsters \\ Mega \\ Mega%c%i.WAV " , 1 , 1 , " Monsters \\ Mega \\ Balr.TRN " , { 6 , 7 , 14 , 1 , 24 , 5 } , { 3 , 0 , 0 , 0 , 2 , 0 } , " Balrog " , 25 , 29 , 26 , 180 , 200 , AI_MEGA , 768 , 3 , 130 , 8 , 22 , 30 , 0 , 3 , 0 , 0 , 75 , MC_DEMON , 81 , 85 , 0 , 7 , 3643 } ,
{ 160 , 1270 , " Monsters \\ Snake \\ Snake%c.CL2 " , 0 , " Monsters \\ Snake \\ Snake%c%i.WAV " , 0 , 0 , NULL , { 12 , 11 , 13 , 5 , 18 , 0 } , { 2 , 0 , 0 , 0 , 1 , 0 } , " Cave Viper " , 20 , 24 , 21 , 100 , 150 , AI_SNAKE , 256 , 0 , 90 , 8 , 8 , 20 , 0 , 0 , 0 , 0 , 60 , MC_DEMON , 8 , 8 , 0 , 7 , 2725 } ,
{ 160 , 1270 , " Monsters \\ Snake \\ Snake%c.CL2 " , 0 , " Monsters \\ Snake \\ Snake%c%i.WAV " , 0 , 1 , " Monsters \\ Snake \\ SnakR.TRN " , { 12 , 11 , 13 , 5 , 18 , 0 } , { 2 , 0 , 0 , 0 , 1 , 0 } , " Fire Drake " , 22 , 26 , 23 , 120 , 170 , AI_SNAKE , 256 , 1 , 105 , 8 , 12 , 24 , 0 , 0 , 0 , 0 , 65 , MC_DEMON , 10 , 24 , 0 , 7 , 3139 } ,
{ 160 , 1270 , " Monsters \\ Snake \\ Snake%c.CL2 " , 0 , " Monsters \\ Snake \\ Snake%c%i.WAV " , 0 , 1 , " Monsters \\ Snake \\ Snakg.TRN " , { 12 , 11 , 13 , 5 , 18 , 0 } , { 2 , 0 , 0 , 0 , 1 , 0 } , " Gold Viper " , 24 , 27 , 25 , 140 , 180 , AI_SNAKE , 256 , 2 , 120 , 8 , 15 , 26 , 0 , 0 , 0 , 0 , 70 , MC_DEMON , 12 , 12 , 0 , 7 , 3540 } ,
{ 160 , 1270 , " Monsters \\ Snake \\ Snake%c.CL2 " , 0 , " Monsters \\ Snake \\ Snake%c%i.WAV " , 0 , 1 , " Monsters \\ Snake \\ Snakb.TRN " , { 12 , 11 , 13 , 5 , 18 , 0 } , { 2 , 0 , 0 , 0 , 1 , 0 } , " Azure Drake " , 28 , 30 , 27 , 160 , 200 , AI_SNAKE , 256 , 3 , 130 , 8 , 18 , 30 , 0 , 0 , 0 , 0 , 75 , MC_DEMON , 6 , 42 , 0 , 7 , 3791 } ,
{ 160 , 2120 , " Monsters \\ Black \\ Black%c.CL2 " , 0 , " Monsters \\ Black \\ Black%c%i.WAV " , 0 , 0 , NULL , { 8 , 8 , 16 , 4 , 24 , 0 } , { 2 , 0 , 0 , 0 , 0 , 0 } , " Black Knight " , 23 , 27 , 24 , 150 , 150 , AI_SKELSD , 256 , 0 , 110 , 8 , 15 , 20 , 0 , 0 , 0 , 0 , 75 , MC_DEMON , 69 , 97 , 0 , 7 , 3360 } ,
{ 160 , 2120 , " Monsters \\ Black \\ Black%c.CL2 " , 0 , " Monsters \\ Black \\ Black%c%i.WAV " , 0 , 1 , " Monsters \\ Black \\ BlkKntRT.TRN " , { 8 , 8 , 16 , 4 , 24 , 0 } , { 2 , 0 , 0 , 0 , 0 , 0 } , " Doom Guard " , 25 , 29 , 26 , 165 , 165 , AI_SKELSD , 256 , 0 , 130 , 8 , 18 , 25 , 0 , 0 , 0 , 0 , 75 , MC_DEMON , 67 , 81 , 0 , 7 , 3650 } ,
{ 160 , 2120 , " Monsters \\ Black \\ Black%c.CL2 " , 0 , " Monsters \\ Black \\ Black%c%i.WAV " , 0 , 1 , " Monsters \\ Black \\ BlkKntBT.TRN " , { 8 , 8 , 16 , 4 , 24 , 0 } , { 2 , 0 , 0 , 0 , 0 , 0 } , " Steel Lord " , 27 , 30 , 28 , 180 , 180 , AI_SKELSD , 256 , 1 , 120 , 8 , 20 , 30 , 0 , 0 , 0 , 0 , 80 , MC_DEMON , 85 , 92 , 0 , 7 , 4252 } ,
{ 160 , 2120 , " Monsters \\ Black \\ Black%c.CL2 " , 0 , " Monsters \\ Black \\ Black%c%i.WAV " , 0 , 1 , " Monsters \\ Black \\ BlkKntBe.TRN " , { 8 , 8 , 16 , 4 , 24 , 0 } , { 2 , 0 , 0 , 0 , 0 , 0 } , " Blood Knight " , 24 , 26 , 30 , 200 , 200 , AI_SKELSD , 256 , 1 , 130 , 8 , 25 , 35 , 0 , 0 , 0 , 0 , 85 , MC_DEMON , 106 , 106 , 0 , 7 , 5130 } ,
{ 96 , 484 , " Monsters \\ Unrav \\ Unrav%c.CL2 " , 0 , " Monsters \\ Acid \\ Acid%c%i.WAV " , 0 , 0 , NULL , { 10 , 10 , 12 , 5 , 16 , 0 } , { 0 , 0 , 0 , 0 , 0 , 0 } , " Unraveler " , 26 , 28 , 25 , 70 , 150 , AI_SKELSD , 0 , 0 , 75 , 7 , 10 , 20 , 0 , 0 , 0 , 0 , 70 , MC_UNDEAD , 106 , 106 , 0 , 3 , 3812 } ,
{ 96 , 484 , " Monsters \\ Unrav \\ Unrav%c.CL2 " , 0 , " Monsters \\ Acid \\ Acid%c%i.WAV " , 0 , 0 , NULL , { 10 , 10 , 12 , 5 , 16 , 0 } , { 0 , 0 , 0 , 0 , 0 , 0 } , " Hollow One " , 28 , 30 , 27 , 135 , 240 , AI_SKELSD , 0 , 1 , 75 , 7 , 12 , 24 , 0 , 0 , 0 , 0 , 75 , MC_UNDEAD , 92 , 92 , 0 , 3 , 4374 } ,
{ 96 , 484 , " Monsters \\ Unrav \\ Unrav%c.CL2 " , 0 , " Monsters \\ Acid \\ Acid%c%i.WAV " , 0 , 0 , NULL , { 10 , 10 , 12 , 5 , 16 , 0 } , { 0 , 0 , 0 , 0 , 0 , 0 } , " Pain Master " , 27 , 30 , 29 , 110 , 200 , AI_SKELSD , 0 , 2 , 80 , 7 , 16 , 30 , 0 , 0 , 0 , 0 , 80 , MC_UNDEAD , 92 , 92 , 0 , 3 , 5147 } ,
{ 96 , 484 , " Monsters \\ Unrav \\ Unrav%c.CL2 " , 0 , " Monsters \\ Acid \\ Acid%c%i.WAV " , 0 , 0 , NULL , { 10 , 10 , 12 , 5 , 16 , 0 } , { 0 , 0 , 0 , 0 , 0 , 0 } , " Reality Weaver " , 28 , 30 , 30 , 135 , 240 , AI_SKELSD , 0 , 3 , 85 , 7 , 20 , 35 , 0 , 0 , 0 , 0 , 85 , MC_UNDEAD , 113 , 113 , 0 , 3 , 5925 } ,
{ 128 , 980 , " Monsters \\ Succ \\ Scbs%c.CL2 " , 0 , " Monsters \\ Succ \\ Scbs%c%i.WAV " , 0 , 0 , NULL , { 14 , 8 , 16 , 7 , 24 , 0 } , { 0 , 0 , 0 , 0 , 0 , 0 } , " Succubus " , 22 , 26 , 24 , 120 , 150 , AI_SUCC , 512 , 0 , 100 , 10 , 1 , 20 , 0 , 0 , 0 , 0 , 60 , MC_DEMON , 1 , 10 , 0 , 3 , 3696 } ,
{ 128 , 980 , " Monsters \\ Succ \\ Scbs%c.CL2 " , 0 , " Monsters \\ Succ \\ Scbs%c%i.WAV " , 0 , 1 , " Monsters \\ Succ \\ Succb.TRN " , { 14 , 8 , 16 , 7 , 24 , 0 } , { 0 , 0 , 0 , 0 , 0 , 0 } , " Snow Witch " , 25 , 28 , 26 , 135 , 175 , AI_SUCC , 512 , 1 , 110 , 10 , 1 , 24 , 0 , 0 , 0 , 0 , 65 , MC_DEMON , 68 , 76 , 0 , 3 , 4084 } ,
{ 128 , 980 , " Monsters \\ Succ \\ Scbs%c.CL2 " , 0 , " Monsters \\ Succ \\ Scbs%c%i.WAV " , 0 , 1 , " Monsters \\ Succ \\ Succrw.TRN " , { 14 , 8 , 16 , 7 , 24 , 0 } , { 0 , 0 , 0 , 0 , 0 , 0 } , " Hell Spawn " , 27 , 30 , 28 , 150 , 200 , AI_SUCC , 768 , 2 , 115 , 10 , 1 , 30 , 0 , 0 , 0 , 0 , 75 , MC_DEMON , 33 , 28 , 0 , 3 , 4480 } ,
{ 128 , 980 , " Monsters \\ Succ \\ Scbs%c.CL2 " , 0 , " Monsters \\ Succ \\ Scbs%c%i.WAV " , 0 , 1 , " Monsters \\ Succ \\ Succbw.TRN " , { 14 , 8 , 16 , 7 , 24 , 0 } , { 0 , 0 , 0 , 0 , 0 , 0 } , " Soul Burner " , 28 , 30 , 30 , 140 , 225 , AI_SUCC , 768 , 3 , 120 , 10 , 1 , 35 , 0 , 0 , 0 , 0 , 85 , MC_DEMON , 21 , 56 , 0 , 3 , 4644 } ,
{ 128 , 2000 , " Monsters \\ Mage \\ Mage%c.CL2 " , 1 , " Monsters \\ Mage \\ Mage%c%i.WAV " , 0 , 0 , NULL , { 12 , 1 , 20 , 8 , 28 , 20 } , { 0 , 0 , 0 , 0 , 0 , 0 } , " Counselor " , 24 , 26 , 25 , 70 , 70 , AI_COUNSLR , 512 , 0 , 90 , 8 , 8 , 20 , 0 , 0 , 0 , 0 , 0 , MC_DEMON , 7 , 7 , 0 , 7 , 4070 } ,
{ 128 , 2000 , " Monsters \\ Mage \\ Mage%c.CL2 " , 1 , " Monsters \\ Mage \\ Mage%c%i.WAV " , 0 , 1 , " Monsters \\ Mage \\ Cnselg.TRN " , { 12 , 1 , 20 , 8 , 28 , 20 } , { 0 , 0 , 0 , 0 , 0 , 0 } , " Magistrate " , 26 , 28 , 27 , 85 , 85 , AI_COUNSLR , 512 , 1 , 100 , 8 , 10 , 24 , 0 , 0 , 0 , 0 , 0 , MC_DEMON , 85 , 92 , 0 , 7 , 4478 } ,
{ 128 , 2000 , " Monsters \\ Mage \\ Mage%c.CL2 " , 1 , " Monsters \\ Mage \\ Mage%c%i.WAV " , 0 , 1 , " Monsters \\ Mage \\ Cnselgd.TRN " , { 12 , 1 , 20 , 8 , 28 , 20 } , { 0 , 0 , 0 , 0 , 0 , 0 } , " Cabalist " , 28 , 30 , 29 , 120 , 120 , AI_COUNSLR , 512 , 2 , 110 , 8 , 14 , 30 , 0 , 0 , 0 , 0 , 0 , MC_DEMON , 99 , 106 , 0 , 7 , 4929 } ,
{ 128 , 2000 , " Monsters \\ Mage \\ Mage%c.CL2 " , 1 , " Monsters \\ Mage \\ Mage%c%i.WAV " , 0 , 1 , " Monsters \\ Mage \\ Cnselbk.TRN " , { 12 , 1 , 20 , 8 , 28 , 20 } , { 0 , 0 , 0 , 0 , 0 , 0 } , " Advocate " , 30 , 30 , 30 , 145 , 145 , AI_COUNSLR , 512 , 3 , 120 , 8 , 15 , 25 , 0 , 0 , 0 , 0 , 0 , MC_DEMON , 106 , 120 , 0 , 7 , 4968 } ,
{ 96 , 386 , " Monsters \\ Golem \\ Golem%c.CL2 " , 1 , " Monsters \\ Golem \\ Golm%c%i.WAV " , 0 , 0 , NULL , { 0 , 16 , 12 , 0 , 12 , 20 } , { 0 , 0 , 0 , 0 , 0 , 0 } , " Golem " , 0 , 0 , 12 , 1 , 1 , AI_GOLUM , 512 , 0 , 0 , 7 , 1 , 1 , 0 , 0 , 0 , 0 , 1 , MC_DEMON , 0 , 0 , 0 , 0 , 0 } ,
{ 160 , 2000 , " Monsters \\ Diablo \\ Diablo%c.CL2 " , 1 , " Monsters \\ Diablo \\ Diablo%c%i.WAV " , 1 , 0 , NULL , { 16 , 6 , 16 , 6 , 16 , 16 } , { 0 , 0 , 0 , 0 , 0 , 0 } , " The Dark Lord " , 50 , 50 , 30 , 1666 , 1666 , AI_DIABLO , 896 , 3 , 220 , 4 , 30 , 60 , 0 , 11 , 0 , 0 , 70 , MC_DEMON , 78 , 78 , 0 , 7 , 31666 } ,
{ 128 , 1060 , " Monsters \\ DarkMage \\ Dmage%c.CL2 " , 1 , " Monsters \\ DarkMage \\ Dmag%c%i.WAV " , 0 , 0 , NULL , { 6 , 1 , 21 , 6 , 23 , 18 } , { 0 , 0 , 0 , 0 , 0 , 0 } , " The Arch-Litch Malignus " , 30 , 30 , 30 , 160 , 160 , AI_COUNSLR , 512 , 3 , 120 , 8 , 20 , 40 , 0 , 0 , 0 , 0 , 70 , MC_DEMON , 71 , 120 , 0 , 7 , 4968 }
} ;
char MonstConvTbl [ 128 ] =
{
0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ,
10 , 11 , 12 , 13 , 14 , 15 , 16 , 17 , 18 , 19 ,
20 , 21 , 22 , 23 , 24 , 25 , 26 , 27 , 29 , 30 ,
31 , 32 , 34 , 35 , 36 , 37 , 38 , 40 , 39 , 41 ,
42 , 43 , 44 , 45 , 46 , 47 , 48 , 49 , 50 , 52 ,
53 , 54 , 55 , 56 , 57 , 59 , 58 , 60 , 61 , 62 ,
63 , 64 , 65 , 66 , 67 , 68 , 69 , 70 , 71 , 0 ,
0 , 0 , 0 , 72 , 73 , 74 , 75 , 0 , 0 , 0 ,
0 , 77 , 76 , 78 , 79 , 81 , 82 , 83 , 84 , 85 ,
86 , 87 , 88 , 89 , 90 , 92 , 91 , 93 , 94 , 95 ,
96 , 97 , 98 , 99 , 100 , 101 , 102 , 103 , 104 , 105 ,
106 , 107 , 108 , 0 , 110 , 0 , 109 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 , 0 , 80 , 111
} ;
unsigned char MonstAvailTbl [ 112 ] =
{
1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ,
1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ,
1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 2 ,
2 , 2 , 2 , 0 , 2 , 2 , 2 , 2 , 1 , 1 ,
1 , 1 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 ,
0 , 0 , 2 , 2 , 2 , 2 , 0 , 0 , 0 , 0 ,
2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 , 0 , 2 , 2 , 2 , 2 ,
0 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 ,
2 , 2 , 2 , 2 , 2 , 2 , 2 , 0 , 0 , 0 ,
0 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 0 ,
0 , 0
} ;
UniqMonstStruct UniqMonst [ 98 ] =
{
{ MT_NGOATMC , " Gharbad the Weak " , " BSDB " , 4 , 120 , AI_GARBUD , 3 , 8 , 16 , 96 , 0 , 0 , 0 , QUEST_GARBUD1 } ,
{ MT_SKING , " Skeleton King " , " GENRL " , 0 , 240 , AI_SKELKING , 3 , 6 , 16 , 78 , 1 , 0 , 0 , 0 } ,
{ MT_COUNSLR , " Zhar the Mad " , " GENERAL " , 8 , 360 , AI_ZHAR , 3 , 16 , 40 , 14 , 0 , 0 , 0 , QUEST_ZHAR1 } ,
{ MT_BFALLSP , " Snotspill " , " BNG " , 4 , 220 , AI_SNOTSPIL , 3 , 10 , 18 , 4 , 0 , 0 , 0 , QUEST_BANNER10 } ,
{ MT_ADVOCATE , " Arch-Bishop Lazarus " , " GENERAL " , 0 , 600 , AI_LAZURUS , 3 , 30 , 50 , 78 , 0 , 0 , 0 , QUEST_VILE13 } ,
{ MT_HLSPWN , " Red Vex " , " REDV " , 0 , 400 , AI_LAZHELP , 3 , 30 , 50 , 74 , 0 , 0 , 0 , QUEST_VILE13 } ,
{ MT_HLSPWN , " BlackJade " , " BLKJD " , 0 , 400 , AI_LAZHELP , 3 , 30 , 50 , 76 , 0 , 0 , 0 , QUEST_VILE13 } ,
{ MT_RBLACK , " Lachdanan " , " BHKA " , 14 , 500 , AI_LACHDAN , 3 , 0 , 0 , 0 , 0 , 0 , 0 , QUEST_VEIL9 } ,
{ MT_BTBLACK , " Warlord of Blood " , " GENERAL " , 13 , 850 , AI_WARLORD , 3 , 35 , 50 , 120 , 0 , 0 , 0 , QUEST_WARLRD9 } ,
{ MT_CLEAVER , " The Butcher " , " GENRL " , 0 , 220 , AI_CLEAVER , 3 , 6 , 12 , 70 , 0 , 0 , 0 , 0 } ,
{ MT_TSKELAX , " Bonehead Keenaxe " , " BHKA " , 2 , 91 , AI_SKELSD , 2 , 4 , 10 , 72 , 7 , 100 , 0 , 0 } ,
{ MT_RFALLSD , " Bladeskin the Slasher " , " BSTS " , 2 , 51 , AI_FALLEN , 0 , 6 , 18 , 2 , 11 , 45 , 0 , 0 } ,
{ MT_NZOMBIE , " Soulpus " , " GENERAL " , 2 , 133 , AI_ZOMBIE , 0 , 4 , 8 , 6 , 0 , 0 , 0 , 0 } ,
{ MT_RFALLSP , " Pukerat the Unclean " , " PTU " , 2 , 77 , AI_FALLEN , 3 , 1 , 5 , 2 , 0 , 0 , 0 , 0 } ,
{ MT_WSKELAX , " Boneripper " , " BR " , 2 , 54 , AI_BAT , 0 , 6 , 15 , 88 , 3 , 0 , 0 , 0 } ,
{ MT_NZOMBIE , " Rotfeast the Hungry " , " ETH " , 2 , 85 , AI_SKELSD , 3 , 4 , 12 , 72 , 3 , 0 , 0 , 0 } ,
{ MT_DFALLSD , " Gutshank the Quick " , " GTQ " , 3 , 66 , AI_BAT , 2 , 6 , 16 , 2 , 3 , 0 , 0 , 0 } ,
{ MT_TSKELSD , " Brokenhead Bangshield " , " BHBS " , 3 , 108 , AI_SKELSD , 3 , 12 , 20 , 76 , 3 , 0 , 0 , 0 } ,
{ MT_YFALLSP , " Bongo " , " BNG " , 3 , 178 , AI_FALLEN , 3 , 9 , 21 , 0 , 3 , 0 , 0 , 0 } ,
{ MT_BZOMBIE , " Rotcarnage " , " RCRN " , 3 , 102 , AI_ZOMBIE , 3 , 9 , 24 , 76 , 11 , 45 , 0 , 0 } ,
{ MT_NSCAV , " Shadowbite " , " SHBT " , 2 , 60 , AI_SKELSD , 3 , 3 , 20 , 16 , 3 , 0 , 0 , 0 } ,
{ MT_WSKELBW , " Deadeye " , " DE " , 2 , 49 , AI_GOATBOW , 0 , 6 , 9 , 74 , 0 , 0 , 0 , 0 } ,
{ MT_RSKELAX , " Madeye the Dead " , " MTD " , 4 , 75 , AI_BAT , 0 , 9 , 21 , 24 , 11 , 30 , 0 , 0 } ,
{ MT_BSCAV , " El Chupacabras " , " GENERAL " , 3 , 120 , AI_GOATMC , 0 , 10 , 18 , 2 , 3 , 30 , 0 , 0 } ,
{ MT_TSKELBW , " Skullfire " , " SKFR " , 3 , 125 , AI_GOATBOW , 1 , 6 , 10 , 16 , 0 , 100 , 0 , 0 } ,
{ MT_SNEAK , " Warpskull " , " TSPO " , 3 , 117 , AI_SNEAK , 2 , 6 , 18 , 6 , 3 , 0 , 0 , 0 } ,
{ MT_GZOMBIE , " Goretongue " , " PMR " , 3 , 156 , AI_SKELSD , 1 , 15 , 30 , 72 , 0 , 0 , 0 , 0 } ,
{ MT_WSCAV , " Pulsecrawler " , " BHKA " , 4 , 150 , AI_SCAV , 0 , 16 , 20 , 20 , 11 , 45 , 0 , 0 } ,
{ MT_BLINK , " Moonbender " , " GENERAL " , 4 , 135 , AI_BAT , 0 , 9 , 27 , 16 , 3 , 0 , 0 , 0 } ,
{ MT_BLINK , " Wrathraven " , " GENERAL " , 5 , 135 , AI_BAT , 2 , 9 , 22 , 16 , 3 , 0 , 0 , 0 } ,
{ MT_YSCAV , " Spineeater " , " GENERAL " , 4 , 180 , AI_SCAV , 1 , 18 , 25 , 96 , 3 , 0 , 0 , 0 } ,
{ MT_RSKELBW , " Blackash the Burning " , " BASHTB " , 4 , 120 , AI_GOATBOW , 0 , 6 , 16 , 24 , 3 , 0 , 0 , 0 } ,
{ MT_BFALLSD , " Shadowcrow " , " GENERAL " , 5 , 270 , AI_SNEAK , 2 , 12 , 25 , 0 , 3 , 0 , 0 , 0 } ,
{ MT_LRDSAYTR , " Blightstone the Weak " , " BHKA " , 4 , 360 , AI_SKELSD , 0 , 4 , 12 , 12 , 7 , 70 , 0 , 0 } ,
{ MT_FAT , " Bilefroth the Pit Master " , " BFTP " , 6 , 210 , AI_BAT , 1 , 16 , 23 , 28 , 3 , 0 , 0 , 0 } ,
{ MT_NGOATBW , " Bloodskin Darkbow " , " BSDB " , 5 , 207 , AI_GOATBOW , 0 , 3 , 16 , 6 , 11 , 55 , 0 , 0 } ,
{ MT_GLOOM , " Foulwing " , " DB " , 5 , 246 , AI_RHINO , 3 , 12 , 28 , 2 , 3 , 0 , 0 , 0 } ,
{ MT_XSKELSD , " Shadowdrinker " , " SHDR " , 5 , 300 , AI_SNEAK , 1 , 18 , 26 , 78 , 8 , 45 , 0 , 0 } ,
{ MT_UNSEEN , " Hazeshifter " , " BHKA " , 5 , 285 , AI_SNEAK , 3 , 18 , 30 , 96 , 3 , 0 , 0 , 0 } ,
{ MT_NACID , " Deathspit " , " BFDS " , 6 , 303 , AI_ACIDUNIQ , 0 , 12 , 32 , 6 , 3 , 0 , 0 , 0 } ,
{ MT_RGOATMC , " Bloodgutter " , " BGBL " , 6 , 315 , AI_BAT , 1 , 24 , 34 , 16 , 3 , 0 , 0 , 0 } ,
{ MT_BGOATMC , " Deathshade Fleshmaul " , " DSFM " , 6 , 276 , AI_RHINO , 0 , 12 , 24 , 10 , 8 , 65 , 0 , 0 } ,
{ MT_WYRM , " Warmaggot the Mad " , " GENERAL " , 6 , 246 , AI_BAT , 3 , 15 , 30 , 4 , 3 , 0 , 0 , 0 } ,
{ MT_STORM , " Glasskull the Jagged " , " BHKA " , 7 , 354 , AI_STORM , 0 , 18 , 30 , 88 , 3 , 0 , 0 , 0 } ,
{ MT_RGOATBW , " Blightfire " , " BLF " , 7 , 321 , AI_SUCC , 2 , 13 , 21 , 16 , 3 , 0 , 0 , 0 } ,
{ MT_GARGOYLE , " Nightwing the Cold " , " GENERAL " , 7 , 342 , AI_BAT , 1 , 18 , 26 , 76 , 3 , 0 , 0 , 0 } ,
{ MT_GGOATBW , " Gorestone " , " GENERAL " , 7 , 303 , AI_GOATBOW , 1 , 15 , 28 , 68 , 7 , 70 , 0 , 0 } ,
{ MT_BMAGMA , " Bronzefist Firestone " , " GENERAL " , 8 , 360 , AI_MAGMA , 0 , 30 , 36 , 10 , 3 , 0 , 0 , 0 } ,
{ MT_INCIN , " Wrathfire the Doomed " , " WFTD " , 8 , 270 , AI_SKELSD , 2 , 20 , 30 , 14 , 3 , 0 , 0 , 0 } ,
{ MT_NMAGMA , " Firewound the Grim " , " BHKA " , 8 , 303 , AI_MAGMA , 0 , 18 , 22 , 10 , 3 , 0 , 0 , 0 } ,
{ MT_MUDMAN , " Baron Sludge " , " BSM " , 8 , 315 , AI_SNEAK , 3 , 25 , 34 , 78 , 11 , 75 , 0 , 0 } ,
{ MT_GGOATMC , " Blighthorn Steelmace " , " BHSM " , 7 , 250 , AI_RHINO , 0 , 20 , 28 , 4 , 11 , 45 , 0 , 0 } ,
{ MT_RACID , " Chaoshowler " , " GENERAL " , 8 , 240 , AI_ACIDUNIQ , 0 , 12 , 20 , 0 , 3 , 0 , 0 , 0 } ,
{ MT_REDDTH , " Doomgrin the Rotting " , " GENERAL " , 8 , 405 , AI_STORM , 3 , 25 , 50 , 78 , 3 , 0 , 0 , 0 } ,
{ MT_FLAMLRD , " Madburner " , " GENERAL " , 9 , 270 , AI_STORM , 0 , 20 , 40 , 56 , 3 , 0 , 0 , 0 } ,
{ MT_LTCHDMN , " Bonesaw the Litch " , " GENERAL " , 9 , 495 , AI_STORM , 2 , 30 , 55 , 78 , 3 , 0 , 0 , 0 } ,
{ MT_MUDRUN , " Breakspine " , " GENERAL " , 9 , 351 , AI_RHINO , 0 , 25 , 34 , 2 , 3 , 0 , 0 , 0 } ,
{ MT_REDDTH , " Devilskull Sharpbone " , " GENERAL " , 9 , 444 , AI_STORM , 1 , 25 , 40 , 16 , 3 , 0 , 0 , 0 } ,
{ MT_STORM , " Brokenstorm " , " GENERAL " , 9 , 411 , AI_STORM , 2 , 25 , 36 , 32 , 3 , 0 , 0 , 0 } ,
{ MT_RSTORM , " Stormbane " , " GENERAL " , 9 , 555 , AI_STORM , 3 , 30 , 30 , 32 , 3 , 0 , 0 , 0 } ,
{ MT_TOAD , " Oozedrool " , " GENERAL " , 9 , 483 , AI_FAT , 3 , 25 , 30 , 4 , 3 , 0 , 0 , 0 } ,
{ MT_BLOODCLW , " Goldblight of the Flame " , " GENERAL " , 10 , 405 , AI_GARG , 0 , 15 , 35 , 24 , 11 , 80 , 0 , 0 } ,
{ MT_OBLORD , " Blackstorm " , " GENERAL " , 10 , 525 , AI_RHINO , 3 , 20 , 40 , 40 , 11 , 90 , 0 , 0 } ,
{ MT_RACID , " Plaguewrath " , " GENERAL " , 10 , 450 , AI_ACIDUNIQ , 2 , 20 , 30 , 74 , 3 , 0 , 0 , 0 } ,
{ MT_RSTORM , " The Flayer " , " GENERAL " , 10 , 501 , AI_STORM , 1 , 20 , 35 , 99 , 3 , 0 , 0 , 0 } ,
{ MT_FROSTC , " Bluehorn " , " GENERAL " , 11 , 477 , AI_RHINO , 1 , 25 , 30 , 10 , 11 , 90 , 0 , 0 } ,
{ MT_HELLBURN , " Warpfire Hellspawn " , " GENERAL " , 11 , 525 , AI_FIREMAN , 3 , 10 , 40 , 17 , 3 , 0 , 0 , 0 } ,
{ MT_NSNAKE , " Fangspeir " , " GENERAL " , 11 , 444 , AI_SKELSD , 1 , 15 , 32 , 80 , 3 , 0 , 0 , 0 } ,
{ MT_UDEDBLRG , " Festerskull " , " GENERAL " , 11 , 600 , AI_STORM , 2 , 15 , 30 , 72 , 3 , 0 , 0 , 0 } ,
{ MT_NBLACK , " Lionskull the Bent " , " GENERAL " , 12 , 525 , AI_SKELSD , 2 , 25 , 25 , 120 , 3 , 0 , 0 , 0 } ,
{ MT_COUNSLR , " Blacktongue " , " GENERAL " , 12 , 360 , AI_COUNSLR , 3 , 15 , 30 , 66 , 3 , 0 , 0 , 0 } ,
{ MT_DEATHW , " Viletouch " , " GENERAL " , 12 , 525 , AI_GARG , 3 , 20 , 40 , 96 , 3 , 0 , 0 , 0 } ,
{ MT_RSNAKE , " Viperflame " , " GENERAL " , 12 , 570 , AI_SKELSD , 1 , 25 , 35 , 20 , 3 , 0 , 0 , 0 } ,
{ MT_BSNAKE , " Fangskin " , " BHKA " , 14 , 681 , AI_SKELSD , 2 , 15 , 50 , 12 , 3 , 0 , 0 , 0 } ,
{ MT_SUCCUBUS , " Witchfire the Unholy " , " GENERAL " , 12 , 444 , AI_SUCC , 3 , 10 , 20 , 28 , 3 , 0 , 0 , 0 } ,
{ MT_BALROG , " Blackskull " , " BHKA " , 13 , 750 , AI_SKELSD , 3 , 25 , 40 , 12 , 3 , 0 , 0 , 0 } ,
{ MT_UNRAV , " Soulslash " , " GENERAL " , 12 , 450 , AI_SKELSD , 0 , 25 , 25 , 72 , 3 , 0 , 0 , 0 } ,
{ MT_VTEXLRD , " Windspawn " , " GENERAL " , 12 , 711 , AI_SKELSD , 1 , 35 , 40 , 24 , 3 , 0 , 0 , 0 } ,
{ MT_GSNAKE , " Lord of the Pit " , " GENERAL " , 13 , 762 , AI_SKELSD , 2 , 25 , 42 , 66 , 3 , 0 , 0 , 0 } ,
{ MT_RTBLACK , " Rustweaver " , " GENERAL " , 13 , 400 , AI_SKELSD , 3 , 1 , 60 , 120 , 0 , 0 , 0 , 0 } ,
{ MT_HOLOWONE , " Howlingire the Shade " , " GENERAL " , 13 , 450 , AI_SKELSD , 2 , 40 , 75 , 6 , 3 , 0 , 0 , 0 } ,
{ MT_MAEL , " Doomcloud " , " GENERAL " , 13 , 612 , AI_STORM , 1 , 1 , 60 , 34 , 0 , 0 , 0 , 0 } ,
{ MT_PAINMSTR , " Bloodmoon Soulfire " , " GENERAL " , 13 , 684 , AI_SKELSD , 1 , 15 , 40 , 14 , 3 , 0 , 0 , 0 } ,
{ MT_SNOWWICH , " Witchmoon " , " GENERAL " , 13 , 310 , AI_SUCC , 3 , 30 , 40 , 4 , 0 , 0 , 0 , 0 } ,
{ MT_VTEXLRD , " Gorefeast " , " GENERAL " , 13 , 771 , AI_SKELSD , 3 , 20 , 55 , 66 , 0 , 0 , 0 , 0 } ,
{ MT_RTBLACK , " Graywar the Slayer " , " GENERAL " , 14 , 672 , AI_SKELSD , 1 , 30 , 50 , 68 , 0 , 0 , 0 , 0 } ,
{ MT_MAGISTR , " Dreadjudge " , " GENERAL " , 14 , 540 , AI_COUNSLR , 1 , 30 , 40 , 14 , 3 , 0 , 0 , 0 } ,
{ MT_HLSPWN , " Stareye the Witch " , " GENERAL " , 14 , 726 , AI_SUCC , 2 , 30 , 50 , 16 , 0 , 0 , 0 , 0 } ,
{ MT_BTBLACK , " Steelskull the Hunter " , " GENERAL " , 14 , 831 , AI_SKELSD , 3 , 40 , 50 , 68 , 0 , 0 , 0 , 0 } ,
{ MT_RBLACK , " Sir Gorash " , " GENERAL " , 16 , 1050 , AI_SKELSD , 1 , 20 , 60 , 64 , 0 , 0 , 0 , 0 } ,
{ MT_CABALIST , " The Vizier " , " GENERAL " , 15 , 850 , AI_COUNSLR , 2 , 25 , 40 , 16 , 3 , 0 , 0 , 0 } ,
{ MT_REALWEAV , " Zamphir " , " GENERAL " , 15 , 891 , AI_SKELSD , 2 , 30 , 50 , 78 , 3 , 0 , 0 , 0 } ,
{ MT_HLSPWN , " Bloodlust " , " GENERAL " , 15 , 825 , AI_SUCC , 1 , 20 , 55 , 104 , 0 , 0 , 0 , 0 } ,
{ MT_HLSPWN , " Webwidow " , " GENERAL " , 16 , 774 , AI_SUCC , 1 , 20 , 50 , 88 , 0 , 0 , 0 , 0 } ,
{ MT_SOLBRNR , " Fleshdancer " , " GENERAL " , 16 , 999 , AI_SUCC , 3 , 30 , 50 , 74 , 0 , 0 , 0 , 0 } ,
{ MT_OBLORD , " Grimspike " , " GENERAL " , 19 , 534 , AI_SNEAK , 1 , 25 , 40 , 74 , 3 , 0 , 0 , 0 } ,
{ MT_STORML , " Doomlock " , " GENERAL " , 28 , 534 , AI_SNEAK , 1 , 35 , 55 , 78 , 3 , 0 , 0 , 0 } ,
{ - 1 , NULL , NULL , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }
} ;
int MWVel [ 24 ] [ 3 ] =
{
{ 256 , 512 , 1024 } ,
{ 128 , 256 , 512 } ,
{ 85 , 170 , 341 } ,
{ 64 , 128 , 256 } ,
{ 51 , 102 , 204 } ,
{ 42 , 85 , 170 } ,
{ 36 , 73 , 146 } ,
{ 32 , 64 , 128 } ,
{ 28 , 56 , 113 } ,
{ 26 , 51 , 102 } ,
{ 23 , 46 , 93 } ,
{ 21 , 42 , 85 } ,
{ 19 , 39 , 78 } ,
{ 18 , 36 , 73 } ,
{ 17 , 34 , 68 } ,
{ 16 , 32 , 64 } ,
{ 15 , 30 , 60 } ,
{ 14 , 28 , 57 } ,
{ 13 , 26 , 54 } ,
{ 12 , 25 , 51 } ,
{ 12 , 24 , 48 } ,
{ 11 , 23 , 46 } ,
{ 11 , 22 , 44 } ,
{ 10 , 21 , 42 }
} ;
char animletter [ 7 ] = " nwahds " ;
int left [ 8 ] = { 7 , 0 , 1 , 2 , 3 , 4 , 5 , 6 } ;
int right [ 8 ] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 0 } ;
int opposite [ 8 ] = { 4 , 5 , 6 , 7 , 0 , 1 , 2 , 3 } ;
int offset_x [ 8 ] = { 1 , 0 , - 1 , - 1 , - 1 , 0 , 1 , 1 } ;
int offset_y [ 8 ] = { 1 , 1 , 1 , 0 , - 1 , - 1 , - 1 , 0 } ;
/* unused */
int rnd5 [ 4 ] = { 5 , 10 , 15 , 20 } ;
int rnd10 [ 4 ] = { 10 , 15 , 20 , 30 } ;
int rnd20 [ 4 ] = { 20 , 30 , 40 , 50 } ;
int rnd60 [ 4 ] = { 60 , 70 , 80 , 90 } ;
//
void ( __fastcall * AiProc [ ] ) ( int i ) =
{
& MAI_Zombie ,
& MAI_Fat ,
& MAI_SkelSd ,
& MAI_SkelBow ,
& MAI_Scav ,
& MAI_Rhino ,
& MAI_GoatMc ,
& MAI_GoatBow ,
& MAI_Fallen ,
& MAI_Magma ,
& MAI_SkelKing ,
& MAI_Bat ,
& MAI_Garg ,
& MAI_Cleaver ,
& MAI_Succ ,
& MAI_Sneak ,
& MAI_Storm ,
& MAI_Fireman ,
& MAI_Garbud ,
& MAI_Acid ,
& MAI_AcidUniq ,
& MAI_Golum ,
& MAI_Zhar ,
& MAI_SnotSpil ,
& MAI_Snake ,
& MAI_Counselor ,
& MAI_Mega ,
& MAI_Diablo ,
& MAI_Lazurus ,
& MAI_Lazhelp ,
& MAI_Lachdanan ,
& MAI_Warlord
} ;
//----- (00430FE4) --------------------------------------------------------
struct monster_cpp_init
{
monster_cpp_init ( )
{
monster_cpp_init_value = monster_inf ;
}
} _monster_cpp_init ;
// 47F130: using guessed type int monster_inf;
// 64CCE4: using guessed type int monster_cpp_init_value;
//----- (00430FEF) --------------------------------------------------------
void __fastcall InitMonsterTRN ( int monst , int special )
{
signed int i ; // ecx
char * v5 ; // eax
int v6 ; // ebp
unsigned char v7 ; // al
int v8 ; // edi
2018-06-10 23:10:21 +00:00
AnimStruct * v9 ; // ebx
2018-06-07 02:25:54 +00:00
signed int v10 ; // [esp+8h] [ebp-8h]
int v11 ; // [esp+Ch] [ebp-4h]
i = 256 ;
v5 = ( char * ) Monsters [ monst ] . trans_file ;
do
{
if ( * v5 = = - 1 )
* v5 = 0 ;
+ + v5 ;
- - i ;
}
while ( i ) ;
v6 = 0 ;
v11 = ( special ! = 0 ) + 5 ;
if ( v11 > 0 )
{
do
{
if ( v6 ! = 1 | | ( v7 = Monsters [ monst ] . mtype , v7 < MT_COUNSLR ) | | v7 > MT_ADVOCATE )
{
v10 = 8 ;
v8 = 44 * v6 + monst * 328 ;
2018-06-10 23:10:21 +00:00
v9 = ( AnimStruct * ) ( ( char * ) Monsters [ 0 ] . Anims + v8 + 4 ) ;
2018-06-07 02:25:54 +00:00
do
{
Cl2ApplyTrans (
2018-06-10 23:10:21 +00:00
( char * ) v9 - > CMem ,
2018-06-07 02:25:54 +00:00
( char * ) Monsters [ monst ] . trans_file ,
* ( int * ) ( ( char * ) & Monsters [ 0 ] . Anims [ 0 ] . Rate + v8 ) ) ;
2018-06-10 23:10:21 +00:00
v9 = ( AnimStruct * ) ( ( char * ) v9 + 4 ) ;
2018-06-07 02:25:54 +00:00
- - v10 ;
}
while ( v10 ) ;
}
+ + v6 ;
}
while ( v6 < v11 ) ;
}
}
//----- (0043107B) --------------------------------------------------------
void __cdecl InitLevelMonsters ( )
{
int i ; // eax
nummtypes = 0 ;
monstimgtot = 0 ;
MissileFileFlag = 0 ;
for ( i = 0 ; i < 16 ; i + + )
Monsters [ i ] . mPlaceFlags = 0 ;
ClrAllMonsters ( ) ;
nummonsters = 0 ;
totalmonsters = 200 ;
for ( i = 0 ; i < 200 ; i + + )
monstactive [ i ] = i ;
uniquetrans = 0 ;
}
// 64CCE0: using guessed type int MissileFileFlag;
// 658550: using guessed type int totalmonsters;
// 6599D9: using guessed type int END_Monsters_17;
// 659AE8: using guessed type int monstimgtot;
//----- (004310CF) --------------------------------------------------------
int __fastcall AddMonsterType ( int type , int placeflag )
{
bool done ; // eax
int i ; // esi
done = 0 ;
for ( i = 0 ; i < nummtypes ; i + + )
{
if ( done )
break ;
done = type = = Monsters [ i ] . mtype ;
}
i - - ;
if ( ! done )
{
i = nummtypes + + ;
Monsters [ i ] . mtype = type ;
monstimgtot + = monsterdata [ type ] . mType ;
InitMonsterGFX ( i ) ;
InitMonsterSND ( i ) ;
}
Monsters [ i ] . mPlaceFlags | = placeflag ;
return i ;
}
// 659AE8: using guessed type int monstimgtot;
//----- (0043114F) --------------------------------------------------------
void __cdecl GetLevelMTypes ( ) /* note-decompile this function again and check */
{
//int v0; // eax
//int v1; // eax
//int v2; // eax
//int v3; // eax
//int v4; // eax
//int v5; // eax
char * v6 ; // esi
int v7 ; // edi
int v10 ; // eax
int v11 ; // esi
int v12 ; // edi
char * v13 ; // ecx
int i ; // esi
int v15 ; // ecx
bool v16 ; // zf
int v17 ; // edx
int * v18 ; // eax
int v19 ; // esi
int * v20 ; // esi
int v21 ; // eax
//int v22; // [esp+8h] [ebp-328h]
int typelist [ 89 ] ; // [esp+Ch] [ebp-324h]
int skeltypes [ 111 ] ; // [esp+170h] [ebp-1C0h]
int max ; // [esp+32Ch] [ebp-4h]
AddMonsterType ( MT_GOLEM , 2 ) ;
if ( currlevel = = 16 )
{
AddMonsterType ( MT_ADVOCATE , 1 ) ;
AddMonsterType ( MT_RBLACK , 1 ) ;
AddMonsterType ( MT_DIABLO , 2 ) ;
}
else if ( setlevel )
{
if ( setlvlnum = = SL_SKELKING )
AddMonsterType ( MT_SKING , 4 ) ;
}
else
{
if ( QuestStatus ( 6 ) )
AddMonsterType ( MT_CLEAVER , 2 ) ;
if ( QuestStatus ( 2 ) )
AddMonsterType ( ( char ) UniqMonst [ 0 ] . mtype , 4 ) ;
if ( QuestStatus ( 3 ) )
AddMonsterType ( ( char ) UniqMonst [ 2 ] . mtype , 4 ) ;
if ( QuestStatus ( 7 ) )
AddMonsterType ( ( char ) UniqMonst [ 3 ] . mtype , 4 ) ;
if ( QuestStatus ( 4 ) )
AddMonsterType ( ( char ) UniqMonst [ 7 ] . mtype , 4 ) ;
if ( QuestStatus ( 11 ) )
AddMonsterType ( ( char ) UniqMonst [ 8 ] . mtype , 4 ) ;
if ( gbMaxPlayers ! = 1 & & currlevel = = quests [ 12 ] . _qlevel )
{
AddMonsterType ( MT_SKING , 4 ) ;
max = 0 ;
v6 = & monsterdata [ 8 ] . mMaxDLvl ;
v7 = 8 ;
do
{
if ( IsSkel ( v7 ) )
{
if ( currlevel > = 15 * ( char ) * ( v6 - 1 ) / 30 + 1
& & currlevel < = 15 * ( char ) * v6 / 30 + 1
& & MonstAvailTbl [ v7 ] & 3 )
{
skeltypes [ max + + ] = v7 ;
}
}
v6 + = 128 ;
+ + v7 ;
}
while ( ( signed int ) v6 < = ( signed int ) & monsterdata [ 27 ] . mMaxDLvl ) ;
v10 = random ( 88 , max ) ;
AddMonsterType ( skeltypes [ v10 ] , 1 ) ;
}
v11 = currlevel ;
v12 = 0 ;
v13 = & monsterdata [ 0 ] . mMaxDLvl ;
max = 0 ;
do
{
if ( v11 > = 15 * ( char ) * ( v13 - 1 ) / 30 + 1 & & v11 < = 15 * ( char ) * v13 / 30 + 1 & & MonstAvailTbl [ max ] & 3 )
typelist [ v12 + + ] = max ;
+ + max ;
v13 + = 128 ;
}
while ( ( signed int ) v13 < ( signed int ) & monsterdata [ 111 ] . mMaxDLvl ) ;
if ( monstdebug )
{
for ( i = 0 ; i < debugmonsttypes ; i + + )
AddMonsterType ( DebugMonsters [ i ] , 1 ) ;
}
else
{
while ( v12 > 0 )
{
if ( nummtypes > = 16 | | monstimgtot > = 4000 )
break ;
v15 = 0 ;
v16 = v12 = = 0 ;
if ( v12 > 0 )
{
v17 = 4000 - monstimgtot ;
do
{
v18 = & typelist [ v15 ] ;
if ( monsterdata [ LOBYTE ( * v18 ) ] . mType < = v17 )
{
+ + v15 ;
}
else
{
v19 = typelist [ v12 - - - 1 ] ; //v19 = *(&v22 + v12--); /* fix and check */
* v18 = v19 ;
}
}
while ( v15 < v12 ) ;
v16 = v12 = = 0 ;
}
if ( ! v16 )
{
v20 = & typelist [ random ( 88 , v12 ) ] ;
AddMonsterType ( LOBYTE ( * v20 ) , 1 ) ;
v21 = typelist [ v12 - - - 1 ] ; // v21 = *(&v22 + v12--);
* v20 = v21 ;
}
}
}
}
}
// 525730: using guessed type int monstdebug;
// 52573C: using guessed type int debugmonsttypes;
// 5CCB10: using guessed type char setlvlnum;
// 5CF31D: using guessed type char setlevel;
// 659AE8: using guessed type int monstimgtot;
// 679660: using guessed type char gbMaxPlayers;
// 43114F: using guessed type int var_1C0[111];
// 43114F: using guessed type int var_324[89];
//----- (004313F9) --------------------------------------------------------
void __fastcall InitMonsterGFX ( int monst )
{
int v1 ; // esi
int v2 ; // ebx
int v3 ; // ebx
int * v4 ; // edi
int * v5 ; // eax
char v6 ; // cl
unsigned char * v7 ; // eax
char v8 ; // cl
int * v9 ; // ecx
int v10 ; // edx
int v11 ; // ecx
int v12 ; // ecx
bool v13 ; // zf
int v14 ; // ecx
void * * v15 ; // esi
unsigned char * v16 ; // eax
int v17 ; // edx
int v18 ; // ecx
void * v19 ; // ecx
//int v20; // ecx
//int v21; // ecx
//int v22; // ecx
//int v23; // ecx
//int v24; // ecx
//int v25; // ecx
char strBuff [ 256 ] ; // [esp+Ch] [ebp-114h]
int mon_id ; // [esp+10Ch] [ebp-14h]
int * v28 ; // [esp+110h] [ebp-10h]
int v29 ; // [esp+114h] [ebp-Ch]
int * v30 ; // [esp+118h] [ebp-8h]
int v31 ; // [esp+11Ch] [ebp-4h]
v29 = 0 ;
mon_id = monst ;
v1 = monst ;
v2 = ( unsigned char ) Monsters [ monst ] . mtype ;
v31 = v2 ;
v3 = v2 < < 7 ;
2018-06-10 23:10:21 +00:00
v4 = Monsters [ monst ] . Anims [ 0 ] . Frames ;
2018-06-07 02:25:54 +00:00
v5 = ( int * ) ( ( char * ) monsterdata [ 0 ] . Frames + v3 ) ;
2018-06-10 23:10:21 +00:00
v30 = Monsters [ monst ] . Anims [ 0 ] . Frames ;
2018-06-07 02:25:54 +00:00
v28 = ( int * ) ( ( char * ) monsterdata [ 0 ] . Frames + v3 ) ;
do
{
v6 = animletter [ v29 ] ;
if ( ( v6 ! = ' s ' | | * ( int * ) ( ( char * ) & monsterdata [ 0 ] . has_special + v3 ) ) & & * v5 > 0 )
{
sprintf ( strBuff , * ( const char * * ) ( ( char * ) & monsterdata [ 0 ] . GraphicType + v3 ) , v6 ) ;
v7 = LoadFileInMem ( strBuff , 0 ) ;
* ( v4 - 1 ) = ( int ) v7 ;
if ( Monsters [ v1 ] . mtype ! = MT_GOLEM | | ( v8 = animletter [ v29 ] , v8 ! = ' s ' ) & & v8 ! = ' d ' )
{
v30 = 0 ;
v9 = v4 ;
do
{
v10 = ( int ) & v7 [ * ( _DWORD * ) & v7 [ 4 * ( _DWORD ) v30 ] ] ;
v30 = ( int * ) ( ( char * ) v30 + 1 ) ;
* v9 = v10 ;
+ + v9 ;
}
while ( ( signed int ) v30 < 8 ) ;
}
else
{
2018-06-11 02:02:50 +00:00
memset32 ( v4 , ( int ) v7 , 8u ) ;
2018-06-07 02:25:54 +00:00
v4 = v30 ;
}
v5 = v28 ;
}
v11 = * v5 ;
+ + v29 ;
v4 [ 8 ] = v11 ;
v4 [ 9 ] = v5 [ 6 ] ;
+ + v5 ;
v4 + = 11 ;
v28 = v5 ;
v30 = v4 ;
}
while ( v29 < 6 ) ;
Monsters [ v1 ] . MData = ( MonsterData * ) ( ( char * ) monsterdata + v3 ) ;
v12 = * ( int * ) ( ( char * ) & monsterdata [ 0 ] . flags + v3 ) ;
Monsters [ v1 ] . flags_1 = v12 ;
Monsters [ v1 ] . flags_2 = ( v12 - 64 ) > > 1 ;
Monsters [ v1 ] . mMinHP = * ( ( _BYTE * ) & monsterdata [ 0 ] . mMinHP + v3 ) ;
v13 = * ( int * ) ( ( char * ) & monsterdata [ 0 ] . has_trans + v3 ) = = 0 ;
Monsters [ v1 ] . mMaxHP = * ( ( _BYTE * ) & monsterdata [ 0 ] . mMaxHP + v3 ) ;
v14 = * ( int * ) ( ( char * ) & monsterdata [ 0 ] . has_special + v3 ) ;
Monsters [ v1 ] . has_special = v14 ;
Monsters [ v1 ] . mAFNum = * ( & monsterdata [ 0 ] . mAFNum + v3 ) ;
if ( ! v13 )
{
v15 = & Monsters [ v1 ] . trans_file ;
v16 = LoadFileInMem ( * ( char * * ) ( ( char * ) & monsterdata [ 0 ] . TransFile + v3 ) , 0 ) ;
v17 = * ( int * ) ( ( char * ) & monsterdata [ 0 ] . has_special + v3 ) ;
v18 = mon_id ;
* v15 = v16 ;
InitMonsterTRN ( v18 , v17 ) ;
v19 = * v15 ;
* v15 = 0 ;
mem_free_dbg ( v19 ) ;
}
if ( v31 > = MT_NMAGMA & & v31 < = MT_WMAGMA & & ! ( MissileFileFlag & 1 ) )
{
MissileFileFlag | = 1u ;
LoadMissileGFX ( MFILE_MAGBALL ) ;
}
if ( v31 > = MT_STORM & & v31 < = MT_MAEL & & ! ( MissileFileFlag & 2 ) )
{
MissileFileFlag | = 2u ;
LoadMissileGFX ( MFILE_THINLGHT ) ;
}
if ( v31 = = MT_SUCCUBUS )
{
if ( MissileFileFlag & 4 )
return ;
MissileFileFlag | = 4u ;
LoadMissileGFX ( MFILE_FLARE ) ;
LoadMissileGFX ( MFILE_FLAREEXP ) ;
}
if ( v31 = = MT_SNOWWICH )
{
if ( MissileFileFlag & 0x20 )
return ;
MissileFileFlag | = 0x20u ;
LoadMissileGFX ( MFILE_SCUBMISB ) ;
LoadMissileGFX ( MFILE_SCBSEXPB ) ;
}
if ( v31 = = MT_HLSPWN )
{
if ( MissileFileFlag & 0x40 )
return ;
MissileFileFlag | = 0x40u ;
LoadMissileGFX ( MFILE_SCUBMISD ) ;
LoadMissileGFX ( MFILE_SCBSEXPD ) ;
}
if ( v31 = = MT_SOLBRNR )
{
if ( ( MissileFileFlag & 0x80u ) ! = 0 )
return ;
MissileFileFlag | = 0x80 ;
LoadMissileGFX ( MFILE_SCUBMISC ) ;
LoadMissileGFX ( MFILE_SCBSEXPC ) ;
}
if ( v31 > = MT_INCIN & & v31 < = MT_HELLBURN & & ! ( MissileFileFlag & 8 ) )
{
MissileFileFlag | = 8u ;
LoadMissileGFX ( MFILE_KRULL ) ;
}
if ( v31 > = MT_NACID & & v31 < = MT_XACID & & ! ( MissileFileFlag & 0x10 ) )
{
MissileFileFlag | = 0x10u ;
LoadMissileGFX ( MFILE_ACIDBF ) ;
LoadMissileGFX ( MFILE_ACIDSPLA ) ;
LoadMissileGFX ( MFILE_ACIDPUD ) ;
}
if ( v31 = = MT_DIABLO )
{
LoadMissileGFX ( MFILE_FIREPLAR ) ;
}
}
// 64CCE0: using guessed type int MissileFileFlag;
//----- (004316AE) --------------------------------------------------------
void __fastcall ClearMVars ( int i )
{
monster [ i ] . _mVar1 = 0 ;
monster [ i ] . _mVar2 = 0 ;
monster [ i ] . _mVar3 = 0 ;
monster [ i ] . _mVar4 = 0 ;
monster [ i ] . _mVar5 = 0 ;
monster [ i ] . _mVar6 = 0 ;
monster [ i ] . _mVar7 = 0 ;
monster [ i ] . _mVar8 = 0 ;
}
//----- (004316E7) --------------------------------------------------------
void __fastcall InitMonster ( int i , int rd , int mtype , int x , int y )
{
int v5 ; // ebx
int v6 ; // esi
CMonster * monst ; // edi
MonsterData * v8 ; // eax
char * v9 ; // ecx
int v10 ; // eax
int v11 ; // eax
//int v12; // ecx
int v13 ; // eax
int v16 ; // eax
MonsterData * v17 ; // eax
int v18 ; // eax
MonsterData * v19 ; // eax
short v20 ; // cx
int v21 ; // edx
int v22 ; // edx
int v24 ; // ecx
int v25 ; // ecx
char v26 ; // dl
int v27 ; // ecx
char v28 ; // dl
v5 = rd ;
v6 = i ;
monster [ v6 ] . _mmode = MM_STAND ;
monst = & Monsters [ mtype ] ;
monster [ v6 ] . _mx = x ;
monster [ v6 ] . _mfutx = x ;
monster [ v6 ] . _moldx = x ;
v8 = monst - > MData ;
monster [ v6 ] . _mdir = rd ;
monster [ v6 ] . _my = y ;
monster [ v6 ] . _mfuty = y ;
monster [ v6 ] . _moldy = y ;
monster [ v6 ] . _mMTidx = mtype ;
v9 = v8 - > mName ;
monster [ v6 ] . mName = v9 ;
monster [ v6 ] . MType = monst ;
monster [ v6 ] . MData = v8 ;
2018-06-10 23:10:21 +00:00
monster [ v6 ] . _mAFNum = monst - > Anims [ 0 ] . Frames [ rd ] ;
2018-06-07 02:25:54 +00:00
v10 = monst - > Anims [ 0 ] . Delay ;
monster [ v6 ] . _mAnimDelay = v10 ;
monster [ v6 ] . _mAnimCnt = random ( 88 , v10 - 1 ) ;
v11 = monst - > Anims [ 0 ] . Rate ;
monster [ v6 ] . _mAnimLen = v11 ;
v13 = random ( 88 , v11 - 1 ) ;
monster [ v6 ] . _mAnimFrame = v13 + 1 ;
if ( monst - > mtype = = MT_DIABLO )
v16 = random ( 88 , 1 ) + 1666 ;
else
v16 = monst - > mMinHP + random ( 88 , monst - > mMaxHP - monst - > mMinHP + 1 ) ;
monster [ v6 ] . _mmaxhp = v16 < < 6 ;
if ( gbMaxPlayers = = 1 )
{
monster [ v6 ] . _mmaxhp > > = 1 ;
if ( monster [ v6 ] . _mmaxhp < 64 )
monster [ v6 ] . _mmaxhp = 64 ;
}
monster [ v6 ] . _mhitpoints = monster [ v6 ] . _mmaxhp ;
v17 = monst - > MData ;
monster [ v6 ] . _mAi = v17 - > mAi ;
monster [ v6 ] . _mint = v17 - > mInt ;
_LOBYTE ( monster [ v6 ] . _pathcount ) = 0 ;
monster [ v6 ] . _uniqtype = 0 ;
_LOBYTE ( monster [ v6 ] . _msquelch ) = 0 ;
_LOBYTE ( monster [ v6 ] . _mgoal ) = 1 ;
monster [ v6 ] . _mgoalvar1 = 0 ;
monster [ v6 ] . _mgoalvar2 = 0 ;
monster [ v6 ] . _mgoalvar3 = 0 ;
monster [ v6 ] . field_18 = 0 ;
monster [ v6 ] . _mDelFlag = 0 ;
monster [ v6 ] . _mRndSeed = GetRndSeed ( ) ;
v18 = GetRndSeed ( ) ;
monster [ v6 ] . mWhoHit = 0 ;
monster [ v6 ] . _mAISeed = v18 ;
v19 = monst - > MData ;
_LOBYTE ( monster [ v6 ] . mLevel ) = v19 - > mLevel ;
monster [ v6 ] . mExp = v19 - > mExp ;
monster [ v6 ] . mHit = v19 - > mHit ;
monster [ v6 ] . mMinDamage = v19 - > mMinDamage ;
monster [ v6 ] . mMaxDamage = v19 - > mMaxDamage ;
monster [ v6 ] . mHit2 = v19 - > mHit2 ;
monster [ v6 ] . mMinDamage2 = v19 - > mMinDamage2 ;
monster [ v6 ] . mMaxDamage2 = v19 - > mMaxDamage2 ;
monster [ v6 ] . mArmorClass = v19 - > mArmorClass ;
v20 = v19 - > mMagicRes ;
monster [ v6 ] . leader = 0 ;
monster [ v6 ] . leaderflag = 0 ;
_LOWORD ( monster [ v6 ] . mMagicRes ) = v20 ;
v21 = v19 - > mFlags ;
monster [ v6 ] . mtalkmsg = 0 ;
monster [ v6 ] . _mFlags = v21 ;
if ( monster [ v6 ] . _mAi = = AI_GARG )
{
2018-06-10 23:10:21 +00:00
v22 = monst - > Anims [ 5 ] . Frames [ v5 ] ;
2018-06-07 02:25:54 +00:00
monster [ v6 ] . _mFlags | = 4u ;
monster [ v6 ] . _mAFNum = v22 ;
monster [ v6 ] . _mAnimFrame = 1 ;
monster [ v6 ] . _mmode = MM_SATTACK ;
}
if ( gnDifficulty = = DIFF_NIGHTMARE )
{
v24 = monster [ v6 ] . _mmaxhp ;
_LOBYTE ( monster [ v6 ] . mLevel ) + = 15 ;
monster [ v6 ] . mHit + = 85 ;
monster [ v6 ] . mHit2 + = 85 ;
v25 = 3 * v24 + 64 ;
monster [ v6 ] . _mmaxhp = v25 ;
monster [ v6 ] . _mhitpoints = v25 ;
monster [ v6 ] . mExp = 2 * ( monster [ v6 ] . mExp + 1000 ) ;
monster [ v6 ] . mMinDamage = 2 * ( monster [ v6 ] . mMinDamage + 2 ) ;
monster [ v6 ] . mMaxDamage = 2 * ( monster [ v6 ] . mMaxDamage + 2 ) ;
monster [ v6 ] . mMinDamage2 = 2 * ( monster [ v6 ] . mMinDamage2 + 2 ) ;
_LOBYTE ( v25 ) = 2 * ( monster [ v6 ] . mMaxDamage2 + 2 ) ;
monster [ v6 ] . mArmorClass + = 50 ;
monster [ v6 ] . mMaxDamage2 = v25 ;
}
if ( gnDifficulty = = DIFF_HELL )
{
v26 = 4 * monster [ v6 ] . mMinDamage ;
v27 = 4 * monster [ v6 ] . _mmaxhp + 192 ;
_LOBYTE ( monster [ v6 ] . mLevel ) + = 30 ;
monster [ v6 ] . _mmaxhp = v27 ;
monster [ v6 ] . _mhitpoints = v27 ;
_LOWORD ( v27 ) = monster [ v6 ] . mExp ;
monster [ v6 ] . mHit + = 120 ;
monster [ v6 ] . mHit2 + = 120 ;
monster [ v6 ] . mExp = 4 * ( v27 + 1000 ) ;
monster [ v6 ] . mMinDamage = v26 + 6 ;
monster [ v6 ] . mMaxDamage = 4 * monster [ v6 ] . mMaxDamage + 6 ;
monster [ v6 ] . mMinDamage2 = 4 * monster [ v6 ] . mMinDamage2 + 6 ;
v28 = 4 * monster [ v6 ] . mMaxDamage2 + 6 ;
monster [ v6 ] . mArmorClass + = 80 ;
monster [ v6 ] . mMaxDamage2 = v28 ;
_LOWORD ( monster [ v6 ] . mMagicRes ) = v19 - > mMagicRes2 ;
}
}
// 679660: using guessed type char gbMaxPlayers;
//----- (00431A6B) --------------------------------------------------------
void __cdecl ClrAllMonsters ( )
{
int i ; // edi
int v6 ; // eax
for ( i = 0 ; i < 200 ; i + + )
{
ClearMVars ( i ) ;
monster [ i ] . mName = " Invalid Monster " ;
monster [ i ] . _mgoal = 0 ;
monster [ i ] . _mmode = 0 ;
monster [ i ] . _mVar1 = 0 ;
monster [ i ] . _mVar2 = 0 ;
monster [ i ] . _mx = 0 ;
monster [ i ] . _my = 0 ;
monster [ i ] . _mfutx = 0 ;
monster [ i ] . _mfuty = 0 ;
monster [ i ] . _moldx = 0 ;
monster [ i ] . _moldy = 0 ;
monster [ i ] . _mdir = random ( 89 , 8 ) ;
monster [ i ] . _mxvel = 0 ;
monster [ i ] . _myvel = 0 ;
monster [ i ] . _mAFNum = 0 ;
monster [ i ] . _mAnimDelay = 0 ;
monster [ i ] . _mAnimCnt = 0 ;
monster [ i ] . _mAnimLen = 0 ;
monster [ i ] . _mAnimFrame = 0 ;
monster [ i ] . _mFlags = 0 ;
monster [ i ] . _mDelFlag = 0 ;
v6 = random ( 89 , gbActivePlayers ) ;
monster [ i ] . _menemy = v6 ;
monster [ i ] . _menemyx = plr [ v6 ] . _px ;
monster [ i ] . _menemyy = plr [ v6 ] . _py ;
}
}
// 67862C: using guessed type char gbActivePlayers;
//----- (00431B10) --------------------------------------------------------
bool __fastcall MonstPlace ( int xp , int yp )
{
if ( xp < 0 | | xp > = 112
| | yp < 0 | | yp > = 112
| | dMonster [ xp ] [ yp ]
| | dPlayer [ xp ] [ yp ]
| | dFlags [ xp ] [ yp ] & 2
| | dFlags [ xp ] [ yp ] & 8 )
{
return 0 ;
}
else
{
return SolidLoc ( xp , yp ) = = 0 ;
}
}
//----- (00431B5D) --------------------------------------------------------
void __fastcall PlaceMonster ( int i , int mtype , int x , int y )
{
dMonster [ x ] [ y ] = i + 1 ;
InitMonster ( i , random ( 90 , 8 ) , mtype , x , y ) ;
}
//----- (00431B99) --------------------------------------------------------
void __fastcall PlaceUniqueMonst ( int uniqindex , int miniontype , int unpackfilesize )
{
MonsterStruct * v3 ; // esi
CMonster * v4 ; // ecx
int v5 ; // edx
int v6 ; // eax
int v7 ; // ecx
int v8 ; // edi
int v9 ; // eax
int v10 ; // ebx
int v11 ; // eax
int i ; // edx
int v13 ; // edx
BOOL v14 ; // edx
int ( * v15 ) [ 112 ] ; // ecx
int ( * v16 ) [ 112 ] ; // eax
int v17 ; // edi
char v18 ; // al
char * v19 ; // eax
int v20 ; // eax
bool v21 ; // zf
signed int v22 ; // eax
char v23 ; // cl
char v24 ; // al
int v25 ; // edx
int v26 ; // eax
int v27 ; // ecx
char v28 ; // al
char v29 ; // al
int v30 ; // ecx
int v31 ; // eax
int v32 ; // eax
int v33 ; // eax
int v34 ; // eax
char v35 ; // al
short v36 ; // cx
char v37 ; // al
int v38 ; // ecx
int v39 ; // eax
int v40 ; // edx
int v41 ; // eax
char filestr [ 64 ] ; // [esp+4h] [ebp-60h]
int v43 ; // [esp+44h] [ebp-20h]
CMonster * v44 ; // [esp+48h] [ebp-1Ch]
int v45 ; // [esp+4Ch] [ebp-18h]
int * v46 ; // [esp+50h] [ebp-14h]
int v47 ; // [esp+54h] [ebp-10h]
int v48 ; // [esp+58h] [ebp-Ch]
int mtype ; // [esp+5Ch] [ebp-8h]
int xp ; // [esp+60h] [ebp-4h]
v46 = 0 ;
v48 = uniqindex ;
v3 = & monster [ nummonsters ] ;
v4 = ( CMonster * ) & UniqMonst [ uniqindex ] ;
v43 = miniontype ;
v44 = v4 ;
if ( ( uniquetrans + 19 ) < < 8 < 6912 )
{
mtype = 0 ;
if ( nummtypes > 0 )
{
v5 = v4 - > mtype ;
v4 = Monsters ;
do
{
if ( ( unsigned char ) v4 - > mtype = = v5 )
break ;
+ + mtype ;
+ + v4 ;
}
while ( mtype < nummtypes ) ;
}
do
{
do
{
_LOBYTE ( v4 ) = 91 ;
v6 = random ( ( int ) v4 , 80 ) ;
_LOBYTE ( v7 ) = 91 ;
v8 = v6 + 16 ;
v9 = random ( v7 , 80 ) ;
v47 = 0 ;
v4 = ( CMonster * ) ( v8 - 3 ) ;
v10 = v9 + 16 ;
xp = v8 - 3 ;
if ( __OFSUB__ ( v8 - 3 , v8 + 3 ) ^ 1 )
{
v11 = v9 + 19 ;
do
{
for ( i = v10 - 3 ; ; i = v45 + 1 )
{
v45 = i ;
if ( i > = v11 )
break ;
if ( i > = 0 & & i < 112 & & xp > = 0 & & xp < 112 & & MonstPlace ( xp , i ) )
+ + v47 ;
v11 = v10 + 3 ;
}
+ + xp ;
v4 = ( CMonster * ) ( v8 + 3 ) ;
}
while ( xp < v8 + 3 ) ;
if ( v47 > = 9 )
break ;
}
v46 = ( int * ) ( ( char * ) v46 + 1 ) ;
}
while ( ( signed int ) v46 < 1000 ) ;
}
while ( ! MonstPlace ( v8 , v10 ) ) ;
v13 = v48 ;
if ( v48 = = 3 )
{
v8 = 2 * setpc_x + 24 ;
v10 = 2 * setpc_y + 28 ;
}
if ( v48 = = 8 )
{
v8 = 2 * setpc_x + 22 ;
v10 = 2 * setpc_y + 23 ;
}
if ( v48 = = 2 )
{
xp = 0 ;
v45 = 1 ;
if ( themeCount > 0 )
{
v46 = & themeLoc [ 0 ] . y ;
do
{
if ( xp = = zharlib & & v45 = = 1 )
{
v45 = 0 ;
v8 = 2 * * ( v46 - 1 ) + 20 ;
v10 = 2 * * v46 + 20 ;
}
+ + xp ;
v46 + = 5 ;
}
while ( xp < themeCount ) ;
}
v13 = v48 ;
}
if ( gbMaxPlayers = = 1 )
{
if ( v13 = = 4 )
{
v8 = 32 ;
v10 = 46 ;
}
if ( v13 = = 5 )
{
v8 = 40 ;
v10 = 45 ;
}
if ( v13 = = 6 )
{
v8 = 38 ;
v10 = 49 ;
}
if ( v13 = = 1 )
{
v8 = 35 ;
v10 = 47 ;
}
}
else
{
if ( v13 = = 4 )
{
v8 = 2 * setpc_x + 19 ;
v10 = 2 * setpc_y + 22 ;
}
if ( v13 = = 5 )
{
v8 = 2 * setpc_x + 21 ;
v10 = 2 * setpc_y + 19 ;
}
if ( v13 = = 6 )
{
v8 = 2 * setpc_x + 21 ;
v10 = 2 * setpc_y + 25 ;
}
}
if ( v13 = = 9 )
{
v14 = 0 ;
v10 = 0 ;
v15 = dPiece ;
do
{
if ( v14 )
break ;
v8 = 0 ;
v16 = v15 ;
do
{
if ( v14 )
break ;
v14 = ( * v16 ) [ 0 ] = = 367 ;
+ + v8 ;
+ + v16 ;
}
while ( v8 < 112 ) ;
v15 = ( int ( * ) [ 112 ] ) ( ( char * ) v15 + 4 ) ;
+ + v10 ;
}
while ( ( signed int ) v15 < ( signed int ) dPiece [ 1 ] ) ;
}
PlaceMonster ( nummonsters , mtype , v8 , v10 ) ;
v17 = ( int ) v44 ;
v3 - > _uniqtype = v48 + 1 ;
v18 = * ( _BYTE * ) ( v17 + 12 ) ;
if ( v18 )
_LOBYTE ( v3 - > mLevel ) = 2 * v18 ;
else
_LOBYTE ( v3 - > mLevel ) + = 5 ;
v19 = * ( char * * ) ( v17 + 4 ) ;
v3 - > mExp * = 2 ;
v3 - > mName = v19 ;
v20 = * ( unsigned short * ) ( v17 + 14 ) < < 6 ;
v21 = gbMaxPlayers = = 1 ;
v3 - > _mmaxhp = v20 ;
if ( v21 )
{
v22 = v20 > > 1 ;
v3 - > _mmaxhp = v22 ;
if ( v22 < 64 )
v3 - > _mmaxhp = 64 ;
}
v23 = * ( _BYTE * ) ( v17 + 19 ) ;
v3 - > _mhitpoints = v3 - > _mmaxhp ;
v3 - > _mAi = * ( _BYTE * ) ( v17 + 16 ) ;
v3 - > _mint = * ( _BYTE * ) ( v17 + 17 ) ;
v24 = * ( _BYTE * ) ( v17 + 18 ) ;
v25 = v3 - > _my ;
v3 - > mMinDamage = v24 ;
v3 - > mMinDamage2 = v24 ;
_LOWORD ( v3 - > mMagicRes ) = * ( _WORD * ) ( v17 + 20 ) ;
v26 = * ( _DWORD * ) ( v17 + 28 ) ;
v3 - > mMaxDamage = v23 ;
v3 - > mMaxDamage2 = v23 ;
v27 = v3 - > _mx ;
v3 - > mtalkmsg = v26 ;
v28 = AddLight ( v27 , v25 , 3 ) ;
v21 = gbMaxPlayers = = 1 ;
v3 - > mlid = v28 ;
if ( v21 )
goto LABEL_83 ;
v29 = v3 - > _mAi ;
if ( v29 = = AI_LAZHELP )
v3 - > mtalkmsg = 0 ;
if ( v29 ! = AI_LAZURUS | | quests [ 15 ] . _qvar1 < = 3u )
{
LABEL_83 :
if ( v3 - > mtalkmsg )
_LOBYTE ( v3 - > _mgoal ) = 6 ;
}
else
{
_LOBYTE ( v3 - > _mgoal ) = 1 ;
}
v30 = gnDifficulty ;
if ( gnDifficulty = = DIFF_NIGHTMARE )
{
v31 = v3 - > _mmaxhp ;
_LOBYTE ( v3 - > mLevel ) + = 15 ;
v32 = 3 * v31 + 64 ;
v3 - > _mmaxhp = v32 ;
v3 - > _mhitpoints = v32 ;
v3 - > mExp = 2 * ( v3 - > mExp + 1000 ) ;
v3 - > mMinDamage = 2 * ( v3 - > mMinDamage + 2 ) ;
v3 - > mMaxDamage = 2 * ( v3 - > mMaxDamage + 2 ) ;
v3 - > mMinDamage2 = 2 * ( v3 - > mMinDamage2 + 2 ) ;
v3 - > mMaxDamage2 = 2 * ( v3 - > mMaxDamage2 + 2 ) ;
}
if ( v30 = = DIFF_HELL )
{
v33 = v3 - > _mmaxhp ;
_LOBYTE ( v3 - > mLevel ) + = 30 ;
v34 = 4 * v33 + 192 ;
v3 - > _mmaxhp = v34 ;
v3 - > _mhitpoints = v34 ;
v3 - > mExp = 4 * ( v3 - > mExp + 1000 ) ;
v3 - > mMinDamage = 4 * v3 - > mMinDamage + 6 ;
v3 - > mMaxDamage = 4 * v3 - > mMaxDamage + 6 ;
v3 - > mMinDamage2 = 4 * v3 - > mMinDamage2 + 6 ;
v3 - > mMaxDamage2 = 4 * v3 - > mMaxDamage2 + 6 ;
}
sprintf ( filestr , " Monsters \\ Monsters \\ %s.TRN " , * ( _DWORD * ) ( v17 + 8 ) ) ;
LoadFileWithMem ( filestr , & pLightTbl [ 256 * ( uniquetrans + 19 ) ] ) ;
v35 = uniquetrans ;
v36 = * ( _WORD * ) ( v17 + 22 ) ;
+ + uniquetrans ;
v3 - > _uniqtrans = v35 ;
if ( v36 & 4 )
{
v37 = * ( _BYTE * ) ( v17 + 24 ) ;
v3 - > mHit = v37 ;
v3 - > mHit2 = v37 ;
}
if ( v36 & 8 )
v3 - > mArmorClass = * ( _BYTE * ) ( v17 + 24 ) ;
+ + nummonsters ;
if ( v36 & 1 )
PlaceGroup ( v43 , unpackfilesize , v36 , nummonsters - 1 ) ;
if ( v3 - > _mAi ! = AI_GARG )
{
v38 = ( int ) v3 - > MType ;
v39 = * ( _DWORD * ) ( v38 + 4 * v3 - > _mdir + 8 ) ;
v40 = v3 - > _mAnimLen - 1 ;
_LOBYTE ( v38 ) = 88 ;
v3 - > _mAFNum = v39 ;
v41 = random ( v38 , v40 ) ;
v3 - > _mFlags & = 0xFFFFFFFB ;
v3 - > _mmode = 0 ;
v3 - > _mAnimFrame = v41 + 1 ;
}
}
}
// 679660: using guessed type char gbMaxPlayers;
// 6AAA64: using guessed type int zharlib;
//----- (00432088) --------------------------------------------------------
void __cdecl PlaceQuestMonsters ( )
{
int skeltype ; // esi
CMonster * v2 ; // edi
unsigned char * setp ; // esi
if ( setlevel )
{
if ( setlvlnum = = SL_SKELKING )
PlaceUniqueMonst ( 1 , 0 , 0 ) ;
}
else
{
if ( QuestStatus ( 6 ) )
PlaceUniqueMonst ( 9 , 0 , 0 ) ;
if ( currlevel = = quests [ 12 ] . _qlevel & & gbMaxPlayers ! = 1 )
{
skeltype = 0 ;
if ( nummtypes > 0 )
{
v2 = Monsters ;
do
{
if ( IsSkel ( ( unsigned char ) v2 - > mtype ) )
break ;
+ + skeltype ;
+ + v2 ;
}
while ( skeltype < nummtypes ) ;
}
PlaceUniqueMonst ( 1 , skeltype , 30 ) ;
}
if ( QuestStatus ( 7 ) )
{
setp = LoadFileInMem ( " Levels \\ L1Data \\ Banner1.DUN " , 0 ) ;
SetMapMonsters ( ( char * ) setp , 2 * setpc_x , 2 * setpc_y ) ;
mem_free_dbg ( setp ) ;
}
if ( QuestStatus ( 9 ) )
{
setp = LoadFileInMem ( " Levels \\ L2Data \\ Blood2.DUN " , 0 ) ;
SetMapMonsters ( ( char * ) setp , 2 * setpc_x , 2 * setpc_y ) ;
mem_free_dbg ( setp ) ;
}
if ( QuestStatus ( 8 ) )
{
setp = LoadFileInMem ( " Levels \\ L2Data \\ Blind2.DUN " , 0 ) ;
SetMapMonsters ( ( char * ) setp , 2 * setpc_x , 2 * setpc_y ) ;
mem_free_dbg ( setp ) ;
}
if ( QuestStatus ( 10 ) )
{
setp = LoadFileInMem ( " Levels \\ L3Data \\ Anvil.DUN " , 0 ) ;
SetMapMonsters ( ( char * ) setp , 2 * setpc_x + 2 , 2 * setpc_y + 2 ) ;
mem_free_dbg ( setp ) ;
}
if ( QuestStatus ( 11 ) )
{
setp = LoadFileInMem ( " Levels \\ L4Data \\ Warlord.DUN " , 0 ) ;
SetMapMonsters ( ( char * ) setp , 2 * setpc_x , 2 * setpc_y ) ;
mem_free_dbg ( setp ) ;
AddMonsterType ( ( char ) UniqMonst [ 8 ] . mtype , 1 ) ;
}
if ( QuestStatus ( 4 ) )
AddMonsterType ( ( char ) UniqMonst [ 7 ] . mtype , 1 ) ;
if ( QuestStatus ( 3 ) & & zharlib = = - 1 )
quests [ 3 ] . _qactive = 0 ;
if ( currlevel = = quests [ 15 ] . _qlevel & & gbMaxPlayers ! = 1 )
{
AddMonsterType ( ( char ) UniqMonst [ 4 ] . mtype , 4 ) ;
AddMonsterType ( ( char ) UniqMonst [ 5 ] . mtype , 4 ) ;
PlaceUniqueMonst ( 4 , 0 , 0 ) ;
PlaceUniqueMonst ( 5 , 0 , 0 ) ;
PlaceUniqueMonst ( 6 , 0 , 0 ) ;
setp = LoadFileInMem ( " Levels \\ L4Data \\ Vile1.DUN " , 0 ) ;
SetMapMonsters ( ( char * ) setp , 2 * setpc_x , 2 * setpc_y ) ;
mem_free_dbg ( setp ) ;
}
}
}
// 5CCB10: using guessed type char setlvlnum;
// 5CF31D: using guessed type char setlevel;
// 679660: using guessed type char gbMaxPlayers;
// 6AAA64: using guessed type int zharlib;
//----- (004322FA) --------------------------------------------------------
void __fastcall PlaceGroup ( int mtype , int num , unsigned char leaderf , int leader )
{
int v4 ; // ecx
int * v5 ; // eax
int v6 ; // edx
int v7 ; // eax
int v8 ; // edi
int v9 ; // esi
int v10 ; // eax
int v11 ; // ecx
int v12 ; // eax
int v13 ; // ecx
int v14 ; // eax
//int v15; // ST04_4
int v16 ; // eax
//int v17; // ST04_4
int v18 ; // eax
int * v19 ; // edx
int v20 ; // ecx
int v21 ; // ebx
int v22 ; // ecx
int v23 ; // ecx
int mtypea ; // [esp+Ch] [ebp-24h]
signed int v25 ; // [esp+14h] [ebp-1Ch]
int v26 ; // [esp+18h] [ebp-18h]
signed int i ; // [esp+1Ch] [ebp-14h]
int v28 ; // [esp+20h] [ebp-10h]
int v29 ; // [esp+24h] [ebp-Ch]
int v30 ; // [esp+28h] [ebp-8h]
int v31 ; // [esp+2Ch] [ebp-4h]
mtypea = mtype ;
v4 = 0 ;
v31 = num ;
v30 = 0 ;
v25 = 0 ;
do
{
if ( v4 )
{
v30 = 0 ;
v5 = & monster [ nummonsters ] . _my ;
nummonsters - = v4 ;
do
{
v6 = * ( v5 - 58 ) ;
v5 - = 57 ;
- - v4 ;
dMonster [ 0 ] [ * v5 + 112 * v6 ] = 0 ;
}
while ( v4 ) ;
}
if ( leaderf & 1 )
{
_LOBYTE ( v4 ) = 92 ;
v7 = random ( v4 , 8 ) ;
v8 = monster [ leader ] . _mx + offset_x [ v7 ] ;
v9 = monster [ leader ] . _my + offset_y [ v7 ] ;
v29 = monster [ leader ] . _mx + offset_x [ v7 ] ;
v28 = monster [ leader ] . _my + offset_y [ v7 ] ;
}
else
{
do
{
_LOBYTE ( v4 ) = 93 ;
v10 = random ( v4 , 80 ) ;
_LOBYTE ( v11 ) = 93 ;
v8 = v10 + 16 ;
v29 = v10 + 16 ;
v12 = random ( v11 , 80 ) ;
v9 = v12 + 16 ;
v28 = v12 + 16 ;
}
while ( ! MonstPlace ( v8 , v12 + 16 ) ) ;
}
if ( nummonsters + v31 > totalmonsters )
v31 = totalmonsters - nummonsters ;
v26 = 0 ;
for ( i = 0 ; v26 < v31 ; v9 + = offset_x [ random ( v23 , 8 ) ] )
{
if ( i > = 100 )
break ;
if ( ! MonstPlace ( v8 , v9 )
| | ( v13 = 112 * v29 , dung_map [ v8 ] [ v9 ] ! = dung_map [ v29 ] [ v28 ] )
| | leaderf & 2
& & ( ( v14 = abs ( v8 - v29 ) , v13 = 0 , v14 > = 4 ) | | ( v16 = abs ( v9 - v28 ) , v13 = 0 , v16 > = 4 ) ) ) /* v15/v17 */
{
+ + i ;
}
else
{
PlaceMonster ( nummonsters , mtypea , v8 , v9 ) ;
if ( leaderf & 1 )
{
v18 = nummonsters ;
v19 = & monster [ nummonsters ] . _mmaxhp ;
v20 = 2 * * v19 ;
* v19 = v20 ;
monster [ v18 ] . _mhitpoints = v20 ;
v13 = 228 * leader ;
monster [ v18 ] . _mint = monster [ leader ] . _mint ;
if ( leaderf & 2 )
{
monster [ v18 ] . leader = leader ;
monster [ v18 ] . leaderflag = 1 ;
monster [ v18 ] . _mAi = * ( & monster [ 0 ] . _mAi + v13 ) ;
}
if ( monster [ v18 ] . _mAi ! = AI_GARG )
{
v21 = nummonsters ;
2018-06-10 23:10:21 +00:00
v22 = monster [ v18 ] . MType - > Anims [ 0 ] . Frames [ monster [ v18 ] . _mdir ] ;
2018-06-07 02:25:54 +00:00
monster [ v18 ] . _mAFNum = v22 ;
_LOBYTE ( v22 ) = 88 ;
monster [ v21 ] . _mAnimFrame = random ( v22 , monster [ v21 ] . _mAnimLen - 1 ) + 1 ;
monster [ v21 ] . _mFlags & = 0xFFFFFFFB ;
monster [ v21 ] . _mmode = MM_STAND ;
}
}
+ + nummonsters ;
+ + v30 ;
+ + v26 ;
}
_LOBYTE ( v13 ) = 94 ;
v8 + = offset_x [ random ( v13 , 8 ) ] ;
_LOBYTE ( v23 ) = 94 ;
}
v4 = v30 ;
if ( v30 > = v31 )
break ;
+ + v25 ;
}
while ( v25 < 10 ) ;
if ( leaderf & 2 )
monster [ leader ] . unpackfilesize = v30 ;
}
// 658550: using guessed type int totalmonsters;
//----- (00432585) --------------------------------------------------------
void __cdecl LoadDiabMonsts ( )
{
unsigned char * lpSetPiece ; // esi
lpSetPiece = LoadFileInMem ( " Levels \\ L4Data \\ diab1.DUN " , 0 ) ;
SetMapMonsters ( ( char * ) lpSetPiece , 2 * diabquad1x , 2 * diabquad1y ) ;
mem_free_dbg ( lpSetPiece ) ;
lpSetPiece = LoadFileInMem ( " Levels \\ L4Data \\ diab2a.DUN " , 0 ) ;
SetMapMonsters ( ( char * ) lpSetPiece , 2 * diabquad2x , 2 * diabquad2y ) ;
mem_free_dbg ( lpSetPiece ) ;
lpSetPiece = LoadFileInMem ( " Levels \\ L4Data \\ diab3a.DUN " , 0 ) ;
SetMapMonsters ( ( char * ) lpSetPiece , 2 * diabquad3x , 2 * diabquad3y ) ;
mem_free_dbg ( lpSetPiece ) ;
lpSetPiece = LoadFileInMem ( " Levels \\ L4Data \\ diab4a.DUN " , 0 ) ;
SetMapMonsters ( ( char * ) lpSetPiece , 2 * diabquad4x , 2 * diabquad4y ) ;
mem_free_dbg ( lpSetPiece ) ;
}
// 5289C4: using guessed type int diabquad1x;
// 5289C8: using guessed type int diabquad1y;
//----- (00432637) --------------------------------------------------------
void __cdecl InitMonsters ( )
{
int v0 ; // ebp
int v1 ; // ebx
TriggerStruct * v2 ; // esi
signed int v3 ; // ebp
signed int v4 ; // edi
int v5 ; // edi
int v6 ; // esi
int v7 ; // eax
int v8 ; // ecx
int v9 ; // edx
int v10 ; // eax
int v11 ; // esi
unsigned char * v12 ; // edi
int v13 ; // ebx
int v14 ; // ecx
int v15 ; // esi
int v16 ; // ecx
int v17 ; // eax
int v18 ; // eax
int v19 ; // ebx
TriggerStruct * v20 ; // esi
signed int v21 ; // ebp
signed int v22 ; // edi
int max ; // [esp+10h] [ebp-1C4h]
int v24 ; // [esp+14h] [ebp-1C0h]
int scattertypes [ 111 ] ; // [esp+18h] [ebp-1BCh]
v0 = 0 ;
max = 0 ;
if ( gbMaxPlayers ! = 1 )
CheckDungeonClear ( ) ;
if ( ! setlevel )
{
AddMonster ( 1 , 0 , 0 , 0 , 0 ) ;
AddMonster ( 1 , 0 , 0 , 0 , 0 ) ;
AddMonster ( 1 , 0 , 0 , 0 , 0 ) ;
AddMonster ( 1 , 0 , 0 , 0 , 0 ) ;
if ( ! setlevel & & currlevel = = 16 )
LoadDiabMonsts ( ) ;
}
v24 = trigflag [ 4 ] ;
if ( currlevel = = 15 )
v24 = 1 ;
v1 = v24 ;
if ( v24 > 0 )
{
v2 = trigs ;
do
{
v3 = - 2 ;
do
{
v4 = - 2 ;
do
DoVision ( v3 + v2 - > _tx , v4 + + + v2 - > _ty , 15 , 0 , 0 ) ;
while ( v4 < 2 ) ;
+ + v3 ;
}
while ( v3 < 2 ) ;
+ + v2 ;
- - v1 ;
}
while ( v1 ) ;
v0 = 0 ;
}
PlaceQuestMonsters ( ) ;
if ( ! setlevel )
{
PlaceUniques ( ) ;
v5 = 16 ;
do
{
v6 = 16 ;
do
{
if ( ! SolidLoc ( v5 , v6 ) )
+ + v0 ;
+ + v6 ;
}
while ( v6 < 96 ) ;
+ + v5 ;
}
while ( v5 < 96 ) ;
v7 = v0 / 30 ;
if ( gbMaxPlayers ! = 1 )
v7 + = v7 > > 1 ;
v8 = nummonsters ;
if ( nummonsters + v7 > 190 )
v7 = 190 - nummonsters ;
v9 = nummtypes ;
v10 = nummonsters + v7 ;
v11 = 0 ;
totalmonsters = v10 ;
if ( nummtypes > 0 )
{
v12 = & Monsters [ 0 ] . mPlaceFlags ;
do
{
if ( * v12 & 1 )
{
v13 = max + + ;
scattertypes [ v13 ] = v11 ;
}
+ + v11 ;
v12 + = 328 ;
}
while ( v11 < v9 ) ;
}
if ( v8 < v10 )
{
while ( 1 )
{
_LOBYTE ( v8 ) = 95 ;
v15 = scattertypes [ random ( v8 , max ) ] ;
if ( currlevel = = 1 )
break ;
_LOBYTE ( v14 ) = 95 ;
if ( ! random ( v14 , 2 ) )
break ;
_LOBYTE ( v16 ) = 95 ;
if ( currlevel = = 2 )
{
v17 = random ( v16 , 2 ) + 1 ;
LABEL_40 :
v18 = v17 + 1 ;
goto LABEL_41 ;
}
v18 = random ( v16 , 3 ) + 3 ;
LABEL_41 :
PlaceGroup ( v15 , v18 , 0 , 0 ) ;
if ( nummonsters > = totalmonsters )
goto LABEL_42 ;
}
v17 = 0 ;
goto LABEL_40 ;
}
}
LABEL_42 :
v19 = v24 ;
if ( v24 > 0 )
{
v20 = trigs ;
do
{
v21 = - 2 ;
do
{
v22 = - 2 ;
do
DoUnVision ( v21 + v20 - > _tx , v22 + + + v20 - > _ty , 15 ) ;
while ( v22 < 2 ) ;
+ + v21 ;
}
while ( v21 < 2 ) ;
+ + v20 ;
- - v19 ;
}
while ( v19 ) ;
}
}
// 5CF31D: using guessed type char setlevel;
// 658550: using guessed type int totalmonsters;
// 679660: using guessed type char gbMaxPlayers;
// 432637: using guessed type int var_1BC[111];
//----- (0043283D) --------------------------------------------------------
void __cdecl PlaceUniques ( )
{
int v0 ; // edi
int v1 ; // eax
UniqMonstStruct * v2 ; // ecx
int v3 ; // eax
int v4 ; // edx
CMonster * v5 ; // esi
int v6 ; // eax
int v7 ; // edx
v0 = 0 ;
if ( UniqMonst [ 0 ] . mtype ! = - 1 )
{
v1 = 0 ;
v2 = UniqMonst ;
while ( UniqMonst [ v1 ] . mlevel ! = currlevel )
{
LABEL_25 :
v1 = + + v0 ;
v2 = & UniqMonst [ v0 ] ;
if ( v2 - > mtype = = - 1 )
return ;
}
v3 = 0 ;
v4 = 0 ;
if ( nummtypes > 0 )
{
v5 = Monsters ;
do
{
if ( v3 )
break ;
v6 = - ( ( char ) v2 - > mtype ! = ( unsigned char ) v5 - > mtype ) ;
+ + v5 ;
v3 = v6 + 1 ;
+ + v4 ;
}
while ( v4 < nummtypes ) ;
}
v7 = v4 - 1 ;
if ( ! v0 )
{
if ( quests [ 2 ] . _qactive )
goto LABEL_23 ;
v3 = 0 ;
}
if ( v0 = = 2 )
{
if ( quests [ 3 ] . _qactive )
goto LABEL_23 ;
v3 = 0 ;
}
if ( v0 = = 3 )
{
if ( quests [ 7 ] . _qactive )
goto LABEL_23 ;
v3 = 0 ;
}
if ( v0 ! = 7 )
{
LABEL_20 :
if ( v0 = = 8 & & ! quests [ 11 ] . _qactive )
v3 = 0 ;
goto LABEL_23 ;
}
if ( ! quests [ 4 ] . _qactive )
{
v3 = 0 ;
goto LABEL_20 ;
}
LABEL_23 :
if ( v3 )
PlaceUniqueMonst ( v0 , v7 , 8 ) ;
goto LABEL_25 ;
}
}
//----- (0043290E) --------------------------------------------------------
void __fastcall SetMapMonsters ( char * pMap , int startx , int starty )
{
char * v3 ; // esi
unsigned short v4 ; // cx
int v5 ; // edx
int v6 ; // edi
int v7 ; // ecx
char * v8 ; // edx
int i ; // esi
int v10 ; // eax
int v11 ; // ecx
int v12 ; // [esp+Ch] [ebp-Ch]
int v13 ; // [esp+10h] [ebp-8h]
char * v14 ; // [esp+14h] [ebp-4h]
int startya ; // [esp+20h] [ebp+8h]
v12 = startx ;
v3 = pMap ;
AddMonsterType ( MT_GOLEM , 2 ) ;
AddMonster ( 1 , 0 , 0 , 0 , 0 ) ;
AddMonster ( 1 , 0 , 0 , 0 , 0 ) ;
AddMonster ( 1 , 0 , 0 , 0 , 0 ) ;
AddMonster ( 1 , 0 , 0 , 0 , 0 ) ;
if ( setlevel & & setlvlnum = = SL_VILEBETRAYER )
{
AddMonsterType ( ( char ) UniqMonst [ 4 ] . mtype , 4 ) ;
AddMonsterType ( ( char ) UniqMonst [ 5 ] . mtype , 4 ) ;
AddMonsterType ( ( char ) UniqMonst [ 6 ] . mtype , 4 ) ;
PlaceUniqueMonst ( 4 , 0 , 0 ) ;
PlaceUniqueMonst ( 5 , 0 , 0 ) ;
PlaceUniqueMonst ( 6 , 0 , 0 ) ;
}
v4 = * ( ( _WORD * ) v3 + 1 ) ;
v5 = * ( unsigned short * ) v3 * v4 ;
v6 = ( unsigned short ) ( 2 * * ( _WORD * ) v3 ) ;
v7 = ( unsigned short ) ( 2 * v4 ) ;
v8 = & v3 [ 2 * v5 + 4 + 2 * v7 * v6 ] ;
v14 = v8 ;
if ( v7 > 0 )
{
v13 = v7 ;
startya = starty + 16 ;
do
{
for ( i = 0 ; i < v6 ; v14 + = 2 )
{
if ( * ( _WORD * ) v8 )
{
v10 = AddMonsterType ( MonstConvTbl [ * ( unsigned short * ) v8 - 1 ] , 2 ) ; /* fix */
v11 = nummonsters + + ;
PlaceMonster ( v11 , v10 , i + v12 + 16 , startya ) ;
}
v8 = v14 + 2 ;
+ + i ;
}
+ + startya ;
- - v13 ;
}
while ( v13 ) ;
}
}
// 5CCB10: using guessed type char setlvlnum;
// 5CF31D: using guessed type char setlevel;
//----- (00432A4D) --------------------------------------------------------
void __fastcall DeleteMonster ( int i )
{
int * v1 ; // ecx
int * v2 ; // eax
int v3 ; // edx
- - nummonsters ;
v1 = & monstactive [ i ] ;
v2 = & monstactive [ nummonsters ] ;
v3 = * v2 ;
* v2 = * v1 ;
* v1 = v3 ;
}
//----- (00432A71) --------------------------------------------------------
int __fastcall AddMonster ( int x , int y , int dir , int mtype , int InMap )
{
int i ; // esi
if ( nummonsters > = 200 )
return - 1 ;
i = monstactive [ nummonsters + + ] ;
if ( InMap )
dMonster [ x ] [ y ] = i + 1 ;
InitMonster ( i , dir , mtype , x , y ) ;
return i ;
}
//----- (00432AC1) --------------------------------------------------------
void __fastcall NewMonsterAnim ( int i , AnimStruct * anim , int md )
{
MonsterStruct * v3 ; // eax
int v4 ; // esi
int v5 ; // edx
v3 = & monster [ i ] ;
2018-06-10 23:10:21 +00:00
v3 - > _mAFNum = anim - > Frames [ md ] ;
2018-06-07 02:25:54 +00:00
v4 = anim - > Rate ;
v3 - > _mAnimCnt = 0 ;
v3 - > _mAnimLen = v4 ;
v3 - > _mAnimFrame = 1 ;
v5 = anim - > Delay ;
v3 - > _mFlags & = 0xFFFFFFF9 ;
v3 - > _mAnimDelay = v5 ;
v3 - > _mdir = md ;
}
//----- (00432AFF) --------------------------------------------------------
bool __fastcall M_Ranged ( int i )
{
char v1 ; // cl
v1 = monster [ i ] . _mAi ;
return v1 = = AI_SKELBOW | | v1 = = AI_GOATBOW | | v1 = = AI_SUCC | | v1 = = AI_LAZHELP ;
}
//----- (00432B26) --------------------------------------------------------
bool __fastcall M_Talker ( int i )
{
char v1 ; // cl
v1 = monster [ i ] . _mAi ;
return v1 = = AI_LAZURUS
| | v1 = = AI_WARLORD
| | v1 = = AI_GARBUD
| | v1 = = AI_ZHAR
| | v1 = = AI_SNOTSPIL
| | v1 = = AI_LACHDAN
| | v1 = = AI_LAZHELP ;
}
//----- (00432B5C) --------------------------------------------------------
void __fastcall M_Enemy ( int i )
{
MonsterStruct * v1 ; // esi
int * v2 ; // edi
int v3 ; // eax
int v4 ; // ecx
int v5 ; // ebx
int v6 ; // eax
int v7 ; // eax
int v8 ; // eax
int v9 ; // ecx
int v10 ; // edi
//int v11; // edx
int v12 ; // eax
int v13 ; // ecx
int v14 ; // ebx
int v15 ; // eax
int v16 ; // eax
int v17 ; // [esp+Ch] [ebp-20h]
int v18 ; // [esp+10h] [ebp-1Ch]
BOOL v19 ; // [esp+14h] [ebp-18h]
BOOL v20 ; // [esp+14h] [ebp-18h]
signed int v21 ; // [esp+18h] [ebp-14h]
int j ; // [esp+18h] [ebp-14h]
signed int v23 ; // [esp+1Ch] [ebp-10h]
signed int v24 ; // [esp+20h] [ebp-Ch]
BOOL v25 ; // [esp+24h] [ebp-8h]
char v26 ; // [esp+2Ah] [ebp-2h]
char v27 ; // [esp+2Bh] [ebp-1h]
v24 = - 1 ;
v18 = i ;
v23 = - 1 ;
v1 = & monster [ i ] ;
v25 = 0 ;
if ( ! ( v1 - > _mFlags & 0x20 ) )
{
v21 = 0 ;
v2 = & plr [ 0 ] . plrlevel ;
do
{
if ( ! * ( ( _BYTE * ) v2 - 23 ) | | currlevel ! = * v2 | | * ( ( _BYTE * ) v2 + 267 ) | | ! v2 [ 89 ] & & gbMaxPlayers ! = 1 )
goto LABEL_18 ;
v3 = v1 - > _my ;
v4 = v2 [ 2 ] ;
v19 = dung_map [ v2 [ 1 ] ] [ v4 ] = = dung_map [ v1 - > _mx ] [ v3 ] ;
v5 = abs ( v3 - v4 ) ;
if ( abs ( v1 - > _mx - v2 [ 1 ] ) < = v5 )
v6 = v1 - > _my - v2 [ 2 ] ;
else
v6 = v1 - > _mx - v2 [ 1 ] ;
v7 = abs ( v6 ) ;
if ( v19 )
{
if ( ! v25 )
goto LABEL_17 ;
}
else if ( v25 )
{
goto LABEL_16 ;
}
if ( v7 < v23 )
goto LABEL_17 ;
LABEL_16 :
if ( v24 = = - 1 )
{
LABEL_17 :
v1 - > _mFlags & = 0xFFFFFFEF ;
v24 = v21 ;
v27 = * ( ( _BYTE * ) v2 + 12 ) ;
v26 = * ( ( _BYTE * ) v2 + 16 ) ;
v23 = v7 ;
v25 = v19 ;
}
LABEL_18 :
+ + v21 ;
v2 + = 5430 ;
}
while ( ( signed int ) v2 < ( signed int ) & plr [ 4 ] . plrlevel ) ;
}
v8 = 0 ;
for ( j = 0 ; j < nummonsters ; v8 = j + + + 1 )
{
v9 = monstactive [ v8 ] ;
v17 = monstactive [ v8 ] ;
if ( v9 = = v18 )
continue ;
v10 = v9 ;
if ( monster [ v9 ] . _mx = = 1 & & ! monster [ v10 ] . _my )
continue ;
if ( M_Talker ( v9 ) & & monster [ v10 ] . mtalkmsg )
continue ;
if ( ! ( v1 - > _mFlags & 0x20 )
& & ( ( abs ( monster [ v10 ] . _mx - v1 - > _mx ) > = 2 | | abs ( monster [ v10 ] . _my - v1 - > _my ) > = 2 ) & & ! M_Ranged ( v18 ) /* v11 */
| | ! ( v1 - > _mFlags & 0x20 ) & & ! ( monster [ v10 ] . _mFlags & 0x20 ) ) )
{
continue ;
}
v12 = v1 - > _my ;
v13 = monster [ v10 ] . _my ;
v20 = dung_map [ monster [ v10 ] . _mx ] [ v13 ] = = dung_map [ v1 - > _mx ] [ v12 ] ;
v14 = abs ( v12 - v13 ) ;
if ( abs ( v1 - > _mx - monster [ v10 ] . _mx ) < = v14 )
v15 = v1 - > _my - monster [ v10 ] . _my ;
else
v15 = v1 - > _mx - monster [ v10 ] . _mx ;
v16 = abs ( v15 ) ;
if ( v20 )
{
if ( ! v25 )
goto LABEL_40 ;
}
else if ( v25 )
{
goto LABEL_39 ;
}
if ( v16 < v23 )
goto LABEL_40 ;
LABEL_39 :
if ( v24 = = - 1 )
{
LABEL_40 :
v1 - > _mFlags | = 0x10u ;
v24 = v17 ;
v27 = monster [ v10 ] . _mfutx ;
v26 = monster [ v10 ] . _mfuty ;
v23 = v16 ;
v25 = v20 ;
}
}
if ( v24 = = - 1 )
{
BYTE1 ( v1 - > _mFlags ) | = 4u ;
}
else
{
BYTE1 ( v1 - > _mFlags ) & = 0xFBu ;
v1 - > _menemy = v24 ;
v1 - > _menemyx = v27 ;
v1 - > _menemyy = v26 ;
}
}
// 679660: using guessed type char gbMaxPlayers;
//----- (00432E15) --------------------------------------------------------
int __fastcall M_GetDir ( int i )
{
return GetDirection (
monster [ i ] . _mx ,
monster [ i ] . _my ,
( unsigned char ) monster [ i ] . _menemyx ,
( unsigned char ) monster [ i ] . _menemyy ) ;
}
//----- (00432E3D) --------------------------------------------------------
void __fastcall M_CheckEFlag ( int i )
{
int v1 ; // ecx
int v2 ; // edi
char * v3 ; // eax
signed int v4 ; // edx
v1 = i ;
v2 = 0 ;
v3 = ( char * ) dpiece_defs_map_2 + 32 * ( 112 * ( monster [ v1 ] . _mx - 1 ) + monster [ v1 ] . _my + 1 ) ;
if ( v3 < ( char * ) dpiece_defs_map_2 )
goto LABEL_9 ;
v4 = 2 ;
do
v2 | = * ( unsigned short * ) & v3 [ 2 * v4 + + ] ;
while ( v4 < 10 ) ;
if ( v2 | dArch [ monster [ v1 ] . _mx - 1 ] [ monster [ v1 ] . _my + 1 ] )
monster [ v1 ] . _meflag = 1 ;
else
LABEL_9 :
monster [ v1 ] . _meflag = 0 ;
}
//----- (00432E9D) --------------------------------------------------------
void __fastcall M_StartStand ( int i , int md )
{
int v2 ; // ebx
int v3 ; // edi
int v4 ; // esi
CMonster * v5 ; // eax
AnimStruct * v6 ; // edx
int v7 ; // eax
int v8 ; // ecx
v2 = md ;
v3 = i ;
ClearMVars ( i ) ;
v4 = v3 ;
v5 = monster [ v3 ] . MType ;
v6 = & v5 - > Anims [ 1 ] ;
if ( v5 - > mtype ! = MT_GOLEM )
v6 = v5 - > Anims ;
NewMonsterAnim ( v3 , v6 , v2 ) ;
monster [ v4 ] . _mdir = v2 ;
monster [ v4 ] . _mVar1 = monster [ v4 ] . _mmode ;
monster [ v4 ] . _mVar2 = 0 ;
monster [ v4 ] . _mmode = 0 ;
v7 = monster [ v4 ] . _mx ;
monster [ v4 ] . _mxoff = 0 ;
monster [ v4 ] . _myoff = 0 ;
v8 = monster [ v4 ] . _my ;
monster [ v4 ] . _mfuty = v8 ;
monster [ v4 ] . _moldy = v8 ;
monster [ v4 ] . _mfutx = v7 ;
monster [ v4 ] . _moldx = v7 ;
M_CheckEFlag ( v3 ) ;
M_Enemy ( v3 ) ;
}
//----- (00432F29) --------------------------------------------------------
void __fastcall M_StartDelay ( int i , int len )
{
int v2 ; // eax
if ( len > 0 )
{
v2 = i ;
if ( monster [ i ] . _mAi ! = AI_LAZURUS )
{
monster [ v2 ] . _mVar2 = len ;
monster [ v2 ] . _mmode = MM_DELAY ;
}
}
}
//----- (00432F4F) --------------------------------------------------------
void __fastcall M_StartSpStand ( int i , int md )
{
int v2 ; // ebx
int v3 ; // esi
int v4 ; // edi
int v5 ; // eax
int v6 ; // ecx
v2 = i ;
v3 = i ;
v4 = md ;
NewMonsterAnim ( i , & monster [ i ] . MType - > Anims [ 5 ] , md ) ;
v5 = monster [ v3 ] . _mx ;
v6 = monster [ v3 ] . _my ;
monster [ v3 ] . _mxoff = 0 ;
monster [ v3 ] . _myoff = 0 ;
monster [ v3 ] . _mdir = v4 ;
monster [ v3 ] . _mmode = MM_SPSTAND ;
monster [ v3 ] . _mfutx = v5 ;
monster [ v3 ] . _mfuty = v6 ;
monster [ v3 ] . _moldx = v5 ;
monster [ v3 ] . _moldy = v6 ;
M_CheckEFlag ( v2 ) ;
}
//----- (00432FBC) --------------------------------------------------------
void __fastcall M_StartWalk ( int i , int xvel , int yvel , int xadd , int yadd , int EndDir )
{
int v6 ; // ST18_4
int v7 ; // esi
int v8 ; // eax
int v9 ; // ecx
CMonster * v10 ; // edx
v6 = i ;
v7 = i ;
v8 = monster [ i ] . _mx ;
monster [ v7 ] . _moldx = v8 ;
v9 = monster [ i ] . _my ;
monster [ v7 ] . _mfuty = v9 + yadd ;
monster [ v7 ] . _mxvel = xvel ;
monster [ v7 ] . _myvel = yvel ;
monster [ v7 ] . _mVar1 = xadd ;
monster [ v7 ] . _mVar2 = yadd ;
dMonster [ 0 ] [ v9 + yadd + 112 * ( v8 + xadd ) ] = - 1 - v6 ;
v10 = monster [ v7 ] . MType ;
monster [ v7 ] . _moldy = v9 ;
monster [ v7 ] . _mmode = MM_WALK ;
monster [ v7 ] . _mfutx = v8 + xadd ;
monster [ v7 ] . _mVar3 = EndDir ;
monster [ v7 ] . _mdir = EndDir ;
NewMonsterAnim ( v6 , & v10 - > Anims [ 1 ] , EndDir ) ;
monster [ v7 ] . _mVar6 = 0 ;
monster [ v7 ] . _mVar7 = 0 ;
monster [ v7 ] . _mVar8 = 0 ;
M_CheckEFlag ( v6 ) ;
}
//----- (0043308F) --------------------------------------------------------
void __fastcall M_StartWalk2 ( int i , int xvel , int yvel , int a4 , int a5 , int a6 , int a7 , int EndDir )
{
int v8 ; // esi
int v9 ; // edx
int v10 ; // ecx
int v11 ; // eax
int v12 ; // eax
bool v13 ; // zf
CMonster * v14 ; // edx
int v15 ; // [esp+Ch] [ebp-8h]
int ia ; // [esp+10h] [ebp-4h]
int EndDira ; // [esp+28h] [ebp+14h]
v15 = xvel ;
ia = i ;
v8 = i ;
v9 = a6 + monster [ i ] . _mx ;
EndDira = monster [ i ] . _mx ;
v10 = monster [ i ] . _my ;
v11 = monster [ v8 ] . _my ;
monster [ v8 ] . _mVar2 = v10 ;
dMonster [ 0 ] [ v10 + 112 * EndDira ] = - 1 - ia ;
monster [ v8 ] . _mVar1 = EndDira ;
monster [ v8 ] . _moldx = EndDira ;
v12 = a7 + v11 ;
monster [ v8 ] . _moldy = v10 ;
v13 = monster [ v8 ] . _uniqtype = = 0 ;
monster [ v8 ] . _mx = v9 ;
monster [ v8 ] . _my = v12 ;
monster [ v8 ] . _mfutx = v9 ;
monster [ v8 ] . _mfuty = v12 ;
dMonster [ 0 ] [ v12 + 112 * v9 ] = ia + 1 ;
if ( ! v13 )
ChangeLightXY ( ( unsigned char ) monster [ v8 ] . mlid , v9 , v12 ) ;
v14 = monster [ v8 ] . MType ;
monster [ v8 ] . _mxvel = v15 ;
monster [ v8 ] . _myvel = yvel ;
monster [ v8 ] . _mxoff = a4 ;
monster [ v8 ] . _myoff = a5 ;
monster [ v8 ] . _mmode = MM_WALK2 ;
monster [ v8 ] . _mVar3 = EndDir ;
monster [ v8 ] . _mdir = EndDir ;
NewMonsterAnim ( ia , & v14 - > Anims [ 1 ] , EndDir ) ;
monster [ v8 ] . _mVar8 = 0 ;
monster [ v8 ] . _mVar6 = 16 * a4 ;
monster [ v8 ] . _mVar7 = 16 * a5 ;
M_CheckEFlag ( ia ) ;
}
//----- (004331AA) --------------------------------------------------------
void __fastcall M_StartWalk3 ( int i , int xvel , int yvel , int a4 , int a5 , int a6 , int a7 , int a8 , int a9 , int EndDir )
{
int v10 ; // esi
int v11 ; // ebx
int v12 ; // edi
int v13 ; // edi
int v14 ; // ebx
int v15 ; // ecx
CMonster * v16 ; // edx
int v17 ; // [esp+Ch] [ebp-8h]
int ia ; // [esp+10h] [ebp-4h]
int a6a ; // [esp+28h] [ebp+14h]
int a7a ; // [esp+2Ch] [ebp+18h]
ia = i ;
v10 = i ;
v11 = monster [ i ] . _my ;
v12 = monster [ i ] . _mx ;
v17 = xvel ;
a6a = v12 + a6 ;
a7a = v11 + a7 ;
v13 = a8 + v12 ;
v14 = a9 + v11 ;
if ( monster [ i ] . _uniqtype )
ChangeLightXY ( ( unsigned char ) monster [ v10 ] . mlid , v13 , v14 ) ;
v15 = monster [ v10 ] . _my + 112 * monster [ v10 ] . _mx ;
monster [ v10 ] . _mVar4 = v13 ;
dMonster [ 0 ] [ v15 ] = - 1 - ia ;
monster [ v10 ] . _mVar5 = v14 ;
dMonster [ 0 ] [ a7a + 112 * a6a ] = - 1 - ia ;
monster [ v10 ] . _moldx = monster [ v10 ] . _mx ;
monster [ v10 ] . _moldy = monster [ v10 ] . _my ;
monster [ v10 ] . _mfutx = a6a ;
monster [ v10 ] . _mxvel = v17 ;
dFlags [ v13 ] [ v14 ] | = 0x10u ;
v16 = monster [ v10 ] . MType ;
monster [ v10 ] . _myvel = yvel ;
monster [ v10 ] . _mfuty = a7a ;
monster [ v10 ] . _mVar1 = a6a ;
monster [ v10 ] . _mVar2 = a7a ;
monster [ v10 ] . _mxoff = a4 ;
monster [ v10 ] . _myoff = a5 ;
monster [ v10 ] . _mmode = MM_WALK3 ;
monster [ v10 ] . _mVar3 = EndDir ;
monster [ v10 ] . _mdir = EndDir ;
NewMonsterAnim ( ia , & v16 - > Anims [ 1 ] , EndDir ) ;
monster [ v10 ] . _mVar8 = 0 ;
monster [ v10 ] . _mVar6 = 16 * a4 ;
monster [ v10 ] . _mVar7 = 16 * a5 ;
M_CheckEFlag ( ia ) ;
}
//----- (004332F6) --------------------------------------------------------
void __fastcall M_StartAttack ( int i )
{
int v1 ; // edi
int v2 ; // ebx
int v3 ; // esi
int v4 ; // ecx
int v5 ; // eax
v1 = i ;
v2 = M_GetDir ( i ) ;
v3 = v1 ;
NewMonsterAnim ( v1 , & monster [ v1 ] . MType - > Anims [ 2 ] , v2 ) ;
v4 = monster [ v1 ] . _my ;
v5 = monster [ v1 ] . _mx ;
monster [ v3 ] . _mxoff = 0 ;
monster [ v3 ] . _myoff = 0 ;
monster [ v3 ] . _mfuty = v4 ;
monster [ v3 ] . _moldy = v4 ;
monster [ v3 ] . _mmode = MM_ATTACK ;
monster [ v3 ] . _mfutx = v5 ;
monster [ v3 ] . _moldx = v5 ;
monster [ v3 ] . _mdir = v2 ;
M_CheckEFlag ( v1 ) ;
}
//----- (00433367) --------------------------------------------------------
void __fastcall M_StartRAttack ( int i , int missile_type , int dam )
{
int v3 ; // ebp
int v4 ; // edi
int v5 ; // ebx
int v6 ; // esi
int v7 ; // ecx
int v8 ; // eax
v3 = missile_type ;
v4 = i ;
v5 = M_GetDir ( i ) ;
v6 = v4 ;
NewMonsterAnim ( v4 , & monster [ v4 ] . MType - > Anims [ 2 ] , v5 ) ;
v7 = monster [ v4 ] . _my ;
monster [ v6 ] . _mxoff = 0 ;
monster [ v6 ] . _myoff = 0 ;
monster [ v6 ] . _mVar2 = dam ;
v8 = monster [ v4 ] . _mx ;
monster [ v6 ] . _mfuty = v7 ;
monster [ v6 ] . _moldy = v7 ;
monster [ v6 ] . _mmode = MM_RATTACK ;
monster [ v6 ] . _mVar1 = v3 ;
monster [ v6 ] . _mfutx = v8 ;
monster [ v6 ] . _moldx = v8 ;
monster [ v6 ] . _mdir = v5 ;
M_CheckEFlag ( v4 ) ;
}
//----- (004333EF) --------------------------------------------------------
void __fastcall M_StartRSpAttack ( int i , int missile_type , int dam )
{
int v3 ; // ebp
int v4 ; // edi
int v5 ; // ebx
int v6 ; // esi
int v7 ; // ecx
int v8 ; // eax
v3 = missile_type ;
v4 = i ;
v5 = M_GetDir ( i ) ;
v6 = v4 ;
NewMonsterAnim ( v4 , & monster [ v4 ] . MType - > Anims [ 5 ] , v5 ) ;
monster [ v6 ] . _mmode = MM_RSPATTACK ;
monster [ v6 ] . _mVar2 = 0 ;
monster [ v6 ] . _mVar3 = dam ;
v7 = monster [ v4 ] . _my ;
monster [ v6 ] . _mxoff = 0 ;
monster [ v6 ] . _myoff = 0 ;
v8 = monster [ v4 ] . _mx ;
monster [ v6 ] . _mfuty = v7 ;
monster [ v6 ] . _moldy = v7 ;
monster [ v6 ] . _mVar1 = v3 ;
monster [ v6 ] . _mfutx = v8 ;
monster [ v6 ] . _moldx = v8 ;
monster [ v6 ] . _mdir = v5 ;
M_CheckEFlag ( v4 ) ;
}
//----- (00433480) --------------------------------------------------------
void __fastcall M_StartSpAttack ( int i )
{
int v1 ; // edi
int v2 ; // ebx
int v3 ; // esi
int v4 ; // ecx
int v5 ; // eax
v1 = i ;
v2 = M_GetDir ( i ) ;
v3 = v1 ;
NewMonsterAnim ( v1 , & monster [ v1 ] . MType - > Anims [ 5 ] , v2 ) ;
v4 = monster [ v1 ] . _my ;
v5 = monster [ v1 ] . _mx ;
monster [ v3 ] . _mxoff = 0 ;
monster [ v3 ] . _myoff = 0 ;
monster [ v3 ] . _mfuty = v4 ;
monster [ v3 ] . _moldy = v4 ;
monster [ v3 ] . _mmode = MM_SATTACK ;
monster [ v3 ] . _mfutx = v5 ;
monster [ v3 ] . _moldx = v5 ;
monster [ v3 ] . _mdir = v2 ;
M_CheckEFlag ( v1 ) ;
}
//----- (004334F4) --------------------------------------------------------
void __fastcall M_StartEat ( int i )
{
int v1 ; // edi
int v2 ; // esi
int v3 ; // ecx
int v4 ; // eax
v1 = i ;
v2 = i ;
NewMonsterAnim ( i , & monster [ i ] . MType - > Anims [ 5 ] , monster [ i ] . _mdir ) ;
v3 = monster [ v2 ] . _my ;
v4 = monster [ v2 ] . _mx ;
monster [ v2 ] . _mxoff = 0 ;
monster [ v2 ] . _myoff = 0 ;
monster [ v2 ] . _mfuty = v3 ;
monster [ v2 ] . _moldy = v3 ;
monster [ v2 ] . _mmode = MM_SATTACK ;
monster [ v2 ] . _mfutx = v4 ;
monster [ v2 ] . _moldx = v4 ;
M_CheckEFlag ( v1 ) ;
}
//----- (0043355C) --------------------------------------------------------
void __fastcall M_ClearSquares ( int i )
{
int v1 ; // edx
int v2 ; // eax
int v3 ; // esi
int v4 ; // ecx
int v5 ; // edi
int v6 ; // [esp+8h] [ebp-Ch]
_DWORD * v7 ; // [esp+Ch] [ebp-8h]
int v8 ; // [esp+10h] [ebp-4h]
v1 = monster [ i ] . _moldx ;
v2 = monster [ i ] . _moldy ;
v3 = - 1 - i ;
v6 = i + 1 ;
v4 = v2 - 1 ;
v5 = v2 + 1 ;
if ( ( unsigned char ) ( __OFSUB__ ( v2 - 1 , v2 + 1 ) ^ 1 ) | ( v2 - 1 = = v2 + 1 ) )
{
do
{
if ( v4 > = 0 & & v4 < 112 )
{
v8 = v1 - 1 ;
if ( ( unsigned char ) ( __OFSUB__ ( v1 - 1 , v1 + 1 ) ^ 1 ) | ( v1 - 1 = = v1 + 1 ) )
{
v7 = ( _DWORD * ) ( ( char * ) dMonster + 4 * ( v4 + 112 * ( v1 - 1 ) ) ) ;
do
{
if ( v8 > = 0 & & v8 < 112 & & ( * v7 = = v3 | | * v7 = = v6 ) )
* v7 = 0 ;
+ + v8 ;
v7 + = 112 ;
}
while ( v8 < = v1 + 1 ) ;
}
}
+ + v4 ;
v5 = v2 + 1 ;
}
while ( v4 < = v2 + 1 ) ;
}
if ( v1 + 1 < 112 )
dFlags [ v1 + 1 ] [ v2 ] & = 0xEFu ;
if ( v5 < 112 )
dFlags [ v1 ] [ v2 + 1 ] & = 0xEFu ;
}
//----- (0043361B) --------------------------------------------------------
void __fastcall M_GetKnockback ( int i )
{
int v1 ; // edi
int v2 ; // esi
int v3 ; // ebx
//int v4; // eax
int v5 ; // ST00_4
AnimStruct * v6 ; // edx
int v7 ; // eax
int v8 ; // ecx
int v9 ; // eax
v1 = i ;
v2 = i ;
v3 = ( ( unsigned char ) monster [ i ] . _mdir - 4 ) & 7 ;
//_LOBYTE(v4) = DirOK(i, v3);
if ( DirOK ( i , v3 ) )
{
M_ClearSquares ( v1 ) ;
v5 = monster [ v2 ] . _mdir ;
v6 = & monster [ v2 ] . MType - > Anims [ 3 ] ;
v7 = offset_y [ v3 ] ;
monster [ v2 ] . _moldx + = offset_x [ v3 ] ;
monster [ v2 ] . _moldy + = v7 ;
NewMonsterAnim ( v1 , v6 , v5 ) ;
v8 = monster [ v2 ] . _moldy ;
v9 = monster [ v2 ] . _moldx ;
monster [ v2 ] . _mxoff = 0 ;
monster [ v2 ] . _myoff = 0 ;
monster [ v2 ] . _my = v8 ;
monster [ v2 ] . _mfuty = v8 ;
monster [ v2 ] . _mmode = MM_GOTHIT ;
monster [ v2 ] . _mx = v9 ;
monster [ v2 ] . _mfutx = v9 ;
M_CheckEFlag ( v1 ) ;
M_ClearSquares ( v1 ) ;
dMonster [ 0 ] [ monster [ v2 ] . _my + 112 * monster [ v2 ] . _mx ] = v1 + 1 ;
}
}
//----- (004336E5) --------------------------------------------------------
void __fastcall M_StartHit ( int i , int pnum , int dam )
{
int v3 ; // ebx
int v4 ; // edi
int v5 ; // esi
unsigned char v6 ; // al
char v7 ; // al
unsigned char v8 ; // al
int v9 ; // ecx
int v10 ; // eax
v3 = pnum ;
v4 = i ;
if ( pnum > = 0 )
monster [ i ] . mWhoHit | = 1 < < pnum ;
if ( pnum = = myplr )
{
delta_monster_hp ( i , monster [ i ] . _mhitpoints , currlevel ) ;
NetSendCmdParam2 ( 0 , CMD_MONSTDAMAGE , v4 , dam ) ;
}
PlayEffect ( v4 , 1 ) ;
v5 = v4 ;
v6 = monster [ v4 ] . MType - > mtype ;
if ( v6 > = MT_SNEAK & & v6 < = MT_ILLWEAV | | dam > > 6 > = SLOBYTE ( monster [ v5 ] . mLevel ) + 3 )
{
if ( v3 > = 0 )
{
monster [ v5 ] . _mFlags & = 0xFFFFFFEF ;
monster [ v5 ] . _menemy = v3 ;
v7 = plr [ v3 ] . _py ;
monster [ v5 ] . _menemyx = plr [ v3 ] . _px ;
monster [ v5 ] . _menemyy = v7 ;
monster [ v5 ] . _mdir = M_GetDir ( v4 ) ;
}
v8 = monster [ v5 ] . MType - > mtype ;
if ( v8 = = MT_BLINK )
{
M_Teleport ( v4 ) ;
}
else if ( v8 > = MT_NSCAV & & v8 < = MT_YSCAV )
{
_LOBYTE ( monster [ v5 ] . _mgoal ) = 1 ;
}
if ( monster [ v5 ] . _mmode ! = MM_STONE )
{
NewMonsterAnim ( v4 , & monster [ v5 ] . MType - > Anims [ 3 ] , monster [ v5 ] . _mdir ) ;
v9 = monster [ v5 ] . _moldy ;
v10 = monster [ v5 ] . _moldx ;
monster [ v5 ] . _mxoff = 0 ;
monster [ v5 ] . _myoff = 0 ;
monster [ v5 ] . _my = v9 ;
monster [ v5 ] . _mfuty = v9 ;
monster [ v5 ] . _mmode = MM_GOTHIT ;
monster [ v5 ] . _mx = v10 ;
monster [ v5 ] . _mfutx = v10 ;
M_CheckEFlag ( v4 ) ;
M_ClearSquares ( v4 ) ;
dMonster [ 0 ] [ monster [ v5 ] . _my + 112 * monster [ v5 ] . _mx ] = v4 + 1 ;
}
}
}
//----- (0043385A) --------------------------------------------------------
void __fastcall M_DiabloDeath ( int i , unsigned char sendmsg )
{
int v2 ; // esi
int v3 ; // edi
int v4 ; // eax
int v5 ; // ebx
int v6 ; // esi
int v7 ; // ecx
int v8 ; // eax
int v9 ; // esi
int v10 ; // eax
double v11 ; // st7
int v12 ; // eax
int v13 ; // ecx
int v14 ; // esi
int v15 ; // [esp+8h] [ebp-8h]
int j ; // [esp+Ch] [ebp-4h]
int v17 ; // [esp+Ch] [ebp-4h]
v15 = i ;
v2 = sendmsg ;
v3 = i ;
PlaySFX ( USFX_DIABLOD ) ;
quests [ 5 ] . _qactive = 3 ;
if ( v2 )
NetSendCmdQuest ( 1u , 5u ) ;
gbProcessPlayers = 0 ;
_LOBYTE ( sgbSaveSoundOn ) = gbSoundOn ;
v4 = 0 ;
for ( j = 0 ; j < nummonsters ; + + j )
{
v5 = monstactive [ v4 ] ;
if ( v5 ! = v15 & & _LOBYTE ( monster [ v3 ] . _msquelch ) )
{
v6 = v5 ;
NewMonsterAnim ( monstactive [ v4 ] , & monster [ v5 ] . MType - > Anims [ 4 ] , monster [ v5 ] . _mdir ) ;
v7 = monster [ v5 ] . _moldy ;
monster [ v6 ] . _mxoff = 0 ;
monster [ v6 ] . _myoff = 0 ;
monster [ v6 ] . _mVar1 = 0 ;
v8 = monster [ v5 ] . _moldx ;
monster [ v6 ] . _my = v7 ;
monster [ v6 ] . _mfuty = v7 ;
monster [ v6 ] . _mmode = MM_DEATH ;
monster [ v6 ] . _mx = v8 ;
monster [ v6 ] . _mfutx = v8 ;
M_CheckEFlag ( v5 ) ;
M_ClearSquares ( v5 ) ;
dMonster [ 0 ] [ monster [ v6 ] . _my + 112 * monster [ v6 ] . _mx ] = v5 + 1 ;
}
v4 = j + 1 ;
}
AddLight ( monster [ v3 ] . _mx , monster [ v3 ] . _my , 8 ) ;
DoVision ( monster [ v3 ] . _mx , monster [ v3 ] . _my , 8 , 0 , 1 ) ;
v9 = abs ( ViewY - monster [ v3 ] . _my ) ;
if ( abs ( ViewX - monster [ v3 ] . _mx ) < = v9 )
v10 = ViewY - monster [ v3 ] . _my ;
else
v10 = ViewX - monster [ v3 ] . _mx ;
v17 = abs ( v10 ) ;
if ( v17 > 20 )
v17 = 20 ;
v11 = ( double ) v17 ;
v12 = ViewX < < 16 ;
v13 = monster [ v3 ] . _mx < < 16 ;
monster [ v3 ] . _mVar3 = ViewX < < 16 ;
v14 = ViewY < < 16 ;
monster [ v3 ] . _mVar4 = ViewY < < 16 ;
monster [ v3 ] . _mVar5 = ( signed __int64 ) ( ( double ) ( v12 - v13 ) / v11 ) ;
monster [ v3 ] . _mVar6 = ( signed __int64 ) ( ( double ) ( v14 - ( monster [ v3 ] . _my < < 16 ) ) / v11 ) ;
}
// 4A22D5: using guessed type char gbSoundOn;
// 5256A0: using guessed type int gbProcessPlayers;
// 64D32C: using guessed type int sgbSaveSoundOn;
//----- (00433A4C) --------------------------------------------------------
void __fastcall M2MStartHit ( int mid , int i , int dam )
{
int v3 ; // edi
int v4 ; // ebx
int v5 ; // esi
CMonster * v6 ; // eax
char v7 ; // al
CMonster * v8 ; // eax
int v9 ; // ecx
int v10 ; // eax
int v11 ; // [esp+Ch] [ebp-4h]
v3 = mid ;
v4 = i ;
v11 = i ;
if ( ( unsigned int ) mid > = 0xC8 )
TermMsg ( " Invalid monster %d getting hit by monster " , mid ) ;
v5 = v3 ;
if ( ! monster [ v3 ] . MType )
TermMsg ( " Monster %d \" %s \" getting hit by monster: MType NULL " , v3 , monster [ v5 ] . mName ) ;
if ( v4 > = 0 )
monster [ v4 ] . mWhoHit | = 1 < < v4 ;
delta_monster_hp ( v3 , monster [ v5 ] . _mhitpoints , currlevel ) ;
NetSendCmdParam2 ( 0 , CMD_MONSTDAMAGE , v3 , dam ) ;
PlayEffect ( v3 , 1 ) ;
v6 = monster [ v5 ] . MType ;
if ( v6 - > mtype > = MT_SNEAK & & v6 - > mtype < = MT_ILLWEAV | | dam > > 6 > = SLOBYTE ( monster [ v5 ] . mLevel ) + 3 )
{
if ( v11 > = 0 )
monster [ v5 ] . _mdir = ( ( unsigned char ) monster [ v11 ] . _mdir - 4 ) & 7 ;
v7 = v6 - > mtype ;
if ( v7 = = 39 )
{
M_Teleport ( v3 ) ;
}
else if ( v7 > = MT_NSCAV & & v7 < = MT_YSCAV )
{
_LOBYTE ( monster [ v5 ] . _mgoal ) = 1 ;
}
if ( monster [ v5 ] . _mmode ! = MM_STONE )
{
v8 = monster [ v5 ] . MType ;
if ( v8 - > mtype ! = MT_GOLEM )
{
NewMonsterAnim ( v3 , & v8 - > Anims [ 3 ] , monster [ v5 ] . _mdir ) ;
monster [ v5 ] . _mmode = MM_GOTHIT ;
}
v9 = monster [ v5 ] . _moldy ;
v10 = monster [ v5 ] . _moldx ;
monster [ v5 ] . _mxoff = 0 ;
monster [ v5 ] . _myoff = 0 ;
monster [ v5 ] . _my = v9 ;
monster [ v5 ] . _mfuty = v9 ;
monster [ v5 ] . _mx = v10 ;
monster [ v5 ] . _mfutx = v10 ;
M_CheckEFlag ( v3 ) ;
M_ClearSquares ( v3 ) ;
dMonster [ 0 ] [ monster [ v5 ] . _my + 112 * monster [ v5 ] . _mx ] = v3 + 1 ;
}
}
}
//----- (00433BCC) --------------------------------------------------------
void __fastcall MonstStartKill ( int i , int pnum , unsigned char sendmsg )
{
signed int v3 ; // edi
int v4 ; // ebx
signed int v5 ; // esi
int v6 ; // ecx
int v7 ; // eax
//int v8; // eax
int v9 ; // eax
AnimStruct * v10 ; // edx
int v11 ; // ecx
int v12 ; // eax
unsigned char v13 ; // al
v3 = i ;
v4 = pnum ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " MonstStartKill: Invalid monster %d " , i ) ;
v5 = v3 ;
if ( ! monster [ v3 ] . MType )
TermMsg ( " MonstStartKill: Monster %d \" %s \" MType NULL " , v3 , monster [ v5 ] . mName ) ;
if ( v4 > = 0 )
monster [ v5 ] . mWhoHit | = 1 < < v4 ;
if ( v4 < 4 & & v3 > 4 )
AddPlrMonstExper ( SLOBYTE ( monster [ v5 ] . mLevel ) , ( unsigned short ) monster [ v5 ] . mExp , monster [ v5 ] . mWhoHit ) ;
v6 = monster [ v5 ] . _mRndSeed ;
v7 = monster [ v5 ] . MType - > mtype ;
monster [ v5 ] . _mhitpoints = 0 ;
+ + monstkills [ v7 ] ;
SetRndSeed ( v6 ) ;
//_LOBYTE(v8) = QuestStatus(2);
if ( QuestStatus ( 2 ) & & monster [ v5 ] . mName = = UniqMonst [ 0 ] . mName )
{
CreateTypeItem ( monster [ v5 ] . _mx + 1 , monster [ v5 ] . _my + 1 , 1u , 4 , 0 , 1 , 0 ) ;
}
else if ( v3 > 3 )
{
SpawnItem ( v3 , monster [ v5 ] . _mx , monster [ v5 ] . _my , sendmsg ) ;
}
if ( monster [ v5 ] . MType - > mtype = = MT_DIABLO )
M_DiabloDeath ( v3 , 1u ) ;
else
PlayEffect ( v3 , 2 ) ;
if ( v4 < 0 )
v9 = monster [ v5 ] . _mdir ;
else
v9 = M_GetDir ( v3 ) ;
v10 = & monster [ v5 ] . MType - > Anims [ 4 ] ;
monster [ v5 ] . _mdir = v9 ;
NewMonsterAnim ( v3 , v10 , v9 ) ;
v11 = monster [ v5 ] . _moldy ;
v12 = monster [ v5 ] . _moldx ;
monster [ v5 ] . _my = v11 ;
monster [ v5 ] . _mfuty = v11 ;
monster [ v5 ] . _mmode = MM_DEATH ;
monster [ v5 ] . _mxoff = 0 ;
monster [ v5 ] . _myoff = 0 ;
monster [ v5 ] . _mVar1 = 0 ;
monster [ v5 ] . _mx = v12 ;
monster [ v5 ] . _mfutx = v12 ;
M_CheckEFlag ( v3 ) ;
M_ClearSquares ( v3 ) ;
dMonster [ 0 ] [ monster [ v5 ] . _my + 112 * monster [ v5 ] . _mx ] = v3 + 1 ;
CheckQuestKill ( v3 , sendmsg ) ;
M_FallenFear ( monster [ v5 ] . _mx , monster [ v5 ] . _my ) ;
v13 = monster [ v5 ] . MType - > mtype ;
if ( v13 > = MT_NACID & & v13 < = MT_XACID )
AddMissile ( monster [ v5 ] . _mx , monster [ v5 ] . _my , 0 , 0 , 0 , 59 , 1 , v3 , ( unsigned char ) monster [ v5 ] . _mint + 1 , 0 ) ;
}
//----- (00433DC2) --------------------------------------------------------
void __fastcall M2MStartKill ( int i , int mid )
{
signed int v2 ; // ebx
signed int v3 ; // edi
signed int v4 ; // esi
int v5 ; // ecx
int v6 ; // eax
CMonster * v7 ; // ecx
int v8 ; // eax
int v9 ; // ecx
int v10 ; // eax
unsigned char v11 ; // al
v2 = i ;
v3 = mid ;
if ( ( unsigned int ) i > = 0xC8 )
{
TermMsg ( " M2MStartKill: Invalid monster (attacker) %d " , i ) ;
TermMsg ( " M2MStartKill: Invalid monster (killed) %d " , v3 ) ;
}
if ( ! monster [ v2 ] . MType )
TermMsg ( " M2MStartKill: Monster %d \" %s \" MType NULL " , v3 , monster [ v3 ] . mName ) ;
v4 = v3 ;
delta_kill_monster ( v3 , monster [ v3 ] . _mx , monster [ v3 ] . _my , currlevel ) ;
NetSendCmdLocParam1 ( 0 , CMD_MONSTDEATH , monster [ v4 ] . _mx , monster [ v4 ] . _my , v3 ) ;
monster [ v4 ] . mWhoHit | = 1 < < v2 ;
if ( v2 < 4 )
AddPlrMonstExper ( SLOBYTE ( monster [ v4 ] . mLevel ) , ( unsigned short ) monster [ v4 ] . mExp , monster [ v3 ] . mWhoHit ) ;
v5 = monster [ v4 ] . _mRndSeed ;
v6 = monster [ v4 ] . MType - > mtype ;
monster [ v4 ] . _mhitpoints = 0 ;
+ + monstkills [ v6 ] ;
SetRndSeed ( v5 ) ;
if ( v3 > = 4 )
SpawnItem ( v3 , monster [ v4 ] . _mx , monster [ v4 ] . _my , 1u ) ;
if ( monster [ v4 ] . MType - > mtype = = MT_DIABLO )
M_DiabloDeath ( v3 , 1u ) ;
else
PlayEffect ( v2 , 2 ) ;
PlayEffect ( v3 , 2 ) ;
v7 = monster [ v4 ] . MType ;
v8 = ( ( unsigned char ) monster [ v2 ] . _mdir - 4 ) & 7 ;
if ( v7 - > mtype = = MT_GOLEM )
v8 = 0 ;
monster [ v4 ] . _mdir = v8 ;
NewMonsterAnim ( v3 , & v7 - > Anims [ 4 ] , v8 ) ;
v9 = monster [ v4 ] . _moldy ;
v10 = monster [ v4 ] . _moldx ;
monster [ v4 ] . _my = v9 ;
monster [ v4 ] . _mfuty = v9 ;
monster [ v4 ] . _mmode = MM_DEATH ;
monster [ v4 ] . _mxoff = 0 ;
monster [ v4 ] . _myoff = 0 ;
monster [ v4 ] . _mx = v10 ;
monster [ v4 ] . _mfutx = v10 ;
M_CheckEFlag ( v3 ) ;
M_ClearSquares ( v3 ) ;
dMonster [ 0 ] [ monster [ v4 ] . _my + 112 * monster [ v4 ] . _mx ] = v3 + 1 ;
CheckQuestKill ( v3 , 1u ) ;
M_FallenFear ( monster [ v4 ] . _mx , monster [ v4 ] . _my ) ;
v11 = monster [ v4 ] . MType - > mtype ;
if ( v11 > = MT_NACID & & v11 < = MT_XACID )
AddMissile ( monster [ v4 ] . _mx , monster [ v4 ] . _my , 0 , 0 , 0 , 59 , 1 , v3 , ( unsigned char ) monster [ v4 ] . _mint + 1 , 0 ) ;
}
//----- (00433FC7) --------------------------------------------------------
void __fastcall M_StartKill ( int i , int pnum )
{
int v2 ; // edi
int v3 ; // ebx
int v4 ; // esi
int v5 ; // eax
v2 = i ;
v3 = pnum ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " M_StartKill: Invalid monster %d " , i ) ;
if ( myplr = = v3 )
{
v4 = v2 ;
delta_kill_monster ( v2 , monster [ v2 ] . _mx , monster [ v2 ] . _my , currlevel ) ;
if ( v2 = = v3 )
{
_LOWORD ( v5 ) = currlevel ;
NetSendCmdLocParam1 ( 0 , CMD_KILLGOLEM , monster [ v4 ] . _mx , monster [ v4 ] . _my , v5 ) ;
}
else
{
NetSendCmdLocParam1 ( 0 , CMD_MONSTDEATH , monster [ v4 ] . _mx , monster [ v4 ] . _my , v2 ) ;
}
}
MonstStartKill ( v2 , v3 , 1u ) ;
}
//----- (00434045) --------------------------------------------------------
void __fastcall M_SyncStartKill ( int i , int x , int y , int pnum )
{
int v4 ; // esi
int v5 ; // ebx
int v6 ; // esi
int arglist ; // [esp+Ch] [ebp-4h]
v4 = i ;
v5 = x ;
arglist = i ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " M_SyncStartKill: Invalid monster %d " , i ) ;
v6 = v4 ;
if ( monster [ v6 ] . _mhitpoints & & monster [ v6 ] . _mmode ! = MM_DEATH )
{
if ( ! dMonster [ 0 ] [ y + 112 * v5 ] )
{
M_ClearSquares ( arglist ) ;
monster [ v6 ] . _mx = v5 ;
monster [ v6 ] . _my = y ;
monster [ v6 ] . _moldx = v5 ;
monster [ v6 ] . _moldy = y ;
}
if ( monster [ v6 ] . _mmode = = MM_STONE )
{
MonstStartKill ( arglist , pnum , 0 ) ;
monster [ v6 ] . _mmode = MM_STONE ;
}
else
{
MonstStartKill ( arglist , pnum , 0 ) ;
}
}
}
//----- (004340E0) --------------------------------------------------------
void __fastcall M_StartFadein ( int i , int md , unsigned char backwards )
{
int v3 ; // esi
int v4 ; // ebx
int v5 ; // esi
int v6 ; // ecx
int v7 ; // eax
int * v8 ; // eax
int arglist ; // [esp+Ch] [ebp-4h]
v3 = i ;
v4 = md ;
arglist = i ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " M_StartFadein: Invalid monster %d " , i ) ;
v5 = v3 ;
if ( ! monster [ v5 ] . MType )
TermMsg ( " M_StartFadein: Monster %d \" %s \" MType NULL " , arglist , monster [ v5 ] . mName ) ;
NewMonsterAnim ( arglist , & monster [ v5 ] . MType - > Anims [ 5 ] , v4 ) ;
v6 = monster [ v5 ] . _my ;
v7 = monster [ v5 ] . _mx ;
monster [ v5 ] . _mfuty = v6 ;
monster [ v5 ] . _moldy = v6 ;
monster [ v5 ] . _mmode = MM_FADEIN ;
monster [ v5 ] . _mxoff = 0 ;
monster [ v5 ] . _myoff = 0 ;
monster [ v5 ] . _mfutx = v7 ;
monster [ v5 ] . _moldx = v7 ;
M_CheckEFlag ( arglist ) ;
v8 = & monster [ v5 ] . _mFlags ;
monster [ v5 ] . _mdir = v4 ;
* v8 & = 0xFFFFFFFE ;
if ( backwards )
{
* v8 = monster [ v5 ] . _mFlags | 2 ;
monster [ v5 ] . _mAnimFrame = monster [ v5 ] . _mAnimLen ;
}
}
//----- (004341AD) --------------------------------------------------------
void __fastcall M_StartFadeout ( int i , int md , unsigned char backwards )
{
int v3 ; // ebx
int v4 ; // esi
CMonster * * v5 ; // edi
int v6 ; // ecx
int v7 ; // eax
int v8 ; // eax
int mda ; // [esp+Ch] [ebp-4h]
v3 = i ;
mda = md ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " M_StartFadeout: Invalid monster %d " , i ) ;
v4 = v3 ;
v5 = & monster [ v3 ] . MType ;
if ( ! * v5 )
TermMsg ( " M_StartFadeout: Monster %d \" %s \" MType NULL " , v3 , monster [ v4 ] . mName ) ;
NewMonsterAnim ( v3 , & ( * v5 ) - > Anims [ 5 ] , mda ) ;
v6 = monster [ v4 ] . _my ;
v7 = monster [ v4 ] . _mx ;
monster [ v4 ] . _mfuty = v6 ;
monster [ v4 ] . _moldy = v6 ;
monster [ v4 ] . _mmode = MM_FADEOUT ;
monster [ v4 ] . _mxoff = 0 ;
monster [ v4 ] . _myoff = 0 ;
monster [ v4 ] . _mfutx = v7 ;
monster [ v4 ] . _moldx = v7 ;
M_CheckEFlag ( v3 ) ;
monster [ v4 ] . _mdir = mda ;
if ( backwards )
{
v8 = monster [ v4 ] . _mAnimLen ;
monster [ v4 ] . _mFlags | = 2u ;
monster [ v4 ] . _mAnimFrame = v8 ;
}
}
//----- (00434272) --------------------------------------------------------
void __fastcall M_StartHeal ( int i )
{
int v1 ; // edi
int v2 ; // esi
CMonster * v3 ; // eax
int v4 ; // ecx
int v5 ; // eax
v1 = i ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " M_StartHeal: Invalid monster %d " , i ) ;
v2 = v1 ;
if ( ! monster [ v1 ] . MType )
TermMsg ( " M_StartHeal: Monster %d \" %s \" MType NULL " , v1 , monster [ v2 ] . mName ) ;
v3 = monster [ v2 ] . MType ;
2018-06-10 23:10:21 +00:00
v4 = v3 - > Anims [ 5 ] . Frames [ monster [ v2 ] . _mdir ] ;
2018-06-07 02:25:54 +00:00
monster [ v2 ] . _mAFNum = v4 ;
v5 = v3 - > Anims [ 5 ] . Rate ;
monster [ v2 ] . _mFlags | = 2u ;
_LOBYTE ( v4 ) = 97 ;
monster [ v2 ] . _mAnimFrame = v5 ;
monster [ v2 ] . _mmode = MM_HEAL ;
monster [ v2 ] . _mVar1 = monster [ v2 ] . _mmaxhp / ( 16 * ( random ( v4 , 5 ) + 4 ) ) ;
}
//----- (0043430A) --------------------------------------------------------
void __fastcall M_ChangeLightOffset ( int monst )
{
int v1 ; // esi
int v2 ; // ecx
int v3 ; // eax
int v4 ; // esi
int v5 ; // edx
int v6 ; // eax
signed int v7 ; // esi
int v8 ; // edx
signed int v9 ; // esi
v1 = monst ;
if ( ( unsigned int ) monst > = 0xC8 )
TermMsg ( " M_ChangeLightOffset: Invalid monster %d " , monst ) ;
v2 = v1 ;
v3 = monster [ v1 ] . _myoff ;
v4 = monster [ v1 ] . _mxoff ;
v3 * = 2 ;
v5 = v4 + v3 ;
v6 = v3 - v4 ;
if ( v5 > = 0 )
{
v7 = 1 ;
}
else
{
v7 = - 1 ;
v5 = - v5 ;
}
v8 = v7 * ( v5 > > 3 ) ;
if ( v6 > = 0 )
{
v9 = 1 ;
}
else
{
v9 = - 1 ;
v6 = - v6 ;
}
ChangeLightOff ( ( unsigned char ) monster [ v2 ] . mlid , v8 , v9 * ( v6 > > 3 ) ) ;
}
//----- (00434374) --------------------------------------------------------
int __fastcall M_DoStand ( int i )
{
int v1 ; // edi
int v2 ; // esi
CMonster * v3 ; // eax
int v4 ; // ecx
int v5 ; // eax
v1 = i ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " M_DoStand: Invalid monster %d " , i ) ;
v2 = v1 ;
if ( ! monster [ v1 ] . MType )
TermMsg ( " M_DoStand: Monster %d \" %s \" MType NULL " , v1 , monster [ v2 ] . mName ) ;
v3 = monster [ v2 ] . MType ;
v4 = monster [ v2 ] . _mdir ;
if ( v3 - > mtype = = MT_GOLEM )
2018-06-10 23:10:21 +00:00
v5 = v3 - > Anims [ 1 ] . Frames [ v4 ] ;
2018-06-07 02:25:54 +00:00
else
2018-06-10 23:10:21 +00:00
v5 = v3 - > Anims [ 0 ] . Frames [ v4 ] ;
2018-06-07 02:25:54 +00:00
monster [ v2 ] . _mAFNum = v5 ;
if ( monster [ v2 ] . _mAnimFrame = = monster [ v2 ] . _mAnimLen )
M_Enemy ( v1 ) ;
+ + monster [ v2 ] . _mVar2 ;
return 0 ;
}
//----- (004343F3) --------------------------------------------------------
int __fastcall M_DoWalk ( int i )
{
int v1 ; // ebx
int v2 ; // esi
int v3 ; // edi
int v4 ; // eax
int v5 ; // edi
int v6 ; // ecx
int v7 ; // edx
int v8 ; // eax
bool v9 ; // zf
int v10 ; // ecx
int v11 ; // edx
int v12 ; // eax
int v13 ; // ecx
v1 = i ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " M_DoWalk: Invalid monster %d " , i ) ;
v2 = v1 ;
v3 = 0 ;
if ( ! monster [ v1 ] . MType )
TermMsg ( " M_DoWalk: Monster %d \" %s \" MType NULL " , v1 , monster [ v2 ] . mName ) ;
v4 = monster [ v2 ] . _mVar8 ;
if ( v4 = = monster [ v2 ] . MType - > Anims [ 1 ] . Rate )
{
v5 = monster [ v2 ] . _my ;
v6 = monster [ v2 ] . _mx ;
dMonster [ 0 ] [ v5 + 112 * monster [ v2 ] . _mx ] = 0 ;
v7 = v6 + monster [ v2 ] . _mVar1 ;
monster [ v2 ] . _mx = v7 ;
v8 = v5 + monster [ v2 ] . _mVar2 ;
v9 = monster [ v2 ] . _uniqtype = = 0 ;
monster [ v2 ] . _my = v8 ;
dMonster [ 0 ] [ v8 + 112 * v7 ] = v1 + 1 ;
if ( ! v9 )
ChangeLightXY ( ( unsigned char ) monster [ v2 ] . mlid , v7 , v8 ) ;
M_StartStand ( v1 , monster [ v2 ] . _mdir ) ;
v3 = 1 ;
}
else if ( ! monster [ v2 ] . _mAnimCnt )
{
v10 = monster [ v2 ] . _mxvel ;
v11 = monster [ v2 ] . _myvel ;
monster [ v2 ] . _mVar8 = v4 + 1 ;
monster [ v2 ] . _mVar6 + = v10 ;
v12 = monster [ v2 ] . _mVar6 > > 4 ;
monster [ v2 ] . _mVar7 + = v11 ;
v13 = monster [ v2 ] . _mVar7 > > 4 ;
monster [ v2 ] . _mxoff = v12 ;
monster [ v2 ] . _myoff = v13 ;
}
if ( monster [ v2 ] . _uniqtype )
M_ChangeLightOffset ( v1 ) ;
return v3 ;
}
//----- (00434509) --------------------------------------------------------
int __fastcall M_DoWalk2 ( int i )
{
int v1 ; // ebp
int v2 ; // esi
int v3 ; // eax
bool v4 ; // zf
int v5 ; // edi
int v6 ; // ecx
int v7 ; // edx
int v8 ; // eax
int v9 ; // ecx
v1 = i ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " M_DoWalk2: Invalid monster %d " , i ) ;
v2 = v1 ;
if ( ! monster [ v1 ] . MType )
TermMsg ( " M_DoWalk2: Monster %d \" %s \" MType NULL " , v1 , monster [ v2 ] . mName ) ;
v3 = monster [ v2 ] . _mVar8 ;
if ( v3 = = monster [ v2 ] . MType - > Anims [ 1 ] . Rate )
{
v4 = monster [ v2 ] . _uniqtype = = 0 ;
dMonster [ 0 ] [ monster [ v2 ] . _mVar2 + 112 * monster [ v2 ] . _mVar1 ] = 0 ;
if ( ! v4 )
ChangeLightXY ( ( unsigned char ) monster [ v2 ] . mlid , monster [ v2 ] . _mx , monster [ v2 ] . _my ) ;
M_StartStand ( v1 , monster [ v2 ] . _mdir ) ;
v5 = 1 ;
}
else
{
if ( ! monster [ v2 ] . _mAnimCnt )
{
v6 = monster [ v2 ] . _mxvel ;
v7 = monster [ v2 ] . _myvel ;
monster [ v2 ] . _mVar8 = v3 + 1 ;
monster [ v2 ] . _mVar6 + = v6 ;
v8 = monster [ v2 ] . _mVar6 > > 4 ;
monster [ v2 ] . _mVar7 + = v7 ;
v9 = monster [ v2 ] . _mVar7 > > 4 ;
monster [ v2 ] . _mxoff = v8 ;
monster [ v2 ] . _myoff = v9 ;
}
v5 = 0 ;
}
if ( monster [ v2 ] . _uniqtype )
M_ChangeLightOffset ( v1 ) ;
return v5 ;
}
//----- (004345FC) --------------------------------------------------------
int __fastcall M_DoWalk3 ( int i )
{
int v1 ; // ebp
int v2 ; // esi
int v3 ; // eax
int v4 ; // edi
int v5 ; // edx
int v6 ; // ecx
int v7 ; // edx
char * v8 ; // eax
bool v9 ; // zf
int v10 ; // edi
int v11 ; // ecx
int v12 ; // edx
int v13 ; // eax
int v14 ; // ecx
v1 = i ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " M_DoWalk3: Invalid monster %d " , i ) ;
v2 = v1 ;
if ( ! monster [ v1 ] . MType )
TermMsg ( " M_DoWalk3: Monster %d \" %s \" MType NULL " , v1 , monster [ v2 ] . mName ) ;
v3 = monster [ v2 ] . _mVar8 ;
if ( v3 = = monster [ v2 ] . MType - > Anims [ 1 ] . Rate )
{
v4 = monster [ v2 ] . _mVar2 ;
v5 = monster [ v2 ] . _my + 112 * monster [ v2 ] . _mx ;
monster [ v2 ] . _my = v4 ;
v6 = monster [ v2 ] . _mVar5 ;
dMonster [ 0 ] [ v5 ] = 0 ;
v7 = monster [ v2 ] . _mVar1 ;
monster [ v2 ] . _mx = v7 ;
v8 = & dFlags [ monster [ v2 ] . _mVar4 ] [ v6 ] ;
* v8 & = 0xEFu ;
v9 = monster [ v2 ] . _uniqtype = = 0 ;
dMonster [ 0 ] [ v4 + 112 * v7 ] = v1 + 1 ;
if ( ! v9 )
ChangeLightXY ( ( unsigned char ) monster [ v2 ] . mlid , v7 , v4 ) ;
M_StartStand ( v1 , monster [ v2 ] . _mdir ) ;
v10 = 1 ;
}
else
{
if ( ! monster [ v2 ] . _mAnimCnt )
{
v11 = monster [ v2 ] . _mxvel ;
v12 = monster [ v2 ] . _myvel ;
monster [ v2 ] . _mVar8 = v3 + 1 ;
monster [ v2 ] . _mVar6 + = v11 ;
v13 = monster [ v2 ] . _mVar6 > > 4 ;
monster [ v2 ] . _mVar7 + = v12 ;
v14 = monster [ v2 ] . _mVar7 > > 4 ;
monster [ v2 ] . _mxoff = v13 ;
monster [ v2 ] . _myoff = v14 ;
}
v10 = 0 ;
}
if ( monster [ v2 ] . _uniqtype )
M_ChangeLightOffset ( v1 ) ;
return v10 ;
}
//----- (00434722) --------------------------------------------------------
void __fastcall M_TryM2MHit ( int i , int mid , int hper , int mind , int maxd )
{
int v5 ; // edi
//int v6; // ST08_4
int v7 ; // esi
int v8 ; // ebx
//int v9; // eax
int v10 ; // ecx
int v11 ; // eax
bool ret ; // [esp+Ch] [ebp-Ch]
char v13 [ 4 ] ; // [esp+10h] [ebp-8h]
char arglist [ 4 ] ; // [esp+14h] [ebp-4h]
v5 = mid ;
* ( _DWORD * ) arglist = mid ;
* ( _DWORD * ) v13 = i ;
if ( ( unsigned int ) mid > = 0xC8 )
{
TermMsg ( " M_TryM2MHit: Invalid monster %d " , mid ) ;
//i = v6;
}
v7 = v5 ;
if ( ! monster [ v5 ] . MType )
TermMsg ( " M_TryM2MHit: Monster %d \" %s \" MType NULL " , v5 , monster [ v7 ] . mName ) ;
if ( ( signed int ) ( monster [ v7 ] . _mhitpoints & 0xFFFFFFC0 ) > 0
& & ( monster [ v7 ] . MType - > mtype ! = MT_ILLWEAV | | _LOBYTE ( monster [ v7 ] . _mgoal ) ! = 2 ) )
{
_LOBYTE ( i ) = 4 ;
v8 = random ( i , 100 ) ;
if ( monster [ v7 ] . _mmode = = MM_STONE )
v8 = 0 ;
//_LOBYTE(v9) = CheckMonsterHit(*(int *)arglist, &ret);
if ( ! CheckMonsterHit ( * ( int * ) arglist , & ret ) & & v8 < hper )
{
_LOBYTE ( v10 ) = 5 ;
v11 = ( mind + random ( v10 , maxd - mind + 1 ) ) < < 6 ;
monster [ v7 ] . _mhitpoints - = v11 ;
if ( ( signed int ) ( monster [ v7 ] . _mhitpoints & 0xFFFFFFC0 ) > 0 )
{
if ( monster [ v7 ] . _mmode = = MM_STONE )
{
M2MStartHit ( * ( int * ) arglist , * ( int * ) v13 , v11 ) ;
goto LABEL_15 ;
}
M2MStartHit ( * ( int * ) arglist , * ( int * ) v13 , v11 ) ;
}
else
{
if ( monster [ v7 ] . _mmode = = MM_STONE )
{
M2MStartKill ( * ( int * ) v13 , * ( int * ) arglist ) ;
LABEL_15 :
monster [ v7 ] . _mmode = MM_STONE ;
return ;
}
M2MStartKill ( * ( int * ) v13 , * ( int * ) arglist ) ;
}
}
}
}
//----- (0043482C) --------------------------------------------------------
void __fastcall M_TryH2HHit ( int i , int pnum , int Hit , int MinDam , int MaxDam )
{
int v5 ; // esi
int v6 ; // ebx
int v7 ; // esi
int v8 ; // edi
int v9 ; // eax
//int v10; // ST08_4
int v11 ; // ecx
int v12 ; // ecx
int v13 ; // edi
int v14 ; // eax
int v15 ; // eax
int * v16 ; // ecx
int v17 ; // eax
int v18 ; // edi
int v19 ; // edx
int v20 ; // eax
int v21 ; // eax
int v22 ; // edx
int v23 ; // eax
bool v24 ; // zf
bool v25 ; // sf
unsigned char v26 ; // of
int v27 ; // eax
int v28 ; // ecx
int v29 ; // edi
int v30 ; // eax
int v31 ; // eax
int v32 ; // eax
int v33 ; // edi
int v34 ; // ebx
int v35 ; // edx
int v36 ; // [esp+Ch] [ebp-Ch]
int arglist ; // [esp+10h] [ebp-8h]
int plr_num ; // [esp+14h] [ebp-4h]
int hper ; // [esp+20h] [ebp+8h]
v5 = i ;
plr_num = pnum ;
arglist = i ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " M_TryH2HHit: Invalid monster %d " , i ) ;
v6 = v5 ;
if ( ! monster [ v5 ] . MType )
TermMsg ( " M_TryH2HHit: Monster %d \" %s \" MType NULL " , v5 , monster [ v6 ] . mName ) ;
if ( monster [ v6 ] . _mFlags & 0x10 )
{
M_TryM2MHit ( v5 , plr_num , Hit , MinDam , MaxDam ) ;
return ;
}
v7 = plr_num ;
if ( ( signed int ) ( plr [ plr_num ] . _pHitPoints & 0xFFFFFFC0 ) > 0 & & ! plr [ v7 ] . _pInvincible & & ! ( plr [ v7 ] . _pSpellFlags & 1 ) )
{
v8 = abs ( monster [ v6 ] . _mx - plr [ v7 ] . WorldX ) ;
v9 = abs ( monster [ v6 ] . _my - plr [ v7 ] . WorldY ) ;
//v11 = v10;
if ( v8 < 2 & & v9 < 2 )
{
_LOBYTE ( v11 ) = 98 ;
v36 = random ( v11 , 100 ) ;
# ifdef _DEBUG
if ( debug_mode_dollar_sign | | debug_mode_key_inverted_v )
v36 = 1000 ;
# endif
v12 = 5 ;
v13 = Hit
+ 2 * ( SLOBYTE ( monster [ v6 ] . mLevel ) - plr [ v7 ] . _pLevel )
+ 30
- plr [ v7 ] . _pIBonusAC
- plr [ v7 ] . _pIAC
- plr [ v7 ] . _pDexterity / 5 ;
if ( v13 < 15 )
v13 = 15 ;
if ( currlevel = = 14 )
{
if ( v13 > = 20 )
goto LABEL_23 ;
v13 = 20 ;
}
if ( currlevel ! = 15 )
{
LABEL_20 :
if ( currlevel = = 16 & & v13 < 30 )
v13 = 30 ;
goto LABEL_23 ;
}
if ( v13 < 25 )
{
v13 = 25 ;
goto LABEL_20 ;
}
LABEL_23 :
v14 = plr [ v7 ] . _pmode ;
if ( v14 & & v14 ! = 4 | | ! plr [ v7 ] . _pBlockFlag )
{
v15 = 100 ;
}
else
{
_LOBYTE ( v12 ) = 98 ;
v15 = random ( v12 , 100 ) ;
}
v16 = ( int * ) ( plr [ v7 ] . _pDexterity
+ plr [ v7 ] . _pBaseToBlk
- 2 * SLOBYTE ( monster [ v6 ] . mLevel )
+ 2 * plr [ v7 ] . _pLevel ) ;
if ( ( signed int ) v16 < 0 )
v16 = 0 ;
if ( ( signed int ) v16 > 100 )
v16 = ( int * ) 100 ;
if ( v36 < v13 )
{
if ( v15 > = ( signed int ) v16 )
{
if ( monster [ v6 ] . MType - > mtype = = MT_YZOMBIE & & plr_num = = myplr )
{
v18 = - 1 ;
v19 = 0 ;
for ( hper = - 1 ; v19 < nummissiles ; + + v19 )
{
v20 = missileactive [ v19 ] ;
if ( missile [ v20 ] . _mitype = = 13 )
{
if ( missile [ v20 ] . _misource = = plr_num )
{
v18 = missileactive [ v19 ] ;
hper = missileactive [ v19 ] ;
}
else
{
v18 = hper ;
}
}
}
v16 = & plr [ v7 ] . _pMaxHP ;
v21 = plr [ v7 ] . _pMaxHP ;
if ( v21 > 64 )
{
v22 = plr [ v7 ] . _pMaxHPBase ;
if ( v22 > 64 )
{
v23 = v21 - 64 ;
v26 = __OFSUB__ ( plr [ v7 ] . _pHitPoints , v23 ) ;
v24 = plr [ v7 ] . _pHitPoints = = v23 ;
v25 = plr [ v7 ] . _pHitPoints - v23 < 0 ;
* v16 = v23 ;
if ( ! ( ( unsigned char ) ( v25 ^ v26 ) | v24 ) )
{
plr [ v7 ] . _pHitPoints = v23 ;
if ( v18 > = 0 )
missile [ v18 ] . _miVar1 = v23 ;
}
v16 = & plr [ v7 ] . _pHPBase ;
v27 = v22 - 64 ;
plr [ v7 ] . _pMaxHPBase = v22 - 64 ;
if ( plr [ v7 ] . _pHPBase > v22 - 64 )
{
* v16 = v27 ;
if ( v18 > = 0 )
missile [ v18 ] . _miVar2 = v27 ;
}
}
}
}
_LOBYTE ( v16 ) = 99 ;
v29 = ( plr [ v7 ] . _pIGetHit < < 6 ) + ( MinDam < < 6 ) + random ( ( int ) v16 , ( MaxDam - MinDam + 1 ) < < 6 ) ;
if ( v29 < 64 )
v29 = 64 ;
if ( plr_num = = myplr )
{
plr [ v7 ] . _pHitPoints - = v29 ;
plr [ v7 ] . _pHPBase - = v29 ;
}
if ( plr [ v7 ] . _pIFlags & 0x4000000 )
{
_LOBYTE ( v28 ) = 99 ;
v30 = ( random ( v28 , 3 ) + 1 ) < < 6 ;
monster [ v6 ] . _mhitpoints - = v30 ;
if ( ( signed int ) ( monster [ v6 ] . _mhitpoints & 0xFFFFFFC0 ) > 0 )
M_StartHit ( arglist , plr_num , v30 ) ;
else
M_StartKill ( arglist , plr_num ) ;
}
if ( ! ( monster [ v6 ] . _mFlags & 0x1000 ) & & monster [ v6 ] . MType - > mtype = = MT_SKING & & gbMaxPlayers ! = 1 )
monster [ v6 ] . _mhitpoints + = v29 ;
v31 = plr [ v7 ] . _pMaxHP ;
if ( plr [ v7 ] . _pHitPoints > v31 )
{
plr [ v7 ] . _pHitPoints = v31 ;
plr [ v7 ] . _pHPBase = plr [ v7 ] . _pMaxHPBase ;
}
if ( ( signed int ) ( plr [ v7 ] . _pHitPoints & 0xFFFFFFC0 ) > 0 )
{
StartPlrHit ( plr_num , v29 , 0 ) ;
if ( SLOBYTE ( monster [ v6 ] . _mFlags ) < 0 )
{
if ( plr [ v7 ] . _pmode ! = PM_GOTHIT )
StartPlrHit ( plr_num , 0 , 1u ) ;
v32 = monster [ v6 ] . _mdir ;
v33 = plr [ v7 ] . WorldX + offset_x [ v32 ] ;
v34 = plr [ v7 ] . WorldY + offset_y [ v32 ] ;
if ( PosOkPlayer ( plr_num , v33 , v34 ) )
{
v35 = plr [ v7 ] . _pdir ;
plr [ v7 ] . WorldX = v33 ;
plr [ v7 ] . WorldY = v34 ;
FixPlayerLocation ( plr_num , v35 ) ;
FixPlrWalkTags ( plr_num ) ;
dPlayer [ v33 ] [ v34 ] = plr_num + 1 ;
SetPlayerOld ( plr_num ) ;
}
}
}
else
{
SyncPlrKill ( plr_num , 0 ) ;
}
}
else
{
v17 = GetDirection ( plr [ v7 ] . WorldX , plr [ v7 ] . WorldY , monster [ v6 ] . _mx , monster [ v6 ] . _my ) ;
StartPlrBlock ( plr_num , v17 ) ;
}
}
return ;
}
}
}
// 679660: using guessed type char gbMaxPlayers;
//----- (00434C3B) --------------------------------------------------------
int __fastcall M_DoAttack ( int i )
{
int v1 ; // edi
int v2 ; // esi
CMonster * * v3 ; // ebx
unsigned char v4 ; // al
unsigned char v5 ; // al
v1 = i ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " M_DoAttack: Invalid monster %d " , i ) ;
v2 = v1 ;
v3 = & monster [ v1 ] . MType ;
if ( ! * v3 )
{
TermMsg ( " M_DoAttack: Monster %d \" %s \" MType NULL " , v1 , monster [ v2 ] . mName ) ;
if ( ! * v3 )
TermMsg ( " M_DoAttack: Monster %d \" %s \" MData NULL " , v1 , monster [ v2 ] . mName ) ;
}
if ( monster [ v2 ] . _mAnimFrame = = monster [ v2 ] . MData - > mAFNum )
{
M_TryH2HHit (
v1 ,
monster [ v2 ] . _menemy ,
( unsigned char ) monster [ v2 ] . mHit ,
( unsigned char ) monster [ v2 ] . mMinDamage ,
( unsigned char ) monster [ v2 ] . mMaxDamage ) ;
if ( monster [ v2 ] . _mAi ! = AI_SNAKE )
PlayEffect ( v1 , 0 ) ;
}
v4 = monster [ v2 ] . MType - > mtype ;
if ( v4 > = MT_NMAGMA & & v4 < = MT_WMAGMA & & monster [ v2 ] . _mAnimFrame = = 9 )
{
M_TryH2HHit (
v1 ,
monster [ v2 ] . _menemy ,
( unsigned char ) monster [ v2 ] . mHit + 10 ,
( unsigned char ) monster [ v2 ] . mMinDamage - 2 ,
( unsigned char ) monster [ v2 ] . mMaxDamage - 2 ) ;
PlayEffect ( v1 , 0 ) ;
}
v5 = monster [ v2 ] . MType - > mtype ;
if ( v5 > = MT_STORM & & v5 < = MT_MAEL & & monster [ v2 ] . _mAnimFrame = = 13 )
{
M_TryH2HHit (
v1 ,
monster [ v2 ] . _menemy ,
( unsigned char ) monster [ v2 ] . mHit - 20 ,
( unsigned char ) monster [ v2 ] . mMinDamage + 4 ,
( unsigned char ) monster [ v2 ] . mMaxDamage + 4 ) ;
PlayEffect ( v1 , 0 ) ;
}
if ( monster [ v2 ] . _mAi = = AI_SNAKE & & monster [ v2 ] . _mAnimFrame = = 1 )
PlayEffect ( v1 , 0 ) ;
if ( monster [ v2 ] . _mAnimFrame ! = monster [ v2 ] . _mAnimLen )
return 0 ;
M_StartStand ( v1 , monster [ v2 ] . _mdir ) ;
return 1 ;
}
//----- (00434DBD) --------------------------------------------------------
int __fastcall M_DoRAttack ( int i )
{
int v1 ; // ebx
int v2 ; // esi
CMonster * * v3 ; // edi
int v4 ; // eax
int v5 ; // eax
int v6 ; // edi
v1 = i ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " M_DoRAttack: Invalid monster %d " , i ) ;
v2 = v1 ;
v3 = & monster [ v1 ] . MType ;
if ( ! * v3 )
{
TermMsg ( " M_DoRAttack: Monster %d \" %s \" MType NULL " , v1 , monster [ v2 ] . mName ) ;
if ( ! * v3 )
TermMsg ( " M_DoRAttack: Monster %d \" %s \" MData NULL " , v1 , monster [ v2 ] . mName ) ;
}
if ( monster [ v2 ] . _mAnimFrame = = monster [ v2 ] . MData - > mAFNum )
{
v4 = monster [ v2 ] . _mVar1 ;
if ( v4 ! = - 1 )
{
v5 = 2 * ( v4 = = 52 ) + 1 ;
if ( v5 > 0 )
{
v6 = v5 ;
do
{
AddMissile (
monster [ v2 ] . _mx ,
monster [ v2 ] . _my ,
( unsigned char ) monster [ v2 ] . _menemyx ,
( unsigned char ) monster [ v2 ] . _menemyy ,
monster [ v2 ] . _mdir ,
monster [ v2 ] . _mVar1 ,
1 ,
v1 ,
monster [ v2 ] . _mVar2 ,
0 ) ;
- - v6 ;
}
while ( v6 ) ;
}
}
PlayEffect ( v1 , 0 ) ;
}
if ( monster [ v2 ] . _mAnimFrame ! = monster [ v2 ] . _mAnimLen )
return 0 ;
M_StartStand ( v1 , monster [ v2 ] . _mdir ) ;
return 1 ;
}
//----- (00434EB2) --------------------------------------------------------
int __fastcall M_DoRSpAttack ( int i )
{
int v1 ; // ebx
int v2 ; // esi
CMonster * * v3 ; // edi
bool v4 ; // zf
int v5 ; // ecx
v1 = i ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " M_DoRSpAttack: Invalid monster %d " , i ) ;
v2 = v1 ;
v3 = & monster [ v1 ] . MType ;
v4 = * v3 = = 0 ;
if ( ! * v3 )
{
TermMsg ( " M_DoRSpAttack: Monster %d \" %s \" MType NULL " , v1 , monster [ v2 ] . mName ) ;
v4 = * v3 = = 0 ;
}
if ( v4 )
TermMsg ( " M_DoRSpAttack: Monster %d \" %s \" MData NULL " , v1 , monster [ v2 ] . mName ) ;
if ( monster [ v2 ] . _mAnimFrame = = monster [ v2 ] . MData - > mAFNum2 & & ! monster [ v2 ] . _mAnimCnt )
{
AddMissile (
monster [ v2 ] . _mx ,
monster [ v2 ] . _my ,
( unsigned char ) monster [ v2 ] . _menemyx ,
( unsigned char ) monster [ v2 ] . _menemyy ,
monster [ v2 ] . _mdir ,
monster [ v2 ] . _mVar1 ,
1 ,
v1 ,
monster [ v2 ] . _mVar3 ,
0 ) ;
PlayEffect ( v1 , 3 ) ;
}
if ( monster [ v2 ] . _mAi = = AI_MEGA & & monster [ v2 ] . _mAnimFrame = = 3 )
{
v5 = monster [ v2 ] . _mVar2 ;
monster [ v2 ] . _mVar2 = v5 + 1 ;
if ( v5 )
{
if ( v5 = = 14 )
monster [ v2 ] . _mFlags & = 0xFFFFFFFB ;
}
else
{
monster [ v2 ] . _mFlags | = 4u ;
}
}
if ( monster [ v2 ] . _mAnimFrame ! = monster [ v2 ] . _mAnimLen )
return 0 ;
M_StartStand ( v1 , monster [ v2 ] . _mdir ) ;
return 1 ;
}
//----- (00434FC7) --------------------------------------------------------
int __fastcall M_DoSAttack ( int i )
{
int v1 ; // ebx
int v2 ; // esi
CMonster * * v3 ; // edi
bool v4 ; // zf
v1 = i ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " M_DoSAttack: Invalid monster %d " , i ) ;
v2 = v1 ;
v3 = & monster [ v1 ] . MType ;
v4 = * v3 = = 0 ;
if ( ! * v3 )
{
TermMsg ( " M_DoSAttack: Monster %d \" %s \" MType NULL " , v1 , monster [ v2 ] . mName ) ;
v4 = * v3 = = 0 ;
}
if ( v4 )
TermMsg ( " M_DoSAttack: Monster %d \" %s \" MData NULL " , v1 , monster [ v2 ] . mName ) ;
if ( monster [ v2 ] . _mAnimFrame = = monster [ v2 ] . MData - > mAFNum2 )
M_TryH2HHit (
v1 ,
monster [ v2 ] . _menemy ,
( unsigned char ) monster [ v2 ] . mHit2 ,
( unsigned char ) monster [ v2 ] . mMinDamage2 ,
( unsigned char ) monster [ v2 ] . mMaxDamage2 ) ;
if ( monster [ v2 ] . _mAnimFrame ! = monster [ v2 ] . _mAnimLen )
return 0 ;
M_StartStand ( v1 , monster [ v2 ] . _mdir ) ;
return 1 ;
}
//----- (0043507E) --------------------------------------------------------
int __fastcall M_DoFadein ( int i )
{
int v1 ; // edi
int v2 ; // esi
v1 = i ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " M_DoFadein: Invalid monster %d " , i ) ;
v2 = v1 ;
if ( ( ! ( monster [ v1 ] . _mFlags & 2 ) | | monster [ v2 ] . _mAnimFrame ! = 1 )
& & ( monster [ v1 ] . _mFlags & 2 | | monster [ v2 ] . _mAnimFrame ! = monster [ v2 ] . _mAnimLen ) )
{
return 0 ;
}
M_StartStand ( v1 , monster [ v2 ] . _mdir ) ;
monster [ v2 ] . _mFlags & = 0xFFFFFFFD ;
return 1 ;
}
//----- (004350E3) --------------------------------------------------------
int __fastcall M_DoFadeout ( int i )
{
int v1 ; // esi
int v2 ; // eax
int v3 ; // ecx
signed int v4 ; // edx
int v5 ; // ecx
int v6 ; // edx
v1 = i ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " M_DoFadeout: Invalid monster %d " , i ) ;
v2 = v1 ;
v3 = monster [ v1 ] . _mFlags ;
if ( ( ! ( monster [ v1 ] . _mFlags & 2 ) | | monster [ v2 ] . _mAnimFrame ! = 1 )
& & ( monster [ v1 ] . _mFlags & 2 | | monster [ v2 ] . _mAnimFrame ! = monster [ v2 ] . _mAnimLen ) )
{
return 0 ;
}
v4 = monster [ v2 ] . MType - > mtype ;
if ( v4 < MT_INCIN | | v4 > MT_HELLBURN )
v5 = v3 & 0xFFFFFFFD | 1 ;
else
v5 = v3 & 0xFFFFFFFD ;
v6 = monster [ v2 ] . _mdir ;
monster [ v2 ] . _mFlags = v5 ;
M_StartStand ( v1 , v6 ) ;
return 1 ;
}
//----- (00435165) --------------------------------------------------------
int __fastcall M_DoHeal ( int i )
{
int v1 ; // esi
int v2 ; // eax
int v3 ; // esi
int * v4 ; // edx
int v5 ; // ecx
int v6 ; // edi
int v7 ; // edi
int v8 ; // esi
v1 = i ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " M_DoHeal: Invalid monster %d " , i ) ;
v2 = v1 ;
if ( monster [ v1 ] . _mFlags & 8 )
{
monster [ v2 ] . _mFlags & = 0xFFFFFFFB ;
monster [ v2 ] . _mmode = MM_SATTACK ;
}
else if ( monster [ v2 ] . _mAnimFrame = = 1 )
{
v3 = monster [ v2 ] . _mVar1 ;
v4 = & monster [ v2 ] . _mhitpoints ;
v5 = monster [ v2 ] . _mFlags & 0xFFFFFFFD | 4 ;
v6 = monster [ v2 ] . _mhitpoints ;
monster [ v2 ] . _mFlags = v5 ;
v7 = v3 + v6 ;
v8 = monster [ v2 ] . _mmaxhp ;
if ( v7 > = v8 )
{
* v4 = v8 ;
monster [ v2 ] . _mFlags = v5 & 0xFFFFFFFB ;
monster [ v2 ] . _mmode = MM_SATTACK ;
}
else
{
* v4 = v7 ;
}
}
return 0 ;
}
//----- (004351F5) --------------------------------------------------------
int __fastcall M_DoTalk ( int i )
{
int v1 ; // edi
int v2 ; // esi
//int v3; // eax
int v4 ; // eax
int v5 ; // edx
int v6 ; // ecx
char v7 ; // bl
int v8 ; // eax
char * v9 ; // eax
v1 = i ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " M_DoTalk: Invalid monster %d " , i ) ;
v2 = v1 ;
M_StartStand ( v1 , monster [ v1 ] . _mdir ) ;
_LOBYTE ( monster [ v1 ] . _mgoal ) = 7 ;
//_LOBYTE(v3) = effect_is_playing(alltext[monster[v1].mtalkmsg].sfxnr);
if ( ! effect_is_playing ( alltext [ monster [ v1 ] . mtalkmsg ] . sfxnr ) )
{
InitQTextMsg ( monster [ v2 ] . mtalkmsg ) ;
if ( monster [ v2 ] . mName = = UniqMonst [ 0 ] . mName )
{
v4 = monster [ v2 ] . mtalkmsg ;
if ( v4 = = QUEST_GARBUD1 )
quests [ 2 ] . _qactive = 2 ;
quests [ 2 ] . _qlog = 1 ;
if ( v4 = = QUEST_GARBUD2 & & ! ( monster [ v2 ] . _mFlags & 0x40 ) )
{
SpawnItem ( v1 , monster [ v2 ] . _mx + 1 , monster [ v2 ] . _my + 1 , 1u ) ;
monster [ v2 ] . _mFlags | = 0x40u ;
}
}
if ( monster [ v2 ] . mName = = UniqMonst [ 2 ] . mName
& & monster [ v2 ] . mtalkmsg = = QUEST_ZHAR1
& & ! ( monster [ v2 ] . _mFlags & 0x40 ) )
{
v5 = monster [ v2 ] . _my + 1 ;
v6 = monster [ v2 ] . _mx + 1 ;
quests [ 3 ] . _qactive = 2 ;
quests [ 3 ] . _qlog = 1 ;
CreateTypeItem ( v6 , v5 , 0 , 0 , 24 , 1 , 0 ) ;
monster [ v2 ] . _mFlags | = 0x40u ;
}
if ( monster [ v2 ] . mName = = UniqMonst [ 3 ] . mName )
{
if ( monster [ v2 ] . mtalkmsg = = QUEST_BANNER10 & & ! ( monster [ v2 ] . _mFlags & 0x40 ) )
{
ObjChangeMap ( setpc_x , setpc_y , ( setpc_w > > 1 ) + setpc_x + 2 , ( setpc_h > > 1 ) + setpc_y - 2 ) ;
v7 = TransVal ;
TransVal = 9 ;
DRLG_MRectTrans ( setpc_x , setpc_y , ( setpc_w > > 1 ) + setpc_x + 4 , setpc_y + ( setpc_h > > 1 ) ) ;
TransVal = v7 ;
quests [ 7 ] . _qvar1 = 2 ;
if ( quests [ 7 ] . _qactive = = 1 )
quests [ 7 ] . _qactive = 2 ;
monster [ v2 ] . _mFlags | = 0x40u ;
}
if ( quests [ 7 ] . _qvar1 < 2u )
{
sprintf ( tempstr , " SS Talk = %i, Flags = %i " , monster [ v2 ] . mtalkmsg , monster [ v2 ] . _mFlags ) ;
TermMsg ( tempstr ) ;
}
}
if ( monster [ v2 ] . mName = = UniqMonst [ 7 ] . mName )
{
v8 = monster [ v2 ] . mtalkmsg ;
if ( v8 = = QUEST_VEIL9 )
{
quests [ 4 ] . _qactive = 2 ;
quests [ 4 ] . _qlog = 1 ;
}
if ( v8 = = QUEST_VEIL11 & & ! ( monster [ v2 ] . _mFlags & 0x40 ) )
{
SpawnUnique ( UITEM_STEELVEIL , monster [ v2 ] . _mx + 1 , monster [ v2 ] . _my + 1 ) ;
monster [ v2 ] . _mFlags | = 0x40u ;
}
}
v9 = monster [ v2 ] . mName ;
if ( v9 = = UniqMonst [ 8 ] . mName )
quests [ 11 ] . _qvar1 = 2 ;
if ( v9 = = UniqMonst [ 4 ] . mName & & gbMaxPlayers ! = 1 )
{
_LOBYTE ( monster [ v2 ] . _msquelch ) = - 1 ;
monster [ v2 ] . mtalkmsg = 0 ;
quests [ 15 ] . _qvar1 = 6 ;
_LOBYTE ( monster [ v2 ] . _mgoal ) = 1 ;
}
}
return 0 ;
}
// 4351F5: could not find valid save-restore pair for ebp
// 5A5590: using guessed type char TransVal;
// 5CF330: using guessed type int setpc_h;
// 5CF334: using guessed type int setpc_w;
// 679660: using guessed type char gbMaxPlayers;
//----- (0043547A) --------------------------------------------------------
void __fastcall M_Teleport ( int i )
{
int v1 ; // ebx
//int v2; // ST04_4
MonsterStruct * v3 ; // esi
int v4 ; // eax
int v5 ; // ecx
int v6 ; // edi
int v7 ; // ebx
int v8 ; // eax
int v9 ; // [esp+Ch] [ebp-24h]
int v10 ; // [esp+10h] [ebp-20h]
int v11 ; // [esp+14h] [ebp-1Ch]
int v12 ; // [esp+18h] [ebp-18h]
int v13 ; // [esp+1Ch] [ebp-14h]
int a1 ; // [esp+20h] [ebp-10h]
signed int v15 ; // [esp+24h] [ebp-Ch]
signed int v16 ; // [esp+28h] [ebp-8h]
signed int v17 ; // [esp+2Ch] [ebp-4h]
v1 = i ;
a1 = i ;
if ( ( unsigned int ) i > = 0xC8 )
{
TermMsg ( " M_Teleport: Invalid monster %d " , i ) ;
//i = v2;
}
v15 = 0 ;
v3 = & monster [ v1 ] ;
if ( v3 - > _mmode ! = 15 )
{
v10 = ( unsigned char ) v3 - > _menemyx ;
_LOBYTE ( i ) = 100 ;
v12 = ( unsigned char ) v3 - > _menemyy ;
v4 = random ( i , 2 ) ;
_LOBYTE ( v5 ) = 100 ;
v11 = 2 * v4 - 1 ;
v17 = - 1 ;
v6 = 0 ; /* v9 */
v13 = 2 * random ( v5 , 2 ) - 1 ;
while ( ! v15 )
{
v16 = - 1 ;
v7 = v12 - v13 ;
do
{
if ( v15 )
break ;
if ( v17 | | v16 )
{
v9 = v7 ;
v6 = v10 + v11 * v17 ;
if ( v7 > = 0 & & v7 < 112 & & v6 > = 0 & & v6 < 112 & & v6 ! = v3 - > _mx & & v7 ! = v3 - > _my )
{
if ( PosOkMonst ( a1 , v10 + v11 * v17 , v7 ) )
v15 = 1 ;
}
}
+ + v16 ;
v7 + = v13 ;
}
while ( v16 < 1 ) ;
if ( + + v17 > 1 )
{
if ( ! v15 )
return ;
v1 = a1 ;
break ;
}
v1 = a1 ;
}
M_ClearSquares ( v1 ) ;
v8 = v3 - > _my + 112 * v3 - > _mx ;
v3 - > _moldx = v6 ;
dMonster [ 0 ] [ v8 ] = 0 ;
v3 - > _moldy = v9 ;
dMonster [ 0 ] [ v9 + 112 * v6 ] = v1 + 1 ;
v3 - > _mdir = M_GetDir ( v1 ) ;
M_CheckEFlag ( v1 ) ;
}
}
//----- (004355BB) --------------------------------------------------------
int __fastcall M_DoGotHit ( int i )
{
int v1 ; // edi
int v2 ; // esi
v1 = i ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " M_DoGotHit: Invalid monster %d " , i ) ;
v2 = v1 ;
if ( ! monster [ v1 ] . MType )
TermMsg ( " M_DoGotHit: Monster %d \" %s \" MType NULL " , v1 , monster [ v2 ] . mName ) ;
if ( monster [ v2 ] . _mAnimFrame ! = monster [ v2 ] . _mAnimLen )
return 0 ;
M_StartStand ( v1 , monster [ v2 ] . _mdir ) ;
return 1 ;
}
//----- (0043561E) --------------------------------------------------------
void __fastcall M_UpdateLeader ( int i )
{
int v1 ; // edi
int v2 ; // esi
int j ; // edx
int v4 ; // eax
unsigned char * v5 ; // eax
v1 = i ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " M_UpdateLeader: Invalid monster %d " , i ) ;
v2 = nummonsters ;
for ( j = 0 ; j < v2 ; + + j )
{
v4 = monstactive [ j ] ;
if ( monster [ v4 ] . leaderflag = = 1 & & ( unsigned char ) monster [ v4 ] . leader = = v1 )
monster [ v4 ] . leaderflag = 0 ;
}
if ( monster [ v1 ] . leaderflag = = 1 )
{
v5 = & monster [ ( unsigned char ) monster [ v1 ] . leader ] . unpackfilesize ;
- - * v5 ;
}
}
//----- (00435697) --------------------------------------------------------
void __cdecl DoEnding ( )
{
char v0 ; // al
char * v1 ; // ecx
char bMusicOn ; // bl
int v3 ; // esi
if ( ( unsigned char ) gbMaxPlayers > 1u )
SNetLeaveGame ( 0x40000004 ) ;
music_stop ( ) ;
if ( ( unsigned char ) gbMaxPlayers > 1u )
Sleep ( 1000 ) ;
v0 = plr [ myplr ] . _pClass ;
if ( v0 )
{
v1 = " gendata \\ DiabVic1.smk " ;
if ( v0 ! = 2 )
v1 = " gendata \\ DiabVic3.smk " ;
}
else
{
v1 = " gendata \\ DiabVic2.smk " ;
}
play_movie ( v1 , 0 ) ;
play_movie ( " gendata \\ Diabend.smk " , 0 ) ;
bMusicOn = gbMusicOn ;
gbMusicOn = 1 ;
v3 = sound_get_or_set_music_volume ( 1 ) ;
sound_get_or_set_music_volume ( 0 ) ;
music_start ( 2 ) ;
loop_movie = 1 ;
play_movie ( " gendata \\ loopdend.smk " , 1 ) ;
loop_movie = 0 ;
music_stop ( ) ;
sound_get_or_set_music_volume ( v3 ) ;
gbMusicOn = bMusicOn ;
}
// 4A22D4: using guessed type char gbMusicOn;
// 659AFC: using guessed type int loop_movie;
// 679660: using guessed type char gbMaxPlayers;
//----- (0043575C) --------------------------------------------------------
void __cdecl PrepDoEnding ( )
{
int * v0 ; // eax
int v1 ; // ecx
int * v2 ; // eax
bool v3 ; // cf
bool v4 ; // zf
gbSoundOn = sgbSaveSoundOn ;
gbRunGame = 0 ;
deathflag = 0 ;
v0 = & plr [ myplr ] . pDiabloKillLevel ;
v1 = gnDifficulty + 1 ;
cineflag = 1 ;
if ( * v0 > ( unsigned int ) ( gnDifficulty + 1 ) )
v1 = * v0 ;
* v0 = v1 ;
v2 = & plr [ 0 ] . _pHitPoints ;
do
{
v3 = ( unsigned char ) gbMaxPlayers < 1u ;
v4 = gbMaxPlayers = = 1 ;
* ( v2 - 102 ) = 11 ;
* ( ( _BYTE * ) v2 - 91 ) = 1 ;
if ( ! v3 & & ! v4 )
{
if ( ! ( * v2 & 0xFFFFFFC0 ) )
* v2 = 64 ;
if ( ! ( v2 [ 5 ] & 0xFFFFFFC0 ) )
v2 [ 5 ] = 64 ;
}
v2 + = 5430 ;
}
while ( ( signed int ) v2 < ( signed int ) & plr [ 4 ] . _pHitPoints ) ;
}
// 4A22D5: using guessed type char gbSoundOn;
// 525650: using guessed type int gbRunGame;
// 525718: using guessed type char cineflag;
// 64D32C: using guessed type int sgbSaveSoundOn;
// 679660: using guessed type char gbMaxPlayers;
//----- (004357DF) --------------------------------------------------------
int __fastcall M_DoDeath ( int i )
{
int v1 ; // edi
int v2 ; // esi
CMonster * v3 ; // ecx
int v4 ; // eax
int v5 ; // ecx
signed int v6 ; // ecx
int v7 ; // esi
int v8 ; // esi
signed int v9 ; // ecx
char v10 ; // al
int v11 ; // eax
v1 = i ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " M_DoDeath: Invalid monster %d " , i ) ;
v2 = v1 ;
if ( ! monster [ v1 ] . MType )
TermMsg ( " M_DoDeath: Monster %d \" %s \" MType NULL " , v1 , monster [ v2 ] . mName ) ;
v3 = monster [ v2 ] . MType ;
v4 = + + monster [ v2 ] . _mVar1 ;
if ( v3 - > mtype = = MT_DIABLO )
{
v5 = monster [ v2 ] . _mx - ViewX ;
if ( v5 > = 0 )
v6 = v5 > 0 ;
else
v6 = - 1 ;
v7 = monster [ v2 ] . _my ;
ViewX + = v6 ;
v8 = v7 - ViewY ;
if ( v8 > = 0 )
{
v9 = v8 < 0 ;
_LOBYTE ( v9 ) = v8 > 0 ;
}
else
{
v9 = - 1 ;
}
ViewY + = v9 ;
if ( v4 = = 140 )
PrepDoEnding ( ) ;
}
else if ( monster [ v2 ] . _mAnimFrame = = monster [ v2 ] . _mAnimLen )
{
if ( monster [ v2 ] . _uniqtype )
v10 = monster [ v2 ] . _udeadval ;
else
v10 = v3 - > mdeadval ;
AddDead ( monster [ v2 ] . _mx , monster [ v2 ] . _my , v10 , ( direction ) monster [ v2 ] . _mdir ) ;
v11 = monster [ v2 ] . _my + 112 * monster [ v2 ] . _mx ;
monster [ v2 ] . _mDelFlag = 1 ;
dMonster [ 0 ] [ v11 ] = 0 ;
M_UpdateLeader ( v1 ) ;
}
return 0 ;
}
//----- (004358EC) --------------------------------------------------------
int __fastcall M_DoSpStand ( int i )
{
int v1 ; // ebx
int v2 ; // esi
v1 = i ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " M_DoSpStand: Invalid monster %d " , i ) ;
v2 = v1 ;
if ( ! monster [ v1 ] . MType )
TermMsg ( " M_DoSpStand: Monster %d \" %s \" MType NULL " , v1 , monster [ v2 ] . mName ) ;
if ( monster [ v2 ] . _mAnimFrame = = monster [ v2 ] . MData - > mAFNum2 )
PlayEffect ( v1 , 3 ) ;
if ( monster [ v2 ] . _mAnimFrame ! = monster [ v2 ] . _mAnimLen )
return 0 ;
M_StartStand ( v1 , monster [ v2 ] . _mdir ) ;
return 1 ;
}
//----- (0043596B) --------------------------------------------------------
int __fastcall M_DoDelay ( int i )
{
int v1 ; // ebp
int v2 ; // esi
int v3 ; // eax
bool v4 ; // zf
int v5 ; // ecx
int v6 ; // ecx
int v7 ; // ebx
v1 = i ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " M_DoDelay: Invalid monster %d " , i ) ;
v2 = v1 ;
if ( ! monster [ v1 ] . MType )
TermMsg ( " M_DoDelay: Monster %d \" %s \" MType NULL " , v1 , monster [ v2 ] . mName ) ;
v3 = M_GetDir ( v1 ) ;
v4 = monster [ v2 ] . _mAi = = AI_LAZURUS ;
2018-06-10 23:10:21 +00:00
monster [ v2 ] . _mAFNum = monster [ v2 ] . MType - > Anims [ 0 ] . Frames [ v3 ] ;
2018-06-07 02:25:54 +00:00
if ( v4 )
{
v5 = monster [ v2 ] . _mVar2 ;
if ( v5 > 8 | | v5 < 0 )
monster [ v2 ] . _mVar2 = 8 ;
}
v6 = monster [ v2 ] . _mVar2 ;
monster [ v2 ] . _mVar2 = v6 - 1 ;
if ( v6 )
return 0 ;
v7 = monster [ v2 ] . _mAnimFrame ;
M_StartStand ( v1 , monster [ v2 ] . _mdir ) ;
monster [ v2 ] . _mAnimFrame = v7 ;
return 1 ;
}
//----- (00435A14) --------------------------------------------------------
int __fastcall M_DoStone ( int i )
{
int v1 ; // esi
int v2 ; // eax
int v3 ; // ecx
v1 = i ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " M_DoStone: Invalid monster %d " , i ) ;
v2 = v1 ;
if ( ! monster [ v1 ] . _mhitpoints )
{
v3 = monster [ v2 ] . _mx ;
monster [ v2 ] . _mDelFlag = 1 ;
dMonster [ 0 ] [ monster [ v2 ] . _my + 112 * v3 ] = 0 ;
}
return 0 ;
}
//----- (00435A62) --------------------------------------------------------
void __fastcall M_WalkDir ( int i , int md )
{
int v2 ; // esi
int v3 ; // edi
int v4 ; // eax
int v5 ; // eax
int v6 ; // edx
int v7 ; // ecx
int v8 ; // eax
int v9 ; // edx
int v10 ; // eax
int v11 ; // [esp-14h] [ebp-1Ch]
int v12 ; // [esp-Ch] [ebp-14h]
int v13 ; // [esp-Ch] [ebp-14h]
int v14 ; // [esp-8h] [ebp-10h]
int v15 ; // [esp-8h] [ebp-10h]
int v16 ; // [esp-4h] [ebp-Ch]
int v17 ; // [esp-4h] [ebp-Ch]
v2 = i ;
v3 = md ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " M_WalkDir: Invalid monster %d " , i ) ;
v4 = monster [ v2 ] . MType - > Anims [ 1 ] . Rate - 1 ;
switch ( v3 )
{
case DIR_S :
M_StartWalk2 ( v2 , 0 , MWVel [ v4 ] [ 1 ] , 0 , - 32 , 1 , 1 , 0 ) ;
return ;
case DIR_SW :
v17 = 1 ;
v8 = v4 ;
v15 = 1 ;
v13 = 0 ;
v11 = 32 ;
v9 = - MWVel [ v8 ] [ 1 ] ;
goto LABEL_10 ;
case DIR_W :
M_StartWalk3 ( v2 , - MWVel [ v4 ] [ 2 ] , 0 , 32 , - 16 , - 1 , 1 , 0 , 1 , 2 ) ;
return ;
case DIR_NW :
v16 = 3 ;
v10 = v4 ;
v14 = 0 ;
v12 = - 1 ;
v7 = - MWVel [ v10 ] [ 0 ] ;
v6 = - MWVel [ v10 ] [ 1 ] ;
goto LABEL_15 ;
case DIR_N :
M_StartWalk ( v2 , 0 , - MWVel [ v4 ] [ 1 ] , - 1 , - 1 , 4 ) ;
break ;
case DIR_NE :
v16 = 5 ;
v5 = v4 ;
v14 = - 1 ;
v12 = 0 ;
v6 = MWVel [ v5 ] [ 1 ] ;
v7 = - MWVel [ v5 ] [ 0 ] ;
LABEL_15 :
M_StartWalk ( v2 , v6 , v7 , v12 , v14 , v16 ) ;
break ;
case DIR_E :
M_StartWalk3 ( v2 , MWVel [ v4 ] [ 2 ] , 0 , - 32 , - 16 , 1 , - 1 , 1 , 0 , 6 ) ;
break ;
case DIR_SE :
v17 = 7 ;
v8 = v4 ;
v15 = 0 ;
v13 = 1 ;
v9 = MWVel [ v8 ] [ 1 ] ;
v11 = - 32 ;
LABEL_10 :
M_StartWalk2 ( v2 , v9 , MWVel [ v8 ] [ 0 ] , v11 , - 16 , v13 , v15 , v17 ) ;
break ;
default :
return ;
}
}
//----- (00435BB5) --------------------------------------------------------
void __fastcall GroupUnity ( int i )
{
int v1 ; // ebx
int v2 ; // esi
int v3 ; // ebp
int v4 ; // edi
bool v5 ; // eax
int v6 ; // eax
int v7 ; // ecx
unsigned char v8 ; // al
int v9 ; // ebp
int j ; // edi
int v11 ; // eax
int v12 ; // ecx
//int v13; // [esp+10h] [ebp-4h]
v1 = i ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " GroupUnity: Invalid monster %d " , i ) ;
v2 = v1 ;
if ( monster [ v1 ] . leaderflag )
{
v3 = ( unsigned char ) monster [ v2 ] . leader ;
v4 = v3 ;
v5 = LineClearF (
CheckNoSolid ,
monster [ v2 ] . _mx ,
monster [ v2 ] . _my ,
monster [ v4 ] . _mfutx ,
monster [ v4 ] . _mfuty ) ;
if ( v5 )
{
if ( monster [ v2 ] . leaderflag = = 2
& & abs ( monster [ v2 ] . _mx - monster [ v4 ] . _mfutx ) < 4
& & abs ( monster [ v2 ] . _my - monster [ v4 ] . _mfuty ) < 4 )
{
+ + monster [ v4 ] . unpackfilesize ;
monster [ v2 ] . leaderflag = 1 ;
}
}
else
{
if ( monster [ v2 ] . leaderflag ! = 1 )
goto LABEL_18 ;
- - monster [ v4 ] . unpackfilesize ;
monster [ v2 ] . leaderflag = 2 ;
}
}
else
{
v3 = 0 ; /* v13 */
}
if ( monster [ v2 ] . leaderflag = = 1 )
{
v6 = v3 ;
if ( _LOBYTE ( monster [ v2 ] . _msquelch ) > _LOBYTE ( monster [ v3 ] . _msquelch ) )
{
monster [ v6 ] . _lastx = monster [ v2 ] . _mx ;
monster [ v6 ] . _lasty = monster [ v2 ] . _my ;
_LOBYTE ( monster [ v6 ] . _msquelch ) = _LOBYTE ( monster [ v2 ] . _msquelch ) - 1 ;
}
if ( monster [ v6 ] . _mAi = = AI_GARG )
{
v7 = monster [ v6 ] . _mFlags ;
if ( v7 & 4 )
{
monster [ v6 ] . _mmode = MM_SATTACK ;
monster [ v6 ] . _mFlags = v7 & 0xFFFFFFFB ;
}
}
return ;
}
LABEL_18 :
v8 = monster [ v2 ] . _uniqtype ;
if ( v8 )
{
if ( UniqMonst [ v8 - 1 ] . mUnqAttr & 2 )
{
v9 = nummonsters ;
for ( j = 0 ; j < v9 ; + + j )
{
v11 = monstactive [ j ] ;
if ( monster [ v11 ] . leaderflag = = 1 & & ( unsigned char ) monster [ v11 ] . leader = = v1 )
{
if ( _LOBYTE ( monster [ v2 ] . _msquelch ) > _LOBYTE ( monster [ v11 ] . _msquelch ) )
{
monster [ v11 ] . _lastx = monster [ v2 ] . _mx ;
monster [ v11 ] . _lasty = monster [ v2 ] . _my ;
_LOBYTE ( monster [ v11 ] . _msquelch ) = _LOBYTE ( monster [ v2 ] . _msquelch ) - 1 ;
}
if ( monster [ v11 ] . _mAi = = AI_GARG )
{
v12 = monster [ v11 ] . _mFlags ;
if ( v12 & 4 )
{
monster [ v11 ] . _mmode = MM_SATTACK ;
monster [ v11 ] . _mFlags = v12 & 0xFFFFFFFB ;
}
}
}
}
}
}
}
//----- (00435DA8) --------------------------------------------------------
bool __fastcall M_CallWalk ( int i , int md )
{
int v2 ; // esi
int v3 ; // edi
int v4 ; // ebp
//int v5; // eax
int v6 ; // ecx
bool v7 ; // ebx
int v8 ; // ecx
int v9 ; // ebx
//int v10; // eax
int v11 ; // ebx
//int v12; // eax
//int v13; // eax
signed int v14 ; // ebx
//int v15; // eax
//int v16; // eax
//int v17; // eax
unsigned char v18 ; // bl
v2 = md ;
v3 = i ;
v4 = md ;
//_LOBYTE(v5) = DirOK(i, md);
_LOBYTE ( v6 ) = 101 ;
v7 = DirOK ( i , md ) ;
if ( random ( v6 , 2 ) )
{
if ( v7 )
goto LABEL_10 ;
v9 = v2 ;
v2 = left [ v2 ] ;
//_LOBYTE(v10) = DirOK(v3, v2);
if ( DirOK ( v3 , v2 ) )
goto LABEL_10 ;
v2 = right [ v9 ] ;
}
else
{
if ( v7 )
goto LABEL_10 ;
v11 = v2 ;
v2 = right [ v2 ] ;
//_LOBYTE(v12) = DirOK(v3, v2);
if ( DirOK ( v3 , v2 ) )
goto LABEL_10 ;
v2 = left [ v11 ] ;
}
//_LOBYTE(v13) = DirOK(v3, v2);
if ( ! DirOK ( v3 , v2 ) )
{
v14 = 0 ;
goto LABEL_11 ;
}
LABEL_10 :
v14 = 1 ;
LABEL_11 :
_LOBYTE ( v8 ) = 102 ;
if ( random ( v8 , 2 ) )
{
if ( v14 )
goto LABEL_20 ;
v2 = right [ right [ v4 ] ] ;
//_LOBYTE(v15) = DirOK(v3, v2);
if ( DirOK ( v3 , v2 ) )
goto LABEL_20 ;
v2 = left [ left [ v4 ] ] ;
}
else
{
if ( v14 )
goto LABEL_20 ;
v2 = left [ left [ v4 ] ] ;
//_LOBYTE(v16) = DirOK(v3, v2);
if ( DirOK ( v3 , v2 ) )
goto LABEL_20 ;
v2 = right [ right [ v4 ] ] ;
}
//_LOBYTE(v17) = DirOK(v3, v2);
if ( DirOK ( v3 , v2 ) )
{
LABEL_20 :
v18 = 1 ;
M_WalkDir ( v3 , v2 ) ;
return v18 ;
}
return 0 ;
}
//----- (00435EB5) --------------------------------------------------------
bool __fastcall M_PathWalk ( int i )
{
int v1 ; // esi
bool ( __fastcall * Check ) ( int , int , int ) ; // ecx
char path [ 25 ] ; // [esp+4h] [ebp-1Ch]
v1 = i ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " M_PathWalk: Invalid monster %d " , i ) ;
Check = PosOkMonst3 ;
if ( ! ( monster [ v1 ] . _mFlags & 0x200 ) )
Check = PosOkMonst ;
if ( ! FindPath (
Check ,
v1 ,
monster [ v1 ] . _mx ,
monster [ v1 ] . _my ,
( unsigned char ) monster [ v1 ] . _menemyx ,
( unsigned char ) monster [ v1 ] . _menemyy ,
path ) )
return 0 ;
M_CallWalk ( v1 , ( char ) plr2monst [ path [ 0 ] ] ) ; /* plr2monst is local */
return 1 ;
}
//----- (00435F35) --------------------------------------------------------
bool __fastcall M_CallWalk2 ( int i , int md )
{
int v2 ; // esi
int v3 ; // ebx
//int v4; // eax
int v5 ; // ecx
bool v6 ; // edi
int v7 ; // edi
//int v8; // eax
int v9 ; // edi
//int v10; // eax
//int v11; // eax
bool v12 ; // di
v2 = md ;
v3 = i ;
//_LOBYTE(v4) = DirOK(i, md);
_LOBYTE ( v5 ) = 101 ;
v6 = DirOK ( i , md ) ;
if ( random ( v5 , 2 ) )
{
if ( v6 )
goto LABEL_10 ;
v7 = v2 ;
v2 = left [ v2 ] ;
//_LOBYTE(v8) = DirOK(v3, v2);
if ( DirOK ( v3 , v2 ) )
goto LABEL_10 ;
v2 = right [ v7 ] ;
}
else
{
if ( v6 )
goto LABEL_10 ;
v9 = v2 ;
v2 = right [ v2 ] ;
//_LOBYTE(v10) = DirOK(v3, v2);
if ( DirOK ( v3 , v2 ) )
goto LABEL_10 ;
v2 = left [ v9 ] ;
}
//_LOBYTE(v11) = DirOK(v3, v2);
if ( DirOK ( v3 , v2 ) )
{
LABEL_10 :
v12 = 1 ;
M_WalkDir ( v3 , v2 ) ;
return v12 ;
}
return 0 ;
}
//----- (00435FBA) --------------------------------------------------------
bool __fastcall M_DumbWalk ( int i , int md )
{
int v2 ; // esi
int v3 ; // edi
//int v4; // eax
bool v5 ; // bl
v2 = md ;
v3 = i ;
//_LOBYTE(v4) = DirOK(i, md);
v5 = DirOK ( i , md ) ;
if ( v5 )
M_WalkDir ( v3 , v2 ) ;
return v5 ;
}
//----- (00435FDB) --------------------------------------------------------
bool __fastcall M_RoundWalk ( int i , int md , int * dir )
{
int * v3 ; // ebp
int v4 ; // ebx
int v5 ; // esi
//int v6; // eax
bool v7 ; // di
int v8 ; // edi
//int v9; // eax
//int v10; // eax
int * v11 ; // ebp
//int v12; // eax
//int v13; // eax
v3 = dir ;
v4 = i ;
if ( * dir )
v5 = left [ left [ md ] ] ;
else
v5 = right [ right [ md ] ] ;
//_LOBYTE(v6) = DirOK(i, v5);
v7 = DirOK ( i , v5 ) ;
if ( v7 )
goto LABEL_12 ;
v8 = v5 ;
if ( ! * dir )
{
v11 = & left [ v8 ] ;
v5 = left [ v8 ] ;
//_LOBYTE(v12) = DirOK(v4, left[v8]);
if ( DirOK ( v4 , left [ v8 ] ) )
goto LABEL_11 ;
v5 = left [ * v11 ] ;
//_LOBYTE(v13) = DirOK(v4, left[*v11]);
if ( DirOK ( v4 , left [ * v11 ] ) )
goto LABEL_11 ;
v3 = dir ;
LABEL_14 :
* v3 = * v3 = = 0 ;
return M_CallWalk ( v4 , opposite [ v8 ] ) ;
}
v5 = right [ v8 ] ;
//_LOBYTE(v9) = DirOK(v4, right[v8]);
if ( ! DirOK ( v4 , right [ v8 ] ) )
{
v5 = right [ right [ v8 ] ] ;
//_LOBYTE(v10) = DirOK(v4, v5);
if ( ! DirOK ( v4 , v5 ) )
goto LABEL_14 ;
}
LABEL_11 :
v7 = 1 ;
LABEL_12 :
M_WalkDir ( v4 , v5 ) ;
return v7 ;
}
//----- (004360B1) --------------------------------------------------------
void __fastcall MAI_Zombie ( int i )
{
int v1 ; // esi
//int v2; // ST04_4
MonsterStruct * v3 ; // esi
int v4 ; // edi
int v5 ; // ebx
int v6 ; // edi
int v7 ; // eax
int v8 ; // ecx
int v9 ; // eax
int v10 ; // eax
int v11 ; // eax
int v12 ; // ecx
int md ; // [esp+Ch] [ebp-Ch]
int v14 ; // [esp+10h] [ebp-8h]
int arglist ; // [esp+14h] [ebp-4h]
v1 = i ;
arglist = i ;
if ( ( unsigned int ) i > = 0xC8 )
{
TermMsg ( " MAI_Zombie: Invalid monster %d " , i ) ;
//i = v2;
}
v3 = & monster [ v1 ] ;
if ( v3 - > _mmode = = MM_STAND )
{
v4 = v3 - > _my ;
if ( dFlags [ v3 - > _mx ] [ v4 ] & 2 )
{
v5 = v3 - > _mx - ( unsigned char ) v3 - > _menemyx ;
v6 = v4 - ( unsigned char ) v3 - > _menemyy ;
_LOBYTE ( i ) = 103 ;
md = v3 - > _mdir ;
v14 = random ( i , 100 ) ;
if ( abs ( v5 ) > = 2 | | abs ( v6 ) > = 2 )
{
if ( v14 < 2 * ( unsigned char ) v3 - > _mint + 10 )
{
v7 = abs ( v5 ) ;
v8 = 2 * ( unsigned char ) v3 - > _mint + 4 ;
if ( v7 > = v8 | | ( v9 = abs ( v6 ) , v8 = 2 * ( unsigned char ) v3 - > _mint + 4 , v9 > = v8 ) )
{
_LOBYTE ( v8 ) = 104 ;
v11 = random ( v8 , 100 ) ;
v12 = 2 * ( unsigned char ) v3 - > _mint + 20 ;
if ( v11 < v12 )
{
_LOBYTE ( v12 ) = 104 ;
md = random ( v12 , 8 ) ;
}
M_DumbWalk ( arglist , md ) ;
}
else
{
v10 = M_GetDir ( arglist ) ;
M_CallWalk ( arglist , v10 ) ;
}
}
}
else if ( v14 < 2 * ( unsigned char ) v3 - > _mint + 10 )
{
M_StartAttack ( arglist ) ;
}
if ( v3 - > _mmode = = MM_STAND )
2018-06-10 23:10:21 +00:00
v3 - > _mAFNum = v3 - > MType - > Anims [ 0 ] . Frames [ v3 - > _mdir ] ;
2018-06-07 02:25:54 +00:00
}
}
}
//----- (004361F7) --------------------------------------------------------
void __fastcall MAI_SkelSd ( int i )
{
int v1 ; // esi
MonsterStruct * v2 ; // esi
int v3 ; // ecx
int v4 ; // edx
int v5 ; // edi
int v6 ; // ebp
int v7 ; // ebx
int v8 ; // eax
//int v9; // ST04_4
int v10 ; // ecx
int v11 ; // eax
//int v12; // ST04_4
int v13 ; // eax
int v14 ; // ecx
int v15 ; // edx
int v16 ; // eax
int v17 ; // ecx
int arglist ; // [esp+8h] [ebp-4h]
v1 = i ;
arglist = i ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " MAI_SkelSd: Invalid monster %d " , i ) ;
v2 = & monster [ v1 ] ;
if ( v2 - > _mmode = = MM_STAND & & _LOBYTE ( v2 - > _msquelch ) )
{
v3 = v2 - > _mx ;
v4 = v2 - > _my ;
v5 = v3 - ( unsigned char ) v2 - > _menemyx ;
v6 = v4 - ( unsigned char ) v2 - > _menemyy ;
v7 = GetDirection ( v3 , v4 , v2 - > _lastx , v2 - > _lasty ) ;
v2 - > _mdir = v7 ;
v8 = abs ( v5 ) ;
//v10 = v9;
if ( v8 > = 2 | | ( v11 = abs ( v6 ) , v11 > = 2 ) ) /* v10 = v12, */
{
if ( v2 - > _mVar1 ! = 13 )
{
_LOBYTE ( v10 ) = 106 ;
v16 = random ( v10 , 100 ) ;
v17 = 4 * ( unsigned char ) v2 - > _mint ;
if ( v16 < 35 - v17 )
{
_LOBYTE ( v17 ) = 106 ;
v15 = 15 - 2 * ( unsigned char ) v2 - > _mint + random ( v17 , 10 ) ;
goto LABEL_10 ;
}
}
M_CallWalk ( arglist , v7 ) ;
}
else
{
if ( v2 - > _mVar1 ! = 13 )
{
_LOBYTE ( v10 ) = 105 ;
v13 = random ( v10 , 100 ) ;
v14 = 2 * ( unsigned char ) v2 - > _mint + 20 ;
if ( v13 > = v14 )
{
_LOBYTE ( v14 ) = 105 ;
v15 = random ( v14 , 10 ) + 2 * ( 5 - ( unsigned char ) v2 - > _mint ) ;
LABEL_10 :
M_StartDelay ( arglist , v15 ) ;
goto LABEL_16 ;
}
}
M_StartAttack ( arglist ) ;
}
LABEL_16 :
if ( v2 - > _mmode = = MM_STAND )
2018-06-10 23:10:21 +00:00
v2 - > _mAFNum = v2 - > MType - > Anims [ 0 ] . Frames [ v7 ] ;
2018-06-07 02:25:54 +00:00
}
}
//----- (00436331) --------------------------------------------------------
bool __fastcall MAI_Path ( int i )
{
int v1 ; // edi
MonsterStruct * v2 ; // esi
char v3 ; // al
bool v4 ; // eax
unsigned char v5 ; // al
v1 = i ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " MAI_Path: Invalid monster %d " , i ) ;
v2 = & monster [ v1 ] ;
if ( v2 - > MType - > mtype ! = MT_GOLEM )
{
if ( ! _LOBYTE ( v2 - > _msquelch ) )
return 0 ;
if ( v2 - > _mmode )
return 0 ;
v3 = v2 - > _mgoal ;
if ( v3 ! = 1 & & v3 ! = 4 & & v3 ! = 5 )
return 0 ;
if ( v2 - > _mx = = 1 & & ! v2 - > _my )
return 0 ;
}
v4 = LineClearF1 (
PosOkMonst2 ,
v1 ,
v2 - > _mx ,
v2 - > _my ,
( unsigned char ) v2 - > _menemyx ,
( unsigned char ) v2 - > _menemyy ) ;
if ( ! v4 | | ( v5 = v2 - > _pathcount , v5 > = 5u ) & & v5 < 8u )
{
if ( v2 - > _mFlags & 0x200 )
MonstCheckDoors ( v1 ) ;
if ( + + _LOBYTE ( v2 - > _pathcount ) < 5u )
return 0 ;
if ( M_PathWalk ( v1 ) )
return 1 ;
}
if ( v2 - > MType - > mtype ! = MT_GOLEM )
_LOBYTE ( v2 - > _pathcount ) = 0 ;
return 0 ;
}
//----- (004363F9) --------------------------------------------------------
void __fastcall MAI_Snake ( int i )
{
int esi1 ; // esi
MonsterStruct * esi3 ; // esi
bool v3 ; // zf
int v4 ; // ecx
int v5 ; // eax
int v6 ; // ST1C_4
int v7 ; // edi
int v8 ; // edx
int v9 ; // ST18_4
int v10 ; // ebx
int v11 ; // eax
//int v12; // ST1C_4
int v13 ; // ecx
int v14 ; // eax
int v15 ; // eax
int v16 ; // ecx
int v17 ; // edx
int v18 ; // ecx
int v19 ; // eax
//int v20; // ST1C_4
int v21 ; // ecx
int v22 ; // eax
//int v23; // ST1C_4
int v24 ; // ebx
int v26 ; // ecx
int v27 ; // eax
int v28 ; // ecx
int v29 ; // ecx
int v30 ; // eax
int v31 ; // edx
int v32 ; // eax
int v33 ; // ecx
int v34 ; // ecx
int v35 ; // eax
char pattern [ 6 ] ; // [esp+4h] [ebp-1Ch]
int micaster ; // [esp+Ch] [ebp-14h]
int midir ; // [esp+10h] [ebp-10h]
int v1 ; // [esp+14h] [ebp-Ch]
int v2 ; // [esp+18h] [ebp-8h]
int arglist ; // [esp+1Ch] [ebp-4h]
esi1 = i ;
arglist = i ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " MAI_Snake: Invalid monster %d " , i ) ;
pattern [ 2 ] = 0 ;
pattern [ 3 ] = - 1 ;
pattern [ 4 ] = - 1 ;
pattern [ 5 ] = 0 ;
esi3 = & monster [ esi1 ] ;
pattern [ 0 ] = 1 ;
pattern [ 1 ] = 1 ;
v3 = esi3 - > _mmode = = 0 ;
micaster = esi3 - > _menemy ;
if ( v3 & & LOBYTE ( esi3 - > _msquelch ) )
{
v4 = esi3 - > _mx ;
v5 = ( unsigned char ) esi3 - > _menemyy ;
v6 = esi3 - > _lasty ;
v1 = ( unsigned char ) esi3 - > _menemyx ;
v7 = v4 - v1 ;
v8 = esi3 - > _my ;
v9 = esi3 - > _lastx ;
v2 = v5 ;
v10 = v8 - v5 ;
midir = GetDirection ( v4 , v8 , v9 , v6 ) ;
esi3 - > _mdir = midir ;
if ( abs ( v7 ) < 2 )
{
v11 = abs ( v10 ) ;
//v13 = v12;
if ( v11 < 2 )
{
v14 = esi3 - > _mVar1 ;
if ( v14 = = 13
| | v14 = = 14
| | ( _LOBYTE ( v13 ) = 105 , v15 = random ( v13 , 100 ) , v16 = ( unsigned char ) esi3 - > _mint + 20 , v15 < v16 ) )
{
M_StartAttack ( arglist ) ;
LABEL_49 :
if ( esi3 - > _mmode = = MM_STAND )
2018-06-10 23:10:21 +00:00
esi3 - > _mAFNum = esi3 - > MType - > Anims [ 0 ] . Frames [ esi3 - > _mdir ] ;
2018-06-07 02:25:54 +00:00
return ;
}
_LOBYTE ( v16 ) = 105 ;
v17 = 10 - ( unsigned char ) esi3 - > _mint + random ( v16 , 10 ) ;
v18 = arglist ;
LABEL_11 :
M_StartDelay ( v18 , v17 ) ;
goto LABEL_49 ;
}
}
v19 = abs ( v7 ) ;
//v21 = v20;
if ( v19 > = 3 | | ( v22 = abs ( v10 ) , v22 > = 3 ) ) /* v21 = v23, */
{
v24 = arglist ;
}
else
{
v24 = arglist ;
if ( LineClearF1 ( PosOkMonst , arglist , esi3 - > _mx , esi3 - > _my , v1 , v2 ) & & esi3 - > _mVar1 ! = 14 )
{
if ( AddMissile ( esi3 - > _mx , esi3 - > _my , v1 , v2 , midir , 20 , micaster , arglist , 0 , 0 ) ! = - 1 )
{
PlayEffect ( arglist , 0 ) ;
v26 = esi3 - > _my + 112 * esi3 - > _mx ;
esi3 - > _mmode = 14 ;
dMonster [ 0 ] [ v26 ] = - 1 - v24 ;
}
goto LABEL_49 ;
}
}
if ( esi3 - > _mVar1 ! = 13 )
{
_LOBYTE ( v21 ) = 106 ;
v27 = random ( v21 , 100 ) ;
v28 = 2 * ( unsigned char ) esi3 - > _mint ;
if ( v27 < 35 - v28 )
{
_LOBYTE ( v28 ) = 106 ;
v17 = 15 - ( unsigned char ) esi3 - > _mint + random ( v28 , 10 ) ;
v18 = v24 ;
goto LABEL_11 ;
}
}
v29 = esi3 - > _mgoalvar1 ;
v30 = midir + pattern [ v29 ] ;
if ( v30 > = 0 )
{
v31 = v30 - 8 ;
if ( v30 < 8 )
v31 = midir + pattern [ v29 ] ;
}
else
{
v31 = v30 + 8 ;
}
esi3 - > _mgoalvar1 = v29 + 1 ;
if ( v29 + 1 > 5 )
esi3 - > _mgoalvar1 = 0 ;
v32 = esi3 - > _mgoalvar2 ;
v33 = v31 - v32 ;
if ( v31 - v32 > = 0 )
{
if ( v33 > = 8 )
v33 - = 8 ;
}
else
{
v33 + = 8 ;
}
if ( v33 < = 0 )
{
LABEL_47 :
if ( ! M_DumbWalk ( v24 , esi3 - > _mgoalvar2 ) )
M_CallWalk2 ( v24 , esi3 - > _mdir ) ;
goto LABEL_49 ;
}
if ( v33 > = 4 )
{
if ( v33 = = 4 )
{
esi3 - > _mgoalvar2 = v31 ;
goto LABEL_47 ;
}
v34 = v32 - 1 ;
if ( v32 - 1 < 0 )
{
v35 = v32 + 7 ;
goto LABEL_46 ;
}
if ( v34 > = 8 )
{
v35 = v32 - 9 ;
goto LABEL_46 ;
}
}
else
{
v34 = v32 + 1 ;
if ( v32 + 1 < 0 )
{
v35 = v32 + 9 ;
LABEL_46 :
esi3 - > _mgoalvar2 = v35 ;
goto LABEL_47 ;
}
if ( v34 > = 8 )
{
v35 = v32 - 7 ;
goto LABEL_46 ;
}
}
v35 = v34 ;
goto LABEL_46 ;
}
}
//----- (0043668F) --------------------------------------------------------
void __fastcall MAI_Bat ( int i )
{
int esi1 ; // esi
MonsterStruct * esi3 ; // esi
int v3 ; // ecx
int v4 ; // edx
int v5 ; // edi
int v6 ; // ebx
int v7 ; // eax
int v8 ; // ecx
int v9 ; // ecx
int v10 ; // edx
bool v11 ; // eax
int v12 ; // ecx
int v13 ; // ecx
CMonster * v14 ; // eax
int v15 ; // edi
int v16 ; // eax
signed int v17 ; // ecx
int v18 ; // eax
int micaster ; // [esp+Ch] [ebp-18h]
int v1 ; // [esp+10h] [ebp-14h]
int v2 ; // [esp+14h] [ebp-10h]
int v22 ; // [esp+18h] [ebp-Ch]
int midir ; // [esp+1Ch] [ebp-8h]
int arglist ; // [esp+20h] [ebp-4h]
esi1 = i ;
arglist = i ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " MAI_Bat: Invalid monster %d " , i ) ;
esi3 = & monster [ esi1 ] ;
micaster = esi3 - > _menemy ;
if ( esi3 - > _mmode = = MM_STAND & & _LOBYTE ( esi3 - > _msquelch ) )
{
v3 = esi3 - > _mx ;
v4 = esi3 - > _my ;
v5 = v3 - ( unsigned char ) esi3 - > _menemyx ;
v6 = v4 - ( unsigned char ) esi3 - > _menemyy ;
v7 = GetDirection ( v3 , v4 , esi3 - > _lastx , esi3 - > _lasty ) ;
_LOBYTE ( v8 ) = 107 ;
midir = v7 ;
esi3 - > _mdir = v7 ;
v22 = random ( v8 , 100 ) ;
if ( _LOBYTE ( esi3 - > _mgoal ) = = 2 )
{
if ( esi3 - > _mgoalvar1 )
{
_LOBYTE ( v9 ) = 108 ;
if ( random ( v9 , 2 ) )
v10 = left [ midir ] ;
else
v10 = right [ midir ] ;
M_CallWalk ( arglist , v10 ) ;
_LOBYTE ( esi3 - > _mgoal ) = 1 ;
}
else
{
M_CallWalk ( arglist , opposite [ midir ] ) ;
+ + esi3 - > _mgoalvar1 ;
}
}
else
{
v1 = ( unsigned char ) esi3 - > _menemyx ;
v2 = ( unsigned char ) esi3 - > _menemyy ;
if ( esi3 - > MType - > mtype = = MT_GLOOM
& & ( abs ( v5 ) > = 5 | | abs ( v6 ) > = 5 )
& & v22 < 4 * ( unsigned char ) esi3 - > _mint + 33
& & ( v11 = LineClearF1 (
PosOkMonst ,
arglist ,
esi3 - > _mx ,
esi3 - > _my ,
v1 ,
v2 ) ,
v11 ) )
{
if ( AddMissile ( esi3 - > _mx , esi3 - > _my , v1 , v2 , midir , 20 , micaster , arglist , 0 , 0 ) ! = - 1 )
{
v12 = esi3 - > _my + 112 * esi3 - > _mx ;
esi3 - > _mmode = 14 ;
dMonster [ 0 ] [ v12 ] = - 1 - arglist ;
}
}
else if ( abs ( v5 ) > = 2 | | abs ( v6 ) > = 2 )
{
v17 = esi3 - > _mVar2 ;
if ( v17 > 20 & & v22 < ( unsigned char ) esi3 - > _mint + 13
| | ( ( v18 = esi3 - > _mVar1 , v18 = = 1 ) | | v18 = = 2 | | v18 = = 3 )
& & ! v17
& & v22 < ( unsigned char ) esi3 - > _mint + 63 )
{
M_CallWalk ( arglist , midir ) ;
}
}
else if ( v22 < 4 * ( unsigned char ) esi3 - > _mint + 8 )
{
M_StartAttack ( arglist ) ;
v14 = esi3 - > MType ;
esi3 - > _mgoalvar1 = 0 ;
_LOBYTE ( esi3 - > _mgoal ) = 2 ;
if ( v14 - > mtype = = 41 )
{
v15 = ( unsigned char ) esi3 - > _menemyx ;
_LOBYTE ( v13 ) = 109 ;
v16 = random ( v13 , 10 ) ;
AddMissile ( v15 , ( unsigned char ) esi3 - > _menemyy , v15 + 1 , 0 , - 1 , 8 , 1 , arglist , v16 + 1 , 0 ) ;
}
}
if ( esi3 - > _mmode = = MM_STAND )
2018-06-10 23:10:21 +00:00
esi3 - > _mAFNum = esi3 - > MType - > Anims [ 0 ] . Frames [ midir ] ;
2018-06-07 02:25:54 +00:00
}
}
}
//----- (004368F7) --------------------------------------------------------
void __fastcall MAI_SkelBow ( int i )
{
int v1 ; // esi
MonsterStruct * v2 ; // esi
int v3 ; // edi
int v4 ; // ebx
int v5 ; // eax
int v6 ; // ecx
int v7 ; // eax
//int v8; // ST04_4
int v9 ; // ecx
int v10 ; // eax
//int v11; // ST04_4
int v12 ; // eax
//int v13; // eax
int v14 ; // edi
int v15 ; // ebx
//int v16; // eax
int v17 ; // [esp+4h] [ebp-10h]
bool v18 ; // [esp+8h] [ebp-Ch]
int v19 ; // [esp+Ch] [ebp-8h]
int arglist ; // [esp+10h] [ebp-4h]
v18 = 0 ;
v1 = i ;
arglist = i ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " MAI_SkelBow: Invalid monster %d " , i ) ;
v2 = & monster [ v1 ] ;
if ( v2 - > _mmode = = MM_STAND & & _LOBYTE ( v2 - > _msquelch ) )
{
v3 = v2 - > _mx - ( unsigned char ) v2 - > _menemyx ;
v4 = v2 - > _my - ( unsigned char ) v2 - > _menemyy ;
v5 = M_GetDir ( arglist ) ;
_LOBYTE ( v6 ) = 110 ;
v17 = v5 ;
v2 - > _mdir = v5 ;
v19 = random ( v6 , 100 ) ;
v7 = abs ( v3 ) ;
//v9 = v8;
if ( v7 < 4 )
{
v10 = abs ( v4 ) ;
//v9 = v11;
if ( v10 < 4 )
{
if ( ( v9 = v2 - > _mVar2 , v9 > 20 ) & & v19 < 2 * ( unsigned char ) v2 - > _mint + 13
| | ( ( v12 = v2 - > _mVar1 , v12 = = 1 ) | | v12 = = 2 | | v12 = = 3 )
& & ! v9
& & v19 < 2 * ( unsigned char ) v2 - > _mint + 63 )
{
//_LOBYTE(v13) = M_DumbWalk(arglist, opposite[v17]);
v18 = M_DumbWalk ( arglist , opposite [ v17 ] ) ;
}
}
}
v14 = ( unsigned char ) v2 - > _menemyx ;
v15 = ( unsigned char ) v2 - > _menemyy ;
if ( ! v18 )
{
_LOBYTE ( v9 ) = 110 ;
if ( random ( v9 , 100 ) < 2 * ( unsigned char ) v2 - > _mint + 3 )
{
//_LOBYTE(v16) = LineClear(v2->_mx, v2->_my, v14, v15);
if ( LineClear ( v2 - > _mx , v2 - > _my , v14 , v15 ) )
M_StartRAttack ( arglist , 0 , 4 ) ;
}
}
if ( v2 - > _mmode = = MM_STAND )
2018-06-10 23:10:21 +00:00
v2 - > _mAFNum = v2 - > MType - > Anims [ 0 ] . Frames [ v17 ] ;
2018-06-07 02:25:54 +00:00
}
}
//----- (00436A38) --------------------------------------------------------
void __fastcall MAI_Fat ( int i )
{
int v1 ; // esi
MonsterStruct * v2 ; // esi
int v3 ; // edi
int v4 ; // ebx
int v5 ; // eax
int v6 ; // ecx
int v7 ; // eax
signed int v8 ; // ecx
int v9 ; // eax
int md ; // [esp+4h] [ebp-Ch]
int arglist ; // [esp+8h] [ebp-8h]
int v12 ; // [esp+Ch] [ebp-4h]
v1 = i ;
arglist = i ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " MAI_Fat: Invalid monster %d " , i ) ;
v2 = & monster [ v1 ] ;
if ( v2 - > _mmode = = MM_STAND & & _LOBYTE ( v2 - > _msquelch ) )
{
v3 = v2 - > _mx - ( unsigned char ) v2 - > _menemyx ;
v4 = v2 - > _my - ( unsigned char ) v2 - > _menemyy ;
v5 = M_GetDir ( arglist ) ;
_LOBYTE ( v6 ) = 111 ;
md = v5 ;
v2 - > _mdir = v5 ;
v12 = random ( v6 , 100 ) ;
if ( abs ( v3 ) > = 2 | | abs ( v4 ) > = 2 )
{
v8 = v2 - > _mVar2 ;
if ( v8 > 20 & & v12 < 4 * ( unsigned char ) v2 - > _mint + 20
| | ( ( v9 = v2 - > _mVar1 , v9 = = 1 ) | | v9 = = 2 | | v9 = = 3 ) & & ! v8 & & v12 < 4 * ( unsigned char ) v2 - > _mint + 70 )
{
M_CallWalk ( arglist , md ) ;
}
}
else
{
v7 = ( unsigned char ) v2 - > _mint ;
if ( v12 > = 4 * v7 + 15 )
{
if ( v12 < 4 * v7 + 20 )
M_StartSpAttack ( arglist ) ;
}
else
{
M_StartAttack ( arglist ) ;
}
}
if ( v2 - > _mmode = = MM_STAND )
2018-06-10 23:10:21 +00:00
v2 - > _mAFNum = v2 - > MType - > Anims [ 0 ] . Frames [ md ] ;
2018-06-07 02:25:54 +00:00
}
}
//----- (00436B60) --------------------------------------------------------
void __fastcall MAI_Sneak ( int i )
{
int v1 ; // edi
MonsterStruct * v2 ; // esi
int v3 ; // ebx
int v4 ; // ebx
int v5 ; // ecx
int v6 ; // edi
int v7 ; // eax
//int v8; // ST04_4
int v9 ; // eax
//int v10; // ST04_4
int v11 ; // eax
int v12 ; // edi
signed int v13 ; // ecx
int v14 ; // eax
int v15 ; // [esp+Ch] [ebp-10h]
int arglist ; // [esp+10h] [ebp-Ch]
int v17 ; // [esp+14h] [ebp-8h]
int md ; // [esp+18h] [ebp-4h]
v1 = i ;
arglist = i ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " MAI_Sneak: Invalid monster %d " , i ) ;
v2 = & monster [ v1 ] ;
if ( v2 - > _mmode = = MM_STAND )
{
v3 = v2 - > _my ;
if ( dTransVal [ v2 - > _mx ] [ v3 ] ! = lightmax )
{
v17 = v2 - > _mx - ( unsigned char ) v2 - > _menemyx ;
v4 = v3 - ( unsigned char ) v2 - > _menemyy ;
md = M_GetDir ( v1 ) ;
v6 = 5 - ( unsigned char ) v2 - > _mint ;
if ( v2 - > _mVar1 = = 5 )
{
v2 - > _mgoalvar1 = 0 ;
_LOBYTE ( v2 - > _mgoal ) = 2 ;
}
else
{
v7 = abs ( v17 ) ;
//v5 = v8;
if ( v7 > = v6 + 3 | | ( v9 = abs ( v4 ) , v9 > = v6 + 3 ) | | v2 - > _mgoalvar1 > 8 ) /* v5 = v10, */
{
v2 - > _mgoalvar1 = 0 ;
_LOBYTE ( v2 - > _mgoal ) = 1 ;
}
}
if ( _LOBYTE ( v2 - > _mgoal ) = = 2 )
{
if ( v2 - > _mFlags & 0x10 )
md = GetDirection ( v2 - > _mx , v2 - > _my , plr [ v2 - > _menemy ] . _pownerx , plr [ v2 - > _menemy ] . _pownery ) ;
md = opposite [ md ] ;
if ( v2 - > MType - > mtype = = MT_UNSEEN )
{
_LOBYTE ( v5 ) = 112 ;
if ( random ( v5 , 2 ) )
v11 = left [ md ] ;
else
v11 = right [ md ] ;
md = v11 ;
}
}
_LOBYTE ( v5 ) = 112 ;
v2 - > _mdir = md ;
v15 = random ( v5 , 100 ) ;
if ( abs ( v17 ) < v6 & & abs ( v4 ) < v6 & & v2 - > _mFlags & 1 )
{
M_StartFadein ( arglist , md , 0 ) ;
}
else
{
v12 = v6 + 1 ;
if ( abs ( v17 ) < v12 & & abs ( v4 ) < v12 | | v2 - > _mFlags & 1 )
{
if ( _LOBYTE ( v2 - > _mgoal ) = = 2
| | ( abs ( v17 ) > = 2 | | abs ( v4 ) > = 2 )
& & ( ( v13 = v2 - > _mVar2 , v13 > 20 ) & & v15 < 4 * ( unsigned char ) v2 - > _mint + 14
| | ( ( v14 = v2 - > _mVar1 , v14 = = 1 ) | | v14 = = 2 | | v14 = = 3 )
& & ! v13
& & v15 < 4 * ( unsigned char ) v2 - > _mint + 64 ) )
{
+ + v2 - > _mgoalvar1 ;
M_CallWalk ( arglist , md ) ;
}
}
else
{
M_StartFadeout ( arglist , md , 1u ) ;
}
}
if ( v2 - > _mmode = = MM_STAND )
{
if ( abs ( v17 ) > = 2 | | abs ( v4 ) > = 2 | | v15 > = 4 * ( unsigned char ) v2 - > _mint + 10 )
2018-06-10 23:10:21 +00:00
v2 - > _mAFNum = v2 - > MType - > Anims [ 0 ] . Frames [ md ] ;
2018-06-07 02:25:54 +00:00
else
M_StartAttack ( arglist ) ;
}
}
}
}
// 642A14: using guessed type char lightmax;
//----- (00436DC8) --------------------------------------------------------
void __fastcall MAI_Fireman ( int i )
{
int esi1 ; // esi
int esi3 ; // esi
int v3 ; // ecx
int v4 ; // eax
int v5 ; // ebx
int v6 ; // edi
int v7 ; // edx
int v8 ; // ecx
char v9 ; // al
//int v10; // eax
//int v11; // eax
int v12 ; // ecx
int v13 ; // eax
//int v14; // eax
int v15 ; // edx
//int v16; // eax
int v17 ; // eax
int micaster ; // [esp+Ch] [ebp-14h]
int v1 ; // [esp+10h] [ebp-10h]
int v2 ; // [esp+14h] [ebp-Ch]
int midir ; // [esp+18h] [ebp-8h]
int arglist ; // [esp+1Ch] [ebp-4h]
esi1 = i ;
arglist = i ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " MAI_Fireman: Invalid monster %d " , i ) ;
esi3 = esi1 ;
if ( monster [ esi3 ] . _mmode | | ! _LOBYTE ( monster [ esi3 ] . _msquelch ) )
return ;
v3 = ( unsigned char ) monster [ esi3 ] . _menemyy ;
micaster = monster [ esi3 ] . _menemy ;
v4 = ( unsigned char ) monster [ esi3 ] . _menemyx ;
v2 = v3 ;
v5 = monster [ esi3 ] . _my - v3 ;
v1 = v4 ;
v6 = monster [ esi3 ] . _mx - v4 ;
v7 = M_GetDir ( arglist ) ;
v9 = monster [ esi3 ] . _mgoal ;
midir = v7 ;
switch ( v9 )
{
case 1 :
//_LOBYTE(v10) = LineClear(monster[esi3]._mx, monster[esi3]._my, v1, v2);
if ( ! LineClear ( monster [ esi3 ] . _mx , monster [ esi3 ] . _my , v1 , v2 )
| | AddMissile ( monster [ esi3 ] . _mx , monster [ esi3 ] . _my , v1 , v2 , midir , 50 , micaster , arglist , 0 , 0 ) = = - 1 )
{
break ;
}
monster [ esi3 ] . _mgoalvar1 = 0 ;
monster [ esi3 ] . _mmode = MM_CHARGE ;
goto LABEL_18 ;
case 5 :
if ( monster [ esi3 ] . _mgoalvar1 = = 3 )
{
_LOBYTE ( monster [ esi3 ] . _mgoal ) = 1 ;
M_StartFadeout ( arglist , v7 , 1u ) ;
}
else
{
//_LOBYTE(v11) = LineClear(monster[esi3]._mx, monster[esi3]._my, v1, v2);
if ( LineClear ( monster [ esi3 ] . _mx , monster [ esi3 ] . _my , v1 , v2 ) )
{
M_StartRAttack ( arglist , 51 , 4 ) ;
}
else
{
_LOBYTE ( v12 ) = 112 ;
v13 = random ( v12 , 10 ) ;
M_StartDelay ( arglist , v13 + 5 ) ;
}
+ + monster [ esi3 ] . _mgoalvar1 ;
}
break ;
case 2 :
M_StartFadein ( arglist , v7 , 0 ) ;
LABEL_18 :
_LOBYTE ( monster [ esi3 ] . _mgoal ) = 5 ;
break ;
}
_LOBYTE ( v8 ) = 112 ;
monster [ esi3 ] . _mdir = midir ;
random ( v8 , 100 ) ;
if ( monster [ esi3 ] . _mmode )
return ;
if ( abs ( v6 ) < 2 & & abs ( v5 ) < 2 & & _LOBYTE ( monster [ esi3 ] . _mgoal ) = = 1 )
{
M_TryH2HHit (
arglist ,
monster [ esi3 ] . _menemy ,
( unsigned char ) monster [ esi3 ] . mHit ,
( unsigned char ) monster [ esi3 ] . mMinDamage ,
( unsigned char ) monster [ esi3 ] . mMaxDamage ) ;
_LOBYTE ( monster [ esi3 ] . _mgoal ) = 2 ;
//_LOBYTE(v14) = M_CallWalk(arglist, opposite[midir]);
if ( M_CallWalk ( arglist , opposite [ midir ] ) )
return ;
v15 = midir ;
goto LABEL_29 ;
}
//_LOBYTE(v16) = M_CallWalk(arglist, midir);
if ( ! M_CallWalk ( arglist , midir ) )
{
v17 = _LOBYTE ( monster [ esi3 ] . _mgoal ) ;
if ( ( _BYTE ) v17 = = 1 | | ( _BYTE ) v17 = = 2 )
{
v15 = midir ;
LABEL_29 :
M_StartFadein ( arglist , v15 , 0 ) ;
_LOBYTE ( monster [ esi3 ] . _mgoal ) = 5 ;
return ;
}
}
}
//----- (00436FEC) --------------------------------------------------------
void __fastcall MAI_Fallen ( int i )
{
int v1 ; // edi
//int v2; // ST04_4
int v3 ; // esi
int v4 ; // eax
int v5 ; // ecx
int * v6 ; // eax
int v7 ; // edx
int v8 ; // edx
int j ; // edi
int k ; // ecx
int v11 ; // eax
int v12 ; // eax
char v13 ; // al
int v14 ; // edx
int v15 ; // eax
int v16 ; // esi
v1 = i ;
if ( ( unsigned int ) i > = 0xC8 )
{
TermMsg ( " MAI_Fallen: Invalid monster %d " , i ) ;
//i = v2;
}
v3 = v1 ;
if ( _LOBYTE ( monster [ v1 ] . _mgoal ) = = 5 )
{
i = monster [ v3 ] . _mgoalvar1 ;
if ( i )
monster [ v3 ] . _mgoalvar1 = - - i ;
else
_LOBYTE ( monster [ v3 ] . _mgoal ) = 1 ;
}
if ( monster [ v3 ] . _mmode = = MM_STAND & & _LOBYTE ( monster [ v3 ] . _msquelch ) )
{
if ( _LOBYTE ( monster [ v3 ] . _mgoal ) = = 2 )
{
i = monster [ v3 ] . _mgoalvar1 ;
monster [ v3 ] . _mgoalvar1 = i - 1 ;
if ( ! i )
{
v4 = monster [ v3 ] . _mdir ;
_LOBYTE ( monster [ v3 ] . _mgoal ) = 1 ;
M_StartStand ( v1 , opposite [ v4 ] ) ;
}
}
if ( monster [ v3 ] . _mAnimFrame ! = monster [ v3 ] . _mAnimLen )
{
v13 = monster [ v3 ] . _mgoal ;
if ( v13 = = 2 )
{
v14 = monster [ v3 ] . _mdir ;
}
else
{
if ( v13 ! = 5 )
{
MAI_SkelSd ( v1 ) ;
return ;
}
v15 = monster [ v3 ] . _mx - ( unsigned char ) monster [ v3 ] . _menemyx ;
v16 = monster [ v3 ] . _my - ( unsigned char ) monster [ v3 ] . _menemyy ;
if ( abs ( v15 ) < 2 & & abs ( v16 ) < 2 )
{
M_StartAttack ( v1 ) ;
return ;
}
v14 = M_GetDir ( v1 ) ;
}
M_CallWalk ( v1 , v14 ) ;
return ;
}
_LOBYTE ( i ) = 113 ;
if ( ! random ( i , 4 ) )
{
if ( ! ( monster [ v3 ] . _mFlags & 8 ) )
{
M_StartSpStand ( v1 , monster [ v3 ] . _mdir ) ;
v5 = 2 * ( unsigned char ) monster [ v3 ] . _mint + 2 ;
v6 = & monster [ v3 ] . _mhitpoints ;
v7 = monster [ v3 ] . _mhitpoints ;
if ( monster [ v3 ] . _mmaxhp - v5 < v7 )
* v6 = monster [ v3 ] . _mmaxhp ;
else
* v6 = v5 + v7 ;
}
v8 = 2 * ( unsigned char ) monster [ v3 ] . _mint + 4 ;
for ( j = - v8 ; j < = v8 ; + + j )
{
for ( k = - v8 ; k < = v8 ; + + k )
{
if ( j > = 0 & & j < 112 & & k > = 0 & & k < 112 )
{
v11 = dMonster [ 0 ] [ j + monster [ v3 ] . _my + 112 * ( k + monster [ v3 ] . _mx ) ] ;
if ( v11 > 0 )
{
v12 = v11 - 1 ;
if ( monster [ v12 ] . _mAi = = AI_FALLEN )
{
_LOBYTE ( monster [ v12 ] . _mgoal ) = 5 ;
monster [ v12 ] . _mgoalvar1 = 30 * ( unsigned char ) monster [ v3 ] . _mint + 105 ;
}
}
}
}
}
}
}
}
//----- (004371D7) --------------------------------------------------------
void __fastcall MAI_Cleaver ( int i )
{
int v1 ; // esi
MonsterStruct * v2 ; // esi
int v3 ; // ecx
int v4 ; // edx
int v5 ; // edi
int v6 ; // ebp
int v7 ; // ebx
int arglist ; // [esp+8h] [ebp-4h]
v1 = i ;
arglist = i ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " MAI_Cleaver: Invalid monster %d " , i ) ;
v2 = & monster [ v1 ] ;
if ( v2 - > _mmode = = MM_STAND & & _LOBYTE ( v2 - > _msquelch ) )
{
v3 = v2 - > _mx ;
v4 = v2 - > _my ;
v5 = v3 - ( unsigned char ) v2 - > _menemyx ;
v6 = v4 - ( unsigned char ) v2 - > _menemyy ;
v7 = GetDirection ( v3 , v4 , v2 - > _lastx , v2 - > _lasty ) ;
v2 - > _mdir = v7 ;
if ( abs ( v5 ) > = 2 | | abs ( v6 ) > = 2 )
M_CallWalk ( arglist , v7 ) ;
else
M_StartAttack ( arglist ) ;
if ( v2 - > _mmode = = MM_STAND )
2018-06-10 23:10:21 +00:00
v2 - > _mAFNum = v2 - > MType - > Anims [ 0 ] . Frames [ v7 ] ;
2018-06-07 02:25:54 +00:00
}
}
//----- (00437285) --------------------------------------------------------
void __fastcall MAI_Round ( int i , unsigned char special )
{
int v2 ; // esi
MonsterStruct * v3 ; // esi
int v4 ; // edx
int v5 ; // ecx
int v6 ; // edi
int v7 ; // ebx
int v8 ; // ecx
int v9 ; // eax
//int v10; // ST04_4
int v11 ; // ecx
int v12 ; // eax
//int v13; // ST04_4
int v14 ; // ecx
int v15 ; // edi
int v16 ; // eax
int v17 ; // ecx
bool v18 ; // eax
//int v19; // eax
int v20 ; // ecx
int v21 ; // eax
int v22 ; // eax
//int v23; // ST04_4
int v24 ; // ecx
signed int v25 ; // ecx
int v26 ; // eax
int v27 ; // [esp+4h] [ebp-18h]
int v28 ; // [esp+8h] [ebp-14h]
char * v29 ; // [esp+8h] [ebp-14h]
int v30 ; // [esp+Ch] [ebp-10h]
int md ; // [esp+10h] [ebp-Ch]
int v32 ; // [esp+14h] [ebp-8h]
int arglist ; // [esp+18h] [ebp-4h]
v2 = i ;
v27 = special ;
arglist = i ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " MAI_Round: Invalid monster %d " , i ) ;
v3 = & monster [ v2 ] ;
if ( v3 - > _mmode = = MM_STAND & & _LOBYTE ( v3 - > _msquelch ) )
{
v4 = v3 - > _my ;
v5 = v3 - > _mx ;
v28 = ( unsigned char ) v3 - > _menemyy ;
v6 = ( unsigned char ) v3 - > _menemyx ;
v7 = v5 - v6 ;
v32 = v4 - v28 ;
md = GetDirection ( v5 , v4 , v3 - > _lastx , v3 - > _lasty ) ;
if ( _LOBYTE ( v3 - > _msquelch ) < 0xFFu )
MonstCheckDoors ( arglist ) ;
_LOBYTE ( v8 ) = 114 ;
v30 = random ( v8 , 100 ) ;
if ( ( abs ( v7 ) > = 2 | | abs ( v32 ) > = 2 ) & & _LOBYTE ( v3 - > _msquelch ) = = - 1 )
{
v29 = & dung_map [ v6 ] [ v28 ] ;
if ( dung_map [ v3 - > _mx ] [ v3 - > _my ] = = * v29 )
{
if ( _LOBYTE ( v3 - > _mgoal ) ! = 4 )
{
v9 = abs ( v7 ) ;
//v11 = v10;
if ( v9 < 4 )
{
v12 = abs ( v32 ) ;
//v11 = v13;
if ( v12 < 4 )
goto LABEL_26 ;
}
_LOBYTE ( v11 ) = 115 ;
if ( random ( v11 , 4 ) )
goto LABEL_26 ;
if ( _LOBYTE ( v3 - > _mgoal ) ! = 4 )
{
v3 - > _mgoalvar1 = 0 ;
_LOBYTE ( v14 ) = 116 ;
v3 - > _mgoalvar2 = random ( v14 , 2 ) ;
}
}
_LOBYTE ( v3 - > _mgoal ) = 4 ;
v15 = abs ( v32 ) ;
if ( abs ( v7 ) < = v15 )
v16 = abs ( v32 ) ;
else
v16 = abs ( v7 ) ;
v17 = v3 - > _mgoalvar1 ;
v3 - > _mgoalvar1 = v17 + 1 ;
if ( v17 < 2 * v16 | | ( v18 = DirOK ( arglist , md ) , ! v18 ) )
{
if ( dung_map [ v3 - > _mx ] [ v3 - > _my ] = = * v29 )
{
//_LOBYTE(v19) = M_RoundWalk(arglist, md, &v3->_mgoalvar2);
if ( ! M_RoundWalk ( arglist , md , & v3 - > _mgoalvar2 ) )
{
_LOBYTE ( v20 ) = 125 ;
v21 = random ( v20 , 10 ) ;
M_StartDelay ( arglist , v21 + 10 ) ;
}
goto LABEL_26 ;
}
}
}
}
_LOBYTE ( v3 - > _mgoal ) = 1 ;
LABEL_26 :
if ( _LOBYTE ( v3 - > _mgoal ) = = 1 )
{
if ( abs ( v7 ) > = 2 | | ( v22 = abs ( v32 ) , v22 > = 2 ) ) /* v24 = v23, */
{
v25 = v3 - > _mVar2 ;
if ( v25 > 20 & & v30 < 2 * ( unsigned char ) v3 - > _mint + 28
| | ( ( v26 = v3 - > _mVar1 , v26 = = 1 ) | | v26 = = 2 | | v26 = = 3 )
& & ! v25
& & v30 < 2 * ( unsigned char ) v3 - > _mint + 78 )
{
M_CallWalk ( arglist , md ) ;
}
}
else if ( v30 < 2 * ( unsigned char ) v3 - > _mint + 23 )
{
v3 - > _mdir = md ;
if ( v27 & & v3 - > _mhitpoints < v3 - > _mmaxhp > > 1 & & ( _LOBYTE ( v24 ) = 117 , random ( v24 , 2 ) ) )
M_StartSpAttack ( arglist ) ;
else
M_StartAttack ( arglist ) ;
}
}
if ( v3 - > _mmode = = MM_STAND )
2018-06-10 23:10:21 +00:00
v3 - > _mAFNum = v3 - > MType - > Anims [ 0 ] . Frames [ md ] ;
2018-06-07 02:25:54 +00:00
}
}
//----- (00437520) --------------------------------------------------------
void __fastcall MAI_GoatMc ( int i )
{
MAI_Round ( i , 1u ) ;
}
//----- (00437528) --------------------------------------------------------
void __fastcall MAI_Ranged ( int i , int missile_type , unsigned char special )
{
int v3 ; // edi
int v4 ; // esi
char v5 ; // al
int v6 ; // eax
int v7 ; // ecx
int v8 ; // ebx
int v9 ; // edi
int v10 ; // ecx
bool v11 ; // zf
int v12 ; // eax
int v13 ; // eax
//int v14; // ST00_4
int v15 ; // ecx
//int v16; // eax
int x2 ; // [esp+8h] [ebp-14h]
int y2 ; // [esp+Ch] [ebp-10h]
int missile_typea ; // [esp+10h] [ebp-Ch]
int v20 ; // [esp+14h] [ebp-8h]
int arglist ; // [esp+18h] [ebp-4h]
v3 = i ;
missile_typea = missile_type ;
arglist = i ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " MAI_Ranged: Invalid monster %d " , i ) ;
v4 = v3 ;
if ( monster [ v3 ] . _mmode = = MM_STAND )
{
v5 = monster [ v4 ] . _msquelch ;
if ( v5 = = - 1 | | monster [ v4 ] . _mFlags & 0x10 )
{
v7 = ( unsigned char ) monster [ v4 ] . _menemyy ;
y2 = v7 ;
v8 = monster [ v4 ] . _my - v7 ;
x2 = ( unsigned char ) monster [ v4 ] . _menemyx ;
v9 = monster [ v4 ] . _mx - x2 ;
v20 = M_GetDir ( arglist ) ;
if ( _LOBYTE ( monster [ v4 ] . _msquelch ) < 0xFFu )
MonstCheckDoors ( arglist ) ;
v11 = monster [ v4 ] . _mVar1 = = 10 ;
monster [ v4 ] . _mdir = v20 ;
if ( v11 )
{
_LOBYTE ( v10 ) = 118 ;
v12 = random ( v10 , 20 ) ;
M_StartDelay ( arglist , v12 ) ;
}
else if ( abs ( v9 ) < 4 )
{
v13 = abs ( v8 ) ;
//v15 = v14;
if ( v13 < 4 )
{
_LOBYTE ( v15 ) = 119 ;
if ( random ( v15 , 100 ) < 10 * ( ( unsigned char ) monster [ v4 ] . _mint + 7 ) )
M_CallWalk ( arglist , opposite [ v20 ] ) ;
}
}
if ( monster [ v4 ] . _mmode = = MM_STAND )
{
//_LOBYTE(v16) = LineClear(monster[v4]._mx, monster[v4]._my, x2, y2);
if ( LineClear ( monster [ v4 ] . _mx , monster [ v4 ] . _my , x2 , y2 ) )
{
if ( special )
M_StartRSpAttack ( arglist , missile_typea , 4 ) ;
else
M_StartRAttack ( arglist , missile_typea , 4 ) ;
}
else
{
2018-06-10 23:10:21 +00:00
monster [ v4 ] . _mAFNum = monster [ v4 ] . MType - > Anims [ 0 ] . Frames [ v20 ] ;
2018-06-07 02:25:54 +00:00
}
}
}
else if ( v5 )
{
v6 = GetDirection ( monster [ v4 ] . _mx , monster [ v4 ] . _my , monster [ v4 ] . _lastx , monster [ v4 ] . _lasty ) ;
M_CallWalk ( v3 , v6 ) ;
}
}
}
//----- (004376B3) --------------------------------------------------------
void __fastcall MAI_GoatBow ( int i )
{
MAI_Ranged ( i , 0 , 0 ) ;
}
//----- (004376BD) --------------------------------------------------------
void __fastcall MAI_Succ ( int i )
{
MAI_Ranged ( i , 24 , 0 ) ;
}
//----- (004376C8) --------------------------------------------------------
void __fastcall MAI_AcidUniq ( int i )
{
MAI_Ranged ( i , 57 , 1u ) ;
}
//----- (004376D3) --------------------------------------------------------
void __fastcall MAI_Scav ( int i )
{
int v1 ; // edi
int v2 ; // esi
unsigned char * v3 ; // eax
int v4 ; // ecx
int v5 ; // ecx
signed int v6 ; // ebx
signed int v7 ; // edi
int v8 ; // edx
int v9 ; // eax
bool v10 ; // eax
int v11 ; // ebx
int v12 ; // edi
signed int v13 ; // edi
int v14 ; // edx
int v15 ; // eax
bool v16 ; // eax
int v17 ; // eax
int v18 ; // eax
int arglist ; // [esp+Ch] [ebp-8h]
BOOL v20 ; // [esp+10h] [ebp-4h]
v1 = i ;
arglist = i ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " MAI_Scav: Invalid monster %d " , i ) ;
v2 = v1 ;
v20 = 0 ;
if ( monster [ v1 ] . _mmode = = MM_STAND )
{
if ( monster [ v2 ] . _mhitpoints < monster [ v2 ] . _mmaxhp > > 1 )
{
if ( _LOBYTE ( monster [ v2 ] . _mgoal ) = = 3 )
goto LABEL_10 ;
if ( monster [ v2 ] . leaderflag )
{
v3 = & monster [ ( unsigned char ) monster [ v2 ] . leader ] . unpackfilesize ;
- - * v3 ;
monster [ v2 ] . leaderflag = 0 ;
}
_LOBYTE ( monster [ v2 ] . _mgoal ) = 3 ;
monster [ v2 ] . _mgoalvar3 = 10 ;
}
if ( _LOBYTE ( monster [ v2 ] . _mgoal ) ! = 3 )
{
LABEL_52 :
if ( monster [ v2 ] . _mmode = = MM_STAND )
MAI_SkelSd ( arglist ) ;
return ;
}
LABEL_10 :
v4 = monster [ v2 ] . _mgoalvar3 ;
if ( v4 )
{
monster [ v2 ] . _mgoalvar3 = v4 - 1 ;
v5 = monster [ v2 ] . _my ;
if ( dDead [ monster [ v2 ] . _mx ] [ v5 ] )
{
M_StartEat ( v1 ) ;
if ( ! ( monster [ v2 ] . _mFlags & 8 ) )
monster [ v2 ] . _mhitpoints + = 64 ;
if ( monster [ v2 ] . _mhitpoints > = ( monster [ v2 ] . _mmaxhp > > 1 ) + ( monster [ v2 ] . _mmaxhp > > 2 ) )
{
_LOBYTE ( monster [ v2 ] . _mgoal ) = 1 ;
monster [ v2 ] . _mgoalvar1 = 0 ;
monster [ v2 ] . _mgoalvar2 = 0 ;
}
}
else
{
if ( ! monster [ v2 ] . _mgoalvar1 )
{
_LOBYTE ( v5 ) = 120 ;
v6 = arglist ;
if ( random ( v5 , 2 ) )
{
v7 = - 4 ;
do
{
if ( v20 )
break ;
v6 = - 4 ;
do
{
if ( v20 )
break ;
if ( v7 > = 0 & & v7 < 112 & & v6 > = 0 & & v6 < 112 )
{
v8 = monster [ v2 ] . _mx ;
v9 = monster [ v2 ] . _my ;
v20 = dDead [ v8 + v6 ] [ v9 + v7 ]
& & ( v10 = LineClearF (
CheckNoSolid ,
v8 ,
v9 ,
v8 + v6 ,
v9 + v7 ) ,
v10 ) ;
}
+ + v6 ;
}
while ( v6 < = 4 ) ;
+ + v7 ;
}
while ( v7 < = 4 ) ;
v11 = v6 - 1 ;
v12 = v7 - 1 ;
}
else
{
v13 = 4 ;
do
{
if ( v20 )
break ;
v6 = 4 ;
do
{
if ( v20 )
break ;
if ( v13 > = 0 & & v13 < 112 & & v6 > = 0 & & v6 < 112 )
{
v14 = monster [ v2 ] . _mx ;
v15 = monster [ v2 ] . _my ;
v20 = dDead [ v14 + v6 ] [ v15 + v13 ]
& & ( v16 = LineClearF (
CheckNoSolid ,
v14 ,
v15 ,
v14 + v6 ,
v15 + v13 ) ,
v16 ) ;
}
- - v6 ;
}
while ( v6 > = - 4 ) ;
- - v13 ;
}
while ( v13 > = - 4 ) ;
v11 = v6 + 1 ;
v12 = v13 + 1 ;
}
if ( v20 )
{
monster [ v2 ] . _mgoalvar1 = monster [ v2 ] . _mx + v11 + 1 ;
monster [ v2 ] . _mgoalvar2 = monster [ v2 ] . _my + v12 + 1 ;
}
}
v17 = monster [ v2 ] . _mgoalvar1 ;
if ( v17 )
{
v18 = GetDirection ( monster [ v2 ] . _mx , monster [ v2 ] . _my , v17 - 1 , monster [ v2 ] . _mgoalvar2 - 1 ) ;
monster [ v2 ] . _mdir = v18 ;
M_CallWalk ( arglist , v18 ) ;
}
}
}
goto LABEL_52 ;
}
}
//----- (00437957) --------------------------------------------------------
void __fastcall MAI_Garg ( int i )
{
int v1 ; // ebp
MonsterStruct * v2 ; // esi
int v3 ; // edi
int v4 ; // ebx
char v5 ; // al
int v6 ; // edi
//int v7; // eax
int v8 ; // [esp+10h] [ebp-4h]
v1 = i ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " MAI_Garg: Invalid monster %d " , i ) ;
v2 = & monster [ v1 ] ;
v3 = v2 - > _mx - v2 - > _lastx ;
v4 = v2 - > _my - v2 - > _lasty ;
v8 = M_GetDir ( v1 ) ;
v5 = v2 - > _msquelch ;
if ( v5 & & v2 - > _mFlags & 4 )
{
M_Enemy ( v1 ) ;
v6 = v2 - > _my - ( unsigned char ) v2 - > _menemyy ;
if ( abs ( v2 - > _mx - ( unsigned char ) v2 - > _menemyx ) < ( unsigned char ) v2 - > _mint + 2
& & abs ( v6 ) < ( unsigned char ) v2 - > _mint + 2 )
{
v2 - > _mFlags & = 0xFFFFFFFB ;
}
}
else if ( v2 - > _mmode = = MM_STAND & & v5 )
{
if ( v2 - > _mhitpoints < v2 - > _mmaxhp > > 1 & & ! ( v2 - > _mFlags & 8 ) )
_LOBYTE ( v2 - > _mgoal ) = 2 ;
if ( _LOBYTE ( v2 - > _mgoal ) = = 2 )
{
if ( abs ( v3 ) > = ( unsigned char ) v2 - > _mint + 2 | | abs ( v4 ) > = ( unsigned char ) v2 - > _mint + 2 )
{
_LOBYTE ( v2 - > _mgoal ) = 1 ;
M_StartHeal ( v1 ) ;
}
else
{
//_LOBYTE(v7) = M_CallWalk(v1, opposite[v8]);
if ( ! M_CallWalk ( v1 , opposite [ v8 ] ) )
_LOBYTE ( v2 - > _mgoal ) = 1 ;
}
}
MAI_Round ( v1 , 0 ) ;
}
}
//----- (00437A8B) --------------------------------------------------------
void __fastcall MAI_RoundRanged ( int i , int missile_type , unsigned char checkdoors , int dam , int lessmissiles )
{
int v5 ; // esi
MonsterStruct * v6 ; // esi
int v7 ; // edx
int v8 ; // ebx
int v9 ; // edi
int v10 ; // ecx
int v11 ; // eax
//int v12; // ST04_4
int v13 ; // ecx
int v14 ; // eax
//int v15; // ST04_4
int v16 ; // eax
//int v17; // ST04_4
int v18 ; // ecx
int v19 ; // ebx
int v20 ; // eax
int v21 ; // ecx
bool v22 ; // eax
bool v23 ; // eax
bool v24 ; // eax
int v25 ; // eax
//int v26; // ST04_4
int v27 ; // eax
//int v28; // ST04_4
int v29 ; // eax
int v30 ; // edx
int v31 ; // eax
int missile_typea ; // [esp+4h] [ebp-18h]
int v33 ; // [esp+8h] [ebp-14h]
int x2 ; // [esp+Ch] [ebp-10h]
int md ; // [esp+10h] [ebp-Ch]
int y2 ; // [esp+14h] [ebp-8h]
int arglist ; // [esp+18h] [ebp-4h]
int checkdoorsa ; // [esp+24h] [ebp+8h]
v5 = i ;
missile_typea = missile_type ;
arglist = i ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " MAI_RoundRanged: Invalid monster %d " , i ) ;
v6 = & monster [ v5 ] ;
if ( v6 - > _mmode = = MM_STAND & & _LOBYTE ( v6 - > _msquelch ) )
{
v7 = v6 - > _my ;
y2 = ( unsigned char ) v6 - > _menemyy ;
v8 = v7 - y2 ;
x2 = ( unsigned char ) v6 - > _menemyx ;
v9 = v6 - > _mx - x2 ;
v33 = v7 - y2 ;
md = GetDirection ( v6 - > _mx , v7 , v6 - > _lastx , v6 - > _lasty ) ;
if ( checkdoors & & _LOBYTE ( v6 - > _msquelch ) < 0xFFu )
MonstCheckDoors ( arglist ) ;
_LOBYTE ( v10 ) = 121 ;
checkdoorsa = random ( v10 , 10000 ) ;
v11 = abs ( v9 ) ;
//v13 = v12;
if ( v11 < 2 )
{
v14 = abs ( v8 ) ;
//v13 = v15;
if ( v14 < 2 )
goto LABEL_50 ;
}
if ( _LOBYTE ( v6 - > _msquelch ) ! = - 1 )
goto LABEL_50 ;
//v13 = y2;
if ( dung_map [ v6 - > _mx ] [ v6 - > _my ] ! = dung_map [ x2 ] [ y2 ] )
goto LABEL_50 ;
if ( _LOBYTE ( v6 - > _mgoal ) ! = 4 )
{
if ( abs ( v9 ) < 3 )
{
v16 = abs ( v8 ) ;
//v13 = v17;
if ( v16 < 3 )
goto LABEL_28 ;
}
v18 = lessmissiles ;
_LOBYTE ( v18 ) = 122 ;
if ( random ( v18 , 4 < < lessmissiles ) )
goto LABEL_28 ;
if ( _LOBYTE ( v6 - > _mgoal ) ! = 4 )
{
v6 - > _mgoalvar1 = 0 ;
_LOBYTE ( v13 ) = 123 ;
v6 - > _mgoalvar2 = random ( v13 , 2 ) ;
}
}
_LOBYTE ( v6 - > _mgoal ) = 4 ;
v19 = abs ( v8 ) ;
if ( abs ( v9 ) < = v19 )
{
v8 = v33 ;
v20 = abs ( v33 ) ;
}
else
{
v20 = abs ( v9 ) ;
v8 = v33 ;
}
v21 = v6 - > _mgoalvar1 ;
v6 - > _mgoalvar1 = v21 + 1 ;
if ( v21 > = 2 * v20 & & ( v22 = DirOK ( arglist , md ) , v22 ) )
{
LABEL_50 :
_LOBYTE ( v6 - > _mgoal ) = 1 ;
}
else if ( checkdoorsa < 500 * ( ( unsigned char ) v6 - > _mint + 1 ) > > lessmissiles
& & ( v23 = LineClear ( v6 - > _mx , v6 - > _my , x2 , y2 ) , v23 ) )
{
M_StartRSpAttack ( arglist , missile_typea , dam ) ;
}
else
{
M_RoundWalk ( arglist , md , & v6 - > _mgoalvar2 ) ;
}
LABEL_28 :
if ( _LOBYTE ( v6 - > _mgoal ) = = 1 )
{
if ( ( ( abs ( v9 ) > = 3 | | abs ( v8 ) > = 3 ) & & checkdoorsa < 500 * ( ( unsigned char ) v6 - > _mint + 2 ) > > lessmissiles
| | checkdoorsa < 500 * ( ( unsigned char ) v6 - > _mint + 1 ) > > lessmissiles )
& & ( v24 = LineClear ( v6 - > _mx , v6 - > _my , x2 , y2 ) , v24 ) )
{
M_StartRSpAttack ( arglist , missile_typea , dam ) ;
}
else
{
v25 = abs ( v9 ) ;
//v13 = v26;
if ( v25 > = 2 | | ( v27 = abs ( v8 ) , v27 > = 2 ) ) /* v13 = v28, */
{
_LOBYTE ( v13 ) = 124 ;
v29 = random ( v13 , 100 ) ;
v30 = ( unsigned char ) v6 - > _mint ;
if ( v29 < 1000 * ( v30 + 5 )
| | ( ( v13 = v6 - > _mVar1 , v13 = = 1 ) | | v13 = = 2 | | v13 = = 3 ) & & ! v6 - > _mVar2 & & v29 < 1000 * ( v30 + 8 ) )
{
M_CallWalk ( arglist , md ) ;
}
}
else if ( checkdoorsa < 1000 * ( ( unsigned char ) v6 - > _mint + 6 ) )
{
v6 - > _mdir = md ;
M_StartAttack ( arglist ) ;
}
}
}
if ( v6 - > _mmode = = MM_STAND )
{
_LOBYTE ( v13 ) = 125 ;
v31 = random ( v13 , 10 ) ;
M_StartDelay ( arglist , v31 + 5 ) ;
}
}
}
//----- (00437D93) --------------------------------------------------------
void __fastcall MAI_Magma ( int i )
{
MAI_RoundRanged ( i , 21 , 1u , 4 , 0 ) ;
}
//----- (00437DA2) --------------------------------------------------------
void __fastcall MAI_Storm ( int i )
{
MAI_RoundRanged ( i , 22 , 1u , 4 , 0 ) ;
}
//----- (00437DB1) --------------------------------------------------------
void __fastcall MAI_Acid ( int i )
{
MAI_RoundRanged ( i , 57 , 0 , 4 , 1 ) ;
}
//----- (00437DC0) --------------------------------------------------------
void __fastcall MAI_Diablo ( int i )
{
MAI_RoundRanged ( i , 67 , 0 , 40 , 0 ) ;
}
//----- (00437DCF) --------------------------------------------------------
void __fastcall MAI_RR2 ( int i , int mistype , int dam )
{
int v3 ; // ebx
MonsterStruct * v4 ; // esi
int v5 ; // edi
int v6 ; // edx
int v7 ; // ebx
int v8 ; // edi
int v9 ; // ecx
int v10 ; // eax
//int v11; // ST04_4
int v12 ; // ecx
int v13 ; // eax
//int v14; // ST04_4
int v15 ; // eax
//int v16; // ST04_4
int v17 ; // eax
//int v18; // ST04_4
int v19 ; // ebx
int v20 ; // eax
bool v21 ; // eax
bool v22 ; // eax
int v23 ; // ecx
int v24 ; // eax
//int v25; // ST04_4
int v26 ; // ecx
int v27 ; // eax
//int v28; // ST04_4
int v29 ; // eax
int v30 ; // eax
int v31 ; // eax
int v32 ; // edx
int v33 ; // eax
int missile_type ; // [esp+Ch] [ebp-1Ch]
int x2 ; // [esp+10h] [ebp-18h]
int v36 ; // [esp+14h] [ebp-14h]
int y2 ; // [esp+18h] [ebp-10h]
int v38 ; // [esp+1Ch] [ebp-Ch]
int md ; // [esp+20h] [ebp-8h]
int arglist ; // [esp+24h] [ebp-4h]
v3 = i ;
missile_type = mistype ;
arglist = i ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " MAI_RR2: Invalid monster %d " , i ) ;
v4 = & monster [ v3 ] ;
v5 = v4 - > _my - ( unsigned char ) v4 - > _menemyy ;
if ( abs ( v4 - > _mx - ( unsigned char ) v4 - > _menemyx ) > = 5 | | abs ( v5 ) > = 5 )
{
MAI_SkelSd ( v3 ) ;
return ;
}
if ( v4 - > _mmode = = MM_STAND & & _LOBYTE ( v4 - > _msquelch ) )
{
v6 = v4 - > _my ;
y2 = ( unsigned char ) v4 - > _menemyy ;
v7 = v6 - y2 ;
x2 = ( unsigned char ) v4 - > _menemyx ;
v8 = v4 - > _mx - x2 ;
v36 = v6 - y2 ;
md = GetDirection ( v4 - > _mx , v6 , v4 - > _lastx , v4 - > _lasty ) ;
if ( _LOBYTE ( v4 - > _msquelch ) < 0xFFu )
MonstCheckDoors ( arglist ) ;
_LOBYTE ( v9 ) = 121 ;
v38 = random ( v9 , 100 ) ;
v10 = abs ( v8 ) ;
//v12 = v11;
if ( v10 > = 2 | | ( v13 = abs ( v7 ) , v13 > = 2 ) ) /* v12 = v14, */
{
if ( _LOBYTE ( v4 - > _msquelch ) = = - 1 )
{
//v12 = y2;
if ( dung_map [ v4 - > _mx ] [ v4 - > _my ] = = dung_map [ x2 ] [ y2 ] )
{
if ( _LOBYTE ( v4 - > _mgoal ) ! = 4 )
{
v15 = abs ( v8 ) ;
//v12 = v16;
if ( v15 < 3 )
{
v17 = abs ( v7 ) ;
//v12 = v18;
if ( v17 < 3 )
goto LABEL_26 ;
}
if ( _LOBYTE ( v4 - > _mgoal ) ! = 4 )
{
v4 - > _mgoalvar1 = 0 ;
_LOBYTE ( v12 ) = 123 ;
v4 - > _mgoalvar2 = random ( v12 , 2 ) ;
}
}
_LOBYTE ( v4 - > _mgoal ) = 4 ;
v4 - > _mgoalvar3 = 4 ;
v19 = abs ( v7 ) ;
if ( abs ( v8 ) < = v19 )
{
v7 = v36 ;
v20 = abs ( v36 ) ;
}
else
{
v20 = abs ( v8 ) ;
v7 = v36 ;
}
v12 = v4 - > _mgoalvar1 ;
v4 - > _mgoalvar1 = v12 + 1 ;
if ( v12 < 2 * v20 | | ( v21 = DirOK ( arglist , md ) , ! v21 ) )
{
if ( v38 < 5 * ( ( unsigned char ) v4 - > _mint + 16 ) )
M_RoundWalk ( arglist , md , & v4 - > _mgoalvar2 ) ;
LABEL_26 :
if ( _LOBYTE ( v4 - > _mgoal ) ! = 1 )
goto LABEL_48 ;
if ( ( ( abs ( v8 ) > = 3 | | abs ( v7 ) > = 3 ) & & v38 < 5 * ( ( unsigned char ) v4 - > _mint + 2 )
| | v38 < 5 * ( ( unsigned char ) v4 - > _mint + 1 )
| | v4 - > _mgoalvar3 = = 4 )
& & ( v22 = LineClear ( v4 - > _mx , v4 - > _my , x2 , y2 ) , v22 ) )
{
v23 = arglist ;
}
else
{
v24 = abs ( v8 ) ;
//v26 = v25;
if ( v24 > = 2 | | ( v27 = abs ( v7 ) , v27 > = 2 ) ) /* v26 = v28, */
{
_LOBYTE ( v26 ) = 124 ;
v31 = random ( v26 , 100 ) ;
v12 = ( unsigned char ) v4 - > _mint ;
if ( v31 < 2 * ( 5 * v12 + 25 )
| | ( ( v32 = v4 - > _mVar1 , v32 = = 1 ) | | v32 = = 2 | | v32 = = 3 )
& & ! v4 - > _mVar2
& & ( v12 = 2 * ( 5 * v12 + 40 ) , v31 < v12 ) )
{
M_CallWalk ( arglist , md ) ;
}
goto LABEL_47 ;
}
_LOBYTE ( v26 ) = 124 ;
v29 = random ( v26 , 100 ) ;
v12 = 10 * ( ( unsigned char ) v4 - > _mint + 4 ) ;
if ( v29 > = v12 )
{
LABEL_47 :
v4 - > _mgoalvar3 = 1 ;
LABEL_48 :
if ( v4 - > _mmode = = MM_STAND )
{
_LOBYTE ( v12 ) = 125 ;
v33 = random ( v12 , 10 ) ;
M_StartDelay ( arglist , v33 + 5 ) ;
}
return ;
}
_LOBYTE ( v12 ) = 124 ;
v4 - > _mdir = md ;
v30 = random ( v12 , 2 ) ;
v23 = arglist ;
if ( v30 )
{
M_StartAttack ( arglist ) ;
goto LABEL_47 ;
}
}
M_StartRSpAttack ( v23 , missile_type , dam ) ;
goto LABEL_47 ;
}
}
}
}
_LOBYTE ( v4 - > _mgoal ) = 1 ;
goto LABEL_26 ;
}
}
//----- (004380DE) --------------------------------------------------------
void __fastcall MAI_Mega ( int i )
{
MAI_RR2 ( i , 49 , 0 ) ;
}
//----- (004380E9) --------------------------------------------------------
void __fastcall MAI_Golum ( int i )
{
int v1 ; // edi
int v2 ; // esi
int v3 ; // eax
int v4 ; // eax
int v5 ; // edx
int v6 ; // edi
int v7 ; // ebx
int v8 ; // eax
char v9 ; // cl
int * v10 ; // eax
signed int v11 ; // edx
signed int v12 ; // ecx
int v13 ; // eax
bool v14 ; // eax
int * v15 ; // esi
bool v16 ; // eax
int v17 ; // esi
int v18 ; // edi
int v19 ; // [esp+Ch] [ebp-Ch]
unsigned int v20 ; // [esp+10h] [ebp-8h]
int arglist ; // [esp+14h] [ebp-4h]
v1 = i ;
arglist = i ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " MAI_Golum: Invalid monster %d " , i ) ;
v2 = v1 ;
if ( monster [ v1 ] . _mx ! = 1 | | monster [ v2 ] . _my )
{
v3 = monster [ v2 ] . _mmode ;
if ( v3 ! = MM_DEATH & & v3 ! = MM_SPSTAND & & ( v3 < MM_WALK | | v3 > MM_WALK3 ) )
{
if ( ! ( monster [ v2 ] . _mFlags & 0x10 ) )
M_Enemy ( v1 ) ;
v20 = ( ( unsigned int ) ~ monster [ v2 ] . _mFlags > > 10 ) & 1 ;
if ( monster [ v2 ] . _mmode ! = MM_ATTACK )
{
v4 = monster [ v2 ] . _menemy ;
v5 = monster [ v2 ] . _my ;
v6 = monster [ v2 ] . _mx - monster [ v4 ] . _mfutx ;
v7 = v5 - monster [ v4 ] . _mfuty ;
v19 = GetDirection ( monster [ v2 ] . _mx , v5 , monster [ v4 ] . _mx , monster [ v4 ] . _my ) ;
monster [ v2 ] . _mdir = v19 ;
if ( abs ( v6 ) > = 2 | | abs ( v7 ) > = 2 )
{
if ( v20 )
{
v14 = MAI_Path ( arglist ) ;
if ( v14 )
return ;
}
}
else if ( v20 )
{
v8 = monster [ v2 ] . _menemy ;
monster [ v2 ] . _menemyx = monster [ v8 ] . _mx ;
v9 = monster [ v8 ] . _my ;
v10 = & monster [ v8 ] . _msquelch ;
monster [ v2 ] . _menemyy = v9 ;
if ( ! * ( _BYTE * ) v10 )
{
* ( _BYTE * ) v10 = - 1 ;
monster [ monster [ v2 ] . _menemy ] . _lastx = monster [ v2 ] . _mx ;
v11 = 0 ;
monster [ monster [ v2 ] . _menemy ] . _lasty = monster [ v2 ] . _my ;
do
{
v12 = 0 ;
do
{
v13 = * ( _DWORD * ) & nTransTable [ 4
* ( monster [ v2 ] . _my + v11 + 112 * ( v12 + monster [ v2 ] . _mx ) )
+ 1148 ] ;
if ( v13 > 0 )
_LOBYTE ( monster [ v13 ] . _msquelch ) = - 1 ;
+ + v12 ;
}
while ( v12 < 5 ) ;
+ + v11 ;
}
while ( v11 < 5 ) ;
}
M_StartAttack ( arglist ) ;
return ;
}
v15 = & monster [ v2 ] . _pathcount ;
if ( + + * ( _BYTE * ) v15 > 8u )
* ( _BYTE * ) v15 = 5 ;
v16 = M_CallWalk ( arglist , plr [ arglist ] . _pdir ) ;
if ( ! v16 )
{
v17 = ( ( _BYTE ) v19 - 1 ) & 7 ;
v18 = 0 ;
while ( ! v16 )
{
v17 = ( ( _BYTE ) v17 + 1 ) & 7 ;
v16 = DirOK ( arglist , v17 ) ;
if ( + + v18 > = 8 )
{
if ( ! v16 )
return ;
break ;
}
}
M_WalkDir ( arglist , v17 ) ;
}
}
}
}
}
//----- (00438304) --------------------------------------------------------
void __fastcall MAI_SkelKing ( int i )
{
int v1 ; // esi
MonsterStruct * v2 ; // esi
int v3 ; // edx
int v4 ; // ebx
int v5 ; // edi
int v6 ; // ecx
int v7 ; // eax
//int v8; // ST04_4
int v9 ; // ecx
int v10 ; // eax
//int v11; // ST04_4
int v12 ; // ecx
int v13 ; // ebx
int v14 ; // eax
int v15 ; // ecx
bool v16 ; // eax
//int v17; // eax
int v18 ; // ecx
int v19 ; // eax
bool v20 ; // eax
int v21 ; // edi
int v22 ; // ebx
int v23 ; // eax
//int v24; // ST04_4
int v25 ; // ecx
int v26 ; // eax
//int v27; // ST04_4
int v28 ; // eax
int v29 ; // ecx
int v30 ; // edx
int v31 ; // eax
char * v32 ; // [esp+4h] [ebp-1Ch]
int x2 ; // [esp+8h] [ebp-18h]
int v34 ; // [esp+Ch] [ebp-14h]
int v35 ; // [esp+10h] [ebp-10h]
int y2 ; // [esp+14h] [ebp-Ch]
int md ; // [esp+18h] [ebp-8h]
int arglist ; // [esp+1Ch] [ebp-4h]
v1 = i ;
arglist = i ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " MAI_SkelKing: Invalid monster %d " , i ) ;
v2 = & monster [ v1 ] ;
if ( v2 - > _mmode = = MM_STAND & & _LOBYTE ( v2 - > _msquelch ) )
{
v3 = v2 - > _my ;
y2 = ( unsigned char ) v2 - > _menemyy ;
v4 = v3 - y2 ;
x2 = ( unsigned char ) v2 - > _menemyx ;
v5 = v2 - > _mx - x2 ;
v34 = v3 - y2 ;
md = GetDirection ( v2 - > _mx , v3 , v2 - > _lastx , v2 - > _lasty ) ;
if ( _LOBYTE ( v2 - > _msquelch ) < 0xFFu )
MonstCheckDoors ( arglist ) ;
_LOBYTE ( v6 ) = 126 ;
v35 = random ( v6 , 100 ) ;
if ( ( abs ( v5 ) > = 2 | | abs ( v4 ) > = 2 ) & & _LOBYTE ( v2 - > _msquelch ) = = - 1 )
{
v32 = & dung_map [ x2 ] [ y2 ] ;
if ( dung_map [ v2 - > _mx ] [ v2 - > _my ] = = * v32 )
{
if ( _LOBYTE ( v2 - > _mgoal ) ! = 4 )
{
v7 = abs ( v5 ) ;
//v9 = v8;
if ( v7 < 3 )
{
v10 = abs ( v4 ) ;
//v9 = v11;
if ( v10 < 3 )
goto LABEL_26 ;
}
_LOBYTE ( v9 ) = 127 ;
if ( random ( v9 , 4 ) )
goto LABEL_26 ;
if ( _LOBYTE ( v2 - > _mgoal ) ! = 4 )
{
v2 - > _mgoalvar1 = 0 ;
_LOBYTE ( v12 ) = - 128 ;
v2 - > _mgoalvar2 = random ( v12 , 2 ) ;
}
}
_LOBYTE ( v2 - > _mgoal ) = 4 ;
v13 = abs ( v4 ) ;
if ( abs ( v5 ) < = v13 )
{
v4 = v34 ;
v14 = abs ( v34 ) ;
}
else
{
v14 = abs ( v5 ) ;
v4 = v34 ;
}
v15 = v2 - > _mgoalvar1 ;
v2 - > _mgoalvar1 = v15 + 1 ;
if ( v15 < 2 * v14 | | ( v16 = DirOK ( arglist , md ) , ! v16 ) )
{
if ( dung_map [ v2 - > _mx ] [ v2 - > _my ] = = * v32 )
{
//_LOBYTE(v17) = M_RoundWalk(arglist, md, &v2->_mgoalvar2);
if ( ! M_RoundWalk ( arglist , md , & v2 - > _mgoalvar2 ) )
{
_LOBYTE ( v18 ) = 125 ;
v19 = random ( v18 , 10 ) ;
M_StartDelay ( arglist , v19 + 10 ) ;
}
goto LABEL_26 ;
}
}
}
}
_LOBYTE ( v2 - > _mgoal ) = 1 ;
LABEL_26 :
if ( _LOBYTE ( v2 - > _mgoal ) = = 1 )
{
if ( gbMaxPlayers = = 1
& & ( ( abs ( v5 ) > = 3 | | abs ( v4 ) > = 3 ) & & v35 < 4 * ( unsigned char ) v2 - > _mint + 35 | | v35 < 6 )
& & ( v20 = LineClear ( v2 - > _mx , v2 - > _my , x2 , y2 ) , v20 ) )
{
v21 = v2 - > _mx + offset_x [ md ] ;
v22 = v2 - > _my + offset_y [ md ] ;
if ( PosOkMonst ( arglist , v21 , v22 ) & & nummonsters < 200 )
{
M_SpawnSkel ( v21 , v22 , md ) ;
M_StartSpStand ( arglist , md ) ;
}
}
else
{
v23 = abs ( v5 ) ;
//v25 = v24;
if ( v23 > = 2 | | ( v26 = abs ( v4 ) , v26 > = 2 ) ) /* v25 = v27, */
{
_LOBYTE ( v25 ) = - 127 ;
v28 = random ( v25 , 100 ) ;
v29 = ( unsigned char ) v2 - > _mint ;
if ( v28 > = v29 + 25
& & ( ( v30 = v2 - > _mVar1 , v30 ! = 1 ) & & v30 ! = 2 & & v30 ! = 3 | | v2 - > _mVar2 | | ( v29 + = 75 , v28 > = v29 ) ) )
{
_LOBYTE ( v29 ) = - 126 ;
v31 = random ( v29 , 10 ) ;
M_StartDelay ( arglist , v31 + 10 ) ;
}
else
{
M_CallWalk ( arglist , md ) ;
}
}
else if ( v35 < ( unsigned char ) v2 - > _mint + 20 )
{
v2 - > _mdir = md ;
M_StartAttack ( arglist ) ;
}
}
}
if ( v2 - > _mmode = = MM_STAND )
2018-06-10 23:10:21 +00:00
v2 - > _mAFNum = v2 - > MType - > Anims [ 0 ] . Frames [ md ] ;
2018-06-07 02:25:54 +00:00
}
}
// 679660: using guessed type char gbMaxPlayers;
//----- (0043862D) --------------------------------------------------------
void __fastcall MAI_Rhino ( int i )
{
int esi1 ; // esi
MonsterStruct * esi3 ; // esi
int v3 ; // edx
int v4 ; // ebx
int v5 ; // edi
int v6 ; // ecx
int v7 ; // eax
//int v8; // ST1C_4
int v9 ; // ecx
int v10 ; // eax
//int v11; // ST1C_4
int v12 ; // ecx
int v13 ; // ebx
int v14 ; // eax
int v15 ; // ecx
//int v16; // eax
int v17 ; // ecx
int v18 ; // eax
bool v19 ; // eax
int v20 ; // ecx
int v21 ; // eax
//int v22; // ST1C_4
int v23 ; // ecx
int v24 ; // eax
//int v25; // ST1C_4
int v26 ; // eax
int v27 ; // ecx
int v28 ; // edx
int v29 ; // eax
int v30 ; // [esp+4h] [ebp-18h]
int v31 ; // [esp+8h] [ebp-14h]
int v1 ; // [esp+Ch] [ebp-10h]
int midir ; // [esp+10h] [ebp-Ch]
int v2 ; // [esp+14h] [ebp-8h]
int arglist ; // [esp+18h] [ebp-4h]
esi1 = i ;
arglist = i ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " MAI_Rhino: Invalid monster %d " , i ) ;
esi3 = & monster [ esi1 ] ;
if ( esi3 - > _mmode = = MM_STAND & & _LOBYTE ( esi3 - > _msquelch ) )
{
v3 = esi3 - > _my ;
v2 = ( unsigned char ) esi3 - > _menemyy ;
v4 = v3 - v2 ;
v1 = ( unsigned char ) esi3 - > _menemyx ;
v5 = esi3 - > _mx - v1 ;
v31 = v3 - v2 ;
midir = GetDirection ( esi3 - > _mx , v3 , esi3 - > _lastx , esi3 - > _lasty ) ;
if ( _LOBYTE ( esi3 - > _msquelch ) < 0xFFu )
MonstCheckDoors ( arglist ) ;
_LOBYTE ( v6 ) = - 125 ;
v30 = random ( v6 , 100 ) ;
if ( abs ( v5 ) > = 2 | | abs ( v4 ) > = 2 )
{
if ( _LOBYTE ( esi3 - > _mgoal ) ! = 4 )
{
v7 = abs ( v5 ) ;
//v9 = v8;
if ( v7 < 5 )
{
v10 = abs ( v4 ) ;
//v9 = v11;
if ( v10 < 5 )
goto LABEL_23 ;
}
_LOBYTE ( v9 ) = - 124 ;
if ( ! random ( v9 , 4 ) )
goto LABEL_23 ;
if ( _LOBYTE ( esi3 - > _mgoal ) ! = 4 )
{
esi3 - > _mgoalvar1 = 0 ;
_LOBYTE ( v12 ) = - 123 ;
esi3 - > _mgoalvar2 = random ( v12 , 2 ) ;
}
}
_LOBYTE ( esi3 - > _mgoal ) = 4 ;
v13 = abs ( v4 ) ;
if ( abs ( v5 ) < = v13 )
{
v4 = v31 ;
v14 = abs ( v31 ) ;
}
else
{
v14 = abs ( v5 ) ;
v4 = v31 ;
}
v15 = esi3 - > _mgoalvar1 ;
esi3 - > _mgoalvar1 = v15 + 1 ;
if ( v15 < 2 * v14 & & dung_map [ esi3 - > _mx ] [ esi3 - > _my ] = = dung_map [ v1 ] [ v2 ] )
{
//_LOBYTE(v16) = M_RoundWalk(arglist, midir, &esi3->_mgoalvar2);
if ( ! M_RoundWalk ( arglist , midir , & esi3 - > _mgoalvar2 ) )
{
_LOBYTE ( v17 ) = 125 ;
v18 = random ( v17 , 10 ) ;
M_StartDelay ( arglist , v18 + 10 ) ;
}
goto LABEL_23 ;
}
}
_LOBYTE ( esi3 - > _mgoal ) = 1 ;
LABEL_23 :
if ( _LOBYTE ( esi3 - > _mgoal ) = = 1 )
{
if ( ( abs ( v5 ) > = 5 | | abs ( v4 ) > = 5 )
& & v30 < 2 * ( unsigned char ) esi3 - > _mint + 43
& & ( v19 = LineClearF1 (
PosOkMonst ,
arglist ,
esi3 - > _mx ,
esi3 - > _my ,
v1 ,
v2 ) ,
v19 ) )
{
if ( AddMissile ( esi3 - > _mx , esi3 - > _my , v1 , v2 , midir , 20 , esi3 - > _menemy , arglist , 0 , 0 ) ! = - 1 )
{
if ( esi3 - > MData - > snd_special )
PlayEffect ( arglist , 3 ) ;
v20 = esi3 - > _my + 112 * esi3 - > _mx ;
esi3 - > _mmode = 14 ;
dMonster [ 0 ] [ v20 ] = - 1 - arglist ;
}
}
else
{
v21 = abs ( v5 ) ;
//v23 = v22;
if ( v21 > = 2 | | ( v24 = abs ( v4 ) , v24 > = 2 ) ) /* v23 = v25, */
{
_LOBYTE ( v23 ) = - 122 ;
v26 = random ( v23 , 100 ) ;
v27 = 2 * ( unsigned char ) esi3 - > _mint ;
if ( v26 > = v27 + 33
& & ( ( v28 = esi3 - > _mVar1 , v28 ! = 1 ) & & v28 ! = 2 & & v28 ! = 3
| | esi3 - > _mVar2
| | ( v27 + = 83 , v26 > = v27 ) ) )
{
_LOBYTE ( v27 ) = - 121 ;
v29 = random ( v27 , 10 ) ;
M_StartDelay ( arglist , v29 + 10 ) ;
}
else
{
M_CallWalk ( arglist , midir ) ;
}
}
else if ( v30 < 2 * ( unsigned char ) esi3 - > _mint + 28 )
{
esi3 - > _mdir = midir ;
M_StartAttack ( arglist ) ;
}
}
}
if ( esi3 - > _mmode = = MM_STAND )
2018-06-10 23:10:21 +00:00
esi3 - > _mAFNum = esi3 - > MType - > Anims [ 0 ] . Frames [ esi3 - > _mdir ] ;
2018-06-07 02:25:54 +00:00
}
}
//----- (0043891F) --------------------------------------------------------
void __fastcall MAI_Counselor ( int i )
{
int v1 ; // ebx
int v2 ; // esi
int v3 ; // ecx
int v4 ; // edi
int v5 ; // edx
int v6 ; // ebp
int v7 ; // ecx
int v8 ; // ecx
char v9 ; // al
int v10 ; // ecx
bool v11 ; // zf
bool v12 ; // sf
unsigned char v13 ; // of
int v14 ; // edx
int v15 ; // ecx
int v16 ; // ebx
int v17 ; // eax
int v18 ; // ebx
int v19 ; // edx
int v20 ; // ecx
//int v21; // eax
int v22 ; // eax
//int v23; // ST1C_4
int v24 ; // ecx
int v25 ; // eax
//int v26; // ST1C_4
int v27 ; // edx
int v28 ; // eax
int v29 ; // eax
int v30 ; // ecx
//int v31; // eax
int v32 ; // eax
int v33 ; // eax
int v34 ; // eax
int md ; // [esp+8h] [ebp-14h]
int arglist ; // [esp+Ch] [ebp-10h]
int y2 ; // [esp+10h] [ebp-Ch]
int x2 ; // [esp+14h] [ebp-8h]
int v39 ; // [esp+18h] [ebp-4h]
v1 = i ;
arglist = i ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " MAI_Counselor: Invalid monster %d " , i ) ;
v2 = v1 ;
if ( monster [ v1 ] . _mmode = = MM_STAND & & _LOBYTE ( monster [ v2 ] . _msquelch ) )
{
v3 = monster [ v2 ] . _mx ;
x2 = ( unsigned char ) monster [ v2 ] . _menemyx ;
v4 = v3 - x2 ;
v5 = monster [ v2 ] . _my ;
y2 = ( unsigned char ) monster [ v2 ] . _menemyy ;
v6 = v5 - y2 ;
md = GetDirection ( v3 , v5 , monster [ v2 ] . _lastx , monster [ v2 ] . _lasty ) ;
if ( _LOBYTE ( monster [ v2 ] . _msquelch ) < 0xFFu )
MonstCheckDoors ( v1 ) ;
_LOBYTE ( v7 ) = 121 ;
v39 = random ( v7 , 100 ) ;
v9 = monster [ v2 ] . _mgoal ;
if ( v9 = = 2 )
{
v10 = monster [ v2 ] . _mgoalvar1 ;
v13 = __OFSUB__ ( v10 , 3 ) ;
v11 = v10 = = 3 ;
v12 = v10 - 3 < 0 ;
v14 = v10 + 1 ;
v15 = v1 ;
monster [ v2 ] . _mgoalvar1 = v14 ;
if ( ( unsigned char ) ( v12 ^ v13 ) | v11 )
{
M_CallWalk ( v1 , opposite [ md ] ) ;
goto LABEL_39 ;
}
goto LABEL_21 ;
}
if ( v9 = = 4 )
{
v16 = abs ( v6 ) ;
if ( abs ( v4 ) < = v16 )
v17 = abs ( v6 ) ;
else
v17 = abs ( v4 ) ;
v18 = v17 ;
if ( abs ( v4 ) < 2 & & abs ( v6 ) < 2
| | _LOBYTE ( monster [ v2 ] . _msquelch ) ! = - 1
| | dung_map [ monster [ v2 ] . _mx ] [ monster [ v2 ] . _my ] ! = dung_map [ x2 ] [ y2 ] )
{
v1 = arglist ;
LABEL_20 :
v15 = v1 ;
LABEL_21 :
_LOBYTE ( monster [ v2 ] . _mgoal ) = 1 ;
M_StartFadein ( v15 , md , 1u ) ;
goto LABEL_39 ;
}
v19 = 2 * v18 ;
v1 = arglist ;
v20 = monster [ v2 ] . _mgoalvar1 ;
monster [ v2 ] . _mgoalvar1 = v20 + 1 ;
if ( v20 > = v19 )
{
//_LOBYTE(v21) = DirOK(arglist, md);
if ( DirOK ( arglist , md ) )
goto LABEL_20 ;
}
M_RoundWalk ( arglist , md , & monster [ v2 ] . _mgoalvar2 ) ;
LABEL_39 :
if ( monster [ v2 ] . _mmode = = MM_STAND )
{
_LOBYTE ( v8 ) = 125 ;
v34 = random ( v8 , 10 ) ;
M_StartDelay ( v1 , v34 + 5 ) ;
}
return ;
}
if ( v9 ! = 1 )
goto LABEL_39 ;
v22 = abs ( v4 ) ;
//v24 = v23;
if ( v22 > = 2 | | ( v25 = abs ( v6 ) , v25 > = 2 ) ) /* v24 = v26, */
{
if ( v39 < 5 * ( ( unsigned char ) monster [ v2 ] . _mint + 10 ) )
{
//_LOBYTE(v31) = LineClear(monster[v2]._mx, monster[v2]._my, x2, y2);
if ( LineClear ( monster [ v2 ] . _mx , monster [ v2 ] . _my , x2 , y2 ) )
{
_LOBYTE ( v24 ) = 77 ;
v32 = random (
v24 ,
( unsigned char ) monster [ v2 ] . mMaxDamage - ( unsigned char ) monster [ v2 ] . mMinDamage + 1 ) ;
M_StartRAttack (
v1 ,
( unsigned char ) counsmiss [ ( unsigned char ) monster [ v2 ] . _mint ] , /* counsmiss is local */
( unsigned char ) monster [ v2 ] . mMinDamage + v32 ) ;
goto LABEL_39 ;
}
}
_LOBYTE ( v24 ) = 124 ;
if ( random ( v24 , 100 ) < 30 )
{
v27 = md ;
_LOBYTE ( monster [ v2 ] . _mgoal ) = 4 ;
goto LABEL_29 ;
}
}
else
{
v27 = md ;
v28 = monster [ v2 ] . _mmaxhp > > 1 ;
v13 = __OFSUB__ ( monster [ v2 ] . _mhitpoints , v28 ) ;
v12 = monster [ v2 ] . _mhitpoints - v28 < 0 ;
monster [ v2 ] . _mdir = md ;
if ( v12 ^ v13 )
{
_LOBYTE ( monster [ v2 ] . _mgoal ) = 2 ;
LABEL_29 :
monster [ v2 ] . _mgoalvar1 = 0 ;
M_StartFadeout ( v1 , v27 , 0 ) ;
goto LABEL_39 ;
}
if ( monster [ v2 ] . _mVar1 = = 13
| | ( _LOBYTE ( v24 ) = 105 , v29 = random ( v24 , 100 ) ,
v30 = 2 * ( unsigned char ) monster [ v2 ] . _mint + 20 ,
v29 < v30 ) )
{
M_StartRAttack ( v1 , - 1 , 0 ) ;
AddMissile ( monster [ v2 ] . _mx , monster [ v2 ] . _my , 0 , 0 , monster [ v2 ] . _mdir , 11 , 1 , v1 , 4 , 0 ) ;
AddMissile ( monster [ v2 ] . _mx , monster [ v2 ] . _my , 0 , 0 , monster [ v2 ] . _mdir , 12 , 1 , v1 , 4 , 0 ) ;
goto LABEL_39 ;
}
}
_LOBYTE ( v30 ) = 105 ;
v33 = random ( v30 , 10 ) ;
M_StartDelay ( v1 , v33 + 2 * ( 5 - ( unsigned char ) monster [ v2 ] . _mint ) ) ;
goto LABEL_39 ;
}
}
//----- (00438C79) --------------------------------------------------------
void __fastcall MAI_Garbud ( int i )
{
int v1 ; // esi
int v2 ; // esi
int v3 ; // ebx
int v4 ; // edi
int v5 ; // eax
//int v6; // eax
char v7 ; // al
int v8 ; // [esp+4h] [ebp-8h]
int arglist ; // [esp+8h] [ebp-4h]
v1 = i ;
arglist = i ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " MAI_Garbud: Invalid monster %d " , i ) ;
v2 = v1 ;
if ( monster [ v2 ] . _mmode = = MM_STAND )
{
v3 = monster [ v2 ] . _my ;
v4 = monster [ v2 ] . _mx ;
v8 = M_GetDir ( arglist ) ;
v5 = monster [ v2 ] . mtalkmsg ;
if ( v5 < ( signed int ) QUEST_GARBUD4
& & v5 > ( signed int ) QUEST_DOOM10
& & ! ( dFlags [ v4 ] [ v3 ] & 2 )
& & _LOBYTE ( monster [ v2 ] . _mgoal ) = = 7 )
{
_LOBYTE ( monster [ v2 ] . _mgoal ) = 6 ;
monster [ v2 ] . mtalkmsg = v5 + 1 ;
}
if ( dFlags [ v4 ] [ v3 ] & 2 )
{
if ( monster [ v2 ] . mtalkmsg = = QUEST_GARBUD4 )
{
//_LOBYTE(v6) = effect_is_playing(USFX_GARBUD4);
if ( ! effect_is_playing ( USFX_GARBUD4 ) & & _LOBYTE ( monster [ v2 ] . _mgoal ) = = 7 )
{
_LOBYTE ( monster [ v2 ] . _msquelch ) = - 1 ;
monster [ v2 ] . mtalkmsg = 0 ;
_LOBYTE ( monster [ v2 ] . _mgoal ) = 1 ;
}
}
}
v7 = monster [ v2 ] . _mgoal ;
if ( v7 = = 1 | | v7 = = 4 )
MAI_Round ( arglist , 1u ) ;
monster [ v2 ] . _mdir = v8 ;
if ( monster [ v2 ] . _mmode = = MM_STAND )
2018-06-10 23:10:21 +00:00
monster [ v2 ] . _mAFNum = monster [ v2 ] . MType - > Anims [ 0 ] . Frames [ v8 ] ;
2018-06-07 02:25:54 +00:00
}
}
//----- (00438D7E) --------------------------------------------------------
void __fastcall MAI_Zhar ( int i )
{
int v1 ; // ebp
int v2 ; // esi
int v3 ; // ebx
int v4 ; // edi
int v5 ; // edi
int v6 ; // ebx
int v7 ; // ebp
//int v8; // eax
char v9 ; // al
int arglist ; // [esp+8h] [ebp-8h]
int v11 ; // [esp+Ch] [ebp-4h]
v1 = i ;
arglist = i ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " MAI_Zhar: Invalid monster %d " , i ) ;
v2 = v1 ;
if ( monster [ v1 ] . _mmode = = MM_STAND )
{
v3 = monster [ v2 ] . _my ;
v4 = monster [ v2 ] . _mx ;
v11 = M_GetDir ( v1 ) ;
if ( monster [ v2 ] . mtalkmsg = = QUEST_ZHAR1 & & ! ( dFlags [ v4 ] [ v3 ] & 2 ) & & _LOBYTE ( monster [ v2 ] . _mgoal ) = = 7 )
{
monster [ v2 ] . mtalkmsg = QUEST_ZHAR2 ;
_LOBYTE ( monster [ v2 ] . _mgoal ) = 6 ;
}
if ( dFlags [ v4 ] [ v3 ] & 2 )
{
v5 = monster [ v2 ] . _mx - ( unsigned char ) monster [ v2 ] . _menemyx ;
v6 = monster [ v2 ] . _my - ( unsigned char ) monster [ v2 ] . _menemyy ;
v7 = abs ( v6 ) ;
if ( abs ( v5 ) < = v7 )
abs ( v6 ) ;
else
abs ( v5 ) ;
if ( monster [ v2 ] . mtalkmsg = = QUEST_ZHAR2 )
{
//_LOBYTE(v8) = effect_is_playing(USFX_ZHAR2);
if ( ! effect_is_playing ( USFX_ZHAR2 ) & & _LOBYTE ( monster [ v2 ] . _mgoal ) = = 7 )
{
_LOBYTE ( monster [ v2 ] . _msquelch ) = - 1 ;
monster [ v2 ] . mtalkmsg = 0 ;
_LOBYTE ( monster [ v2 ] . _mgoal ) = 1 ;
}
}
}
v9 = monster [ v2 ] . _mgoal ;
if ( v9 = = 1 | | v9 = = 2 | | v9 = = 4 )
MAI_Counselor ( arglist ) ;
monster [ v2 ] . _mdir = v11 ;
if ( monster [ v2 ] . _mmode = = MM_STAND )
2018-06-10 23:10:21 +00:00
monster [ v2 ] . _mAFNum = monster [ v2 ] . MType - > Anims [ 0 ] . Frames [ v11 ] ;
2018-06-07 02:25:54 +00:00
}
}
//----- (00438EC2) --------------------------------------------------------
void __fastcall MAI_SnotSpil ( int i )
{
int v1 ; // ebp
int v2 ; // esi
int v3 ; // ebx
int v4 ; // edi
int v5 ; // ebp
//int v6; // eax
char v7 ; // al
int arglist ; // [esp+8h] [ebp-4h]
v1 = i ;
arglist = i ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " MAI_SnotSpil: Invalid monster %d " , i ) ;
v2 = v1 ;
if ( monster [ v1 ] . _mmode = = MM_STAND )
{
v3 = monster [ v2 ] . _my ;
v4 = monster [ v2 ] . _mx ;
v5 = M_GetDir ( v1 ) ;
if ( monster [ v2 ] . mtalkmsg = = QUEST_BANNER10 & & ! ( dFlags [ v4 ] [ v3 ] & 2 ) & & _LOBYTE ( monster [ v2 ] . _mgoal ) = = 7 )
{
monster [ v2 ] . mtalkmsg = QUEST_BANNER11 ;
_LOBYTE ( monster [ v2 ] . _mgoal ) = 6 ;
}
if ( monster [ v2 ] . mtalkmsg = = QUEST_BANNER11 & & quests [ 7 ] . _qvar1 = = 3 )
{
monster [ v2 ] . mtalkmsg = 0 ;
_LOBYTE ( monster [ v2 ] . _mgoal ) = 1 ;
}
if ( dFlags [ v4 ] [ v3 ] & 2 )
{
if ( monster [ v2 ] . mtalkmsg = = QUEST_BANNER12 )
{
//_LOBYTE(v6) = effect_is_playing(USFX_SNOT3);
if ( ! effect_is_playing ( USFX_SNOT3 ) & & _LOBYTE ( monster [ v2 ] . _mgoal ) = = 7 )
{
ObjChangeMap ( setpc_x , setpc_y , setpc_w + setpc_x + 1 , setpc_h + setpc_y + 1 ) ;
quests [ 7 ] . _qvar1 = 3 ;
RedoPlayerVision ( ) ;
_LOBYTE ( monster [ v2 ] . _msquelch ) = - 1 ;
monster [ v2 ] . mtalkmsg = 0 ;
_LOBYTE ( monster [ v2 ] . _mgoal ) = 1 ;
}
}
if ( quests [ 7 ] . _qvar1 = = 3 )
{
v7 = monster [ v2 ] . _mgoal ;
if ( v7 = = 1 | | v7 = = 5 )
MAI_Fallen ( arglist ) ;
}
}
monster [ v2 ] . _mdir = v5 ;
if ( monster [ v2 ] . _mmode = = MM_STAND )
2018-06-10 23:10:21 +00:00
monster [ v2 ] . _mAFNum = monster [ v2 ] . MType - > Anims [ 0 ] . Frames [ v5 ] ;
2018-06-07 02:25:54 +00:00
}
}
// 5CF330: using guessed type int setpc_h;
// 5CF334: using guessed type int setpc_w;
//----- (00439016) --------------------------------------------------------
void __fastcall MAI_Lazurus ( int i )
{
int v1 ; // ebx
int v2 ; // esi
int v3 ; // ebp
int v4 ; // edi
int v5 ; // ebx
//int v6; // eax
char v7 ; // al
int v8 ; // eax
int arglist ; // [esp+8h] [ebp-4h]
v1 = i ;
arglist = i ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " MAI_Lazurus: Invalid monster %d " , i ) ;
v2 = v1 ;
if ( monster [ v1 ] . _mmode = = MM_STAND )
{
v3 = monster [ v2 ] . _my ;
v4 = monster [ v2 ] . _mx ;
v5 = M_GetDir ( v1 ) ;
if ( dFlags [ v4 ] [ v3 ] & 2 )
{
if ( gbMaxPlayers ! = 1 )
goto LABEL_29 ;
if ( monster [ v2 ] . mtalkmsg = = QUEST_VILE13 )
{
if ( _LOBYTE ( monster [ v2 ] . _mgoal ) = = 6 & & plr [ myplr ] . WorldX = = QUEST_VILE13 & & plr [ myplr ] . WorldY = = 46 )
{
PlayInGameMovie ( " gendata \\ fprst3.smk " ) ;
monster [ v2 ] . _mmode = MM_TALK ;
quests [ 15 ] . _qvar1 = 5 ;
}
if ( monster [ v2 ] . mtalkmsg = = QUEST_VILE13 )
{
//_LOBYTE(v6) = effect_is_playing(USFX_LAZ1);
if ( ! effect_is_playing ( USFX_LAZ1 ) & & _LOBYTE ( monster [ v2 ] . _mgoal ) = = 7 )
{
ObjChangeMapResync ( 1 , 18 , 20 , 24 ) ;
RedoPlayerVision ( ) ;
_LOBYTE ( monster [ v2 ] . _msquelch ) = - 1 ;
monster [ v2 ] . mtalkmsg = 0 ;
quests [ 15 ] . _qvar1 = 6 ;
_LOBYTE ( monster [ v2 ] . _mgoal ) = 1 ;
}
}
}
if ( gbMaxPlayers ! = 1 )
{
LABEL_29 :
if ( monster [ v2 ] . mtalkmsg = = QUEST_VILE13 & & _LOBYTE ( monster [ v2 ] . _mgoal ) = = 6 & & quests [ 15 ] . _qvar1 < = 3u )
monster [ v2 ] . _mmode = MM_TALK ;
}
}
v7 = monster [ v2 ] . _mgoal ;
if ( v7 = = 1 | | v7 = = 2 | | v7 = = 4 )
{
monster [ v2 ] . mtalkmsg = 0 ;
MAI_Counselor ( arglist ) ;
}
monster [ v2 ] . _mdir = v5 ;
v8 = monster [ v2 ] . _mmode ;
if ( v8 = = MM_STAND | | v8 = = MM_TALK )
2018-06-10 23:10:21 +00:00
monster [ v2 ] . _mAFNum = monster [ v2 ] . MType - > Anims [ 0 ] . Frames [ v5 ] ;
2018-06-07 02:25:54 +00:00
}
}
// 679660: using guessed type char gbMaxPlayers;
//----- (00439196) --------------------------------------------------------
void __fastcall MAI_Lazhelp ( int i )
{
int v1 ; // esi
int v2 ; // esi
int v3 ; // ebx
int v4 ; // edi
int v5 ; // [esp+4h] [ebp-8h]
int ia ; // [esp+8h] [ebp-4h]
v1 = i ;
ia = i ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " MAI_Lazhelp: Invalid monster %d " , i ) ;
v2 = v1 ;
if ( monster [ v2 ] . _mmode = = MM_STAND )
{
v3 = monster [ v2 ] . _my ;
v4 = monster [ v2 ] . _mx ;
v5 = M_GetDir ( ia ) ;
if ( dFlags [ v4 ] [ v3 ] & 2 )
{
if ( gbMaxPlayers = = 1 )
{
if ( quests [ 15 ] . _qvar1 < = 5u )
{
_LOBYTE ( monster [ v2 ] . _mgoal ) = 6 ;
goto LABEL_10 ;
}
monster [ v2 ] . mtalkmsg = 0 ;
}
_LOBYTE ( monster [ v2 ] . _mgoal ) = 1 ;
}
LABEL_10 :
if ( _LOBYTE ( monster [ v2 ] . _mgoal ) = = 1 )
MAI_Succ ( ia ) ;
monster [ v2 ] . _mdir = v5 ;
if ( monster [ v2 ] . _mmode = = MM_STAND )
2018-06-10 23:10:21 +00:00
monster [ v2 ] . _mAFNum = monster [ v2 ] . MType - > Anims [ 0 ] . Frames [ v5 ] ;
2018-06-07 02:25:54 +00:00
}
}
// 679660: using guessed type char gbMaxPlayers;
//----- (00439253) --------------------------------------------------------
void __fastcall MAI_Lachdanan ( int i )
{
int v1 ; // ebp
int v2 ; // esi
int v3 ; // ebx
int v4 ; // edi
//int v5; // eax
int v6 ; // [esp+8h] [ebp-4h]
v1 = i ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " MAI_Lachdanan: Invalid monster %d " , i ) ;
v2 = v1 ;
if ( monster [ v1 ] . _mmode = = MM_STAND )
{
v3 = monster [ v2 ] . _my ;
v4 = monster [ v2 ] . _mx ;
v6 = M_GetDir ( v1 ) ;
if ( monster [ v2 ] . mtalkmsg = = QUEST_VEIL9 & & ! ( dFlags [ v4 ] [ v3 ] & 2 ) & & _LOBYTE ( monster [ v2 ] . _mgoal ) = = 7 )
{
monster [ v2 ] . mtalkmsg = QUEST_VEIL10 ;
_LOBYTE ( monster [ v2 ] . _mgoal ) = 6 ;
}
if ( dFlags [ v4 ] [ v3 ] & 2 )
{
if ( monster [ v2 ] . mtalkmsg = = QUEST_VEIL11 )
{
//_LOBYTE(v5) = effect_is_playing(USFX_LACH3);
if ( ! effect_is_playing ( USFX_LACH3 ) & & _LOBYTE ( monster [ v2 ] . _mgoal ) = = 7 )
{
monster [ v2 ] . mtalkmsg = 0 ;
quests [ 4 ] . _qactive = 3 ;
M_StartKill ( v1 , - 1 ) ;
}
}
}
monster [ v2 ] . _mdir = v6 ;
if ( monster [ v2 ] . _mmode = = MM_STAND )
2018-06-10 23:10:21 +00:00
monster [ v2 ] . _mAFNum = monster [ v2 ] . MType - > Anims [ 0 ] . Frames [ v6 ] ;
2018-06-07 02:25:54 +00:00
}
}
//----- (00439338) --------------------------------------------------------
void __fastcall MAI_Warlord ( int i )
{
int v1 ; // ebp
int v2 ; // esi
int v3 ; // ebx
int v4 ; // edi
int v5 ; // ebp
//int v6; // eax
int v7 ; // eax
int arglist ; // [esp+8h] [ebp-4h]
v1 = i ;
arglist = i ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " MAI_Warlord: Invalid monster %d " , i ) ;
v2 = v1 ;
if ( monster [ v1 ] . _mmode = = MM_STAND )
{
v3 = monster [ v2 ] . _my ;
v4 = monster [ v2 ] . _mx ;
v5 = M_GetDir ( v1 ) ;
if ( dFlags [ v4 ] [ v3 ] & 2 & & monster [ v2 ] . mtalkmsg = = QUEST_WARLRD9 )
{
if ( _LOBYTE ( monster [ v2 ] . _mgoal ) = = 6 )
monster [ v2 ] . _mmode = MM_TALK ;
//_LOBYTE(v6) = effect_is_playing(USFX_WARLRD1);
if ( ! effect_is_playing ( USFX_WARLRD1 ) & & _LOBYTE ( monster [ v2 ] . _mgoal ) = = 7 )
{
_LOBYTE ( monster [ v2 ] . _msquelch ) = - 1 ;
monster [ v2 ] . mtalkmsg = 0 ;
_LOBYTE ( monster [ v2 ] . _mgoal ) = 1 ;
}
}
if ( _LOBYTE ( monster [ v2 ] . _mgoal ) = = 1 )
MAI_SkelSd ( arglist ) ;
monster [ v2 ] . _mdir = v5 ;
v7 = monster [ v2 ] . _mmode ;
if ( v7 = = MM_STAND | | v7 = = MM_TALK )
2018-06-10 23:10:21 +00:00
monster [ v2 ] . _mAFNum = monster [ v2 ] . MType - > Anims [ 0 ] . Frames [ v5 ] ;
2018-06-07 02:25:54 +00:00
}
}
//----- (00439419) --------------------------------------------------------
void __cdecl DeleteMonsterList ( )
{
int * v0 ; // eax
signed int v1 ; // ecx
v0 = & monster [ 0 ] . _my ;
do
{
if ( v0 [ 18 ] )
{
* ( v0 - 1 ) = 1 ;
* v0 = 0 ;
v0 [ 1 ] = 0 ;
v0 [ 2 ] = 0 ;
v0 [ 3 ] = 0 ;
v0 [ 4 ] = 0 ;
v0 [ 18 ] = 0 ;
}
v0 + = 57 ;
}
while ( ( signed int ) v0 < ( signed int ) & monster [ 4 ] . _my ) ;
v1 = 4 ;
while ( v1 < nummonsters )
{
if ( monster [ monstactive [ v1 ] ] . _mDelFlag )
{
DeleteMonster ( v1 ) ;
v1 = 0 ;
}
else
{
+ + v1 ;
}
}
}
//----- (0043947E) --------------------------------------------------------
void __cdecl ProcessMonsters ( )
{
int v0 ; // edi
int v1 ; // esi
int v2 ; // ecx
int v3 ; // eax
char * v4 ; // ebx
unsigned int v5 ; // eax
int v6 ; // eax
int v7 ; // edx
int v8 ; // eax
unsigned int v9 ; // eax
int v10 ; // eax
bool v11 ; // zf
char * v12 ; // ecx
char * v13 ; // eax
int v14 ; // ecx
int v15 ; // eax
char v16 ; // al
int v17 ; // ecx
bool v18 ; // eax
int v19 ; // eax
int v20 ; // ecx
int * v21 ; // eax
int * v22 ; // eax
int v23 ; // [esp+0h] [ebp-Ch]
int v24 ; // [esp+4h] [ebp-8h]
int v25 ; // [esp+8h] [ebp-4h]
DeleteMonsterList ( ) ;
v24 = 0 ;
if ( nummonsters < = 0 )
goto LABEL_60 ;
do
{
v25 = 0 ;
v23 = monstactive [ v24 ] ;
v0 = v23 ;
v1 = v23 ;
if ( ( unsigned char ) gbMaxPlayers > 1u )
{
SetRndSeed ( monster [ v1 ] . _mAISeed ) ;
monster [ v1 ] . _mAISeed = GetRndSeed ( ) ;
}
if ( ! ( monster [ v1 ] . _mFlags & 8 ) )
{
v2 = monster [ v1 ] . _mhitpoints ;
if ( v2 < monster [ v1 ] . _mmaxhp & & ( signed int ) ( v2 & 0xFFFFFFC0 ) > 0 )
{
v3 = SLOBYTE ( monster [ v1 ] . mLevel ) ;
if ( ( char ) v3 > 1 )
v3 = ( char ) v3 > > 1 ;
monster [ v1 ] . _mhitpoints = v2 + v3 ;
}
}
v4 = & dFlags [ monster [ v1 ] . _mx ] [ monster [ v1 ] . _my ] ;
if ( * v4 & 2 & & ! _LOBYTE ( monster [ v1 ] . _msquelch ) & & monster [ v1 ] . MType - > mtype = = MT_CLEAVER )
PlaySFX ( USFX_CLEAVER ) ;
if ( monster [ v1 ] . _mFlags & 0x10 )
{
v5 = monster [ v1 ] . _menemy ;
if ( v5 > = 0xC8 )
TermMsg ( " Illegal enemy monster %d for monster \" %s \" " , v5 , monster [ v1 ] . mName ) ;
v6 = monster [ v1 ] . _menemy ;
v7 = monster [ v6 ] . _mfutx ;
monster [ v1 ] . _lastx = v7 ;
monster [ v1 ] . _menemyx = v7 ;
v8 = monster [ v6 ] . _mfuty ;
monster [ v1 ] . _menemyy = v8 ;
monster [ v1 ] . _lasty = v8 ;
}
else
{
v9 = monster [ v1 ] . _menemy ;
if ( v9 > = 4 )
TermMsg ( " Illegal enemy player %d for monster \" %s \" " , v9 , monster [ v1 ] . mName ) ;
v10 = monster [ v1 ] . _menemy ;
v11 = ( * v4 & 2 ) = = 0 ;
v12 = ( char * ) & plr [ v10 ] . _px ;
v13 = ( char * ) & plr [ v10 ] . _py ;
monster [ v1 ] . _menemyx = * v12 ;
monster [ v1 ] . _menemyy = * v13 ;
if ( v11 )
{
v16 = monster [ v1 ] . _msquelch ;
if ( v16 & & monster [ v1 ] . _mAi ! = MT_DIABLO ) /* BUG_FIX: change '_mAi' to 'MType->mtype' */
_LOBYTE ( monster [ v1 ] . _msquelch ) = v16 - 1 ;
}
else
{
v14 = * ( _DWORD * ) v12 ;
v15 = * ( _DWORD * ) v13 ;
_LOBYTE ( monster [ v1 ] . _msquelch ) = - 1 ;
monster [ v1 ] . _lastx = v14 ;
monster [ v1 ] . _lasty = v15 ;
}
v0 = v23 ;
}
while ( 1 )
{
v17 = v0 ;
if ( monster [ v1 ] . _mFlags & 0x100 )
{
v18 = MAI_Path ( v0 ) ;
if ( v18 )
goto LABEL_30 ;
v17 = v0 ;
}
AiProc [ ( unsigned char ) monster [ v1 ] . _mAi ] ( v17 ) ;
LABEL_30 :
switch ( monster [ v1 ] . _mmode )
{
case MM_STAND :
v19 = M_DoStand ( v0 ) ;
goto LABEL_48 ;
case MM_WALK :
v19 = M_DoWalk ( v0 ) ;
goto LABEL_48 ;
case MM_WALK2 :
v19 = M_DoWalk2 ( v0 ) ;
goto LABEL_48 ;
case MM_WALK3 :
v19 = M_DoWalk3 ( v0 ) ;
goto LABEL_48 ;
case MM_ATTACK :
v19 = M_DoAttack ( v0 ) ;
goto LABEL_48 ;
case MM_GOTHIT :
v19 = M_DoGotHit ( v0 ) ;
goto LABEL_48 ;
case MM_DEATH :
v19 = M_DoDeath ( v0 ) ;
goto LABEL_48 ;
case MM_SATTACK :
v19 = M_DoSAttack ( v0 ) ;
goto LABEL_48 ;
case MM_FADEIN :
v19 = M_DoFadein ( v0 ) ;
goto LABEL_48 ;
case MM_FADEOUT :
v19 = M_DoFadeout ( v0 ) ;
goto LABEL_48 ;
case MM_RATTACK :
v19 = M_DoRAttack ( v0 ) ;
goto LABEL_48 ;
case MM_SPSTAND :
v19 = M_DoSpStand ( v0 ) ;
goto LABEL_48 ;
case MM_RSPATTACK :
v19 = M_DoRSpAttack ( v0 ) ;
goto LABEL_48 ;
case MM_DELAY :
v19 = M_DoDelay ( v0 ) ;
goto LABEL_48 ;
case MM_CHARGE :
goto LABEL_51 ;
case MM_STONE :
v19 = M_DoStone ( v0 ) ;
goto LABEL_48 ;
case MM_HEAL :
v19 = M_DoHeal ( v0 ) ;
goto LABEL_48 ;
case MM_TALK :
v19 = M_DoTalk ( v0 ) ;
LABEL_48 :
v25 = v19 ;
break ;
default :
break ;
}
if ( ! v25 )
break ;
GroupUnity ( v0 ) ;
}
LABEL_51 :
if ( monster [ v1 ] . _mmode ! = MM_STONE )
{
v20 = monster [ v1 ] . _mFlags ;
v21 = & monster [ v1 ] . _mAnimCnt ;
+ + * v21 ;
if ( ! ( v20 & 4 ) & & monster [ v1 ] . _mAnimCnt > = monster [ v1 ] . _mAnimDelay )
{
* v21 = 0 ;
v22 = & monster [ v1 ] . _mAnimFrame ;
if ( v20 & 2 )
{
v11 = ( * v22 ) - - = = 1 ;
if ( v11 )
* v22 = monster [ v1 ] . _mAnimLen ;
}
else if ( + + * v22 > monster [ v1 ] . _mAnimLen )
{
* v22 = 1 ;
}
}
}
+ + v24 ;
}
while ( v24 < nummonsters ) ;
LABEL_60 :
DeleteMonsterList ( ) ;
}
// 679660: using guessed type char gbMaxPlayers;
//----- (004397C5) --------------------------------------------------------
void __cdecl FreeMonsters ( )
{
void * * v0 ; // edi
int v1 ; // ebx
signed int v2 ; // ebp
void * * v3 ; // esi
void * v4 ; // ecx
int v5 ; // [esp+0h] [ebp-4h]
v5 = 0 ;
if ( nummtypes > 0 )
{
v0 = ( void * * ) Monsters [ 0 ] . Anims ;
do
{
v1 = * ( ( unsigned char * ) v0 - 4 ) ;
v2 = 0 ;
v3 = v0 ;
do
{
if ( animletter [ v2 ] ! = ' s ' | | monsterdata [ v1 ] . has_special )
{
v4 = * v3 ;
* v3 = 0 ;
mem_free_dbg ( v4 ) ;
}
+ + v2 ;
v3 + = 11 ;
}
while ( v2 < 6 ) ;
+ + v5 ;
v0 + = 82 ;
}
while ( v5 < nummtypes ) ;
}
FreeMissiles2 ( ) ;
}
//----- (00439831) --------------------------------------------------------
bool __fastcall DirOK ( int i , int mdir )
{
int v2 ; // ebx
int v3 ; // esi
int v4 ; // ebx
int v5 ; // edi
int v6 ; // esi
int v7 ; // edi
bool v8 ; // zf
int v9 ; // edx
unsigned char * v11 ; // ebx
unsigned char v12 ; // al
int v13 ; // edx
int v14 ; // eax
int v15 ; // edi
int v16 ; // ecx
signed int j ; // esi
int v18 ; // eax
bool v19 ; // zf
int v20 ; // eax
int v21 ; // [esp+Ch] [ebp-14h]
int v22 ; // [esp+10h] [ebp-10h]
int v23 ; // [esp+14h] [ebp-Ch]
int a1 ; // [esp+18h] [ebp-8h]
int v25 ; // [esp+1Ch] [ebp-4h]
int v26 ; // [esp+1Ch] [ebp-4h]
v2 = i ;
v3 = mdir ;
v25 = mdir ;
a1 = i ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " DirOK: Invalid monster %d " , i ) ;
v4 = v2 ;
v5 = offset_y [ v3 ] ;
v6 = monster [ v4 ] . _mx + offset_x [ v3 ] ;
v7 = monster [ v4 ] . _my + v5 ;
if ( v7 < 0 | | v7 > = 112 | | v6 < 0 | | v6 > = 112 | | ! PosOkMonst ( a1 , v6 , v7 ) )
return 0 ;
if ( v25 = = DIR_E )
{
if ( ! SolidLoc ( v6 , v7 + 1 ) )
{
v8 = ( dFlags [ v6 ] [ v7 + 1 ] & 0x10 ) = = 0 ;
goto LABEL_18 ;
}
return 0 ;
}
if ( v25 = = DIR_W )
{
if ( SolidLoc ( v6 + 1 , v7 ) )
return 0 ;
v8 = ( dFlags [ v6 + 1 ] [ v7 ] & 0x10 ) = = 0 ;
}
else
{
if ( v25 = = DIR_N )
{
if ( SolidLoc ( v6 + 1 , v7 ) )
return 0 ;
v9 = v7 + 1 ;
}
else
{
if ( v25 )
goto LABEL_24 ;
if ( SolidLoc ( v6 - 1 , v7 ) )
return 0 ;
v9 = v7 - 1 ;
}
v8 = SolidLoc ( v6 , v9 ) = = 0 ;
}
LABEL_18 :
if ( ! v8 )
return 0 ;
LABEL_24 :
if ( monster [ v4 ] . leaderflag = = 1 )
{
v11 = & monster [ v4 ] . leader ;
if ( abs ( v6 - monster [ ( unsigned char ) * v11 ] . _mfutx ) > = 4
| | abs ( v7 - monster [ ( unsigned char ) * v11 ] . _mfuty ) > = 4 )
{
return 0 ;
}
return 1 ;
}
v12 = monster [ v4 ] . _uniqtype ;
if ( ! v12 | | ! ( UniqMonst [ v12 - 1 ] . mUnqAttr & 2 ) )
return 1 ;
v26 = 0 ;
v13 = v6 - 3 ;
v21 = v6 + 3 ;
if ( v6 - 3 < = v6 + 3 )
{
v14 = v7 - 3 ;
v15 = v7 + 3 ;
v23 = v14 ;
v22 = v15 ;
v16 = 112 * v13 ;
do
{
for ( j = v23 ; j < = v15 ; + + j )
{
if ( j > = 0 & & j < 112 & & v16 > = 0 & & v16 < 12544 )
{
v18 = dMonster [ 0 ] [ v16 + j ] ;
v19 = v18 = = 0 ;
if ( v18 < 0 )
{
v18 = - v18 ;
v19 = v18 = = 0 ;
}
if ( ! v19 )
- - v18 ;
v20 = v18 ;
if ( monster [ v20 ] . leaderflag = = 1
& & ( unsigned char ) monster [ v20 ] . leader = = a1
& & monster [ v20 ] . _mfutx = = v13
& & monster [ v20 ] . _mfuty = = j )
{
+ + v26 ;
}
}
v15 = v22 ;
}
+ + v13 ;
v16 + = 112 ;
}
while ( v13 < = v21 ) ;
}
return v26 = = ( unsigned char ) monster [ v4 ] . unpackfilesize ;
}
//----- (00439A32) --------------------------------------------------------
bool __fastcall PosOkMissile ( int x , int y )
{
int v2 ; // ecx
bool result ; // al
v2 = x ;
result = 0 ;
if ( ! nMissileTable [ dPiece [ 0 ] [ v2 * 112 + y ] ] & & ! ( dFlags [ v2 ] [ y ] & 0x10 ) )
result = 1 ;
return result ;
}
//----- (00439A57) --------------------------------------------------------
bool __fastcall CheckNoSolid ( int x , int y )
{
return nSolidTable [ dPiece [ 0 ] [ y + 112 * x ] ] = = 0 ;
}
//----- (00439A71) --------------------------------------------------------
bool __fastcall LineClearF ( bool ( __fastcall * Clear ) ( int , int ) , int x1 , int y1 , int x2 , int y2 )
{
int v5 ; // esi
int v6 ; // edi
int v7 ; // ebx
int v8 ; // eax
int v9 ; // eax
int v10 ; // eax
int v11 ; // ebx
int v12 ; // esi
signed int v13 ; // edi
int v14 ; // edx
int v15 ; // ecx
int v16 ; // eax
int v17 ; // eax
int v18 ; // eax
int v19 ; // ebx
int v20 ; // edi
signed int v21 ; // esi
int v22 ; // ecx
int v25 ; // [esp+10h] [ebp-10h]
int v26 ; // [esp+14h] [ebp-Ch]
int v27 ; // [esp+18h] [ebp-8h]
int v28 ; // [esp+18h] [ebp-8h]
int v29 ; // [esp+1Ch] [ebp-4h]
v5 = y2 - y1 ;
v29 = x1 ;
v25 = x1 ;
v26 = y1 ;
v6 = x2 - x1 ;
v7 = abs ( y2 - y1 ) ;
if ( abs ( v6 ) < = v7 )
{
if ( v5 < 0 )
{
v16 = y1 ;
y1 = y2 ;
y2 = v16 ;
v17 = v29 ;
v5 = - v5 ;
v29 = x2 ;
x2 = v17 ;
v6 = - v6 ;
}
v18 = 2 * v6 ;
v28 = 2 * v6 ;
if ( v6 < = 0 )
{
v19 = v18 + v5 ;
v20 = 2 * ( v5 + v6 ) ;
v21 = - 1 ;
}
else
{
v19 = v18 - v5 ;
v20 = 2 * ( v6 - v5 ) ;
v21 = 1 ;
}
while ( 1 )
{
v22 = v29 ;
if ( y1 = = y2 & & v29 = = x2 )
break ;
if ( v19 < = 0 = = v21 < 0 )
{
v19 + = v20 ;
v22 = v21 + v29 ;
v29 + = v21 ;
}
else
{
v19 + = v28 ;
}
if ( ( + + y1 ! = v26 | | v22 ! = v25 ) & & ! Clear ( v22 , y1 ) ) /* check args */
goto LABEL_29 ;
}
}
else
{
if ( v6 < 0 )
{
v8 = v29 ;
v29 = x2 ;
x2 = v8 ;
v9 = y1 ;
v6 = - v6 ;
y1 = y2 ;
y2 = v9 ;
v5 = - v5 ;
}
v10 = 2 * v5 ;
v27 = 2 * v5 ;
if ( v5 < = 0 )
{
v11 = v10 + v6 ;
v12 = 2 * ( v6 + v5 ) ;
v13 = - 1 ;
}
else
{
v11 = v10 - v6 ;
v12 = 2 * ( v5 - v6 ) ;
v13 = 1 ;
}
do
{
v14 = y1 ;
if ( v29 = = x2 & & y1 = = y2 )
break ;
if ( v11 < = 0 = = v13 < 0 )
{
v11 + = v12 ;
v14 = v13 + y1 ;
y1 + = v13 ;
}
else
{
v11 + = v27 ;
}
v15 = v29 + 1 ;
}
while ( + + v29 = = v25 & & v14 = = v26 | | Clear ( v15 , v14 ) ) ;
LABEL_29 :
if ( v29 ! = x2 )
return 0 ;
}
if ( y1 = = y2 )
return 1 ;
return 0 ;
}
//----- (00439BE0) --------------------------------------------------------
bool __fastcall LineClear ( int x1 , int y1 , int x2 , int y2 )
{
return LineClearF ( PosOkMissile , x1 , y1 , x2 , y2 ) ;
}
//----- (00439BFA) --------------------------------------------------------
bool __fastcall LineClearF1 ( bool ( __fastcall * Clear ) ( int , int , int ) , int monst , int x1 , int y1 , int x2 , int y2 )
{
int v6 ; // esi
int v7 ; // edi
int v8 ; // ebx
int v9 ; // eax
int v10 ; // eax
int v11 ; // eax
int v12 ; // ebx
int v13 ; // esi
signed int v14 ; // edi
int v15 ; // eax
int v16 ; // eax
int v17 ; // eax
int v18 ; // eax
int v19 ; // ebx
int v20 ; // edi
signed int v21 ; // esi
int v22 ; // edx
int v25 ; // [esp+10h] [ebp-10h]
int v26 ; // [esp+14h] [ebp-Ch]
int v27 ; // [esp+18h] [ebp-8h]
int v28 ; // [esp+1Ch] [ebp-4h]
int v29 ; // [esp+1Ch] [ebp-4h]
v6 = y2 - y1 ;
v25 = monst ;
v26 = x1 ;
v27 = y1 ;
v7 = x2 - x1 ;
v8 = abs ( y2 - y1 ) ;
if ( abs ( x2 - x1 ) < = v8 )
{
if ( v6 < 0 )
{
v16 = y1 ;
y1 = y2 ;
y2 = v16 ;
v17 = x1 ;
v6 = - v6 ;
x1 = x2 ;
x2 = v17 ;
v7 = - v7 ;
}
v18 = 2 * v7 ;
v29 = 2 * v7 ;
if ( v7 < = 0 )
{
v19 = v18 + v6 ;
v20 = 2 * ( v6 + v7 ) ;
v21 = - 1 ;
}
else
{
v19 = v18 - v6 ;
v20 = 2 * ( v7 - v6 ) ;
v21 = 1 ;
}
while ( 1 )
{
v22 = x1 ;
if ( y1 = = y2 & & x1 = = x2 )
break ;
if ( v19 < = 0 = = v21 < 0 )
{
v19 + = v20 ;
v22 = v21 + x1 ;
x1 + = v21 ;
}
else
{
v19 + = v29 ;
}
if ( ( + + y1 ! = v27 | | v22 ! = v26 ) & & ! Clear ( v25 , v22 , y1 ) )
goto LABEL_29 ;
}
}
else
{
if ( v7 < 0 )
{
v9 = x1 ;
x1 = x2 ;
x2 = v9 ;
v10 = y1 ;
v7 = - v7 ;
y1 = y2 ;
y2 = v10 ;
v6 = - v6 ;
}
v11 = 2 * v6 ;
v28 = 2 * v6 ;
if ( v6 < = 0 )
{
v12 = v11 + v7 ;
v13 = 2 * ( v7 + v6 ) ;
v14 = - 1 ;
}
else
{
v12 = v11 - v7 ;
v13 = 2 * ( v6 - v7 ) ;
v14 = 1 ;
}
do
{
v15 = y1 ;
if ( x1 = = x2 & & y1 = = y2 )
break ;
if ( v12 < = 0 = = v14 < 0 )
{
v12 + = v13 ;
v15 = v14 + y1 ;
y1 + = v14 ;
}
else
{
v12 + = v28 ;
}
}
while ( + + x1 = = v26 & & v15 = = v27 | | Clear ( v25 , x1 , v15 ) ) ; /* check args */
LABEL_29 :
if ( x1 ! = x2 )
return 0 ;
}
if ( y1 = = y2 )
return 1 ;
return 0 ;
}
//----- (00439D75) --------------------------------------------------------
void __fastcall SyncMonsterAnim ( int i )
{
int v1 ; // esi
int v2 ; // eax
int v3 ; // edx
MonsterData * v4 ; // esi
CMonster * v5 ; // ecx
unsigned char v6 ; // dl
char * v7 ; // edx
int v8 ; // esi
int v9 ; // edx
int v10 ; // ecx
int v11 ; // edx
int v12 ; // ecx
int v13 ; // edx
v1 = i ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " SyncMonsterAnim: Invalid monster %d " , i ) ;
v2 = v1 ;
v3 = monster [ v1 ] . _mMTidx ;
v4 = Monsters [ v3 ] . MData ;
v5 = & Monsters [ v3 ] ;
v6 = monster [ v2 ] . _uniqtype ;
monster [ v2 ] . MType = v5 ;
monster [ v2 ] . MData = v4 ;
if ( v6 )
v7 = UniqMonst [ v6 - 1 ] . mName ;
else
v7 = v4 - > mName ;
v8 = monster [ v2 ] . _mmode ;
monster [ v2 ] . mName = v7 ;
v9 = monster [ v2 ] . _mdir ;
switch ( v8 )
{
case MM_STAND :
case MM_DELAY :
case MM_TALK :
2018-06-10 23:10:21 +00:00
v10 = v5 - > Anims [ 0 ] . Frames [ v9 ] ;
2018-06-07 02:25:54 +00:00
goto LABEL_13 ;
case MM_WALK :
case MM_WALK2 :
case MM_WALK3 :
2018-06-10 23:10:21 +00:00
v10 = v5 - > Anims [ 1 ] . Frames [ v9 ] ;
2018-06-07 02:25:54 +00:00
goto LABEL_13 ;
case MM_ATTACK :
case MM_RATTACK :
2018-06-10 23:10:21 +00:00
v10 = v5 - > Anims [ 2 ] . Frames [ v9 ] ;
2018-06-07 02:25:54 +00:00
goto LABEL_13 ;
case MM_GOTHIT :
2018-06-10 23:10:21 +00:00
v10 = v5 - > Anims [ 3 ] . Frames [ v9 ] ;
2018-06-07 02:25:54 +00:00
goto LABEL_13 ;
case MM_DEATH :
2018-06-10 23:10:21 +00:00
v10 = v5 - > Anims [ 4 ] . Frames [ v9 ] ;
2018-06-07 02:25:54 +00:00
goto LABEL_13 ;
case MM_SATTACK :
case MM_FADEIN :
case MM_FADEOUT :
case MM_SPSTAND :
case MM_RSPATTACK :
case MM_HEAL :
2018-06-10 23:10:21 +00:00
v10 = v5 - > Anims [ 5 ] . Frames [ v9 ] ;
2018-06-07 02:25:54 +00:00
LABEL_13 :
monster [ v2 ] . _mAFNum = v10 ;
return ;
case MM_CHARGE :
2018-06-10 23:10:21 +00:00
v11 = v5 - > Anims [ 2 ] . Frames [ v9 ] ;
2018-06-07 02:25:54 +00:00
monster [ v2 ] . _mAnimFrame = 1 ;
monster [ v2 ] . _mAFNum = v11 ;
v12 = v5 - > Anims [ 2 ] . Rate ;
break ;
default :
2018-06-10 23:10:21 +00:00
v13 = v5 - > Anims [ 0 ] . Frames [ v9 ] ;
2018-06-07 02:25:54 +00:00
monster [ v2 ] . _mAnimFrame = 1 ;
monster [ v2 ] . _mAFNum = v13 ;
v12 = v5 - > Anims [ 0 ] . Rate ;
break ;
}
monster [ v2 ] . _mAnimLen = v12 ;
}
//----- (00439EA8) --------------------------------------------------------
void __fastcall M_FallenFear ( int x , int y )
{
int v2 ; // eax
int * v3 ; // ebx
int v4 ; // edi
int v5 ; // esi
signed int v6 ; // eax
int v7 ; // eax
bool v8 ; // zf
int v9 ; // eax
int v10 ; // eax
signed int v11 ; // [esp-10h] [ebp-1Ch]
int v12 ; // [esp+0h] [ebp-Ch]
int x1 ; // [esp+4h] [ebp-8h]
int y1 ; // [esp+8h] [ebp-4h]
v2 = 0 ;
y1 = y ;
x1 = x ;
v12 = 0 ;
if ( nummonsters > 0 )
{
v3 = & monster [ 0 ] . _mx ;
do
{
v4 = 0 ;
v5 = monstactive [ v2 ] ;
v6 = monster [ v5 ] . MType - > mtype ;
if ( v6 > MT_RFALLSD )
{
v9 = v6 - 13 ;
v8 = v9 = = 0 ;
}
else
{
if ( v6 = = MT_RFALLSD | | ( v7 = v6 - 4 ) = = 0 )
{
v11 = 7 ;
goto LABEL_15 ;
}
v9 = v7 - 1 ;
v8 = v9 = = 0 ;
}
if ( v8 )
{
v11 = 5 ;
}
else
{
v10 = v9 - 1 ;
if ( v10 )
{
if ( v10 ! = 1 )
goto LABEL_16 ;
v11 = 2 ;
}
else
{
v11 = 3 ;
}
}
LABEL_15 :
v4 = v11 ;
LABEL_16 :
if ( monster [ v5 ] . _mAi = = AI_FALLEN
& & v4
& & abs ( x1 - monster [ v5 ] . _mx ) < 5
& & abs ( y1 - monster [ v5 ] . _my ) < 5
& & ( signed int ) ( monster [ v5 ] . _mhitpoints & 0xFFFFFFC0 ) > 0 )
{
_LOBYTE ( monster [ v5 ] . _mgoal ) = 2 ;
monster [ v5 ] . _mgoalvar1 = v4 ;
monster [ v5 ] . _mdir = GetDirection ( x1 , y1 , * v3 , v3 [ 1 ] ) ;
}
v3 + = 57 ;
v2 = v12 + + + 1 ;
}
while ( v12 < nummonsters ) ;
}
}
//----- (00439F92) --------------------------------------------------------
void __fastcall PrintMonstHistory ( int mt )
{
int v1 ; // edi
int * v2 ; // ebx
int v3 ; // ecx
int v4 ; // eax
int v5 ; // edi
short v6 ; // bx
int v7 ; // ebx
v1 = mt ;
v2 = & monstkills [ mt ] ;
sprintf ( tempstr , " Total kills : %i " , * v2 ) ;
AddPanelString ( tempstr , 1 ) ;
if ( * v2 > = 30 )
{
v3 = monsterdata [ v1 ] . mMinHP ;
v4 = monsterdata [ v1 ] . mMaxHP ;
if ( gbMaxPlayers = = 1 )
{
v3 = monsterdata [ v1 ] . mMinHP > > 1 ;
v4 = monsterdata [ v1 ] . mMaxHP > > 1 ;
}
if ( v3 < 1 )
v3 = 1 ;
if ( v4 < 1 )
v4 = 1 ;
if ( gnDifficulty = = DIFF_NIGHTMARE )
{
v3 = 3 * v3 + 1 ;
v4 = 3 * v4 + 1 ;
}
if ( gnDifficulty = = DIFF_HELL )
{
v3 = 4 * v3 + 3 ;
v4 = 4 * v4 + 3 ;
}
sprintf ( tempstr , " Hit Points : %i-%i " , v3 , v4 ) ;
AddPanelString ( tempstr , 1 ) ;
}
if ( * v2 > = 15 )
{
v5 = v1 < < 7 ;
if ( gnDifficulty = = DIFF_HELL )
v6 = * ( short * ) ( ( char * ) & monsterdata [ 0 ] . mMagicRes2 + v5 ) ;
else
v6 = * ( short * ) ( ( char * ) & monsterdata [ 0 ] . mMagicRes + v5 ) ;
v7 = v6 & 0x3F ;
if ( v7 )
{
if ( v7 & 7 )
{
strcpy ( tempstr , " Resists : " ) ;
if ( v7 & 1 )
strcat ( tempstr , " Magic " ) ;
if ( v7 & 2 )
strcat ( tempstr , " Fire " ) ;
if ( v7 & 4 )
strcat ( tempstr , " Lightning " ) ;
tempstr [ strlen ( tempstr ) - 1 ] = ' \0 ' ;
AddPanelString ( tempstr , 1 ) ;
}
if ( v7 & 0x38 )
{
strcpy ( tempstr , " Immune : " ) ;
if ( v7 & 8 )
strcat ( tempstr , " Magic " ) ;
if ( v7 & 0x10 )
strcat ( tempstr , " Fire " ) ;
if ( v7 & 0x20 )
strcat ( tempstr , " Lightning " ) ;
tempstr [ strlen ( tempstr ) - 1 ] = ' \0 ' ;
AddPanelString ( tempstr , 1 ) ;
}
}
else
{
strcpy ( tempstr , " No magic resistance " ) ;
AddPanelString ( tempstr , 1 ) ;
}
}
pinfoflag = 1 ;
}
// 4B8824: using guessed type int pinfoflag;
// 679660: using guessed type char gbMaxPlayers;
//----- (0043A13A) --------------------------------------------------------
void __cdecl PrintUniqueHistory ( )
{
char v0 ; // bl
v0 = monster [ pcursmonst ] . mMagicRes & 0x3F ;
if ( v0 )
{
if ( monster [ pcursmonst ] . mMagicRes & 7 )
strcpy ( tempstr , " Some Magic Resistances " ) ;
else
strcpy ( tempstr , " No resistances " ) ;
AddPanelString ( tempstr , 1 ) ;
if ( v0 & 0x38 )
{
strcpy ( tempstr , " Some Magic Immunities " ) ;
goto LABEL_4 ;
}
}
else
{
strcpy ( tempstr , " No resistances " ) ;
AddPanelString ( tempstr , 1 ) ;
}
strcpy ( tempstr , " No Immunities " ) ;
LABEL_4 :
AddPanelString ( tempstr , 1 ) ;
pinfoflag = 1 ;
}
// 4B8824: using guessed type int pinfoflag;
//----- (0043A1C1) --------------------------------------------------------
void __fastcall MissToMonst ( int i , int x , int y )
{
int v3 ; // edi
MissileStruct * v4 ; // edi
unsigned int v5 ; // ebx
MonsterStruct * v6 ; // esi
int v7 ; // edx
char v8 ; // al
int v9 ; // eax
char * v10 ; // edi
int v11 ; // eax
int v12 ; // edx
char v13 ; // al
char v14 ; // al
int v15 ; // ebx
int v16 ; // eax
int v17 ; // esi
int v18 ; // edi
int v19 ; // esi
int v20 ; // edx
int * v21 ; // ebx
char v22 ; // cl
char v23 ; // al
int v24 ; // esi
int v25 ; // edi
int v26 ; // esi
int v27 ; // eax
int v28 ; // eax
int ia ; // [esp+Ch] [ebp-10h]
int v30 ; // [esp+10h] [ebp-Ch]
int v31 ; // [esp+14h] [ebp-8h]
int v32 ; // [esp+18h] [ebp-4h]
int arglist ; // [esp+24h] [ebp+8h]
v3 = i ;
v30 = x ;
if ( ( unsigned int ) i > = 0x7D )
TermMsg ( " MissToMonst: Invalid missile %d " , i ) ;
v4 = & missile [ v3 ] ;
v5 = v4 - > _misource ;
ia = v4 - > _misource ;
if ( v5 > = 0xC8 )
TermMsg ( " MissToMonst: Invalid monster %d " , v5 ) ;
v32 = v4 - > _mix ;
v31 = v4 - > _miy ;
v6 = & monster [ v5 ] ;
v6 - > _mx = v30 ;
dMonster [ 0 ] [ y + 112 * v30 ] = v5 + 1 ;
v7 = v4 - > _mimfnum ;
v6 - > _mdir = v7 ;
v6 - > _my = y ;
M_StartStand ( v5 , v7 ) ;
v8 = v6 - > MType - > mtype ;
if ( v8 < MT_INCIN | | v8 > MT_HELLBURN )
{
if ( v6 - > _mFlags & 0x10 )
M2MStartHit ( v5 , - 1 , 0 ) ;
else
M_StartHit ( v5 , - 1 , 0 ) ;
}
else
{
M_StartFadein ( v5 , v6 - > _mdir , 0 ) ;
}
v9 = v32 ;
if ( v6 - > _mFlags & 0x10 )
{
v21 = ( int * ) ( ( char * ) dMonster + 4 * ( v31 + v9 * 112 ) ) ;
if ( * v21 > 0 )
{
v22 = v6 - > MType - > mtype ;
if ( v22 ! = MT_GLOOM & & ( v22 < MT_INCIN | | v22 > MT_HELLBURN ) )
{
M_TryM2MHit ( ia , * v21 - 1 , 500 , ( unsigned char ) v6 - > mMinDamage2 , ( unsigned char ) v6 - > mMaxDamage2 ) ;
v23 = v6 - > MType - > mtype ;
if ( v23 < MT_NSNAKE | | v23 > MT_GSNAKE )
{
v24 = v6 - > _mdir ;
v25 = v32 + offset_x [ v24 ] ;
v26 = v31 + offset_y [ v24 ] ;
if ( PosOkMonst ( * v21 - 1 , v25 , v26 ) )
{
v27 = * v21 ;
dMonster [ 0 ] [ v26 + 112 * v25 ] = * v21 ;
* v21 = 0 ;
v28 = v27 - 1 ;
monster [ v28 ] . _mx = v25 ;
monster [ v28 ] . _mfutx = v25 ;
monster [ v28 ] . _my = v26 ;
monster [ v28 ] . _mfuty = v26 ;
}
}
}
}
}
else
{
v10 = & dPlayer [ v9 ] [ v31 ] ;
v11 = * v10 ;
v12 = v11 - 1 ;
arglist = v11 - 1 ;
if ( * v10 > 0 )
{
v13 = v6 - > MType - > mtype ;
if ( v13 ! = MT_GLOOM & & ( v13 < MT_INCIN | | v13 > MT_HELLBURN ) )
{
M_TryH2HHit ( v5 , v12 , 500 , ( unsigned char ) v6 - > mMinDamage2 , ( unsigned char ) v6 - > mMaxDamage2 ) ;
if ( arglist = = * v10 - 1 )
{
v14 = v6 - > MType - > mtype ;
if ( v14 < MT_NSNAKE | | v14 > MT_GSNAKE )
{
v15 = arglist ;
v16 = plr [ arglist ] . _pmode ;
if ( v16 ! = 7 & & v16 ! = 8 )
StartPlrHit ( arglist , 0 , 1u ) ;
v17 = v6 - > _mdir ;
v18 = v32 + offset_x [ v17 ] ;
v19 = v31 + offset_y [ v17 ] ;
if ( PosOkPlayer ( arglist , v18 , v19 ) )
{
v20 = plr [ v15 ] . _pdir ;
plr [ v15 ] . WorldX = v18 ;
plr [ v15 ] . WorldY = v19 ;
FixPlayerLocation ( arglist , v20 ) ;
FixPlrWalkTags ( arglist ) ;
dPlayer [ v18 ] [ v19 ] = arglist + 1 ;
SetPlayerOld ( arglist ) ;
}
}
}
}
}
}
}
//----- (0043A45E) --------------------------------------------------------
bool __fastcall PosOkMonst ( int i , int x , int y )
{
int v3 ; // edi
signed int v4 ; // ebx
int v5 ; // ecx
char v6 ; // dl
bool result ; // eax
int v8 ; // edx
int v9 ; // ecx
int v10 ; // [esp+Ch] [ebp-4h]
v3 = x ;
v10 = i ;
v4 = 0 ;
if ( SolidLoc ( x , y ) )
return 0 ;
v5 = 112 * v3 ;
if ( dPlayer [ v3 ] [ y ] | | dMonster [ 0 ] [ v5 + y ] )
return 0 ;
v6 = dObject [ 0 ] [ v5 + y ] ;
result = 1 ;
if ( v6 )
{
v8 = v6 < = 0 ? - 1 - v6 : v6 - 1 ;
if ( object [ v8 ] . _oSolidFlag )
return 0 ;
}
_LOBYTE ( v5 ) = dMissile [ 0 ] [ v5 + y ] ;
if ( ( _BYTE ) v5 )
{
if ( v10 > = 0 )
{
v5 = ( char ) v5 ;
if ( ( char ) v5 > 0 )
{
if ( missile [ v5 ] . _mitype = = 5 )
goto LABEL_24 ;
v9 = 0 ;
if ( nummissiles > 0 )
{
do
{
if ( missile [ missileactive [ v9 ] ] . _mitype = = 5 )
v4 = 1 ;
+ + v9 ;
}
while ( v9 < nummissiles ) ;
if ( v4 )
{
LABEL_24 :
if ( ! ( monster [ v10 ] . mMagicRes & 0x10 ) | | monster [ v10 ] . MType - > mtype = = MT_DIABLO )
return 0 ;
}
}
}
}
}
return result ;
}
//----- (0043A547) --------------------------------------------------------
bool __fastcall PosOkMonst2 ( int i , int x , int y )
{
int v3 ; // edi
int v4 ; // ebx
signed int v5 ; // ebp
bool result ; // eax
char v7 ; // dl
int v8 ; // edx
int v9 ; // ecx
int v10 ; // ecx
v3 = x ;
v4 = i ;
v5 = 0 ;
result = SolidLoc ( x , y ) = = 0 ;
if ( result )
{
v7 = dObject [ v3 ] [ y ] ;
if ( v7 )
{
v8 = v7 < = 0 ? - 1 - v7 : v7 - 1 ;
if ( object [ v8 ] . _oSolidFlag )
result = 0 ;
}
if ( result )
{
_LOBYTE ( v9 ) = dMissile [ v3 ] [ y ] ;
if ( ( _BYTE ) v9 )
{
if ( v4 > = 0 )
{
v9 = ( char ) v9 ;
if ( ( char ) v9 > 0 )
{
if ( missile [ v9 ] . _mitype = = 5 )
goto LABEL_23 ;
v10 = 0 ;
if ( nummissiles > 0 )
{
do
{
if ( missile [ missileactive [ v10 ] ] . _mitype = = 5 )
v5 = 1 ;
+ + v10 ;
}
while ( v10 < nummissiles ) ;
if ( v5 )
{
LABEL_23 :
if ( ! ( monster [ v4 ] . mMagicRes & 0x10 ) | | monster [ v4 ] . MType - > mtype = = MT_DIABLO )
result = 0 ;
}
}
}
}
}
}
}
return result ;
}
//----- (0043A613) --------------------------------------------------------
bool __fastcall PosOkMonst3 ( int i , int x , int y )
{
int v3 ; // esi
signed int v4 ; // ebp
char v5 ; // al
int v6 ; // eax
int v7 ; // eax
int v8 ; // ecx
int v9 ; // ecx
bool result ; // eax
int v11 ; // ecx
signed int v12 ; // [esp+10h] [ebp-8h]
int v13 ; // [esp+14h] [ebp-4h]
v12 = 0 ;
v3 = x ;
v4 = 0 ;
v13 = i ;
v5 = dObject [ x ] [ y ] ;
if ( v5 )
{
if ( v5 < = 0 )
v6 = - 1 - v5 ;
else
v6 = v5 - 1 ;
v7 = v6 ;
v8 = object [ v7 ] . _otype ;
v4 = 1 ;
if ( v8 ! = 1
& & v8 ! = OBJ_L1RDOOR
& & v8 ! = OBJ_L2LDOOR
& & v8 ! = OBJ_L2RDOOR
& & v8 ! = OBJ_L3LDOOR
& & v8 ! = OBJ_L3RDOOR )
{
v4 = 0 ;
}
if ( object [ v7 ] . _oSolidFlag & & ! v4 )
return 0 ;
}
if ( SolidLoc ( x , y ) & & ! v4 | | dPlayer [ v3 ] [ y ] | | dMonster [ 0 ] [ v3 * 112 + y ] )
return 0 ;
_LOBYTE ( v9 ) = dMissile [ v3 ] [ y ] ;
result = 1 ;
if ( ( _BYTE ) v9 )
{
if ( v13 > = 0 )
{
v9 = ( char ) v9 ;
if ( ( char ) v9 > 0 )
{
if ( missile [ v9 ] . _mitype = = 5 )
goto LABEL_33 ;
v11 = 0 ;
if ( nummissiles > 0 )
{
do
{
if ( missile [ missileactive [ v11 ] ] . _mitype = = 5 )
v12 = 1 ;
+ + v11 ;
}
while ( v11 < nummissiles ) ;
if ( v12 )
{
LABEL_33 :
if ( ! ( monster [ v13 ] . mMagicRes & 0x10 ) | | monster [ v13 ] . MType - > mtype = = MT_DIABLO )
return 0 ;
}
}
}
}
}
return result ;
}
//----- (0043A73B) --------------------------------------------------------
bool __fastcall IsSkel ( int mt )
{
return mt > = MT_WSKELAX & & mt < = MT_XSKELAX
| | mt > = MT_WSKELBW & & mt < = MT_XSKELBW
| | mt > = MT_WSKELSD & & mt < = MT_XSKELSD ;
}
//----- (0043A760) --------------------------------------------------------
bool __fastcall IsGoat ( int mt )
{
return mt > = MT_NGOATMC & & mt < = MT_GGOATMC | | mt > = MT_NGOATBW & & mt < = MT_GGOATBW ;
}
//----- (0043A77B) --------------------------------------------------------
int __fastcall M_SpawnSkel ( int x , int y , int dir )
{
CMonster * v3 ; // ebx
CMonster * v4 ; // esi
int v5 ; // edx
int v6 ; // ecx
int v7 ; // esi
//int v8; // edx
int v9 ; // eax
int v10 ; // esi
int xa ; // [esp+Ch] [ebp-10h]
int ya ; // [esp+10h] [ebp-Ch]
int v14 ; // [esp+14h] [ebp-8h]
int v15 ; // [esp+18h] [ebp-4h]
int v16 ; // [esp+18h] [ebp-4h]
ya = y ;
xa = x ;
if ( nummtypes < = 0 )
return - 1 ;
v3 = Monsters ;
v15 = nummtypes ;
v4 = Monsters ;
do
{
if ( IsSkel ( ( unsigned char ) v4 - > mtype ) )
+ + v5 ;
+ + v4 ;
- - v15 ;
}
while ( v15 ) ;
if ( ! v5 )
return - 1 ;
_LOBYTE ( v6 ) = - 120 ;
v7 = 0 ;
v14 = random ( v6 , v5 ) ;
v16 = 0 ;
if ( nummtypes > 0 )
{
do
{
if ( v16 > v14 )
break ;
if ( IsSkel ( ( unsigned char ) v3 - > mtype ) )
+ + v16 ;
+ + v7 ;
+ + v3 ;
}
while ( v7 < nummtypes ) ; /* v8 */
}
v9 = AddMonster ( xa , ya , dir , v7 - 1 , 1 ) ;
v10 = v9 ;
if ( v9 ! = - 1 )
M_StartSpStand ( v9 , dir ) ;
return v10 ;
}
//----- (0043A828) --------------------------------------------------------
void __fastcall ActivateSpawn ( int i , int x , int y , int dir )
{
int v4 ; // eax
dMonster [ 0 ] [ y + 112 * x ] = i + 1 ;
v4 = i ;
monster [ v4 ] . _mx = x ;
monster [ v4 ] . _mfutx = x ;
monster [ v4 ] . _moldx = x ;
monster [ v4 ] . _my = y ;
monster [ v4 ] . _mfuty = y ;
monster [ v4 ] . _moldy = y ;
M_StartSpStand ( i , dir ) ;
}
//----- (0043A879) --------------------------------------------------------
bool __fastcall SpawnSkeleton ( int ii , int x , int y )
{
int v3 ; // esi
int v4 ; // ebx
int v5 ; // ST04_4
int v6 ; // ecx
int v7 ; // edi
int * v8 ; // esi
bool v9 ; // eax
int v11 ; // eax
int v12 ; // ecx
int v13 ; // edx
int v14 ; // esi
int v15 ; // edi
int v16 ; // ST04_4
int monstok [ 9 ] ; // [esp+Ch] [ebp-34h]
int i ; // [esp+30h] [ebp-10h]
int x2 ; // [esp+34h] [ebp-Ch]
int v20 ; // [esp+38h] [ebp-8h]
int * v21 ; // [esp+3Ch] [ebp-4h]
int a3 ; // [esp+48h] [ebp+8h]
int a3a ; // [esp+48h] [ebp+8h]
i = ii ;
v3 = x ;
x2 = x ;
if ( ii = = - 1 )
return 0 ;
v4 = y ;
if ( ! PosOkMonst ( - 1 , x , y ) )
{
v20 = 0 ;
v6 = y - 1 ;
a3 = y - 1 ;
if ( ( unsigned char ) ( __OFSUB__ ( v4 - 1 , v4 + 1 ) ^ 1 ) | ( v4 - 1 = = v4 + 1 ) )
{
v21 = monstok ;
do
{
v7 = v3 - 1 ;
if ( ( unsigned char ) ( __OFSUB__ ( v3 - 1 , v3 + 1 ) ^ 1 ) | ( v3 - 1 = = v3 + 1 ) )
{
v8 = v21 ;
do
{
v9 = PosOkMonst ( - 1 , v7 , a3 ) ;
v20 | = v9 ;
* v8 = v9 ;
v8 + = 3 ;
+ + v7 ;
}
while ( v7 < = x2 + 1 ) ;
v3 = x2 ;
}
+ + v21 ;
+ + a3 ;
}
while ( a3 < = v4 + 1 ) ;
if ( v20 )
{
_LOBYTE ( v6 ) = - 119 ;
v11 = random ( v6 , 15 ) ;
v12 = 0 ;
v13 = 0 ;
a3a = v11 + 1 ;
if ( v11 + 1 > 0 )
{
while ( 1 )
{
if ( monstok [ v13 + 2 * v12 + v12 ] )
- - a3a ;
if ( a3a < = 0 )
break ;
if ( + + v12 = = 3 )
{
v12 = 0 ;
if ( + + v13 = = 3 )
v13 = 0 ;
}
}
}
v14 = v12 + v3 - 1 ;
v15 = v13 + v4 - 1 ;
v16 = GetDirection ( v14 , v15 , x2 , v4 ) ;
ActivateSpawn ( i , v14 , v15 , v16 ) ;
return 1 ;
}
}
return 0 ;
}
v5 = GetDirection ( v3 , y , v3 , y ) ;
ActivateSpawn ( i , v3 , y , v5 ) ;
return 1 ;
}
// 43A879: using guessed type int var_34[9];
//----- (0043A979) --------------------------------------------------------
int __cdecl PreSpawnSkeleton ( )
{
int skeltypes ; // edx
int j ; // edx
int skel ; // eax
int i ; // [esp+10h] [ebp-4h]
if ( nummtypes < = 0 )
return - 1 ;
for ( i = 0 ; i < nummtypes ; i + + )
{
if ( IsSkel ( Monsters [ i ] . mtype ) )
+ + skeltypes ;
}
if ( ! skeltypes )
return - 1 ;
j = random ( 136 , skeltypes ) ; /* check this code -i integer is messed up*/
skeltypes = 0 ;
for ( i = 0 ; i < nummtypes ; + + i )
{
if ( skeltypes > j )
break ;
if ( IsSkel ( Monsters [ i ] . mtype ) )
+ + skeltypes ;
}
skel = AddMonster ( 0 , 0 , 0 , i - 1 , 0 ) ;
if ( skel ! = - 1 )
M_StartStand ( skel , 0 ) ;
return skel ;
}
//----- (0043AA0C) --------------------------------------------------------
void __fastcall TalktoMonster ( int i )
{
int v1 ; // esi
MonsterStruct * v2 ; // esi
char v3 ; // al
int v4 ; // edi
//int v5; // eax
//int v6; // eax
int inv_item_num ; // [esp+8h] [ebp-4h]
v1 = i ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " TalktoMonster: Invalid monster %d " , i ) ;
v2 = & monster [ v1 ] ;
v3 = v2 - > _mAi ;
v4 = v2 - > _menemy ;
v2 - > _mmode = MM_TALK ;
if ( v3 = = AI_SNOTSPIL | | v3 = = AI_LACHDAN )
{
//_LOBYTE(v5) = QuestStatus(7);
if ( QuestStatus ( 7 ) & & quests [ 7 ] . _qvar1 = = 2 & & PlrHasItem ( v4 , IDI_BANNER , & inv_item_num ) )
{
RemoveInvItem ( v4 , inv_item_num ) ;
quests [ 7 ] . _qactive = 3 ;
v2 - > mtalkmsg = QUEST_BANNER12 ;
_LOBYTE ( v2 - > _mgoal ) = 6 ;
}
//_LOBYTE(v6) = QuestStatus(4);
if ( QuestStatus ( 4 ) & & v2 - > mtalkmsg > = ( signed int ) QUEST_VEIL9 )
{
if ( PlrHasItem ( v4 , IDI_GLDNELIX , & inv_item_num ) )
{
RemoveInvItem ( v4 , inv_item_num ) ;
v2 - > mtalkmsg = QUEST_VEIL11 ;
_LOBYTE ( v2 - > _mgoal ) = 6 ;
}
}
}
}
//----- (0043AADA) --------------------------------------------------------
void __fastcall SpawnGolum ( int i , int x , int y , int mi )
{
int v4 ; // edi
int v5 ; // ebx
int v6 ; // esi
int v7 ; // eax
int * v8 ; // edx
int v9 ; // eax
char v10 ; // cl
int v11 ; // eax
v4 = i ;
v5 = x ;
if ( ( unsigned int ) i > = 0xC8 )
TermMsg ( " SpawnGolum: Invalid monster %d " , i ) ;
v6 = v4 ;
monster [ v6 ] . _mx = v5 ;
monster [ v6 ] . _my = y ;
monster [ v6 ] . _mfuty = y ;
monster [ v6 ] . _moldy = y ;
monster [ v6 ] . _mfutx = v5 ;
monster [ v6 ] . _moldx = v5 ;
v7 = plr [ v4 ] . _pMaxMana ;
dMonster [ 0 ] [ y + 112 * v5 ] = v4 + 1 ;
_LOBYTE ( monster [ v6 ] . _pathcount ) = 0 ;
monster [ v6 ] . _mFlags | = 0x20u ;
v8 = & missile [ mi ] . _mispllvl ;
monster [ v6 ] . mArmorClass = 25 ;
v9 = 320 * * v8 + v7 / 3 ;
v10 = * ( _BYTE * ) v8 ;
_LOBYTE ( v8 ) = plr [ v4 ] . _pLevel ;
v9 * = 2 ;
monster [ v6 ] . _mmaxhp = v9 ;
monster [ v6 ] . _mhitpoints = v9 ;
monster [ v6 ] . mHit = 5 * ( v10 + 8 ) + 2 * ( _BYTE ) v8 ;
monster [ v6 ] . mMinDamage = 2 * ( v10 + 4 ) ;
monster [ v6 ] . mMaxDamage = 2 * ( v10 + 8 ) ;
M_StartSpStand ( v4 , 0 ) ;
M_Enemy ( v4 ) ;
if ( v4 = = myplr )
{
_LOBYTE ( v11 ) = currlevel ;
NetSendCmdGolem (
monster [ v6 ] . _mx ,
monster [ v6 ] . _my ,
monster [ v6 ] . _mdir ,
monster [ v6 ] . _menemy ,
monster [ v6 ] . _mhitpoints ,
v11 ) ;
}
}
//----- (0043AC0C) --------------------------------------------------------
bool __fastcall CanTalkToMonst ( int m )
{
int v1 ; // esi
char v2 ; // al
bool result ; // al
v1 = m ;
if ( ( unsigned int ) m > = 0xC8 )
TermMsg ( " CanTalkToMonst: Invalid monster %d " , m ) ;
v2 = monster [ v1 ] . _mgoal ;
if ( v2 = = 6 )
result = 1 ;
else
result = v2 = = 7 ;
return result ;
}
//----- (0043AC43) --------------------------------------------------------
bool __fastcall CheckMonsterHit ( int m , bool * ret )
{
int v2 ; // edi
bool * v3 ; // esi
int v4 ; // ecx
int v5 ; // eax
bool result ; // al
unsigned char v7 ; // al
v2 = m ;
v3 = ret ;
if ( ( unsigned int ) m > = 0xC8 )
TermMsg ( " CheckMonsterHit: Invalid monster %d " , m ) ;
v4 = v2 ;
if ( monster [ v2 ] . _mAi = = AI_GARG & & ( v5 = monster [ v4 ] . _mFlags , v5 & 4 ) )
{
_LOBYTE ( v5 ) = v5 & 0xFB ;
monster [ v4 ] . _mmode = MM_SATTACK ;
monster [ v4 ] . _mFlags = v5 ;
result = 1 ;
* v3 = 1 ;
}
else
{
v7 = monster [ v4 ] . MType - > mtype ;
if ( v7 < MT_COUNSLR | | v7 > MT_ADVOCATE | | ( result = 1 , _LOBYTE ( monster [ v4 ] . _mgoal ) = = 1 ) )
result = 0 ;
else
* v3 = 0 ;
}
return result ;
}
//----- (0043ACB5) --------------------------------------------------------
int __fastcall encode_enemy ( int m )
{
int v1 ; // ecx
int result ; // eax
v1 = m ;
result = monster [ v1 ] . _menemy ;
if ( monster [ v1 ] . _mFlags & 0x10 )
result + = 4 ;
return result ;
}
//----- (0043ACCE) --------------------------------------------------------
void __fastcall decode_enemy ( int m , int enemy )
{
int v2 ; // eax
int v3 ; // edx
char v4 ; // cl
int v5 ; // edx
v2 = m ;
if ( enemy > = 4 )
{
monster [ v2 ] . _mFlags | = 0x10u ;
v5 = enemy - 4 ;
monster [ v2 ] . _menemy = v5 ;
monster [ v2 ] . _menemyx = monster [ v5 ] . _mfutx ;
v4 = monster [ v5 ] . _mfuty ;
}
else
{
monster [ v2 ] . _mFlags & = 0xFFFFFFEF ;
monster [ v2 ] . _menemy = enemy ;
v3 = enemy ;
monster [ v2 ] . _menemyx = plr [ v3 ] . _px ;
v4 = plr [ v3 ] . _py ;
}
monster [ v2 ] . _menemyy = v4 ;
}