LTCD_070816.ISO
This commit is contained in:
1 parent
d14bbc24f9
commit
0e9364ff4c
506 files changed
+157705
-41812
No files matched your search
@@ -0,0 +1,736 @@
|
||||
$BD,0$$FD,15$
|
||||
GrBitMap *RK_base=GrAlias(grbase2,Fs);
|
||||
|
||||
|
||||
$PI,"<ship_null>",2$
|
||||
|
||||
|
||||
$PI,"<ship_thrust>",3$
|
||||
|
||||
|
||||
|
||||
$PI,"<ship_null2>",19$
|
||||
|
||||
|
||||
$PI,"<ship_thrust2>",20$
|
||||
|
||||
|
||||
$PI,"<speck>",24$
|
||||
|
||||
$PI,"<pebble>",23$
|
||||
|
||||
|
||||
$PI,"<tiny_rock>",21$
|
||||
|
||||
|
||||
$PI,"<tiny_rock2>",22$
|
||||
|
||||
|
||||
$PI,"<small_rock>",4$
|
||||
|
||||
|
||||
$PI,"<small_rock2>",13$
|
||||
|
||||
|
||||
|
||||
$PI,"<medium_rock>",5$
|
||||
|
||||
|
||||
$PI,"<medium_rock2>",14$
|
||||
|
||||
|
||||
|
||||
|
||||
$PI,"<large_rock>",6$
|
||||
|
||||
|
||||
$PI,"<large_rock2>",15$
|
||||
|
||||
|
||||
$PI,"<Bullet>",7$
|
||||
|
||||
|
||||
|
||||
|
||||
$PI,"<Cargo>",18$
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#define CMD_NULL 0
|
||||
#define CMD_SPIN_LEFT 1
|
||||
#define CMD_SPIN_RIGHT 2
|
||||
#define CMD_THRUST 3
|
||||
#define CMD_FIRE 4
|
||||
#define CMD_EXIT 5
|
||||
I8 cmd=CMD_NULL;
|
||||
|
||||
#define NUM_STARS 100
|
||||
I8 stars_x[NUM_STARS],stars_y[NUM_STARS];
|
||||
|
||||
BoolU4 bounce=TRUE;
|
||||
|
||||
#define OT_SHIP 1
|
||||
#define OT_CARGO 2
|
||||
#define OT_BULLET 3
|
||||
#define OT_SPECK 4
|
||||
#define OT_PEBBLE 5
|
||||
#define OT_TINY_ROCK 6
|
||||
#define OT_SMALL_ROCK 7
|
||||
#define OT_MEDIUM_ROCK 8
|
||||
#define OT_LARGE_ROCK 9
|
||||
|
||||
#define A_TRANSITION -1
|
||||
#define A_INACTIVE 0
|
||||
#define A_ACTIVE 1
|
||||
|
||||
class Order2D2Theta
|
||||
{
|
||||
double x,y,theta;
|
||||
double DxDt,DyDt,DthetaDt;
|
||||
};
|
||||
|
||||
class Object
|
||||
{
|
||||
I4 active;
|
||||
I4 type;
|
||||
U1 *img;
|
||||
double mass,radius;
|
||||
U8 timeout;
|
||||
};
|
||||
|
||||
#define NUM_OBJECTS 256
|
||||
|
||||
Ode *ode;
|
||||
Order2D2Theta *o;
|
||||
Object *objs;
|
||||
|
||||
void InitObject(I8 i, I8 type)
|
||||
{
|
||||
objs[i].active=A_ACTIVE;
|
||||
objs[i].timeout=0;
|
||||
objs[i].type=type;
|
||||
switch (type) {
|
||||
case OT_SHIP:
|
||||
objs[i].img=$IB,"<ship_null>",2$;
|
||||
objs[i].radius=15;
|
||||
break;
|
||||
case OT_CARGO:
|
||||
objs[i].img=$IB,"<cargo>",18$;
|
||||
objs[i].radius=30;
|
||||
break;
|
||||
case OT_BULLET:
|
||||
objs[i].img=$IB,"<bullet>",9$;
|
||||
objs[i].radius=7;
|
||||
break;
|
||||
case OT_SPECK:
|
||||
objs[i].img=$IB,"<speck>",24$;
|
||||
objs[i].radius=3;
|
||||
break;
|
||||
case OT_PEBBLE:
|
||||
objs[i].img=$IB,"<pebble>",23$;
|
||||
objs[i].radius=5;
|
||||
break;
|
||||
case OT_TINY_ROCK:
|
||||
if (i&1)
|
||||
objs[i].img=$IB,"<tiny_rock>",21$;
|
||||
else
|
||||
objs[i].img=$IB,"<tiny_rock2>",22$;
|
||||
objs[i].radius=5;
|
||||
break;
|
||||
case OT_SMALL_ROCK:
|
||||
if (i&1)
|
||||
objs[i].img=$IB,"<small_rock>",10$;
|
||||
else
|
||||
objs[i].img=$IB,"<small_rock2>",13$;
|
||||
objs[i].radius=11;
|
||||
break;
|
||||
case OT_MEDIUM_ROCK:
|
||||
if (i&1)
|
||||
objs[i].img=$IB,"<medium_rock>",11$;
|
||||
else
|
||||
objs[i].img=$IB,"<medium_rock2>",14$;
|
||||
objs[i].radius=20;
|
||||
break;
|
||||
case OT_LARGE_ROCK:
|
||||
if (i&1)
|
||||
objs[i].img=$IB,"<large_rock>",12$;
|
||||
else
|
||||
objs[i].img=$IB,"<large_rock2>",15$;
|
||||
objs[i].radius=26;
|
||||
break;
|
||||
}
|
||||
objs[i].mass=objs[i].radius*objs[i].radius*objs[i].radius;
|
||||
}
|
||||
|
||||
I8 AllocObject(I8 type)
|
||||
{
|
||||
I8 i;
|
||||
for (i=0;i<NUM_OBJECTS-1;i++)
|
||||
if (objs[i].active==A_INACTIVE)
|
||||
break;
|
||||
InitObject(i,type);
|
||||
return i;
|
||||
}
|
||||
|
||||
|
||||
void DrawIt(TssStruct *tss)
|
||||
{
|
||||
I8 i,*r1,x,y;
|
||||
ClearWinText(tss);
|
||||
LtfUpdateAuxLtf(tss);
|
||||
|
||||
RK_base->color=WHITE;
|
||||
for (i=0;i<NUM_STARS;i++)
|
||||
GrPlot(RK_base,stars_x[i],stars_y[i]);
|
||||
|
||||
for (i=0;i<NUM_OBJECTS;i++) {
|
||||
if (objs[i].active==A_ACTIVE) {
|
||||
if (objs[i].timeout && objs[i].timeout<GetTimeStamp)
|
||||
objs[i].active=A_INACTIVE;
|
||||
else {
|
||||
x=o[i].x;
|
||||
y=o[i].y;
|
||||
|
||||
if (x<0) {
|
||||
x=GR_WIDTH-AbsI8(x)%GR_WIDTH;
|
||||
o[i].x=x;
|
||||
} else if (x>GR_WIDTH) {
|
||||
x=x%GR_WIDTH;
|
||||
o[i].x=x;
|
||||
}
|
||||
if (y<0) {
|
||||
y=GR_HEIGHT-AbsI8(y)%GR_HEIGHT;
|
||||
o[i].y=y;
|
||||
} else if (y>GR_HEIGHT) {
|
||||
y=y%GR_HEIGHT;
|
||||
o[i].y=y;
|
||||
}
|
||||
switch (objs[i].type) {
|
||||
case OT_SHIP:
|
||||
RK_base->flags|=BMF_TRANSFORMATION;
|
||||
r1=RK_base->r;
|
||||
RK_base->r=GrTheta(o[i].theta);
|
||||
RK_base->x=x;
|
||||
RK_base->y=y;
|
||||
RK_base->z=0;
|
||||
if (cmd==CMD_THRUST && GetTimeStamp&8192)
|
||||
GrElemsPlot(RK_base,0,0,0,$IB,"<ship_thrust>",3$);
|
||||
else
|
||||
GrElemsPlot(RK_base,0,0,0,$IB,"<ship_null>",2$);
|
||||
Free(RK_base->r);
|
||||
RK_base->r=r1;
|
||||
RK_base->flags&=~BMF_TRANSFORMATION;
|
||||
break;
|
||||
case OT_BULLET:
|
||||
case OT_SPECK:
|
||||
case OT_PEBBLE:
|
||||
case OT_TINY_ROCK:
|
||||
case OT_SMALL_ROCK:
|
||||
case OT_MEDIUM_ROCK:
|
||||
case OT_LARGE_ROCK:
|
||||
case OT_CARGO:
|
||||
RK_base->flags|=BMF_TRANSFORMATION;
|
||||
r1=RK_base->r;
|
||||
RK_base->r=GrTheta(o[i].theta);
|
||||
RK_base->x=x;
|
||||
RK_base->y=y;
|
||||
RK_base->z=0;
|
||||
GrElemsPlot(RK_base,0,0,0,objs[i].img);
|
||||
Free(RK_base->r);
|
||||
RK_base->r=r1;
|
||||
RK_base->flags&=~BMF_TRANSFORMATION;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void SongEndTsk()
|
||||
{
|
||||
Sound(0);
|
||||
Exit;
|
||||
}
|
||||
|
||||
void SongTsk()
|
||||
{
|
||||
Fs->end_task_cb=&SongEndTsk;
|
||||
ResetMusicSettings;
|
||||
while (TRUE) {
|
||||
Play("qDCDeEGBDetBBFqDeDB");
|
||||
Play("FAetAFDeDFqAetDFBeDFetFDEqD");
|
||||
Play("eFAetAFDeDFqAetDFBeDFetFDEqD");
|
||||
}
|
||||
}
|
||||
|
||||
void InitObjs()
|
||||
{
|
||||
I8 i,j;
|
||||
|
||||
for (i=0;i<NUM_STARS;i++) {
|
||||
stars_x[i]=RandU2%GR_WIDTH;
|
||||
stars_y[i]=RandU2%GR_HEIGHT;
|
||||
}
|
||||
|
||||
MemSet(objs,0,sizeof(Object)*NUM_OBJECTS);
|
||||
MemSet(o,0,sizeof(Order2D2Theta)*NUM_OBJECTS);
|
||||
|
||||
i=AllocObject(OT_SHIP); //always #0
|
||||
objs[i].mass=2.0*objs[i].radius*objs[i].radius*objs[i].radius;
|
||||
o[i].x=GR_WIDTH/2;
|
||||
o[i].y=GR_HEIGHT/2;
|
||||
|
||||
i=AllocObject(OT_CARGO); //always #1
|
||||
objs[i].mass=0.5*objs[i].radius*objs[i].radius*objs[i].radius;
|
||||
o[i].x=0;
|
||||
o[i].DxDt=16.0;
|
||||
o[i].y=GR_HEIGHT/2;
|
||||
o[i].theta=pi/2;
|
||||
|
||||
for (j=0;j<4;j++) {
|
||||
i=AllocObject(OT_LARGE_ROCK);
|
||||
o[i].x=RandU4%GR_WIDTH;
|
||||
o[i].y=RandU4%GR_HEIGHT;
|
||||
o[i].DxDt=(32768-RandU2)/2000.0;
|
||||
o[i].DyDt=(32768-RandU2)/2000.0;
|
||||
o[i].DthetaDt=(32768-RandU2)/25000.0;
|
||||
o[i].theta=pi2*(32768-RandU2)/16384.0;
|
||||
}
|
||||
}
|
||||
|
||||
void MyDerivative(Ode *ode,double t,Order2D2Theta *state,Order2D2Theta *DstateDt)
|
||||
{
|
||||
I8 i,j;
|
||||
double f,d,d1,dd,dx,dy;
|
||||
nounusedwarn ode,t;
|
||||
|
||||
MemSet(DstateDt,0,sizeof(Order2D2Theta)*NUM_OBJECTS);
|
||||
for (i=0;i<NUM_OBJECTS;i++) {
|
||||
if (objs[i].active==A_ACTIVE) {
|
||||
DstateDt[i].x=state[i].DxDt;
|
||||
DstateDt[i].y=state[i].DyDt;
|
||||
DstateDt[i].theta=state[i].DthetaDt;
|
||||
for (j=0;j<NUM_OBJECTS;j++) {
|
||||
if (i!=j && objs[j].active==A_ACTIVE) {
|
||||
dx=state[i].x-state[j].x;
|
||||
dy=state[i].y-state[j].y;
|
||||
dd=Sqr(dx)+Sqr(dy);
|
||||
d=Sqrt(dd);
|
||||
|
||||
if (d) {
|
||||
dx/=d;
|
||||
dy/=d;
|
||||
} else {
|
||||
dx=0;
|
||||
dy=0;
|
||||
}
|
||||
|
||||
d1=objs[i].radius+objs[j].radius;
|
||||
f=0;
|
||||
if (dd<Sqr(d1)) {
|
||||
if (bounce && objs[i].type!=OT_CARGO && objs[j].type!=OT_CARGO) {
|
||||
f=Sqr(Sqr(Sqr(d1-Abs(d)+0.1))); //spring force
|
||||
if (f>1000000.0) f=1000000.0;
|
||||
}
|
||||
} else
|
||||
f=-2.5*objs[i].mass*objs[j].mass/(dd+1.0);
|
||||
|
||||
DstateDt[i].DxDt+=f*dx/objs[i].mass;
|
||||
DstateDt[i].DyDt+=f*dy/objs[i].mass;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
switch (cmd) {
|
||||
case CMD_SPIN_LEFT:
|
||||
DstateDt[0].DthetaDt-=10.0;
|
||||
break;
|
||||
case CMD_SPIN_RIGHT:
|
||||
DstateDt[0].DthetaDt+=10.0;
|
||||
break;
|
||||
case CMD_THRUST:
|
||||
DstateDt[0].DxDt+=100.0*Cos(state[0].theta-pi/2.0);
|
||||
DstateDt[0].DyDt+=100.0*Sin(state[0].theta-pi/2.0);
|
||||
break;
|
||||
}
|
||||
|
||||
DstateDt[1].DxDt+=2.0*Cos(state[1].theta-pi/2.0);
|
||||
DstateDt[1].DyDt+=2.0*Sin(state[1].theta-pi/2.0);
|
||||
}
|
||||
|
||||
void Collision(I8 i,I8 j)
|
||||
{
|
||||
I8 i2;
|
||||
switch (objs[i].type) {
|
||||
case OT_SHIP:
|
||||
if (!bounce) {
|
||||
cmd=CMD_EXIT;
|
||||
objs[i].active=A_INACTIVE;
|
||||
}
|
||||
break;
|
||||
case OT_CARGO:
|
||||
cmd=CMD_EXIT;
|
||||
objs[i].active=A_INACTIVE;
|
||||
break;
|
||||
case OT_SPECK:
|
||||
if (objs[j].type==OT_BULLET && !bounce)
|
||||
objs[i].active=A_INACTIVE;
|
||||
break;
|
||||
case OT_BULLET:
|
||||
if (!bounce)
|
||||
objs[i].active=A_INACTIVE;
|
||||
break;
|
||||
case OT_PEBBLE:
|
||||
case OT_TINY_ROCK:
|
||||
case OT_SMALL_ROCK:
|
||||
case OT_MEDIUM_ROCK:
|
||||
i2=AllocObject(objs[i].type-1);
|
||||
objs[i2].active=A_TRANSITION;
|
||||
o[i2].x=o[i].x+objs[i2].radius+2.0;
|
||||
o[i2].y=o[i].y;
|
||||
o[i2].theta=o[i].theta;
|
||||
o[i2].DxDt=o[i].DxDt;
|
||||
o[i2].DyDt=o[i].DyDt;
|
||||
o[i2].DthetaDt=o[i].DthetaDt;
|
||||
|
||||
i2=AllocObject(objs[i].type-1);
|
||||
objs[i2].active=A_TRANSITION;
|
||||
o[i2].x=o[i].x-objs[i2].radius-2.0;
|
||||
o[i2].y=o[i].y;
|
||||
o[i2].theta=o[i].theta;
|
||||
o[i2].DxDt=o[i].DxDt;
|
||||
o[i2].DyDt=o[i].DyDt;
|
||||
o[i2].DthetaDt=o[i].DthetaDt;
|
||||
|
||||
objs[i].active=A_INACTIVE;
|
||||
break;
|
||||
case OT_LARGE_ROCK:
|
||||
i2=AllocObject(objs[i].type-1);
|
||||
objs[i2].active=A_TRANSITION;
|
||||
o[i2].x=o[i].x+objs[i2].radius+4.0;
|
||||
o[i2].y=o[i].y+objs[i2].radius+4.0;
|
||||
o[i2].theta=o[i].theta;
|
||||
o[i2].DxDt=o[i].DxDt;
|
||||
o[i2].DyDt=o[i].DyDt;
|
||||
o[i2].DthetaDt=o[i].DthetaDt;
|
||||
|
||||
i2=AllocObject(objs[i].type-1);
|
||||
objs[i2].active=A_TRANSITION;
|
||||
o[i2].x=o[i].x-objs[i2].radius-4.0;
|
||||
o[i2].y=o[i].y-objs[i2].radius-4.0;
|
||||
o[i2].theta=o[i].theta;
|
||||
o[i2].DxDt=o[i].DxDt;
|
||||
o[i2].DyDt=o[i].DyDt;
|
||||
o[i2].DthetaDt=o[i].DthetaDt;
|
||||
|
||||
i2=AllocObject(objs[i].type-1);
|
||||
objs[i2].active=A_TRANSITION;
|
||||
o[i2].x=o[i].x-objs[i2].radius-4.0;
|
||||
o[i2].y=o[i].y+objs[i2].radius+4.0;
|
||||
o[i2].theta=o[i].theta;
|
||||
o[i2].DxDt=o[i].DxDt;
|
||||
o[i2].DyDt=o[i].DyDt;
|
||||
o[i2].DthetaDt=o[i].DthetaDt;
|
||||
|
||||
i2=AllocObject(objs[i].type-1);
|
||||
objs[i2].active=A_TRANSITION;
|
||||
o[i2].x=o[i].x+objs[i2].radius+4.0;
|
||||
o[i2].y=o[i].y-objs[i2].radius-4.0;
|
||||
o[i2].theta=o[i].theta;
|
||||
o[i2].DxDt=o[i].DxDt;
|
||||
o[i2].DyDt=o[i].DyDt;
|
||||
o[i2].DthetaDt=o[i].DthetaDt;
|
||||
|
||||
objs[i].active=A_INACTIVE;
|
||||
break;
|
||||
}
|
||||
|
||||
switch (objs[j].type) {
|
||||
case OT_SHIP:
|
||||
if (!bounce) {
|
||||
cmd=CMD_EXIT;
|
||||
objs[j].active=A_INACTIVE;
|
||||
}
|
||||
break;
|
||||
case OT_CARGO:
|
||||
cmd=CMD_EXIT;
|
||||
objs[j].active=A_INACTIVE;
|
||||
break;
|
||||
case OT_SPECK:
|
||||
if (objs[i].type==OT_BULLET && !bounce)
|
||||
objs[j].active=A_INACTIVE;
|
||||
break;
|
||||
case OT_BULLET:
|
||||
if (!bounce)
|
||||
objs[j].active=A_INACTIVE;
|
||||
break;
|
||||
case OT_PEBBLE:
|
||||
case OT_TINY_ROCK:
|
||||
case OT_SMALL_ROCK:
|
||||
case OT_MEDIUM_ROCK:
|
||||
i2=AllocObject(objs[j].type-1);
|
||||
objs[i2].active=A_TRANSITION;
|
||||
o[i2].x=o[j].x+objs[i2].radius+2.0;
|
||||
o[i2].y=o[j].y;
|
||||
o[i2].theta=o[j].theta;
|
||||
o[i2].DxDt=o[j].DxDt;
|
||||
o[i2].DyDt=o[j].DyDt;
|
||||
o[i2].DthetaDt=o[j].DthetaDt;
|
||||
|
||||
i2=AllocObject(objs[j].type-1);
|
||||
objs[i2].active=A_TRANSITION;
|
||||
o[i2].x=o[j].x-objs[i2].radius-2.0;
|
||||
o[i2].y=o[j].y;
|
||||
o[i2].theta=o[j].theta;
|
||||
o[i2].DxDt=o[j].DxDt;
|
||||
o[i2].DyDt=o[j].DyDt;
|
||||
o[i2].DthetaDt=o[j].DthetaDt;
|
||||
|
||||
objs[j].active=A_INACTIVE;
|
||||
break;
|
||||
|
||||
case OT_LARGE_ROCK:
|
||||
i2=AllocObject(objs[j].type-1);
|
||||
objs[i2].active=A_TRANSITION;
|
||||
o[i2].x=o[j].x+objs[i2].radius+4.0;
|
||||
o[i2].y=o[j].y+objs[i2].radius+4.0;
|
||||
o[i2].theta=o[j].theta;
|
||||
o[i2].DxDt=o[j].DxDt;
|
||||
o[i2].DyDt=o[j].DyDt;
|
||||
o[i2].DthetaDt=o[j].DthetaDt;
|
||||
|
||||
i2=AllocObject(objs[j].type-1);
|
||||
objs[i2].active=A_TRANSITION;
|
||||
o[i2].x=o[j].x-objs[i2].radius-4.0;
|
||||
o[i2].y=o[j].y-objs[i2].radius-4.0;
|
||||
o[i2].theta=o[j].theta;
|
||||
o[i2].DxDt=o[j].DxDt;
|
||||
o[i2].DyDt=o[j].DyDt;
|
||||
o[i2].DthetaDt=o[j].DthetaDt;
|
||||
|
||||
i2=AllocObject(objs[j].type-1);
|
||||
objs[i2].active=A_TRANSITION;
|
||||
o[i2].x=o[j].x-objs[i2].radius-4.0;
|
||||
o[i2].y=o[j].y+objs[i2].radius+4.0;
|
||||
o[i2].theta=o[j].theta;
|
||||
o[i2].DxDt=o[j].DxDt;
|
||||
o[i2].DyDt=o[j].DyDt;
|
||||
o[i2].DthetaDt=o[j].DthetaDt;
|
||||
|
||||
i2=AllocObject(objs[j].type-1);
|
||||
objs[i2].active=A_TRANSITION;
|
||||
o[i2].x=o[j].x+objs[i2].radius+4.0;
|
||||
o[i2].y=o[j].y-objs[i2].radius-4.0;
|
||||
o[i2].theta=o[j].theta;
|
||||
o[i2].DxDt=o[j].DxDt;
|
||||
o[i2].DyDt=o[j].DyDt;
|
||||
o[i2].DthetaDt=o[j].DthetaDt;
|
||||
|
||||
objs[j].active=A_INACTIVE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void CheckCollisions()
|
||||
{
|
||||
I8 i,j,*r1;
|
||||
double d,d1,dd,dx,dy;
|
||||
GrBitMap *b;
|
||||
for (i=0;i<NUM_OBJECTS;i++) {
|
||||
if (objs[i].active==A_ACTIVE) {
|
||||
for (j=i+1;j<NUM_OBJECTS;j++) {
|
||||
if (objs[j].active==A_ACTIVE) {
|
||||
dx=o[i].x-o[j].x;
|
||||
dy=o[i].y-o[j].y;
|
||||
dd=Sqr(dx)+Sqr(dy);
|
||||
d=Sqrt(dd);
|
||||
|
||||
if (d) {
|
||||
dx/=d;
|
||||
dy/=d;
|
||||
} else {
|
||||
dx=0;
|
||||
dy=0;
|
||||
}
|
||||
|
||||
d1=objs[i].radius+objs[j].radius;
|
||||
if (dd<Sqr(d1)) {
|
||||
b=GrBitMapNew(BMT_COLOR4,64,64,Fs);
|
||||
b->flags|=BMF_TRANSFORMATION;
|
||||
|
||||
r1=b->r;
|
||||
b->r=GrTheta(o[i].theta);
|
||||
b->x=32;
|
||||
b->y=32;
|
||||
b->z=0;
|
||||
GrElemsPlot(b,0,0,0,objs[i].img);
|
||||
Free(b->r);
|
||||
b->r=r1;
|
||||
|
||||
b->bkcolor=ROP_COLLISION+BLACK;
|
||||
|
||||
r1=b->r;
|
||||
b->r=GrTheta(o[j].theta);
|
||||
b->x=o[j].x-o[i].x+32;
|
||||
b->y=o[j].y-o[i].y+32;
|
||||
b->z=0;
|
||||
GrElemsPlot(b,0,0,0,objs[j].img);
|
||||
Free(b->r);
|
||||
b->r=r1;
|
||||
|
||||
if (b->collision_cnt>0)
|
||||
Collision(i,j);
|
||||
|
||||
GrDel(b);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
for (i=0;i<NUM_OBJECTS;i++)
|
||||
if (objs[i].active==A_TRANSITION)
|
||||
objs[i].active=A_ACTIVE;
|
||||
}
|
||||
|
||||
#define MUZZLE_VELOCITY 500.0
|
||||
|
||||
void Fire()
|
||||
{
|
||||
double t=o[0].theta;
|
||||
I8 i=AllocObject(OT_BULLET);
|
||||
objs[i].timeout=GetTimeStamp+time_stamp_freq/2;
|
||||
objs[i].mass*=10.0;
|
||||
o[i].x=o[0].x+(objs[0].radius+objs[i].radius+1.0)*Cos(t-pi/2.0);
|
||||
o[i].y=o[0].y+(objs[0].radius+objs[i].radius+1.0)*Sin(t-pi/2.0);
|
||||
o[i].DxDt=o[0].DxDt+MUZZLE_VELOCITY*Cos(t-pi/2.0);
|
||||
o[i].DyDt=o[0].DyDt+MUZZLE_VELOCITY*Sin(t-pi/2.0);
|
||||
o[i].DthetaDt=(32768-RandU2)/3000.0;
|
||||
|
||||
//not real physics with the 0.005 factor
|
||||
o[0].DxDt-=0.005*MUZZLE_VELOCITY*Cos(t-pi/2.0)*objs[i].mass/objs[0].mass;
|
||||
o[0].DyDt-=0.005*MUZZLE_VELOCITY*Sin(t-pi/2.0)*objs[i].mass/objs[0].mass;
|
||||
}
|
||||
|
||||
void CheckCrazy()
|
||||
{
|
||||
I8 i;
|
||||
double d;
|
||||
for (i=0;i<NUM_OBJECTS;i++)
|
||||
if (objs[i].active==A_ACTIVE) {
|
||||
d=Sqrt(Sqr(o[i].DxDt)+Sqr(o[i].DyDt));
|
||||
if (d>MUZZLE_VELOCITY*5.0)
|
||||
Auto(" ");
|
||||
}
|
||||
}
|
||||
|
||||
void Rocks()
|
||||
{
|
||||
I8 ch=0,i=0,c,p1,p2,sc=0;
|
||||
void *old_update=Fs->update_win;
|
||||
Ltf *l,*old_cur_ltf=Fs->cur_ltf,*old_aux_ltf=Fs->aux_ltf;
|
||||
BoolU4 old_preempt=Preempt(OFF),
|
||||
old_border=WinBorder(OFF);
|
||||
TssStruct *song_tss=Spawn(&SongTsk,"Rocks Song",Fs);
|
||||
I8 old_attr=Fs->text_attribute;
|
||||
|
||||
SetTypeMatic(0);
|
||||
|
||||
ode=OdeNew(NUM_OBJECTS*6);
|
||||
ode->derivative=&MyDerivative;
|
||||
ode->tolerance_start=.1;
|
||||
o=ode->state;
|
||||
objs=MAlloc(NUM_OBJECTS*sizeof(Object));
|
||||
|
||||
Fs->text_attribute=0x0F;
|
||||
WinMax;
|
||||
|
||||
Fs->cur_ltf=NULL;
|
||||
|
||||
Fs->aux_ltf=l=InitSysAuxLtf(TRUE);
|
||||
LtfPutSExt(l,"$$MA+A+TML+IV,\"Restart | \",\" \"$$");
|
||||
LtfPutSExt(l,"$$MA+A+TML+IV,\"Bounce | \",\"b\"$$");
|
||||
LtfPutSExt(l,"$$MA+A+TML+IV,\"Exit\",\"\\033\"$$");
|
||||
LtfPutSExt(l,"$$CM+LX+TY,2,2$$$$TX+BK,\"Escort the cargo ship\"$$");
|
||||
|
||||
InitObjs;
|
||||
InsQue(ode,Fs->last_ode);
|
||||
Fs->update_win=&DrawIt;
|
||||
|
||||
while (ch!=CH_ESC && ch!=CH_CTRLQ) {
|
||||
InitObjs;
|
||||
ch=0;
|
||||
cmd=CMD_NULL;
|
||||
while (ch!=CH_ESC && ch!=CH_CR && ch!=CH_SPACE && ch!=CH_CTRLQ) {
|
||||
while (c=ScanMsg(&p1,&p2,1<<MSG_KEY_DOWN|1<<MSG_KEY_UP)) {
|
||||
ch=p1; sc=p2;
|
||||
if (c==MSG_KEY_DOWN) {
|
||||
if (ch==CH_SPACE) {
|
||||
if (!l->best_d && l->cur_entry!=l) {
|
||||
LtfRunEntry(l,l->cur_entry,TRUE,old_preempt);
|
||||
ch=0;
|
||||
l->best_d=MAX_I8;
|
||||
}
|
||||
} else if (ch=='b')
|
||||
bounce=!bounce;
|
||||
else if (sc.u1[0]==SC_CURSOR_RIGHT)
|
||||
cmd=CMD_SPIN_RIGHT;
|
||||
else if (sc.u1[0]==SC_CURSOR_LEFT)
|
||||
cmd=CMD_SPIN_LEFT;
|
||||
else if (sc.u1[0]==SC_CURSOR_UP)
|
||||
cmd=CMD_THRUST;
|
||||
else if (sc.u1[0]==SC_CURSOR_DOWN)
|
||||
Fire;
|
||||
} else
|
||||
cmd=CMD_NULL;
|
||||
}
|
||||
CheckCollisions;
|
||||
CheckCrazy;
|
||||
if (cmd==CMD_EXIT) {
|
||||
Sleep(1000);
|
||||
ch=CH_SPACE;
|
||||
}
|
||||
WinSync; //messages are only queued by winmngr
|
||||
}
|
||||
}
|
||||
Kill(song_tss);
|
||||
Sound(0);
|
||||
LtfDel(l);
|
||||
Fs->aux_ltf=old_aux_ltf;
|
||||
if (Fs->cur_ltf=old_cur_ltf)
|
||||
LtfBottom(Fs->cur_ltf);
|
||||
|
||||
RemQue(ode);
|
||||
OdeDel(ode);
|
||||
Free(objs);
|
||||
|
||||
Fs->text_attribute=old_attr;
|
||||
Fs->update_win=old_update;
|
||||
WinBorder(old_border);
|
||||
Preempt(old_preempt);
|
||||
}
|
||||
| ||||