OSDN Git Service

[Refactor] #37353 MAX_DEPTH と MAX_SAVED_FLOORS を floor.h と floor-save.h へ移動.
[hengband/hengband.git] / src / term.c
1 #include "angband.h"
2 #include "util.h"
3
4 #include "term.h"
5 #include "spells.h"
6 #include "core.h"
7
8
9 /*
10  * Standard window names
11  */
12 const char angband_term_name[8][16] =
13 {
14         "Hengband",
15         "Term-1",
16         "Term-2",
17         "Term-3",
18         "Term-4",
19         "Term-5",
20         "Term-6",
21         "Term-7"
22 };
23
24 /*
25  * Global table of color definitions
26  */
27 byte angband_color_table[256][4] =
28 {
29         {0x00, 0x00, 0x00, 0x00},       /* TERM_DARK */
30         {0x00, 0xFF, 0xFF, 0xFF},       /* TERM_WHITE */
31         {0x00, 0x80, 0x80, 0x80},       /* TERM_SLATE */
32         {0x00, 0xFF, 0x80, 0x00},       /* TERM_ORANGE */
33         {0x00, 0xC0, 0x00, 0x00},       /* TERM_RED */
34         {0x00, 0x00, 0x80, 0x40},       /* TERM_GREEN */
35         {0x00, 0x00, 0x00, 0xFF},       /* TERM_BLUE */
36         {0x00, 0x80, 0x40, 0x00},       /* TERM_UMBER */
37         {0x00, 0x40, 0x40, 0x40},       /* TERM_L_DARK */
38         {0x00, 0xC0, 0xC0, 0xC0},       /* TERM_L_WHITE */
39         {0x00, 0xFF, 0x00, 0xFF},       /* TERM_VIOLET */
40         {0x00, 0xFF, 0xFF, 0x00},       /* TERM_YELLOW */
41         {0x00, 0xFF, 0x00, 0x00},       /* TERM_L_RED */
42         {0x00, 0x00, 0xFF, 0x00},       /* TERM_L_GREEN */
43         {0x00, 0x00, 0xFF, 0xFF},       /* TERM_L_BLUE */
44         {0x00, 0xC0, 0x80, 0x40}        /* TERM_L_UMBER */
45 };
46
47 /*!
48  * @brief 色名称テーブル / Hack -- the "basic" color names (see "TERM_xxx")
49  */
50 const concptr color_names[16] =
51 {
52 #ifdef JP
53         "黒",
54         "白",
55         "青灰色",
56         "オレンジ",
57         "赤",
58         "緑",
59         "青",
60         "琥珀色",
61         "灰色",
62         "明青灰色",
63         "紫",
64         "黄",
65         "明るい赤",
66         "明るい緑",
67         "明るい青",
68         "明琥珀色",
69 #else
70         "Dark",
71         "White",
72         "Slate",
73         "Orange",
74         "Red",
75         "Green",
76         "Blue",
77         "Umber",
78         "Light Dark",
79         "Light Slate",
80         "Violet",
81         "Yellow",
82         "Light Red",
83         "Light Green",
84         "Light Blue",
85         "Light Umber",
86 #endif
87
88 };
89
90
91 /*!
92  * @brief サブウィンドウ名称テーブル
93  * @details
94  * <pre>
95  * Certain "screens" always use the main screen, including News, Birth,
96  * Dungeon, Tomb-stone, High-scores, Macros, Colors, Visuals, Options.
97  *
98  * Later, special flags may allow sub-windows to "steal" stuff from the
99  * main window, including File dump (help), File dump (artifacts, uniques),
100  * Character screen, Small scale map, Previous Messages, Store screen, etc.
101  *
102  * The "ctrl-i" (tab) command flips the "Display inven/equip" and "Display
103  * equip/inven" flags for all windows.
104  *
105  * The "ctrl-g" command (or pseudo-command) should perhaps grab a snapshot
106  * of the main screen into any interested windows.
107  * </pre>
108  */
109 const concptr window_flag_desc[32] =
110 {
111         _("持ち物/装備一覧", "Display inven/equip"),
112         _("装備/持ち物一覧", "Display equip/inven"),
113         _("呪文一覧", "Display spell list"),
114         _("キャラクタ情報", "Display character"),
115         _("視界内のモンスター表示", "Display monsters in sight"),
116         NULL,
117         _("メッセージ", "Display messages"),
118         _("ダンジョン全体図", "Display overhead view"),
119         _("モンスターの思い出", "Display monster recall"),
120         _("アイテムの詳細", "Display object recall"),
121         _("自分の周囲を表示", "Display dungeon view"),
122         _("記念撮影", "Display snap-shot"),
123         NULL,
124         NULL,
125         _("ボーグ・メッセージ", "Display borg messages"),
126         _("ボーグ・ステータス", "Display borg status"),
127         NULL,
128         NULL,
129         NULL,
130         NULL,
131         NULL,
132         NULL,
133         NULL,
134         NULL,
135         NULL,
136         NULL,
137         NULL,
138         NULL,
139         NULL,
140         NULL,
141         NULL,
142         NULL
143 };
144
145
146 /*!
147  * @brief シンボル解説テーブル /
148  * The table of "symbol info" -- each entry is a string of the form "X:desc" where "X" is the trigger, and "desc" is the "info".
149  */
150 const concptr ident_info[] =
151 {
152 #ifdef JP
153         " :暗闇",
154         "!:薬, オイル",
155         "\":アミュレット, 頸飾り",
156         "#:壁(隠しドア)/植物/気体",
157         "$:財宝(金か宝石)",
158         "%:鉱脈(溶岩か石英)",
159         "&:箱",
160         "':開いたドア",
161         "(:軟らかい防具",
162         "):盾",
163         "*:財宝を含んだ鉱脈または球形の怪物",
164         "+:閉じたドア",
165         ",:食べ物, おばけキノコ",
166         "-:魔法棒, ロッド",
167         ".:床",
168         "/:竿状武器(アックス/パイク/等)",
169         "0:博物館の入口",
170         "1:雑貨屋の入口",
171         "2:防具屋の入口",
172         "3:武器専門店の入口",
173         "4:寺院の入口",
174         "5:錬金術の店の入口",
175         "6:魔法の店の入口",
176         "7:ブラックマーケットの入口",
177         "8:我が家の入口",
178         "9:書店の入口",
179         "::岩石",
180         ";:回避の彫像/爆発のルーン",
181         "<:上り階段",
182         "=:指輪",
183         ">:下り階段",
184         "?:巻物",
185         "@:プレイヤー",
186         "A:天使",
187         "B:鳥",
188         "C:犬",
189         "D:古代ドラゴン/ワイアーム",
190         "E:エレメンタル",
191         "F:トンボ",
192         "G:ゴースト",
193         "H:雑種",
194         "I:昆虫",
195         "J:ヘビ",
196         "K:キラー・ビートル",
197         "L:リッチ",
198         "M:多首の爬虫類",
199         "N:謎の生物",
200         "O:オーガ",
201         "P:巨大人間型生物",
202         "Q:クイルスルグ(脈打つ肉塊)",
203         "R:爬虫類/両生類",
204         "S:蜘蛛/サソリ/ダニ",
205         "T:トロル",
206         "U:上級デーモン",
207         "V:バンパイア",
208         "W:ワイト/レイス/等",
209         "X:ゾーン/ザレン/等",
210         "Y:イエティ",
211         "Z:ハウンド",
212         "[:堅いアーマー",
213         "\\:鈍器(メイス/ムチ/等)",
214         "]:種々の防具",
215         "^:トラップ",
216         "_:杖",
217         "`:人形,彫像",
218         "a:アリ",
219         "b:コウモリ",
220         "c:ムカデ",
221         "d:ドラゴン",
222         "e:目玉",
223         "f:ネコ",
224         "g:ゴーレム",
225         "h:ホビット/エルフ/ドワーフ",
226         "i:ベトベト",
227         "j:ゼリー",
228         "k:コボルド",
229         "l:水棲生物",
230         "m:モルド",
231         "n:ナーガ",
232         "o:オーク",
233         "p:人間",
234         "q:四足獣",
235         "r:ネズミ",
236         "s:スケルトン",
237         "t:町の人",
238         "u:下級デーモン",
239         "v:ボルテックス",
240         "w:イモムシ/大群",
241         /* "x:unused", */
242         "y:イーク",
243         "z:ゾンビ/ミイラ",
244         "{:飛び道具の弾(矢/弾)",
245         "|:刀剣類(ソード/ダガー/等)",
246         "}:飛び道具(弓/クロスボウ/スリング)",
247         "~:水/溶岩流(種々のアイテム)",
248 #else
249         " :A dark grid",
250         "!:A potion (or oil)",
251         "\":An amulet (or necklace)",
252         "#:A wall (or secret door) / a plant / a gas",
253         "$:Treasure (gold or gems)",
254         "%:A vein (magma or quartz)",
255         "&:A chest",
256         "':An open door",
257         "(:Soft armor",
258         "):A shield",
259         "*:A vein with treasure or a ball monster",
260         "+:A closed door",
261         ",:Food (or mushroom patch)",
262         "-:A wand (or rod)",
263         ".:Floor",
264         "/:A polearm (Axe/Pike/etc)",
265         "0:Entrance to Museum",
266         "1:Entrance to General Store",
267         "2:Entrance to Armory",
268         "3:Entrance to Weaponsmith",
269         "4:Entrance to Temple",
270         "5:Entrance to Alchemy shop",
271         "6:Entrance to Magic store",
272         "7:Entrance to Black Market",
273         "8:Entrance to your home",
274         "9:Entrance to the bookstore",
275         "::Rubble",
276         ";:A glyph of warding / an explosive rune",
277         "<:An up staircase",
278         "=:A ring",
279         ">:A down staircase",
280         "?:A scroll",
281         "@:You",
282         "A:Angel",
283         "B:Bird",
284         "C:Canine",
285         "D:Ancient Dragon/Wyrm",
286         "E:Elemental",
287         "F:Dragon Fly",
288         "G:Ghost",
289         "H:Hybrid",
290         "I:Insect",
291         "J:Snake",
292         "K:Killer Beetle",
293         "L:Lich",
294         "M:Multi-Headed Reptile",
295         "N:Mystery Living",
296         "O:Ogre",
297         "P:Giant Humanoid",
298         "Q:Quylthulg (Pulsing Flesh Mound)",
299         "R:Reptile/Amphibian",
300         "S:Spider/Scorpion/Tick",
301         "T:Troll",
302         "U:Major Demon",
303         "V:Vampire",
304         "W:Wight/Wraith/etc",
305         "X:Xorn/Xaren/etc",
306         "Y:Yeti",
307         "Z:Zephyr Hound",
308         "[:Hard armor",
309         "\\:A hafted weapon (mace/whip/etc)",
310         "]:Misc. armor",
311         "^:A trap",
312         "_:A staff",
313         "`:A figurine or statue",
314         "a:Ant",
315         "b:Bat",
316         "c:Centipede",
317         "d:Dragon",
318         "e:Floating Eye",
319         "f:Feline",
320         "g:Golem",
321         "h:Hobbit/Elf/Dwarf",
322         "i:Icky Thing",
323         "j:Jelly",
324         "k:Kobold",
325         "l:Aquatic monster",
326         "m:Mold",
327         "n:Naga",
328         "o:Orc",
329         "p:Person/Human",
330         "q:Quadruped",
331         "r:Rodent",
332         "s:Skeleton",
333         "t:Townsperson",
334         "u:Minor Demon",
335         "v:Vortex",
336         "w:Worm/Worm-Mass",
337         /* "x:unused", */
338         "y:Yeek",
339         "z:Zombie/Mummy",
340         "{:A missile (arrow/bolt/shot)",
341         "|:An edged weapon (sword/dagger/etc)",
342         "}:A launcher (bow/crossbow/sling)",
343         "~:Fluid terrain (or miscellaneous item)",
344 #endif
345
346         NULL
347 };
348
349 /*!
350  * スクリーン表示色キャラクタ /
351  * Encode the screen colors
352  */
353 const concptr color_char = "dwsorgbuDWvyRGBU";
354
355 /*
356  * Specify attr/char pairs for visual special effects
357  * Be sure to use "index & 0x7F" to avoid illegal access
358  */
359 TERM_COLOR misc_to_attr[256];
360 SYMBOL_CODE misc_to_char[256];
361
362 /*
363  * Specify attr/char pairs for p_ptr->inventory_list items (by tval)
364  * Be sure to use "index & 0x7F" to avoid illegal access
365  */
366 TERM_COLOR tval_to_attr[128];
367 SYMBOL_CODE tval_to_char[128];
368
369 /*
370  * Default spell color table (quark index)
371  */
372 TERM_COLOR gf_color[MAX_GF];
373
374 /*!
375  * @brief 万色表現用にランダムな色を選択する関数 /
376  * Get a legal "multi-hued" color for drawing "spells"
377  * @param max 色IDの最大値
378  * @return 選択した色ID
379  */
380 TERM_COLOR mh_attr(int max)
381 {
382         switch (randint1(max))
383         {
384         case  1: return (TERM_RED);
385         case  2: return (TERM_GREEN);
386         case  3: return (TERM_BLUE);
387         case  4: return (TERM_YELLOW);
388         case  5: return (TERM_ORANGE);
389         case  6: return (TERM_VIOLET);
390         case  7: return (TERM_L_RED);
391         case  8: return (TERM_L_GREEN);
392         case  9: return (TERM_L_BLUE);
393         case 10: return (TERM_UMBER);
394         case 11: return (TERM_L_UMBER);
395         case 12: return (TERM_SLATE);
396         case 13: return (TERM_WHITE);
397         case 14: return (TERM_L_WHITE);
398         case 15: return (TERM_L_DARK);
399         }
400
401         return (TERM_WHITE);
402 }
403
404
405 /*!
406  * @brief 魔法属性に応じたエフェクトの色を返す /
407  * Return a color to use for the bolt/ball spells
408  * @param type 魔法属性
409  * @return 対応する色ID
410  */
411 TERM_COLOR spell_color(EFFECT_ID type)
412 {
413         /* Check if A.B.'s new graphics should be used (rr9) */
414         if (streq(ANGBAND_GRAF, "new") || streq(ANGBAND_GRAF, "ne2"))
415         {
416                 /* Analyze */
417                 switch (type)
418                 {
419                 case GF_PSY_SPEAR:              return (0x06);
420                 case GF_MISSILE:                return (0x0F);
421                 case GF_ACID:                   return (0x04);
422                 case GF_ELEC:                   return (0x02);
423                 case GF_FIRE:                   return (0x00);
424                 case GF_COLD:                   return (0x01);
425                 case GF_POIS:                   return (0x03);
426                 case GF_HOLY_FIRE:              return (0x00);
427                 case GF_HELL_FIRE:              return (0x00);
428                 case GF_MANA:                   return (0x0E);
429                         /* by henkma */
430                 case GF_SEEKER:                 return (0x0E);
431                 case GF_SUPER_RAY:              return (0x0E);
432
433                 case GF_ARROW:                  return (0x0F);
434                 case GF_WATER:                  return (0x04);
435                 case GF_NETHER:                 return (0x07);
436                 case GF_CHAOS:                  return (mh_attr(15));
437                 case GF_DISENCHANT:             return (0x05);
438                 case GF_NEXUS:                  return (0x0C);
439                 case GF_CONFUSION:              return (mh_attr(4));
440                 case GF_SOUND:                  return (0x09);
441                 case GF_SHARDS:                 return (0x08);
442                 case GF_FORCE:                  return (0x09);
443                 case GF_INERTIAL:               return (0x09);
444                 case GF_GRAVITY:                return (0x09);
445                 case GF_TIME:                   return (0x09);
446                 case GF_LITE_WEAK:              return (0x06);
447                 case GF_LITE:                   return (0x06);
448                 case GF_DARK_WEAK:              return (0x07);
449                 case GF_DARK:                   return (0x07);
450                 case GF_PLASMA:                 return (0x0B);
451                 case GF_METEOR:                 return (0x00);
452                 case GF_ICE:                    return (0x01);
453                 case GF_ROCKET:                 return (0x0F);
454                 case GF_DEATH_RAY:              return (0x07);
455                 case GF_NUKE:                   return (mh_attr(2));
456                 case GF_DISINTEGRATE:   return (0x05);
457                 case GF_PSI:
458                 case GF_PSI_DRAIN:
459                 case GF_TELEKINESIS:
460                 case GF_DOMINATION:
461                 case GF_DRAIN_MANA:
462                 case GF_MIND_BLAST:
463                 case GF_BRAIN_SMASH:
464                         return (0x09);
465                 case GF_CAUSE_1:
466                 case GF_CAUSE_2:
467                 case GF_CAUSE_3:
468                 case GF_CAUSE_4:                return (0x0E);
469                 case GF_HAND_DOOM:              return (0x07);
470                 case GF_CAPTURE:                return (0x0E);
471                 case GF_IDENTIFY:               return (0x01);
472                 case GF_ATTACK:                 return (0x0F);
473                 case GF_PHOTO:          return (0x06);
474                 }
475         }
476         /* Normal tiles or ASCII */
477         else
478         {
479                 TERM_COLOR a;
480                 SYMBOL_CODE c;
481
482                 /* Lookup the default colors for this type */
483                 concptr s = quark_str(gf_color[type]);
484
485                 if (!s) return (TERM_WHITE);
486
487                 /* Pick a random color */
488                 c = s[randint0(strlen(s))];
489
490                 /* Lookup this color */
491                 a = my_strchr(color_char, c) - color_char;
492
493                 /* Invalid color (note check for < 0 removed, gave a silly
494                  * warning because bytes are always >= 0 -- RG) */
495                 if (a > 15) return (TERM_WHITE);
496
497                 /* Use this color */
498                 return (a);
499         }
500
501         /* Standard "color" */
502         return (TERM_WHITE);
503 }
504
505
506 /*!
507  * @brief 始点から終点にかけた方向毎にボルトのキャラクタを返す /
508  * Find the attr/char pair to use for a spell effect
509  * @param y 始点Y座標
510  * @param x 始点X座標
511  * @param ny 終点Y座標
512  * @param nx 終点X座標
513  * @param typ 魔法の効果属性
514  * @return 方向キャラID
515  * @details
516  * <pre>
517  * It is moving (or has moved) from (x,y) to (nx,ny).
518  * If the distance is not "one", we (may) return "*".
519  * </pre>
520  */
521 u16b bolt_pict(POSITION y, POSITION x, POSITION ny, POSITION nx, EFFECT_ID typ)
522 {
523         int base;
524
525         byte k;
526
527         TERM_COLOR a;
528         SYMBOL_CODE c;
529
530         /* No motion (*) */
531         if ((ny == y) && (nx == x)) base = 0x30;
532
533         /* Vertical (|) */
534         else if (nx == x) base = 0x40;
535
536         /* Horizontal (-) */
537         else if (ny == y) base = 0x50;
538
539         /* Diagonal (/) */
540         else if ((ny - y) == (x - nx)) base = 0x60;
541
542         /* Diagonal (\) */
543         else if ((ny - y) == (nx - x)) base = 0x70;
544
545         /* Weird (*) */
546         else base = 0x30;
547
548         /* Basic spell color */
549         k = spell_color(typ);
550
551         /* Obtain attr/char */
552         a = misc_to_attr[base + k];
553         c = misc_to_char[base + k];
554
555         /* Create pict */
556         return (PICT(a, c));
557 }
558
559
560
561
562 /*!
563  * @brief シンボル1文字をカラーIDに変更する /
564  * Convert a "color letter" into an "actual" color
565  * The colors are: dwsorgbuDWvyRGBU, as shown below
566  * @param c シンボル文字
567  * @return カラーID
568  */
569 TERM_COLOR color_char_to_attr(SYMBOL_CODE c)
570 {
571         switch (c)
572         {
573         case 'd': return (TERM_DARK);
574         case 'w': return (TERM_WHITE);
575         case 's': return (TERM_SLATE);
576         case 'o': return (TERM_ORANGE);
577         case 'r': return (TERM_RED);
578         case 'g': return (TERM_GREEN);
579         case 'b': return (TERM_BLUE);
580         case 'u': return (TERM_UMBER);
581
582         case 'D': return (TERM_L_DARK);
583         case 'W': return (TERM_L_WHITE);
584         case 'v': return (TERM_VIOLET);
585         case 'y': return (TERM_YELLOW);
586         case 'R': return (TERM_L_RED);
587         case 'G': return (TERM_L_GREEN);
588         case 'B': return (TERM_L_BLUE);
589         case 'U': return (TERM_L_UMBER);
590         }
591
592         return (255);
593 }
594
595