home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Professional
/
OS2PRO194.ISO
/
os2
/
prgramer
/
vgalib
/
volcano.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-09-05
|
5KB
|
245 lines
#include<stdlib.h>
#define INCL_BASE
#include<os2.h>
#include<math.h>
#include<conio.h>
#include<stdio.h>
#include"vgalib.h"
#include<process.h>
#define HANDLE 0
#define WAIT 1
#define BUFSIZE 12
#define grv 4
#define spx 640
#define BLAST 10
#define GROUND 6
#define LAVA 39
PCH ptr0;
unsigned int NUMPTS;
struct _VIOPHYSBUF phys;
struct _VIOMODEINFO orig,moda;
void movepart(int p);
void initpart(int p);
void explosion(PCH ptr0, int spy);
void keycheck(void *arg);
int prt[2001][8];
int tf=4,ts,dd[3]={0,-1,1},spy=797,prl=8;
volatile static int KEYHIT;
int main(int argc, char *argv[])
{
char status;
int p, mxh, pct=0;
char *nparg;
int numpoints;
if(argc==2)
{
nparg = argv[1];
numpoints = atoi(nparg);
if(numpoints==0)
{
fprintf(stderr,"%s: number of points zero or invalid\n",argv[0]);
exit(-1);
}
NUMPTS = numpoints;
}
else
{
NUMPTS = 50; /* default */
}
printf("Volcano - a volcano simulation - Version 1.0 \n\n");
printf("By Tim Heil and John Stone \n");
printf("OS/2 version by John Stone \n\n");
printf("For info email to: johns@cs.umr.edu \n\n\n");
printf("To use: volcano n (n is a number from 40-2000) \n");
printf("default (if no param) is 40\n");
printf("Press a key to begin. . . \n");
status=getch();
KEYHIT=0;
/* setup for graphics mode... */
phys.pBuf=(unsigned char *) 0xA0000;
phys.cb=65536;
moda.cb=12;
moda.fbType=3;
moda.color=8;
moda.col=40;
moda.row=25;
moda.hres=320;
moda.vres=200;
VioGetMode(&orig, HANDLE);
VioSetMode(&moda, HANDLE);
VioGetPhysBuf(&phys,0);
ptr0=MAKEP(phys.asel[0], 0);
_beginthread(keycheck,NULL,4096,NULL);
VioScrLock(WAIT, &status, HANDLE);
cls(ptr0,0);
ts=1<<tf;ts=ts*ts*2;
while(KEYHIT==0) {
VioScrLock(WAIT, &status, HANDLE);
mxh=900;
for (p=0;p<NUMPTS;p++) {
if (prt[p][1]==0) { initpart(p); }
else movepart(p);
if (prt[p][3]<mxh) mxh=prt[p][3];
}
if (mxh*4>(spy-prl*4-8)) {
pct++;
if (pct==BLAST) {
pct=0;
spy-=4;
};
}
if (spy<350) {
for (p=0; p<NUMPTS; p++) {
putpixel(ptr0,prt[p][2],prt[p][3],(char) 0);
}
spy=436;
explosion(ptr0,spy);
spy=468;
for (p=0; p<NUMPTS; p++) { prt[p][1]=0; }
}
VioScrUnLock(HANDLE);
}
VioScrLock(WAIT,&status,HANDLE);
cls(ptr0,0);
VioSetMode(&orig, HANDLE);
printf("Thankyou for using volcano :-) \n\n");
VioScrUnLock(HANDLE);
exit(0);
}
void initpart(int p)
{
prt[p][0]=(rand() % 27) - 13;
prt[p][1]=-1*((rand() % 60)+5);
prt[p][2]=spx+(rand() % 30)-15;
prt[p][3]=spy;
prt[p][4]=0;
prt[p][5]=LAVA+(rand() % 5);
prt[p][6]=prt[p][2];
prt[p][7]=prt[p][3];
if (((unsigned int) prt[p][2]<320) &&
((unsigned int) prt[p][3]<800)) {
*(PCH) (ptr0+prt[p][2]+(320*(spy>>2)))=(char) prt[p][5];
}
}
void movepart(int p)
{
long x,y,t,f;
long ag;
int d,x2;
t=prt[p][4]+1;
if (t==-1) {
x=prt[p][2];
y=prt[p][3]+1;
if (y<200) {
for (d=0; d<3; d++) {
x2=x+dd[d];
if (getpixel(ptr0,x2,y)!=(char) GROUND) {
putpixel(ptr0,prt[p][2],prt[p][3],0);
putpixel(ptr0,x2,y,GROUND);
/* if (((unsigned int) prt[p][2]<320) &&
((unsigned int) prt[p][3]<200)) {
*(PCH) (ptr0+prt[p][2]+(320*prt[p][3]))=(char) 0;
}
if (((unsigned int) x2<320) &&
((unsigned int) y<200)) {
*(PCH) (ptr0+x2+(320*y))=(char) GROUND;
}
*/
prt[p][2]=x2;
prt[p][3]=y;
return;
}
}
}
/* if (((unsigned int) prt[p][2]<320) &&
((unsigned int) prt[p][3]<200)) {
*(PCH) (ptr0+prt[p][2]+(320*prt[p][3]))=(char) GROUND;
}
*/
putpixel(ptr0,prt[p][2],prt[p][3],GROUND);
prt[p][1]=0;
return;
} /* end if (y<200) */
x=(prt[p][6]+((prt[p][0]*t)>>tf))>>2;
ag=(grv*t*t)/ts;
y=(prt[p][7]+((prt[p][1]*t)>>tf)+ag)>>2;
if ((y<200) && ((getpixel(ptr0,x,y)!=GROUND) || (t<prl))) {
/* if (((unsigned int) prt[p][2]<320) &&
((unsigned int) prt[p][3]<200)) {
*(PCH) (ptr0+prt[p][2]+(prt[p][3]*320))=(char) 0;
}
if ((x<320) && (y<200)) {
*(PCH) (ptr0+x+(320*y))=(char) prt[p][5];
}
*/
putpixel(ptr0,prt[p][2],prt[p][3],0);
putpixel(ptr0,x,y,prt[p][5]);
prt[p][2]=x;
prt[p][3]=y;
prt[p][4]=t;
}
else { prt[p][4]=-2; }
}
void explosion(PCH ptr0,int spy)
{
float p;
unsigned int q,r,s;
unsigned int x1,y1,z;
char status;
z=(unsigned int) spy>>2;
for (q=0; q<400; q++) {
for (s=0; s<200; s++) {
p=(float) (rand() % 314)/100;
r=rand() % 90;
x1=(unsigned int) 155+((int) (rand() % 10)+(r*(cos(p))));
y1=(unsigned int) z - ((int) (r*(sin(p))));
line(ptr0,160,z,x1,y1,(char) (LAVA+(rand() % 5)) );
}
memset((PCH) ptr0,0,((z+1)*320));
}
}
void keycheck(void *arg) {
char key1;
key1=getchar();
KEYHIT=1;
_endthread();
}