OSDN Git Service

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