230 lines
12 KiB
C++
230 lines
12 KiB
C++
RegSetDftEntry("TempleOS/BomberGolf","I64 best_score=99999;\n");
|
|
RegExeBranch("TempleOS/BomberGolf");
|
|
|
|
|
|
|
|
$SP,"<1>",BI=1$
|
|
|
|
|
|
|
|
|
|
|
|
$SP,"<2>",BI=2$
|
|
|
|
|
|
$SP,"<3>",BI=3$
|
|
|
|
|
|
$SP,"<4>",BI=4$
|
|
|
|
|
|
$SP,"<5>",BI=5$
|
|
|
|
|
|
$SP,"<6>",BI=6$
|
|
|
|
|
|
$SP,"<7>",BI=7$
|
|
|
|
#define MAP_WIDTH 600
|
|
#define MAP_HEIGHT 600
|
|
|
|
#define NUM_TREES 64
|
|
class Tree
|
|
{
|
|
I64 x,y;
|
|
} tr[NUM_TREES];
|
|
|
|
|
|
I64 tank_cnt,key_cnt;
|
|
|
|
#define NUM_TANKS 10
|
|
class Tank
|
|
{
|
|
F64 x,y,é;
|
|
Bool dead,pad[7];
|
|
} tk[NUM_TANKS];
|
|
|
|
F64 v,x,y,
|
|
é,éf, //éf is the final theta. é is gradually changed until it reaches éf.
|
|
bt,bx,by;
|
|
|
|
U0 DrawIt(CTask *task,CDC *dc)
|
|
{
|
|
I64 i;
|
|
dc->x=task->pix_width>>1;
|
|
dc->y=task->pix_height>>1;
|
|
dc->flags|=DCF_TRANSFORMATION;
|
|
Mat4x4TranslationEqu(dc->r,x,y,0);
|
|
Mat4x4RotZ(dc->r,é);
|
|
GrBorder(dc,-MAP_WIDTH>>1,-MAP_HEIGHT>>1,MAP_WIDTH>>1,MAP_HEIGHT>>1);
|
|
for (i=0;i<NUM_TANKS;i++)
|
|
if (tk[i].dead) {
|
|
if (i&1) {
|
|
dc->flags|=DCF_SYMMETRY|DCF_JUST_MIRROR;
|
|
DCSymmetry3Set(dc,tk[i].x,tk[i].y,0,tk[i].x,tk[i].y,1,
|
|
tk[i].x+1024*Cos(tk[i].é),tk[i].y+1024*Sin(tk[i].é),0);
|
|
}
|
|
if (Blink(15))
|
|
SpriteZ3B(dc,tk[i].x,tk[i].y,0,$IB,"<4>",BI=4$,tk[i].é);
|
|
else
|
|
SpriteZ3B(dc,tk[i].x,tk[i].y,0,$IB,"<5>",BI=5$,tk[i].é);
|
|
dc->flags&=~(DCF_SYMMETRY|DCF_JUST_MIRROR);
|
|
} else
|
|
SpriteZ3B(dc,tk[i].x,tk[i].y,0,$IB,"<3>",BI=3$,tk[i].é);
|
|
for (i=0;i<NUM_TREES;i++)
|
|
Sprite3(dc,tr[i].x,tr[i].y,0,$IB,"<2>",BI=2$);
|
|
if (bt) {
|
|
if (bt+0.5<tS)
|
|
bt=0;
|
|
else {
|
|
if (Blink(10))
|
|
Sprite3(dc,bx,by,0,$IB,"<6>",BI=6$);
|
|
else
|
|
Sprite3(dc,bx,by,0,$IB,"<7>",BI=7$);
|
|
}
|
|
}
|
|
dc->flags&=~DCF_TRANSFORMATION;
|
|
Sprite3(dc,task->pix_width>>1,task->pix_height>>1,0,$IB,"<1>",BI=1$);
|
|
dc->color=RED;
|
|
GrPrint(dc,0,0,
|
|
"Tanks:%02d KeyStrokes:%04d Best:%04d",tank_cnt,key_cnt,best_score);
|
|
if (!tank_cnt && Blink(4))
|
|
GrPrint(dc,(task->pix_width-FONT_WIDTH*14)>>1,
|
|
(task->pix_height-FONT_HEIGHT)>>1-32,"Game Completed");
|
|
}
|
|
|
|
U0 BombDrop()
|
|
{
|
|
I64 i;
|
|
bx=-x;
|
|
by=-y;
|
|
bt=tS;
|
|
Noise(200,500,1000);
|
|
for (i=0;i<NUM_TANKS;i++) {
|
|
if (!tk[i].dead) {
|
|
if (SqrI64(bx-tk[i].x)+SqrI64(by-tk[i].y)<20*20) {
|
|
tk[i].dead=TRUE;
|
|
if (!--tank_cnt && key_cnt<best_score) {
|
|
best_score=key_cnt;
|
|
Sleep(300); //Wait for end of Noise() above
|
|
Snd(1000);Sleep(150);Snd(0);
|
|
Sleep(150);
|
|
Snd(1000);Sleep(150);Snd(0);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
I64 AnimateTask(CTask *parent)
|
|
{//Starts with preempt OFF
|
|
I64 w=parent->pix_width,
|
|
h=parent->pix_height;
|
|
while (TRUE) {
|
|
if (tank_cnt)
|
|
Snd(100+(1.0+Abs(Wrap(éf-é,-ă)))`4.0);
|
|
é+=.01*(éf-é);
|
|
x+=v*Sin(é);
|
|
y+=v*Cos(é);
|
|
Sleep(10);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
U0 Init()
|
|
{
|
|
I64 i;
|
|
bt=0;
|
|
v=0.2;
|
|
x=-MAP_WIDTH>>1;
|
|
y=-MAP_HEIGHT>>1;
|
|
éf=é=1*ă/4;
|
|
|
|
MemSet(tr,0,sizeof(tr));
|
|
for (i=0;i<NUM_TREES;i++) {
|
|
tr[i].x=RandU32%MAP_WIDTH -MAP_WIDTH >>1;
|
|
tr[i].y=RandU32%MAP_HEIGHT-MAP_HEIGHT>>1;
|
|
}
|
|
|
|
MemSet(tk,0,sizeof(tk));
|
|
for (i=0;i<NUM_TANKS;i++) {
|
|
tk[i].x=RandU32%MAP_WIDTH -MAP_WIDTH >>1;
|
|
tk[i].y=RandU32%MAP_HEIGHT-MAP_HEIGHT>>1;
|
|
tk[i].é=Rand*2*ă;
|
|
}
|
|
key_cnt=0;
|
|
tank_cnt=NUM_TANKS;
|
|
}
|
|
|
|
U0 BomberGolf()
|
|
{
|
|
I64 sc;
|
|
MenuPush(
|
|
"File {"
|
|
" Abort(,CH_SHIFT_ESC);"
|
|
" Exit(,CH_ESC);"
|
|
"}"
|
|
"Play {"
|
|
" Restart(,'\n');"
|
|
" Faster(,,SC_CURSOR_UP);"
|
|
" Slower(,,SC_CURSOR_DOWN);"
|
|
" Left(,,SC_CURSOR_LEFT);"
|
|
" Right(,,SC_CURSOR_RIGHT);"
|
|
" Bomb(,CH_SPACE);"
|
|
"}"
|
|
);
|
|
SettingsPush; //See $LK,"SettingsPush",A="MN:SettingsPush"$
|
|
AutoComplete;
|
|
WinMax;
|
|
Preempt;
|
|
Fs->animate_task=Spawn(&AnimateTask,Fs,"Animate",,Fs);
|
|
DocCursor;
|
|
DocClear;
|
|
Fs->draw_it=&DrawIt;
|
|
Init;
|
|
try {
|
|
while (TRUE)
|
|
switch (GetKey(&sc)) {
|
|
case 0:
|
|
switch (sc.u8[0]) {
|
|
case SC_CURSOR_UP:
|
|
v+=0.1;
|
|
if (v>3.0) v=3.0;
|
|
break;
|
|
case SC_CURSOR_DOWN:
|
|
v-=0.1;
|
|
if (v<0.2) v=0.2;
|
|
break;
|
|
case SC_CURSOR_LEFT:
|
|
key_cnt++;
|
|
éf+=0.5;
|
|
break;
|
|
case SC_CURSOR_RIGHT:
|
|
key_cnt++;
|
|
éf-=0.5;
|
|
break;
|
|
|
|
}
|
|
break;
|
|
case CH_SPACE:
|
|
key_cnt++;
|
|
BombDrop;
|
|
break;
|
|
case '\n':
|
|
Init;
|
|
break;
|
|
case CH_ESC:
|
|
case CH_SHIFT_ESC:
|
|
goto bm_done;
|
|
}
|
|
bm_done:
|
|
} catch
|
|
PutExcept;
|
|
SettingsPop;
|
|
MenuPop;
|
|
RegWriteBranch("TempleOS/BomberGolf","I64 best_score=%d;\n",best_score);
|
|
}
|
|
|
|
BomberGolf;
|
|
|