OSDN Git Service

a8a10176b044919bd24532e18dbe47bb46c272f8
[hengband/hengband.git] / src / grid / feature.c
1 #include "grid/feature.h"
2 #include "grid/lighting-colors-table.h"
3 #include "util/bit-flags-calculator.h"
4
5 /*** Terrain feature variables ***/
6
7 /* The terrain feature arrays */
8 feature_type *f_info;
9 char *f_name;
10 char *f_tag;
11
12 /* Nothing */
13 FEAT_IDX feat_none;
14
15 /* Floor */
16 FEAT_IDX feat_floor;
17
18 /* Objects */
19 FEAT_IDX feat_glyph;
20 FEAT_IDX feat_explosive_rune;
21 FEAT_IDX feat_mirror;
22
23 /* Stairs */
24 FEAT_IDX feat_up_stair;
25 FEAT_IDX feat_down_stair;
26 FEAT_IDX feat_entrance;
27
28 /* Special traps */
29 FEAT_IDX feat_trap_open;
30 FEAT_IDX feat_trap_armageddon;
31 FEAT_IDX feat_trap_piranha;
32
33 /* Rubble */
34 FEAT_IDX feat_rubble;
35
36 /* Seams */
37 FEAT_IDX feat_magma_vein;
38 FEAT_IDX feat_quartz_vein;
39
40 /* Walls */
41 FEAT_IDX feat_granite;
42 FEAT_IDX feat_permanent;
43
44 /* Glass floor */
45 FEAT_IDX feat_glass_floor;
46
47 /* Glass walls */
48 FEAT_IDX feat_glass_wall;
49 FEAT_IDX feat_permanent_glass_wall;
50
51 /* Pattern */
52 FEAT_IDX feat_pattern_start;
53 FEAT_IDX feat_pattern_1;
54 FEAT_IDX feat_pattern_2;
55 FEAT_IDX feat_pattern_3;
56 FEAT_IDX feat_pattern_4;
57 FEAT_IDX feat_pattern_end;
58 FEAT_IDX feat_pattern_old;
59 FEAT_IDX feat_pattern_exit;
60 FEAT_IDX feat_pattern_corrupted;
61
62 /* Various */
63 FEAT_IDX feat_black_market;
64 FEAT_IDX feat_town;
65
66 /* Terrains */
67 FEAT_IDX feat_deep_water;
68 FEAT_IDX feat_shallow_water;
69 FEAT_IDX feat_deep_lava;
70 FEAT_IDX feat_shallow_lava;
71 FEAT_IDX feat_heavy_cold_zone;
72 FEAT_IDX feat_cold_zone;
73 FEAT_IDX feat_heavy_electrical_zone;
74 FEAT_IDX feat_electrical_zone;
75 FEAT_IDX feat_deep_acid_puddle;
76 FEAT_IDX feat_shallow_acid_puddle;
77 FEAT_IDX feat_deep_poisonous_puddle;
78 FEAT_IDX feat_shallow_poisonous_puddle;
79 FEAT_IDX feat_dirt;
80 FEAT_IDX feat_grass;
81 FEAT_IDX feat_flower;
82 FEAT_IDX feat_brake;
83 FEAT_IDX feat_tree;
84 FEAT_IDX feat_mountain;
85 FEAT_IDX feat_swamp;
86
87 /* Unknown grid (not detected) */
88 FEAT_IDX feat_undetected;
89
90 FEAT_IDX feat_wall_outer;
91 FEAT_IDX feat_wall_inner;
92 FEAT_IDX feat_wall_solid;
93 FEAT_IDX feat_ground_type[100], feat_wall_type[100];
94
95 /*
96  * Maximum number of terrain features in f_info.txt
97  */
98 FEAT_IDX max_f_idx;
99
100 /*!
101  * @brief 地形が罠持ちであるかの判定を行う。 / Return TRUE if the given feature is a trap
102  * @param feat 地形情報のID
103  * @return 罠持ちの地形ならばTRUEを返す。
104  */
105 bool is_trap(player_type *player_ptr, FEAT_IDX feat)
106 {
107         /* 関数ポインタの都合 */
108         (void)player_ptr;
109         return have_flag(f_info[feat].flags, FF_TRAP);
110 }
111
112 /*!
113  * @brief 地形が閉じたドアであるかの判定を行う。 / Return TRUE if the given grid is a closed door
114  * @param feat 地形情報のID
115  * @return 閉じたドアのある地形ならばTRUEを返す。
116  */
117 bool is_closed_door(player_type *player_ptr, FEAT_IDX feat)
118 {
119         /* 関数ポインタの都合 */
120         (void)player_ptr;
121         feature_type *f_ptr = &f_info[feat];
122
123         return (have_flag(f_ptr->flags, FF_OPEN) || have_flag(f_ptr->flags, FF_BASH)) &&
124                 !have_flag(f_ptr->flags, FF_MOVE);
125 }
126
127 /*!
128  * @brief 調査中
129  * @todo コメントを付加すること
130  */
131 void apply_default_feat_lighting(TERM_COLOR *f_attr, SYMBOL_CODE *f_char)
132 {
133     TERM_COLOR s_attr = f_attr[F_LIT_STANDARD];
134     SYMBOL_CODE s_char = f_char[F_LIT_STANDARD];
135
136     if (is_ascii_graphics(s_attr)) /* For ASCII */
137     {
138         f_attr[F_LIT_LITE] = lighting_colours[s_attr & 0x0f][0];
139         f_attr[F_LIT_DARK] = lighting_colours[s_attr & 0x0f][1];
140         for (int i = F_LIT_NS_BEGIN; i < F_LIT_MAX; i++)
141             f_char[i] = s_char;
142     } else /* For tile graphics */
143     {
144         for (int i = F_LIT_NS_BEGIN; i < F_LIT_MAX; i++)
145             f_attr[i] = s_attr;
146         f_char[F_LIT_LITE] = s_char + 2;
147         f_char[F_LIT_DARK] = s_char + 1;
148     }
149 }
150
151 /*
152  * Not using graphical tiles for this feature?
153  */
154 bool is_ascii_graphics(char x) { return (x & 0x80) == 0; }
155
156 /*
157  * Determine if a "feature" is "permanent wall"
158  */
159 bool permanent_wall(feature_type *f_ptr) { return have_flag(f_ptr->flags, FF_WALL) && have_flag(f_ptr->flags, FF_PERMANENT); }