LCOV - code coverage report
Current view: top level - omega-rpg-0.90-pa9 - village.c (source / functions) Hit Total Coverage
Test: lcov.info Lines: 179 195 91.8 %
Date: 2017-08-31 19:31:11 Functions: 8 8 100.0 %
Branches: 65 76 85.5 %

           Branch data     Line data    Source code
       1                 :            : /* omega copyright (C) by Laurence Raphael Brothers, 1987,1988,1989 */
       2                 :            : /* village.c */
       3                 :            : /* some functions to make the village levels */
       4                 :            : 
       5                 :            : #include "glob.h"
       6                 :            : 
       7                 :            : 
       8                 :            : /* loads the village level into Level*/
       9                 :         10 : void load_village(int villagenum, int populate)
      10                 :            : {
      11                 :            :   int i,j;
      12                 :            :   char site;
      13                 :         10 :   map *village = 0;
      14                 :            :   
      15                 :         10 :   TempLevel = Level;
      16         [ -  + ]:         10 :   if (ok_to_free(TempLevel)) {
      17                 :            : #ifndef SAVE_LEVELS
      18                 :          0 :     free_level(TempLevel);
      19                 :            : #endif
      20                 :          0 :     TempLevel = NULL;
      21                 :            :   }
      22                 :            : 
      23                 :         10 :   initrand(Current_Environment, villagenum);
      24                 :            :   
      25                 :         10 :   assign_village_function(0,0,TRUE);
      26                 :            :   
      27                 :            : #ifndef SAVE_LEVELS
      28                 :         10 :   Level = ((plv) checkmalloc(sizeof(levtype)));
      29                 :            : #else
      30                 :            :   msdos_changelevel(TempLevel,0,-1);
      31                 :            :   Level = &TheLevel;
      32                 :            : #endif
      33                 :            :   
      34   [ +  +  -  +  :         10 :   switch( villagenum )
                -  -  - ]
      35                 :            :     {
      36                 :          2 :       case VIL_STARVIEW: village = map_open(MAP_starview); break;
      37                 :          7 :       case VIL_WOODMERE: village = map_open(MAP_woodmere); break;
      38                 :          0 :       case VIL_STORMWAT: village = map_open(MAP_stormwat); break;
      39                 :          1 :       case VIL_THAUMARI: village = map_open(MAP_thaumari); break;
      40                 :          0 :       case VIL_SKORCH  : village = map_open(MAP_skorch  ); break;
      41                 :          0 :       case VIL_WHORFEN : village = map_open(MAP_whorfen ); break;
      42                 :          0 :       default: abort();
      43                 :            :     }
      44                 :         10 :   map_setLevel(village,0);
      45                 :            :   
      46                 :         10 :   clear_level(Level);
      47                 :         10 :   Level->environment = E_VILLAGE;
      48                 :         10 :   Level->level_width = map_getWidth(village);
      49                 :         10 :   Level->level_length = map_getLength(village);
      50                 :            :   
      51         [ +  + ]:        170 :   for(j=0;j<Level->level_length;j++) {
      52         [ +  + ]:      10400 :     for(i=0;i<Level->level_width;i++) {
      53                 :      10240 :       lset(i,j,SEEN);
      54                 :      10240 :       site = map_getSiteChar(village,i,j);
      55                 :      10240 :       Level->site[i][j].p_locf = L_NO_OP;
      56   [ +  +  +  +  :      10240 :       switch(site) {
          +  +  +  +  +  
          +  +  +  +  -  
          +  +  +  +  +  
                   +  + ]
      57                 :            :       case 'f':
      58                 :         47 :         Level->site[i][j].locchar = FLOOR;
      59         [ +  + ]:         47 :         if (populate)
      60                 :         17 :           make_food_bin(i,j);
      61                 :         47 :         break;
      62                 :            :       case 'g':
      63                 :          9 :         Level->site[i][j].locchar = FLOOR;
      64                 :          9 :         Level->site[i][j].p_locf = L_GRANARY;
      65                 :          9 :         break;
      66                 :            :       case 'h':
      67                 :         76 :         Level->site[i][j].locchar = FLOOR;
      68         [ +  + ]:         76 :         if (populate)
      69                 :         16 :           make_horse(i,j);
      70                 :         76 :         break;
      71                 :            :       case 'S':
      72                 :         11 :         Level->site[i][j].locchar = FLOOR;
      73                 :         11 :         Level->site[i][j].p_locf = L_STABLES;
      74                 :         11 :         break;
      75                 :            :       case 'H':
      76                 :          9 :         Level->site[i][j].locchar = FLOOR;
      77         [ +  + ]:          9 :         if (populate)
      78                 :          3 :           make_merchant(i,j);
      79                 :          9 :         break;
      80                 :            :       case 'C':
      81                 :          3 :         Level->site[i][j].locchar = FLOOR;
      82                 :          3 :         Level->site[i][j].p_locf = L_COMMONS;
      83                 :          3 :         break;
      84                 :            :       case 's':
      85                 :         16 :         Level->site[i][j].locchar = FLOOR;
      86         [ +  - ]:         16 :         if (populate)
      87                 :         16 :           make_sheep(i,j);
      88                 :         16 :         break;
      89                 :            :       case 'x':
      90                 :        240 :         assign_village_function(i,j,FALSE);
      91                 :        240 :         break;
      92                 :            :       case 'X':
      93                 :        145 :         Level->site[i][j].locchar = FLOOR;
      94                 :        145 :         Level->site[i][j].p_locf = L_COUNTRYSIDE;
      95                 :        145 :         break;
      96                 :            :       case 'G':
      97                 :         71 :         Level->site[i][j].locchar = FLOOR;
      98         [ +  + ]:         71 :         if (populate) {
      99                 :         29 :           make_guard(i,j);
     100                 :         29 :           Level->site[i][j].creature->aux1 = i;
     101                 :         29 :           Level->site[i][j].creature->aux2 = j;
     102                 :            :         }
     103                 :         71 :         break;
     104                 :            :       case '^':
     105                 :          4 :         Level->site[i][j].locchar = FLOOR;
     106                 :          4 :         Level->site[i][j].p_locf = L_TRAP_SIREN;
     107                 :          4 :         break;
     108                 :            :       case '"':
     109                 :       2269 :         Level->site[i][j].locchar = HEDGE;
     110                 :       2269 :         Level->site[i][j].p_locf = L_HEDGE;
     111                 :       2269 :         break;
     112                 :            :       case '~':
     113                 :        379 :         Level->site[i][j].locchar = WATER;
     114                 :        379 :         Level->site[i][j].p_locf = L_WATER;
     115                 :        379 :         break;
     116                 :            :       case '+':
     117                 :          0 :         Level->site[i][j].locchar = WATER;
     118                 :          0 :         Level->site[i][j].p_locf = L_CHAOS;
     119                 :          0 :         break;
     120                 :            :       case '\'':
     121                 :         84 :         Level->site[i][j].locchar = HEDGE;
     122                 :         84 :         Level->site[i][j].p_locf = L_TRIFID;
     123                 :         84 :         break;
     124                 :            :       case '!':
     125                 :         10 :         special_village_site(i,j,villagenum);
     126                 :         10 :         break;
     127                 :            :       case '#':
     128                 :       2787 :         Level->site[i][j].locchar = WALL;
     129                 :       2787 :         Level->site[i][j].aux = 100;
     130                 :       2787 :         break;
     131                 :            :       case '.':
     132                 :       3999 :         Level->site[i][j].locchar = FLOOR;
     133                 :       3999 :         break;
     134                 :            :       case '-':
     135                 :         18 :         Level->site[i][j].locchar = CLOSED_DOOR;
     136                 :         18 :         break;
     137                 :            :       case '1':
     138                 :         56 :         Level->site[i][j].locchar = STATUE;
     139                 :         56 :         break;
     140                 :            :       }
     141         [ -  + ]:      10240 :       if (loc_statusp(i,j,SECRET))
     142                 :          0 :         Level->site[i][j].showchar = WALL;
     143                 :      10240 :       else Level->site[i][j].showchar = Level->site[i][j].locchar;
     144                 :            :     }
     145                 :            :   }
     146                 :         10 :   map_close(village);
     147                 :         10 :   initrand(E_RESTORE, 0);
     148                 :         10 : }
     149                 :            : 
     150                 :         29 : void make_guard(int i, int j)
     151                 :            : {
     152                 :         29 :   pml tml = ((pml) (checkmalloc(sizeof(mltype))));
     153                 :         29 :   tml->m = (Level->site[i][j].creature = make_creature(GUARD));
     154                 :         29 :   tml->m->x = i;
     155                 :         29 :   tml->m->y = j;
     156                 :         29 :   tml->next = Level->mlist;
     157                 :         29 :   Level->mlist = tml;
     158                 :         29 : }
     159                 :            : 
     160                 :         16 : void make_sheep(int i, int j)
     161                 :            : {
     162                 :         16 :   pml tml = ((pml) (checkmalloc(sizeof(mltype))));
     163                 :         16 :   tml->m = (Level->site[i][j].creature = make_creature(SHEEP));
     164                 :         16 :   tml->m->x = i;
     165                 :         16 :   tml->m->y = j;
     166                 :         16 :   tml->next = Level->mlist;
     167                 :         16 :   Level->mlist = tml;
     168                 :         16 : }
     169                 :            : 
     170                 :         17 : void make_food_bin(int i, int j)
     171                 :            : { 
     172                 :            :   pol tol;
     173                 :            :   int k;
     174                 :            : 
     175         [ +  + ]:        187 :   for(k=0;k<10;k++) {
     176                 :        170 :     tol = ((pol) checkmalloc(sizeof(oltype)));
     177                 :        170 :     tol->thing = ((pob) checkmalloc(sizeof(objtype)));
     178                 :        170 :     make_food(tol->thing,15); /* grain */
     179                 :        170 :     tol->next = Level->site[i][j].things;
     180                 :        170 :     Level->site[i][j].things = tol;
     181                 :            :   }
     182                 :         17 : }
     183                 :            : 
     184                 :         16 : void make_horse(int i, int j)
     185                 :            : {
     186                 :         16 :   pml tml = ((pml) (checkmalloc(sizeof(mltype))));
     187                 :         16 :   tml->m = (Level->site[i][j].creature = make_creature(HORSE));
     188                 :         16 :   tml->m->x = i;
     189                 :         16 :   tml->m->y = j;
     190                 :         16 :   tml->next = Level->mlist;
     191                 :         16 :   Level->mlist = tml;
     192                 :         16 : }
     193                 :            : 
     194                 :            : 
     195                 :          3 : void make_merchant(int i, int j)
     196                 :            : {
     197                 :          3 :   pml tml = ((pml) (checkmalloc(sizeof(mltype))));
     198                 :          3 :   tml->m = (Level->site[i][j].creature = make_creature(MERCHANT));
     199                 :          3 :   tml->m->x = i;
     200                 :          3 :   tml->m->y = j;
     201                 :          3 :   tml->next = Level->mlist;
     202                 :          3 :   Level->mlist = tml;
     203                 :          3 : }
     204                 :            : 
     205                 :            : 
     206                 :        250 : void assign_village_function(int x, int y, int setup)
     207                 :            : {
     208                 :            :   static int next=0;
     209                 :            :   static int permutation[24]; /* number of x's in village map */
     210                 :            :   int i,j,k;
     211                 :            : 
     212                 :            : 
     213         [ +  + ]:        250 :   if (setup) {
     214                 :         10 :     next = 0;
     215         [ +  + ]:        250 :     for(i=0;i<24;i++)
     216                 :        240 :       permutation[i] = i;
     217         [ +  + ]:        250 :     for(i=0;i<24;i++) {
     218                 :        240 :       j = permutation[i];
     219                 :        240 :       k = random_range(24);
     220                 :        240 :       permutation[i] = permutation[k];
     221                 :        240 :       permutation[k] = j;
     222                 :            :     }
     223                 :            :   }
     224                 :            :   else {
     225                 :            : 
     226                 :        240 :     lset(x,y+1,STOPS);
     227                 :        240 :     lset(x+1,y,STOPS);
     228                 :        240 :     lset(x-1,y,STOPS);
     229                 :        240 :     lset(x,y-1,STOPS);
     230                 :        240 :     lset(x,y,STOPS);
     231                 :            : 
     232                 :            :     
     233   [ +  +  +  +  :        240 :     switch(permutation[next++]) {
                   +  + ]
     234                 :            :     case 0:
     235                 :         10 :       Level->site[x][y].locchar = OPEN_DOOR;
     236                 :         10 :       Level->site[x][y].p_locf = L_ARMORER;
     237                 :         10 :       break;
     238                 :            :     case 1:
     239                 :         10 :       Level->site[x][y].locchar = OPEN_DOOR;
     240                 :         10 :       Level->site[x][y].p_locf = L_HEALER;
     241                 :         10 :       break;
     242                 :            :     case 2: 
     243                 :         10 :       Level->site[x][y].locchar = OPEN_DOOR;
     244                 :         10 :       Level->site[x][y].p_locf = L_TAVERN;
     245                 :         10 :       break;
     246                 :            :     case 3:
     247                 :         10 :       Level->site[x][y].locchar = OPEN_DOOR;
     248                 :         10 :       Level->site[x][y].p_locf = L_COMMANDANT;
     249                 :         10 :       break;
     250                 :            :     case 4:
     251                 :         10 :       Level->site[x][y].locchar = OPEN_DOOR;
     252                 :         10 :       Level->site[x][y].p_locf = L_CARTOGRAPHER;
     253                 :         10 :       break;
     254                 :            :     default:
     255                 :        190 :       Level->site[x][y].locchar = CLOSED_DOOR;
     256         [ +  + ]:        190 :       if (random_range(2)) 
     257                 :        104 :         Level->site[x][y].aux = LOCKED;
     258         [ +  + ]:        190 :       if (random_range(2))
     259                 :         75 :         Level->site[x][y].p_locf = L_HOVEL;
     260                 :        115 :       else Level->site[x][y].p_locf = L_HOUSE;
     261                 :        190 :       break;
     262                 :            :     }
     263                 :            :   }
     264                 :        250 : }  
     265                 :            :   
     266                 :            : 
     267                 :            : /* WDT HACK!  Remove these literals, replace with VIL_* constants. */
     268                 :         10 : void special_village_site(int i, int j, int villagenum)
     269                 :            : {
     270         [ +  + ]:         10 :   if (villagenum == 1) {
     271                 :          2 :     Level->site[i][j].locchar = ALTAR;
     272                 :          2 :     Level->site[i][j].p_locf = L_LAWSTONE;
     273                 :            :   }
     274         [ +  + ]:         10 :   if (villagenum == 2) {
     275                 :          7 :     Level->site[i][j].locchar = ALTAR;
     276                 :          7 :     Level->site[i][j].p_locf = L_BALANCESTONE;
     277                 :            :   }
     278         [ -  + ]:          3 :   else if (villagenum == 3) {
     279                 :          0 :     Level->site[i][j].locchar = ALTAR; 
     280                 :          0 :     Level->site[i][j].p_locf = L_CHAOSTONE; 
     281                 :            :   }
     282         [ +  + ]:          3 :   else if (villagenum == 4) {
     283                 :          1 :     Level->site[i][j].locchar = ALTAR; 
     284                 :          1 :     Level->site[i][j].p_locf = L_MINDSTONE; 
     285                 :            :   }
     286         [ -  + ]:          2 :   else if (villagenum == 5) {
     287                 :          0 :     Level->site[i][j].locchar = ALTAR; 
     288                 :          0 :     Level->site[i][j].p_locf = L_SACRIFICESTONE; 
     289                 :            :   }
     290         [ -  + ]:          2 :   else if (villagenum == 6) {
     291                 :          0 :     Level->site[i][j].locchar = ALTAR; 
     292                 :          0 :     Level->site[i][j].p_locf = L_VOIDSTONE; 
     293                 :            :   }
     294                 :         10 : }

Generated by: LCOV version 1.11