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

Annotation of early-roguelike/urogue/trader.c, Revision 1.1.1.1

1.1       rubenllo    1: /*
                      2:     trader.c - Anything to do with trading posts
                      3:
                      4:     UltraRogue: The Ultimate Adventure in the Dungeons of Doom
                      5:     Copyright (C) 1985, 1986, 1992, 1993, 1995 Herb Chong
                      6:     All rights reserved.
                      7:
                      8:     Based on "Advanced Rogue"
                      9:     Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka
                     10:     All rights reserved.
                     11:
                     12:     Based on "Rogue: Exploring the Dungeons of Doom"
                     13:     Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
                     14:     All rights reserved.
                     15:
                     16:     See the file LICENSE.TXT for full copyright and licensing information.
                     17: */
                     18:
                     19: #include <string.h>
                     20: #include <stdlib.h>
                     21: #include <ctype.h>
                     22: #include "rogue.h"
                     23:
                     24: #define EFFECTIVE_PURSE ((player.t_ctype==C_PALADIN)?(9 * purse / 10) : purse)
                     25:
                     26: /*
                     27:     do_post()
                     28:         Buy and sell things in a trading post
                     29: */
                     30:
                     31: void
                     32: display_postinfo(void)
                     33: {
                     34:     wclear(hw);
                     35:     wstandout(hw);
                     36:     mvwaddstr(hw, 0, COLS / 2 - 30,
                     37:         "Welcome to Friendly Fiend's Flea Market" );
                     38:     wstandend(hw);
                     39:     wclrtoeol(hw);
                     40:     trans_line();
                     41: }
                     42:
                     43: void
                     44: do_post(void)
                     45: {
                     46:     int bad_letter = FALSE;
                     47:
                     48:     player.t_trans = 0;
                     49:
                     50:     for (;;)
                     51:     {
                     52:         if (!open_market())
                     53:             return;
                     54:
                     55:         display_postinfo();
                     56:
                     57:         if (bad_letter)
                     58:         {
                     59:             bad_letter = FALSE;
                     60:             wstandout(hw);
                     61:             mvwaddstr(hw, 7, 0, "Type 'i' or 'I' to inventory, "
                     62:                                 "'l' to leave, 'b' to buy, or 's' to sell");
                     63:             wstandend(hw);
                     64:         }
                     65:
                     66:         mvwaddstr(hw, 6, 0, "Do you wish to buy, sell, inventory, or leave?");
                     67:         wrefresh(hw);
                     68:
                     69:         switch(readcharw(hw))
                     70:         {
                     71:             case 'b':
                     72:                 mvwaddstr(hw, 7, 0,
                     73:                     "Lets go into the buying section of the store...");
                     74:                 touchwin(hw);
                     75:                 wrefresh(hw);
                     76:                 buy_it('\0', ISNORMAL);
                     77:                 break;
                     78:
                     79:             case 's':
                     80:                 mvwaddstr(hw, 7, 0,
                     81:                     "Lets go into the selling section of the store...");
                     82:                 touchwin(hw);
                     83:                 wrefresh(hw);
                     84:                 sell_it();
                     85:                 break;
                     86:
                     87:             case 'i':
                     88:                 inventory(pack, '*');
                     89:                 break;
                     90:
                     91:             case 'I':
                     92:                 wclear(hw);
                     93:                 wrefresh(hw);
                     94:                 inventory(pack, 0);
                     95:                 msg(" ");
                     96:                 msg("");
                     97:                 break;
                     98:
                     99:             case 'l':
                    100:                 wclear(hw);
                    101:                 wrefresh(hw);
                    102:                 return;
                    103:
                    104:             default:
                    105:                 bad_letter = TRUE;
                    106:                 break;
                    107:         }
                    108:     }
                    109: }
                    110:
                    111: void
                    112: buy_it(char itemtype, int flags)
                    113: {
                    114:     int i;
                    115:     int blessed = flags & ISBLESSED;
                    116:     int cursed = flags & ISCURSED;
                    117:     int is_spell = flags & SCR_MAGIC;
                    118:     int array_size; /* # of items within type */
                    119:     int which_type = 0; /* Which type to buy */
                    120:     int which_one;  /* Which one within type */
                    121:     int plus_or_minus = 0;  /* for magic items */
                    122:     const struct magic_item   *magic_array = NULL;
                    123:     struct linked_list  *item;
                    124:     struct object *obj;
                    125:     char buf[2 * LINELEN];
                    126:
                    127: buy_more:
                    128:
                    129:     display_postinfo();
                    130:
                    131:     do
                    132:     {
                    133:         array_size = 0;
                    134:
                    135:         if (itemtype == '\0')
                    136:         {
                    137:             mpos = 0;
                    138:            wmove(hw,10,0);
                    139:            wclrtoeol(hw);
                    140:             mvwaddstr(hw, 11, 0, "WHAT\tTYPE\n! Potion\n? Scroll\n"
                    141:                                  "= Ring\n/ Stick\n] Armor\n) Weapon\n: Food");
                    142:
                    143:             if (wizard)
                    144:                 mvwaddstr(hw, 19, 0, ", Artifact");
                    145:
                    146:             mvwaddstr(hw, 9, 0, "What type of item do you want? ");
                    147:             wclrtoeol(hw);
                    148:             touchwin(hw);
                    149:             wrefresh(hw);
                    150:             itemtype = readcharw(hw);
                    151:         }
                    152:
                    153:         switch(itemtype)
                    154:         {
                    155:             case POTION:
                    156:                 which_type = TYP_POTION;
                    157:                 array_size = maxpotions;
                    158:                 magic_array = p_magic;
                    159:                 break;
                    160:
                    161:             case SCROLL:
                    162:                 which_type = TYP_SCROLL;
                    163:                 array_size = maxscrolls;
                    164:                 magic_array = s_magic;
                    165:                 break;
                    166:
                    167:             case FOOD:
                    168:                 which_type = TYP_FOOD;
                    169:                 array_size = maxfoods;
                    170:                 magic_array = fd_data;
                    171:                 break;
                    172:
                    173:             case WEAPON:
                    174:                 which_type = TYP_WEAPON;
                    175:                 array_size = maxweapons;
                    176:                 break;
                    177:
                    178:             case ARMOR:
                    179:                 which_type = TYP_ARMOR;
                    180:                 array_size = maxarmors;
                    181:                 break;
                    182:
                    183:             case RING:
                    184:                 which_type = TYP_RING;
                    185:                 array_size = maxrings;
                    186:                 magic_array = r_magic;
                    187:                 break;
                    188:
                    189:             case STICK:
                    190:                 which_type = TYP_STICK;
                    191:                 array_size = maxsticks;
                    192:                 magic_array = ws_magic;
                    193:                 break;
                    194:
                    195:             case ARTIFACT:
                    196:                 if (!wizard)
                    197:                 {
                    198:                     itemtype = '\0';
                    199:                     continue;
                    200:                 }
                    201:
                    202:                 which_type = TYP_ARTIFACT;
                    203:                 array_size = maxartifact;
                    204:                 break;
                    205:
                    206:             case ESCAPE:
                    207:                 return;
                    208:
                    209:             default:
                    210:                 wstandout(hw);
                    211:                 mvwaddstr(hw, 10, 0, "We don't stock any of those.");
                    212:                 wstandend(hw);
                    213:                 itemtype = '\0';
                    214:                 continue;
                    215:         }
                    216:     }
                    217:     while (array_size == 0);
                    218:
                    219:     which_one = array_size;
                    220:
                    221:     do
                    222:     {
                    223:         const struct magic_item   *m_item;
                    224:
                    225:         display_postinfo();
                    226:
                    227:         mpos = 0;
                    228:         sprintf(buf, "Which kind of %s do you wish to have (* for list)? ",
                    229:             things[which_type].mi_name);
                    230:
                    231:         mvwaddstr(hw, 9, 0, buf);
                    232:
                    233:         touchwin(hw);
                    234:         wrefresh(hw);
                    235:         buf[0] = '\0';
                    236:
                    237:         switch (get_string(buf, hw))
                    238:         {
                    239:             case QUIT:
                    240:             case ESCAPE:
                    241:                 itemtype = '\0';
                    242:                 goto buy_more;
                    243:         }
                    244:
                    245:         if (buf[0] == '*')      /* print list */
                    246:         {
                    247:             add_line(" ID  BASECOST NAME");
                    248:
                    249:             switch (which_type)
                    250:             {
                    251:                 case TYP_RING:
                    252:                 case TYP_POTION:
                    253:                 case TYP_STICK:
                    254:                 case TYP_SCROLL:
                    255:                 case TYP_FOOD:
                    256:
                    257:                     for(i=0,m_item=magic_array; i < array_size; i++, m_item++)
                    258:                         if (!is_spell && m_item->mi_worth > 0)
                    259:                         {
                    260:                             sprintf(buf, "%3d) %8ld %s", i, m_item->mi_worth,
                    261:                                 m_item->mi_name);
                    262:                             add_line(buf);
                    263:                         }
                    264:                     break;
                    265:
                    266:                 case TYP_ARMOR:
                    267:                     for (i = 0; i < array_size; i++)
                    268:                         if (!is_spell && armors[i].a_worth > 0)
                    269:                         {
                    270:                             sprintf(buf, "%3d) %8ld %s", i, armors[i].a_worth,
                    271:                                 armors[i].a_name);
                    272:
                    273:                             add_line(buf);
                    274:                         }
                    275:                     break;
                    276:
                    277:                 case TYP_WEAPON:
                    278:                     for (i = 0; i < array_size; i++)
                    279:                         if (!is_spell && weaps[i].w_worth > 0)
                    280:                         {
                    281:                             sprintf(buf, "%3d) %8ld %s", i, weaps[i].w_worth,
                    282:                                 weaps[i].w_name);
                    283:                             add_line(buf);
                    284:                         }
                    285:                     break;
                    286:
                    287:                 case TYP_ARTIFACT:
                    288:                     for (i = 0; i < array_size; i++)
                    289:                     {
                    290:                         sprintf(buf, "%3d) %8d %s", i, arts[i].ar_worth,
                    291:                             arts[i].ar_name);
                    292:                         add_line(buf);
                    293:                     }
                    294:                     break;
                    295:
                    296:                 default:
                    297:                     add_line("What a strange type.");
                    298:             }
                    299:
                    300:             end_line();
                    301:             touchwin(hw);
                    302:             wrefresh(hw);
                    303:             continue;
                    304:         }
                    305:
                    306:         if (isdigit(buf[0]))
                    307:             which_one = atoi(buf);
                    308:         else
                    309:             switch (which_type)
                    310:             {
                    311:                 case TYP_RING:
                    312:                 case TYP_POTION:
                    313:                 case TYP_STICK:
                    314:                 case TYP_SCROLL:
                    315:                 case TYP_FOOD:
                    316:                     for (i=0,m_item=magic_array; i < array_size; i++, m_item++)
                    317:                         if (strcmp(buf, m_item->mi_name) == 0)
                    318:                             which_one = i;
                    319:                     break;
                    320:
                    321:                 case TYP_ARMOR:
                    322:                     for (i = 0; i < array_size; i++)
                    323:                         if (strcmp(buf, armors[i].a_name) == 0)
                    324:                             which_one = i;
                    325:                     break;
                    326:
                    327:                 case TYP_WEAPON:
                    328:                     for (i = 0; i < array_size; i++)
                    329:                         if (strcmp(buf, weaps[i].w_name) == 0)
                    330:                             which_one = i;
                    331:                     break;
                    332:
                    333:                 case TYP_ARTIFACT:
                    334:                     for (i = 0; i < array_size; i++)
                    335:                         if (strcmp(buf, arts[i].ar_name) == 0)
                    336:                             which_one = i;
                    337:                     break;
                    338:
                    339:                 default:
                    340:                     msg("What a strange type.");
                    341:             }
                    342:
                    343:         if (which_one < 0 || which_one >= array_size)
                    344:         {
                    345:             wstandout(hw);
                    346:             mvwaddstr(hw, 10, 0, "Type the name or an ID number.");
                    347:             wstandend(hw);
                    348:         }
                    349:     }
                    350:     while (which_one < 0 || which_one >= array_size);
                    351:
                    352:     item = new_item(sizeof *obj);
                    353:     obj = OBJPTR(item);
                    354:
                    355:     if (which_type == TYP_ARTIFACT)
                    356:     {
                    357:         new_artifact(which_one, obj);
                    358:         add_pack(item, NOMESSAGE);
                    359:         itemtype = '\0';
                    360:         goto buy_more;
                    361:     }
                    362:
                    363:     obj->o_type = itemtype;
                    364:     obj->o_which = which_one;
                    365:     obj->o_mark[0] = '\0';
                    366:     obj->o_group = 0;
                    367:     obj->o_count = 1;
                    368:     obj->o_weight = 0;
                    369:     obj->o_dplus = obj->o_hplus = 0;
                    370:     obj->o_worth = 0;
                    371:
                    372:     if (!is_spell)
                    373:     {
                    374:         plus_or_minus = -100;
                    375:
                    376:         do
                    377:         {
                    378:             mvwaddstr(hw, 10, 0, "Do you want the cursed, blessed, or normal"
                    379:                                  " version? (c, b, n) [n]");
                    380:             touchwin(hw);
                    381:             wrefresh(hw);
                    382:
                    383:            blessed = cursed = FALSE;
                    384:             switch (readcharw(hw))
                    385:             {
                    386:                 case ESCAPE:
                    387:                     discard(item);
                    388:                     itemtype = '\0';
                    389:                     goto buy_more;
                    390:
                    391:                 case 'c':
                    392:                     cursed = TRUE;
                    393:                     plus_or_minus = 0;
                    394:                     break;
                    395:
                    396:                 case 'b':
                    397:                     blessed = TRUE;
                    398:                     plus_or_minus = 0;
                    399:                     break;
                    400:
                    401:                 case 'n':
                    402:                 case ' ':
                    403:                     plus_or_minus = 0;
                    404:                     break;
                    405:
                    406:                 default:
                    407:                     wstandout(hw);
                    408:                     mvwaddstr(hw,11,0,"Type 'c' for cursed, 'b' for blessed, "
                    409:                                       "or 'n' for normal");
                    410:                     wstandend(hw);
                    411:             }
                    412:         }
                    413:         while (plus_or_minus == -100);
                    414:     }
                    415:
                    416:     /* else used blessed, cursed from flags parameter */
                    417:
                    418:     if (which_type == TYP_WEAPON)
                    419:         init_weapon(obj, which_one);
                    420:
                    421:     obj->o_flags |= ISKNOW;
                    422:
                    423:     if (cursed)
                    424:     {
                    425:         plus_or_minus = -(rnd(2) + 1);
                    426:         obj->o_flags |= ISCURSED;
                    427:     }
                    428:     else if (blessed)
                    429:     {
                    430:         plus_or_minus = (rnd(3) + 1);
                    431:         obj->o_flags |= ISBLESSED;
                    432:     }
                    433:     else
                    434:     {
                    435:         plus_or_minus = 0;
                    436:         obj->o_flags |= ISNORMAL;
                    437:     }
                    438:
                    439:     switch (which_type)
                    440:     {
                    441:         case TYP_WEAPON:
                    442:             obj->o_hplus += plus_or_minus;
                    443:             obj->o_dplus += plus_or_minus;
                    444:             break;
                    445:
                    446:         case TYP_ARMOR:
                    447:             obj->o_weight = armors[which_one].a_wght;
                    448:             obj->o_ac = armors[which_one].a_class - plus_or_minus;
                    449:             break;
                    450:
                    451:         case TYP_STICK:
                    452:             fix_stick(obj);
                    453:             break;
                    454:
                    455:         case TYP_RING:
                    456:             obj->o_ac = plus_or_minus;
                    457:             break;
                    458:
                    459:         case TYP_SCROLL:
                    460:         case TYP_POTION:
                    461:             obj->o_weight = things[which_type].mi_wght;
                    462:             break;
                    463:
                    464:         case TYP_FOOD:
                    465:                    break;
                    466:
                    467:         default:
                    468:             msg("That's a strange thing to try to own.");
                    469:                        discard(item);
                    470:             itemtype = '\0';
                    471:             goto buy_more;
                    472:     }
                    473:
                    474:     obj->o_worth = get_worth(obj) * (luck + level / 15 + 1);
                    475:     describe_it(obj);
                    476:
                    477:     if (!wizard && obj->o_worth > EFFECTIVE_PURSE)
                    478:     {
                    479:         wstandout(hw);
                    480:         mvwaddstr(hw, 12, 0, "Unfortunately, you can't afford it.");
                    481:         wstandend(hw);
                    482:         wclrtoeol(hw);
                    483:         touchwin(hw);
                    484:        wrefresh(hw);
                    485:                wait_for(' ');
                    486:                discard(item);
                    487:         itemtype = '\0';
                    488:         goto buy_more;
                    489:     }
                    490:
                    491:     mvwaddstr(hw, 12, 0, "Do you want it? [y] ");
                    492:     wclrtoeol(hw);
                    493:     touchwin(hw);
                    494:     wrefresh(hw);
                    495:
                    496:     switch (readcharw(hw))
                    497:     {
                    498:         case ESCAPE:
                    499:         case 'n':
                    500:             msg("");
                    501:                        discard(item);
                    502:             itemtype = '\0';
                    503:             goto buy_more;
                    504:     }
                    505:
                    506:     /* The hero bought the item here */
                    507:
                    508:     mpos = 0;
                    509:
                    510:     if (add_pack(item, NOMESSAGE) && !is_spell)
                    511:     {
                    512:            if (!wizard)
                    513:                {
                    514:                    purse -= obj->o_worth; /* take his money */
                    515:             ++player.t_trans;
                    516:                }
                    517:
                    518:         trans_line();   /* show remaining deals */
                    519:
                    520:         switch(which_type)
                    521:         {
                    522:             case TYP_RING:
                    523:             case TYP_STICK:
                    524:             case TYP_SCROLL:
                    525:             case TYP_POTION:
                    526:                 know_items[which_type][which_one] = TRUE;
                    527:         }
                    528:     }
                    529: }
                    530:
                    531: /*
                    532:     sell_it()
                    533:         Sell an item to the trading post
                    534: */
                    535:
                    536: void
                    537: sell_it(void)
                    538: {
                    539:     struct object *obj;
                    540:     struct linked_list  *item;
                    541:     char buf[2 * LINELEN];
                    542:
                    543:     wclear(cw);
                    544:
                    545:     if ((item = get_item("sell", 0)) == NULL)
                    546:         return;
                    547:
                    548:     obj = OBJPTR(item);
                    549:     msg("");
                    550:     display_postinfo();
                    551:     touchwin(hw);
                    552:     wrefresh(hw);
                    553:
                    554:     if ((obj->o_type == ARTIFACT) || (obj->o_worth = get_worth(obj)) == 0)
                    555:     {
                    556:         mpos = 0;
                    557:         msg("We don't buy those.");
                    558:
                    559:         if (is_wearing(R_ADORNMENT) && rnd(10) < 4)
                    560:             msg("How about that %s ring instead?", r_stones[R_ADORNMENT]);
                    561:
                    562:         return;
                    563:     }
                    564:
                    565:     describe_it(obj);
                    566:     mvwaddstr(hw, 12, 0, "Do you want to sell it? [n] ");
                    567:     touchwin(hw);
                    568:     wrefresh(hw);
                    569:
                    570:     switch( readcharw(hw) )
                    571:     {
                    572:         case 'y':
                    573:             break;
                    574:         default:
                    575:             msg("");
                    576:             if (is_wearing(R_ADORNMENT))
                    577:                 msg("How about that %s ring instead?",
                    578:                     r_stones[R_ADORNMENT]);
                    579:             return;
                    580:     }
                    581:
                    582:     rem_pack(obj);
                    583:     purse += obj->o_worth; /* give him his money */
                    584:     ++player.t_trans;
                    585:
                    586:     sprintf(buf, "Sold %s.  Hit space to continue.",
                    587:         inv_name(obj, LOWERCASE));
                    588:     discard(item);
                    589:
                    590:     mvwaddstr(hw, 13, 0, buf);
                    591:     touchwin(hw);
                    592:     wrefresh(hw);
                    593:     wait_for(' ');
                    594: }
                    595:
                    596: /*
                    597:     describe_it()
                    598:         Laud or condemn the object
                    599: */
                    600:
                    601: extern char *inv_name();
                    602:
                    603: void
                    604: describe_it(struct object *obj)
                    605: {
                    606:     static char *cursed_d[] =
                    607:     {
                    608:         "worthless hunk of junk",
                    609:         "shoddy piece of trash",
                    610:         "piece of rusty garbage",
                    611:         "example of terrible workmanship",
                    612:         "cheap hack"
                    613:     };
                    614:
                    615:     static char *normal_d[] =
                    616:     {
                    617:         "journeyman's piece",
                    618:         "fine deal",
                    619:         "great bargain",
                    620:         "good find",
                    621:         "real value",
                    622:         "piece of honest workmanship",
                    623:         "steal",
                    624:         "purchase worth making",
                    625:         "inexpensive product"
                    626:     };
                    627:
                    628:     static char *blessed_d[] =
                    629:     {
                    630:         "magnificant masterpiece",
                    631:         "quality product",
                    632:         "exceptional find",
                    633:         "unbeatable value",
                    634:         "rare beauty",
                    635:         "superior product",
                    636:         "well-crafted item"
                    637:     };
                    638:
                    639:     char    *charp;
                    640:     char    buf[2 * LINELEN];
                    641:
                    642:     if (obj->o_flags & ISBLESSED)
                    643:         charp = blessed_d[rnd(sizeof(blessed_d) / sizeof(char *))];
                    644:     else if (obj->o_flags & ISCURSED)
                    645:         charp = cursed_d[rnd(sizeof(cursed_d) / sizeof(char *))];
                    646:     else
                    647:         charp = normal_d[rnd(sizeof(normal_d) / sizeof(char *))];
                    648:
                    649:     sprintf(buf, "It's a%s %s worth %ld pieces of gold.",
                    650:         vowelstr(charp), charp, obj->o_worth);
                    651:
                    652:     mvwaddstr(hw, 10, 0, inv_name(obj, TRUE));
                    653:     mvwaddstr(hw, 11, 0, buf);
                    654:     wclrtoeol(hw);
                    655: }
                    656:
                    657: /*
                    658:     open_market()
                    659:         Retruns TRUE when ok do to transacting
                    660: */
                    661:
                    662: int
                    663: open_market(void)
                    664: {
                    665:     int maxtrans = is_wearing(R_ADORNMENT) ? MAXPURCH + 4 : MAXPURCH;
                    666:
                    667:     if (wizard || player.t_trans < maxtrans || (level == 0))
                    668:         return(TRUE);
                    669:     else
                    670:     {
                    671:         msg("The market is closed. The stairs are that-a-way.");
                    672:         return(FALSE);
                    673:     }
                    674: }
                    675:
                    676: /*
                    677:     get_worth()
                    678:         Calculate an objects worth in gold
                    679: */
                    680:
                    681: int
                    682: get_worth(struct object *obj)
                    683: {
                    684:     long    worth = 0;
                    685:     int wh = obj->o_which;
                    686:     int blessed = obj->o_flags & ISBLESSED;
                    687:     int cursed = obj->o_flags & ISCURSED;
                    688:
                    689:     switch (obj->o_type)
                    690:     {
                    691:         case FOOD:
                    692:             if (wh < maxfoods)
                    693:             {
                    694:                 worth = obj->o_count * fd_data[wh].mi_worth;
                    695:                 if (blessed)
                    696:                     worth *= 2;
                    697:             }
                    698:             break;
                    699:
                    700:         case WEAPON:
                    701:             if (wh < maxweapons)
                    702:             {
                    703:                 worth = weaps[wh].w_worth;
                    704:                 worth *= obj->o_count * (2 +
                    705:                         (4 * obj->o_hplus +
                    706:                         4 * obj->o_dplus));
                    707:
                    708:                 if (obj->o_flags & ISSILVER)
                    709:                     worth *= 2;
                    710:
                    711:                 if (obj->o_flags & ISPOISON)
                    712:                     worth *= 2;
                    713:
                    714:                 if (obj->o_flags & ISZAPPED)
                    715:                     worth += 20 * obj->o_charges;
                    716:             }
                    717:             break;
                    718:
                    719:         case ARMOR:
                    720:             if (wh < maxarmors)
                    721:             {
                    722:                 int plusses = armors[wh].a_class - obj->o_ac;
                    723:
                    724:                 worth = armors[wh].a_worth;
                    725:
                    726:                 if (plusses > 0)
                    727:                     worth *= (1 + (10 *
                    728:                         (armors[wh].a_class - obj->o_ac)));
                    729:             }
                    730:             break;
                    731:
                    732:         case SCROLL:
                    733:             if (wh < maxscrolls)
                    734:                 worth = s_magic[wh].mi_worth;
                    735:             break;
                    736:
                    737:         case POTION:
                    738:             if (wh < maxpotions)
                    739:                 worth = p_magic[wh].mi_worth;
                    740:             break;
                    741:
                    742:         case RING:
                    743:             if (wh < maxrings)
                    744:             {
                    745:                 worth = r_magic[wh].mi_worth;
                    746:                 worth += obj->o_ac * 40;
                    747:             }
                    748:             break;
                    749:
                    750:         case  STICK:
                    751:             if (wh < maxsticks)
                    752:             {
                    753:                 worth = ws_magic[wh].mi_worth;
                    754:                 worth += 20 * obj->o_charges;
                    755:             }
                    756:             break;
                    757:
                    758:         case ARTIFACT:
                    759:             if (wh < maxartifact)
                    760:                 worth = arts[wh].ar_worth;
                    761:             break;
                    762:
                    763:         default:
                    764:             worth = 0;
                    765:     }
                    766:
                    767:     if (obj->o_flags & ISPROT)  /* 300% more for protected */
                    768:         worth *= 3;
                    769:
                    770:     if (blessed)        /* 250% more for blessed */
                    771:         worth = 5 * worth / 2;
                    772:     else if (cursed)    /* half for cursed */
                    773:         worth /= 2;
                    774:
                    775:     if (obj->o_flags & (CANRETURN | ISOWNED))
                    776:         worth *= 4;
                    777:     else if (obj->o_flags & CANRETURN)
                    778:         worth *= 2;
                    779:     else if (obj->o_flags & ISLOST)
                    780:         worth /= 3;
                    781:
                    782:     return(max(0, worth)); /* anything is worth at least one gold piece */
                    783: }
                    784:
                    785: /*
                    786:     trans_line()
                    787:         Show how many transactions the hero has left
                    788: */
                    789:
                    790: void
                    791: trans_line(void)
                    792: {
                    793:     char buf[2 * LINELEN];
                    794:     int adorned = is_wearing(R_ADORNMENT);
                    795:
                    796:     if (level == 0 && purse > 0)
                    797:         sprintf(buf, "You still have %ld pieces of gold left.", purse);
                    798:     else if (purse == 0)
                    799:         sprintf(buf, "You have no money left.");
                    800:     else if (!wizard)
                    801:         sprintf(buf, "You have %d transactions and %ld gold pieces remaining.",
                    802:             max(0, (adorned ? MAXPURCH + 4 : MAXPURCH) - player.t_trans),
                    803:             EFFECTIVE_PURSE);
                    804:     else
                    805:         sprintf(buf, "You have infinite transactions remaining.");
                    806:
                    807:     mvwaddstr(hw, LINES - 2, 0, buf);
                    808: }

CVSweb