/* * init_player: * Roll her up */ void init_player(void) { THING *obj; pstats = max_stats; food_left = HUNGERTIME; /* * Give him some food */ obj = new_item(); obj->o_type = FOOD; obj->o_count = 1; add_pack(obj, TRUE); /* * And his suit of armor */ obj = new_item(); obj->o_type = ARMOR; obj->o_which = RING_MAIL; obj->o_arm = a_class[RING_MAIL] - 1; obj->o_flags |= ISKNOW; obj->o_count = 1; cur_armor = obj; add_pack(obj, TRUE); /* * Give him his weaponry. First a mace. */ obj = new_item(); init_weapon(obj, MACE); obj->o_hplus = 1; obj->o_dplus = 1; obj->o_flags |= ISKNOW; add_pack(obj, TRUE); cur_weapon = obj; /* * Now a +1 bow */ obj = new_item(); init_weapon(obj, BOW); obj->o_hplus = 1; obj->o_flags |= ISKNOW; add_pack(obj, TRUE); /* * Now some arrows */ obj = new_item(); init_weapon(obj, ARROW); obj->o_count = rnd(15) + 25; obj->o_flags |= ISKNOW; add_pack(obj, TRUE); }
static void load_all(void) { struct packed_git *p = get_packed_git(the_repository); while (p) { add_pack(p); p = p->next; } }
/* * 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; }
static struct pack_list * add_pack_file(const char *filename) { struct packed_git *p = get_packed_git(the_repository); if (strlen(filename) < 40) die("Bad pack filename: %s", filename); while (p) { if (strstr(p->pack_name, filename)) return add_pack(p); p = p->next; } die("Filename %s not found in packed_git", filename); }
void get_all(struct linked_list *top) { struct linked_list *node; struct object *obt; while (top) { obt = OBJPTR(top); node = obt->next_obj; rem_obj(top, FALSE); if (!add_pack(top, FALSE)) return; top = node; } }
/* * pick_up: * Add something to characters pack. */ void pick_up(char ch) { nochange = FALSE; switch(ch) { case GOLD: money(); when ARMOR: case POTION: case FOOD: case WEAPON: case SCROLL: case AMULET: case RING: case STICK: add_pack(NULL, FALSE); otherwise: msg("That item is ethereal !!!"); } }
/* * pick_up: * Add something to characters pack. */ void pick_up(int ch) { switch(ch) { case GOLD: money(); break; default: debug("Where did you pick that up???"); case ARMOR: case POTION: case FOOD: case WEAPON: case SCROLL: case AMULET: case RING: case STICK: add_pack(NULL, FALSE); break; } }
void pick_up(char ch) { switch(ch) { default: debug("Where did you pick that up???"); break; case GOLD: case ARMOR: case POTION: case FOOD: case WEAPON: case SCROLL: case ARTIFACT: case RING: case STICK: add_pack(NULL, MESSAGE); break; } }
void pick_up(char ch) { THING *obj; if (on(player, ISLEVIT)) return; obj = find_obj(hero.y, hero.x); if (move_on) move_msg(obj); else switch (ch) { case GOLD: if (obj == NULL) return; money(obj->o_goldval); detach(lvl_obj, obj); discard(obj); proom->r_goldval = 0; break; default: #ifdef MASTER debug("Where did you pick a '%s' up???", unctrl(ch)); #endif case ARMOR: case POTION: case FOOD: case WEAPON: case SCROLL: case AMULET: case RING: case STICK: add_pack((THING *) NULL, FALSE); break; } }
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 sell(struct thing *tp) { struct linked_list *item; int i, j, min_worth, nitems, chance, which_item, w; char goods; struct object *obj; char buffer[2 * LINELEN]; char dbuf[2 * LINELEN]; struct { int which; int plus1, plus2; int count; int worth; int flags; char *name; } selection[SELL_ITEMS]; int effective_purse = ((player.t_ctype == C_PALADIN) ? (9 * purse / 10) : purse); min_worth = -1; /* hope item is never worth less than this */ item = find_mons(tp->t_pos.y, tp->t_pos.x); /* Get pointer to monster */ /* Select the items */ nitems = rnd(6) + 5; switch (rnd(6)) { /* Armor */ case 0: case 1: goods = ARMOR; for (i = 0; i < nitems; i++) { chance = rnd(100); for (j = 0; j < maxarmors; j++) if (chance < armors[j].a_prob) break; if (j == maxarmors) { debug("Picked a bad armor %d", chance); j = 0; } selection[i].which = j; selection[i].count = 1; if (rnd(100) < 40) selection[i].plus1 = rnd(5) + 1; else selection[i].plus1 = 0; selection[i].name = armors[j].a_name; switch (luck) { case 0: break; case 1: if (rnd(3) == 0) { selection[i].flags |= ISCURSED; selection[i].plus1 = -1 - rnd(5); } break; default: if (rnd(luck)) { selection[i].flags |= ISCURSED; selection[i].plus1 = -1 - rnd(5); } break; } /* Calculate price */ w = armors[j].a_worth; w *= (1 + luck + (10 * selection[i].plus1)); w = (w / 2) + (roll(6, w) / 6); selection[i].worth = max(w, 25); if (min_worth > selection[i].worth || i == 1) min_worth = selection[i].worth; } break; /* Weapon */ case 2: case 3: goods = WEAPON; for (i = 0; i < nitems; i++) { selection[i].which = rnd(maxweapons); selection[i].count = 1; if (rnd(100) < 35) { selection[i].plus1 = rnd(3); selection[i].plus2 = rnd(3); } else { selection[i].plus1 = 0; selection[i].plus2 = 0; } if (weaps[selection[i].which].w_flags & ISMANY) selection[i].count = rnd(15) + 8; selection[i].name = weaps[selection[i].which].w_name; switch (luck) { case 0: break; case 1: if (rnd(3) == 0) { selection[i].flags |= ISCURSED; selection[i].plus1 = -rnd(3); selection[i].plus2 = -rnd(3); } break; default: if (rnd(luck)) { selection[i].flags |= ISCURSED; selection[i].plus1 = -rnd(3); selection[i].plus2 = -rnd(3); } break; } w = weaps[selection[i].which].w_worth * selection[i].count; w *= (1 + luck + (10 * selection[i].plus1 + 10 * selection[i].plus2)); w = (w / 2) + (roll(6, w) / 6); selection[i].worth = max(w, 25); if (min_worth > selection[i].worth || i == 1) min_worth = selection[i].worth; } break; /* Staff or wand */ case 4: goods = STICK; for (i = 0; i < nitems; i++) { selection[i].which = pick_one(ws_magic, maxsticks); selection[i].plus1 = rnd(11) + 5; selection[i].count = 1; selection[i].name = ws_magic[selection[i].which].mi_name; switch (luck) { case 0: break; case 1: if (rnd(3) == 0) { selection[i].flags |= ISCURSED; selection[i].plus1 = 1; } break; default: if (rnd(luck)) { selection[i].flags |= ISCURSED; selection[i].plus1 = 1; } } w = ws_magic[selection[i].which].mi_worth; w += (luck + 1) * 20 * selection[i].plus1; w = (w / 2) + (roll(6, w) / 6); selection[i].worth = max(w, 25); if (min_worth > selection[i].worth || i == 1) min_worth = selection[i].worth; } break; /* Ring */ case 5: goods = RING; for (i = 0; i < nitems; i++) { selection[i].which = pick_one(r_magic, maxrings); selection[i].plus1 = rnd(2) + 1; selection[i].count = 1; if (rnd(100) < r_magic[selection[i].which].mi_bless + 10) selection[i].plus1 += rnd(2) + 1; selection[i].name = r_magic[selection[i].which].mi_name; switch (luck) { case 0: break; case 1: if (rnd(3) == 0) { selection[i].flags |= ISCURSED; selection[i].plus1 = -1 - rnd(2); } break; default: if (rnd(luck)) { selection[i].flags |= ISCURSED; selection[i].plus1 = -1 - rnd(2); } } w = r_magic[selection[i].which].mi_worth; switch(selection[i].which) { case R_DIGEST: if (selection[i].plus1 > 2) selection[i].plus1 = 2; else if (selection[i].plus1 < 1) selection[i].plus1 = 1; /* fall thru here to other cases */ case R_ADDSTR: case R_ADDDAM: case R_PROTECT: case R_ADDHIT: case R_ADDINTEL: case R_ADDWISDOM: if (selection[i].plus1 > 0) w += selection[i].plus1 * 50; } w *= (1 + luck); w = (w / 2) + (roll(6, w) / 6); selection[i].worth = max(w, 25); if (min_worth > selection[i].worth * selection[i].count) min_worth = selection[i].worth; } } /* See if player can afford an item */ if (min_worth > effective_purse) { msg("The %s eyes your small purse and departs.", monsters[nummonst].m_name); /* Get rid of the monster */ killed(NULL, item, NOMESSAGE, NOPOINTS); return; } /* Display the goods */ msg("The %s shows you his wares.", monsters[nummonst].m_name); wstandout(cw); mvwaddstr(cw, 0, mpos, morestr); wstandend(cw); wrefresh(cw); wait_for(' '); msg(""); clearok(cw, TRUE); touchwin(cw); wclear(hw); touchwin(hw); for (i = 0; i < nitems; i++) { if (selection[i].worth > effective_purse) continue; wmove(hw, i + 2, 0); sprintf(dbuf, "[%c] ", ('a' + i)); switch(goods) { case ARMOR: strcat(dbuf, "Some "); break; case WEAPON: if (selection[i].count == 1) strcat(dbuf, "A "); else { sprintf(buffer, "%2d ", selection[i].count); strcat(dbuf, buffer); } break; case STICK: strcat(dbuf, "A "); strcat(dbuf, ws_type[selection[i].which]); strcat(dbuf, " of "); break; case RING: strcat(dbuf, "A ring of "); break; } strcat(dbuf, selection[i].name); if (selection[i].count > 1) strcat(dbuf, "s"); sprintf(buffer, "%-50s Price: %d", dbuf, selection[i].worth); waddstr(hw, buffer); } sprintf(buffer, "Purse: %d", purse); mvwaddstr(hw, nitems + 3, 0, buffer); mvwaddstr(hw, 0, 0, "How about one of the following goods? "); wrefresh(hw); /* Get rid of the monster */ killed(NULL, item, NOMESSAGE, NOPOINTS); which_item = (short) ((readchar() & 0177) - 'a'); while (which_item < 0 || which_item >= nitems || selection[which_item].worth > effective_purse) { if (which_item == (short) ESCAPE - (short) 'a') return; mvwaddstr(hw, 0, 0, "Please enter one of the listed items: "); wrefresh(hw); which_item = (short) ((readchar() & 0177) - 'a'); } if (purse > selection[which_item].worth) purse -= selection[which_item].worth; else purse = 0L; item = spec_item(goods, selection[which_item].which, selection[which_item].plus1, selection[which_item].plus2); obj = OBJPTR(item); if (selection[which_item].count > 1) { obj->o_count = selection[which_item].count; obj->o_group = ++group; } /* If a stick or ring, let player know the type */ switch (goods) { case STICK: know_items[TYP_STICK][selection[which_item].which] = TRUE; break; case RING: know_items[TYP_RING][selection[which_item].which] = TRUE; break; } if (add_pack(item, MESSAGE) == FALSE) { obj->o_pos = hero; fall(&player, item, TRUE, FALSE); } }
/* * missile: * Fire a missile in a given direction */ void missile(int ydelta, int xdelta, struct linked_list *item, struct thing *tp) { register struct object *obj ; register struct linked_list *nitem ; /* * Get which thing we are hurling */ if (item == NULL) { return ; } obj = (struct object *) ldata(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) { detach(tp->t_pack, item) ; if (tp->t_pack == pack) { inpack-- ; freeletter(item); } } else { obj->o_count-- ; nitem = (struct linked_list *) new_item(sizeof *obj) ; obj = (struct object *) ldata(nitem) ; *obj = *((struct object *) ldata(item)) ; obj->o_count = 1 ; item = nitem ; } if (obj->o_type == ARTIFACT) has_artifact &= ~(1 << obj->o_which); if (obj->o_type == SCROLL && obj->o_which == S_SCARE) { if (obj->o_flags & ISBLESSED) obj->o_flags &= ~ISBLESSED; else obj->o_flags |= ISCURSED; } updpack (FALSE); do_motion(obj, 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(unc(obj->o_pos), obj, tp)) { if (obj->o_type == WEAPON && obj->o_which == GRENADE) { register struct room *rp; static coord fpos; msg("BOOOM!"); aggravate(); rp = roomin(&obj->o_pos); if (ntraps + 1 < MAXTRAPS + MAXTRAPS && fallpos(&obj->o_pos, &fpos, TRUE)) { mvaddch(fpos.y, fpos.x, TRAPDOOR); traps[ntraps].tr_type = TRAPDOOR; traps[ntraps].tr_flags = ISFOUND; traps[ntraps].tr_show = TRAPDOOR; traps[ntraps].tr_pos.y = fpos.y; traps[ntraps++].tr_pos.x = fpos.x; 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, TRUE)); msg(" vanishes in a puff of greasy smoke."); discard(item); } else { if (fall(item, TRUE)) if (obj->o_flags & CANRETURN) msg("You have %s.", inv_name(obj, TRUE)); } } else if (obj->o_flags & ISOWNED) { add_pack(item, TRUE); msg("You have %s.", inv_name(obj, TRUE)); } mvwaddch(cw, hero.y, hero.x, PLAYER) ; }