OSDN Git Service

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