rott/rott/_rt_acto.h

297 lines
11 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_private
#define _rt_actor_private
#define MAXGIBS 600
#define HAAPT 24
#define VAAPT 24
#define GODHAPT 1024
#define GODVAPT 1024
#define MAXDELTAYZSHOOT (((5*FINEANGLES)/360))
#define MAXDELTAYZSEE (((15*FINEANGLES)/360))
#define MAXSHOOTOFFSET (((15*FINEANGLES)/360))
#define MAXSHOOTSHIFT (1)
#define MAXDAMAGE (64)
#define MAXYZANGLE (((30*FINEANGLES)/360))
#define SMOKEWALLOFFSET (0x800)
#define MZADJUST 0x30000;
#define MAXSTEPHEIGHT 24
#define SIGN(x) ((x)>=0)?(1):(-1)
#define MAXRAIN 128
#define SG_PSTAT 0x4000
#define SG_PSTATE 0x2000
#define EXPLOSION_DAMAGE 50
#define LOWFALLCLIPZ (maxheight - 96)
#define HIGHFALLCLIPZ -5
#define LOWRISECLIPZ (nominalheight)
#define HIGHRISECLIPZ 64
#define NORMALGIBSPEED 0x2f00
#define FL_PLEADING 0x400
#define FL_EYEBALL 0x400
#define FL_UNDEAD 0x8000
#define NME_DRUNKTYPE 0x01
#define NME_HEATSEEKINGTYPE 0x02
#define NUMSTATES 11
enum {
STAND,
PATH,
COLLIDE1,
COLLIDE2,
CHASE,
USE,
AIM,
DIE,
FIRE,
WAIT,
CRUSH
};
#define SHOTMOM 0x200l
#define NEXT 1
#define PREV 0
#define ANGLEMOVE 0x2b000l
#define PAINTIME 5l
#define LOOKAHEAD (20 << 16)
#define DRAINTIME 70l
#define EXPLOSION_IMPULSE 0x2600l
#define ZEROMOM ob->momentumx = ob->momentumy = 0
#define NOMOM ((!ob->momentumx) && (!ob->momentumy))
#define WHICHACTOR (ob->obclass-lowguardobj)
#define SPDPATROL 0x600l
//#define ENEMYRUNSPEED (3*SPDPATROL)
#define ENEMYRUNSPEED (0xc00)
#define ENEMYFASTRUNSPEED (5*SPDPATROL)
#define ENEMYINSANESPEED (7*SPDPATROL)
#define MAXMOVE 0x2000l
#define PROJECTILESIZE 0x6000l
#define DEADFRICTION 0x6000l
#define ROLLMOMENTUM 0x920l
#define PROJSIZE 0x4000l
#define PILLARMOM 0x800l
#define HALFGLOBAL1 (TILEGLOBAL/2)
#define TOUCHDIST 0xb000l
#define STANDDIST 0x5000l
#define SNAKERAD 0x4000l
#define MINSIGHT 0x18000l
#define HBM -2
#define SNEAKY -3
#define GIBVALUE -3
#define DISKMOMZ 4
//=========================== macros =============================
#define M_ISWALL(x) ((x->which == WALL) || (x->which == PWALL) || (x->which == MWALL))
#define M_DISTOK(p1,p2,d) (abs((p1)-(p2)) <= d)
#define M_NONS(x) ((x->obclass == wallfireobj) || (x->obclass == pillarobj))
#define M_CHOOSETIME(x) ((int)(TILEGLOBAL/((x->speed))))
#define M_DIST(x1,x2,y1,y2) (((x1-x2)*(x1-x2))+((y1-y2)*(y1-y2)))
#define M_S(x) (UPDATE_STATES[x][ob->obclass-lowguardobj])
#define Fix(a) (a &= (FINEANGLES - 1))
#define STOPACTOR(ob) \
{ \
ob->momentumx = ob->momentumy = 0; \
ob->dirchoosetime = 0; \
}
#define M_CHECKDIR(ob,tdir) \
{ \
ob->dir = tdir; \
ParseMomentum(ob,dirangle8[tdir]); \
ActorMovement(ob); \
if (ob->momentumx || ob->momentumy) \
return; \
} \
#define M_CHECKTURN(x,ndir) \
{ \
if (ndir == olddir) \
ZEROMOM; \
ParseMomentum(x,dirangle8[ndir]); \
ActorMovement(x); \
if (!NOMOM) \
{ \
if (ndir != olddir) \
{ \
next = dirorder[olddir][NEXT]; \
prev = dirorder[olddir][PREV]; \
x->temp1 = ndir; \
if (dirdiff[ndir][next] < dirdiff[ndir][prev]) \
NewState(x,&s_kristleft); \
else \
NewState(x,&s_kristright); \
} \
return; \
} \
} \
#define M_CheckDoor(ob) \
{ \
door = ob->door_to_open; \
if (door != -1) \
{ \
if ((ob->obclass > shurikenobj) && \
(ob->obclass != collectorobj) \
) \
Error("you got it !!!"); \
LinkedOpenDoor(door); \
if (doorobjlist[door]->action != dr_open) \
return; \
ob->door_to_open = -1; \
} \
} \
#define M_CheckBossSounds(ob) \
{ \
if ((ob->obclass >= b_darianobj) && \
(ob->obclass <= b_darksnakeobj) && \
(ob->flags & FL_ATTACKMODE) && \
(ob->obclass != b_robobossobj) && \
(!(ob->flags & FL_DYING)) \
) \
{ \
if (MISCVARS->SOUNDTIME) \
MISCVARS->SOUNDTIME --; \
else \
{ \
MISCVARS->SOUNDTIME = 5*VBLCOUNTER; \
if (GameRandomNumber("boss sound check",0)<160) \
{ \
int rand,sound; \
\
rand = GameRandomNumber("boss sounds",0); \
sound = BAS[ob->obclass].operate; \
if (rand < 160) \
sound ++; \
if (rand < 80) \
sound ++; \
\
SD_PlaySoundRTP(sound,ob->x,ob->y); \
} \
} \
if (MISCVARS->REDTIME) \
{ \
MISCVARS->REDTIME --; \
MISCVARS->redindex = ((MISCVARS->REDTIME >> 1) & 15);\
} \
} \
}
#define SET_DEATH_SHAPEOFFSET(ob) \
{ \
ob->flags |= FL_ALTERNATE; \
ob->shapeoffset += deathshapeoffset[ob->obclass]; \
}
#define RESET_DEATH_SHAPEOFFSET(ob) \
{ \
ob->flags &= ~FL_ALTERNATE; \
ob->shapeoffset -= deathshapeoffset[ob->obclass]; \
}
#define LOW_VIOLENCE_DEATH_SHOULD_BE_SET(ob) \
((gamestate.violence < vl_high) && \
(ob->obclass >= lowguardobj) && \
(ob->obclass <= triadenforcerobj) && \
(!(ob->flags & FL_ALTERNATE)) \
) \
#define LOW_VIOLENCE_DEATH_IS_SET(ob) (ob->flags & FL_ALTERNATE)
#define LOW_VIOLENCE_PAIN_SHOULD_BE_SET LOW_VIOLENCE_DEATH_SHOULD_BE_SET
#define LOW_VIOLENCE_PAIN_IS_SET LOW_VIOLENCE_DEATH_IS_SET
#define SET_PAIN_SHAPEOFFSET SET_DEATH_SHAPEOFFSET
#define RESET_PAIN_SHAPEOFFSET RESET_DEATH_SHAPEOFFSET
// default = actor
typedef struct sat
{ int x,y,z;
unsigned flags;
int hitpoints;
int targetx,targety;
int angle;
int yzangle;
int speed;
int momentumx,momentumy,momentumz;
int temp1,temp2,temp3;
int whateverindex,targetindex;
short ticcount;
short shapeoffset;
short stateindex;
short dirchoosetime;
byte areanumber;
byte obclass;
signed char door_to_open;
signed char dir;
}saved_actor_type;
typedef struct
{thingtype which;
byte tilex,tiley;
fixed x,y,z;
}tpoint;
//========================== Function Prototypes ==============================
void MissileMovement(objtype*);
boolean MissileTryMove(objtype*,int,int,int);
void T_DarkSnakeChase(objtype*);
void HeatSeek(objtype*);
boolean CheckDoor(objtype *ob,doorobj_t*,int,int);
boolean NextToDoor(objtype*ob);
void MissileHit (objtype *ob,void*);
int Near(objtype*,void*,int);
void FirstSighting(objtype*);
void SelectOrobotChaseDir(objtype*);
void SelectPathDir(objtype*);
void SelectChaseDir(objtype*);
void SelectRoboChaseDir(objtype*);
void SelectDodgeDir(objtype*);
void SelectRollDir (objtype*);
void SelectTouchDir(objtype*);
void SelectMineDir(objtype*);
boolean WallCheck(int,int);
boolean NMEspincheck(objtype*);
void TurnActorIntoSprite(objtype*ob);
void ActivateEnemy(objtype*);
#endif