home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / games / volume5 / omega2 / part10 / ovillage.c < prev   
C/C++ Source or Header  |  1988-07-25  |  6KB  |  274 lines

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