Mercurial > hg > early-roguelike
diff rogue5/rogue.h @ 33:f502bf60e6e4
Import Rogue 5.4 from the Roguelike Restoration Project (r1490)
author | elwin |
---|---|
date | Mon, 24 May 2010 20:10:59 +0000 |
parents | |
children | 655c317b6237 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rogue5/rogue.h Mon May 24 20:10:59 2010 +0000 @@ -0,0 +1,778 @@ +/* + * Rogue definitions and variable declarations + * + * @(#)rogue.h 5.42 (Berkeley) 08/06/83 + * + * Rogue: Exploring the Dungeons of Doom + * Copyright (C) 1980-1983, 1985, 1999 Michael Toy, Ken Arnold and Glenn Wichman + * All rights reserved. + * + * See the file LICENSE.TXT for full copyright and licensing information. + */ + +#include "extern.h" + +#undef lines + +#define NOOP(x) (x += 0) +#define CCHAR(x) ( (x) & A_CHARTEXT ) + +#define MAXDAEMONS 20 +#define EMPTY 0 + +/* + * Maximum number of different things + */ +#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 */ +#define NUMLINES 24 +#define NUMCOLS 80 +#define STATLINE (NUMLINES - 1) +#define BORE_LEVEL 50 + +/* + * return values for get functions + */ +#define NORM 0 /* normal exit */ +#define QUIT 1 /* quit option setting */ +#define MINUS 2 /* back up one option */ + +/* + * inventory types + */ +#define INV_OVER 0 +#define INV_SLOW 1 +#define INV_CLEAR 2 + +/* + * All the fun defines + */ +#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 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) +#undef max +#define max(a,b) ((a) > (b) ? (a) : (b)) +#define on(thing,flag) ((((thing).t_flags & (flag)) != 0)) +#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) +#define INDEX(y,x) (&places[((x) << 5) + (y)]) +#define chat(y,x) (places[((x) << 5) + (y)].p_ch) +#define flat(y,x) (places[((x) << 5) + (y)].p_flags) +#define moat(y,x) (places[((x) << 5) + (y)].p_monst) +#define unc(cp) (cp).y, (cp).x +#ifdef MASTER +#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 +#define R_OR_S -2 + +/* + * Various constants + */ +#define BEARTIME spread(3) +#define SLEEPTIME spread(5) +#define HOLDTIME spread(2) +#define WANDERTIME spread(70) +#define BEFORE spread(1) +#define AFTER spread(2) +#define HEALTIME 30 +#define HUHDURATION 20 +#define SEEDURATION 850 +#define HUNGERTIME 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 +#ifdef MASTER +#ifndef PASSWD +#define PASSWD "mTBellIQOsLNA" +#endif +#endif + +/* + * 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) */ +#define ISMAZE 0000004 /* 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 */ +/* ISFOUND 0000020 ...is used for both objects and creatures */ +#define ISPROT 0000040 /* armor is permanently protected */ + +/* 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 ISLEVIT 0000010 /* hero is levitating */ +#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 ISTARGET 000200 /* creature is the target of an 'f' command */ +#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 ISHALU 0004000 /* hero is on acid trip */ +#define ISREGEN 0010000 /* creature can regenerate */ +#define ISRUN 0020000 /* creature is running at the player */ +#define SEEMONST 040000 /* hero can detect unseen monsters */ +#define ISFLY 0040000 /* creature can fly */ +#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 spot 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 T_RUST 06 +#define T_MYST 07 +#define NTRAPS 8 + +/* + * Potion types + */ +#define P_CONFUSE 0 +#define P_LSD 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_LEVIT 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_ID_POTION 5 +#define S_ID_SCROLL 6 +#define S_ID_WEAPON 7 +#define S_ID_ARMOR 8 +#define S_ID_R_OR_S 9 +#define S_SCARE 10 +#define S_FDET 11 +#define S_TELEP 12 +#define S_ENCH 13 +#define S_CREATE 14 +#define S_REMOVE 15 +#define S_AGGR 16 +#define S_PROTECT 17 +#define MAXSCROLLS 18 + +/* + * Weapon types + */ +#define MACE 0 +#define SWORD 1 +#define BOW 2 +#define ARROW 3 +#define DAGGER 4 +#define TWOSWORD 5 +#define DART 6 +#define SHIRAKEN 7 +#define SPEAR 8 +#define FLAME 9 /* fake entry for dragon breath (ick) */ +#define MAXWEAPONS 9 /* 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_INVIS 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 { + int h_ch; + const char *h_desc; + int h_print; +}; + +/* + * Coordinate data type + */ +typedef struct coord { + int x; + int y; +} coord; + +/* + * Stuff about objects + */ +struct obj_info { + const char *oi_name; + int oi_prob; + int oi_worth; + char *oi_guess; + int oi_know; +}; + +/* + * 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 */ + int r_flags; /* info about the room */ + int r_nexits; /* Number of exits */ + coord r_exit[12]; /* Where the exits are */ +}; + +/* + * Structure describing a fighting being + */ +struct stats { + int s_str; /* Strength */ + int s_exp; /* Experience */ + int s_lvl; /* level of mastery */ + int s_arm; /* Armor class */ + int s_hpt; /* Hit points */ + char s_dmg[13]; /* String describing damage done */ + int 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 */ + int _t_turn; /* If slowed, is it a turn to move */ + int _t_type; /* What it is */ + int _t_disguise; /* What mimic looks like */ + int _t_oldch; /* Character that was where it was */ + const coord *_t_dest; /* Where it is running to */ + int _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 */ + int _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 */ + int _o_launch; /* What you need to launch it */ + int _o_packch; /* What character it is in the pack */ + char _o_damage[8]; /* Damage if used like sword */ + char _o_hurldmg[8]; /* Damage if thrown */ + 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_arm; /* Armor protection */ + int _o_flags; /* information about objects */ + int _o_group; /* group number for this object */ + char *_o_label; /* Label for 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_packch _o._o_packch +#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_arm _o._o_arm +#define o_charges o_arm +#define o_goldval o_arm +#define o_flags _o._o_flags +#define o_group _o._o_group +#define o_label _o._o_label + +/* + * describe a place on the level map + */ +typedef struct PLACE { + int p_ch; + int p_flags; + THING *p_monst; +} PLACE; + +/* + * Array containing information on all the various types of monsters + */ +struct monster { + const char *m_name; /* What to call the monster */ + int m_carry; /* Probability of carrying something */ + int m_flags; /* things about the monster */ + struct stats m_stats; /* Initial stats */ +}; + +struct delayed_action { + int d_type; + void (*d_func)(); + int d_arg; + int d_time; +}; + +struct STONE { + char *st_name; + int st_value; +}; + +typedef struct STONE STONE; + +/* + * External variables + */ + +extern int after, again, allscore, door_stop, fight_flush, + firstmove, has_hit, inv_describe, jump, kamikaze, + lower_msg, move_on, msg_esc, pack_used[], + passgo, playing, q_comm, running, save_msg, see_floor, + seenstairs, stat_msg, terse, to_death, tombstone, + amulet, count, dir_ch, food_left, hungry_state, inpack, + inv_type, lastscore, level, max_hit, max_level, mpos, take, + n_objs, no_command, no_food, no_move, noscore, ntraps, purse, + quiet, vf_hit, runch, last_comm, l_last_comm, last_dir, l_last_dir, + numscores, total, between, group, cNWOOD, cNMETAL, cNSTONES, + cNCOLORS; + +extern char file_name[], home[], huh[], *Numname, outbuf[], + *ws_type[], *s_names[]; + +extern const char *ws_made[], *inv_t_name[], *p_colors[], *r_stones[], + *release, *tr_name[], *rainbow[], *wood[], *metal[], + encstr[], statlist[], version[]; + +extern const int a_class[], e_levels[]; + +extern unsigned int dnum, seed; + +extern WINDOW *hw; + +extern coord delta, oldpos, stairs; + +extern PLACE places[]; + +extern THING *cur_armor, *cur_ring[], *cur_weapon, *l_last_pick, + *last_pick, *lvl_obj, *mlist, player; + +extern const struct h_list helpstr[]; + +extern struct room *oldrp, passages[], rooms[]; + +extern struct stats max_stats; + +extern struct monster monsters[]; + +extern struct obj_info arm_info[], pot_info[], ring_info[], + scr_info[], things[], ws_info[], weap_info[]; + +extern struct delayed_action d_list[MAXDAEMONS]; + +extern const STONE stones[]; + +/* + * Function types + */ + +void _attach(THING **list, THING *item); +void _detach(THING **list, THING *item); +void _free_list(THING **ptr); +void addmsg(const char *fmt, ...); +int add_haste(int potion); +int add_line(const char *fmt, const char *arg); +void add_pack(THING *obj, int silent); +void add_pass(void); +void add_str(int *sp, int amt); +void accnt_maze(int y, int x, int ny, int nx); +void aggravate(void); +int attack(THING *mp); +void auto_save(int); +void badcheck(const char *name, const struct obj_info *info, int bound); +int be_trapped(const coord *tc); +void bounce(const THING *weap, const char *mname, int noend); +void call(void); +void call_it(struct obj_info *info); +int cansee(int y, int x); +int center(const char *str); +int chase(THING *tp, const coord *ee); +int checkout(void); +const char *charge_str(const THING *obj); +void chg_str(int amt); +void check_level(void); +const char *choose_str(const char *ts, const char *ns); +void conn(int r1, int r2); +void come_down(void); +void command(void); +void create_obj(void); +void current(const THING *cur, const char *how, const char *where); +void d_level(void); +void death(int monst); +int death_monst(void); +int diag_ok(const coord *sp, const coord *ep); +void dig(int y, int x); +void discard(THING *item); +void discovered(void); +int dist(int y1, int x1, int y2, int x2); +int dist_cp(const coord *c1, const coord *c2); +int do_chase(THING *th); +void do_daemons(int flag); +void do_fuses(int flag); +void do_maze(const struct room *rp); +void do_motion(THING *obj, int ydelta, int xdelta); +void do_move(int dy, int dx); +void do_passages(void); +void do_pot(int type, int knowit); +void do_rooms(void); +void do_run(int ch); +void do_zap(void); +void doadd(const char *fmt, va_list args); +void doctor(void); +void door(struct room *rm, const coord *cp); +void door_open(const struct room *rp); +void drain(void); +void draw_room(const struct room *rp); +void drop(void); +int dropcheck(const THING *obj); +void eat(void); +int encclearerr(); +int encerror(); +void encseterr(); +size_t encread(char *start, size_t size, FILE *inf); +size_t encwrite(const char *start, size_t size, FILE *outf); +void end_line(void); +void endit(int sig); +int endmsg(void); +void enter_room(const coord *cp); +void erase_lamp(const coord *pos, const struct room *rp); +int exp_add(const THING *tp); +void extinguish(void (*func)()); +void fall(THING *obj, int pr); +int fallpos(const coord *pos, coord *newpos); +void fatal(const char *s); +void fire_bolt(const coord *start, coord *dir, const char *name); +int floor_at(void); +int floor_ch(void); +void flush_type(void); +const coord *find_dest(const THING *tp); +int find_floor(const struct room *rp, coord *cp, int limit, int monst); +THING *find_obj(int y, int x); +int fight(const coord *mp, const THING *weap, int thrown); +void fix_stick(THING *cur); +void fuse(void (*func)(), int arg, int time, int type); +int get_bool(void *vp, WINDOW *win); +int get_dir(void); +int get_inv_t(void *vp, WINDOW *win); +THING *get_item(const char *purpose, int type); +int get_num(void *vp, WINDOW *win); +int get_sf(void *vp, WINDOW *win); +int get_str(void *vopt, WINDOW *win); +int gethand(void); +void getltchars(void); +void give_pack(THING *tp); +void help(void); +void hit(const char *er, const char *ee, int noend); +void horiz(const struct room *rp, int starty); +void leave_room(const coord *cp); +void lengthen(void (*func)(), int xtime); +void look(int wakeup); +int hit_monster(int y, int x, const THING *obj); +void identify(void); +void illcom(int ch); +void init_check(void); +void init_colors(void); +void init_materials(void); +void init_names(void); +void init_player(void); +void init_probs(void); +void init_stones(void); +void init_weapon(THING *weap, int which); +char *inv_name(const THING *obj, int drop); +int inventory(const THING *list, int type); +void invis_on(void); +int is_current(const THING *obj); +int is_magic(const THING *obj); +int is_symlink(const char *sp); +void kill_daemon(void (*func)()); +void killed(THING *tp, int pr); +const char *killname(int monst, int doart); +void land(void); +void leave(int); +THING *leave_pack(THING *obj, int newobj, int all); +int levit_check(void); +int lock_sc(void); +void miss(const char *er, const char *ee, int noend); +void missile(int ydelta, int xdelta); +void money(int value); +int move_monst(THING *tp); +void move_msg(const THING *obj); +int msg(const char *fmt, ...); +void my_exit(int sig); +void nameit(const THING *obj, const char *type, const char *which, const struct obj_info *op, const char *(*prfunc)(const THING *)); +THING *new_item(void); +void new_level(void); +void new_monster(THING *tp, int type, const coord *cp); +THING *new_thing(void); +void nohaste(void);