271 lines
7.3 KiB
C
Executable File
271 lines
7.3 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_door_public
|
|
#define _rt_door_public
|
|
|
|
//***************************************************************************
|
|
//
|
|
// RT_DOOR.C - doors
|
|
//
|
|
//***************************************************************************
|
|
|
|
#define MAXTOUCHPLATES 64
|
|
#define MAXMASKED 300 // max masked walls
|
|
#define MAXDOORS 150 // max number of sliding doors
|
|
#define MAXPWALLS 150 // max number of pushwalls
|
|
#define DF_TIMED 0x01
|
|
#define DF_ELEVLOCKED 0x02
|
|
#define DF_MULTI 0x04
|
|
#define MAXELEVATORS 16
|
|
|
|
#define PW_DAMAGE 0x01
|
|
|
|
#define NUMELEVATORACTIONS 5
|
|
|
|
typedef enum
|
|
{ev_ras, //ready at source
|
|
ev_rad, //ready at destination
|
|
ev_mts, //moving to source
|
|
ev_mtd, //moving to destination
|
|
//door at elevator location open
|
|
ev_doorclosing //door at elevator location closed
|
|
}estate;
|
|
|
|
typedef enum
|
|
{
|
|
mw_peephole,
|
|
mw_dogwall,
|
|
mw_multi1,
|
|
mw_multi2,
|
|
mw_multi3,
|
|
mw_singlepane,
|
|
mw_normal1,
|
|
mw_normal2,
|
|
mw_normal3,
|
|
mw_exitarch,
|
|
mw_secretexitarch,
|
|
mw_railing,
|
|
mw_hiswitchon,
|
|
mw_hiswitchoff,
|
|
mw_platform1,
|
|
mw_platform2,
|
|
mw_platform3,
|
|
mw_platform4,
|
|
mw_platform5,
|
|
mw_platform6,
|
|
mw_platform7,
|
|
mw_entrygate
|
|
}masked_walls;
|
|
|
|
typedef struct elevator
|
|
{ short sx,sy;
|
|
short dx,dy;
|
|
short esx,esy,edx,edy;
|
|
short door1,door2;
|
|
signed char state;
|
|
short doortoopen;
|
|
short doorclosing;
|
|
short ticcount;
|
|
short nextaction;
|
|
}elevator_t;
|
|
|
|
|
|
typedef struct doorstruct
|
|
{
|
|
thingtype which;
|
|
byte tilex,tiley;
|
|
word texture;
|
|
word alttexture;
|
|
word sidepic;
|
|
word basetexture;
|
|
byte lock;
|
|
byte flags;
|
|
short int ticcount;
|
|
signed char eindex;
|
|
boolean vertical;
|
|
int soundhandle;
|
|
int position;
|
|
enum {dr_open,dr_closed,dr_opening,dr_closing} action;
|
|
} doorobj_t;
|
|
|
|
typedef struct pwallstruct
|
|
{
|
|
thingtype which;
|
|
int x,y;
|
|
int momentumx,momentumy;
|
|
byte areanumber;
|
|
byte lock;
|
|
byte dir;
|
|
byte tilex,tiley;
|
|
byte num;
|
|
byte speed;
|
|
word texture;
|
|
int soundhandle;
|
|
enum {pw_npushed,pw_pushing,pw_pushed,pw_moving} action;
|
|
int state;
|
|
byte flags;
|
|
} pwallobj_t;
|
|
|
|
typedef struct tplate
|
|
{ void (*action)(long);
|
|
void (*swapaction)(long);
|
|
struct tplate * nextaction;
|
|
struct tplate * prevaction;
|
|
long whichobj;
|
|
byte tictime;
|
|
byte ticcount;
|
|
byte triggered;
|
|
byte done;
|
|
byte complete;
|
|
byte clocktype;
|
|
} touchplatetype;
|
|
|
|
#define MW_SHOOTABLE 0x01
|
|
#define MW_BLOCKING 0x02
|
|
#define MW_MULTI 0x04
|
|
#define MW_BLOCKINGCHANGES 0x08
|
|
#define MW_ABOVEPASSABLE 0x10
|
|
#define MW_NONDOGBLOCKING 0x20
|
|
#define MW_WEAPONBLOCKING 0x40
|
|
#define MW_BOTTOMPASSABLE 0x80
|
|
#define MW_MIDDLEPASSABLE 0x100
|
|
#define MW_ABP 0x200
|
|
#define MW_SWITCHON 0x400
|
|
#define MW_BOTTOMFLIPPING 0x800
|
|
#define MW_TOPFLIPPING 0x1000
|
|
#define M_ISDOOR(x,y) ((tilemap[x][y] & 0x8000) && (!(tilemap[x][y] & 0x4000)))
|
|
#define M_ISMWALL(x,y) ((tilemap[x][y] & 0x8000) && (tilemap[x][y] & 0x4000))
|
|
|
|
|
|
typedef struct mwall
|
|
{
|
|
thingtype which;
|
|
byte tilex,tiley;
|
|
signed char areanumber;
|
|
signed short toptexture;
|
|
signed short midtexture;
|
|
signed short bottomtexture;
|
|
word flags;
|
|
boolean vertical;
|
|
int sidepic;
|
|
|
|
struct mwall *next;
|
|
struct mwall *prev;
|
|
|
|
} maskedwallobj_t;
|
|
|
|
typedef struct animmwall
|
|
{
|
|
word num;
|
|
byte count;
|
|
signed char ticcount;
|
|
struct animmwall *next;
|
|
struct animmwall *prev;
|
|
|
|
} animmaskedwallobj_t;
|
|
|
|
extern elevator_t ELEVATOR[MAXELEVATORS];
|
|
extern int _numelevators;
|
|
extern animmaskedwallobj_t *FIRSTANIMMASKEDWALL,*LASTANIMMASKEDWALL;
|
|
extern maskedwallobj_t *FIRSTMASKEDWALL,*LASTMASKEDWALL;
|
|
extern byte touchindices[MAPSIZE][MAPSIZE],lasttouch;
|
|
extern touchplatetype *touchplate[MAXTOUCHPLATES],*lastaction[MAXTOUCHPLATES];
|
|
extern byte TRIGGER[MAXTOUCHPLATES];
|
|
|
|
extern doorobj_t *doorobjlist[MAXDOORS];
|
|
extern int doornum;
|
|
extern maskedwallobj_t *maskobjlist[MAXMASKED];
|
|
extern int maskednum;
|
|
extern pwallobj_t *pwallobjlist[MAXPWALLS];
|
|
extern int pwallnum;
|
|
// 0xffff = fully open
|
|
extern byte areaconnect[NUMAREAS][NUMAREAS];
|
|
extern boolean areabyplayer[NUMAREAS];
|
|
|
|
|
|
void ActivateAllPushWalls(void);
|
|
boolean CheckTile(int,int);
|
|
void FindEmptyTile(int*,int*);
|
|
int Number_of_Empty_Tiles_In_Area_Around(int,int);
|
|
void AddTouchplateAction(touchplatetype*,int);
|
|
void RemoveTouchplateAction(touchplatetype*,int);
|
|
|
|
void InitElevators(void);
|
|
void ProcessElevators(void);
|
|
void OperateElevatorDoor(int);
|
|
|
|
|
|
int PlatformHeight(int,int);
|
|
void Link_To_Touchplate(word, word, void (*)(long), void (*)(long), long, int);
|
|
void TriggerStuff(void);
|
|
void ClockLink(void (*)(long),void(*)(long),long,int);
|
|
void RecursiveConnect(int);
|
|
void ConnectAreas(void);
|
|
void InitAreas(void);
|
|
void InitDoorList(void);
|
|
void SpawnDoor(int,int,int,int);
|
|
void SpawnMaskedWall (int tilex, int tiley, int which, int flags);
|
|
void OpenDoor(int);
|
|
void CloseDoor(int);
|
|
void OperateDoor (int keys, int door, boolean localplayer );
|
|
void DoorOpen(int);
|
|
void DoorOpening(int);
|
|
void DoorClosing(int door);
|
|
void MoveDoors(void);
|
|
void SpawnPushWall (int tilex, int tiley, int lock, int texture, int dir, int type);
|
|
void MovePWalls(void);
|
|
void WallPushing (int pwall);
|
|
void PushWall (int pwall, int dir);
|
|
void OperatePushWall (int pwall, int dir, boolean localplayer );
|
|
void ActivatePushWall (long pwall);
|
|
void ActivateMoveWall (long pwall);
|
|
int UpdateMaskedWall (int num);
|
|
|
|
void FixDoorAreaNumbers ( void );
|
|
void FixMaskedWallAreaNumbers ( void );
|
|
void SaveMaskedWalls(byte ** buf, int * size);
|
|
void LoadMaskedWalls(byte * buf, int size);
|
|
void SaveDoors(byte ** buf, int * size);
|
|
void SaveTouchPlates(byte ** buf, int * size);
|
|
void LoadDoors(byte * buf, int size);
|
|
void LoadTouchPlates(byte * buf, int size);
|
|
void SavePushWalls(byte ** buf, int * sz);
|
|
void LoadPushWalls(byte * bufptr, int sz);
|
|
|
|
void DeactivateAnimMaskedWall(animmaskedwallobj_t* amwall);
|
|
void ActivateAnimMaskedWall(animmaskedwallobj_t* amwall);
|
|
|
|
void SpawnAnimatedMaskedWall ( int num );
|
|
void KillAnimatedMaskedWall ( animmaskedwallobj_t * temp );
|
|
|
|
void DoAnimatedMaskedWalls ( void );
|
|
|
|
void SaveElevators(byte ** buffer,int *size);
|
|
|
|
void LoadElevators(byte * buffer,int size);
|
|
|
|
void MakeWideDoorVisible ( int doornum );
|
|
void LinkedCloseDoor (long door);
|
|
void LinkedOpenDoor (long door);
|
|
int IsWall (int tilex, int tiley);
|
|
int IsDoor (int tilex, int tiley);
|
|
int IsMaskedWall (int tilex, int tiley);
|
|
#endif
|