These videos might hang your browser, sorry!
Big Guns
//$FG,2$This will soon be an artillery game$FG$
#define MAP_WIDTH 2048
#define MAP_HEIGHT (GR_HEIGHT-3*FONT_HEIGHT)
I8 gun_x,gun_y,active_map=0,gun_recoil;
double gun_theta;
GrBitMap *maps[2]={NULL,NULL};
I2 elevs[MAP_WIDTH];
double wind_x;
#define NUM_DUST 512
I4 dust_x[NUM_DUST],dust_y[NUM_DUST];
Ode *o=NULL;
$PI,"<1>",1$
$PI,"<2>",2$
void UpdateWin(TssStruct *tss)
{
GrBitMap *base=GrAlias(grbase,tss),
*map=maps[active_map&1];
MassStruct *tempm;
double theta=gun_theta;
I8 i,x,y,w,
h=-tss->horz_scroll.pos,
v=-tss->vert_scroll.pos;
tss->horz_scroll.min=0;
tss->horz_scroll.max=MAP_WIDTH-tss->win_pixel_width;
tss->vert_scroll.min=0;
tss->vert_scroll.max=MAP_HEIGHT-tss->win_pixel_height;
GrBlot(base,h,v,map);
GrElemsPlot(base,gun_x+h,gun_y+v,0,$IB,"<2>",2$);
if (theta<-pi/2) {
base->flags|=BMF_SYMMETRY|BMF_JUST_MIRROR;
GrSetSymmetry(base,gun_x+h,0,gun_x+h,1);
theta=-pi-theta;
}
GrElemsPlotRotZ(base,
gun_x+h-gun_recoil*Cos(theta),
gun_y+v-gun_recoil*Sin(theta)-10,0,$IB,"<1>",1$,theta);
base->flags&=~(BMF_SYMMETRY|BMF_JUST_MIRROR);
tempm=o->next_mass;
base->color=BLACK;
map->bkcolor=ROP_COLLISION+LTCYAN;
map->color=ROP_COLLISION+BLACK;
while (tempm!=&o->next_mass) {
map->collision_cnt=0;
GrCircle(map,tempm->state->x,tempm->state->y,2);
if (map->collision_cnt)
tempm->user_data=1;
GrCircle(base,tempm->state->x+h,tempm->state->y+v,2);
tempm=tempm->next;
}
base->color=LTGRAY;
w=t*wind_x;
for (i=0;i<NUM_DUST;i++) {
x=(dust_x[i]+w)%MAP_WIDTH;
y=dust_y[i];
if (y<elevs[x])
GrPlot(base,x+h,y+v);
}
GrDel(base);
}
void MyDerivative(Ode *ode,double t,Order2D3 *state,Order2D3 *DstateDt)
{
nounusedwarn t,DstateDt,state;
MassStruct *tempm=ode->next_mass;
while (tempm!=&ode->next_mass) {
tempm->DstateDt->DyDt+=1000.0*tempm->mass;
tempm->DstateDt->DxDt+=25.0*wind_x;
tempm=tempm->next;
}
}
void DrawMap()
{
GrBitMap *map=maps[(active_map+1)&1];
I8 x;
map->color=LTCYAN;
GrBox(map,0,0,MAP_WIDTH,MAP_HEIGHT);
map->color=BLACK;
for (x=1;x<MAP_WIDTH;x++)
GrLine(map,x-1,elevs[x-1],x,elevs[x]);
map->color=BROWN;
GrFloodFill(map,0,MAP_HEIGHT-1,FALSE);
active_map++;
}
void FireTsk()
{ //by default preempt is off on new tasks
MassStruct *tempm;
I8 i;
if (gun_recoil) return;
tempm=MAllocZ(sizeof(MassStruct),Fs->parent_tss);
tempm->mass=10.0;
tempm->drag_profile_factor=0.1;
tempm->x=gun_x+27*Cos(gun_theta);
tempm->y=gun_y-15+27*Sin(gun_theta);
tempm->DxDt=600.0*Cos(gun_theta);
tempm->DyDt=600.0*Sin(gun_theta);
tempm->user_data=0;
while (Bt(&Fs->parent_tss->task_flags,TSSf_SUSPENDED))
SwapInNextTask;
InsQue(tempm,o->last_mass);
music_mute=TRUE;
for (i=0;i<60;i++) {
Sound(RandU4&511+15);
Sleep(2);
gun_recoil=i/12;
}
Sound(0);
music_mute=FALSE;
for (i=0;i<=60;i++) {
Sleep(1);
gun_recoil=5-i/12;
}
}
void ManageShots()
{
I8 i;
MassStruct *tempm,*tempm1;
BoolI1 changed=FALSE;
tempm=o->next_mass;
while (tempm!=&o->next_mass) {
tempm1=tempm->next;
if (!(0<=tempm->state->x<MAP_WIDTH) ||
tempm->user_data) {
RemQue(tempm);
for (i=tempm->state->x-4;i<=tempm->state->x+4;i++)
if (0<=i<MAP_WIDTH)
elevs[i]=LimitI8(elevs[i]+10-2*AbsI8(i-tempm->state->x),0,MAP_HEIGHT-2);
Free(tempm);
changed=TRUE;
}
tempm=tempm1;
}
if (changed)
DrawMap;
}
void MoveTsk()
{
static I8 quit_time=0;
if (quit_time)
quit_time=GetTimeStamp+time_stamp_freq/10;
else {
music_mute=TRUE;
Sound(100);
quit_time=GetTimeStamp+time_stamp_freq/10;
while (quit_time>GetTimeStamp)
SwapInNextTask;
Sound(0);
quit_time=0;
music_mute=FALSE;
}
}
void Init()
{
GrBitMap *map;
I8 i,x,y,dy;
BoolI1 old_preempt;
if (!maps[0])
maps[0]=GrNew(BMT_COLOR4,MAP_WIDTH,MAP_HEIGHT);
if (!maps[1])
maps[1]=GrNew(BMT_COLOR4,MAP_WIDTH,MAP_HEIGHT);
map=maps[active_map&1];
Fs->horz_scroll.pos=0;
Fs->vert_scroll.pos=0;
y=ToI8(0.7*MAP_HEIGHT)<<32;
dy=0;
for (x=0;x<MAP_WIDTH;x++) {
dy=LimitI8(SignI8(RandI2)<<30+dy,-3<<32,3<<32);
y=LimitI8(y+dy,ToI8(0.3*MAP_HEIGHT)<<32,(MAP_HEIGHT-2)<<32);
elevs[x]=y.i4[1];
}
gun_x=RandU4%(MAP_WIDTH-100)+50;
gun_y=elevs[gun_x];
gun_theta=0;
gun_recoil=0;
for (x=gun_x-20;x<=gun_x+20;x++)
elevs[x]=gun_y;
wind_x=RandI2/250.0;
for (i=0;i<NUM_DUST;i++) {
dust_x[i]=RandU2%MAP_WIDTH;
dust_y[i]=RandU2%MAP_HEIGHT;
}
old_preempt=Preempt(OFF);
o=OdeNew(0,1e-4,ODEF_HAS_MASSES);
o->derivative=&MyDerivative;
o->drag_v2=0.002;
o->drag_v3=0.0001;
o->acceleration_limit=5e5;
InsQue(o,Fs->last_ode);
Fs->horz_scroll.min=0;
Fs->horz_scroll.max=MAP_WIDTH-Fs->win_pixel_width;
Fs->horz_scroll.pos=gun_x-Fs->win_pixel_width/2;
Fs->vert_scroll.min=0;
Fs->vert_scroll.max=MAP_HEIGHT-Fs->win_pixel_height;
Fs->vert_scroll.pos=0;
UpdateDerivedTssValues;
Preempt(old_preempt);
DrawMap;
}
void AllDel(Ode *o)
{
MassStruct *tempm,*tempm1;
if (o) {
RemQue(o);
tempm=o->next_mass;
while (tempm!=&o->next_mass) {
tempm1=tempm->next;
RemQue(tempm);
Free(tempm);
tempm=tempm1;
}
OdeDel(o);
}
}
void BigGuns()
{
void *old_update=Fs->update_win;
I8 ch,sc;
BoolI1 old_preempt=Preempt(OFF);
PopUpOk("The map scrolls.\r\n");
WinMax;
WinBorder(ON);
WordStat(OFF);
Init;
Fs->update_win=&UpdateWin;
try {
do {
ch=0;
if (ScanKey(&ch,&sc))
switch (ch) {
case 0:
switch (sc.u1[0]) {
case SC_CURSOR_RIGHT:
gun_theta+=2.0*pi/180;
if (gun_theta>0)
gun_theta=0;
else
Spawn(&MoveTsk,NULL,"Move",Fs);
break;
case SC_CURSOR_LEFT:
gun_theta-=2.0*pi/180;
if (gun_theta<-pi)
gun_theta=-pi;
else
Spawn(&MoveTsk,NULL,"Move",Fs);
break;
}
break;
case CH_CR:
AllDel(o);
Init;
break;
case CH_SPACE:
Spawn(&FireTsk,NULL,"Fire",Fs);
break;
}
ManageShots;
WinSync;
} while (ch!=CH_CTRLQ && ch!=CH_ESC);
} catch
Fs->catch_except=TRUE;
Fs->update_win=old_update;
GrDel(maps[0]); maps[0]=NULL;
GrDel(maps[1]); maps[1]=NULL;
AllDel(o);
Preempt(old_preempt);
}
BigGuns;
...........M.......................... .............þÿÿÿ
...þÿÿÿ.............................‰......................ñÿÿÿ...ýÿÿÿ......ýÿÿÿúÿÿÿþÿÿÿ...
úÿÿÿþÿÿÿ...ðÿÿÿ...õÿÿÿÿÿÿÿ ...ÿÿÿÿ.......óÿÿÿ....ýÿÿÿ...ôÿÿÿ...