void picky_inven() { THING *obj; char mch; if (pack == NULL) msg("you aren't carrying anything"); else if (next(pack) == NULL) msg("a) %s", inv_name(pack, FALSE)); else { msg(terse ? "item: " : "which item do you wish to inventory: "); mpos = 0; if ((mch = readchar()) == ESCAPE) { msg(""); return; } for (obj = pack; obj != NULL; obj = next(obj)) if (mch == obj->o_packch) { msg("%c) %s", mch, inv_name(obj, FALSE)); return; } msg("'%s' not in pack", unctrl(mch)); } }
/* * picky_inven: * Allow player to inventory a single item */ int picky_inven() { struct linked_list *item; char ch, mch; if (pack == NULL) msg("You aren't carrying anything."); else if (next(pack) == NULL) msg("a) %s", inv_name(OBJPTR(pack), FALSE)); else { msg("Item: "); mpos = 0; if ((mch = readchar()) == ESCAPE) { msg(""); return 0; } for (ch='a',item=pack; item != NULL; item=next(item),ch=npch(ch)) if (ch == mch) { msg("%c) %s",ch,inv_name(OBJPTR(item), FALSE)); return 0; } if (ch == 'A') ch = 'z'; else ch -= 1; msg("Range is 'a' to '%c'", ch); } return 0; }
/* * picky_inven: * Allow player to inventory a single item */ void picky_inven() { struct linked_list *item; int ch, mch; if (pack == NULL) msg("You aren't carrying anything"); else if (next(pack) == NULL) msg("a) %s", inv_name((struct object *) ldata(pack), FALSE)); else { msg(terse ? "Item: " : "Which item do you wish to inventory: "); mpos = 0; if ((mch = readchar(cw)) == ESCAPE) { msg(""); return; } for (ch = 'a', item = pack; item != NULL; item = next(item), ch++) if (ch == mch) { msg("%c) %s",ch,inv_name((struct object *) ldata(item), FALSE)); return; } if (!terse) msg("'%s' not in pack", unctrl(mch)); msg("Range is 'a' to '%c'", --ch); } }
/* * inventory: * Show what items are in a specific list */ bool inventory(struct linked_list *list,int type) { struct linked_list *pc; struct object *obj; char ch; int cnt; if (list == NULL) { /* empty list */ msg(type == 0 ? "Empty handed." : "Nothing appropriate."); return FALSE; } else if (next(list) == NULL) { /* only 1 item in list */ obj = OBJPTR(list); msg("a) %s", inv_name(obj, FALSE)); return TRUE; } cnt = 0; wclear(hw); for (ch = 'a', pc = list; pc != NULL; pc = next(pc), ch = npch(ch)) { obj = OBJPTR(pc); wprintw(hw,"%c) %s\n\r",ch,inv_name(obj, FALSE)); if (++cnt > LINES - 2 && next(pc) != NULL) { dbotline(hw, morestr); cnt = 0; wclear(hw); } } dbotline(hw,spacemsg); restscr(cw); return TRUE; }
void show_floor(void) { struct linked_list *item; struct object *obj; item = find_obj(hero.y, hero.x); if (item != NULL) { addmsg("%s onto ", terse ? "Moved" : "You moved"); obj = OBJPTR(item); if (obj->next_obj != NULL) msg("a stack of things."); else if (obj->o_type == GOLD) msg("%d gold pieces.", obj->o_count); else { addmsg(inv_name(obj, TRUE)); addmsg("."); endmsg(); } } }
void wield(void) { THING *obj, *oweapon; char *sp; oweapon = cur_weapon; if (!dropcheck(cur_weapon)) { cur_weapon = oweapon; return; } cur_weapon = oweapon; if ((obj = get_item("wield", WEAPON)) == NULL) { bad: after = FALSE; return; } if (obj->o_type == ARMOR) { msg("you can't wield armor"); goto bad; } if (is_current(obj)) goto bad; sp = inv_name(obj, TRUE); cur_weapon = obj; if (!terse) addmsg("you are now "); msg("wielding %s (%c)", sp, obj->o_packch); }
void fall(struct linked_list *item, int pr) { struct object *obj; struct room *rp; static coord fpos; obj = (struct object *) ldata(item); if (fallpos(&obj->o_pos, &fpos, TRUE)) { mvaddrawch(fpos.y, fpos.x, obj->o_type); obj->o_pos = fpos; if ((rp = roomin(&hero)) != NULL && !(rp->r_flags & ISDARK)) { light(&hero); mvwaddrawch(cw, hero.y, hero.x, PLAYER); } attach(lvl_obj, item); return; } if (pr) if (obj->o_type == WEAPON) /* BUGFUX: Identification trick */ msg("Your %s vanishes as it hits the ground.", w_names[obj->o_which]); else msg("%s vanishes as it hits the ground.", inv_name(obj,TRUE)); discard(item); }
/* * wield: * Pull out a certain weapon */ void wield(void) { register struct linked_list *item ; register struct object *obj, *oweapon ; oweapon = cur_weapon ; if (!dropcheck(cur_weapon)) { cur_weapon = oweapon ; return ; } cur_weapon = oweapon ; if ((item = get_item("wield", WEAPON)) == NULL) { after = FALSE ; return ; } obj = (struct object *) ldata(item) ; if (obj->o_type != WEAPON) { msg ("You can't wield that!"); return; } if (is_current(obj)) { after = FALSE ; return ; } if (terse) { addmsg("W") ; } else { addmsg("You are now w") ; } msg("ielding %s.", inv_name(obj, TRUE)) ; cur_weapon = obj ; }
void move_msg(THING *obj) { if (!terse) addmsg("you "); msg("moved onto %s", inv_name(obj, TRUE)); }
void pack_report(object *obj, int print_message, char *message) { /* Notify the user */ if (print_message) { if (!terse) addmsg(message); msg("(%c%c) %s.", obj->o_type, print_letters[get_ident(obj)], inv_name(obj, !terse)); } if (obj->o_type == ARTIFACT) { has_artifact |= (1 << obj->o_which); picked_artifact |= (1 << obj->o_which); if (!(obj->ar_flags & ISUSED)) { obj->ar_flags |= ISUSED; pstats.s_exp += arts[obj->o_which].ar_worth / 10; check_level(); } } updpack(); return; }
/* * wear: * The player wants to wear something, so let him/her put it on. */ void wear() { register THING *obj; register char *sp; if ((obj = get_item("wear", ARMOR)) == NULL) return; if (cur_armor != NULL) { addmsg("you are already wearing some"); if (!terse) addmsg(". You'll have to take it off first"); endmsg(); after = FALSE; return; } if (obj->o_type != ARMOR) { msg("you can't wear that"); return; } waste_time(); obj->o_flags |= ISKNOW; sp = inv_name(obj, TRUE); cur_armor = obj; if (!terse) addmsg("you are now "); msg("wearing %s", sp); }
void ring_off() { int ring; THING *obj; if (cur_ring[LEFT] == NULL && cur_ring[RIGHT] == NULL) { if (terse) msg("no rings"); else msg("you aren't wearing any rings"); return; } else if (cur_ring[LEFT] == NULL) ring = RIGHT; else if (cur_ring[RIGHT] == NULL) ring = LEFT; else if ((ring = gethand()) < 0) return; mpos = 0; obj = cur_ring[ring]; if (obj == NULL) { msg("not wearing such a ring"); return; } if (dropcheck(obj)) msg("was wearing %s(%c)", inv_name(obj, TRUE), obj->o_packch); }
void ring_off(void) { struct object *obj; struct linked_list *item; if (cur_ring[LEFT_1] == NULL && cur_ring[LEFT_2] == NULL && cur_ring[LEFT_3] == NULL && cur_ring[LEFT_4] == NULL && cur_ring[LEFT_5] == NULL && cur_ring[RIGHT_1] == NULL && cur_ring[RIGHT_2] == NULL && cur_ring[RIGHT_3] == NULL && cur_ring[RIGHT_4] == NULL && cur_ring[RIGHT_5] == NULL) { msg("You aren't wearing any rings."); return; } else if ((item = get_item("remove", RING)) == NULL) return; mpos = 0; obj = OBJPTR(item); if ((obj = OBJPTR(item)) == NULL) msg("You are not wearing that!"); if (dropcheck(obj)) { switch (obj->o_which) { case R_SEEINVIS: msg("Your eyes stop tingling."); break; case R_CARRYING: updpack(); break; case R_LEVITATION: msg("You float gently to the ground."); break; case R_LIGHT: if (roomin(hero) != NULL) { light(&hero); mvwaddch(cw, hero.y, hero.x, PLAYER); } break; case R_TRUESEE: msg("Your sensory perceptions return to normal."); break; } msg("Was wearing %s.", inv_name(obj, LOWERCASE)); } }
/* * fall: * Drop an item someplace around here. */ int fall(struct linked_list *item, int pr) { register struct object *obj ; register struct room *rp ; static coord fpos ; int ret; obj = (struct object *) ldata(item) ; rp = roomin(&hero); if (obj->o_flags & CANRETURN) { add_pack(item, TRUE); return TRUE; } else if (fallpos(&obj->o_pos, &fpos, TRUE)) { if (obj->o_flags & CANBURN && ntraps + 1 < MAXTRAPS + MAXTRAPS) { mvaddch(fpos.y, fpos.x, FIRETRAP); traps[ntraps].tr_type = FIRETRAP; traps[ntraps].tr_flags = ISFOUND; traps[ntraps].tr_show = FIRETRAP; traps[ntraps].tr_pos.y = fpos.y; traps[ntraps++].tr_pos.x = fpos.x; if (rp != NULL) rp->r_flags &= ~ISDARK; discard(item); ret = FALSE; } else { mvaddch(fpos.y, fpos.x, obj->o_type) ; obj->o_pos = fpos ; attach(lvl_obj, item) ; ret = TRUE; } if (rp != NULL && (!(rp->r_flags & ISDARK) || (rp->r_flags & HASFIRE))) { light(&hero) ; mvwaddch(cw, hero.y, hero.x, PLAYER) ; } return ret; } if (pr) { if (obj->o_type == WEAPON) addmsg("The %s", weaps[obj->o_which]); else addmsg(inv_name(obj, TRUE)); msg(" vanishes as it hits the ground."); } discard(item) ; return FALSE; }
void whatis(int insist, int type) { THING *obj; if (pack == NULL) { msg("you don't have anything in your pack to identify"); return; } for (;;) { obj = get_item("identify", type); if (insist) { if (n_objs == 0) return; else if (obj == NULL) msg("you must identify something"); else if (type && obj->o_type != type && !(type == R_OR_S && (obj->o_type == RING || obj->o_type == STICK)) ) msg("you must identify a %s", type_name(type)); else break; } else break; } if (obj == NULL) return; switch (obj->o_type) { case SCROLL: set_know(obj, scr_info); when POTION: set_know(obj, pot_info); when STICK: set_know(obj, ws_info); when WEAPON: case ARMOR: obj->o_flags |= ISKNOW; when RING: set_know(obj, ring_info); } msg(inv_name(obj, FALSE)); }
void whatis(struct linked_list *what) { struct object *obj; int kludge; int print_message = FALSE; if (what == NULL) { print_message = TRUE; while ((what = get_item("identify", 0)) == NULL) ; } obj = OBJPTR(what); obj->o_flags |= ISKNOW; switch (obj->o_type) { case SCROLL: kludge = TYP_SCROLL; break; case POTION: kludge = TYP_POTION; break; case STICK: kludge = TYP_STICK; break; case RING: kludge = TYP_RING; break; case WEAPON: case ARMOR: default: kludge = -1; break; } if (kludge != -1) { know_items[kludge][obj->o_which] = TRUE; if (guess_items[kludge][obj->o_which]) { ur_free(guess_items[kludge][obj->o_which]); guess_items[kludge][obj->o_which] = NULL; } } if (print_message) msg(inv_name(obj, UPPERCASE)); }
/* * inventory: * List what is in the pack. Return TRUE if there is something of * the given type. */ bool inventory(THING *list, int type) { static char inv_temp[MAXSTR]; n_objs = 0; for (; list != NULL; list = next(list)) { if (type && type != list->o_type && !(type == CALLABLE && list->o_type != FOOD && list->o_type != AMULET) && !(type == R_OR_S && (list->o_type == RING || list->o_type == STICK))) continue; n_objs++; #ifdef MASTER if (!list->o_packch) strcpy(inv_temp, "%s"); else #endif sprintf(inv_temp, "%c) %%s", list->o_packch); msg_esc = TRUE; if (add_line(inv_temp, inv_name(list, FALSE)) == ESCAPE) { msg_esc = FALSE; msg(""); return TRUE; } msg_esc = FALSE; } if (n_objs == 0) { if (terse) msg(type == 0 ? "empty handed" : "nothing appropriate"); else msg(type == 0 ? "you are empty handed" : "you don't have anything appropriate"); return FALSE; } end_line(); return TRUE; }
/* * take_off: * Get the armor off of the players back */ take_off() { register THING *obj; if ((obj = cur_armor) == NULL) { after = FALSE; if (terse) msg("not wearing armor"); else msg("you aren't wearing any armor"); return; } if (!dropcheck(cur_armor)) return; cur_armor = NULL; if (terse) addmsg("was"); else addmsg("you used to be "); msg(" wearing %c) %s", pack_char(obj), inv_name(obj, TRUE)); }
void wield() { struct linked_list *item; struct object *obj, *oweapon; oweapon = cur_weapon; if (!dropcheck(cur_weapon)) { cur_weapon = oweapon; return; } cur_weapon = oweapon; if ((item = get_item("wield", WEAPON)) == NULL) { bad: after = FALSE; return; } obj = (struct object *) ldata(item); if (obj->o_type == ARMOR) { msg("You can't wield armor"); goto bad; } if (is_current(obj)) goto bad; if (terse) addmsg("W"); else addmsg("You are now w"); msg("ielding %s", inv_name(obj, TRUE)); cur_weapon = obj; }
void wield(void) { struct linked_list *item; struct object *obj, *oweapon; oweapon = cur_weapon; if (!dropcheck(cur_weapon)) { cur_weapon = oweapon; return; } cur_weapon = oweapon; if ((item = get_item("wield", WEAPON)) == NULL) { after = FALSE; return; } obj = OBJPTR(item); if (is_current(obj)) { after = FALSE; return; } wield_ok(&player, obj, TRUE); msg("You are now wielding %s.", inv_name(obj, LOWERCASE)); cur_weapon = obj; }
void missile(int ydelta, int xdelta, struct linked_list *item, struct thing *tp) { struct object *obj; struct linked_list *nitem; if (item == NULL) /* Get which thing we are hurling */ return; obj = OBJPTR(item); if (!dropcheck(obj) || is_current(obj)) return; /* * Get rid of the thing. If it is a non-multiple item object, or if * it is the last thing, just drop it. Otherwise, create a new item * with a count of one. */ if (obj->o_count < 2) { if (tp->t_pack == pack) rem_pack(obj); else detach(tp->t_pack, item); } else { obj->o_count--; nitem = (struct linked_list *) new_item(sizeof *obj); obj = OBJPTR(nitem); *obj = *(OBJPTR(item)); obj->o_count = 1; item = nitem; } switch (obj->o_type) { case ARTIFACT: has_artifact &= ~(1 << obj->o_which); break; case SCROLL: if (obj->o_which == S_SCARE && obj->o_flags & ISBLESSED) obj->o_flags &= ~ISBLESSED; else obj->o_flags |= ISCURSED; } updpack(); obj->o_pos = do_motion(obj->o_type, ydelta, xdelta, tp); /* * AHA! Here it has hit something. If it is a wall or a door, or if * it misses (combat) the monster, put it on the floor */ if (!hit_monster(obj->o_pos.y, obj->o_pos.x, obj, tp)) { if (obj->o_type == WEAPON && obj->o_which == GRENADE) { hearmsg("BOOOM!"); aggravate(); if (ntraps + 1 < 2 * MAXTRAPS && fallpos(obj->o_pos, &traps[ntraps].tr_pos)) { mvaddch(traps[ntraps].tr_pos.y, traps[ntraps].tr_pos.x, TRAPDOOR); traps[ntraps].tr_type = TRAPDOOR; traps[ntraps].tr_flags = ISFOUND; traps[ntraps].tr_show = TRAPDOOR; ntraps++; light(&hero); } discard(item); } else if (obj->o_flags & ISLOST) { if (obj->o_type == WEAPON) addmsg("The %s", weaps[obj->o_which].w_name); else addmsg(inv_name(obj, LOWERCASE)); msg(" vanishes in a puff of greasy smoke."); discard(item); } else { fall(&player, item, TRUE, TRUE); if (obj->o_flags & CANRETURN) msg("You have %s.", inv_name(obj, LOWERCASE)); } } else if (obj->o_flags & ISOWNED) { add_pack(item, NOMESSAGE); msg("You have %s.", inv_name(obj, LOWERCASE)); } mvwaddch(cw, hero.y, hero.x, PLAYER); }
void fall(struct thing *tp, struct linked_list *item, int pr, int player_owned) { struct object *obj; struct room *rp; coord fpos; obj = OBJPTR(item); rp = roomin(tp->t_pos); if (player_owned && obj->o_flags & CANRETURN) { add_pack(item, NOMESSAGE); msg("You have %s.", inv_name(obj, LOWERCASE)); return; } else if (fallpos(obj->o_pos, &fpos)) { if (obj->o_flags & CANBURN && obj->o_type == WEAPON && obj->o_which == MOLOTOV && ntraps + 1 < 2 * MAXTRAPS) { mvaddch(fpos.y, fpos.x, FIRETRAP); traps[ntraps].tr_type = FIRETRAP; traps[ntraps].tr_flags = ISFOUND; traps[ntraps].tr_show = FIRETRAP; traps[ntraps].tr_pos = fpos; ntraps++; if (rp != NULL) rp->r_flags &= ~ISDARK; } else { obj->o_pos = fpos; add_obj(item, fpos.y, fpos.x); } if (rp != NULL && (!(rp->r_flags & ISDARK) || (rp->r_flags & HASFIRE))) { light(&hero); mvwaddch(cw, hero.y, hero.x, PLAYER); } return; } /* get here only if there isn't a place to put it */ if (pr) { if (cansee(obj->o_pos.y, obj->o_pos.x)) { if (obj->o_type == WEAPON) addmsg("The %s", weaps[obj->o_which].w_name); else addmsg(inv_name(obj, LOWERCASE)); msg(" vanishes as it hits the ground."); } } discard(item); }
void ring_on() { THING *obj; int ring; obj = get_item("put on", RING); /* * Make certain that it is somethings that we want to wear */ if (obj == NULL) return; if (obj->o_type != RING) { if (!terse) msg("it would be difficult to wrap that around a finger"); else msg("not a ring"); return; } /* * find out which hand to put it on */ if (is_current(obj)) return; if (cur_ring[LEFT] == NULL && cur_ring[RIGHT] == NULL) { if ((ring = gethand()) < 0) return; } else if (cur_ring[LEFT] == NULL) ring = LEFT; else if (cur_ring[RIGHT] == NULL) ring = RIGHT; else { if (!terse) msg("you already have a ring on each hand"); else msg("wearing two"); return; } cur_ring[ring] = obj; /* * Calculate the effect it has on the poor guy. */ switch (obj->o_which) { case R_ADDSTR: chg_str(obj->o_arm); break; case R_SEEINVIS: invis_on(); break; case R_AGGR: aggravate(); break; } if (!terse) addmsg("you are now wearing "); msg("%s (%c)", inv_name(obj, TRUE), obj->o_packch); }
/* * add_pack: * Pick up an object and add it to the pack. If the argument is non-null * use it as the linked_list pointer instead of gettting it off the ground. */ void add_pack(struct linked_list *item, int silent) { struct linked_list *ip, *lp; struct object *obj, *op; int exact, from_floor; if (item == NULL) { from_floor = TRUE; if ((item = find_obj(hero.y, hero.x)) == NULL) return; } else from_floor = FALSE; obj = (struct object *) ldata(item); /* * Link it into the pack. Search the pack for a object of similar type * if there isn't one, stuff it at the beginning, if there is, look for one * that is exactly the same and just increment the count if there is. * it that. Food is always put at the beginning for ease of access, but * is not ordered so that you can't tell good food from bad. First check * to see if there is something in thr same group and if there is then * increment the count. */ if (obj->o_group) { for (ip = pack; ip != NULL; ip = next(ip)) { op = (struct object *) ldata(ip); if (op->o_group == obj->o_group) { /* * Put it in the pack and notify the user */ op->o_count++; if (from_floor) { detach(lvl_obj, item); mvaddch(hero.y, hero.x, (roomin(&hero) == NULL ? PASSAGE : FLOOR)); } discard(item); item = ip; goto picked_up; } } } /* * Check if there is room */ if (inpack == MAXPACK-1) { msg("You can't carry anything else."); return; } /* * Check for and deal with scare monster scrolls */ if (obj->o_type == SCROLL && obj->o_which == S_SCARE) if (obj->o_flags & ISFOUND) { msg("The scroll turns to dust as you pick it up."); detach(lvl_obj, item); mvaddch(hero.y, hero.x, FLOOR); return; } else obj->o_flags |= ISFOUND; inpack++; if (from_floor) { detach(lvl_obj, item); mvaddch(hero.y, hero.x, (roomin(&hero) == NULL ? PASSAGE : FLOOR)); } /* * Search for an object of the same type */ exact = FALSE; for (ip = pack; ip != NULL; ip = next(ip)) { op = (struct object *) ldata(ip); if (obj->o_type == op->o_type) break; } if (ip == NULL) { /* * Put it at the end of the pack since it is a new type */ for (ip = pack; ip != NULL; ip = next(ip)) { op = (struct object *) ldata(ip); if (op->o_type != FOOD) break; lp = ip; } } else { /* * Search for an object which is exactly the same */ while (ip != NULL && op->o_type == obj->o_type) { if (op->o_which == obj->o_which) { exact = TRUE; break; } lp = ip; if ((ip = next(ip)) == NULL) break; op = (struct object *) ldata(ip); } } if (ip == NULL) { /* * Didn't find an exact match, just stick it here */ if (pack == NULL) pack = item; else { lp->l_next = item; item->l_prev = lp; item->l_next = NULL; } } else { /* * If we found an exact match. If it is a potion, food, or a * scroll, increase the count, otherwise put it with its clones. */ if (exact && ISMULT(obj->o_type)) { op->o_count++; discard(item); item = ip; goto picked_up; } if ((item->l_prev = prev(ip)) != NULL) item->l_prev->l_next = item; else pack = item; item->l_next = ip; ip->l_prev = item; } picked_up: /* * Notify the user */ obj = (struct object *) ldata(item); if (notify && !silent) { if (!terse) addmsg("You now have "); msg("%s (%c)", inv_name(obj, !terse), pack_char(obj)); } if (obj->o_type == AMULET) amulet = TRUE; }
/* * inventory: * list what is in the pack */ int inventory(struct linked_list *list, int type) { struct object *obj; int ch; int n_objs; char inv_temp[80]; n_objs = 0; for (ch = 'a'; list != NULL; ch++, list = next(list)) { obj = (struct object *) ldata(list); if (type && type != obj->o_type && !(type == CALLABLE && (obj->o_type == SCROLL || obj->o_type == POTION || obj->o_type == RING || obj->o_type == STICK))) continue; switch (n_objs++) { /* * For the first thing in the inventory, just save the string * in case there is only one. */ case 0: sprintf(inv_temp, "%c) %s", ch, inv_name(obj, FALSE)); break; /* * If there is more than one, clear the screen, print the * saved message and fall through to ... */ case 1: if (slow_invent) msg(inv_temp); else { wclear(hw); waddstr(hw, inv_temp); waddch(hw, '\n'); } /* * Print the line for this object */ default: if (slow_invent) msg("%c) %s", ch, inv_name(obj, FALSE)); else wprintw(hw, "%c) %s\n", ch, inv_name(obj, FALSE)); } } if (n_objs == 0) { if (terse) msg(type == 0 ? "Empty handed." : "Nothing appropriate"); else msg(type == 0 ? "You are empty handed." : "You don't have anything appropriate"); return FALSE; } if (n_objs == 1) { msg(inv_temp); return TRUE; } if (!slow_invent) { mvwaddstr(hw, LINES-1, 0, "--Press space to continue--"); draw(hw); wait_for(hw,' '); clearok(cw, TRUE); touchwin(cw); } return TRUE; }
void showpack(char *howso) { char *iname; unsigned int worth; int cnt, ch, oldpurse; struct linked_list *item; struct object *obj; struct linked_list *bag = NULL; cnt = 1; clear(); mvprintw(0, 0, "Contents of your pack %s:\n", howso); ch = 0; oldpurse = purse; purse = 0; for (item = pack; item != NULL; item = next(item)) { obj = OBJPTR(item); worth = get_worth(obj); whatis(item); purse += worth; if (obj->o_type == ARTIFACT && obj->o_which == TR_PURSE) bag = obj->o_bag; iname = inv_name(obj, UPPERCASE); mvprintw(cnt, 0, "%d) %s\n", ch, iname); ch += 1; if (++cnt > LINES - 5 && next(item) != NULL) { cnt = 1; mvaddstr(LINES - 1, 0, morestr); refresh(); wait_for(' '); clear(); } } if (bag != NULL) { mvaddstr(LINES - 1, 0, morestr); refresh(); wait_for(' '); clear(); cnt = 1; ch = 0; mvprintw(0, 0, "Contents of the Magic Purse of Yendor %s:\n", howso); for (item = bag; item != NULL; item = next(item)) { obj = OBJPTR(item); worth = get_worth(obj); whatis(item); purse += worth; mvprintw(cnt, 0, "%d) %s\n", ch, inv_name(obj, UPPERCASE)); ch += 1; if (++cnt > LINES - 5 && next(item) != NULL) { cnt = 1; mvaddstr(LINES - 1, 0, morestr); refresh(); wait_for(' '); clear(); } } } mvprintw(cnt + 1, 0, "Carrying %d gold pieces", oldpurse); mvprintw(cnt + 2, 0, "Carrying objects worth %d gold pieces", purse); purse += oldpurse; refresh(); }
void total_winner(void) { struct linked_list *item; struct object *obj; int worth, oldpurse; char c; struct linked_list *bag = NULL; clear(); standout(); addstr(" \n"); addstr(" @ @ @ @ @ @@@ @ @ \n"); addstr(" @ @ @@ @@ @ @ @ @ \n"); addstr(" @ @ @@@ @ @ @ @ @ @@@ @@@@ @@@ @ @@@ @ \n"); addstr(" @@@@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ \n"); addstr(" @ @ @ @ @ @ @ @@@@ @ @ @@@@@ @ @ @ \n"); addstr(" @ @ @ @ @ @@ @ @ @ @ @ @ @ @ @ @ \n"); addstr(" @@@ @@@ @@ @ @ @ @@@@ @@@@ @@@ @@@ @@ @ \n"); addstr(" \n"); addstr(" Congratulations, you have made it to the light of day! \n"); standend(); addstr("\nYou have joined the elite ranks of those who have \n"); addstr("escaped the Dungeons of Doom alive. You journey home \n"); addstr("and sell all your loot at a great profit.\n"); addstr("The White Council approves the recommendation of\n"); if (player.t_ctype == C_FIGHTER) addstr("the fighters guild and appoints you Lord Protector\n"); else if (player.t_ctype == C_ASSASIN) addstr("the assassins guild and appoints you Master Murderer\n"); else if (player.t_ctype == C_NINJA) addstr("the ninja guild and appoints you Master of the Wind\n"); else if (player.t_ctype == C_ILLUSION) addstr("the illusionists guild and appoints you Master Wizard\n"); else if (player.t_ctype == C_MAGICIAN) addstr("the magicians guild and appoints you Master Wizard\n"); else if (player.t_ctype == C_CLERIC) addstr("the temple priests and appoints you Master of the Flowers\n"); else if (player.t_ctype == C_DRUID) addstr("the temple priests and appoints you Master of the Flowers\n"); else if (player.t_ctype == C_RANGER) addstr("the rangers guild and appoints you Master Ranger\n"); else if (player.t_ctype == C_PALADIN) addstr("the paladins guild and appoints you Master Paladin\n"); else if (player.t_ctype == C_THIEF) { addstr("the thieves guild under protest and appoints you\n"); addstr("Master of the Highways\n"); } addstr("of the Land Between the Mountains.\n"); mvaddstr(LINES - 1, 0, spacemsg); refresh(); wait_for(' '); clear(); idenpack(); oldpurse = purse; mvaddstr(0, 0, " Worth Item"); for (c = 'a', item = pack; item != NULL; c++, item = next(item)) { obj = OBJPTR(item); worth = get_worth(obj); purse += worth; if (obj->o_type == ARTIFACT && obj->o_which == TR_PURSE) bag = obj->o_bag; mvprintw(c - 'a' + 1, 0, "%c) %8d %s", c, worth, inv_name(obj, UPPERCASE)); } if (bag != NULL) { mvaddstr(LINES - 1, 0, morestr); refresh(); wait_for(' '); clear(); mvprintw(0, 0, "Contents of the Magic Purse of Yendor:\n"); for (c = 'a', item = bag; item != NULL; c++, item = next(item)) { obj = OBJPTR(item); worth = get_worth(obj); whatis(item); purse += worth; mvprintw(c - 'a' + 1, 0, "%c) %8d %s\n", c, worth, inv_name(obj, UPPERCASE)); } } mvprintw(c - 'a' + 1, 0, " %6d Gold Pieces ", oldpurse); refresh(); if (has_artifact == 255) score(pstats.s_exp, pstats.s_lvl, TOTAL, 0); else score(pstats.s_exp, pstats.s_lvl, WINNER, 0); byebye(); }
struct linked_list * get_stack(struct linked_list *item) { struct object *obj; char buf[2 * LINELEN]; int i = 0, j; struct linked_list *ll; mpos = 0; obj = OBJPTR(item); ll = obj->next_obj; sprintf(buf, "You are standing on top of the following items: "); add_line(buf); sprintf(buf, "%d) -- %s", i, inv_name(obj, TRUE)); add_line(buf); while (ll) { i++; obj = OBJPTR(ll); sprintf(buf, "%d) -- %s", i, inv_name(obj, TRUE)); add_line(buf); ll = next(ll); } end_line(); msg("Which one do you want to pick up? [* for all] "); switch(get_string(buf, cw)) { case NORM: break; case QUIT: /* pick up nothing */ msg(""); return (NULL); } if (buf[0] == '*') { get_all(item); msg(""); return(NULL); } else { i = atoi(buf); if (i) { obj = OBJPTR(item); ll = obj->next_obj; j = 1; while (ll && (j != i)) { ll = next(ll); j++; } if (ll) { swap_top(item, ll); return(ll); } else { debug("Got past last item while picking up."); return(item); } } else return (item); } }
void total_winner() { THING *obj; struct obj_info *op; int worth = 0; int oldpurse; clear(); standout(); addstr(" \n"); addstr(" @ @ @ @ @ @@@ @ @ \n"); addstr(" @ @ @@ @@ @ @ @ @ \n"); addstr(" @ @ @@@ @ @ @ @ @ @@@ @@@@ @@@ @ @@@ @ \n"); addstr(" @@@@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ \n"); addstr(" @ @ @ @ @ @ @ @@@@ @ @ @@@@@ @ @ @ \n"); addstr(" @ @ @ @ @ @@ @ @ @ @ @ @ @ @ @ @ \n"); addstr(" @@@ @@@ @@ @ @ @ @@@@ @@@@ @@@ @@@ @@ @ \n"); addstr(" \n"); addstr(" Congratulations, you have made it to the light of day! \n"); standend(); addstr("\nYou have joined the elite ranks of those who have escaped the\n"); addstr("Dungeons of Doom alive. You journey home and sell all your loot at\n"); addstr("a great profit and are admitted to the Fighters' Guild.\n"); mvaddstr(LINES - 1, 0, "--Press space to continue--"); refresh(); wait_for(' '); clear(); mvaddstr(0, 0, " Worth Item\n"); oldpurse = purse; for (obj = pack; obj != NULL; obj = next(obj)) { switch (obj->o_type) { case FOOD: worth = 2 * obj->o_count; when WEAPON: worth = weap_info[obj->o_which].oi_worth; worth *= 3 * (obj->o_hplus + obj->o_dplus) + obj->o_count; obj->o_flags |= ISKNOW; when ARMOR: worth = arm_info[obj->o_which].oi_worth; worth += (9 - obj->o_arm) * 100; worth += (10 * (a_class[obj->o_which] - obj->o_arm)); obj->o_flags |= ISKNOW; when SCROLL: worth = scr_info[obj->o_which].oi_worth; worth *= obj->o_count; op = &scr_info[obj->o_which]; if (!op->oi_know) worth /= 2; op->oi_know = TRUE; when POTION: worth = pot_info[obj->o_which].oi_worth; worth *= obj->o_count; op = &pot_info[obj->o_which]; if (!op->oi_know) worth /= 2; op->oi_know = TRUE; when RING: op = &ring_info[obj->o_which]; worth = op->oi_worth; if (obj->o_which == R_ADDSTR || obj->o_which == R_ADDDAM || obj->o_which == R_PROTECT || obj->o_which == R_ADDHIT) { if (obj->o_arm > 0) worth += obj->o_arm * 100; else worth = 10; } if (!(obj->o_flags & ISKNOW)) worth /= 2; obj->o_flags |= ISKNOW; op->oi_know = TRUE; when STICK: op = &ws_info[obj->o_which]; worth = op->oi_worth; worth += 20 * obj->o_charges; if (!(obj->o_flags & ISKNOW)) worth /= 2; obj->o_flags |= ISKNOW; op->oi_know = TRUE; when AMULET: worth = 1000; } if (worth < 0) worth = 0; printw("%c) %5d %s\n", obj->o_packch, worth, inv_name(obj, FALSE)); purse += worth; } printw(" %5d Gold Pieces ", oldpurse); refresh(); score(purse, 2, ' '); my_exit(0); }
int add_pack(struct linked_list *item, int print_message) { struct object *obj, *op; int from_floor; if (item == NULL) { from_floor = TRUE; if ((item = find_obj(hero.y, hero.x)) == NULL) { msg("Nothing to pick up."); return(FALSE); } } else from_floor = FALSE; if (from_floor) { item = get_stack(item); if (!item) return(FALSE); } obj = OBJPTR(item); /* If it is gold, just add its value to rogue's purse and get rid of */ if (obj->o_type == GOLD) { struct linked_list *mitem; struct thing *tp; if (print_message) { if (!terse) addmsg("You found "); msg("%d gold pieces.", obj->o_count); } /* * First make sure no greedy monster is after this gold. If * so, make the monster run after the rogue instead. */ for (mitem = mlist; mitem != NULL; mitem = next(mitem)) { tp = THINGPTR(mitem); if (tp->t_horde==obj) { tp->t_ischasing = TRUE; tp->t_chasee = &player; tp->t_horde = NULL; } } /* * This will cause problems if people are able to drop and * pick up gold, or when GOLDSTEAL monsters are killed. */ /* Thieves get EXP for gold they pick up */ if (player.t_ctype == C_THIEF) { pstats.s_exp += obj->o_count / 4; check_level(); } purse += obj->o_count; if (from_floor) rem_obj(item, TRUE); /* Remove object from the level */ return (TRUE); } /* see if he can carry any more weight */ if (itemweight(obj) + pstats.s_pack > pstats.s_carry) { msg("Too much for you to carry."); if (print_message) { msg("%s onto %s", terse ? "Moved" : "You moved", inv_name(obj, LOWERCASE)); } return(FALSE); } /* * Link it into the pack. If the item can be grouped, try to find its * neighbors and bump the count. A special case is food, which can't * be grouped, but an exact match allows the count to get * incremented. */ if ((op = apply_to_bag(pack, obj->o_type, bff_group, NULL, obj)) != NULL) { op->o_count += obj->o_count; /* add it to the rest */ if (from_floor) rem_obj(item, FALSE); pack_report(op, print_message, "You now have "); return(TRUE); } /* Check for and deal with scare monster scrolls */ if (obj->o_type == SCROLL && obj->o_which == S_SCARE) if (obj->o_flags & ISCURSED) { msg("The scroll turns to dust as you pick it up."); rem_obj(item, TRUE); return(TRUE); } /* Check if there is room */ if (count_bag(pack, obj->o_type, NULL) == max_print()) { msg("You have no room for more %s.", name_type(obj->o_type)); if (print_message) { obj = OBJPTR(item); msg("%s onto %s.", terse ? "Moved" : "You moved", inv_name(obj, LOWERCASE)); } return(FALSE); } /* * finally, add the new item to the bag, and free up the linked list * on top of it. */ if (from_floor) rem_obj(item, FALSE); push_bag(&pack, obj); pack_report(obj, print_message, "You now have "); ur_free(item); return(TRUE); /* signal success */ }