OSDN Git Service

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