home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / games / volume2 / umoria / part13 / store2.c next >
C/C++ Source or Header  |  1987-11-05  |  25KB  |  1,073 lines

  1. #include <stdio.h>
  2. #ifdef USG
  3. #include <string.h>
  4. #else
  5. #include <strings.h>
  6. #endif
  7.  
  8. #include "constants.h"
  9. #include "types.h"
  10. #include "externs.h"
  11.  
  12. #ifdef sun   /* correct SUN stupidity in the stdio.h file */
  13. char *sprintf();
  14. #endif
  15.  
  16. double chr_adj();
  17.  
  18. /* Comments vary...                    -RAK-    */
  19. /* Comment one : Finished haggling                */
  20. prt_comment1()
  21. {
  22.   msg_flag = FALSE;
  23.   switch(randint(14))
  24.     {
  25.     case 1: msg_print("Done!"); break;
  26.     case 2: msg_print("Accepted!"); break;
  27.     case 3: msg_print("Fine..."); break;
  28.     case 4: msg_print("Agreed!"); break;
  29.     case 5: msg_print("Ok..."); break;
  30.     case 6: msg_print("Taken!"); break;
  31.     case 7: msg_print("You drive a hard bargain, but taken..."); break;
  32.     case 8: msg_print("You'll force me bankrupt, but it's a deal..."); break;
  33.     case 9: msg_print("Sigh...  I'll take it..."); break;
  34.     case 10: msg_print("My poor sick children may starve, but done!"); break;
  35.     case 11: msg_print("Finally!  I accept..."); break;
  36.     case 12: msg_print("Robbed again..."); break;
  37.     case 13: msg_print("A pleasure to do business with you!"); break;
  38.     case 14: msg_print("My spouse shall skin me, but accepted."); break;
  39.     }
  40. }
  41.  
  42.  
  43. /* %A1 is offer, %A2 is asking...        */
  44. prt_comment2(offer, asking, final)
  45. int offer, asking, final;
  46. {
  47.   vtype comment;
  48.  
  49.   if (final > 0) 
  50.     switch(randint(3))
  51.       {
  52.       case 1: 
  53.     (void) strcpy(comment,"%A2 is my final offer; take it or leave it...");
  54.     break;
  55.       case 2:
  56.     (void) strcpy(comment, "I'll give you no more than %A2.");
  57.     break;
  58.       case 3:
  59.     (void) strcpy(comment, "My patience grows thin...  %A2 is final.");
  60.     break;
  61.       }
  62.   else
  63.     switch(randint(16))
  64.       {
  65.       case 1:
  66.     (void) strcpy(comment,
  67.               "%A1 for such a fine item?  HA!  No less than %A2.");
  68.     break;
  69.       case 2:
  70.     (void) strcpy(comment, "%A1 is an insult!  Try %A2 gold pieces...");
  71.     break;
  72.       case 3:
  73.     (void) strcpy(comment, 
  74.               "%A1???  Thou would rob my poor starving children?");
  75.     break;
  76.       case 4:
  77.     (void) strcpy(comment, "Why I'll take no less than %A2 gold pieces.");
  78.     break;
  79.       case 5:
  80.     (void) strcpy(comment, "Ha!  No less than %A2 gold pieces.");
  81.     break;
  82.       case 6:
  83.     (void) strcpy(comment, 
  84.               "Thou blackheart!  No less than %A2 gold pieces.");
  85.     break;
  86.       case 7:
  87.     (void) strcpy(comment, "%A1 is far too little, how about %A2?");
  88.     break;
  89.       case 8:
  90.     (void) strcpy(comment, "I paid more than %A1 for it myself, try %A2.");
  91.     break;
  92.       case 9:
  93.     (void) strcpy(comment, 
  94.               "%A1?  Are you mad???  How about %A2 gold pieces?");
  95.     break;
  96.       case 10:
  97.     (void) strcpy(comment,
  98.               "As scrap this would bring %A1.  Try %A2 in gold.");
  99.     break;
  100.       case 11: 
  101.     (void) strcpy(comment,
  102.               "May fleas of a 1000 orcs molest you.  I want %A2.");
  103.     break;
  104.       case 12:
  105.     (void) strcpy(comment,
  106.               "My mother you can get for %A1, this costs %A2.");
  107.     break;
  108.       case 13: 
  109.     (void) strcpy(comment,
  110.               "May your chickens grow lips.  I want %A2 in gold!");
  111.     break;
  112.       case 14:
  113.     (void) strcpy(comment,
  114.               "Sell this for such a pittance.  Give me %A2 gold.");
  115.     break;
  116.       case 15:
  117.     (void) strcpy(comment,
  118.               "May the Balrog find you tasty!  %A2 gold pieces?");
  119.     break;
  120.       case 16:
  121.     (void) strcpy(comment,"Your mother was a Troll!  %A2 or I'll tell...");
  122.     break;
  123.       }
  124.   insert_num(comment, "%A1", offer, FALSE);
  125.   insert_num(comment, "%A2", asking, FALSE);
  126.   msg_print(comment);
  127. }
  128.  
  129.  
  130. prt_comment3(offer, asking, final)
  131.      int offer, asking, final;
  132. {
  133.   vtype comment;
  134.  
  135.   if (final > 0) 
  136.     switch(randint(3))
  137.       {
  138.       case 1:
  139.     (void) strcpy(comment,
  140.               "I'll pay no more than %A1; take it or leave it.");
  141.     break;
  142.       case 2:
  143.     (void) strcpy(comment, "You'll get no more than %A1 from me...");
  144.     break;
  145.       case 3:
  146.     (void) strcpy(comment, "%A1 and that's final.");
  147.     break;
  148.       }
  149.   else
  150.     switch(randint(15))
  151.       {
  152.       case 1:
  153.     (void) strcpy(comment,"%A2 for that piece of junk?  No more than %A1");
  154.     break;
  155.       case 2:
  156.     (void) strcpy(comment, "For %A2 I could own ten of those.  Try %A1.");
  157.     break;
  158.       case 3:
  159.     (void) strcpy(comment, "%A2?  NEVER!  %A1 is more like it...");
  160.     break;
  161.       case 4:
  162.     (void) strcpy(comment,
  163.               "Let's be reasonable... How about %A1 gold pieces?");
  164.     break;
  165.       case 5:
  166.     (void) strcpy(comment, "%A1 gold for that junk, no more...");
  167.     break;
  168.       case 6:
  169.     (void) strcpy(comment, "%A1 gold pieces and be thankful for it!");
  170.     break;
  171.       case 7:
  172.     (void) strcpy(comment, "%A1 gold pieces and not a copper more...");
  173.     break;
  174.       case 8:
  175.     (void) strcpy(comment, "%A2 gold?  HA!  %A1 is more like it...");
  176.     break;
  177.       case 9:
  178.     (void) strcpy(comment, "Try about %A1 gold...");
  179.     break;
  180.       case 10:
  181.     (void) strcpy(comment,
  182.               "I wouldn't pay %A2 for your children, try %A1.");
  183.     break;
  184.       case 11:
  185.     (void) strcpy(comment, "*CHOKE* For that!?  Let's say %A1.");
  186.     break;
  187.       case 12:
  188.     (void) strcpy(comment, "How about %A1.");
  189.     break;
  190.       case 13:
  191.     (void) strcpy(comment, "That looks war surplus!  Say %A1 gold.");
  192.     break;
  193.       case 14:
  194.     (void) strcpy(comment, "I'll buy it as scrap for %A1.");
  195.     break;
  196.       case 15:
  197.     (void) strcpy(comment, "%A2 is too much, let us say %A1 gold.");
  198.     break;
  199.       }
  200.   insert_num(comment, "%A1", offer, FALSE);
  201.   insert_num(comment, "%A2", asking, FALSE);
  202.   msg_print(comment);
  203. }
  204.  
  205.  
  206. /* Kick 'da bum out...                    -RAK-    */
  207. prt_comment4()
  208. {
  209.   msg_flag = FALSE;
  210.   switch(randint(5))
  211.     {
  212.     case 1:
  213.       msg_print("ENOUGH!  Thou hath abused me once too often!");
  214.       msg_print("Out of my place!");
  215.       msg_print(" ");
  216.       break;
  217.     case 2:
  218.       msg_print("THAT DOES IT!  You shall waste my time no more!");
  219.       msg_print("out... Out... OUT!!!");
  220.       msg_print(" ");
  221.       break;
  222.     case 3:
  223.       msg_print("This is getting no where...  I'm going home!");
  224.       msg_print("Come back tomorrow...");
  225.       msg_print(" ");
  226.       break;
  227.     case 4:
  228.       msg_print("BAH!  No more shall you insult me!");
  229.       msg_print("Leave my place...  Begone!");
  230.       msg_print(" ");
  231.       break;
  232.     case 5:
  233.       msg_print("Begone!  I have had enough abuse for one day.");
  234.       msg_print("Come back when thou art richer...");
  235.       msg_print(" ");
  236.       break;
  237.     }
  238.   msg_flag = FALSE;
  239. }
  240.  
  241.  
  242. prt_comment5()
  243. {
  244.   switch(randint(10))
  245.     {
  246.     case 1: msg_print("You will have to do better than that!"); break;
  247.     case 2: msg_print("That's an insult!"); break;
  248.     case 3: msg_print("Do you wish to do business or not?"); break;
  249.     case 4: msg_print("Hah!  Try again..."); break;
  250.     case 5: msg_print("Ridiculous!"); break;
  251.     case 6: msg_print("You've got to be kidding!"); break;
  252.     case 7: msg_print("You better be kidding!!"); break;
  253.     case 8: msg_print("You try my patience."); break;
  254.     case 9: msg_print("I don't hear you."); break;
  255.     case 10: msg_print("Hmmm, nice weather we're having..."); break;
  256.     }
  257. }
  258.  
  259.  
  260. prt_comment6()
  261. {
  262.   switch(randint(5))
  263.     {
  264.     case 1: msg_print("I must of heard you wrong..."); break;
  265.     case 2: msg_print("What was that?"); break;
  266.     case 3: msg_print("I'm sorry, say that again..."); break;
  267.     case 4: msg_print("What did you say?"); break;
  268.     case 5: msg_print("Sorry, what was that again?"); break;
  269.     }
  270. }
  271.  
  272.  
  273. /* Displays the set of commands                -RAK-    */
  274. display_commands()
  275. {
  276.   prt("You may:", 20, 0);
  277.   prt(" p) Purchase an item.           b) Browse store's inventory.", 21, 0);
  278.   prt(" s) Sell an item.               i) Inventory and Equipment Lists.",
  279.       22, 0);
  280.   prt("ESC) Exit from Building.       ^R) Redraw the screen.", 23, 0);
  281. }
  282.  
  283.  
  284. /* Displays the set of commands                -RAK-    */
  285. haggle_commands(typ)
  286. int typ;
  287. {
  288.   if (typ == -1) 
  289.     prt("Specify an asking-price in gold pieces.", 21, 0);
  290.   else
  291.     prt("Specify an offer in gold pieces.", 21, 0);
  292.   prt("ESC) Quit Haggling.", 22, 0);
  293.   prt("", 23, 0);
  294. }
  295.  
  296.  
  297. /* Displays a store's inventory                -RAK-    */
  298. display_inventory(store_num, start)
  299. int store_num, start;
  300. {
  301.   int i, j, stop;
  302.   vtype out_val1, out_val2;
  303.   store_type *s_ptr;
  304.   treasure_type *i_ptr;
  305.  
  306.   s_ptr = &store[store_num];
  307.   i = (start % 12);
  308.   stop = ((start / 12) + 1) * 12;
  309.   if (stop > s_ptr->store_ctr)  stop = s_ptr->store_ctr;
  310.   while (start < stop)
  311.     {
  312.       inventory[INVEN_MAX] = s_ptr->store_inven[start].sitem;
  313.       i_ptr = &inventory[INVEN_MAX];
  314.       if ((i_ptr->subval > 255) && (i_ptr->subval < 512)) 
  315.     i_ptr->number = 1;
  316.       objdes(out_val1, INVEN_MAX, TRUE);
  317.       (void) sprintf(out_val2, "%c) %s", 97+i, out_val1);
  318.       prt(out_val2, i+6, 0);
  319.       if (s_ptr->store_inven[start].scost <= 0) 
  320.     {
  321.       j = abs(s_ptr->store_inven[start].scost);
  322.       j += (j * chr_adj());
  323.       if (j <= 0)
  324.         j = 1;
  325.       (void) sprintf(out_val2, "%9d", j);
  326.     }
  327.       else
  328.     (void) sprintf(out_val2,"%9d [Fixed]",s_ptr->store_inven[start].scost);
  329.       prt(out_val2, i+6, 59);
  330.       i++;
  331.       start++;
  332.     }
  333.   if (i < 12)
  334.     for (j = 0; j < (11 - i + 1); j++)
  335.       prt("", j+i+6, 0);
  336. }
  337.  
  338.  
  339. /* Re-displays only a single cost            -RAK-    */
  340. display_cost(store_num, pos)
  341. int store_num, pos;
  342. {
  343.   int i, j;
  344.   vtype out_val;
  345.   store_type *s_ptr;
  346.  
  347.   s_ptr = &store[store_num];
  348.   i = (pos % 12);
  349.   if (s_ptr->store_inven[pos].scost < 0) 
  350.     {
  351.       j = abs(s_ptr->store_inven[pos].scost);
  352.       j += (j*chr_adj());
  353.       (void) sprintf(out_val, "%d", j);
  354.     }
  355.   else
  356.     (void) sprintf(out_val, "%9d [Fixed]", s_ptr->store_inven[pos].scost);
  357.   prt(out_val, i+6, 59);
  358. }
  359.  
  360.  
  361. /* Displays players gold                    -RAK-    */
  362. store_prt_gold()
  363. {
  364.   vtype out_val;
  365.  
  366.   (void) sprintf(out_val, "Gold Remaining : %d", py.misc.au);
  367.   prt(out_val, 18, 17);
  368. }
  369.  
  370.  
  371. /* Displays store                    -RAK-    */
  372. display_store(store_num, cur_top)
  373. int store_num, cur_top;
  374. {
  375.   store_type *s_ptr;
  376.  
  377.   s_ptr = &store[store_num];
  378.   really_clear_screen();
  379.   prt(owners[s_ptr->owner].owner_name, 3, 9);
  380.   prt("   Item", 4, 0);
  381.   prt("Asking Price", 4, 60);
  382.   store_prt_gold();
  383.   display_commands();
  384.   display_inventory(store_num, cur_top);
  385. }
  386.  
  387.  
  388. /* Get the ID of a store item and return it's value    -RAK-    */
  389. int get_store_item(com_val, pmt, i, j)
  390. int *com_val;
  391. char *pmt;
  392. int i, j;
  393. {
  394.   char command;
  395.   vtype out_val;
  396.   int flag;
  397.  
  398.   *com_val = -1;
  399.   flag = TRUE;
  400.   (void) sprintf(out_val, "(Items %c-%c, ESC to exit) %s", i+97, j+97, pmt);
  401.   while (((*com_val < i) || (*com_val > j)) && (flag))
  402.     {
  403.       prt(out_val, 0, 0);
  404.       inkey(&command);
  405.       *com_val = (command);
  406.       switch(*com_val)
  407.     {
  408.     case 0: case 27: flag = FALSE; break;
  409.     default: *com_val = *com_val - 97; break;
  410.     }
  411.     }
  412.   msg_flag = FALSE;
  413.   erase_line(msg_line, msg_line);
  414.   return(flag);
  415. }
  416.  
  417.  
  418. /* Increase the insult counter and get pissed if too many -RAK-    */
  419. int increase_insults(store_num)
  420. int store_num;
  421. {
  422.   int increase;
  423.   store_type *s_ptr;
  424.  
  425.   increase = FALSE;
  426.   s_ptr = &store[store_num];
  427.   s_ptr->insult_cur++;
  428.   if (s_ptr->insult_cur > owners[s_ptr->owner].insult_max) 
  429.     {
  430.       prt_comment4();
  431.       s_ptr->insult_cur = 0;
  432.       s_ptr->store_open = turn + 2500 + randint(2500);
  433.       increase = TRUE;
  434.     }
  435.   return(increase);
  436. }
  437.  
  438.  
  439. /* Decrease insults                    -RAK-    */
  440. decrease_insults(store_num)
  441. int store_num;
  442. {
  443.   store_type *s_ptr;
  444.  
  445.   s_ptr = &store[store_num];
  446.   s_ptr->insult_cur -= 2;
  447.   if (s_ptr->insult_cur < 0)  s_ptr->insult_cur = 0;
  448. }
  449.  
  450.  
  451. /* Have insulted while haggling                -RAK-    */
  452. int haggle_insults(store_num)
  453. int store_num;
  454. {
  455.   int haggle;
  456.  
  457.   haggle = FALSE;
  458.   if (increase_insults(store_num)) 
  459.     haggle = TRUE;
  460.   else
  461.     prt_comment5();
  462.   return(haggle);
  463. }
  464.  
  465.  
  466. int get_haggle(comment, num)
  467. char *comment;
  468. int *num;
  469. {
  470.   int i, clen;
  471.   vtype out_val;
  472.   int flag;
  473.  
  474.   flag = TRUE;
  475.   i = 0;
  476.   clen = strlen(comment);
  477.   do
  478.     {
  479.       msg_print(comment);
  480.       msg_flag = FALSE;
  481.       if (!get_string(out_val, 0, clen, 40)) 
  482.     {
  483.       flag = FALSE;
  484.       erase_line(msg_line, msg_line);
  485.     }
  486.       (void) sscanf(out_val, "%d", &i);
  487.     }
  488.   while ((i <= 0) && (flag));
  489.   if (flag)  *num = i;
  490.   return(flag);
  491. }
  492.  
  493.  
  494. int receive_offer(store_num, comment, new_offer, last_offer, factor)
  495. int store_num;
  496. char *comment;
  497. int *new_offer;
  498. int last_offer, factor;
  499. {
  500.   int flag;
  501.   int receive;
  502.  
  503.   receive = 0;
  504.   flag = FALSE;
  505.   do
  506.     {
  507.       if (get_haggle(comment, new_offer)) 
  508.     {
  509.       if (*new_offer*factor >= last_offer*factor)  
  510.         flag = TRUE;
  511.       else if (haggle_insults(store_num)) 
  512.         {
  513.           receive = 2;
  514.           flag = TRUE;
  515.         }
  516.     }
  517.       else
  518.     {
  519.       receive = 1;
  520.       flag = TRUE;
  521.     }
  522.     }
  523.   while (!flag);
  524.   return(receive);
  525. }
  526.  
  527.  
  528. /* Haggling routine                    -RAK-    */
  529. int purchase_haggle(store_num, price, item)
  530. int store_num;
  531. int *price;
  532. treasure_type item;
  533. {
  534.   int max_sell, min_sell, max_buy;
  535.   int cost, cur_ask, final_ask, min_offer;
  536.   int last_offer, new_offer, final_flag, x3;
  537.   double x1, x2;
  538.   double min_per, max_per;
  539.   int flag, loop_flag;
  540.   vtype out_val, comment;
  541.   int purchase;
  542.   store_type *s_ptr;
  543.   owner_type *o_ptr;
  544.  
  545.   flag = FALSE;
  546.   purchase = 0;
  547.   *price = 0;
  548.   final_flag = 0;
  549.   msg_flag = FALSE;
  550.   s_ptr = &store[store_num];
  551.   o_ptr = &owners[s_ptr->owner];
  552.   cost = sell_price(store_num, &max_sell, &min_sell, item);
  553.   max_sell = max_sell + (max_sell*chr_adj());
  554.   if (max_sell <= 0)  max_sell = 1;
  555.   min_sell = min_sell + (min_sell*chr_adj());
  556.   if (min_sell <= 0)  min_sell = 1;
  557.   max_buy  = (cost*(1-o_ptr->max_inflate));
  558.   min_per  = o_ptr->haggle_per;
  559.   max_per  = min_per*3.0;
  560.   haggle_commands(1);
  561.   cur_ask   = max_sell;
  562.   final_ask = min_sell;
  563.   min_offer = max_buy;
  564.   last_offer = min_offer;
  565.   (void) strcpy(comment, "Asking : ");
  566.   do
  567.     {
  568.       do
  569.     {
  570.       loop_flag = TRUE;
  571.       (void) sprintf(out_val, "%s %d", comment, cur_ask);
  572.       put_buffer(out_val, 1, 0);
  573.       switch(receive_offer(store_num, "What do you offer? ", 
  574.                  &new_offer, last_offer, 1))
  575.         {
  576.         case 1:
  577.           purchase = 1;
  578.           flag   = TRUE;
  579.           break;
  580.         case 2:
  581.           purchase = 2;
  582.           flag   = TRUE;
  583.           break;
  584.         default:
  585.           if (new_offer > cur_ask) 
  586.         {
  587.           prt_comment6();
  588.         }
  589.           else if (new_offer == cur_ask) 
  590.         {
  591.           flag = TRUE;
  592.           *price = new_offer;
  593.         }
  594.           else
  595.         loop_flag = FALSE;
  596.         }
  597.     }
  598.       while (!flag && loop_flag);
  599.       if (!flag) 
  600.     {
  601.       x1 = (double)(new_offer - last_offer)/(double)(cur_ask - last_offer);
  602.       if (x1 < min_per) 
  603.         {
  604.           flag = haggle_insults(store_num);
  605.           if (flag)  purchase = 2;
  606.         }
  607.       else
  608.         {
  609.           if (x1 > max_per)  
  610.         {
  611.           x1 = x1*0.75;
  612.           if (x1 < max_per)  x1 = max_per;
  613.         }
  614.         }
  615.       x2 = (x1 + (randint(5) - 3)/100.0);
  616.       x3 = ((cur_ask-new_offer)*x2) + 1;
  617.       cur_ask -= x3;
  618.       if (cur_ask < final_ask) 
  619.         {
  620.           cur_ask = final_ask;
  621.           (void) strcpy(comment, "Final Offer : ");
  622.           final_flag++;
  623.           if (final_flag > 3) 
  624.         {
  625.           if (increase_insults(store_num)) 
  626.             purchase = 2;
  627.           else
  628.             purchase = 1;
  629.           flag = TRUE;
  630.         }
  631.         }
  632.       else if (new_offer >= cur_ask) 
  633.         {
  634.           flag = TRUE;
  635.           *price = new_offer;
  636.         }
  637.       if (!flag) 
  638.         {
  639.           last_offer = new_offer;
  640.           prt("", 1, 0);
  641.           (void) sprintf(out_val, "Your last offer : %d", last_offer);
  642.           put_buffer(out_val, 1, 39);
  643.           prt_comment2(last_offer, cur_ask, final_flag);
  644.         }
  645.     }
  646.     }
  647.   while (!flag);
  648.   prt("", 1, 0);
  649.   display_commands();
  650.   return(purchase);
  651. }
  652.  
  653.  
  654. /* Haggling routine                    -RAK-    */
  655. int sell_haggle(store_num, price, item)
  656. int store_num;
  657. int *price;
  658. treasure_type item;
  659. {
  660.   int max_sell, max_buy, min_buy;
  661.   int cost, cur_ask, final_ask, min_offer;
  662.   int last_offer, new_offer, final_flag, x3;
  663.   int max_gold;
  664.   double x1, x2;
  665.   double min_per, max_per;
  666.   int flag, loop_flag;
  667.   vtype comment, out_val;
  668.   store_type *s_ptr;
  669.   owner_type *o_ptr;
  670.   int sell;
  671.  
  672.   flag = FALSE;
  673.   sell = 0;
  674.   *price = 0;
  675.   final_flag = 0;
  676.   msg_flag = FALSE;
  677.   s_ptr = &store[store_num];
  678.   cost = item_value(item);
  679.   if (cost < 1) 
  680.     {
  681.       sell = 3;
  682.       flag = TRUE;
  683.     }
  684.   else
  685.     {
  686.       o_ptr = &owners[s_ptr->owner];
  687.       cost += -(cost*chr_adj()) -
  688.            (cost*rgold_adj[o_ptr->owner_race][py.misc.prace]);
  689.       if (cost < 1)  cost = 1;
  690.       max_sell = (cost*(1+o_ptr->max_inflate));
  691.       max_buy  = (cost*(1-o_ptr->max_inflate));
  692.       min_buy  = (cost*(1-o_ptr->min_inflate));
  693.       if (min_buy < 1) min_buy = 1;
  694.       if (max_buy < 1) max_buy = 1;
  695.       if (min_buy < max_buy)  min_buy = max_buy;
  696.       min_per  = o_ptr->haggle_per;
  697.       max_per  = min_per*3.0;
  698.       max_gold = o_ptr->max_cost;
  699.     }
  700.   if (!flag) 
  701.     {
  702.       haggle_commands(-1);
  703.       if (max_buy > max_gold) 
  704.     {
  705.       final_flag= 1;
  706.       (void) strcpy(comment, "Final offer : ");
  707.       cur_ask   = max_gold;
  708.       final_ask = max_gold;
  709.  msg_print("I am sorry, but I have not the money to afford such a fine item.");
  710.       msg_print(" ");
  711.     }
  712.       else
  713.     {
  714.       cur_ask   = max_buy;
  715.       final_ask = min_buy;
  716.       if (final_ask > max_gold) 
  717.         final_ask = max_gold;
  718.       (void) strcpy(comment, "Offer : ");
  719.     }
  720.       min_offer = max_sell;
  721.       last_offer = min_offer;
  722.       if (cur_ask < 1)  cur_ask = 1;
  723.       do
  724.     {
  725.       do
  726.         {
  727.           loop_flag = TRUE;
  728.           (void) sprintf(out_val, "%s %d", comment, cur_ask);
  729.           put_buffer(out_val, 1, 0);
  730.           switch(receive_offer(store_num, "What price do you ask? ", 
  731.                  &new_offer, last_offer, -1))
  732.         {
  733.         case 1:
  734.           sell = 1;
  735.           flag   = TRUE;
  736.           break;
  737.         case 2:
  738.           sell = 2;
  739.           flag   = TRUE;
  740.           break;
  741.         default:
  742.           if (new_offer < cur_ask) 
  743.             {
  744.               prt_comment6();
  745.             }
  746.           else if (new_offer == cur_ask) 
  747.             {
  748.               flag = TRUE;
  749.               *price = new_offer;
  750.             }
  751.           else
  752.             loop_flag = FALSE;
  753.             }
  754.         }
  755.       while (!flag && loop_flag);
  756.       if (!flag) 
  757.         {
  758.           msg_flag = FALSE;
  759.           x1 = (double)(last_offer - new_offer)/
  760.         (double)(last_offer - cur_ask);
  761.           if (x1 < min_per) 
  762.         {
  763.           flag = haggle_insults(store_num);
  764.           if (flag)  sell = 2;
  765.         }
  766.           else
  767.         {
  768.           if (x1 > max_per)  
  769.             {
  770.               x1 *= 0.75;
  771.               if (x1 < max_per)  x1 = max_per;
  772.             }
  773.         }
  774.           x2 = (x1 + (randint(5) - 3)/100.0);
  775.           x3 = ((new_offer-cur_ask)*x2) + 1;
  776.           cur_ask += x3;
  777.           if (cur_ask > final_ask) 
  778.         {
  779.           cur_ask = final_ask;
  780.           (void) strcpy(comment, "Final Offer : ");
  781.           final_flag++;
  782.           if (final_flag > 3) 
  783.             {
  784.               if (increase_insults(store_num)) 
  785.             sell = 2;
  786.               else
  787.             sell = 1;
  788.               flag = TRUE;
  789.             }
  790.         }
  791.           else if (new_offer <= cur_ask) 
  792.         {
  793.           flag = TRUE;
  794.           *price = new_offer;
  795.         }
  796.           if (!flag) 
  797.         {
  798.           last_offer = new_offer;
  799.           prt("", 1, 0);
  800.           (void) sprintf(out_val, "Your last bid %d", last_offer);
  801.           put_buffer(out_val, 1, 39);
  802.           prt_comment3(cur_ask, last_offer, final_flag);
  803.         }
  804.         }
  805.     }
  806.       while (!flag);
  807.       prt("", 1, 0);
  808.       display_commands();
  809.     }
  810.   return(sell);
  811. }
  812.  
  813.  
  814. /* Buy an item from a store                -RAK-    */
  815. int store_purchase(store_num, cur_top)
  816. int store_num;
  817. int *cur_top;
  818. {
  819.   int i, item_val, price;
  820.   int item_new, choice;
  821.   int save_number;
  822.   vtype out_val, tmp_str;
  823.   store_type *s_ptr;
  824.   treasure_type *i_ptr;
  825.   inven_record *r_ptr;
  826.   int purchase;
  827.   
  828.   purchase = FALSE;
  829.   s_ptr = &store[store_num];
  830.   /* i == number of objects shown on screen    */
  831.   if (*cur_top == 12) 
  832.     i = s_ptr->store_ctr - 1 - 12;
  833.   else if (s_ptr->store_ctr > 11) 
  834.     i = 12;
  835.   else
  836.     i = s_ptr->store_ctr - 1;
  837.   if (s_ptr->store_ctr < 1) 
  838.     msg_print("I am currently out of stock.");
  839.       /* Get the item number to be bought        */
  840.   else if (get_store_item(&item_val, 
  841.               "Which item are you interested in? ", 0, i)) 
  842.     {
  843.       item_val = item_val + *cur_top;    /* TRUE item_val    */
  844.       inventory[INVEN_MAX] = s_ptr->store_inven[item_val].sitem;
  845.       i_ptr = &inventory[INVEN_MAX];
  846.       if ((i_ptr->subval > 255) && (i_ptr->subval < 512)) 
  847.     {
  848.       save_number = i_ptr->number;
  849.       i_ptr->number = 1;
  850.     }
  851.       else
  852.     save_number = 1;
  853.       if (inven_check_weight()) 
  854.     if (inven_check_num()) 
  855.       {
  856.         if (s_ptr->store_inven[item_val].scost > 0) 
  857.           {
  858.         price = s_ptr->store_inven[item_val].scost;
  859.         choice = 0;
  860.           }
  861.         else
  862.           choice = purchase_haggle(store_num, &price,
  863.                        inventory[INVEN_MAX]);
  864.         switch(choice)
  865.           {
  866.           case 0:
  867.         if (py.misc.au >= price) 
  868.           {
  869.             prt_comment1();
  870.             decrease_insults(store_num);
  871.             py.misc.au -= price;
  872.             store_destroy(store_num, item_val, TRUE);
  873.             inven_carry(&item_new);
  874.             objdes(tmp_str, item_new, TRUE);
  875.             (void) sprintf(out_val, "You have %s (%c)",
  876.                    tmp_str, item_new+97);
  877.             msg_print(out_val);
  878.             if (*cur_top >= s_ptr->store_ctr) 
  879.               {
  880.             *cur_top = 0;
  881.             display_inventory(store_num, *cur_top);
  882.               }
  883.             else
  884.               {
  885.             r_ptr = &s_ptr->store_inven[item_val];
  886.             if (save_number > 1) 
  887.               {
  888.                 if (r_ptr->scost < 0) 
  889.                   {
  890.                 r_ptr->scost = price;
  891.                 display_cost(store_num, item_val);
  892.                   }
  893.               }
  894.             else
  895.               display_inventory(store_num, item_val);
  896.             store_prt_gold();
  897.               }
  898.           }
  899.         else
  900.           {
  901.             if (increase_insults(store_num)) 
  902.               purchase = TRUE;
  903.             else
  904.               {
  905.             prt_comment1();
  906.             msg_print("Liar!  You have not the gold!");
  907.               }
  908.           }
  909.         break;
  910.           case 2:
  911.         purchase = TRUE;
  912.         break;
  913.           default:
  914.         break;
  915.           }
  916.         prt("", 1, 0);
  917.       }
  918.     else
  919.       prt("You cannot carry that many different items.", 0, 0);
  920.       else
  921.     prt("You can not carry that much weight.", 0, 0);
  922.     }
  923.   return(purchase);
  924. }
  925.  
  926.  
  927. /* Sell an item to the store                -RAK-    */
  928. int store_sell(store_num, cur_top)
  929. int store_num, cur_top;
  930. {
  931.   int item_val;
  932.   int item_pos, price;
  933.   int redraw;
  934.   vtype out_val, tmp_str;
  935.   treasure_type *i_ptr;
  936.   int sell;
  937.  
  938.   sell = FALSE;
  939.   redraw = FALSE;
  940.   if (get_item(&item_val, "Which one? ", &redraw, 0, inven_ctr-1)) 
  941.     {
  942.       if (redraw)  display_store(store_num, cur_top);
  943.       inventory[INVEN_MAX] = inventory[item_val];
  944.       i_ptr = &inventory[INVEN_MAX];
  945.       if ((i_ptr->subval > 255) && (i_ptr->subval < 512)) 
  946.     i_ptr->number = 1;
  947.       objdes(tmp_str, INVEN_MAX, TRUE);
  948.       (void) sprintf(out_val, "Selling %s (%c)", tmp_str, item_val+97);
  949.       msg_print(out_val);
  950.       msg_print(" ");
  951.       if ((store_buy[store_num])(inventory[INVEN_MAX].tval))
  952.     if (store_check_num(store_num)) 
  953.       switch(sell_haggle(store_num, &price, inventory[INVEN_MAX]))
  954.         {
  955.         case 0:
  956.           prt_comment1();
  957.           py.misc.au += price;
  958.           inven_destroy(item_val);
  959.           store_carry(store_num, &item_pos);
  960.           if (item_pos >= 0) 
  961.         if (item_pos < 12) 
  962.           if (cur_top < 12) 
  963.             display_inventory(store_num, item_pos);
  964.           else
  965.             display_inventory(store_num, cur_top);
  966.         else if (cur_top > 11) 
  967.           display_inventory(store_num, item_pos);
  968.           store_prt_gold();
  969.           break;
  970.         case 2:
  971.           sell = TRUE;
  972.           break;
  973.         case 3:
  974.           msg_print("How dare you!");
  975.           msg_print("I will not buy that!");
  976.           sell = increase_insults(store_num);
  977.           break;
  978.         default:
  979.           break;
  980.         }
  981.     else
  982.       prt("I have not the room in my store to keep it...", 0, 0);
  983.       else
  984.     prt("I do not buy such items.", 0, 0);
  985.     }
  986.   else if (redraw) 
  987.     display_store(store_num, cur_top);
  988.   return(sell);
  989. }
  990.  
  991.  
  992. /* Entering a store                    -RAK-    */
  993. enter_store(store_num)
  994. int store_num;
  995. {
  996.   int com_val, cur_top;
  997.   char command;
  998.   int exit_flag;
  999.   store_type *s_ptr;
  1000.  
  1001.   s_ptr = &store[store_num];
  1002.   if (s_ptr->store_open < turn) 
  1003.     {
  1004.       exit_flag = FALSE;
  1005.       cur_top = 0;
  1006.       display_store(store_num, cur_top);
  1007.       do
  1008.     {
  1009.       if (get_com("", &command)) 
  1010.         {
  1011.           msg_flag = FALSE;
  1012.           com_val = (command);
  1013.           switch(com_val)
  1014.         {
  1015.         case 18:
  1016.           display_store(store_num, cur_top);
  1017.           break;
  1018.         case 98:
  1019.           if (cur_top == 0) 
  1020.             if (s_ptr->store_ctr > 12) 
  1021.               {
  1022.             cur_top = 12;
  1023.             display_inventory(store_num, cur_top);
  1024.               }
  1025.             else
  1026.               prt("Entire inventory is shown.", 0, 0);
  1027.           else
  1028.             {
  1029.               cur_top = 0;
  1030.               display_inventory(store_num, cur_top);
  1031.             }
  1032.           break;
  1033.         case 101:      /* Equipment List    */
  1034.           if (inven_command('e', 0, 0)) 
  1035.             display_store(store_num, cur_top);
  1036.           break;
  1037.         case 105:      /* Inventory        */
  1038.           if (inven_command('i', 0, 0)) 
  1039.             display_store(store_num, cur_top);
  1040.           break;
  1041.         case 116:      /* Take off        */
  1042.           if (inven_command('t', 0, 0)) 
  1043.             display_store(store_num, cur_top);
  1044.           break;
  1045.         case 119:    /* Wear            */
  1046.           if (inven_command('w', 0, 0)) 
  1047.             display_store(store_num, cur_top);
  1048.           break;
  1049.         case 120:     /* Switch weapon        */
  1050.           if (inven_command('x', 0, 0)) 
  1051.             display_store(store_num, cur_top);
  1052.           break;
  1053.         case 112:
  1054.           exit_flag = store_purchase(store_num, &cur_top);
  1055.           break;
  1056.         case 115:
  1057.           exit_flag = store_sell(store_num, cur_top);
  1058.           break;
  1059.         default:
  1060.           prt("Invalid Command.", 0, 0);
  1061.           break;
  1062.         }
  1063.         }
  1064.       else
  1065.         exit_flag = TRUE;
  1066.     }
  1067.       while (!exit_flag);
  1068.       draw_cave();
  1069.     }
  1070.   else
  1071.     msg_print("The doors are locked.");
  1072. }
  1073.