LCOV - code coverage report
Current view: top level - omega-rpg-0.90-pa9 - aux2.c (source / functions) Hit Total Coverage
Test: lcov.info Lines: 236 781 30.2 %
Date: 2017-09-08 22:00:26 Functions: 19 25 76.0 %
Branches: 141 527 26.8 %

           Branch data     Line data    Source code
       1                 :            : /* omega copyright (C) by Laurence Raphael Brothers, 1987,1988,1989 */
       2                 :            : /* aux2.c */
       3                 :            : /* some functions called by ocom.c, also see aux1.c and aux3.c*/ 
       4                 :            : /* This is a real grab bag file. It contains functions used by
       5                 :            :    aux1.c and omega.c, as well as elsewhere. It is mainly here so aux1.c
       6                 :            :    and aux3.c are not huge */
       7                 :            : 
       8                 :            : #include "glob.h"
       9                 :            : 
      10                 :            : /* Player stats like str, agi, etc give modifications to various abilities
      11                 :            :    chances to do things, etc. Positive is good, negative bad. */
      12                 :        116 : int statmod(int stat)
      13                 :            : {
      14                 :        116 :   return((stat-10)/2);
      15                 :            : }
      16                 :            : 
      17                 :            : 
      18                 :            : /* effects of hitting */
      19                 :          6 : void p_hit (struct monster *m,int dmg,int dtype)
      20                 :            : {
      21                 :          6 :   int dmult = 0;
      22                 :            : 
      23                 :            :   /* chance for critical hit..., 3/10 */
      24      [ +  -  + ]:          6 :   switch (random_range(10)) {  
      25                 :            :     case 0:
      26         [ -  + ]:          2 :     if (random_range(100) < (Player.level
      27                 :            : #ifdef INCLUDE_MONKS
      28                 :          2 :  + Player.rank[MONKS]
      29                 :            : #endif
      30                 :            :         )) {
      31                 :          0 :       strcpy(Str3,"You annihilate ");
      32                 :          0 :       dmult = 1000;
      33                 :            :     }
      34                 :            :     else {
      35                 :          2 :       strcpy(Str3,"You blast "); 
      36                 :          2 :       dmult=5; 
      37                 :            :     }
      38                 :          2 :     break;
      39                 :            :     case 1:
      40                 :            :     case 2: 
      41                 :          0 :     strcpy(Str3,"You smash "); 
      42                 :          0 :     dmult=2; break;
      43                 :            : 
      44                 :            :     default: 
      45                 :          4 :     dmult=1;
      46         [ +  + ]:          4 :     if (random_range(10)) strcpy(Str3,"You hit ");
      47                 :            : #ifdef NEW_QUOTES
      48   [ -  -  -  -  :          2 :     else switch(random_range(12)) {
          -  +  -  -  -  
             +  -  -  - ]
      49                 :            : #else
      50                 :            :     else switch(random_range(4)) {
      51                 :            : #endif
      52                 :          0 :     case 0: strcpy(Str3,"You damage "); break;
      53                 :          0 :     case 1: strcpy(Str3,"You inflict bodily harm on "); break;
      54                 :          0 :     case 2: strcpy(Str3,"You injure "); break;
      55                 :          0 :     case 3: strcpy(Str3,"You molest "); break;
      56                 :          0 :     case 4: strcpy(Str3,"You tweak "); break;
      57                 :          1 :     case 5: strcpy(Str3,"You smush "); break;
      58                 :          0 :     case 6: strcpy(Str3,"You smurf "); break;
      59                 :          0 :     case 7: strcpy(Str3,"You grind "); break;
      60                 :          0 :     case 8: strcpy(Str3,"You hurt "); break;
      61                 :          1 :     case 9: strcpy(Str3,"You bring pain to "); break;
      62                 :          0 :     case 10: strcpy(Str3,"You recite nasty poetry at "); break;
      63                 :          0 :     case 11: strcpy(Str3,"You smack "); break;
      64                 :            :     }
      65                 :          4 :     break;
      66                 :            :   } 
      67                 :            : 
      68         [ -  + ]:          6 :   if (Lunarity == 1) dmult = dmult * 2;
      69         [ -  + ]:          6 :   else if (Lunarity == -1) dmult = dmult / 2;
      70         [ +  - ]:          6 :   if (m->uniqueness == COMMON) strcat(Str3,"the ");
      71                 :          6 :   strcat(Str3,m->monstring);
      72                 :          6 :   strcat(Str3,". ");
      73         [ +  - ]:          6 :   if (Verbosity != TERSE) mprint(Str3);
      74                 :          0 :   else mprint("You hit it.");
      75                 :            : 
      76                 :            : #ifdef INCLUDE_MONKS
      77         [ -  + ]:          6 :   if (Player.possessions[O_WEAPON_HAND] == NULL) { /*barehanded*/
      78         [ #  # ]:          0 :     if (Player.rank[MONKS] > MONK_MASTER_SIGHS) {
      79                 :            :       /* high level monks do unstoppable hand damage */
      80                 :          0 :       dtype = UNSTOPPABLE;
      81                 :            :     }
      82                 :            :   }
      83                 :            : #endif    
      84                 :          6 :   m_damage(m,dmult * random_range(dmg),dtype);
      85 [ +  - ][ +  + ]:          6 :   if ((Verbosity != TERSE) && (random_range(10)==3) && (m->hp > 0))
                 [ +  + ]
      86                 :          2 :     mprint("It laughs at the injury and fights on!");
      87                 :          6 : }
      88                 :            : 
      89                 :            : /* and effects of missing */
      90                 :         10 : void player_miss(struct monster *m,int dtype)
      91                 :            : {
      92         [ -  + ]:         10 :   if (random_range(30)==1) /* fumble 1 in 30 */
      93                 :          0 :     p_fumble(dtype);
      94                 :            :   else {
      95         [ +  - ]:         10 :     if (Verbosity != TERSE) {
      96         [ +  + ]:         10 :       if (random_range(10))
      97                 :          8 :         strcpy(Str3,"You miss ");
      98   [ -  +  -  +  :          2 :       else switch(random_range(4)) {
                      - ]
      99                 :          0 :       case 0: strcpy(Str3,"You flail lamely at "); break;
     100                 :          1 :       case 1: strcpy(Str3,"You only amuse "); break;
     101                 :          0 :       case 2: strcpy(Str3,"You fail to even come close to "); break;
     102                 :          1 :       case 3: strcpy(Str3,"You totally avoid contact with "); break;
     103                 :            :       } 
     104         [ +  - ]:         10 :       if (m->uniqueness == COMMON) strcat(Str3,"the ");
     105                 :         10 :       strcat(Str3,m->monstring);
     106                 :         10 :       strcat(Str3,". ");
     107                 :         10 :       mprint(Str3);
     108                 :            :     }
     109                 :          0 :     else mprint("You missed it.");
     110                 :            :   }  
     111                 :         10 : }
     112                 :            : 
     113                 :            : /* oh nooooo, a fumble.... */
     114                 :          0 : void p_fumble(int dtype)
     115                 :            : {
     116                 :          0 :   mprint("Ooops! You fumbled....");
     117   [ #  #  #  # ]:          0 :   switch(random_range(10)) {
     118                 :            :     case 0:
     119                 :            :     case 1:
     120                 :            :     case 2:
     121                 :            :     case 3: 
     122                 :            :     case 4: 
     123                 :          0 :     case 5: drop_weapon(); break;
     124                 :            :     case 6:
     125                 :            :     case 7:
     126                 :          0 :     case 8: break_weapon(); break;
     127                 :          0 :     case 9: mprint("Oh No! You hit yourself!");
     128                 :          0 :             p_damage(Player.dmg,dtype,"stupidity");
     129                 :          0 :             break;
     130                 :            :   }
     131                 :          0 : }           
     132                 :            : 
     133                 :            : /* try to drop a weapon (from fumbling) */
     134                 :          0 : void drop_weapon(void)
     135                 :            : {
     136         [ #  # ]:          0 :   if (Player.possessions[O_WEAPON_HAND] != NULL) {
     137                 :          0 :     strcpy(Str1,"You dropped your ");
     138                 :          0 :     strcat(Str1,Player.possessions[O_WEAPON_HAND]->objstr);
     139                 :          0 :     mprint(Str1);
     140                 :          0 :     morewait();
     141                 :          0 :     p_drop_at(Player.x,Player.y,1,Player.possessions[O_WEAPON_HAND]);
     142                 :          0 :     conform_lost_objects(1,Player.possessions[O_WEAPON_HAND]);
     143                 :            :   }
     144                 :          0 :   else mprint("You feel fortunate.");
     145                 :          0 : }
     146                 :            : 
     147                 :            : 
     148                 :            : /* try to break a weapon (from fumbling) */
     149                 :          0 : void break_weapon(void)
     150                 :            : {
     151         [ #  # ]:          0 :   if (Player.possessions[O_WEAPON_HAND] != NULL) {
     152                 :          0 :     strcpy(Str1,"Your ");
     153                 :          0 :     strcat(Str1,itemid(Player.possessions[O_WEAPON_HAND]));
     154                 :          0 :     strcat(Str1," vibrates in your hand....");
     155                 :          0 :     mprint(Str1);
     156                 :          0 :     (void) damage_item(Player.possessions[O_WEAPON_HAND]);
     157                 :          0 :     morewait();
     158                 :            :   }
     159                 :          0 : }
     160                 :            : 
     161                 :            : 
     162                 :            : /* hooray */
     163                 :          0 : void p_win(void)
     164                 :            : {
     165                 :          0 :   morewait();
     166                 :          0 :   clearmsg();
     167                 :          0 :   print1("You won!");
     168                 :          0 :   morewait();
     169                 :          0 :   display_win();
     170                 :          0 :   endgraf();
     171                 :          0 :   exit(0);
     172                 :            : }
     173                 :            : 
     174                 :            : 
     175                 :            : /* handle a h,j,k,l, etc., to change x and y by dx and dy */
     176                 :            : /* for targeting in dungeon */
     177                 :         92 : void movecursor(int *x, int *y, int dx, int dy)
     178                 :            : {
     179         [ +  - ]:         92 :   if (inbounds(*x+dx,*y+dy)) {
     180                 :         92 :     *x += dx;
     181                 :         92 :     *y += dy;
     182                 :         92 :     screencheck(*x,*y);
     183                 :            :   }
     184                 :         92 :   omshowcursor(*x,*y);
     185                 :         92 : }
     186                 :            : 
     187                 :            : 
     188                 :            : /* is Player immune to damage type dtype */
     189                 :          9 : int p_immune(int dtype)
     190                 :            : {
     191                 :          9 :   return(Player.immunity[dtype]>0);
     192                 :            : }
     193                 :            : 
     194                 :            : 
     195                 :            : /* deal with each possible stati -- values are per move */
     196                 :            : /* this function is executed every move */
     197                 :            : /* A value over 1000 indicates a permanent effect */
     198                 :        171 : void minute_status_check(void)
     199                 :            : {
     200                 :            :   int i;
     201                 :            : 
     202         [ -  + ]:        171 :   if (Player.status[HASTED]>0) {
     203         [ #  # ]:          0 :     if (Player.status[HASTED] < 1000) {
     204                 :          0 :       Player.status[HASTED]--;
     205         [ #  # ]:          0 :       if (Player.status[HASTED]==0) {
     206                 :          0 :         mprint("The world speeds up.");
     207                 :          0 :         calc_melee();
     208                 :            :       }
     209                 :            :     }
     210                 :            :   }
     211                 :            : 
     212                 :            : 
     213         [ -  + ]:        171 :   if (Player.status[POISONED]>0) {
     214                 :          0 :     Player.status[POISONED]--;
     215                 :          0 :     p_damage(3,POISON,"poison");
     216         [ #  # ]:          0 :     if (Player.status[POISONED] == 0) {
     217                 :          0 :       showflags();
     218                 :          0 :       mprint("You feel better now.");
     219                 :            :     }
     220                 :            :   }
     221                 :            : 
     222                 :            : 
     223         [ -  + ]:        171 :   if (Player.immunity[UNSTOPPABLE]>0) {
     224         [ #  # ]:          0 :     for(i=0;i<NUMIMMUNITIES;i++)
     225                 :          0 :     Player.immunity[i]--;
     226         [ #  # ]:          0 :     if (Player.immunity[UNSTOPPABLE]==1)
     227                 :          0 :       mprint("You feel vincible again.");
     228                 :            :   }
     229                 :            : 
     230                 :            : 
     231         [ -  + ]:        171 :   if (Player.status[IMMOBILE]>0) {
     232                 :          0 :     Player.status[IMMOBILE]--;
     233         [ #  # ]:          0 :     if (Player.status[IMMOBILE] == 0) 
     234                 :          0 :       mprint("You can move again.");
     235                 :            :   }
     236                 :            : 
     237                 :            : 
     238         [ -  + ]:        171 :   if (Player.status[SLEPT]>0) {
     239                 :          0 :     Player.status[SLEPT]--;
     240         [ #  # ]:          0 :     if (Player.status[SLEPT] == 0) {
     241                 :          0 :       mprint("You woke up.");
     242                 :            :     }
     243                 :            :   }
     244                 :            : 
     245         [ -  + ]:        171 :   if (Player.status[REGENERATING]>0) {
     246 [ #  # ][ #  # ]:          0 :     if ((Player.hp < Player.maxhp) && (Player.mana > 0)){
     247                 :          0 :       Player.hp++;
     248                 :          0 :       Player.mana--;
     249                 :          0 :       dataprint();
     250                 :            :     }
     251         [ #  # ]:          0 :     if (Player.status[REGENERATING] < 1000) {
     252                 :          0 :       Player.status[REGENERATING]--;
     253         [ #  # ]:          0 :       if (Player.status[REGENERATING] == 0) {
     254                 :          0 :         mprint("You feel less homeostatic.");
     255                 :            :       }
     256                 :            :     }
     257                 :            :   }
     258                 :            : 
     259         [ -  + ]:        171 :   if (Player.status[SLOWED]>0) {
     260         [ #  # ]:          0 :     if (Player.status[SLOWED] < 1000) {
     261                 :          0 :       Player.status[SLOWED]--;
     262         [ #  # ]:          0 :       if (Player.status[SLOWED] == 0) {
     263                 :          0 :         mprint("You feel quicker now.");
     264                 :          0 :         calc_melee();
     265                 :            :       }
     266                 :            :     }
     267                 :            :   }
     268                 :            : 
     269         [ -  + ]:        171 :   if (Player.status[RETURNING]>0) {
     270                 :          0 :     Player.status[RETURNING]--;
     271         [ #  # ]:          0 :     if (Player.status[RETURNING] == 10)
     272                 :          0 :       mprint("Your return spell slowly hums towards activation...");
     273         [ #  # ]:          0 :     else if (Player.status[RETURNING] == 8)
     274                 :          0 :       mprint("There is an electric tension in the air!");
     275         [ #  # ]:          0 :     else if (Player.status[RETURNING] == 5)
     276                 :          0 :       mprint("A vortex of mana begins to form around you!");
     277         [ #  # ]:          0 :     else if (Player.status[RETURNING] == 1)
     278                 :          0 :       mprint("Your surroundings start to warp and fade!");
     279         [ #  # ]:          0 :     if (Player.status[RETURNING] == 0)
     280                 :          0 :       level_return();
     281                 :            :   }
     282                 :            :   
     283         [ -  + ]:        171 :   if (Player.status[AFRAID]>0) {
     284         [ #  # ]:          0 :     if (Player.status[AFRAID] < 1000) {
     285                 :          0 :       Player.status[AFRAID]--;
     286         [ #  # ]:          0 :       if (Player.status[AFRAID] == 0) {
     287                 :          0 :         mprint("You feel bolder now.");
     288                 :            :       }
     289                 :            :     }
     290                 :            :   }
     291                 :            :   
     292                 :        171 : }
     293                 :            : 
     294                 :            : 
     295                 :            : 
     296                 :            : /* effect of gamma ray radiation... */
     297                 :          1 : void moon_check(void)
     298                 :            : {
     299                 :            :   /* 24 day lunar cycle */
     300                 :          1 :   Phase = (Phase+1)%24;
     301                 :          1 :   phaseprint();
     302                 :          1 :   Lunarity = 0;
     303 [ -  + ][ #  # ]:          1 :   if (((Player.patron == DRUID) && ((Phase/2 == 3) || (Phase/2 == 9))) ||
         [ #  # ][ +  - ]
     304 [ +  - ][ -  + ]:          1 :       ((Player.alignment > 10) && (Phase/2 == 6)) ||
     305         [ #  # ]:          0 :       ((Player.alignment < -10) && (Phase/2 == 0))) {
     306                 :          0 :     mprint("As the moon rises you feel unusually vital!");
     307                 :          0 :     Lunarity = 1;
     308                 :            :   }
     309                 :            :   else
     310 [ -  + ][ #  # ]:          1 :   if (((Player.patron == DRUID) && ((Phase/2 == 0) || (Phase/2 == 6))) ||
         [ #  # ][ +  - ]
     311 [ +  - ][ -  + ]:          1 :       ((Player.alignment > 10) && (Phase/2 == 0)) ||
     312         [ #  # ]:          0 :       ((Player.alignment < -10) && (Phase/2 == 6))) {
     313                 :          0 :     mprint("The rise of the moon tokens a strange enervation!");
     314                 :          0 :     Lunarity = -1;
     315                 :            :   }
     316                 :            : 
     317                 :          1 : }
     318                 :            : 
     319                 :            : 
     320                 :            : 
     321                 :            : /* check 1/hour for torch to burn out if used */
     322                 :         31 : void torch_check(void)
     323                 :            : {
     324                 :            :   int i;
     325         [ +  + ]:         93 :   for(i=O_READY_HAND;i<=O_WEAPON_HAND;i++) {
     326         [ +  + ]:         62 :     if (Player.possessions[i]!=NULL)
     327 [ -  + ][ #  # ]:         61 :       if ((Player.possessions[i]->id == OB_TORCH) && /*torch */
     328                 :          0 :           (Player.possessions[i]->aux > 0)) {
     329                 :          0 :         Player.possessions[i]->aux--;
     330         [ #  # ]:          0 :         if (Player.possessions[i]->aux==0) {
     331                 :          0 :           mprint("Your torch goes out!!!");
     332                 :          0 :           conform_unused_object(Player.possessions[i]);
     333         [ #  # ]:          0 :           if (Player.possessions[i]->number > 1) {
     334                 :          0 :             Player.possessions[i]->number--;
     335                 :          0 :             Player.possessions[i]->aux = 6;
     336                 :            :           }
     337                 :            :           else {
     338                 :          0 :             Player.possessions[i]->usef = I_NO_OP;
     339                 :          0 :             Player.possessions[i]->cursestr =
     340                 :          0 :               Player.possessions[i]->truename =
     341                 :          0 :                 Player.possessions[i]->objstr = "burnt-out torch";
     342                 :            :           }
     343                 :            :         }
     344                 :            :       }
     345                 :            :   }
     346                 :         31 : }
     347                 :            : 
     348                 :            : 
     349                 :            : 
     350                 :            : /* values are in multiples of ten minutes */
     351                 :            : /* values over 1000 indicate a permanent effect */
     352                 :         43 : void tenminute_status_check(void)
     353                 :            : {
     354 [ -  + ][ #  # ]:         43 :   if ((Player.status[SHADOWFORM]>0) && (Player.status[SHADOWFORM]<1000)) {
     355                 :          0 :     Player.status[SHADOWFORM]--;
     356         [ #  # ]:          0 :     if (Player.status[SHADOWFORM] == 0) {
     357                 :          0 :       Player.immunity[NORMAL_DAMAGE]--;
     358                 :          0 :       Player.immunity[ACID]--;
     359                 :          0 :       Player.immunity[THEFT]--;
     360                 :          0 :       Player.immunity[INFECTION]--;
     361                 :          0 :       mprint("You feel less shadowy now.");
     362                 :            :     }
     363                 :            :   }
     364                 :            : 
     365 [ -  + ][ #  # ]:         43 :   if ((Player.status[ILLUMINATION]>0) && (Player.status[ILLUMINATION]<1000)) {
     366                 :          0 :     Player.status[ILLUMINATION]--;
     367         [ #  # ]:          0 :     if (Player.status[ILLUMINATION] == 0) {
     368                 :          0 :       mprint("Your light goes out!");
     369                 :            :     }
     370                 :            :   }
     371                 :            : 
     372                 :            : 
     373 [ -  + ][ #  # ]:         43 :   if ((Player.status[VULNERABLE]>0) && (Player.status[VULNERABLE]<1000)){
     374                 :          0 :     Player.status[VULNERABLE]--;
     375         [ #  # ]:          0 :     if (Player.status[VULNERABLE] == 0)
     376                 :          0 :       mprint("You feel less endangered.");
     377                 :            :   }
     378                 :            : 
     379                 :            : 
     380 [ -  + ][ #  # ]:         43 :   if ((Player.status[DEFLECTION]>0) && (Player.status[DEFLECTION]<1000)){
     381                 :          0 :     Player.status[DEFLECTION]--;
     382         [ #  # ]:          0 :     if (Player.status[DEFLECTION] == 0)
     383                 :          0 :       mprint("You feel less well defended.");
     384                 :            :   }
     385                 :            : 
     386 [ -  + ][ #  # ]:         43 :   if ((Player.status[ACCURATE]>0) && (Player.status[ACCURACY]<1000)){
     387                 :          0 :     Player.status[ACCURATE]--;
     388         [ #  # ]:          0 :     if (Player.status[ACCURATE] == 0) {
     389                 :          0 :       calc_melee();
     390                 :          0 :       mprint("The bulls' eyes go away.");
     391                 :            :     }
     392                 :            :   }
     393 [ -  + ][ #  # ]:         43 :   if ((Player.status[HERO]>0) && (Player.status[HERO]<1000)){
     394                 :          0 :     Player.status[HERO]--;
     395         [ #  # ]:          0 :     if (Player.status[HERO] == 0) {
     396                 :          0 :       calc_melee();
     397                 :          0 :       mprint("You feel less than super.");
     398                 :            :     }
     399                 :            :   }
     400                 :            : 
     401 [ -  + ][ #  # ]:         43 :   if ((Player.status[LEVITATING]>0) && (Player.status[LEVITATING]<1000)){
     402                 :          0 :     Player.status[LEVITATING]--;
     403         [ #  # ]:          0 :     if (Player.status[LEVITATING] == 0)
     404                 :          0 :       mprint("You're no longer walking on air.");
     405                 :            :   }
     406                 :            : 
     407         [ -  + ]:         43 :   if (Player.status[DISEASED]>0) {
     408                 :          0 :     Player.status[DISEASED]--;
     409         [ #  # ]:          0 :     if (Player.status[DISEASED] == 0) {
     410                 :          0 :       showflags();
     411                 :          0 :       mprint("You feel better now.");
     412                 :            :     }
     413                 :            :   }
     414                 :            : 
     415                 :            : 
     416 [ -  + ][ #  # ]:         43 :   if ((Player.status[INVISIBLE] > 0) && (Player.status[INVISIBLE]<1000)){
     417                 :          0 :     Player.status[INVISIBLE]--;
     418         [ #  # ]:          0 :     if (Player.status[INVISIBLE] == 0)
     419                 :          0 :       mprint("You feel more opaque now.");
     420                 :            :   }
     421                 :            : 
     422 [ -  + ][ #  # ]:         43 :   if ((Player.status[BLINDED]>0) && (Player.status[BLINDED]<1000)) {
     423                 :          0 :     Player.status[BLINDED]--;
     424         [ #  # ]:          0 :     if (Player.status[BLINDED] == 0) 
     425                 :          0 :       mprint("You can see again.");
     426                 :            :   }
     427                 :            : 
     428 [ -  + ][ #  # ]:         43 :   if ((Player.status[TRUESIGHT]>0) && (Player.status[TRUESIGHT]<1000)) {
     429                 :          0 :     Player.status[TRUESIGHT]--;
     430         [ #  # ]:          0 :     if (Player.status[TRUESIGHT] == 0) 
     431                 :          0 :       mprint("You feel less keen now.");
     432                 :            :   }
     433                 :            : 
     434 [ -  + ][ #  # ]:         43 :   if ((Player.status[BERSERK]>0) && (Player.status[BERSERK]<1000)) {
     435                 :          0 :     Player.status[BERSERK]--;
     436         [ #  # ]:          0 :     if (Player.status[BERSERK] == 0) 
     437                 :          0 :       mprint("You stop foaming at the mouth.");
     438                 :            :   }
     439                 :            : 
     440 [ -  + ][ #  # ]:         43 :   if ((Player.status[ALERT]>0) && (Player.status[ALERT] < 1000)) {
     441                 :          0 :     Player.status[ALERT]--;
     442         [ #  # ]:          0 :     if (Player.status[ALERT] == 0) 
     443                 :          0 :       mprint("You feel less alert now.");
     444                 :            :   }
     445                 :            : 
     446 [ -  + ][ #  # ]:         43 :   if ((Player.status[BREATHING]>0) && (Player.status[BREATHING] < 1000)) {
     447                 :          0 :     Player.status[BREATHING]--;
     448         [ #  # ]:          0 :     if (Player.status[BREATHING] == 0) 
     449                 :          0 :       mprint("You feel somewhat congested."); 
     450                 :            :   }
     451                 :            : 
     452 [ -  + ][ #  # ]:         43 :   if ((Player.status[DISPLACED]>0) && (Player.status[DISPLACED] < 1000)) {
     453                 :          0 :     Player.status[DISPLACED]--;
     454         [ #  # ]:          0 :     if (Player.status[DISPLACED]==0) 
     455                 :          0 :       mprint("You feel a sense of position.");
     456                 :            :   }
     457                 :         43 :   timeprint();
     458                 :         43 :   dataprint();
     459                 :         43 : }
     460                 :            : 
     461                 :            : 
     462                 :            : 
     463                 :            : /* Increase in level at appropriate experience gain */
     464                 :          2 : void gain_level(void)
     465                 :            : {
     466                 :          2 :   int gained=FALSE;
     467                 :            :   int hp_gain; /* FIXED! 12/30/98 */
     468                 :            :   
     469         [ -  + ]:          2 :   if (gamestatusp(SUPPRESS_PRINTING))
     470                 :          0 :     return;
     471         [ +  + ]:          3 :   while (expval(Player.level+1) <= Player.xp) {
     472         [ +  - ]:          1 :     if (!gained)
     473                 :          1 :       morewait();
     474                 :          1 :     gained = TRUE;
     475                 :          1 :     Player.level++;
     476                 :          1 :     print1("You have attained a new experience level!");
     477                 :          1 :     print2("You are now ");
     478                 :          1 :     nprint2(getarticle(levelname(Player.level)));
     479                 :          1 :     nprint2(levelname(Player.level));
     480                 :          1 :     hp_gain = random_range(Player.con)+1; /* start fix 12/30/98 */
     481         [ +  - ]:          1 :     if (Player.hp < Player.maxhp )
     482                 :          1 :       Player.hp += hp_gain*Player.hp/Player.maxhp;
     483         [ #  # ]:          0 :     else if (Player.hp < Player.maxhp + hp_gain)
     484                 :          0 :       Player.hp = Player.maxhp + hp_gain;
     485                 :            :     /* else leave current hp alone */
     486                 :          1 :     Player.maxhp += hp_gain;
     487                 :          1 :     Player.maxmana = calcmana();
     488                 :            :     /* If the character was given a bonus, let him keep it.  Otherwise
     489                 :            :      * recharge him. */
     490                 :          1 :     Player.mana = max(Player.mana, Player.maxmana); /* end fix 12/30/98 */
     491                 :          1 :     morewait();
     492                 :            :   }
     493         [ +  + ]:          2 :   if (gained) clearmsg();
     494                 :          2 :   calc_melee();
     495                 :            : }
     496                 :            : 
     497                 :            : /* experience requirements */
     498                 :          3 : long expval(plevel)
     499                 :            : int plevel;
     500                 :            : {
     501   [ -  -  +  +  :          3 :   switch(plevel) {
          -  -  -  -  -  
                -  -  - ]
     502                 :          0 :     case 0:return(0L);
     503                 :          0 :     case 1:return(20L);
     504                 :          1 :     case 2:return(50L);
     505                 :          2 :     case 3:return(200L);
     506                 :          0 :     case 4:return(500L);
     507                 :          0 :     case 5:return(1000L);
     508                 :          0 :     case 6:return(2000L);
     509                 :          0 :     case 7:return(3000L);
     510                 :          0 :     case 8:return(5000L);
     511                 :          0 :     case 9:return(7000L);
     512                 :          0 :     case 10:return(10000L);
     513                 :            :     default:
     514         [ #  # ]:          0 :       if (plevel < 20)
     515                 :          0 :         return((plevel-9) * 10000L);
     516                 :            :       else
     517                 :          0 :         return((plevel-9) * 10000L +
     518                 :          0 :          (plevel-19)*(plevel-19)*500);
     519                 :            :   }
     520                 :            : }
     521                 :            : 
     522                 :            : /* If an item is unidentified, it isn't worth much to those who would buy it */
     523                 :          7 : long item_value(pob item)
     524                 :            : {
     525         [ +  - ]:          7 :   if (item->known == 0) {
     526         [ -  + ]:          7 :     if (item->objchar == THING) return(1);
     527                 :          7 :     else return(true_item_value(item) / 10);
     528                 :            :   }
     529         [ #  # ]:          0 :   else if (item->known == 1) {
     530         [ #  # ]:          0 :     if (item->objchar == THING) return(item->basevalue);
     531                 :          0 :     else return(item->basevalue / 2);
     532                 :            :   }
     533                 :          0 :   else return(true_item_value(item));
     534                 :            : }
     535                 :            : 
     536                 :            : 
     537                 :            : /* figures value based on item base-value, charge, plus, and blessing */
     538                 :         18 : long true_item_value(pob item)
     539                 :            : {
     540                 :         18 :  long value = item->basevalue;
     541                 :            :   
     542         [ +  + ]:         18 :   if (item->objchar == THING) return(item->basevalue);
     543                 :            :   else {
     544         [ +  + ]:         16 :     if (item->objchar == STICK) value += value*item->charge/20;
     545         [ +  + ]:         16 :     if (item->plus > -1) value += value*item->plus/4;
     546                 :          1 :     else value /= -item->plus;
     547         [ +  + ]:         16 :     if (item->blessing > 0) value *= 2;
     548                 :         16 :     return((long) value);
     549                 :            :   }
     550                 :            : }
     551                 :            : 
     552                 :            : /* kill off player if he isn't got the "breathing" status */
     553                 :          0 : void p_drown(void)
     554                 :            : {
     555                 :          0 :   int attempts = 3, i;
     556                 :            : 
     557         [ #  # ]:          0 :   if (Player.status[BREATHING] > 0)
     558                 :          0 :     mprint("Your breathing is unaffected!");
     559 [ #  # ][ #  # ]:          0 :   else while (Player.possessions[O_ARMOR] ||
     560                 :          0 :       Player.itemweight > ((int) (Player.maxweight / 2))) {
     561                 :          0 :     menuclear();
     562   [ #  #  #  #  :          0 :     switch (attempts--) {
                      # ]
     563                 :          0 :       case 3: print3("You try to hold your breath..."); break;
     564                 :          0 :       case 2: print3("You try to hold your breath... You choke..."); break;
     565                 :          0 :       case 1: print3("You try to hold your breath... You choke... Your lungs fill..."); break;
     566                 :          0 :       case 0: p_death("drowning");
     567                 :            :     }
     568                 :          0 :     morewait();
     569                 :          0 :     menuprint("a: Drop an item.\n");
     570                 :          0 :     menuprint("b: Bash an item.\n");
     571                 :          0 :     menuprint("c: Drop your whole pack.\n");
     572                 :          0 :     showmenu();
     573   [ #  #  #  # ]:          0 :     switch(menugetc()) {
     574                 :            :       case 'a':
     575                 :          0 :         drop();
     576 [ #  # ][ #  # ]:          0 :         if (Level->site[Player.x][Player.y].p_locf == L_WATER && Level->site[Player.x][Player.y].things)
     577                 :            :         {
     578                 :          0 :             mprint("It sinks without a trace.");
     579                 :          0 :             free_objlist(Level->site[Player.x][Player.y].things);
     580                 :          0 :             Level->site[Player.x][Player.y].things = NULL;
     581                 :            :         }
     582                 :          0 :         break;
     583                 :            :       case 'b':
     584                 :          0 :         bash_item();
     585                 :          0 :         break;
     586                 :            :       case 'c':
     587                 :          0 :         setgamestatus(SUPPRESS_PRINTING);
     588         [ #  # ]:          0 :         for(i=0;i<MAXPACK;i++) {
     589         [ #  # ]:          0 :           if (Player.pack[i] != NULL) {
     590         [ #  # ]:          0 :             if (Level->site[Player.x][Player.y].p_locf != L_WATER)
     591                 :            :             {
     592                 :          0 :               p_drop_at(Player.x,Player.y,Player.pack[i]->number,Player.pack[i]);
     593                 :          0 :               free_obj( Player.pack[i], TRUE );
     594                 :            :             } else
     595                 :          0 :               free_obj( Player.pack[i], TRUE );
     596                 :            :           }
     597                 :          0 :           Player.pack[i] = NULL;
     598                 :            :         }
     599         [ #  # ]:          0 :         if (Level->site[Player.x][Player.y].p_locf == L_WATER)
     600                 :          0 :           mprint("It sinks without a trace.");
     601                 :          0 :         Player.packptr = 0;
     602                 :          0 :         resetgamestatus(SUPPRESS_PRINTING);
     603                 :          0 :         calc_melee();
     604                 :          0 :         break;
     605                 :            :     }
     606                 :            :   }
     607                 :          0 :   show_screen();
     608                 :          0 :   return;
     609                 :            : }
     610                 :            : 
     611                 :            : 
     612                 :            : /* the effect of some weapon on monster m, with dmgmod a bonus to damage */
     613                 :          6 : void weapon_use(int dmgmod, pob weapon, struct monster *m)
     614                 :            : {
     615         [ +  - ]:          6 :   int aux = (weapon==NULL ? -2 : weapon->aux); /* bare hands */
     616   [ -  +  -  -  :          6 :   switch(aux) {
          -  -  -  -  -  
          -  -  -  -  -  
                      - ]
     617                 :          0 :     case -2: weapon_bare_hands(dmgmod,m); break;
     618                 :            :     default:
     619                 :          6 :     case I_NO_OP: weapon_normal_hit(dmgmod,weapon,m); break;
     620                 :          0 :     case I_ACIDWHIP: weapon_acidwhip(dmgmod,weapon,m); break;
     621                 :          0 :     case I_TANGLE: weapon_tangle(dmgmod,weapon,m); break;
     622                 :          0 :     case I_ARROW: weapon_arrow(dmgmod,weapon,m); break;
     623                 :          0 :     case I_BOLT: weapon_bolt(dmgmod,weapon,m); break;
     624                 :          0 :     case I_DEMONBLADE: weapon_demonblade(dmgmod,weapon,m); break;
     625                 :          0 :     case I_LIGHTSABRE: weapon_lightsabre(dmgmod,weapon,m); break;
     626                 :          0 :     case I_MACE_DISRUPT: weapon_mace_disrupt(dmgmod,weapon,m); break;
     627                 :          0 :     case I_VORPAL: weapon_vorpal(dmgmod,weapon,m); break;
     628                 :          0 :     case I_DESECRATE: weapon_desecrate(dmgmod,weapon,m); break;
     629                 :          0 :     case I_FIRESTAR: weapon_firestar(dmgmod,weapon,m); break;
     630                 :          0 :     case I_DEFEND: weapon_defend(dmgmod,weapon,m); break;
     631                 :          0 :     case I_VICTRIX: weapon_victrix(dmgmod,weapon,m); break;
     632                 :          0 :     case I_SCYTHE: weapon_scythe(dmgmod,weapon,m); break;
     633                 :            :   }
     634                 :          6 : }
     635                 :            : 
     636                 :            : 
     637                 :            : /* for printing actions in printactions above */
     638                 :         37 : char *actionlocstr(char dir)
     639                 :            : {
     640   [ +  +  +  - ]:         37 :   switch(dir) {
     641                 :         14 :   case 'L': strcpy(Str3,"low."); break;
     642                 :         12 :   case 'C': strcpy(Str3,"center."); break;
     643                 :         11 :   case 'H': strcpy(Str3,"high."); break;
     644                 :          0 :   default: strcpy(Str3,"wildly."); break;
     645                 :            :   }
     646                 :         37 :   return(Str3);
     647                 :            : }
     648                 :            : 
     649                 :            : 
     650                 :            : /* execute player combat actions versus monster m */
     651                 :         16 : void tacplayer(struct monster *m)
     652                 :            : {
     653                 :         16 :   int i=0;
     654                 :            : 
     655         [ +  + ]:         48 :   while (i < strlen(Player.meleestr)) {
     656         [ +  + ]:         32 :     if (m->hp > 0) {
     657   [ -  +  -  + ]:         30 :       switch(Player.meleestr[i]) {
     658                 :            :       case 't': case 'T':
     659         [ #  # ]:          0 :         if (Player.possessions[O_WEAPON_HAND] == NULL) 
     660                 :          0 :           strcpy(Str1,"You punch ");
     661                 :          0 :         else strcpy(Str1,"You thrust ");
     662                 :          0 :         strcat(Str1,actionlocstr(Player.meleestr[i+1]));
     663         [ #  # ]:          0 :         if (Verbosity == VERBOSE) mprint(Str1);
     664         [ #  # ]:          0 :         if (player_hit(2*statmod(Player.dex),Player.meleestr[i+1],m))
     665                 :          0 :           weapon_use(0,Player.possessions[O_WEAPON_HAND],m);
     666                 :          0 :         else player_miss(m,NORMAL_DAMAGE);
     667                 :          0 :         break;
     668                 :            :       case 'c': case 'C':
     669         [ -  + ]:         16 :         if (Player.possessions[O_WEAPON_HAND] == NULL) 
     670                 :          0 :           strcpy(Str1,"You punch ");
     671         [ +  - ]:         16 :         else if (Player.possessions[O_WEAPON_HAND]->type == CUTTING) 
     672                 :         16 :           strcpy(Str1,"You cut ");
     673         [ #  # ]:          0 :         else if (Player.possessions[O_WEAPON_HAND]->type == STRIKING) 
     674                 :          0 :           strcpy(Str1,"You strike ");
     675                 :          0 :         else strcpy(Str1,"You attack ");
     676                 :         16 :         strcat(Str1,actionlocstr(Player.meleestr[i+1]));
     677         [ +  - ]:         16 :         if (Verbosity == VERBOSE) mprint(Str1);
     678         [ +  + ]:         16 :         if (player_hit(0,Player.meleestr[i+1],m))
     679                 :          6 :           weapon_use(2*statmod(Player.str),
     680                 :          6 :                      Player.possessions[O_WEAPON_HAND],
     681                 :            :                      m);
     682                 :         10 :         else player_miss(m,NORMAL_DAMAGE);
     683                 :         16 :         break;
     684                 :            :       case 'l': case 'L':
     685                 :          0 :         strcpy(Str1,"You lunge ");
     686                 :          0 :         strcat(Str1,actionlocstr(Player.meleestr[i+1]));
     687         [ #  # ]:          0 :         if (Verbosity == VERBOSE) mprint(Str1);
     688         [ #  # ]:          0 :         if (player_hit(Player.level+Player.dex,Player.meleestr[i+1],m))
     689                 :          0 :           weapon_use(Player.level,Player.possessions[O_WEAPON_HAND],m);
     690                 :          0 :         else player_miss(m,NORMAL_DAMAGE);
     691                 :          0 :         break;
     692                 :            :       }
     693                 :            :     }    
     694                 :         32 :     i+=2;
     695                 :            :   }
     696                 :         16 : }
     697                 :            : 
     698                 :            : 
     699                 :            : 
     700                 :            : 
     701                 :            : /* checks to see if player hits with hitmod vs. monster m at location hitloc */
     702                 :         16 : int player_hit(int hitmod, char hitloc, struct monster *m)
     703                 :            : {
     704                 :         16 :   int i=0,blocks=FALSE,goodblocks=0,hit;
     705         [ -  + ]:         16 :   if (m->hp < 1) {
     706                 :          0 :     mprint("Unfortunately, your opponent is already dead!");
     707                 :          0 :     return(FALSE);
     708                 :            :   }
     709                 :            :   else {
     710         [ -  + ]:         16 :     if (hitloc == 'X') hitloc = random_loc();
     711                 :            : 
     712                 :         16 :     transcribe_monster_actions(m);
     713                 :            : 
     714         [ +  + ]:         80 :     while (i<strlen(m->meleestr)) {
     715 [ +  + ][ -  + ]:         64 :       if ((m->meleestr[i] == 'B') || (m->meleestr[i] == 'R')) {
     716                 :         47 :         blocks = TRUE;
     717         [ +  + ]:         47 :         if (hitloc == m->meleestr[i+1])
     718                 :         11 :           goodblocks++;
     719                 :            :       }
     720                 :         64 :       i+=2;
     721                 :            :     }
     722                 :            : 
     723         [ -  + ]:         16 :     if (! blocks) goodblocks = -1;
     724                 :         16 :     hit = hitp(Player.hit+hitmod,m->ac+goodblocks*10);
     725 [ +  + ][ +  + ]:         16 :     if ((! hit) && (goodblocks > 0)) {
     726         [ +  - ]:          4 :       if (m->uniqueness == COMMON) {
     727                 :          4 :         strcpy(Str1,"The ");
     728                 :          4 :         strcat(Str1,m->monstring);
     729                 :            :       }
     730                 :          0 :       else strcpy(Str1,m->monstring);
     731                 :          4 :       strcat(Str1," blocks it!");
     732         [ +  - ]:          4 :       if (Verbosity == VERBOSE) mprint(Str1);
     733                 :            :     }
     734                 :         16 :     return(hit);
     735                 :            :   }
     736                 :            : }
     737                 :            : 
     738                 :            : 
     739                 :            : /* This function is used to undo all items temporarily, should
     740                 :            : always be used in pairs with on being TRUE and FALSE, and may cause
     741                 :            : anomalous stats and item-usage if used indiscriminately */
     742                 :            : 
     743                 :          0 : void toggle_item_use(int on)
     744                 :            : {
     745                 :            :   static int used[MAXITEMS];
     746                 :            :   int i;
     747                 :          0 :   setgamestatus(SUPPRESS_PRINTING);
     748         [ #  # ]:          0 :   if (on) 
     749         [ #  # ]:          0 :     for(i=0;i<MAXITEMS;i++) {
     750                 :          0 :       used[i] = FALSE;
     751         [ #  # ]:          0 :       if (Player.possessions[i] != NULL) {
     752         [ #  # ]:          0 :         if ((used[i] = Player.possessions[i]->used) == TRUE) {
     753                 :          0 :           Player.possessions[i]->used = FALSE;
     754                 :          0 :           item_use(Player.possessions[i]);
     755                 :            :         }
     756                 :            :       }
     757                 :            :     }
     758                 :            :   else {
     759         [ #  # ]:          0 :     for(i=1;i<MAXITEMS;i++) 
     760         [ #  # ]:          0 :       if (used[i]) {
     761                 :          0 :         Player.possessions[i]->used = TRUE;
     762                 :          0 :         item_use(Player.possessions[i]);
     763                 :            :       }
     764                 :          0 :     calc_melee();
     765                 :          0 :     showflags();
     766                 :          0 :     dataprint();
     767                 :          0 :     timeprint();
     768                 :            :   }
     769                 :          0 :   resetgamestatus(SUPPRESS_PRINTING);
     770                 :          0 : }
     771                 :            : 
     772                 :            : 
     773                 :          1 : void enter_site(Symbol site)
     774                 :            : {
     775   [ +  -  -  -  :          1 :   switch(site) {
          -  -  -  -  -  
                   -  - ]
     776                 :          1 :   case CITY: change_environment(E_CITY); break;
     777                 :          0 :   case VILLAGE: change_environment(E_VILLAGE); break;
     778                 :          0 :   case CAVES: change_environment(E_CAVES); break;
     779                 :          0 :   case CASTLE: change_environment(E_CASTLE); break;
     780                 :          0 :   case VOLCANO: change_environment(E_VOLCANO); break;
     781                 :          0 :   case TEMPLE: change_environment(E_TEMPLE); break;
     782                 :          0 :   case DRAGONLAIR: change_environment(E_DLAIR); break;
     783                 :          0 :   case STARPEAK: change_environment(E_STARPEAK); break;
     784                 :          0 :   case MAGIC_ISLE: change_environment(E_MAGIC_ISLE); break;
     785                 :          0 :   case PALACE: change_environment(E_PALACE); break;
     786                 :          0 :   default:print3("There's nothing to enter here!"); break;
     787                 :            :   }
     788                 :          1 : }
     789                 :            : 
     790                 :            : 
     791                 :            : 
     792                 :            : /* Switches context dungeon/countryside/city, etc */
     793                 :          6 : void change_environment(char new_environment)
     794                 :            : {
     795                 :          6 :   int i, emerging = FALSE;
     796                 :            : 
     797                 :          6 :   Player.sx = -1;
     798                 :          6 :   Player.sy = -1; /* reset sanctuary if there was one */
     799                 :            : 
     800                 :            :   /* missing message if gets lost on site... */
     801         [ -  + ]:          6 :   if (gamestatusp(LOST))
     802                 :            :     {
     803                 :          0 :       resetgamestatus(LOST);    /* in case the player gets lost _on_ a site */
     804                 :          0 :       mprint("You know where you are now."); /* but didn't inform player... DAG */
     805                 :            :     }
     806                 :            : 
     807                 :          6 :   resetgamestatus(FAST_MOVE);
     808                 :            : 
     809                 :          6 :   Last_Environment = Current_Environment;
     810         [ +  + ]:          6 :   if (Last_Environment == E_COUNTRYSIDE)
     811                 :            :     {
     812                 :          3 :       LastCountryLocX = Player.x;
     813                 :          3 :       LastCountryLocY = Player.y;
     814                 :            :     }
     815                 :            : 
     816 [ +  - ][ +  + ]:          6 :   if (((Last_Environment == E_CITY) ||
     817         [ +  - ]:          1 :        (Last_Environment == E_VILLAGE)) &&
     818         [ +  - ]:          1 :       ((new_environment == E_MANSION) ||
     819         [ +  - ]:          1 :        (new_environment == E_HOUSE) ||
     820         [ +  - ]:          1 :        (new_environment == E_HOVEL) ||
     821         [ -  + ]:          1 :        (new_environment == E_SEWERS) ||
     822                 :            :        (new_environment == E_ARENA)))
     823                 :            :     {
     824                 :          0 :       LastTownLocX = Player.x;
     825                 :          0 :       LastTownLocY = Player.y;
     826                 :            :     }
     827                 :            : 
     828 [ +  - ][ +  - ]:          6 :   else if (((Last_Environment == E_MANSION) ||
     829         [ +  - ]:          6 :             (Last_Environment == E_HOUSE) ||
     830         [ +  - ]:          6 :             (Last_Environment == E_HOVEL) ||
     831         [ -  + ]:          6 :             (Last_Environment == E_SEWERS) ||
     832         [ #  # ]:          0 :             (Last_Environment == E_ARENA)) &&
     833         [ #  # ]:          0 :            ((new_environment == E_CITY) ||
     834                 :            :             (new_environment == E_VILLAGE)))
     835                 :            :     {
     836                 :          0 :       setPlayerXY( LastTownLocX, LastTownLocY);
     837                 :          0 :       emerging = TRUE;
     838                 :            :     }
     839                 :            : 
     840                 :          6 :   Current_Environment = new_environment;
     841   [ -  -  -  -  :          6 :   switch (new_environment)
          -  -  -  -  -  
          -  -  +  -  -  
          -  -  -  -  +  
                +  -  - ]
     842                 :            :     {
     843                 :            :     case E_ARENA:
     844                 :          0 :       setPlayerXY(5, 7);
     845                 :          0 :       setgamestatus(ARENA_MODE);
     846                 :          0 :       load_arena();
     847                 :          0 :       ScreenOffset = 0;
     848                 :          0 :       ScreenXOffset = 0;
     849                 :          0 :       show_screen();
     850                 :          0 :       break;
     851                 :            : 
     852                 :            :     case E_ABYSS:
     853                 :          0 :       setPlayerXY(32, 15);
     854                 :          0 :       load_abyss();
     855                 :          0 :       abyss_file();
     856                 :          0 :       lose_all_items();
     857                 :          0 :       ScreenOffset = 0;
     858                 :          0 :       ScreenXOffset = 0;
     859                 :          0 :       show_screen();
     860                 :          0 :       break;
     861                 :            : 
     862                 :            :     case E_CIRCLE:
     863                 :          0 :       setPlayerXY(32, 14);
     864                 :          0 :       load_circle(TRUE);
     865         [ #  # ]:          0 :       if (Objects[OB_STARGEM].uniqueness == UNIQUE_TAKEN)
     866                 :            :         {
     867                 :          0 :           print1("A bemused voice says:");
     868                 :          0 :           print2("'Why are you here? You already have the Star Gem!'");
     869                 :          0 :           morewait();
     870                 :            :         }
     871         [ #  # ]:          0 :       else if (Player.rank[CIRCLE] > 0)
     872                 :            :         {
     873                 :          0 :           print1("You hear the voice of the Prime Sorceror:");
     874                 :          0 :           print2("'Congratulations on your attainment of the Circle's Demesne.'");
     875                 :          0 :           morewait();
     876                 :          0 :           print1("For the honor of the Circle, you may take the Star Gem");
     877                 :          0 :           print2("and destroy it on the acme of Star Peak.");
     878                 :          0 :           morewait();
     879                 :          0 :           print1("Beware the foul LawBringer who resides there...");
     880                 :          0 :           print2("By the way, some of the members of the Circle seem to");
     881                 :          0 :           morewait();
     882                 :          0 :           print1("have become a bit jealous of your success --");
     883                 :          0 :           print2("I'd watch out for them too if I were you.");
     884                 :          0 :           morewait();
     885                 :            :         }
     886         [ #  # ]:          0 :       else if (Player.alignment > 0)
     887                 :            :         {
     888                 :          0 :           print1("A mysterious ghostly image materializes in front of you.");
     889                 :          0 :           print2("It speaks: 'Greetings, fellow abider in Law. I am called");
     890                 :          0 :           morewait();
     891                 :          0 :           print1("The LawBringer. If you wish to advance our cause, obtain");
     892                 :          0 :           print2("the mystic Star Gem and return it to me on Star Peak.");
     893                 :          0 :           morewait();
     894                 :          0 :           print1("Beware the power of the evil Circle of Sorcerors and the");
     895                 :          0 :           print2("forces of Chaos which guard the gem.'");
     896                 :          0 :           morewait();
     897                 :          0 :           print1("The strange form fades slowly.");
     898                 :          0 :           morewait();
     899                 :            :         }
     900                 :          0 :       ScreenOffset = 0;
     901                 :          0 :       ScreenXOffset = 0;
     902                 :          0 :       show_screen();
     903                 :          0 :       break;
     904                 :            : 
     905                 :            :     case E_COURT:
     906                 :          0 :       setPlayerXY(32, 2);
     907                 :          0 :       LastCountryLocX = 6;
     908                 :          0 :       LastCountryLocY = 1;
     909                 :          0 :       load_court(TRUE);
     910                 :          0 :       ScreenOffset = 0;
     911                 :          0 :       ScreenXOffset = 0;
     912                 :          0 :       show_screen();
     913                 :          0 :       break;
     914                 :            : 
     915                 :            :     case E_MANSION:
     916                 :          0 :       load_house(E_MANSION, TRUE);
     917                 :          0 :       setPlayerXY(2, 8);
     918                 :          0 :       ScreenOffset = 0;
     919                 :          0 :       ScreenXOffset = 0;
     920                 :          0 :       show_screen();
     921                 :          0 :       break;
     922                 :            : 
     923                 :            :     case E_HOUSE:
     924                 :          0 :       load_house(E_HOUSE, TRUE);
     925                 :          0 :       setPlayerXY(2, 13);
     926                 :          0 :       ScreenOffset = 0;
     927                 :          0 :       ScreenXOffset = 0;
     928                 :          0 :       show_screen();
     929                 :          0 :       break;
     930                 :            : 
     931                 :            :     case E_HOVEL:
     932                 :          0 :       load_house(E_HOVEL, TRUE);
     933                 :          0 :       setPlayerXY(2, 9);
     934                 :          0 :       ScreenOffset = 0;
     935                 :          0 :       ScreenXOffset = 0;
     936                 :          0 :       show_screen();
     937                 :          0 :       break;
     938                 :            : 
     939                 :            :     case E_DLAIR:
     940                 :          0 :       setPlayerXY(0, 8);
     941                 :          0 :       load_dlair(gamestatusp(KILLED_DRAGONLORD), TRUE);
     942                 :          0 :       ScreenOffset = 0;
     943                 :          0 :       ScreenXOffset = 0;
     944                 :          0 :       show_screen();
     945                 :          0 :       break;
     946                 :            : 
     947                 :            :     case E_STARPEAK:
     948                 :          0 :       setPlayerXY(2, 9);
     949                 :          0 :       load_speak(gamestatusp(KILLED_LAWBRINGER), TRUE);
     950                 :          0 :       ScreenOffset = 0;
     951                 :          0 :       ScreenXOffset = 0;
     952                 :          0 :       show_screen();
     953                 :          0 :       break;
     954                 :            : 
     955                 :            :     case E_MAGIC_ISLE:
     956                 :          0 :       setPlayerXY(62, 14);
     957                 :          0 :       load_misle(gamestatusp(KILLED_EATER), TRUE);
     958                 :          0 :       ScreenOffset = 0;
     959                 :          0 :       ScreenXOffset = 0;
     960                 :          0 :       show_screen();
     961                 :          0 :       break;
     962                 :            : 
     963                 :            :     case E_TEMPLE:
     964                 :          0 :       load_temple(Country[Player.x][Player.y].aux, TRUE);
     965                 :          0 :       setPlayerXY(32, 15);
     966                 :          0 :       ScreenOffset = 0;
     967                 :          0 :       ScreenXOffset = 0;
     968                 :          0 :       show_screen();
     969                 :          0 :       break;
     970                 :            : 
     971                 :            :   case E_CITY:
     972         [ -  + ]:          1 :     if (emerging) {
     973                 :          0 :       print1("You emerge onto the street.");
     974                 :          0 :       emerging = FALSE;
     975                 :            :     }
     976                 :            :     else {
     977                 :          1 :       print1("You pass through the massive gates of Rampart, the city.");
     978                 :          1 :     setPlayerXY(62, 20);
     979                 :            :     }
     980         [ -  + ]:          1 :     if (City == NULL) load_city(TRUE);
     981                 :            : #ifdef SAVE_LEVELS
     982                 :            :     else
     983                 :            :         msdos_changelevel(Level,new_environment,0);
     984                 :            : #endif
     985                 :          1 :     Level = City;
     986                 :          1 :     ScreenOffset = Player.y - (ScreenLength/2);
     987                 :          1 :     ScreenXOffset =Player.x - (ScreenWidth/2);
     988                 :          1 :     screencheck(Player.x, Player.y);
     989                 :          1 :     show_screen();
     990                 :          1 :     break;
     991                 :            :   case E_VILLAGE:
     992         [ #  # ]:          0 :     if (!emerging) {
     993                 :            :       /* different villages per different locations */
     994   [ #  #  #  #  :          0 :       switch(Country[Player.x][Player.y].aux) {
                #  #  # ]
     995                 :            :       case VIL_STARVIEW:
     996                 :          0 :         setPlayerXY( 0, 6 );
     997                 :          0 :         Villagenum = VIL_STARVIEW;
     998                 :          0 :         break;
     999                 :            :       default: 
    1000                 :          0 :         print3("Very strange, a nonexistent village.");
    1001                 :            :       case VIL_WOODMERE:
    1002                 :          0 :         setPlayerXY( 39, 15 );
    1003                 :          0 :         Villagenum = VIL_WOODMERE;
    1004                 :          0 :         break;
    1005                 :            :       case VIL_STORMWAT:
    1006                 :          0 :         setPlayerXY( 63, 8 );
    1007                 :          0 :         Villagenum = VIL_STORMWAT;
    1008                 :          0 :         break;
    1009                 :            :       case VIL_THAUMARI: 
    1010                 :          0 :         setPlayerXY( 32, 15 );
    1011                 :          0 :         Villagenum = VIL_THAUMARI;
    1012                 :          0 :         break;
    1013                 :            :       case VIL_SKORCH: 
    1014                 :          0 :         setPlayerXY( 2, 8 );
    1015                 :          0 :         Villagenum = VIL_SKORCH;
    1016                 :          0 :         break;
    1017                 :            :       case VIL_WHORFEN: 
    1018                 :          0 :         setPlayerXY( 2, 2 );
    1019                 :          0 :         Villagenum = VIL_WHORFEN;
    1020                 :          0 :         break;
    1021                 :            :       }
    1022                 :            :     }
    1023 [ #  # ][ #  # ]:          0 :     if ((! emerging) || (TempLevel == NULL)) load_village(Villagenum, TRUE);
    1024         [ #  # ]:          0 :     else if (TempLevel->environment != E_VILLAGE) load_village(Villagenum, TRUE);
    1025                 :            : #ifndef SAVE_LEVELS
    1026                 :          0 :     else Level = TempLevel;
    1027                 :            : #else
    1028                 :            :     else {
    1029                 :            :       msdos_changelevel(Level,new_environment,0);
    1030                 :            :       Level = TempLevel;
    1031                 :            :       }
    1032                 :            : #endif
    1033         [ #  # ]:          0 :     if (emerging) {
    1034                 :          0 :       print1("You emerge onto the street.");
    1035                 :          0 :       emerging = FALSE;
    1036                 :            :     }
    1037                 :            :     else
    1038                 :          0 :       print1("You enter a small rural village.");
    1039                 :          0 :     ScreenOffset = 0;
    1040                 :          0 :     ScreenXOffset = 0;
    1041                 :          0 :     show_screen();
    1042                 :          0 :     break;
    1043                 :            :   case E_CAVES:
    1044                 :          0 :     print1("You enter a dark cleft in a hillside;");
    1045                 :          0 :     print2("You note signs of recent passage in the dirt nearby.");
    1046         [ #  # ]:          0 :     if (gamestatusp(MOUNTED)) {
    1047                 :          0 :       morewait();
    1048                 :          0 :       print1("Seeing as you might not be coming back, you feel compelled");
    1049                 :          0 :       print2("to let your horse go, rather than keep him hobbled outside.");
    1050                 :          0 :       resetgamestatus(MOUNTED);
    1051                 :          0 :       calc_melee();
    1052                 :            :     }
    1053                 :          0 :     MaxDungeonLevels = CAVELEVELS;
    1054         [ #  # ]:          0 :     if (Current_Dungeon != E_CAVES) {
    1055                 :            : #ifdef SAVE_LEVELS
    1056                 :            :     msdos_changelevel(Level,0,-1);
    1057                 :            : #endif
    1058                 :          0 :       free_dungeon();
    1059                 :          0 :       Dungeon = NULL;
    1060                 :          0 :       Level = NULL;
    1061                 :          0 :       Current_Dungeon = E_CAVES;
    1062                 :            :     }
    1063                 :          0 :     change_level(0,1,FALSE);
    1064                 :          0 :     break;
    1065                 :            :   case E_VOLCANO:
    1066                 :          0 :     print1("You pass down through the glowing crater.");
    1067         [ #  # ]:          0 :     if (gamestatusp(MOUNTED)) {
    1068                 :          0 :       morewait();
    1069                 :          0 :       print1("Seeing as you might not be coming back, you feel compelled");
    1070                 :          0 :       print2("to let your horse go, rather than keep him hobbled outside.");
    1071                 :          0 :       resetgamestatus(MOUNTED);
    1072                 :          0 :       calc_melee();
    1073                 :            :     }
    1074                 :          0 :     MaxDungeonLevels = VOLCANOLEVELS;
    1075         [ #  # ]:          0 :     if (Current_Dungeon != E_VOLCANO) {
    1076                 :            : #ifdef SAVE_LEVELS
    1077                 :            :     msdos_changelevel(Level,0,-1);
    1078                 :            : #endif
    1079                 :          0 :       free_dungeon();
    1080                 :          0 :       Dungeon = NULL;
    1081                 :          0 :       Level = NULL;
    1082                 :          0 :       Current_Dungeon = E_VOLCANO;
    1083                 :            :     }
    1084                 :          0 :     change_level(0,1,FALSE);
    1085                 :          0 :     break;
    1086                 :            :   case E_ASTRAL:
    1087                 :          0 :     print1("You are in a weird flickery maze.");
    1088         [ #  # ]:          0 :     if (gamestatusp(MOUNTED)) {
    1089                 :          0 :       print2("Your horse doesn't seem to have made it....");
    1090                 :          0 :       resetgamestatus(MOUNTED);
    1091                 :          0 :       calc_melee();
    1092                 :            :     }
    1093                 :          0 :     MaxDungeonLevels = ASTRALLEVELS;
    1094         [ #  # ]:          0 :     if (Current_Dungeon != E_ASTRAL) {
    1095                 :            : #ifdef SAVE_LEVELS
    1096                 :            :     msdos_changelevel(Level,0,-1);
    1097                 :            : #endif
    1098                 :          0 :       free_dungeon();
    1099                 :          0 :       Dungeon = NULL;
    1100                 :          0 :       Level = NULL;
    1101                 :          0 :       Current_Dungeon = E_ASTRAL;
    1102                 :            :     }
    1103                 :          0 :     change_level(0,1,FALSE);
    1104                 :          0 :     break;
    1105                 :            :   case E_CASTLE:
    1106                 :          0 :     print1("You cross the drawbridge. Strange forms move beneath the water.");
    1107         [ #  # ]:          0 :     if (gamestatusp(MOUNTED)) {
    1108                 :          0 :       morewait();
    1109                 :          0 :       print1("Seeing as you might not be coming back, you feel compelled");
    1110                 :          0 :       print2("to let your horse go, rather than keep him hobbled outside.");
    1111                 :          0 :       resetgamestatus(MOUNTED);
    1112                 :            :     }
    1113                 :          0 :     MaxDungeonLevels = CASTLELEVELS;
    1114         [ #  # ]:          0 :     if (Current_Dungeon != E_CASTLE) {
    1115                 :            : #ifdef SAVE_LEVELS
    1116                 :            :     msdos_changelevel(Level,0,-1);
    1117                 :            : #endif
    1118                 :          0 :       free_dungeon();
    1119                 :          0 :       Dungeon = NULL;
    1120                 :          0 :       Level = NULL;
    1121                 :          0 :       Current_Dungeon = E_CASTLE;
    1122                 :            :     }
    1123                 :          0 :     change_level(0,1,FALSE);
    1124                 :          0 :     break;
    1125                 :            :   case E_SEWERS:
    1126                 :          0 :     print1("You pry open a manhole and descend into the sewers below.");
    1127         [ #  # ]:          0 :     if (gamestatusp(MOUNTED)) {
    1128                 :          0 :       print2("You horse waits patiently outside the sewer entrance....");
    1129                 :          0 :       dismount_steed();
    1130                 :            :     }
    1131                 :          0 :     MaxDungeonLevels = SEWERLEVELS;
    1132         [ #  # ]:          0 :     if (Current_Dungeon != E_SEWERS) {
    1133                 :            : #ifdef SAVE_LEVELS
    1134                 :            :     msdos_changelevel(Level,0,-1);
    1135                 :            : #endif
    1136                 :          0 :       free_dungeon();
    1137                 :          0 :       Dungeon = NULL;
    1138                 :          0 :       Level = NULL;
    1139                 :          0 :       Current_Dungeon = E_SEWERS;
    1140                 :            :     }
    1141                 :          0 :     change_level(0,1,FALSE);
    1142                 :          0 :     break;
    1143                 :            :   case E_COUNTRYSIDE:
    1144                 :          3 :     print1("You return to the fresh air of the open countryside.");
    1145         [ -  + ]:          3 :     if (Last_Environment == E_CITY) {
    1146                 :          0 :       setPlayerXY(27,19);
    1147                 :            :     }
    1148                 :            :     else {
    1149                 :          3 :       setPlayerXY(LastCountryLocX,LastCountryLocY);
    1150                 :            :     }
    1151         [ +  + ]:         30 :     for(i=0;i<9;i++)
    1152                 :         27 :       c_set(Player.x+Dirs[0][i], Player.y+Dirs[1][i], SEEN);
    1153                 :          3 :     ScreenOffset = Player.y - (ScreenLength/2);
    1154                 :            :     /*     ScreenXOffset = Player.x - (ScreenWidth/2); PGM*/
    1155                 :          3 :     show_screen();
    1156                 :          3 :     break;
    1157                 :            :   case E_TACTICAL_MAP:
    1158                 :          2 :     print1("You are now on the tactical screen; exit off any side to leave");
    1159                 :          2 :     make_country_screen(Country[Player.x][Player.y].current_terrain_type);
    1160                 :          2 :     make_country_monsters(Country[Player.x][Player.y].current_terrain_type);
    1161                 :          2 :     setPlayerXY( Level->level_width/2, Level->level_length/2 );
    1162                 :            : 
    1163                 :            :     /* This should be altered to use setPlayerXY(x,y) PGM */
    1164                 :            : 
    1165         [ -  + ]:          2 :     while (Level->site[Player.x][Player.y].locchar == WATER) {
    1166         [ #  # ]:          0 :       if (Player.y < Level->level_length/2 + 5)
    1167                 :          0 :         Player.y++;
    1168         [ #  # ]:          0 :       else if (Player.x > Level->level_width/2 - 10) {
    1169                 :          0 :         Player.x--;
    1170                 :          0 :         Player.y = Level->level_length/2 - 5;
    1171                 :            :       }
    1172                 :            :       else {
    1173                 :          0 :         Level->site[Player.x][Player.y].locchar =
    1174                 :          0 :           Level->site[Player.x][Player.y].showchar = FLOOR;
    1175                 :          0 :         Level->site[Player.x][Player.y].p_locf = L_NO_OP;
    1176                 :            :       }
    1177                 :            :     }
    1178                 :          2 :     ScreenOffset = 0;
    1179                 :          2 :     ScreenXOffset = 0;
    1180                 :          2 :     show_screen();
    1181                 :          2 :     break;
    1182                 :            :   case E_PALACE:
    1183                 :          0 :     print1("You enter the dungeons of the ruined palace.");
    1184         [ #  # ]:          0 :     if (gamestatusp(MOUNTED)) {
    1185                 :          0 :       morewait();
    1186                 :          0 :       print1("Seeing as you might not be coming back, you feel compelled");
    1187                 :          0 :       print2("to let your horse go, rather than keep him hobbled outside.");
    1188                 :          0 :       resetgamestatus(MOUNTED);
    1189                 :            :     }
    1190                 :          0 :     MaxDungeonLevels = PALACELEVELS;
    1191         [ #  # ]:          0 :     if (Current_Dungeon != E_PALACE) {
    1192                 :            : #ifdef SAVE_LEVELS
    1193                 :            :     msdos_changelevel(Level,0,-1);
    1194                 :            : #endif
    1195                 :          0 :       free_dungeon();
    1196                 :          0 :       Dungeon = NULL;
    1197                 :          0 :       Level = NULL;
    1198                 :          0 :       Current_Dungeon = E_PALACE;
    1199                 :            :     }
    1200                 :          0 :     change_level(0,1,FALSE);
    1201                 :          0 :     break;
    1202                 :            :   case E_NEVER_NEVER_LAND: default:
    1203                 :          0 :     print1("There must be some mistake. You don't look like Peter Pan.");
    1204                 :          0 :     print2("(But here you are in Never-Never Land)");
    1205                 :          0 :     ScreenOffset = Player.y - (ScreenLength/2);
    1206                 :          0 :     ScreenXOffset = Player.x - (ScreenWidth/2);
    1207                 :          0 :     show_screen();
    1208                 :          0 :     break;
    1209                 :            :   }
    1210                 :          6 :   setlastxy(Player.x, Player.y);
    1211         [ +  + ]:          6 :   if (Current_Environment != E_COUNTRYSIDE)
    1212                 :          3 :     showroom(Level->site[Player.x][Player.y].roomnumber);
    1213                 :            :   else
    1214                 :          3 :     terrain_check(FALSE);
    1215                 :          6 : }

Generated by: LCOV version 1.11