437 lines
12 KiB
C
Executable File
437 lines
12 KiB
C
Executable File
/*
|
|
Copyright (C) 1994-1995 Apogee Software, Ltd.
|
|
|
|
This program is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU General Public License
|
|
as published by the Free Software Foundation; either version 2
|
|
of the License, or (at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
|
See the GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
*/
|
|
#ifndef _rt_actor_public
|
|
#define _rt_actor_public
|
|
|
|
//***************************************************************************
|
|
//
|
|
// RT_ACTOR.C (actor functions)
|
|
//
|
|
//***************************************************************************
|
|
|
|
#include "states.h"
|
|
|
|
|
|
#define FL_SYNCED 0x400
|
|
#define FL_MASTER 0x800
|
|
#define FL_SKELETON 0x02
|
|
#define GASTICS 1050
|
|
|
|
|
|
#define M_ISACTOR(x) ((x!=NULL) && (x->which == ACTOR))
|
|
|
|
#define SF_GUTS 0x20
|
|
|
|
#define NUMENEMIES 16
|
|
#define NUMCLASSES 51
|
|
#define MAXTOUCH 10
|
|
#define MAXPOP 32
|
|
#define MAXDELETE 512
|
|
|
|
#define InMapBounds(x,y) (((x) >= 0) && ((x) < MAPSIZE) && ((y) >= 0) && ((y) < MAPSIZE))
|
|
|
|
|
|
#define ACTIVE(ob) ((ob == firstactive) || (ob->prevactive) || (ob->nextactive))
|
|
|
|
enum {SHOOT,SIGHT,DIRCHECK,EXPLOSION,MISSILE};
|
|
|
|
|
|
typedef enum
|
|
{
|
|
gt_sparks,
|
|
gt_organ,
|
|
gt_rib,
|
|
gt_pinkorgan,
|
|
gt_head,
|
|
gt_arm,
|
|
gt_leg,
|
|
gt_humerus,
|
|
gt_pelvis,
|
|
gt_limb,
|
|
gt_bsoul,
|
|
gt_lsoul,
|
|
gt_spit,
|
|
NumGibTypes
|
|
}gib_t;
|
|
|
|
#define GUTS (NumGibTypes)
|
|
#define RANDOM (NumGibTypes + 1)
|
|
#define DISEMBOWEL (NumGibTypes + 2)
|
|
|
|
|
|
#define GASVALUE 192
|
|
|
|
#define PAINOFFSET 2
|
|
#define PMFOFFSET 50
|
|
#define REMOTEOFFSET 86
|
|
|
|
#define ACTORSIZE 0x5800
|
|
#define PWALLRAD 0xa000
|
|
|
|
#ifdef __WATCOMC__
|
|
int M_ABS(int value);
|
|
#pragma aux M_ABS = \
|
|
"test eax,eax", \
|
|
"jge done", \
|
|
"neg eax",\
|
|
"done: " \
|
|
parm [eax] \
|
|
value [eax] \
|
|
modify exact [eax]
|
|
#else
|
|
#define M_ABS abs
|
|
#endif
|
|
|
|
#define M_CheckPlayerKilled(ob) \
|
|
{ if ((ob->obclass == playerobj) && (ob->flags & FL_DYING)) \
|
|
BATTLE_CheckGameStatus(battle_player_killed,ob->dirchoosetime);\
|
|
}
|
|
|
|
|
|
|
|
#define SetTilePosition(ob, newtilex, newtiley) \
|
|
{ \
|
|
ob->tilex = newtilex; \
|
|
ob->tiley = newtiley; \
|
|
ob->x = (ob->tilex << TILESHIFT) + TILEGLOBAL/2; \
|
|
ob->y = (ob->tiley << TILESHIFT) + TILEGLOBAL/2; \
|
|
}
|
|
|
|
|
|
#define SetFinePosition(ob, newx, newy) \
|
|
{ \
|
|
ob->x = newx; \
|
|
ob->y = newy; \
|
|
ob->tilex = (ob->x >> TILESHIFT); \
|
|
ob->tiley = (ob->y >> TILESHIFT); \
|
|
}
|
|
|
|
#define SetVisiblePosition(ob, x, y) \
|
|
{ \
|
|
ob->drawx = x; \
|
|
ob->drawy = y; \
|
|
}
|
|
|
|
|
|
//***************************************************************************
|
|
//
|
|
// WeaponDamages
|
|
//
|
|
//***************************************************************************
|
|
#define DMG_PISTOL 13
|
|
#define DMG_MP40 10
|
|
#define DMG_AHGUN 10
|
|
#define DMG_ENEMYBULLETWEAPON 10
|
|
|
|
|
|
|
|
|
|
typedef struct bas
|
|
{
|
|
short operate,
|
|
see,
|
|
fire,
|
|
hit,
|
|
die;
|
|
} basic_actor_sounds;
|
|
|
|
extern basic_actor_sounds BAS[NUMCLASSES+3];
|
|
|
|
|
|
typedef struct
|
|
{int x,y;
|
|
}_2Dpoint;
|
|
|
|
typedef enum {
|
|
inertobj,
|
|
playerobj,
|
|
lowguardobj,
|
|
highguardobj,
|
|
overpatrolobj,
|
|
strikeguardobj,
|
|
blitzguardobj,
|
|
triadenforcerobj,
|
|
deathmonkobj,
|
|
dfiremonkobj,
|
|
roboguardobj,
|
|
|
|
b_darianobj,
|
|
b_heinrichobj,
|
|
b_robobossobj,
|
|
b_darkmonkobj,
|
|
b_darksnakeobj,
|
|
patrolgunobj,
|
|
wallopobj,
|
|
|
|
|
|
//specials
|
|
|
|
pillarobj,
|
|
firejetobj,
|
|
bladeobj,
|
|
crushcolobj,
|
|
boulderobj,
|
|
spearobj,
|
|
gasgrateobj,
|
|
springobj,
|
|
|
|
// Missile weapon types
|
|
|
|
shurikenobj,
|
|
wallfireobj,
|
|
netobj,
|
|
h_mineobj,
|
|
grenadeobj,
|
|
fireballobj,
|
|
dmfballobj,
|
|
bigshurikenobj,
|
|
missileobj,
|
|
NMEsaucerobj,
|
|
dm_weaponobj,
|
|
dm_heatseekobj,
|
|
dm_spitobj,
|
|
p_bazookaobj,
|
|
p_firebombobj,
|
|
p_heatseekobj,
|
|
p_drunkmissileobj,
|
|
p_firewallobj,
|
|
p_splitmissileobj,
|
|
p_kesobj,
|
|
p_godballobj,
|
|
collectorobj,
|
|
diskobj,
|
|
rainobj
|
|
|
|
|
|
}classtype;
|
|
|
|
|
|
typedef struct objstruct
|
|
{
|
|
thingtype which;
|
|
byte tilex,tiley;
|
|
fixed x,y,z;
|
|
int shapenum;
|
|
unsigned flags;
|
|
short ticcount;
|
|
signed short hitpoints;
|
|
word whichactor;
|
|
|
|
signed short dirchoosetime;
|
|
fixed drawx,drawy;
|
|
classtype obclass;
|
|
statetype * state;
|
|
signed char door_to_open;
|
|
byte areanumber;
|
|
signed short shapeoffset;
|
|
int targettilex,targettiley;
|
|
|
|
|
|
dirtype dir;
|
|
short int angle;
|
|
short int yzangle;
|
|
|
|
int soundhandle;
|
|
int speed;
|
|
int momentumx, momentumy, momentumz;
|
|
int temp1,temp2,temp3;
|
|
void *whatever,*target;
|
|
struct objstruct *next, *prev;
|
|
struct objstruct *nextactive, *prevactive;
|
|
struct objstruct *nextinarea, *previnarea;
|
|
|
|
} objtype;
|
|
|
|
|
|
|
|
|
|
typedef struct b_struct
|
|
{int NMErotate;
|
|
int NMEdirstried;
|
|
int NMEqueuesize;
|
|
int ESAU_HIDING,ESAU_SHOOTING;
|
|
int HRAMMING, HMINING;
|
|
int SOUNDTIME;
|
|
int redindex,REDTIME;
|
|
int monkz;
|
|
int monkup;
|
|
int firespawned;
|
|
int notouch,noholes;
|
|
int nexttouch,nextpop;
|
|
int popsleft;
|
|
int DSTATE;
|
|
int doorcount;
|
|
int KEYACTORSLEFT;
|
|
int GASON;
|
|
int gasindex;
|
|
boolean NET_IN_FLIGHT;
|
|
boolean madenoise;
|
|
_2Dpoint ETOUCH[MAXTOUCH],EPOP[MAXPOP],TOMLOC;
|
|
int NUMWEAPONS;
|
|
int BulletHoleNum;
|
|
int NUMBEGGINGKEVINS;
|
|
boolean fulllightgibs;
|
|
boolean directgibs;
|
|
int gibgravity;
|
|
int gibspeed;
|
|
boolean supergibflag;
|
|
boolean randgibspeed;
|
|
int numgibs;
|
|
boolean elevatormusicon;
|
|
}misc_stuff;
|
|
|
|
|
|
extern boolean ludicrousgibs;
|
|
extern objtype* PLAYER0MISSILE;
|
|
extern byte deathshapeoffset[8];
|
|
extern byte RANDOMACTORTYPE[10];
|
|
extern objtype* FIRSTACTOR,*LASTACTOR;
|
|
extern objtype *FIRSTRAIN,*LASTRAIN;
|
|
extern objtype* SCREENEYE;
|
|
extern objtype *firstareaactor[NUMAREAS+1],*lastareaactor[NUMAREAS+1];
|
|
extern misc_stuff mstruct,*MISCVARS;
|
|
extern int actorstart,actorstop;
|
|
extern exit_t playstate;
|
|
extern objtype *lastactive,*firstactive;
|
|
extern objtype *new,**objlist,
|
|
*killerobj;
|
|
extern void *actorat[MAPSIZE][MAPSIZE];
|
|
extern int angletodir[ANGLES];
|
|
extern _2Dpoint SNAKEPATH[512];
|
|
/* extern int STOPSPEED; */
|
|
extern int FRICTION;
|
|
|
|
extern int objcount;
|
|
|
|
void SpawnInertActor(int,int,int);
|
|
objtype* DiskAt(int tilex,int tiley);
|
|
void GetRainActors(void);
|
|
void DoRain(void);
|
|
void SpawnDisk(int,int,int,boolean);
|
|
void T_ElevDisk(objtype*);
|
|
void Add_To_Delete_Array(void*);
|
|
void Remove_Delete_Array_Entries(void);
|
|
void MakeInactive(objtype*ob);
|
|
void RespawnEluder(void);
|
|
void SpawnCollector(int,int);
|
|
void MakeLastInArea(objtype*);
|
|
void RemoveFromArea(objtype*);
|
|
void GetMomenta(objtype*,objtype*,int*,int*,int*,int);
|
|
int AngleBetween(objtype*,objtype*);
|
|
void TurnActorIntoSprite(objtype*);
|
|
void ResolveDoorSpace(int,int);
|
|
void RemoveObj(objtype*);
|
|
void SpawnParticles(objtype*,int,int);
|
|
void MakeActive(objtype*);
|
|
void SpawnSpear(int,int,int);
|
|
void SpawnBoulder(int,int,int);
|
|
void SpawnCrushingColumn(int,int,int);
|
|
void SpawnFirejet(int,int,int,int);
|
|
void T_Firethink(objtype*);
|
|
void SpawnBlade(int,int,int,int,int);
|
|
void T_OrobotChase(objtype*);
|
|
void SpawnMultiSpriteActor(classtype,int,int,int);
|
|
boolean ActorTryMove(objtype*,int,int,int);
|
|
void A_Repeat(objtype*);
|
|
void T_Heinrich_Defend(objtype*);
|
|
void T_Heinrich_Out_of_Control(objtype*);
|
|
void A_HeinrichShoot(objtype*);
|
|
void T_EsauWait(objtype*);
|
|
void T_EsauRise(objtype*);
|
|
void A_Drain(objtype*ob);
|
|
void T_Explosion(objtype*ob);
|
|
void T_MoveColumn(objtype*);
|
|
void EnableObject(long object);
|
|
void DisableObject(long object);
|
|
|
|
void T_Collide(objtype*);
|
|
void Collision(objtype*ob,objtype *attacker,int hitmomentumx,int hitmomentumy);
|
|
void ActorMovement (objtype *);
|
|
void MoveActor(objtype*);
|
|
|
|
void InitActorList(void);
|
|
void NewState(objtype*,statetype*);
|
|
void DoActor(objtype*);
|
|
|
|
void SpawnPushColumn(int tilex,int tiley,int which,int dir, int linked);
|
|
void SpawnGunThingy(classtype which, int tilex, int tiley, int dir);
|
|
void SpawnStand (classtype which, int tilex, int tiley, int dir, int ambush);
|
|
void SpawnPatrol (classtype which, int tilex, int tiley, int dir);
|
|
void SpawnDeadGuard (int tilex, int tiley);
|
|
void SpawnWallfire(int tilex, int tiley, int dir);
|
|
void SpawnMissile(objtype*,classtype,int,int,statetype*,int);
|
|
|
|
void InitHitRect (objtype *ob, unsigned radius);
|
|
void NewState (objtype *ob, statetype *state);
|
|
void SelectPathDir(objtype*);
|
|
void SelectChaseDir (objtype *ob);
|
|
boolean SightPlayer (objtype *ob);
|
|
boolean CheckLine (void*,void *,int);
|
|
boolean CheckSight (objtype *ob,void*);
|
|
void KillActor (objtype *ob);
|
|
void DamageThing (void *, int);
|
|
void MissileHit (objtype *,void*);
|
|
void GetNewActor(void);
|
|
|
|
void T_WallPath(objtype*);
|
|
void T_Path (objtype *ob); //done
|
|
void T_RoboChase(objtype*ob);
|
|
void T_RoboPath(objtype*ob);
|
|
void T_Chase (objtype *ob); //done
|
|
void T_EsauChase(objtype*ob); //done
|
|
void T_Spears(objtype*);
|
|
void T_Projectile (objtype *ob); //done
|
|
void T_Stand (objtype *ob); //done
|
|
void T_GunStand(objtype *ob); //done
|
|
void T_Use(objtype *ob); // done
|
|
void A_Shoot (objtype *ob); // done
|
|
void A_MissileWeapon(objtype*); // done
|
|
void A_Wallfire(objtype*);
|
|
|
|
void A_Steal(objtype*);
|
|
|
|
void T_Roll(objtype*);
|
|
void T_BossDied (objtype *ob);
|
|
boolean QuickSpaceCheck(objtype*,int,int);
|
|
void PushWallMove(int num);
|
|
void SpawnNewObj(unsigned,unsigned,statetype*,classtype);
|
|
void SpawnSpring(int,int);
|
|
void SpawnFourWayGun(int,int);
|
|
void SpawnSnake(int tilex,int tiley);
|
|
void SpawnSneaky(int,int);
|
|
boolean MissileTryMove(objtype*ob,int,int,int);
|
|
|
|
void SaveActors(byte ** buf, int * size);
|
|
void LoadActors(byte * buf, int size);
|
|
|
|
boolean TurnOffLight0 (int tilex, int tiley);
|
|
boolean TurnOffLight1 (int tilex, int tiley, int i, int j);
|
|
boolean TurnOffLight2 (int tilex, int tiley, int j);
|
|
boolean TurnOffLight3 (int tilex, int tiley, int i);
|
|
|
|
void ParseMomentum(objtype *ob,int angle);
|
|
void SpawnGroundExplosion(int x, int y, int z);
|
|
void RayShoot (objtype * shooter, int damage, int accuracy);
|
|
void FindEmptyTile(int *stilex, int *stiley);
|
|
void T_Wind( objtype *ob );
|
|
void StopWind( void );
|
|
|
|
#endif
|