OSDN Git Service

main-win.c のコメントをDoxygen向けに調整。 / Rearrange comments of main-win.c for Doxygen.
[hengband/hengband.git] / src / main-win.c
1 /*!\r
2 * @file main-win.c\r
3 * @brief Windows版固有実装(メインエントリポイント含む)\r
4 * @date 2018/03/16\r
5 * @author Hengband Team\r
6 * @detail\r
7 *\r
8 * <h3>概要</h3>\r
9 * Windows98かその前後の頃を起点としたAPI実装。\r
10 * 各種のゲームエンジンは無論、\r
11 * DirectXといった昨今描画に標準的となったライブラリも用いていない。\r
12 * タイルの描画処理などについては、現在動作の詳細を検証中。\r
13 *\r
14 * <h3>フォーク元の概要</h3>\r
15 * <p>\r
16 * Copyright (c) 1997 Ben Harrison, Skirmantas Kligys, and others\r
17 *\r
18 * This software may be copied and distributed for educational, research,\r
19 * and not for profit purposes provided that this copyright and statement\r
20 * are included in all such copies.\r
21 * </p>\r
22 * <p>\r
23 * This file helps Angband work with Windows computers.\r
24 *\r
25 * To use this file, use an appropriate "Makefile" or "Project File",\r
26 * make sure that "WINDOWS" and/or "WIN32" are defined somewhere, and\r
27 * make sure to obtain various extra files as described below.\r
28 *\r
29 * The official compilation uses the CodeWarrior Pro compiler, which\r
30 * includes a special project file and precompilable header file.\r
31 * </p>\r
32 *\r
33 * <p>\r
34 * <del>See also "main-dos.c" and "main-ibm.c".</del>\r
35 * </p>\r
36 *\r
37 * <p>\r
38 * The "lib/user/pref-win.prf" file contains keymaps, macro definitions,\r
39 * and/or color redefinitions.\r
40 * </p>\r
41 *\r
42 * <p>\r
43 * The "lib/user/font-win.prf" contains attr/char mappings for use with the\r
44 * normal "lib/xtra/font/*.fon" font files.\r
45 * </p>\r
46 *\r
47 * <p>\r
48 * The "lib/user/graf-win.prf" contains attr/char mappings for use with the\r
49 * special "lib/xtra/graf/*.bmp" bitmap files, which are activated by a menu\r
50 * item.\r
51 * </p>\r
52 *\r
53 * <p>\r
54 * Compiling this file, and using the resulting executable, requires\r
55 * several extra files not distributed with the standard Angband code.\r
56 * If "USE_GRAPHICS" is defined, then "readdib.h" and "readdib.c" must\r
57 * be placed into "src/", and the "8X8.BMP" bitmap file must be placed\r
58 * into "lib/xtra/graf".  In any case, some "*.fon" files (including\r
59 * "8X13.FON" if nothing else) must be placed into "lib/xtra/font/".\r
60 * If "USE_SOUND" is defined, then some special library (for example,\r
61 * "winmm.lib") may need to be linked in, and desired "*.WAV" sound\r
62 * files must be placed into "lib/xtra/sound/".  All of these extra\r
63 * files can be found in the "ext-win" archive.\r
64 * </p>\r
65 *\r
66 * <p>\r
67 * The "Term_xtra_win_clear()" function should probably do a low-level\r
68 * clear of the current window, and redraw the borders and other things,\r
69 * if only for efficiency.  XXX XXX XXX\r
70 * </p>\r
71 *\r
72 * <p>\r
73 * A simpler method is needed for selecting the "tile size" for windows.\r
74 * XXX XXX XXX\r
75 * </p>\r
76 *\r
77 * <p>\r
78 * The various "warning" messages assume the existance of the "screen.w"\r
79 * window, I think, and only a few calls actually check for its existance,\r
80 * this may be okay since "NULL" means "on top of all windows". (?)  The\r
81 * user must never be allowed to "hide" the main window, or the "menubar"\r
82 * will disappear.  XXX XXX XXX\r
83 * </p>\r
84 *\r
85 * <p>\r
86 * Special "Windows Help Files" can be placed into "lib/xtra/help/" for\r
87 * use with the "winhelp.exe" program.  These files *may* be available\r
88 * at the ftp site somewhere, but I have not seen them.  XXX XXX XXX\r
89 * </p>\r
90 *\r
91 * <p>\r
92 * Initial framework (and most code) by Ben Harrison (benh@phial.com).\r
93 *\r
94 * Original code by Skirmantas Kligys (kligys@scf.usc.edu).\r
95 *\r
96 * Additional code by Ross E Becker (beckerr@cis.ohio-state.edu),\r
97 * and Chris R. Martin (crm7479@tam2000.tamu.edu).\r
98 * </p>\r
99 */\r
100 \r
101 #include "angband.h"\r
102 \r
103 #ifdef WINDOWS\r
104 #include <windows.h>\r
105 #include <direct.h>\r
106 #include <locale.h>\r
107 #include "z-term.h"\r
108 \r
109 /*\r
110  * Extract the "WIN32" flag from the compiler\r
111  */\r
112 #if defined(__WIN32__) || defined(__WINNT__) || defined(__NT__)\r
113 # ifndef WIN32\r
114 #  define WIN32\r
115 # endif\r
116 #endif\r
117 \r
118 \r
119 /*\r
120  * Hack -- allow use of "screen saver" mode\r
121  */\r
122 #define USE_SAVER\r
123 \r
124 \r
125 /*\r
126  * Menu constants -- see "ANGBAND.RC"\r
127  */\r
128 \r
129 #define IDM_FILE_NEW                    100\r
130 #define IDM_FILE_OPEN                   101\r
131 #define IDM_FILE_SAVE                   110\r
132 #define IDM_FILE_SCORE                  120\r
133 #define IDM_FILE_MOVIE                  121\r
134 #define IDM_FILE_EXIT                   130\r
135 \r
136 #define IDM_WINDOW_VIS_0                200\r
137 #define IDM_WINDOW_VIS_1                201\r
138 #define IDM_WINDOW_VIS_2                202\r
139 #define IDM_WINDOW_VIS_3                203\r
140 #define IDM_WINDOW_VIS_4                204\r
141 #define IDM_WINDOW_VIS_5                205\r
142 #define IDM_WINDOW_VIS_6                206\r
143 #define IDM_WINDOW_VIS_7                207\r
144 \r
145 #define IDM_WINDOW_FONT_0               210\r
146 #define IDM_WINDOW_FONT_1               211\r
147 #define IDM_WINDOW_FONT_2               212\r
148 #define IDM_WINDOW_FONT_3               213\r
149 #define IDM_WINDOW_FONT_4               214\r
150 #define IDM_WINDOW_FONT_5               215\r
151 #define IDM_WINDOW_FONT_6               216\r
152 #define IDM_WINDOW_FONT_7               217\r
153 \r
154 #define IDM_WINDOW_POS_0                220\r
155 #define IDM_WINDOW_POS_1                221\r
156 #define IDM_WINDOW_POS_2                222\r
157 #define IDM_WINDOW_POS_3                223\r
158 #define IDM_WINDOW_POS_4                224\r
159 #define IDM_WINDOW_POS_5                225\r
160 #define IDM_WINDOW_POS_6                226\r
161 #define IDM_WINDOW_POS_7                227\r
162 \r
163 #define IDM_WINDOW_BIZ_0                230\r
164 #define IDM_WINDOW_BIZ_1                231\r
165 #define IDM_WINDOW_BIZ_2                232\r
166 #define IDM_WINDOW_BIZ_3                233\r
167 #define IDM_WINDOW_BIZ_4                234\r
168 #define IDM_WINDOW_BIZ_5                235\r
169 #define IDM_WINDOW_BIZ_6                236\r
170 #define IDM_WINDOW_BIZ_7                237\r
171 \r
172 #define IDM_WINDOW_I_WID_0              240\r
173 #define IDM_WINDOW_I_WID_1              241\r
174 #define IDM_WINDOW_I_WID_2              242\r
175 #define IDM_WINDOW_I_WID_3              243\r
176 #define IDM_WINDOW_I_WID_4              244\r
177 #define IDM_WINDOW_I_WID_5              245\r
178 #define IDM_WINDOW_I_WID_6              246\r
179 #define IDM_WINDOW_I_WID_7              247\r
180 \r
181 #define IDM_WINDOW_D_WID_0              250\r
182 #define IDM_WINDOW_D_WID_1              251\r
183 #define IDM_WINDOW_D_WID_2              252\r
184 #define IDM_WINDOW_D_WID_3              253\r
185 #define IDM_WINDOW_D_WID_4              254\r
186 #define IDM_WINDOW_D_WID_5              255\r
187 #define IDM_WINDOW_D_WID_6              256\r
188 #define IDM_WINDOW_D_WID_7              257\r
189 \r
190 #define IDM_WINDOW_I_HGT_0              260\r
191 #define IDM_WINDOW_I_HGT_1              261\r
192 #define IDM_WINDOW_I_HGT_2              262\r
193 #define IDM_WINDOW_I_HGT_3              263\r
194 #define IDM_WINDOW_I_HGT_4              264\r
195 #define IDM_WINDOW_I_HGT_5              265\r
196 #define IDM_WINDOW_I_HGT_6              266\r
197 #define IDM_WINDOW_I_HGT_7              267\r
198 \r
199 #define IDM_WINDOW_D_HGT_0              270\r
200 #define IDM_WINDOW_D_HGT_1              271\r
201 #define IDM_WINDOW_D_HGT_2              272\r
202 #define IDM_WINDOW_D_HGT_3              273\r
203 #define IDM_WINDOW_D_HGT_4              274\r
204 #define IDM_WINDOW_D_HGT_5              275\r
205 #define IDM_WINDOW_D_HGT_6              276\r
206 #define IDM_WINDOW_D_HGT_7              277\r
207 \r
208 #define IDM_OPTIONS_NO_GRAPHICS   400\r
209 #define IDM_OPTIONS_OLD_GRAPHICS  401\r
210 #define IDM_OPTIONS_NEW_GRAPHICS  402\r
211 #define IDM_OPTIONS_NEW2_GRAPHICS 403\r
212 #define IDM_OPTIONS_BIGTILE               409\r
213 #define IDM_OPTIONS_SOUND                 410\r
214 #define IDM_OPTIONS_MUSIC                 411\r
215 #define IDM_OPTIONS_SAVER                 420\r
216 #define IDM_OPTIONS_MAP                   430\r
217 #define IDM_OPTIONS_BG                    440\r
218 #define IDM_OPTIONS_OPEN_BG               441\r
219 \r
220 #define IDM_DUMP_SCREEN_HTML    450\r
221 \r
222 #define IDM_HELP_CONTENTS       901\r
223 \r
224 \r
225 \r
226 /*\r
227  * This may need to be removed for some compilers XXX XXX XXX\r
228  */\r
229 #if 0\r
230 #define STRICT\r
231 #endif\r
232 \r
233 /*\r
234  * Exclude parts of WINDOWS.H that are not needed\r
235  */\r
236 #define NOCOMM            /* Comm driver APIs and definitions */\r
237 #define NOLOGERROR        /* LogError() and related definitions */\r
238 #define NOPROFILER        /* Profiler APIs */\r
239 #define NOLFILEIO         /* _l* file I/O routines */\r
240 #define NOOPENFILE        /* OpenFile and related definitions */\r
241 #define NORESOURCE        /* Resource management */\r
242 #define NOATOM            /* Atom management */\r
243 #define NOLANGUAGE        /* Character test routines */\r
244 #define NOLSTRING         /* lstr* string management routines */\r
245 #define NODBCS            /* Double-byte character set routines */\r
246 #define NOKEYBOARDINFO    /* Keyboard driver routines */\r
247 #define NOCOLOR           /* COLOR_* color values */\r
248 #define NODRAWTEXT        /* DrawText() and related definitions */\r
249 #define NOSCALABLEFONT    /* Truetype scalable font support */\r
250 #define NOMETAFILE        /* Metafile support */\r
251 #define NOSYSTEMPARAMSINFO /* SystemParametersInfo() and SPI_* definitions */\r
252 #define NODEFERWINDOWPOS  /* DeferWindowPos and related definitions */\r
253 #define NOKEYSTATES       /* MK_* message key state flags */\r
254 #define NOWH              /* SetWindowsHook and related WH_* definitions */\r
255 #define NOCLIPBOARD       /* Clipboard APIs and definitions */\r
256 #define NOICONS           /* IDI_* icon IDs */\r
257 #define NOMDI             /* MDI support */\r
258 #define NOHELP            /* Help support */\r
259 \r
260 /* Not defined since it breaks Borland C++ 5.5 */\r
261 /* #define NOCTLMGR */    /* Control management and controls */\r
262 \r
263 /*\r
264  * Exclude parts of WINDOWS.H that are not needed (Win32)\r
265  */\r
266 #define WIN32_LEAN_AND_MEAN\r
267 #define NONLS             /* All NLS defines and routines */\r
268 #define NOSERVICE         /* All Service Controller routines, SERVICE_ equates, etc. */\r
269 #define NOKANJI           /* Kanji support stuff. */\r
270 #define NOMCX             /* Modem Configuration Extensions */\r
271 \r
272 /*\r
273  * Include the "windows" support file\r
274  */\r
275 #include <windows.h>\r
276 \r
277 /*\r
278  * Exclude parts of MMSYSTEM.H that are not needed\r
279  */\r
280 #define MMNODRV          /* Installable driver support */\r
281 #define MMNOWAVE         /* Waveform support */\r
282 #define MMNOMIDI         /* MIDI support */\r
283 #define MMNOAUX          /* Auxiliary audio support */\r
284 #define MMNOTIMER        /* Timer support */\r
285 #define MMNOJOY          /* Joystick support */\r
286 #define MMNOMCI          /* MCI support */\r
287 #define MMNOMMIO         /* Multimedia file I/O support */\r
288 #define MMNOMMSYSTEM     /* General MMSYSTEM functions */\r
289 \r
290 /*\r
291  * Include some more files. Note: the Cygnus Cygwin compiler\r
292  * doesn't use mmsystem.h instead it includes the winmm library\r
293  * which performs a similar function.\r
294  */\r
295 #include <mmsystem.h>\r
296 #include <commdlg.h>\r
297 \r
298 /*\r
299  * HTML-Help requires htmlhelp.h and htmlhelp.lib from Microsoft's\r
300  * HTML Workshop < http://msdn.microsoft.com/workshop/author/htmlhelp/ >.\r
301  */\r
302 /* #define HTML_HELP */\r
303 \r
304 #ifdef HTML_HELP\r
305 #include <htmlhelp.h>\r
306 #endif /* HTML_HELP */\r
307 \r
308 /*\r
309  * Include the support for loading bitmaps\r
310  */\r
311 #ifdef USE_GRAPHICS\r
312 # include "readdib.h"\r
313 #endif\r
314 \r
315 /*\r
316  * Hack -- Fake declarations from "dos.h" XXX XXX XXX\r
317  */\r
318 #ifdef WIN32\r
319 #define INVALID_FILE_NAME (DWORD)0xFFFFFFFF\r
320 #else /* WIN32 */\r
321 #define FA_LABEL    0x08        /* Volume label */\r
322 #define FA_DIREC    0x10        /* Directory */\r
323 unsigned _cdecl _dos_getfileattr(const char *, unsigned *);\r
324 #endif /* WIN32 */\r
325 \r
326 /*\r
327  * Silliness in WIN32 drawing routine\r
328  */\r
329 #ifdef WIN32\r
330 # define MoveTo(H,X,Y) MoveToEx(H, X, Y, NULL)\r
331 #endif /* WIN32 */\r
332 \r
333 /*\r
334  * Silliness for Windows 95\r
335  */\r
336 #ifndef WS_EX_TOOLWINDOW\r
337 # define WS_EX_TOOLWINDOW 0\r
338 #endif\r
339 \r
340 /*\r
341  * Foreground color bits (hard-coded by DOS)\r
342  */\r
343 #define VID_BLACK       0x00\r
344 #define VID_BLUE        0x01\r
345 #define VID_GREEN       0x02\r
346 #define VID_CYAN        0x03\r
347 #define VID_RED         0x04\r
348 #define VID_MAGENTA     0x05\r
349 #define VID_YELLOW      0x06\r
350 #define VID_WHITE       0x07\r
351 \r
352 /*\r
353  * Bright text (hard-coded by DOS)\r
354  */\r
355 #define VID_BRIGHT      0x08\r
356 \r
357 /*\r
358  * Background color bits (hard-coded by DOS)\r
359  */\r
360 #define VUD_BLACK       0x00\r
361 #define VUD_BLUE        0x10\r
362 #define VUD_GREEN       0x20\r
363 #define VUD_CYAN        0x30\r
364 #define VUD_RED         0x40\r
365 #define VUD_MAGENTA     0x50\r
366 #define VUD_YELLOW      0x60\r
367 #define VUD_WHITE       0x70\r
368 \r
369 /*\r
370  * Blinking text (hard-coded by DOS)\r
371  */\r
372 #define VUD_BRIGHT      0x80\r
373 \r
374 \r
375 /*\r
376  * Forward declare\r
377  */\r
378 typedef struct _term_data term_data;\r
379 \r
380 /*\r
381  * Extra "term" data\r
382  *\r
383  * Note the use of "font_want" for the names of the font file requested by\r
384  * the user, and the use of "font_file" for the currently active font file.\r
385  *\r
386  * The "font_file" is uppercased, and takes the form "8X13.FON", while\r
387  * "font_want" can be in almost any form as long as it could be construed\r
388  * as attempting to represent the name of a font.\r
389  */\r
390 struct _term_data\r
391 {\r
392         term t;\r
393 \r
394         cptr s;\r
395 \r
396         HWND w;\r
397 \r
398         DWORD dwStyle;\r
399         DWORD dwExStyle;\r
400 \r
401         uint keys;\r
402 \r
403         TERM_POSITION rows;     /* int -> uint */\r
404         TERM_POSITION cols;\r
405 \r
406         uint pos_x;\r
407         uint pos_y;\r
408         uint size_wid;\r
409         uint size_hgt;\r
410         uint size_ow1;\r
411         uint size_oh1;\r
412         uint size_ow2;\r
413         uint size_oh2;\r
414 \r
415         bool size_hack;\r
416 \r
417         bool xtra_hack;\r
418 \r
419         bool visible;\r
420 \r
421         bool bizarre;\r
422 \r
423         cptr font_want;\r
424 \r
425         cptr font_file;\r
426 \r
427         HFONT font_id;\r
428 \r
429         int font_wid;\r
430         int font_hgt;\r
431 \r
432         int tile_wid;\r
433         int tile_hgt;\r
434 \r
435         uint map_tile_wid;\r
436         uint map_tile_hgt;\r
437 \r
438         bool map_active;\r
439 #if 1 /* #ifdef JP */\r
440         LOGFONT lf;\r
441 #endif\r
442 \r
443         bool posfix;\r
444 \r
445 /* bg */\r
446 #if 0\r
447         char *bgfile;\r
448         int use_bg;\r
449 #endif\r
450 };\r
451 \r
452 \r
453 /*\r
454  * Maximum number of windows XXX XXX XXX\r
455  */\r
456 #define MAX_TERM_DATA 8\r
457 \r
458 /*\r
459  * An array of term_data's\r
460  */\r
461 static term_data data[MAX_TERM_DATA];\r
462 \r
463 /*\r
464  * Hack -- global "window creation" pointer\r
465  */\r
466 static term_data *my_td;\r
467 \r
468 /*\r
469  * Remember normal size of main window when maxmized\r
470  */\r
471 POINT normsize;\r
472 \r
473 /*\r
474  * was main window maximized on previous playing\r
475  */\r
476 bool win_maximized = FALSE;\r
477 \r
478 /*\r
479  * game in progress\r
480  */\r
481 bool game_in_progress = FALSE;\r
482 \r
483 /*\r
484  * note when "open"/"new" become valid\r
485  */\r
486 bool initialized = FALSE;\r
487 \r
488 /*\r
489  * screen paletted, i.e. 256 colors\r
490  */\r
491 bool paletted = FALSE;\r
492 \r
493 /*\r
494  * 16 colors screen, don't use RGB()\r
495  */\r
496 bool colors16 = FALSE;\r
497 \r
498 /*\r
499  * Saved instance handle\r
500  */\r
501 static HINSTANCE hInstance;\r
502 \r
503 /*\r
504  * Yellow brush for the cursor\r
505  */\r
506 static HBRUSH hbrYellow;\r
507 \r
508 /*\r
509  * An icon\r
510  */\r
511 static HICON hIcon;\r
512 \r
513 /*\r
514  * A palette\r
515  */\r
516 static HPALETTE hPal;\r
517 \r
518 /* bg */\r
519 static HBITMAP hBG = NULL;\r
520 static int use_bg = 0;\r
521 static char bg_bitmap_file[1024] = "bg.bmp";\r
522 \r
523 #ifdef USE_SAVER\r
524 \r
525 /*\r
526  * The screen saver window\r
527  */\r
528 static HWND hwndSaver;\r
529 \r
530 #endif /* USE_SAVER */\r
531 \r
532 \r
533 #ifdef USE_GRAPHICS\r
534 \r
535 /*\r
536  * Flag set once "graphics" has been initialized\r
537  */\r
538 static bool can_use_graphics = FALSE;\r
539 \r
540 /*\r
541  * The global bitmap\r
542  */\r
543 static DIBINIT infGraph;\r
544 \r
545 /*\r
546  * The global bitmap mask\r
547  */\r
548 static DIBINIT infMask;\r
549 \r
550 #endif /* USE_GRAPHICS */\r
551 \r
552 \r
553 #ifdef USE_SOUND\r
554 \r
555 /*\r
556  * Flag set once "sound" has been initialized\r
557  */\r
558 static bool can_use_sound = FALSE;\r
559 \r
560 #define SAMPLE_MAX 8\r
561 /*\r
562  * An array of sound file names\r
563  */\r
564 static cptr sound_file[SOUND_MAX][SAMPLE_MAX];\r
565 \r
566 #endif /* USE_SOUND */\r
567 \r
568 \r
569 \r
570 #ifdef USE_MUSIC\r
571 \r
572 #define SAMPLE_MUSIC_MAX 16\r
573 static cptr music_file[MUSIC_BASIC_MAX][SAMPLE_MUSIC_MAX];\r
574 static cptr dungeon_music_file[1000][SAMPLE_MUSIC_MAX];\r
575 static cptr town_music_file[1000][SAMPLE_MUSIC_MAX];\r
576 static cptr quest_music_file[1000][SAMPLE_MUSIC_MAX];\r
577 static bool can_use_music = FALSE;\r
578 \r
579 static MCI_OPEN_PARMS mop;\r
580 static char mci_device_type[256];\r
581 \r
582 int current_music_type = 0;\r
583 int current_music_id = 0;\r
584 \r
585 #endif /* USE_MUSIC */\r
586 \r
587 \r
588 /*\r
589  * Full path to ANGBAND.INI\r
590  */\r
591 static cptr ini_file = NULL;\r
592 \r
593 /*\r
594  * Name of application\r
595  */\r
596 static cptr AppName = "ANGBAND";\r
597 \r
598 /*\r
599  * Name of sub-window type\r
600  */\r
601 static cptr AngList = "AngList";\r
602 \r
603 /*\r
604  * Directory names\r
605  */\r
606 static cptr ANGBAND_DIR_XTRA_GRAF;\r
607 static cptr ANGBAND_DIR_XTRA_SOUND;\r
608 static cptr ANGBAND_DIR_XTRA_MUSIC;\r
609 static cptr ANGBAND_DIR_XTRA_HELP;\r
610 #if 0 /* #ifndef JP */\r
611 static cptr ANGBAND_DIR_XTRA_FONT;\r
612 #endif\r
613 #ifdef USE_MUSIC\r
614 static cptr ANGBAND_DIR_XTRA_MUSIC;\r
615 #endif\r
616 \r
617 \r
618 /*\r
619  * The "complex" color values\r
620  */\r
621 static COLORREF win_clr[256];\r
622 \r
623 \r
624 /*\r
625  * Flag for macro trigger with dump ASCII\r
626  */\r
627 static bool Term_no_press = FALSE;\r
628 \r
629 /*\r
630  * Copy and paste\r
631  */\r
632 static bool mouse_down = FALSE;\r
633 static bool paint_rect = FALSE;\r
634 static TERM_POSITION mousex = 0, mousey = 0;\r
635 static TERM_POSITION oldx, oldy;\r
636 \r
637 \r
638 /*\r
639  * The "simple" color values\r
640  *\r
641  * See "main-ibm.c" for original table information\r
642  *\r
643  * The entries below are taken from the "color bits" defined above.\r
644  *\r
645  * Note that many of the choices below suck, but so do crappy monitors.\r
646  */\r
647 static BYTE win_pal[256] =\r
648 {\r
649         VID_BLACK,                                      /* Dark */\r
650         VID_WHITE,                                      /* White */\r
651         VID_CYAN,                                       /* Slate XXX */\r
652         VID_RED | VID_BRIGHT,           /* Orange XXX */\r
653         VID_RED,                                        /* Red */\r
654         VID_GREEN,                                      /* Green */\r
655         VID_BLUE,                                       /* Blue */\r
656         VID_YELLOW,                                     /* Umber XXX */\r
657         VID_BLACK | VID_BRIGHT,         /* Light Dark */\r
658         VID_CYAN | VID_BRIGHT,          /* Light Slate XXX */\r
659         VID_MAGENTA,                            /* Violet XXX */\r
660         VID_YELLOW | VID_BRIGHT,        /* Yellow */\r
661         VID_MAGENTA | VID_BRIGHT,       /* Light Red XXX */\r
662         VID_GREEN | VID_BRIGHT,         /* Light Green */\r
663         VID_BLUE | VID_BRIGHT,          /* Light Blue */\r
664         VID_YELLOW                                      /* Light Umber XXX */\r
665 };\r
666 \r
667 \r
668 /*\r
669  * Hack -- define which keys are "special"\r
670  */\r
671 static bool special_key[256];\r
672 static bool ignore_key[256];\r
673 \r
674 #if 1\r
675 /*\r
676  * Hack -- initialization list for "special_key"\r
677  */\r
678 static byte special_key_list[] = {\r
679         VK_CLEAR, VK_PAUSE, VK_CAPITAL,\r
680         VK_KANA, VK_JUNJA, VK_FINAL, VK_KANJI,\r
681         VK_CONVERT, VK_NONCONVERT, VK_ACCEPT, VK_MODECHANGE,\r
682         VK_PRIOR, VK_NEXT, VK_END, VK_HOME,\r
683         VK_LEFT, VK_UP, VK_RIGHT, VK_DOWN,\r
684         VK_SELECT, VK_PRINT, VK_EXECUTE, VK_SNAPSHOT,\r
685         VK_INSERT, VK_DELETE, VK_HELP, VK_APPS,\r
686         VK_NUMPAD0, VK_NUMPAD1, VK_NUMPAD2, VK_NUMPAD3,\r
687         VK_NUMPAD4, VK_NUMPAD5, VK_NUMPAD6, VK_NUMPAD7,\r
688         VK_NUMPAD8, VK_NUMPAD9, VK_MULTIPLY, VK_ADD,\r
689         VK_SEPARATOR, VK_SUBTRACT, VK_DECIMAL, VK_DIVIDE,\r
690         VK_F1, VK_F2, VK_F3, VK_F4, VK_F5, VK_F6,\r
691         VK_F7, VK_F8, VK_F9, VK_F10, VK_F11, VK_F12,\r
692         VK_F13, VK_F14, VK_F15, VK_F16, VK_F17, VK_F18,\r
693         VK_F19,VK_F20, VK_F21, VK_F22, VK_F23, VK_F24,\r
694         VK_NUMLOCK, VK_SCROLL, VK_ATTN, VK_CRSEL,\r
695         VK_EXSEL, VK_EREOF, VK_PLAY, VK_ZOOM,\r
696         VK_NONAME, VK_PA1,\r
697         0       /* End of List */\r
698 };\r
699 \r
700 static byte ignore_key_list[] = {\r
701         VK_ESCAPE, VK_TAB, VK_SPACE,\r
702         'F', 'W', 'O', /*'H',*/ /* these are menu characters.*/\r
703         VK_SHIFT, VK_CONTROL, VK_MENU, VK_LWIN, VK_RWIN,\r
704         VK_LSHIFT, VK_RSHIFT, VK_LCONTROL, VK_RCONTROL,\r
705         VK_LMENU, VK_RMENU,\r
706         0       /* End of List */\r
707 };\r
708 #else\r
709 /*\r
710  * Hack -- initialization list for "special_key"\r
711  *\r
712  * We ignore the modifier keys (shift, control, alt, num lock, scroll lock),\r
713  * and the normal keys (escape, tab, return, letters, numbers, etc), but we\r
714  * catch the keypad keys (with and without numlock set, including keypad 5),\r
715  * the function keys (including the "menu" key which maps to F10), and the\r
716  * "pause" key (between scroll lock and numlock).  We also catch a few odd\r
717  * keys which I do not recognize, but which are listed among keys which we\r
718  * do catch, so they should be harmless to catch.\r
719  */\r
720 static byte special_key_list[] =\r
721 {\r
722         VK_CLEAR,               /* 0x0C (KP<5>) */\r
723 \r
724         VK_PAUSE,               /* 0x13 (pause) */\r
725 \r
726         VK_PRIOR,               /* 0x21 (KP<9>) */\r
727         VK_NEXT,                /* 0x22 (KP<3>) */\r
728         VK_END,                 /* 0x23 (KP<1>) */\r
729         VK_HOME,                /* 0x24 (KP<7>) */\r
730         VK_LEFT,                /* 0x25 (KP<4>) */\r
731         VK_UP,                  /* 0x26 (KP<8>) */\r
732         VK_RIGHT,               /* 0x27 (KP<6>) */\r
733         VK_DOWN,                /* 0x28 (KP<2>) */\r
734         VK_SELECT,              /* 0x29 (?????) */\r
735         VK_PRINT,               /* 0x2A (?????) */\r
736         VK_EXECUTE,             /* 0x2B (?????) */\r
737         VK_SNAPSHOT,    /* 0x2C (?????) */\r
738         VK_INSERT,              /* 0x2D (KP<0>) */\r
739         VK_DELETE,              /* 0x2E (KP<.>) */\r
740         VK_HELP,                /* 0x2F (?????) */\r
741 #if 0\r
742         VK_NUMPAD0,             /* 0x60 (KP<0>) */\r
743         VK_NUMPAD1,             /* 0x61 (KP<1>) */\r
744         VK_NUMPAD2,             /* 0x62 (KP<2>) */\r
745         VK_NUMPAD3,             /* 0x63 (KP<3>) */\r
746         VK_NUMPAD4,             /* 0x64 (KP<4>) */\r
747         VK_NUMPAD5,             /* 0x65 (KP<5>) */\r
748         VK_NUMPAD6,             /* 0x66 (KP<6>) */\r
749         VK_NUMPAD7,             /* 0x67 (KP<7>) */\r
750         VK_NUMPAD8,             /* 0x68 (KP<8>) */\r
751         VK_NUMPAD9,             /* 0x69 (KP<9>) */\r
752         VK_MULTIPLY,    /* 0x6A (KP<*>) */\r
753         VK_ADD,                 /* 0x6B (KP<+>) */\r
754         VK_SEPARATOR,   /* 0x6C (?????) */\r
755         VK_SUBTRACT,    /* 0x6D (KP<->) */\r
756         VK_DECIMAL,             /* 0x6E (KP<.>) */\r
757         VK_DIVIDE,              /* 0x6F (KP</>) */\r
758 #endif\r
759         VK_F1,                  /* 0x70 */\r
760         VK_F2,                  /* 0x71 */\r
761         VK_F3,                  /* 0x72 */\r
762         VK_F4,                  /* 0x73 */\r
763         VK_F5,                  /* 0x74 */\r
764         VK_F6,                  /* 0x75 */\r
765         VK_F7,                  /* 0x76 */\r
766         VK_F8,                  /* 0x77 */\r
767         VK_F9,                  /* 0x78 */\r
768         VK_F10,                 /* 0x79 */\r
769         VK_F11,                 /* 0x7A */\r
770         VK_F12,                 /* 0x7B */\r
771         VK_F13,                 /* 0x7C */\r
772         VK_F14,                 /* 0x7D */\r
773         VK_F15,                 /* 0x7E */\r
774         VK_F16,                 /* 0x7F */\r
775         VK_F17,                 /* 0x80 */\r
776         VK_F18,                 /* 0x81 */\r
777         VK_F19,                 /* 0x82 */\r
778         VK_F20,                 /* 0x83 */\r
779         VK_F21,                 /* 0x84 */\r
780         VK_F22,                 /* 0x85 */\r
781         VK_F23,                 /* 0x86 */\r
782         VK_F24,                 /* 0x87 */\r
783         0\r
784 };\r
785 #endif\r
786 \r
787 \r
788 /* Function prototype */\r
789 \r
790 static bool is_already_running(void);\r
791 \r
792 \r
793 /* bg */\r
794 static void delete_bg(void)\r
795 {\r
796         if (hBG != NULL)\r
797         {\r
798                 DeleteObject(hBG);\r
799                 hBG = NULL;\r
800         }\r
801 }\r
802 \r
803 static int init_bg(void)\r
804 {\r
805         char * bmfile = bg_bitmap_file;\r
806 \r
807         delete_bg();\r
808         if (use_bg == 0) return 0;\r
809 \r
810         hBG = LoadImage(NULL, bmfile,  IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);\r
811         if (!hBG) {\r
812                 plog_fmt(_("壁紙用ビットマップ '%s' を読み込めません。", "Can't load the bitmap file '%s'."), bmfile);\r
813                 use_bg = 0;\r
814                 return 0;\r
815         }\r
816 #if 0 /* gomi */\r
817         HDC wnddc, dcimage, dcbg;\r
818         HBITMAP bmimage, bmimage_old, bmbg_old;\r
819         int i, j;\r
820 \r
821         delete_bg();\r
822 \r
823         wnddc = GetDC(hwnd);\r
824         dcimage = CreateCompatibleDC(wnddc);\r
825         dcbg = CreateCompatibleDC(wnddc);\r
826 \r
827         bmimage = LoadImage(NULL, "bg.bmp", LR_LOADFROMFILE, 0, 0, 0);\r
828         if (!bmimage) quit("bg.bmpが読みこめない!");\r
829         bmimage_old = SelectObject(dcimage, bmimage);\r
830 \r
831         CreateCompatibleBitmap();\r
832 \r
833         ReleaseDC(hwnd, wnddc);\r
834 #endif\r
835         use_bg = 1;\r
836         return 1;\r
837 }\r
838 \r
839 static void DrawBG(HDC hdc, RECT *r)\r
840 {\r
841         HDC hdcSrc;\r
842         HBITMAP hOld;\r
843         BITMAP bm;\r
844         int x = r->left, y = r->top;\r
845         int nx, ny, sx, sy, swid, shgt, cwid, chgt;\r
846         \r
847         if (!use_bg || !hBG)\r
848                 return;\r
849 \r
850         nx = x; ny = y;\r
851         GetObject(hBG, sizeof(bm), &bm);\r
852         swid = bm.bmWidth; shgt = bm.bmHeight;\r
853 \r
854         hdcSrc = CreateCompatibleDC(hdc);\r
855         hOld = SelectObject(hdcSrc, hBG);\r
856 \r
857         do {\r
858                 sx = nx % swid;\r
859                 cwid = MIN(swid - sx, r->right - nx);\r
860                 do {\r
861                         sy = ny % shgt;\r
862                         chgt = MIN(shgt - sy, r->bottom - ny);\r
863                                 BitBlt(hdc, nx, ny, cwid, chgt, hdcSrc, sx, sy, SRCCOPY);\r
864                         ny += chgt;\r
865                 } while (ny < r->bottom);\r
866                 ny = y;\r
867                 nx += cwid;\r
868         } while (nx < r->right);\r
869         \r
870         SelectObject(hdcSrc, hOld);\r
871         DeleteDC(hdcSrc);\r
872 }\r
873 \r
874 #if 0\r
875 /*\r
876  * Hack -- given a pathname, point at the filename\r
877  */\r
878 static cptr extract_file_name(cptr s)\r
879 {\r
880         cptr p;\r
881 \r
882         /* Start at the end */\r
883         p = s + strlen(s) - 1;\r
884 \r
885         /* Back up to divider */\r
886         while ((p >= s) && (*p != ':') && (*p != '\\')) p--;\r
887 \r
888         /* Return file name */\r
889         return (p+1);\r
890 }\r
891 #endif\r
892 \r
893 \r
894 /*\r
895  * Hack -- given a simple filename, extract the "font size" info\r
896  *\r
897  * Return a pointer to a static buffer holding the capitalized base name.\r
898  */\r
899 #if 0 /* #ifndef JP */\r
900 static char *analyze_font(char *path, int *wp, int *hp)\r
901 {\r
902         int wid, hgt;\r
903 \r
904         char *s, *p;\r
905 \r
906         /* Start at the end */\r
907         p = path + strlen(path) - 1;\r
908 \r
909         /* Back up to divider */\r
910         while ((p >= path) && (*p != ':') && (*p != '\\')) --p;\r
911 \r
912         /* Advance to file name */\r
913         ++p;\r
914 \r
915         /* Capitalize */\r
916         for (s = p; *s; ++s)\r
917         {\r
918                 /* Capitalize (be paranoid) */\r
919                 if (islower(*s)) *s = toupper(*s);\r
920         }\r
921 \r
922         /* Find first 'X' */\r
923         s = my_strchr(p, 'X');\r
924 \r
925         /* Extract font width */\r
926         wid = atoi(p);\r
927 \r
928         /* Extract height */\r
929         hgt = s ? atoi(s+1) : 0;\r
930 \r
931         /* Save results */\r
932         (*wp) = wid;\r
933         (*hp) = hgt;\r
934 \r
935         /* Result */\r
936         return (p);\r
937 }\r
938 #endif\r
939 \r
940 \r
941 /*\r
942  * Check for existance of a file\r
943  */\r
944 static bool check_file(cptr s)\r
945 {\r
946         char path[1024];\r
947 \r
948 #ifdef WIN32\r
949 \r
950         DWORD attrib;\r
951 \r
952 #else /* WIN32 */\r
953 \r
954         unsigned int attrib;\r
955 \r
956 #endif /* WIN32 */\r
957 \r
958         /* Copy it */\r
959         strcpy(path, s);\r
960 \r
961 #ifdef WIN32\r
962 \r
963         /* Examine */\r
964         attrib = GetFileAttributes(path);\r
965 \r
966         /* Require valid filename */\r
967         if (attrib == INVALID_FILE_NAME) return (FALSE);\r
968 \r
969         /* Prohibit directory */\r
970         if (attrib & FILE_ATTRIBUTE_DIRECTORY) return (FALSE);\r
971 \r
972 #else /* WIN32 */\r
973 \r
974         /* Examine and verify */\r
975         if (_dos_getfileattr(path, &attrib)) return (FALSE);\r
976 \r
977         /* Prohibit something */\r
978         if (attrib & FA_LABEL) return (FALSE);\r
979 \r
980         /* Prohibit directory */\r
981         if (attrib & FA_DIREC) return (FALSE);\r
982 \r
983 #endif /* WIN32 */\r
984 \r
985         /* Success */\r
986         return (TRUE);\r
987 }\r
988 \r
989 \r
990 /*\r
991  * Check for existance of a directory\r
992  */\r
993 static bool check_dir(cptr s)\r
994 {\r
995         int i;\r
996 \r
997         char path[1024];\r
998 \r
999 #ifdef WIN32\r
1000 \r
1001         DWORD attrib;\r
1002 \r
1003 #else /* WIN32 */\r
1004 \r
1005         unsigned int attrib;\r
1006 \r
1007 #endif /* WIN32 */\r
1008 \r
1009         /* Copy it */\r
1010         strcpy(path, s);\r
1011 \r
1012         /* Check length */\r
1013         i = strlen(path);\r
1014 \r
1015         /* Remove trailing backslash */\r
1016         if (i && (path[i-1] == '\\')) path[--i] = '\0';\r
1017 \r
1018 #ifdef WIN32\r
1019 \r
1020         /* Examine */\r
1021         attrib = GetFileAttributes(path);\r
1022 \r
1023         /* Require valid filename */\r
1024         if (attrib == INVALID_FILE_NAME) return (FALSE);\r
1025 \r
1026         /* Require directory */\r
1027         if (!(attrib & FILE_ATTRIBUTE_DIRECTORY)) return (FALSE);\r
1028 \r
1029 #else /* WIN32 */\r
1030 \r
1031         /* Examine and verify */\r
1032         if (_dos_getfileattr(path, &attrib)) return (FALSE);\r
1033 \r
1034         /* Prohibit something */\r
1035         if (attrib & FA_LABEL) return (FALSE);\r
1036 \r
1037         /* Require directory */\r
1038         if (!(attrib & FA_DIREC)) return (FALSE);\r
1039 \r
1040 #endif /* WIN32 */\r
1041 \r
1042         /* Success */\r
1043         return (TRUE);\r
1044 }\r
1045 \r
1046 \r
1047 /*\r
1048  * Validate a file\r
1049  */\r
1050 static void validate_file(cptr s)\r
1051 {\r
1052         /* Verify or fail */\r
1053         if (!check_file(s))\r
1054         {\r
1055                 quit_fmt(_("必要なファイル[%s]が見あたりません。", "Cannot find required file:\n%s"), s);\r
1056         }\r
1057 }\r
1058 \r
1059 \r
1060 /*\r
1061  * Validate a directory\r
1062  */\r
1063 static void validate_dir(cptr s, bool vital)\r
1064 {\r
1065         /* Verify or fail */\r
1066         if (!check_dir(s))\r
1067         {\r
1068                 /* This directory contains needed data */\r
1069                 if (vital)\r
1070                 {\r
1071                         quit_fmt(_("必要なディレクトリ[%s]が見あたりません。", "Cannot find required directory:\n%s"), s);\r
1072                 }\r
1073                 /* Attempt to create this directory */\r
1074                 else if (mkdir(s))\r
1075                 {\r
1076                         quit_fmt("Unable to create directory:\n%s", s);\r
1077                 }\r
1078         }\r
1079 }\r
1080 \r
1081 \r
1082 /*\r
1083  * Get the "size" for a window\r
1084  */\r
1085 static void term_getsize(term_data *td)\r
1086 {\r
1087         RECT rc;\r
1088 \r
1089         int wid, hgt;\r
1090 \r
1091         /* Paranoia */\r
1092         if (td->cols < 1) td->cols = 1;\r
1093         if (td->rows < 1) td->rows = 1;\r
1094 \r
1095         /* Window sizes */\r
1096         wid = td->cols * td->tile_wid + td->size_ow1 + td->size_ow2;\r
1097         hgt = td->rows * td->tile_hgt + td->size_oh1 + td->size_oh2;\r
1098 \r
1099         /* Fake window size */\r
1100         rc.left = 0;\r
1101         rc.right = rc.left + wid;\r
1102         rc.top = 0;\r
1103         rc.bottom = rc.top + hgt;\r
1104 \r
1105         /* XXX XXX XXX */\r
1106         /* rc.right += 1; */\r
1107         /* rc.bottom += 1; */\r
1108 \r
1109         /* Adjust */\r
1110         AdjustWindowRectEx(&rc, td->dwStyle, TRUE, td->dwExStyle);\r
1111 \r
1112         /* Total size */\r
1113         td->size_wid = rc.right - rc.left;\r
1114         td->size_hgt = rc.bottom - rc.top;\r
1115 \r
1116         /* See CreateWindowEx */\r
1117         if (!td->w) return;\r
1118 \r
1119         /* Extract actual location */\r
1120         GetWindowRect(td->w, &rc);\r
1121 \r
1122         /* Save the location */\r
1123         td->pos_x = rc.left;\r
1124         td->pos_y = rc.top;\r
1125 }\r
1126 \r
1127 \r
1128 /*\r
1129  * Write the "prefs" for a single term\r
1130  */\r
1131 static void save_prefs_aux(int i)\r
1132 {\r
1133         term_data *td = &data[i];\r
1134         char sec_name[128];\r
1135         char buf[1024];\r
1136 \r
1137         RECT rc;\r
1138         WINDOWPLACEMENT lpwndpl;\r
1139 \r
1140         /* Paranoia */\r
1141         if (!td->w) return;\r
1142 \r
1143         /* Make section name */\r
1144         sprintf(sec_name, "Term-%d", i);\r
1145 \r
1146         /* Visible */\r
1147         if (i > 0)\r
1148         {\r
1149                 strcpy(buf, td->visible ? "1" : "0");\r
1150                 WritePrivateProfileString(sec_name, "Visible", buf, ini_file);\r
1151         }\r
1152 \r
1153         /* Font */\r
1154 #ifdef JP\r
1155         strcpy(buf, td->lf.lfFaceName[0]!='\0' ? td->lf.lfFaceName : "MS ゴシック");\r
1156 #else\r
1157 #if 0\r
1158         strcpy(buf, td->font_file ? td->font_file : "8X13.FON");\r
1159 #else\r
1160         strcpy(buf, td->lf.lfFaceName[0]!='\0' ? td->lf.lfFaceName : "Courier");\r
1161 #endif\r
1162 #endif\r
1163 \r
1164         WritePrivateProfileString(sec_name, "Font", buf, ini_file);\r
1165 \r
1166 #if 1 /* #ifdef JP */\r
1167         wsprintf(buf, "%d", td->lf.lfWidth);\r
1168         WritePrivateProfileString(sec_name, "FontWid", buf, ini_file);\r
1169         wsprintf(buf, "%d", td->lf.lfHeight);\r
1170         WritePrivateProfileString(sec_name, "FontHgt", buf, ini_file);\r
1171         wsprintf(buf, "%d", td->lf.lfWeight);\r
1172         WritePrivateProfileString(sec_name, "FontWgt", buf, ini_file);\r
1173 #endif\r
1174         /* Bizarre */\r
1175         strcpy(buf, td->bizarre ? "1" : "0");\r
1176         WritePrivateProfileString(sec_name, "Bizarre", buf, ini_file);\r
1177 \r
1178         /* Tile size (x) */\r
1179         wsprintf(buf, "%d", td->tile_wid);\r
1180         WritePrivateProfileString(sec_name, "TileWid", buf, ini_file);\r
1181 \r
1182         /* Tile size (y) */\r
1183         wsprintf(buf, "%d", td->tile_hgt);\r
1184         WritePrivateProfileString(sec_name, "TileHgt", buf, ini_file);\r
1185 \r
1186         /* Get window placement and dimensions */\r
1187         lpwndpl.length = sizeof(WINDOWPLACEMENT);\r
1188         GetWindowPlacement(td->w, &lpwndpl);\r
1189 \r
1190         /* Acquire position in *normal* mode (not minimized) */\r
1191         rc = lpwndpl.rcNormalPosition;\r
1192 \r
1193         /* Window size (x) */\r
1194         if (i == 0) wsprintf(buf, "%d", normsize.x);\r
1195         else wsprintf(buf, "%d", td->cols);\r
1196         WritePrivateProfileString(sec_name, "NumCols", buf, ini_file);\r
1197 \r
1198         /* Window size (y) */\r
1199         if (i == 0) wsprintf(buf, "%d", normsize.y);\r
1200         else wsprintf(buf, "%d", td->rows);\r
1201         WritePrivateProfileString(sec_name, "NumRows", buf, ini_file);\r
1202 \r
1203         /* Maxmized (only main window) */\r
1204         if (i == 0)\r
1205         {\r
1206                 strcpy(buf, IsZoomed(td->w) ? "1" : "0");\r
1207                 WritePrivateProfileString(sec_name, "Maximized", buf, ini_file);\r
1208         }\r
1209 \r
1210         /* Acquire position */\r
1211         GetWindowRect(td->w, &rc);\r
1212 \r
1213         /* Window position (x) */\r
1214         wsprintf(buf, "%d", rc.left);\r
1215         WritePrivateProfileString(sec_name, "PositionX", buf, ini_file);\r
1216 \r
1217         /* Window position (y) */\r
1218         wsprintf(buf, "%d", rc.top);\r
1219         WritePrivateProfileString(sec_name, "PositionY", buf, ini_file);\r
1220 \r
1221         /* Window Z position */\r
1222         if (i > 0)\r
1223         {\r
1224                 strcpy(buf, td->posfix ? "1" : "0");\r
1225                 WritePrivateProfileString(sec_name, "PositionFix", buf, ini_file);\r
1226         }\r
1227 }\r
1228 \r
1229 \r
1230 /*\r
1231  * Write the "prefs"\r
1232  *\r
1233  * We assume that the windows have all been initialized\r
1234  */\r
1235 static void save_prefs(void)\r
1236 {\r
1237         int i;\r
1238 \r
1239         char buf[128];\r
1240 \r
1241         /* Save the "arg_graphics" flag */\r
1242         sprintf(buf, "%d", arg_graphics);\r
1243         WritePrivateProfileString("Angband", "Graphics", buf, ini_file);\r
1244 \r
1245         /* Save the "arg_bigtile" flag */\r
1246         strcpy(buf, arg_bigtile ? "1" : "0");\r
1247         WritePrivateProfileString("Angband", "Bigtile", buf, ini_file);\r
1248 \r
1249         /* Save the "arg_sound" flag */\r
1250         strcpy(buf, arg_sound ? "1" : "0");\r
1251         WritePrivateProfileString("Angband", "Sound", buf, ini_file);\r
1252 \r
1253         /* Save the "arg_sound" flag */\r
1254         strcpy(buf, arg_music ? "1" : "0");\r
1255         WritePrivateProfileString("Angband", "Music", buf, ini_file);\r
1256 \r
1257         /* bg */\r
1258         strcpy(buf, use_bg ? "1" : "0");\r
1259         WritePrivateProfileString("Angband", "BackGround", buf, ini_file);\r
1260         WritePrivateProfileString("Angband", "BackGroundBitmap", \r
1261                 bg_bitmap_file[0] != '\0' ? bg_bitmap_file : "bg.bmp", ini_file);\r
1262 \r
1263         /* Save window prefs */\r
1264         for (i = 0; i < MAX_TERM_DATA; ++i)\r
1265         {\r
1266                 save_prefs_aux(i);\r
1267         }\r
1268 }\r
1269 \r
1270 \r
1271 /*\r
1272  * Load the "prefs" for a single term\r
1273  */\r
1274 static void load_prefs_aux(int i)\r
1275 {\r
1276         term_data *td = &data[i];\r
1277         char sec_name[128];\r
1278         char tmp[1024];\r
1279 \r
1280         int wid, hgt, posx, posy;\r
1281         int dispx = GetSystemMetrics( SM_CXVIRTUALSCREEN);\r
1282         int dispy = GetSystemMetrics( SM_CYVIRTUALSCREEN);\r
1283         posx=0;\r
1284         posy=0;\r
1285         \r
1286         /* Make section name */\r
1287         sprintf(sec_name, "Term-%d", i);\r
1288 \r
1289         /* Make section name */\r
1290         sprintf(sec_name, "Term-%d", i);\r
1291 \r
1292         /* Visible */\r
1293         if (i > 0)\r
1294         {\r
1295                 td->visible = (GetPrivateProfileInt(sec_name, "Visible", td->visible, ini_file) != 0);\r
1296         }\r
1297 \r
1298         /* Desired font, with default */\r
1299 #ifdef JP\r
1300         GetPrivateProfileString(sec_name, "Font", "MS ゴシック", tmp, 127, ini_file);\r
1301 #else\r
1302 #if 0\r
1303         GetPrivateProfileString(sec_name, "Font", "8X13.FON", tmp, 127, ini_file);\r
1304 #else\r
1305         GetPrivateProfileString(sec_name, "Font", "Courier", tmp, 127, ini_file);\r
1306 #endif\r
1307 #endif\r
1308 \r
1309 \r
1310         /* Bizarre */\r
1311         td->bizarre = (GetPrivateProfileInt(sec_name, "Bizarre", td->bizarre, ini_file) != 0);\r
1312 \r
1313         /* Analyze font, save desired font name */\r
1314 #if 1 /* #ifdef JP */\r
1315         td->font_want = string_make(tmp);\r
1316         hgt = 15; wid = 0;\r
1317         td->lf.lfWidth  = GetPrivateProfileInt(sec_name, "FontWid", wid, ini_file);\r
1318         td->lf.lfHeight = GetPrivateProfileInt(sec_name, "FontHgt", hgt, ini_file);\r
1319         td->lf.lfWeight = GetPrivateProfileInt(sec_name, "FontWgt", 0, ini_file);\r
1320 #else\r
1321         td->font_want = string_make(analyze_font(tmp, &wid, &hgt));\r
1322 #endif\r
1323 \r
1324 \r
1325         /* Tile size */\r
1326 #if 1 /* #ifdef JP */\r
1327         td->tile_wid = GetPrivateProfileInt(sec_name, "TileWid", td->lf.lfWidth, ini_file);\r
1328         td->tile_hgt = GetPrivateProfileInt(sec_name, "TileHgt", td->lf.lfHeight, ini_file);\r
1329 #else\r
1330         td->tile_wid = GetPrivateProfileInt(sec_name, "TileWid", wid, ini_file);\r
1331         td->tile_hgt = GetPrivateProfileInt(sec_name, "TileHgt", hgt, ini_file);\r
1332 #endif\r
1333 \r
1334 \r
1335         /* Window size */\r
1336         td->cols = GetPrivateProfileInt(sec_name, "NumCols", td->cols, ini_file);\r
1337         td->rows = GetPrivateProfileInt(sec_name, "NumRows", td->rows, ini_file);\r
1338         normsize.x = td->cols; normsize.y = td->rows;\r
1339 \r
1340         /* Window size */\r
1341         if (i == 0)\r
1342         {\r
1343                 win_maximized = (GetPrivateProfileInt(sec_name, "Maximized", win_maximized, ini_file) != 0);\r
1344         }\r
1345 \r
1346         /* Window position */\r
1347         posx = GetPrivateProfileInt(sec_name, "PositionX", posx, ini_file);\r
1348         posy = GetPrivateProfileInt(sec_name, "PositionY", posy, ini_file);\r
1349         td->pos_x = MIN(MAX(0, posx), dispx-128);\r
1350         td->pos_y = MIN(MAX(0, posy), dispy-128);\r
1351 \r
1352         /* Window Z position */\r
1353         if (i > 0)\r
1354         {\r
1355                 td->posfix = (GetPrivateProfileInt(sec_name, "PositionFix", td->posfix, ini_file) != 0);\r
1356         }\r
1357 }\r
1358 \r
1359 \r
1360 /*\r
1361  * Load the "prefs"\r
1362  */\r
1363 static void load_prefs(void)\r
1364 {\r
1365         int i;\r
1366 \r
1367         /* Extract the "arg_graphics" flag */\r
1368         arg_graphics = (byte_hack)GetPrivateProfileInt("Angband", "Graphics", GRAPHICS_NONE, ini_file);\r
1369 \r
1370         /* Extract the "arg_bigtile" flag */\r
1371         arg_bigtile = (GetPrivateProfileInt("Angband", "Bigtile", FALSE, ini_file) != 0);\r
1372         use_bigtile = arg_bigtile;\r
1373 \r
1374         /* Extract the "arg_sound" flag */\r
1375         arg_sound = (GetPrivateProfileInt("Angband", "Sound", 0, ini_file) != 0);\r
1376 \r
1377         /* Extract the "arg_sound" flag */\r
1378         arg_music = (GetPrivateProfileInt("Angband", "Music", 0, ini_file) != 0);\r
1379 \r
1380         /* bg */\r
1381         use_bg = GetPrivateProfileInt("Angband", "BackGround", 0, ini_file);\r
1382         GetPrivateProfileString("Angband", "BackGroundBitmap", "bg.bmp", bg_bitmap_file, 1023, ini_file);\r
1383 \r
1384         /* Load window prefs */\r
1385         for (i = 0; i < MAX_TERM_DATA; ++i)\r
1386         {\r
1387                 load_prefs_aux(i);\r
1388         }\r
1389 }\r
1390 \r
1391 #if defined(USE_SOUND) || defined(USE_MUSIC)\r
1392 \r
1393 /*\r
1394  * XXX XXX XXX - Taken from files.c.\r
1395  *\r
1396  * Extract "tokens" from a buffer\r
1397  *\r
1398  * This function uses "whitespace" as delimiters, and treats any amount of\r
1399  * whitespace as a single delimiter.  We will never return any empty tokens.\r
1400  * When given an empty buffer, or a buffer containing only "whitespace", we\r
1401  * will return no tokens.  We will never extract more than "num" tokens.\r
1402  *\r
1403  * By running a token through the "text_to_ascii()" function, you can allow\r
1404  * that token to include (encoded) whitespace, using "\s" to encode spaces.\r
1405  *\r
1406  * We save pointers to the tokens in "tokens", and return the number found.\r
1407  */\r
1408 static s16b tokenize_whitespace(char *buf, s16b num, char **tokens)\r
1409 {\r
1410         s16b k = 0;\r
1411         char *s = buf;\r
1412 \r
1413         /* Process */\r
1414         while (k < num)\r
1415         {\r
1416                 char *t;\r
1417 \r
1418                 /* Skip leading whitespace */\r
1419                 for ( ; *s && iswspace(*s); ++s) /* loop */;\r
1420 \r
1421                 /* All done */\r
1422                 if (!*s) break;\r
1423 \r
1424                 /* Find next whitespace, if any */\r
1425                 for (t = s; *t && !iswspace(*t); ++t) /* loop */;\r
1426 \r
1427                 /* Nuke and advance (if necessary) */\r
1428                 if (*t) *t++ = '\0';\r
1429 \r
1430                 /* Save the token */\r
1431                 tokens[k++] = s;\r
1432 \r
1433                 /* Advance */\r
1434                 s = t;\r
1435         }\r
1436 \r
1437         /* Count */\r
1438         return (k);\r
1439 }\r
1440 \r
1441 #endif /* USE_SOUND || USE_MUSIC */\r
1442 \r
1443 #ifdef USE_SOUND\r
1444 \r
1445 static void load_sound_prefs(void)\r
1446 {\r
1447         int i, j, num;\r
1448         char tmp[1024];\r
1449         char ini_path[1024];\r
1450         char wav_path[1024];\r
1451         char *zz[SAMPLE_MAX];\r
1452 \r
1453         /* Access the sound.cfg */\r
1454 \r
1455         path_build(ini_path, 1024, ANGBAND_DIR_XTRA_SOUND, "sound.cfg");\r
1456 \r
1457         for (i = 0; i < SOUND_MAX; i++)\r
1458         {\r
1459                 GetPrivateProfileString("Sound", angband_sound_name[i], "", tmp, 1024, ini_path);\r
1460 \r
1461                 num = tokenize_whitespace(tmp, SAMPLE_MAX, zz);\r
1462 \r
1463                 for (j = 0; j < num; j++)\r
1464                 {\r
1465                         /* Access the sound */\r
1466                         path_build(wav_path, 1024, ANGBAND_DIR_XTRA_SOUND, zz[j]);\r
1467 \r
1468                         /* Save the sound filename, if it exists */\r
1469                         if (check_file(wav_path))\r
1470                                 sound_file[i][j] = string_make(zz[j]);\r
1471                 }\r
1472         }\r
1473 }\r
1474 \r
1475 #endif /* USE_SOUND */\r
1476 \r
1477 #ifdef USE_MUSIC\r
1478 \r
1479 static void load_music_prefs(void)\r
1480 {\r
1481         int i, j, num;\r
1482         char tmp[1024];\r
1483         char ini_path[1024];\r
1484         char wav_path[1024];\r
1485         char *zz[SAMPLE_MAX];\r
1486         char key[80];\r
1487 \r
1488         /* Access the music.cfg */\r
1489 \r
1490         path_build(ini_path, 1024, ANGBAND_DIR_XTRA_MUSIC, "music.cfg");\r
1491 \r
1492         GetPrivateProfileString("Device", "type", "", mci_device_type, 256, ini_path);\r
1493 \r
1494         for (i = 0; i < MUSIC_BASIC_MAX; i++)\r
1495         {\r
1496                 GetPrivateProfileString("Basic", angband_music_basic_name[i], "", tmp, 1024, ini_path);\r
1497 \r
1498                 num = tokenize_whitespace(tmp, SAMPLE_MUSIC_MAX, zz);\r
1499 \r
1500                 for (j = 0; j < num; j++)\r
1501                 {\r
1502                         /* Access the sound */\r
1503                         path_build(wav_path, 1024, ANGBAND_DIR_XTRA_MUSIC, zz[j]);\r
1504 \r
1505                         /* Save the sound filename, if it exists */\r
1506                         if (check_file(wav_path))\r
1507                                 music_file[i][j] = string_make(zz[j]);\r
1508                 }\r
1509         }\r
1510 \r
1511         for (i = 0; i < max_d_idx; i++)\r
1512         {\r
1513                 sprintf(key, "dungeon%03d", i);\r
1514                 GetPrivateProfileString("Dungeon", key, "", tmp, 1024, ini_path);\r
1515 \r
1516                 num = tokenize_whitespace(tmp, SAMPLE_MUSIC_MAX, zz);\r
1517 \r
1518                 for (j = 0; j < num; j++)\r
1519                 {\r
1520                         /* Access the sound */\r
1521                         path_build(wav_path, 1024, ANGBAND_DIR_XTRA_MUSIC, zz[j]);\r
1522 \r
1523                         /* Save the sound filename, if it exists */\r
1524                         if (check_file(wav_path))\r
1525                                 dungeon_music_file[i][j] = string_make(zz[j]);\r
1526                 }\r
1527         }\r
1528 \r
1529         for (i = 0; i < 1000; i++) /*!< @todo クエスト最大数指定 */\r
1530         {\r
1531                 sprintf(key, "quest%03d", i);\r
1532                 GetPrivateProfileString("Quest", key, "", tmp, 1024, ini_path);\r
1533 \r
1534                 num = tokenize_whitespace(tmp, SAMPLE_MUSIC_MAX, zz);\r
1535 \r
1536                 for (j = 0; j < num; j++)\r
1537                 {\r
1538                         /* Access the sound */\r
1539                         path_build(wav_path, 1024, ANGBAND_DIR_XTRA_MUSIC, zz[j]);\r
1540 \r
1541                         /* Save the sound filename, if it exists */\r
1542                         if (check_file(wav_path))\r
1543                                 quest_music_file[i][j] = string_make(zz[j]);\r
1544                 }\r
1545         }\r
1546 \r
1547         for (i = 0; i < 1000; i++) /*!< @todo 町最大数指定 */\r
1548         {\r
1549                 sprintf(key, "town%03d", i);\r
1550                 GetPrivateProfileString("Town", key, "", tmp, 1024, ini_path);\r
1551 \r
1552                 num = tokenize_whitespace(tmp, SAMPLE_MUSIC_MAX, zz);\r
1553 \r
1554                 for (j = 0; j < num; j++)\r
1555                 {\r
1556                         /* Access the sound */\r
1557                         path_build(wav_path, 1024, ANGBAND_DIR_XTRA_MUSIC, zz[j]);\r
1558 \r
1559                         /* Save the sound filename, if it exists */\r
1560                         if (check_file(wav_path))\r
1561                                 town_music_file[i][j] = string_make(zz[j]);\r
1562                 }\r
1563         }\r
1564 \r
1565 \r
1566 }\r
1567 \r
1568 #endif /* USE_MUSIC */\r
1569 \r
1570 /*\r
1571  * Create the new global palette based on the bitmap palette\r
1572  * (if any), and the standard 16 entry palette derived from\r
1573  * "win_clr[]" which is used for the basic 16 Angband colors.\r
1574  *\r
1575  * This function is never called before all windows are ready.\r
1576  *\r
1577  * This function returns FALSE if the new palette could not be\r
1578  * prepared, which should normally be a fatal error.  XXX XXX\r
1579  *\r
1580  * Note that only some machines actually use a "palette".\r
1581  */\r
1582 static int new_palette(void)\r
1583 {\r
1584         HPALETTE hBmPal;\r
1585         HPALETTE hNewPal;\r
1586         HDC hdc;\r
1587         int i, nEntries;\r
1588         int pLogPalSize;\r
1589         int lppeSize;\r
1590         LPLOGPALETTE pLogPal;\r
1591         LPPALETTEENTRY lppe;\r
1592 \r
1593         term_data *td;\r
1594 \r
1595 \r
1596         /* This makes no sense */\r
1597         if (!paletted) return (TRUE);\r
1598 \r
1599 \r
1600         /* No bitmap */\r
1601         lppeSize = 0;\r
1602         lppe = NULL;\r
1603         nEntries = 0;\r
1604 \r
1605 #ifdef USE_GRAPHICS\r
1606 \r
1607         /* Check the bitmap palette */\r
1608         hBmPal = infGraph.hPalette;\r
1609 \r
1610         /* Use the bitmap */\r
1611         if (hBmPal)\r
1612         {\r
1613                 lppeSize = 256 * sizeof(PALETTEENTRY);\r
1614                 lppe = (LPPALETTEENTRY)ralloc(lppeSize);\r
1615                 nEntries = GetPaletteEntries(hBmPal, 0, 255, lppe);\r
1616                 if ((nEntries == 0) || (nEntries > 220))\r
1617                 {\r
1618                         /* Warn the user */\r
1619                         plog(_("画面を16ビットか24ビットカラーモードにして下さい。", "Please switch to high- or true-color mode."));\r
1620 \r
1621                         /* Cleanup */\r
1622                         rnfree(lppe, lppeSize);\r
1623 \r
1624                         /* Fail */\r
1625                         return (FALSE);\r
1626                 }\r
1627         }\r
1628 \r
1629 #endif /* USE_GRAPHICS */\r
1630 \r
1631         /* Size of palette */\r
1632         pLogPalSize = sizeof(LOGPALETTE) + (nEntries + 16) * sizeof(PALETTEENTRY);\r
1633 \r
1634         /* Allocate palette */\r
1635         pLogPal = (LPLOGPALETTE)ralloc(pLogPalSize);\r
1636 \r
1637         /* Version */\r
1638         pLogPal->palVersion = 0x300;\r
1639 \r
1640         /* Make room for bitmap and normal data */\r
1641         pLogPal->palNumEntries = nEntries + 16;\r
1642 \r
1643         /* Save the bitmap data */\r
1644         for (i = 0; i < nEntries; i++)\r
1645         {\r
1646                 pLogPal->palPalEntry[i] = lppe[i];\r
1647         }\r
1648 \r
1649         /* Save the normal data */\r
1650         for (i = 0; i < 16; i++)\r
1651         {\r
1652                 LPPALETTEENTRY p;\r
1653 \r
1654                 /* Access the entry */\r
1655                 p = &(pLogPal->palPalEntry[i+nEntries]);\r
1656 \r
1657                 /* Save the colors */\r
1658                 p->peRed = GetRValue(win_clr[i]);\r
1659                 p->peGreen = GetGValue(win_clr[i]);\r
1660                 p->peBlue = GetBValue(win_clr[i]);\r
1661 \r
1662                 /* Save the flags */\r
1663                 p->peFlags = PC_NOCOLLAPSE;\r
1664         }\r
1665 \r
1666         /* Free something */\r
1667         if (lppe) rnfree(lppe, lppeSize);\r
1668 \r
1669         /* Create a new palette, or fail */\r
1670         hNewPal = CreatePalette(pLogPal);\r
1671         if (!hNewPal) quit(_("パレットを作成できません!", "Cannot create palette!"));\r
1672 \r
1673         /* Free the palette */\r
1674         rnfree(pLogPal, pLogPalSize);\r
1675 \r
1676         /* Main window */\r
1677         td = &data[0];\r
1678 \r
1679         /* Realize the palette */\r
1680         hdc = GetDC(td->w);\r
1681         SelectPalette(hdc, hNewPal, 0);\r
1682         i = RealizePalette(hdc);\r
1683         ReleaseDC(td->w, hdc);\r
1684         if (i == 0) quit(_("パレットをシステムエントリにマップできません!", "Cannot realize palette!"));\r
1685 \r
1686 \r
1687         /* Sub-windows */\r
1688         for (i = 1; i < MAX_TERM_DATA; i++)\r
1689         {\r
1690                 td = &data[i];\r
1691 \r
1692                 hdc = GetDC(td->w);\r
1693                 SelectPalette(hdc, hNewPal, 0);\r
1694                 ReleaseDC(td->w, hdc);\r
1695         }\r
1696 \r
1697         /* Delete old palette */\r
1698         if (hPal) DeleteObject(hPal);\r
1699 \r
1700         /* Save new palette */\r
1701         hPal = hNewPal;\r
1702 \r
1703         /* Success */\r
1704         return (TRUE);\r
1705 }\r
1706 \r
1707 \r
1708 #ifdef USE_GRAPHICS\r
1709 /*\r
1710  * Initialize graphics\r
1711  */\r
1712 static bool init_graphics(void)\r
1713 {\r
1714         /* Initialize once */\r
1715         /* if (can_use_graphics != arg_graphics) */\r
1716         {\r
1717                 char buf[1024];\r
1718                 BYTE wid, hgt, twid, thgt, ox, oy;\r
1719                 cptr name;\r
1720 \r
1721                 if (arg_graphics == GRAPHICS_ADAM_BOLT)\r
1722                 {\r
1723                         wid = 16;\r
1724                         hgt = 16;\r
1725                         twid = 16;\r
1726                         thgt = 16;\r
1727                         ox = 0;\r
1728                         oy = 0;\r
1729                         name = "16X16.BMP";\r
1730 \r
1731                         ANGBAND_GRAF = "new";\r
1732                 }\r
1733                 else if (arg_graphics == GRAPHICS_HENGBAND)\r
1734                 {\r
1735                         /*! @todo redraw \r
1736                         wid = 64;\r
1737                         hgt = 64;\r
1738                         twid = 32;\r
1739                         thgt = 32;\r
1740                         ox = -16;\r
1741                         oy = -24;\r
1742                         name = "64X64.BMP";\r
1743                         */\r
1744 \r
1745                         wid = 32;\r
1746                         hgt = 32;\r
1747                         twid = 32;\r
1748                         thgt = 32;\r
1749                         ox = 0;\r
1750                         oy = 0;\r
1751                         name = "32X32.BMP";\r
1752 \r
1753                         ANGBAND_GRAF = "ne2";\r
1754                 }\r
1755                 else\r
1756                 {\r
1757                         wid = 8;\r
1758                         hgt = 8;\r
1759                         twid = 8;\r
1760                         thgt = 8;\r
1761                         ox = 0;\r
1762                         oy = 0;\r
1763                         name = "8X8.BMP";\r
1764                         ANGBAND_GRAF = "old";\r
1765                 }\r
1766 \r
1767                 /* Access the bitmap file */\r
1768                 path_build(buf, sizeof(buf), ANGBAND_DIR_XTRA_GRAF, name);\r
1769 \r
1770                 /* Load the bitmap or quit */\r
1771                 if (!ReadDIB(data[0].w, buf, &infGraph))\r
1772                 {\r
1773                         plog_fmt(_("ビットマップ '%s' を読み込めません。", "Cannot read bitmap file '%s'"), name);\r
1774                         return (FALSE);\r
1775                 }\r
1776 \r
1777                 /* Save the new sizes */\r
1778                 infGraph.CellWidth = wid;\r
1779                 infGraph.CellHeight = hgt;\r
1780                 infGraph.TileWidth = twid;\r
1781                 infGraph.TileHeight = thgt;\r
1782                 infGraph.OffsetX = ox;\r
1783                 infGraph.OffsetY = oy;\r
1784 \r
1785                 if (arg_graphics == GRAPHICS_ADAM_BOLT)\r
1786                 {\r
1787                         /* Access the mask file */\r
1788                         path_build(buf, sizeof(buf), ANGBAND_DIR_XTRA_GRAF, "mask.bmp");\r
1789 \r
1790                         /* Load the bitmap or quit */\r
1791                         if (!ReadDIB(data[0].w, buf, &infMask))\r
1792                         {\r
1793                                 plog_fmt("Cannot read bitmap file '%s'", buf);\r
1794                                 return (FALSE);\r
1795                         }\r
1796                 }\r
1797                 if (arg_graphics == GRAPHICS_HENGBAND)\r
1798                 {\r
1799                         /* Access the mask file */\r
1800                         path_build(buf, sizeof(buf), ANGBAND_DIR_XTRA_GRAF, "mask32.bmp");\r
1801 \r
1802                         /* Load the bitmap or quit */\r
1803                         if (!ReadDIB(data[0].w, buf, &infMask))\r
1804                         {\r
1805                                 plog_fmt("Cannot read bitmap file '%s'", buf);\r
1806                                 return (FALSE);\r
1807                         }\r
1808                 }\r
1809 \r
1810                 /* Activate a palette */\r
1811                 if (!new_palette())\r
1812                 {\r
1813                         /* Free bitmap XXX XXX XXX */\r
1814 \r
1815                         /* Oops */\r
1816                         plog(_("パレットを実現できません!", "Cannot activate palette!"));\r
1817                         return (FALSE);\r
1818                 }\r
1819 \r
1820                 /* Graphics available */\r
1821                 can_use_graphics = arg_graphics;\r
1822         }\r
1823 \r
1824         /* Result */\r
1825         return (can_use_graphics);\r
1826 }\r
1827 #endif /* USE_GRAPHICS */\r
1828 \r
1829 \r
1830 #ifdef USE_MUSIC\r
1831 /*\r
1832  * Initialize music\r
1833  */\r
1834 static bool init_music(void)\r
1835 {\r
1836         /* Initialize once */\r
1837         if (!can_use_music)\r
1838         {\r
1839                 /* Load the prefs */\r
1840                 load_music_prefs();\r
1841 \r
1842                 /* Sound available */\r
1843                 can_use_music = TRUE;\r
1844         }\r
1845 \r
1846         /* Result */\r
1847         return (can_use_music);\r
1848 }\r
1849 \r
1850 /*\r
1851  * Hack -- Stop a music\r
1852  */\r
1853 static void stop_music(void)\r
1854 {\r
1855         mciSendCommand(mop.wDeviceID, MCI_STOP, 0, 0);\r
1856         mciSendCommand(mop.wDeviceID, MCI_CLOSE, 0, 0);\r
1857 }\r
1858 \r
1859 #endif /* USE_MUSIC */\r
1860 \r
1861 #ifdef USE_SOUND\r
1862 /*\r
1863  * Initialize sound\r
1864  */\r
1865 static bool init_sound(void)\r
1866 {\r
1867         /* Initialize once */\r
1868         if (!can_use_sound)\r
1869         {\r
1870                 /* Load the prefs */\r
1871                 load_sound_prefs();\r
1872 \r
1873                 /* Sound available */\r
1874                 can_use_sound = TRUE;\r
1875         }\r
1876 \r
1877         /* Result */\r
1878         return (can_use_sound);\r
1879 }\r
1880 #endif /* USE_SOUND */\r
1881 \r
1882 \r
1883 /*\r
1884  * Resize a window\r
1885  */\r
1886 static void term_window_resize(term_data *td)\r
1887 {\r
1888         /* Require window */\r
1889         if (!td->w) return;\r
1890 \r
1891         /* Resize the window */\r
1892         SetWindowPos(td->w, 0, 0, 0,\r
1893                      td->size_wid, td->size_hgt,\r
1894                      SWP_NOMOVE | SWP_NOZORDER);\r
1895 \r
1896         /* Redraw later */\r
1897         InvalidateRect(td->w, NULL, TRUE);\r
1898 }\r
1899 \r
1900 \r
1901 /*\r
1902  * Force the use of a new "font file" for a term_data\r
1903  *\r
1904  * This function may be called before the "window" is ready\r
1905  *\r
1906  * This function returns zero only if everything succeeds.\r
1907  *\r
1908  * Note that the "font name" must be capitalized!!!\r
1909  */\r
1910 static errr term_force_font(term_data *td, cptr path)\r
1911 {\r
1912         int wid, hgt;\r
1913 \r
1914 #if 0 /* #ifndef JP */\r
1915         int i;\r
1916         char *base;\r
1917         char buf[1024];\r
1918 #endif\r
1919 \r
1920         /* Forget the old font (if needed) */\r
1921         if (td->font_id) DeleteObject(td->font_id);\r
1922 \r
1923 #if 1 /* #ifdef JP */\r
1924         /* Unused */\r
1925         (void)path;\r
1926 \r
1927         /* Create the font (using the 'base' of the font file name!) */\r
1928         td->font_id = CreateFontIndirect(&(td->lf));\r
1929         wid = td->lf.lfWidth;\r
1930         hgt = td->lf.lfHeight;\r
1931         if (!td->font_id) return (1);\r
1932 #else\r
1933         /* Forget old font */\r
1934         if (td->font_file)\r
1935         {\r
1936                 bool used = FALSE;\r
1937 \r
1938                 /* Scan windows */\r
1939                 for (i = 0; i < MAX_TERM_DATA; i++)\r
1940                 {\r
1941                         /* Don't check when closing the application */\r
1942                         if (!path) break;\r
1943 \r
1944                         /* Check "screen" */\r
1945                         if ((td != &data[i]) &&\r
1946                             (data[i].font_file) &&\r
1947                             (streq(data[i].font_file, td->font_file)))\r
1948                         {\r
1949                                 used = TRUE;\r
1950                         }\r
1951                 }\r
1952 \r
1953                 /* Remove unused font resources */\r
1954                 if (!used) RemoveFontResource(td->font_file);\r
1955 \r
1956                 /* Free the old name */\r
1957                 string_free(td->font_file);\r
1958 \r
1959                 /* Forget it */\r
1960                 td->font_file = NULL;\r
1961         }\r
1962 \r
1963         /* No path given */\r
1964         if (!path) return (1);\r
1965 \r
1966         /* Local copy */\r
1967         strcpy(buf, path);\r
1968 \r
1969         /* Analyze font path */\r
1970         base = analyze_font(buf, &wid, &hgt);\r
1971 \r
1972         /* Verify suffix */\r
1973         if (!suffix(base, ".FON")) return (1);\r
1974 \r
1975         /* Verify file */\r
1976         if (!check_file(buf)) return (1);\r
1977 \r
1978         /* Load the new font */\r
1979         if (!AddFontResource(buf)) return (1);\r
1980 \r
1981         /* Save new font name */\r
1982         td->font_file = string_make(base);\r
1983 \r
1984         /* Remove the "suffix" */\r
1985         base[strlen(base)-4] = '\0';\r
1986 \r
1987         /* Create the font (using the 'base' of the font file name!) */\r
1988         td->font_id = CreateFont(hgt, wid, 0, 0, FW_DONTCARE, 0, 0, 0,\r
1989                                  ANSI_CHARSET, OUT_DEFAULT_PRECIS,\r
1990                                  CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,\r
1991                                  FIXED_PITCH | FF_DONTCARE, base);\r
1992 #endif\r
1993 \r
1994         /* Hack -- Unknown size */\r
1995         if (!wid || !hgt)\r
1996         {\r
1997                 HDC hdcDesktop;\r
1998                 HFONT hfOld;\r
1999                 TEXTMETRIC tm;\r
2000 \r
2001                 /* all this trouble to get the cell size */\r
2002                 hdcDesktop = GetDC(HWND_DESKTOP);\r
2003                 hfOld = SelectObject(hdcDesktop, td->font_id);\r
2004                 GetTextMetrics(hdcDesktop, &tm);\r
2005                 SelectObject(hdcDesktop, hfOld);\r
2006                 ReleaseDC(HWND_DESKTOP, hdcDesktop);\r
2007 \r
2008                 /* Font size info */\r
2009                 wid = tm.tmAveCharWidth;\r
2010                 hgt = tm.tmHeight;\r
2011         }\r
2012 \r
2013         /* Save the size info */\r
2014         td->font_wid = wid;\r
2015         td->font_hgt = hgt;\r
2016 \r
2017         /* Success */\r
2018         return (0);\r
2019 }\r
2020 \r
2021 \r
2022 \r
2023 /*\r
2024  * Allow the user to change the font for this window.\r
2025  */\r
2026 static void term_change_font(term_data *td)\r
2027 {\r
2028 #if 1 /* #ifdef JP */\r
2029         CHOOSEFONT cf;\r
2030 \r
2031         memset(&cf, 0, sizeof(cf));\r
2032         cf.lStructSize = sizeof(cf);\r
2033     cf.Flags = CF_SCREENFONTS | CF_FIXEDPITCHONLY | CF_NOVERTFONTS | CF_INITTOLOGFONTSTRUCT;\r
2034     cf.lpLogFont = &(td->lf);\r
2035 \r
2036         if (ChooseFont(&cf))\r
2037         {\r
2038                 /* Force the font */\r
2039                 term_force_font(td, NULL);\r
2040 \r
2041                 /* Assume not bizarre */\r
2042                 td->bizarre = TRUE;\r
2043 \r
2044                 /* Reset the tile info */\r
2045                 td->tile_wid = td->font_wid;\r
2046                 td->tile_hgt = td->font_hgt;\r
2047 \r
2048                 /* Analyze the font */\r
2049                 term_getsize(td);\r
2050 \r
2051                 /* Resize the window */\r
2052                 term_window_resize(td);\r
2053         }\r
2054 \r
2055 #else\r
2056         OPENFILENAME ofn;\r
2057 \r
2058         char tmp[1024] = "";\r
2059 \r
2060         /* Extract a default if possible */\r
2061         if (td->font_file) strcpy(tmp, td->font_file);\r
2062 \r
2063         /* Ask for a choice */\r
2064         memset(&ofn, 0, sizeof(ofn));\r
2065         ofn.lStructSize = sizeof(ofn);\r
2066         ofn.hwndOwner = data[0].w;\r
2067         ofn.lpstrFilter = "Angband Font Files (*.fon)\0*.fon\0";\r
2068         ofn.nFilterIndex = 1;\r
2069         ofn.lpstrFile = tmp;\r
2070         ofn.nMaxFile = 128;\r
2071         ofn.lpstrInitialDir = ANGBAND_DIR_XTRA_FONT;\r
2072         ofn.Flags = OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR;\r
2073         ofn.lpstrDefExt = "fon";\r
2074 \r
2075         /* Force choice if legal */\r
2076         if (GetOpenFileName(&ofn))\r
2077         {\r
2078                 /* Force the font */\r
2079                 if (term_force_font(td, tmp))\r
2080                 {\r
2081                         /* Access the standard font file */\r
2082                         path_build(tmp, sizeof(tmp), ANGBAND_DIR_XTRA_FONT, "8X13.FON");\r
2083 \r
2084                         /* Force the use of that font */\r
2085                         (void)term_force_font(td, tmp);\r
2086                 }\r
2087 \r
2088                 /* Assume not bizarre */\r
2089                 td->bizarre = FALSE;\r
2090 \r
2091                 /* Reset the tile info */\r
2092                 td->tile_wid = td->font_wid;\r
2093                 td->tile_hgt = td->font_hgt;\r
2094 \r
2095                 /* Analyze the font */\r
2096                 term_getsize(td);\r
2097 \r
2098                 /* Resize the window */\r
2099                 term_window_resize(td);\r
2100         }\r
2101 #endif\r
2102 \r
2103 }\r
2104 \r
2105 /*\r
2106  * Allow the user to lock this window.\r
2107  */\r
2108 static void term_window_pos(term_data *td, HWND hWnd)\r
2109 {\r
2110         SetWindowPos(td->w, hWnd, 0, 0, 0, 0,\r
2111                         SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);\r
2112 }\r
2113 \r
2114 static void windows_map(void);\r
2115 \r
2116 /*\r
2117  * Hack -- redraw a term_data\r
2118  */\r
2119 static void term_data_redraw(term_data *td)\r
2120 {\r
2121         if (td->map_active)\r
2122         {\r
2123                 /* Redraw the map */\r
2124                 windows_map();\r
2125         }\r
2126         else\r
2127         {\r
2128                 /* Activate the term */\r
2129                 Term_activate(&td->t);\r
2130 \r
2131                 /* Redraw the contents */\r
2132                 Term_redraw();\r
2133 \r
2134                 /* Restore the term */\r
2135                 Term_activate(term_screen);\r
2136         }\r
2137 }\r
2138 \r
2139 \r
2140 void Term_inversed_area(HWND hWnd, int x, int y, int w, int h)\r
2141 {\r
2142         HDC hdc;\r
2143         HPEN oldPen;\r
2144         HBRUSH myBrush, oldBrush;\r
2145 \r
2146         term_data *td = (term_data *)GetWindowLong(hWnd, 0);\r
2147         int tx = td->size_ow1 + x * td->tile_wid;\r
2148         int ty = td->size_oh1 + y * td->tile_hgt;\r
2149         int tw = w * td->tile_wid - 1;\r
2150         int th = h * td->tile_hgt - 1;\r
2151 \r
2152         hdc = GetDC(hWnd);\r
2153         myBrush = CreateSolidBrush(RGB(255, 255, 255));\r
2154         oldBrush = SelectObject(hdc, myBrush);\r
2155         oldPen = SelectObject(hdc, GetStockObject(NULL_PEN) );\r
2156 \r
2157         PatBlt(hdc, tx, ty, tw, th, PATINVERT);\r
2158 \r
2159         SelectObject(hdc, oldBrush);\r
2160         SelectObject(hdc, oldPen);\r
2161 }\r
2162 \r
2163 \r
2164 \r
2165 /*** Function hooks needed by "Term" ***/\r
2166 \r
2167 \r
2168 #if 0\r
2169 \r
2170 /*\r
2171  * Initialize a new Term\r
2172  */\r
2173 static void Term_init_win(term *t)\r
2174 {\r
2175         /* XXX Unused */\r
2176 }\r
2177 \r
2178 \r
2179 /*\r
2180  * Nuke an old Term\r
2181  */\r
2182 static void Term_nuke_win(term *t)\r
2183 {\r
2184         /* XXX Unused */\r
2185 }\r
2186 \r
2187 #endif\r
2188 \r
2189 \r
2190 /*\r
2191  * Interact with the User\r
2192  */\r
2193 static errr Term_user_win(int n)\r
2194 {\r
2195         /* Unused */\r
2196         (void)n;\r
2197 \r
2198         /* Success */\r
2199         return (0);\r
2200 }\r
2201 \r
2202 \r
2203 /*\r
2204  * React to global changes\r
2205  */\r
2206 static errr Term_xtra_win_react(void)\r
2207 {\r
2208         int i;\r
2209 \r
2210 \r
2211         /* Simple color */\r
2212         if (colors16)\r
2213         {\r
2214                 /* Save the default colors */\r
2215                 for (i = 0; i < 256; i++)\r
2216                 {\r
2217                         /* Simply accept the desired colors */\r
2218                         win_pal[i] = angband_color_table[i][0];\r
2219                 }\r
2220         }\r
2221 \r
2222         /* Complex color */\r
2223         else\r
2224         {\r
2225                 COLORREF code;\r
2226 \r
2227                 byte rv, gv, bv;\r
2228 \r
2229                 bool change = FALSE;\r
2230 \r
2231                 /* Save the default colors */\r
2232                 for (i = 0; i < 256; i++)\r
2233                 {\r
2234                         /* Extract desired values */\r
2235                         rv = angband_color_table[i][1];\r
2236                         gv = angband_color_table[i][2];\r
2237                         bv = angband_color_table[i][3];\r
2238 \r
2239                         /* Extract a full color code */\r
2240                         code = PALETTERGB(rv, gv, bv);\r
2241 \r
2242                         /* Activate changes */\r
2243                         if (win_clr[i] != code)\r
2244                         {\r
2245                                 /* Note the change */\r
2246                                 change = TRUE;\r
2247 \r
2248                                 /* Apply the desired color */\r
2249                                 win_clr[i] = code;\r
2250                         }\r
2251                 }\r
2252 \r
2253                 /* Activate the palette if needed */\r
2254                 if (change) (void)new_palette();\r
2255         }\r
2256 \r
2257 \r
2258 #ifdef USE_SOUND\r
2259 \r
2260         /* Handle "arg_sound" */\r
2261         if (use_sound != arg_sound)\r
2262         {\r
2263                 /* Initialize (if needed) */\r
2264                 if (arg_sound && !init_sound())\r
2265                 {\r
2266                         /* Warning */\r
2267                         plog(_("サウンドを初期化できません!", "Cannot initialize sound!"));\r
2268 \r
2269                         /* Cannot enable */\r
2270                         arg_sound = FALSE;\r
2271                 }\r
2272 \r
2273                 /* Change setting */\r
2274                 use_sound = arg_sound;\r
2275         }\r
2276 \r
2277 #endif\r
2278 \r
2279 #ifdef USE_MUSIC\r
2280 \r
2281         /* Handle "arg_sound" */\r
2282         if (use_music != arg_music)\r
2283         {\r
2284                 /* Initialize (if needed) */\r
2285                 if (arg_music && !init_music())\r
2286                 {\r
2287                         /* Warning */\r
2288                         plog(_("BGMを初期化できません!", "Cannot initialize BGM!"));\r
2289                         /* Cannot enable */\r
2290                         arg_music = FALSE;\r
2291                 }\r
2292 \r
2293                 /* Change setting */\r
2294                 use_music = arg_music;\r
2295 \r
2296                 if(!arg_music) stop_music();\r
2297                 else select_floor_music();\r
2298 \r
2299         }\r
2300 \r
2301 #endif\r
2302 \r
2303 \r
2304 #ifdef USE_GRAPHICS\r
2305 \r
2306         /* Handle "arg_graphics" */\r
2307         if (use_graphics != arg_graphics)\r
2308         {\r
2309                 /* Initialize (if needed) */\r
2310                 if (arg_graphics && !init_graphics())\r
2311                 {\r
2312                         /* Warning */\r
2313                         plog(_("グラフィックスを初期化できません!", "Cannot initialize graphics!"));\r
2314 \r
2315                         /* Cannot enable */\r
2316                         arg_graphics = GRAPHICS_NONE;\r
2317                 }\r
2318 \r
2319                 /* Change setting */\r
2320                 use_graphics = arg_graphics;\r
2321 \r
2322                 /* Reset visuals */\r
2323 #ifdef ANGBAND_2_8_1\r
2324                 reset_visuals();\r
2325 #else /* ANGBAND_2_8_1 */\r
2326                 reset_visuals(TRUE);\r
2327 #endif /* ANGBAND_2_8_1 */\r
2328         }\r
2329 \r
2330 #endif /* USE_GRAPHICS */\r
2331 \r
2332 \r
2333         /* Clean up windows */\r
2334         for (i = 0; i < MAX_TERM_DATA; i++)\r
2335         {\r
2336                 term *old = Term;\r
2337 \r
2338                 term_data *td = &data[i];\r
2339 \r
2340                 /* Update resized windows */\r
2341                 if ((td->cols != td->t.wid) || (td->rows != td->t.hgt))\r
2342                 {\r
2343                         /* Activate */\r
2344                         Term_activate(&td->t);\r
2345 \r
2346                         /* Hack -- Resize the term */\r
2347                         Term_resize(td->cols, td->rows);\r
2348 \r
2349                         /* Redraw the contents */\r
2350                         Term_redraw();\r
2351 \r
2352                         /* Restore */\r
2353                         Term_activate(old);\r
2354                 }\r
2355         }\r
2356 \r
2357 \r
2358         /* Success */\r
2359         return (0);\r
2360 }\r
2361 \r
2362 \r
2363 /*\r
2364  * Process at least one event\r
2365  */\r
2366 static errr Term_xtra_win_event(int v)\r
2367 {\r
2368         MSG msg;\r
2369 \r
2370         /* Wait for an event */\r
2371         if (v)\r
2372         {\r
2373                 /* Block */\r
2374                 if (GetMessage(&msg, NULL, 0, 0))\r
2375                 {\r
2376                         TranslateMessage(&msg);\r
2377                         DispatchMessage(&msg);\r
2378                 }\r
2379         }\r
2380 \r
2381         /* Check for an event */\r
2382         else\r
2383         {\r
2384                 /* Check */\r
2385                 if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))\r
2386                 {\r
2387                         TranslateMessage(&msg);\r
2388                         DispatchMessage(&msg);\r
2389                 }\r
2390         }\r
2391 \r
2392         /* Success */\r
2393         return 0;\r
2394 }\r
2395 \r
2396 \r
2397 /*\r
2398  * Process all pending events\r
2399  */\r
2400 static errr Term_xtra_win_flush(void)\r
2401 {\r
2402         MSG msg;\r
2403 \r
2404         /* Process all pending events */\r
2405         while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))\r
2406         {\r
2407                 TranslateMessage(&msg);\r
2408                 DispatchMessage(&msg);\r
2409         }\r
2410 \r
2411         /* Success */\r
2412         return (0);\r
2413 }\r
2414 \r
2415 \r
2416 /*\r
2417  * Hack -- clear the screen\r
2418  *\r
2419  * Make this more efficient XXX XXX XXX\r
2420  */\r
2421 static errr Term_xtra_win_clear(void)\r
2422 {\r
2423         term_data *td = (term_data*)(Term->data);\r
2424 \r
2425         HDC hdc;\r
2426         RECT rc;\r
2427 \r
2428         /* Rectangle to erase */\r
2429         rc.left = td->size_ow1;\r
2430         rc.right = rc.left + td->cols * td->tile_wid;\r
2431         rc.top = td->size_oh1;\r
2432         rc.bottom = rc.top + td->rows * td->tile_hgt;\r
2433 \r
2434         /* Erase it */\r
2435         hdc = GetDC(td->w);\r
2436         SetBkColor(hdc, RGB(0, 0, 0));\r
2437         SelectObject(hdc, td->font_id);\r
2438         ExtTextOut(hdc, 0, 0, ETO_OPAQUE, &rc, NULL, 0, NULL);\r
2439 \r
2440         /* bg */\r
2441         if (use_bg)\r
2442         {\r
2443                 rc.left = 0; rc.top = 0;\r
2444                 DrawBG(hdc, &rc);\r
2445         }\r
2446         ReleaseDC(td->w, hdc);\r
2447 \r
2448         /* Success */\r
2449         return 0;\r
2450 }\r
2451 \r
2452 \r
2453 /*\r
2454  * Hack -- make a noise\r
2455  */\r
2456 static errr Term_xtra_win_noise(void)\r
2457 {\r
2458         MessageBeep(MB_ICONASTERISK);\r
2459         return (0);\r
2460 }\r
2461 \r
2462 \r
2463 /*\r
2464  * Hack -- make a sound\r
2465  */\r
2466 static errr Term_xtra_win_sound(int v)\r
2467 {\r
2468 #ifdef USE_SOUND\r
2469         int i;\r
2470         char buf[1024];\r
2471 #endif /* USE_SOUND */\r
2472 \r
2473         /* Sound disabled */\r
2474         if (!use_sound) return (1);\r
2475 \r
2476         /* Illegal sound */\r
2477         if ((v < 0) || (v >= SOUND_MAX)) return (1);\r
2478 \r
2479 #ifdef USE_SOUND\r
2480 \r
2481         /* Count the samples */\r
2482         for (i = 0; i < SAMPLE_MAX; i++)\r
2483         {\r
2484                 if (!sound_file[v][i])\r
2485                         break;\r
2486         }\r
2487 \r
2488         /* No sample */\r
2489         if (i == 0) return (1);\r
2490 \r
2491         /* Build the path */\r
2492         path_build(buf, 1024, ANGBAND_DIR_XTRA_SOUND, sound_file[v][Rand_external(i)]);\r
2493 \r
2494 #ifdef WIN32\r
2495 \r
2496         /* Play the sound, catch errors */\r
2497         return (PlaySound(buf, 0, SND_FILENAME | SND_ASYNC));\r
2498 \r
2499 #else /* WIN32 */\r
2500 \r
2501         /* Play the sound, catch errors */\r
2502         return (sndPlaySound(buf, SND_ASYNC));\r
2503 \r
2504 #endif /* WIN32 */\r
2505 \r
2506 #else /* USE_SOUND */\r
2507 \r
2508         /* Oops */\r
2509         return (1);\r
2510 \r
2511 #endif /* USE_SOUND */\r
2512 }\r
2513 \r
2514 /*\r
2515  * Hack -- play a music\r
2516  */\r
2517 static errr Term_xtra_win_music(int n, int v)\r
2518 {\r
2519 #ifdef USE_MUSIC\r
2520         int i = 0;\r
2521         char buf[1024];\r
2522 #endif /* USE_MUSIC */\r
2523 \r
2524         /* Sound disabled */\r
2525 \r
2526         if(!use_music) return (1);\r
2527 \r
2528         /* Illegal sound */\r
2529         if(n == TERM_XTRA_MUSIC_BASIC && ((v < 0) || (v >= MUSIC_BASIC_MAX))) return (1);\r
2530         else if(v < 0 || v >= 1000) return(1); /*!< TODO */\r
2531 \r
2532 #ifdef USE_MUSIC\r
2533 \r
2534         switch(n)\r
2535         {\r
2536         case TERM_XTRA_MUSIC_BASIC:\r
2537                 for (i = 0; i < SAMPLE_MAX; i++) if(!music_file[v][i]) break;\r
2538                 break;\r
2539         case TERM_XTRA_MUSIC_DUNGEON:\r
2540                 for (i = 0; i < SAMPLE_MAX; i++) if(!dungeon_music_file[v][i]) break;\r
2541                 break;\r
2542         case TERM_XTRA_MUSIC_QUEST:\r
2543                 for (i = 0; i < SAMPLE_MAX; i++) if(!quest_music_file[v][i]) break;\r
2544                 break;\r
2545         case TERM_XTRA_MUSIC_TOWN:\r
2546                 for (i = 0; i < SAMPLE_MAX; i++) if(!town_music_file[v][i]) break;\r
2547                 break;\r
2548         }\r
2549 \r
2550         /* No sample */\r
2551         if (i == 0)\r
2552         {\r
2553                 //mciSendCommand(mop.wDeviceID, MCI_STOP, 0, 0);\r
2554                 //mciSendCommand(mop.wDeviceID, MCI_CLOSE, 0, 0);\r
2555                 return (1);\r
2556         }\r
2557 \r
2558         switch(n)\r
2559         {\r
2560         case TERM_XTRA_MUSIC_BASIC:\r
2561                 for (i = 0; i < SAMPLE_MAX; i++) if(!music_file[v][i]) break;\r
2562                 break;\r
2563         case TERM_XTRA_MUSIC_DUNGEON:\r
2564                 for (i = 0; i < SAMPLE_MAX; i++) if(!dungeon_music_file[v][i]) break;\r
2565                 break;\r
2566         case TERM_XTRA_MUSIC_QUEST:\r
2567                 for (i = 0; i < SAMPLE_MAX; i++) if(!quest_music_file[v][i]) break;\r
2568                 break;\r
2569         case TERM_XTRA_MUSIC_TOWN:\r
2570                 for (i = 0; i < SAMPLE_MAX; i++) if(!town_music_file[v][i]) break;\r
2571                 break;\r
2572         }\r
2573 \r
2574         /* No sample */\r
2575         if (i == 0)\r
2576         {\r
2577                 mciSendCommand(mop.wDeviceID, MCI_STOP, 0, 0);\r
2578                 mciSendCommand(mop.wDeviceID, MCI_CLOSE, 0, 0);\r
2579                 return (1);\r
2580         }\r
2581 \r
2582         switch(n)\r
2583         {\r
2584         case TERM_XTRA_MUSIC_BASIC:\r
2585                 path_build(buf, 1024, ANGBAND_DIR_XTRA_MUSIC, music_file[v][Rand_external(i)]);\r
2586                 break;\r
2587         case TERM_XTRA_MUSIC_DUNGEON:\r
2588                 path_build(buf, 1024, ANGBAND_DIR_XTRA_MUSIC, dungeon_music_file[v][Rand_external(i)]);\r
2589                 break;\r
2590         case TERM_XTRA_MUSIC_QUEST:\r
2591                 path_build(buf, 1024, ANGBAND_DIR_XTRA_MUSIC, quest_music_file[v][Rand_external(i)]);\r
2592                 break;\r
2593         case TERM_XTRA_MUSIC_TOWN:\r
2594                 path_build(buf, 1024, ANGBAND_DIR_XTRA_MUSIC, town_music_file[v][Rand_external(i)]);\r
2595                 break;\r
2596         }\r
2597 \r
2598         if(current_music_type == n && current_music_id == v)\r
2599         {\r
2600                 return (0);\r
2601         }\r
2602         current_music_type = n;\r
2603         current_music_id = v;\r
2604 \r
2605 #ifdef WIN32\r
2606 \r
2607         mop.lpstrDeviceType = mci_device_type;  \r
2608         mop.lpstrElementName = buf;\r
2609         mciSendCommand(mop.wDeviceID, MCI_STOP, 0, 0);\r
2610         mciSendCommand(mop.wDeviceID, MCI_CLOSE, 0, 0);\r
2611         mciSendCommand(mop.wDeviceID, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_ELEMENT, (DWORD)&mop);\r
2612         mciSendCommand(mop.wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, 0);\r
2613         mciSendCommand(mop.wDeviceID, MCI_PLAY, MCI_NOTIFY, (DWORD)&mop);\r
2614         return (0);\r
2615 \r
2616 #endif /* WIN32 */\r
2617 \r
2618 #else /* USE_MUSIC */\r
2619 \r
2620         return (1);\r
2621 \r
2622 #endif /* USE_MUSIC */\r
2623 \r
2624 }\r
2625 \r
2626 \r
2627 /*\r
2628  * Delay for "x" milliseconds\r
2629  */\r
2630 static int Term_xtra_win_delay(int v)\r
2631 {\r
2632 \r
2633 #ifdef WIN32\r
2634 \r
2635         /* Sleep */\r
2636         Sleep(v);\r
2637 \r
2638 #else /* WIN32 */\r
2639 \r
2640         DWORD t;\r
2641         MSG msg;\r
2642 \r
2643         /* Final count */\r
2644         t = GetTickCount() + v;\r
2645 \r
2646         /* Wait for it */\r
2647         while (GetTickCount() < t)\r
2648         {\r
2649                 /* Handle messages */\r
2650                 if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))\r
2651                 {\r
2652                         TranslateMessage(&msg);\r
2653                         DispatchMessage(&msg);\r
2654                 }\r
2655         }\r
2656 \r
2657 #endif /* WIN32 */\r
2658 \r
2659         /* Success */\r
2660         return (0);\r
2661 }\r
2662 \r
2663 \r
2664 /*\r
2665  * Do a "special thing"\r
2666  */\r
2667 static errr Term_xtra_win(int n, int v)\r
2668 {\r
2669         /* Handle a subset of the legal requests */\r
2670         switch (n)\r
2671         {\r
2672                 /* Make a bell sound */\r
2673                 case TERM_XTRA_NOISE:\r
2674                 {\r
2675                         return (Term_xtra_win_noise());\r
2676                 }\r
2677 \r
2678                 /* Play a music */\r
2679                 case TERM_XTRA_MUSIC_BASIC:\r
2680                 case TERM_XTRA_MUSIC_DUNGEON:\r
2681                 case TERM_XTRA_MUSIC_QUEST:\r
2682                 case TERM_XTRA_MUSIC_TOWN:\r
2683                 {\r
2684                         return (Term_xtra_win_music(n, v));\r
2685                 }\r
2686 \r
2687                 /* Make a special sound */\r
2688                 case TERM_XTRA_SOUND:\r
2689                 {\r
2690                         return (Term_xtra_win_sound(v));\r
2691                 }\r
2692 \r
2693                 /* Process random events */\r
2694                 case TERM_XTRA_BORED:\r
2695                 {\r
2696                         return (Term_xtra_win_event(0));\r
2697                 }\r
2698 \r
2699                 /* Process an event */\r
2700                 case TERM_XTRA_EVENT:\r
2701                 {\r
2702                         return (Term_xtra_win_event(v));\r
2703                 }\r
2704 \r
2705                 /* Flush all events */\r
2706                 case TERM_XTRA_FLUSH:\r
2707                 {\r
2708                         return (Term_xtra_win_flush());\r
2709                 }\r
2710 \r
2711                 /* Clear the screen */\r
2712                 case TERM_XTRA_CLEAR:\r
2713                 {\r
2714                         return (Term_xtra_win_clear());\r
2715                 }\r
2716 \r
2717                 /* React to global changes */\r
2718                 case TERM_XTRA_REACT:\r
2719                 {\r
2720                         return (Term_xtra_win_react());\r
2721                 }\r
2722 \r
2723                 /* Delay for some milliseconds */\r
2724                 case TERM_XTRA_DELAY:\r
2725                 {\r
2726                         return (Term_xtra_win_delay(v));\r
2727                 }\r
2728         }\r
2729 \r
2730         /* Oops */\r
2731         return 1;\r
2732 }\r
2733 \r
2734 \r
2735 \r
2736 /*\r
2737  * Low level graphics (Assumes valid input).\r
2738  *\r
2739  * Draw a "cursor" at (x,y), using a "yellow box".\r
2740  */\r
2741 static errr Term_curs_win(int x, int y)\r
2742 {\r
2743         term_data *td = (term_data*)(Term->data);\r
2744 \r
2745         RECT rc;\r
2746         HDC hdc;\r
2747 \r
2748         int tile_wid, tile_hgt;\r
2749 \r
2750         if (td->map_active)\r
2751         {\r
2752                 tile_wid = td->map_tile_wid;\r
2753                 tile_hgt = td->map_tile_hgt;\r
2754         }\r
2755         else\r
2756         {\r
2757                 tile_wid = td->tile_wid;\r
2758                 tile_hgt = td->tile_hgt;\r
2759         }\r
2760 \r
2761         /* Frame the grid */\r
2762         rc.left = x * tile_wid + td->size_ow1;\r
2763         rc.right = rc.left + tile_wid;\r
2764         rc.top = y * tile_hgt + td->size_oh1;\r
2765         rc.bottom = rc.top + tile_hgt;\r
2766 \r
2767         /* Cursor is done as a yellow "box" */\r
2768         hdc = GetDC(td->w);\r
2769         FrameRect(hdc, &rc, hbrYellow);\r
2770         ReleaseDC(td->w, hdc);\r
2771 \r
2772         /* Success */\r
2773         return 0;\r
2774 }\r
2775 \r
2776 \r
2777 /*\r
2778  * Low level graphics (Assumes valid input).\r
2779  *\r
2780  * Draw a "big cursor" at (x,y), using a "yellow box".\r
2781  */\r
2782 static errr Term_bigcurs_win(int x, int y)\r
2783 {\r
2784         term_data *td = (term_data*)(Term->data);\r
2785 \r
2786         RECT rc;\r
2787         HDC hdc;\r
2788 \r
2789         int tile_wid, tile_hgt;\r
2790 \r
2791         if (td->map_active)\r
2792         {\r
2793                 /* Normal cursor in map window */\r
2794                 Term_curs_win(x, y);\r
2795                 return 0;\r
2796         }\r
2797         else\r
2798         {\r
2799                 tile_wid = td->tile_wid;\r
2800                 tile_hgt = td->tile_hgt;\r
2801         }\r
2802 \r
2803         /* Frame the grid */\r
2804         rc.left = x * tile_wid + td->size_ow1;\r
2805         rc.right = rc.left + 2 * tile_wid;\r
2806         rc.top = y * tile_hgt + td->size_oh1;\r
2807         rc.bottom = rc.top + tile_hgt;\r
2808 \r
2809         /* Cursor is done as a yellow "box" */\r
2810         hdc = GetDC(td->w);\r
2811         FrameRect(hdc, &rc, hbrYellow);\r
2812         ReleaseDC(td->w, hdc);\r
2813 \r
2814         /* Success */\r
2815         return 0;\r
2816 }\r
2817 \r
2818 \r
2819 /*\r
2820  * Low level graphics (Assumes valid input).\r
2821  *\r
2822  * Erase a "block" of "n" characters starting at (x,y).\r
2823  */\r
2824 static errr Term_wipe_win(int x, int y, int n)\r
2825 {\r
2826         term_data *td = (term_data*)(Term->data);\r
2827 \r
2828         HDC hdc;\r
2829         RECT rc;\r
2830 \r
2831         /* Rectangle to erase in client coords */\r
2832         rc.left = x * td->tile_wid + td->size_ow1;\r
2833         rc.right = rc.left + n * td->tile_wid;\r
2834         rc.top = y * td->tile_hgt + td->size_oh1;\r
2835         rc.bottom = rc.top + td->tile_hgt;\r
2836 \r
2837         hdc = GetDC(td->w);\r
2838         SetBkColor(hdc, RGB(0, 0, 0));\r
2839         SelectObject(hdc, td->font_id);\r
2840         /* bg */\r
2841         if (use_bg)\r
2842                 DrawBG(hdc, &rc);\r
2843         else\r
2844                 ExtTextOut(hdc, 0, 0, ETO_OPAQUE, &rc, NULL, 0, NULL);\r
2845         ReleaseDC(td->w, hdc);\r
2846 \r
2847         /* Success */\r
2848         return 0;\r
2849 }\r
2850 \r
2851 \r
2852 /*\r
2853  * Low level graphics.  Assumes valid input.\r
2854  *\r
2855  * Draw several ("n") chars, with an attr, at a given location.\r
2856  *\r
2857  * All "graphic" data is handled by "Term_pict_win()", below.\r
2858  *\r
2859  * One would think there is a more efficient method for telling a window\r
2860  * what color it should be using to draw with, but perhaps simply changing\r
2861  * it every time is not too inefficient.  XXX XXX XXX\r
2862  */\r
2863 static errr Term_text_win(int x, int y, int n, byte a, const char *s)\r
2864 {\r
2865         term_data *td = (term_data*)(Term->data);\r
2866         RECT rc;\r
2867         HDC hdc;\r
2868 \r
2869 #if 1 /* #ifdef JP */\r
2870         static HBITMAP  WALL;\r
2871         static HBRUSH   myBrush, oldBrush;\r
2872         static HPEN     oldPen;\r
2873         static bool init_done = FALSE;\r
2874 \r
2875         if (!init_done){\r
2876                 WALL = LoadBitmap(hInstance, AppName);\r
2877                 myBrush = CreatePatternBrush(WALL);\r
2878                 init_done = TRUE;\r
2879         }\r
2880 #endif\r
2881 \r
2882         /* Total rectangle */\r
2883         rc.left = x * td->tile_wid + td->size_ow1;\r
2884         rc.right = rc.left + n * td->tile_wid;\r
2885         rc.top = y * td->tile_hgt + td->size_oh1;\r
2886         rc.bottom = rc.top + td->tile_hgt;\r
2887 \r
2888         /* Acquire DC */\r
2889         hdc = GetDC(td->w);\r
2890 \r
2891         /* Background color */\r
2892         SetBkColor(hdc, RGB(0, 0, 0));\r
2893 \r
2894         /* Foreground color */\r
2895         if (colors16)\r
2896         {\r
2897                 SetTextColor(hdc, PALETTEINDEX(win_pal[a]));\r
2898         }\r
2899         else if (paletted)\r
2900         {\r
2901                 SetTextColor(hdc, win_clr[a&0x0F]);\r
2902         }\r
2903         else\r
2904         {\r
2905                 SetTextColor(hdc, win_clr[a]);\r
2906         }\r
2907 \r
2908         /* Use the font */\r
2909         SelectObject(hdc, td->font_id);\r
2910         \r
2911         /* bg */\r
2912         if (use_bg) SetBkMode(hdc, TRANSPARENT);\r
2913 \r
2914         /* Bizarre size */\r
2915         if (td->bizarre ||\r
2916             (td->tile_hgt != td->font_hgt) ||\r
2917             (td->tile_wid != td->font_wid))\r
2918         {\r
2919                 int i;\r
2920 \r
2921                 /* Erase complete rectangle */\r
2922                 ExtTextOut(hdc, 0, 0, ETO_OPAQUE, &rc, NULL, 0, NULL);\r
2923                 \r
2924                 /* bg */\r
2925                 if (use_bg) DrawBG(hdc, &rc);\r
2926 \r
2927                 /* New rectangle */\r
2928                 rc.left += ((td->tile_wid - td->font_wid) / 2);\r
2929                 rc.right = rc.left + td->font_wid;\r
2930                 rc.top += ((td->tile_hgt - td->font_hgt) / 2);\r
2931                 rc.bottom = rc.top + td->font_hgt;\r
2932 \r
2933                 /* Dump each character */\r
2934                 for (i = 0; i < n; i++)\r
2935                 {\r
2936 #ifdef JP\r
2937                         if (use_bigtile && *(s+i)=="■"[0] && *(s+i+1)=="■"[1])\r
2938                         {\r
2939                                 rc.right += td->font_wid;\r
2940 \r
2941                                 oldBrush = SelectObject(hdc, myBrush);\r
2942                                 oldPen = SelectObject(hdc, GetStockObject(NULL_PEN) );\r
2943 \r
2944                                 /* Dump the wall */\r
2945                                 Rectangle(hdc, rc.left, rc.top, rc.right+1, rc.bottom+1);\r
2946 \r
2947                                 SelectObject(hdc, oldBrush);\r
2948                                 SelectObject(hdc, oldPen);\r
2949                                 rc.right -= td->font_wid;\r
2950 \r
2951                                 /* Advance */\r
2952                                 i++;\r
2953                                 rc.left += 2 * td->tile_wid;\r
2954                                 rc.right += 2 * td->tile_wid;\r
2955                         }\r
2956                         else if ( iskanji(*(s+i)) )  /*  2バイト文字  */\r
2957                         {\r
2958                                 rc.right += td->font_wid;\r
2959                                 /* Dump the text */\r
2960                                 ExtTextOut(hdc, rc.left, rc.top, ETO_CLIPPED, &rc,\r
2961                                        s+i, 2, NULL);\r
2962                                 rc.right -= td->font_wid;\r
2963 \r
2964                                 /* Advance */\r
2965                                 i++;\r
2966                                 rc.left += 2 * td->tile_wid;\r
2967                                 rc.right += 2 * td->tile_wid;\r
2968                         } else if (*(s+i)==127){\r
2969                                 oldBrush = SelectObject(hdc, myBrush);\r
2970                                 oldPen = SelectObject(hdc, GetStockObject(NULL_PEN) );\r
2971 \r
2972                                 /* Dump the wall */\r
2973                                 Rectangle(hdc, rc.left, rc.top, rc.right+1, rc.bottom+1);\r
2974 \r
2975                                 SelectObject(hdc, oldBrush);\r
2976                                 SelectObject(hdc, oldPen);\r
2977 \r
2978                                 /* Advance */\r
2979                                 rc.left += td->tile_wid;\r
2980                                 rc.right += td->tile_wid;\r
2981                         } else {\r
2982                                 /* Dump the text */\r
2983                                 ExtTextOut(hdc, rc.left, rc.top, ETO_CLIPPED, &rc, s+i, 1, NULL);\r
2984 \r
2985                                 /* Advance */\r
2986                                 rc.left += td->tile_wid;\r
2987                                 rc.right += td->tile_wid;\r
2988                         }\r
2989 #else\r
2990 #if 1\r
2991                         if (*(s+i)==127){\r
2992                                 oldBrush = SelectObject(hdc, myBrush);\r
2993                                 oldPen = SelectObject(hdc, GetStockObject(NULL_PEN) );\r
2994 \r
2995                                 /* Dump the wall */\r
2996                                 Rectangle(hdc, rc.left, rc.top, rc.right+1, rc.bottom+1);\r
2997 \r
2998                                 SelectObject(hdc, oldBrush);\r
2999                                 SelectObject(hdc, oldPen);\r
3000 \r
3001                                 /* Advance */\r
3002                                 rc.left += td->tile_wid;\r
3003                                 rc.right += td->tile_wid;\r
3004                         } else {\r
3005                                 /* Dump the text */\r
3006                                 ExtTextOut(hdc, rc.left, rc.top, ETO_CLIPPED, &rc,\r
3007                                        s+i, 1, NULL);\r
3008 \r
3009                                 /* Advance */\r
3010                                 rc.left += td->tile_wid;\r
3011                                 rc.right += td->tile_wid;\r
3012                         }\r
3013 #else\r
3014                         /* Dump the text */\r
3015                         ExtTextOut(hdc, rc.left, rc.top, 0, &rc,\r
3016                                    s+i, 1, NULL);\r
3017 \r
3018                         /* Advance */\r
3019                         rc.left += td->tile_wid;\r
3020                         rc.right += td->tile_wid;\r
3021 #endif\r
3022 #endif\r
3023 \r
3024                 }\r
3025         }\r
3026 \r
3027         /* Normal size */\r
3028         else\r
3029         {\r
3030                 /* Dump the text */\r
3031                 ExtTextOut(hdc, rc.left, rc.top, ETO_OPAQUE | ETO_CLIPPED, &rc,\r
3032                            s, n, NULL);\r
3033         }\r
3034 \r
3035         /* Release DC */\r
3036         ReleaseDC(td->w, hdc);\r
3037 \r
3038         /* Success */\r
3039         return 0;\r
3040 }\r
3041 \r
3042 \r
3043 /*\r
3044  * Low level graphics.  Assumes valid input.\r
3045  *\r
3046  * Draw an array of "special" attr/char pairs at the given location.\r
3047  *\r
3048  * We use the "Term_pict_win()" function for "graphic" data, which are\r
3049  * encoded by setting the "high-bits" of both the "attr" and the "char"\r
3050  * data.  We use the "attr" to represent the "row" of the main bitmap,\r
3051  * and the "char" to represent the "col" of the main bitmap.  The use\r
3052  * of this function is induced by the "higher_pict" flag.\r
3053  *\r
3054  * If "graphics" is not available, we simply "wipe" the given grids.\r
3055  */\r
3056 static errr Term_pict_win(int x, int y, int n, const byte *ap, const char *cp, const byte *tap, const char *tcp)\r
3057 {\r
3058         term_data *td = (term_data*)(Term->data);\r
3059 \r
3060 #ifdef USE_GRAPHICS\r
3061 \r
3062         int i;\r
3063         int x1, y1, w1, h1, tw1, th1;\r
3064         int x2, y2, w2, h2, tw2 = 0;\r
3065         int x3, y3;\r
3066 \r
3067         HDC hdcMask = NULL;\r
3068 \r
3069         HDC hdc;\r
3070         HDC hdcSrc;\r
3071         HBITMAP hbmSrcOld;\r
3072 \r
3073         /* Paranoia */\r
3074         if (!use_graphics)\r
3075         {\r
3076                 /* Erase the grids */\r
3077                 return (Term_wipe_win(x, y, n));\r
3078         }\r
3079 \r
3080         /* Size of bitmap cell */\r
3081         w1 = infGraph.CellWidth;\r
3082         h1 = infGraph.CellHeight;\r
3083         tw1 = infGraph.TileWidth;\r
3084         th1 = infGraph.TileHeight;\r
3085 \r
3086         /* Size of window cell */\r
3087         if (td->map_active)\r
3088         {\r
3089                 w2 = td->map_tile_wid;\r
3090                 h2 = td->map_tile_hgt;\r
3091         }\r
3092         else\r
3093         {\r
3094                 w2 = td->tile_wid;\r
3095                 h2 = td->tile_hgt;\r
3096                 tw2 = w2;\r
3097 \r
3098                 /* big tile mode */\r
3099                 if (use_bigtile) tw2 *= 2;\r
3100         }\r
3101 \r
3102         /* Location of window cell */\r
3103         x2 = x * w2 + td->size_ow1 + infGraph.OffsetX;\r
3104         y2 = y * h2 + td->size_oh1 + infGraph.OffsetY;\r
3105 \r
3106         /* Info */\r
3107         hdc = GetDC(td->w);\r
3108 \r
3109         /* More info */\r
3110         hdcSrc = CreateCompatibleDC(hdc);\r
3111         hbmSrcOld = SelectObject(hdcSrc, infGraph.hBitmap);\r
3112 \r
3113         if (arg_graphics == GRAPHICS_ADAM_BOLT || arg_graphics == GRAPHICS_HENGBAND)\r
3114         {\r
3115                 hdcMask = CreateCompatibleDC(hdc);\r
3116                 SelectObject(hdcMask, infMask.hBitmap);\r
3117         }\r
3118 \r
3119         /* Draw attr/char pairs */\r
3120         for (i = 0; i < n; i++, x2 += w2)\r
3121         {\r
3122                 byte a = ap[i];\r
3123                 char c = cp[i];\r
3124 \r
3125 \r
3126                 /* Extract picture */\r
3127                 int row = (a & 0x7F);\r
3128                 int col = (c & 0x7F);\r
3129 \r
3130                 /* Location of bitmap cell */\r
3131                 x1 = col * w1;\r
3132                 y1 = row * h1;\r
3133 \r
3134                 if (arg_graphics == GRAPHICS_ADAM_BOLT || arg_graphics == GRAPHICS_HENGBAND)\r
3135                 {\r
3136                         x3 = (tcp[i] & 0x7F) * w1;\r
3137                         y3 = (tap[i] & 0x7F) * h1;\r
3138                         tw2 = tw2 * w1 / tw1;\r
3139                         h2 = h2 * h1 / th1;\r
3140 \r
3141                         /* Perfect size */\r
3142                         if ((tw1 == tw2) && (th1 == h2))\r
3143                         {\r
3144                                 /* Copy the terrain picture from the bitmap to the window */\r
3145                                 BitBlt(hdc, x2, y2, tw2, h2, hdcSrc, x3, y3, SRCCOPY);\r
3146 \r
3147                                 /* Mask out the tile */\r
3148                                 BitBlt(hdc, x2, y2, tw2, h2, hdcMask, x1, y1, SRCAND);\r
3149 \r
3150                                 /* Draw the tile */\r
3151                                 BitBlt(hdc, x2, y2, tw2, h2, hdcSrc, x1, y1, SRCPAINT);\r
3152                         }\r
3153 \r
3154                         /* Need to stretch */\r
3155                         else\r
3156                         {\r
3157                                 /* Set the correct mode for stretching the tiles */\r
3158                                 SetStretchBltMode(hdc, COLORONCOLOR);\r
3159 \r
3160                                 /* Copy the terrain picture from the bitmap to the window */\r
3161                                 StretchBlt(hdc, x2, y2, tw2, h2, hdcMask, x3, y3, w1, h1, SRCAND);\r
3162 \r
3163                                 StretchBlt(hdc, x2, y2, tw2, h2, hdcSrc, x3, y3, w1, h1, SRCPAINT);\r
3164 \r
3165                                 /* Only draw if terrain and overlay are different */\r
3166                                 if ((x1 != x3) || (y1 != y3))\r
3167                                 {\r
3168                                         /* Mask out the tile */\r
3169                                         StretchBlt(hdc, x2, y2, tw2, h2, hdcMask, x1, y1, w1, h1, SRCAND);\r
3170 \r
3171                                         /* Draw the tile */\r
3172                                         StretchBlt(hdc, x2, y2, tw2, h2, hdcSrc, x1, y1, w1, h1, SRCPAINT);\r
3173                                 }\r
3174                         }\r
3175                 }\r
3176                 else\r
3177                 {\r
3178                         /* Perfect size */\r
3179                         if ((w1 == tw2) && (h1 == h2))\r
3180                         {\r
3181                                 /* Copy the picture from the bitmap to the window */\r
3182                                 BitBlt(hdc, x2, y2, tw2, h2, hdcSrc, x1, y1, SRCCOPY);\r
3183                         }\r
3184 \r
3185                         /* Need to stretch */\r
3186                         else\r
3187                         {\r
3188                                 /* Set the correct mode for stretching the tiles */\r
3189                                 SetStretchBltMode(hdc, COLORONCOLOR);\r
3190 \r
3191                                 /* Copy the picture from the bitmap to the window */\r
3192                                 StretchBlt(hdc, x2, y2, tw2, h2, hdcSrc, x1, y1, w1, h1, SRCCOPY);\r
3193                         }\r
3194                 }\r
3195         }\r
3196 \r
3197         /* Release */\r
3198         SelectObject(hdcSrc, hbmSrcOld);\r
3199         DeleteDC(hdcSrc);\r
3200 \r
3201         if (arg_graphics == GRAPHICS_ADAM_BOLT || arg_graphics == GRAPHICS_HENGBAND)\r
3202         {\r
3203                 /* Release */\r
3204                 SelectObject(hdcMask, hbmSrcOld);\r
3205                 DeleteDC(hdcMask);\r
3206         }\r
3207 \r
3208         /* Release */\r
3209         ReleaseDC(td->w, hdc);\r
3210 \r
3211 #else /* USE_GRAPHICS */\r
3212 \r
3213         /* Just erase this grid */\r
3214         return (Term_wipe_win(x, y, n));\r
3215 \r
3216 #endif /* USE_GRAPHICS */\r
3217 \r
3218         /* Success */\r
3219         return 0;\r
3220 }\r
3221 \r
3222 \r
3223 static void windows_map(void)\r
3224 {\r
3225         term_data *td = &data[0];\r
3226         byte a;\r
3227         char c;\r
3228         int x, min_x, max_x;\r
3229         int y, min_y, max_y;\r
3230 \r
3231         byte ta;\r
3232         char tc;\r
3233 \r
3234         /* Only in graphics mode */\r
3235         if (!use_graphics) return;\r
3236 \r
3237         /* Clear screen */\r
3238         Term_xtra_win_clear();\r
3239 \r
3240         td->map_tile_wid = (td->tile_wid * td->cols) / MAX_WID;\r
3241         td->map_tile_hgt = (td->tile_hgt * td->rows) / MAX_HGT;\r
3242         td->map_active = TRUE;\r
3243 \r
3244         {\r
3245                 min_x = 0;\r
3246                 min_y = 0;\r
3247                 max_x = cur_wid;\r
3248                 max_y = cur_hgt;\r
3249         }\r
3250 \r
3251         /* Draw the map */\r
3252         for (x = min_x; x < max_x; x++)\r
3253         {\r
3254                 for (y = min_y; y < max_y; y++)\r
3255                 {\r
3256                         map_info(y, x, &a, (char*)&c, &ta, (char*)&tc);\r
3257 \r
3258                         /* Ignore non-graphics */\r
3259                         if ((a & 0x80) && (c & 0x80))\r
3260                         {\r
3261                                 Term_pict_win(x - min_x, y - min_y, 1, &a, &c, &ta, &tc);\r
3262                         }\r
3263                 }\r
3264         }\r
3265 \r
3266         /* Hilite the player */\r
3267         Term_curs_win(p_ptr->x - min_x, p_ptr->y - min_y);\r
3268 \r
3269         /* Wait for a keypress, flush key buffer */\r
3270         Term_inkey(&c, TRUE, TRUE);\r
3271         Term_flush();\r
3272 \r
3273         /* Switch off the map display */\r
3274         td->map_active = FALSE;\r
3275 \r
3276         /* Restore screen */\r
3277         Term_xtra_win_clear();\r
3278         Term_redraw();\r
3279 }\r
3280 \r
3281 \r
3282 /*** Other routines ***/\r
3283 \r
3284 \r
3285 /*\r
3286  * Create and initialize a "term_data" given a title\r
3287  */\r
3288 static void term_data_link(term_data *td)\r
3289 {\r
3290         term *t = &td->t;\r
3291 \r
3292         /* Initialize the term */\r
3293         term_init(t, td->cols, td->rows, td->keys);\r
3294 \r
3295         /* Use a "software" cursor */\r
3296         t->soft_cursor = TRUE;\r
3297 \r
3298         /* Use "Term_pict" for "graphic" data */\r
3299         t->higher_pict = TRUE;\r
3300 \r
3301         /* Erase with "white space" */\r
3302         t->attr_blank = TERM_WHITE;\r
3303         t->char_blank = ' ';\r
3304 \r
3305 #if 0\r
3306         /* Prepare the init/nuke hooks */\r
3307         t->init_hook = Term_init_win;\r
3308         t->nuke_hook = Term_nuke_win;\r
3309 #endif\r
3310 \r
3311         /* Prepare the template hooks */\r
3312         t->user_hook = Term_user_win;\r
3313         t->xtra_hook = Term_xtra_win;\r
3314         t->curs_hook = Term_curs_win;\r
3315         t->bigcurs_hook = Term_bigcurs_win;\r
3316         t->wipe_hook = Term_wipe_win;\r
3317         t->text_hook = Term_text_win;\r
3318         t->pict_hook = Term_pict_win;\r
3319 \r
3320         /* Remember where we came from */\r
3321         t->data = (vptr)(td);\r
3322 }\r
3323 \r
3324 \r
3325 /*\r
3326  * Create the windows\r
3327  *\r
3328  * First, instantiate the "default" values, then read the "ini_file"\r
3329  * to over-ride selected values, then create the windows, and fonts.\r
3330  *\r
3331  * Must use SW_SHOW not SW_SHOWNA, since on 256 color display\r
3332  * must make active to realize the palette.  XXX XXX XXX\r
3333  */\r
3334 static void init_windows(void)\r
3335 {\r
3336         int i;\r
3337 \r
3338         term_data *td;\r
3339 \r
3340 #if 0 /* #ifndef JP */\r
3341         char buf[1024];\r
3342 #endif\r
3343 \r
3344         /* Main window */\r
3345         td = &data[0];\r
3346         WIPE(td, term_data);\r
3347 #ifdef JP\r
3348         td->s = "変愚蛮怒";\r
3349 #else\r
3350         td->s = angband_term_name[0];\r
3351 #endif\r
3352 \r
3353         td->keys = 1024;\r
3354         td->rows = 24;\r
3355         td->cols = 80;\r
3356         td->visible = TRUE;\r
3357         td->size_ow1 = 2;\r
3358         td->size_ow2 = 2;\r
3359         td->size_oh1 = 2;\r
3360         td->size_oh2 = 2;\r
3361         td->pos_x = 7 * 30;\r
3362         td->pos_y = 7 * 20;\r
3363         td->posfix = FALSE;\r
3364 #if 1 /* #ifdef JP */\r
3365         td->bizarre = TRUE;\r
3366 #endif\r
3367         /* Sub windows */\r
3368         for (i = 1; i < MAX_TERM_DATA; i++)\r
3369         {\r
3370                 td = &data[i];\r
3371                 WIPE(td, term_data);\r
3372                 td->s = angband_term_name[i];\r
3373                 td->keys = 16;\r
3374                 td->rows = 24;\r
3375                 td->cols = 80;\r
3376                 td->visible = FALSE;\r
3377                 td->size_ow1 = 1;\r
3378                 td->size_ow2 = 1;\r
3379                 td->size_oh1 = 1;\r
3380                 td->size_oh2 = 1;\r
3381                 td->pos_x = (7 - i) * 30;\r
3382                 td->pos_y = (7 - i) * 20;\r
3383                 td->posfix = FALSE;\r
3384 #if 1 /* #ifdef JP */\r
3385                         td->bizarre = TRUE;\r
3386 #endif\r
3387         }\r
3388 \r
3389 \r
3390         /* Load prefs */\r
3391         load_prefs();\r
3392 \r
3393 \r
3394         /* Main window (need these before term_getsize gets called) */\r
3395         td = &data[0];\r
3396         td->dwStyle = (WS_OVERLAPPED | WS_THICKFRAME | WS_SYSMENU |\r
3397                        WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_CAPTION |\r
3398                        WS_VISIBLE);\r
3399         td->dwExStyle = 0;\r
3400         td->visible = TRUE;\r
3401 \r
3402         /* Sub windows (need these before term_getsize gets called) */\r
3403         for (i = 1; i < MAX_TERM_DATA; i++)\r
3404         {\r
3405                 td = &data[i];\r
3406                 td->dwStyle = (WS_OVERLAPPED | WS_THICKFRAME | WS_SYSMENU);\r
3407                 td->dwExStyle = (WS_EX_TOOLWINDOW);\r
3408         }\r
3409 \r
3410 \r
3411         /* All windows */\r
3412         for (i = 0; i < MAX_TERM_DATA; i++)\r
3413         {\r
3414                 td = &data[i];\r
3415 \r
3416 #if 1 /* #ifdef JP */\r
3417                 strncpy(td->lf.lfFaceName, td->font_want, LF_FACESIZE);\r
3418                 td->lf.lfCharSet = DEFAULT_CHARSET;\r
3419                 td->lf.lfPitchAndFamily = FIXED_PITCH | FF_DONTCARE;\r
3420                 /* Activate the chosen font */\r
3421                 term_force_font(td, NULL);\r
3422                 if(!td->tile_wid) td->tile_wid = td->font_wid;\r
3423                 if(!td->tile_hgt) td->tile_hgt = td->font_hgt;\r
3424 #else\r
3425                 /* Access the standard font file */\r
3426                 path_build(buf, sizeof(buf), ANGBAND_DIR_XTRA_FONT, td->font_want);\r
3427 \r
3428                 /* Activate the chosen font */\r
3429                 if (term_force_font(td, buf))\r
3430                 {\r
3431                         /* Access the standard font file */\r
3432                         path_build(buf, sizeof(buf), ANGBAND_DIR_XTRA_FONT, "8X13.FON");\r
3433 \r
3434                         /* Force the use of that font */\r
3435                         (void)term_force_font(td, buf);\r
3436 \r
3437                         /* Oops */\r
3438                         td->tile_wid = 8;\r
3439                         td->tile_hgt = 13;\r
3440 \r
3441                         /* Assume not bizarre */\r
3442                         td->bizarre = FALSE;\r
3443                 }\r
3444 #endif\r
3445 \r
3446 \r
3447                 /* Analyze the font */\r
3448                 term_getsize(td);\r
3449 \r
3450                 /* Resize the window */\r
3451                 term_window_resize(td);\r
3452         }\r
3453 \r
3454 \r
3455         /* Sub windows (reverse order) */\r
3456         for (i = MAX_TERM_DATA - 1; i >= 1; --i)\r
3457         {\r
3458                 td = &data[i];\r
3459 \r
3460                 my_td = td;\r
3461                 td->w = CreateWindowEx(td->dwExStyle, AngList,\r
3462                                        td->s, td->dwStyle,\r
3463                                        td->pos_x, td->pos_y,\r
3464                                        td->size_wid, td->size_hgt,\r
3465                                        HWND_DESKTOP, NULL, hInstance, NULL);\r
3466                 my_td = NULL;\r
3467                 if (!td->w) quit(_("サブウィンドウに作成に失敗しました", "Failed to create sub-window"));\r
3468 \r
3469                 if (td->visible)\r
3470                 {\r
3471                         td->size_hack = TRUE;\r
3472                         ShowWindow(td->w, SW_SHOW);\r
3473                         td->size_hack = FALSE;\r
3474                 }\r
3475 \r
3476                 term_data_link(td);\r
3477                 angband_term[i] = &td->t;\r
3478 \r
3479                 if (td->visible)\r
3480                 {\r
3481                         /* Activate the window */\r
3482                         SetActiveWindow(td->w);\r
3483                 }\r
3484 \r
3485                 if (data[i].posfix)\r
3486                 {\r
3487                         term_window_pos(&data[i], HWND_TOPMOST);\r
3488                 }\r
3489                 else\r
3490                 {\r
3491                         term_window_pos(&data[i], td->w);\r
3492                 }\r
3493         }\r
3494 \r
3495 \r
3496         /* Main window */\r
3497         td = &data[0];\r
3498 \r
3499         /* Main window */\r
3500         my_td = td;\r
3501         td->w = CreateWindowEx(td->dwExStyle, AppName,\r
3502                                td->s, td->dwStyle,\r
3503                                td->pos_x, td->pos_y,\r
3504                                td->size_wid, td->size_hgt,\r
3505                                HWND_DESKTOP, NULL, hInstance, NULL);\r
3506         my_td = NULL;\r
3507         if (!td->w) quit(_("メインウィンドウの作成に失敗しました", "Failed to create Angband window"));\r
3508 \r
3509         term_data_link(td);\r
3510         angband_term[0] = &td->t;\r
3511         normsize.x = td->cols;\r
3512         normsize.y = td->rows;\r
3513 \r
3514         /* Activate the main window */\r
3515         if (win_maximized) ShowWindow(td->w, SW_SHOWMAXIMIZED);\r
3516         else ShowWindow(td->w, SW_SHOW);\r
3517 \r
3518         /* Bring main window back to top */\r
3519         SetWindowPos(td->w, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);\r
3520 \r
3521 \r
3522         /* New palette XXX XXX XXX */\r
3523         (void)new_palette();\r
3524 \r
3525 \r
3526         /* Create a "brush" for drawing the "cursor" */\r
3527         hbrYellow = CreateSolidBrush(win_clr[TERM_YELLOW]);\r
3528 \r
3529 \r
3530         /* Process pending messages */\r
3531         (void)Term_xtra_win_flush();\r
3532 }\r
3533 \r
3534 \r
3535 \r
3536 /*\r
3537  * Prepare the menus\r
3538  */\r
3539 static void setup_menus(void)\r
3540 {\r
3541         int i;\r
3542 \r
3543         HMENU hm = GetMenu(data[0].w);\r
3544 \r
3545 \r
3546         /* Menu "File", Disable all */\r
3547         EnableMenuItem(hm, IDM_FILE_NEW,\r
3548                        MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);\r
3549         EnableMenuItem(hm, IDM_FILE_OPEN,\r
3550                        MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);\r
3551         EnableMenuItem(hm, IDM_FILE_SAVE,\r
3552                        MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);\r
3553         EnableMenuItem(hm, IDM_FILE_EXIT,\r
3554                        MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);\r
3555         EnableMenuItem(hm, IDM_FILE_SCORE,\r
3556                        MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);\r
3557 \r
3558 \r
3559         /* No character available */\r
3560         if (!character_generated)\r
3561         {\r
3562                 /* Menu "File", Item "New" */\r
3563                 EnableMenuItem(hm, IDM_FILE_NEW, MF_BYCOMMAND | MF_ENABLED);\r
3564 \r
3565                 /* Menu "File", Item "Open" */\r
3566                 EnableMenuItem(hm, IDM_FILE_OPEN, MF_BYCOMMAND | MF_ENABLED);\r
3567         }\r
3568 \r
3569         /* A character available */\r
3570         if (character_generated)\r
3571         {\r
3572                 /* Menu "File", Item "Save" */\r
3573                 EnableMenuItem(hm, IDM_FILE_SAVE,\r
3574                            MF_BYCOMMAND | MF_ENABLED);\r
3575         }\r
3576 \r
3577         /* Menu "File", Item "Exit" */\r
3578         EnableMenuItem(hm, IDM_FILE_EXIT,\r
3579                        MF_BYCOMMAND | MF_ENABLED);\r
3580 \r
3581         EnableMenuItem(hm, IDM_FILE_SCORE,\r
3582                        MF_BYCOMMAND | MF_ENABLED);\r
3583 \r
3584 \r
3585         /* Menu "Window::Visibility" */\r
3586         for (i = 0; i < MAX_TERM_DATA; i++)\r
3587         {\r
3588                 EnableMenuItem(hm, IDM_WINDOW_VIS_0 + i,\r
3589                                MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);\r
3590 \r
3591                 CheckMenuItem(hm, IDM_WINDOW_VIS_0 + i,\r
3592                               (data[i].visible ? MF_CHECKED : MF_UNCHECKED));\r
3593 \r
3594                 EnableMenuItem(hm, IDM_WINDOW_VIS_0 + i,\r
3595                                MF_BYCOMMAND | MF_ENABLED);\r
3596         }\r
3597 \r
3598         /* Menu "Window::Font" */\r
3599         for (i = 0; i < MAX_TERM_DATA; i++)\r
3600         {\r
3601                 EnableMenuItem(hm, IDM_WINDOW_FONT_0 + i,\r
3602                                MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);\r
3603 \r
3604                 if (data[i].visible)\r
3605                 {\r
3606                         EnableMenuItem(hm, IDM_WINDOW_FONT_0 + i,\r
3607                                        MF_BYCOMMAND | MF_ENABLED);\r
3608                 }\r
3609         }\r
3610 \r
3611         /* Menu "Window::Window Position Fix" */\r
3612         for (i = 0; i < MAX_TERM_DATA; i++)\r
3613         {\r
3614                 EnableMenuItem(hm, IDM_WINDOW_POS_0 + i,\r
3615                                MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);\r
3616 \r
3617                 CheckMenuItem(hm, IDM_WINDOW_POS_0 + i,\r
3618                               (data[i].posfix ? MF_CHECKED : MF_UNCHECKED));\r
3619 \r
3620                 if (data[i].visible)\r
3621                 {\r
3622                         EnableMenuItem(hm, IDM_WINDOW_POS_0 + i,\r
3623                                        MF_BYCOMMAND | MF_ENABLED);\r
3624                 }\r
3625         }\r
3626 \r
3627         /* Menu "Window::Bizarre Display" */\r
3628         for (i = 0; i < MAX_TERM_DATA; i++)\r
3629         {\r
3630                 EnableMenuItem(hm, IDM_WINDOW_BIZ_0 + i,\r
3631                                MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);\r
3632 \r
3633                 CheckMenuItem(hm, IDM_WINDOW_BIZ_0 + i,\r
3634                               (data[i].bizarre ? MF_CHECKED : MF_UNCHECKED));\r
3635 \r
3636                 if (data[i].visible)\r
3637                 {\r
3638                         EnableMenuItem(hm, IDM_WINDOW_BIZ_0 + i,\r
3639                                    MF_BYCOMMAND | MF_ENABLED);\r
3640 \r
3641                 }\r
3642         }\r
3643 \r
3644         /* Menu "Window::Increase Tile Width" */\r
3645         for (i = 0; i < MAX_TERM_DATA; i++)\r
3646         {\r
3647                 EnableMenuItem(hm, IDM_WINDOW_I_WID_0 + i,\r
3648                                MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);\r
3649 \r
3650                 if (data[i].visible)\r
3651                 {\r
3652                         EnableMenuItem(hm, IDM_WINDOW_I_WID_0 + i,\r
3653                                    MF_BYCOMMAND | MF_ENABLED);\r
3654 \r
3655                 }\r
3656         }\r
3657 \r
3658         /* Menu "Window::Decrease Tile Width" */\r
3659         for (i = 0; i < MAX_TERM_DATA; i++)\r
3660         {\r
3661                 EnableMenuItem(hm, IDM_WINDOW_D_WID_0 + i,\r
3662                                MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);\r
3663 \r
3664                 if (data[i].visible)\r
3665                 {\r
3666                         EnableMenuItem(hm, IDM_WINDOW_D_WID_0 + i,\r
3667                                    MF_BYCOMMAND | MF_ENABLED);\r
3668 \r
3669                 }\r
3670         }\r
3671 \r
3672         /* Menu "Window::Increase Tile Height" */\r
3673         for (i = 0; i < MAX_TERM_DATA; i++)\r
3674         {\r
3675                 EnableMenuItem(hm, IDM_WINDOW_I_HGT_0 + i,\r
3676                                MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);\r
3677 \r
3678                 if (data[i].visible)\r
3679                 {\r
3680                         EnableMenuItem(hm, IDM_WINDOW_I_HGT_0 + i,\r
3681                                    MF_BYCOMMAND | MF_ENABLED);\r
3682 \r
3683                 }\r
3684         }\r
3685 \r
3686         /* Menu "Window::Decrease Tile Height" */\r
3687         for (i = 0; i < MAX_TERM_DATA; i++)\r
3688         {\r
3689                 EnableMenuItem(hm, IDM_WINDOW_D_HGT_0 + i,\r
3690                                MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);\r
3691 \r
3692                 if (data[i].visible)\r
3693                 {\r
3694                         EnableMenuItem(hm, IDM_WINDOW_D_HGT_0 + i,\r
3695                                    MF_BYCOMMAND | MF_ENABLED);\r
3696 \r
3697                 }\r
3698         }\r
3699 \r
3700         /* Menu "Options", disable all */\r
3701         EnableMenuItem(hm, IDM_OPTIONS_NO_GRAPHICS,\r
3702                        MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);\r
3703         EnableMenuItem(hm, IDM_OPTIONS_OLD_GRAPHICS,\r
3704                        MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);\r
3705         EnableMenuItem(hm, IDM_OPTIONS_NEW_GRAPHICS,\r
3706                        MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);\r
3707         EnableMenuItem(hm, IDM_OPTIONS_BIGTILE,\r
3708                        MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);\r
3709         EnableMenuItem(hm, IDM_OPTIONS_SOUND,\r
3710                        MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);\r
3711 #ifndef JP\r
3712         EnableMenuItem(hm, IDM_OPTIONS_SAVER,\r
3713                        MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);\r
3714 #endif\r
3715 \r
3716         /* Menu "Options", Item "Map" */\r
3717         if (use_graphics != GRAPHICS_NONE)\r
3718                 EnableMenuItem(GetMenu(data[0].w), IDM_OPTIONS_MAP, MF_BYCOMMAND | MF_ENABLED);\r
3719         else\r
3720                 EnableMenuItem(GetMenu(data[0].w), IDM_OPTIONS_MAP,\r
3721                                MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);\r
3722 \r
3723         /* Menu "Options", update all */\r
3724         CheckMenuItem(hm, IDM_OPTIONS_NO_GRAPHICS,\r
3725                       (arg_graphics == GRAPHICS_NONE ? MF_CHECKED : MF_UNCHECKED));\r
3726         CheckMenuItem(hm, IDM_OPTIONS_OLD_GRAPHICS,\r
3727                       (arg_graphics == GRAPHICS_ORIGINAL ? MF_CHECKED : MF_UNCHECKED));\r
3728         CheckMenuItem(hm, IDM_OPTIONS_NEW_GRAPHICS,\r
3729                       (arg_graphics == GRAPHICS_ADAM_BOLT ? MF_CHECKED : MF_UNCHECKED));\r
3730         CheckMenuItem(hm, IDM_OPTIONS_NEW2_GRAPHICS,\r
3731                       (arg_graphics == GRAPHICS_HENGBAND ? MF_CHECKED : MF_UNCHECKED));\r
3732         CheckMenuItem(hm, IDM_OPTIONS_BIGTILE,\r
3733                       (arg_bigtile ? MF_CHECKED : MF_UNCHECKED));\r
3734         CheckMenuItem(hm, IDM_OPTIONS_MUSIC,\r
3735                       (arg_music ? MF_CHECKED : MF_UNCHECKED));\r
3736         CheckMenuItem(hm, IDM_OPTIONS_SOUND,\r
3737                       (arg_sound ? MF_CHECKED : MF_UNCHECKED));\r
3738         CheckMenuItem(hm, IDM_OPTIONS_BG,\r
3739                       (use_bg ? MF_CHECKED : MF_UNCHECKED));\r
3740 #ifndef JP\r
3741         CheckMenuItem(hm, IDM_OPTIONS_SAVER,\r
3742                       (hwndSaver ? MF_CHECKED : MF_UNCHECKED));\r
3743 #endif\r
3744 \r
3745 #ifdef USE_GRAPHICS\r
3746         /* Menu "Options", Item "Graphics" */\r
3747         EnableMenuItem(hm, IDM_OPTIONS_NO_GRAPHICS, MF_ENABLED);\r
3748         /* Menu "Options", Item "Graphics" */\r
3749         EnableMenuItem(hm, IDM_OPTIONS_OLD_GRAPHICS, MF_ENABLED);\r
3750         /* Menu "Options", Item "Graphics" */\r
3751         EnableMenuItem(hm, IDM_OPTIONS_NEW_GRAPHICS, MF_ENABLED);\r
3752         /* Menu "Options", Item "Graphics" */\r
3753         EnableMenuItem(hm, IDM_OPTIONS_BIGTILE, MF_ENABLED);\r
3754 #endif /* USE_GRAPHICS */\r
3755 \r
3756 #ifdef USE_SOUND\r
3757         /* Menu "Options", Item "Sound" */\r
3758         EnableMenuItem(hm, IDM_OPTIONS_SOUND, MF_ENABLED);\r
3759 #endif /* USE_SOUND */\r
3760 \r
3761 #ifdef USE_SAVER\r
3762         /* Menu "Options", Item "ScreenSaver" */\r
3763         EnableMenuItem(hm, IDM_OPTIONS_SAVER,\r
3764                        MF_BYCOMMAND | MF_ENABLED);\r
3765 #endif /* USE_SAVER */\r
3766 }\r
3767 \r
3768 \r
3769 /*\r
3770  * Check for double clicked (or dragged) savefile\r
3771  *\r
3772  * Apparently, Windows copies the entire filename into the first\r
3773  * piece of the "command line string".  Perhaps we should extract\r
3774  * the "basename" of that filename and append it to the "save" dir.\r
3775  */\r
3776 static void check_for_save_file(LPSTR cmd_line)\r
3777 {\r
3778         char *s;\r
3779 \r
3780         /* First arg */\r
3781         s = cmd_line;\r
3782 \r
3783         /* No args */\r
3784         if (!*s) return;\r
3785 \r
3786         /* Extract filename */\r
3787         strcat(savefile, s);\r
3788 \r
3789         /* Validate the file */\r
3790         validate_file(savefile);\r
3791 \r
3792         /* Game in progress */\r
3793         game_in_progress = TRUE;\r
3794 \r
3795         /* Play game */\r
3796         play_game(FALSE);\r
3797 }\r
3798 \r
3799 \r
3800 /*\r
3801  * Process a menu command\r
3802  */\r
3803 static void process_menus(WORD wCmd)\r
3804 {\r
3805         int i;\r
3806 \r
3807         term_data *td;\r
3808 \r
3809         OPENFILENAME ofn;\r
3810 \r
3811         /* Analyze */\r
3812         switch (wCmd)\r
3813         {\r
3814                 /* New game */\r
3815                 case IDM_FILE_NEW:\r
3816                 {\r
3817                         if (!initialized)\r
3818                         {\r
3819                                 plog(_("まだ初期化中です...", "You cannot do that yet..."));\r
3820                         }\r
3821                         else if (game_in_progress)\r
3822                         {\r
3823                                 plog(_("プレイ中は新しいゲームを始めることができません!", "You can't start a new game while you're still playing!"));\r
3824                         }\r
3825                         else\r
3826                         {\r
3827                                 game_in_progress = TRUE;\r
3828                                 Term_flush();\r
3829                                 play_game(TRUE);\r
3830                                 quit(NULL);\r
3831                         }\r
3832                         break;\r
3833                 }\r
3834 \r
3835                 /* Open game */\r
3836                 case IDM_FILE_OPEN:\r
3837                 {\r
3838                         if (!initialized)\r
3839                         {\r
3840                                 plog(_("まだ初期化中です...", "You cannot do that yet..."));\r
3841                         }\r
3842                         else if (game_in_progress)\r
3843                         {\r
3844                                 plog(_("プレイ中はゲームをロードすることができません!", "You can't open a new game while you're still playing!"));\r
3845                         }\r
3846                         else\r
3847                         {\r
3848                                 memset(&ofn, 0, sizeof(ofn));\r
3849                                 ofn.lStructSize = sizeof(ofn);\r
3850                                 ofn.hwndOwner = data[0].w;\r
3851                                 ofn.lpstrFilter = "Save Files (*.)\0*\0";\r
3852                                 ofn.nFilterIndex = 1;\r
3853                                 ofn.lpstrFile = savefile;\r
3854                                 ofn.nMaxFile = 1024;\r
3855                                 ofn.lpstrInitialDir = ANGBAND_DIR_SAVE;\r
3856                                 ofn.Flags = OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR | OFN_HIDEREADONLY;\r
3857 \r
3858                                 if (GetOpenFileName(&ofn))\r
3859                                 {\r
3860                                         /* Load 'savefile' */\r
3861                                         validate_file(savefile);\r
3862                                         game_in_progress = TRUE;\r
3863                                         Term_flush();\r
3864                                         play_game(FALSE);\r
3865                                         quit(NULL);\r
3866                                 }\r
3867                         }\r
3868                         break;\r
3869                 }\r
3870 \r
3871                 /* Save game */\r
3872                 case IDM_FILE_SAVE:\r
3873                 {\r
3874                         if (game_in_progress && character_generated)\r
3875                         {\r
3876                                 /* Paranoia */\r
3877                                 if (!can_save)\r
3878                                 {\r
3879                                         plog(_("今はセーブすることは出来ません。", "You may not do that right now."));\r
3880                                         break;\r
3881                                 }\r
3882 \r
3883                                 /* Hack -- Forget messages */\r
3884                                 msg_flag = FALSE;\r
3885 \r
3886                                 /* Save the game */\r
3887 #ifdef ZANGBAND\r
3888                                 do_cmd_save_game(FALSE);\r
3889 #else /* ZANGBAND */\r
3890                                 do_cmd_save_game();\r
3891 #endif /* ZANGBAND */\r
3892                         }\r
3893                         else\r
3894                         {\r
3895                                 plog(_("今、セーブすることは出来ません。", "You may not do that right now."));\r
3896                         }\r
3897                         break;\r
3898                 }\r
3899 \r
3900                 /* Exit */\r
3901                 case IDM_FILE_EXIT:\r
3902                 {\r
3903                         if (game_in_progress && character_generated)\r
3904                         {\r
3905                                 /* Paranoia */\r
3906                                 if (!can_save)\r
3907                                 {\r
3908                                         plog(_("今は終了できません。", "You may not do that right now."));\r
3909                                         break;\r
3910                                 }\r
3911 \r
3912                                 /* Hack -- Forget messages */\r
3913                                 msg_flag = FALSE;\r
3914 \r
3915                                 forget_lite();\r
3916                                 forget_view();\r
3917                                 clear_mon_lite();\r
3918 \r
3919                                 /* Save the game */\r
3920 #ifdef ZANGBAND\r
3921                                 /* do_cmd_save_game(FALSE); */\r
3922 #else /* ZANGBAND */\r
3923                                 /* do_cmd_save_game(); */\r
3924 #endif /* ZANGBAND */\r
3925                                 Term_key_push(SPECIAL_KEY_QUIT);\r
3926                                 break;\r
3927                         }\r
3928                         quit(NULL);\r
3929                         break;\r
3930                 }\r
3931 \r
3932                 /* Show scores */\r
3933                 case IDM_FILE_SCORE:\r
3934                 {\r
3935                         char buf[1024];\r
3936 \r
3937                         /* Build the filename */\r
3938                         path_build(buf, sizeof(buf), ANGBAND_DIR_APEX, "scores.raw");\r
3939 \r
3940                         /* Open the binary high score file, for reading */\r
3941                         highscore_fd = fd_open(buf, O_RDONLY);\r
3942 \r
3943                         /* Paranoia -- No score file */\r
3944                         if (highscore_fd < 0)\r
3945                         {\r
3946                                 msg_print("Score file unavailable.");\r
3947                         }\r
3948                         else\r
3949                         {\r
3950                                 /* Save Screen */\r
3951                                 screen_save();\r
3952 \r
3953                                 /* Clear screen */\r
3954                                 Term_clear();\r
3955 \r
3956                                 /* Display the scores */\r
3957                                 display_scores_aux(0, MAX_HISCORES, -1, NULL);\r
3958 \r
3959                                 /* Shut the high score file */\r
3960                                 (void)fd_close(highscore_fd);\r
3961 \r
3962                                 /* Forget the high score fd */\r
3963                                 highscore_fd = -1;\r
3964 \r
3965                                 /* Load screen */\r
3966                                 screen_load();\r
3967 \r
3968                                 /* Hack - Flush it */\r
3969                                 Term_fresh();\r
3970                         }\r
3971 \r
3972                         break;\r
3973                 }\r
3974 \r
3975                 /* Open game */\r
3976                 case IDM_FILE_MOVIE:\r
3977                 {\r
3978                         if (!initialized)\r
3979                         {\r
3980                                 plog(_("まだ初期化中です...", "You cannot do that yet..."));\r
3981                         }\r
3982                         else if (game_in_progress)\r
3983                         {\r
3984                                 plog(_("プレイ中はムービーをロードすることができません!", "You can't open a movie while you're playing!"));\r
3985                         }\r
3986                         else\r
3987                         {\r
3988                                 memset(&ofn, 0, sizeof(ofn));\r
3989                                 ofn.lStructSize = sizeof(ofn);\r
3990                                 ofn.hwndOwner = data[0].w;\r
3991                                 ofn.lpstrFilter = "Angband Movie Files (*.amv)\0*.amv\0";\r
3992                                 ofn.nFilterIndex = 1;\r
3993                                 ofn.lpstrFile = savefile;\r
3994                                 ofn.nMaxFile = 1024;\r
3995                                 ofn.lpstrInitialDir = ANGBAND_DIR_USER;\r
3996                                 ofn.Flags = OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR;\r
3997 \r
3998                                 if (GetOpenFileName(&ofn))\r
3999                                 {\r
4000                                         /* Load 'savefile' */\r
4001                                         prepare_browse_movie_aux(savefile);\r
4002                                         play_game(FALSE);\r
4003                                         quit(NULL);\r
4004                                         return;\r
4005                                 }\r
4006                         }\r
4007                         break;\r
4008                 }\r
4009 \r
4010 \r
4011                 case IDM_WINDOW_VIS_0:\r
4012                 {\r
4013                         plog(_("メインウィンドウは非表示にできません!", "You are not allowed to do that!"));\r
4014                         break;\r
4015                 }\r
4016 \r
4017                 /* Window visibility */\r
4018                 case IDM_WINDOW_VIS_1:\r
4019                 case IDM_WINDOW_VIS_2:\r
4020                 case IDM_WINDOW_VIS_3:\r
4021                 case IDM_WINDOW_VIS_4:\r
4022                 case IDM_WINDOW_VIS_5:\r
4023                 case IDM_WINDOW_VIS_6:\r
4024                 case IDM_WINDOW_VIS_7:\r
4025                 {\r
4026                         i = wCmd - IDM_WINDOW_VIS_0;\r
4027 \r
4028                         if ((i < 0) || (i >= MAX_TERM_DATA)) break;\r
4029 \r
4030                         td = &data[i];\r
4031 \r
4032                         if (!td->visible)\r
4033                         {\r
4034                                 td->visible = TRUE;\r
4035                                 ShowWindow(td->w, SW_SHOW);\r
4036                                 term_data_redraw(td);\r
4037                         }\r
4038                         else\r
4039                         {\r
4040                                 td->visible = FALSE;\r
4041                                 td->posfix = FALSE;\r
4042                                 ShowWindow(td->w, SW_HIDE);\r
4043                         }\r
4044 \r
4045                         break;\r
4046                 }\r
4047 \r
4048                 /* Window fonts */\r
4049                 case IDM_WINDOW_FONT_0:\r
4050                 case IDM_WINDOW_FONT_1:\r
4051                 case IDM_WINDOW_FONT_2:\r
4052                 case IDM_WINDOW_FONT_3:\r
4053                 case IDM_WINDOW_FONT_4:\r
4054                 case IDM_WINDOW_FONT_5:\r
4055                 case IDM_WINDOW_FONT_6:\r
4056                 case IDM_WINDOW_FONT_7:\r
4057                 {\r
4058                         i = wCmd - IDM_WINDOW_FONT_0;\r
4059 \r
4060                         if ((i < 0) || (i >= MAX_TERM_DATA)) break;\r
4061 \r
4062                         td = &data[i];\r
4063 \r
4064                         term_change_font(td);\r
4065 \r
4066                         break;\r
4067                 }\r
4068 \r
4069                 /* Window Z Position */\r
4070                 case IDM_WINDOW_POS_1:\r
4071                 case IDM_WINDOW_POS_2:\r
4072                 case IDM_WINDOW_POS_3:\r
4073                 case IDM_WINDOW_POS_4:\r
4074                 case IDM_WINDOW_POS_5:\r
4075                 case IDM_WINDOW_POS_6:\r
4076                 case IDM_WINDOW_POS_7:\r
4077                 {\r
4078                         i = wCmd - IDM_WINDOW_POS_0;\r
4079 \r
4080                         if ((i < 0) || (i >= MAX_TERM_DATA)) break;\r
4081 \r
4082                         td = &data[i];\r
4083 \r
4084                         if (!td->posfix && td->visible)\r
4085                         {\r
4086                                 td->posfix = TRUE;\r
4087                                 term_window_pos(td, HWND_TOPMOST);\r
4088                         }\r
4089                         else\r
4090                         {\r
4091                                 td->posfix = FALSE;\r
4092                                 term_window_pos(td, data[0].w);\r
4093                         }\r
4094 \r
4095                         break;\r
4096                 }\r
4097 \r
4098                 /* Bizarre Display */\r
4099                 case IDM_WINDOW_BIZ_0:\r
4100                 case IDM_WINDOW_BIZ_1:\r
4101                 case IDM_WINDOW_BIZ_2:\r
4102                 case IDM_WINDOW_BIZ_3:\r
4103                 case IDM_WINDOW_BIZ_4:\r
4104                 case IDM_WINDOW_BIZ_5:\r
4105                 case IDM_WINDOW_BIZ_6:\r
4106                 case IDM_WINDOW_BIZ_7:\r
4107                 {\r
4108                         i = wCmd - IDM_WINDOW_BIZ_0;\r
4109 \r
4110                         if ((i < 0) || (i >= MAX_TERM_DATA)) break;\r
4111 \r
4112                         td = &data[i];\r
4113 \r
4114                         td->bizarre = !td->bizarre;\r
4115 \r
4116                         term_getsize(td);\r
4117 \r
4118                         term_window_resize(td);\r
4119 \r
4120                         break;\r
4121                 }\r
4122 \r
4123                 /* Increase Tile Width */\r
4124                 case IDM_WINDOW_I_WID_0:\r
4125                 case IDM_WINDOW_I_WID_1:\r
4126                 case IDM_WINDOW_I_WID_2:\r
4127                 case IDM_WINDOW_I_WID_3:\r
4128                 case IDM_WINDOW_I_WID_4:\r
4129                 case IDM_WINDOW_I_WID_5:\r
4130                 case IDM_WINDOW_I_WID_6:\r
4131                 case IDM_WINDOW_I_WID_7:\r
4132                 {\r
4133                         i = wCmd - IDM_WINDOW_I_WID_0;\r
4134 \r
4135                         if ((i < 0) || (i >= MAX_TERM_DATA)) break;\r
4136 \r
4137                         td = &data[i];\r
4138 \r
4139                         td->tile_wid += 1;\r
4140 \r
4141                         term_getsize(td);\r
4142 \r
4143                         term_window_resize(td);\r
4144 \r
4145                         break;\r
4146                 }\r
4147 \r
4148                 /* Decrease Tile Height */\r
4149                 case IDM_WINDOW_D_WID_0:\r
4150                 case IDM_WINDOW_D_WID_1:\r
4151                 case IDM_WINDOW_D_WID_2:\r
4152                 case IDM_WINDOW_D_WID_3:\r
4153                 case IDM_WINDOW_D_WID_4:\r
4154                 case IDM_WINDOW_D_WID_5:\r
4155                 case IDM_WINDOW_D_WID_6:\r
4156                 case IDM_WINDOW_D_WID_7:\r
4157                 {\r
4158                         i = wCmd - IDM_WINDOW_D_WID_0;\r
4159 \r
4160                         if ((i < 0) || (i >= MAX_TERM_DATA)) break;\r
4161 \r
4162                         td = &data[i];\r
4163 \r
4164                         td->tile_wid -= 1;\r
4165 \r
4166                         term_getsize(td);\r
4167 \r
4168                         term_window_resize(td);\r
4169 \r
4170                         break;\r
4171                 }\r
4172 \r
4173                 /* Increase Tile Height */\r
4174                 case IDM_WINDOW_I_HGT_0:\r
4175                 case IDM_WINDOW_I_HGT_1:\r
4176                 case IDM_WINDOW_I_HGT_2:\r
4177                 case IDM_WINDOW_I_HGT_3:\r
4178                 case IDM_WINDOW_I_HGT_4:\r
4179                 case IDM_WINDOW_I_HGT_5:\r
4180                 case IDM_WINDOW_I_HGT_6:\r
4181                 case IDM_WINDOW_I_HGT_7:\r
4182                 {\r
4183                         i = wCmd - IDM_WINDOW_I_HGT_0;\r
4184 \r
4185                         if ((i < 0) || (i >= MAX_TERM_DATA)) break;\r
4186 \r
4187                         td = &data[i];\r
4188 \r
4189                         td->tile_hgt += 1;\r
4190 \r
4191                         term_getsize(td);\r
4192 \r
4193                         term_window_resize(td);\r
4194 \r
4195                         break;\r
4196                 }\r
4197 \r
4198                 /* Decrease Tile Height */\r
4199                 case IDM_WINDOW_D_HGT_0:\r
4200                 case IDM_WINDOW_D_HGT_1:\r
4201                 case IDM_WINDOW_D_HGT_2:\r
4202                 case IDM_WINDOW_D_HGT_3:\r
4203                 case IDM_WINDOW_D_HGT_4:\r
4204                 case IDM_WINDOW_D_HGT_5:\r
4205                 case IDM_WINDOW_D_HGT_6:\r
4206                 case IDM_WINDOW_D_HGT_7:\r
4207                 {\r
4208                         i = wCmd - IDM_WINDOW_D_HGT_0;\r
4209 \r
4210                         if ((i < 0) || (i >= MAX_TERM_DATA)) break;\r
4211 \r
4212                         td = &data[i];\r
4213 \r
4214                         td->tile_hgt -= 1;\r
4215 \r
4216                         term_getsize(td);\r
4217 \r
4218                         term_window_resize(td);\r
4219 \r
4220                         break;\r
4221                 }\r
4222 \r
4223                 case IDM_OPTIONS_NO_GRAPHICS:\r
4224                 {\r
4225                         /* Paranoia */\r
4226                         if (!inkey_flag)\r
4227                         {\r
4228                                 plog("You may not do that right now.");\r
4229                                 break;\r
4230                         }\r
4231 \r
4232                         /* Toggle "arg_graphics" */\r
4233                         if (arg_graphics != GRAPHICS_NONE)\r
4234                         {\r
4235                                 arg_graphics = GRAPHICS_NONE;\r
4236 \r
4237                                 /* React to changes */\r
4238                                 Term_xtra_win_react();\r
4239 \r
4240                                 /* Hack -- Force redraw */\r
4241                                 Term_key_push(KTRL('R'));\r
4242                         }\r
4243 \r
4244                         break;\r
4245                 }\r
4246 \r
4247                 case IDM_OPTIONS_OLD_GRAPHICS:\r
4248                 {\r
4249                         /* Paranoia */\r
4250                         if (!inkey_flag)\r
4251                         {\r
4252                                 plog("You may not do that right now.");\r
4253                                 break;\r
4254                         }\r
4255 \r
4256                         /* Toggle "arg_graphics" */\r
4257                         if (arg_graphics != GRAPHICS_ORIGINAL)\r
4258                         {\r
4259                                 arg_graphics = GRAPHICS_ORIGINAL;\r
4260 \r
4261                                 /* React to changes */\r
4262                                 Term_xtra_win_react();\r
4263 \r
4264                                 /* Hack -- Force redraw */\r
4265                                 Term_key_push(KTRL('R'));\r
4266                         }\r
4267 \r
4268                         break;\r
4269                 }\r
4270 \r
4271                 case IDM_OPTIONS_NEW_GRAPHICS:\r
4272                 {\r
4273                         /* Paranoia */\r
4274                         if (!inkey_flag)\r
4275                         {\r
4276                                 plog("You may not do that right now.");\r
4277                                 break;\r
4278                         }\r
4279 \r
4280                         /* Toggle "arg_graphics" */\r
4281                         if (arg_graphics != GRAPHICS_ADAM_BOLT)\r
4282                         {\r
4283                                 arg_graphics = GRAPHICS_ADAM_BOLT;\r
4284 \r
4285                                 /* React to changes */\r
4286                                 Term_xtra_win_react();\r
4287 \r
4288                                 /* Hack -- Force redraw */\r
4289                                 Term_key_push(KTRL('R'));\r
4290                         }\r
4291 \r
4292                         break;\r
4293                 }\r
4294 \r
4295                 case IDM_OPTIONS_NEW2_GRAPHICS:\r
4296                 {\r
4297                         /* Paranoia */\r
4298                         if (!inkey_flag)\r
4299                         {\r
4300                                 plog("You may not do that right now.");\r
4301                                 break;\r
4302                         }\r
4303 \r
4304                         /* Toggle "arg_graphics" */\r
4305                         if (arg_graphics != GRAPHICS_HENGBAND)\r
4306                         {\r
4307                                 arg_graphics = GRAPHICS_HENGBAND;\r
4308 \r
4309                                 /* React to changes */\r
4310                                 Term_xtra_win_react();\r
4311 \r
4312                                 /* Hack -- Force redraw */\r
4313                                 Term_key_push(KTRL('R'));\r
4314                         }\r
4315 \r
4316                         break;\r
4317                 }\r
4318 \r
4319                 case IDM_OPTIONS_BIGTILE:\r
4320                 {\r
4321                         td = &data[0];\r
4322 \r
4323                         /* Paranoia */\r
4324                         if (!inkey_flag)\r
4325                         {\r
4326                                 plog("You may not do that right now.");\r
4327                                 break;\r
4328                         }\r
4329 \r
4330                         /* Toggle "arg_sound" */\r
4331                         arg_bigtile = !arg_bigtile;\r
4332 \r
4333                         /* Activate */\r
4334                         Term_activate(&td->t);\r
4335 \r
4336                         /* Resize the term */\r
4337                         Term_resize(td->cols, td->rows);\r
4338 \r
4339                         /* Redraw later */\r
4340                         InvalidateRect(td->w, NULL, TRUE);\r
4341 \r
4342                         break;\r
4343                 }\r
4344 \r
4345                 case IDM_OPTIONS_MUSIC:\r
4346                 {\r
4347                         /* Paranoia */\r
4348                         if (!inkey_flag)\r
4349                         {\r
4350                                 plog("You may not do that right now.");\r
4351                                 break;\r
4352                         }\r
4353 \r
4354                         /* Toggle "arg_sound" */\r
4355                         arg_music = !arg_music;\r
4356 \r
4357                         /* React to changes */\r
4358                         Term_xtra_win_react();\r
4359 \r
4360                         /* Hack -- Force redraw */\r
4361                         Term_key_push(KTRL('R'));\r
4362 \r
4363                         break;\r
4364                 }\r
4365 \r
4366                 case IDM_OPTIONS_SOUND:\r
4367                 {\r
4368                         /* Paranoia */\r
4369                         if (!inkey_flag)\r
4370                         {\r
4371                                 plog("You may not do that right now.");\r
4372                                 break;\r
4373                         }\r
4374 \r
4375                         /* Toggle "arg_sound" */\r
4376                         arg_sound = !arg_sound;\r
4377 \r
4378                         /* React to changes */\r
4379                         Term_xtra_win_react();\r
4380 \r
4381                         /* Hack -- Force redraw */\r
4382                         Term_key_push(KTRL('R'));\r
4383 \r
4384                         break;\r
4385                 }\r
4386 \r
4387                 /* bg */\r
4388                 case IDM_OPTIONS_BG:\r
4389                 {\r
4390                         /* Paranoia */\r
4391                         if (!inkey_flag)\r
4392                         {\r
4393                                 plog("You may not do that right now.");\r
4394                                 break;\r
4395                         }\r
4396 \r
4397                         /* Toggle "use_bg" */\r
4398                         use_bg = !use_bg;\r
4399 \r
4400                         init_bg();\r
4401 \r
4402                         /* React to changes */\r
4403                         Term_xtra_win_react();\r
4404 \r
4405                         /* Hack -- Force redraw */\r
4406                         Term_key_push(KTRL('R'));\r
4407 \r
4408                         break;\r
4409                 }\r
4410 \r
4411                 /* bg */\r
4412                 case IDM_OPTIONS_OPEN_BG:\r
4413                 {\r
4414                         /* Paranoia */\r
4415                         if (!inkey_flag)\r
4416                         {\r
4417                                 plog("You may not do that right now.");\r
4418                                 break;\r
4419                         }\r
4420                         else\r
4421                         {\r
4422                                 memset(&ofn, 0, sizeof(ofn));\r
4423                                 ofn.lStructSize = sizeof(ofn);\r
4424                                 ofn.hwndOwner = data[0].w;\r
4425                                 ofn.lpstrFilter = "Bitmap Files (*.bmp)\0*.bmp\0";\r
4426                                 ofn.nFilterIndex = 1;\r
4427                                 ofn.lpstrFile = bg_bitmap_file;\r
4428                                 ofn.nMaxFile = 1023;\r
4429                                 ofn.lpstrInitialDir = NULL;\r
4430                                 ofn.lpstrTitle = _("壁紙を選んでね。", "Choose wall paper.");\r
4431                                 ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;\r
4432 \r
4433                                 if (GetOpenFileName(&ofn))\r
4434                                 {\r
4435                                         /* Load 'savefile' */\r
4436                                         use_bg = 1;\r
4437                                         init_bg();\r
4438                                 }\r
4439 \r
4440                                 /* React to changes */\r
4441                                 Term_xtra_win_react();\r
4442 \r
4443                                 /* Hack -- Force redraw */\r
4444                                 Term_key_push(KTRL('R'));\r
4445                         }\r
4446                         break;\r
4447                 }\r
4448 \r
4449                 case IDM_DUMP_SCREEN_HTML:\r
4450                 {\r
4451                         static char buf[1024] = "";\r
4452                         memset(&ofn, 0, sizeof(ofn));\r
4453                         ofn.lStructSize = sizeof(ofn);\r
4454                         ofn.hwndOwner = data[0].w;\r
4455                         ofn.lpstrFilter = "HTML Files (*.html)\0*.html\0";\r
4456                         ofn.nFilterIndex = 1;\r
4457                         ofn.lpstrFile = buf;\r
4458                         ofn.nMaxFile = 1023;\r
4459                         ofn.lpstrDefExt = "html";\r
4460                         ofn.lpstrInitialDir = NULL;\r
4461                         ofn.lpstrTitle = _("HTMLでスクリーンダンプを保存", "Save screen dump as HTML.");\r
4462                         ofn.Flags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT;\r
4463 \r
4464                         if (GetSaveFileName(&ofn))\r
4465                         {\r
4466                                 do_cmd_save_screen_html_aux(buf, 0);\r
4467                         }\r
4468                         break;\r
4469                 }\r
4470 \r
4471 #ifdef USE_SAVER\r
4472 \r
4473                 case IDM_OPTIONS_SAVER:\r
4474                 {\r
4475                         if (hwndSaver)\r
4476                         {\r
4477                                 DestroyWindow(hwndSaver);\r
4478                                 hwndSaver = NULL;\r
4479                         }\r
4480                         else\r
4481                         {\r
4482                                 /* Create a screen scaver window */\r
4483                                 hwndSaver = CreateWindowEx(WS_EX_TOPMOST, "WindowsScreenSaverClass",\r
4484                                                            "Angband Screensaver",\r
4485                                                            WS_POPUP | WS_MAXIMIZE | WS_VISIBLE,\r
4486                                                            0, 0, GetSystemMetrics(SM_CXSCREEN),\r
4487                                                            GetSystemMetrics(SM_CYSCREEN),\r
4488                                                            NULL, NULL, hInstance, NULL);\r
4489 \r
4490                                 if (hwndSaver)\r
4491                                 {\r
4492                                         /* Push the window to the bottom XXX XXX XXX */\r
4493                                         SetWindowPos(hwndSaver, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);\r
4494                                 }\r
4495                                 else\r
4496                                 {\r
4497                                         plog(_("ウィンドウを作成出来ません", "Failed to create saver window"));\r
4498                                 }\r
4499                         }\r
4500                         break;\r
4501                 }\r
4502 \r
4503 #endif\r
4504 \r
4505                 case IDM_OPTIONS_MAP:\r
4506                 {\r
4507                         windows_map();\r
4508                         break;\r
4509                 }\r
4510 \r
4511                 case IDM_HELP_CONTENTS:\r
4512                 {\r
4513 #ifdef HTML_HELP\r
4514                         char tmp[1024];\r
4515                         path_build(tmp, sizeof(tmp), ANGBAND_DIR_XTRA_HELP, "zangband.chm");\r
4516                         if (check_file(tmp))\r
4517                         {\r
4518                                 HtmlHelp(data[0].w, tmp, HH_DISPLAY_TOPIC, 0);\r
4519                         }\r
4520                         else\r
4521                         {\r
4522 #ifdef JP\r
4523                                 plog_fmt("ヘルプファイル[%s]が見付かりません。", tmp);\r
4524                                 plog("代わりにオンラインヘルプを使用してください。");\r
4525 #else\r
4526                                 plog_fmt("Cannot find help file: %s", tmp);\r
4527                                 plog("Use the online help files instead.");\r
4528 #endif\r
4529 \r
4530                         }\r
4531                         break;\r
4532 #else /* HTML_HELP */\r
4533                         char buf[1024];\r
4534                         char tmp[1024];\r
4535                         path_build(tmp, sizeof(tmp), ANGBAND_DIR_XTRA_HELP, "zangband.hlp");\r
4536                         if (check_file(tmp))\r
4537                         {\r
4538                                 sprintf(buf, "winhelp.exe %s", tmp);\r
4539                                 WinExec(buf, SW_NORMAL);\r
4540                         }\r
4541                         else\r
4542                         {\r
4543 #ifdef JP\r
4544                                 plog_fmt("ヘルプファイル[%s]が見付かりません。", tmp);\r
4545                                 plog("代わりにオンラインヘルプを使用してください。");\r
4546 #else\r
4547                                 plog_fmt("Cannot find help file: %s", tmp);\r
4548                                 plog("Use the online help files instead.");\r
4549 #endif\r
4550 \r
4551                         }\r
4552                         break;\r
4553 #endif /* HTML_HELP */\r
4554                 }\r
4555         }\r
4556 }\r
4557 \r
4558 \r
4559 static bool process_keydown(WPARAM wParam, LPARAM lParam)\r
4560 {\r
4561         int i;\r
4562         bool mc = FALSE;\r
4563         bool ms = FALSE;\r
4564         bool ma = FALSE;\r
4565 \r
4566         /* Extract the modifiers */\r
4567         if (GetKeyState(VK_CONTROL) & 0x8000) mc = TRUE;\r
4568         if (GetKeyState(VK_SHIFT)   & 0x8000) ms = TRUE;\r
4569         if (GetKeyState(VK_MENU)    & 0x8000) ma = TRUE;\r
4570 \r
4571         Term_no_press = (ma) ? TRUE : FALSE;\r
4572 \r
4573         /* Handle "special" keys */\r
4574         if (special_key[(byte)(wParam)] || (ma && !ignore_key[(byte)(wParam)]) )\r
4575         {\r
4576                 bool ext_key = (lParam & 0x1000000L) ? TRUE : FALSE;\r
4577                 bool numpad = FALSE;\r
4578 \r
4579                 /* Begin the macro trigger */\r
4580                 Term_keypress(31);\r
4581 \r
4582                 /* Send the modifiers */\r
4583                 if (mc) Term_keypress('C');\r
4584                 if (ms) Term_keypress('S');\r
4585                 if (ma) Term_keypress('A');\r
4586 \r
4587                 /* Extract "scan code" */\r
4588                 i = LOBYTE(HIWORD(lParam));\r
4589 \r
4590                 /* Introduce the scan code */\r
4591                 Term_keypress('x');\r
4592 \r
4593                 /* Extended key bit */\r
4594                 switch (wParam)\r
4595                 {\r
4596                         /* Numpad Enter and '/' are extended key */\r
4597                 case VK_DIVIDE:\r
4598                         Term_no_press = TRUE;\r
4599                 case VK_RETURN: /* Enter */\r
4600                         numpad = ext_key;\r
4601                         break;\r
4602                         /* Other extended keys are on full keyboard */\r
4603                 case VK_NUMPAD0:\r
4604                 case VK_NUMPAD1:\r
4605                 case VK_NUMPAD2:\r
4606                 case VK_NUMPAD3:\r
4607                 case VK_NUMPAD4:\r
4608                 case VK_NUMPAD5:\r
4609                 case VK_NUMPAD6:\r
4610                 case VK_NUMPAD7:\r
4611                 case VK_NUMPAD8:\r
4612                 case VK_NUMPAD9:\r
4613                 case VK_ADD:\r
4614                 case VK_MULTIPLY:\r
4615                 case VK_SUBTRACT:\r
4616                 case VK_SEPARATOR:\r
4617                 case VK_DECIMAL:\r
4618                         Term_no_press = TRUE;\r
4619                 case VK_CLEAR:\r
4620                 case VK_HOME:\r
4621                 case VK_END:\r
4622                 case VK_PRIOR:  /* Page Up */\r
4623                 case VK_NEXT:   /* Page Down */\r
4624                 case VK_INSERT:\r
4625                 case VK_DELETE:\r
4626                 case VK_UP:\r
4627                 case VK_DOWN:\r
4628                 case VK_LEFT:\r
4629                 case VK_RIGHT:\r
4630                         numpad = !ext_key;\r
4631                 }\r
4632 \r
4633                 /* Special modifiers for keypad keys */\r
4634                 if (numpad) Term_keypress('K');\r
4635 \r
4636                 /* Encode the hexidecimal scan code */\r
4637                 Term_keypress(hexsym[i/16]);\r
4638                 Term_keypress(hexsym[i%16]);\r
4639 \r
4640                 /* End the macro trigger */\r
4641                 Term_keypress(13);\r
4642 \r
4643                 return 1;\r
4644         }\r
4645 \r
4646         return 0;\r
4647 }\r
4648 \r
4649 \r
4650 #ifdef __MWERKS__\r
4651 LRESULT FAR PASCAL AngbandWndProc(HWND hWnd, UINT uMsg,\r
4652                                   WPARAM wParam, LPARAM lParam);\r
4653 LRESULT FAR PASCAL AngbandWndProc(HWND hWnd, UINT uMsg,\r
4654                                   WPARAM wParam, LPARAM lParam)\r
4655 #else /* __MWERKS__ */\r
4656 LRESULT FAR PASCAL AngbandWndProc(HWND hWnd, UINT uMsg,\r
4657                                           WPARAM wParam, LPARAM lParam)\r
4658 #endif /* __MWERKS__ */\r
4659 {\r
4660         PAINTSTRUCT ps;\r
4661         HDC hdc;\r
4662         term_data *td;\r
4663 #if 0\r
4664         MINMAXINFO FAR *lpmmi;\r
4665         RECT rc;\r
4666 #endif\r
4667         int i;\r
4668 \r
4669 \r
4670         /* Acquire proper "term_data" info */\r
4671         td = (term_data *)GetWindowLong(hWnd, 0);\r
4672 \r
4673         /* Handle message */\r
4674         switch (uMsg)\r
4675         {\r
4676                 /* XXX XXX XXX */\r
4677                 case WM_NCCREATE:\r
4678                 {\r
4679                         SetWindowLong(hWnd, 0, (LONG)(my_td));\r
4680                         break;\r
4681                 }\r
4682 \r
4683                 /* XXX XXX XXX */\r
4684                 case WM_CREATE:\r
4685                 {\r
4686 #ifdef USE_MUSIC\r
4687                         mop.dwCallback=(DWORD)hWnd;\r
4688 #endif\r
4689                         return 0;\r
4690                 }\r
4691 \r
4692                 case WM_GETMINMAXINFO:\r
4693                 {\r
4694                         MINMAXINFO FAR *lpmmi;\r
4695                         RECT rc;\r
4696 \r
4697                         lpmmi = (MINMAXINFO FAR *)lParam;\r
4698 \r
4699                         /* this message was sent before WM_NCCREATE */\r
4700                         if (!td) return 1;\r
4701 \r
4702                         /* Minimum window size is 80x24 */\r
4703                         rc.left = rc.top = 0;\r
4704                         rc.right = rc.left + 80 * td->tile_wid + td->size_ow1 + td->size_ow2;\r
4705                         rc.bottom = rc.top + 24 * td->tile_hgt + td->size_oh1 + td->size_oh2 + 1;\r
4706 \r
4707                         /* Adjust */\r
4708                         AdjustWindowRectEx(&rc, td->dwStyle, TRUE, td->dwExStyle);\r
4709 \r
4710                         /* Save minimum size */\r
4711                         lpmmi->ptMinTrackSize.x = rc.right - rc.left;\r
4712                         lpmmi->ptMinTrackSize.y = rc.bottom - rc.top;\r
4713 \r
4714                         return 0;\r
4715                 }\r
4716 \r
4717                 case WM_PAINT:\r
4718                 {\r
4719                         BeginPaint(hWnd, &ps);\r
4720                         if (td) term_data_redraw(td);\r
4721                         EndPaint(hWnd, &ps);\r
4722                         ValidateRect(hWnd, NULL);\r
4723                         return 0;\r
4724                 }\r
4725 \r
4726 #ifdef USE_MUSIC\r
4727                 case MM_MCINOTIFY:\r
4728                 {\r
4729                         if(wParam == MCI_NOTIFY_SUCCESSFUL)\r
4730                         {\r
4731                                 mciSendCommand(mop.wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, 0);\r
4732                                 mciSendCommand(mop.wDeviceID, MCI_PLAY, MCI_NOTIFY, (DWORD)&mop);\r
4733                         }\r
4734                         return 0;\r
4735                 }\r
4736 #endif\r
4737 \r
4738                 case WM_SYSKEYDOWN:\r
4739                 case WM_KEYDOWN:\r
4740                 {\r
4741                         if (process_keydown(wParam, lParam))\r
4742                                 return 0;\r
4743                         break;\r
4744                 }\r
4745 \r
4746                 case WM_CHAR:\r
4747                 {\r
4748                         if (Term_no_press) Term_no_press = FALSE;\r
4749                         else Term_keypress(wParam);\r
4750                         return 0;\r
4751                 }\r
4752 \r
4753                 case WM_LBUTTONDOWN:\r
4754                 {\r
4755                         mousex = MIN(LOWORD(lParam) / td->tile_wid, td->cols - 1);\r
4756                         mousey = MIN(HIWORD(lParam) / td->tile_hgt, td->rows - 1);\r
4757                         mouse_down = TRUE;\r
4758                         oldx = mousex;\r
4759                         oldy = mousey;\r
4760                         return 0;\r
4761                 }\r
4762 \r
4763                 case WM_LBUTTONUP:\r
4764                 {\r
4765                         HGLOBAL hGlobal;\r
4766                         LPSTR lpStr;\r
4767                         int j, sz;\r
4768                         TERM_POSITION dx = abs(oldx - mousex) + 1;\r
4769                         TERM_POSITION dy = abs(oldy - mousey) + 1;\r
4770                         TERM_POSITION ox = (oldx > mousex) ? mousex : oldx;\r
4771                         TERM_POSITION oy = (oldy > mousey) ? mousey : oldy;\r
4772 \r
4773                         mouse_down = FALSE;\r
4774                         paint_rect = FALSE;\r
4775 \r
4776 #ifdef JP\r
4777                         sz = (dx + 3) * dy;\r
4778 #else\r
4779                         sz = (dx + 2) * dy;\r
4780 #endif\r
4781                         hGlobal = GlobalAlloc(GHND, sz + 1);\r
4782                         if (hGlobal == NULL) return 0;\r
4783                         lpStr = (LPSTR)GlobalLock(hGlobal);\r
4784 \r
4785                         for (i = 0; i < dy; i++)\r
4786                         {\r
4787 #ifdef JP\r
4788                                 char *s;\r
4789                                 char **scr = data[0].t.scr->c;\r
4790 \r
4791                                 C_MAKE(s, (dx + 1), char);\r
4792                                 strncpy(s, &scr[oy + i][ox], dx);\r
4793 \r
4794                                 if (ox > 0)\r
4795                                 {\r
4796                                         if (iskanji(scr[oy + i][ox - 1])) s[0] = ' ';\r
4797                                 }\r
4798 \r
4799                                 if (ox + dx < data[0].cols)\r
4800                                 {\r
4801                                         if (iskanji(scr[oy + i][ox + dx - 1])) s[dx - 1] = ' ';\r
4802                                 }\r
4803 \r
4804                                 for (j = 0; j < dx; j++)\r
4805                                 {\r
4806                                         if (s[j] == 127) s[j] = '#';\r
4807                                         *lpStr++ = s[j];\r
4808                                 }\r
4809 #else\r
4810                                 for (j = 0; j < dx; j++)\r
4811                                 {\r
4812                                         *lpStr++ = data[0].t.scr->c[oy + i][ox + j];\r
4813                                 }\r
4814 #endif\r
4815                                 if (dy > 1)\r
4816                                 {\r
4817                                         *lpStr++ = '\r';\r
4818                                         *lpStr++ = '\n';\r
4819                                 }\r
4820                         }\r
4821 \r
4822                         GlobalUnlock(hGlobal);\r
4823                         if (OpenClipboard(hWnd) == 0)\r
4824                         {\r
4825                                 GlobalFree(hGlobal);\r
4826                                 return 0;\r
4827                         }\r
4828                         EmptyClipboard();\r
4829                         SetClipboardData(CF_TEXT, hGlobal);\r
4830                         CloseClipboard();\r
4831 \r
4832                         Term_redraw();\r
4833 \r
4834                         return 0;\r
4835                 }\r
4836 \r
4837                 case WM_MOUSEMOVE:\r
4838                 {\r
4839                         if (mouse_down)\r
4840                         {\r
4841                                 int dx, dy;\r
4842                                 int cx = MIN(LOWORD(lParam) / td->tile_wid, td->cols - 1);\r
4843                                 int cy = MIN(HIWORD(lParam) / td->tile_hgt, td->rows - 1);\r
4844                                 int ox, oy;\r
4845 \r
4846                                 if (paint_rect)\r
4847                                 {\r
4848                                         dx = abs(oldx - mousex) + 1;\r
4849                                         dy = abs(oldy - mousey) + 1;\r
4850                                         ox = (oldx > mousex) ? mousex : oldx;\r
4851                                         oy = (oldy > mousey) ? mousey : oldy;\r
4852                                         Term_inversed_area(hWnd, ox, oy, dx, dy);\r
4853                                 }\r
4854                                 else\r
4855                                 {\r
4856                                         paint_rect = TRUE;\r
4857                                 }\r
4858 \r
4859                                 dx = abs(cx - mousex) + 1;\r
4860                                 dy = abs(cy - mousey) + 1;\r
4861                                 ox = (cx > mousex) ? mousex : cx;\r
4862                                 oy = (cy > mousey) ? mousey : cy;\r
4863                                 Term_inversed_area(hWnd, ox, oy, dx, dy);\r
4864 \r
4865                                 oldx = cx;\r
4866                                 oldy = cy;\r
4867                         }\r
4868                         return 0;\r
4869                 }\r
4870 \r
4871                 case WM_INITMENU:\r
4872                 {\r
4873                         setup_menus();\r
4874                         return 0;\r
4875                 }\r
4876 \r
4877                 case WM_CLOSE:\r
4878                 {\r
4879                         if (game_in_progress && character_generated)\r
4880                         {\r
4881                                 if (!can_save)\r
4882                                 {\r
4883                                         plog(_("今は終了できません。", "You may not do that right now."));\r
4884                                         return 0;\r
4885                                 }\r
4886 \r
4887                                 /* Hack -- Forget messages */\r
4888                                 msg_flag = FALSE;\r
4889 \r
4890                                 forget_lite();\r
4891                                 forget_view();\r
4892                                 clear_mon_lite();\r
4893 \r
4894                                 /* Save the game */\r
4895 #ifdef ZANGBAND\r
4896                                 /* do_cmd_save_game(FALSE); */\r
4897 #else /* ZANGBAND */\r
4898                                 /* do_cmd_save_game(); */\r
4899 #endif /* ZANGBAND */\r
4900                                 Term_key_push(SPECIAL_KEY_QUIT);\r
4901                                 return 0;\r
4902                         }\r
4903                         quit(NULL);\r
4904                         return 0;\r
4905                 }\r
4906 \r
4907                 case WM_QUERYENDSESSION:\r
4908                 {\r
4909                         if (game_in_progress && character_generated)\r
4910                         {\r
4911                                 /* Hack -- Forget messages */\r
4912                                 msg_flag = FALSE;\r
4913 \r
4914                                 /* Mega-Hack -- Delay death */\r
4915                                 if (p_ptr->chp < 0) p_ptr->is_dead = FALSE;\r
4916                                 do_cmd_write_nikki(NIKKI_GAMESTART, 0, _("----ゲーム中断----", "---- Save and Exit Game ----"));\r
4917 \r
4918                                 /* Hardcode panic save */\r
4919                                 p_ptr->panic_save = 1;\r
4920 \r
4921                                 /* Forbid suspend */\r
4922                                 signals_ignore_tstp();\r
4923 \r
4924                                 /* Indicate panic save */\r
4925                                 (void)strcpy(p_ptr->died_from, _("(緊急セーブ)", "(panic save)"));\r
4926 \r
4927                                 /* Panic save */\r
4928                                 (void)save_player();\r
4929                         }\r
4930                         quit(NULL);\r
4931                         return 0;\r
4932                 }\r
4933 \r
4934                 case WM_QUIT:\r
4935                 {\r
4936                         quit(NULL);\r
4937                         return 0;\r
4938                 }\r
4939 \r
4940                 case WM_COMMAND:\r
4941                 {\r
4942                         process_menus(LOWORD(wParam));\r
4943                         return 0;\r
4944                 }\r
4945 \r
4946                 case WM_SIZE:\r
4947                 {\r
4948                         /* this message was sent before WM_NCCREATE */\r
4949                         if (!td) return 1;\r
4950 \r
4951                         /* it was sent from inside CreateWindowEx */\r
4952                         if (!td->w) return 1;\r
4953 \r
4954                         /* was sent from WM_SIZE */\r
4955                         if (td->size_hack) return 1;\r
4956 \r
4957                         switch (wParam)\r
4958                         {\r
4959                                 case SIZE_MINIMIZED:\r
4960                                 {\r
4961                                         /* Hide sub-windows */\r
4962                                         for (i = 1; i < MAX_TERM_DATA; i++)\r
4963                                         {\r
4964                                                 if (data[i].visible) ShowWindow(data[i].w, SW_HIDE);\r
4965                                         }\r
4966                                         return 0;\r
4967                                 }\r
4968 \r
4969                                 case SIZE_MAXIMIZED:\r
4970                                 {\r
4971                                         /* fall through XXX XXX XXX */\r
4972                                 }\r
4973 \r
4974                                 case SIZE_RESTORED:\r
4975                                 {\r
4976                                         TERM_POSITION cols = (LOWORD(lParam) - td->size_ow1) / td->tile_wid;\r
4977                                         TERM_POSITION rows = (HIWORD(lParam) - td->size_oh1) / td->tile_hgt;\r
4978 \r
4979                                         /* New size */\r
4980                                         if ((td->cols != cols) || (td->rows != rows))\r
4981                                         {\r
4982                                                 /* Save the new size */\r
4983                                                 td->cols = cols;\r
4984                                                 td->rows = rows;\r
4985 \r
4986                                                 if (!IsZoomed(td->w) && !IsIconic(td->w))\r
4987                                                 {\r
4988                                                         normsize.x = td->cols;\r
4989                                                         normsize.y = td->rows;\r
4990                                                 }\r
4991 \r
4992                                                 /* Activate */\r
4993                                                 Term_activate(&td->t);\r
4994 \r
4995                                                 /* Resize the term */\r
4996                                                 Term_resize(td->cols, td->rows);\r
4997 \r
4998                                                 /* Redraw later */\r
4999                                                 InvalidateRect(td->w, NULL, TRUE);\r
5000                                         }\r
5001 \r
5002                                         td->size_hack = TRUE;\r
5003 \r
5004                                         /* Show sub-windows */\r
5005                                         for (i = 1; i < MAX_TERM_DATA; i++)\r
5006                                         {\r
5007                                                 if (data[i].visible) ShowWindow(data[i].w, SW_SHOW);\r
5008                                         }\r
5009 \r
5010                                         td->size_hack = FALSE;\r
5011 \r
5012                                         return 0;\r
5013                                 }\r
5014                         }\r
5015                         break;\r
5016                 }\r
5017 \r
5018                 case WM_PALETTECHANGED:\r
5019                 {\r
5020                         /* Ignore if palette change caused by itself */\r
5021                         if ((HWND)wParam == hWnd) return 0;\r
5022 \r
5023                         /* Fall through... */\r
5024                 }\r
5025 \r
5026                 case WM_QUERYNEWPALETTE:\r
5027                 {\r
5028                         if (!paletted) return 0;\r
5029 \r
5030                         hdc = GetDC(hWnd);\r
5031 \r
5032                         SelectPalette(hdc, hPal, FALSE);\r
5033 \r
5034                         i = RealizePalette(hdc);\r
5035 \r
5036                         /* if any palette entries changed, repaint the window. */\r
5037                         if (i) InvalidateRect(hWnd, NULL, TRUE);\r
5038 \r
5039                         ReleaseDC(hWnd, hdc);\r
5040 \r
5041                         return 0;\r
5042                 }\r
5043 \r
5044                 case WM_ACTIVATE:\r
5045                 {\r
5046                         if (wParam && !HIWORD(lParam))\r
5047                         {\r
5048                                 /* Do something to sub-windows */\r
5049                                 for (i = 1; i < MAX_TERM_DATA; i++)\r
5050                                 {\r
5051                                         if (!data[i].posfix) term_window_pos(&data[i], hWnd);\r
5052                                 }\r
5053 \r
5054                                 /* Focus on main window */\r
5055                                 SetFocus(hWnd);\r
5056 \r
5057                                 return 0;\r
5058                         }\r
5059 \r
5060                         break;\r
5061                 }\r
5062 \r
5063                 case WM_ACTIVATEAPP:\r
5064                 {\r
5065                         if (IsIconic(td->w)) break;\r
5066 \r
5067                         for (i = 1; i < MAX_TERM_DATA; i++)\r
5068                         {\r
5069                                 if(data[i].visible)\r
5070                                 {\r
5071                                         if (wParam == TRUE)\r
5072                                         {\r
5073                                                 ShowWindow(data[i].w, SW_SHOW);\r
5074                                         }\r
5075                                         else\r
5076                                         {\r
5077                                                 ShowWindow(data[i].w, SW_HIDE);\r
5078                                         }\r
5079                                 }\r
5080                         }\r
5081                 }\r
5082         }\r
5083 \r
5084         return DefWindowProc(hWnd, uMsg, wParam, lParam);\r
5085 }\r
5086 \r
5087 \r
5088 #ifdef __MWERKS__\r
5089 LRESULT FAR PASCAL AngbandListProc(HWND hWnd, UINT uMsg,\r
5090                                            WPARAM wParam, LPARAM lParam);\r
5091 LRESULT FAR PASCAL AngbandListProc(HWND hWnd, UINT uMsg,\r
5092                                            WPARAM wParam, LPARAM lParam)\r
5093 #else /* __MWERKS__ */\r
5094 LRESULT FAR PASCAL AngbandListProc(HWND hWnd, UINT uMsg,\r
5095                                            WPARAM wParam, LPARAM lParam)\r
5096 #endif /* __MWERKS__ */\r
5097 {\r
5098         term_data *td;\r
5099 #if 0\r
5100         MINMAXINFO FAR *lpmmi;\r
5101         RECT rc;\r
5102 #endif\r
5103         PAINTSTRUCT ps;\r
5104         HDC hdc;\r
5105         int i;\r
5106 \r
5107 \r
5108         /* Acquire proper "term_data" info */\r
5109         td = (term_data *)GetWindowLong(hWnd, 0);\r
5110 \r
5111         /* Process message */\r
5112         switch (uMsg)\r
5113         {\r
5114                 /* XXX XXX XXX */\r
5115                 case WM_NCCREATE:\r
5116                 {\r
5117                         SetWindowLong(hWnd, 0, (LONG)(my_td));\r
5118                         break;\r
5119                 }\r
5120 \r
5121                 /* XXX XXX XXX */\r
5122                 case WM_CREATE:\r
5123                 {\r
5124                         return 0;\r
5125                 }\r
5126 \r
5127                 case WM_GETMINMAXINFO:\r
5128                 {\r
5129                         MINMAXINFO FAR *lpmmi;\r
5130                         RECT rc;\r
5131 \r
5132                         lpmmi = (MINMAXINFO FAR *)lParam;\r
5133 \r
5134                         /* this message was sent before WM_NCCREATE */\r
5135                         if (!td) return 1;\r
5136 \r
5137                         /* Minimum window size is 80x24 */\r
5138                         rc.left = rc.top = 0;\r
5139                         rc.right = rc.left + 20 * td->tile_wid + td->size_ow1 + td->size_ow2;\r
5140                         rc.bottom = rc.top + 3 * td->tile_hgt + td->size_oh1 + td->size_oh2 + 1;\r
5141 \r
5142                         /* Adjust */\r
5143                         AdjustWindowRectEx(&rc, td->dwStyle, TRUE, td->dwExStyle);\r
5144 \r
5145                         /* Save minimum size */\r
5146                         lpmmi->ptMinTrackSize.x = rc.right - rc.left;\r
5147                         lpmmi->ptMinTrackSize.y = rc.bottom - rc.top;\r
5148 \r
5149                         return 0;\r
5150                 }\r
5151 \r
5152                 case WM_SIZE:\r
5153                 {\r
5154                         TERM_POSITION cols;\r
5155                         TERM_POSITION rows;\r
5156                         \r
5157                         /* this message was sent before WM_NCCREATE */\r
5158                         if (!td) return 1;\r
5159 \r
5160                         /* it was sent from inside CreateWindowEx */\r
5161                         if (!td->w) return 1;\r
5162 \r
5163                         /* was sent from inside WM_SIZE */\r
5164                         if (td->size_hack) return 1;\r
5165 \r
5166                         td->size_hack = TRUE;\r
5167 \r
5168                         cols = (LOWORD(lParam) - td->size_ow1) / td->tile_wid;\r
5169                         rows = (HIWORD(lParam) - td->size_oh1) / td->tile_hgt;\r
5170 \r
5171                         /* New size */\r
5172                         if ((td->cols != cols) || (td->rows != rows))\r
5173                         {\r
5174                                 /* Save old term */\r
5175                                 term *old_term = Term;\r
5176 \r
5177                                 /* Save the new size */\r
5178                                 td->cols = cols;\r
5179                                 td->rows = rows;\r
5180 \r
5181                                 /* Activate */\r
5182                                 Term_activate(&td->t);\r
5183 \r
5184                                 /* Resize the term */\r
5185                                 Term_resize(td->cols, td->rows);\r
5186 \r
5187                                 /* Activate */\r
5188                                 Term_activate(old_term);\r
5189 \r
5190                                 /* Redraw later */\r
5191                                 InvalidateRect(td->w, NULL, TRUE);\r
5192 \r
5193                                 /* HACK - Redraw all windows */\r
5194                                 p_ptr->window = 0xFFFFFFFF;\r
5195                                 window_stuff();\r
5196                         }\r
5197 \r
5198                         td->size_hack = FALSE;\r
5199 \r
5200                         return 0;\r
5201                 }\r
5202 \r
5203                 case WM_PAINT:\r
5204                 {\r
5205                         BeginPaint(hWnd, &ps);\r
5206                         if (td) term_data_redraw(td);\r
5207                         EndPaint(hWnd, &ps);\r
5208                         return 0;\r
5209                 }\r
5210 \r
5211                 case WM_SYSKEYDOWN:\r
5212                 case WM_KEYDOWN:\r
5213                 {\r
5214                         if (process_keydown(wParam, lParam))\r
5215                                 return 0;\r
5216                         break;\r
5217                 }\r
5218 \r
5219                 case WM_CHAR:\r
5220                 {\r
5221                         if (Term_no_press) Term_no_press = FALSE;\r
5222                         else Term_keypress(wParam);\r
5223                         return 0;\r
5224                 }\r
5225 \r
5226                 case WM_PALETTECHANGED:\r
5227                 {\r
5228                         /* ignore if palette change caused by itself */\r
5229                         if ((HWND)wParam == hWnd) return FALSE;\r
5230                         /* otherwise, fall through!!! */\r
5231                 }\r
5232 \r
5233                 case WM_QUERYNEWPALETTE:\r
5234                 {\r
5235                         if (!paletted) return 0;\r
5236                         hdc = GetDC(hWnd);\r
5237                         SelectPalette(hdc, hPal, FALSE);\r
5238                         i = RealizePalette(hdc);\r
5239                         /* if any palette entries changed, repaint the window. */\r
5240                         if (i) InvalidateRect(hWnd, NULL, TRUE);\r
5241                         ReleaseDC(hWnd, hdc);\r
5242                         return 0;\r
5243                 }\r
5244 \r
5245                 case WM_NCLBUTTONDOWN:\r
5246                 {\r
5247 \r
5248 #ifdef HTCLOSE\r
5249                         if (wParam == HTCLOSE) wParam = HTSYSMENU;\r
5250 #endif /* HTCLOSE */\r
5251 \r
5252                         if (wParam == HTSYSMENU)\r
5253                         {\r
5254                                 if (td->visible)\r
5255                                 {\r
5256                                         td->visible = FALSE;\r
5257                                         ShowWindow(td->w, SW_HIDE);\r
5258                                 }\r
5259 \r
5260                                 return 0;\r
5261                         }\r
5262 \r
5263                         break;\r
5264                 }\r
5265         }\r
5266 \r
5267         return DefWindowProc(hWnd, uMsg, wParam, lParam);\r
5268 }\r
5269 \r
5270 \r
5271 #ifdef USE_SAVER\r
5272 \r
5273 #define MOUSE_SENS 40\r
5274 \r
5275 #ifdef __MWERKS__\r
5276 LRESULT FAR PASCAL AngbandSaverProc(HWND hWnd, UINT uMsg,\r
5277                                     WPARAM wParam, LPARAM lParam);\r
5278 LRESULT FAR PASCAL AngbandSaverProc(HWND hWnd, UINT uMsg,\r
5279                                     WPARAM wParam, LPARAM lParam)\r
5280 #else /* __MWERKS__ */\r
5281 LRESULT FAR PASCAL AngbandSaverProc(HWND hWnd, UINT uMsg,\r
5282                                             WPARAM wParam, LPARAM lParam)\r
5283 #endif /* __MWERKS__ */\r
5284 {\r
5285         static int iMouse = 0;\r
5286         static WORD xMouse = 0;\r
5287         static WORD yMouse = 0;\r
5288 \r
5289         int dx, dy;\r
5290 \r
5291 \r
5292         /* Process */\r
5293         switch (uMsg)\r
5294         {\r
5295                 /* XXX XXX XXX */\r
5296                 case WM_NCCREATE:\r
5297                 {\r
5298                         break;\r
5299                 }\r
5300 \r
5301                 case WM_SETCURSOR:\r
5302                 {\r
5303                         SetCursor(NULL);\r
5304                         return 0;\r
5305                 }\r
5306 \r
5307 #if 0\r
5308                 case WM_ACTIVATE:\r
5309                 {\r
5310                         if (LOWORD(wParam) == WA_INACTIVE) break;\r
5311 \r
5312                         /* else fall through */\r
5313                 }\r
5314 #endif\r
5315 \r
5316                 case WM_LBUTTONDOWN:\r
5317                 case WM_MBUTTONDOWN:\r
5318                 case WM_RBUTTONDOWN:\r
5319                 case WM_KEYDOWN:\r
5320                 {\r
5321                         SendMessage(hWnd, WM_CLOSE, 0, 0);\r
5322                         return 0;\r
5323                 }\r
5324 \r
5325                 case WM_MOUSEMOVE:\r
5326                 {\r
5327                         if (iMouse)\r
5328                         {\r
5329                                 dx = LOWORD(lParam) - xMouse;\r
5330                                 dy = HIWORD(lParam) - yMouse;\r
5331 \r
5332                                 if (dx < 0) dx = -dx;\r
5333                                 if (dy < 0) dy = -dy;\r
5334 \r
5335                                 if ((dx > MOUSE_SENS) || (dy > MOUSE_SENS))\r
5336                                 {\r
5337                                         SendMessage(hWnd, WM_CLOSE, 0, 0);\r
5338                                 }\r
5339                         }\r
5340 \r
5341                         /* Save last location */\r
5342                         iMouse = 1;\r
5343                         xMouse = LOWORD(lParam);\r
5344                         yMouse = HIWORD(lParam);\r
5345 \r
5346                         return 0;\r
5347                 }\r
5348 \r
5349                 case WM_CLOSE:\r
5350                 {\r
5351                         DestroyWindow(hwndSaver);\r
5352                         hwndSaver = NULL;\r
5353                         return 0;\r
5354                 }\r
5355         }\r
5356 \r
5357         /* Oops */\r
5358         return DefWindowProc(hWnd, uMsg, wParam, lParam);\r
5359 }\r
5360 \r
5361 #endif /* USE_SAVER */\r
5362 \r
5363 \r
5364 \r
5365 \r
5366 \r
5367 /*** Temporary Hooks ***/\r
5368 \r
5369 \r
5370 /*\r
5371  * Display warning message (see "z-util.c")\r
5372  */\r
5373 static void hack_plog(cptr str)\r
5374 {\r
5375         /* Give a warning */\r
5376         if (str)\r
5377         {\r
5378 #ifdef JP\r
5379                 MessageBox(NULL, str, "警告!",\r
5380                            MB_ICONEXCLAMATION | MB_OK);\r
5381 #else\r
5382                 MessageBox(NULL, str, "Warning",\r
5383                            MB_ICONEXCLAMATION | MB_OK);\r
5384 #endif\r
5385 \r
5386         }\r
5387 }\r
5388 \r
5389 \r
5390 /*\r
5391  * Display error message and quit (see "z-util.c")\r
5392  */\r
5393 static void hack_quit(cptr str)\r
5394 {\r
5395         /* Give a warning */\r
5396         if (str)\r
5397         {\r
5398 #ifdef JP\r
5399                 MessageBox(NULL, str, "エラー!",\r
5400                            MB_ICONEXCLAMATION | MB_OK | MB_ICONSTOP);\r
5401 #else\r
5402                 MessageBox(NULL, str, "Error",\r
5403                            MB_ICONEXCLAMATION | MB_OK | MB_ICONSTOP);\r
5404 #endif\r
5405 \r
5406         }\r
5407 \r
5408         /* Unregister the classes */\r
5409         UnregisterClass(AppName, hInstance);\r
5410 \r
5411         /* Destroy the icon */\r
5412         if (hIcon) DestroyIcon(hIcon);\r
5413 \r
5414         /* Exit */\r
5415         exit(0);\r
5416 }\r
5417 \r
5418 \r
5419 \r
5420 /*** Various hooks ***/\r
5421 \r
5422 \r
5423 /*\r
5424  * Display warning message (see "z-util.c")\r
5425  */\r
5426 static void hook_plog(cptr str)\r
5427 {\r
5428         /* Warning */\r
5429         if (str)\r
5430         {\r
5431 #ifdef JP\r
5432                 MessageBox(data[0].w, str, "警告!",\r
5433                            MB_ICONEXCLAMATION | MB_OK);\r
5434 #else\r
5435                 MessageBox(data[0].w, str, "Warning",\r
5436                            MB_ICONEXCLAMATION | MB_OK);\r
5437 #endif\r
5438 \r
5439         }\r
5440 }\r
5441 \r
5442 \r
5443 /*\r
5444  * Display error message and quit (see "z-util.c")\r
5445  */\r
5446 static void hook_quit(cptr str)\r
5447 {\r
5448         int i;\r
5449 \r
5450 \r
5451         /* Give a warning */\r
5452         if (str)\r
5453         {\r
5454 #ifdef JP\r
5455                 MessageBox(data[0].w, str, "エラー!",\r
5456                            MB_ICONEXCLAMATION | MB_OK | MB_ICONSTOP);\r
5457 #else\r
5458                 MessageBox(data[0].w, str, "Error",\r
5459                            MB_ICONEXCLAMATION | MB_OK | MB_ICONSTOP);\r
5460 #endif\r
5461 \r
5462         }\r
5463 \r
5464 \r
5465         /* Save the preferences */\r
5466         save_prefs();\r
5467 \r
5468 \r
5469         /*** Could use 'Term_nuke_win()' XXX XXX XXX */\r
5470 \r
5471         /* Destroy all windows */\r
5472         for (i = MAX_TERM_DATA - 1; i >= 0; --i)\r
5473         {\r
5474                 term_force_font(&data[i], NULL);\r
5475                 if (data[i].font_want) string_free(data[i].font_want);\r
5476                 if (data[i].w) DestroyWindow(data[i].w);\r
5477                 data[i].w = 0;\r
5478         }\r
5479 \r
5480         /* Free the bitmap stuff */\r
5481 #ifdef USE_GRAPHICS\r
5482         if (infGraph.hPalette) DeleteObject(infGraph.hPalette);\r
5483         if (infGraph.hBitmap) DeleteObject(infGraph.hBitmap);\r
5484 \r
5485         if (infMask.hPalette) DeleteObject(infMask.hPalette);\r
5486         if (infMask.hBitmap) DeleteObject(infMask.hBitmap);\r
5487 \r
5488 #endif /* USE_GRAPHICS */\r
5489 \r
5490         /*** Free some other stuff ***/\r
5491 \r
5492         DeleteObject(hbrYellow);\r
5493 \r
5494         /* bg */\r
5495         delete_bg();\r
5496 \r
5497         if (hPal) DeleteObject(hPal);\r
5498 \r
5499         UnregisterClass(AppName, hInstance);\r
5500 \r
5501         if (hIcon) DestroyIcon(hIcon);\r
5502 \r
5503         exit(0);\r
5504 }\r
5505 \r
5506 \r
5507 \r
5508 /*** Initialize ***/\r
5509 \r
5510 \r
5511 /*\r
5512  * Init some stuff\r
5513  */\r
5514 static void init_stuff(void)\r
5515 {\r
5516         int i;\r
5517 \r
5518         char path[1024];\r
5519 \r
5520 \r
5521         /* Get program name with full path */\r
5522         GetModuleFileName(hInstance, path, 512);\r
5523 \r
5524         /* Save the "program name" XXX XXX XXX */\r
5525         argv0 = path;\r
5526 \r
5527         /* Get the name of the "*.ini" file */\r
5528         strcpy(path + strlen(path) - 4, ".INI");\r
5529 \r
5530         /* Save the the name of the ini-file */\r
5531         ini_file = string_make(path);\r
5532 \r
5533         /* Analyze the path */\r
5534         i = strlen(path);\r
5535 \r
5536         /* Get the path */\r
5537         for (; i > 0; i--)\r
5538         {\r
5539                 if (path[i] == '\\')\r
5540                 {\r
5541                         /* End of path */\r
5542                         break;\r
5543                 }\r
5544         }\r
5545 \r
5546         /* Add "lib" to the path */\r
5547         strcpy(path + i + 1, "lib\\");\r
5548 \r
5549         /* Validate the path */\r
5550         validate_dir(path, TRUE);\r
5551 \r
5552         /* Init the file paths */\r
5553         init_file_paths(path);\r
5554 \r
5555         /* Hack -- Validate the paths */\r
5556         validate_dir(ANGBAND_DIR_APEX, FALSE);\r
5557         validate_dir(ANGBAND_DIR_BONE, FALSE);\r
5558 \r
5559         /* Allow missing 'edit' directory */\r
5560         if (!check_dir(ANGBAND_DIR_EDIT))\r
5561         {\r
5562                 /* Must have 'data'! */\r
5563                 validate_dir(ANGBAND_DIR_DATA, TRUE);\r
5564         }\r
5565         else\r
5566         {\r
5567                 /* Don't need 'data' */\r
5568                 validate_dir(ANGBAND_DIR_DATA, FALSE);\r
5569         }\r
5570 \r
5571         validate_dir(ANGBAND_DIR_FILE, TRUE);\r
5572         validate_dir(ANGBAND_DIR_HELP, FALSE);\r
5573         validate_dir(ANGBAND_DIR_INFO, FALSE);\r
5574         validate_dir(ANGBAND_DIR_PREF, TRUE);\r
5575         validate_dir(ANGBAND_DIR_SAVE, FALSE);\r
5576         validate_dir(ANGBAND_DIR_USER, TRUE);\r
5577         validate_dir(ANGBAND_DIR_XTRA, TRUE);\r
5578 \r
5579         /* Build the filename */\r
5580         path_build(path, sizeof(path), ANGBAND_DIR_FILE, _("news_j.txt", "news.txt"));\r
5581 \r
5582         /* Hack -- Validate the "news.txt" file */\r
5583         validate_file(path);\r
5584 \r
5585 \r
5586 #if 0 /* #ifndef JP */\r
5587         /* Build the "font" path */\r
5588         path_build(path, sizeof(path), ANGBAND_DIR_XTRA, "font");\r
5589 \r
5590         /* Allocate the path */\r
5591         ANGBAND_DIR_XTRA_FONT = string_make(path);\r
5592 \r
5593         /* Validate the "font" directory */\r
5594         validate_dir(ANGBAND_DIR_XTRA_FONT, TRUE);\r
5595 \r
5596         /* Build the filename */\r
5597         path_build(path, sizeof(path), ANGBAND_DIR_XTRA_FONT, "8X13.FON");\r
5598 \r
5599         /* Hack -- Validate the basic font */\r
5600         validate_file(path);\r
5601 #endif\r
5602 \r
5603 \r
5604 #ifdef USE_GRAPHICS\r
5605 \r
5606         /* Build the "graf" path */\r
5607         path_build(path, sizeof(path), ANGBAND_DIR_XTRA, "graf");\r
5608 \r
5609         /* Allocate the path */\r
5610         ANGBAND_DIR_XTRA_GRAF = string_make(path);\r
5611 \r
5612         /* Validate the "graf" directory */\r
5613         validate_dir(ANGBAND_DIR_XTRA_GRAF, TRUE);\r
5614 \r
5615 #endif /* USE_GRAPHICS */\r
5616 \r
5617 \r
5618 #ifdef USE_SOUND\r
5619 \r
5620         /* Build the "sound" path */\r
5621         path_build(path, sizeof(path), ANGBAND_DIR_XTRA, "sound");\r
5622 \r
5623         /* Allocate the path */\r
5624         ANGBAND_DIR_XTRA_SOUND = string_make(path);\r
5625 \r
5626         /* Validate the "sound" directory */\r
5627         validate_dir(ANGBAND_DIR_XTRA_SOUND, FALSE);\r
5628 \r
5629 #endif /* USE_SOUND */\r
5630 \r
5631 #ifdef USE_MUSIC\r
5632 \r
5633         /* Build the "music" path */\r
5634         path_build(path, sizeof(path), ANGBAND_DIR_XTRA, "music");\r
5635 \r
5636         /* Allocate the path */\r
5637         ANGBAND_DIR_XTRA_MUSIC = string_make(path);\r
5638 \r
5639         /* Validate the "music" directory */\r
5640         validate_dir(ANGBAND_DIR_XTRA_MUSIC, FALSE);\r
5641 \r
5642 #endif /* USE_MUSIC */\r
5643 \r
5644         /* Build the "help" path */\r
5645         path_build(path, sizeof(path), ANGBAND_DIR_XTRA, "help");\r
5646 \r
5647         /* Allocate the path */\r
5648         ANGBAND_DIR_XTRA_HELP = string_make(path);\r
5649 \r
5650         /* Validate the "help" directory */\r
5651         /* validate_dir(ANGBAND_DIR_XTRA_HELP); */\r
5652 }\r
5653 \r
5654 static bool is_already_running(void)\r
5655 {\r
5656         bool result = FALSE;\r
5657         HANDLE hMutex;\r
5658 \r
5659         hMutex = CreateMutex(NULL, TRUE, VERSION_NAME);\r
5660         if (GetLastError() == ERROR_ALREADY_EXISTS)\r
5661         {\r
5662                 result = TRUE;\r
5663         }\r
5664         return result;\r
5665 }\r
5666 \r
5667 \r
5668 int FAR PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrevInst,\r
5669                        LPSTR lpCmdLine, int nCmdShow)\r
5670 {\r
5671         int i;\r
5672 \r
5673         WNDCLASS wc;\r
5674         HDC hdc;\r
5675         MSG msg;\r
5676 \r
5677         setlocale( LC_ALL, "ja_JP" );\r
5678 \r
5679         /* Unused */\r
5680         (void)nCmdShow;\r
5681 \r
5682         /* Save globally */\r
5683         hInstance = hInst;\r
5684         \r
5685         \r
5686         /* Prevent multiple run */\r
5687         if (is_already_running())\r
5688         {\r
5689                 MessageBox(NULL,\r
5690                                 _("変愚蛮怒はすでに起動しています。", "Hengband is already running."), \r
5691                                 _("エラー!", "Error") ,\r
5692                                 MB_ICONEXCLAMATION | MB_OK | MB_ICONSTOP);\r
5693                 return FALSE;\r
5694         }\r
5695 \r
5696         /* Initialize */\r
5697         if (hPrevInst == NULL)\r
5698         {\r
5699                 wc.style         = CS_CLASSDC;\r
5700                 wc.lpfnWndProc   = AngbandWndProc;\r
5701                 wc.cbClsExtra    = 0;\r
5702                 wc.cbWndExtra    = 4; /* one long pointer to term_data */\r
5703                 wc.hInstance     = hInst;\r
5704                 wc.hIcon         = hIcon = LoadIcon(hInst, AppName);\r
5705                 wc.hCursor       = LoadCursor(NULL, IDC_ARROW);\r
5706                 wc.hbrBackground = GetStockObject(BLACK_BRUSH);\r
5707                 wc.lpszMenuName  = AppName;\r
5708                 wc.lpszClassName = AppName;\r
5709 \r
5710                 if (!RegisterClass(&wc)) exit(1);\r
5711 \r
5712                 wc.lpfnWndProc   = AngbandListProc;\r
5713                 wc.lpszMenuName  = NULL;\r
5714                 wc.lpszClassName = AngList;\r
5715 \r
5716                 if (!RegisterClass(&wc)) exit(2);\r
5717 \r
5718 #ifdef USE_SAVER\r
5719 \r
5720                 wc.style          = CS_VREDRAW | CS_HREDRAW | CS_SAVEBITS | CS_DBLCLKS;\r
5721                 wc.lpfnWndProc    = AngbandSaverProc;\r
5722                 wc.hCursor        = NULL;\r
5723                 wc.lpszMenuName   = NULL;\r
5724                 wc.lpszClassName  = "WindowsScreenSaverClass";\r
5725 \r
5726                 if (!RegisterClass(&wc)) exit(3);\r
5727 \r
5728 #endif\r
5729 \r
5730         }\r
5731 \r
5732         /* Temporary hooks */\r
5733         plog_aux = hack_plog;\r
5734         quit_aux = hack_quit;\r
5735         core_aux = hack_quit;\r
5736 \r
5737         /* Prepare the filepaths */\r
5738         init_stuff();\r
5739 \r
5740         /* Initialize the keypress analyzer */\r
5741         for (i = 0; special_key_list[i]; ++i)\r
5742         {\r
5743                 special_key[special_key_list[i]] = TRUE;\r
5744         }\r
5745         /* Initialize the keypress analyzer */\r
5746         for (i = 0; ignore_key_list[i]; ++i)\r
5747         {\r
5748                 ignore_key[ignore_key_list[i]] = TRUE;\r
5749         }\r
5750 \r
5751         /* Determine if display is 16/256/true color */\r
5752         hdc = GetDC(NULL);\r
5753         colors16 = (GetDeviceCaps(hdc, BITSPIXEL) == 4);\r
5754         paletted = ((GetDeviceCaps(hdc, RASTERCAPS) & RC_PALETTE) ? TRUE : FALSE);\r
5755         ReleaseDC(NULL, hdc);\r
5756 \r
5757         /* Initialize the colors */\r
5758         for (i = 0; i < 256; i++)\r
5759         {\r
5760                 byte rv, gv, bv;\r
5761 \r
5762                 /* Extract desired values */\r
5763                 rv = angband_color_table[i][1];\r
5764                 gv = angband_color_table[i][2];\r
5765                 bv = angband_color_table[i][3];\r
5766 \r
5767                 /* Extract the "complex" code */\r
5768                 win_clr[i] = PALETTERGB(rv, gv, bv);\r
5769 \r
5770                 /* Save the "simple" code */\r
5771                 angband_color_table[i][0] = win_pal[i];\r
5772         }\r
5773 \r
5774         /* Prepare the windows */\r
5775         init_windows();\r
5776 \r
5777         /* bg */\r
5778         init_bg();\r
5779 \r
5780         /* Activate hooks */\r
5781         plog_aux = hook_plog;\r
5782         quit_aux = hook_quit;\r
5783         core_aux = hook_quit;\r
5784 \r
5785         /* Set the system suffix */\r
5786         ANGBAND_SYS = "win";\r
5787 \r
5788         /* Set the keyboard suffix */\r
5789         if (7 != GetKeyboardType(0))\r
5790                 ANGBAND_KEYBOARD = "0";\r
5791         else\r
5792         {\r
5793                 /* Japanese keyboard */\r
5794                 switch (GetKeyboardType(1))\r
5795                 {\r
5796                 case 0x0D01: case 0x0D02:\r
5797                 case 0x0D03: case 0x0D04:\r
5798                 case 0x0D05: case 0x0D06:\r
5799                         /* NEC PC-98x1 */\r
5800                         ANGBAND_KEYBOARD = "NEC98";\r
5801                         break;\r
5802                 default:\r
5803                         /* PC/AT */\r
5804                         ANGBAND_KEYBOARD = "JAPAN";\r
5805                 }\r
5806         }\r
5807 \r
5808         /* Catch nasty signals */\r
5809         signals_init();\r
5810 \r
5811         /* Initialize */\r
5812         Term_activate(term_screen);\r
5813         init_angband();\r
5814 \r
5815         /* We are now initialized */\r
5816         initialized = TRUE;\r
5817 #ifdef CHUUKEI\r
5818         if(lpCmdLine[0] == '-'){\r
5819           switch(lpCmdLine[1])\r
5820           {\r
5821           case 'p':\r
5822           case 'P':\r
5823             {\r
5824               if (!lpCmdLine[2]) break;\r
5825               chuukei_server = TRUE;\r
5826               if(connect_chuukei_server(&lpCmdLine[2])<0){\r
5827                 msg_print("connect fail");\r
5828                 return 0;\r
5829               }\r
5830               msg_print("connect");\r
5831               msg_print(NULL);\r
5832               break;\r
5833             }\r
5834 \r
5835           case 'c':\r
5836           case 'C':\r
5837             {\r
5838               if (!lpCmdLine[2]) break;\r
5839               chuukei_client = TRUE;\r
5840               connect_chuukei_server(&lpCmdLine[2]);\r
5841               play_game(FALSE);\r
5842               quit(NULL);\r
5843               return 0;\r
5844             }\r
5845           case 'X':\r
5846           case 'x':\r
5847             {\r
5848               if (!lpCmdLine[2]) break;\r
5849               prepare_browse_movie(&lpCmdLine[2]);\r
5850               play_game(FALSE);\r
5851               quit(NULL);\r
5852               return 0;\r
5853             }\r
5854           }\r
5855         }\r
5856 #endif\r
5857 \r
5858 #ifdef CHUUKEI\r
5859         /* Did the user double click on a save file? */\r
5860         if(!chuukei_server) check_for_save_file(lpCmdLine);\r
5861 #else\r
5862         /* Did the user double click on a save file? */\r
5863         check_for_save_file(lpCmdLine);\r
5864 #endif\r
5865 \r
5866         /* Prompt the user */\r
5867         prt(_("[ファイル] メニューの [新規] または [開く] を選択してください。", "[Choose 'New' or 'Open' from the 'File' menu]"), 23, _(8, 17));\r
5868 \r
5869         Term_fresh();\r
5870 \r
5871         /* Process messages forever */\r
5872         while (GetMessage(&msg, NULL, 0, 0))\r
5873         {\r
5874                 TranslateMessage(&msg);\r
5875                 DispatchMessage(&msg);\r
5876         }\r
5877 \r
5878         /* Paranoia */\r
5879         quit(NULL);\r
5880 \r
5881         /* Paranoia */\r
5882         return (0);\r
5883 }\r
5884 \r
5885 \r
5886 #endif /* WINDOWS */\r
5887 \r