OSDN Git Service

[fix] #40282 コンフリクト解決残しを修正. / Resolve conflicts left behind.
[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         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         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  * The array of window pointers
351  */
352 term *angband_term[8];
353
354 /*!
355  * スクリーン表示色キャラクタ /
356  * Encode the screen colors
357  */
358 const concptr color_char = "dwsorgbuDWvyRGBU";
359
360 /*
361  * Specify attr/char pairs for visual special effects
362  * Be sure to use "index & 0x7F" to avoid illegal access
363  */
364 TERM_COLOR misc_to_attr[256];
365 SYMBOL_CODE misc_to_char[256];
366
367 /*
368  * Specify attr/char pairs for inventory items (by tval)
369  * Be sure to use "index & 0x7F" to avoid illegal access
370  */
371 TERM_COLOR tval_to_attr[128];
372 SYMBOL_CODE tval_to_char[128];
373
374 /*
375  * Default spell color table (quark index)
376  */
377 TERM_COLOR gf_color[MAX_GF];
378
379 /*!
380  * @brief 万色表現用にランダムな色を選択する関数 /
381  * Get a legal "multi-hued" color for drawing "spells"
382  * @param max 色IDの最大値
383  * @return 選択した色ID
384  */
385 TERM_COLOR mh_attr(int max)
386 {
387         switch (randint1(max))
388         {
389         case  1: return (TERM_RED);
390         case  2: return (TERM_GREEN);
391         case  3: return (TERM_BLUE);
392         case  4: return (TERM_YELLOW);
393         case  5: return (TERM_ORANGE);
394         case  6: return (TERM_VIOLET);
395         case  7: return (TERM_L_RED);
396         case  8: return (TERM_L_GREEN);
397         case  9: return (TERM_L_BLUE);
398         case 10: return (TERM_UMBER);
399         case 11: return (TERM_L_UMBER);
400         case 12: return (TERM_SLATE);
401         case 13: return (TERM_WHITE);
402         case 14: return (TERM_L_WHITE);
403         case 15: return (TERM_L_DARK);
404         }
405
406         return (TERM_WHITE);
407 }
408
409
410 /*!
411  * @brief 魔法属性に応じたエフェクトの色を返す /
412  * Return a color to use for the bolt/ball spells
413  * @param type 魔法属性
414  * @return 対応する色ID
415  */
416 TERM_COLOR spell_color(EFFECT_ID type)
417 {
418         /* Check if A.B.'s new graphics should be used (rr9) */
419         if (streq(ANGBAND_GRAF, "new") || streq(ANGBAND_GRAF, "ne2"))
420         {
421                 /* Analyze */
422                 switch (type)
423                 {
424                 case GF_PSY_SPEAR:              return (0x06);
425                 case GF_MISSILE:                return (0x0F);
426                 case GF_ACID:                   return (0x04);
427                 case GF_ELEC:                   return (0x02);
428                 case GF_FIRE:                   return (0x00);
429                 case GF_COLD:                   return (0x01);
430                 case GF_POIS:                   return (0x03);
431                 case GF_HOLY_FIRE:              return (0x00);
432                 case GF_HELL_FIRE:              return (0x00);
433                 case GF_MANA:                   return (0x0E);
434                         /* by henkma */
435                 case GF_SEEKER:                 return (0x0E);
436                 case GF_SUPER_RAY:              return (0x0E);
437
438                 case GF_ARROW:                  return (0x0F);
439                 case GF_WATER:                  return (0x04);
440                 case GF_NETHER:                 return (0x07);
441                 case GF_CHAOS:                  return (mh_attr(15));
442                 case GF_DISENCHANT:             return (0x05);
443                 case GF_NEXUS:                  return (0x0C);
444                 case GF_CONFUSION:              return (mh_attr(4));
445                 case GF_SOUND:                  return (0x09);
446                 case GF_SHARDS:                 return (0x08);
447                 case GF_FORCE:                  return (0x09);
448                 case GF_INERTIAL:               return (0x09);
449                 case GF_GRAVITY:                return (0x09);
450                 case GF_TIME:                   return (0x09);
451                 case GF_LITE_WEAK:              return (0x06);
452                 case GF_LITE:                   return (0x06);
453                 case GF_DARK_WEAK:              return (0x07);
454                 case GF_DARK:                   return (0x07);
455                 case GF_PLASMA:                 return (0x0B);
456                 case GF_METEOR:                 return (0x00);
457                 case GF_ICE:                    return (0x01);
458                 case GF_ROCKET:                 return (0x0F);
459                 case GF_DEATH_RAY:              return (0x07);
460                 case GF_NUKE:                   return (mh_attr(2));
461                 case GF_DISINTEGRATE:   return (0x05);
462                 case GF_PSI:
463                 case GF_PSI_DRAIN:
464                 case GF_TELEKINESIS:
465                 case GF_DOMINATION:
466                 case GF_DRAIN_MANA:
467                 case GF_MIND_BLAST:
468                 case GF_BRAIN_SMASH:
469                         return (0x09);
470                 case GF_CAUSE_1:
471                 case GF_CAUSE_2:
472                 case GF_CAUSE_3:
473                 case GF_CAUSE_4:                return (0x0E);
474                 case GF_HAND_DOOM:              return (0x07);
475                 case GF_CAPTURE:                return (0x0E);
476                 case GF_IDENTIFY:               return (0x01);
477                 case GF_ATTACK:                 return (0x0F);
478                 case GF_PHOTO:          return (0x06);
479                 }
480         }
481         /* Normal tiles or ASCII */
482         else
483         {
484                 TERM_COLOR a;
485                 SYMBOL_CODE c;
486
487                 /* Lookup the default colors for this type */
488                 concptr s = quark_str(gf_color[type]);
489
490                 if (!s) return (TERM_WHITE);
491
492                 /* Pick a random color */
493                 c = s[randint0(strlen(s))];
494
495                 /* Lookup this color */
496                 a = my_strchr(color_char, c) - color_char;
497
498                 /* Invalid color (note check for < 0 removed, gave a silly
499                  * warning because bytes are always >= 0 -- RG) */
500                 if (a > 15) return (TERM_WHITE);
501
502                 /* Use this color */
503                 return (a);
504         }
505
506         /* Standard "color" */
507         return (TERM_WHITE);
508 }
509
510
511 /*!
512  * @brief 始点から終点にかけた方向毎にボルトのキャラクタを返す /
513  * Find the attr/char pair to use for a spell effect
514  * @param y 始点Y座標
515  * @param x 始点X座標
516  * @param ny 終点Y座標
517  * @param nx 終点X座標
518  * @param typ 魔法の効果属性
519  * @return 方向キャラID
520  * @details
521  * <pre>
522  * It is moving (or has moved) from (x,y) to (nx,ny).
523  * If the distance is not "one", we (may) return "*".
524  * </pre>
525  */
526 u16b bolt_pict(POSITION y, POSITION x, POSITION ny, POSITION nx, EFFECT_ID typ)
527 {
528         int base;
529
530         byte k;
531
532         TERM_COLOR a;
533         SYMBOL_CODE c;
534
535         /* No motion (*) */
536         if ((ny == y) && (nx == x)) base = 0x30;
537
538         /* Vertical (|) */
539         else if (nx == x) base = 0x40;
540
541         /* Horizontal (-) */
542         else if (ny == y) base = 0x50;
543
544         /* Diagonal (/) */
545         else if ((ny - y) == (x - nx)) base = 0x60;
546
547         /* Diagonal (\) */
548         else if ((ny - y) == (nx - x)) base = 0x70;
549
550         /* Weird (*) */
551         else base = 0x30;
552
553         /* Basic spell color */
554         k = spell_color(typ);
555
556         /* Obtain attr/char */
557         a = misc_to_attr[base + k];
558         c = misc_to_char[base + k];
559
560         /* Create pict */
561         return (PICT(a, c));
562 }
563
564
565
566
567 /*!
568  * @brief シンボル1文字をカラーIDに変更する /
569  * Convert a "color letter" into an "actual" color
570  * The colors are: dwsorgbuDWvyRGBU, as shown below
571  * @param c シンボル文字
572  * @return カラーID
573  */
574 TERM_COLOR color_char_to_attr(SYMBOL_CODE c)
575 {
576         switch (c)
577         {
578         case 'd': return (TERM_DARK);
579         case 'w': return (TERM_WHITE);
580         case 's': return (TERM_SLATE);
581         case 'o': return (TERM_ORANGE);
582         case 'r': return (TERM_RED);
583         case 'g': return (TERM_GREEN);
584         case 'b': return (TERM_BLUE);
585         case 'u': return (TERM_UMBER);
586
587         case 'D': return (TERM_L_DARK);
588         case 'W': return (TERM_L_WHITE);
589         case 'v': return (TERM_VIOLET);
590         case 'y': return (TERM_YELLOW);
591         case 'R': return (TERM_L_RED);
592         case 'G': return (TERM_L_GREEN);
593         case 'B': return (TERM_L_BLUE);
594         case 'U': return (TERM_L_UMBER);
595         }
596
597         return (255);
598 }
599
600