/* $Id: map.h,v 1.15 2004/02/08 01:34:46 stpohle Exp $ */
/* map.h */

#ifndef _MAP_H_
#define _MAP_H_

#define FIELDCHECK_TIMEOUT 2.0 /* timeout for the field check function */
#define FIELDHURRYWARN 5.0  /* hurry warning */
#define FIELDHURRYDROPTO 0.5 /* timeout when to put in some special items */
#define FIELDHURRYSIZE 0.25    /* timeout forresizeing the game */
#define FIELDHURRYSIZEMIN 5 /* min size for the field */
#define FIELDHURRYTIMEOUT 120.0	// game timeout for hurry and dropping mode (1min)

#define ANI_STONETIMEOUT 1.0	// factor for the animation frame je seconds
#define ANI_POWERUPTIMEOUT 0.5  // factor for powerup animations

/* this is the minimum distance that starting points should be set apart from each
 * other.  If the given tolerence cannot be satisfied on the map, it will be decremented
 * by 1 until it can be satisfied.  this is just our initial value
 */
 
#define MAP_POSITION_TOLERENCE 10

struct __ex_field {
	unsigned char count;
	float frame;
	int bomb_b;			// BombID from the last know
	int bomb_p;			// explosion on this field
} typedef _ex_field;


struct __field {
    unsigned char type;
	signed char mixframe;		// data for the mixed frame
    float frame;                // frame (frame > 0 && FS_stone)
    unsigned char special;      // to save special stones, or the tunnel number
    _ex_field ex[4];          	// count up every explosion there is on this field for ever direction
    Sint32 ex_nr;               // number to identify the explosion.
} typedef _field;


/* holds the locatition of a start point and the use count */

struct __start_point {
	_point pos;
	int used;
} typedef _start_point;


struct __map {
	_point size;			// dimension of the field

    _field field[MAX_FIELDSIZE_X][MAX_FIELDSIZE_Y];
	_point tunnel[GAME_MAX_TUNNELS];  // save the destination of the tunnel
	unsigned char bfield[MAX_FIELDSIZE_X][MAX_FIELDSIZE_Y]; // will hold informations if ther is a bomb

	char tileset [LEN_TILESETNAME];
	signed char random_tileset;
	char map [LEN_PATHFILENAME];
	signed char map_selection;
	signed char type;		// type of the map (MAPT_*);
	int bombs;
	int fire;
	int shoes;
	int mixed;
	int death;
	int sp_trigger;
	int sp_push;
	int sp_row;
	int sp_kick;
	unsigned char state; // state of the map
	_start_point start_point[MAX_PLAYERS];  // array of starting points for this map
} typedef _map;


extern _map map;

// mapmenu.c
extern void mapmenu ();
extern void mapinfo ();
extern void mapgamesetting ();

// map.c
extern void map_random ();
extern void map_genrandom ();
extern void init_map_tileset();
extern void map_new (char *filename);
extern void map_load (FILE * fmap);
extern void map_set_playerposition (int usermap);
/* new functions for player positioning */

extern int map_ensure_corner_start_points();
extern int map_init_start_points();
extern int map_set_start_point(int idx, int x, int y);
extern int map_add_start_point(int x, int y);
extern int map_is_start_point(int x, int y);
extern int map_num_defined_start_points();
extern int map_check_start_point(int x, int y, int tol);
extern int map_check_and_add_start_point(int x, int y, int tol);
extern int map_find_and_add_start_points(int num, int tol);
extern int map_is_possible_start_point(int x, int y);
extern int map_create_and_add_start_point(int tol);
extern int map_is_removable_field(int x, int y);
extern int map_place_player(int pl);
extern int map_respawn_player(int pl);

#endif
