/*	SCCS Id: @(#)jtp_win.h	1.0	2000/9/10	*/
/* Copyright (c) Jaakko Peltonen, 2000				  */
/* Modified by Jeroen Demeyer, 2003 */
/* NetHack may be freely redistributed.  See license for details. */

#ifndef _jtp_win_h_
#define _jtp_win_h_

#include "hack.h"
#include "jtp_def.h"

/* Graphics constants - these should really not be here */
#define JTP_MAX_SHADES 64 

/* Special window content types */
#define JTP_WINCONTENT_EMPTY -1
#define JTP_WINCONTENT_GLYPH_UNEXPLORED -1
#define JTP_WINCONTENT_GLYPH_NOT_VISIBLE -2

/* Menu handling constants */
#define JTP_NOT_SELECTABLE -12345

/*
 * Key constants for non-ascii keys; the platform-dependent 
 * code must make sure these are assigned correctly
 */
#define JTP_KEY_MENU_SCROLLUP -10
#define JTP_KEY_MENU_SCROLLDOWN -11
#define JTP_KEY_MENU_SCROLLLEFT -12
#define JTP_KEY_MENU_SCROLLRIGHT -13
#define JTP_KEY_MENU_SCROLLPAGEUP -14
#define JTP_KEY_MENU_SCROLLPAGEDOWN -15
#define JTP_KEY_PAUSE -16
#define JTP_KEY_INSERT -17
#define JTP_KEY_HOME -18
#define JTP_KEY_END -19

/* Maximum number of old messages stored by message window */
#define JTP_MAX_OLD_MESSAGES 50

/* Maximum number of messages displayed on-screen (default = 3) */
#define JTP_MAX_SHOWN_MESSAGES  (iflags.wc_vary_msgcount ? iflags.wc_vary_msgcount : 3)

/* JTP specific structure definitions */
typedef struct {
  void * itemdata;
  void * next;
  void * previous;
} jtp_listitem;

typedef struct {
  jtp_listitem * previous;
  jtp_listitem * header;
  int length;
} jtp_list;

typedef struct {
  char * text;                               /* Item description */
  anything id;                               /* Identifier of item */
  char accelerator;                          /* Key accelerator for the item */
  int glyph;                                 /* NetHack glyph for the item */
  int selected;                              /* Is the item selected? */
  int count;                                 /* Number of times selected */
  int x, y, width, height;                   /* Position and dimensions, in pixels */
} jtp_menuitem;

typedef struct {
  char * prompt;                             /* Prompt message */
  int prompt_x, prompt_y;                    /* Position of prompt message in window */
  int need_scrollbar;                        /* Is a scrollbar necessary? 1=yes, 0=no */
  int scrollbar_x, scrollup_y, scrolldown_y; /* Position of scrollbar, if applicable */
  int items_y;                               /* Position of content items in window */
  jtp_list * items;                          /* Menu items or text lines */
  int selectiontype;                         /* PICK_NONE, PICK_ONE, or PICK_MANY */
  int content_is_text;                       /* 1=Text display, 0=menu display */
} jtp_menu;

typedef struct {
  winid id;                  /* The window id, for example, WIN_STATUS */
  int active;                /* Is the window active or dormant? */
  int wintype;               /* The window type, for example, NHW_MENU */
  int ending_type;           /* Is the NHW_TEXT window an 'end screen' for some ending type? */
  int x, y;                  /* Position of upper left corner on-screen, in pixels */
  int width, height;         /* Window dimensions, in pixels */
  int curs_x, curs_y;        /* Location of text cursor in window content, in characters */
  int curs_rows, curs_cols;  /* Window content dimensions, in characters */
  int **rows;                /* Window content, indexed by row and column */
  jtp_menu * menu;           /* Possible menu content, only for NHW_MENU */
  jtp_list * buttons;        /* Possible button content, only for NHW_MENU */
} jtp_window;

typedef struct {
  unsigned char * border_top;
  unsigned char * border_bottom;
  unsigned char * border_left;
  unsigned char * border_right;
  unsigned char * corner_tl;
  unsigned char * corner_tr;
  unsigned char * corner_bl;
  unsigned char * corner_br;
  unsigned char * center;
  unsigned char * radiobutton_on;
  unsigned char * radiobutton_off;
  unsigned char * checkbox_on;
  unsigned char * checkbox_off;
  unsigned char * scrollbar;
  unsigned char * scrollbutton_up;
  unsigned char * scrollbutton_down;
  unsigned char * scroll_indicator;
  unsigned char * direction_arrows;
} jtp_window_graphics;

typedef struct { 
                unsigned char *graphic;
                int xmod,ymod;
               }jtp_tilestats;

typedef struct {
  jtp_tilestats * west;
  jtp_tilestats * north;
  jtp_tilestats * east;
  jtp_tilestats * south;
} jtp_wall_style;

typedef struct {
  int xspan, yspan;
  jtp_tilestats ** pattern;
} jtp_floor_style;

typedef struct {
  jtp_tilestats * west;
  jtp_tilestats * north;
  jtp_tilestats * east;
  jtp_tilestats * south;
  jtp_tilestats * northwest;
  jtp_tilestats * northeast;
  jtp_tilestats * southwest;
  jtp_tilestats * southeast;
  jtp_tilestats * northwest_bank;
  jtp_tilestats * northeast_bank;
  jtp_tilestats * southwest_bank;
  jtp_tilestats * southeast_bank;
} jtp_floor_edge_style;

typedef struct {
  int x, y;        /* Position in the map window */
  int style, pos;  /* Floor decor style (=floor style) and position in it */
} jtp_floor_decor;


typedef struct {
  int x;
  int y;
  int width;
  int height;
  int id;
  char accelerator;
  char * text;
} jtp_button;


typedef struct {
                int tindex;
                unsigned char elevation;
               }jtp_maptile;

typedef struct {
  char * searchpattern;
  int soundtype;
  char * filename;
} jtp_event_sound;

/* Variables provided by the Falcon's Eye interface */
extern int ** jtp_mapglyph_cmap;
extern int ** jtp_mapglyph_obj;
extern int ** jtp_mapglyph_mon;
extern int jtp_map_width, jtp_map_height;
extern int jtp_map_changed;
extern jtp_list * jtp_windowlist;
extern int jtp_max_window_id;
extern int jtp_first_shown_message;

extern int jtp_is_spellbook_being_viewed;   /* Is the user viewing the spellbook? */
extern int jtp_is_backpack_shortcut_active; /* Has the user selected an action from the backpack screen? */
extern int jtp_backpack_shortcut_action;    /* The selected action */

extern int jtp_you_x, jtp_you_y;     /* Location of player character on the map */
extern int jtp_old_you_x, jtp_old_you_y; /* Previous location of player character on the map */
extern int jtp_map_x, jtp_map_y;     /* Center of displayed map area */

extern int jtp_recenter_after_movement; /* Interface option */
extern int jtp_play_music;              /* Interface option */
extern int jtp_play_effects;            /* Interface option */
extern int jtp_quit_nethack;            /* Interface option: quit after game ends? */
extern int jtp_fullscreen;              /* Interface option: play in fullscreen mode? */
extern char * jtp_external_midi_player_command; /* Interface option */
extern char * jtp_external_mp3_player_command;  /* Interface option */

extern int jtp_tile_conversion_initialized; /* Have the tile conversion tables been set up? */

/* Function declarations */
extern jtp_list *  jtp_list_new();
extern void        jtp_list_reset(jtp_list *list_to_reset);
extern void        jtp_list_advance(jtp_list *list_to_advance);
extern void *      jtp_list_current(jtp_list *list_to_access);
extern void        jtp_list_add(jtp_list *list_to_access, void *item_to_add);
extern void        jtp_list_remove(jtp_list *list_to_access, void *item_to_remove);
extern int         jtp_list_length(jtp_list *list_to_access);
extern jtp_window *jtp_find_window(winid);
extern void        jtp_free_menu(jtp_menu *menu_to_free);
extern void        jtp_free_buttons(jtp_list *buttonlist);
extern void        jtp_clear_screen();
extern unsigned char * jtp_draw_window(int x, int y, int width, int height);
extern void        jtp_draw_button(int x, int y, int width, int height, char *str);
extern void        jtp_draw_all_windows();
extern void        jtp_show_screen();
extern void        jtp_show_map_area();
extern void        jtp_show_status_area();
extern void        jtp_show_message_area(int messages_height);
extern void        jtp_read_mouse_input();
extern int         jtp_query(int qx, int qy, const char *qmessage, int nanswers, char *panswers, int is_dropdown);
extern void        jtp_messagebox(const char *message);
extern char        jtp_process_mouseclick();
extern char        jtp_whatis_mouseclick();
extern void        jtp_get_input(int, int, const char *ques, char *input);
extern void        jtp_askname();
extern int         jtp_get_menu_selection(jtp_window *menuwindow);
extern void        jtp_get_menu_coordinates(jtp_window *menuwindow);
extern void        jtp_get_map_input();
extern void        jtp_draw_map(jtp_window *, int, int);
extern void        jtp_draw_status(jtp_window *);
extern int         jtp_draw_messages(jtp_window *);
extern void        jtp_exit_graphics();
extern int         jtp_is_onscreen(int x, int y);
extern void        jtp_show_logo_screen();
extern void        jtp_show_ending(jtp_window *);
extern int         jtp_swap_key(int);
extern void        jtp_play_ambient_sound(int);
extern void        jtp_play_event_sound(const char *);
extern void        jtp_play_command_sound(int);
extern void        jtp_init_glyph_tiles();
extern struct permonst *jtp_do_lookat(int, int, char *, char *);

#endif
/* End of jtp_win.h */
