1 /* NetHack 3.6 mhstatus.c $NHDT-Date: 1432512798 2015/05/25 00:13:18 $ $NHDT-Branch: master $:$NHDT-Revision: 1.17 $ */
2 /* Copyright (C) 2001 by Alex Kompel */
3 /* NetHack may be freely redistributed. See license for details. */
11 #define MAXWINDOWTEXT 255
13 #define NHSTAT_LINES_2 2
14 #define NHSTAT_LINES_4 4
15 typedef struct mswin_nethack_status_window {
17 char window_text[MAXWINDOWTEXT];
18 } NHStatusWindow, *PNHStatusWindow;
20 static TCHAR szStatusWindowClass[] = TEXT("MSNHStatusWndClass");
21 LRESULT CALLBACK StatusWndProc(HWND, UINT, WPARAM, LPARAM);
22 static void register_status_window_class(void);
23 static void FormatStatusString(char *text, int format);
26 mswin_init_status_window()
28 static int run_once = 0;
33 register_status_window_class();
37 ret = CreateWindow(szStatusWindowClass, NULL,
38 WS_CHILD | WS_DISABLED | WS_CLIPSIBLINGS,
41 0, /* x-size - we will set it later */
42 0, /* y-size - we will set it later */
43 GetNHApp()->hMainWnd, NULL, GetNHApp()->hApp, NULL);
45 panic("Cannot create status window");
47 EnableWindow(ret, FALSE);
49 data = (PNHStatusWindow) malloc(sizeof(NHStatusWindow));
51 panic("out of memory");
53 ZeroMemory(data, sizeof(NHStatusWindow));
54 data->nhstat_format = NHSTAT_LINES_4;
55 SetWindowLong(ret, GWL_USERDATA, (LONG) data);
60 register_status_window_class()
64 ZeroMemory(&wcex, sizeof(wcex));
65 wcex.style = CS_NOCLOSE;
66 wcex.lpfnWndProc = (WNDPROC) StatusWndProc;
69 wcex.hInstance = GetNHApp()->hApp;
71 wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
72 wcex.hbrBackground = mswin_get_brush(NHW_STATUS, MSWIN_COLOR_BG);
73 wcex.lpszMenuName = NULL;
74 wcex.lpszClassName = szStatusWindowClass;
80 StatusWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
87 data = (PNHStatusWindow) GetWindowLong(hWnd, GWL_USERDATA);
89 case WM_MSNH_COMMAND: {
92 case MSNH_MSG_CLEAR_WINDOW:
93 ZeroMemory(data->window_text, sizeof(data->window_text));
94 FormatStatusString(data->window_text, data->nhstat_format);
97 case MSNH_MSG_CURSOR: {
98 PMSNHMsgCursor msg_data = (PMSNHMsgCursor) lParam;
99 if (msg_data->y == 0) {
100 InvalidateRect(hWnd, NULL, TRUE);
108 TCHAR wbuf[MAXWINDOWTEXT];
109 COLORREF OldBg, OldFg;
111 hdc = BeginPaint(hWnd, &ps);
112 GetClientRect(hWnd, &rt);
114 oldFont = SelectObject(
115 hdc, mswin_get_font(NHW_STATUS, ATR_NONE, hdc, FALSE));
116 OldBg = SetBkColor(hdc, mswin_get_color(NHW_STATUS, MSWIN_COLOR_BG));
118 SetTextColor(hdc, mswin_get_color(NHW_STATUS, MSWIN_COLOR_FG));
120 DrawText(hdc, NH_A2W(data->window_text, wbuf, MAXWINDOWTEXT),
121 strlen(data->window_text), &rt, DT_LEFT | DT_NOPREFIX);
123 SetTextColor(hdc, OldFg);
124 SetBkColor(hdc, OldBg);
125 SelectObject(hdc, oldFont);
131 SetWindowLong(hWnd, GWL_USERDATA, (LONG) 0);
135 SetFocus(GetNHApp()->hMainWnd);
139 return DefWindowProc(hWnd, message, wParam, lParam);
145 mswin_status_window_size(HWND hWnd, LPSIZE sz)
150 PNHStatusWindow data;
152 GetWindowRect(hWnd, &rt);
153 sz->cx = rt.right - rt.left;
154 sz->cy = rt.bottom - rt.top;
156 data = (PNHStatusWindow) GetWindowLong(hWnd, GWL_USERDATA);
159 saveFont = SelectObject(
160 hdc, mswin_get_font(NHW_STATUS, ATR_NONE, hdc, FALSE));
161 GetTextMetrics(hdc, &tm);
163 /* see if the status window can fit 80 characters per line */
164 if ((80 * tm.tmMaxCharWidth) >= sz->cx)
165 data->nhstat_format = NHSTAT_LINES_4;
167 data->nhstat_format = NHSTAT_LINES_2;
169 /* set height of the status box */
170 sz->cy = tm.tmHeight * data->nhstat_format;
172 SelectObject(hdc, saveFont);
173 ReleaseDC(hWnd, hdc);
176 extern const char *hu_stat[]; /* defined in eat.c */
177 extern const char *enc_stat[]; /* define in botl.c */
179 FormatStatusString(char *text, int format)
183 int cap = near_capacity();
185 Strcpy(text, plname);
186 if ('a' <= text[0] && text[0] <= 'z')
187 text[0] += 'A' - 'a';
189 Sprintf(nb = eos(text), " the ");
195 Strcpy(mbot, mons[u.umonnum].mname);
196 while (mbot[k] != 0) {
197 if ((k == 0 || (k > 0 && mbot[k - 1] == ' ')) && 'a' <= mbot[k]
199 mbot[k] += 'A' - 'a';
202 Sprintf(nb = eos(nb), mbot);
204 Sprintf(nb = eos(nb), rank_of(u.ulevel, Role_switch, flags.female));
206 if (format == NHSTAT_LINES_4)
207 Sprintf(nb = eos(nb), "\r\n");
209 if (ACURR(A_STR) > 18) {
210 if (ACURR(A_STR) > STR18(100))
211 Sprintf(nb = eos(nb), "St:%2d ", ACURR(A_STR) - 100);
212 else if (ACURR(A_STR) < STR18(100))
213 Sprintf(nb = eos(nb), "St:18/%02d ", ACURR(A_STR) - 18);
215 Sprintf(nb = eos(nb), "St:18/** ");
217 Sprintf(nb = eos(nb), "St:%-1d ", ACURR(A_STR));
218 Sprintf(nb = eos(nb), "Dx:%-1d Co:%-1d In:%-1d Wi:%-1d Ch:%-1d",
219 ACURR(A_DEX), ACURR(A_CON), ACURR(A_INT), ACURR(A_WIS),
221 Sprintf(nb = eos(nb),
222 (u.ualign.type == A_CHAOTIC)
224 : (u.ualign.type == A_NEUTRAL) ? " Neutral" : " Lawful");
227 Sprintf(nb = eos(nb), " S:%ld", botl_score());
229 if (format == NHSTAT_LINES_4 || format == NHSTAT_LINES_2)
230 strcat(text, "\r\n");
233 hp = Upolyd ? u.mh : u.uhp;
234 hpmax = Upolyd ? u.mhmax : u.uhpmax;
238 (void) describe_level(nb = eos(nb));
239 Sprintf(nb = eos(nb), "%c:%-2ld HP:%d(%d) Pw:%d(%d) AC:%-2d",
240 showsyms[COIN_CLASS + SYM_OFF_O], money_cnt(invent), hp, hpmax,
241 u.uen, u.uenmax, u.uac);
244 Sprintf(nb = eos(nb), " HD:%d", mons[u.umonnum].mlevel);
245 else if (flags.showexp)
246 Sprintf(nb = eos(nb), " Xp:%u/%-1ld", u.ulevel, u.uexp);
248 Sprintf(nb = eos(nb), " Exp:%u", u.ulevel);
249 if (format == NHSTAT_LINES_4)
250 strcat(text, "\r\n");
256 Sprintf(nb = eos(nb), "T:%ld ", moves);
258 if (strcmp(hu_stat[u.uhs], " ")) {
259 Strcat(text, hu_stat[u.uhs]);
260 Sprintf(nb = eos(nb), " ");
263 Sprintf(nb = eos(nb), "Conf");
265 if (u.usick_type & SICK_VOMITABLE)
266 Sprintf(nb = eos(nb), " FoodPois");
267 if (u.usick_type & SICK_NONVOMITABLE)
268 Sprintf(nb = eos(nb), " Ill");
271 Sprintf(nb = eos(nb), " Blind");
273 Sprintf(nb = eos(nb), " Stun");
275 Sprintf(nb = eos(nb), " Hallu");
277 Sprintf(nb = eos(nb), " Slime");
278 if (cap > UNENCUMBERED)
279 Sprintf(nb = eos(nb), " %s", enc_stat[cap]);