Go to the documentation of this file.00001
00002
00003
00004
00005
00006 #ifndef DISPLAY_H
00007 #define DISPLAY_H
00008
00009 #ifndef VISION_H
00010 #include "vision.h"
00011 #endif
00012
00013 #ifndef MONDATA_H
00014 #include "mondata.h"
00015 #endif
00016
00017 #ifndef INVISIBLE_OBJECTS
00018 #define vobj_at(x,y) (level.objects[x][y])
00019 #endif
00020
00021
00022
00023
00024
00025
00026
00027 #define tp_sensemon(mon) ( \
00028 (!mindless(mon->data) && \
00029 (!which_armor(mon, W_ARMH) || which_armor(mon, W_ARMH)->otyp != TINFOIL_HAT)) && \
00030 ((Blind && Blind_telepat) || \
00031 \
00032 \
00033 \
00034 (Unblind_telepat && \
00035 (distu(mon->mx, mon->my) <= (BOLT_LIM * BOLT_LIM)))) \
00036 )
00037
00038 #define sensemon(mon) (tp_sensemon(mon) || Detect_monsters || MATCH_WARN_OF_MON(mon))
00039
00040
00041
00042
00043
00044
00045 #define mon_warning(mon) (Warning && !(mon)->mpeaceful && \
00046 (distu((mon)->mx, (mon)->my) < 100) && \
00047 (((int) ((mon)->m_lev / 4)) >= flags.warnlevel))
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057 #define mon_visible(mon) ( \
00058 \
00059 (!mon->minvis || See_invisible) && \
00060 (!mon->mundetected) && \
00061 (!(mon->mburied || u.uburied)) \
00062 )
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072 #define see_with_infrared(mon) (!Blind && Infravision && infravisible(mon->data) && couldsee(mon->mx, mon->my))
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082 #define canseemon(mon) ((mon->wormno ? worm_known(mon) : \
00083 (cansee(mon->mx, mon->my) || see_with_infrared(mon))) \
00084 && mon_visible(mon))
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094 #define canspotmon(mon) \
00095 (canseemon(mon) || sensemon(mon))
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108 #define knowninvisible(mon) \
00109 (mtmp->minvis && \
00110 ((cansee(mon->mx, mon->my) && (See_invisible || Detect_monsters)) || \
00111 (!Blind && (HTelepat & ~INTRINSIC) && \
00112 distu(mon->mx, mon->my) <= (BOLT_LIM * BOLT_LIM) \
00113 ) \
00114 ) \
00115 )
00116
00117
00118
00119
00120
00121
00122
00123 #define is_safepet(mon) \
00124 (mon && mon->mtame && canspotmon(mon) && flags.safe_dog \
00125 && !Confusion && !Hallucination && !Stunned)
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137 #define canseeself() (Blind || u.uswallow || (!Invisible && !u.uundetected))
00138 #define senseself() (canseeself() || Unblind_telepat || Detect_monsters)
00139
00140
00141
00142
00143
00144
00145
00146
00147 #define random_monster() rn2(NUMMONS)
00148 #define random_object() rn1(NUM_OBJECTS-1,1)
00149 #define random_trap() rn1(TRAPNUM-1,1)
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159 #define what_obj(obj) (Hallucination ? random_object() : obj)
00160 #define what_mon(mon) (Hallucination ? random_monster() : mon)
00161 #define what_trap(trp) (Hallucination ? random_trap() : trp)
00162
00163
00164
00165
00166
00167
00168
00169
00170 #define covers_objects(xx,yy) \
00171 ((is_pool(xx,yy) && !Underwater) || (levl[xx][yy].typ == LAVAPOOL))
00172
00173 #define covers_traps(xx,yy) covers_objects(xx,yy)
00174
00175
00176
00177
00178
00179 #define DISP_BEAM (-1)
00180 #define DISP_FLASH (-2)
00181 #define DISP_ALWAYS (-3)
00182 #define DISP_CHANGE (-4)
00183 #define DISP_END (-5)
00184 #define DISP_FREEMEM (-6)
00185
00186
00187
00188 #define SHIELD_COUNT 21
00189
00190
00191
00192
00193
00194
00195
00196
00197 #ifdef STEED
00198 #define maybe_display_usteed (u.usteed && mon_visible(u.usteed)) ? \
00199 ridden_mon_to_glyph(u.usteed) :
00200 #else
00201 #define maybe_display_usteed
00202 #endif
00203
00204 #define display_self() \
00205 show_glyph(u.ux, u.uy, \
00206 maybe_display_usteed \
00207 youmonst.m_ap_type == M_AP_NOTHING ? \
00208 hero_glyph : \
00209 youmonst.m_ap_type == M_AP_FURNITURE ? \
00210 cmap_to_glyph(youmonst.mappearance) : \
00211 youmonst.m_ap_type == M_AP_OBJECT ? \
00212 objnum_to_glyph(youmonst.mappearance) : \
00213 monnum_to_glyph(youmonst.mappearance))
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263 #define NUM_ZAP 8
00264
00265 #define GLYPH_MON_OFF 0
00266 #define GLYPH_PET_OFF (NUMMONS + GLYPH_MON_OFF)
00267 #define GLYPH_INVIS_OFF (NUMMONS + GLYPH_PET_OFF)
00268 #define GLYPH_DETECT_OFF (1 + GLYPH_INVIS_OFF)
00269 #define GLYPH_BODY_OFF (NUMMONS + GLYPH_DETECT_OFF)
00270 #define GLYPH_RIDDEN_OFF (NUMMONS + GLYPH_BODY_OFF)
00271 #define GLYPH_OBJ_OFF (NUMMONS + GLYPH_RIDDEN_OFF)
00272 #define GLYPH_CMAP_OFF (NUM_OBJECTS + GLYPH_OBJ_OFF)
00273 #define GLYPH_EXPLODE_OFF ((MAXPCHARS - MAXEXPCHARS) + GLYPH_CMAP_OFF)
00274 #define GLYPH_ZAP_OFF ((MAXEXPCHARS * EXPL_MAX) + GLYPH_EXPLODE_OFF)
00275 #define GLYPH_SWALLOW_OFF ((NUM_ZAP << 2) + GLYPH_ZAP_OFF)
00276 #define GLYPH_WARNING_OFF ((NUMMONS << 3) + GLYPH_SWALLOW_OFF)
00277 #define MAX_GLYPH (WARNCOUNT + GLYPH_WARNING_OFF)
00278
00279 #define NO_GLYPH MAX_GLYPH
00280
00281 #define GLYPH_INVISIBLE GLYPH_INVIS_OFF
00282
00283 #define warning_to_glyph(mwarnlev) ((mwarnlev)+GLYPH_WARNING_OFF)
00284 #define mon_to_glyph(mon) ((int) what_mon(monsndx((mon)->data))+GLYPH_MON_OFF)
00285 #define detected_mon_to_glyph(mon) ((int) what_mon(monsndx((mon)->data))+GLYPH_DETECT_OFF)
00286 #define ridden_mon_to_glyph(mon) ((int) what_mon(monsndx((mon)->data))+GLYPH_RIDDEN_OFF)
00287 #define pet_to_glyph(mon) ((int) what_mon(monsndx((mon)->data))+GLYPH_PET_OFF)
00288
00289
00290
00291 #define obj_to_glyph(obj) \
00292 (Hallucination ? \
00293 ((otg_temp = random_object()) == CORPSE ? \
00294 random_monster() + GLYPH_BODY_OFF : \
00295 otg_temp + GLYPH_OBJ_OFF) : \
00296 ((obj)->otyp == CORPSE ? \
00297 (int) (obj)->corpsenm + GLYPH_BODY_OFF : \
00298 (int) (obj)->otyp + GLYPH_OBJ_OFF))
00299
00300 #define cmap_to_glyph(cmap_idx) ((int) (cmap_idx) + GLYPH_CMAP_OFF)
00301 #define explosion_to_glyph(expltype,idx) \
00302 ((((expltype) * MAXEXPCHARS) + ((idx) - S_explode1)) + GLYPH_EXPLODE_OFF)
00303
00304 #define trap_to_glyph(trap) \
00305 cmap_to_glyph(trap_to_defsym(what_trap((trap)->ttyp)))
00306
00307
00308 #define objnum_to_glyph(onum) ((int) (onum) + GLYPH_OBJ_OFF)
00309 #define monnum_to_glyph(mnum) ((int) (mnum) + GLYPH_MON_OFF)
00310 #define detected_monnum_to_glyph(mnum) ((int) (mnum) + GLYPH_DETECT_OFF)
00311 #define ridden_monnum_to_glyph(mnum) ((int) (mnum) + GLYPH_RIDDEN_OFF)
00312 #define petnum_to_glyph(mnum) ((int) (mnum) + GLYPH_PET_OFF)
00313
00314
00315
00316 #define hero_glyph \
00317 monnum_to_glyph((Upolyd || !iflags.showrace) ? u.umonnum : \
00318 (flags.female && urace.femalenum != NON_PM) ? urace.femalenum : \
00319 urace.malenum)
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334 #define glyph_to_mon(glyph) \
00335 (glyph_is_normal_monster(glyph) ? ((glyph)-GLYPH_MON_OFF) : \
00336 glyph_is_pet(glyph) ? ((glyph)-GLYPH_PET_OFF) : \
00337 glyph_is_detected_monster(glyph) ? ((glyph)-GLYPH_DETECT_OFF) : \
00338 glyph_is_ridden_monster(glyph) ? ((glyph)-GLYPH_RIDDEN_OFF) : \
00339 NO_GLYPH)
00340 #define glyph_to_obj(glyph) \
00341 (glyph_is_body(glyph) ? CORPSE : \
00342 glyph_is_normal_object(glyph) ? ((glyph)-GLYPH_OBJ_OFF) : \
00343 NO_GLYPH)
00344 #define glyph_to_trap(glyph) \
00345 (glyph_is_trap(glyph) ? \
00346 ((int) defsym_to_trap((glyph) - GLYPH_CMAP_OFF)) : \
00347 NO_GLYPH)
00348 #define glyph_to_cmap(glyph) \
00349 (glyph_is_cmap(glyph) ? ((glyph) - GLYPH_CMAP_OFF) : \
00350 NO_GLYPH)
00351 #define glyph_to_swallow(glyph) \
00352 (glyph_is_swallow(glyph) ? (((glyph) - GLYPH_SWALLOW_OFF) & 0x7) : \
00353 0)
00354 #define glyph_to_warning(glyph) \
00355 (glyph_is_warning(glyph) ? ((glyph) - GLYPH_WARNING_OFF) : \
00356 NO_GLYPH);
00357
00358
00359
00360
00361
00362 #define glyph_is_monster(glyph) \
00363 (glyph_is_normal_monster(glyph) \
00364 || glyph_is_pet(glyph) \
00365 || glyph_is_ridden_monster(glyph) \
00366 || glyph_is_detected_monster(glyph))
00367 #define glyph_is_normal_monster(glyph) \
00368 ((glyph) >= GLYPH_MON_OFF && (glyph) < (GLYPH_MON_OFF+NUMMONS))
00369 #define glyph_is_pet(glyph) \
00370 ((glyph) >= GLYPH_PET_OFF && (glyph) < (GLYPH_PET_OFF+NUMMONS))
00371 #define glyph_is_body(glyph) \
00372 ((glyph) >= GLYPH_BODY_OFF && (glyph) < (GLYPH_BODY_OFF+NUMMONS))
00373 #define glyph_is_ridden_monster(glyph) \
00374 ((glyph) >= GLYPH_RIDDEN_OFF && (glyph) < (GLYPH_RIDDEN_OFF+NUMMONS))
00375 #define glyph_is_detected_monster(glyph) \
00376 ((glyph) >= GLYPH_DETECT_OFF && (glyph) < (GLYPH_DETECT_OFF+NUMMONS))
00377 #define glyph_is_invisible(glyph) ((glyph) == GLYPH_INVISIBLE)
00378 #define glyph_is_normal_object(glyph) \
00379 ((glyph) >= GLYPH_OBJ_OFF && (glyph) < (GLYPH_OBJ_OFF+NUM_OBJECTS))
00380 #define glyph_is_object(glyph) \
00381 (glyph_is_normal_object(glyph) \
00382 || glyph_is_body(glyph))
00383 #define glyph_is_trap(glyph) \
00384 ((glyph) >= (GLYPH_CMAP_OFF+trap_to_defsym(1)) && \
00385 (glyph) < (GLYPH_CMAP_OFF+trap_to_defsym(1)+TRAPNUM))
00386 #define glyph_is_cmap(glyph) \
00387 ((glyph) >= GLYPH_CMAP_OFF && (glyph) < (GLYPH_CMAP_OFF+MAXPCHARS))
00388 #define glyph_is_swallow(glyph) \
00389 ((glyph) >= GLYPH_SWALLOW_OFF && (glyph) < (GLYPH_SWALLOW_OFF+(NUMMONS << 3)))
00390 #define glyph_is_warning(glyph) \
00391 ((glyph) >= GLYPH_WARNING_OFF && (glyph) < (GLYPH_WARNING_OFF + WARNCOUNT))
00392 #endif