OSDN Git Service

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