LCOV - code coverage report
Current view: top level - omega-rpg-0.90-pa9 - city.c (source / functions) Hit Total Coverage
Test: lcov.info Lines: 373 467 79.9 %
Date: 2017-09-08 22:00:26 Functions: 4 9 44.4 %
Branches: 107 146 73.3 %

           Branch data     Line data    Source code
       1                 :            : /* omega copyright (C) by Laurence Raphael Brothers, 1987,1988,1989 */
       2                 :            : /* city.c */
       3                 :            : /* some functions to make the city level */
       4                 :            : 
       5                 :            : #include "glob.h"
       6                 :            : 
       7                 :            : 
       8                 :            : void mazesite( char,int,int,int );
       9                 :            : extern int WIDTH, LENGTH;
      10                 :            : void randommazesite( int,int,int );
      11                 :            : 
      12                 :            : /* loads the city level */
      13                 :          1 : void load_city(int populate)
      14                 :            : {
      15                 :            :   int i,j;
      16                 :            :   pml ml;
      17                 :            :   char site;
      18                 :            :   map *city;
      19                 :            :   map *maze;
      20                 :            :   
      21                 :          1 :   initrand(E_CITY, 0);
      22                 :            :   
      23                 :            :   /* Get the hedge maze (which is in the city). */
      24                 :          1 :   maze = map_open(MAP_hedges);
      25                 :            :   /* Choose a random level from it. */
      26                 :          1 :   map_setLevel(maze, random_range(map_getDepth(maze)));
      27                 :            :   
      28                 :            :   /* Get the city. */
      29                 :          1 :   city = map_open(MAP_city);
      30                 :          1 :   map_setLevel(city,0);
      31                 :            :   
      32                 :          1 :   TempLevel = Level;
      33         [ -  + ]:          1 :   if (ok_to_free(TempLevel)) {
      34                 :            : #ifndef SAVE_LEVELS
      35                 :          0 :     free_level(TempLevel);
      36                 :            : #endif
      37                 :          0 :     TempLevel = NULL;
      38                 :            :   }
      39                 :            : #ifndef SAVE_LEVELS
      40                 :          1 :   Level = ((plv) checkmalloc(sizeof(levtype)));
      41                 :            : #else
      42                 :            :   msdos_changelevel(TempLevel,0,-1);
      43                 :            :   Level = &TheLevel;
      44                 :            : #endif
      45                 :          1 :   clear_level(Level);
      46                 :          1 :   Level->depth = 0;
      47                 :          1 :   Level->environment = E_CITY;
      48                 :            :   
      49                 :            :   /* WDT: Rampart, as a special case, has its width stored in a
      50                 :            :    * global variable. */
      51                 :          1 :   WIDTH = Level->level_width = map_getWidth(city);
      52                 :          1 :   LENGTH = Level->level_length = map_getLength(city);
      53                 :            :   
      54         [ +  + ]:         65 :   for(j=0;j<Level->level_length;j++) {
      55         [ +  + ]:       4160 :     for(i=0;i<Level->level_width;i++) {
      56                 :       4096 :       lset(i,j,SEEN);
      57                 :       4096 :       site = map_getSiteChar(city,i,j);
      58   [ +  +  +  +  :       4096 :       switch(site) {
          +  +  +  +  +  
          +  +  +  +  +  
          -  +  +  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
                      - ]
      59                 :            :         /*
      60                 :            :       case '@':
      61                 :            :         Player.x = i; Player.y = j;
      62                 :            :         Level->site[i][j].locchar = FLOOR;
      63                 :            :         break;
      64                 :            :         */
      65                 :            :       case 'g':
      66                 :          1 :         Level->site[i][j].locchar = FLOOR;
      67                 :          1 :         Level->site[i][j].p_locf = L_GARDEN;
      68                 :          1 :         break;
      69                 :            :       case 'y':
      70                 :          1 :         Level->site[i][j].locchar = FLOOR;
      71                 :          1 :         Level->site[i][j].p_locf = L_CEMETARY;
      72                 :          1 :         break;
      73                 :            :       case 'p': /* WDT: each of these places needs to be assigned
      74                 :            :                  * a function (or replaced with an 'x' in the map)
      75                 :            :                  */
      76                 :            :       case '!':
      77                 :            :       case 'I':
      78                 :            :       case 'E':
      79                 :            :       case 'e':
      80                 :            :       case 'x':
      81                 :         66 :         assign_city_function(i,j);
      82                 :         66 :         break;
      83                 :            :       case 't':
      84                 :          1 :         Level->site[i][j].locchar = FLOOR;
      85                 :          1 :         Level->site[i][j].p_locf = L_TEMPLE;
      86                 :          1 :         CitySiteList[L_TEMPLE-CITYSITEBASE][0] = TRUE;
      87                 :          1 :         CitySiteList[L_TEMPLE-CITYSITEBASE][1] = i;
      88                 :          1 :         CitySiteList[L_TEMPLE-CITYSITEBASE][2] = j;
      89                 :          1 :         break;
      90                 :            : #if 0 /* WDT: HACK!  The new city doesn't use portcullis traps, but has other
      91                 :            :        * uses for 'T'.  Um...  I'd rather have a use for them (that's what
      92                 :            :        * the jail is supposed to be), so this will stay only for now; with
      93                 :            :        * any luck we'll have things fixed up before the next release. */
      94                 :            :       case 'T':
      95                 :            :         Level->site[i][j].locchar = FLOOR;
      96                 :            :         Level->site[i][j].p_locf = L_PORTCULLIS_TRAP;
      97                 :            :         Level->site[i][j].aux = NOCITYMOVE;
      98                 :            :         break;
      99                 :            : #endif /* end of hack */
     100                 :            :       case 'R':
     101                 :          4 :         Level->site[i][j].locchar = FLOOR;
     102                 :          4 :         Level->site[i][j].p_locf = L_RAISE_PORTCULLIS;
     103                 :          4 :         Level->site[i][j].aux = NOCITYMOVE;
     104                 :          4 :         break;
     105                 :            :       case '7':
     106                 :          4 :         Level->site[i][j].locchar = FLOOR;
     107                 :          4 :         Level->site[i][j].p_locf = L_PORTCULLIS;
     108                 :          4 :         Level->site[i][j].aux = NOCITYMOVE;
     109                 :          4 :         break;
     110                 :            :       case 'C':
     111                 :          2 :         Level->site[i][j].locchar = OPEN_DOOR;
     112                 :          2 :         Level->site[i][j].p_locf = L_COLLEGE;
     113                 :          2 :         CitySiteList[L_COLLEGE-CITYSITEBASE][0] = TRUE;
     114                 :          2 :         CitySiteList[L_COLLEGE-CITYSITEBASE][1] = i;
     115                 :          2 :         CitySiteList[L_COLLEGE-CITYSITEBASE][2] = j;
     116                 :          2 :         break;
     117                 :            :       case 's':
     118                 :          1 :         Level->site[i][j].locchar = OPEN_DOOR;
     119                 :          1 :         Level->site[i][j].p_locf = L_SORCERORS;
     120                 :          1 :         CitySiteList[L_SORCERORS-CITYSITEBASE][0] = TRUE;
     121                 :          1 :         CitySiteList[L_SORCERORS-CITYSITEBASE][1] = i;
     122                 :          1 :         CitySiteList[L_SORCERORS-CITYSITEBASE][2] = j;
     123                 :          1 :         break;
     124                 :            :       case 'M':
     125                 :          2 :         Level->site[i][j].locchar = OPEN_DOOR;
     126                 :          2 :         Level->site[i][j].p_locf = L_MERC_GUILD;
     127                 :          2 :         CitySiteList[L_MERC_GUILD-CITYSITEBASE][0] = TRUE;
     128                 :          2 :         CitySiteList[L_MERC_GUILD-CITYSITEBASE][1] = i;
     129                 :          2 :         CitySiteList[L_MERC_GUILD-CITYSITEBASE][2] = j;
     130                 :          2 :         break;
     131                 :            :       case 'K':
     132                 :            : #ifdef INCLUDE_MONKS
     133                 :          1 :         Level->site[i][j].locchar = OPEN_DOOR;
     134                 :          1 :         Level->site[i][j].p_locf = L_MONASTERY;
     135                 :          1 :         CitySiteList[L_MONASTERY-CITYSITEBASE][0] = TRUE;
     136                 :          1 :         CitySiteList[L_MONASTERY-CITYSITEBASE][1] = i;
     137                 :          1 :         CitySiteList[L_MONASTERY-CITYSITEBASE][2] = j;
     138                 :            : #else
     139                 :            :         assign_city_function(i,j);
     140                 :            : #endif
     141                 :          1 :         break;
     142                 :            :       case 'c':
     143                 :          2 :         Level->site[i][j].locchar = OPEN_DOOR;
     144                 :          2 :         Level->site[i][j].p_locf = L_CASTLE;
     145                 :          2 :         CitySiteList[L_CASTLE-CITYSITEBASE][0] = TRUE;
     146                 :          2 :         CitySiteList[L_CASTLE-CITYSITEBASE][1] = i;
     147                 :          2 :         CitySiteList[L_CASTLE-CITYSITEBASE][2] = j;
     148                 :          2 :         break;
     149                 :            :       case '?':
     150                 :            :         {
     151                 :            :           static int myI = -1, myJ;
     152                 :            :           char site;
     153         [ +  + ]:        286 :           if ( myI == -1 )
     154                 :            :             {
     155                 :            :               /* If this is the first time we've seen the hedge maze,
     156                 :            :                * set this as its corner. */
     157                 :          1 :               myI = i; myJ = j;
     158                 :            :             }
     159                 :        286 :           site = map_getSiteChar(maze, i - myI, j - myJ);
     160                 :        286 :           mazesite(site,i,j,populate);
     161                 :            :         }
     162                 :        286 :         break;
     163                 :            :       case 'P':
     164                 :          1 :         Level->site[i][j].locchar = OPEN_DOOR;
     165                 :          1 :         Level->site[i][j].p_locf = L_ORDER;
     166                 :          1 :         CitySiteList[L_ORDER-CITYSITEBASE][0] = TRUE;
     167                 :          1 :         CitySiteList[L_ORDER-CITYSITEBASE][1] = i;
     168                 :          1 :         CitySiteList[L_ORDER-CITYSITEBASE][2] = j;
     169                 :          1 :         break;
     170                 :            :       case 'H':
     171                 :          1 :         Level->site[i][j].locchar = OPEN_DOOR;
     172                 :          1 :         Level->site[i][j].p_locf = L_CHARITY;
     173                 :          1 :         CitySiteList[L_CHARITY-CITYSITEBASE][0] = TRUE;
     174                 :          1 :         CitySiteList[L_CHARITY-CITYSITEBASE][1] = i;
     175                 :          1 :         CitySiteList[L_CHARITY-CITYSITEBASE][2] = j;
     176                 :          1 :         break;
     177                 :            :       case 'h':
     178                 :          0 :         Level->site[i][j].locchar = FLOOR;
     179         [ #  # ]:          0 :         if (populate)
     180                 :          0 :           make_horse(i,j); /* from village.c */
     181                 :          0 :         break;
     182                 :            :       case 'j':
     183                 :          1 :         Level->site[i][j].locchar = FLOOR;
     184         [ -  + ]:          1 :         if (populate)
     185                 :          0 :           make_justiciar(i,j);
     186                 :          1 :         break;
     187                 :            :       case 'J':
     188                 :          1 :         Level->site[i][j].locchar = CLOSED_DOOR;
     189                 :          1 :         Level->site[i][j].p_locf = L_JAIL;
     190                 :          1 :         break;
     191                 :            :       case 'A':
     192                 :          2 :         Level->site[i][j].locchar = OPEN_DOOR;
     193                 :          2 :         Level->site[i][j].p_locf = L_ARENA;
     194                 :          2 :         CitySiteList[L_ARENA-CITYSITEBASE][0] = TRUE;
     195                 :          2 :         CitySiteList[L_ARENA-CITYSITEBASE][1] = i;
     196                 :          2 :         CitySiteList[L_ARENA-CITYSITEBASE][2] = j;
     197                 :          2 :         break;
     198                 :            :       case 'B':
     199                 :          1 :         Level->site[i][j].locchar = OPEN_DOOR;
     200                 :          1 :         Level->site[i][j].p_locf = L_BANK;
     201                 :          1 :         CitySiteList[L_BANK-CITYSITEBASE][0] = TRUE;
     202                 :          1 :         CitySiteList[L_BANK-CITYSITEBASE][1] = i;
     203                 :          1 :         CitySiteList[L_BANK-CITYSITEBASE][2] = j;
     204                 :          1 :         lset(i,j,STOPS);
     205                 :          1 :         lset(i,j+1,STOPS);
     206                 :          1 :         lset(i+1,j,STOPS);
     207                 :          1 :         lset(i-1,j,STOPS);
     208                 :          1 :         lset(i,j-1,STOPS);
     209                 :          1 :         break;
     210                 :            :       case 'i':
     211                 :          1 :         Level->site[i][j].locchar = OPEN_DOOR;
     212                 :          1 :         Level->site[i][j].p_locf = L_TOURIST;
     213                 :          1 :         CitySiteList[L_TOURIST-CITYSITEBASE][1] = i;
     214                 :          1 :         CitySiteList[L_TOURIST-CITYSITEBASE][2] = j;
     215                 :          1 :         lset(i,j,STOPS);
     216                 :          1 :         lset(i,j+1,STOPS);
     217                 :          1 :         lset(i+1,j,STOPS);
     218                 :          1 :         lset(i-1,j,STOPS);
     219                 :          1 :         lset(i,j-1,STOPS);
     220                 :          1 :         break;
     221                 :            :       case 'X':
     222                 :          2 :         Level->site[i][j].locchar = FLOOR;
     223                 :          2 :         Level->site[i][j].p_locf = L_COUNTRYSIDE;
     224                 :          2 :         CitySiteList[L_COUNTRYSIDE-CITYSITEBASE][0] = TRUE;
     225                 :          2 :         CitySiteList[L_COUNTRYSIDE-CITYSITEBASE][1] = i;
     226                 :          2 :         CitySiteList[L_COUNTRYSIDE-CITYSITEBASE][2] = j;
     227                 :          2 :         break;
     228                 :            :       case 'v':
     229                 :          1 :         Level->site[i][j].locchar = FLOOR;
     230                 :          1 :         Level->site[i][j].p_locf = L_VAULT;
     231                 :          1 :         Level->site[i][j].aux = NOCITYMOVE;
     232                 :          1 :         lset(i,j,SECRET);
     233                 :          1 :         break;
     234                 :            :       case 'S':
     235                 :          6 :         Level->site[i][j].locchar = FLOOR;
     236                 :          6 :         Level->site[i][j].aux = NOCITYMOVE;
     237                 :          6 :         lset(i,j,SECRET);
     238                 :          6 :         break;
     239                 :            :       case 'G':
     240                 :         12 :         Level->site[i][j].locchar = FLOOR;
     241         [ -  + ]:         12 :         if (populate) {
     242                 :          0 :           make_site_monster(i,j,GUARD);
     243                 :          0 :           Level->site[i][j].creature->aux1 = i;
     244                 :          0 :           Level->site[i][j].creature->aux2 = j;
     245                 :            :         }
     246                 :         12 :         break;
     247                 :            :       case 'u':
     248                 :          4 :         Level->site[i][j].locchar = FLOOR;
     249         [ -  + ]:          4 :         if (populate)
     250                 :          0 :           make_minor_undead(i,j);
     251                 :          4 :         break;
     252                 :            :       case 'U':
     253                 :          4 :         Level->site[i][j].locchar = FLOOR;
     254         [ -  + ]:          4 :         if (populate)
     255                 :          0 :           make_major_undead(i,j);
     256                 :          4 :         break;
     257                 :            :       case 'V':
     258                 :          1 :         Level->site[i][j].showchar = WALL;
     259                 :          1 :         Level->site[i][j].locchar = FLOOR;
     260                 :          1 :         Level->site[i][j].p_locf = L_VAULT;
     261         [ -  + ]:          1 :         if (populate)
     262                 :          0 :           make_site_treasure(i,j,5);
     263                 :          1 :         Level->site[i][j].aux = NOCITYMOVE;
     264                 :          1 :         lset(i,j,SECRET);
     265                 :          1 :         break;
     266                 :            :       case '%':
     267                 :         28 :         Level->site[i][j].showchar = WALL;
     268                 :         28 :         Level->site[i][j].locchar = FLOOR;
     269                 :         28 :         Level->site[i][j].p_locf = L_TRAP_SIREN;
     270         [ -  + ]:         28 :         if (populate)
     271                 :          0 :           make_site_treasure(i,j,5);
     272                 :         28 :         Level->site[i][j].aux = NOCITYMOVE;
     273                 :         28 :         lset(i,j,SECRET);
     274                 :         28 :         break;
     275                 :            :       case '$':
     276                 :          4 :         Level->site[i][j].locchar = FLOOR;
     277         [ -  + ]:          4 :         if (populate)
     278                 :          0 :           make_site_treasure(i,j,5);
     279                 :          4 :         break;
     280                 :            :       case '2':
     281                 :          1 :         Level->site[i][j].locchar = ALTAR;
     282                 :          1 :         Level->site[i][j].p_locf = L_ALTAR;
     283                 :          1 :         Level->site[i][j].aux = ODIN;
     284                 :          1 :         break;
     285                 :            :       case '3':
     286                 :          1 :         Level->site[i][j].locchar = ALTAR;
     287                 :          1 :         Level->site[i][j].p_locf = L_ALTAR;
     288                 :          1 :         Level->site[i][j].aux = SET;
     289                 :          1 :         break;
     290                 :            :       case '4':
     291                 :          1 :         Level->site[i][j].locchar = ALTAR;
     292                 :          1 :         Level->site[i][j].p_locf = L_ALTAR;
     293                 :          1 :         Level->site[i][j].aux = ATHENA;
     294                 :          1 :         break;
     295                 :            :       case '5':
     296                 :          1 :         Level->site[i][j].locchar = ALTAR;
     297                 :          1 :         Level->site[i][j].p_locf = L_ALTAR;
     298                 :          1 :         Level->site[i][j].aux = HECATE;
     299                 :          1 :         break;
     300                 :            :       case '6':
     301                 :          1 :         Level->site[i][j].locchar = ALTAR;
     302                 :          1 :         Level->site[i][j].p_locf = L_ALTAR;
     303                 :          1 :         Level->site[i][j].aux = DESTINY;
     304                 :          1 :         break;
     305                 :            :       case '^':
     306                 :          3 :         Level->site[i][j].showchar = WALL;
     307                 :          3 :         Level->site[i][j].locchar = FLOOR;
     308                 :          3 :         Level->site[i][j].p_locf = TRAP_BASE+random_range(NUMTRAPS);
     309                 :          3 :         lset(i,j,SECRET);
     310                 :          3 :         break;
     311                 :            :       case '"':
     312                 :        235 :         Level->site[i][j].locchar = HEDGE;
     313                 :        235 :         break;
     314                 :            :       case '~':
     315                 :         28 :         Level->site[i][j].locchar = WATER;
     316                 :         28 :         Level->site[i][j].p_locf = L_WATER;
     317                 :         28 :         break;
     318                 :            :       case '=':
     319                 :         12 :         Level->site[i][j].locchar = WATER;
     320                 :         12 :         Level->site[i][j].p_locf = L_MAGIC_POOL;
     321                 :         12 :         break;
     322                 :            :       case '*':
     323                 :          6 :         Level->site[i][j].locchar = WALL;
     324                 :          6 :         Level->site[i][j].aux = 10;
     325                 :          6 :         break;
     326                 :            :       case '#':
     327                 :       1705 :         Level->site[i][j].locchar = WALL;
     328                 :       1705 :         Level->site[i][j].aux = 500;
     329                 :       1705 :         break;
     330                 :            :       case 'T':/* currently meaningless in large city map. */
     331                 :            :       case '>':  /* currently meaningless outside of maze.*/
     332                 :            :       case '.':
     333                 :       1642 :         Level->site[i][j].locchar = FLOOR;
     334                 :       1642 :         break;
     335                 :            :       case ',':
     336                 :          3 :         Level->site[i][j].showchar = WALL;
     337                 :          3 :         Level->site[i][j].locchar = FLOOR;
     338                 :          3 :         Level->site[i][j].aux = NOCITYMOVE;
     339                 :          3 :         lset(i,j,SECRET);
     340                 :          3 :         break;
     341                 :            :       case '-':
     342                 :            :       case 'D': /* WDT: should all Ds be changed to -, or should D be given
     343                 :            :                  * special treatment? */
     344                 :          5 :         Level->site[i][j].locchar = CLOSED_DOOR;
     345                 :          5 :         break;
     346                 :            :       case '1':
     347                 :         11 :         Level->site[i][j].locchar = STATUE;
     348                 :         11 :         break;
     349                 :            :       default:
     350                 :          0 :         printf("\nOops... missed a case [%d,%d]: '%c' (%d)\n", i,j,site,site);
     351                 :          0 :         morewait();
     352                 :            :       }
     353                 :            : 
     354         [ +  + ]:       4096 :       if (loc_statusp(i,j,SEEN)) {
     355         [ +  + ]:       3810 :         if (loc_statusp(i,j,SECRET))
     356                 :         42 :           Level->site[i][j].showchar = WALL;
     357                 :       3768 :         else Level->site[i][j].showchar = Level->site[i][j].locchar;
     358                 :            :       }
     359                 :            :     }
     360                 :            :   }
     361                 :          1 :   map_close(maze);
     362                 :          1 :   map_close(city);
     363                 :          1 :   City = Level;
     364                 :            :   
     365                 :            :   /* make all city monsters asleep, and shorten their wakeup range to 2 */
     366                 :            :   /* to prevent players from being molested by vicious monsters on */
     367                 :            :   /* the streets */
     368         [ -  + ]:          1 :   for(ml=Level->mlist;ml!=NULL;ml=ml->next) {
     369                 :          0 :     m_status_reset(ml->m,AWAKE);
     370                 :          0 :     ml->m->wakeup = 2;
     371                 :            :   }
     372                 :          1 :   initrand(E_RESTORE, 0);
     373                 :          1 : }
     374                 :            : 
     375                 :            : 
     376                 :         66 : void assign_city_function(int x, int y)
     377                 :            : {
     378                 :            :   static int setup=0;
     379                 :            :   static int next=0;
     380                 :            :   static int permutation[64]; /* number of x's in city map */
     381                 :            :   int i,j,k,l;
     382                 :            : 
     383                 :         66 :   Level->site[x][y].aux = TRUE;
     384                 :            : 
     385                 :         66 :   lset(x,y+1,STOPS);
     386                 :         66 :   lset(x+1,y,STOPS);
     387                 :         66 :   lset(x-1,y,STOPS);
     388                 :         66 :   lset(x,y-1,STOPS);
     389                 :         66 :   lset(x,y,STOPS); /* FIXED! 12/30/98 */
     390                 :            : 
     391         [ +  + ]:         66 :   if (setup == 0) {
     392                 :          1 :     setup = 1;
     393         [ +  + ]:         65 :     for(i=0;i<64;i++)
     394                 :         64 :       permutation[i] = i;
     395         [ +  + ]:        501 :     for(i=0;i<500;i++) {
     396                 :        500 :       j = random_range(64);
     397                 :        500 :       k = random_range(64);
     398                 :        500 :       l = permutation[j];
     399                 :        500 :       permutation[j] = permutation[k];
     400                 :        500 :       permutation[k] = l;
     401                 :            :     }
     402                 :            :   }
     403         [ +  + ]:         66 :   if (next > 63) { /* in case someone changes the no. of x's */
     404                 :          2 :     Level->site[x][y].locchar = CLOSED_DOOR;
     405                 :          2 :     Level->site[x][y].p_locf = L_HOUSE;
     406         [ +  - ]:          2 :     if(random_range(5)) Level->site[x][y].aux = LOCKED;
     407                 :            :   }
     408   [ +  +  +  +  :         64 :   else switch(permutation[next]) {
          +  +  +  +  +  
          +  +  +  +  +  
                +  +  + ]
     409                 :            :   case 0:
     410                 :          1 :     Level->site[x][y].locchar = OPEN_DOOR;
     411                 :          1 :     Level->site[x][y].p_locf = L_ARMORER;
     412                 :          1 :     CitySiteList[L_ARMORER-CITYSITEBASE][1] = x;
     413                 :          1 :     CitySiteList[L_ARMORER-CITYSITEBASE][2] = y;
     414                 :          1 :     break;
     415                 :            :   case 1:
     416                 :          1 :     Level->site[x][y].locchar = OPEN_DOOR;
     417                 :          1 :     Level->site[x][y].p_locf = L_CLUB;
     418                 :          1 :     CitySiteList[L_CLUB-CITYSITEBASE][1] = x;
     419                 :          1 :     CitySiteList[L_CLUB-CITYSITEBASE][2] = y;
     420                 :          1 :     break;
     421                 :            :   case 2:
     422                 :          1 :     Level->site[x][y].locchar = OPEN_DOOR;
     423                 :          1 :     Level->site[x][y].p_locf = L_GYM;
     424                 :          1 :     CitySiteList[L_GYM-CITYSITEBASE][1] = x;
     425                 :          1 :     CitySiteList[L_GYM-CITYSITEBASE][2] = y;
     426                 :          1 :     break;
     427                 :            :   case 3:
     428                 :          1 :     Level->site[x][y].locchar = CLOSED_DOOR;
     429                 :          1 :     Level->site[x][y].p_locf = L_THIEVES_GUILD;
     430                 :          1 :     CitySiteList[L_THIEVES_GUILD-CITYSITEBASE][1] = x;
     431                 :          1 :     CitySiteList[L_THIEVES_GUILD-CITYSITEBASE][2] = y;
     432                 :          1 :     break;
     433                 :            :   case 4:
     434                 :          1 :     Level->site[x][y].locchar = OPEN_DOOR;
     435                 :          1 :     Level->site[x][y].p_locf = L_HEALER;
     436                 :          1 :     CitySiteList[L_HEALER-CITYSITEBASE][1] = x;
     437                 :          1 :     CitySiteList[L_HEALER-CITYSITEBASE][2] = y;
     438                 :          1 :     break;
     439                 :            :   case 5:
     440                 :          1 :     Level->site[x][y].locchar = OPEN_DOOR;
     441                 :          1 :     Level->site[x][y].p_locf = L_CASINO;
     442                 :          1 :     CitySiteList[L_CASINO-CITYSITEBASE][1] = x;
     443                 :          1 :     CitySiteList[L_CASINO-CITYSITEBASE][2] = y;
     444                 :          1 :     break;
     445                 :            :   case 7: 
     446                 :          1 :     Level->site[x][y].locchar = OPEN_DOOR;
     447                 :          1 :     Level->site[x][y].p_locf = L_DINER;
     448                 :          1 :     CitySiteList[L_DINER-CITYSITEBASE][1] = x;
     449                 :          1 :     CitySiteList[L_DINER-CITYSITEBASE][2] = y;
     450                 :          1 :     break;
     451                 :            :   case 8: 
     452                 :          1 :     Level->site[x][y].locchar = OPEN_DOOR;
     453                 :          1 :     Level->site[x][y].p_locf = L_CRAP;
     454                 :          1 :     CitySiteList[L_CRAP-CITYSITEBASE][1] = x;
     455                 :          1 :     CitySiteList[L_CRAP-CITYSITEBASE][2] = y;
     456                 :          1 :     break;
     457                 :            :   case 6:
     458                 :            :   case 9: 
     459                 :            :   case 20: 
     460                 :          3 :     Level->site[x][y].locchar = OPEN_DOOR;
     461                 :          3 :     Level->site[x][y].p_locf = L_COMMANDANT;
     462                 :          3 :     CitySiteList[L_COMMANDANT-CITYSITEBASE][1] = x;
     463                 :          3 :     CitySiteList[L_COMMANDANT-CITYSITEBASE][2] = y;
     464                 :          3 :     break;
     465                 :            :   case 21:
     466                 :          1 :     Level->site[x][y].locchar = OPEN_DOOR;
     467                 :          1 :     Level->site[x][y].p_locf = L_TAVERN;
     468                 :          1 :     CitySiteList[L_TAVERN-CITYSITEBASE][1] = x;
     469                 :          1 :     CitySiteList[L_TAVERN-CITYSITEBASE][2] = y;
     470                 :          1 :     break;
     471                 :            :   case 10:
     472                 :          1 :     Level->site[x][y].locchar = OPEN_DOOR;
     473                 :          1 :     Level->site[x][y].p_locf = L_ALCHEMIST;
     474                 :          1 :     CitySiteList[L_ALCHEMIST-CITYSITEBASE][1] = x;
     475                 :          1 :     CitySiteList[L_ALCHEMIST-CITYSITEBASE][2] = y;
     476                 :          1 :     break;
     477                 :            :   case 11:
     478                 :          1 :     Level->site[x][y].locchar = OPEN_DOOR;
     479                 :          1 :     Level->site[x][y].p_locf = L_DPW;
     480                 :          1 :     CitySiteList[L_DPW-CITYSITEBASE][1] = x;
     481                 :          1 :     CitySiteList[L_DPW-CITYSITEBASE][2] = y;
     482                 :          1 :     break;
     483                 :            :   case 12:
     484                 :          1 :     Level->site[x][y].locchar = OPEN_DOOR;
     485                 :          1 :     Level->site[x][y].p_locf = L_LIBRARY;
     486                 :          1 :     CitySiteList[L_LIBRARY-CITYSITEBASE][1] = x;
     487                 :          1 :     CitySiteList[L_LIBRARY-CITYSITEBASE][2] = y;
     488                 :          1 :     break;
     489                 :            :   case 13:
     490                 :          1 :     Level->site[x][y].locchar = OPEN_DOOR;
     491                 :          1 :     Level->site[x][y].p_locf = L_PAWN_SHOP;
     492                 :          1 :     CitySiteList[L_PAWN_SHOP-CITYSITEBASE][1] = x;
     493                 :          1 :     CitySiteList[L_PAWN_SHOP-CITYSITEBASE][2] = y;
     494                 :          1 :     break;
     495                 :            :   case 14:
     496                 :          1 :     Level->site[x][y].locchar = OPEN_DOOR;
     497                 :          1 :     Level->site[x][y].p_locf = L_CONDO;
     498                 :          1 :     CitySiteList[L_CONDO-CITYSITEBASE][1] = x;
     499                 :          1 :     CitySiteList[L_CONDO-CITYSITEBASE][2] = y;
     500                 :          1 :     break;
     501                 :            :   case 15:
     502                 :          1 :     Level->site[x][y].locchar = CLOSED_DOOR;
     503                 :          1 :     Level->site[x][y].p_locf = L_BROTHEL;
     504                 :          1 :     CitySiteList[L_BROTHEL-CITYSITEBASE][1] = x;
     505                 :          1 :     CitySiteList[L_BROTHEL-CITYSITEBASE][2] = y;
     506                 :          1 :     break;
     507                 :            :   default:
     508                 :         46 :     Level->site[x][y].locchar = CLOSED_DOOR;
     509   [ +  +  +  - ]:         46 :     switch(random_range(6)) {
     510                 :          9 :     case 0: Level->site[x][y].p_locf = L_HOVEL; break;
     511                 :            :     case 1: case 2: case 3:
     512                 :         30 :     case 4: Level->site[x][y].p_locf = L_HOUSE; break;
     513                 :          7 :     case 5: Level->site[x][y].p_locf = L_MANSION; break;
     514                 :            :     }
     515         [ +  + ]:         46 :     if(random_range(5)) Level->site[x][y].aux = LOCKED;
     516                 :         46 :     break;
     517                 :            :   }
     518                 :         66 :   next++;
     519                 :         66 : }
     520                 :            : 
     521                 :            :   
     522                 :            : 
     523                 :            : 
     524                 :            : /* makes a hiscore npc for mansions */
     525                 :          0 : void make_justiciar(int i, int j)
     526                 :            : {
     527                 :          0 :   pml ml = ((pml) checkmalloc(sizeof(mltype)));
     528                 :          0 :   ml->m = ((pmt) checkmalloc(sizeof(montype)));
     529                 :          0 :   *(ml->m) = Monsters[NPC];
     530                 :          0 :   make_hiscore_npc(ml->m,15);
     531                 :          0 :   ml->m->x = i;
     532                 :          0 :   ml->m->y = j;
     533                 :          0 :   Level->site[i][j].creature = ml->m;
     534                 :          0 :   ml->m->click = (Tick + 1) % 60;
     535                 :          0 :   ml->next = Level->mlist;
     536                 :          0 :   Level->mlist = ml;
     537                 :          0 :   m_status_reset(ml->m,AWAKE);
     538                 :          0 : }
     539                 :            : 
     540                 :            : 
     541                 :            : 
     542                 :            : /* loads the city level */
     543                 :          0 : void resurrect_guards(void)
     544                 :            : {
     545                 :            :   int i,j;
     546                 :            :   map *city;
     547                 :            :   
     548                 :            :   /* Get the original city. */
     549                 :          0 :   city = map_open(MAP_city);
     550                 :          0 :   map_setLevel(city,0);
     551                 :            : 
     552         [ #  # ]:          0 :   for(j=0;j<Level->level_length;j++) {
     553         [ #  # ]:          0 :     for(i=0;i<Level->level_width;i++) {
     554         [ #  # ]:          0 :       if (map_getSiteChar(city,i,j) == 'G') {
     555                 :          0 :         make_site_monster(i,j,GUARD);
     556                 :          0 :         Level->site[i][j].creature->monstring = "undead guardsman";
     557                 :          0 :         Level->site[i][j].creature->meleef = M_MELEE_SPIRIT;
     558                 :          0 :         Level->site[i][j].creature->movef = M_MOVE_SPIRIT;
     559                 :          0 :         Level->site[i][j].creature->strikef = M_STRIKE_MISSILE;
     560                 :          0 :         Level->site[i][j].creature->immunity = EVERYTHING-pow2(NORMAL_DAMAGE);
     561                 :          0 :         Level->site[i][j].creature->hp *= 2;
     562                 :          0 :         Level->site[i][j].creature->hit *= 2;
     563                 :          0 :         Level->site[i][j].creature->dmg *= 2;
     564                 :          0 :         Level->site[i][j].creature->ac *= 2;
     565                 :          0 :         m_status_set(Level->site[i][j].creature,HOSTILE);
     566                 :          0 :         m_status_set(Level->site[i][j].creature,AWAKE);
     567                 :            :       }
     568                 :            :     }
     569                 :            :   }
     570                 :          0 : }
     571                 :            : 
     572                 :            : 
     573                 :        286 : void mazesite(char site, int i, int j, int populate)
     574                 :            : {
     575   [ +  +  +  +  :        286 :   switch(site) {
             +  +  +  - ]
     576                 :            :   case '"':
     577                 :        145 :     Level->site[i][j].locchar = HEDGE;
     578         [ +  + ]:        145 :     if (random_range(10))
     579                 :        122 :       Level->site[i][j].p_locf = L_HEDGE;
     580                 :            :     else
     581                 :         23 :       Level->site[i][j].p_locf = L_TRIFID;
     582                 :        145 :     break;
     583                 :            :   case '-':
     584                 :         11 :     Level->site[i][j].locchar = CLOSED_DOOR;
     585                 :         11 :     break;
     586                 :            :   case '.':
     587                 :        119 :     Level->site[i][j].locchar = FLOOR;
     588                 :        119 :     break;
     589                 :            :   case '>':
     590                 :          1 :     Level->site[i][j].locchar = STAIRS_DOWN;
     591                 :          1 :     Level->site[i][j].p_locf = L_SEWER;
     592                 :          1 :     CitySiteList[L_SEWER-CITYSITEBASE][1] = i;
     593                 :          1 :     CitySiteList[L_SEWER-CITYSITEBASE][2] = j;
     594                 :          1 :     break;
     595                 :            :   case 'z':
     596                 :          1 :     Level->site[i][j].locchar = FLOOR;
     597                 :          1 :     Level->site[i][j].p_locf = L_MAZE;
     598                 :          1 :     break;
     599                 :            :   case 'O':
     600                 :          1 :     Level->site[i][j].locchar = OPEN_DOOR;
     601                 :          1 :     Level->site[i][j].p_locf = L_ORACLE;
     602                 :          1 :     CitySiteList[L_ORACLE-CITYSITEBASE][1] = i;
     603                 :          1 :     CitySiteList[L_ORACLE-CITYSITEBASE][2] = j;
     604                 :          1 :     break;
     605                 :            :   case '?':
     606                 :          8 :     randommazesite(i,j,populate);
     607                 :          8 :     break;
     608                 :            :   }
     609                 :        286 :   lreset(i,j,SEEN);
     610                 :        286 : }
     611                 :            : 
     612                 :          8 : void randommazesite(int i, int j, int populate)
     613                 :            : {
     614   [ +  +  +  - ]:          8 :   switch(random_range(7)) {
     615                 :            :   case 0: case 1:
     616                 :          3 :     Level->site[i][j].locchar = FLOOR;
     617                 :            :     /*    Level->site[i][j].p_locf = TRAP_BASE+random_range(NUMTRAPS); */
     618                 :          3 :     Level->site[i][j].p_locf = TRAP_BASE+random_range(NUM_SAFE_TRAPS);
     619                 :          3 :     break;
     620                 :            :   case 2: case 3:
     621                 :          3 :     Level->site[i][j].locchar = FLOOR;
     622         [ -  + ]:          3 :     if (populate)
     623                 :          0 :       make_site_monster(i,j,-1);
     624                 :          3 :     break;
     625                 :            :   case 4: case 5:
     626                 :          2 :     Level->site[i][j].locchar = FLOOR;
     627         [ -  + ]:          2 :     if (populate)
     628                 :          0 :       make_site_treasure(i,j,5);
     629                 :          2 :     break;
     630                 :            :   default:
     631                 :          0 :     Level->site[i][j].locchar = FLOOR;    
     632                 :            :   }
     633                 :          8 : }
     634                 :            : 
     635                 :            : 
     636                 :            : /* undead are not hostile unless disturbed.... */
     637                 :          0 : void make_minor_undead(int i, int j)
     638                 :            : {
     639                 :            :   int mid;
     640         [ #  # ]:          0 :   if (random_range(2)) mid = GHOST;
     641                 :          0 :   else mid = HAUNT;
     642                 :          0 :   make_site_monster(i,j,mid);
     643                 :          0 :   m_status_reset(Level->site[i][j].creature,AWAKE);
     644                 :          0 :   m_status_reset(Level->site[i][j].creature,HOSTILE);
     645                 :          0 : }    
     646                 :            : 
     647                 :            : /* undead are not hostile unless disturbed.... */
     648                 :          0 : void make_major_undead(int i, int j)
     649                 :            : {
     650                 :            :   int mid;
     651         [ #  # ]:          0 :   if (random_range(2)) mid = LICHE; /* lich */
     652                 :          0 :   else mid = VAMP_LORD; /*vampire lord*/
     653                 :          0 :   make_site_monster(i,j,mid);
     654                 :          0 :   m_status_reset(Level->site[i][j].creature,AWAKE);
     655                 :          0 :   m_status_reset(Level->site[i][j].creature,HOSTILE);
     656                 :          0 : }    
     657                 :            : 
     658                 :            : 
     659                 :            : static char jail[5][11] = 
     660                 :            : {
     661                 :            :    { '#', '#', '*', '#', '#', '*', '#', '#', '*', '#', '#' },
     662                 :            :    { '#', '#', '*', '#', '#', '*', '#', '*', '#', '#', '#' },
     663                 :            :    { '#', '#', 'T', '#', 'T', '#', 'T', '#', 'T', '#', '#' },
     664                 :            :    { '#', '#', '7', '#', '7', '#', '7', '#', '7', '#', '#' },
     665                 :            :    { '#', '#', 'R', '#', 'R', '#', 'R', '#', 'R', '#', '#' }
     666                 :            : };
     667                 :            : 
     668                 :            : /* fixes up the jail in case it has been munged by player action */
     669                 :          0 : void repair_jail(void)
     670                 :            : {
     671                 :            :   int i,j;
     672         [ #  # ]:          0 :   for(i=0;i<11;i++)
     673         [ #  # ]:          0 :     for(j=0;j<5;j++) {
     674   [ #  #  #  #  :          0 :       switch(jail[j][i]) {
                   #  # ]
     675                 :            :       case '#':
     676                 :          0 :         City->site[i+35][j+52].locchar = WALL;
     677                 :          0 :         City->site[i+35][j+52].p_locf = L_NO_OP;
     678                 :          0 :         City->site[i+35][j+52].aux = NOCITYMOVE;
     679                 :          0 :         break;
     680                 :            :       case '*':
     681                 :          0 :         City->site[i+35][j+52].locchar = WALL;
     682                 :          0 :         City->site[i+35][j+52].p_locf = L_NO_OP;
     683                 :          0 :         City->site[i+35][j+52].aux = 10;
     684                 :          0 :         break;
     685                 :            :       case 'T':
     686                 :          0 :         City->site[i+35][j+52].locchar = FLOOR;
     687                 :          0 :         City->site[i+35][j+52].p_locf = L_PORTCULLIS_TRAP;
     688                 :          0 :         City->site[i+35][j+52].aux = NOCITYMOVE;
     689                 :          0 :         break;
     690                 :            :       case '7':
     691                 :          0 :         City->site[i+35][j+52].locchar = FLOOR;
     692                 :          0 :         City->site[i+35][j+52].p_locf = L_PORTCULLIS;
     693                 :          0 :         City->site[i+35][j+52].aux = NOCITYMOVE;
     694                 :          0 :         break;
     695                 :            :       case 'R':
     696                 :          0 :         City->site[i+35][j+52].locchar = FLOOR;
     697                 :          0 :         City->site[i+35][j+52].p_locf = L_RAISE_PORTCULLIS;
     698                 :          0 :         City->site[i+35][j+52].aux = NOCITYMOVE;
     699                 :          0 :         break;
     700                 :            :       }
     701                 :          0 :       lreset(i+35, j+52, CHANGED);
     702                 :            :     }
     703                 :          0 : }

Generated by: LCOV version 1.11