home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / games / volume5 / omega2 / part17 / oenv.c next >
C/C++ Source or Header  |  1988-07-26  |  8KB  |  304 lines

  1. /* omega copyright (c) 1987,1988 by Laurence Raphael Brothers */
  2. /* oenv.c */
  3. /* some load_* routines for special environments */
  4.  
  5. #include "oglob.h"
  6.  
  7. /* loads the arena level into Level*/
  8. void load_arena()
  9. {
  10.   int i,j;
  11.   char site;
  12.   pob box=((pob)malloc(sizeof(objtype)));
  13.   FILE *fd;
  14.  
  15.   *box = Objects[THINGID+0];
  16.  
  17.   TempLevel = Level;
  18.   if (ok_to_free(TempLevel)) {
  19.     free((char *) TempLevel);
  20.     TempLevel = NULL;
  21.   }
  22.   Level = ((plv) malloc(sizeof(levtype)));
  23.   clear_level(Level);
  24.   Level->environment = E_ARENA;
  25.   strcpy(Str3,OMEGALIB);
  26.   strcat(Str3,"oarena.dat");
  27.   fd = fopen(Str3,"r");
  28.   for(j=0;j<LENGTH;j++) {
  29.     for(i=0;i<WIDTH;i++) {
  30.       Level->site[i][j].lstatus = SEEN+LIT;
  31.       Level->site[i][j].roomnumber = RS_ARENA;
  32.       site = getc(fd);
  33.       switch(site) {
  34.       case 'P':
  35.     Level->site[i][j].locchar = PORTCULLIS;
  36.     Level->site[i][j].p_locf = L_PORTCULLIS;
  37.     break;
  38.       case 'R':
  39.     Level->site[i][j].locchar = FLOOR;
  40.     Level->site[i][j].p_locf = L_RAISE_PORTCULLIS;
  41.     break;
  42.       case 'p':
  43.     Level->site[i][j].locchar = FLOOR;
  44.     Level->site[i][j].p_locf = L_PORTCULLIS;
  45.     break;
  46.       case '7':
  47.     Level->site[i][j].locchar = PORTCULLIS;
  48.     Level->site[i][j].p_locf = L_PORTCULLIS;
  49.     break;
  50.       case 'T':
  51.     Level->site[i][j].locchar = FLOOR;
  52.     Level->site[i][j].p_locf = L_DROP_EVERY_PORTCULLIS;
  53.     break;
  54.       case 'X':
  55.     Level->site[i][j].locchar = FLOOR;
  56.     Level->site[i][j].p_locf = L_ARENA_EXIT;
  57.     break;
  58.       default:
  59.     Level->site[i][j].locchar = site;
  60.     Level->site[i][j].p_locf = L_NO_OP;
  61.     break;
  62.       }
  63.       Level->site[i][j].showchar = Level->site[i][j].locchar;
  64.     }
  65.     fscanf(fd,"\n");
  66.  
  67.   }
  68.   Level->site[60][7].creature = Arena_Monster;
  69.   Arena_Monster->x = 60;
  70.   Arena_Monster->y = 7;
  71.   Arena_Monster->sense = 50;
  72.   m_pickup(Arena_Monster,box);
  73.   m_status_set(Arena_Monster,AWAKE);
  74.   Level->mlist = (pml) malloc(sizeof(mltype));
  75.   Level->mlist->m = Arena_Monster;
  76.   Level->mlist->next = NULL;
  77.   /* hehehehe cackled the dungeon master.... */
  78.   mprint("Your opponent holds the only way you can leave!");
  79.   Arena_Monster->hp += Arena_Monster->level*10;
  80.   Arena_Monster->hit += Arena_Monster->hit;
  81.   Arena_Monster->dmg += Arena_Monster->dmg/2;
  82. }
  83.  
  84. /* loads the sorcereror's circle into Level*/
  85. void load_circle()
  86. {
  87.   int i,j;
  88.   int safe = (Player.rank[CIRCLE] > 0);
  89.   char site;
  90.   FILE *fd;
  91.  
  92.   TempLevel = Level;
  93.   if (ok_to_free(TempLevel)) {
  94.     free((char *) TempLevel);
  95.     TempLevel = NULL;
  96.   }
  97.   Level = ((plv) malloc(sizeof(levtype)));
  98.   clear_level(Level);
  99.   Level->environment = E_CIRCLE;
  100.   strcpy(Str3,OMEGALIB);
  101.   strcat(Str3,"ocircle.dat");
  102.   fd = fopen(Str3,"r");
  103.   for(j=0;j<LENGTH;j++) {
  104.     for(i=0;i<WIDTH;i++) {
  105.       Level->site[i][j].lstatus = 0;
  106.       Level->site[i][j].roomnumber = RS_CIRCLE;
  107.       Level->site[i][j].p_locf = L_NO_OP;
  108.       site = getc(fd);
  109.       switch(site) {
  110.       case 'P':
  111.     Level->site[i][j].locchar = FLOOR;
  112.     make_prime(i,j); /* prime sorceror */
  113.     Level->site[i][j].creature->specialf = M_SP_PRIME;
  114.     if (! safe) m_status_set(Level->site[i][j].creature,HOSTILE);
  115.     break;
  116.       case 'D':
  117.     Level->site[i][j].locchar = FLOOR;
  118.     make_site_monster(i,j,ML9+7); /* prime circle demon */
  119.     if (safe) m_status_reset(Level->site[i][j].creature,HOSTILE);
  120.     Level->site[i][j].creature->specialf = M_SP_PRIME;
  121.     break;
  122.       case 's':
  123.     Level->site[i][j].locchar = FLOOR;
  124.     make_site_monster(i,j,ML4+13); /* servant of chaos */
  125.     Level->site[i][j].creature->specialf = M_SP_COURT;
  126.     if (safe) m_status_reset(Level->site[i][j].creature,HOSTILE);
  127.     break;
  128.       case 'e':
  129.     Level->site[i][j].locchar = FLOOR;
  130.     make_site_monster(i,j,ML2+7); /* enchanter */
  131.     Level->site[i][j].creature->specialf = M_SP_COURT;
  132.     if (safe) m_status_reset(Level->site[i][j].creature,HOSTILE);
  133.     break;
  134.       case 'n':
  135.     Level->site[i][j].locchar = FLOOR;
  136.     make_site_monster(i,j,ML5+6); /* necromancer */
  137.     Level->site[i][j].creature->specialf = M_SP_COURT;
  138.     if (safe) m_status_reset(Level->site[i][j].creature,HOSTILE);
  139.     break;
  140.       case 'T':
  141.     Level->site[i][j].locchar = FLOOR;
  142.     make_site_monster(i,j,ML9+4); /* High Thaumaturgist */
  143.     Level->site[i][j].creature->specialf = M_SP_COURT;
  144.     if (safe) m_status_reset(Level->site[i][j].creature,HOSTILE);
  145.     break;
  146.       case '#':
  147.     Level->site[i][j].locchar = WALL;
  148.     Level->site[i][j].aux = 1000; 
  149.     break;
  150.       case 'L':
  151.     Level->site[i][j].locchar = FLOOR;
  152.     Level->site[i][j].p_locf = L_CIRCLE_LIBRARY;
  153.     break;
  154.       case '?':
  155.     Level->site[i][j].locchar = FLOOR;
  156.     Level->site[i][j].p_locf = L_TOME1;
  157.     break;
  158.       case '!':
  159.     Level->site[i][j].locchar = FLOOR;
  160.     Level->site[i][j].p_locf = L_TOME2;
  161.     break;
  162.       case 'S':
  163.     Level->site[i][j].locchar = FLOOR;
  164.     lset(i,j,SECRET);
  165.     break;
  166.       case '.':
  167.     Level->site[i][j].locchar = FLOOR;
  168.     break;
  169.       case '-':
  170.     Level->site[i][j].locchar = CLOSED_DOOR;
  171.     break;
  172.       }
  173.     }
  174.     fscanf(fd,"\n");
  175.   }
  176.   fclose(fd);
  177. }
  178.  
  179. /* make the prime sorceror */
  180. void make_prime(i,j)
  181. int i,j;
  182. {
  183.   pml ml = ((pml) malloc(sizeof(mltype)));
  184.   pmt m = ((pmt) malloc(sizeof(montype)));
  185.   pol ol;
  186.   pob o;
  187.   make_hiscore_npc(m,10); /* 10 is index for prime */
  188.   m->x = i;
  189.   m->y = j;
  190.   Level->site[i][j].creature = m;
  191.   ml->m = m;
  192.   ml->next = Level->mlist;
  193.   Level->mlist = ml;
  194.   
  195.   if (! gamestatusp(COMPLETED_ASTRAL)) {
  196.     ol  = ((pol) malloc(sizeof(oltype)));
  197.     o  = ((pob) malloc(sizeof(objtype)));
  198.     *o = Objects[ARTIFACTID+21];
  199.     ol->thing = o;
  200.     ol->next = NULL;
  201.     m->possessions = ol;
  202.   }
  203.  
  204. }
  205.  
  206.  
  207.  
  208.  
  209.  
  210.  
  211. /* loads the court of the archmage into Level*/
  212. void load_court()
  213. {
  214.   int i,j;
  215.   char site;
  216.   FILE *fd;
  217.  
  218.   TempLevel = Level;
  219.   if (ok_to_free(TempLevel)) {
  220.     free((char *) TempLevel);
  221.     TempLevel = NULL;
  222.   }
  223.   Level = ((plv) malloc(sizeof(levtype)));
  224.   clear_level(Level);
  225.   Level->environment = E_COURT;
  226.   strcpy(Str3,OMEGALIB);
  227.   strcat(Str3,"ocourt.dat");
  228.   fd = fopen(Str3,"r");
  229.   for(j=0;j<LENGTH;j++) {
  230.     for(i=0;i<WIDTH;i++) {
  231.       Level->site[i][j].lstatus = 0;
  232.       Level->site[i][j].roomnumber = RS_COURT;
  233.       Level->site[i][j].p_locf = L_NO_OP;
  234.       site = getc(fd);
  235.       switch(site) {
  236.       case '5':
  237.     Level->site[i][j].locchar = CHAIR;
  238.     Level->site[i][j].p_locf = L_THRONE;
  239.     make_specific_treasure(i,j,ARTIFACTID+22);
  240.     make_archmage(i,j);
  241.     m_status_reset(Level->site[i][j].creature,HOSTILE);
  242.     m_status_reset(Level->site[i][j].creature,MOBILE);
  243.     break;
  244.       case 'e':
  245.     Level->site[i][j].locchar = FLOOR;
  246.     make_site_monster(i,j,ML2+7); /* enchanter */
  247.     m_status_reset(Level->site[i][j].creature,HOSTILE);
  248.     Level->site[i][j].creature->specialf = M_SP_COURT;
  249.     break;
  250.       case 'n':
  251.     Level->site[i][j].locchar = FLOOR;
  252.     make_site_monster(i,j,ML5+6); /* necromancer */
  253.     m_status_reset(Level->site[i][j].creature,HOSTILE);
  254.     Level->site[i][j].creature->specialf = M_SP_COURT;
  255.     break;
  256.       case 'T':
  257.     Level->site[i][j].locchar = FLOOR;
  258.     make_site_monster(i,j,ML9+4); /* High Thaumaturgist */
  259.     m_status_reset(Level->site[i][j].creature,HOSTILE);
  260.     Level->site[i][j].creature->specialf = M_SP_COURT;
  261.     break;
  262.       case '#':
  263.     Level->site[i][j].locchar = WALL;
  264.     Level->site[i][j].aux = 1000; 
  265.     break;
  266.       case 'G':
  267.     Level->site[i][j].locchar = FLOOR;
  268.     Level->site[i][j].locchar = FLOOR;
  269.     make_site_monster(i,j,ML0+3); /* guard */
  270.     m_status_reset(Level->site[i][j].creature,HOSTILE);
  271.     break;
  272.       case '<':
  273.     Level->site[i][j].locchar = UP;
  274.     Level->site[i][j].p_locf = L_ESCALATOR;
  275.     break;
  276.       case '.':
  277.     Level->site[i][j].locchar = FLOOR;
  278.     break;
  279.       }
  280.     }
  281.     fscanf(fd,"\n");
  282.   }
  283.   fclose(fd);
  284. }
  285.  
  286.  
  287.  
  288. /* make the archmage */
  289. void make_archmage(i,j)
  290. int i,j;
  291. {
  292.   pml ml = ((pml) malloc(sizeof(mltype)));
  293.   pmt m = ((pmt) malloc(sizeof(montype)));
  294.   make_hiscore_npc(m,9); /* 10 is index for archmage */
  295.   m->x = i;
  296.   m->y = j;
  297.   Level->site[i][j].creature = m;
  298.   ml->m = m;
  299.   ml->next = Level->mlist;
  300.   Level->mlist = ml;
  301.   m->specialf = M_SP_COURT;
  302. }
  303.  
  304.