home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / VGALIB.ZIP / VOLCANO.C < prev    next >
C/C++ Source or Header  |  1992-09-06  |  5KB  |  245 lines

  1. #include<stdlib.h>
  2. #define INCL_BASE
  3. #include<os2.h>
  4. #include<math.h>
  5. #include<conio.h>
  6. #include<stdio.h>
  7. #include"vgalib.h"
  8. #include<process.h>
  9.  
  10. #define HANDLE 0
  11. #define WAIT 1
  12. #define BUFSIZE 12
  13. #define grv 4
  14. #define spx 640
  15. #define BLAST 10
  16. #define GROUND 6
  17. #define LAVA 39
  18.  
  19. PCH ptr0;
  20. unsigned int NUMPTS;
  21.  
  22. struct _VIOPHYSBUF phys;
  23. struct _VIOMODEINFO orig,moda;
  24.  
  25. void movepart(int p);
  26. void initpart(int p);
  27. void explosion(PCH ptr0, int spy);
  28. void keycheck(void *arg);
  29.  
  30.  
  31. int prt[2001][8];
  32. int tf=4,ts,dd[3]={0,-1,1},spy=797,prl=8;
  33. volatile static int KEYHIT;
  34.  
  35.  
  36.  
  37. int main(int argc, char *argv[])
  38. {
  39. char status;
  40. int p, mxh, pct=0;
  41. char *nparg;
  42. int numpoints;
  43.  
  44.  
  45.  
  46. if(argc==2)
  47.     {
  48.     nparg = argv[1];
  49.     numpoints = atoi(nparg);
  50.  
  51.     if(numpoints==0)
  52.         {
  53.         fprintf(stderr,"%s:  number of points zero or invalid\n",argv[0]);
  54.         exit(-1);
  55.         }
  56.  
  57.     NUMPTS = numpoints;
  58.     }
  59. else
  60.     {
  61.     NUMPTS = 50;  /*  default  */
  62.     }
  63.  
  64. printf("Volcano - a volcano simulation -  Version 1.0  \n\n");
  65. printf("By Tim Heil and John Stone \n");
  66. printf("OS/2 version by John Stone \n\n");
  67. printf("For info email to:  johns@cs.umr.edu  \n\n\n");
  68. printf("To use:  volcano n       (n is a number from 40-2000) \n");
  69. printf("default (if no param) is 40\n");
  70. printf("Press a key to begin. . . \n");
  71. status=getch();
  72.  
  73. KEYHIT=0;
  74.  
  75. /* setup for graphics mode... */
  76. phys.pBuf=(unsigned char *) 0xA0000;
  77. phys.cb=65536;
  78.  
  79. moda.cb=12;
  80. moda.fbType=3;
  81. moda.color=8;
  82. moda.col=40;
  83. moda.row=25;
  84. moda.hres=320;
  85. moda.vres=200;
  86.  
  87. VioGetMode(&orig, HANDLE);
  88.  
  89. VioSetMode(&moda, HANDLE);
  90.  
  91. VioGetPhysBuf(&phys,0);
  92.  
  93. ptr0=MAKEP(phys.asel[0], 0);
  94. _beginthread(keycheck,NULL,4096,NULL);
  95. VioScrLock(WAIT, &status, HANDLE);
  96. cls(ptr0,0);
  97. ts=1<<tf;ts=ts*ts*2;
  98.     while(KEYHIT==0) {
  99.     VioScrLock(WAIT, &status, HANDLE);
  100.         mxh=900;
  101.         for (p=0;p<NUMPTS;p++) {
  102.             if (prt[p][1]==0) { initpart(p); }
  103.             else movepart(p);
  104.             if (prt[p][3]<mxh) mxh=prt[p][3];
  105.         }
  106.         if (mxh*4>(spy-prl*4-8)) {
  107.             pct++;
  108.             if (pct==BLAST) {
  109.                 pct=0;
  110.                 spy-=4;
  111.                 };
  112.         }
  113.  
  114. if (spy<350) {
  115. for (p=0; p<NUMPTS; p++) {
  116.   putpixel(ptr0,prt[p][2],prt[p][3],(char) 0);
  117. }
  118. spy=436;
  119. explosion(ptr0,spy);
  120. spy=468;
  121. for (p=0; p<NUMPTS; p++) { prt[p][1]=0; }
  122. }
  123.  
  124. VioScrUnLock(HANDLE);
  125. }
  126.  
  127. VioScrLock(WAIT,&status,HANDLE);
  128. cls(ptr0,0);
  129.  
  130. VioSetMode(&orig, HANDLE);
  131. printf("Thankyou for using volcano :-) \n\n");
  132. VioScrUnLock(HANDLE);
  133. exit(0);
  134. }
  135.  
  136. void initpart(int p)
  137. {
  138.     prt[p][0]=(rand() % 27) - 13;
  139.     prt[p][1]=-1*((rand() % 60)+5);
  140.     prt[p][2]=spx+(rand() % 30)-15;
  141.     prt[p][3]=spy;
  142.     prt[p][4]=0;
  143.     prt[p][5]=LAVA+(rand() % 5);
  144.                 prt[p][6]=prt[p][2];
  145.     prt[p][7]=prt[p][3];
  146. if (((unsigned int) prt[p][2]<320) &&
  147.     ((unsigned int) prt[p][3]<800)) {    
  148. *(PCH) (ptr0+prt[p][2]+(320*(spy>>2)))=(char) prt[p][5];
  149. }
  150. }
  151.  
  152. void movepart(int p)
  153. {
  154.     long x,y,t,f;
  155.     long ag;
  156.     int d,x2;
  157.  
  158. t=prt[p][4]+1;
  159. if (t==-1) {
  160.     x=prt[p][2];
  161.     y=prt[p][3]+1;
  162.     if (y<200) {
  163.         for (d=0; d<3; d++) {
  164.         x2=x+dd[d];
  165.         if (getpixel(ptr0,x2,y)!=(char) GROUND) {
  166.               putpixel(ptr0,prt[p][2],prt[p][3],0);
  167.               putpixel(ptr0,x2,y,GROUND);
  168.  
  169. /*  if (((unsigned int) prt[p][2]<320) && 
  170.                   ((unsigned int) prt[p][3]<200)) {
  171.                   *(PCH) (ptr0+prt[p][2]+(320*prt[p][3]))=(char) 0;
  172.               }
  173.               if (((unsigned int) x2<320) && 
  174.                   ((unsigned int) y<200)) {
  175.                   *(PCH) (ptr0+x2+(320*y))=(char) GROUND;
  176.               } 
  177. */
  178.               prt[p][2]=x2;
  179.               prt[p][3]=y;
  180.               return;
  181.               }
  182.             }
  183.         }
  184. /* if (((unsigned int) prt[p][2]<320) && 
  185.         ((unsigned int) prt[p][3]<200)) {
  186.         *(PCH) (ptr0+prt[p][2]+(320*prt[p][3]))=(char) GROUND;
  187.     } 
  188. */
  189.         putpixel(ptr0,prt[p][2],prt[p][3],GROUND);
  190.     prt[p][1]=0;
  191.     return;
  192.     } /* end if (y<200) */
  193.  
  194.     x=(prt[p][6]+((prt[p][0]*t)>>tf))>>2;
  195.     ag=(grv*t*t)/ts;
  196.     y=(prt[p][7]+((prt[p][1]*t)>>tf)+ag)>>2;
  197.  
  198. if ((y<200) && ((getpixel(ptr0,x,y)!=GROUND) || (t<prl)))  {
  199. /* if (((unsigned int) prt[p][2]<320) &&
  200.             ((unsigned int) prt[p][3]<200)) {
  201.             *(PCH) (ptr0+prt[p][2]+(prt[p][3]*320))=(char) 0;
  202.         }
  203.         if ((x<320) && (y<200)) {
  204.             *(PCH) (ptr0+x+(320*y))=(char) prt[p][5];
  205.         } 
  206. */
  207.         putpixel(ptr0,prt[p][2],prt[p][3],0);
  208.         putpixel(ptr0,x,y,prt[p][5]);
  209.  
  210.         prt[p][2]=x;
  211.         prt[p][3]=y;
  212.         prt[p][4]=t;
  213.         }
  214.     else {  prt[p][4]=-2; }
  215. }
  216.  
  217. void explosion(PCH ptr0,int spy)
  218. {
  219. float p;
  220. unsigned int q,r,s;
  221. unsigned int x1,y1,z;
  222. char status;
  223.  
  224. z=(unsigned int) spy>>2;
  225.  
  226. for (q=0; q<400; q++) {
  227.   for (s=0; s<200; s++) {
  228.     p=(float) (rand() % 314)/100;
  229.     r=rand() % 90;
  230.     x1=(unsigned int) 155+((int) (rand() % 10)+(r*(cos(p))));
  231.     y1=(unsigned int) z - ((int) (r*(sin(p))));
  232.     line(ptr0,160,z,x1,y1,(char) (LAVA+(rand() % 5)) );
  233.   }
  234.   memset((PCH) ptr0,0,((z+1)*320));
  235. }
  236. }
  237.  
  238. void keycheck(void *arg) {
  239. char key1;
  240. key1=getchar();
  241.  
  242. KEYHIT=1;
  243. _endthread();
  244. }
  245.