/* NetHack 3.7	mhstatus.h	$NHDT-Date: 1596498361 2020/08/03 23:46:01 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.15 $ */
/* Copyright (C) 2001 by Alex Kompel 	 */
/* NetHack may be freely redistributed.  See license for details. */

#ifndef MSWINStatusWindow_h
#define MSWINStatusWindow_h

#include "winMS.h"
#include "config.h"
#include "global.h"

#define NHSW_LINES 2

static const int fieldorder1[] = { BL_TITLE, BL_STR, BL_DX,    BL_CO,    BL_IN,
                             BL_WI,    BL_CH,  BL_ALIGN, BL_SCORE, -1 };
static const int fieldorder2[] = { BL_LEVELDESC, BL_GOLD,      BL_HP,   BL_HPMAX,
                             BL_ENE,       BL_ENEMAX,    BL_AC,   BL_XP,
                             BL_EXP,       BL_HD,        BL_TIME, BL_HUNGER,
                             BL_CAP,       BL_CONDITION, -1 };
static const int *fieldorders[] = { fieldorder1, fieldorder2, NULL };
static const int fieldcounts[NHSW_LINES] = { SIZE(fieldorder1) - 1, SIZE(fieldorder2) - 1};

#define MSWIN_MAX_LINE1_STRINGS (SIZE(fieldorder1) - 1)
#define MSWIN_MAX_LINE2_STRINGS (SIZE(fieldorder2) - 1 + CONDITION_COUNT)
#define MSWIN_MAX_LINE_STRINGS (MSWIN_MAX_LINE1_STRINGS > MSWIN_MAX_LINE2_STRINGS ? \
                                MSWIN_MAX_LINE1_STRINGS : MSWIN_MAX_LINE2_STRINGS)

#define MSWIN_LINE1_FIELDS (SIZE(fieldorder1) - 1)
#define MSWIN_LINE2_FIELDS (SIZE(fieldorder2) - 1)
#define MSWIN_MAX_LINE_FIELDS (MSWIN_LINE1_FIELDS > MSWIN_LINE2_FIELDS ? \
                               MSWIN_LINE1_FIELDS : MSWIN_LINE2_FIELDS)

/* when status hilites are enabled, we use an array of mswin_status_strings
 * to represent what needs to be rendered. */
typedef struct mswin_status_string  {
    const char * str; /* ascii string to be displayed */
    boolean space_in_front; /* render with a space in front of string */
    int color; /* string text color index */
    int attribute; /* string text attributes */
    boolean draw_bar; /* draw a percentage bar  */
    int bar_percent; /* a percentage to indicate */
    int bar_color; /* color index of percentage bar */
    int bar_attribute; /* attributes of percentage bar */
} mswin_status_string;

typedef struct mswin_status_strings
{
    int count;
    mswin_status_string * status_strings[MSWIN_MAX_LINE_STRINGS];
} mswin_status_strings;

typedef struct mswin_status_field {
    int field_index; // field index
    boolean enabled; // whether the field is enabled
    const char * name; // name of status field
    const char * format; // format of field
    boolean space_in_front; // add a space in front of the field

    int percent;
    int color;
    int attribute;
    char string[BUFSZ];

} mswin_status_field;

typedef struct mswin_condition_field {
    int mask;
    const char * name;
    int bit_position;
} mswin_condition_field;

typedef struct mswin_status_fields {
    int count;
    mswin_status_field * status_fields[MSWIN_MAX_LINE_FIELDS];
} mswin_status_fields;

typedef struct mswin_status_line {
    mswin_status_strings status_strings;
    mswin_status_fields status_fields;
} mswin_status_line;

typedef struct mswin_status_lines {
    mswin_status_line lines[NHSW_LINES]; /* number of strings to be rendered on each line */
} mswin_status_lines;

HWND mswin_init_status_window(void);
void mswin_status_window_size(HWND hWnd, LPSIZE sz);

#endif /* MSWINStatusWindow_h */
