#ifndef v6_H
#define v6_H

#define WPROP_Y 0
#define WPROP_X 1
#define WPROP_Y_HEIGHT 2
#define WPROP_X_WIDTH 3
#define WPROP_Y_CURSOR 4
#define WPROP_X_CURSOR 5
#define WPROP_L_MARGIN 6
#define WPROP_R_MARGIN 7
#define WPROP_INTERRUPT_ROUTINE 8
#define WPROP_INTERRUPT_COUNT 9
#define WPROP_TEXT_STYLE 10
#define WPROP_COLOUR_DATA 11
#define WPROP_FONT_NUMBER 12
#define WPROP_FONT_SIZE 13
#define WPROP_ATTRIBUTES 14
#define WPROP_LINE_COUNT 15
#define WPROP_TRUE_FG 16
#define WPROP_TRUE_BG 17

#define WATTR_WRAPPING 1
#define WATTR_SCROLL 2
#define WATTR_SCRIPT 4
#define WATTR_BUFFER 8

extern unsigned wind_prop[8][18];

extern int game_wants_caret;

extern int mouse_window;

extern FILE * restrict GFile;

extern int buffer_screen_mode;

typedef struct
{
    unsigned char part;
    unsigned char flags;
    unsigned short unknown1;
    unsigned short images;
    unsigned short unknown2;
    unsigned char dir_size;
    unsigned char unknown3;
    unsigned short checksum;
    unsigned short unknown4;
    unsigned short version;
} gfx_header;

extern gfx_header GHeader;

#define alpha_NONE 0
#define alpha_SIMPLE 1
#define alpha_COMPLEX 254

typedef struct
{
    short image_number;
    short phys_width;
    short phys_height;
    short image_flags;
    long image_data_addr;
    long image_data_length;
    long image_cm_addr;
    int image_width;      // z-pixels
    int image_height;     // z-pixels
    struct bb_aux_pict_struct *aux;
    char alphatype;
    char jpeg;
    char adaptive;
} gfx_dir;

typedef struct
{
    short width;
    short height;
    short colours;
    long pixels;
    unsigned char *image;
    unsigned char (*colourmap)[3];
} gfx_image;

void z_draw_picture(int argc, unsigned *argv);
void z_picture_data(unsigned picture, unsigned table);
void z_erase_picture(int argc, unsigned *argv);
void z_set_margins(int argc, unsigned *argv);
void z_move_window(short window, unsigned y, unsigned x);
void z_window_size(short window, unsigned y, unsigned x);
void z_window_style(int argc, unsigned *argv);
void z_get_wind_prop(short window, unsigned property);
void z_scroll_window(unsigned window, short pixels);
void z_push_stack(int argc, unsigned *argv);
void z_pop_stack(int argc, unsigned *argv);
void z_mouse_window(short window);
void z_put_wind_prop(short window, unsigned property, unsigned value);
void z_print_form(unsigned table);
void z_make_menu(unsigned menu, unsigned table);
void z_picture_table(unsigned table);
void z_buffer_screen(short mode);

void v6z_get_cursor(int table);
void v6z_set_cursor(int, unsigned *);
void v6z_set_font(unsigned f, short w);
void v6z_erase_window(short w);
void v6z_print_table(int table, int width, int height, int skip);
void v6z_split_window(int lines);

void v6_set_text_style(int);
void v6_update_char_size(void);

void v6_output_new_line(void);

void v6_resize_screen(int w, int h);

void v6_prepare_gfx(void);
gfx_dir *v6_image_info(int image);

void v6_signal_refresh(void);

unsigned short ntohs(unsigned short);
unsigned long ntohl(unsigned long);

#endif
