[BACK]Return to trader.c CVS log [TXT][DIR] Up to [contributed] / early-roguelike / xrogue

Annotation of early-roguelike/xrogue/trader.c, Revision 1.1

1.1     ! rubenllo    1: /*
        !             2:     trader.c - Anything to do with trading posts
        !             3:
        !             4:     XRogue: Expeditions into the Dungeons of Doom
        !             5:     Copyright (C) 1991 Robert Pietkivitch
        !             6:     All rights reserved.
        !             7:
        !             8:     Based on "Advanced Rogue"
        !             9:     Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka and AT&T
        !            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 <string.h>
        !            17: #include "rogue.h"
        !            18:
        !            19: bool open_market(void);
        !            20: void trans_line(void);
        !            21: char *typ_name(struct object *obj);
        !            22:
        !            23: /*
        !            24:  * buy_it:
        !            25:  *      Buy the item on which the hero stands
        !            26:  */
        !            27:
        !            28: void
        !            29: buy_it(void)
        !            30: {
        !            31:         reg int wh;
        !            32:         struct linked_list *item = NULL;
        !            33:         struct object *obj = NULL;
        !            34:         int wasfood = FALSE;
        !            35:
        !            36:         if (purse <= 0) {
        !            37:             msg("You have no money.");
        !            38:             return;
        !            39:         }
        !            40:         if (curprice < 0) {             /* if not yet priced */
        !            41:             wh = price_it();
        !            42:             if (!wh)                    /* nothing to price */
        !            43:                 return;
        !            44:             msg("Do you want to buy it? ");
        !            45:             do {
        !            46:                 wh = wgetch(cw);
        !            47:                 if (wh == ESC || wh == 'n') {
        !            48:                     msg("");
        !            49:                     return;
        !            50:                 }
        !            51:             } until(wh == 'y');
        !            52:         }
        !            53:         mpos = 0;
        !            54:         if (curprice > purse) {
        !            55:             msg("You can't afford it!");
        !            56:             return;
        !            57:         }
        !            58:         /*
        !            59:          * See if the hero has done all his transacting
        !            60:          */
        !            61:         if (!open_market())
        !            62:             return;
        !            63:         /*
        !            64:          * The hero bought the item here
        !            65:          */
        !            66:         item = find_obj(hero.y, hero.x);
        !            67:         obj = OBJPTR(item);
        !            68:         mpos = 0;
        !            69:         wasfood = ISMULT(obj->o_type);
        !            70:         if (add_pack((struct linked_list *)NULL,TRUE)) {/* try to put it in his pack */
        !            71:             purse -= curprice;          /* take his money */
        !            72:             ++trader;                   /* another transaction */
        !            73:             trans_line();               /* show remaining deals */
        !            74:             curprice = -1;              /* reset stuff */
        !            75:             curpurch[0] = 0;
        !            76:             if (!wasfood) /* if it was food then the object has been deleted */
        !            77:             {
        !            78:                 whatis (item);              /* identify it */
        !            79:                 obj = OBJPTR(item);
        !            80:                 obj->o_flags &= ~ISPOST; /* turn off ISPOST */
        !            81:                 obj->o_flags |= ISKNOW;  /* he knows the item */
        !            82:                 msg("%s", inv_name(obj, TRUE));
        !            83:             }
        !            84:             else
        !            85:                 msg("a food ration.");
        !            86:         }
        !            87: }
        !            88:
        !            89: /*
        !            90:  * do_post:
        !            91:  *      Put a trading post room and stuff on the screen
        !            92:  * startup: True if equipping the player at the beginning of the game
        !            93:  */
        !            94:
        !            95: void
        !            96: do_post(bool startup)
        !            97: {
        !            98:         coord tp;
        !            99:         reg int i, j = 0, k;
        !           100:         reg struct room *rp;
        !           101:         reg struct object *op;
        !           102:         reg struct linked_list *ll;
        !           103:
        !           104:         o_free_list(lvl_obj);           /* throw old items away */
        !           105:
        !           106:         for (rp = rooms; rp < &rooms[MAXROOMS]; rp++)
        !           107:             rp->r_flags = ISGONE;               /* kill all rooms */
        !           108:
        !           109:         rp = &rooms[0];                         /* point to only room */
        !           110:         rp->r_flags = 0;                        /* this room NOT gone */
        !           111:         rp->r_max.x = 40;
        !           112:         rp->r_max.y = 10;                       /* 10 * 40 room */
        !           113:         rp->r_pos.x = (cols - rp->r_max.x) / 2; /* center horizontal */
        !           114:         rp->r_pos.y = 1;                        /* 2nd line */
        !           115:         draw_room(rp);                          /* draw the only room */
        !           116:
        !           117:         /* Are we equipping the player? */
        !           118:         if (startup) {
        !           119:             int wpt;
        !           120:
        !           121:             /*
        !           122:              * Give the rogue some weaponry.
        !           123:          * Create every kind of weapon there is.
        !           124:              */
        !           125:             for (wpt=0; wpt<MAXWEAPONS; wpt++) {
        !           126:                 ll = spec_item(WEAPON, wpt, rnd(100)/80+1, rnd(121)/60);
        !           127:                 attach(lvl_obj, ll);
        !           128:                 op = OBJPTR(ll);
        !           129:                 op->o_flags |= (ISPOST | ISKNOW);
        !           130:                 do {
        !           131:                     rnd_pos(rp,&tp);
        !           132:                 } until (mvinch(tp.y, tp.x) == FLOOR);
        !           133:                 op->o_pos = tp;
        !           134:                 mvaddch(tp.y,tp.x,op->o_type);
        !           135:             }
        !           136:
        !           137:             /*
        !           138:              * Suit of armor.
        !           139:          * Create every kind of armor there is.
        !           140:              */
        !           141:             for (i=0; i<MAXARMORS; i++) {
        !           142:                 ll = spec_item(ARMOR, i, rnd(100)/75, 0);
        !           143:                 attach(lvl_obj, ll);
        !           144:                 op = OBJPTR(ll);
        !           145:                 op->o_flags |= (ISPOST | ISKNOW);
        !           146:                 op->o_weight = armors[i].a_wght;
        !           147:                 do {
        !           148:                     rnd_pos(rp,&tp);
        !           149:                 } until (mvinch(tp.y, tp.x) == FLOOR);
        !           150:                 op->o_pos = tp;
        !           151:                 mvaddch(tp.y,tp.x,op->o_type);
        !           152:             }
        !           153:
        !           154:             /* Now create some rods/wands/staffs */
        !           155:             for (i=rnd(4)+2; i>0; i--) {
        !           156:                 if (i == 1 && player.t_ctype != C_FIGHTER) j = WS_HIT;
        !           157:                 else if (i == 5 && (player.t_ctype == C_RANGER  ||
        !           158:                     player.t_ctype == C_PALADIN ||
        !           159:                     player.t_ctype == C_MONK)) j = WS_FEAR;
        !           160:                 else switch (rnd(8)) {
        !           161:                     case 0: j = WS_SLOW_M;
        !           162:                     when 1: j = WS_TELMON;
        !           163:                     when 2: j = WS_CONFMON;
        !           164:                     when 3: j = WS_PARALYZE;
        !           165:                     when 4: j = WS_MDEG;
        !           166:                     when 5: j = WS_WONDER;
        !           167:                     when 6: j = WS_LIGHT;
        !           168:                     when 7: j = WS_CANCEL;
        !           169:                 }
        !           170:                 ll = spec_item(STICK, j, 0, 0);
        !           171:                 attach(lvl_obj, ll);
        !           172:                 op = OBJPTR(ll);
        !           173:
        !           174:                 /* Let clerics and MU'S know what kind they are */
        !           175:                 switch (player.t_ctype) {
        !           176:                     case C_MAGICIAN:
        !           177:                     case C_CLERIC:
        !           178:                     case C_DRUID:
        !           179:                         op->o_flags |= (ISPOST | ISKNOW);
        !           180:                     otherwise:
        !           181:                         op->o_flags |= ISPOST;
        !           182:                 }
        !           183:                 fix_stick(op);
        !           184:                 do {
        !           185:                     rnd_pos(rp,&tp);
        !           186:                 } until (mvinch(tp.y, tp.x) == FLOOR);
        !           187:                 op->o_pos = tp;
        !           188:                 mvaddch(tp.y,tp.x,op->o_type);
        !           189:             }
        !           190:
        !           191:             /* Now let's make some rings */
        !           192:             for (i=rnd(5)+3; i>0; i--) {
        !           193:                 k = 0;
        !           194:                 if (i == 6 && player.t_ctype != C_MONK) j = R_HEALTH;
        !           195:                 else if (i == 7) j = R_HEROISM;
        !           196:                 else switch (rnd(21)) {
        !           197:                     case 0:  j = R_ADDINTEL;   k = roll(1,3);
        !           198:                     when 1:  j = R_ADDSTR;     k = roll(1,3);
        !           199:                     when 2:  j = R_ADDWISDOM;  k = roll(1,3);
        !           200:                     when 3:  j = R_ADDHIT;     k = roll(1,3);
        !           201:                     when 4:  j = R_ADDDAM;     k = roll(1,3);
        !           202:                     when 5:  j = R_PROTECT;    k = roll(1,3);
        !           203:                     when 6:  j = R_DIGEST;     k = 1;
        !           204:                     when 7:  j = R_SUSABILITY;
        !           205:                     when 8:  j = R_SEEINVIS;
        !           206:                     when 9:  j = R_ALERT;
        !           207:                     when 10: j = R_FIRE;
        !           208:                     when 11: j = R_WARMTH;
        !           209:                     when 12: j = R_FREEDOM;
        !           210:                     when 13: j = R_STEALTH;
        !           211:                     when 14: j = R_CARRY;
        !           212:                     when 15: j = R_LIGHT;
        !           213:                     when 16: j = R_TELCONTROL;
        !           214:                     when 17: j = R_DELUSION;
        !           215:                     when 18: j = R_FEAR;
        !           216:                     when 19: j = R_AGGR;
        !           217:             when 20: j = R_SEARCH;
        !           218:                 }
        !           219:                 ll = spec_item(RING, j, k, 0);
        !           220:                 attach(lvl_obj, ll);
        !           221:                 op = OBJPTR(ll);
        !           222:
        !           223:                 /*
        !           224:                  * Let fighters, thieves, and monks know what kind
        !           225:                  * of rings these are.
        !           226:                  */
        !           227:                 switch (player.t_ctype) {
        !           228:                     case C_FIGHTER:
        !           229:                     case C_THIEF:
        !           230:                     case C_MONK:
        !           231:                         op->o_flags |= (ISPOST | ISKNOW);
        !           232:                     otherwise:
        !           233:                         op->o_flags |= ISPOST;
        !           234:                 }
        !           235:                 do {
        !           236:                     rnd_pos(rp,&tp);
        !           237:                 } until (mvinch(tp.y, tp.x) == FLOOR);
        !           238:                 op->o_pos = tp;
        !           239:                 mvaddch(tp.y,tp.x,op->o_type);
        !           240:             }
        !           241:
        !           242:             /* Let's offer some potions */
        !           243:             for (i=rnd(4)+3; i>0; i--) {
        !           244:                 if (i == 1 && player.t_ctype == C_ASSASSIN) j = P_POISON;
        !           245:                 else if (i == 6) j = P_PHASE;
        !           246:                 else switch (rnd(11)) {
        !           247:                     case 0:   j = P_CLEAR;
        !           248:                     when 1:   j = P_HEALING;
        !           249:                     when 2:   j = P_MFIND;
        !           250:                     when 3:   j = P_HASTE;
        !           251:                     when 4:   j = P_RESTORE;
        !           252:                     when 5:   j = P_FLY;
        !           253:                     when 6:   j = P_FFIND;
        !           254:                     when 7:   j = P_SEEINVIS;
        !           255:             when 8:   j = P_TFIND;
        !           256:                     when 9:   j = P_INVIS;
        !           257:                     when 10:  j = P_SKILL;
        !           258:                 }
        !           259:
        !           260:                 /* Make the potion */
        !           261:                 ll = spec_item(POTION, j, 0, 0);
        !           262:                 attach(lvl_obj, ll);
        !           263:                 op = OBJPTR(ll);
        !           264:                 op->o_flags |= ISPOST;
        !           265:
        !           266:                 /* Place the potion */
        !           267:                 do {
        !           268:                     rnd_pos(rp,&tp);
        !           269:                 } until (mvinch(tp.y, tp.x) == FLOOR);
        !           270:                 op->o_pos = tp;
        !           271:                 mvaddch(tp.y,tp.x,op->o_type);
        !           272:             }
        !           273:
        !           274:             /* Let's offer some scrolls */
        !           275:             for (i=rnd(4)+3; i>0; i--) {
        !           276:                 if (i == 1 && player.t_ctype != C_MONK) j = S_CURING;
        !           277:                 else if (i == 6 && player.t_ctype != C_THIEF) j = S_FINDTRAPS;
        !           278:                 else switch (rnd(11)) {
        !           279:                     case 0:   j = S_CONFUSE;
        !           280:                     when 1:   j = S_MAP;
        !           281:                     when 2:   j = S_LIGHT;
        !           282:                     when 3:   j = S_SLEEP;
        !           283:                     when 4:   j = S_IDENT;
        !           284:                     when 5:   j = S_GFIND;
        !           285:                     when 6:   j = S_REMOVE;
        !           286:                     when 7:   j = S_HOLD;
        !           287:                     when 8:   j = S_PETRIFY;
        !           288:                     when 9:   j = S_SCARE;
        !           289:                     when 10:  j = S_TELEP;
        !           290:                 }
        !           291:
        !           292:                 /* Make the scroll */
        !           293:                 ll = spec_item(SCROLL, j, 0, 0);
        !           294:                 attach(lvl_obj, ll);
        !           295:                 op = OBJPTR(ll);
        !           296:                 op->o_flags |= ISPOST;
        !           297:
        !           298:                 /* Place the scroll */
        !           299:                 do {
        !           300:                     rnd_pos(rp,&tp);
        !           301:                 } until (mvinch(tp.y, tp.x) == FLOOR);
        !           302:                 op->o_pos = tp;
        !           303:                 mvaddch(tp.y,tp.x,op->o_type);
        !           304:             }
        !           305:
        !           306:             /* And finally, let's get some food */
        !           307:             for (i=rnd(3)+2; i>0; i--) {
        !           308:                 ll = spec_item(FOOD, 0, 0, 0);
        !           309:                 attach(lvl_obj, ll);
        !           310:                 op = OBJPTR(ll);
        !           311:                 op->o_weight = things[TYP_FOOD].mi_wght;
        !           312:                 op->o_flags |= ISPOST;
        !           313:                 do {
        !           314:                     rnd_pos(rp,&tp);
        !           315:                 } until (mvinch(tp.y, tp.x) == FLOOR);
        !           316:                 op->o_pos = tp;
        !           317:                 mvaddch(tp.y,tp.x,op->o_type);
        !           318:             }
        !           319:         }
        !           320:         else {  /* in trading post itself */
        !           321:             i = roll(10, 4);                    /* 10 to 40 items */
        !           322:             for (; i > 0 ; i--) {               /* place all the items */
        !           323:                 ll = new_thing(ALL, TRUE);      /* get something */
        !           324:                 attach(lvl_obj, ll);
        !           325:                 op = OBJPTR(ll);
        !           326:                 op->o_flags |= ISPOST;          /* object in trading post */
        !           327:                 do {
        !           328:                     rnd_pos(rp,&tp);
        !           329:                 } until (mvinch(tp.y, tp.x) == FLOOR);
        !           330:                 op->o_pos = tp;
        !           331:                 mvaddch(tp.y,tp.x,op->o_type);
        !           332:             }
        !           333:         }
        !           334:         wmove(cw,12,0);
        !           335:         nofont(cw);
        !           336:         trader = 0;
        !           337:         if (startup) {
        !           338:             waddstr(cw,"Welcome to Friendly Fiend's Equipage\n\r");
        !           339:             waddstr(cw,"====================================\n\r");
        !           340:         }
        !           341:         else {
        !           342:             waddstr(cw,"Welcome to Friendly Fiend's Flea Market\n\r");
        !           343:             waddstr(cw,"=======================================\n\r");
        !           344:         }
        !           345:         waddstr(cw,"$: Prices object that you stand upon.\n\r");
        !           346:         waddstr(cw,"#: Buys the object that you stand upon.\n\r");
        !           347:         waddstr(cw,"%: Trades in something in your pack for gold.\n\r");
        !           348:         newfont(cw);
        !           349:         trans_line();
        !           350: }
        !           351:
        !           352: /*
        !           353:  * open_market:
        !           354:  *      Retruns TRUE when ok do to transacting
        !           355:  */
        !           356:
        !           357: bool
        !           358: open_market(void)
        !           359: {
        !           360:         if (trader >= MAXPURCH && !wizard && level != 0) {
        !           361:             msg("The market is closed. The stairs are that-a-way! ");
        !           362:             return FALSE;
        !           363:         }
        !           364:         else {
        !           365:             return TRUE;
        !           366:         }
        !           367: }
        !           368:
        !           369: /*
        !           370:  * price_it:
        !           371:  *      Price the object that the hero stands on
        !           372:  */
        !           373:
        !           374: bool
        !           375: price_it(void)
        !           376: {
        !           377:         reg struct linked_list *item;
        !           378:         reg struct object *obj;
        !           379:         reg int worth;
        !           380:         reg char *str;
        !           381:
        !           382:         if (!open_market())             /* after buying hours */
        !           383:             return FALSE;
        !           384:         if ((item = find_obj(hero.y,hero.x)) == NULL) {
        !           385:             debug("Can't find the item");
        !           386:             return FALSE;
        !           387:         }
        !           388:         obj = OBJPTR(item);
        !           389:         worth = get_worth(obj);
        !           390:         if (worth < 0) {
        !           391:             msg("That's not for sale.");
        !           392:             return FALSE;
        !           393:         }
        !           394:         if (worth < 25)
        !           395:             worth = 25;
        !           396:
        !           397:         /* Our shopkeeper is affected by the person's charisma */
        !           398:         if (pstats.s_charisma > 24)     /* but don't give it away! */
        !           399:             worth = (int) ((float) worth * (18. / (float)24));
        !           400:         else
        !           401:             worth = (int) ((float) worth * (18. / (float)pstats.s_charisma));
        !           402:
        !           403:         str = inv_name(obj, TRUE);
        !           404:         msg("%s for only %d pieces of gold", str, worth);
        !           405:         curprice = worth;               /* save price */
        !           406:         strcpy(curpurch,str);           /* save item */
        !           407:         return TRUE;
        !           408: }
        !           409:
        !           410: /*
        !           411:  * sell_it:
        !           412:  *      Sell an item to the trading post
        !           413:  */
        !           414:
        !           415: void
        !           416: sell_it(void)
        !           417: {
        !           418:         reg struct linked_list *item;
        !           419:         reg struct object *obj;
        !           420:         reg int wo, ch;
        !           421:
        !           422:         if (!open_market())             /* after selling hours */
        !           423:             return;
        !           424:
        !           425:         if ((item = get_item(pack, "sell", ALL, FALSE, FALSE)) == NULL)
        !           426:             return;
        !           427:         obj = OBJPTR(item);
        !           428:         wo = get_worth(obj);
        !           429:         if (wo <= 0) {
        !           430:             mpos = 0;
        !           431:             msg("We don't buy those.");
        !           432:             return;
        !           433:         }
        !           434:         if (wo < 25)
        !           435:             wo = 25;
        !           436:         msg("Your %s is worth %d pieces of gold.",typ_name(obj),wo);
        !           437:         msg("Do you want to sell it? ");
        !           438:         do {
        !           439:             ch = wgetch(cw);
        !           440:             if (ch == ESC || ch == 'n') {
        !           441:                 msg("");
        !           442:                 return;
        !           443:             }
        !           444:         } until (ch == 'y');
        !           445:         mpos = 0;
        !           446:         if (drop(item) == TRUE) {               /* drop this item */
        !           447:             purse += wo;                        /* give him his money */
        !           448:             ++trader;                           /* another transaction */
        !           449:             wo = obj->o_count;
        !           450:             if (obj->o_group == 0)              /* dropped one at a time */
        !           451:                 obj->o_count = 1;
        !           452:             msg("Sold %s",inv_name(obj,TRUE));
        !           453:             obj->o_count = wo;
        !           454:             trans_line();                       /* show remaining deals */
        !           455:         }
        !           456: }
        !           457:
        !           458: /*
        !           459:  * trans_line:
        !           460:  *      Show how many transactions the hero has left
        !           461:  */
        !           462:
        !           463: void
        !           464: trans_line(void)
        !           465: {
        !           466:         if (level == 0)
        !           467:             sprintf(prbuf, "You are welcome to spend whatever gold you have.");
        !           468:         else if (!wizard)
        !           469:             sprintf(prbuf,"You have %d transactions remaining.",
        !           470:                     MAXPURCH - trader);
        !           471:         else
        !           472:             sprintf(prbuf,
        !           473:                 "You have infinite transactions remaining oh great wizard.");
        !           474:         nofont(cw);
        !           475:         mvwaddstr(cw,lines - 4,0,prbuf);
        !           476:         newfont(cw);
        !           477: }
        !           478:
        !           479: /*
        !           480:  * typ_name:
        !           481:  *      Return the name for this type of object
        !           482:  */
        !           483:
        !           484: char *
        !           485: typ_name(struct object *obj)
        !           486: {
        !           487:         static char buff[20];
        !           488:         reg int wh;
        !           489:
        !           490:         switch (obj->o_type) {
        !           491:                 case POTION:  wh = TYP_POTION;
        !           492:                 when SCROLL:  wh = TYP_SCROLL;
        !           493:                 when STICK:   wh = TYP_STICK;
        !           494:                 when RING:    wh = TYP_RING;
        !           495:                 when ARMOR:   wh = TYP_ARMOR;
        !           496:                 when WEAPON:  wh = TYP_WEAPON;
        !           497:                 when MM:      wh = TYP_MM;
        !           498:                 when FOOD:    wh = TYP_FOOD;
        !           499:                 when RELIC:   wh = TYP_RELIC;
        !           500:                 otherwise:    wh = -1;
        !           501:         }
        !           502:         if (wh < 0)
        !           503:                 strcpy(buff,"unknown");
        !           504:         else
        !           505:                 strcpy(buff,things[wh].mi_name);
        !           506:         return (buff);
        !           507: }
        !           508:

CVSweb