rott/rott/rt_actor.h

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