/*
 * $Id: location.h,v 1.13 2003/10/21 19:09:23 dougday Exp $
 */

#ifndef LOCATION_H
#define LOCATION_H

#include "map.h"
#include "movement.h"

typedef unsigned char (*TileAt)(const Map *map, int x, int y, int z, int withObjects);

typedef enum {
    CTX_WORLDMAP    = 0x0001,
    CTX_COMBAT      = 0x0002,
    CTX_CITY        = 0x0004,
    CTX_DUNGEON     = 0x0008,
    CTX_ALTAR_ROOM  = 0x0010  /* FIXME: implement */
} LocationContext;

#define CTX_ANY             (0xffff)
#define CTX_NORMAL          (CTX_WORLDMAP | CTX_CITY)
#define CTX_NON_COMBAT      (CTX_ANY & ~CTX_COMBAT)
/* FIXME: need to be able to save in dungeons */
//#define CTX_CAN_SAVE_GAME   (CTX_WORLDMAP | CTX_DUNGEON)
#define CTX_CAN_SAVE_GAME   (CTX_WORLDMAP)

typedef void (*FinishTurnCallback)(void);

typedef struct _Location {
    int x;
    int y;
    int z;	
	Map *map;
    int viewMode;
    LocationContext context;
    FinishTurnCallback finishTurn;
    MoveCallback move;
    TileAt tileAt;
    struct _Location *prev;
} Location;

Location *locationNew(int x, int y, int z, Map *map, int viewmode, LocationContext ctx, FinishTurnCallback finishTurnCallback, MoveCallback moveCallback, TileAt tileAtCallback, Location *prev);
unsigned char locationVisibleTileAt(Location *location, int x, int y, int z, int *focus);
int locationGetCurrentPosition(Location *location, int *x, int *y, int *z);
void locationFree(Location **stack);

#endif
