Annotation of early-roguelike/arogue5/trader.c, Revision 1.1
1.1 ! rubenllo 1: /*
! 2: * Anything to do with trading posts
! 3: *
! 4: * Advanced Rogue
! 5: * Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka and AT&T
! 6: * All rights reserved.
! 7: *
! 8: * Based on "Super-Rogue"
! 9: * Copyright (C) 1984 Robert D. Kindelberger
! 10: * All rights reserved.
! 11: *
! 12: * See the file LICENSE.TXT for full copyright and licensing information.
! 13: */
! 14:
! 15: #include "curses.h"
! 16: #include "rogue.h"
! 17: #include <ctype.h>
! 18: #include <string.h>
! 19:
! 20: bool open_market(void);
! 21: void trans_line(void);
! 22: char *typ_name(struct object *obj);
! 23:
! 24:
! 25: /*
! 26: * buy_it:
! 27: * Buy the item on which the hero stands
! 28: */
! 29: void
! 30: buy_it(void)
! 31: {
! 32: reg int wh;
! 33: struct linked_list *item;
! 34:
! 35: if (purse <= 0) {
! 36: msg("You have no money.");
! 37: return;
! 38: }
! 39: if (curprice < 0) { /* if not yet priced */
! 40: wh = price_it();
! 41: if (!wh) /* nothing to price */
! 42: return;
! 43: msg("Do you want to buy it? ");
! 44: do {
! 45: wh = tolower(readchar());
! 46: if (wh == ESCAPE || wh == 'n') {
! 47: msg("");
! 48: return;
! 49: }
! 50: } until(wh == 'y');
! 51: }
! 52: mpos = 0;
! 53: if (curprice > purse) {
! 54: msg("You can't afford to buy that %s !",curpurch);
! 55: return;
! 56: }
! 57: /*
! 58: * See if the hero has done all his transacting
! 59: */
! 60: if (!open_market())
! 61: return;
! 62: /*
! 63: * The hero bought the item here
! 64: */
! 65: item = find_obj(hero.y, hero.x);
! 66: mpos = 0;
! 67: if (add_pack(NULL,TRUE,&item)) { /* try to put it in his pack */
! 68: purse -= curprice; /* take his money */
! 69: ++trader; /* another transaction */
! 70: trans_line(); /* show remaining deals */
! 71: curprice = -1; /* reset stuff */
! 72: curpurch[0] = 0;
! 73: whatis (item); /* identify it after purchase */
! 74: (OBJPTR(item))->o_flags &= ~ISPOST; /* turn off ISPOST */
! 75: msg("%s", inv_name(OBJPTR(item), TRUE));
! 76: }
! 77: }
! 78:
! 79: /*
! 80: * do_post:
! 81: * Put a trading post room and stuff on the screen
! 82: */
! 83: void
! 84: do_post(void)
! 85: {
! 86: coord tp;
! 87: reg int i;
! 88: reg struct room *rp;
! 89: reg struct object *op;
! 90: reg struct linked_list *ll;
! 91:
! 92: o_free_list(lvl_obj); /* throw old items away */
! 93:
! 94: for (rp = rooms; rp < &rooms[MAXROOMS]; rp++)
! 95: rp->r_flags = ISGONE; /* kill all rooms */
! 96:
! 97: rp = &rooms[0]; /* point to only room */
! 98: rp->r_flags = 0; /* this room NOT gone */
! 99: rp->r_max.x = 40;
! 100: rp->r_max.y = 10; /* 10 * 40 room */
! 101: rp->r_pos.x = (COLS - rp->r_max.x) / 2; /* center horizontal */
! 102: rp->r_pos.y = 1; /* 2nd line */
! 103: draw_room(rp); /* draw the only room */
! 104: i = roll(4,10); /* 10 to 40 items */
! 105: for (; i > 0 ; i--) { /* place all the items */
! 106: ll = new_thing(ALL); /* get something */
! 107: attach(lvl_obj, ll);
! 108: op = OBJPTR(ll);
! 109: op->o_flags |= ISPOST; /* object in trading post */
! 110: do {
! 111: rnd_pos(rp,&tp);
! 112: } until (mvinch(tp.y, tp.x) == FLOOR);
! 113: op->o_pos = tp;
! 114: mvaddch(tp.y,tp.x,op->o_type);
! 115: }
! 116: trader = 0;
! 117: wmove(cw,12,0);
! 118: waddstr(cw,"Welcome to Friendly Fiend's Flea Market\n\r");
! 119: waddstr(cw,"=======================================\n\r");
! 120: waddstr(cw,"$: Prices object that you stand upon.\n\r");
! 121: waddstr(cw,"#: Buys the object that you stand upon.\n\r");
! 122: waddstr(cw,"%: Trades in something in your pack for gold.\n\r");
! 123: trans_line();
! 124: }
! 125:
! 126:
! 127: /*
! 128: * get_worth:
! 129: * Calculate an objects worth in gold
! 130: */
! 131: int
! 132: get_worth(struct object *obj)
! 133: {
! 134: reg int worth, wh;
! 135:
! 136: worth = 0;
! 137: wh = obj->o_which;
! 138: switch (obj->o_type) {
! 139: case FOOD:
! 140: worth = 2;
! 141: when WEAPON:
! 142: if (wh < MAXWEAPONS) {
! 143: worth = weaps[wh].w_worth;
! 144: worth += s_magic[S_ALLENCH].mi_worth *
! 145: (obj->o_hplus + obj->o_dplus);
! 146: }
! 147: when ARMOR:
! 148: if (wh < MAXARMORS) {
! 149: worth = armors[wh].a_worth;
! 150: worth += s_magic[S_ALLENCH].mi_worth *
! 151: (armors[wh].a_class - obj->o_ac);
! 152: }
! 153: when SCROLL:
! 154: if (wh < MAXSCROLLS)
! 155: worth = s_magic[wh].mi_worth;
! 156: when POTION:
! 157: if (wh < MAXPOTIONS)
! 158: worth = p_magic[wh].mi_worth;
! 159: when RING:
! 160: if (wh < MAXRINGS) {
! 161: worth = r_magic[wh].mi_worth;
! 162: worth += obj->o_ac * 40;
! 163: }
! 164: when STICK:
! 165: if (wh < MAXSTICKS) {
! 166: worth = ws_magic[wh].mi_worth;
! 167: worth += 20 * obj->o_charges;
! 168: }
! 169: when MM:
! 170: if (wh < MAXMM) {
! 171: worth = m_magic[wh].mi_worth;
! 172: switch (wh) {
! 173: case MM_BRACERS: worth += 40 * obj->o_ac;
! 174: when MM_PROTECT: worth += 60 * obj->o_ac;
! 175: when MM_DISP: /* ac already figured in price*/
! 176: otherwise: worth += 20 * obj->o_ac;
! 177: }
! 178: }
! 179: when RELIC:
! 180: if (wh < MAXRELIC) {
! 181: worth = rel_magic[wh].mi_worth;
! 182: if (wh == quest_item) worth *= 10;
! 183: }
! 184: otherwise:
! 185: worth = 0;
! 186: }
! 187: if (obj->o_flags & ISPROT) /* 300% more for protected */
! 188: worth *= 3;
! 189: if (obj->o_flags & ISBLESSED) /* 50% more for blessed */
! 190: worth = worth * 3 / 2;
! 191: if (obj->o_flags & ISCURSED) /* half for cursed */
! 192: worth /= 2;
! 193: if (worth < 0)
! 194: worth = 0;
! 195: return worth;
! 196: }
! 197:
! 198: /*
! 199: * open_market:
! 200: * Retruns TRUE when ok do to transacting
! 201: */
! 202: bool
! 203: open_market(void)
! 204: {
! 205: if (trader >= MAXPURCH && !wizard) {
! 206: msg("The market is closed. The stairs are that-a-way.");
! 207: return FALSE;
! 208: }
! 209: else {
! 210: return TRUE;
! 211: }
! 212: }
! 213:
! 214: /*
! 215: * price_it:
! 216: * Price the object that the hero stands on
! 217: */
! 218: bool
! 219: price_it(void)
! 220: {
! 221: reg struct linked_list *item;
! 222: reg struct object *obj;
! 223: reg int worth;
! 224: reg char *str;
! 225:
! 226: if (!open_market()) /* after buying hours */
! 227: return FALSE;
! 228: if ((item = find_obj(hero.y,hero.x)) == NULL)
! 229: return FALSE;
! 230: obj = OBJPTR(item);
! 231: worth = get_worth(obj);
! 232: if (worth < 0) {
! 233: msg("That's not for sale.");
! 234: return FALSE;
! 235: }
! 236: if (worth < 25)
! 237: worth = 25;
! 238: worth *= 3; /* slightly expensive */
! 239: str = inv_name(obj, TRUE);
! 240: sprintf(outstring,"%s for only %d pieces of gold", str, worth);
! 241: msg(outstring);
! 242: curprice = worth; /* save price */
! 243: strcpy(curpurch,str); /* save item */
! 244: return TRUE;
! 245: }
! 246:
! 247:
! 248:
! 249: /*
! 250: * sell_it:
! 251: * Sell an item to the trading post
! 252: */
! 253: void
! 254: sell_it(void)
! 255: {
! 256: reg struct linked_list *item;
! 257: reg struct object *obj;
! 258: reg int wo, ch;
! 259:
! 260: if (!open_market()) /* after selling hours */
! 261: return;
! 262:
! 263: if ((item = get_item(pack, "sell", ALL)) == NULL)
! 264: return;
! 265: obj = OBJPTR(item);
! 266: wo = get_worth(obj);
! 267: if (wo <= 0) {
! 268: mpos = 0;
! 269: msg("We don't buy those.");
! 270: return;
! 271: }
! 272: if (wo < 25)
! 273: wo = 25;
! 274: sprintf(outstring,"Your %s is worth %d pieces of gold.",typ_name(obj),wo);
! 275: msg(outstring);
! 276: msg("Do you want to sell it? ");
! 277: do {
! 278: ch = tolower(readchar());
! 279: if (ch == ESCAPE || ch == 'n') {
! 280: msg("");
! 281: return;
! 282: }
! 283: } until (ch == 'y');
! 284: mpos = 0;
! 285: if (drop(item) == TRUE) { /* drop this item */
! 286: purse += wo; /* give him his money */
! 287: ++trader; /* another transaction */
! 288: wo = obj->o_count;
! 289: if (obj->o_group == 0) /* dropped one at a time */
! 290: obj->o_count = 1;
! 291: msg("Sold %s",inv_name(obj,TRUE));
! 292: obj->o_count = wo;
! 293: trans_line(); /* show remaining deals */
! 294: }
! 295: }
! 296:
! 297: /*
! 298: * trans_line:
! 299: * Show how many transactions the hero has left
! 300: */
! 301: void
! 302: trans_line(void)
! 303: {
! 304: if (!wizard)
! 305: sprintf(prbuf,"You have %d transactions remaining.",
! 306: MAXPURCH - trader);
! 307: else
! 308: sprintf(prbuf,
! 309: "You have infinite transactions remaining oh great wizard");
! 310: mvwaddstr(cw,LINES - 3,0,prbuf);
! 311: }
! 312:
! 313:
! 314:
! 315: /*
! 316: * typ_name:
! 317: * Return the name for this type of object
! 318: */
! 319: char *
! 320: typ_name(struct object *obj)
! 321: {
! 322: static char buff[20];
! 323: reg int wh;
! 324:
! 325: switch (obj->o_type) {
! 326: case POTION: wh = TYP_POTION;
! 327: when SCROLL: wh = TYP_SCROLL;
! 328: when STICK: wh = TYP_STICK;
! 329: when RING: wh = TYP_RING;
! 330: when ARMOR: wh = TYP_ARMOR;
! 331: when WEAPON: wh = TYP_WEAPON;
! 332: when MM: wh = TYP_MM;
! 333: when FOOD: wh = TYP_FOOD;
! 334: when RELIC: wh = TYP_RELIC;
! 335: otherwise: wh = -1;
! 336: }
! 337: if (wh < 0)
! 338: strcpy(buff,"unknown");
! 339: else
! 340: strcpy(buff,things[wh].mi_name);
! 341: return (buff);
! 342: }
! 343:
! 344:
CVSweb