home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / games / volume5 / omega2 / part20 / oaux3.c
C/C++ Source or Header  |  1988-07-27  |  30KB  |  1,109 lines

  1. /* omega copyright (C) by Laurence Raphael Brothers, 1987,1988 */
  2.  
  3. /* oaux3.c */
  4.  
  5. /* some functions called by ocom.c, also see oaux1.c, oaux2.c */ 
  6. /* This is a real grab bag file. It contains functions used by
  7.    oaux1 and o.c, as well as elsewhere. It is mainly here so oaux1.c
  8.    and oaux2 are not huge */
  9.   
  10. #include "oglob.h"
  11.  
  12. /* check every ten minutes */
  13. void tenminute_check()
  14. {
  15.   if (Time % 60 == 0) hourly_check();
  16.   else {
  17.     if (Current_Environment == Current_Dungeon)  wandercheck();
  18.     minute_status_check();
  19.     tenminute_status_check();
  20.     if ((Player.status[DISEASED] < 1) && (Player.hp < Player.maxhp))
  21.       Player.hp = min(Player.maxhp,Player.hp+Player.level+1);
  22.     if (Current_Environment != E_COUNTRYSIDE)
  23.       indoors_random_event();
  24.   }
  25. }
  26.  
  27.  
  28.  
  29. /* hourly check is same as ten_minutely check except food is also
  30.    checked, and since time moves in hours out of doors, also
  31.    outdoors_random_event is possible */
  32.  
  33. void hourly_check()
  34. {
  35.   Player.food--;
  36.   foodcheck();
  37.   if (hour()==0) { /* midnight, a new day */
  38.     moon_check();
  39.     Date++;
  40.   }
  41.   torch_check();
  42.   if (Current_Environment == Current_Dungeon)  wandercheck();
  43.   minute_status_check();
  44.   tenminute_status_check();
  45.   if ((Player.status[DISEASED] == 0) && (Player.hp < Player.maxhp))
  46.     Player.hp = min(Player.maxhp,Player.hp+Player.level+1);
  47.   if (Current_Environment != E_COUNTRYSIDE)
  48.     indoors_random_event();
  49. }
  50.  
  51.  
  52.  
  53.  
  54. void indoors_random_event()
  55. {
  56.   pml ml;
  57.   pol ol;
  58.   switch(random_range(1000)) {
  59.     case 0: 
  60.       print3("You feel an unexplainable elation.");
  61.       morewait();
  62.       break;
  63.     case 1:
  64.       print3("You hear a distant rumbling.");
  65.       morewait();
  66.       break;
  67.     case 2:
  68.       print3("You realize your fly is open.");
  69.       morewait();
  70.       break;
  71.     case 3:
  72.       print3("You have a sudden craving for a pecan twirl.");
  73.       morewait();
  74.       break;
  75.     case 4:
  76.       print3("A mysterious healing flux settles over the level.");
  77.       morewait();
  78.       for (ml=Level->mlist;ml!=NULL;ml=ml->next)
  79.     if (ml->m->hp > 0) ml->m->hp = Monsters[ml->m->id].hp;
  80.       Player.hp = max(Player.hp,Player.maxhp);
  81.       break;
  82.     case 5:
  83.       print3("You discover an itch just where you can't scratch it.");
  84.       morewait();
  85.       break;
  86.     case 6:
  87.       print3("A cosmic ray strikes!");
  88.       p_damage(10,UNSTOPPABLE,"a cosmic ray");
  89.       morewait();
  90.       break;
  91.     case 7:
  92.       print3("You catch your second wind....");
  93.       Player.hp = ++Player.maxhp;
  94.       Player.mana = max(Player.mana, calcmana());
  95.       morewait();
  96.       break;
  97.     case 8:
  98.       print3("You find some spare change in a hidden pocket.");
  99.       Player.cash += Player.level*Player.level+1;
  100.       morewait();
  101.       break;
  102.     case 9:
  103.       print3("You feel strangely lucky.");
  104.       morewait();
  105.       break;
  106.     case 10:
  107.       print3("You trip over something hidden in a shadow...");
  108.       morewait();
  109.       ol = ((pol) malloc(sizeof(oltype)));
  110.       ol->thing = create_object(difficulty());
  111.       ol->next = Level->site[Player.x][Player.y].things;
  112.       Level->site[Player.x][Player.y].things = ol;
  113.       pickup();
  114.       break;
  115.     case 11: 
  116.       print3("A mysterious voice echoes all around you....");
  117.       hint();
  118.       morewait();
  119.       break;
  120.     case 12:
  121.       if (Balance > 0) {
  122.     print3("You get word of the failure of your bank!");
  123.     Balance = 0;
  124.       }
  125.       else print3("You feel lucky.");
  126.       break;
  127.     case 13:
  128.       if (Balance > 0) {
  129.     print3("You get word of a bank error in your favor!");
  130.     Balance += 5000;
  131.       }
  132.       else print3("You feel unlucky.");
  133.       break;
  134.     }
  135.   showflags();
  136. }
  137.  
  138.  
  139.  
  140. void outdoors_random_event()
  141. {
  142.   int num,i,j;
  143.   pob ob;
  144.  
  145.   switch(random_range(300)) {
  146.   case 0:
  147.     switch(Country[Player.x][Player.y].current_terrain_type) {
  148.     case TUNDRA: 
  149.       mprint("It begins to snow. Heavily.");
  150.       break;
  151.     case DESERT:
  152.       mprint("A sandstorm swirls around you.");
  153.       break;
  154.     default:
  155.       if ((Date > 75) && (Date < 330))
  156.     mprint("You are drenched by a sudden downpour!");
  157.       else mprint("It begins to snow. Heavily.");
  158.     }
  159.     mprint("Due to the inclement weather conditions, you have become lost.");
  160.     Precipitation+=random_range(12)+1;
  161.     setgamestatus(LOST);
  162.     break;
  163.   case 1:
  164.     mprint("You enter a field of brightly colored flowers...");
  165.     mprint("Wow, man! These are some pretty poppies...");
  166.     morewait();
  167.     mprint("poppies...");
  168.     morewait();
  169.     mprint("poppies...");
  170.     morewait();
  171.     print3("You become somewhat disoriented...");
  172.     setgamestatus(LOST);
  173.     break;
  174.   case 2:
  175.     mprint("You discover a sprig of athelas growing lonely in the wild.");
  176.     mprint("Using your herbalist lore you cook a cake of lembas....");
  177.     ob = ((pob) malloc(sizeof(objtype)));
  178.     *ob = Objects[FOODID+1];
  179.     gain_item(ob);
  180.     break;
  181.   case 3:
  182.     if (Precipitation > 0) {
  183.       mprint("You are struck by a bolt of lightning!");
  184.       p_damage(random_range(25),ELECTRICITY,"a lightning strike");
  185.     }
  186.     else mprint("You feel static cling");
  187.     break;
  188.   case 4:
  189.     mprint("You find a fast-food establishment.");
  190.     l_commandant();
  191.     break;
  192.   case 5:
  193.     mprint("A weird howling tornado hits from out of the West!");
  194.     mprint("You've been caught in a chaos storm!");
  195.     num = random_range(300);
  196.     if (num <10) {
  197.       mprint("Your cell-structure was disrupted!");
  198.       p_damage(random_range(100),UNSTOPPABLE,"a chaos storm");
  199.     }
  200.     else if (num < 20) {
  201.       mprint("The chaos storm warps your frame!");
  202.       mprint("Your statistical entropy has been maximized.");
  203.       mprint("You feel average...");
  204.       Player.str = Player.maxstr = Player.con = Player.maxcon =
  205.     Player.dex = Player.maxdex = Player.agi = Player.maxagi =
  206.       Player.iq = Player.maxiq = Player.pow = Player.maxpow =
  207.         ((Player.maxstr+Player.maxcon+Player.maxdex+Player.maxagi+
  208.           Player.maxiq+Player.maxpow+12)/6);
  209.     }
  210.     else if (num < 30) {
  211.       mprint("Your entire body glows with an eerie flickering light.");
  212.       for(i=1;i<MAXITEMS;i++)
  213.     if (Player.possessions[i] != NULL) {
  214.       Player.possessions[i]->plus++;
  215.       if (Player.possessions[i]->objchar == STICK)
  216.         Player.possessions[i]->charge+=10;
  217.       Player.possessions[i]->blessing+=10;
  218.     }
  219.       cleanse(1);
  220.       mprint("You feel filled with energy!");
  221.       Player.maxpow += 5;
  222.       Player.pow += 5;
  223.       Player.mana = Player.maxmana = calcmana() * 5;
  224.       mprint("You also feel weaker. Paradoxical, no?");
  225.       Player.con -= 5;
  226.       Player.maxcon -= 5;
  227.       if (Player.con < 3)
  228.     p_death("congestive heart failure");
  229.     }
  230.     else if (num < 40) {
  231.       mprint("Your entire body glows black.");
  232.       dispel(-1);
  233.       dispel(-1);
  234.       Player.pow-=10;
  235.       Player.mana=0;
  236.     }
  237.     else if (num < 60) {
  238.       mprint("The storm deposits you in a strange place....");
  239.       Player.x = random_range(WIDTH);
  240.       Player.y = random_range(LENGTH);
  241.       screencheck(Player.y);
  242.     }
  243.     else if (num < 70) {
  244.       mprint("A tendril of the storm condenses and falls into your hands.");
  245.       ob = ((pob) malloc(sizeof(objtype)));
  246.       make_artifact(ob,-1);
  247.       gain_item(ob);
  248.     }
  249.     else if (num < 80) {
  250.       if (gamestatusp(MOUNTED)) {
  251.     mprint("Your horse screams as he is transformed into an");
  252.     mprint("imaginary unseen dead tortoise.");
  253.     mprint("You are on foot.");
  254.     resetgamestatus(MOUNTED);
  255.       }
  256.       else {
  257.     mprint("You notice you are riding a horse. Odd. Very odd....");
  258.     mprint("Now that's a horse of a different color!");
  259.     setgamestatus(MOUNTED);
  260.       }
  261.     }
  262.     else if (num < 90) {
  263.       mprint("You feel imbued with godlike power....");
  264.       wish(1);
  265.     }
  266.     else if (num < 100) {
  267.       mprint("The chaos storm has wiped your memory!");
  268.       mprint("You feel extraordinarily naive....");
  269.       mprint("You can't remember a thing! Not even your name.");
  270.       Player.xp = 0;
  271.       Player.level = 0;
  272.       for (i=0;i<NUMRANKS;i++) Player.rank[i] = 0;
  273.       for (i=0;i<NUMSPELLS;i++) Spells[i].known = FALSE;
  274.       rename_player();
  275.     }
  276.     else {
  277.       mprint("You survive the chaos storm relatively unscathed.");
  278.       mprint("It was a learning experience.");
  279.       gain_experience(1000);
  280.     }
  281.     break;
  282.   case 6: case 7: case 8: case 9: case 10:
  283.     mprint("An encounter!");
  284.     change_environment(E_TACTICAL_MAP);
  285.     break;
  286.   case 11:
  287.     mprint("You find a Traveller's Aid station with maps of the local area.");
  288.     if (gamestatusp(LOST)) {
  289.       resetgamestatus(LOST);
  290.       mprint("You know where you are now.");
  291.     }
  292.     for(i=Player.x-5;i<Player.x+6;i++)
  293.       for(j=Player.y-5;j<Player.y+6;j++)
  294.     if (inbounds(i,j)) {
  295.       Country[i][j].explored = TRUE;
  296.       Country[i][j].current_terrain_type = 
  297.         Country[i][j].base_terrain_type;
  298.     }
  299.     show_screen();
  300.     break;
  301.   case 12:
  302.     if (! gamestatusp(MOUNTED)) {
  303.       mprint("You develop blisters....");
  304.       p_damage(1,UNSTOPPABLE,"blisters");
  305.     }
  306.     break;
  307.   case 13:
  308.     mprint("You discover an itch just where you can't scratch it.");
  309.     break;
  310.   case 14:
  311.     mprint("A cosmic ray strikes!");
  312.     p_damage(10,UNSTOPPABLE,"a cosmic ray");
  313.     break;
  314.   case 15:
  315.     mprint("You feel strangely lucky.");
  316.     break;
  317.   case 16:
  318.     mprint("The west wind carries with it a weird echoing voice....");
  319.     hint();
  320.     break;
  321.   }
  322.   dataprint();
  323.   showflags();
  324. }
  325.  
  326.  
  327. char getlocation()
  328. {
  329.   char response;
  330.   menuprint(" (enter location [HCL])");
  331.   do response = mcigetc();
  332.   while ((response != 'h') &&
  333.      (response != 'c') &&
  334.      (response != 'l'));
  335.   switch(response){
  336.   case 'h':menuprint(" High."); return ('H'); break;
  337.   case 'c':menuprint(" Center."); return('C'); break;
  338.   case 'l':menuprint(" Low."); return('L'); break;
  339.   }
  340. }
  341.  
  342.  
  343.  
  344.  
  345.  
  346.  
  347. /* chance for player to resist magic somehow */
  348. /* hostile_magic ranges in power from 0 (weak) to 10 (strong) */
  349. int magic_resist(hostile_magic)
  350. int hostile_magic;
  351. {
  352.   if ((Player.rank[COLLEGE]+Player.rank[CIRCLE] > 0) &&
  353.       (Player.level/2 + random_range(20) >
  354.        hostile_magic + random_range(20))) {
  355.     if (Player.mana > hostile_magic * hostile_magic) {
  356.       mprint("Thinking fast, you defend youself with a counterspell!");
  357.       Player.mana -= hostile_magic * hostile_magic;
  358.       dataprint();
  359.       return(TRUE);
  360.     }
  361.   }
  362.   if (Player.level/4 + Player.status[PROTECTION] + random_range(20) > 
  363.       hostile_magic + random_range(30)) {
  364.     mprint("You make your saving throw!");
  365.     return(TRUE);
  366.   }
  367.   else return(FALSE);
  368. }
  369.  
  370.  
  371.  
  372.  
  373.  
  374. void terrain_check(takestime)
  375. int takestime;
  376. {
  377.   if (! takestime)
  378.     switch(random_range(32)) {
  379.     case 0:print2("Boingg!"); break;
  380.     case 1:print2("Whooosh!"); break;
  381.     case 2:print2("Over hill, over dale...."); break;
  382.     case 3:print2("...able to leap over 7 leagues in a single bound....");
  383.       break;
  384.     }
  385.   else if (gamestatusp(MOUNTED))
  386.     switch(random_range(32)) {
  387.     case 0:
  388.     case 1:print2("Clippity Clop.");break;
  389.     case 2:print2("....my spurs go jingle jangle jingle....");break;
  390.     case 3:print2("....as I go riding merrily along....");break;
  391.     }
  392.   else switch(random_range(32)) {
  393.   case 0:print2("Trudge. Trudge."); break;
  394.   case 1:print2("The road goes ever onward...."); break;
  395.   }
  396.   switch(Country[Player.x][Player.y].current_terrain_type) {
  397.   case RIVER:
  398.     if ((Player.y < 6) && (Player.x > 20)) locprint("Star Lake.");
  399.     else if (Player.y < 41) {
  400.       if (Player.x < 10) locprint("Aerie River.");
  401.       else locprint("The Great Flood.");
  402.     }
  403.     else if (Player.x < 42) locprint("The Swamp Runs.");
  404.     else locprint("River Greenshriek.");
  405.     if (takestime) {
  406.       Time += 60;
  407.       hourly_check();
  408.       Time += 60;
  409.       hourly_check();
  410.       Time += 60;
  411.       hourly_check();
  412.     }
  413.     break;
  414.   case ROAD:
  415.     locprint("A well-maintained road.");
  416.     if (takestime) {
  417.       Time += 60;
  418.       hourly_check();
  419.     }
  420.     break;
  421.   case PLAINS:
  422.     locprint("A rippling sea of grass.");
  423.     if (takestime) {
  424.       Time += 60;
  425.       hourly_check();
  426.       if (! gamestatusp(MOUNTED)) {
  427.     Time += 60;
  428.     hourly_check();
  429.       }
  430.     }
  431.     break;
  432.   case TUNDRA:
  433.     locprint("The Great Northern Wastes.");
  434.     if (takestime) {
  435.       Time += 60;
  436.       hourly_check();
  437.       if (! gamestatusp(MOUNTED)) {
  438.     Time += 60;
  439.     hourly_check();
  440.       }
  441.     }
  442.     break;
  443.   case FOREST:
  444.     if (Player.y < 10) locprint("The Deepwood.");
  445.     else if (Player.y < 18) locprint("The Forest of Erelon.");
  446.     else if (Player.y < 46) locprint("The Great Forest.");
  447.     if (takestime) {
  448.       Time += 60;
  449.       hourly_check();
  450.       Time += 60;
  451.       hourly_check();
  452.       if (! gamestatusp(MOUNTED)) {
  453.     Time += 60;
  454.     hourly_check();
  455.       }
  456.     }
  457.     break;
  458.   case JUNGLE:
  459.     locprint("Greenshriek Jungle.");
  460.     if (takestime) {
  461.       Time += 60;
  462.       hourly_check();
  463.       Time += 60;
  464.       hourly_check();
  465.       if (! gamestatusp(MOUNTED)) {
  466.     Time += 60;
  467.     hourly_check();
  468.     Time += 60;
  469.     hourly_check();
  470.       }
  471.     }
  472.     break;
  473.   case DESERT:
  474.     locprint("The Waste of Time.");
  475.     if (takestime) {
  476.       Time += 60;
  477.       hourly_check();
  478.       Time += 60;
  479.       hourly_check();
  480.       if (! gamestatusp(MOUNTED)) {
  481.     Time += 60;
  482.     hourly_check();
  483.     Time += 60;
  484.     hourly_check();
  485.       }
  486.     }
  487.     break;
  488.   case MOUNTAINS:
  489.     if ((Player.y < 9) && (Player.x < 12))
  490.       locprint("The Magic Mountains");
  491.     else if ((Player.y < 9) && (Player.y > 2) && (Player.x < 40))
  492.       locprint("The Peaks of the Fist.");
  493.     else if (Player.x < 52)
  494.       locprint("The Rift Mountains.");
  495.     else locprint("Borderland Mountains.");
  496.     if (takestime) {
  497.       Time += 60;
  498.       hourly_check();
  499.       Time += 60;
  500.       hourly_check();
  501.       Time += 60;
  502.       hourly_check();
  503.       Time += 60;
  504.       hourly_check();
  505.       Time += 60;
  506.       hourly_check();
  507.       if (! gamestatusp(MOUNTED)) {
  508.     Time += 60;
  509.     hourly_check();
  510.     Time += 60;
  511.     hourly_check();
  512.     Time += 60;
  513.     hourly_check();
  514.       }
  515.     }
  516.     break;
  517.   case PASS:
  518.     locprint("A hidden pass.");
  519.     if (takestime) {
  520.       Time += 60;
  521.       hourly_check();
  522.     }
  523.     break;
  524.   case CHAOS_SEA:
  525.     locprint("The Sea of Chaos.");
  526.     if (takestime) {
  527.       Time += 60;
  528.       hourly_check();
  529.     }
  530.     l_chaos();
  531.     mprint("You have entered the sea of chaos...");
  532.     break;
  533.   case SWAMP:
  534.     locprint("The Loathly Swamp.");
  535.     if (takestime) {
  536.       Time += 60;
  537.       hourly_check();
  538.       Time += 60;
  539.       hourly_check();
  540.       Time += 60;
  541.       hourly_check();
  542.       Time += 60;
  543.       hourly_check();
  544.       Time += 60;
  545.       hourly_check();
  546.       Time += 60;
  547.       hourly_check();
  548.       if (! gamestatusp(MOUNTED)) {
  549.     Time += 60;
  550.     hourly_check();
  551.     Time += 60;
  552.     hourly_check();
  553.       }
  554.     }
  555.     break;
  556.   case CITY:
  557.     if (gamestatusp(LOST)) {
  558.       resetgamestatus(LOST); 
  559.       mprint("Well, I guess you know where you are now....");
  560.     }
  561.     locprint("Outside Rampart, the city.");
  562.     break;
  563.   case VILLAGE:
  564.     if (gamestatusp(LOST)) {
  565.       resetgamestatus(LOST); 
  566.       mprint("The village guards let you know where you are....");
  567.     }
  568.     locprint("Outside a small village.");
  569.     break;
  570.   case CAVES:
  571.     locprint("A deserted hillside.");
  572.     if (takestime) {
  573.       Time += 60;
  574.       hourly_check();
  575.     }
  576.     mprint("You notice a concealed entrance into the hill.");
  577.     break;
  578.   case CASTLE:
  579.     locprint("Near a fortified castle.");
  580.     if (takestime) {
  581.       Time += 60;
  582.       hourly_check();
  583.     }
  584.     mprint("The castle is hewn from solid granite. The drawbridge is down.");
  585.     break;
  586.   case TEMPLE:
  587.     switch(Country[Player.x][Player.y].aux) {
  588.     case ODIN: locprint("A rough-hewn granite temple."); break;
  589.     case SET: locprint("A black pyramidal temple made of sandstone."); break;
  590.     case ATHENA: locprint("A classical marble-columned temple."); break;
  591.     case HECATE: locprint("A temple of ebony adorned with ivory."); break;
  592.     case DRUID: locprint("A temple formed of living trees."); break;
  593.     case DESTINY: locprint("A temple of some mysterious blue crystal."); break;
  594.     }
  595.     if (takestime) {
  596.       Time += 60;
  597.       hourly_check();
  598.     }
  599.     mprint("You notice an entrance conveniently at hand.");
  600.     break;
  601.   case MAGIC_ISLE:
  602.     locprint("A strange island in the midst of the Sea of Chaos.");
  603.     if (takestime) {
  604.       Time += 60;
  605.       hourly_check();
  606.     }
  607.     mprint("There is a narrow causeway to the island from here.");
  608.     break;
  609.   case STARPEAK:
  610.     locprint("Star Peak.");
  611.     if (takestime) {
  612.       Time += 60;
  613.       hourly_check();
  614.     }
  615.     mprint("The top of the mountain seems to glow with a allochroous aura.");
  616.     break;
  617.   case DRAGONLAIR:
  618.     locprint("A rocky chasm.");
  619.     if (takestime) {
  620.       Time += 60;
  621.       hourly_check();
  622.     }
  623.     mprint("You are at a cave entrance from which you see the glint of gold.");
  624.     break;
  625.   case VOLCANO:
  626.     locprint("HellWell Volcano.");
  627.     if (takestime) {
  628.       Time += 60;
  629.       hourly_check();
  630.     }
  631.     mprint("A shimmer of heat lightning plays about the crater rim.");
  632.     break;
  633.   default:
  634.     locprint("I haven't any idea where you are!!!");
  635.     break;
  636.    }
  637.   outdoors_random_event();
  638. }
  639.  
  640.  
  641.  
  642. void countrysearch()
  643. {
  644.   int x,y;
  645.   Time+=60;
  646.   hourly_check();
  647.   for (x=Player.x-1;x<Player.x+2;x++)
  648.     for (y=Player.y-1;y<Player.y+2;y++)
  649.       if (inbounds(x,y)) {
  650.     if (Country[x][y].current_terrain_type !=
  651.         Country[x][y].base_terrain_type) {
  652.       mprint("Your search was fruitful!");
  653.       Country[x][y].current_terrain_type=Country[x][y].base_terrain_type;
  654.       mprint("You discovered:");
  655.       mprint(countryid(Country[x][y].base_terrain_type));
  656.     }
  657.       }
  658. }
  659.  
  660. char *countryid(terrain)
  661. char terrain;
  662. {
  663.   switch(terrain) {
  664.   case MOUNTAINS:
  665.     strcpy(Str1,"Almost impassable mountains");
  666.     break;
  667.   case PLAINS:
  668.     strcpy(Str1,"Seemingly endless plains");
  669.     break;
  670.   case TUNDRA:
  671.     strcpy(Str1,"A frosty stretch of tundra");
  672.     break;
  673.   case ROAD:
  674.     strcpy(Str1,"A paved highway");
  675.     break;
  676.   case PASS:
  677.     strcpy(Str1,"A secret mountain pass");
  678.     break;
  679.   case RIVER:
  680.     strcpy(Str1,"A rolling river");
  681.     break;
  682.   case CITY:
  683.     strcpy(Str1,"The city of Rampart");
  684.     break;
  685.   case VILLAGE:
  686.     strcpy(Str1,"A rural village");
  687.     break;
  688.   case FOREST:
  689.     strcpy(Str1,"A verdant forest");
  690.     break;
  691.   case JUNGLE:
  692.     strcpy(Str1,"A densely overgrown jungle");
  693.     break;
  694.   case SWAMP:
  695.     strcpy(Str1,"A swampy fen");
  696.     break;
  697.   case VOLCANO:
  698.     strcpy(Str1,"A huge active volcano");
  699.     break;
  700.   case CASTLE:
  701.     strcpy(Str1,"An imposing castle");
  702.     break;
  703.   case STARPEAK:
  704.     strcpy(Str1,"A mysterious mountain.");
  705.     break;
  706.   case DRAGONLAIR:
  707.     strcpy(Str1,"A cavern filled with treasure.");
  708.     break;
  709.   case MAGIC_ISLE:
  710.     strcpy(Str1,"An island emanating magic.");
  711.     break;
  712.   case CAVES:
  713.     strcpy(Str1,"A hidden cave entrance");
  714.     break;
  715.   case TEMPLE:
  716.     strcpy(Str1,"A neoclassical temple");
  717.     break;
  718.   case DESERT:
  719.     strcpy(Str1,"A sere desert");
  720.     break;
  721.   case CHAOS_SEA:
  722.     strcpy(Str1,"The Sea of Chaos");
  723.     break;
  724.   default:
  725.     strcpy(Str1,"I have no idea.");
  726.     break;
  727.   }
  728.   return(Str1);
  729. }
  730.  
  731. /* i is the offset from CITYSITEBASE, not the actual constant */
  732. char *citysiteid(i)
  733. int i;
  734. {
  735.   switch(i+CITYSITEBASE) {
  736.   case L_CHARITY:strcpy(Str4,"hospice"); break;
  737.   case L_ORDER:strcpy(Str4,"order of paladins"); break;
  738.   case L_ARMORER:strcpy(Str4,"armorer"); break;
  739.   case L_CLUB:strcpy(Str4,"explorers' club"); break;
  740.   case L_GYM:strcpy(Str4,"gymnasium"); break;
  741.   case L_THIEVES_GUILD:strcpy(Str4,"thieves' guild"); break;
  742.   case L_COLLEGE:strcpy(Str4,"collegium magii"); break;
  743.   case L_HEALER:strcpy(Str4,"healer"); break;
  744.   case L_CASINO:strcpy(Str4,"casino"); break;
  745.   case L_TAVERN:strcpy(Str4,"tavern"); break;
  746.   case L_MERC_GUILD:strcpy(Str4,"mercenary guild"); break;
  747.   case L_ALCHEMIST:strcpy(Str4,"alchemist"); break;
  748.   case L_SORCERORS:strcpy(Str4,"sorcerors' guild "); break;
  749.   case L_CASTLE:strcpy(Str4,"castle"); break;
  750.   case L_ARENA:strcpy(Str4,"arena"); break;
  751.   case L_DPW:strcpy(Str4,"department of public works"); break;
  752.   case L_LIBRARY:strcpy(Str4,"library"); break;
  753.   case L_PAWN_SHOP:strcpy(Str4,"pawn shop"); break;
  754.   case L_BANK:strcpy(Str4,"bank"); break;
  755.   case L_CONDO:strcpy(Str4,"condo"); break;
  756.   case L_ORACLE:strcpy(Str4,"oracle"); break;
  757.   case L_BROTHEL:strcpy(Str4,"brothel"); break;
  758.   case L_DINER:strcpy(Str4,"diner"); break;
  759.   case L_COMMANDANT:strcpy(Str4,"fast food"); break;
  760.   case L_CRAP:strcpy(Str4,"les crapuleux"); break;
  761.   case L_TEMPLE:strcpy(Str4,"temple"); break;
  762.   case L_COUNTRYSIDE:strcpy(Str4,"city gates"); break;
  763.   default:strcpy(Str4,"???"); break;
  764.   }
  765.   return(Str4);
  766. }
  767.  
  768.  
  769.  
  770. void expandsiteabbrevs(prefix)
  771. char prefix[80];
  772. {
  773.   int i,printed=FALSE;
  774.   
  775.   menuclear();
  776.   menuprint("\nPossible Sites:\n");
  777.   for (i=0;i<NUMCITYSITES;i++)
  778.     if (CitySiteList[i][0] && strprefix(prefix,citysiteid(i))) {
  779.       menuprint(citysiteid(i));
  780.       menuprint("\n");
  781.       printed = TRUE;
  782.     }
  783.   if (! printed)
  784.     menuprint("\nNo known sites match that prefix!");
  785. }
  786.  
  787.  
  788. int expandsite(prefix)
  789. char prefix[80];
  790. {
  791.   int i,site,matched=0;
  792.   
  793.   for (i=0;i<NUMCITYSITES;i++)
  794.     if (CitySiteList[i][0] && strprefix(prefix,citysiteid(i))) {
  795.       site = i;
  796.       matched++;
  797.     }
  798.   if (matched==0) {
  799.     print3("No known locations match that prefix!");
  800.     return(ABORT);
  801.   }
  802.   else if (matched > 1) {
  803.     print3("That is an ambiguous abbreviation!");
  804.     return(ABORT);
  805.   }
  806.   else return(site);
  807. }
  808.  
  809.  
  810.  
  811. int parsecitysite()
  812. {
  813.   int site= -3,place=0;
  814.   char byte,prefix[80];
  815.  
  816.   prefix[0]=0;
  817.  
  818.   do {
  819.     byte = mgetc();
  820.     if ((byte >= 'A') && (byte <= 'Z')) {
  821.       maddch(byte+'a'-'A');
  822.       prefix[place] = byte+'a'-'A';
  823.       prefix[place+1] = 0;
  824.       place++;
  825.     }
  826.     else if ((byte == ' ') || ((byte >= 'a') && (byte <= 'z'))) {
  827.       maddch(byte);
  828.       prefix[place] = byte;
  829.       prefix[place+1] = 0;
  830.       place++;
  831.     }
  832.     else if ((byte == 8) || (byte == 127)) { /* ^h or delete */ 
  833.       prefix[place]=0;
  834.       if (place > 0) {
  835.     place--;
  836.     dobackspace();
  837.       }
  838.     }
  839.     else if (byte == '?') {
  840.       maddch(byte);
  841.       expandsiteabbrevs(prefix);
  842.       dobackspace();
  843.     }
  844.     else if (byte == '\n')
  845.       site = expandsite(prefix);
  846.     else if (byte == ESCAPE)
  847.       site = ABORT;
  848.   } while (site == -3);
  849.   xredraw();
  850.   return(site);
  851. }
  852.  
  853. /* are there hostile monsters within 2 moves? */
  854. int hostilemonstersnear()
  855. {
  856.   int i,j,hostile = FALSE;
  857.  
  858.   for (i=Player.x-2;((i<Player.x+3)&&(! hostile));i++)
  859.     for (j=Player.y-2;((j<Player.y+3)&&(! hostile));j++)
  860.       if (inbounds(i,j))
  861.     if (Level->site[i][j].creature != NULL)
  862.       hostile = m_statusp(Level->site[i][j].creature,HOSTILE);
  863.   
  864.   return(hostile);
  865. }
  866.  
  867. /* random effects from some of stones in villages */  
  868. /* if alignment of stone is alignment of player, gets done sooner */
  869. int stonecheck(alignment)
  870. {
  871.   int *stone,match=FALSE,cycle=FALSE,i;
  872.  
  873.   if (alignment == 1) {
  874.     stone = &Lawstone;
  875.     match = Player.alignment > 0;
  876.   }
  877.   else if (alignment == -1) {
  878.     stone = &Chaostone;
  879.     match = Player.alignment < 0;
  880.   }
  881.   else {
  882.     stone = &Mindstone;
  883.     match = FALSE;
  884.   }
  885.   *stone += random_range(4) + (match ? random_range(4) : 0);
  886.   switch((*stone)++) {
  887.   case 0:case 2:case 4:case 6:case 8:case 10:case 12:case 14:case 16:case 18:
  888.   case 20:case 22:case 24:case 26:case 28:case 30:case 32:case 34:case 36:
  889.   case 38:case 40: print1("The stone glows grey.");
  890.     print2("Not much seems to happen this time."); 
  891.     (*stone)--;
  892.     break;
  893.   case 1: print1("The stone glows black"); 
  894.     print2("A burden has been removed from your shoulders.....");
  895.     print3("Your pack has disintegrated!");
  896.     for(i=0;i<MAXPACK;i++) 
  897.       if (Player.pack[i] != NULL) {
  898.     free((char *) Player.pack[i]);
  899.     Player.pack[i] = NULL;
  900.       }
  901.     Player.packptr = 0;
  902.     break;
  903.   case 3: print1("The stone glows microwave");
  904.     print2("A vortex of antimana spins about you!");
  905.     dispel(-1);
  906.     break;
  907.   case 5: print1("The stone glows infrared");
  908.     print2("A portal opens nearby and an obviously confused monster appears!");
  909.     summon(-1,-1);
  910.     break;
  911.   case 7: print1("The stone glows brick red");
  912.     print2("A gold piece falls from the heavens into your money pouch!");
  913.     Player.cash++;
  914.     break;
  915.   case 9: print1("The stone glows cherry red");
  916.     print2("A flush of warmth spreads through your body.");
  917.     augment(1);
  918.     break;
  919.   case 11: print1("The stone glows orange");
  920.     print2("A flux of energy blasts you!"); 
  921.     manastorm(Player.x,Player.y,random_range(Player.maxhp)+1);
  922.     break;
  923.   case 13: print1("The stone glows lemon yellow");
  924.     print2("You're surrounded by enemies! You begin to foam at the mouth.");
  925.     Player.status[BERSERK] += 10;
  926.     break;
  927.   case 15: print1("The stone glows yellow");
  928.     print2("Oh no! The DREADED AQUAE MORTIS!");
  929.     morewait();
  930.     print2("No, wait, it's just your imagination.");
  931.     break;
  932.   case 17: print1("The stone glows chartreuse");
  933.     print2("Your joints stiffen up.");
  934.     Player.agi -= 3;
  935.     break;
  936.   case 19: print1("The stone glows green");
  937.     print2("You come down with an acute case of Advanced Leprosy.");
  938.     Player.status[DISEASED] = 1100;
  939.     Player.hp = 1;
  940.     Player.dex -= 5;
  941.     break;
  942.   case 21: print1("The stone glows forest green");
  943.     print2("You feel wonderful!");
  944.     Player.status[HERO]+=10;
  945.     break;
  946.   case 23: print1("The stone glows cyan");
  947.     print2("You feel a strange twisting sensation....");
  948.     strategic_teleport(-1);
  949.     break;
  950.   case 25: print1("The stone glows blue");
  951.     morewait();
  952.     print1("You feel a tingle of an unearthly intuition:");
  953.     hint();
  954.     break;
  955.   case 27: print1("The stone glows navy blue");
  956.     print2("A sudden shock of knowledge overcomes you.");
  957.     morewait();
  958.     clearmsg();
  959.     identify(1);
  960.     knowledge(1);
  961.     break;
  962.   case 29: print1("The stone glows blue-violet");
  963.     print2("You feel forgetful.");
  964.     for(i=0;i<NUMSPELLS;i++) 
  965.       if (Spells[i].known) {
  966.     Spells[i].known = FALSE;
  967.     break;
  968.       }
  969.     break;
  970.   case 31: print1("The stone glows violet");
  971.     acquire(0);
  972.     break;
  973.   case 33: print1("The stone glows deep purple");
  974.     print2("You vanish.");
  975.     Player.status[INVISIBLE]+=10;
  976.     break;
  977.   case 35: print1("The stone glows ultraviolet");
  978.     print2("All your hair rises up on end.... A bolt of lightning hits you!");
  979.     p_damage(random_range(Player.maxhp),ELECTRICITY,"mystic lightning");
  980.     break;
  981.   case 37: print1("The stone glows roentgen");
  982.     print2("You feel more experienced.");
  983.     gain_experience((Player.level+1)*250);
  984.     break;
  985.   case 39: print1("The stone glows gamma"); 
  986.     print2("Your left hand shines silvery, and your right emits a golden aura."); 
  987.     enchant(1);
  988.     bless(1);
  989.     print3("Your hands stop glowing.");
  990.     break;
  991.   case 41:case 42:case 43:case 44:case 45:case 46:case 47:case 48:case 49:
  992.     print1("The stone glows cosmic!");
  993.     print2("The stone's energy field quiets for a moment...");
  994.     *stone = 50;
  995.     cycle = TRUE;
  996.     break;  
  997.   default: print1("The stone glows polka-dot (?!?!?!?)");
  998.     print2("You feel a strange twisting sensation....");
  999.     *stone = 0;
  1000.     strategic_teleport(-1);
  1001.     break;
  1002.   }
  1003.   calc_melee();
  1004.   return(cycle);
  1005. }
  1006.  
  1007. void alert_guards()
  1008. {
  1009.   int foundguard=FALSE;
  1010.   pml ml;
  1011.   for(ml=Level->mlist;ml!=NULL;ml=ml->next)
  1012.     if (((ml->m->id == ML0+3) ||  /*guard*/
  1013.      ((ml->m->id == ML0+8) && (ml->m->aux2 == 15))) && /*justiciar*/
  1014.     (ml->m->hp > 0)) {
  1015.       foundguard=TRUE;
  1016.       m_status_set(ml->m,AWAKE);
  1017.       m_status_set(ml->m,HOSTILE);
  1018.     }
  1019.   if (foundguard) print2("You hear a whistle and the sound of running feet!");
  1020.   if ((! foundguard) && (Current_Environment == E_CITY)) {
  1021.     print2("The last member of the Order of Paladins dies....");
  1022.     gain_experience(1000);
  1023.     Player.alignment -= 250;
  1024.     if (! gamestatusp(KILLED_LAWBRINGER)) {
  1025.       morewait();
  1026.       print1("A chime sounds from far away.... The sound grows stronger....");
  1027.       print2("Suddenly the great shadowy form of the LawBringer appears over");
  1028.       print3("the city. He points his finger at you....");
  1029.       morewait();
  1030.       print1("Cursed art thou, minion of chaos! May thy strength fail thee");
  1031.       print2("in thy hour of need! You feel an unearthly shiver as the");
  1032.       print3("LawBringer waves his palm across the city skies....");
  1033.       Player.str /= 2;
  1034.       morewait();
  1035.       print1("You hear a bell tolling, and eerie moans all around you....");
  1036.       print2("Suddenly, the image of the LawBringer is gone.");
  1037.       print3("You hear a guardsman's whistle in the distance!");
  1038.       morewait();
  1039.       resurrect_guards();
  1040.     }
  1041.     else {
  1042.       print1("The Order's magical defenses have dropped, and the");
  1043.       print2("Legions of Chaos strike....");
  1044.       morewait();
  1045.       print1("The city shakes! An earthquake has struck!");
  1046.       print2("Cracks open in the street, and a chasm engulfs the Order HQ!");
  1047.       print3("Flames lick across the sky and you hear wild laughter....");
  1048.       gain_experience(5000);
  1049.       destroy_order();
  1050.     }
  1051.   }
  1052. }
  1053.  
  1054.  
  1055. /* can only occur when player is in city, so OK to use Level */
  1056. void destroy_order()
  1057. {
  1058.   int i,j;
  1059.   setgamestatus(DESTROYED_ORDER);
  1060.   if (Level != City) print1("Zounds! A Serious Mistake!");
  1061.   else 
  1062.     for(i=35;i<46;i++)
  1063.       for(j=61;j<64;j++) {
  1064.     Level->site[i][j].locchar = RUBBLE;
  1065.     Level->site[i][j].p_locf = L_RUBBLE;
  1066.     if (Level->site[i][j].creature != NULL)
  1067.       free((char *) Level->site[i][j].creature);
  1068.     make_site_monster(i,j,ML2+6);
  1069.     Level->site[i][j].creature->monstring = 
  1070.       salloc("ghost of a Paladin");
  1071.     m_status_set(Level->site[i][j].creature,HOSTILE);
  1072.       }
  1073. }
  1074.  
  1075.  
  1076.  
  1077. int maneuvers()
  1078. {
  1079.   int m;
  1080.   float times;
  1081.   times = (Player.status[HASTED] ? 2.0 : 1.0);
  1082.   times *= (Player.status[SLOWED] ? 0.5 : 1.0);
  1083.  
  1084.   m = 2 + Player.level/7;
  1085.   if (Player.rank[ARENA]) m++;
  1086.   m = ((int) (m*times));
  1087.   m = min(8,max(1,m));
  1088.   
  1089.   return(m);
  1090. }
  1091.  
  1092. /* for when haste runs out, etc. */
  1093. void default_maneuvers()
  1094. {
  1095.   int i;
  1096.   morewait();
  1097.   clearmsg();
  1098.   print1("Warning, resetting your combat options to the default.");
  1099.   print2("Use the 'F' command to select which options you prefer.");
  1100.   morewait();
  1101.   for(i=0;i<maneuvers();i+=2) {
  1102.     Player.meleestr[i*2]='A';
  1103.     Player.meleestr[(i+1)*2]='B';
  1104.     Player.meleestr[((i+1)*2)+1]='C';
  1105.     Player.meleestr[(i*2)+1]='C';
  1106.   }
  1107.   Player.meleestr[maneuvers()*2]=0;
  1108. }
  1109.