wolf3d-ios/wolf3d/code/wolf/wolf_level.h

293 lines
6.3 KiB
C

/*
Copyright (C) 2004 Michael Liebscher
Copyright (C) 2000-2002 by DarkOne the Hacker
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.
*/
/*
* wolf_level.h: Wolfenstein3-D level management.
*
* Author: Michael Liebscher <johnnycanuck@users.sourceforge.net>
* Date: 2004
*
* Acknowledgement:
* Portion of this code was derived from NewWolf, and was originally
* written by DarkOne the Hacker.
*
* Acknowledgement:
* Portion of this code was derived from Wolfenstein3-D, and was originally
* written by Id Software, Inc.
*
*/
/*
Notes:
This module is implemented by wolf_areas.c, wolf_doors.c, wolf_level.c and
wolf_pushwalls.c
*/
#ifndef __WOLF_LEVEL_H__
#define __WOLF_LEVEL_H__
///////////////////
//
// Areas
//
///////////////////
#define NUMAREAS 37 // number of areas
#define FIRSTAREA 0x6B // first area in map data (it is by the way a way to the secret floor!)
#define AMBUSHTILE 0x6A // def guard
#define AMBUSH -2
///////////////////
//
// Doors
//
///////////////////
#define MAX_DOORS 256
#define DOOR_TIMEOUT 300
#define DOOR_MINOPEN 50
#define DOOR_FULLOPEN 63
#define DOOR_VERT 255
#define DOOR_HORIZ 254
#define DOOR_E_VERT 253
#define DOOR_E_HORIZ 252
#define DOOR_G_VERT 251
#define DOOR_G_HORIZ 250
#define DOOR_S_VERT 249
#define DOOR_S_HORIZ 248
#define FIRST_DOOR 248
#define LAST_LOCK 251
#define TEX_DOOR 126
// texture IDs used by cache routines
#define TEX_DDOOR (0 + TEX_DOOR) // Simple Door
#define TEX_PLATE (2 + TEX_DOOR) // Door Plate
#define TEX_DELEV (4 + TEX_DOOR) // Elevator Door
#define TEX_DLOCK (6 + TEX_DOOR) // Locked Door
///////////////////
//
// Level
//
///////////////////
#define WALL_TILE 1
#define PUSHWALL_TILE (1 << 20)
#define DOOR_TILE 2
#define SECRET_TILE 4
#define DRESS_TILE 8
#define BLOCK_TILE 16
#define ACTOR_TILE 32
#define DEADACTOR_TILE 64
#define POWERUP_TILE 128
#define AMBUSH_TILE 256
#define EXIT_TILE 512
#define SECRETLEVEL_TILE 1024
#define ELEVATOR_TILE (1 << 11)
#define TILE_IS_E_TURN (1 << 12)
#define TILE_IS_NE_TURN (1 << 13)
#define TILE_IS_N_TURN (1 << 14)
#define TILE_IS_NW_TURN (1 << 15)
#define TILE_IS_W_TURN (1 << 16)
#define TILE_IS_SW_TURN (1 << 17)
#define TILE_IS_S_TURN (1 << 18)
#define TILE_IS_SE_TURN (1 << 19)
#define SOLID_TILE (WALL_TILE | BLOCK_TILE | PUSHWALL_TILE)
#define BLOCKS_MOVE_TILE (WALL_TILE | BLOCK_TILE | PUSHWALL_TILE | ACTOR_TILE)
#define WAYPOINT_TILE (TILE_IS_E_TURN | TILE_IS_NE_TURN | TILE_IS_N_TURN | TILE_IS_NW_TURN | TILE_IS_W_TURN | TILE_IS_SW_TURN | TILE_IS_S_TURN | TILE_IS_SE_TURN )
///////////////////
//
// Doors
//
///////////////////
typedef enum
{
dr_closing = -1,
dr_closed,
dr_opening,
dr_open
} dr_state;
typedef struct
{
int tilex, tiley;
_boolean vertical;
int ticcount;
dr_state action;
int area1, area2;
/*DOOR_VERT 255
DOOR_HORIZ 254
DOOR_E_VERT 253
DOOR_E_HORIZ 252
DOOR_G_VERT 251
DOOR_G_HORIZ 250
DOOR_S_VERT 249
DOOR_S_HORIZ 248*/
int type;
int texture;
} doors_t;
typedef struct
{
int doornum;
doors_t *Doors[ 256 ];
doors_t DoorMap[ 64 ][ 64 ];
} LevelDoors_t;
#define MAX_POWERUPS 1000
///////////////////
//
// Level
//
///////////////////
typedef struct
{
char fname[ 32 ]; /* Map filename */
W16 Plane1[ 64 * 64 ]; /* walls */
W16 Plane2[ 64 * 64 ]; /* objects */
W16 Plane3[ 64 * 64 ]; /* other */
long tilemap[ 64 ][ 64 ]; // wall values only
W8 spotvis[ 64 ][ 64 ];
// objtype *actorat[ 64 ][ 64 ];
// this is an array of references to texture descriptions
// the renderer must know what to draw by this number
int wall_tex_x[ 64 ][ 64 ]; // x_wall
int wall_tex_y[ 64 ][ 64 ]; // y_wall
// this is a (0-based) array of area numbers!
// must be all filled by level loading sub
// if -1 it is a wall, if -2 it is a door, if -3 it is unknown
int areas[ 64 ][ 64 ];
LevelDoors_t Doors;
placeonplane_t pSpawn; // player spawn place
powerup_t powerups[MAX_POWERUPS];
int numPowerups;
sprite_t sprites[ MAX_SPRITES ];
int numSprites;
char mapName[128]; /* Map name */
char musicName[128]; /* Music file name */
colour3_t ceilingColour, floorColour;
W8 tileEverVisible[ 64 ][ 64 ]; // for automap
} LevelData_t;
typedef struct statinfo_t
{
_boolean block;
int powerup;
} statinfo_t;
extern LevelData_t *r_world;
extern LevelData_t levelData;
extern LevelData_t *Level_LoadMap( const char *levelname );
extern void Level_PrecacheTextures_Sound( LevelData_t *lvl );
extern _boolean Level_CheckLine( SW32 x1, SW32 y1, SW32 x2, SW32 y2, LevelData_t *lvl );
extern void Level_ScanInfoPlane( LevelData_t *lvl );
///////////////////
//
// Doors
//
///////////////////
extern void Door_ResetDoors( LevelDoors_t *lvl );
extern int Door_SpawnDoor( LevelDoors_t *lvl, int x, int y, int type );
extern void Door_SetAreas( LevelDoors_t *lvl, int (*areas)[64] );
extern void Door_OpenDoor( doors_t *Door );
extern void Door_ProcessDoors_e( LevelDoors_t *lvl, int t_tk );
extern int Door_Opened( LevelDoors_t *lvl, int x, int y );
extern _boolean Door_TryUse( doors_t *Door, int keys );
///////////////////
//
// Areas
//
///////////////////
extern _boolean areabyplayer[ NUMAREAS ];
extern void Areas_ConnectAreas( int areanumber );
extern void Areas_InitAreas( int areanumber );
extern void Areas_JoinAreas( int area1, int area2 );
extern void Areas_DisconnectAreas( int area1, int area2 );
///////////////////
//
// Push Walls
//
///////////////////
typedef struct
{
_boolean active;
int PWtilesmoved;
int PWpointsmoved;
dir4type dir;
int x, y;
int dx, dy;
int tex_x, tex_y;
} Pwall_t;
extern Pwall_t PWall;
extern void PushWall_Reset( void );
extern _boolean PushWall_Push( int x, int y, dir4type dir );
extern void PushWall_Process( void );
#endif /* __WOLF_LEVEL_H__ */