rich@sdcsvax.UUCP (rich) (08/04/86)
#! /bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #! /bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create: # object.c # object.h # oldxio.c # pack.c # play.c # This archive created: Mon Aug 4 11:42:12 1986 # By: rich ( lack of) export PATH; PATH=/bin:/usr/bin:$PATH if test -f 'object.c' then echo shar: "will not over-write existing file 'object.c'" else cat << \SHAR_EOF > 'object.c' #include curses.h #include "object.h" #include "room.h" object level_objects; unsigned short screen[SROWS][SCOLS]; extern short current_level, max_level; extern short party_room; short has_amulet = 0; short foods = 0; fighter rogue = { 0, 0, /* armor, weapon */ 12, 12, /* Hp */ 16, 16, /* Str */ {0}, /* pack */ 0, /* gold */ 1, 0, /* exp, exp_points */ 0, 0, /* row, col */ '@', /* char */ 1200 /* moves */ }; struct identify id_potions[POTIONS] = { {100, "blue \0 ", "of increase strength ",0}, {250, "red \0 ", "of restore strength ",0}, {100, "green \0 ", "of healing ",0}, {200, "grey \0 ", "of extra healing ",0}, {10, "brown \0 ", "of poison ",0}, {300, "clear \0 ", "of raise level ",0}, {10, "pink \0 ", "of blindness ",0}, {25, "white \0 ", "of hallucination ",0}, {100, "purple \0 ", "of detect monster ",0}, {100, "black \0 ", "of detect things ",0}, {10, "yellow \0 ", "of confusion ",0} }; struct identify id_scrolls[SCROLLS] = { {505, " ", "of protect armor ", 0}, {200, " ", "of hold monster ", 0}, {235, " ", "of enchant weapon ", 0}, {235, " ", "of enchant armor ", 0}, {175, " ", "of identify ", 0}, {190, " ", "of teleportation ", 0}, {25, " ", "of sleep ", 0}, {610, " ", "of scare monster ", 0}, {210, " ", "of remove curse ", 0}, {100, " ", "of create monster ",0}, {25, " ", "of aggravate monster ",0} }; struct identify id_weapons[WEAPONS] = { { 15, "arrows ", "", 0}, {100, "battle axe ", "", 0}, {140, "bardiche ", "", 0}, {120, "bec de corbin ", "", 0}, {120, "bill-guisarme ", "", 0}, {200, "long bow ", "", 0}, {150, "short bow ", "", 0}, {160, "fauchard ", "", 0}, { 60, "flail ", "", 0}, {120, "glaive ", "", 0}, {100, "guisarme ", "", 0}, {180, "halberd ", "", 0}, {140, "lucern hammer ", "", 0}, { 40, "hammer ", "", 0}, { 20, "javelin ", "", 0}, {160, "mace ", "", 0}, {100, "morning star ", "", 0}, {200, "partisan ", "", 0}, { 60, "pike ", "", 0}, {100, "ranseur ", "", 0}, {300, "sabre ", "", 0}, {300, "scimitar ", "", 0}, {300, "cutlass ", "", 0}, { 40, "shurikens ", "", 0}, { 30, "spear ", "", 0}, { 60, "spetum ", "", 0}, {500, "bastard sword ", "", 0}, {200, "broad sword ", "", 0}, {300, "long sword ", "", 0}, {200, "short sword ", "", 0}, {600, "two-handed sword ", "", 0}, { 80, "trident ", "", 0}, { 40, "voulge ", "", 0}, { 20, "whip ", "", 0} }; struct identify id_armors[ARMORS] = { {300, "leather armor ", "", (UNIDENTIFIED)}, {300, "ring mail ", "", (UNIDENTIFIED)}, {400, "scale mail ", "", (UNIDENTIFIED)}, {500, "chain mail ", "", (UNIDENTIFIED)}, {600, "banded mail ", "", (UNIDENTIFIED)}, {600, "splint mail ", "", (UNIDENTIFIED)}, {700, "plate mail ", "", (UNIDENTIFIED)} }; struct identify id_wands[WANDS] = { {25, " ", "of teleport away ",0}, {50, " ", "of slow monster ", 0}, {45, " ", "of kill monster ",0}, {8, " ", "of invisibility ",0}, {55, " ", "of polymorph ",0}, {2, " ", "of haste monster ",0}, {25, " ", "of put to sleep ",0}, {0, " ", "of do nothing ",0} }; put_objects() { short row, col, i, n; char *malloc(); object *obj, *get_rand_object(); if (current_level < max_level) return; n = get_rand(2, 4); if (rand_percent(35)) n++; if (rand_percent(50)) { strcpy(id_weapons[SHURIKEN].title, "daggers "); } if (rand_percent(9)) { make_party(); } for (i = 0; i < n; i++) { obj = get_rand_object(); put_object_rand_location(obj); add_to_pack(obj, &level_objects, 0); } put_gold(); } put_gold() { short i, j; short row,col; object *obj; for (i = 0; i < MAXROOMS; i++) { if (rooms[i].is_room && rand_percent(GOLD_PERCENT)) { for (j = 0; j < 25; j++) { row = get_rand(rooms[i].top_row+1, rooms[i].bottom_row-1); col = get_rand(rooms[i].left_col+1, rooms[i].right_col-1); if ((screen[row][col] == FLOOR) || (screen[row][col] == PASSAGE)) { put_gold_at(row, col); break; } } continue; } } } put_gold_at(row, col) { object *obj; object *get_an_object(); obj = get_an_object(); obj->row = row; obj->col = col; obj->what_is = GOLD; obj->quantity = get_rand((2*current_level), (16*current_level)); add_mask(row, col, GOLD); add_to_pack(obj, &level_objects, 0); } put_object_at(obj, row, col) object *obj; { obj->row = row; obj->col = col; add_mask(row, col, obj->what_is); add_to_pack(obj, &level_objects, 0); } object *object_at(pack, row, col) object *pack; { object *obj; obj = pack->next_object; while (obj && (obj->row != row) || (obj->col != col)) { obj = obj->next_object; } return(obj); } object *get_letter_object(ch) { object *obj; obj = rogue.pack.next_object; while (obj && (obj->ichar != ch)) { obj = obj->next_object; } return(obj); } free_stuff(objlist) object *objlist; { object *obj; while (objlist->next_object) { obj = objlist->next_object; objlist->next_object = objlist->next_object->next_object; free(obj); } } char *name_of(obj) object *obj; { char *retstring; switch(obj->what_is) { case SCROLL: retstring = obj->quantity > 1 ? "scrolls " : "scroll "; break; case POTION: retstring = obj->quantity > 1 ? "potions " : "potion "; break; case FOOD: retstring = obj->quantity > 1 ? "rations " : "ration "; break; case WAND: retstring = "wand "; break; case WEAPON: switch(obj->which_kind) { case ARROW: retstring=obj->quantity > 1 ? "arrows " : "arrow "; break; case SHURIKEN: if (id_weapons[SHURIKEN].title[0] == 'd') { retstring=obj->quantity > 1 ? "daggers " : "dagger "; } else { retstring=obj->quantity > 1?"shurikens ":"shuriken "; } break; default: retstring = id_weapons[obj->which_kind].title; } break; default: retstring = "unknown "; break; } return(retstring); } object *get_rand_object() { object *obj, *get_an_object(); obj = get_an_object(); if (foods < (current_level/2)) { obj->what_is = FOOD; } else { obj->what_is = get_rand_what_is(); } obj->identified = 0; switch(obj->what_is) { case SCROLL: get_rand_scroll(obj); break; case POTION: get_rand_potion(obj); break; case WEAPON: get_rand_weapon(obj); break; case ARMOR: get_rand_armor(obj); break; case WAND: get_rand_wand(obj); break; case FOOD: foods++; get_food(obj); break; } return(obj); } get_rand_what_is() { short percent; short what_is; percent = get_rand(1, 92); if (percent <= 25) { what_is = SCROLL; } else if (percent <= 55) { what_is = POTION; } else if (percent <= 61) { what_is = WAND; } else if (percent <= 73) { what_is = WEAPON; } else if (percent <= 83) { what_is = ARMOR; } else { what_is = FOOD; } return(what_is); } get_rand_scroll(obj) object *obj; { short percent; percent = get_rand(0, 82); if (percent <= 5) { obj->which_kind = PROTECT_ARMOR; } else if (percent <= 11) { obj->which_kind = HOLD_MONSTER; } else if (percent <= 20) { obj->which_kind = CREATE_MONSTER; } else if (percent <= 35) { obj->which_kind = IDENTIFY; } else if (percent <= 43) { obj->which_kind = TELEPORT; } else if (percent <= 52) { obj->which_kind = SLEEP; } else if (percent <= 57) { obj->which_kind = SCARE_MONSTER; } else if (percent <= 66) { obj->which_kind = REMOVE_CURSE; } else if (percent <= 71) { obj->which_kind = ENCHANT_ARMOR; } else if (percent <= 76) { obj->which_kind = ENCHANT_WEAPON; } else { obj->which_kind = AGGRAVATE_MONSTER; } } get_rand_potion(obj) object *obj; { short percent; percent = get_rand(1, 105); if (percent <= 5) { obj->which_kind = RAISE_LEVEL; } else if (percent <= 15) { obj->which_kind = DETECT_OBJECTS; } else if (percent <= 25) { obj->which_kind = DETECT_MONSTER; } else if (percent <= 35) { obj->which_kind = INCREASE_STRENGTH; } else if (percent <= 45) { obj->which_kind = RESTORE_STRENGTH; } else if (percent <= 55) { obj->which_kind = HEALING; } else if (percent <= 65) { obj->which_kind = EXTRA_HEALING; } else if (percent <= 75) { obj->which_kind = BLINDNESS; } else if (percent <= 85) { obj->which_kind = HALLUCINATION; } else if (percent <= 95) { obj->which_kind = CONFUSION; } else { obj->which_kind = POISON; } } get_rand_weapon(obj) object *obj; { short percent; short i; short blessing, cursed, increment; short how_bad; obj->which_kind = get_rand(0, (WEAPONS-1)); if ((obj->which_kind == ARROW) || (obj->which_kind == SHURIKEN)) { obj->quantity = get_rand(3, 15); obj->quiver = get_rand(0, 126); } else { obj->quantity = 1; } obj->identified = 0; obj->to_hit_enchantment = obj->damage_enchantment = 0; get_weapon_thd(obj); /* notice, the exciting weapons are ALWAYS cursed or blessed */ switch(obj->which_kind){ case BARDICHE: case RANSEUR: case SABRE: case SCIMITAR: case CUTLASS: case BASTARD_SWORD: case BROAD_SWORD: case LONG_SWORD: case SHORT_SWORD: how_bad=32; break; default: how_bad=96; } percent = get_rand(1, how_bad); blessing = get_rand(1, 3); obj->is_cursed = 0; if (percent <= 16) { increment = 1; } else if (percent <= 32) { increment = -1; obj->is_cursed = 1; } if (percent <= 32) { for (i = 0; i < blessing; i++) { if (rand_percent(50)) { obj->to_hit_enchantment += increment; } else { obj->damage_enchantment += increment; } } } switch(obj->which_kind) { case ARROW: obj->damage = "1d2"; break; case BATTLE_AXE: obj->damage = "1d8"; break; case BARDICHE: obj->damage = "3d5"; break; case BEC_DE_CORBIN: obj->damage = "2d3"; break; case BILL_GUISARME: obj->damage = "2d5"; break; case LONG_BOW: obj->damage = "1d6"; break; case SHORT_BOW: obj->damage = "1d4"; break; case FAUCHARD: obj->damage = "1d8"; break; case FLAIL: obj->damage = "2d3"; break; case GLAIVE: obj->damage = "1d10"; break; case GUISARME: obj->damage = "2d4"; break; case HALBERD: obj->damage = "2d6"; break; case LUCERN_HAMMER: obj->damage = "2d4"; break; case HAMMER: obj->damage = "1d4"; break; case JAVELIN: obj->damage = "1d6"; break; case MACE: obj->damage = "2d3"; break; case MORNING_STAR: obj->damage = "2d4"; break; case PARTISAN: obj->damage = "2d3"; break; case PIKE: obj->damage = "2d4"; break; case RANSEUR: obj->damage = "2d4"; break; case SABRE: obj->damage = "2d4"; break; case SCIMITAR: obj->damage = "1d8"; break; case CUTLASS: obj->damage = "1d10"; break; case SHURIKEN: obj->damage = "2d2"; break; case SPEAR: obj->damage = "2d3"; break; case SPETUM: obj->damage = "2d6"; break; case BASTARD_SWORD: obj->damage = "2d8"; break; case BROAD_SWORD: obj->damage = "3d4"; break; case LONG_SWORD: obj->damage = "4d3"; break; case SHORT_SWORD: obj->damage = "1d6"; break; case TWO_HANDED_SWORD: obj->damage = "3d6"; break; case TRIDENT: obj->damage = "3d4"; break; case VOULGE: obj->damage = "2d4"; break; case WHIP: obj->damage = "1d2"; break; } } get_rand_weapon2(obj) object *obj; { redo: obj->which_kind = get_rand(0, (WEAPONS-1)); obj->quantity = 1; obj->identified = 0; obj->to_hit_enchantment = obj->damage_enchantment = 0; get_weapon_thd(obj); obj->is_cursed = 0; obj->damage_enchantment ++; obj->to_hit_enchantment ++; if (rand_percent(50)) obj->damage_enchantment ++; if (rand_percent(50)) obj->to_hit_enchantment ++; switch(obj->which_kind) { case BATTLE_AXE: obj->damage = "1d8"; break; case BEC_DE_CORBIN: obj->damage = "2d3"; break; case BILL_GUISARME: obj->damage = "2d5"; break; case FAUCHARD: obj->damage = "1d8"; break; case FLAIL: obj->damage = "2d3"; break; case GLAIVE: obj->damage = "1d10"; break; case GUISARME: obj->damage = "2d4"; break; case HALBERD: obj->damage = "2d6"; break; case LUCERN_HAMMER: obj->damage = "2d4"; break; case JAVELIN: obj->damage = "1d6"; break; case MACE: obj->damage = "2d3"; break; case MORNING_STAR: obj->damage = "2d4"; break; case PARTISAN: obj->damage = "2d3"; break; case PIKE: obj->damage = "2d4"; break; case RANSEUR: obj->damage = "2d4"; break; case SABRE: obj->damage = "2d4"; break; case SCIMITAR: obj->damage = "1d8"; break; case CUTLASS: obj->damage = "1d10"; break; case SPEAR: obj->damage = "2d3"; break; case SPETUM: obj->damage = "2d6"; break; case SHORT_SWORD: obj->damage = "1d6"; break; case VOULGE: obj->damage = "2d4"; break; case WHIP: obj->damage = "1d2"; break; default: goto redo; } } get_rand_armor(obj) object *obj; { short percent; short blessing; obj->which_kind = get_rand(0, (ARMORS-1)); obj->class = obj->which_kind + 2; if ((obj->which_kind == PLATE) || (obj->which_kind == SPLINT)) { obj->class--; } obj->is_cursed = 0; obj->is_protected = 0; obj->damage_enchantment = 0; percent = get_rand(1, 100); blessing = get_rand(1, 3); if (percent <= 16) { obj->is_cursed = 1; obj->damage_enchantment -= blessing; } else if (percent <= 33) { obj->damage_enchantment += blessing; } } get_rand_armor2(obj) object *obj; { short percent; short blessing; while ((obj->which_kind = get_rand(0, (ARMORS-1)))==PLATE); obj->class = obj->which_kind + 2; if (obj->which_kind == SPLINT) { obj->class--; } obj->is_cursed = 0; obj->is_protected = 0; obj->damage_enchantment = 0; percent = get_rand(1, 100); blessing = get_rand(1, 3); if (percent <= 66) { obj->damage_enchantment += blessing; } } get_rand_wand(obj) object *obj; { obj->which_kind = get_rand(0, (WANDS-1)); obj->class = get_rand(3, 7); } get_food(obj) object *obj; { obj->which_kind = obj->what_is = FOOD; } put_stairs() { short row, col; get_rand_row_col(&row, &col, (FLOOR | TUNNEL)); screen[row][col] = STAIRS; } get_weapon_thd(obj) object *obj; { switch(obj->which_kind) { case LONG_BOW: break; case SHORT_BOW: break; case ARROW: break; case SHURIKEN: break; case MACE: break; case LONG_SWORD: break; case TWO_HANDED_SWORD: break; } } get_armor_class(obj) object *obj; { if (obj) { return(obj->class + obj->damage_enchantment); } return(0); } object *get_an_object() { object *obj; char *malloc(); if (!(obj = (object *) malloc(sizeof(object)))) { clean_up("Cannot allocate item"); } obj->quantity = 1; obj->ichar = 'L'; obj->picked_up = 0; /* not picked up yet */ return(obj); } make_party() { object *obj; short n; party_room = get_rand_room(); n = fill_room_with_objects(party_room); fill_room_with_monsters(party_room, n); } show_objects() { object *obj; obj = level_objects.next_object; while (obj) { mvaddch(obj->row, obj->col, get_room_char(obj->what_is)); obj = obj->next_object; } } put_amulet() { short row, col; object *obj, *get_an_object(); obj = get_an_object(); obj->what_is = AMULET; put_object_rand_location(obj); add_to_pack(obj, &level_objects, 0); } put_object_rand_location(obj) object *obj; { short row, col; get_rand_row_col(&row, &col, (FLOOR | TUNNEL)); add_mask(row, col, obj->what_is); obj->row = row; obj->col = col; } SHAR_EOF fi if test -f 'object.h' then echo shar: "will not over-write existing file 'object.h'" else cat << \SHAR_EOF > 'object.h' #define BLANK ((unsigned short) 0) #define ARMOR ((unsigned short) 01) #define WEAPON ((unsigned short) 02) #define SCROLL ((unsigned short) 04) #define POTION ((unsigned short) 010) #define GOLD ((unsigned short) 020) #define FOOD ((unsigned short) 040) #define WAND ((unsigned short) 0100) #define STAIRS ((unsigned short) 0200) #define AMULET ((unsigned short) 0400) #define MONSTER ((unsigned short) 01000) #define HORWALL ((unsigned short) 02000) #define VERTWALL ((unsigned short) 04000) #define DOOR ((unsigned short) 010000) #define FLOOR ((unsigned short) 020000) #define TUNNEL ((unsigned short) 040000) #define UNUSED ((unsigned short) 0100000) #define IS_OBJECT ((unsigned short) 0777) /* all object masks or'd together */ #define CAN_PICK_UP ((unsigned short) 0577) #define LEATHER 0 #define RING 1 #define SCALE 2 #define CHAIN 3 #define BANDED 4 #define SPLINT 5 #define PLATE 6 #define ARMORS 7 #define ARROW 0 #define BATTLE_AXE 1 #define BARDICHE 2 #define BEC_DE_CORBIN 3 #define BILL_GUISARME 4 #define LONG_BOW 5 #define SHORT_BOW 6 #define FAUCHARD 7 #define FLAIL 8 #define GLAIVE 9 #define GUISARME 10 #define HALBERD 11 #define LUCERN_HAMMER 12 #define HAMMER 13 #define JAVELIN 14 #define MACE 15 #define MORNING_STAR 16 #define PARTISAN 17 #define PIKE 18 #define RANSEUR 19 #define SABRE 20 #define SCIMITAR 21 #define CUTLASS 22 #define SHURIKEN 23 #define SPEAR 24 #define SPETUM 25 #define BASTARD_SWORD 26 #define BROAD_SWORD 27 #define LONG_SWORD 28 #define SHORT_SWORD 29 #define TWO_HANDED_SWORD 30 #define TRIDENT 31 #define VOULGE 32 #define WHIP 33 #define WEAPONS 34 #define MAX_PACK_COUNT 24 #define PROTECT_ARMOR 0 #define HOLD_MONSTER 1 #define ENCHANT_WEAPON 2 #define ENCHANT_ARMOR 3 #define IDENTIFY 4 #define TELEPORT 5 #define SLEEP 6 #define SCARE_MONSTER 7 #define REMOVE_CURSE 8 #define CREATE_MONSTER 9 #define AGGRAVATE_MONSTER 10 #define SCROLLS 11 #define INCREASE_STRENGTH 0 #define RESTORE_STRENGTH 1 #define HEALING 2 #define EXTRA_HEALING 3 #define POISON 4 #define RAISE_LEVEL 5 #define BLINDNESS 6 #define HALLUCINATION 7 #define DETECT_MONSTER 8 #define DETECT_OBJECTS 9 #define CONFUSION 10 #define POTIONS 11 #define TELEPORT_AWAY 0 #define SLOW_MONSTER 1 #define KILL_MONSTER 2 #define INVISIBILITY 3 #define POLYMORPH 4 #define HASTE_MONSTER 5 #define PUT_TO_SLEEP 6 #define DO_NOTHING 7 #define WANDS 8 #define UNIDENTIFIED ((unsigned char) 0) /* MUST BE ZERO! */ #define IDENTIFIED ((unsigned char) 01) #define CALLED ((unsigned char) 02) #define SROWS 24 #define SCOLS 80 #define MAX_TITLE_LENGTH 30 #define MORE "-more-" #define MAXSYLLABLES 40 #define MAXMETALS 15 #define GOLD_PERCENT 46 #define MAX_EP 10000000 struct identify { short value; char *title; char *real; unsigned char id_status; }; struct object { /* comment is monster meaning */ unsigned short m_flags; /* monster flags */ char *damage; /* damage it does */ short quantity; /* hit points to kill */ char ichar; /* 'A' is for aquatar */ short kill_exp; /* exp for killing it */ char is_protected; /* level starts */ char is_cursed; /* level ends */ char class; /* chance of hitting you */ char identified; /* F%d/Arwarn/Og/If/Mc/Xc */ unsigned char which_kind; /* item carry/drop % */ char row, col; /* current row,col */ char damage_enchantment; /* fly-trap,medusa,etc */ char quiver; /* monster slowed toggle */ char trow, tcol; /* target row, col */ char to_hit_enchantment; unsigned short what_is; char picked_up; struct object *next_object; /* next monster */ }; typedef struct object object; struct fighter { object *armor; object *weapon; short hp_current; short hp_max; char strength_current; char strength_max; object pack; int gold; char exp; int exp_points; short row, col; char fchar; short moves_left; }; typedef struct fighter fighter; struct door { char other_room; char other_row, other_col; }; typedef struct door door; struct room { char bottom_row, right_col, left_col, top_row; char width, height; door doors[4]; char is_room; }; typedef struct room room; extern fighter rogue; extern room rooms[]; unsigned extern short screen[SROWS][SCOLS]; extern object level_objects; extern struct identify id_scrolls[]; extern struct identify id_potions[]; extern struct identify id_wands[]; extern struct identify id_weapons[]; extern struct identify id_armors[]; extern object monster_tab[]; extern object level_monsters; SHAR_EOF fi if test -f 'oldxio.c' then echo shar: "will not over-write existing file 'oldxio.c'" else cat << \SHAR_EOF > 'oldxio.c' #include descrip #include iodef extern short chan; char getchartt() { int status; short iosb[4]; char buf[1]; status = sys$qiow(0,chan,IO$_READLBLK | IO$M_NOECHO | IO$M_INTERRUPT, iosb,0,0,buf,1,32767,0,0,0,0); if (status != 1) LIB$STOP(status); if (iosb[0] != 1) LIB$STOP(iosb[0]); if (buf[0] == '\r') buf[0] = '\n'; /* emulate UNIX */ return(buf[0]); } /* * returns a channel */ ttopen() { register int status; struct dsc$descriptor dev_name; dev_name.dsc$w_length = 4; dev_name.dsc$a_pointer = "TT:"; dev_name.dsc$b_class = DSC$K_CLASS_S; dev_name.dsc$b_dtype = DSC$K_DTYPE_T; status = sys$assign(&dev_name,&chan,0,0,0); if (status != 1) LIB$STOP(status); return; } spawn_command(command) char *command; { #include jpidef #include descrip #include ssdef struct dsc$descriptor descr_command; /* * make the character strings */ char the_command[40]; if((!strcmp("sh",command)) || command[0]=='!' || command[0]=='\0'){ printf("suspending rogue, type 'logout' to return\n"); lib$spawn(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); return; } sprintf(the_command,"%s",command); /* * Give descriptors the number of printable ascii * characters */ descr_command.dsc$w_length=strlen(the_command); /* * Give descriptors the addresses of the strings */ descr_command.dsc$a_pointer=the_command; /* * Define the string descriptor class */ descr_command.dsc$b_class=DSC$K_CLASS_S; /* * Explain that it is an ascii string. */ descr_command.dsc$b_dtype=DSC$K_DTYPE_T; lib$spawn(&descr_command, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); } /* * this is here because vms curses sucks. * the curser was following hidden monsters about. */ #include curses refresh_vms(){ static int old_x,old_y; static int odd=0; getyx(stdscr,old_y,old_x); move(LINES -2,COLS-1); if(odd==0){ odd=1; addch(' '); }else{ odd=0; addch('.'); } refresh(); move(old_y,old_x); } SHAR_EOF fi if test -f 'pack.c' then echo shar: "will not over-write existing file 'pack.c'" else cat << \SHAR_EOF > 'pack.c' #include curses.h #include "move.h" #include "object.h" char *CURSE_MESSAGE = "you can't, it appears to be cursed"; char ichars[26]; extern short has_amulet; object *add_to_pack(obj, pack, condense) object *obj, *pack; { object *op, *check_duplicate(); if (condense) { if (op = check_duplicate(obj, pack)) { free(obj); return(op); } else { obj->ichar = next_avail_ichar(); } } if (pack->next_object == 0) { pack->next_object = obj; } else { op = pack->next_object; while (op->next_object) { op = op->next_object; } op->next_object = obj; } obj->next_object = 0; return(obj); } remove_from_pack(obj, pack) object *obj, *pack; { while (pack->next_object != obj) { pack = pack->next_object; } pack->next_object = pack->next_object->next_object; } object *pick_up(row, col, status) short *status; { object *obj, *object_at(), *add_to_pack(); obj = object_at(&level_objects, row, col); *status = 1; if ((obj->what_is == SCROLL) && (obj->which_kind == SCARE_MONSTER) && (obj->picked_up > 0)) { message("the scroll turns to dust as you pick it up", 1); remove_from_pack(obj, &level_objects); remove_mask(row, col, SCROLL); free(obj); *status = 0; if (id_scrolls[SCARE_MONSTER].id_status == UNIDENTIFIED) { id_scrolls[SCARE_MONSTER].id_status = IDENTIFIED; } return(0); } if (obj->what_is == GOLD) { rogue.gold += obj->quantity; remove_mask(row, col, GOLD); remove_from_pack(obj, &level_objects); print_stats(); return(obj); /* obj will be free()ed in single_move() */ } if (get_pack_count(obj) >= MAX_PACK_COUNT) { message("Pack too full", 1); return(0); } if (obj->what_is == AMULET) { has_amulet = 1; } remove_mask(row, col, obj->what_is); remove_from_pack(obj, &level_objects); obj = add_to_pack(obj, &rogue.pack, 1); obj->picked_up++; return(obj); } drop() { object *obj, *new; object *get_letter_object(); short ch; object *get_an_object(); char description[SCOLS]; if (screen[rogue.row][rogue.col] & IS_OBJECT) { message("There's already something there", 0); return; } if (!rogue.pack.next_object) { message("You have nothing to drop", 0); return; } ch = get_pack_letter("drop what? ", IS_OBJECT); if (ch == CANCEL) { return; } if (!(obj = get_letter_object(ch))) { message("No such item.", 0); return; } if (obj == rogue.weapon) { if (obj->is_cursed) { message(CURSE_MESSAGE, 0); return; } rogue.weapon = 0; } else if (obj == rogue.armor) { if (obj->is_cursed) { message(CURSE_MESSAGE, 0); return; } rogue.armor = 0; print_stats(); } obj->row = rogue.row; obj->col = rogue.col; if ((obj->quantity > 1) && (obj->what_is != WEAPON)) { obj->quantity--; new = get_an_object(); *new = *obj; new->quantity = 1; obj = new; goto ADD; } if (obj->what_is == AMULET) { has_amulet = 0; } make_avail_ichar(obj->ichar); remove_from_pack(obj, &rogue.pack); ADD: add_to_pack(obj, &level_objects, 0); add_mask(rogue.row, rogue.col, obj->what_is); strcpy(description, "dropped "); get_description(obj, description+8); message(description, 0); register_move(); } object *check_duplicate(obj, pack) object *obj, *pack; { object *op; if (!(obj->what_is & (WEAPON | FOOD | SCROLL | POTION))) { return(0); } op = pack->next_object; while (op) { if ((op->what_is == obj->what_is) && (op->which_kind == obj->which_kind)) { if ((obj->what_is != WEAPON) || ((obj->what_is == WEAPON) && ((obj->which_kind == ARROW) || (obj->which_kind == SHURIKEN)) && (obj->quiver == op->quiver))) { op->quantity += obj->quantity; return(op); } } op = op->next_object; } return(0); } next_avail_ichar() { short i; for (i = 'a'; i < 'z'; i++) { if (!ichars[i-'a']) { ichars[i-'a'] = 1; return(i); } } return(0); } make_avail_ichar(ch) { ichars[ch - 'a'] = 0; } wait_for_ack(prompt) { char getchartt(); if (prompt) { printf("%s ", MORE); fflush(stdout); } while (getchartt() != ' ') ; } get_pack_letter(prompt, mask) char *prompt; unsigned short mask; { char getchartt(); short first_miss = 1; short ch; message(prompt, 0); while (!is_pack_letter(ch = getchartt())) { putchar(7); fflush(stdout); if (first_miss) { WHICH: message(prompt, 0); first_miss = 0; } } if (ch == LIST) { check_message(); inventory(&rogue.pack, mask); goto WHICH; } check_message(); return(ch); } take_off() { char description[SCOLS]; object *obj; if (rogue.armor) { if (rogue.armor->is_cursed) { message(CURSE_MESSAGE, 0); } else { mv_aquatars(); obj = rogue.armor; rogue.armor = 0; strcpy(description, "was wearing "); get_description(obj, description+12); message(description, 0); print_stats(); register_move(); } } else { message("not wearing any", 0); } } wear() { short ch; register object *obj; char description[SCOLS]; object *get_letter_object(); if (rogue.armor) { message("you are already wearing some", 0); return; } ch = get_pack_letter("wear what? ", ARMOR); if (ch == CANCEL) { return; } if (!(obj = get_letter_object(ch))) { message("No such item.", 0); return; } if (obj->what_is != ARMOR) { message("You can't wear that", 0); return; } rogue.armor = obj; obj->identified = 1; get_description(obj, description); message(description, 0); print_stats(); register_move(); } wield() { short ch; register object *obj; char description[SCOLS]; object *get_letter_object(); if (rogue.weapon && rogue.weapon->is_cursed) { message(CURSE_MESSAGE, 0); return; } ch = get_pack_letter("wield what? ", WEAPON); if (ch == CANCEL) { return; } if (!(obj = get_letter_object(ch))) { message("No such item.", 0); return; } if (obj->what_is != WEAPON) { message("You can't wield that", 0); return; } if (obj == rogue.weapon) { message("in use", 0); } else { rogue.weapon = obj; get_description(obj, description); message(description, 0); register_move(); } } call_it() { short ch; register object *obj; struct identify *id_table, *get_id_table(); char buf[MAX_TITLE_LENGTH+2]; object *get_letter_object(); ch = get_pack_letter("call what? ", (SCROLL | POTION | WAND)); if (ch == CANCEL) { return; } if (!(obj = get_letter_object(ch))) { message("No such item.", 0); return; } if (!(obj->what_is & (SCROLL | POTION | WAND))) { message("surely you already know what that's called", 0); return; } id_table = get_id_table(obj); if (get_input_line(buf, id_table[obj->which_kind].title)) { id_table[obj->which_kind].id_status = CALLED; strcpy(id_table[obj->which_kind].title, buf); } } get_pack_count(new_obj) object *new_obj; { object *obj; short count = 0; if (!(obj = rogue.pack.next_object)) { return(0); } while (obj) { if (obj->what_is != WEAPON) { count += obj->quantity; } else { if ((new_obj->what_is != WEAPON) || ((obj->which_kind != ARROW) && (obj->which_kind != SHURIKEN)) || (new_obj->which_kind != obj->which_kind) || (obj->quiver != new_obj->quiver)) { count++; } } obj = obj->next_object; } return(count); } SHAR_EOF fi if test -f 'play.c' then echo shar: "will not over-write existing file 'play.c'" else cat << \SHAR_EOF > 'play.c' #include curses.h #include setjmp #include "object.h" #include "move.h" short interrupted = 0; extern short party_room, detect_monster; extern char hit_message[]; int val; play_level() { short ch; char getchartt(); int count = 0; char com_string[80]; char mess[24][82]; int a,b; WINDOW *tempwin; int quit(); for (;;) { interrupted = 0; if (hit_message[0]) { message(hit_message); hit_message[0] = 0; } move(rogue.row, rogue.col); refresh_vms(); ch = getchartt(); check_message(); count = 0; CH: switch(ch) { case '\003': quit(); break; case '.': rest((count > 0) ? count : 1); break; case 'i': inventory(&rogue.pack, IS_OBJECT); break; /*case 'p': inventory(&level_objects, IS_OBJECT); break;*/ case 'f': fight(0); break; case 'F': fight(1); break; case 'h': case 'j': case 'k': case 'l': case 'y': case 'u': case 'n': case 'b': single_move_rogue(ch, 1); break; case 'H': case 'J': case 'K': case 'L': case 'B': case 'Y': case 'U': case 'N': case '\b': /* ^H */ case '\012': /* ^J */ case '\013': /* ^K */ case '\f': /* ^L (form feed) */ case '\031': case '\025': case '\016': case '\002': multiple_move_rogue(ch); break; case 'e': eat(); break; case 'q': quaff(); break; case 'r': read_scroll(); break; case 'm': move_onto(); break; case 'd': drop(); break; case '\020': remessage(); break; case '>': if (check_down()) { return; } break; case '<': if (check_up()) { return; } break; case 'I': single_inventory(); break; case 'R': /* again vms curses refuses to redraw the nice way */ tempwin=newwin(LINES,COLS,0,0); overlay(stdscr,tempwin); refresh(); clear(); overlay(tempwin,stdscr); delwin(tempwin); refresh(); break; case 'T': take_off(); break; case 'W': case 'P': wear(); break; case 'w': wield(); break; case 'c': call_it(); break; case 'z': zapp(); break; case 't': throw(); break; case '\032': /* ^Z */ tempwin=newwin(LINES,COLS,0,0); overlay(stdscr,tempwin); move(1,1); refresh(); com_string[0]='\0'; spawn_command(com_string); clear(); overlay(tempwin,stdscr); delwin(tempwin); refresh(); break; /* tstp(); */ case '!': tempwin=newwin(LINES,COLS,0,0); overlay(stdscr,tempwin); move(1,1); refresh(); spawn_command(gets(com_string)); clear(); overlay(tempwin,stdscr); delwin(tempwin); refresh(); break; case 'v': message("ve_rogue: VMS extended rogue , 1.0. ",0); break; case 'Q': quit(); break; case '/': message("Identify what: ",1); identify_monst(getchartt()); break; case '?': message("Help on what character: ",1); help(getchartt()); break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': count = 0; do { count = (10 * count) + (ch - '0'); ch = getchartt(); } while ((ch >= '0') && (ch <= '9')); goto CH; break; case ' ': break; default: message("unknown command"); break; } } } SHAR_EOF fi exit 0 # End of shell archive -- ihnp4--\ decvax--\ akgua----\ dcdwest---\ somewhere--\ ucbvax-------- sdcsvax -- rich