Annotation of brogue-ce/src/brogue/Rogue.h, Revision 1.1.1.1
1.1 rubenllo 1: //
2: // RogueMain.h
3: // Brogue
4: //
5: // Created by Brian Walker on 12/26/08.
6: // Copyright 2012. All rights reserved.
7: //
8: // This file is part of Brogue.
9: //
10: // This program is free software: you can redistribute it and/or modify
11: // it under the terms of the GNU Affero General Public License as
12: // published by the Free Software Foundation, either version 3 of the
13: // License, or (at your option) any later version.
14: //
15: // This program is distributed in the hope that it will be useful,
16: // but WITHOUT ANY WARRANTY; without even the implied warranty of
17: // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18: // GNU Affero General Public License for more details.
19: //
20: // You should have received a copy of the GNU Affero General Public License
21: // along with this program. If not, see <http://www.gnu.org/licenses/>.
22: //
23:
24: #include <stdio.h>
25: #include <stdlib.h>
26: #include <string.h>
27: #include <stdint.h>
28: #include <time.h>
29: #include "PlatformDefines.h"
30:
31: // unicode: comment this line to revert to ASCII
32:
33: #define USE_UNICODE
34:
35: // Brogue version: what the user sees in the menu and title
36: #define BROGUE_VERSION_STRING "CE 1.9.3" BROGUE_EXTRA_VERSION
37:
38: // Recording version. Saved into recordings and save files made by this version.
39: // Cannot be longer than 16 chars
40: #define BROGUE_RECORDING_VERSION_STRING "CE 1.9.3"
41:
42: /* Patch pattern. A scanf format string which matches an unsigned short. If this
43: matches against a recording version string, it defines a "patch version." During
44: normal play, rogue.patchVersion is set to the match of the game's recording
45: version above, or 0 if it doesn't match.
46:
47: The game will only load a recording/save if either a) it has a patch version
48: which is equal or less than the patch version of the current game
49: (rogue.patchLevel is set to the recording's); or b) it doesn't match the version
50: strings, but they are equal (rogue.patchLevel is set to 0).
51: */
52: #define BROGUE_PATCH_VERSION_PATTERN "CE 1.9.%hu"
53:
54: // Dungeon version. Used in seed catalog output.
55: #define BROGUE_DUNGEON_VERSION_STRING "CE 1.9"
56:
57: #define DEBUG if (rogue.wizard)
58: #define MONSTERS_ENABLED (!rogue.wizard || 1) // Quest room monsters can be generated regardless.
59: #define ITEMS_ENABLED (!rogue.wizard || 1)
60:
61: #define D_BULLET_TIME (rogue.wizard && 0)
62: #define D_WORMHOLING (rogue.wizard && 1)
63: #define D_IMMORTAL (rogue.wizard && 1)
64:
65: #define D_SAFETY_VISION (rogue.wizard && 0)
66: #define D_SCENT_VISION (rogue.wizard && 0)
67: #define D_DISABLE_BACKGROUND_COLORS (rogue.wizard && 0)
68:
69: #define D_INSPECT_LEVELGEN (rogue.wizard && 0)
70: #define D_INSPECT_MACHINES (rogue.wizard && 0)
71:
72: #define D_MESSAGE_ITEM_GENERATION (rogue.wizard && 0)
73: #define D_MESSAGE_MACHINE_GENERATION (rogue.wizard && 0)
74:
75: // set to false to allow multiple loads from the same saved file:
76: #define DELETE_SAVE_FILE_AFTER_LOADING true
77:
78: // set to false to disable references to keystrokes (e.g. for a tablet port)
79: #define KEYBOARD_LABELS true
80:
81: //#define BROGUE_ASSERTS // introduces several assert()s -- useful to find certain array overruns and other bugs
82: //#define AUDIT_RNG // VERY slow, but sometimes necessary to debug out-of-sync recording errors
83: //#define GENERATE_FONT_FILES // Displays font in grid upon startup, which can be screen-captured into font files for PC.
84:
85: #ifdef BROGUE_ASSERTS
86: #include <assert.h>
87: #define brogueAssert(x) assert(x)
88: #else
89: #define brogueAssert(x)
90: #endif
91:
92: #define boolean char
93:
94: #define false 0
95: #define true 1
96:
97: #define Fl(N) ((unsigned long) 1 << (N))
98:
99: typedef long long fixpt;
100: #define FP_BASE 16 // Don't change this without recalculating all of the power tables throughout the code!
101: #define FP_FACTOR (1LL << FP_BASE)
102: #define FP_MUL(x, y) ((x) * (y) / FP_FACTOR)
103: #define FP_DIV(x, y) ((x) * FP_FACTOR / (y))
104:
105: // recording and save filenames
106: #define LAST_GAME_PATH "LastGame.broguesave"
107: #define LAST_GAME_NAME "LastGame"
108: #define LAST_RECORDING_NAME "LastRecording"
109: #define RECORDING_SUFFIX ".broguerec"
110: #define GAME_SUFFIX ".broguesave"
111: #define ANNOTATION_SUFFIX ".txt"
112: #define RNG_LOG "RNGLog.txt"
113: #define SCREENSHOT_SUFFIX ".png"
114:
115: #define BROGUE_FILENAME_MAX (min(1024*4, FILENAME_MAX))
116:
117: // Date format used when listing recordings and high scores
118: #define DATE_FORMAT "%Y-%m-%d" // see strftime() documentation
119:
120: #define MESSAGE_LINES 3
121: #define MESSAGE_ARCHIVE_LINES ROWS
122:
123: // Size of the entire terminal window. These need to be hard-coded here and in Viewport.h
124: #define COLS 100
125: #define ROWS (31 + MESSAGE_LINES)
126:
127: // Size of the portion of the terminal window devoted to displaying the dungeon:
128: #define DCOLS (COLS - STAT_BAR_WIDTH - 1) // n columns on the left for the sidebar;
129: // one column to separate the sidebar from the map.
130: #define DROWS (ROWS - MESSAGE_LINES - 2) // n lines at the top for messages;
131: // one line at the bottom for flavor text;
132: // another line at the bottom for the menu bar.
133:
134: #define STAT_BAR_WIDTH 20 // number of characters in the stats bar to the left of the map
135:
136: #define LOS_SLOPE_GRANULARITY 32768 // how finely we divide up the squares when calculating slope;
137: // higher numbers mean fewer artifacts but more memory and processing
138: #define INTERFACE_OPACITY 95
139:
140: #define LIGHT_SMOOTHING_THRESHOLD 150 // light components higher than this magnitude will be toned down a little
141:
142: #define MAX_BOLT_LENGTH DCOLS*10
143:
144: #define VISIBILITY_THRESHOLD 50 // how bright cumulative light has to be before the cell is marked visible
145:
146: #define AMULET_LEVEL 26 // how deep before the amulet appears
147: #define DEEPEST_LEVEL 40 // how deep the universe goes
148:
149: #define MACHINES_FACTOR FP_FACTOR // use this to adjust machine frequency
150:
151: #define MACHINES_BUFFER_LENGTH 200
152:
153: #define WEAPON_KILLS_TO_AUTO_ID 20
154: #define ARMOR_DELAY_TO_AUTO_ID 1000
155: #define RING_DELAY_TO_AUTO_ID 1500
156:
157: #define FALL_DAMAGE_MIN 8
158: #define FALL_DAMAGE_MAX 10
159:
160: #define INPUT_RECORD_BUFFER 1000 // how many bytes of input data to keep in memory before saving it to disk
161: #define DEFAULT_PLAYBACK_DELAY 50
162:
163: #define HIGH_SCORES_COUNT 30
164:
165: // color escapes
166: #define COLOR_ESCAPE 25
167: #define COLOR_VALUE_INTERCEPT 25
168:
169: // display characters:
170:
171: enum displayGlyph {
172: G_UP_ARROW = 128,
173: G_DOWN_ARROW,
174: G_POTION,
175: G_GRASS,
176: G_WALL,
177: G_DEMON,
178: G_OPEN_DOOR,
179: G_GOLD,
180: G_CLOSED_DOOR,
181: G_RUBBLE,
182: G_KEY,
183: G_BOG,
184: G_CHAIN_TOP_LEFT,
185: G_CHAIN_BOTTOM_RIGHT,
186: G_CHAIN_TOP_RIGHT,
187: G_CHAIN_BOTTOM_LEFT,
188: G_CHAIN_TOP,
189: G_CHAIN_BOTTOM,
190: G_CHAIN_LEFT,
191: G_CHAIN_RIGHT,
192: G_FOOD,
193: G_UP_STAIRS,
194: G_VENT,
195: G_DOWN_STAIRS,
196: G_PLAYER,
197: G_BOG_MONSTER,
198: G_CENTAUR,
199: G_DRAGON,
200: G_FLAMEDANCER,
201: G_GOLEM,
202: G_TENTACLE_HORROR,
203: G_IFRIT,
204: G_JELLY,
205: G_KRAKEN,
206: G_LICH,
207: G_NAGA,
208: G_OGRE,
209: G_PHANTOM,
210: G_REVENANT,
211: G_SALAMANDER,
212: G_TROLL,
213: G_UNDERWORM,
214: G_VAMPIRE,
215: G_WRAITH,
216: G_ZOMBIE,
217: G_ARMOR,
218: G_STAFF,
219: G_WEB,
220: G_MOUND,
221: G_BLOAT,
222: G_CENTIPEDE,
223: G_DAR_BLADEMASTER,
224: G_EEL,
225: G_FURY,
226: G_GOBLIN,
227: G_IMP,
228: G_JACKAL,
229: G_KOBOLD,
230: G_MONKEY,
231: G_PIXIE,
232: G_RAT,
233: G_SPIDER,
234: G_TOAD,
235: G_BAT,
236: G_WISP,
237: G_PHOENIX,
238: G_ALTAR,
239: G_LIQUID,
240: G_FLOOR,
241: G_CHASM,
242: G_TRAP,
243: G_FIRE,
244: G_FOLIAGE,
245: G_AMULET,
246: G_SCROLL,
247: G_RING,
248: G_WEAPON,
249: G_TURRET,
250: G_TOTEM,
251: G_GOOD_MAGIC,
252: G_BAD_MAGIC,
253: G_DOORWAY,
254: G_CHARM,
255: G_WALL_TOP,
256: G_DAR_PRIESTESS,
257: G_DAR_BATTLEMAGE,
258: G_GOBLIN_MAGIC,
259: G_GOBLIN_CHIEFTAN,
260: G_OGRE_MAGIC,
261: G_GUARDIAN,
262: G_WINGED_GUARDIAN,
263: G_EGG,
264: G_WARDEN,
265: G_DEWAR,
266: G_ANCIENT_SPIRIT,
267: G_LEVER,
268: G_LEVER_PULLED,
269: G_BLOODWORT_STALK,
270: G_FLOOR_ALT,
271: G_UNICORN,
272: G_GEM,
273: G_WAND,
274: G_GRANITE,
275: G_CARPET,
276: G_CLOSED_IRON_DOOR,
277: G_OPEN_IRON_DOOR,
278: G_TORCH,
279: G_CRYSTAL,
280: G_PORTCULLIS,
281: G_BARRICADE,
282: G_STATUE,
283: G_CRACKED_STATUE,
284: G_CLOSED_CAGE,
285: G_OPEN_CAGE,
286: G_PEDESTAL,
287: G_CLOSED_COFFIN,
288: G_OPEN_COFFIN,
289: G_MAGIC_GLYPH,
290: G_BRIDGE,
291: G_BONES,
292: G_ELECTRIC_CRYSTAL,
293: G_ASHES,
294: G_BEDROLL,
295: G_BLOODWORT_POD,
296: G_VINE,
297: G_NET,
298: G_LICHEN,
299: G_PIPES,
300: G_SAC_ALTAR,
301: G_ORB_ALTAR
302: };
303:
304: enum eventTypes {
305: KEYSTROKE,
306: MOUSE_UP,
307: MOUSE_DOWN,
308: RIGHT_MOUSE_DOWN,
309: RIGHT_MOUSE_UP,
310: MOUSE_ENTERED_CELL,
311: RNG_CHECK,
312: SAVED_GAME_LOADED,
313: END_OF_RECORDING,
314: EVENT_ERROR,
315: NUMBER_OF_EVENT_TYPES, // unused
316: };
317:
318: enum notificationEventTypes {
319: GAMEOVER_QUIT,
320: GAMEOVER_DEATH,
321: GAMEOVER_VICTORY,
322: GAMEOVER_SUPERVICTORY,
323: GAMEOVER_RECORDING
324: };
325:
326: typedef struct rogueEvent {
327: enum eventTypes eventType;
328: signed long param1;
329: signed long param2;
330: boolean controlKey;
331: boolean shiftKey;
332: } rogueEvent;
333:
334: typedef struct rogueHighScoresEntry {
335: signed long score;
336: char date[100];
337: char description[DCOLS];
338: } rogueHighScoresEntry;
339:
340: typedef struct fileEntry {
341: char *path;
342: struct tm date;
343: } fileEntry;
344:
345: enum RNGs {
346: RNG_SUBSTANTIVE,
347: RNG_COSMETIC,
348: NUMBER_OF_RNGS,
349: };
350:
351: enum displayDetailValues {
352: DV_UNLIT = 0,
353: DV_LIT,
354: DV_DARK,
355: };
356:
357: enum directions {
358: NO_DIRECTION = -1,
359: // Cardinal directions; must be 0-3:
360: UP = 0,
361: DOWN = 1,
362: LEFT = 2,
363: RIGHT = 3,
364: // Secondary directions; must be 4-7:
365: UPLEFT = 4,
366: DOWNLEFT = 5,
367: UPRIGHT = 6,
368: DOWNRIGHT = 7,
369:
370: DIRECTION_COUNT = 8,
371: };
372:
373: enum textEntryTypes {
374: TEXT_INPUT_NORMAL = 0,
375: TEXT_INPUT_FILENAME,
376: TEXT_INPUT_NUMBERS,
377: TEXT_INPUT_TYPES,
378: };
379:
380: #define NUMBER_DYNAMIC_COLORS 6
381:
382: enum tileType {
383: NOTHING = 0,
384: GRANITE,
385: FLOOR,
386: FLOOR_FLOODABLE,
387: CARPET,
388: MARBLE_FLOOR,
389: WALL,
390: DOOR,
391: OPEN_DOOR,
392: SECRET_DOOR,
393: LOCKED_DOOR,
394: OPEN_IRON_DOOR_INERT,
395: DOWN_STAIRS,
396: UP_STAIRS,
397: DUNGEON_EXIT,
398: DUNGEON_PORTAL,
399: TORCH_WALL, // wall lit with a torch
400: CRYSTAL_WALL,
401: PORTCULLIS_CLOSED,
402: PORTCULLIS_DORMANT,
403: WOODEN_BARRICADE,
404: PILOT_LIGHT_DORMANT,
405: PILOT_LIGHT,
406: HAUNTED_TORCH_DORMANT,
407: HAUNTED_TORCH_TRANSITIONING,
408: HAUNTED_TORCH,
409: WALL_LEVER_HIDDEN,
410: WALL_LEVER,
411: WALL_LEVER_PULLED,
412: WALL_LEVER_HIDDEN_DORMANT,
413: STATUE_INERT,
414: STATUE_DORMANT,
415: STATUE_CRACKING,
416: STATUE_INSTACRACK,
417: PORTAL,
418: TURRET_DORMANT,
419: WALL_MONSTER_DORMANT,
420: DARK_FLOOR_DORMANT,
421: DARK_FLOOR_DARKENING,
422: DARK_FLOOR,
423: MACHINE_TRIGGER_FLOOR,
424: ALTAR_INERT,
425: ALTAR_KEYHOLE,
426: ALTAR_CAGE_OPEN,
427: ALTAR_CAGE_CLOSED,
428: ALTAR_SWITCH,
429: ALTAR_SWITCH_RETRACTING,
430: ALTAR_CAGE_RETRACTABLE,
431: PEDESTAL,
432: MONSTER_CAGE_OPEN,
433: MONSTER_CAGE_CLOSED,
434: COFFIN_CLOSED,
435: COFFIN_OPEN,
436:
437: GAS_TRAP_POISON_HIDDEN,
438: GAS_TRAP_POISON,
439: TRAP_DOOR_HIDDEN,
440: TRAP_DOOR,
441: GAS_TRAP_PARALYSIS_HIDDEN,
442: GAS_TRAP_PARALYSIS,
443: MACHINE_PARALYSIS_VENT_HIDDEN,
444: MACHINE_PARALYSIS_VENT,
445: GAS_TRAP_CONFUSION_HIDDEN,
446: GAS_TRAP_CONFUSION,
447: FLAMETHROWER_HIDDEN,
448: FLAMETHROWER,
449: FLOOD_TRAP_HIDDEN,
450: FLOOD_TRAP,
451: NET_TRAP_HIDDEN,
452: NET_TRAP,
453: ALARM_TRAP_HIDDEN,
454: ALARM_TRAP,
455: MACHINE_POISON_GAS_VENT_HIDDEN,
456: MACHINE_POISON_GAS_VENT_DORMANT,
457: MACHINE_POISON_GAS_VENT,
458: MACHINE_METHANE_VENT_HIDDEN,
459: MACHINE_METHANE_VENT_DORMANT,
460: MACHINE_METHANE_VENT,
461: STEAM_VENT,
462: MACHINE_PRESSURE_PLATE,
463: MACHINE_PRESSURE_PLATE_USED,
464: MACHINE_GLYPH,
465: MACHINE_GLYPH_INACTIVE,
466: DEWAR_CAUSTIC_GAS,
467: DEWAR_CONFUSION_GAS,
468: DEWAR_PARALYSIS_GAS,
469: DEWAR_METHANE_GAS,
470:
471: DEEP_WATER,
472: SHALLOW_WATER,
473: MUD,
474: CHASM,
475: CHASM_EDGE,
476: MACHINE_COLLAPSE_EDGE_DORMANT,
477: MACHINE_COLLAPSE_EDGE_SPREADING,
478: LAVA,
479: LAVA_RETRACTABLE,
480: LAVA_RETRACTING,
481: SUNLIGHT_POOL,
482: DARKNESS_PATCH,
483: ACTIVE_BRIMSTONE,
484: INERT_BRIMSTONE,
485: OBSIDIAN,
486: BRIDGE,
487: BRIDGE_FALLING,
488: BRIDGE_EDGE,
489: STONE_BRIDGE,
490: MACHINE_FLOOD_WATER_DORMANT,
491: MACHINE_FLOOD_WATER_SPREADING,
492: MACHINE_MUD_DORMANT,
493: ICE_DEEP,
494: ICE_DEEP_MELT,
495: ICE_SHALLOW,
496: ICE_SHALLOW_MELT,
497:
498: HOLE,
499: HOLE_GLOW,
500: HOLE_EDGE,
501: FLOOD_WATER_DEEP,
502: FLOOD_WATER_SHALLOW,
503: GRASS,
504: DEAD_GRASS,
505: GRAY_FUNGUS,
506: LUMINESCENT_FUNGUS,
507: LICHEN,
508: HAY,
509: RED_BLOOD,
510: GREEN_BLOOD,
511: PURPLE_BLOOD,
512: ACID_SPLATTER,
513: VOMIT,
514: URINE,
515: UNICORN_POOP,
516: WORM_BLOOD,
517: ASH,
518: BURNED_CARPET,
519: PUDDLE,
520: BONES,
521: RUBBLE,
522: JUNK,
523: BROKEN_GLASS,
524: ECTOPLASM,
525: EMBERS,
526: SPIDERWEB,
527: NETTING,
528: FOLIAGE,
529: DEAD_FOLIAGE,
530: TRAMPLED_FOLIAGE,
531: FUNGUS_FOREST,
532: TRAMPLED_FUNGUS_FOREST,
533: FORCEFIELD,
534: FORCEFIELD_MELT,
535: SACRED_GLYPH,
536: MANACLE_TL,
537: MANACLE_BR,
538: MANACLE_TR,
539: MANACLE_BL,
540: MANACLE_T,
541: MANACLE_B,
542: MANACLE_L,
543: MANACLE_R,
544: PORTAL_LIGHT,
545: GUARDIAN_GLOW,
546:
547: PLAIN_FIRE,
548: BRIMSTONE_FIRE,
549: FLAMEDANCER_FIRE,
550: GAS_FIRE,
551: GAS_EXPLOSION,
552: DART_EXPLOSION,
553: ITEM_FIRE,
554: CREATURE_FIRE,
555:
556: POISON_GAS,
557: CONFUSION_GAS,
558: ROT_GAS,
559: STENCH_SMOKE_GAS,
560: PARALYSIS_GAS,
561: METHANE_GAS,
562: STEAM,
563: DARKNESS_CLOUD,
564: HEALING_CLOUD,
565:
566: BLOODFLOWER_STALK,
567: BLOODFLOWER_POD,
568:
569: HAVEN_BEDROLL,
570:
571: DEEP_WATER_ALGAE_WELL,
572: DEEP_WATER_ALGAE_1,
573: DEEP_WATER_ALGAE_2,
574:
575: ANCIENT_SPIRIT_VINES,
576: ANCIENT_SPIRIT_GRASS,
577:
578: AMULET_SWITCH,
579:
580: COMMUTATION_ALTAR,
581: COMMUTATION_ALTAR_INERT,
582: PIPE_GLOWING,
583: PIPE_INERT,
584:
585: RESURRECTION_ALTAR,
586: RESURRECTION_ALTAR_INERT,
587: MACHINE_TRIGGER_FLOOR_REPEATING,
588:
589: SACRIFICE_ALTAR_DORMANT,
590: SACRIFICE_ALTAR,
591: SACRIFICE_LAVA,
592: SACRIFICE_CAGE_DORMANT,
593: DEMONIC_STATUE,
594:
595: STATUE_INERT_DOORWAY,
596: STATUE_DORMANT_DOORWAY,
597:
598: CHASM_WITH_HIDDEN_BRIDGE,
599: CHASM_WITH_HIDDEN_BRIDGE_ACTIVE,
600: MACHINE_CHASM_EDGE,
601:
602: RAT_TRAP_WALL_DORMANT,
603: RAT_TRAP_WALL_CRACKING,
604:
605: ELECTRIC_CRYSTAL_OFF,
606: ELECTRIC_CRYSTAL_ON,
607: TURRET_LEVER,
608:
609: WORM_TUNNEL_MARKER_DORMANT,
610: WORM_TUNNEL_MARKER_ACTIVE,
611: WORM_TUNNEL_OUTER_WALL,
612:
613: BRAZIER,
614:
615: MUD_FLOOR,
616: MUD_WALL,
617: MUD_DOORWAY,
618:
619: NUMBER_TILETYPES,
620: };
621:
622: enum lightType {
623: NO_LIGHT,
624: MINERS_LIGHT,
625: BURNING_CREATURE_LIGHT,
626: WISP_LIGHT,
627: SALAMANDER_LIGHT,
628: IMP_LIGHT,
629: PIXIE_LIGHT,
630: LICH_LIGHT,
631: FLAMEDANCER_LIGHT,
632: SENTINEL_LIGHT,
633: UNICORN_LIGHT,
634: IFRIT_LIGHT,
635: PHOENIX_LIGHT,
636: PHOENIX_EGG_LIGHT,
637: YENDOR_LIGHT,
638: SPECTRAL_BLADE_LIGHT,
639: SPECTRAL_IMAGE_LIGHT,
640: SPARK_TURRET_LIGHT,
641: EXPLOSIVE_BLOAT_LIGHT,
642: BOLT_LIGHT_SOURCE,
643: TELEPATHY_LIGHT,
644: SACRIFICE_MARK_LIGHT,
645:
646: SCROLL_PROTECTION_LIGHT,
647: SCROLL_ENCHANTMENT_LIGHT,
648: POTION_STRENGTH_LIGHT,
649: EMPOWERMENT_LIGHT,
650: GENERIC_FLASH_LIGHT,
651: FALLEN_TORCH_FLASH_LIGHT,
652: SUMMONING_FLASH_LIGHT,
653: EXPLOSION_FLARE_LIGHT,
654: QUIETUS_FLARE_LIGHT,
655: SLAYING_FLARE_LIGHT,
656: CHARGE_FLASH_LIGHT,
657:
658: TORCH_LIGHT,
659: LAVA_LIGHT,
660: SUN_LIGHT,
661: DARKNESS_PATCH_LIGHT,
662: FUNGUS_LIGHT,
663: FUNGUS_FOREST_LIGHT,
664: LUMINESCENT_ALGAE_BLUE_LIGHT,
665: LUMINESCENT_ALGAE_GREEN_LIGHT,
666: ECTOPLASM_LIGHT,
667: UNICORN_POOP_LIGHT,
668: EMBER_LIGHT,
669: FIRE_LIGHT,
670: BRIMSTONE_FIRE_LIGHT,
671: EXPLOSION_LIGHT,
672: INCENDIARY_DART_LIGHT,
673: PORTAL_ACTIVATE_LIGHT,
674: CONFUSION_GAS_LIGHT,
675: DARKNESS_CLOUD_LIGHT,
676: FORCEFIELD_LIGHT,
677: CRYSTAL_WALL_LIGHT,
678: CANDLE_LIGHT,
679: HAUNTED_TORCH_LIGHT,
680: GLYPH_LIGHT_DIM,
681: GLYPH_LIGHT_BRIGHT,
682: SACRED_GLYPH_LIGHT,
683: DESCENT_LIGHT,
684: DEMONIC_STATUE_LIGHT,
685: NUMBER_LIGHT_KINDS
686: };
687:
688: #define NUMBER_ITEM_CATEGORIES 13
689:
690: // Item categories
691: enum itemCategory {
692: FOOD = Fl(0),
693: WEAPON = Fl(1),
694: ARMOR = Fl(2),
695: POTION = Fl(3),
696: SCROLL = Fl(4),
697: STAFF = Fl(5),
698: WAND = Fl(6),
699: RING = Fl(7),
700: CHARM = Fl(8),
701: GOLD = Fl(9),
702: AMULET = Fl(10),
703: GEM = Fl(11),
704: KEY = Fl(12),
705:
706: CAN_BE_DETECTED = (WEAPON | ARMOR | POTION | SCROLL | RING | CHARM | WAND | STAFF | AMULET),
707: PRENAMED_CATEGORY = (FOOD | GOLD | AMULET | GEM | KEY),
708: NEVER_IDENTIFIABLE = (FOOD | CHARM | GOLD | AMULET | GEM | KEY),
709: CAN_BE_SWAPPED = (WEAPON | ARMOR | STAFF | CHARM | RING),
710: ALL_ITEMS = (FOOD|POTION|WEAPON|ARMOR|STAFF|WAND|SCROLL|RING|CHARM|GOLD|AMULET|GEM|KEY),
711: };
712:
713: enum keyKind {
714: KEY_DOOR,
715: KEY_CAGE,
716: KEY_PORTAL,
717: NUMBER_KEY_TYPES
718: };
719:
720: enum foodKind {
721: RATION,
722: FRUIT,
723: NUMBER_FOOD_KINDS
724: };
725:
726: enum potionKind {
727: POTION_LIFE,
728: POTION_STRENGTH,
729: POTION_TELEPATHY,
730: POTION_LEVITATION,
731: POTION_DETECT_MAGIC,
732: POTION_HASTE_SELF,
733: POTION_FIRE_IMMUNITY,
734: POTION_INVISIBILITY,
735: POTION_POISON,
736: POTION_PARALYSIS,
737: POTION_HALLUCINATION,
738: POTION_CONFUSION,
739: POTION_INCINERATION,
740: POTION_DARKNESS,
741: POTION_DESCENT,
742: POTION_LICHEN,
743: NUMBER_POTION_KINDS
744: };
745:
746: enum weaponKind {
747: DAGGER,
748: SWORD,
749: BROADSWORD,
750:
751: WHIP,
752: RAPIER,
753: FLAIL,
754:
755: MACE,
756: HAMMER,
757:
758: SPEAR,
759: PIKE,
760:
761: AXE,
762: WAR_AXE,
763:
764: DART,
765: INCENDIARY_DART,
766: JAVELIN,
767: NUMBER_WEAPON_KINDS
768: };
769:
770: enum weaponEnchants {
771: W_SPEED,
772: W_QUIETUS,
773: W_PARALYSIS,
774: W_MULTIPLICITY,
775: W_SLOWING,
776: W_CONFUSION,
777: W_FORCE,
778: W_SLAYING,
779: W_MERCY,
780: NUMBER_GOOD_WEAPON_ENCHANT_KINDS = W_MERCY,
781: W_PLENTY,
782: NUMBER_WEAPON_RUNIC_KINDS
783: };
784:
785: enum armorKind {
786: LEATHER_ARMOR,
787: SCALE_MAIL,
788: CHAIN_MAIL,
789: BANDED_MAIL,
790: SPLINT_MAIL,
791: PLATE_MAIL,
792: NUMBER_ARMOR_KINDS
793: };
794:
795: enum armorEnchants {
796: A_MULTIPLICITY,
797: A_MUTUALITY,
798: A_ABSORPTION,
799: A_REPRISAL,
800: A_IMMUNITY,
801: A_REFLECTION,
802: A_RESPIRATION,
803: A_DAMPENING,
804: A_BURDEN,
805: NUMBER_GOOD_ARMOR_ENCHANT_KINDS = A_BURDEN,
806: A_VULNERABILITY,
807: A_IMMOLATION,
808: NUMBER_ARMOR_ENCHANT_KINDS,
809: };
810:
811: enum wandKind {
812: WAND_TELEPORT,
813: WAND_SLOW,
814: WAND_POLYMORPH,
815: WAND_NEGATION,
816: WAND_DOMINATION,
817: WAND_BECKONING,
818: WAND_PLENTY,
819: WAND_INVISIBILITY,
820: WAND_EMPOWERMENT,
821: NUMBER_WAND_KINDS
822: };
823:
824: enum staffKind {
825: STAFF_LIGHTNING,
826: STAFF_FIRE,
827: STAFF_POISON,
828: STAFF_TUNNELING,
829: STAFF_BLINKING,
830: STAFF_ENTRANCEMENT,
831: STAFF_OBSTRUCTION,
832: STAFF_DISCORD,
833: STAFF_CONJURATION,
834: STAFF_HEALING,
835: STAFF_HASTE,
836: STAFF_PROTECTION,
837: NUMBER_STAFF_KINDS
838: };
839:
840: // these must be wand bolts, in order, and then staff bolts, in order:
841: enum boltType {
842: BOLT_NONE = 0,
843: BOLT_TELEPORT,
844: BOLT_SLOW,
845: BOLT_POLYMORPH,
846: BOLT_NEGATION,
847: BOLT_DOMINATION,
848: BOLT_BECKONING,
849: BOLT_PLENTY,
850: BOLT_INVISIBILITY,
851: BOLT_EMPOWERMENT,
852: BOLT_LIGHTNING,
853: BOLT_FIRE,
854: BOLT_POISON,
855: BOLT_TUNNELING,
856: BOLT_BLINKING,
857: BOLT_ENTRANCEMENT,
858: BOLT_OBSTRUCTION,
859: BOLT_DISCORD,
860: BOLT_CONJURATION,
861: BOLT_HEALING,
862: BOLT_HASTE,
863: BOLT_SLOW_2,
864: BOLT_SHIELDING,
865: BOLT_SPIDERWEB,
866: BOLT_SPARK,
867: BOLT_DRAGONFIRE,
868: BOLT_DISTANCE_ATTACK,
869: BOLT_POISON_DART,
870: BOLT_ANCIENT_SPIRIT_VINES,
871: BOLT_WHIP,
872: NUMBER_BOLT_KINDS
873: };
874:
875: enum ringKind {
876: RING_CLAIRVOYANCE,
877: RING_STEALTH,
878: RING_REGENERATION,
879: RING_TRANSFERENCE,
880: RING_LIGHT,
881: RING_AWARENESS,
882: RING_WISDOM,
883: RING_REAPING,
884: NUMBER_RING_KINDS
885: };
886:
887: enum charmKind {
888: CHARM_HEALTH,
889: CHARM_PROTECTION,
890: CHARM_HASTE,
891: CHARM_FIRE_IMMUNITY,
892: CHARM_INVISIBILITY,
893: CHARM_TELEPATHY,
894: CHARM_LEVITATION,
895: CHARM_SHATTERING,
896: CHARM_GUARDIAN,
897: CHARM_TELEPORTATION,
898: CHARM_RECHARGING,
899: CHARM_NEGATION,
900: NUMBER_CHARM_KINDS
901: };
902:
903: enum scrollKind {
904: SCROLL_ENCHANTING,
905: SCROLL_IDENTIFY,
906: SCROLL_TELEPORT,
907: SCROLL_REMOVE_CURSE,
908: SCROLL_RECHARGING,
909: SCROLL_PROTECT_ARMOR,
910: SCROLL_PROTECT_WEAPON,
911: SCROLL_SANCTUARY,
912: SCROLL_MAGIC_MAPPING,
913: SCROLL_NEGATION,
914: SCROLL_SHATTERING,
915: SCROLL_DISCORD,
916: SCROLL_AGGRAVATE_MONSTER,
917: SCROLL_SUMMON_MONSTER,
918: NUMBER_SCROLL_KINDS
919: };
920:
921: #define MAX_PACK_ITEMS 26
922:
923: enum monsterTypes {
924: MK_YOU,
925: MK_RAT,
926: MK_KOBOLD,
927: MK_JACKAL,
928: MK_EEL,
929: MK_MONKEY,
930: MK_BLOAT,
931: MK_PIT_BLOAT,
932: MK_GOBLIN,
933: MK_GOBLIN_CONJURER,
934: MK_GOBLIN_MYSTIC,
935: MK_GOBLIN_TOTEM,
936: MK_PINK_JELLY,
937: MK_TOAD,
938: MK_VAMPIRE_BAT,
939: MK_ARROW_TURRET,
940: MK_ACID_MOUND,
941: MK_CENTIPEDE,
942: MK_OGRE,
943: MK_BOG_MONSTER,
944: MK_OGRE_TOTEM,
945: MK_SPIDER,
946: MK_SPARK_TURRET,
947: MK_WILL_O_THE_WISP,
948: MK_WRAITH,
949: MK_ZOMBIE,
950: MK_TROLL,
951: MK_OGRE_SHAMAN,
952: MK_NAGA,
953: MK_SALAMANDER,
954: MK_EXPLOSIVE_BLOAT,
955: MK_DAR_BLADEMASTER,
956: MK_DAR_PRIESTESS,
957: MK_DAR_BATTLEMAGE,
958: MK_ACID_JELLY,
959: MK_CENTAUR,
960: MK_UNDERWORM,
961: MK_SENTINEL,
962: MK_DART_TURRET,
963: MK_KRAKEN,
964: MK_LICH,
965: MK_PHYLACTERY,
966: MK_PIXIE,
967: MK_PHANTOM,
968: MK_FLAME_TURRET,
969: MK_IMP,
970: MK_FURY,
971: MK_REVENANT,
972: MK_TENTACLE_HORROR,
973: MK_GOLEM,
974: MK_DRAGON,
975:
976: MK_GOBLIN_CHIEFTAN,
977: MK_BLACK_JELLY,
978: MK_VAMPIRE,
979: MK_FLAMEDANCER,
980:
981: MK_SPECTRAL_BLADE,
982: MK_SPECTRAL_IMAGE,
983: MK_GUARDIAN,
984: MK_WINGED_GUARDIAN,
985: MK_CHARM_GUARDIAN,
986: MK_WARDEN_OF_YENDOR,
987: MK_ELDRITCH_TOTEM,
988: MK_MIRRORED_TOTEM,
989:
990: MK_UNICORN,
991: MK_IFRIT,
992: MK_PHOENIX,
993: MK_PHOENIX_EGG,
994: MK_ANCIENT_SPIRIT,
995:
996: NUMBER_MONSTER_KINDS
997: };
998:
999: #define NUMBER_MUTATORS 8
1000:
1001: #define NUMBER_HORDES 177
1002:
1003: #define MONSTER_CLASS_COUNT 15
1004:
1005: // flavors
1006:
1007: #define NUMBER_ITEM_COLORS 21
1008: #define NUMBER_TITLE_PHONEMES 21
1009: #define NUMBER_ITEM_WOODS 21
1010: #define NUMBER_POTION_DESCRIPTIONS 18
1011: #define NUMBER_ITEM_METALS 12
1012: #define NUMBER_ITEM_GEMS 18
1013:
1014: // Dungeon flags
1015: enum tileFlags {
1016: DISCOVERED = Fl(0),
1017: VISIBLE = Fl(1), // cell has sufficient light and is in field of view, ready to draw.
1018: HAS_PLAYER = Fl(2),
1019: HAS_MONSTER = Fl(3),
1020: HAS_DORMANT_MONSTER = Fl(4), // hidden monster on the square
1021: HAS_ITEM = Fl(5),
1022: IN_FIELD_OF_VIEW = Fl(6), // player has unobstructed line of sight whether or not there is enough light
1023: WAS_VISIBLE = Fl(7),
1024: HAS_STAIRS = Fl(8),
1025: SEARCHED_FROM_HERE = Fl(9), // player already auto-searched here; can't auto-search here again
1026: IS_IN_SHADOW = Fl(10), // so that a player gains an automatic stealth bonus
1027: MAGIC_MAPPED = Fl(11),
1028: ITEM_DETECTED = Fl(12),
1029: CLAIRVOYANT_VISIBLE = Fl(13),
1030: WAS_CLAIRVOYANT_VISIBLE = Fl(14),
1031: CLAIRVOYANT_DARKENED = Fl(15), // magical blindness from a cursed ring of clairvoyance
1032: CAUGHT_FIRE_THIS_TURN = Fl(16), // so that fire does not spread asymmetrically
1033: PRESSURE_PLATE_DEPRESSED = Fl(17), // so that traps do not trigger repeatedly while you stand on them
1034: STABLE_MEMORY = Fl(18), // redraws will be pulled from the memory array, not recalculated
1035: KNOWN_TO_BE_TRAP_FREE = Fl(19), // keep track of where the player has stepped or watched monsters step as he knows no traps are there
1036: IS_IN_PATH = Fl(20), // the yellow trail leading to the cursor
1037: IN_LOOP = Fl(21), // this cell is part of a terrain loop
1038: IS_CHOKEPOINT = Fl(22), // if this cell is blocked, part of the map will be rendered inaccessible
1039: IS_GATE_SITE = Fl(23), // consider placing a locked door here
1040: IS_IN_ROOM_MACHINE = Fl(24),
1041: IS_IN_AREA_MACHINE = Fl(25),
1042: IS_POWERED = Fl(26), // has been activated by machine power this turn (flag can probably be eliminated if needed)
1043: IMPREGNABLE = Fl(27), // no tunneling allowed!
1044: TERRAIN_COLORS_DANCING = Fl(28), // colors here will sparkle when the game is idle
1045: TELEPATHIC_VISIBLE = Fl(29), // potions of telepathy let you see through other creatures' eyes
1046: WAS_TELEPATHIC_VISIBLE = Fl(30), // potions of telepathy let you see through other creatures' eyes
1047:
1048: IS_IN_MACHINE = (IS_IN_ROOM_MACHINE | IS_IN_AREA_MACHINE), // sacred ground; don't generate items here, or teleport randomly to it
1049:
1050: PERMANENT_TILE_FLAGS = (DISCOVERED | MAGIC_MAPPED | ITEM_DETECTED | HAS_ITEM | HAS_DORMANT_MONSTER
1051: | HAS_MONSTER | HAS_STAIRS | SEARCHED_FROM_HERE | PRESSURE_PLATE_DEPRESSED
1052: | STABLE_MEMORY | KNOWN_TO_BE_TRAP_FREE | IN_LOOP
1053: | IS_CHOKEPOINT | IS_GATE_SITE | IS_IN_MACHINE | IMPREGNABLE),
1054:
1055: ANY_KIND_OF_VISIBLE = (VISIBLE | CLAIRVOYANT_VISIBLE | TELEPATHIC_VISIBLE),
1056: };
1057:
1058: #define TURNS_FOR_FULL_REGEN 300
1059: #define STOMACH_SIZE 2150
1060: #define HUNGER_THRESHOLD (STOMACH_SIZE - 1800)
1061: #define WEAK_THRESHOLD 150
1062: #define FAINT_THRESHOLD 50
1063: #define MAX_EXP_LEVEL 20
1064: #define MAX_EXP 100000000L
1065:
1066: #define XPXP_NEEDED_FOR_TELEPATHIC_BOND 1400 // XPXP required to enable telepathic awareness with the ally
1067:
1068: #define ROOM_MIN_WIDTH 4
1069: #define ROOM_MAX_WIDTH 20
1070: #define ROOM_MIN_HEIGHT 3
1071: #define ROOM_MAX_HEIGHT 7
1072: #define HORIZONTAL_CORRIDOR_MIN_LENGTH 5
1073: #define HORIZONTAL_CORRIDOR_MAX_LENGTH 15
1074: #define VERTICAL_CORRIDOR_MIN_LENGTH 2
1075: #define VERTICAL_CORRIDOR_MAX_LENGTH 9
1076: #define CROSS_ROOM_MIN_WIDTH 3
1077: #define CROSS_ROOM_MAX_WIDTH 12
1078: #define CROSS_ROOM_MIN_HEIGHT 2
1079: #define CROSS_ROOM_MAX_HEIGHT 5
1080: #define MIN_SCALED_ROOM_DIMENSION 2
1081:
1082: #define ROOM_TYPE_COUNT 8
1083:
1084: #define CORRIDOR_WIDTH 1
1085:
1086: #define WAYPOINT_SIGHT_RADIUS 10
1087: #define MAX_WAYPOINT_COUNT 40
1088:
1089: #define MAX_ITEMS_IN_MONSTER_ITEMS_HOPPER 100
1090:
1091: // Making these larger means cave generation will take more trials; set them too high and the program will hang.
1092: #define CAVE_MIN_WIDTH 50
1093: #define CAVE_MIN_HEIGHT 20
1094:
1095: // Keyboard commands:
1096: #define UP_KEY 'k'
1097: #define DOWN_KEY 'j'
1098: #define LEFT_KEY 'h'
1099: #define RIGHT_KEY 'l'
1100: #define UP_ARROW 63232
1101: #define LEFT_ARROW 63234
1102: #define DOWN_ARROW 63233
1103: #define RIGHT_ARROW 63235
1104: #define UPLEFT_KEY 'y'
1105: #define UPRIGHT_KEY 'u'
1106: #define DOWNLEFT_KEY 'b'
1107: #define DOWNRIGHT_KEY 'n'
1108: #define DESCEND_KEY '>'
1109: #define ASCEND_KEY '<'
1110: #define REST_KEY 'z'
1111: #define AUTO_REST_KEY 'Z'
1112: #define SEARCH_KEY 's'
1113: #define INVENTORY_KEY 'i'
1114: #define ACKNOWLEDGE_KEY ' '
1115: #define EQUIP_KEY 'e'
1116: #define UNEQUIP_KEY 'r'
1117: #define APPLY_KEY 'a'
1118: #define THROW_KEY 't'
1119: #define RETHROW_KEY 'T'
1120: #define RELABEL_KEY 'R'
1121: #define TRUE_COLORS_KEY '\\'
1122: #define AGGRO_DISPLAY_KEY ']'
1123: #define DROP_KEY 'd'
1124: #define CALL_KEY 'c'
1125: #define QUIT_KEY 'Q'
1126: #define MESSAGE_ARCHIVE_KEY 'M'
1127: #define BROGUE_HELP_KEY '?'
1128: #define DISCOVERIES_KEY 'D'
1129: #define EXPLORE_KEY 'x'
1130: #define AUTOPLAY_KEY 'A'
1131: #define SEED_KEY '~'
1132: #define EASY_MODE_KEY '&'
1133: #define ESCAPE_KEY '\033'
1134: #define RETURN_KEY '\012'
1135: #define DELETE_KEY '\177'
1136: #define TAB_KEY '\t'
1137: #define SHIFT_TAB_KEY 25 // Cocoa reports shift-tab this way for some reason.
1138: #define PERIOD_KEY '.'
1139: #define VIEW_RECORDING_KEY 'V'
1140: #define LOAD_SAVED_GAME_KEY 'O'
1141: #define SAVE_GAME_KEY 'S'
1142: #define NEW_GAME_KEY 'N'
1143: #define GRAPHICS_KEY 'G'
1144: #define SWITCH_TO_PLAYING_KEY 'P'
1145: #define NUMPAD_0 48
1146: #define NUMPAD_1 49
1147: #define NUMPAD_2 50
1148: #define NUMPAD_3 51
1149: #define NUMPAD_4 52
1150: #define NUMPAD_5 53
1151: #define NUMPAD_6 54
1152: #define NUMPAD_7 55
1153: #define NUMPAD_8 56
1154: #define NUMPAD_9 57
1155: #define PAGE_UP_KEY 63276
1156: #define PAGE_DOWN_KEY 63277
1157: #define PRINTSCREEN_KEY '\054'
1158:
1159: #define UNKNOWN_KEY (128+19)
1160:
1161: #define min(x, y) (((x) < (y)) ? (x) : (y))
1162: #define max(x, y) (((x) > (y)) ? (x) : (y))
1163: #define clamp(x, low, hi) (min(hi, max(x, low))) // pins x to the [y, z] interval
1164:
1165: #define terrainFlags(x, y) (tileCatalog[pmap[x][y].layers[DUNGEON]].flags \
1166: | tileCatalog[pmap[x][y].layers[LIQUID]].flags \
1167: | tileCatalog[pmap[x][y].layers[SURFACE]].flags \
1168: | tileCatalog[pmap[x][y].layers[GAS]].flags)
1169:
1170: #define terrainMechFlags(x, y) (tileCatalog[pmap[x][y].layers[DUNGEON]].mechFlags \
1171: | tileCatalog[pmap[x][y].layers[LIQUID]].mechFlags \
1172: | tileCatalog[pmap[x][y].layers[SURFACE]].mechFlags \
1173: | tileCatalog[pmap[x][y].layers[GAS]].mechFlags)
1174:
1175: #ifdef BROGUE_ASSERTS
1176: boolean cellHasTerrainFlag(short x, short y, unsigned long flagMask);
1177: #else
1178: #define cellHasTerrainFlag(x, y, flagMask) ((flagMask) & terrainFlags((x), (y)) ? true : false)
1179: #endif
1180: #define cellHasTMFlag(x, y, flagMask) ((flagMask) & terrainMechFlags((x), (y)) ? true : false)
1181:
1182: #define cellHasTerrainType(x, y, terrain) ((pmap[x][y].layers[DUNGEON] == (terrain) \
1183: || pmap[x][y].layers[LIQUID] == (terrain) \
1184: || pmap[x][y].layers[SURFACE] == (terrain) \
1185: || pmap[x][y].layers[GAS] == (terrain)) ? true : false)
1186:
1187: #define cellHasKnownTerrainFlag(x, y, flagMask) ((flagMask) & pmap[(x)][(y)].rememberedTerrainFlags ? true : false)
1188:
1189: #define cellIsPassableOrDoor(x, y) (!cellHasTerrainFlag((x), (y), T_PATHING_BLOCKER) \
1190: || (cellHasTMFlag((x), (y), (TM_IS_SECRET | TM_PROMOTES_WITH_KEY | TM_CONNECTS_LEVEL)) \
1191: && cellHasTerrainFlag((x), (y), T_OBSTRUCTS_PASSABILITY)))
1192:
1193: #define coordinatesAreInMap(x, y) ((x) >= 0 && (x) < DCOLS && (y) >= 0 && (y) < DROWS)
1194: #define coordinatesAreInWindow(x, y) ((x) >= 0 && (x) < COLS && (y) >= 0 && (y) < ROWS)
1195: #define mapToWindowX(x) ((x) + STAT_BAR_WIDTH + 1)
1196: #define mapToWindowY(y) ((y) + MESSAGE_LINES)
1197: #define windowToMapX(x) ((x) - STAT_BAR_WIDTH - 1)
1198: #define windowToMapY(y) ((y) - MESSAGE_LINES)
1199:
1200: #define playerCanDirectlySee(x, y) (pmap[x][y].flags & VISIBLE)
1201: #define playerCanSee(x, y) (pmap[x][y].flags & ANY_KIND_OF_VISIBLE)
1202: #define playerCanSeeOrSense(x, y) ((pmap[x][y].flags & ANY_KIND_OF_VISIBLE) \
1203: || (rogue.playbackOmniscience \
1204: && (pmap[x][y].layers[DUNGEON] != GRANITE || (pmap[x][y].flags & DISCOVERED))))
1205:
1206: #define CYCLE_MONSTERS_AND_PLAYERS(x) for ((x) = &player; (x) != NULL; (x) = ((x) == &player ? monsters->nextCreature : (x)->nextCreature))
1207:
1208: #define assureCosmeticRNG short oldRNG = rogue.RNG; rogue.RNG = RNG_COSMETIC;
1209: #define restoreRNG rogue.RNG = oldRNG;
1210:
1211: #define MIN_COLOR_DIFF 600
1212: // weighted sum of the squares of the component differences. Weights are according to color perception.
1213: #define COLOR_DIFF(f, b) (((f).red - (b).red) * ((f).red - (b).red) * 0.2126 \
1214: + ((f).green - (b).green) * ((f).green - (b).green) * 0.7152 \
1215: + ((f).blue - (b).blue) * ((f).blue - (b).blue) * 0.0722)
1216:
1217: // structs
1218:
1219: enum dungeonLayers {
1220: NO_LAYER = -1,
1221: DUNGEON = 0, // dungeon-level tile (e.g. walls)
1222: LIQUID, // liquid-level tile (e.g. lava)
1223: GAS, // gas-level tile (e.g. fire, smoke, swamp gas)
1224: SURFACE, // surface-level tile (e.g. grass)
1225: NUMBER_TERRAIN_LAYERS
1226: };
1227:
1228: // keeps track of graphics so we only redraw if the cell has changed:
1229: typedef struct cellDisplayBuffer {
1230: enum displayGlyph character;
1231: char foreColorComponents[3];
1232: char backColorComponents[3];
1233: char opacity;
1234: boolean needsUpdate;
1235: } cellDisplayBuffer;
1236:
1237: typedef struct pcell { // permanent cell; have to remember this stuff to save levels
1238: enum tileType layers[NUMBER_TERRAIN_LAYERS]; // terrain
1239: unsigned long flags; // non-terrain cell flags
1240: unsigned short volume; // quantity of gas in cell
1241: unsigned char machineNumber;
1242: cellDisplayBuffer rememberedAppearance; // how the player remembers the cell to look
1243: enum itemCategory rememberedItemCategory; // what category of item the player remembers lying there
1244: short rememberedItemKind; // what kind of item the player remembers lying there
1245: short rememberedItemQuantity; // how many of the item the player remembers lying there
1246: short rememberedItemOriginDepth; // the origin depth of the item the player remembers lying there
1247: enum tileType rememberedTerrain; // what the player remembers as the terrain (i.e. highest priority terrain upon last seeing)
1248: unsigned long rememberedCellFlags; // map cell flags the player remembers from that spot
1249: unsigned long rememberedTerrainFlags; // terrain flags the player remembers from that spot
1250: unsigned long rememberedTMFlags; // TM flags the player remembers from that spot
1251: } pcell;
1252:
1253: typedef struct tcell { // transient cell; stuff we don't need to remember between levels
1254: short light[3]; // RGB components of lighting
1255: short oldLight[3]; // compare with subsequent lighting to determine whether to refresh cell
1256: } tcell;
1257:
1258: typedef struct randomRange {
1259: short lowerBound;
1260: short upperBound;
1261: short clumpFactor;
1262: } randomRange;
1263:
1264: typedef struct color {
1265: // base RGB components:
1266: short red;
1267: short green;
1268: short blue;
1269:
1270: // random RGB components to add to base components:
1271: short redRand;
1272: short greenRand;
1273: short blueRand;
1274:
1275: // random scalar to add to all components:
1276: short rand;
1277:
1278: // Flag: this color "dances" with every refresh:
1279: boolean colorDances;
1280: } color;
1281:
1282: enum itemFlags {
1283: ITEM_IDENTIFIED = Fl(0),
1284: ITEM_EQUIPPED = Fl(1),
1285: ITEM_CURSED = Fl(2),
1286: ITEM_PROTECTED = Fl(3),
1287: // unused = Fl(4),
1288: ITEM_RUNIC = Fl(5),
1289: ITEM_RUNIC_HINTED = Fl(6),
1290: ITEM_RUNIC_IDENTIFIED = Fl(7),
1291: ITEM_CAN_BE_IDENTIFIED = Fl(8),
1292: ITEM_PREPLACED = Fl(9),
1293: ITEM_FLAMMABLE = Fl(10),
1294: ITEM_MAGIC_DETECTED = Fl(11),
1295: ITEM_MAX_CHARGES_KNOWN = Fl(12),
1296: ITEM_IS_KEY = Fl(13),
1297:
1298: ITEM_ATTACKS_STAGGER = Fl(14), // mace, hammer
1299: ITEM_ATTACKS_EXTEND = Fl(15), // whip
1300: ITEM_ATTACKS_QUICKLY = Fl(16), // rapier
1301: ITEM_ATTACKS_PENETRATE = Fl(17), // spear, pike
1302: ITEM_ATTACKS_ALL_ADJACENT=Fl(18), // axe, war axe
1303: ITEM_LUNGE_ATTACKS = Fl(19), // rapier
1304: ITEM_SNEAK_ATTACK_BONUS = Fl(20), // dagger
1305: ITEM_PASS_ATTACKS = Fl(21), // flail
1306:
1307: ITEM_KIND_AUTO_ID = Fl(22), // the item type will become known when the item is picked up.
1308: ITEM_PLAYER_AVOIDS = Fl(23), // explore and travel will try to avoid picking the item up
1309: };
1310:
1311: #define KEY_ID_MAXIMUM 20
1312:
1313: typedef struct keyLocationProfile {
1314: short x;
1315: short y;
1316: short machine;
1317: boolean disposableHere;
1318: } keyLocationProfile;
1319:
1320: typedef struct item {
1321: unsigned short category;
1322: short kind;
1323: unsigned long flags;
1324: randomRange damage;
1325: short armor;
1326: short charges;
1327: short enchant1;
1328: short enchant2;
1329: short timesEnchanted;
1330: enum monsterTypes vorpalEnemy;
1331: short strengthRequired;
1332: unsigned short quiverNumber;
1333: enum displayGlyph displayChar;
1334: color *foreColor;
1335: color *inventoryColor;
1336: short quantity;
1337: char inventoryLetter;
1338: char inscription[DCOLS];
1339: short xLoc;
1340: short yLoc;
1341: keyLocationProfile keyLoc[KEY_ID_MAXIMUM];
1342: short originDepth;
1343: struct item *nextItem;
1344: } item;
1345:
1346: typedef struct itemTable {
1347: char *name;
1348: char *flavor;
1349: char callTitle[30];
1350: short frequency;
1351: short marketValue;
1352: short strengthRequired;
1353: randomRange range;
1354: boolean identified;
1355: boolean called;
1356: char description[1500];
1357: } itemTable;
1358:
1359: enum dungeonFeatureTypes {
1360: DF_GRANITE_COLUMN = 1,
1361: DF_CRYSTAL_WALL,
1362: DF_LUMINESCENT_FUNGUS,
1363: DF_GRASS,
1364: DF_DEAD_GRASS,
1365: DF_BONES,
1366: DF_RUBBLE,
1367: DF_FOLIAGE,
1368: DF_FUNGUS_FOREST,
1369: DF_DEAD_FOLIAGE,
1370:
1371: DF_SUNLIGHT,
1372: DF_DARKNESS,
1373:
1374: DF_SHOW_DOOR,
1375: DF_SHOW_POISON_GAS_TRAP,
1376: DF_SHOW_PARALYSIS_GAS_TRAP,
1377: DF_SHOW_TRAPDOOR_HALO,
1378: DF_SHOW_TRAPDOOR,
1379: DF_SHOW_CONFUSION_GAS_TRAP,
1380: DF_SHOW_FLAMETHROWER_TRAP,
1381: DF_SHOW_FLOOD_TRAP,
1382: DF_SHOW_NET_TRAP,
1383: DF_SHOW_ALARM_TRAP,
1384:
1385: DF_RED_BLOOD,
1386: DF_GREEN_BLOOD,
1387: DF_PURPLE_BLOOD,
1388: DF_WORM_BLOOD,
1389: DF_ACID_BLOOD,
1390: DF_ASH_BLOOD,
1391: DF_EMBER_BLOOD,
1392: DF_ECTOPLASM_BLOOD,
1393: DF_RUBBLE_BLOOD,
1394: DF_ROT_GAS_BLOOD,
1395:
1396: DF_VOMIT,
1397: DF_BLOAT_DEATH,
1398: DF_BLOAT_EXPLOSION,
1399: DF_BLOOD_EXPLOSION,
1400: DF_FLAMEDANCER_CORONA,
1401:
1402: DF_MUTATION_EXPLOSION,
1403: DF_MUTATION_LICHEN,
1404:
1405: DF_REPEL_CREATURES,
1406: DF_ROT_GAS_PUFF,
1407: DF_STEAM_PUFF,
1408: DF_STEAM_ACCUMULATION,
1409: DF_METHANE_GAS_PUFF,
1410: DF_SALAMANDER_FLAME,
1411: DF_URINE,
1412: DF_UNICORN_POOP,
1413: DF_PUDDLE,
1414: DF_ASH,
1415: DF_ECTOPLASM_DROPLET,
1416: DF_FORCEFIELD,
1417: DF_FORCEFIELD_MELT,
1418: DF_SACRED_GLYPHS,
1419: DF_LICHEN_GROW,
1420: DF_TUNNELIZE,
1421: DF_SHATTERING_SPELL,
1422:
1423: // spiderwebs
1424: DF_WEB_SMALL,
1425: DF_WEB_LARGE,
1426:
1427: // ancient spirit
1428: DF_ANCIENT_SPIRIT_VINES,
1429: DF_ANCIENT_SPIRIT_GRASS,
1430:
1431: // foliage
1432: DF_TRAMPLED_FOLIAGE,
1433: DF_SMALL_DEAD_GRASS,
1434: DF_FOLIAGE_REGROW,
1435: DF_TRAMPLED_FUNGUS_FOREST,
1436: DF_FUNGUS_FOREST_REGROW,
1437:
1438: // brimstone
1439: DF_ACTIVE_BRIMSTONE,
1440: DF_INERT_BRIMSTONE,
1441:
1442: // bloodwort
1443: DF_BLOODFLOWER_PODS_GROW_INITIAL,
1444: DF_BLOODFLOWER_PODS_GROW,
1445: DF_BLOODFLOWER_POD_BURST,
1446:
1447: // dewars
1448: DF_DEWAR_CAUSTIC,
1449: DF_DEWAR_CONFUSION,
1450: DF_DEWAR_PARALYSIS,
1451: DF_DEWAR_METHANE,
1452: DF_DEWAR_GLASS,
1453: DF_CARPET_AREA,
1454:
1455: // algae
1456: DF_BUILD_ALGAE_WELL,
1457: DF_ALGAE_1,
1458: DF_ALGAE_2,
1459: DF_ALGAE_REVERT,
1460:
1461: DF_OPEN_DOOR,
1462: DF_CLOSED_DOOR,
1463: DF_OPEN_IRON_DOOR_INERT,
1464: DF_ITEM_CAGE_OPEN,
1465: DF_ITEM_CAGE_CLOSE,
1466: DF_ALTAR_INERT,
1467: DF_ALTAR_RETRACT,
1468: DF_PORTAL_ACTIVATE,
1469: DF_INACTIVE_GLYPH,
1470: DF_ACTIVE_GLYPH,
1471: DF_SILENT_GLYPH_GLOW,
1472: DF_GUARDIAN_STEP,
1473: DF_MIRROR_TOTEM_STEP,
1474: DF_GLYPH_CIRCLE,
1475: DF_REVEAL_LEVER,
1476: DF_PULL_LEVER,
1477: DF_CREATE_LEVER,
1478:
1479: DF_BRIDGE_FALL_PREP,
1480: DF_BRIDGE_FALL,
1481:
1482: DF_PLAIN_FIRE,
1483: DF_GAS_FIRE,
1484: DF_EXPLOSION_FIRE,
1485: DF_DART_EXPLOSION,
1486: DF_BRIMSTONE_FIRE,
1487: DF_BRIDGE_FIRE,
1488: DF_FLAMETHROWER,
1489: DF_EMBERS,
1490: DF_EMBERS_PATCH,
1491: DF_OBSIDIAN,
1492: DF_ITEM_FIRE,
1493: DF_CREATURE_FIRE,
1494:
1495: DF_FLOOD,
1496: DF_FLOOD_2,
1497: DF_FLOOD_DRAIN,
1498: DF_HOLE_2,
1499: DF_HOLE_DRAIN,
1500:
1501: DF_DEEP_WATER_FREEZE,
1502: DF_ALGAE_1_FREEZE,
1503: DF_ALGAE_2_FREEZE,
1504: DF_DEEP_WATER_MELTING,
1505: DF_DEEP_WATER_THAW,
1506: DF_SHALLOW_WATER_FREEZE,
1507: DF_SHALLOW_WATER_MELTING,
1508: DF_SHALLOW_WATER_THAW,
1509:
1510: DF_POISON_GAS_CLOUD,
1511: DF_CONFUSION_GAS_TRAP_CLOUD,
1512: DF_NET,
1513: DF_AGGRAVATE_TRAP,
1514: DF_METHANE_GAS_ARMAGEDDON,
1515:
1516: // potions
1517: DF_POISON_GAS_CLOUD_POTION,
1518: DF_PARALYSIS_GAS_CLOUD_POTION,
1519: DF_CONFUSION_GAS_CLOUD_POTION,
1520: DF_INCINERATION_POTION,
1521: DF_DARKNESS_POTION,
1522: DF_HOLE_POTION,
1523: DF_LICHEN_PLANTED,
1524:
1525: // other items
1526: DF_ARMOR_IMMOLATION,
1527: DF_STAFF_HOLE,
1528: DF_STAFF_HOLE_EDGE,
1529:
1530: // commutation altar
1531: DF_ALTAR_COMMUTE,
1532: DF_MAGIC_PIPING,
1533: DF_INERT_PIPE,
1534:
1535: // resurrection altar
1536: DF_ALTAR_RESURRECT,
1537: DF_MACHINE_FLOOR_TRIGGER_REPEATING,
1538:
1539: // sacrifice altar
1540: DF_SACRIFICE_ALTAR,
1541: DF_SACRIFICE_COMPLETE,
1542: DF_SACRIFICE_CAGE_ACTIVE,
1543:
1544: // vampire in coffin
1545: DF_COFFIN_BURSTS,
1546: DF_COFFIN_BURNS,
1547: DF_TRIGGER_AREA,
1548:
1549: // throwing tutorial -- button in chasm
1550: DF_CAGE_DISAPPEARS,
1551: DF_MEDIUM_HOLE,
1552: DF_MEDIUM_LAVA_POND,
1553: DF_MACHINE_PRESSURE_PLATE_USED,
1554:
1555: // rat trap
1556: DF_WALL_CRACK,
1557:
1558: // wooden barricade at entrance
1559: DF_WOODEN_BARRICADE_BURN,
1560:
1561: // wooden barricade around altar, dead grass all around
1562: DF_SURROUND_WOODEN_BARRICADE,
1563:
1564: // pools of water that, when triggered, slowly expand to fill the room
1565: DF_SPREADABLE_WATER,
1566: DF_SHALLOW_WATER,
1567: DF_WATER_SPREADS,
1568: DF_SPREADABLE_WATER_POOL,
1569: DF_SPREADABLE_DEEP_WATER_POOL,
1570:
1571: // when triggered, the ground gradually turns into chasm:
1572: DF_SPREADABLE_COLLAPSE,
1573: DF_COLLAPSE,
1574: DF_COLLAPSE_SPREADS,
1575: DF_ADD_MACHINE_COLLAPSE_EDGE_DORMANT,
1576:
1577: // when triggered, a bridge appears:
1578: DF_BRIDGE_ACTIVATE,
1579: DF_BRIDGE_ACTIVATE_ANNOUNCE,
1580: DF_BRIDGE_APPEARS,
1581: DF_ADD_DORMANT_CHASM_HALO,
1582:
1583: // when triggered, the lava retracts:
1584: DF_LAVA_RETRACTABLE,
1585: DF_RETRACTING_LAVA,
1586: DF_OBSIDIAN_WITH_STEAM,
1587:
1588: // when triggered, the door seals and caustic gas fills the room
1589: DF_SHOW_POISON_GAS_VENT,
1590: DF_POISON_GAS_VENT_OPEN,
1591: DF_ACTIVATE_PORTCULLIS,
1592: DF_OPEN_PORTCULLIS,
1593: DF_VENT_SPEW_POISON_GAS,
1594:
1595: // when triggered, pilot light ignites and explosive gas fills the room
1596: DF_SHOW_METHANE_VENT,
1597: DF_METHANE_VENT_OPEN,
1598: DF_VENT_SPEW_METHANE,
1599: DF_PILOT_LIGHT,
1600:
1601: // paralysis trap: trigger plate with gas vents nearby
1602: DF_DISCOVER_PARALYSIS_VENT,
1603: DF_PARALYSIS_VENT_SPEW,
1604: DF_REVEAL_PARALYSIS_VENT_SILENTLY,
1605:
1606: // thematic dungeon
1607: DF_AMBIENT_BLOOD,
1608:
1609: // statues crack for a few turns and then shatter, revealing the monster inside
1610: DF_CRACKING_STATUE,
1611: DF_STATUE_SHATTER,
1612:
1613: // a turret appears:
1614: DF_TURRET_EMERGE,
1615:
1616: // an elaborate worm catacomb opens up
1617: DF_WORM_TUNNEL_MARKER_DORMANT,
1618: DF_WORM_TUNNEL_MARKER_ACTIVE,
1619: DF_GRANITE_CRUMBLES,
1620: DF_WALL_OPEN,
1621:
1622: // the room gradually darkens
1623: DF_DARKENING_FLOOR,
1624: DF_DARK_FLOOR,
1625: DF_HAUNTED_TORCH_TRANSITION,
1626: DF_HAUNTED_TORCH,
1627:
1628: // bubbles rise from the mud and bog monsters spawn
1629: DF_MUD_DORMANT,
1630: DF_MUD_ACTIVATE,
1631:
1632: // crystals charge when hit by lightning
1633: DF_ELECTRIC_CRYSTAL_ON,
1634: DF_TURRET_LEVER,
1635:
1636: // idyll:
1637: DF_SHALLOW_WATER_POOL,
1638: DF_DEEP_WATER_POOL,
1639:
1640: // swamp:
1641: DF_SWAMP_WATER,
1642: DF_SWAMP,
1643: DF_SWAMP_MUD,
1644:
1645: // camp:
1646: DF_HAY,
1647: DF_JUNK,
1648:
1649: // remnants:
1650: DF_REMNANT,
1651: DF_REMNANT_ASH,
1652:
1653: // chasm catwalk:
1654: DF_CHASM_HOLE,
1655: DF_CATWALK_BRIDGE,
1656:
1657: // lake catwalk:
1658: DF_LAKE_CELL,
1659: DF_LAKE_HALO,
1660:
1661: // worm den:
1662: DF_WALL_SHATTER,
1663:
1664: // monster cages open:
1665: DF_MONSTER_CAGE_OPENS,
1666:
1667: // goblin warren:
1668: DF_STENCH_BURN,
1669: DF_STENCH_SMOLDER,
1670:
1671: NUMBER_DUNGEON_FEATURES,
1672: };
1673:
1674: enum dungeonProfileTypes {
1675: DP_BASIC,
1676: DP_BASIC_FIRST_ROOM,
1677:
1678: DP_GOBLIN_WARREN,
1679: DP_SENTINEL_SANCTUARY,
1680:
1681: NUMBER_DUNGEON_PROFILES,
1682: };
1683:
1684: typedef struct lightSource {
1685: const color *lightColor;
1686: randomRange lightRadius;
1687: short radialFadeToPercent;
1688: boolean passThroughCreatures; // generally no, but miner light does
1689: } lightSource;
1690:
1691: typedef struct flare {
1692: lightSource *light; // Flare light
1693: short coeffChangeAmount; // The constant amount by which the coefficient changes per frame, e.g. -25 means it gets 25% dimmer per frame.
1694: short coeffLimit; // Flare ends if the coefficient passes this percentage (whether going up or down).
1695: short xLoc, yLoc; // Current flare location.
1696: long coeff; // Current flare coefficient; always starts at 100.
1697: unsigned long turnNumber; // So we can eliminate those that fired one or more turns ago.
1698: } flare;
1699:
1700: enum DFFlags {
1701: DFF_EVACUATE_CREATURES_FIRST = Fl(0), // Creatures in the DF area get moved outside of it
1702: DFF_SUBSEQ_EVERYWHERE = Fl(1), // Subsequent DF spawns in every cell that this DF spawns in, instead of only the origin
1703: DFF_TREAT_AS_BLOCKING = Fl(2), // If filling the footprint of this DF with walls would disrupt level connectivity, then abort.
1704: DFF_PERMIT_BLOCKING = Fl(3), // Generate this DF without regard to level connectivity.
1705: DFF_ACTIVATE_DORMANT_MONSTER = Fl(4), // Dormant monsters on this tile will appear -- e.g. when a statue bursts to reveal a monster.
1706: DFF_CLEAR_OTHER_TERRAIN = Fl(5), // Erase other terrain in the footprint of this DF.
1707: DFF_BLOCKED_BY_OTHER_LAYERS = Fl(6), // Will not propagate into a cell if any layer in that cell has a superior priority.
1708: DFF_SUPERPRIORITY = Fl(7), // Will overwrite terrain of a superior priority.
1709: DFF_AGGRAVATES_MONSTERS = Fl(8), // Will act as though an aggravate monster scroll of effectRadius radius had been read at that point.
1710: DFF_RESURRECT_ALLY = Fl(9), // Will bring back to life your most recently deceased ally.
1711: };
1712:
1713: enum boltEffects {
1714: BE_NONE,
1715: BE_ATTACK,
1716: BE_TELEPORT,
1717: BE_SLOW,
1718: BE_POLYMORPH,
1719: BE_NEGATION,
1720: BE_DOMINATION,
1721: BE_BECKONING,
1722: BE_PLENTY,
1723: BE_INVISIBILITY,
1724: BE_EMPOWERMENT,
1725: BE_DAMAGE,
1726: BE_POISON,
1727: BE_TUNNELING,
1728: BE_BLINKING,
1729: BE_ENTRANCEMENT,
1730: BE_OBSTRUCTION,
1731: BE_DISCORD,
1732: BE_CONJURATION,
1733: BE_HEALING,
1734: BE_HASTE,
1735: BE_SHIELDING,
1736: };
1737:
1738: enum boltFlags {
1739: BF_PASSES_THRU_CREATURES = Fl(0), // Bolt continues through creatures (e.g. lightning and tunneling)
1740: BF_HALTS_BEFORE_OBSTRUCTION = Fl(1), // Bolt takes effect the space before it terminates (e.g. conjuration, obstruction, blinking)
1741: BF_TARGET_ALLIES = Fl(2), // Staffs/wands/creatures that shoot this bolt will auto-target allies.
1742: BF_TARGET_ENEMIES = Fl(3), // Staffs/wands/creatures that shoot this bolt will auto-target enemies.
1743: BF_FIERY = Fl(4), // Bolt will light flammable terrain on fire as it passes, and will ignite monsters hit.
1744: BF_NEVER_REFLECTS = Fl(6), // Bolt will never reflect (e.g. spiderweb, arrows).
1745: BF_NOT_LEARNABLE = Fl(7), // This technique cannot be absorbed by empowered allies.
1746: BF_NOT_NEGATABLE = Fl(8), // Won't be erased by negation.
1747: BF_ELECTRIC = Fl(9), // Activates terrain that has TM_PROMOTES_ON_ELECTRICITY
1748: BF_DISPLAY_CHAR_ALONG_LENGTH = Fl(10), // Display the character along the entire length of the bolt instead of just at the front.
1749: };
1750:
1751: typedef struct bolt {
1752: char name[DCOLS];
1753: char description[COLS];
1754: char abilityDescription[COLS*2];
1755: enum displayGlyph theChar;
1756: const color *foreColor;
1757: const color *backColor;
1758: short boltEffect;
1759: short magnitude;
1760: short pathDF;
1761: short targetDF;
1762: unsigned long forbiddenMonsterFlags;
1763: unsigned long flags;
1764: } bolt;
1765:
1766: // Level profiles, affecting what rooms get chosen and how they're connected:
1767: typedef struct dungeonProfile {
1768: // Room type weights (in the natural dungeon, these are also adjusted based on depth):
1769: short roomFrequencies[ROOM_TYPE_COUNT];
1770:
1771: short corridorChance;
1772: } dungeonProfile;
1773:
1774: // Dungeon features, spawned from Architect.c:
1775: typedef struct dungeonFeature {
1776: // tile info:
1777: enum tileType tile;
1778: enum dungeonLayers layer;
1779:
1780: // spawning pattern:
1781: short startProbability;
1782: short probabilityDecrement;
1783: unsigned long flags;
1784: char description[DCOLS];
1785: enum lightType lightFlare;
1786: const color *flashColor;
1787: short effectRadius;
1788: enum tileType propagationTerrain;
1789: enum dungeonFeatureTypes subsequentDF;
1790: boolean messageDisplayed;
1791: } dungeonFeature;
1792:
1793: // Terrain types:
1794: typedef struct floorTileType {
1795: // appearance:
1796: enum displayGlyph displayChar;
1797: const color *foreColor;
1798: const color *backColor;
1799: short drawPriority; // priority (lower number means higher priority); governs drawing as well as tile replacement comparisons.
1800: char chanceToIgnite; // chance to burn if a flame terrain is on one of the four cardinal neighbors
1801: enum dungeonFeatureTypes fireType; // spawn this DF when the terrain ignites (or, if it's T_IS_DF_TRAP, when the pressure plate clicks)
1802: enum dungeonFeatureTypes discoverType; // spawn this DF when successfully searched if T_IS_SECRET is set
1803: enum dungeonFeatureTypes promoteType; // creates this dungeon spawn type when it promotes for some other reason (random promotion or promotion through machine activation)
1804: short promoteChance; // percent chance per turn to spawn the promotion type; will also vanish upon doing so if T_VANISHES_UPON_PROMOTION is set
1805: short glowLight; // if it glows, this is the ID of the light type
1806: unsigned long flags;
1807: unsigned long mechFlags;
1808: char description[COLS];
1809: char flavorText[COLS];
1810: } floorTileType;
1811:
1812: enum terrainFlagCatalog {
1813: T_OBSTRUCTS_PASSABILITY = Fl(0), // cannot be walked through
1814: T_OBSTRUCTS_VISION = Fl(1), // blocks line of sight
1815: T_OBSTRUCTS_ITEMS = Fl(2), // items can't be on this tile
1816: T_OBSTRUCTS_SURFACE_EFFECTS = Fl(3), // grass, blood, etc. cannot exist on this tile
1817: T_OBSTRUCTS_GAS = Fl(4), // blocks the permeation of gas
1818: T_OBSTRUCTS_DIAGONAL_MOVEMENT = Fl(5), // can't step diagonally around this tile
1819: T_SPONTANEOUSLY_IGNITES = Fl(6), // monsters avoid unless chasing player or immune to fire
1820: T_AUTO_DESCENT = Fl(7), // automatically drops creatures down a depth level and does some damage (2d6)
1821: T_LAVA_INSTA_DEATH = Fl(8), // kills any non-levitating non-fire-immune creature instantly
1822: T_CAUSES_POISON = Fl(9), // any non-levitating creature gets 10 poison
1823: T_IS_FLAMMABLE = Fl(10), // terrain can catch fire
1824: T_IS_FIRE = Fl(11), // terrain is a type of fire; ignites neighboring flammable cells
1825: T_ENTANGLES = Fl(12), // entangles players and monsters like a spiderweb
1826: T_IS_DEEP_WATER = Fl(13), // steals items 50% of the time and moves them around randomly
1827: T_CAUSES_DAMAGE = Fl(14), // anything on the tile takes max(1-2, 10%) damage per turn
1828: T_CAUSES_NAUSEA = Fl(15), // any creature on the tile becomes nauseous
1829: T_CAUSES_PARALYSIS = Fl(16), // anything caught on this tile is paralyzed
1830: T_CAUSES_CONFUSION = Fl(17), // causes creatures on this tile to become confused
1831: T_CAUSES_HEALING = Fl(18), // heals 20% max HP per turn for any player or non-inanimate monsters
1832: T_IS_DF_TRAP = Fl(19), // spews gas of type specified in fireType when stepped on
1833: T_CAUSES_EXPLOSIVE_DAMAGE = Fl(20), // is an explosion; deals higher of 15-20 or 50% damage instantly, but not again for five turns
1834: T_SACRED = Fl(21), // monsters that aren't allies of the player will avoid stepping here
1835:
1836: T_OBSTRUCTS_SCENT = (T_OBSTRUCTS_PASSABILITY | T_OBSTRUCTS_VISION | T_AUTO_DESCENT | T_LAVA_INSTA_DEATH | T_IS_DEEP_WATER | T_SPONTANEOUSLY_IGNITES),
1837: T_PATHING_BLOCKER = (T_OBSTRUCTS_PASSABILITY | T_AUTO_DESCENT | T_IS_DF_TRAP | T_LAVA_INSTA_DEATH | T_IS_DEEP_WATER | T_IS_FIRE | T_SPONTANEOUSLY_IGNITES),
1838: T_DIVIDES_LEVEL = (T_OBSTRUCTS_PASSABILITY | T_AUTO_DESCENT | T_IS_DF_TRAP | T_LAVA_INSTA_DEATH | T_IS_DEEP_WATER),
1839: T_LAKE_PATHING_BLOCKER = (T_AUTO_DESCENT | T_LAVA_INSTA_DEATH | T_IS_DEEP_WATER | T_SPONTANEOUSLY_IGNITES),
1840: T_WAYPOINT_BLOCKER = (T_OBSTRUCTS_PASSABILITY | T_AUTO_DESCENT | T_IS_DF_TRAP | T_LAVA_INSTA_DEATH | T_IS_DEEP_WATER | T_SPONTANEOUSLY_IGNITES),
1841: T_MOVES_ITEMS = (T_IS_DEEP_WATER | T_LAVA_INSTA_DEATH),
1842: T_CAN_BE_BRIDGED = (T_AUTO_DESCENT),
1843: T_OBSTRUCTS_EVERYTHING = (T_OBSTRUCTS_PASSABILITY | T_OBSTRUCTS_VISION | T_OBSTRUCTS_ITEMS | T_OBSTRUCTS_GAS | T_OBSTRUCTS_SURFACE_EFFECTS | T_OBSTRUCTS_DIAGONAL_MOVEMENT),
1844: T_HARMFUL_TERRAIN = (T_CAUSES_POISON | T_IS_FIRE | T_CAUSES_DAMAGE | T_CAUSES_PARALYSIS | T_CAUSES_CONFUSION | T_CAUSES_EXPLOSIVE_DAMAGE),
1845: T_RESPIRATION_IMMUNITIES = (T_CAUSES_DAMAGE | T_CAUSES_CONFUSION | T_CAUSES_PARALYSIS | T_CAUSES_NAUSEA),
1846: };
1847:
1848: enum terrainMechanicalFlagCatalog {
1849: TM_IS_SECRET = Fl(0), // successful search or being stepped on while visible transforms it into discoverType
1850: TM_PROMOTES_WITH_KEY = Fl(1), // promotes if the key is present on the tile (in your pack, carried by monster, or lying on the ground)
1851: TM_PROMOTES_WITHOUT_KEY = Fl(2), // promotes if the key is NOT present on the tile (in your pack, carried by monster, or lying on the ground)
1852: TM_PROMOTES_ON_STEP = Fl(3), // promotes when a creature, player or item is on the tile (whether or not levitating)
1853: TM_PROMOTES_ON_ITEM_PICKUP = Fl(4), // promotes when an item is lifted from the tile (primarily for altars)
1854: TM_PROMOTES_ON_PLAYER_ENTRY = Fl(5), // promotes when the player enters the tile (whether or not levitating)
1855: TM_PROMOTES_ON_SACRIFICE_ENTRY = Fl(6), // promotes when the sacrifice target enters the tile (whether or not levitating)
1856: TM_PROMOTES_ON_ELECTRICITY = Fl(7), // promotes when hit by a lightning bolt
1857: TM_ALLOWS_SUBMERGING = Fl(8), // allows submersible monsters to submerge in this terrain
1858: TM_IS_WIRED = Fl(9), // if wired, promotes when powered, and sends power when promoting
1859: TM_IS_CIRCUIT_BREAKER = Fl(10), // prevents power from circulating in its machine
1860: TM_GAS_DISSIPATES = Fl(11), // does not just hang in the air forever
1861: TM_GAS_DISSIPATES_QUICKLY = Fl(12), // dissipates quickly
1862: TM_EXTINGUISHES_FIRE = Fl(13), // extinguishes burning terrain or creatures
1863: TM_VANISHES_UPON_PROMOTION = Fl(14), // vanishes when creating promotion dungeon feature, even if the replacement terrain priority doesn't require it
1864: TM_REFLECTS_BOLTS = Fl(15), // magic bolts reflect off of its surface randomly (similar to pmap flag IMPREGNABLE)
1865: TM_STAND_IN_TILE = Fl(16), // earthbound creatures will be said to stand "in" the tile, not on it
1866: TM_LIST_IN_SIDEBAR = Fl(17), // terrain will be listed in the sidebar with a description of the terrain type
1867: TM_VISUALLY_DISTINCT = Fl(18), // terrain will be color-adjusted if necessary so the character stands out from the background
1868: TM_BRIGHT_MEMORY = Fl(19), // no blue fade when this tile is out of sight
1869: TM_EXPLOSIVE_PROMOTE = Fl(20), // when burned, will promote to promoteType instead of burningType if surrounded by tiles with T_IS_FIRE or TM_EXPLOSIVE_PROMOTE
1870: TM_CONNECTS_LEVEL = Fl(21), // will be treated as passable for purposes of calculating level connectedness, irrespective of other aspects of this terrain layer
1871: TM_INTERRUPT_EXPLORATION_WHEN_SEEN = Fl(22), // will generate a message when discovered during exploration to interrupt exploration
1872: TM_INVERT_WHEN_HIGHLIGHTED = Fl(23), // will flip fore and back colors when highlighted with pathing
1873: TM_SWAP_ENCHANTS_ACTIVATION = Fl(24), // in machine, swap item enchantments when two suitable items are on this terrain, and activate the machine when that happens
1874: };
1875:
1876: enum statusEffects {
1877: STATUS_SEARCHING = 0,
1878: STATUS_DONNING,
1879: STATUS_WEAKENED,
1880: STATUS_TELEPATHIC,
1881: STATUS_HALLUCINATING,
1882: STATUS_LEVITATING,
1883: STATUS_SLOWED,
1884: STATUS_HASTED,
1885: STATUS_CONFUSED,
1886: STATUS_BURNING,
1887: STATUS_PARALYZED,
1888: STATUS_POISONED,
1889: STATUS_STUCK,
1890: STATUS_NAUSEOUS,
1891: STATUS_DISCORDANT,
1892: STATUS_IMMUNE_TO_FIRE,
1893: STATUS_EXPLOSION_IMMUNITY,
1894: STATUS_NUTRITION,
1895: STATUS_ENTERS_LEVEL_IN,
1896: STATUS_MAGICAL_FEAR,
1897: STATUS_ENTRANCED,
1898: STATUS_DARKNESS,
1899: STATUS_LIFESPAN_REMAINING,
1900: STATUS_SHIELDED,
1901: STATUS_INVISIBLE,
1902: STATUS_AGGRAVATING,
1903: NUMBER_OF_STATUS_EFFECTS,
1904: };
1905:
1906: enum hordeFlags {
1907: HORDE_DIES_ON_LEADER_DEATH = Fl(0), // if the leader dies, the horde will die instead of electing new leader
1908: HORDE_IS_SUMMONED = Fl(1), // minions summoned when any creature is the same species as the leader and casts summon
1909: HORDE_SUMMONED_AT_DISTANCE = Fl(2), // summons will appear across the level, and will naturally path back to the leader
1910: HORDE_LEADER_CAPTIVE = Fl(3), // the leader is in chains and the followers are guards
1911: HORDE_NO_PERIODIC_SPAWN = Fl(4), // can spawn only when the level begins -- not afterwards
1912: HORDE_ALLIED_WITH_PLAYER = Fl(5),
1913:
1914: HORDE_MACHINE_BOSS = Fl(6), // used in machines for a boss challenge
1915: HORDE_MACHINE_WATER_MONSTER = Fl(7), // used in machines where the room floods with shallow water
1916: HORDE_MACHINE_CAPTIVE = Fl(8), // powerful captive monsters without any captors
1917: HORDE_MACHINE_STATUE = Fl(9), // the kinds of monsters that make sense in a statue
1918: HORDE_MACHINE_TURRET = Fl(10), // turrets, for hiding in walls
1919: HORDE_MACHINE_MUD = Fl(11), // bog monsters, for hiding in mud
1920: HORDE_MACHINE_KENNEL = Fl(12), // monsters that can appear in cages in kennels
1921: HORDE_VAMPIRE_FODDER = Fl(13), // monsters that are prone to capture and farming by vampires
1922: HORDE_MACHINE_LEGENDARY_ALLY = Fl(14), // legendary allies
1923: HORDE_NEVER_OOD = Fl(15), // Horde cannot be generated out of depth
1924: HORDE_MACHINE_THIEF = Fl(16), // monsters that can be generated in the key thief area machines
1925: HORDE_MACHINE_GOBLIN_WARREN = Fl(17), // can spawn in goblin warrens
1926: HORDE_SACRIFICE_TARGET = Fl(18), // can be the target of an assassination challenge; leader will get scary light.
1927:
1928: HORDE_MACHINE_ONLY = (HORDE_MACHINE_BOSS | HORDE_MACHINE_WATER_MONSTER
1929: | HORDE_MACHINE_CAPTIVE | HORDE_MACHINE_STATUE
1930: | HORDE_MACHINE_TURRET | HORDE_MACHINE_MUD
1931: | HORDE_MACHINE_KENNEL | HORDE_VAMPIRE_FODDER
1932: | HORDE_MACHINE_LEGENDARY_ALLY | HORDE_MACHINE_THIEF
1933: | HORDE_MACHINE_GOBLIN_WARREN
1934: | HORDE_SACRIFICE_TARGET),
1935: };
1936:
1937: enum monsterBehaviorFlags {
1938: MONST_INVISIBLE = Fl(0), // monster is invisible
1939: MONST_INANIMATE = Fl(1), // monster has abbreviated stat bar display and is immune to many things
1940: MONST_IMMOBILE = Fl(2), // monster won't move or perform melee attacks
1941: MONST_CARRY_ITEM_100 = Fl(3), // monster carries an item 100% of the time
1942: MONST_CARRY_ITEM_25 = Fl(4), // monster carries an item 25% of the time
1943: MONST_ALWAYS_HUNTING = Fl(5), // monster is never asleep or in wandering mode
1944: MONST_FLEES_NEAR_DEATH = Fl(6), // monster flees when under 25% health and re-engages when over 75%
1945: MONST_ATTACKABLE_THRU_WALLS = Fl(7), // can be attacked when embedded in a wall
1946: MONST_DEFEND_DEGRADE_WEAPON = Fl(8), // hitting the monster damages the weapon
1947: MONST_IMMUNE_TO_WEAPONS = Fl(9), // weapons ineffective
1948: MONST_FLIES = Fl(10), // permanent levitation
1949: MONST_FLITS = Fl(11), // moves randomly a third of the time
1950: MONST_IMMUNE_TO_FIRE = Fl(12), // won't burn, won't die in lava
1951: MONST_CAST_SPELLS_SLOWLY = Fl(13), // takes twice the attack duration to cast a spell
1952: MONST_IMMUNE_TO_WEBS = Fl(14), // monster passes freely through webs
1953: MONST_REFLECT_4 = Fl(15), // monster reflects projectiles as though wearing +4 armor of reflection
1954: MONST_NEVER_SLEEPS = Fl(16), // monster is always awake
1955: MONST_FIERY = Fl(17), // monster carries an aura of flame (but no automatic fire light)
1956: MONST_INVULNERABLE = Fl(18), // monster is immune to absolutely everything
1957: MONST_IMMUNE_TO_WATER = Fl(19), // monster moves at full speed in deep water and (if player) doesn't drop items
1958: MONST_RESTRICTED_TO_LIQUID = Fl(20), // monster can move only on tiles that allow submersion
1959: MONST_SUBMERGES = Fl(21), // monster can submerge in appropriate terrain
1960: MONST_MAINTAINS_DISTANCE = Fl(22), // monster tries to keep a distance of 3 tiles between it and player
1961: MONST_WILL_NOT_USE_STAIRS = Fl(23), // monster won't chase the player between levels
1962: MONST_DIES_IF_NEGATED = Fl(24), // monster will die if exposed to negation magic
1963: MONST_MALE = Fl(25), // monster is male (or 50% likely to be male if also has MONST_FEMALE)
1964: MONST_FEMALE = Fl(26), // monster is female (or 50% likely to be female if also has MONST_MALE)
1965: MONST_NOT_LISTED_IN_SIDEBAR = Fl(27), // monster doesn't show up in the sidebar
1966: MONST_GETS_TURN_ON_ACTIVATION = Fl(28), // monster never gets a turn, except when its machine is activated
1967: MONST_ALWAYS_USE_ABILITY = Fl(29), // monster will never fail to use special ability if eligible (no random factor)
1968: MONST_NO_POLYMORPH = Fl(30), // monster cannot result from a polymorph spell (liches, phoenixes and Warden of Yendor)
1969:
1970: NEGATABLE_TRAITS = (MONST_INVISIBLE | MONST_DEFEND_DEGRADE_WEAPON | MONST_IMMUNE_TO_WEAPONS | MONST_FLIES
1971: | MONST_FLITS | MONST_IMMUNE_TO_FIRE | MONST_REFLECT_4 | MONST_FIERY | MONST_MAINTAINS_DISTANCE),
1972: MONST_TURRET = (MONST_IMMUNE_TO_WEBS | MONST_NEVER_SLEEPS | MONST_IMMOBILE | MONST_INANIMATE |
1973: MONST_ATTACKABLE_THRU_WALLS | MONST_WILL_NOT_USE_STAIRS),
1974: LEARNABLE_BEHAVIORS = (MONST_INVISIBLE | MONST_FLIES | MONST_IMMUNE_TO_FIRE | MONST_REFLECT_4),
1975: MONST_NEVER_VORPAL_ENEMY = (MONST_INANIMATE | MONST_INVULNERABLE | MONST_IMMOBILE | MONST_RESTRICTED_TO_LIQUID | MONST_GETS_TURN_ON_ACTIVATION | MONST_MAINTAINS_DISTANCE),
1976: MONST_NEVER_MUTATED = (MONST_INVISIBLE | MONST_INANIMATE | MONST_IMMOBILE | MONST_INVULNERABLE),
1977: };
1978:
1979: enum monsterAbilityFlags {
1980: MA_HIT_HALLUCINATE = Fl(0), // monster can hit to cause hallucinations
1981: MA_HIT_STEAL_FLEE = Fl(1), // monster can steal an item and then run away
1982: MA_HIT_BURN = Fl(2), // monster can hit to set you on fire
1983: MA_ENTER_SUMMONS = Fl(3), // monster will "become" its summoned leader, reappearing when that leader is defeated
1984: MA_HIT_DEGRADE_ARMOR = Fl(4), // monster damages armor
1985: MA_CAST_SUMMON = Fl(5), // requires that there be one or more summon hordes with this monster type as the leader
1986: MA_SEIZES = Fl(6), // monster seizes enemies before attacking
1987: MA_POISONS = Fl(7), // monster's damage is dealt in the form of poison
1988: MA_DF_ON_DEATH = Fl(8), // monster spawns its DF when it dies
1989: MA_CLONE_SELF_ON_DEFEND = Fl(9), // monster splits in two when struck
1990: MA_KAMIKAZE = Fl(10), // monster dies instead of attacking
1991: MA_TRANSFERENCE = Fl(11), // monster recovers 40 or 90% of the damage that it inflicts as health
1992: MA_CAUSES_WEAKNESS = Fl(12), // monster attacks cause weakness status in target
1993: MA_ATTACKS_PENETRATE = Fl(13), // monster attacks all adjacent enemies, like an axe
1994: MA_ATTACKS_ALL_ADJACENT = Fl(14), // monster attacks penetrate one layer of enemies, like a spear
1995: MA_ATTACKS_EXTEND = Fl(15), // monster attacks from a distance in a cardinal direction, like a whip
1996: MA_ATTACKS_STAGGER = Fl(16), // monster attacks will push the player backward by one space if there is room
1997: MA_AVOID_CORRIDORS = Fl(17), // monster will avoid corridors when hunting
1998:
1999: SPECIAL_HIT = (MA_HIT_HALLUCINATE | MA_HIT_STEAL_FLEE | MA_HIT_DEGRADE_ARMOR | MA_POISONS
2000: | MA_TRANSFERENCE | MA_CAUSES_WEAKNESS | MA_HIT_BURN | MA_ATTACKS_STAGGER),
2001: LEARNABLE_ABILITIES = (MA_TRANSFERENCE | MA_CAUSES_WEAKNESS),
2002:
2003: MA_NON_NEGATABLE_ABILITIES = (MA_ATTACKS_PENETRATE | MA_ATTACKS_ALL_ADJACENT | MA_ATTACKS_EXTEND | MA_ATTACKS_STAGGER),
2004: MA_NEVER_VORPAL_ENEMY = (MA_KAMIKAZE),
2005: MA_NEVER_MUTATED = (MA_KAMIKAZE),
2006: };
2007:
2008: enum monsterBookkeepingFlags {
2009: MB_WAS_VISIBLE = Fl(0), // monster was visible to player last turn
2010: MB_TELEPATHICALLY_REVEALED = Fl(1), // player can magically see monster and adjacent cells
2011: MB_PREPLACED = Fl(2), // monster dropped onto the level and requires post-processing
2012: MB_APPROACHING_UPSTAIRS = Fl(3), // following the player up the stairs
2013: MB_APPROACHING_DOWNSTAIRS = Fl(4), // following the player down the stairs
2014: MB_APPROACHING_PIT = Fl(5), // following the player down a pit
2015: MB_LEADER = Fl(6), // monster is the leader of a horde
2016: MB_FOLLOWER = Fl(7), // monster is a member of a horde
2017: MB_CAPTIVE = Fl(8), // monster is all tied up
2018: MB_SEIZED = Fl(9), // monster is being held
2019: MB_SEIZING = Fl(10), // monster is holding another creature immobile
2020: MB_SUBMERGED = Fl(11), // monster is currently submerged and hence invisible until it attacks
2021: MB_JUST_SUMMONED = Fl(12), // used to mark summons so they can be post-processed
2022: MB_WILL_FLASH = Fl(13), // this monster will flash as soon as control is returned to the player
2023: MB_BOUND_TO_LEADER = Fl(14), // monster will die if the leader dies or becomes separated from the leader
2024: MB_MARKED_FOR_SACRIFICE = Fl(15), // scary glow, monster can be sacrificed in the appropriate machine
2025: MB_ABSORBING = Fl(16), // currently learning a skill by absorbing an enemy corpse
2026: MB_DOES_NOT_TRACK_LEADER = Fl(17), // monster will not follow its leader around
2027: MB_IS_FALLING = Fl(18), // monster is plunging downward at the end of the turn
2028: MB_IS_DYING = Fl(19), // monster has already been killed and is awaiting the end-of-turn graveyard sweep (or in purgatory)
2029: MB_GIVEN_UP_ON_SCENT = Fl(20), // to help the monster remember that the scent map is a dead end
2030: MB_IS_DORMANT = Fl(21), // lurking, waiting to burst out
2031: MB_HAS_SOUL = Fl(22), // slaying the monster will count toward weapon auto-ID
2032: MB_ALREADY_SEEN = Fl(23), // seeing this monster won't interrupt exploration
2033: MB_HAS_ENTRANCED_MOVED = Fl(24) // has already moved while entranced and should not move again
2034: };
2035:
2036: // Defines all creatures, which include monsters and the player:
2037: typedef struct creatureType {
2038: enum monsterTypes monsterID; // index number for the monsterCatalog
2039: char monsterName[COLS];
2040: enum displayGlyph displayChar;
2041: const color *foreColor;
2042: short maxHP;
2043: short defense;
2044: short accuracy;
2045: randomRange damage;
2046: long turnsBetweenRegen; // turns to wait before regaining 1 HP
2047: short movementSpeed;
2048: short attackSpeed;
2049: enum dungeonFeatureTypes bloodType;
2050: enum lightType intrinsicLightType;
2051: boolean isLarge; // used for size of psychic emanation
2052: short DFChance; // percent chance to spawn the dungeon feature per awake turn
2053: enum dungeonFeatureTypes DFType; // kind of dungeon feature
2054: enum boltType bolts[20];
2055: unsigned long flags;
2056: unsigned long abilityFlags;
2057: } creatureType;
2058:
2059: typedef struct monsterWords {
2060: char flavorText[COLS*5];
2061: char absorbing[40];
2062: char absorbStatus[40];
2063: char attack[5][30];
2064: char DFMessage[DCOLS * 2];
2065: char summonMessage[DCOLS * 2];
2066: } monsterWords;
2067:
2068: enum creatureStates {
2069: MONSTER_SLEEPING,
2070: MONSTER_TRACKING_SCENT,
2071: MONSTER_WANDERING,
2072: MONSTER_FLEEING,
2073: MONSTER_ALLY,
2074: };
2075:
2076: enum creatureModes {
2077: MODE_NORMAL,
2078: MODE_PERM_FLEEING
2079: };
2080:
2081: typedef struct mutation {
2082: char title[100];
2083: const color *textColor;
2084: short healthFactor;
2085: short moveSpeedFactor;
2086: short attackSpeedFactor;
2087: short defenseFactor;
2088: short damageFactor;
2089: short DFChance;
2090: enum dungeonFeatureTypes DFType;
2091: enum lightType light;
2092: unsigned long monsterFlags;
2093: unsigned long monsterAbilityFlags;
2094: unsigned long forbiddenFlags;
2095: unsigned long forbiddenAbilityFlags;
2096: char description[1000];
2097: boolean canBeNegated;
2098: } mutation;
2099:
2100: typedef struct hordeType {
2101: enum monsterTypes leaderType;
2102:
2103: // membership information
2104: short numberOfMemberTypes;
2105: enum monsterTypes memberType[5];
2106: randomRange memberCount[5];
2107:
2108: // spawning information
2109: short minLevel;
2110: short maxLevel;
2111: short frequency;
2112: enum tileType spawnsIn;
2113: short machine;
2114:
2115: enum hordeFlags flags;
2116: } hordeType;
2117:
2118: typedef struct monsterClass {
2119: char name[30];
2120: short frequency;
2121: short maxDepth;
2122: enum monsterTypes memberList[15];
2123: } monsterClass;
2124:
2125: typedef struct creature {
2126: creatureType info;
2127: short xLoc;
2128: short yLoc;
2129: short depth;
2130: short currentHP;
2131: long turnsUntilRegen;
2132: short regenPerTurn; // number of HP to regenerate every single turn
2133: short weaknessAmount; // number of points of weakness that are inflicted by the weakness status
2134: short poisonAmount; // number of points of damage per turn from poison
2135: enum creatureStates creatureState; // current behavioral state
2136: enum creatureModes creatureMode; // current behavioral mode (higher-level than state)
2137:
2138: short mutationIndex; // what mutation the monster has (or -1 for none)
2139:
2140: // Waypoints:
2141: short targetWaypointIndex; // the index number of the waypoint we're pathing toward
2142: boolean waypointAlreadyVisited[MAX_WAYPOINT_COUNT]; // checklist of waypoints
2143: short lastSeenPlayerAt[2]; // last location at which the monster hunted the player
2144:
2145: short targetCorpseLoc[2]; // location of the corpse that the monster is approaching to gain its abilities
2146: char targetCorpseName[30]; // name of the deceased monster that we're approaching to gain its abilities
2147: unsigned long absorptionFlags; // ability/behavior flags that the monster will gain when absorption is complete
2148: boolean absorbBehavior; // above flag is behavior instead of ability (ignored if absorptionBolt is set)
2149: short absorptionBolt; // bolt index that the monster will learn to cast when absorption is complete
2150: short corpseAbsorptionCounter; // used to measure both the time until the monster stops being interested in the corpse,
2151: // and, later, the time until the monster finishes absorbing the corpse.
2152: short **mapToMe; // if a pack leader, this is a periodically updated pathing map to get to the leader
2153: short **safetyMap; // fleeing monsters store their own safety map when out of player FOV to avoid omniscience
2154: short ticksUntilTurn; // how long before the creature gets its next move
2155:
2156: // Locally cached statistics that may be temporarily modified:
2157: short movementSpeed;
2158: short attackSpeed;
2159:
2160: short previousHealthPoints; // remembers what your health proportion was at the start of the turn
2161: short turnsSpentStationary; // how many (subjective) turns it's been since the creature moved between tiles
2162: short flashStrength; // monster will flash soon; this indicates the percent strength of flash
2163: color flashColor; // the color that the monster will flash
2164: short status[NUMBER_OF_STATUS_EFFECTS];
2165: short maxStatus[NUMBER_OF_STATUS_EFFECTS]; // used to set the max point on the status bars
2166: unsigned long bookkeepingFlags;
2167: short spawnDepth; // keep track of the depth of the machine to which they relate (for activation monsters)
2168: short machineHome; // monsters that spawn in a machine keep track of the machine number here (for activation monsters)
2169: short xpxp; // exploration experience (used to time telepathic bonding for allies)
2170: short newPowerCount; // how many more times this monster can absorb a fallen monster
2171: short totalPowerCount; // how many times has the monster been empowered? Used to recover abilities when negated.
2172:
2173: struct creature *leader; // only if monster is a follower
2174: struct creature *carriedMonster; // when vampires turn into bats, one of the bats restores the vampire when it dies
2175: struct creature *nextCreature;
2176: struct item *carriedItem; // only used for monsters
2177: } creature;
2178:
2179: enum NGCommands {
2180: NG_NOTHING = 0,
2181: NG_NEW_GAME,
2182: NG_NEW_GAME_WITH_SEED,
2183: NG_OPEN_GAME,
2184: NG_VIEW_RECORDING,
2185: NG_HIGH_SCORES,
2186: NG_QUIT,
2187: };
2188:
2189: enum featTypes {
2190: FEAT_PURE_MAGE = 0,
2191: FEAT_PURE_WARRIOR,
2192: FEAT_PACIFIST,
2193: FEAT_ARCHIVIST,
2194: FEAT_COMPANION,
2195: FEAT_SPECIALIST,
2196: FEAT_JELLYMANCER,
2197: FEAT_INDOMITABLE,
2198: FEAT_MYSTIC,
2199: FEAT_DRAGONSLAYER,
2200: FEAT_PALADIN,
2201:
2202: FEAT_COUNT,
2203: };
2204:
2205: // these are basically global variables pertaining to the game state and player's unique variables:
2206: typedef struct playerCharacter {
2207: boolean wizard; // in wizard mode
2208:
2209: short depthLevel; // which dungeon level are we on
2210: short deepestLevel;
2211: boolean disturbed; // player should stop auto-acting
2212: boolean gameInProgress; // the game is in progress (the player has not died, won or quit yet)
2213: boolean gameHasEnded; // stop everything and go to death screen
2214: boolean highScoreSaved; // so that it saves the high score only once
2215: boolean blockCombatText; // busy auto-fighting
2216: boolean autoPlayingLevel; // seriously, don't interrupt
2217: boolean automationActive; // cut some corners during redraws to speed things up
2218: boolean justRested; // previous turn was a rest -- used in stealth
2219: boolean justSearched; // previous turn was a search -- used in manual searches
2220: boolean cautiousMode; // used to prevent careless deaths caused by holding down a key
2221: boolean receivedLevitationWarning; // only warn you once when you're hovering dangerously over liquid
2222: boolean updatedSafetyMapThisTurn; // so it's updated no more than once per turn
2223: boolean updatedAllySafetyMapThisTurn; // so it's updated no more than once per turn
2224: boolean updatedMapToSafeTerrainThisTurn;// so it's updated no more than once per turn
2225: boolean updatedMapToShoreThisTurn; // so it's updated no more than once per turn
2226: boolean easyMode; // enables easy mode
2227: boolean inWater; // helps with the blue water filter effect
2228: boolean heardCombatThisTurn; // so you get only one "you hear combat in the distance" per turn
2229: boolean creaturesWillFlashThisTurn; // there are creatures out there that need to flash before the turn ends
2230: boolean staleLoopMap; // recalculate the loop map at the end of the turn
2231: boolean alreadyFell; // so the player can fall only one depth per turn
2232: boolean eligibleToUseStairs; // so the player uses stairs only when he steps onto them
2233: boolean trueColorMode; // whether lighting effects are disabled
2234: boolean displayAggroRangeMode; // whether your stealth range is displayed
2235: boolean quit; // to skip the typical end-game theatrics when the player quits
2236: unsigned long seed; // the master seed for generating the entire dungeon
2237: short RNG; // which RNG are we currently using?
2238: unsigned long gold; // how much gold we have
2239: unsigned long goldGenerated; // how much gold has been generated on the levels, not counting gold held by monsters
2240: short strength;
2241: unsigned short monsterSpawnFuse; // how much longer till a random monster spawns
2242:
2243: item *weapon;
2244: item *armor;
2245: item *ringLeft;
2246: item *ringRight;
2247:
2248: flare **flares;
2249: short flareCount;
2250: short flareCapacity;
2251:
2252: creature *yendorWarden;
2253:
2254: lightSource minersLight;
2255: fixpt minersLightRadius;
2256: short ticksTillUpdateEnvironment; // so that some periodic things happen in objective time
2257: unsigned short scentTurnNumber; // helps make scent-casting work
2258: unsigned long playerTurnNumber; // number of input turns in recording. Does not increment during paralysis.
2259: unsigned long absoluteTurnNumber; // number of turns since the beginning of time. Always increments.
2260: signed long milliseconds; // milliseconds since launch, to decide whether to engage cautious mode
2261: short xpxpThisTurn; // how many squares the player explored this turn
2262: short aggroRange; // distance from which monsters will notice you
2263:
2264: short previousPoisonPercent; // and your poison proportion, to display percentage alerts for each.
2265:
2266: short upLoc[2]; // upstairs location this level
2267: short downLoc[2]; // downstairs location this level
2268:
2269: short cursorLoc[2]; // used for the return key functionality
2270: creature *lastTarget; // to keep track of the last monster the player has thrown at or zapped
2271: item *lastItemThrown;
2272: short rewardRoomsGenerated; // to meter the number of reward machines
2273: short machineNumber; // so each machine on a level gets a unique number
2274: short sidebarLocationList[ROWS*2][2]; // to keep track of which location each line of the sidebar references
2275:
2276: // maps
2277: short **mapToShore; // how many steps to get back to shore
2278: short **mapToSafeTerrain; // so monsters can get to safety
2279:
2280: // recording info
2281: boolean recording; // whether we are recording the game
2282: boolean playbackMode; // whether we're viewing a recording instead of playing
2283: unsigned short patchVersion; // what patch version of the game this was recorded on
2284: char versionString[16]; // the version string saved into the recording file
2285: unsigned long currentTurnNumber; // how many turns have elapsed
2286: unsigned long howManyTurns; // how many turns are in this recording
2287: short howManyDepthChanges; // how many times the player changes depths
2288: short playbackDelayPerTurn; // base playback speed; modified per turn by events
2289: short playbackDelayThisTurn; // playback speed as modified
2290: boolean playbackPaused;
2291: boolean playbackFastForward; // for loading saved games and such -- disables drawing and prevents pauses
2292: boolean playbackOOS; // playback out of sync -- no unpausing allowed
2293: boolean playbackOmniscience; // whether to reveal all the map during playback
2294: boolean playbackBetweenTurns; // i.e. waiting for a top-level input -- iff, permit playback commands
2295: unsigned long nextAnnotationTurn; // the turn number during which to display the next annotation
2296: char nextAnnotation[5000]; // the next annotation
2297: unsigned long locationInAnnotationFile; // how far we've read in the annotations file
2298:
2299: // metered items
2300: long long foodSpawned; // amount of nutrition units spawned so far this game
2301: short lifePotionFrequency;
2302: short lifePotionsSpawned;
2303: short strengthPotionFrequency;
2304: short enchantScrollFrequency;
2305:
2306: // ring bonuses:
2307: short clairvoyance;
2308: short stealthBonus;
2309: short regenerationBonus;
2310: short lightMultiplier;
2311: short awarenessBonus;
2312: short transference;
2313: short wisdomBonus;
2314: short reaping;
2315:
2316: // feats:
2317: boolean featRecord[FEAT_COUNT];
2318:
2319: // waypoints:
2320: short **wpDistance[MAX_WAYPOINT_COUNT];
2321: short wpCount;
2322: short wpCoordinates[MAX_WAYPOINT_COUNT][2];
2323: short wpRefreshTicker;
2324:
2325: // cursor trail:
2326: short cursorPathIntensity;
2327: boolean cursorMode;
2328:
2329: // What do you want to do, player -- play, play with seed, resume, recording, high scores or quit?
2330: enum NGCommands nextGame;
2331: char nextGamePath[BROGUE_FILENAME_MAX];
2332: unsigned long nextGameSeed;
2333: } playerCharacter;
2334:
2335: // Stores the necessary info about a level so it can be regenerated:
2336: typedef struct levelData {
2337: boolean visited;
2338: pcell mapStorage[DCOLS][DROWS];
2339: struct item *items;
2340: struct creature *monsters;
2341: struct creature *dormantMonsters;
2342: short **scentMap;
2343: unsigned long levelSeed;
2344: short upStairsLoc[2];
2345: short downStairsLoc[2];
2346: short playerExitedVia[2];
2347: unsigned long awaySince;
2348: } levelData;
2349:
2350: enum machineFeatureFlags {
2351: MF_GENERATE_ITEM = Fl(0), // feature entails generating an item (overridden if the machine is adopting an item)
2352: MF_OUTSOURCE_ITEM_TO_MACHINE = Fl(1), // item must be adopted by another machine
2353: MF_BUILD_VESTIBULE = Fl(2), // call this at the origin of a door room to create a new door guard machine there
2354: MF_ADOPT_ITEM = Fl(3), // this feature will take the adopted item (be it from another machine or a previous feature)
2355: MF_NO_THROWING_WEAPONS = Fl(4), // the generated item cannot be a throwing weapon
2356: MF_GENERATE_HORDE = Fl(5), // generate a monster horde that has all of the horde flags
2357: MF_BUILD_AT_ORIGIN = Fl(6), // generate this feature at the room entrance
2358: // unused = Fl(7), //
2359: MF_PERMIT_BLOCKING = Fl(8), // permit the feature to block the map's passability (e.g. to add a locked door)
2360: MF_TREAT_AS_BLOCKING = Fl(9), // treat this terrain as though it blocks, for purposes of deciding whether it can be placed there
2361: MF_NEAR_ORIGIN = Fl(10), // feature must spawn in the rough quarter of tiles closest to the origin
2362: MF_FAR_FROM_ORIGIN = Fl(11), // feature must spawn in the rough quarter of tiles farthest from the origin
2363: MF_MONSTER_TAKE_ITEM = Fl(12), // the item associated with this feature (including if adopted) will be in possession of the horde leader that's generated
2364: MF_MONSTER_SLEEPING = Fl(13), // the monsters should be asleep when generated
2365: MF_MONSTER_FLEEING = Fl(14), // the monsters should be permanently fleeing when generated
2366: MF_EVERYWHERE = Fl(15), // generate the feature on every tile of the machine (e.g. carpeting)
2367: MF_ALTERNATIVE = Fl(16), // build only one feature that has this flag per machine; the rest are skipped
2368: MF_ALTERNATIVE_2 = Fl(17), // same as MF_ALTERNATIVE, but provides for a second set of alternatives of which only one will be chosen
2369: MF_REQUIRE_GOOD_RUNIC = Fl(18), // generated item must be uncursed runic
2370: MF_MONSTERS_DORMANT = Fl(19), // monsters are dormant, and appear when a dungeon feature with DFF_ACTIVATE_DORMANT_MONSTER spawns on their tile
2371: // unused = Fl(20), //
2372: MF_BUILD_IN_WALLS = Fl(21), // build in an impassable tile that is adjacent to the interior
2373: MF_BUILD_ANYWHERE_ON_LEVEL = Fl(22), // build anywhere on the level that is not inside the machine
2374: MF_REPEAT_UNTIL_NO_PROGRESS = Fl(23), // keep trying to build this feature set until no changes are made
2375: MF_IMPREGNABLE = Fl(24), // this feature's location will be immune to tunneling
2376: MF_IN_VIEW_OF_ORIGIN = Fl(25), // this feature must be in view of the origin
2377: MF_IN_PASSABLE_VIEW_OF_ORIGIN = Fl(26), // this feature must be in view of the origin, where "view" is blocked by pathing blockers
2378: MF_NOT_IN_HALLWAY = Fl(27), // the feature location must have a passableArcCount of <= 1
2379: MF_NOT_ON_LEVEL_PERIMETER = Fl(28), // don't build it in the outermost walls of the level
2380: MF_SKELETON_KEY = Fl(29), // if a key is generated or adopted by this feature, it will open all locks in this machine.
2381: MF_KEY_DISPOSABLE = Fl(30), // if a key is generated or adopted, it will self-destruct after being used at this current location.
2382: };
2383:
2384: typedef struct machineFeature {
2385: // terrain
2386: enum dungeonFeatureTypes featureDF; // generate this DF at the feature location (0 for none)
2387: enum tileType terrain; // generate this terrain tile at the feature location (0 for none)
2388: enum dungeonLayers layer; // generate the terrain tile in this layer
2389:
2390: short instanceCountRange[2]; // generate this range of instances of this feature
2391: short minimumInstanceCount; // abort if fewer than this
2392:
2393: // items: these will be ignored if the feature is adopting an item
2394: short itemCategory; // generate this category of item (or -1 for random)
2395: short itemKind; // generate this kind of item (or -1 for random)
2396:
2397: short monsterID; // generate a monster of this kind if MF_GENERATE_MONSTER is set
2398:
2399: short personalSpace; // subsequent features must be generated more than this many tiles away from this feature
2400: unsigned long hordeFlags; // choose a monster horde based on this
2401: unsigned long itemFlags; // assign these flags to the item
2402: unsigned long flags; // feature flags
2403: } machineFeature;
2404:
2405: enum blueprintFlags {
2406: BP_ADOPT_ITEM = Fl(0), // the machine must adopt an item (e.g. a door key)
2407: BP_VESTIBULE = Fl(1), // spawns in a doorway (location must be given) and expands outward, to guard the room
2408: BP_PURGE_PATHING_BLOCKERS = Fl(2), // clean out traps and other T_PATHING_BLOCKERs
2409: BP_PURGE_INTERIOR = Fl(3), // clean out all of the terrain in the interior before generating the machine
2410: BP_PURGE_LIQUIDS = Fl(4), // clean out all of the liquids in the interior before generating the machine
2411: BP_SURROUND_WITH_WALLS = Fl(5), // fill in any impassable gaps in the perimeter (e.g. water, lava, brimstone, traps) with wall
2412: BP_IMPREGNABLE = Fl(6), // impassable perimeter and interior tiles are locked; tunneling bolts will bounce off harmlessly
2413: BP_REWARD = Fl(7), // metered reward machines
2414: BP_OPEN_INTERIOR = Fl(8), // clear out walls in the interior, widen the interior until convex or bumps into surrounding areas
2415: BP_MAXIMIZE_INTERIOR = Fl(9), // same as BP_OPEN_INTERIOR but expands the room as far as it can go, potentially surrounding the whole level.
2416: BP_ROOM = Fl(10), // spawns in a dead-end room that is dominated by a chokepoint of the given size (as opposed to a random place of the given size)
2417: BP_TREAT_AS_BLOCKING = Fl(11), // abort the machine if, were it filled with wall tiles, it would disrupt the level connectivity
2418: BP_REQUIRE_BLOCKING = Fl(12), // abort the machine unless, were it filled with wall tiles, it would disrupt the level connectivity
2419: BP_NO_INTERIOR_FLAG = Fl(13), // don't flag the area as being part of a machine
2420: BP_REDESIGN_INTERIOR = Fl(14), // nuke and pave -- delete all terrain in the interior and build entirely new rooms within the bounds
2421: };
2422:
2423: typedef struct blueprint {
2424: short depthRange[2]; // machine must be built between these dungeon depths
2425: short roomSize[2]; // machine must be generated in a room of this size
2426: short frequency; // frequency (number of tickets this blueprint enters in the blueprint selection raffle)
2427: short featureCount; // how many different types of features follow (max of 20)
2428: short dungeonProfileType; // if BP_REDESIGN_INTERIOR is set, which dungeon profile do we use?
2429: unsigned long flags; // blueprint flags
2430: machineFeature feature[20]; // the features themselves
2431: } blueprint;
2432:
2433: enum machineTypes {
2434: // Reward rooms:
2435: MT_REWARD_MULTI_LIBRARY = 1,
2436: MT_REWARD_MONO_LIBRARY,
2437: MT_REWARD_CONSUMABLES,
2438: MT_REWARD_PEDESTALS_PERMANENT,
2439: MT_REWARD_PEDESTALS_CONSUMABLE,
2440: MT_REWARD_COMMUTATION_ALTARS,
2441: MT_REWARD_RESURRECTION_ALTAR,
2442: MT_REWARD_ADOPTED_ITEM,
2443: MT_REWARD_DUNGEON,
2444: MT_REWARD_KENNEL,
2445: MT_REWARD_VAMPIRE_LAIR,
2446: MT_REWARD_ASTRAL_PORTAL,
2447: MT_REWARD_GOBLIN_WARREN,
2448: MT_REWARD_SENTINEL_SANCTUARY,
2449:
2450: // Amulet holder:
2451: MT_AMULET_AREA,
2452:
2453: // Door guard machines:
2454: MT_LOCKED_DOOR_VESTIBULE,
2455: MT_SECRET_DOOR_VESTIBULE,
2456: MT_SECRET_LEVER_VESTIBULE,
2457: MT_FLAMMABLE_BARRICADE_VESTIBULE,
2458: MT_STATUE_SHATTERING_VESTIBULE,
2459: MT_STATUE_MONSTER_VESTIBULE,
2460: MT_THROWING_TUTORIAL_VESTIBULE,
2461: MT_PIT_TRAPS_VESTIBULE,
2462: MT_BECKONING_OBSTACLE_VESTIBULE,
2463: MT_GUARDIAN_VESTIBULE,
2464:
2465: // Key guard machines:
2466: MT_KEY_REWARD_LIBRARY,
2467: MT_KEY_SECRET_ROOM,
2468: MT_KEY_THROWING_TUTORIAL_AREA,
2469: MT_KEY_RAT_TRAP_ROOM,
2470: MT_KEY_FIRE_TRANSPORTATION_ROOM,
2471: MT_KEY_FLOOD_TRAP_ROOM,
2472: MT_KEY_FIRE_TRAP_ROOM,
2473: MT_KEY_THIEF_AREA,
2474: MT_KEY_COLLAPSING_FLOOR_AREA,
2475: MT_KEY_PIT_TRAP_ROOM,
2476: MT_KEY_LEVITATION_ROOM,
2477: MT_KEY_WEB_CLIMBING_ROOM,
2478: MT_KEY_LAVA_MOAT_ROOM,
2479: MT_KEY_LAVA_MOAT_AREA,
2480: MT_KEY_POISON_GAS_TRAP_ROOM,
2481: MT_KEY_EXPLOSIVE_TRAP_ROOM,
2482: MT_KEY_BURNING_TRAP_ROOM,
2483: MT_KEY_STATUARY_TRAP_AREA,
2484: MT_KEY_GUARDIAN_WATER_PUZZLE_ROOM,
2485: MT_KEY_GUARDIAN_GAUNTLET_ROOM,
2486: MT_KEY_GUARDIAN_CORRIDOR_ROOM,
2487: MT_KEY_SACRIFICE_ROOM,
2488: MT_KEY_SUMMONING_CIRCLE_ROOM,
2489: MT_KEY_BECKONING_OBSTACLE_ROOM,
2490: MT_KEY_WORM_TRAP_AREA,
2491: MT_KEY_MUD_TRAP_ROOM,
2492: MT_KEY_ELECTRIC_CRYSTALS_ROOM,
2493: MT_KEY_ZOMBIE_TRAP_ROOM,
2494: MT_KEY_PHANTOM_TRAP_ROOM,
2495: MT_KEY_WORM_TUNNEL_ROOM,
2496: MT_KEY_TURRET_TRAP_ROOM,
2497: MT_KEY_BOSS_ROOM,
2498:
2499: // Thematic machines:
2500: MT_BLOODFLOWER_AREA,
2501: MT_SHRINE_AREA,
2502: MT_IDYLL_AREA,
2503: MT_SWAMP_AREA,
2504: MT_CAMP_AREA,
2505: MT_REMNANT_AREA,
2506: MT_DISMAL_AREA,
2507: MT_BRIDGE_TURRET_AREA,
2508: MT_LAKE_PATH_TURRET_AREA,
2509: MT_PARALYSIS_TRAP_AREA,
2510: MT_PARALYSIS_TRAP_HIDDEN_AREA,
2511: MT_TRICK_STATUE_AREA,
2512: MT_WORM_AREA,
2513: MT_SENTINEL_AREA,
2514:
2515: NUMBER_BLUEPRINTS,
2516: };
2517:
2518: typedef struct autoGenerator {
2519: // What spawns:
2520: enum tileType terrain;
2521: enum dungeonLayers layer;
2522:
2523: enum dungeonFeatureTypes DFType;
2524:
2525: enum machineTypes machine; // Machine placement also respects BP_ placement flags in the machine blueprint
2526:
2527: // Parameters governing when and where it spawns:
2528: enum tileType requiredDungeonFoundationType;
2529: enum tileType requiredLiquidFoundationType;
2530: short minDepth;
2531: short maxDepth;
2532: short frequency;
2533: short minNumberIntercept; // actually intercept * 100
2534: short minNumberSlope; // actually slope * 100
2535: short maxNumber;
2536: } autoGenerator;
2537:
2538: #define NUMBER_AUTOGENERATORS 49
2539:
2540: typedef struct feat {
2541: char name[100];
2542: char description[200];
2543: boolean initialValue;
2544: } feat;
2545:
2546: #define PDS_FORBIDDEN -1
2547: #define PDS_OBSTRUCTION -2
2548: #define PDS_CELL(map, x, y) ((map)->links + ((x) + DCOLS * (y)))
2549:
2550: typedef struct pdsLink pdsLink;
2551: typedef struct pdsMap pdsMap;
2552:
2553: typedef struct brogueButton {
2554: char text[COLS*3]; // button label; can include color escapes
2555: short x; // button's leftmost cell will be drawn at (x, y)
2556: short y;
2557: signed long hotkey[10]; // up to 10 hotkeys to trigger the button
2558: color buttonColor; // background of the button; further gradient-ized when displayed
2559: short opacity; // further reduced by 50% if not enabled
2560: enum displayGlyph symbol[COLS]; // Automatically replace the nth asterisk in the button label text with
2561: // the nth character supplied here, if one is given.
2562: // (Primarily to display magic character and item symbols in the inventory display.)
2563: unsigned long flags;
2564: } brogueButton;
2565:
2566: enum buttonDrawStates {
2567: BUTTON_NORMAL = 0,
2568: BUTTON_HOVER,
2569: BUTTON_PRESSED,
2570: };
2571:
2572: enum BUTTON_FLAGS {
2573: B_DRAW = Fl(0),
2574: B_ENABLED = Fl(1),
2575: B_GRADIENT = Fl(2),
2576: B_HOVER_ENABLED = Fl(3),
2577: B_WIDE_CLICK_AREA = Fl(4),
2578: B_KEYPRESS_HIGHLIGHT = Fl(5),
2579: };
2580:
2581: typedef struct buttonState {
2582: // Indices of the buttons that are doing stuff:
2583: short buttonFocused;
2584: short buttonDepressed;
2585:
2586: // Index of the selected button:
2587: short buttonChosen;
2588:
2589: // The buttons themselves:
2590: short buttonCount;
2591: brogueButton buttons[50];
2592:
2593: // The window location, to determine whether a click is a cancelation:
2594: short winX;
2595: short winY;
2596: short winWidth;
2597: short winHeight;
2598:
2599: // Graphical buffers:
2600: cellDisplayBuffer dbuf[COLS][ROWS]; // Where buttons are drawn.
2601: cellDisplayBuffer rbuf[COLS][ROWS]; // Reversion screen state.
2602: } buttonState;
2603:
2604: extern boolean serverMode;
2605: extern boolean hasGraphics;
2606: extern boolean graphicsEnabled;
2607:
2608: #if defined __cplusplus
2609: extern "C" {
2610: #endif
2611:
2612: // Utilities.c - String functions
2613: boolean endswith(const char *str, const char *ending);
2614: void append(char *str, char *ending, int bufsize);
2615:
2616: void rogueMain();
2617: void executeEvent(rogueEvent *theEvent);
2618: boolean fileExists(const char *pathname);
2619: boolean chooseFile(char *path, char *prompt, char *defaultName, char *suffix);
2620: boolean openFile(const char *path);
2621: void initializeRogue(unsigned long seed);
2622: void gameOver(char *killedBy, boolean useCustomPhrasing);
2623: void victory(boolean superVictory);
2624: void enableEasyMode();
2625: long rand_range(long lowerBound, long upperBound);
2626: unsigned long seedRandomGenerator(unsigned long seed);
2627: short randClumpedRange(short lowerBound, short upperBound, short clumpFactor);
2628: short randClump(randomRange theRange);
2629: boolean rand_percent(short percent);
2630: void shuffleList(short *list, short listLength);
2631: void fillSequentialList(short *list, short listLength);
2632: fixpt fp_round(fixpt x);
2633: fixpt fp_pow(fixpt base, int expn);
2634: fixpt fp_sqrt(fixpt val);
2635: short unflag(unsigned long flag);
2636: void considerCautiousMode();
2637: void refreshScreen();
2638: void displayLevel();
2639: void storeColorComponents(char components[3], const color *theColor);
2640: boolean separateColors(color *fore, color *back);
2641: void bakeColor(color *theColor);
2642: void shuffleTerrainColors(short percentOfCells, boolean refreshCells);
2643: void normColor(color *baseColor, const short aggregateMultiplier, const short colorTranslation);
2644: void getCellAppearance(short x, short y, enum displayGlyph *returnChar, color *returnForeColor, color *returnBackColor);
2645: void logBuffer(char array[DCOLS][DROWS]);
2646: //void logBuffer(short **array);
2647: boolean search(short searchStrength);
2648: boolean proposeOrConfirmLocation(short x, short y, char *failureMessage);
2649: boolean useStairs(short stairDirection);
2650: short passableArcCount(short x, short y);
2651: void analyzeMap(boolean calculateChokeMap);
2652: boolean buildAMachine(enum machineTypes bp,
2653: short originX, short originY,
2654: unsigned long requiredMachineFlags,
2655: item *adoptiveItem,
2656: item *parentSpawnedItems[50],
2657: creature *parentSpawnedMonsters[50]);
2658: void attachRooms(short **grid, const dungeonProfile *theDP, short attempts, short maxRoomCount);
2659: void digDungeon();
2660: void updateMapToShore();
2661: short levelIsDisconnectedWithBlockingMap(char blockingMap[DCOLS][DROWS], boolean countRegionSize);
2662: void resetDFMessageEligibility();
2663: boolean fillSpawnMap(enum dungeonLayers layer,
2664: enum tileType surfaceTileType,
2665: char spawnMap[DCOLS][DROWS],
2666: boolean blockedByOtherLayers,
2667: boolean refresh,
2668: boolean superpriority);
2669: boolean spawnDungeonFeature(short x, short y, dungeonFeature *feat, boolean refreshCell, boolean abortIfBlocking);
2670: void restoreMonster(creature *monst, short **mapToStairs, short **mapToPit);
2671: void restoreItem(item *theItem);
2672: void refreshWaypoint(short wpIndex);
2673: void setUpWaypoints();
2674: void zeroOutGrid(char grid[DCOLS][DROWS]);
2675: short oppositeDirection(short theDir);
2676:
2677: void plotChar(enum displayGlyph inputChar,
2678: short xLoc, short yLoc,
2679: short backRed, short backGreen, short backBlue,
2680: short foreRed, short foreGreen, short foreBlue);
2681: boolean pauseForMilliseconds(short milliseconds);
2682: boolean isApplicationActive();
2683: void nextKeyOrMouseEvent(rogueEvent *returnEvent, boolean textInput, boolean colorsDance);
2684: void notifyEvent(short eventId, int data1, int data2, const char *str1, const char *str2);
2685: boolean takeScreenshot();
2686: boolean setGraphicsEnabled(boolean);
2687: boolean controlKeyIsDown();
2688: boolean shiftKeyIsDown();
2689: short getHighScoresList(rogueHighScoresEntry returnList[HIGH_SCORES_COUNT]);
2690: boolean saveHighScore(rogueHighScoresEntry theEntry);
2691: fileEntry *listFiles(short *fileCount, char **dynamicMemoryBuffer);
2692: void initializeLaunchArguments(enum NGCommands *command, char *path, unsigned long *seed);
2693:
2694: char nextKeyPress(boolean textInput);
2695: void refreshSideBar(short focusX, short focusY, boolean focusedEntityMustGoFirst);
2696: void printHelpScreen();
2697: void printDiscoveriesScreen();
2698: void printHighScores(boolean hiliteMostRecent);
2699: void displayGrid(short **map);
2700: void printSeed();
2701: void printProgressBar(short x, short y, const char barLabel[COLS], long amtFilled, long amtMax, color *fillColor, boolean dim);
2702: short printMonsterInfo(creature *monst, short y, boolean dim, boolean highlight);
2703: void describeHallucinatedItem(char *buf);
2704: short printItemInfo(item *theItem, short y, boolean dim, boolean highlight);
2705: short printTerrainInfo(short x, short y, short py, const char *description, boolean dim, boolean highlight);
2706: void rectangularShading(short x, short y, short width, short height,
2707: const color *backColor, short opacity, cellDisplayBuffer dbuf[COLS][ROWS]);
2708: short printTextBox(char *textBuf, short x, short y, short width,
2709: color *foreColor, color *backColor,
2710: cellDisplayBuffer rbuf[COLS][ROWS],
2711: brogueButton *buttons, short buttonCount);
2712: void printMonsterDetails(creature *monst, cellDisplayBuffer rbuf[COLS][ROWS]);
2713: void printFloorItemDetails(item *theItem, cellDisplayBuffer rbuf[COLS][ROWS]);
2714: unsigned long printCarriedItemDetails(item *theItem,
2715: short x, short y, short width,
2716: boolean includeButtons,
2717: cellDisplayBuffer rbuf[COLS][ROWS]);
2718: void funkyFade(cellDisplayBuffer displayBuf[COLS][ROWS], const color *colorStart, const color *colorEnd, short stepCount, short x, short y, boolean invert);
2719: void displayCenteredAlert(char *message);
2720: void flashMessage(char *message, short x, short y, int time, color *fColor, color *bColor);
2721: void flashTemporaryAlert(char *message, int time);
2722: void waitForAcknowledgment();
2723: void waitForKeystrokeOrMouseClick();
2724: boolean confirm(char *prompt, boolean alsoDuringPlayback);
2725: void refreshDungeonCell(short x, short y);
2726: void applyColorMultiplier(color *baseColor, const color *multiplierColor);
2727: void applyColorAverage(color *baseColor, const color *newColor, short averageWeight);
2728: void applyColorAugment(color *baseColor, const color *augmentingColor, short augmentWeight);
2729: void applyColorScalar(color *baseColor, short scalar);
2730: void applyColorBounds(color *baseColor, short lowerBound, short upperBound);
2731: void desaturate(color *baseColor, short weight);
2732: void randomizeColor(color *baseColor, short randomizePercent);
2733: void swapColors(color *color1, color *color2);
2734: void irisFadeBetweenBuffers(cellDisplayBuffer fromBuf[COLS][ROWS],
2735: cellDisplayBuffer toBuf[COLS][ROWS],
2736: short x, short y,
2737: short frameCount,
2738: boolean outsideIn);
2739: void colorBlendCell(short x, short y, color *hiliteColor, short hiliteStrength);
2740: void hiliteCell(short x, short y, const color *hiliteColor, short hiliteStrength, boolean distinctColors);
2741: void colorMultiplierFromDungeonLight(short x, short y, color *editColor);
2742: void plotCharWithColor(enum displayGlyph inputChar, short xLoc, short yLoc, const color *cellForeColor, const color *cellBackColor);
2743: void plotCharToBuffer(enum displayGlyph inputChar, short x, short y, color *foreColor, color *backColor, cellDisplayBuffer dbuf[COLS][ROWS]);
2744: void plotForegroundChar(enum displayGlyph inputChar, short x, short y, color *foreColor, boolean affectedByLighting);
2745: void commitDraws();
2746: void dumpLevelToScreen();
2747: void hiliteCharGrid(char hiliteCharGrid[DCOLS][DROWS], color *hiliteColor, short hiliteStrength);
2748: void blackOutScreen();
2749: void colorOverDungeon(const color *color);
2750: void copyDisplayBuffer(cellDisplayBuffer toBuf[COLS][ROWS], cellDisplayBuffer fromBuf[COLS][ROWS]);
2751: void clearDisplayBuffer(cellDisplayBuffer dbuf[COLS][ROWS]);
2752: color colorFromComponents(char rgb[3]);
2753: void overlayDisplayBuffer(cellDisplayBuffer overBuf[COLS][ROWS], cellDisplayBuffer previousBuf[COLS][ROWS]);
2754: void flashForeground(short *x, short *y, color **flashColor, short *flashStrength, short count, short frames);
2755: void flashCell(color *theColor, short frames, short x, short y);
2756: void colorFlash(const color *theColor, unsigned long reqTerrainFlags, unsigned long reqTileFlags, short frames, short maxRadius, short x, short y);
2757: void printString(const char *theString, short x, short y, color *foreColor, color*backColor, cellDisplayBuffer dbuf[COLS][ROWS]);
2758: short wrapText(char *to, const char *sourceText, short width);
2759: short printStringWithWrapping(char *theString, short x, short y, short width, color *foreColor,
2760: color*backColor, cellDisplayBuffer dbuf[COLS][ROWS]);
2761: boolean getInputTextString(char *inputText,
2762: const char *prompt,
2763: short maxLength,
2764: const char *defaultEntry,
2765: const char *promptSuffix,
2766: short textEntryType,
2767: boolean useDialogBox);
2768: void displayChokeMap();
2769: void displayLoops();
2770: boolean pauseBrogue(short milliseconds);
2771: void nextBrogueEvent(rogueEvent *returnEvent, boolean textInput, boolean colorsDance, boolean realInputEvenInPlayback);
2772: void executeMouseClick(rogueEvent *theEvent);
2773: void executeKeystroke(signed long keystroke, boolean controlKey, boolean shiftKey);
2774: void initializeLevel();
2775: void startLevel (short oldLevelNumber, short stairDirection);
2776: void updateMinersLightRadius();
2777: void freeCreature(creature *monst);
2778: void emptyGraveyard();
2779: void freeEverything();
2780: boolean randomMatchingLocation(short *x, short *y, short dungeonType, short liquidType, short terrainType);
2781: enum dungeonLayers highestPriorityLayer(short x, short y, boolean skipGas);
2782: enum dungeonLayers layerWithTMFlag(short x, short y, unsigned long flag);
2783: enum dungeonLayers layerWithFlag(short x, short y, unsigned long flag);
2784: char *tileFlavor(short x, short y);
2785: char *tileText(short x, short y);
2786: void describedItemBasedOnParameters(short theCategory, short theKind, short theQuantity, short theItemOriginDepth, char *buf);
2787: void describeLocation(char buf[DCOLS], short x, short y);
2788: void printLocationDescription(short x, short y);
2789: void useKeyAt(item *theItem, short x, short y);
2790: void playerRuns(short direction);
2791: void exposeCreatureToFire(creature *monst);
2792: void updateFlavorText();
2793: void updatePlayerUnderwaterness();
2794: boolean monsterShouldFall(creature *monst);
2795: void applyInstantTileEffectsToCreature(creature *monst);
2796: void vomit(creature *monst);
2797: void becomeAllyWith(creature *monst);
2798: void freeCaptive(creature *monst);
2799: boolean freeCaptivesEmbeddedAt(short x, short y);
2800: boolean handleWhipAttacks(creature *attacker, enum directions dir, boolean *aborted);
2801: boolean handleSpearAttacks(creature *attacker, enum directions dir, boolean *aborted);
2802: boolean diagonalBlocked(const short x1, const short y1, const short x2, const short y2, const boolean limitToPlayerKnowledge);
2803: boolean playerMoves(short direction);
2804: void calculateDistances(short **distanceMap,
2805: short destinationX, short destinationY,
2806: unsigned long blockingTerrainFlags,
2807: creature *traveler,
2808: boolean canUseSecretDoors,
2809: boolean eightWays);
2810: short pathingDistance(short x1, short y1, short x2, short y2, unsigned long blockingTerrainFlags);
2811: short nextStep(short **distanceMap, short x, short y, creature *monst, boolean reverseDirections);
2812: void travelRoute(short path[1000][2], short steps);
2813: void travel(short x, short y, boolean autoConfirm);
2814: void populateGenericCostMap(short **costMap);
2815: void getLocationFlags(const short x, const short y,
2816: unsigned long *tFlags, unsigned long *TMFlags, unsigned long *cellFlags,
2817: const boolean limitToPlayerKnowledge);
2818: void populateCreatureCostMap(short **costMap, creature *monst);
2819: enum directions adjacentFightingDir();
2820: void getExploreMap(short **map, boolean headingToStairs);
2821: boolean explore(short frameDelay);
2822: short getPlayerPathOnMap(short path[1000][2], short **map, short originX, short originY);
2823: void reversePath(short path[1000][2], short steps);
2824: void hilitePath(short path[1000][2], short steps, boolean unhilite);
2825: void clearCursorPath();
2826: void hideCursor();
2827: void showCursor();
2828: void mainInputLoop();
2829: boolean isDisturbed(short x, short y);
2830: void discover(short x, short y);
2831: short randValidDirectionFrom(creature *monst, short x, short y, boolean respectAvoidancePreferences);
2832: boolean exposeTileToElectricity(short x, short y);
2833: boolean exposeTileToFire(short x, short y, boolean alwaysIgnite);
2834: boolean cellCanHoldGas(short x, short y);
2835: void monstersFall();
2836: void updateEnvironment();
2837: void updateAllySafetyMap();
2838: void updateSafetyMap();
2839: void updateSafeTerrainMap();
2840: short staffChargeDuration(const item *theItem);
2841: void rechargeItemsIncrementally(short multiplier);
2842: void extinguishFireOnCreature(creature *monst);
2843: void autoRest();
2844: void manualSearch();
2845: boolean startFighting(enum directions dir, boolean tillDeath);
2846: void autoFight(boolean tillDeath);
2847: void synchronizePlayerTimeState();
2848: void playerRecoversFromAttacking(boolean anAttackHit);
2849: void playerTurnEnded();
2850: void resetScentTurnNumber();
2851: void displayMonsterFlashes(boolean flashingEnabled);
2852: void displayMessageArchive();
2853: void temporaryMessage(char *msg1, boolean requireAcknowledgment);
2854: void messageWithColor(char *msg, color *theColor, boolean requireAcknowledgment);
2855: void flavorMessage(char *msg);
2856: void message(const char *msg, boolean requireAcknowledgment);
2857: void displayMoreSignWithoutWaitingForAcknowledgment();
2858: void displayMoreSign();
2859: short encodeMessageColor(char *msg, short i, const color *theColor);
2860: short decodeMessageColor(const char *msg, short i, color *returnColor);
2861: color *messageColorFromVictim(creature *monst);
2862: void upperCase(char *theChar);
2863: void updateMessageDisplay();
2864: void deleteMessages();
2865: void confirmMessages();
2866: void stripShiftFromMovementKeystroke(signed long *keystroke);
2867:
2868: void storeMemories(const short x, const short y);
2869: void updateFieldOfViewDisplay(boolean updateDancingTerrain, boolean refreshDisplay);
2870: void updateFieldOfView(short xLoc, short yLoc, short radius, boolean paintScent,
2871: boolean passThroughCreatures, boolean setFieldOfView, short theColor[3], short fadeToPercent);
2872: void betweenOctant1andN(short *x, short *y, short x0, short y0, short n);
2873:
2874: void getFOVMask(char grid[DCOLS][DROWS], short xLoc, short yLoc, fixpt maxRadius,
2875: unsigned long forbiddenTerrain, unsigned long forbiddenFlags, boolean cautiousOnWalls);
2876: void scanOctantFOV(char grid[DCOLS][DROWS], short xLoc, short yLoc, short octant, fixpt maxRadius,
2877: short columnsRightFromOrigin, long startSlope, long endSlope, unsigned long forbiddenTerrain,
2878: unsigned long forbiddenFlags, boolean cautiousOnWalls);
2879:
2880: creature *generateMonster(short monsterID, boolean itemPossible, boolean mutationPossible);
2881: short chooseMonster(short forLevel);
2882: creature *spawnHorde(short hordeID, short x, short y, unsigned long forbiddenFlags, unsigned long requiredFlags);
2883: void fadeInMonster(creature *monst);
2884: boolean removeMonsterFromChain(creature *monst, creature *theChain);
2885: boolean monsterWillAttackTarget(const creature *attacker, const creature *defender);
2886: boolean monstersAreTeammates(const creature *monst1, const creature *monst2);
2887: boolean monstersAreEnemies(const creature *monst1, const creature *monst2);
2888: void initializeGender(creature *monst);
2889: boolean stringsMatch(const char *str1, const char *str2);
2890: void resolvePronounEscapes(char *text, creature *monst);
2891: short pickHordeType(short depth, enum monsterTypes summonerType, unsigned long forbiddenFlags, unsigned long requiredFlags);
2892: creature *cloneMonster(creature *monst, boolean announce, boolean placeClone);
2893: void empowerMonster(creature *monst);
2894: unsigned long forbiddenFlagsForMonster(creatureType *monsterType);
2895: unsigned long avoidedFlagsForMonster(creatureType *monsterType);
2896: boolean monsterCanSubmergeNow(creature *monst);
2897: void populateMonsters();
2898: void updateMonsterState(creature *monst);
2899: void decrementMonsterStatus(creature *monst);
2900: boolean specifiedPathBetween(short x1, short y1, short x2, short y2,
2901: unsigned long blockingTerrain, unsigned long blockingFlags);
2902: boolean traversiblePathBetween(creature *monst, short x2, short y2);
2903: boolean openPathBetween(short x1, short y1, short x2, short y2);
2904: creature *monsterAtLoc(short x, short y);
2905: creature *dormantMonsterAtLoc(short x, short y);
2906: void perimeterCoords(short returnCoords[2], short n);
2907: boolean monsterBlinkToPreferenceMap(creature *monst, short **preferenceMap, boolean blinkUphill);
2908: boolean monsterSummons(creature *monst, boolean alwaysUse);
2909: boolean resurrectAlly(const short x, const short y);
2910: void unAlly(creature *monst);
2911: boolean monsterFleesFrom(creature *monst, creature *defender);
2912: void monstersTurn(creature *monst);
2913: boolean getRandomMonsterSpawnLocation(short *x, short *y);
2914: void spawnPeriodicHorde();
2915: void clearStatus(creature *monst);
2916: void moralAttack(creature *attacker, creature *defender);
2917: short runicWeaponChance(item *theItem, boolean customEnchantLevel, fixpt enchantLevel);
2918: void magicWeaponHit(creature *defender, item *theItem, boolean backstabbed);
2919: void teleport(creature *monst, short x, short y, boolean respectTerrainAvoidancePreferences);
2920: void chooseNewWanderDestination(creature *monst);
2921: boolean canPass(creature *mover, creature *blocker);
2922: boolean isPassableOrSecretDoor(short x, short y);
2923: boolean knownToPlayerAsPassableOrSecretDoor(short x, short y);
2924: void setMonsterLocation(creature *monst, short newX, short newY);
2925: boolean moveMonster(creature *monst, short dx, short dy);
2926: unsigned long burnedTerrainFlagsAtLoc(short x, short y);
2927: unsigned long discoveredTerrainFlagsAtLoc(short x, short y);
2928: boolean monsterAvoids(creature *monst, short x, short y);
2929: short distanceBetween(short x1, short y1, short x2, short y2);
2930: void alertMonster(creature *monst);
2931: void wakeUp(creature *monst);
2932: boolean monsterRevealed(creature *monst);
2933: boolean monsterHiddenBySubmersion(const creature *monst, const creature *observer);
2934: boolean monsterIsHidden(const creature *monst, const creature *observer);
2935: boolean canSeeMonster(creature *monst);
2936: boolean canDirectlySeeMonster(creature *monst);
2937: void monsterName(char *buf, creature *monst, boolean includeArticle);
2938: boolean monsterIsInClass(const creature *monst, const short monsterClass);
2939: fixpt strengthModifier(item *theItem);
2940: fixpt netEnchant(item *theItem);
2941: short hitProbability(creature *attacker, creature *defender);
2942: boolean attackHit(creature *attacker, creature *defender);
2943: void applyArmorRunicEffect(char returnString[DCOLS], creature *attacker, short *damage, boolean melee);
2944: void processStaggerHit(creature *attacker, creature *defender);
2945: boolean attack(creature *attacker, creature *defender, boolean lungeAttack);
2946: void inflictLethalDamage(creature *attacker, creature *defender);
2947: boolean inflictDamage(creature *attacker, creature *defender,
2948: short damage, const color *flashColor, boolean ignoresProtectionShield);
2949: void addPoison(creature *monst, short totalDamage, short concentrationIncrement);
2950: void killCreature(creature *decedent, boolean administrativeDeath);
2951: void buildHitList(creature **hitList, const creature *attacker, creature *defender, const boolean sweep);
2952: void addScentToCell(short x, short y, short distance);
2953: void populateItems(short upstairsX, short upstairsY);
2954: item *placeItem(item *theItem, short x, short y);
2955: void removeItemFrom(short x, short y);
2956: void pickUpItemAt(short x, short y);
2957: item *addItemToPack(item *theItem);
2958: void aggravateMonsters(short distance, short x, short y, const color *flashColor);
2959: short getLineCoordinates(short listOfCoordinates[][2], const short originLoc[2], const short targetLoc[2]);
2960: void getImpactLoc(short returnLoc[2], const short originLoc[2], const short targetLoc[2],
2961: const short maxDistance, const boolean returnLastEmptySpace);
2962: void negate(creature *monst);
2963: short monsterAccuracyAdjusted(const creature *monst);
2964: fixpt monsterDamageAdjustmentAmount(const creature *monst);
2965: short monsterDefenseAdjusted(const creature *monst);
2966: void weaken(creature *monst, short maxDuration);
2967: void slow(creature *monst, short turns);
2968: void haste(creature *monst, short turns);
2969: void heal(creature *monst, short percent, boolean panacea);
2970: boolean projectileReflects(creature *attacker, creature *defender);
2971: short reflectBolt(short targetX, short targetY, short listOfCoordinates[][2], short kinkCell, boolean retracePath);
2972: void checkForMissingKeys(short x, short y);
2973: enum boltEffects boltEffectForItem(item *theItem);
2974: enum boltType boltForItem(item *theItem);
2975: boolean zap(short originLoc[2], short targetLoc[2], bolt *theBolt, boolean hideDetails);
2976: boolean nextTargetAfter(short *returnX,
2977: short *returnY,
2978: short targetX,
2979: short targetY,
2980: boolean targetEnemies,
2981: boolean targetAllies,
2982: boolean targetItems,
2983: boolean targetTerrain,
2984: boolean requireOpenPath,
2985: boolean reverseDirection);
2986: boolean moveCursor(boolean *targetConfirmed,
2987: boolean *canceled,
2988: boolean *tabKey,
2989: short targetLoc[2],
2990: rogueEvent *event,
2991: buttonState *state,
2992: boolean colorsDance,
2993: boolean keysMoveCursor,
2994: boolean targetCanLeaveMap);
2995: void identifyItemKind(item *theItem);
2996: void autoIdentify(item *theItem);
2997: short numberOfItemsInPack();
2998: char nextAvailableInventoryCharacter();
2999: void checkForDisenchantment(item *theItem);
3000: void updateFloorItems();
3001: void itemKindName(item *theItem, char *kindName);
3002: void itemRunicName(item *theItem, char *runicName);
3003: void itemName(item *theItem, char *root, boolean includeDetails, boolean includeArticle, color *baseColor);
3004: char displayInventory(unsigned short categoryMask,
3005: unsigned long requiredFlags,
3006: unsigned long forbiddenFlags,
3007: boolean waitForAcknowledge,
3008: boolean includeButtons);
3009: short numberOfMatchingPackItems(unsigned short categoryMask,
3010: unsigned long requiredFlags, unsigned long forbiddenFlags,
3011: boolean displayErrors);
3012: void clearInventory(char keystroke);
3013: item *initializeItem();
3014: item *generateItem(unsigned short theCategory, short theKind);
3015: short chooseKind(itemTable *theTable, short numKinds);
3016: item *makeItemInto(item *theItem, unsigned long itemCategory, short itemKind);
3017: void updateEncumbrance();
3018: short displayedArmorValue();
3019: void strengthCheck(item *theItem);
3020: void recalculateEquipmentBonuses();
3021: void equipItem(item *theItem, boolean force);
3022: void equip(item *theItem);
3023: item *keyInPackFor(short x, short y);
3024: item *keyOnTileAt(short x, short y);
3025: void unequip(item *theItem);
3026: void drop(item *theItem);
3027: void findAlternativeHomeFor(creature *monst, short *x, short *y, boolean chooseRandomly);
3028: boolean getQualifyingLocNear(short loc[2],
3029: short x, short y,
3030: boolean hallwaysAllowed,
3031: char blockingMap[DCOLS][DROWS],
3032: unsigned long forbiddenTerrainFlags,
3033: unsigned long forbiddenMapFlags,
3034: boolean forbidLiquid,
3035: boolean deterministic);
3036: boolean getQualifyingGridLocNear(short loc[2],
3037: short x, short y,
3038: boolean grid[DCOLS][DROWS],
3039: boolean deterministic);
3040:
3041: // Grid operations
3042: short **allocGrid();
3043: void freeGrid(short **array);
3044: void copyGrid(short **to, short **from);
3045: void fillGrid(short **grid, short fillValue);
3046: void hiliteGrid(short **grid, color *hiliteColor, short hiliteStrength);
3047: void findReplaceGrid(short **grid, short findValueMin, short findValueMax, short fillValue);
3048: short floodFillGrid(short **grid, short x, short y, short eligibleValueMin, short eligibleValueMax, short fillValue);
3049: void drawRectangleOnGrid(short **grid, short x, short y, short width, short height, short value);
3050: void drawCircleOnGrid(short **grid, short x, short y, short radius, short value);
3051: void getTerrainGrid(short **grid, short value, unsigned long terrainFlags, unsigned long mapFlags);
3052: void getTMGrid(short **grid, short value, unsigned long TMflags);
3053: short validLocationCount(short **grid, short validValue);
3054: void randomLocationInGrid(short **grid, short *x, short *y, short validValue);
3055: boolean getQualifyingPathLocNear(short *retValX, short *retValY,
3056: short x, short y,
3057: boolean hallwaysAllowed,
3058: unsigned long blockingTerrainFlags,
3059: unsigned long blockingMapFlags,
3060: unsigned long forbiddenTerrainFlags,
3061: unsigned long forbiddenMapFlags,
3062: boolean deterministic);
3063: void createBlobOnGrid(short **grid,
3064: short *retMinX, short *retMinY, short *retWidth, short *retHeight,
3065: short roundCount,
3066: short minBlobWidth, short minBlobHeight,
3067: short maxBlobWidth, short maxBlobHeight, short percentSeeded,
3068: char birthParameters[9], char survivalParameters[9]);
3069:
3070: void checkForContinuedLeadership(creature *monst);
3071: void demoteMonsterFromLeadership(creature *monst);
3072: void toggleMonsterDormancy(creature *monst);
3073: void monsterDetails(char buf[], creature *monst);
3074: void makeMonsterDropItem(creature *monst);
3075: void throwCommand(item *theItem, boolean autoThrow);
3076: void relabel(item *theItem);
3077: void apply(item *theItem, boolean recordCommands);
3078: boolean itemCanBeCalled(item *theItem);
3079: void call(item *theItem);
3080: short chooseVorpalEnemy();
3081: void describeMonsterClass(char *buf, const short classID, boolean conjunctionAnd);
3082: void identify(item *theItem);
3083: void updateIdentifiableItem(item *theItem);
3084: void updateIdentifiableItems();
3085: void readScroll(item *theItem);
3086: void updateRingBonuses();
3087: void updatePlayerRegenerationDelay();
3088: boolean removeItemFromChain(item *theItem, item *theChain);
3089: void addItemToChain(item *theItem, item *theChain);
3090: void drinkPotion(item *theItem);
3091: item *promptForItemOfType(unsigned short category,
3092: unsigned long requiredFlags,
3093: unsigned long forbiddenFlags,
3094: char *prompt,
3095: boolean allowInventoryActions);
3096: item *itemOfPackLetter(char letter);
3097: void unequipItem(item *theItem, boolean force);
3098: short magicCharDiscoverySuffix(short category, short kind);
3099: int itemMagicPolarity(item *theItem);
3100: item *itemAtLoc(short x, short y);
3101: item *dropItem(item *theItem);
3102: itemTable *tableForItemCategory(enum itemCategory theCat, short *kindCount);
3103: boolean isVowelish(char *theChar);
3104: short charmEffectDuration(short charmKind, short enchant);
3105: short charmRechargeDelay(short charmKind, short enchant);
3106: boolean itemIsCarried(item *theItem);
3107: void itemDetails(char *buf, item *theItem);
3108: void deleteItem(item *theItem);
3109: void shuffleFlavors();
3110: unsigned long itemValue(item *theItem);
3111: short strLenWithoutEscapes(const char *str);
3112: void combatMessage(char *theMsg, color *theColor);
3113: void displayCombatText();
3114: void flashMonster(creature *monst, const color *theColor, short strength);
3115:
3116: boolean paintLight(lightSource *theLight, short x, short y, boolean isMinersLight, boolean maintainShadows);
3117: void backUpLighting(short lights[DCOLS][DROWS][3]);
3118: void restoreLighting(short lights[DCOLS][DROWS][3]);
3119: void updateLighting();
3120: boolean playerInDarkness();
3121: flare *newFlare(lightSource *light, short x, short y, short changePerFrame, short limit);
3122: void createFlare(short x, short y, enum lightType lightIndex);
3123: void animateFlares(flare **flares, short count);
3124: void deleteAllFlares();
3125: void demoteVisibility();
3126: void discoverCell(const short x, const short y);
3127: void updateVision(boolean refreshDisplay);
3128: void burnItem(item *theItem);
3129: void activateMachine(short machineNumber);
3130: boolean circuitBreakersPreventActivation(short machineNumber);
3131: void promoteTile(short x, short y, enum dungeonLayers layer, boolean useFireDF);
3132: void autoPlayLevel(boolean fastForward);
3133: void updateClairvoyance();
3134: short scentDistance(short x1, short y1, short x2, short y2);
3135: short armorAggroAdjustment(item *theArmor);
3136: short currentAggroValue();
3137:
3138: void initRecording();
3139: void flushBufferToFile();
3140: void fillBufferFromFile();
3141: void recordEvent(rogueEvent *event);
3142: void recallEvent(rogueEvent *event);
3143: void pausePlayback();
3144: void displayAnnotation();
3145: boolean loadSavedGame();
3146: void switchToPlaying();
3147: void recordKeystroke(int keystroke, boolean controlKey, boolean shiftKey);
3148: void recordKeystrokeSequence(unsigned char *commandSequence);
3149: void recordMouseClick(short x, short y, boolean controlKey, boolean shiftKey);
3150: void OOSCheck(unsigned long x, short numberOfBytes);
3151: void RNGCheck();
3152: boolean executePlaybackInput(rogueEvent *recordingInput);
3153: void getAvailableFilePath(char *filePath, const char *defaultPath, const char *suffix);
3154: boolean characterForbiddenInFilename(const char theChar);
3155: void saveGame();
3156: void saveGameNoPrompt();
3157: void saveRecording(char *filePath);
3158: void saveRecordingNoPrompt(char *filePath);
3159: void parseFile();
3160: void RNGLog(char *message);
3161:
3162: short wandDominate(creature *monst);
3163: short staffDamageLow(fixpt enchant);
3164: short staffDamageHigh(fixpt enchant);
3165: short staffDamage(fixpt enchant);
3166: int staffPoison(fixpt enchant);
3167: short staffBlinkDistance(fixpt enchant);
3168: short staffHasteDuration(fixpt enchant);
3169: short staffBladeCount(fixpt enchant);
3170: short staffDiscordDuration(fixpt enchant);
3171: int staffProtection(fixpt enchant);
3172: short staffEntrancementDuration(fixpt enchant);
3173: fixpt ringWisdomMultiplier(fixpt enchant);
3174: short charmHealing(fixpt enchant);
3175: int charmProtection(fixpt enchant);
3176: short charmShattering(fixpt enchant);
3177: short charmGuardianLifespan(fixpt enchant);
3178: short charmNegationRadius(fixpt enchant);
3179: short weaponParalysisDuration(fixpt enchant);
3180: short weaponConfusionDuration(fixpt enchant);
3181: short weaponForceDistance(fixpt enchant);
3182: short weaponSlowDuration(fixpt enchant);
3183: short weaponImageCount(fixpt enchant);
3184: short weaponImageDuration(fixpt enchant);
3185: short armorReprisalPercent(fixpt enchant);
3186: short armorAbsorptionMax(fixpt enchant);
3187: short armorImageCount(fixpt enchant);
3188: short reflectionChance(fixpt enchant);
3189: long turnsForFullRegenInThousandths(fixpt bonus);
3190: fixpt damageFraction(fixpt netEnchant);
3191: fixpt accuracyFraction(fixpt netEnchant);
3192: fixpt defenseFraction(fixpt netDefense);
3193:
3194: void checkForDungeonErrors();
3195:
3196: boolean dialogChooseFile(char *path, const char *suffix, const char *prompt);
3197: void quitImmediately();
3198: void dialogAlert(char *message);
3199: void mainBrogueJunction();
3200: void printSeedCatalog(unsigned long startingSeed, unsigned long numberOfSeedsToScan, unsigned int scanThroughDepth, boolean isCsvFormat);
3201:
3202: void initializeButton(brogueButton *button);
3203: void drawButtonsInState(buttonState *state);
3204: void initializeButtonState(buttonState *state,
3205: brogueButton *buttons,
3206: short buttonCount,
3207: short winX,
3208: short winY,
3209: short winWidth,
3210: short winHeight);
3211: short processButtonInput(buttonState *state, boolean *canceled, rogueEvent *event);
3212: short smoothHiliteGradient(const short currentXValue, const short maxXValue);
3213: void drawButton(brogueButton *button, enum buttonDrawStates highlight, cellDisplayBuffer dbuf[COLS][ROWS]);
3214: short buttonInputLoop(brogueButton *buttons,
3215: short buttonCount,
3216: short winX,
3217: short winY,
3218: short winWidth,
3219: short winHeight,
3220: rogueEvent *returnEvent);
3221:
3222: void dijkstraScan(short **distanceMap, short **costMap, boolean useDiagonals);
3223: void pdsClear(pdsMap *map, short maxDistance, boolean eightWays);
3224: void pdsSetDistance(pdsMap *map, short x, short y, short distance);
3225: void pdsBatchOutput(pdsMap *map, short **distanceMap);
3226:
3227: #if defined __cplusplus
3228: }
3229: #endif
CVSweb