Mercurial > hg > early-roguelike
view rogue4/rogue.h @ 110:5f51f7d9805f
arogue5: fix some save/restore-related crashes.
The save/restore code took the pointer intended as an argument for the
doctor() daemon and wrote it to the savefile as an int. I don't know
why it took so long to fail horribly. The problem has been avoided by
replacing the value with &player when restoring. That seems to be the
only argument ever actually used.
The code also writes only four bytes for an unsigned long; if
sizeof(long) == 8, it casts to unsigned int first. It failed to do the
cast when reading back, with the result that four bytes were read and
the other half of the number was effectively uninitialized.
It apparently works now, but the save/restore code ought still to be
regarded as decidedly unfortunate.
author | John "Elwin" Edwards |
---|---|
date | Mon, 06 Jan 2014 15:57:17 -0500 |
parents | ec9db3bb6b0b |
children | 1b73a8641b37 |
line wrap: on
line source
/* * Rogue definitions and variable declarations * * @(#)rogue.h 5.2 (Berkeley) 5/10/82 * * Rogue: Exploring the Dungeons of Doom * Copyright (C) 1980, 1981, 1982 Michael Toy, Ken Arnold and Glenn Wichman * All rights reserved. * * See the file LICENSE.TXT for full copyright and licensing information. */ typedef struct { const char *st_name; const int st_value; } STONE; extern const char *rainbow[]; extern const STONE stones[]; extern const char *sylls[]; extern const char *wood[]; extern const char *metal[]; #define NCOLORS 27 #define NSYLLS 159 #define NSTONES 26 #define NWOOD 33 #define NMETAL 22 /* * Maximum number of different things */ #define MAXDAEMONS 20 #define MAXROOMS 9 #define MAXTHINGS 9 #define MAXOBJ 9 #define MAXPACK 23 #define MAXTRAPS 10 #define AMULETLEVEL 26 #define NUMTHINGS 7 /* number of types of things */ #define MAXPASS 13 /* upper limit on number of passages */ /* * return values for get functions */ #define NORM 0 /* normal exit */ #define QUIT 1 /* quit option setting */ #define MINUS 2 /* back up one option */ /* * All the fun defines */ #define shint char /* short integer (for very small #s) */ #define when break;case #define otherwise break;default #define until(expr) while(!(expr)) #define next(ptr) (*ptr).l_next #define prev(ptr) (*ptr).l_prev #define winat(y,x) (moat(y,x) != NULL ? moat(y,x)->t_disguise : chat(y,x)) #define DISTANCE(y1, x1, y2, x2) ((x2 - x1)*(x2 - x1) + (y2 - y1)*(y2 - y1)) #define ce(a,b) ((a).x == (b).x && (a).y == (b).y) #define hero player.t_pos #define pstats player.t_stats #define pack player.t_pack #define proom player.t_room #define max_hp player.t_stats.s_maxhp #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)) #endif #define on(thing,flag) (((thing).t_flags & (flag)) != 0) #undef CTRL #define CTRL(ch) (ch & 037) #define GOLDCALC (rnd(50 + 10 * level) + 2) #define ISRING(h,r) (cur_ring[h] != NULL && cur_ring[h]->o_which == r) #define ISWEARING(r) (ISRING(LEFT, r) || ISRING(RIGHT, r)) #define ISMULT(type) (type==POTION || type==SCROLL || type==FOOD || type==GOLD) #define INDEX(y,x) (((x) << 5) + (y)) #define chat(y,x) (_level[((x) << 5) + (y)]) #define flat(y,x) (_flags[((x) << 5) + (y)]) #define moat(y,x) (_monst[((x) << 5) + (y)]) #define unc(cp) (cp).y, (cp).x #ifdef WIZARD #define debug if (wizard) msg #endif /* * Things that appear on the screens */ #define PASSAGE '#' #define DOOR '+' #define FLOOR '.' #define PLAYER '@' #define TRAP '^' #define STAIRS '%' #define GOLD '*' #define POTION '!' #define SCROLL '?' #define MAGIC '$' #define FOOD ':' #define WEAPON ')' #define ARMOR ']' #define AMULET ',' #define RING '=' #define STICK '/' #define CALLABLE -1 /* * Various constants */ #define PASSWD "mTuZ7WUV9RWkQ" #define BEARTIME spread(3) #define SLEEPTIME spread(5) #define HEALTIME spread(30) #define HOLDTIME spread(2) #define WANDERTIME spread(70) #define BEFORE spread(1) #define AFTER spread(2) #define HUHDURATION spread(20) #define SEEDURATION spread(850) #define HUNGERTIME spread(1300) #define MORETIME 150 #define STOMACHSIZE 2000 #define STARVETIME 850 #define ESCAPE 27 #define LEFT 0 #define RIGHT 1 #define BOLT_LENGTH 6 #define LAMPDIST 3 /* * Save against things */ #define VS_POISON 00 #define VS_PARALYZATION 00 #define VS_DEATH 00 #define VS_BREATH 02 #define VS_MAGIC 03 /* * Various flag bits */ /* flags for rooms */ #define ISDARK 0000001 /* room is dark */ #define ISGONE 0000002 /* room is gone (a corridor) */ /* flags for objects */ #define ISCURSED 000001 /* object is cursed */ #define ISKNOW 0000002 /* player knows details about the object */ #define ISMISL 0000004 /* object is a missile type */ #define ISMANY 0000010 /* object comes in groups */ /* flags for creatures */ #define CANHUH 0000001 /* creature can confuse */ #define CANSEE 0000002 /* creature can see invisible creatures */ #define ISBLIND 0000004 /* creature is blind */ #define ISCANC 0000010 /* creature has special qualities cancelled */ #define ISFOUND 0000020 /* creature has been seen (used for objects) */ #define ISGREED 0000040 /* creature runs to protect gold */ #define ISHASTE 0000100 /* creature has been hastened */ #define ISHELD 0000400 /* creature has been held */ #define ISHUH 0001000 /* creature is confused */ #define ISINVIS 0002000 /* creature is invisible */ #define ISMEAN 0004000 /* creature can wake when player enters room */ #define ISREGEN 0010000 /* creature can regenerate */ #define ISRUN 0020000 /* creature is running at the player */ #define SEEMONST 040000 /* hero can detect unseen monsters */ #define ISSLOW 0100000 /* creature has been slowed */ /* * Flags for level map */ #define F_PASS 0x80 /* is a passageway */ #define F_SEEN 0x40 /* have seen this corridor before */ #define F_DROPPED 0x20 /* object was dropped here */ #define F_LOCKED 0x20 /* door is locked */ #define F_REAL 0x10 /* what you see is what you get */ #define F_PNUM 0x0f /* passage number mask */ #define F_TMASK 0x07 /* trap number mask */ /* * Trap types */ #define T_DOOR 00 #define T_ARROW 01 #define T_SLEEP 02 #define T_BEAR 03 #define T_TELEP 04 #define T_DART 05 #define NTRAPS 6 /* * Potion types */ #define P_CONFUSE 0 #define P_PARALYZE 1 #define P_POISON 2 #define P_STRENGTH 3 #define P_SEEINVIS 4 #define P_HEALING 5 #define P_MFIND 6 #define P_TFIND 7 #define P_RAISE 8 #define P_XHEAL 9 #define P_HASTE 10 #define P_RESTORE 11 #define P_BLIND 12 #define P_NOP 13 #define MAXPOTIONS 14 /* * Scroll types */ #define S_CONFUSE 0 #define S_MAP 1 #define S_HOLD 2 #define S_SLEEP 3 #define S_ARMOR 4 #define S_IDENT 5 #define S_SCARE 6 #define S_GFIND 7 #define S_TELEP 8 #define S_ENCH 9 #define S_CREATE 10 #define S_REMOVE 11 #define S_AGGR 12 #define S_NOP 13 #define S_GENOCIDE 14 #define MAXSCROLLS 15 /* * Weapon types */ #define MACE 0 #define SWORD 1 #define BOW 2 #define ARROW 3 #define DAGGER 4 #define TWOSWORD 5 #define DART 6 #define CROSSBOW 7 #define BOLT 8 #define SPEAR 9 #define FLAME 10 /* fake entry for dragon breath (ick) */ #define MAXWEAPONS 10 /* this should equal FLAME */ /* * Armor types */ #define LEATHER 0 #define RING_MAIL 1 #define STUDDED_LEATHER 2 #define SCALE_MAIL 3 #define CHAIN_MAIL 4 #define SPLINT_MAIL 5 #define BANDED_MAIL 6 #define PLATE_MAIL 7 #define MAXARMORS 8 /* * Ring types */ #define R_PROTECT 0 #define R_ADDSTR 1 #define R_SUSTSTR 2 #define R_SEARCH 3 #define R_SEEINVIS 4 #define R_NOP 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_SUSTARM 13 #define MAXRINGS 14 /* * Rod/Wand/Staff types */ #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_HASTE_M 7 #define WS_SLOW_M 8 #define WS_DRAIN 9 #define WS_NOP 10 #define WS_TELAWAY 11 #define WS_TELTO 12 #define WS_CANCEL 13 #define MAXSTICKS 14 /* * Now we define the structures and types */ /* * Help list */ struct h_list { char h_ch; char *h_desc; }; /* * Coordinate data type */ typedef struct { shint x; shint y; } coord; /* daemon/fuse data type */ struct delayed_action { int d_type; int (*d_func)(); int d_arg; int d_time; }; /**/ typedef unsigned int str_t; /* * Stuff about magic items */ struct magic_item { const char *mi_name; shint mi_prob; short mi_worth; }; /* * Room structure */ struct room { coord r_pos; /* Upper left corner */ coord r_max; /* Size of room */ coord r_gold; /* Where the gold is */ int r_goldval; /* How much the gold is worth */ short r_flags; /* Info about the room */ shint r_nexits; /* Number of exits */ coord r_exit[12]; /* Where the exits are */ }; /* * Structure describing a fighting being */ struct stats { str_t s_str; /* Strength */ long s_exp; /* Experience */ shint s_lvl; /* Level of mastery */ shint s_arm; /* Armor class */ short s_hpt; /* Hit points */ char s_dmg[16]; /* String describing damage done */ shint s_maxhp; /* Max hit points */ }; /* * Structure for monsters and player */ union thing { struct { union thing *_l_next, *_l_prev; /* Next pointer in link */ coord _t_pos; /* Position */ bool _t_turn; /* If slowed, is it a turn to move */ unsigned char _t_type; /* What it is */ char _t_disguise; /* What mimic looks like */ char _t_oldch; /* Character that was where it was */ coord *_t_dest; /* Where it is running to */ short _t_flags; /* State word */ struct stats _t_stats; /* Physical description */ struct room *_t_room; /* Current room for thing */ union thing *_t_pack; /* What the thing is carrying */ int _t_reserved; } _t; struct { union thing *_l_next, *_l_prev; /* Next pointer in link */ shint _o_type; /* What kind of object it is */ coord _o_pos; /* Where it lives on the screen */ char *_o_text; /* What it says if you read it */ char _o_launch; /* What you need to launch it */ char _o_damage[8]; /* Damage if used like sword */ char _o_hurldmg[8]; /* Damage if thrown */ shint _o_count; /* Count for plural objects */ shint _o_which; /* Which object of a type it is */ shint _o_hplus; /* Plusses to hit */ shint _o_dplus; /* Plusses to damage */ short _o_ac; /* Armor class */ short _o_flags; /* Information about objects */ shint _o_group; /* Group number for this object */ } _o; }; typedef union thing THING; #define l_next _t._l_next #define l_prev _t._l_prev #define t_pos _t._t_pos #define t_turn _t._t_turn #define t_type _t._t_type #define t_disguise _t._t_disguise #define t_oldch _t._t_oldch #define t_dest _t._t_dest #define t_flags _t._t_flags #define t_stats _t._t_stats #define t_pack _t._t_pack #define t_room _t._t_room #define t_reserved _t._t_reserved #define o_type _o._o_type #define o_pos _o._o_pos #define o_text _o._o_text #define o_launch _o._o_launch #define o_damage _o._o_damage #define o_hurldmg _o._o_hurldmg #define o_count _o._o_count #define o_which _o._o_which #define o_hplus _o._o_hplus #define o_dplus _o._o_dplus #define o_ac _o._o_ac #define o_charges o_ac #define o_goldval o_ac #define o_flags _o._o_flags #define o_group _o._o_group #define o_reserved _o._o_reserved /* * Array containing information on all the various types of mosnters */ struct monster { const char *m_name; /* What to call the monster */ const shint m_carry; /* Probability of carrying something */ const short m_flags; /* Things about the monster */ struct stats m_stats; /* Initial stats */ }; /* * External variables */ extern struct delayed_action d_list[20]; extern THING *_monst[], *cur_armor, *cur_ring[], *cur_weapon, *lvl_obj, *mlist, player; extern coord delta, oldpos; extern struct h_list helpstr[]; extern struct room *oldrp, passages[], rooms[]; extern struct stats max_stats; extern struct monster monsters[]; extern struct magic_item p_magic[], r_magic[], s_magic[], things[], ws_magic[]; /* * Function types */ coord *find_dest(), *rndmove(); THING *find_mons(), *find_obj(), *get_item(), *new_item(), *new_thing(), *wake_monster(); struct room *roomin(); #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "extern.h" #ifndef PATH_MAX #define PATH_MAX _MAX_PATH #endif