00001
00002
00003
00004
00005 #ifndef RM_H
00006 #define RM_H
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #define STONE 0
00034 #define VWALL 1
00035 #define HWALL 2
00036 #define TLCORNER 3
00037 #define TRCORNER 4
00038 #define BLCORNER 5
00039 #define BRCORNER 6
00040 #define CROSSWALL 7
00041 #define TUWALL 8
00042 #define TDWALL 9
00043 #define TLWALL 10
00044 #define TRWALL 11
00045 #define DBWALL 12
00046 #define TREE 13
00047 #define SDOOR 14
00048 #define SCORR 15
00049 #define POOL 16
00050 #define MOAT 17
00051 #define WATER 18
00052 #define DRAWBRIDGE_UP 19
00053 #define LAVAPOOL 20
00054 #define IRONBARS 21
00055 #define DOOR 22
00056 #define CORR 23
00057 #define ROOM 24
00058 #define STAIRS 25
00059 #define LADDER 26
00060 #define FOUNTAIN 27
00061 #define THRONE 28
00062 #define SINK 29
00063 #define GRAVE 30
00064 #define ALTAR 31
00065 #define ICE 32
00066 #define DRAWBRIDGE_DOWN 33
00067 #define AIR 34
00068 #define CLOUD 35
00069
00070 #define MAX_TYPE 36
00071 #define INVALID_TYPE 127
00072
00073
00074
00075
00076
00077
00078 #define IS_WALL(typ) ((typ) && (typ) <= DBWALL)
00079 #define IS_STWALL(typ) ((typ) <= DBWALL)
00080 #define IS_ROCK(typ) ((typ) < POOL)
00081 #define IS_DOOR(typ) ((typ) == DOOR)
00082 #define IS_TREE(typ) ((typ) == TREE || \
00083 (level.flags.arboreal && (typ) == STONE))
00084 #define ACCESSIBLE(typ) ((typ) >= DOOR)
00085 #define IS_ROOM(typ) ((typ) >= ROOM)
00086 #define ZAP_POS(typ) ((typ) >= POOL)
00087 #define SPACE_POS(typ) ((typ) > DOOR)
00088 #define IS_POOL(typ) ((typ) >= POOL && (typ) <= DRAWBRIDGE_UP)
00089 #define IS_THRONE(typ) ((typ) == THRONE)
00090 #define IS_FOUNTAIN(typ) ((typ) == FOUNTAIN)
00091 #define IS_SINK(typ) ((typ) == SINK)
00092 #define IS_GRAVE(typ) ((typ) == GRAVE)
00093 #define IS_ALTAR(typ) ((typ) == ALTAR)
00094 #define IS_DRAWBRIDGE(typ) ((typ) == DRAWBRIDGE_UP || (typ) == DRAWBRIDGE_DOWN)
00095 #define IS_FURNITURE(typ) ((typ) >= STAIRS && (typ) <= ALTAR)
00096 #define IS_AIR(typ) ((typ) == AIR || (typ) == CLOUD)
00097 #define IS_SOFT(typ) ((typ) == AIR || (typ) == CLOUD || IS_POOL(typ))
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107 #define S_stone 0
00108 #define S_vwall 1
00109 #define S_hwall 2
00110 #define S_tlcorn 3
00111 #define S_trcorn 4
00112 #define S_blcorn 5
00113 #define S_brcorn 6
00114 #define S_crwall 7
00115 #define S_tuwall 8
00116 #define S_tdwall 9
00117 #define S_tlwall 10
00118 #define S_trwall 11
00119 #define S_ndoor 12
00120 #define S_vodoor 13
00121 #define S_hodoor 14
00122 #define S_vcdoor 15
00123 #define S_hcdoor 16
00124 #define S_bars 17
00125 #define S_tree 18
00126 #define S_room 19
00127 #define S_darkroom 20
00128 #define S_corr 21
00129 #define S_litcorr 22
00130 #define S_upstair 23
00131 #define S_dnstair 24
00132 #define S_upladder 25
00133 #define S_dnladder 26
00134 #define S_altar 27
00135 #define S_grave 28
00136 #define S_throne 29
00137 #define S_sink 30
00138 #define S_fountain 31
00139 #define S_pool 32
00140 #define S_ice 33
00141 #define S_lava 34
00142 #define S_vodbridge 35
00143 #define S_hodbridge 36
00144 #define S_vcdbridge 37
00145 #define S_hcdbridge 38
00146 #define S_air 39
00147 #define S_cloud 40
00148 #define S_water 41
00149
00150
00151
00152 #define S_arrow_trap 42
00153 #define S_dart_trap 43
00154 #define S_falling_rock_trap 44
00155 #define S_squeaky_board 45
00156 #define S_bear_trap 46
00157 #define S_land_mine 47
00158 #define S_rolling_boulder_trap 48
00159 #define S_sleeping_gas_trap 49
00160 #define S_rust_trap 50
00161 #define S_fire_trap 51
00162 #define S_pit 52
00163 #define S_spiked_pit 53
00164 #define S_hole 54
00165 #define S_trap_door 55
00166 #define S_teleportation_trap 56
00167 #define S_level_teleporter 57
00168 #define S_magic_portal 58
00169 #define S_web 59
00170 #define S_statue_trap 60
00171 #define S_magic_trap 61
00172 #define S_anti_magic_trap 62
00173 #define S_polymorph_trap 63
00174
00175
00176
00177 #define S_vbeam 64
00178 #define S_hbeam 65
00179 #define S_lslant 66
00180 #define S_rslant 67
00181 #define S_digbeam 68
00182 #define S_flashbeam 69
00183 #define S_boomleft 70
00184 #define S_boomright 71
00185 #define S_ss1 72
00186 #define S_ss2 73
00187 #define S_ss3 74
00188 #define S_ss4 75
00189
00190
00191
00192 #define S_sw_tl 76
00193 #define S_sw_tc 77
00194 #define S_sw_tr 78
00195 #define S_sw_ml 79
00196 #define S_sw_mr 80
00197 #define S_sw_bl 81
00198 #define S_sw_bc 82
00199 #define S_sw_br 83
00200
00201 #define S_explode1 84
00202 #define S_explode2 85
00203 #define S_explode3 86
00204 #define S_explode4 87
00205 #define S_explode5 88
00206 #define S_explode6 89
00207 #define S_explode7 90
00208 #define S_explode8 91
00209 #define S_explode9 92
00210
00211
00212
00213 #define MAXPCHARS 93
00214 #define MAXDCHARS 42
00215 #define MAXTCHARS 22
00216 #define MAXECHARS 29
00217 #define MAXEXPCHARS 9
00218
00219 struct symdef {
00220 uchar sym;
00221 const char *explanation;
00222 #ifdef TEXTCOLOR
00223 uchar color;
00224 #endif
00225 };
00226
00227 extern struct symdef defsyms[MAXPCHARS];
00228 extern uchar showsyms[MAXPCHARS];
00229 extern const struct symdef def_warnsyms[WARNCOUNT];
00230
00231
00232
00233
00234 #define ASCII_GRAPHICS 0
00235 #define IBM_GRAPHICS 1
00236 #define DEC_GRAPHICS 2
00237 #define MAC_GRAPHICS 3
00238 #define CURS_GRAPHICS 4
00239
00240
00241
00242
00243
00244 #define D_NODOOR 0
00245 #define D_BROKEN 1
00246 #define D_ISOPEN 2
00247 #define D_CLOSED 4
00248 #define D_LOCKED 8
00249 #define D_TRAPPED 16
00250 #define D_SECRET 32
00251
00252
00253
00254
00255 #define AM_SHRINE 8
00256
00257
00258
00259
00260 #define T_LOOTED 1
00261
00262
00263
00264
00265 #define TREE_LOOTED 1
00266 #define TREE_SWARM 2
00267
00268
00269
00270
00271 #define F_LOOTED 1
00272 #define F_WARNED 2
00273 #define FOUNTAIN_IS_WARNED(x,y) (levl[x][y].looted & F_WARNED)
00274 #define FOUNTAIN_IS_LOOTED(x,y) (levl[x][y].looted & F_LOOTED)
00275 #define SET_FOUNTAIN_WARNED(x,y) levl[x][y].looted |= F_WARNED;
00276 #define SET_FOUNTAIN_LOOTED(x,y) levl[x][y].looted |= F_LOOTED;
00277 #define CLEAR_FOUNTAIN_WARNED(x,y) levl[x][y].looted &= ~F_WARNED;
00278 #define CLEAR_FOUNTAIN_LOOTED(x,y) levl[x][y].looted &= ~F_LOOTED;
00279
00280
00281
00282
00283
00284
00285 #define D_WARNED 16
00286
00287
00288
00289
00290 #define S_LPUDDING 1
00291 #define S_LDWASHER 2
00292 #define S_LRING 4
00293
00294
00295
00296
00297 #define DB_NORTH 0
00298 #define DB_SOUTH 1
00299 #define DB_EAST 2
00300 #define DB_WEST 3
00301 #define DB_DIR 3
00302
00303
00304
00305
00306 #define DB_MOAT 0
00307 #define DB_LAVA 4
00308 #define DB_ICE 8
00309 #define DB_FLOOR 16
00310 #define DB_UNDER 28
00311
00312
00313
00314
00315 #define WM_MASK 0x07
00316 #define W_NONDIGGABLE 0x08
00317 #define W_NONPASSWALL 0x10
00318
00319
00320
00321
00322 #define LA_UP 1
00323 #define LA_DOWN 2
00324
00325
00326
00327
00328 #define ICED_POOL 8
00329 #define ICED_MOAT 16
00330
00331
00332
00333
00334
00335
00336 struct rm {
00337 int glyph;
00338 schar typ;
00339 Bitfield(styp, 6);
00340 uchar seenv;
00341 Bitfield(flags,5);
00342 Bitfield(horizontal,1);
00343 Bitfield(lit,1);
00344 Bitfield(waslit,1);
00345 Bitfield(roomno,6);
00346 Bitfield(edge,1);
00347 };
00348
00349
00350 #define SET_TYPLIT(x,y,ttyp,llit) \
00351 { \
00352 if ((ttyp) < MAX_TYPE) levl[(x)][(y)].typ = (ttyp); \
00353 if ((ttyp) == LAVAPOOL) levl[(x)][(y)].lit = 1; \
00354 else if ((schar)(llit) != -2) { \
00355 if ((schar)(llit) == -1) levl[(x)][(y)].lit = rn2(2); \
00356 else levl[(x)][(y)].lit = (llit); \
00357 } \
00358 }
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398 #define WM_W_LEFT 1
00399 #define WM_W_RIGHT 2
00400 #define WM_W_TOP WM_W_LEFT
00401 #define WM_W_BOTTOM WM_W_RIGHT
00402
00403 #define WM_C_OUTER 1
00404 #define WM_C_INNER 2
00405
00406 #define WM_T_LONG 1
00407 #define WM_T_BL 2
00408 #define WM_T_BR 3
00409
00410 #define WM_X_TL 1
00411 #define WM_X_TR 2
00412 #define WM_X_BL 3
00413 #define WM_X_BR 4
00414 #define WM_X_TLBR 5
00415 #define WM_X_BLTR 6
00416
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426
00427
00428
00429 #define SV0 0x1
00430 #define SV1 0x2
00431 #define SV2 0x4
00432 #define SV3 0x8
00433 #define SV4 0x10
00434 #define SV5 0x20
00435 #define SV6 0x40
00436 #define SV7 0x80
00437 #define SVALL 0xFF
00438
00439
00440
00441 #define doormask flags
00442 #define altarmask flags
00443 #define wall_info flags
00444 #define ladder flags
00445 #define drawbridgemask flags
00446 #define looted flags
00447 #define icedpool flags
00448
00449 #define blessedftn horizontal
00450 #define disturbed horizontal
00451
00452 struct damage {
00453 struct damage *next;
00454 long when, cost;
00455 coord place;
00456 schar typ;
00457 };
00458
00459 struct levelflags {
00460 uchar nfountains;
00461 uchar nsinks;
00462
00463 Bitfield(has_shop, 1);
00464 Bitfield(has_vault, 1);
00465 Bitfield(has_zoo, 1);
00466 Bitfield(has_court, 1);
00467 Bitfield(has_morgue, 1);
00468 Bitfield(has_garden, 1);
00469 Bitfield(has_beehive, 1);
00470 Bitfield(has_barracks, 1);
00471 Bitfield(has_temple, 1);
00472 Bitfield(has_lemurepit, 1);
00473
00474 Bitfield(has_swamp, 1);
00475 Bitfield(noteleport,1);
00476 Bitfield(hardfloor,1);
00477 Bitfield(nommap,1);
00478 Bitfield(hero_memory,1);
00479 Bitfield(shortsighted,1);
00480 Bitfield(graveyard,1);
00481 Bitfield(is_maze_lev,1);
00482 Bitfield(stormy,1);
00483
00484 Bitfield(is_cavernous_lev,1);
00485 Bitfield(arboreal, 1);
00486 };
00487
00488 struct mon_gen_tuple {
00489 int freq;
00490 boolean is_sym;
00491 int monid;
00492 struct mon_gen_tuple *next;
00493 };
00494
00495 struct mon_gen_override {
00496 int override_chance;
00497 int total_mon_freq;
00498 struct mon_gen_tuple *gen_chances;
00499 };
00500
00501 #define LVLSND_HEARD 0
00502 #define LVLSND_PLINED 1
00503 #define LVLSND_VERBAL 2
00504 #define LVLSND_FELT 3
00505
00506 struct lvl_sound_bite {
00507 int flags;
00508 char *msg;
00509 };
00510
00511 struct lvl_sounds {
00512 int freq;
00513 int n_sounds;
00514 struct lvl_sound_bite *sounds;
00515 };
00516
00517 typedef struct
00518 {
00519 struct rm locations[COLNO][ROWNO];
00520 #ifndef MICROPORT_BUG
00521 struct obj *objects[COLNO][ROWNO];
00522 struct monst *monsters[COLNO][ROWNO];
00523 #else
00524 struct obj *objects[1][ROWNO];
00525 char *yuk1[COLNO-1][ROWNO];
00526 struct monst *monsters[1][ROWNO];
00527 char *yuk2[COLNO-1][ROWNO];
00528 #endif
00529 struct obj *objlist;
00530 struct obj *buriedobjlist;
00531 struct monst *monlist;
00532 struct damage *damagelist;
00533 struct levelflags flags;
00534 struct mon_gen_override *mon_gen;
00535 struct lvl_sounds *sounds;
00536 }
00537 dlevel_t;
00538
00539 extern dlevel_t level;
00540
00541
00542
00543
00544 #define levl level.locations
00545 #define fobj level.objlist
00546 #define fmon level.monlist
00547
00548
00549
00550
00551
00552
00553 #define trap_to_defsym(t) (S_arrow_trap+(t)-1)
00554 #define defsym_to_trap(d) ((d)-S_arrow_trap+1)
00555
00556 #define OBJ_AT(x,y) (level.objects[x][y] != (struct obj *)0)
00557
00558
00559
00560 #define MON_AT(x,y) (level.monsters[x][y] != (struct monst *)0 && \
00561 !(level.monsters[x][y])->mburied)
00562 #define MON_BURIED_AT(x,y) (level.monsters[x][y] != (struct monst *)0 && \
00563 (level.monsters[x][y])->mburied)
00564 #define place_worm_seg(m,x,y) level.monsters[x][y] = m
00565 #define m_at(x,y) (MON_AT(x,y) ? level.monsters[x][y] : \
00566 (struct monst *)0)
00567 #define m_buried_at(x,y) (MON_BURIED_AT(x,y) ? level.monsters[x][y] : \
00568 (struct monst *)0)
00569
00570 #endif