home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / games / volume5 / omega2 / part07 / osite1.c < prev   
C/C++ Source or Header  |  1988-07-25  |  28KB  |  1,079 lines

  1. /* omega copyright (C) by Laurence Raphael Brothers, 1987,1988 */
  2. /* osite1.c */
  3. /* 1st half of site functions and aux functions to them */
  4.  
  5. #include "oglob.h"
  6.  
  7. /* the bank; can be broken into (!) */
  8. void l_bank()
  9. {
  10.   int done=FALSE,valid=FALSE,amount;
  11.   char response;
  12.   char passwd[64];
  13.   print1("First Bank of Omega: Autoteller Carrel.");
  14.  
  15.   if (gamestatusp(BANK_BROKEN))
  16.     print2("You see a damaged autoteller.");
  17.   else {
  18.     print2("The proximity sensor activates the autoteller as you approach.");
  19.     morewait();
  20.     while (! done) {
  21.       clearmsg1();
  22.       print1("Current Balance: ");
  23.       mnumprint(Balance);
  24.       nprint1("Au. ");
  25.       nprint1(" Enter command > ");
  26.       response = mgetc();
  27.       if (response == '?') {
  28.     menuclear();
  29.     menuprint("?: This List.\n");
  30.     if (strcmp(Password,"")==0)
  31.       menuprint("O: Open an account.\n");
  32.     else {
  33.       menuprint("P: Enter password.\n");
  34.       menuprint("D: Deposit.\n");
  35.       menuprint("W: Withdraw\n");
  36.     }
  37.     menuprint("X: eXit\n");
  38.     morewait();
  39.     xredraw();
  40.       }
  41.       else if ((response == 'P') && (strcmp(Password,"") != 0)) {
  42.     clearmsg();
  43.     print1("Password: ");
  44.     strcpy(passwd,msgscanstring());
  45.     valid = (strcmp(passwd,Password)==0);
  46.     if (! valid) {
  47.       done = TRUE;
  48.       menuclear();
  49.       menuprint("Alert! Alert! Invalid Password!\n");
  50.       menuprint("The police are being summoned!\n");
  51.       menuprint("Please wait for the police to arrive....\n\n");
  52.       menuprint("----Hit space bar to continue----\n");
  53.       response = menugetc();
  54.       if (response == SPACE) {
  55.         Player.alignment += 5;
  56.         xredraw();
  57.         print1("Ah ha! Trying to rob the bank, eh?");
  58.         print2("Take him away, boys!");
  59.         morewait();
  60.         send_to_jail();
  61.       }
  62.       else {
  63.         Player.alignment -= 5;
  64.         menuclear();
  65.         sleep(2);
  66.         menuprint("^@^@^@^@^@00AD1203BC0F0000FFFFFFFFFFFF\n");
  67.         menuprint("Interrupt in _get_space. Illegal Character.\n");
  68.         sleep(2);
  69.         menuprint("Aborting _police_alert.....\n");
  70.         menuprint("Attempting reboot.....\n");
  71.         sleep(2);
  72.         menuprint("Warning: Illegal shmop at _count_cash.\n");
  73.         menuprint("Warning: Command Buffer NOT CLEARED\n");
  74.         sleep(2);
  75.         menuprint("Reboot Complete. Execution Continuing.\n");
  76.         menuprint("Withdrawing: 4294967297 Au.\n");
  77.         menuprint("Warning: Arithmetic Overflow in _withdraw\n");
  78.         sleep(2);
  79.         menuprint("Yo mama. Core dumped.\n");
  80.         sleep(2);
  81.         xredraw();
  82.         clearmsg();
  83.         print1("The cash machine begins to spew gold pieces!");
  84.         print2("You pick up your entire balance and then some!");
  85.         Player.cash += Balance + 1000 + random_range(3000);
  86.         Balance = 0;
  87.         setgamestatus(BANK_BROKEN);
  88.       }
  89.     }
  90.     else print2("Password accepted. Working.");
  91.       }
  92.       else if ((response == 'D') && valid) {
  93.     clearmsg();
  94.     print1("Amount: ");
  95.     amount = get_money(Player.cash);
  96.     if (amount < 1) 
  97.       print3("Transaction aborted.");
  98.     else if (amount > Player.cash)
  99.       print3("Deposit too large -- transaction aborted.");
  100.     else {
  101.       print2("Transaction accomplished.");
  102.       Balance += amount;
  103.       Player.cash -= amount;
  104.     }
  105.       }
  106.       else if ((response == 'W') && valid) {
  107.     clearmsg();
  108.     print2("Amount: ");
  109.     amount = get_money(Balance);
  110.     if (amount < 1) 
  111.       print3("Transaction aborted.");
  112.     else if (amount > Balance) 
  113.       print3("Withdrawal too large -- transaction aborted.");
  114.     else {
  115.       print2("Transaction accomplished.");
  116.       Balance -= amount;
  117.       Player.cash += amount;
  118.     }
  119.       }
  120.       else if (response == 'X') {
  121.     clearmsg();
  122.     print1("Bye!");
  123.     done = TRUE;
  124.       }
  125.       else if ((response == 'O') && (strcmp(Password,"")==0)) {
  126.     clearmsg();
  127.     print1("Opening new account.");
  128.     nprint1(" Please enter new password: ");
  129.     strcpy(Password,msgscanstring());
  130.     if (strcmp(Password,"")==0) {
  131.       print3("Illegal to use null password -- aborted.");
  132.       done = TRUE;
  133.     }
  134.     else {
  135.       print2("Password validated; account saved.");
  136.       valid = TRUE;
  137.     }
  138.       }
  139.       else print3(" Illegal command.");
  140.       dataprint();
  141.       morewait();
  142.     }
  143.   }
  144.   xredraw();
  145. }
  146.  
  147.  
  148.  
  149.  
  150. void l_armorer()
  151. {
  152.   int done = FALSE;
  153.   char action;
  154.   if (hour() == 12) 
  155.     print3("Unfortunately, this is Julie's lunch hour -- try again later.");
  156.   else if (nighttime()) 
  157.     print3("It seems that Julie keeps regular business hours.");
  158.   else {
  159.     while (! done) {
  160.       clearmsg();
  161.       print1("Julie's: Buy Armor, Weapons, or Leave [a,w,ESCAPE] ");
  162.       action = mgetc();
  163.       if (action == ESCAPE) 
  164.     done = TRUE;
  165.       else if (action == 'a') 
  166.     buyfromstock(ARMORID,10);
  167.       else if (action == 'w') 
  168.     buyfromstock(WEAPONID,23);
  169.     }
  170.   }
  171.   xredraw();
  172. }
  173.  
  174.  
  175. void buyfromstock(base,numitems)
  176. int base,numitems;  
  177. {
  178.   int i;
  179.   char item;
  180.   pob newitem;
  181.  
  182.   print2("Purchase which item? [ESCAPE to quit] ");
  183.   menuclear();
  184.   for(i=0;i<numitems;i++) {
  185.     strcpy(Str4," :");
  186.     Str4[0] = i + 'a';
  187.     strcat(Str4,Objects[base+i].objstr);
  188.     menuprint(Str4);
  189.     menuprint("\n");
  190.   }
  191.   item = ' ';
  192.   while ((item != ESCAPE) &&
  193.      ((item < 'a') || (item >= 'a'+numitems)))
  194.     item = mgetc();
  195.   if (item != ESCAPE) {
  196.     i = item - 'a';
  197.     newitem = ((pob) calloc(1,sizeof(objtype)));
  198.     *newitem = Objects[base+i];
  199.     newitem->known = 2;
  200.     print1("I can let you have it for ");
  201.     mnumprint(2*true_item_value(newitem));
  202.     nprint1("Au. Buy it? [yn] ");
  203.     if (ynq1() == 'y') {
  204.       if (Player.cash < 2*true_item_value(newitem)) {
  205.     print2("Why not try again some time you have the cash?");
  206.     free((char *) newitem);
  207.       }
  208.       else {
  209.     Player.cash -= 2*true_item_value(newitem);
  210.     dataprint();
  211.     gain_item(newitem);
  212.       }
  213.     }
  214.     else free((char *)newitem);
  215.   }
  216. }
  217.  
  218.  
  219. void l_club()
  220. {
  221.   static int hinthour = 0;
  222.   char response;
  223.  
  224.   print1("Rampart Explorers' Club.");
  225.   if (! gamestatusp(CLUB_MEMBER)) {
  226.     if (Player.level < 2) print3("Only reknowned adventurers need apply.");
  227.     else {
  228.       print2("Dues are 100Au. Pay it? [yn] ");
  229.       if (ynq2()=='y') {
  230.     if (Player.cash < 100)
  231.       print3("Beat it, or we'll blackball you!");
  232.     else {
  233.       print1("Welcome to the club! You are taught the spell of Return.");
  234.           print2("When cast on the first level of a dungeon it");
  235.       morewait();
  236.       clearmsg();
  237.       print1("will transport you down to the lowest level");
  238.       print2("you have explored, and vice versa.");
  239.       Spells[S_RETURN].known = TRUE;
  240.       Player.cash -= 100;
  241.       setgamestatus(CLUB_MEMBER);
  242.     }
  243.       }
  244.       else print2("OK, but you're missing out on our benefits....");
  245.     }
  246.   }
  247.   else {
  248.     print2("Shop at the club store or listen for rumors [sl] ");
  249.     do response = mcigetc(); 
  250.     while ((response != 's') && (response != 'l') && (response != ESCAPE));
  251.     if (response == 'l') {
  252.       if (hinthour == hour()) print2("You don't hear anything useful.");
  253.       else {
  254.     print1("You overhear a conversation....");
  255.     hint();
  256.     hinthour = hour();
  257.       }
  258.     }
  259.     else if (response == 's') {
  260.       buyfromstock(THINGID+7,2);
  261.       xredraw();
  262.     }
  263.     else if (response == ESCAPE)
  264.       print2("Be seeing you, old chap!");
  265.   }
  266. }
  267.  
  268. void l_gym()
  269. {
  270.   int done=TRUE;
  271.   do {
  272.     print1("The Rampart Gymnasium");
  273.     if ((Gymcredit > 0) || (Player.rank[ARENA])) {
  274.       nprint1("-- Credit: ");
  275.       mnumprint(Gymcredit);
  276.       nprint1("Au.");
  277.     }
  278.     done = FALSE;
  279.     menuclear();
  280.     menuprint("Train for 2000 Au. Choose:\n");
  281.     menuprint("\na: work out in the weight room");
  282.     menuprint("\nb: use our gymnastics equipment");
  283.     menuprint("\nc: take our new anaerobics course");
  284.     menuprint("\nd: enroll in dance lessons.");
  285.     menuprint("\nESCAPE: Leave this place.");
  286.     switch(mgetc()) {
  287.     case 'a': 
  288.       gymtrain(&(Player.maxstr),&(Player.str));
  289.       break;
  290.     case 'b': 
  291.       gymtrain(&(Player.maxdex),&(Player.dex));
  292.       break;
  293.     case 'c': 
  294.       gymtrain(&(Player.maxcon),&(Player.con));
  295.       break;
  296.     case 'd':
  297.       gymtrain(&(Player.maxagi),&(Player.agi));
  298.       break;
  299.     case ESCAPE:
  300.       clearmsg();
  301.       print1("Well, it's your body you're depriving!"); 
  302.       done = TRUE;
  303.       break;
  304.     }
  305.   } while (! done);
  306.   xredraw();
  307.   calc_melee();
  308. }
  309.  
  310.  
  311.  
  312. void l_healer()
  313. {
  314.   print1("Rampart Healers. Member RMA.");
  315.   morewait();
  316.   clearmsg();
  317.   print1("a: Heal injuries (50 crowns)");
  318.   print2("b: Cure disease (250 crowns)");
  319.   print3("ESCAPE: Leave these antiseptic alcoves.");
  320.   switch(mcigetc()) {
  321.     case 'a': healforpay(); break;
  322.     case 'b': cureforpay(); break;
  323.     default: print3("OK, but suppose you have Acute Satyriasis?"); break;
  324.   }          
  325. }
  326.  
  327.  
  328. void statue_random(x,y)
  329. int x,y;
  330. {
  331.   pob item;
  332.   int i,j;
  333.   switch(random_range(difficulty()+3)-1) {
  334.   default: l_statue_wake(); break;
  335.   case 0: 
  336.     print1("The statue crumbles with a clatter of gravel.");
  337.     Level->site[x][y].locchar = RUBBLE;
  338.     Level->site[x][y].p_locf = L_RUBBLE;
  339.     break;
  340.   case 1: 
  341.     print1("The statue stoutly resists your attack.");
  342.     break;
  343.   case 2: 
  344.     print1("The statue crumbles with a clatter of gravel.");
  345.     Level->site[x][y].locchar = RUBBLE;
  346.     Level->site[x][y].p_locf = L_RUBBLE;
  347.     make_site_treasure(x,y,difficulty());
  348.     break;
  349.   case 3:
  350.     print1("The statue hits you back!");
  351.     p_damage(random_range(difficulty()*5),UNSTOPPABLE,"a statue");
  352.     break;
  353.   case 4:
  354.     print1("The statue looks slightly pained. It speaks:");
  355.     morewait();
  356.     clearmsg();
  357.     hint();
  358.     break;
  359.   case 5:
  360.     if ((Current_Environment == Current_Dungeon) ||
  361.     (Current_Environment == E_CITY)) {
  362.       print1("You hear the whirr of some mechanism.");
  363.       print2("The statue glides smoothly into the floor!");
  364.       Level->site[x][y].locchar = DOWN;
  365.       Level->site[x][y].p_locf = L_NO_OP;
  366.     }
  367.     break;
  368.   case 6:
  369.     print1("The statue was covered with contact cement!");
  370.     print2("You can't move....");
  371.     Player.status[IMMOBILE]+=random_range(6)+2;
  372.     break;
  373.   case 7:
  374.     print1("A strange radiation emanates from the statue!");
  375.     dispel(-1);
  376.     break;
  377.   case 8: /* I think this is particularly evil. Heh heh. */
  378.     if (Player.possessions[O_WEAPON_HAND] != NULL) {
  379.       print1("Your weapon sinks deeply into the statue and is sucked away!");
  380.       item = Player.possessions[O_WEAPON_HAND];
  381.       conform_lost_object(Player.possessions[O_WEAPON_HAND]);
  382.       item->blessing = -1-abs(item->blessing);
  383.       drop_at(x,y,item);
  384.     }
  385.     break;
  386.   case 9:
  387.     print1("The statue extends an arm. Beams of light illuminate the level!");
  388.     for(i=0;i<WIDTH;i++)
  389.       for(j=0;j<LENGTH;j++) {
  390.     lset(i,j,SEEN);
  391.     lreset(i,j,SECRET);
  392.     show_screen();
  393.       }
  394.     break;
  395.   }
  396. }
  397.  
  398. void l_statue_wake()
  399. {
  400.   int i;
  401.   int x=Player.x,y=Player.y;
  402.   for(i=0;i<9;i++)
  403.     wake_statue(x+Dirs[0][i],y+Dirs[1][i],TRUE);
  404. }
  405.  
  406. void wake_statue(x,y,first)
  407. int x,y,first;
  408. {
  409.   int i;
  410.   pml tml;
  411.   if (Level->site[x][y].locchar == STATUE) {
  412.     if (! first) mprint("Another statue awakens!");
  413.     else mprint("A statue springs to life!");
  414.     Level->site[x][y].locchar = FLOOR;
  415.     tml = ((pml) malloc(sizeof(mltype)));
  416.     tml->m =
  417.       (Level->site[x][y].creature = m_create(x,y,0,difficulty()+1));
  418.     m_status_set(Level->site[x][y].creature,HOSTILE);
  419.     tml->next = Level->mlist;
  420.     Level->mlist = tml;
  421.     for(i=0;i<8;i++) wake_statue(x+Dirs[0][i],y+Dirs[1][i],FALSE);
  422.   }
  423. }
  424.  
  425.  
  426. void l_casino()
  427. {
  428.   int i,done = FALSE,a,b,c,match;
  429.   static int winnings = 0;
  430.   char response;
  431.   print1("Rampart Mithril Nugget Casino.");
  432.   if (random_range(10)==1)
  433.     print2("Casino closed due to Grand Jury investigation.");
  434.   else {
  435.     while (! done) {
  436.       morewait();
  437.       clearmsg();
  438.       print1("a: Drop 100Au in the slots.");
  439.       print2("b: Risk 1000Au  at roulette.");
  440.       print3("ESCAPE: Leave this green baize hall.");
  441.       response = mcigetc();
  442.       if (response == 'a') {
  443.     if (Player.cash < 100) print3("No credit, jerk.");
  444.     else {
  445.       Player.cash -= 100;
  446.       dataprint();
  447.       for(i=0;i<20;i++) {
  448.         if (i==19) sleep(1);
  449.         a = random_range(10);
  450.         b = random_range(10);
  451.         c = random_range(10);
  452.         clearmsg();
  453.         mprint(slotstr(a));
  454.         mprint(slotstr(b));
  455.         mprint(slotstr(c));
  456.       }
  457.       if (winnings > 0) do {
  458.         a = random_range(10);
  459.         b = random_range(10);
  460.         c = random_range(10);
  461.       } while ((a==b) || (a == c) || (b == c));
  462.       else {
  463.         a = random_range(10);
  464.         b = random_range(10);
  465.         c = random_range(10);
  466.       }
  467.       clearmsg();
  468.       mprint(slotstr(a));
  469.       mprint(slotstr(b));
  470.       mprint(slotstr(c));
  471.       if ((a==b) && (a==c)) {
  472.         print3("Jackpot Winner!");
  473.         winnings += (a+2)*(b+2)*(c+2)*5;
  474.         Player.cash += (a+2)*(b+2)*(c+2)*5;
  475.         dataprint();
  476.       }
  477.       else if (a==b) {
  478.         print3("Winner!");
  479.         Player.cash += (a+2)*(b+2)*5;
  480.         dataprint();
  481.         winnings += (a+2)*(b+2)*5;
  482.       }
  483.       else if (a==c) {
  484.         print3("Winner!");
  485.         Player.cash += (a+2)*(c+2)*5;
  486.         dataprint();
  487.         winnings += (a+2)*(c+2)*5;
  488.       }
  489.       else if (c==b) {
  490.         print3("Winner!");
  491.         Player.cash += (c+2)*(b+2)*5;
  492.         dataprint();
  493.         winnings += (c+2)*(b+2)*5;
  494.       }
  495.       else {
  496.         print3("Loser!");
  497.         winnings -= 100;
  498.       }
  499.     }
  500.       }
  501.       else if (response == 'b') {
  502.     if (Player.cash < 1000) mprint("No credit, jerk.");
  503.     else {
  504.       Player.cash -= 1000;
  505.       dataprint();
  506.       print1("Red or Black? [rb]");
  507.       do response = mcigetc();
  508.       while ((response != 'r') && (response != 'b'));
  509.       match = (response == 'r' ? 0 : 1);
  510.       for(i=0;i<20;i++) {
  511.         if (i==19) sleep(1);
  512.         a = random_range(37);
  513.         b = a % 2;
  514.         if (a == 0) print1(" 0 ");
  515.         else if (a==1) print1(" 0 - 0 ");
  516.         else {
  517.           print1(( b == 0) ? "Red ": "Black ");
  518.           mnumprint(a-1);
  519.         }
  520.       }
  521.       if (winnings > 0) do {
  522.         a = random_range(37);
  523.         b = a % 2;
  524.       } while (b == match);
  525.       else {
  526.         a = random_range(37);
  527.         b = a % 2;
  528.       }
  529.       if (a == 0) print1(" 0 ");
  530.       else if (a==1) print1(" 0 - 0 ");
  531.       else {
  532.         print1((b == 0) ? "Red ": "Black ");
  533.         mnumprint(a-1);
  534.       }
  535.       if ((a > 1) && (b == match)){
  536.         print3(" Winner!");
  537.         winnings += 1000;
  538.         Player.cash += 2000;
  539.         dataprint();
  540.       }
  541.       else {
  542.         print3(" Loser!");
  543.         winnings -= 1000;
  544.         dataprint();
  545.       }
  546.     }
  547.       }
  548.       else if (response == ESCAPE) done = TRUE;
  549.     }
  550.   }
  551. }
  552.  
  553.  
  554.  
  555.  
  556.  
  557. void l_commandant()
  558. {
  559.   int num;
  560.   pob food;
  561.   print1("Commandant Sonder's Rampart-fried Lyzzard partes. Open 24 hrs.");
  562.   print2("Buy a bucket! Only 5 Au. Make a purchase? [yn] ");
  563.   if (ynq2()=='y') {
  564.     clearmsg();
  565.     print1("How many? ");
  566.     num = parsenum();
  567.     if (num < 1) print3("Cute. Real cute.");
  568.     else if (num*5 > Player.cash)
  569.       print3("No handouts here, mac!");
  570.     else {
  571.       Player.cash -= num*5;
  572.       food = ((pob) malloc(sizeof(objtype)));
  573.       *food = Objects[FOODID+0]; /* food ration */
  574.       food->number = num;
  575.       if (num == 1)
  576.     print2("There you go, mac! One Lyzzard Bucket, coming up.");
  577.       else print2("A passel of Lyzzard Buckets, for your pleasure.");
  578.       morewait();
  579.       gain_item(food);
  580.     }
  581.   }
  582.   else print2("Don't blame the Commandant if you starve!");
  583. }
  584.  
  585.  
  586. void l_diner()
  587. {
  588.   print1("The Rampart Diner. All you can eat, 25Au.");
  589.   print2("Place an order? [yn] ");
  590.   if (ynq2()=='y') {
  591.     if (Player.cash < 25)
  592.       mprint("TANSTAAFL! Now git!");
  593.     else {
  594.       Player.cash -= 25;
  595.       dataprint();
  596.       Player.food = 44;
  597.       foodcheck();
  598.     }
  599.   }
  600. }
  601.  
  602. void l_crap()
  603. {
  604.   print1("Les Crapeuleaux. (****) ");
  605.   if ((hour() < 17) || (hour() > 23))
  606.     print2 ("So sorry, we are closed 'til the morrow...");
  607.   else {
  608.     print2("May I take your order? [yn] ");
  609.     if (ynq2()=='y') {
  610.       if (Player.cash < 1000)
  611.     print2("So sorry, you have not the funds for dinner.");
  612.       else {
  613.     print2("Hope you enjoyed your tres expensive meal, m'sieur...");
  614.     Player.cash -= 1000;
  615.     dataprint();
  616.     Player.food += 8;
  617.     foodcheck();
  618.       }
  619.     }
  620.   }
  621. }
  622.  
  623. void l_tavern()
  624. {
  625.   static int hinthour;
  626.   char response;
  627.   print1("The Centaur and Nymph -- J. Riley, prop.");
  628.   if (nighttime()) {
  629.     menuclear();
  630.     menuprint("Riley says: Whataya have?\n\n");
  631.     menuprint("a: Pint of Riley's ultra-dark 1Au\n");
  632.     menuprint("b: Shot of Tullimore Dew 10Au\n");
  633.     menuprint("c: Round for the House. 100Au\n");
  634.     menuprint("d: Bed and Breakfast. 25Au\n");
  635.     menuprint("ESCAPE: Leave this comfortable haven.\n");
  636.     do response = mcigetc();
  637.     while ((response != 'a') &&
  638.        (response != 'b') &&
  639.        (response != 'c') &&
  640.        (response != 'd') &&
  641.        (response != ESCAPE));
  642.     switch (response) {
  643.     case 'a':
  644.       if (Player.cash < 1)
  645.     print2("Aw hell, have one on me.");
  646.       else {
  647.     hinthour = hour();
  648.     Player.cash -= 1;
  649.     dataprint();
  650.     if (hinthour!=hour()) {
  651.       if (random_range(3)) {
  652.         print1("You overhear a rumor...");
  653.         hint();
  654.       }
  655.       else print1("You don't hear much of interest.");
  656.       hinthour = hour();
  657.     }
  658.     else print1("You just hear the same conversations again.");
  659.       }
  660.       break;
  661.     case 'b':
  662.       if (Player.cash < 10)
  663.     print2("I don't serve the Dew on no tab, buddy!");
  664.       else {
  665.     Player.cash -= 10;
  666.     print1("Ahhhhh....");
  667.     if (Player.status[POISONED] || Player.status[DISEASED])
  668.       print2("Phew! That's, er, smooth stuff!");
  669.     Player.status[POISONED] = 0;
  670.     Player.status[DISEASED] = 0;
  671.     showflags();
  672.       }
  673.       break;
  674.     case 'c':
  675.       if (Player.cash < 100) {
  676.     print1("Whatta feeb!");
  677.     print2("Outta my establishment.... Now!");
  678.     p_damage(random_range(20),UNSTOPPABLE,"Riley's right cross");
  679.       }
  680.       else {
  681.     Player.cash -= 100;
  682.     dataprint();
  683.     print1("'What a guy!'"); morewait();
  684.     print2("'Hey, thanks, fella.'"); morewait();
  685.     print3("'Make mine a double...'"); morewait();
  686.     clearmsg();
  687.     switch(random_range(4)) {
  688.     case 0:
  689.       print1("'You are a real pal. Say, have you heard.... ");
  690.       hint();
  691.       break;
  692.     case 1:
  693.       print1("A wandering priest of Dionysus blesses you...");
  694.       if ((Player.patron == ODIN) || (Player.patron == ATHENA))
  695.         Player.alignment++;
  696.       else if ((Player.patron == HECATE) || (Player.patron == SET))
  697.         Player.alignment--;
  698.       else if (Player.alignment > 0) Player.alignment--;
  699.       else Player.alignment++;
  700.       break;
  701.     case 2:
  702.       print1("A thirsty bard promises to put your name in a song!");
  703.       gain_experience(20);
  704.       break;
  705.     case 3:
  706.       print1("Riley draws you a shot of his 'special reserve'");
  707.       print2("Drink it [yn]?");
  708.       if (ynq2()=='y') {
  709.         if (Player.con < random_range(20)) {
  710.           print1("<cough> Quite a kick!");
  711.           print2("You feel a fiery warmth in your tummy....");
  712.           Player.con++;
  713.           Player.maxcon++;
  714.         }
  715.         else print2("You toss it back nonchalantly.");
  716.       }
  717.     }        
  718.       }
  719.       break;
  720.     case 'd':
  721.       if (Player.cash < 25)
  722.     print2("Pay in advance, mac!");
  723.       else {
  724.     Player.cash -= 25;
  725.     print2("How about a shot o' the dew for a nightcap?");
  726.     morewait();
  727.     Time += (6+random_range(4)) * 60;
  728.     Player.status[POISONED] = 0;
  729.     Player.status[DISEASED] = 0;
  730.     Player.food = 40;
  731.     /* reduce temporary stat gains to max stat levels */
  732.     toggle_item_use(TRUE);
  733.     Player.str = min(Player.str,Player.maxstr);
  734.     Player.con = min(Player.con,Player.maxcon);
  735.     Player.agi = min(Player.agi,Player.maxagi);
  736.     Player.dex = min(Player.dex,Player.maxdex);
  737.     Player.iq = min(Player.iq,Player.maxiq);
  738.     Player.pow = min(Player.pow,Player.maxpow);
  739.     toggle_item_use(FALSE);
  740.     timeprint();
  741.     dataprint();
  742.     showflags();
  743.     print1("The next day.....");
  744.     if (hour() > 10) print2("Oh my! You overslept!");
  745.       }
  746.       break;
  747.     default:
  748.       print2("So? Just looking? Go on!");
  749.       break;
  750.     }
  751.   }
  752.   else print2("The pub don't open til dark, fella.");
  753.   xredraw();
  754. }
  755.  
  756.  
  757. void l_alchemist()
  758. {
  759.   int i,done=FALSE,mlevel;
  760.   char response;
  761.   pob obj;
  762.   print1("Ambrosias' Potions et cie.");
  763.   if (nighttime()) 
  764.     print2("Ambrosias doesn't seem to be in right now.");
  765.   else while (! done){
  766.     morewait();
  767.     clearmsg();
  768.     print1("a: Sell monster components.");
  769.     print2("b: Pay for transformation.");
  770.     print3("ESCAPE: Leave this place.");
  771.     response = mcigetc();
  772.     if (response == 'a') {
  773.       clearmsg();
  774.       done = TRUE;
  775.       i = getitem(CORPSE);
  776.       if ((i != ABORT) && (Player.possessions[i] != NULL)){
  777.     obj = Player.possessions[i];
  778.     if (Monsters[obj->charge].transformid == -1) {
  779.       print1("I don't want such a thing.");
  780.       if (obj->basevalue > 0)
  781.         print2("You might be able to sell it to someone else, though.");
  782.     }
  783.     else {
  784.       print1("I'll give you ");
  785.       mnumprint(obj->basevalue/3);
  786.       nprint1("Au for it. Take it? [yn] ");
  787.       if (ynq1()=='y') {
  788.         Player.cash += (obj->basevalue/3);
  789.         conform_lost_objects(1,obj);
  790.       }
  791.       else print2("Well, keep the smelly old thing, then!");
  792.     }
  793.       }
  794.       else print2("So nu?");
  795.     }
  796.     else if (response == 'b') {
  797.       clearmsg();
  798.       done = TRUE;
  799.       i = getitem(CORPSE);
  800.       if ((i != ABORT) && (Player.possessions[i] != NULL)){
  801.     obj = Player.possessions[i];
  802.     mlevel = Monsters[obj->charge].level;
  803.     print1("It'll cost you ");
  804.      mnumprint(max(10,obj->basevalue*2));
  805.     nprint1("for the transformation. Pay it? [yn] ");
  806.     if (ynq1()=='y') {
  807.        if (Player.cash < max(10,obj->basevalue*2))
  808.         print2("You can't afford it!");
  809.       else if (Monsters[obj->charge].transformid == -1) {
  810.            print1("There is a puff of smoke, and the corpse disappears.");
  811.           Player.cash -= max(10,obj->basevalue*2);
  812.            dispose_lost_objects(1,obj);
  813.          }
  814.       else {
  815.         print1("Voila! A tap of the Philosopher's Stone...");
  816.         Player.cash -= obj->basevalue*2;
  817.         *obj = Objects[Monsters[obj->charge].transformid];
  818.         if ((obj->id >= STICKID) && (obj->id < STICKID+NUMSTICKS))
  819.           obj->charge = 20;
  820.         if (obj->plus == 0) obj->plus = mlevel;
  821.         if (obj->blessing == 0) obj->blessing = 1;
  822.       }
  823.     }
  824.     else print2("I don't need your business, anyhow.");
  825.       }
  826.       else print2("So nu?");
  827.     }
  828.     else if (response == ESCAPE) done = TRUE;
  829.   }
  830. }
  831.  
  832. void l_dpw()
  833. {
  834.   print1("Rampart Department of Public Works.");
  835.   if (Date - LastDay < 7)
  836.     print2("G'wan! Get a job!");
  837.   else if (Player.cash < 100) {
  838.     print2("Do you want to go on the dole? [yn] ");
  839.     if (ynq2()=='y') {
  840.       print1("Well, ok, but spend it wisely.");
  841.       print2("Please enter your name for our records.");
  842.       if (strcmp(Player.name,msgscanstring()) != 0) {
  843.     print3("Aha! Welfare Fraud! It's off to gaol for you, lout!");
  844.     morewait();
  845.     send_to_jail();
  846.       }
  847.       else {
  848.     print1("Here's your handout, layabout!");
  849.     LastDay = Date;
  850.     Player.cash = 99;
  851.     dataprint();
  852.       }
  853.     }
  854.   }
  855.   else print2("You're too well off for us to help you!");
  856. }
  857.  
  858. void l_library()
  859. {
  860.   char response;
  861.   int done=FALSE,fee = 1000;
  862.   print1("Rampart Public Library.");
  863.   if (nighttime())
  864.     print2("CLOSED");
  865.   else {
  866.     morewait();
  867.     print1("Library Research Fee: 1000Au.");
  868.     if (Player.maxiq < 18) {
  869.       print2("The Rampart student aid system has arranged a grant!");
  870.       morewait();
  871.       clearmsg();
  872.       print1("Your revised fee is: ");
  873.       mnumprint(fee=max(50,1000-(18-Player.maxiq)*125));
  874.       nprint1("Au.");
  875.     }
  876.     morewait();
  877.     while(! done) {
  878.       print1("Pay the fee? [yn] ");
  879.       if (ynq1()=='y') {
  880.     if (Player.cash < fee) 
  881.       print2("No payee, No studee.");
  882.     else {
  883.       Player.cash -= fee;
  884.       menuclear();
  885.       menuprint("Peruse a scroll:\n");
  886.       menuprint("a: Omegan Theology\n");
  887.       menuprint("b: Guide to Rampart\n");
  888.       menuprint("c: High Magick\n");
  889.       menuprint("d: Odd Uncatalogued Document\n");
  890.       menuprint("e: Attempt Advanced Research\n");
  891.       menuprint("ESCAPE: Leave this font of learning.\n");
  892.       response = mcigetc();
  893.       if (response == 'a') {
  894.         print1("You unfurl an ancient, yellowing scroll...");
  895.         morewait();
  896.         theologyfile();
  897.       }
  898.       else if (response == 'b') {
  899.         print1("You unroll a slick four-color document...");
  900.         morewait();
  901.         cityguidefile();
  902.       }
  903.       else if (response == 'c') {
  904.         print1("This scroll is written in a strange magical script...");
  905.         morewait();
  906.         wishfile();
  907.       }
  908.       else if (response == 'd') {
  909.         print1("You find a strange document, obviously misfiled");
  910.         print2("under the heading 'acrylic fungus painting technique'");
  911.         morewait();
  912.         adeptfile();
  913.       }
  914.       else if (response == 'e') {
  915.         if (random_range(30) > Player.iq)  {
  916.           print1("You feel more knowledgeable!");
  917.           Player.iq++;
  918.           Player.maxiq++;
  919.         }
  920.         else {
  921.           print1("You find advice in an ancient tome: ");
  922.           hint();
  923.         }
  924.       }
  925.       else done = (response == ESCAPE);
  926.     }
  927.       xredraw();
  928.       }
  929.       else {
  930.     done = TRUE;
  931.     print2("You philistine!");
  932.       }
  933.     }
  934.   }
  935. }
  936.  
  937.  
  938. void l_pawn_shop()
  939. {
  940.   int i,j,k,limit,number,done = FALSE;
  941.   char item,action;
  942.  
  943.   if (nighttime())
  944.     print1("Shop Closed: Have a Nice (K)Night");
  945.   else {
  946.     limit = min(5,Date-Pawndate);
  947.     Pawndate = Date;
  948.     for(k=0;k<limit;k++) {
  949.       if (Pawnitems[0] != NULL) {
  950.     free((char *) Pawnitems[0]);
  951.     Pawnitems[0] = NULL;
  952.       }
  953.       for (i=0;i<PAWNITEMS-1;i++)
  954.     Pawnitems[i] = Pawnitems[i+1];
  955.       Pawnitems[PAWNITEMS-1] = NULL;
  956.       for (i=0;i<PAWNITEMS;i++)
  957.     do {
  958.       if (Pawnitems[i] == NULL) {
  959.         Pawnitems[i] = create_object(5);
  960.         Pawnitems[i]->known = 2;
  961.       }
  962.     } while ((Pawnitems[i]->objchar == CASH) &&
  963.          (Pawnitems[i]->objchar == ARTIFACT));
  964.     }
  965.     while (! done) {
  966.       print1("Knight's Pawn Shop:");
  967.       print2("Buy item, Sell item, sell Pack contents, Leave [b,s,p,ESCAPE] ");
  968.       menuclear();
  969.       for(i=0;i<PAWNITEMS;i++) 
  970.     if (Pawnitems[i] != NULL) {
  971.       strcpy(Str3," :");
  972.       Str3[0] = i+'a';
  973.       strcat(Str3,itemid(Pawnitems[i]));
  974.       menuprint(Str3);
  975.       menuprint("\n");
  976.     }
  977.       action = mcigetc();
  978.       if (action == ESCAPE) 
  979.     done = TRUE;
  980.       else if (action == 'b') {
  981.     print2("Purchase which item? [ESCAPE to quit] ");
  982.     item = ' ';
  983.     while ((item != ESCAPE) &&
  984.            ((item < 'a') || (item > 'k')))
  985.       item = mcigetc();
  986.     if (item != ESCAPE) {
  987.       i = item - 'a';
  988.       if (Pawnitems[i] == NULL) print3("No such item!");
  989.       else {
  990.         print1("The low, low, cost is: ");
  991.         mnumprint(Pawnitems[i]->number*true_item_value(Pawnitems[i]));
  992.         nprint1(" Buy it? [ynq] ");
  993.         if (ynq1() == 'y') {
  994.           if (Player.cash < 
  995.           Pawnitems[i]->number *
  996.           true_item_value(Pawnitems[i]))
  997.         print2("No credit! Gwan, Beat it!");
  998.           else {
  999.         Player.cash -= 
  1000.           Pawnitems[i]->number*
  1001.             true_item_value(Pawnitems[i]);
  1002.         Objects[Pawnitems[i]->id].known = 1;
  1003.         gain_item(Pawnitems[i]);
  1004.         Pawnitems[i] = NULL;
  1005.           }
  1006.         }
  1007.       }
  1008.     }
  1009.       }
  1010.       else if (action == 's') {
  1011.     print2("Sell which item: ");
  1012.     i = getitem(NULL);
  1013.     if ((i != ABORT) && (Player.possessions[i] != NULL)) {
  1014.       if (cursed(Player.possessions[i]))
  1015.         print1("No loans on cursed items! I been burned before....");
  1016.       else {
  1017.         print1("You can get ");
  1018.         mnumprint(item_value(Player.possessions[i]) / 2);
  1019.         nprint1("Au each. Sell [yn]? ");
  1020.         if (ynq1() == 'y') {
  1021.           number = getnumber(Player.possessions[i]->number);
  1022.           if ((number >= Player.possessions[i]->number) &&
  1023.           Player.possessions[i]->used) {
  1024.         Player.possessions[i]->used = FALSE;
  1025.         item_use(Player.possessions[i]);
  1026.           }
  1027.           Player.cash += number * item_value(Player.possessions[i]) / 2;
  1028.           free((char *) Pawnitems[0]);
  1029.           for(j=0;j<9;j++)
  1030.         Pawnitems[j] = Pawnitems[j+1];
  1031.           Pawnitems[9] = ((pob) malloc(sizeof(objtype)));
  1032.           *(Pawnitems[9]) = *(Player.possessions[i]);
  1033.           Pawnitems[9]->number = number;
  1034.           Pawnitems[9]->known = 2;    
  1035.           dispose_lost_objects(number,Player.possessions[i]);
  1036.           dataprint();
  1037.         }
  1038.       }
  1039.     }
  1040.       }
  1041.       else if (action == 'p') {
  1042.     for(i=0;i<Player.packptr;i++) {
  1043.       if (Player.pack[i]->blessing > -1) {
  1044.         print1("Sell ");
  1045.         nprint1(itemid(Player.pack[i]));
  1046.         nprint1(" for ");
  1047.         mnumprint(item_value(Player.pack[i])/2);
  1048.         nprint1("Au each? [yn] ");
  1049.         if (ynq1()=='y') {
  1050.           number = getnumber(Player.pack[i]->number);
  1051.           if (number > 0) {
  1052.         Player.cash += number * item_value(Player.pack[i]) / 2;
  1053.         free((char *) Pawnitems[0]);
  1054.         for(j=0;j<9;j++)
  1055.           Pawnitems[j] = Pawnitems[j+1];
  1056.         Pawnitems[9] = ((pob) malloc(sizeof(objtype)));
  1057.         *(Pawnitems[9]) = *(Player.pack[i]);
  1058.         Pawnitems[9]->number = number;
  1059.         Pawnitems[9]->known = 2;
  1060.         Player.pack[i]->number -= number;
  1061.         if (Player.pack[i]->number < 1)
  1062.           free((char *)Player.pack[i]);
  1063.         Player.pack[i] = NULL;
  1064.         dataprint();
  1065.           }
  1066.         }
  1067.       }
  1068.     }
  1069.     fixpack();
  1070.       }
  1071.     }
  1072.   }
  1073.   calc_melee();
  1074.   xredraw();
  1075. }
  1076.  
  1077.  
  1078.  
  1079.