Annotation of brogue-ce/src/brogue/Rogue.h, Revision 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