/* rogue.h - A very large header file UltraRogue: The Ultimate Adventure in the Dungeons of Doom Copyright (C) 1984, 1991, 1997 Herb Chong All rights reserved. Based on "Advanced Rogue" Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka All rights reserved. Based on "Rogue: Exploring the Dungeons of Doom" Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman All rights reserved. See the file LICENSE.TXT for full copyright and licensing information. */ #include #include #include #ifndef LINT #include #else #include "lint-curses.h" #endif #define SHOTPENALTY 2 /* In line of sight of missile */ #define DOORPENALTY 1 /* Moving out of current room */ /* Maximum number of different things */ #define MAXROOMS 9 /* max rooms per normal level */ #define MAXDOORS 4 /* max doors to a room */ #define MAXOBJ 6 /* max number of items to find on a level */ #define MAXTREAS 30 /* max number monsters/treasure in treasure room */ #define MAXTRAPS 80 /* max traps per level */ #define MAXTRPTRY 16 /* max attempts/level allowed for setting traps */ #define MAXPURCH 8 /* max purchases per trading post visit */ #define NUMMONST (sizeof(monsters) / sizeof(struct monster) - 2) #define NUMSUMMON 48 /* number of creatures that can summon hero */ #define NLEVMONS 8 /* number of new monsters per level */ #define LINELEN 512 /* characters in a buffer */ /* The character types */ #define C_FIGHTER 0 #define C_PALADIN 1 #define C_RANGER 2 #define C_CLERIC 3 #define C_DRUID 4 #define C_MAGICIAN 5 #define C_ILLUSION 6 #define C_THIEF 7 #define C_ASSASIN 8 #define C_NINJA 9 #define C_MONSTER 10 #define C_NOTSET 11 /* Must not be a value from above */ /* used for ring stuff */ #define LEFT_1 0 #define LEFT_2 1 #define LEFT_3 2 #define LEFT_4 3 #define LEFT_5 4 #define RIGHT_1 5 #define RIGHT_2 6 #define RIGHT_3 7 #define RIGHT_4 8 #define RIGHT_5 9 /* All the fun defines */ #define next(ptr) ((ptr)?(ptr->l_next):NULL) #define prev(ptr) ((ptr)?(ptr->l_prev):NULL) #define identifier(ptr) (ptr->o_ident) #define winat(y,x) ( (char) \ ((mvwinch(mw,y,x) == ' ') ? mvwinch(stdscr,y,x) : winch(mw)) ) #define debug if (wizard && wiz_verbose) msg #define verify(b) if (b) verify_function(__FILE__, __LINE__); #define DISTANCE(c1, c2) ( ((c2).x - (c1).x)*((c2).x - (c1).x) + \ ((c2).y - (c1).y)*((c2).y - (c1).y) ) #define xyDISTANCE(y1, x1, y2, x2) ((x2 - x1)*(x2 - x1) + (y2 - y1)*(y2 - y1)) #define OBJPTR(what) ((*what).data.obj) #define THINGPTR(what) ((*what).data.th) #define ce(a, b) ((a).x == (b).x && (a).y == (b).y) #define hero player.t_pos #define pstats player.t_stats #define max_stats player.maxstats #define pack player.t_pack #define attach(a, b) _attach(&a, b) #define detach(a, b) _detach(&a, b) #define free_list(a) _free_list(&a) #ifndef max #define max(a, b) ((a) > (b) ? (a) : (b)) #define min(a, b) ((a) < (b) ? (a) : (b)) #endif #define GOLDCALC (rnd(50 + 30 * level) + 2) #define o_charges o_ac #define mi_wght mi_worth /* Things that appear on the screens */ #define WALL ' ' #define PASSAGE '#' #define DOOR '+' #define FLOOR '.' #define VPLAYER '@' #define IPLAYER '_' #define POST '^' #define LAIR '(' #define RUSTTRAP ';' #define TRAPDOOR '>' #define ARROWTRAP '{' #define SLEEPTRAP '$' #define BEARTRAP '}' #define TELTRAP '~' #define DARTTRAP '`' #define POOL '"' #define MAZETRAP '\\' #define FIRETRAP '<' #define POISONTRAP '[' #define ARTIFACT ',' #define SECRETDOOR '&' #define STAIRS '%' #define GOLD '*' #define POTION '!' #define SCROLL '?' #define MAGIC '$' #define BMAGIC '>' /* Blessed magic */ #define CMAGIC '<' /* Cursed magic */ #define FOOD ':' #define WEAPON ')' #define ARMOR ']' #define RING '=' #define STICK '/' /* Various constants */ #define HOLDTIME 2 #define BEARTIME 3 #define SLEEPTIME 4 #define FREEZETIME 6 #define STINKTIME 6 #define CHILLTIME (roll(2, 4)) #define STONETIME 8 #define SICKTIME 10 #define CLRDURATION 15 #define HUHDURATION 20 #define SMELLTIME 20 #define HEROTIME 20 #define HEALTIME 30 #define WANDERTIME 140 #define GONETIME 200 #define PHASEDURATION 300 #define SEEDURATION 850 #define STPOS 0 #define BEFORE 1 #define AFTER 2 #define MORETIME 150 #define HUNGERTIME 1300 #define STOMACHSIZE 2000 #define BOLT_LENGTH 10 #define MARKLEN 20 #define LINEFEED 10 #define CARRIAGE_RETURN 13 #define ESCAPE 27 /* Adjustments for save against things */ #define VS_POISON 0 #define VS_PARALYZATION 0 #define VS_DEATH 0 #define VS_PETRIFICATION 1 #define VS_WAND 2 #define VS_BREATH 3 #define VS_MAGIC 4 /*attributes for treasures in dungeon */ #define ISNORMAL 0x00000000UL /* Neither blessed nor cursed */ #define ISCURSED 0x00000001UL /* cursed */ #define ISKNOW 0x00000002UL /* has been identified */ #define ISPOST 0x00000004UL /* object is in a trading post */ #define ISMETAL 0x00000008UL /* is metallic */ #define ISPROT 0x00000010UL /* object is protected */ #define ISBLESSED 0x00000020UL /* blessed */ #define ISZAPPED 0x00000040UL /* weapon has been charged by dragon */ #define ISVORPED 0x00000080UL /* vorpalized weapon */ #define ISSILVER 0x00000100UL /* silver weapon */ #define ISPOISON 0x00000200UL /* poisoned weapon */ #define CANRETURN 0x00000400UL /* weapon returns if misses */ #define ISOWNED 0x00000800UL /* weapon returns always */ #define ISLOST 0x00001000UL /* weapon always disappears */ #define ISMISL 0x00002000UL /* missile weapon */ #define ISMANY 0x00004000UL /* show up in a group */ #define CANBURN 0x00008000UL /* burns monsters */ #define ISSHARP 0x00010000UL /* cutting edge */ #define ISTWOH 0x00020000UL /* needs two hands to wield */ #define ISLITTLE 0x00040000UL /* small weapon */ #define ISLAUNCHER 0x00080000UL /* used to throw other weapons */ #define TYP_MAGIC_MASK 0x0f000000UL #define POT_MAGIC 0x01000000UL #define SCR_MAGIC 0x02000000UL #define ZAP_MAGIC 0x04000000UL #define SP_WIZARD 0x10000000UL /* only wizards */ #define SP_ILLUSION 0x20000000UL /* only illusionists */ #define SP_CLERIC 0x40000000UL /* only clerics/paladins */ #define SP_DRUID 0x80000000UL /* only druids/rangers */ #define SP_MAGIC 0x30000000UL /* wizard or illusionist */ #define SP_PRAYER 0xc0000000UL /* cleric or druid */ #define SP_ALL 0xf0000000UL /* all special classes */ #define _TWO_ ISBLESSED /* more powerful spell */ /* Various flag bits */ #define ISDARK 0x00000001UL #define ISGONE 0x00000002UL #define ISTREAS 0x00000004UL #define ISFOUND 0x00000008UL #define ISTHIEFSET 0x00000010UL #define WASDARK 0x00000020UL /* struct thing t_flags (might include player) for monster attributes */ #define ISBLIND 0x00000001UL #define ISINWALL 0x00000002UL #define ISRUN 0x00000004UL #define ISFLEE 0x00000008UL #define ISINVIS 0x00000010UL #define ISMEAN 0x00000020UL #define ISGREED 0x00000040UL #define CANSHOOT 0x00000080UL #define ISHELD 0x00000100UL #define ISHUH 0x00000200UL #define ISREGEN 0x00000400UL #define CANHUH 0x00000800UL #define CANSEE 0x00001000UL #define HASFIRE 0x00002000UL #define ISSLOW 0x00004000UL #define ISHASTE 0x00008000UL #define ISCLEAR 0x00010000UL #define CANINWALL 0x00020000UL #define ISDISGUISE 0x00040000UL #define CANBLINK 0x00080000UL #define CANSNORE 0x00100000UL #define HALFDAMAGE 0x00200000UL #define CANSUCK 0x00400000UL #define CANRUST 0x00800000UL #define CANPOISON 0x01000000UL #define CANDRAIN 0x02000000UL #define ISUNIQUE 0x04000000UL #define STEALGOLD 0x08000000UL #define STEALMAGIC 0x10000001UL #define CANDISEASE 0x10000002UL #define HASDISEASE 0x10000004UL #define CANSUFFOCATE 0x10000008UL #define DIDSUFFOCATE 0x10000010UL #define BOLTDIVIDE 0x10000020UL #define BLOWDIVIDE 0x10000040UL #define NOCOLD 0x10000080UL #define TOUCHFEAR 0x10000100UL #define BMAGICHIT 0x10000200UL #define NOFIRE 0x10000400UL #define NOBOLT 0x10000800UL #define CARRYGOLD 0x10001000UL #define CANITCH 0x10002000UL #define HASITCH 0x10004000UL #define DIDDRAIN 0x10008000UL #define WASTURNED 0x10010000UL #define CANSELL 0x10020000UL #define CANBLIND 0x10040000UL #define CANBBURN 0x10080000UL #define ISCHARMED 0x10100000UL #define CANSPEAK 0x10200000UL #define CANFLY 0x10400000UL #define ISFRIENDLY 0x10800000UL #define CANHEAR 0x11000000UL #define ISDEAF 0x12000000UL #define CANSCENT 0x14000000UL #define ISUNSMELL 0x18000000UL #define WILLRUST 0x20000001UL #define WILLROT 0x20000002UL #define SUPEREAT 0x20000004UL #define PERMBLIND 0x20000008UL #define MAGICHIT 0x20000010UL #define CANINFEST 0x20000020UL #define HASINFEST 0x20000040UL #define NOMOVE 0x20000080UL #define CANSHRIEK 0x20000100UL #define CANDRAW 0x20000200UL #define CANSMELL 0x20000400UL #define CANPARALYZE 0x20000800UL #define CANROT 0x20001000UL #define ISSCAVENGE 0x20002000UL #define DOROT 0x20004000UL #define CANSTINK 0x20008000UL #define HASSTINK 0x20010000UL #define ISSHADOW 0x20020000UL #define CANCHILL 0x20040000UL #define CANHUG 0x20080000UL #define CANSURPRISE 0x20100000UL #define CANFRIGHTEN 0x20200000UL #define CANSUMMON 0x20400000UL #define TOUCHSTONE 0x20800000UL #define LOOKSTONE 0x21000000UL #define CANHOLD 0x22000000UL #define DIDHOLD 0x24000000UL #define DOUBLEDRAIN 0x28000000UL #define ISUNDEAD 0x30000001UL #define BLESSMAP 0x30000002UL #define BLESSGOLD 0x30000004UL #define BLESSMONS 0x30000008UL #define BLESSMAGIC 0x30000010UL #define BLESSFOOD 0x30000020UL #define CANBRANDOM 0x30000040UL /* Types of breath */ #define CANBACID 0x30000080UL #define CANBFIRE 0x30000100UL #define CANBBOLT 0x30000200UL #define CANBGAS 0x30000400UL #define CANBICE 0x30000800UL #define CANBPGAS 0x30001000UL /* Paralyze gas */ #define CANBSGAS 0x30002000UL /* Sleeping gas */ #define CANBSLGAS 0x30004000UL /* Slow gas */ #define CANBFGAS 0x30008000UL /* Fear gas */ #define CANBREATHE 0x3000ffc0UL /* Can it breathe at all? */ #define STUMBLER 0x30010000UL #define POWEREAT 0x30020000UL #define ISELECTRIC 0x30040000UL #define HASOXYGEN 0x30080000UL /* Doesn't need to breath air */ #define POWERDEXT 0x30100000UL #define POWERSTR 0x30200000UL #define POWERWISDOM 0x30400000UL #define POWERINTEL 0x30800000UL #define POWERCONST 0x31000000UL #define SUPERHERO 0x32000000UL #define ISUNHERO 0x34000000UL #define CANCAST 0x38000000UL #define CANTRAMPLE 0x40000001UL #define CANSWIM 0x40000002UL #define LOOKSLOW 0x40000004UL #define CANWIELD 0x40000008UL #define CANDARKEN 0x40000010UL #define ISFAST 0x40000020UL #define CANBARGAIN 0x40000040UL #define NOMETAL 0x40000080UL #define CANSPORE 0x40000100UL #define NOSHARP 0x40000200UL #define DRAINWISDOM 0x40000400UL #define DRAINBRAIN 0x40000800UL #define ISLARGE 0x40001000UL #define ISSMALL 0x40002000UL #define CANSTAB 0x40004000UL #define ISFLOCK 0x40008000UL #define ISSWARM 0x40010000UL #define CANSTICK 0x40020000UL #define CANTANGLE 0x40040000UL #define DRAINMAGIC 0x40080000UL #define SHOOTNEEDLE 0x40100000UL #define CANZAP 0x40200000UL #define HASARMOR 0x40400000UL #define CANTELEPORT 0x40800000UL #define ISBERSERK 0x41000000UL #define ISFAMILIAR 0x42000000UL #define HASFAMILIAR 0x44000000UL #define SUMMONING 0x48000000UL #define CANREFLECT 0x50000001UL #define LOWFRIENDLY 0x50000002UL #define MEDFRIENDLY 0x50000004UL #define HIGHFRIENDLY 0x50000008UL #define MAGICATTRACT 0x50000010UL #define ISGOD 0x50000020UL #define CANLIGHT 0x50000040UL #define HASSHIELD 0x50000080UL #define HASMSHIELD 0x50000100UL #define LOWCAST 0x50000200UL #define MEDCAST 0x50000400UL #define HIGHCAST 0x50000800UL #define WASSUMMONED 0x50001000UL #define HASSUMMONED 0x50002000UL #define CANTRUESEE 0x50004000UL #define FLAGSHIFT 28UL #define FLAGINDEX 0x0000000fL #define FLAGMASK 0x0fffffffL /* on - check if a monster flag is on */ #define on(th, flag) \ ((th).t_flags[(flag >> FLAGSHIFT) & FLAGINDEX] & (flag & FLAGMASK)) /* off - check if a monster flag is off */ #define off(th, flag) \ (!((th).t_flags[(flag >> FLAGSHIFT) & FLAGINDEX] & (flag & FLAGMASK))) /* turn_on - turn on a monster flag */ #define turn_on(th, flag) \ ( (th).t_flags[(flag >> FLAGSHIFT) & FLAGINDEX] |= (flag & FLAGMASK)) /* turn_off - turn off a monster flag */ #define turn_off(th, flag) \ ( (th).t_flags[(flag >> FLAGSHIFT) & FLAGINDEX] &= ~(flag & FLAGMASK)) #define SAME_POS(c1,c2) ( (c1.x == c2.x) && (c1.y == c2.y) ) /* types of things */ /* All magic spells duplicate a potion, scroll, or stick effect */ #define TYP_POTION 0 #define TYP_SCROLL 1 #define TYP_RING 2 #define TYP_STICK 3 #define MAXMAGICTYPES 4 /* max number of items in magic class */ #define MAXMAGICITEMS 50 /* max number of items in magic class */ #define TYP_FOOD 4 #define TYP_WEAPON 5 #define TYP_ARMOR 6 #define TYP_ARTIFACT 7 #define NUMTHINGS (sizeof(things) / sizeof(struct magic_item)) /* Artifact types */ #define TR_PURSE 0 #define TR_PHIAL 1 #define TR_AMULET 2 #define TR_PALANTIR 3 #define TR_CROWN 4 #define TR_SCEPTRE 5 #define TR_SILMARIL 6 #define TR_WAND 7 #define MAXARTIFACT (sizeof(arts) / sizeof(struct init_artifact)) /* Artifact flags */ #define ISUSED 01 #define ISACTIVE 02 /* Potion types - add also to magic_item.c and potions.c */ #define P_CLEAR 0 #define P_GAINABIL 1 #define P_SEEINVIS 2 #define P_HEALING 3 #define P_MONSTDET 4 #define P_TREASDET 5 #define P_RAISELEVEL 6 #define P_HASTE 7 #define P_RESTORE 8 #define P_PHASE 9 #define P_INVIS 10 #define P_SMELL 11 #define P_HEAR 12 #define P_SHERO 13 #define P_DISGUISE 14 #define P_FIRERESIST 15 #define P_COLDRESIST 16 #define P_HASOXYGEN 17 #define P_LEVITATION 18 #define P_REGENERATE 19 #define P_SHIELD 20 #define P_TRUESEE 21 #define MAXPOTIONS 22 /* Scroll types - add also to magic_item.c and scrolls.c */ #define S_CONFUSE 0 #define S_MAP 1 #define S_LIGHT 2 #define S_HOLD 3 #define S_SLEEP 4 #define S_ENCHANT 5 #define S_IDENTIFY 6 #define S_SCARE 7 #define S_GFIND 8 #define S_SELFTELEP 9 #define S_CREATE 10 #define S_REMOVECURSE 11 #define S_PETRIFY 12 #define S_GENOCIDE 13 #define S_CURING 14 #define S_MAKEITEMEM 15 #define S_PROTECT 16 #define S_NOTHING 17 #define S_SILVER 18 #define S_OWNERSHIP 19 #define S_FOODDET 20 #define S_ELECTRIFY 21 #define S_CHARM 22 #define S_SUMMON 23 #define S_REFLECT 24 #define S_SUMFAMILIAR 25 #define S_FEAR 26 #define S_MSHIELD 27 #define MAXSCROLLS 28 /* Rod/Wand/Staff types - add also to magic_item.c and sticks.c */ #define WS_LIGHT 0 #define WS_HIT 1 #define WS_ELECT 2 #define WS_FIRE 3 #define WS_COLD 4 #define WS_POLYMORPH 5 #define WS_MISSILE 6 #define WS_SLOW_M 7 #define WS_DRAIN 8 #define WS_CHARGE 9 #define WS_MONSTELEP 10 #define WS_CANCEL 11 #define WS_CONFMON 12 #define WS_DISINTEGRATE 13 #define WS_ANTIMATTER 14 #define WS_PARALYZE 15 #define WS_XENOHEALING 16 #define WS_NOTHING 17 #define WS_INVIS 18 #define WS_BLAST 19 #define WS_WEB 20 #define WS_KNOCK 21 #define WS_CLOSE 22 #define MAXSTICKS 23 /* Ring types */ #define R_PROTECT 0 #define R_ADDSTR 1 #define R_SUSABILITY 2 #define R_SEARCH 3 #define R_SEEINVIS 4 #define R_ALERT 5 #define R_AGGR 6 #define R_ADDHIT 7 #define R_ADDDAM 8 #define R_REGEN 9 #define R_DIGEST 10 #define R_TELEPORT 11 #define R_STEALTH 12 #define R_ADDINTEL 13 #define R_ADDWISDOM 14 #define R_HEALTH 15 #define R_VREGEN 16 #define R_LIGHT 17 #define R_DELUSION 18 #define R_CARRYING 19 #define R_ADORNMENT 20 #define R_LEVITATION 21 #define R_FIRERESIST 22 #define R_COLDRESIST 23 #define R_ELECTRESIST 24 #define R_RESURRECT 25 #define R_BREATHE 26 #define R_FREEDOM 27 #define R_WIZARD 28 #define R_PIETY 29 #define R_TELCONTROL 30 #define R_TRUESEE 31 #define MAXRINGS 32 /* Weapon types */ #define SLING 0 /* sling */ #define ROCK 1 /* rocks */ #define BULLET 2 /* sling bullet */ #define BOW 3 /* short bow */ #define ARROW 4 /* arrow */ #define SILVERARROW 5 /* silver arrows */ #define FLAMEARROW 6 /* flaming arrows */ #define FOOTBOW 7 /* footbow */ #define FBBOLT 8 /* footbow bolt */ #define CROSSBOW 9 /* crossbow */ #define BOLT 10 /* crossbow bolt */ #define DART 11 /* darts */ #define DAGGER 12 /* dagger */ #define HAMMER 13 /* hammer */ #define LEUKU 14 /* leuku */ #define JAVELIN 15 /* javelin */ #define TOMAHAWK 16 /* tomahawk */ #define MACHETE 17 /* machete */ #define THROW_AXE 18 /* throwing axe */ #define SHORT_SPEAR 19 /* spear */ #define BOOMERANG 20 /* boomerangs */ #define LONG_SPEAR 21 /* spear */ #define SHURIKEN 22 /* shurikens */ #define MOLOTOV 23 /* molotov cocktails */ #define GRENADE 24 /* grenade for explosions */ #define CLUB 25 /* club */ #define PITCHFORK 26 /* pitchfork */ #define SHORT_SWORD 27 /* short sword */ #define HAND_AXE 28 /* hand axe */ #define PARTISAN 29 /* partisan */ #define GRAIN_FLAIL 30 /* grain flail */ #define SINGLESTICK 31 /* singlestick */ #define RAPIER 32 /* rapier */ #define SICKLE 33 /* sickle */ #define HATCHET 34 /* hatchet */ #define SCIMITAR 35 /* scimitar */ #define LIGHT_MACE 36 /* mace */ #define MORNINGSTAR 37 /* morning star */ #define BROAD_SWORD 38 /* broad sword */ #define MINER_PICK 39 /* miner's pick */ #define GUISARME 40 /* guisarme */ #define WAR_FLAIL 41 /* war flail */ #define CRYSKNIFE 42 /* crysknife */ #define BATTLE_AXE 43 /* battle axe */ #define CUTLASS 44 /* cutlass sword */ #define GLAIVE 45 /* glaive */ #define PERTUSKA 46 /* pertuska */ #define LONG_SWORD 47 /* long sword */ #define LANCE 48 /* lance */ #define RANSEUR 49 /* ranseur */ #define SABRE 50 /* sabre */ #define SPETUM 51 /* spetum */ #define HALBERD 52 /* halberd */ #define TRIDENT 53 /* trident */ #define WAR_PICK 54 /* war pick */ #define BARDICHE 55 /* bardiche */ #define HEAVY_MACE 56 /* mace */ #define SCYTHE 57 /* great scythe */ #define QUARTERSTAFF 58 /* quarter staff */ #define BAST_SWORD 59 /* bastard sword */ #define PIKE 60 /* pike */ #define TWO_FLAIL 61 /* two-handed flail */ #define TWO_MAUL 62 /* two-handed maul */ #define TWO_PICK 63 /* two-handed pick */ #define TWO_SWORD 64 /* two-handed sword */ #define CLAYMORE 65 /* claymore sword */ #define MAXWEAPONS (sizeof(weaps) / sizeof(struct init_weps)) #define NONE 100 /* no weapon */ /* Armor types */ #define SOFT_LEATHER 0 #define CUIRBOLILLI 1 #define HEAVY_LEATHER 2 #define RING_MAIL 3 #define STUDDED_LEATHER 4 #define SCALE_MAIL 5 #define PADDED_ARMOR 6 #define CHAIN_MAIL 7 #define BRIGANDINE 8 #define SPLINT_MAIL 9 #define BANDED_MAIL 10 #define GOOD_CHAIN 11 #define PLATE_MAIL 12 #define PLATE_ARMOR 13 #define MITHRIL 14 #define CRYSTAL_ARMOR 15 #define MAXARMORS (sizeof(armors) / sizeof(struct init_armor)) /* Food types */ #define FD_RATION 0 #define FD_FRUIT 1 #define FD_CRAM 2 #define FD_CAKES 3 #define FD_LEMBA 4 #define FD_MIRUVOR 5 #define MAXFOODS (sizeof(fd_data) / sizeof(struct magic_item)) /* stuff to do with encumberance */ #define F_OK 0 /* have plenty of food in stomach */ #define F_HUNGRY 1 /* player is hungry */ #define F_WEAK 2 /* weak from lack of food */ #define F_FAINT 3 /* fainting from lack of food */ /* return values for get functions */ #define NORM 0 /* normal exit */ #define QUIT 1 /* quit option setting */ #define MINUS 2 /* back up one option */ /* These are the types of inventory styles. */ #define INV_SLOW 0 #define INV_OVER 1 #define INV_CLEAR 2 /* These will eventually become enumerations */ #define MESSAGE TRUE #define NOMESSAGE FALSE #define POINTS TRUE #define NOPOINTS FALSE #define LOWERCASE TRUE #define UPPERCASE FALSE #define WANDER TRUE #define NOWANDER FALSE #define GRAB TRUE #define NOGRAB FALSE #define FAMILIAR TRUE #define NOFAMILIAR FALSE #define MAXSTATS TRUE #define NOMAXSTATS FALSE #define FORCE TRUE #define NOFORCE FALSE #define THROWN TRUE #define NOTHROWN FALSE /* Ways to die */ #define D_PETRIFY -1 #define D_ARROW -2 #define D_DART -3 #define D_POISON -4 #define D_BOLT -5 #define D_SUFFOCATION -6 #define D_POTION -7 #define D_INFESTATION -8 #define D_DROWN -9 #define D_FALL -10 #define D_FIRE -11 #define D_SPELLFUMBLE -12 #define D_DRAINLIFE -13 #define D_ARTIFACT -14 #define D_GODWRATH -15 #define D_CLUMSY -16 /* values for games end */ #define SCOREIT -1 #define KILLED 0 #define CHICKEN 1 #define WINNER 2 #define TOTAL 3 /* * definitions for function step_ok: MONSTOK indicates it is OK to step on a * monster -- it is only OK when stepping diagonally AROUND a monster */ #define MONSTOK 1 #define NOMONST 2 #define good_monster(m) (on(m, ISCHARMED) || \ on(m, ISFRIENDLY) || \ on(m, ISFAMILIAR)) /* Now we define the structures and types */ /* level types */ typedef enum { NORMLEV, /* normal level */ POSTLEV, /* trading post level */ MAZELEV, /* maze level */ THRONE /* unique monster's throne room */ } LEVTYPE; /* Help list */ struct h_list { char h_ch; char *h_desc; }; /* Coordinate data type */ typedef struct { int x; int y; } coord; /* Linked list data type */ typedef struct linked_list { struct linked_list *l_next; struct linked_list *l_prev; union { struct object *obj; struct thing *th; void *l_data; } data; } linked_list; /* Stuff about magic items */ struct magic_item { char *mi_name; char *mi_abrev; int mi_prob; long mi_worth; int mi_curse; int mi_bless; }; /* Room structure */ struct room { coord r_pos; /* Upper left corner */ coord r_max; /* Size of room */ coord r_exit[MAXDOORS]; /* Where the exits are */ int r_flags; /* Info about the room */ int r_nexits; /* Number of exits */ short r_fires; /* Number of fires in room */ }; /* Initial artifact stats */ struct init_artifact { char *ar_name; /* name of the artifact */ int ar_level; /* first level where it appears */ int ar_rings; /* number of ring effects */ int ar_potions; /* number of potion effects */ int ar_scrolls; /* number of scroll effects */ int ar_wands; /* number of wand effects */ int ar_worth; /* gold pieces */ int ar_weight; /* weight of object */ }; /* Array of all traps on this level */ struct trap { coord tr_pos; /* Where trap is */ long tr_flags; /* Info about trap (i.e. ISFOUND) */ char tr_type; /* What kind of trap */ char tr_show; /* What disguised trap looks like */ }; /* Structure describing a fighting being */ struct stats { char *s_dmg; /* String describing damage done */ long s_exp; /* Experience */ long s_hpt; /* Hit points */ int s_pack; /* current weight of his pack */ int s_carry; /* max weight he can carry */ int s_lvl; /* Level of mastery */ int s_arm; /* Armor class */ int s_acmod; /* Armor clss modifier */ int s_power; /* Spell points */ int s_str; /* Strength */ int s_intel; /* Intelligence */ int s_wisdom; /* Wisdom */ int s_dext; /* Dexterity */ int s_const; /* Constitution */ int s_charisma; /* Charisma */ }; /* Structure describing a fighting being (monster at initialization) */ struct mstats { short s_str; /* Strength */ long s_exp; /* Experience */ int s_lvl; /* Level of mastery */ int s_arm; /* Armor class */ char *s_hpt; /* Hit points */ char *s_dmg; /* String describing damage done */ }; /* Structure for monsters and player */ /* NOTE: In initial v1.04 code the t_chasee variable will be reset during the save/restore process. Eventually need to implement a "thing" manager where I can refer to "things" by number such that references to them can be saved. Problems exist with regard to removing references to "things" that have been killed. */ typedef struct thing { long chasee_index, horde_index; /* Used in save/rest process */ struct linked_list *t_pack; /* What the thing is carrying */ struct stats t_stats; /* Physical description */ struct stats maxstats; /* maximum(or initial) stats */ int t_ischasing; /* Are we chasing someone? */ struct thing *t_chasee; /* Who are we chasing */ struct object *t_horde; /* What are we hordeing */ coord t_pos; /* Cuurent Position */ coord t_oldpos; /* Last Position */ coord t_nxtpos; /* Next Position */ long t_flags[16]; /* State word */ int t_praycnt; /* Times prayed... */ int t_trans; /* # of transactions at post */ int t_turn; /* If slowed, is it a turn to move */ int t_wasshot; /* Was character shot last round? */ int t_ctype; /* Character type */ int t_index; /* Index into monster table */ int t_no_move; /* How long the thing can't move */ int t_rest_hpt; /* used in hit point regeneration */ int t_rest_pow; /* used in spell point regeneration */ int t_doorgoal; /* What door are we heading to? */ char t_type; /* What it is */ char t_disguise; /* What mimic looks like */ char t_oldch; /* Character that was where it was */ } thing; /* Array containing information on all the various types of monsters */ struct monster { char *m_name; /* What to call the monster */ short m_carry; /* Probability of carrying something */ int m_normal; /* Does monster exist? */ int m_wander; /* Does monster wander? */ char m_appear; /* What does monster look like? */ char *m_intel; /* Intelligence range */ unsigned long m_flags[16]; /* Things about the monster */ char *m_typesum; /* type of creature can he summon */ short m_numsum; /* how many creatures can he summon */ short m_add_exp; /* Added experience per hit point */ struct mstats m_stats; /* Initial stats */ }; /* Structure for a thing that the rogue can carry */ typedef struct object { coord o_pos; /* Where it lives on the screen */ struct linked_list *next_obj; /* The next obj. for stacked objects */ struct linked_list *o_bag; /* bag linked list pointer */ char *o_text; /* What it says if you read it */ char *o_damage; /* Damage if used like sword */ char *o_hurldmg; /* Damage if thrown */ long o_flags; /* Information about objects */ long ar_flags; /* general flags */ char o_type; /* What kind of object it is */ int o_ident; /* identifier for object */ unsigned int o_count; /* Count for plural objects */ int o_which; /* Which object of a type it is */ int o_hplus; /* Plusses to hit */ int o_dplus; /* Plusses to damage */ int o_ac; /* Armor class */ int o_group; /* Group number for this object */ int o_weight; /* weight of this object */ char o_launch; /* What you need to launch it */ char o_mark[MARKLEN]; /* Mark the specific object */ long o_worth; } object; /* weapon structure */ struct init_weps { char *w_name; /* name of weapon */ char *w_dam; /* hit damage */ char *w_hrl; /* hurl damage */ char w_launch; /* need to launch it */ int w_wght; /* weight of weapon */ long w_worth; /* worth of this weapon */ long w_flags; /* flags */ }; /* armor structure */ struct init_armor { char *a_name; /* name of armor */ long a_worth; /* worth of armor */ int a_prob; /* chance of getting armor */ int a_class; /* normal armor class */ int a_wght; /* weight of armor */ }; struct matrix { int base; /* Base to-hit value (AC 10) */ int max_lvl;/* Maximum level for changing value */ int factor; /* Amount base changes each time */ int offset; /* What to offset level */ int range; /* Range of levels for each offset */ }; /* ANSI C Prototype Additions */ /* armor.c */ extern void wear(void); extern void take_off(void); extern void waste_time(void); extern int wear_ok(struct thing *th, struct object *obj, int print_message); /* artifact.c */ extern void apply(void); extern int possessed(int artifact); extern int is_carrying(int artifact); extern int make_artifact(void); extern struct object *new_artifact(int which, struct object *cur); extern void do_minor(struct object *obj); extern void do_major(void); extern void do_phial(void); extern void do_palantir(void); extern void do_sceptre(void); extern void do_silmaril(void); extern void do_amulet(void); extern void do_bag(struct object *obj); extern void do_wand(void); extern void do_crown(void); extern void level_eval(void); /* bag.c */ typedef union { void *varg; int *iarg; struct object *obj; } bag_arg; extern struct object *apply_to_bag(struct linked_list *bag_p, int type, int (*bff_p)(struct object *obj, bag_arg *arg), int (*baf_p)(struct object *obj, bag_arg *arg, int id), void *user_arg); extern int count_bag(linked_list *bag_p, int type, int (*bff_p)(struct object *obj, bag_arg *arg)); extern void del_bag(linked_list *bag_p, object *obj_p); extern struct object *pop_bag(linked_list **bag_pp, object *obj_p); extern void push_bag(linked_list **bag_pp, object *obj_p); extern struct object *scan_bag(linked_list *bag_p, int type, int id); extern struct object *select_bag(linked_list *bag_p, int type, int (*bff_p)(struct object *obj, bag_arg *arg), int index); /* chase.c */ extern void do_chase(struct thing *th, int flee); extern void chase_it(coord *runner, struct thing *th); extern void runto(void);/* coord *runner, coord *spot); */ extern int chase(struct thing *tp, coord *ee, int flee); extern struct room *roomin(coord cp); extern struct linked_list *find_mons(int y, int x); extern struct linked_list *f_mons_a(int y, int x, int hit_bad); extern int diag_ok(coord *sp, coord *ep, struct thing *flgptr); extern int cansee(int y, int x); extern coord *find_shoot(struct thing *tp, coord *dir); extern coord *can_shoot(coord *er, coord *ee, coord *dir); extern int straight_shot(int ery, int erx, int eey, int eex, coord *dir); extern struct linked_list *get_hurl(struct thing *tp); extern struct object *pick_weap(struct thing *tp); extern int can_blink(struct thing *tp); /* command.c */ extern char fight_ch; extern char countch; extern void command(void); extern void do_after_effects(void); extern void make_omnipotent(void); extern void quit_handler(int sig); extern void quit(void); extern void search(int is_thief); extern void help(void); extern void identify(void); extern void d_level(void); extern void u_level(void); extern void call(int mark); extern int att_bonus(void); /* daemon.c */ extern int demoncnt; struct delayed_action { int d_type; int d_when; int d_id; void *d_arg; int d_time; }; #define EMPTY 0 #define DAEMON 1 #define FUSE 2 typedef void fuse; typedef union { void *varg; int *iarg; struct linked_list *ll; } fuse_arg; typedef union { void *varg; int *iarg; struct thing *thingptr; } daemon_arg; struct fuse { int index; fuse (*func)(fuse_arg *arg); }; struct daemon { int index; void (*func)(daemon_arg *arg); }; #define MAXDAEMONS 60 #define FUSE_NULL 0 #define FUSE_SWANDER 1 #define FUSE_UNCONFUSE 2 #define FUSE_UNSCENT 3 #define FUSE_SCENT 4 #define FUSE_UNHEAR 5 #define FUSE_HEAR 6 #define FUSE_UNSEE 7 #define FUSE_UNSTINK 8 #define FUSE_UNCLRHEAD 9 #define FUSE_UNPHASE 10 #define FUSE_SIGHT 11 #define FUSE_RES_STRENGTH 12 #define FUSE_NOHASTE 13 #define FUSE_NOSLOW 14 #define FUSE_SUFFOCATE 15 #define FUSE_CURE_DISEASE 16 #define FUSE_UNITCH 17 #define FUSE_APPEAR 18 #define FUSE_UNELECTRIFY 19 #define FUSE_UNBHERO 20 #define FUSE_UNSHERO 21 #define FUSE_UNXRAY 22 #define FUSE_UNDISGUISE 23 #define FUSE_SHERO 24 #define FUSE_WGHTCHK 25 #define FUSE_UNSUMMON 26 #define FUSE_UNGAZE 27 #define FUSE_UNCOLD 28 #define FUSE_UNHOT 29 #define FUSE_UNFLY 30 #define FUSE_UNBREATHE 31 #define FUSE_UNREGEN 32 #define FUSE_UNSUPEREAT 33 #define FUSE_UNSHIELD 34 #define FUSE_UNMSHIELD 35 #define FUSE_UNTRUESEE 36 #define FUSE_MAX 37 #define DAEMON_NULL 0 #define DAEMON_DOCTOR 1 #define DAEMON_ROLLWAND 2 #define DAEMON_STOMACH 3 #define DAEMON_RUNNERS 4 #define DAEMON_MAX 5 extern struct delayed_action d_list[MAXDAEMONS]; extern struct daemon daemons[DAEMON_MAX]; extern struct fuse fuses[FUSE_MAX]; extern struct delayed_action *d_slot(void); extern struct delayed_action *find_slot(int id, int type); extern void start_daemon(int id, void *arg, int whendo); extern void kill_daemon(int id); extern void do_daemons(int now); extern void light_fuse(int id, void *arg, int time, int whendo); extern void lengthen_fuse(int id, int xtime); extern void extinguish_fuse(int id); extern void do_fuses(int flag); extern void activity(void); /* daemons.c */ extern void doctor_spell_points(struct thing *tp); extern void runners(daemon_arg *arg); extern void doctor(daemon_arg *tp); extern void rollwand(daemon_arg *arg); extern void stomach(daemon_arg *arg); extern fuse swander(fuse_arg *arg); extern fuse unconfuse(fuse_arg *arg); extern fuse unscent(fuse_arg *arg); extern fuse scent(fuse_arg *arg); extern fuse unhear(fuse_arg *arg); extern fuse hear(fuse_arg *arg); extern fuse unsee(fuse_arg *arg); extern fuse unstink(fuse_arg *arg); extern fuse unclrhead(fuse_arg *arg); extern fuse unphase(fuse_arg *arg); extern fuse sight(fuse_arg *arg); extern fuse res_strength(fuse_arg *arg); extern fuse nohaste(fuse_arg *arg); extern fuse noslow(fuse_arg *arg); extern fuse suffocate(fuse_arg *arg); extern fuse cure_disease(fuse_arg *arg); extern fuse un_itch(fuse_arg *arg); extern fuse appear(fuse_arg *arg); extern fuse unelectrify(fuse_arg *arg); extern fuse unshero(fuse_arg *arg); extern fuse unbhero(fuse_arg *arg); extern fuse undisguise(fuse_arg *arg); extern fuse unsummon(fuse_arg *monst); extern fuse ungaze(fuse_arg *arg); extern fuse shero(fuse_arg *arg); extern fuse uncold(fuse_arg *arg); extern fuse unhot(fuse_arg *arg); extern fuse unfly(fuse_arg *arg); extern fuse unbreathe(fuse_arg *arg); extern fuse unregen(fuse_arg *arg); extern fuse unsupereat(fuse_arg *arg); extern fuse unshield(fuse_arg *arg); extern fuse unmshield(fuse_arg *arg); extern fuse untruesee(fuse_arg *arg); extern fuse wghtchk(fuse_arg *arg); /* encumb.h */ extern void updpack(void); extern int packweight(void); extern int itemweight(struct object *wh); extern int playenc(void); extern int totalenc(void); extern int hitweight(void); /* fight.c */ extern void do_fight(coord dir, int tothedeath); extern int fight(coord *mp, struct object *weap, int thrown); extern int attack(struct thing *mp, struct object *weapon, int thrown); extern int mon_mon_attack(struct thing *attacker, struct linked_list *mon, struct object *weapon, int thrown); extern int swing(int class, int at_lvl, int op_arm, int wplus); extern void init_exp(void); extern int next_exp_level(int print_message); extern void check_level(void); extern int roll_em(struct thing *att_er, struct thing *def_er, struct object *weap, int thrown, struct object *cur_weapon); extern const char *prname(char *who); extern void hit(char *ee); extern void miss(char *ee); extern int save_throw(int which, struct thing *tp); extern int save(int which); extern int dext_plus(int dexterity); extern int dext_prot(int dexterity); extern int str_plus(int str); extern int add_dam(int str); extern int hung_dam(void); extern void raise_level(void); extern void thunk(struct object *weap, char *mname); extern void m_thunk(struct object *weap, char *mname); extern void bounce(struct object *weap, char *mname); extern void m_bounce(struct object *weap, char *mname); extern void remove_monster(coord *mp, struct linked_list *item); extern int is_magic(struct object *obj); extern void killed(struct thing *killer,struct linked_list *item, int print_message, int give_points); extern struct object *wield_weap(struct object *weapon, struct thing *mp); extern void summon_help(struct thing *mons, int force); extern int maxdamage(char *cp); /* getplay.c */ extern int geta_player(void); extern void puta_player(void); extern void do_getplayer(void); extern void print_stored(void); extern char *which_class(int c_class); /* ident.c */ extern char print_letters[]; extern int get_ident(struct object *obj_p); extern void free_ident(struct object *obj_p); extern int unprint_id(char *print_id); extern int max_print(void); /* init.c */ extern void init_materials(void); extern void init_player(void); extern void init_flags(void); extern void init_things(void); extern void init_fd(void); extern void init_colors(void); extern void init_names(void); extern void init_stones(void); extern void badcheck(char *name, struct magic_item *magic, int bound); /* io.c */ extern int get_string(char *buffer, WINDOW *win); extern void msg(const char *fmt, ...); extern void addmsg(const char *fmt, ...); extern void endmsg(void); extern void doadd(const char *fmt, va_list ap); extern char readchar(void); extern char readcharw(WINDOW *scr); extern void status(int display); extern void wait_for(int ch); extern void show_win(WINDOW *scr, char *message); extern void restscr(WINDOW *scr); extern void add_line(const char *fmt, ...); extern void end_line(void); extern void hearmsg(const char *fmt, ...); extern void seemsg(const char *fmt, ...); /* list.c */ extern void *ur_alloc(size_t size); extern void ur_free(void *buf_p); extern void _detach(struct linked_list **list, struct linked_list *item); extern void _attach(struct linked_list **list, struct linked_list *item); extern void _attach_after(linked_list **list_pp, linked_list *list_p, linked_list *new_p); extern void _free_list(struct linked_list **ptr); extern void discard(struct linked_list *item); extern void throw_away(struct object *ptr); extern struct linked_list *new_item(int size); extern void *new_alloc(size_t size); extern struct linked_list *new_list(void); /* magic.c */ /* for printing out messages */ #define CAST_NORMAL 0x000 /* cast normal version */ #define CAST_CURSED 0x001 /* cast cursed version */ #define CAST_BLESSED 0x002 /* cast blessed version */ #define CAST_CROWN 0x010 /* crown helped out */ #define CAST_SEPTRE 0x020 /* septre helped out */ #define MAX_SPELLS 100 /* Max # sorted_spells */ #define MIN_FUMBLE_CHANCE 5 #define MAX_FUMBLE_CHANCE 95 /* Spells that a monster can cast */ #define M_SELFTELEP 0 #define M_HLNG2 1 #define M_REGENERATE 2 #define M_HLNG 3 #define NUM_RUN 4 #define M_HASTE 4 #define M_SEEINVIS 5 #define M_SHERO 6 #define M_PHASE 7 #define M_INVIS 8 #define M_CANCEL 9 #define M_OFFENSE 10 struct spells { int sp_level; /* level of casting spell */ int sp_which; /* which scroll or potion */ unsigned long sp_flags; /* scroll, blessed, known */ int sp_cost; /* generated in incant() */ }; extern void incant(struct thing *caster, coord shoot_dir); extern char *spell_name(struct spells *sp, char *buf); extern char *spell_abrev(struct spells *sp, char *buf); extern void fumble_spell(struct thing *caster, int num_fumbles); extern void learn_new_spells(void); extern struct spells *pick_monster_spell(struct thing *caster); extern int sort_spells(const void *a, const void *b); /* magicitm.c */ extern struct magic_item things[]; /* Chances for each type of item*/ extern struct magic_item s_magic[]; /* Names and chances for scrolls*/ extern struct magic_item p_magic[]; /* Names and chances for potions*/ extern struct magic_item r_magic[]; /* Names and chances for rings */ extern struct magic_item ws_magic[]; /* Names and chances for sticks */ extern struct magic_item fd_data[]; /* Names and chances for food */ extern struct init_weps weaps[]; /* weapons and attributes */ extern struct init_armor armors[]; /* armors and attributes */ extern struct init_artifact arts[]; /* artifacts and attributes */ extern int maxarmors; extern int maxartifact; extern int maxfoods; extern int maxpotions; extern int maxrings; extern int maxscrolls; extern int maxsticks; extern int maxweapons; extern int numthings; extern char *s_names[]; /* Names of the scrolls */ extern char *p_colors[]; /* Colors of the potions */ extern char *r_stones[]; /* Stone settings of the rings */ extern char *guess_items[MAXMAGICTYPES][MAXMAGICITEMS]; /* Players guess at what magic is */ extern int know_items[MAXMAGICTYPES][MAXMAGICITEMS]; /* Does he know what a magic item does */ extern char *ws_type[]; /* Is it a wand or a staff */ extern char *ws_made[]; /* What sticks are made of */ /* main.c */ extern FILE *fd_score; extern FILE *file_log; extern int summoned; extern coord dta; extern int main(int argc, char *argv[]); extern void fatal(char *s); extern int rnd(int range); extern unsigned char ucrnd(unsigned char range); extern short srnd(short range); extern unsigned long ulrnd(unsigned long range); extern int roll(int number, int sides); /* maze.c */ extern void do_maze(void); extern void draw_maze(void); extern char *moffset(int y, int x); extern char *foffset(int y, int x); extern int findcells(int y, int x); extern void rmwall(int newy, int newx, int oldy, int oldx); extern void crankout(void); /* memory.c */ extern void mem_debug(const int level); extern void mem_tracking(int flag); extern int mem_check(char *fname, int line); extern void *mem_malloc(const size_t bytes); extern void mem_free(const void *ptr); extern void *mem_realloc(const void *ptr, const size_t new_size); extern int mem_validate(const void *ptr); /* misc.c */ extern char *tr_name(char ch, char *buf); extern void look(int wakeup); extern char secretdoor(int y, int x); extern struct linked_list *find_obj(int y, int x); extern void eat(void); extern void chg_str(int amt, int both, int lost); extern void chg_dext(int amt, int both, int lost); extern void add_haste(int blessed); extern void aggravate(void); extern char *vowelstr(char *str); extern int is_current(struct object *obj); extern int get_dir(void); extern int is_wearing(int type); extern int maze_view(int y, int x); extern void listen(void); extern void nothing_message(int flags); extern void feel_message(void); extern int const_bonus(void); extern int int_wis_bonus(void); extern void electrificate(void); extern void feed_me(int hungry_state); extern int get_monster_number(char *message); /* monsdata.c */ extern struct monster monsters[]; extern int nummonst; /* monsters.c */ extern struct linked_list *summon_monster(int type, int familiar, int print_message); extern int randmonster(int wander, int grab); extern void new_monster(struct linked_list *item, int type, coord *cp, int max_monster); extern void wanderer(void); extern struct linked_list *wake_monster(int y, int x); extern void genocide(int flags); extern void id_monst(int monster); extern void check_residue(struct thing *tp); extern void sell(struct thing *tp); extern void carried_weapon(struct thing *owner, struct object *weapon); /* move.c */ extern coord nh; extern void do_run(char ch); extern int step_ok(int y, int x, int can_on_monst, struct thing *flgptr); extern void corr_move(int dy, int dx); extern void do_move(int dy, int dx); extern void light(coord *cp); extern int blue_light(int flags); extern char show(int y, int x); extern char be_trapped(struct thing *th, coord tc); extern void dip_it(void); extern struct trap *trap_at(int y, int x); extern void set_trap(struct thing *tp, int y, int x); extern coord rndmove(struct thing *who); extern int isatrap(int ch); /* newlvl.c */ extern void new_level(LEVTYPE ltype, int special); extern void put_things(LEVTYPE ltype); extern int throne_monster; extern void do_throne(int special); extern void create_lucifer(coord *stairs); /* options.c */ typedef union { void *varg; char *str; int *iarg; } opt_arg; struct optstruct { char *o_name; /* option name */ char *o_prompt; /* prompt for interactive entry */ opt_arg o_opt; /* pointer to thing to set */ void (*o_putfunc)(opt_arg *arg,WINDOW *win);/* func to print value */ int (*o_getfunc)(opt_arg *arg,WINDOW *win);/* func to get value */ }; typedef struct optstruct OPTION; extern void parse_opts(char *str); extern void option(void); extern void put_bool(opt_arg *iarg, WINDOW *win); extern void put_str(opt_arg *str, WINDOW *win); extern void put_abil(opt_arg *ability, WINDOW *win); extern void put_inv(opt_arg *inv, WINDOW *win); extern int get_bool(opt_arg *bp, WINDOW *win); extern int get_str(opt_arg *opt, WINDOW *win); extern int get_abil(opt_arg *abil, WINDOW *win); extern int get_inv(opt_arg *inv, WINDOW *win); /* pack.c */ extern void swap_top(struct linked_list *top, struct linked_list *node); extern void get_all(struct linked_list *top); extern struct linked_list *get_stack(struct linked_list *item); extern int add_pack(struct linked_list *item, int print_message); extern void pack_report(object *obj, int print_message, char *message); extern void inventory(struct linked_list *container, int type); extern void pick_up(char ch); extern struct object *get_object(struct linked_list *container, char *purpose, int type, int (*bff_p)(struct object *obj, bag_arg *junk) ); extern struct linked_list *get_item(char *purpose, int type); extern void del_pack(struct linked_list *what); extern void discard_pack(struct object *obj_p); extern void rem_pack(struct object *obj_p); extern void cur_null(struct object *op); extern void idenpack(void); extern void show_floor(void); /* passages.c */ struct rdes { int conn[MAXROOMS]; /* possible to connect to room i? */ int isconn[MAXROOMS]; /* connection been made to room i? */ int ingraph; /* this room in graph already? */ }; extern void do_passages(void); extern void conn(int r1, int r2); extern void door(struct room *rm, coord *cp); /* player.c */ extern void prayer(void); extern int gsense(void); extern int is_stealth(struct thing *tp); extern void steal(void); extern void affect(void); extern void undead_sense(void); /* potions.c */ extern void quaff(struct thing *quaffer, int which, int flag); extern void lower_level(int who); extern void res_dexterity(void); extern void res_wisdom(void); extern void res_intelligence(void); extern void add_strength(int cursed); extern void add_intelligence(int cursed); extern void add_wisdom(int cursed); extern void add_dexterity(int cursed); extern void add_const(int cursed); extern void monquaff(struct thing *quaffer, int which, int flag); /* properti.c */ extern int baf_print_item(struct object *obj_p, bag_arg *type, int id); extern int baf_identify(struct object *obj_p, bag_arg *junk, int id); extern int baf_curse(struct object *obj_p, bag_arg *junk, int id); extern int baf_decrement_test(struct object *obj_p, bag_arg *count_p, int id); extern int baf_increment(struct object *obj_p, bag_arg *count_p, int id); extern int bafcweapon(struct object *obj_p, bag_arg *junk, int id); extern int bafcarmor(struct object *obj_p, bag_arg *junk, int id); extern int bff_group(struct object *obj_p, bag_arg *new_obj_p); extern int bff_callable(struct object *obj_p, bag_arg *junk); extern int bff_markable(struct object *obj_p, bag_arg *junk); extern int bffron(object *obj_p, bag_arg *junk); extern int bff_zappable(struct object *obj_p, bag_arg *junk); /* random.c */ extern void ur_srandom(unsigned x); extern long ur_random(void); /* rings.c */ extern void ring_on(void); extern void ring_off(void); extern int ring_eat(int hand); extern char *ring_num(struct object *obj, char *buf); extern int ring_value(int type); /* rip.c */ extern void death(int monst); extern void score(long amount, int lvl, int flags, int monst); extern void total_winner(void); extern char *killname(int monst, char *buf); extern void showpack(char *howso); extern void byebye(void); extern int save_resurrect(int bonus); /* rogue.c */ extern const char *monstern; extern const struct h_list helpstr[]; extern const char *cnames[][15]; /* Character level names */ extern char *spacemsg; extern char *morestr; extern char *retstr; /* state.c */ extern int mpos; /* Where cursor is on top line */ extern struct trap traps[]; extern struct room rooms[]; /* One for each room -- A level */ extern struct thing player; /* The rogue */ extern struct thing *beast; /* The last monster attacking */ extern struct object *cur_armor; /* What a well dresssed rogue wears */ extern struct object *cur_weapon; /* Which weapon he is wielding */ extern struct object *cur_ring[]; /* What rings are being worn */ extern struct linked_list *fam_ptr; /* A ptr to the familiar */ extern struct linked_list *lvl_obj; /* List of objects on this level */ extern struct linked_list *mlist; /* List of monsters on the level */ extern struct linked_list *curr_mons; /* The mons. currently moving */ extern struct linked_list *next_mons; /* The mons. after curr_mons */ extern int prscore; /* Print scores */ extern int prversion; /* Print version info */ extern WINDOW *cw; /* Window that the player sees */ extern WINDOW *hw; /* Used for the help command */ extern WINDOW *mw; /* Used to store mosnters */ extern LEVTYPE levtype; extern coord delta; /* Change indicated to get_dir() */ extern char *release; /* Release number of rogue */ extern char *lastfmt; extern char *lastarg; extern unsigned long total; /* Total dynamic memory bytes */ extern long purse; /* How much gold the rogue has */ extern int line_cnt; /* Counter for inventory style */ extern int newpage; extern int resurrect; /* resurrection counter */ extern int foodlev; /* how fast he eats food */ extern int see_dist; /* (how far he can see)^2 */ extern int level; /* What level rogue is on */ extern int ntraps; /* Number of traps on this level */ extern int no_command; /* Number of turns asleep */ extern int no_food; /* Number of levels without food */ extern int count; /* Number of times to repeat command */ extern int dnum; /* Dungeon number */ extern int max_level; /* Deepest player has gone */ extern int food_left; /* Amount of food in hero's stomach */ extern int group; /* Current group number */ extern int hungry_state; /* How hungry is he */ extern int infest_dam; /* Damage from parasites */ extern int lost_str; /* Amount of strength lost */ extern int lost_dext; /* amount of dexterity lost */ extern int hold_count; /* Number of monsters holding player */ extern int trap_tries; /* Number of attempts to set traps */ extern int has_artifact; /* set for possesion of artifacts */ extern int picked_artifact; /* set for any artifacts picked up */ extern int msg_index; /* pointer to current message buffer */ extern int luck; /* how expensive things to buy thing */ extern int fam_type; /* Type of familiar */ extern int times_prayed; /* The number of time prayed */ extern int mons_summoned; /* Number of summoned monsters */ extern int char_type; /* what type of character is player */ extern int pool_teleport; /* just teleported from a pool */ extern int inwhgt; /* true if from wghtchk() */ extern int running; /* True if player is running */ extern int fighting; /* True if player is fighting */ extern int playing; /* True until he quits */ extern int wizard; /* True if allows wizard commands */ extern int wiz_verbose; /* True if show debug messages */ extern int after; /* True if we want after daemons */ extern int fight_flush; /* True if toilet input */ extern int terse; /* True if we should be short */ extern int doorstop; /* Stop running when we pass a door */ extern int jump; /* Show running as series of jumps */ extern int door_stop; /* Current status of doorstop */ extern int firstmove; /* First move after setting door_stop */ extern int waswizard; /* Was a wizard sometime */ extern int canwizard; /* Will be permitted to do this */ extern int askme; /* Ask about unidentified things */ extern int moving; /* move using 'm' command */ extern int use_savedir; /* Savefile is in system savedir */ extern int inv_type; /* Inven style. Bool so options works */ extern char take; /* Thing the rogue is taking */ extern char PLAYER; /* what the player looks like */ extern char prbuf[]; /* Buffer for sprintfs */ extern char runch; /* Direction player is running */ extern char whoami[]; /* Name of player */ extern char fruit[]; /* Favorite fruit */ extern char msgbuf[10][2 * LINELEN]; /* message buffer */ extern char file_name[]; /* Save file name */ extern char score_file[]; /* Score file name */ extern struct linked_list *arrow, *bolt, *rock, *silverarrow, *fbbolt; extern struct linked_list *bullet, *firearrow, *dart, *dagger, *shuriken; extern struct linked_list *oil, *grenade; extern struct room *oldrp; /* Roomin(&oldpos) */ extern void ur_write_thing(FILE *savef, struct thing *t); extern struct thing *ur_read_thing(FILE *savef); extern void ur_write_object_stack(FILE *savef, struct linked_list *l); extern void ur_write_bag(FILE *savef, struct linked_list *l); extern struct linked_list *ur_read_bag(FILE *savef); extern struct linked_list *ur_read_object_stack(FILE *savef); extern int restore_file(FILE *savef); /* rooms.c */ extern void do_rooms(void); extern void draw_room(struct room *rp); extern void horiz(int cnt); extern void vert(int cnt); extern void rnd_pos(struct room *rp, coord *cp); extern int rnd_room(void); /* save.c */ extern int restore(char *file); extern int save_game(void); extern void save_file(FILE *savefd); /* scrolls.c */ extern void read_scroll(struct thing *reader, int which, int flags); extern struct linked_list *creat_mons(struct thing *person,int monster,int message); extern int place_mons(int y, int x, coord *pos); extern int is_r_on(struct object *obj); extern void monread(struct thing *reader, int which, int flags); /* status.c */ extern int has_defensive_spell(struct thing th); /* sticks.c */ extern void fix_stick(struct object *cur); extern void do_zap(struct thing *zapper, int which, unsigned long flags); extern void drain(int ymin, int ymax, int xmin, int xmax); extern char *charge_str(struct object *obj, char *buf); extern void shoot_bolt(struct thing *shooter, coord start, coord dir, int get_points, int reason, char *name, int damage); extern void monster_do_zap(struct thing *zapper, int which, int flags); extern void cancel_player(int not_unique); /* things.c */ extern char *inv_name(struct object *obj, int lowercase); extern void rem_obj(struct linked_list *item, int dis); extern void add_obj(struct linked_list *item, int y, int x); extern int drop(struct linked_list *item); extern int dropcheck(struct object *op); extern struct linked_list *new_thing(void); extern struct linked_list *spec_item(char type, int which, int hit, int damage); extern int pick_one(struct magic_item *magic, int nitems); extern char *blesscurse(long flags); extern int extras(void); extern char *name_type(int type); extern linked_list *make_item(object *obj_p); extern int is_member(char *list_p, int member); /* trader.c */ extern void do_post(void); extern void buy_it(char itemtype, int flags); extern void sell_it(void); extern void describe_it(struct object *obj); extern int open_market(void); extern int get_worth(struct object *obj); extern void trans_line(void); /* verify.c */ extern void verify_function(const char *file, const int line); /* vers.c */ extern char *save_format; extern char *version; extern char *release; /* weapons.c */ extern coord do_motion(int ob, int ydelta, int xdelta, struct thing *tp); extern void fall(struct thing *tp, struct linked_list *item, int pr, int player_owned); extern int hit_monster(int y, int x, struct object *weapon, struct thing *thrower); extern int wield_ok(struct thing *wieldee, struct object *obj, int print_message); extern int shoot_ok(int ch); extern int fallpos(coord pos, coord *newpos); extern void wield(void); extern char *num(int n1, int n2, char *buf); extern void init_weapon(struct object *weap, int type); extern void missile(int ydelta, int xdelta, struct linked_list *item, struct thing *tp); /* wizard.c */ extern void whatis(struct linked_list *what); extern void teleport(void); extern int passwd(void); /* mdport.c */ char *md_strdup(const char *s); long md_random(void); void md_srandom(long seed); int md_readchar(WINDOW *win); int md_getuid(void); void md_normaluser(void); void md_onsignal_autosave(void); void md_ignore_signals(void); #define NOOP(x) (x += 0) #define CCHAR(x) ( (char) (x & A_CHARTEXT) )