$SP,"<1>",BI=1$ $SP,"<2>",BI=2$ $SP,"<3>",BI=3$ $SP,"<4>",BI=4$ $SP,"<5>",BI=5$ $SP,"<6>",BI=6$ AcctRegSetDftEntry("TempleOS/Varoom","F64 best_score=9999;\n"); AcctRegExeBranch("TempleOS/Varoom"); F64 distance,t0,tf; Bool game_over; #define NUM_BUSHES 512 class Bush { CD3I32 p; Bool sym,pad[3]; U8 *img; } b[NUM_BUSHES]; #define NUM_CARS 8 class Car { CD3I32 p; F64 é,speed; CSprite *img; } c[NUM_CARS]; #define TRACK_INNER 16000 #define TRACK_OUTER 18000 #define SHOULDER 200 #define SLICES 500 #define D_é (2*ã/SLICES) #define TRACK_POLYS (3*SLICES) #define DIPS 5 #define DIP_DEPTH 100 class TrackPoly { CColorROPU16 c,pad[3]; CD3I32 p[4]; } track[TRACK_POLYS]; I64 DipY(I64 x,I64 z) { F64 m,a; R2P(&m,&a,x,z); return DIP_DEPTH*m*Cos(DIPS*a)/((TRACK_INNER+TRACK_OUTER)/2); } #define CAR_LENGTH 400 F64 Dipé(I64 x,I64 z,F64 é) { F64 y_front,y_back; y_front=DipY(x-CAR_LENGTH/2*Cos(é),z-CAR_LENGTH/2*Sin(é)); y_back =DipY(x+CAR_LENGTH/2*Cos(é),z+CAR_LENGTH/2*Sin(é)); return ASin((y_front-y_back)/CAR_LENGTH); } U0 InitTrackPoly(TrackPoly *tempt,CColorROPU16 c, I64 inner,I64 outer,F64 é1,F64 é2) { tempt->c=c; tempt->p[0].x=inner*Cos(é1); tempt->p[0].z=inner*Sin(é1); tempt->p[0].y=DipY(tempt->p[0].x,tempt->p[0].z); tempt->p[1].x=outer*Cos(é1); tempt->p[1].z=outer*Sin(é1); tempt->p[1].y=DipY(tempt->p[1].x,tempt->p[1].z); tempt->p[2].x=outer*Cos(é2); tempt->p[2].z=outer*Sin(é2); tempt->p[2].y=DipY(tempt->p[2].x,tempt->p[2].z); tempt->p[3].x=inner*Cos(é2); tempt->p[3].z=inner*Sin(é2); tempt->p[3].y=DipY(tempt->p[3].x,tempt->p[3].z); } U0 InitTrack() { TrackPoly *tempt=track; I64 i; for (i=0;iwin_task; I64 i,j,x,y,z,lo,hi, w=task->pix_width, h=task->pix_height,r[16], cx=w>>1; F64 s,dip_é=Dipé(c[0].p.x,c[0].p.z,c[0].é); Car *tempc; Bool draw; CD3I32 poly[4]; TrackPoly *tempt; CDC *dc=DCAlias(gr_dc2,task); GrIdentEqu(r); GrRotYEqu(r,ã-c[0].é); GrRotXEqu(r,75*ã/180-dip_é); dc->depth_buf=dc2->depth_buf; //Track lo=Gs->num*TRACK_POLYS/mp_cnt; hi=(Gs->num+1)*TRACK_POLYS/mp_cnt; for (i=lo,tempt=&track[lo];icolor=tempt->c; draw=TRUE; for (j=0;j<4;j++) { x=tempt->p[j].x-c[0].p.x; y=tempt->p[j].y-c[0].p.y; z=tempt->p[j].z-c[0].p.z; GrRot(r,&x,&y,&z); s=100.0/(AbsI64(z)+50); poly[j].y=s*y+h; if (z<-200 || !(-hflags|=DCF_TRANSFORMATION; for (i=Gs->num;i0) { s=100.0/(AbsI64(z)+50); GrIdentEqu(dc->r); GrScaleEqu(dc->r,s*2); GrSetRotMat(dc,dc->r); if (b[i].sym) { dc->flags|=DCF_SYMMETRY|DCF_JUST_MIRROR; GrSetSymmetry(dc,s*x+cx,s*y+h,s*x+cx,s*y+h+10); } Sprite3B(dc,s*x+cx,s*y+h,z+GR_Z_ALL,b[i].img); dc->flags&=~(DCF_SYMMETRY|DCF_JUST_MIRROR); } } for (i=Gs->num+1;ip.x-c[0].p.x; y=tempc->p.y-c[0].p.y; z=tempc->p.z-c[0].p.z; GrRot(r,&x,&y,&z); if (z>0) { s=100.0/(AbsI64(z)+50); GrIdentEqu(dc->r); GrScaleEqu(dc->r,s*2); GrRotXEqu(dc->r,Dipé(tempc->p.x,tempc->p.z,-tempc->é)); GrRotYEqu(dc->r,tempc->é-c[0].é); GrSetRotMat(dc,dc->r); Sprite3B(dc,s*x+cx,s*y+h,z+GR_Z_ALL,tempc->img); } } dc->depth_buf=NULL; DCDel(dc); LBtr(&mp_not_done_flags,Gs->num); } U0 VRTransform(CDC *dc,I64 *x,I64 *y,I64 *z) { I64 zz; GrRot(dc->r,x,y,z); zz=400+*z; if (zz<1) zz=1; *x=400* *x/zz; *y=400* *y/zz; *x+=dc->x; *y+=dc->y; *z+=dc->z; } U0 DrawIt(CTask *task,CDC *dc) { I64 i,x,y,z, w=task->pix_width, h=task->pix_height,r[16], cx=w>>1; F64 s,è,dip_é=Dipé(c[0].p.x,c[0].p.z,c[0].é); dc->color=LTCYAN; GrRect(dc,0,0,w,HORIZON_DIP*Sin(dip_é)+FONT_HEIGHT*4.5); GrIdentEqu(r); GrRotYEqu(r,ã-c[0].é); GrRotXEqu(r,75*ã/180-dip_é); DCAllocDepthBuf(dc); //Sun x=c[0].p.x; y=0; z=1000000-c[0].p.z; GrRot(r,&x,&y,&z); s=100.0/(AbsI64(z)+50); if (y<0) { dc->color=BROWN; GrCircle(dc,s*x+cx,15+HORIZON_DIP*Sin(dip_é),15); dc->color=YELLOW; GrFloodFill(dc,s*x+cx,15+HORIZON_DIP*Sin(dip_é)); } mp_not_done_flags=1<transform=&VRTransform; dc->x=task->pix_width>>1; dc->y=task->pix_height-150; dc->z=GR_Z_ALL; SpriteMat3B(dc,0,0,-100,c[0].img,r); //Map dc->color=LTGRAY; GrRect(dc,w-64,h-64,64,64); dc->color=LTGREEN; for (i=0;ipen_width=2; for (i=0;icolor=LTPURPLE; else dc->color=LTCYAN; GrPlot3(dc,w-64+64*(0x5000-c[i].p.x)/0xA000,h-64*(-c[i].p.z+0x5000)/0xA000,0); } if (game_over) { dc->color=LTRED; if (tf) { s=tf-t0; if (Blink) GrPrint(dc,(w-FONT_WIDTH*14)/2,(h-FONT_HEIGHT)/2,"Game Completed"); } else { s=99.9; if (Blink) GrPrint(dc,(w-FONT_WIDTH*9)/2,(h-FONT_HEIGHT)/2,"Game Over"); } } else s=tS-t0; dc->color=BLACK; GrPrint(dc,0,0,"é:%0.1f %0.1f%% Time:%0.2f Best:%0.2f", 180+180/ã*Arg(c[0].p.x,c[0].p.z),100.0*distance/(2*ã*TRACK_INNER),s,best_score); } U0 AnimateTask(I64) { Car *tempc; I64 i; F64 m,a; while (TRUE) { if (!game_over) Snd(c[0].speed*3+10); else Snd(0); for (i=0;ip.x-=tempc->speed*Cos(tempc->é-ã/2); tempc->p.z+=tempc->speed*Sin(tempc->é-ã/2); if (i) { tempc->é=Arg(-tempc->p.x,tempc->p.z); tempc->p.x=-(TRACK_INNER+TRACK_OUTER)/2*Cos(tempc->é); tempc->p.z= (TRACK_INNER+TRACK_OUTER)/2*Sin(tempc->é); } tempc->p.y=DipY(tempc->p.x,tempc->p.z); } R2P(&m,&a,c[0].p.x,c[0].p.z); if (!game_over && TRACK_INNER<=m<=TRACK_OUTER) { for (i=1;i>1) { game_over=TRUE; Noise(500,50,100); Sleep(500); break; } if (!game_over) { distance+=c[0].speed; if (distance>2*ã*TRACK_INNER && Wrap(a+ã,-ã)>0.0) { tf=tS; game_over=TRUE; Beep; if (tf-t0",BI=1$,$IB,"<1>",BI=1$,$IB,"<2>",BI=2$,$IB,"<2>",BI=2$,$IB,"<3>",BI=3$,$IB,"<4>",BI=4$,$IB,"<4>",BI=4$,$IB,"<4>",BI=4$}; U0 Init() { Bush *tempb; Car *tempc; I64 i; for (i=0;ip.x=RandU32&0x7FFF-0x4000; tempb->p.z=RandU32&0x7FFF-0x4000; } while (TRACK_INNER-SHOULDER<= Sqrt(SqrI64(tempb->p.x)+SqrI64(tempb->p.z))<=TRACK_OUTER+SHOULDER); tempb->p.y=DipY(tempb->p.x,tempb->p.z); tempb->sym=RandU16&1; tempb->img=imgs[i&7]; } InitTrack; for (i=0;iimg=$IB,"<5>",BI=5$; tempc->speed=0; } else { tempc->img=$IB,"<6>",BI=6$; tempc->speed=50.0; } tempc->é=i*2*ã/NUM_CARS; tempc->p.x=-(TRACK_INNER+TRACK_OUTER)/2*Cos(tempc->é); tempc->p.z= (TRACK_INNER+TRACK_OUTER)/2*Sin(tempc->é); tempc->p.y=DipY(tempc->p.x,tempc->p.z); } distance=0; tf=0; t0=tS; game_over=FALSE; } U0 Varoom() { I64 ch,sc; MenuPush( "File {" " Abort(,CH_SHIFT_ESC);" " Exit(,CH_ESC);" "}" "Play {" " Restart(,'\n');" " Accelerator(,,SC_CURSOR_UP);" " Break(,,SC_CURSOR_DOWN);" " Left(,,SC_CURSOR_LEFT);" " Right(,,SC_CURSOR_RIGHT);" "}" ); SettingsPush(Fs,TSF_SAME_SONG); //See $LK,"SettingsPush",A="MN:SettingsPush"$ try { Fs->text_attr=YELLOW<<4+BLUE; Fs->win_inhibit=WIG_TASK_DFT-WIF_FOCUS-WIF_GRAB_SCROLL-WIF_MENU; WordStat; WinMax; WinBorder; Preempt(OFF); Init; DocCursor; DocClear; Fs->draw_it=&DrawIt; Fs->animate_task=Spawn(&AnimateTask,NULL,"Animate",,Fs); while (TRUE) { while (ScanKey(&ch,&sc)) switch (ch) { case 0: switch (sc.u8[0]) { case SC_CURSOR_LEFT: c[0].é-=ã/100; break; case SC_CURSOR_RIGHT: c[0].é+=ã/100; break; case SC_CURSOR_UP: c[0].speed+=3; break; case SC_CURSOR_DOWN: c[0].speed-=3; break; } break; case '\n': Init; break; case CH_SHIFT_ESC: case CH_ESC: goto vr_done; } WinMgrSync; } vr_done: //Don't goto out of try } catch Fs->catch_except=TRUE; SettingsPop(Fs,TSF_SAME_SONG); MenuPop; AcctRegWriteBranch("TempleOS/Varoom","F64 best_score=%5.4f;\n",best_score); } Varoom; ö þÿÿÿèÿÿÿ ôÿÿÿêÿÿÿ þÿÿÿîÿÿÿúÿÿÿèÿÿÿ øÿÿÿúÿÿÿôÿÿÿ ôÿÿÿìÿÿÿ âÿÿÿúÿÿÿèÿÿÿ àÿÿÿ ìÿÿÿ îÿÿÿàÿÿÿ üÿÿÿîÿÿÿ øÿÿÿâÿÿÿ øÿÿÿ öÿÿÿúÿÿÿþÿÿÿ úÿÿÿüÿÿÿÜÿÿÿ úÿÿÿðÿÿÿúÿÿÿäÿÿÿã æÿÿÿöÿÿÿäÿÿÿ ìÿÿÿìÿÿÿæÿÿÿüÿÿÿ äÿÿÿÖÿÿÿ Öÿÿÿæÿÿÿ æÿÿÿ"àÿÿÿ êÿÿÿ$äÿÿÿ ìÿÿÿ$æÿÿÿ äÿÿÿúÿÿÿäÿÿÿúÿÿÿ æÿÿÿüÿÿÿæÿÿÿüÿÿÿ îÿÿÿúÿÿÿ êÿÿÿ "Üÿÿÿ&æÿÿÿ äÿÿÿ àÿÿÿ þÿÿÿ üÿÿÿ üÿÿÿðÿÿÿ êÿÿÿ øÿÿÿ øÿÿÿèÿÿÿ èÿÿÿþÿÿÿ þÿÿÿîÿÿÿ ìÿÿÿþÿÿÿ þÿÿÿîÿÿÿ öÿÿÿ ìÿÿÿ êÿÿÿðÿÿÿ ðÿÿÿäÿÿÿ âÿÿÿðÿÿÿ ðÿÿÿêÿÿÿ êÿÿÿúÿÿÿ  öÿÿÿ” úÿÿÿÄÿÿÿ úÿÿÿÄÿÿÿøÿÿÿúÿÿÿ üÿÿÿÂÿÿÿüÿÿÿ úÿÿÿÄÿÿÿæÿÿÿ¤ÿÿÿ üÿÿÿÂÿÿÿäÿÿÿ¤ÿÿÿ øÿÿÿ¼ÿÿÿúÿÿÿ†ÿÿÿ Äÿÿÿüÿÿÿ„ÿÿÿ þÿÿÿºÿÿÿ Œÿÿÿ Œÿÿÿüÿÿÿ¸ÿÿÿ ¦ÿÿÿšÿÿÿ šÿÿÿzÿÿÿ zÿÿÿ„ÿÿÿ †ÿÿÿžÿÿÿ žÿÿÿvÿÿÿ vÿÿÿþÿÿÿ`ÿÿÿ þÿÿÿ`ÿÿÿìÿÿÿ„ÿÿÿ ìÿÿÿ„ÿÿÿöÿÿÿ¬ÿÿÿ öÿÿÿ¬ÿÿÿâÿÿÿžÿÿÿ âÿÿÿžÿÿÿØÿÿÿ¨ÿÿÿ Øÿÿÿ¨ÿÿÿîÿÿÿºÿÿÿ îÿÿÿºÿÿÿòÿÿÿºÿÿÿ ôÿÿÿ¸ÿÿÿúÿÿÿ¸ÿÿÿ –ÿÿÿˆÿÿÿ „ÿÿÿŠÿÿÿ þÿÿÿŽÿÿÿþÿÿÿjÿÿÿ þÿÿÿjÿÿÿôÿÿÿ‚ÿÿÿ ôÿÿÿ‚ÿÿÿøÿÿÿœÿÿÿ ôÿÿÿ´ÿÿÿîÿÿÿ¦ÿÿÿ èÿÿÿ²ÿÿÿÞÿÿÿ¦ÿÿÿ œÿÿÿ–ÿÿÿ øÿÿÿ€ÿÿÿhÿÿÿ ˆÿÿÿ€ÿÿÿ þÿÿÿ~ÿÿÿnÿÿÿ ~ÿÿÿ’ÿÿÿ œÿÿÿ¨ÿÿÿ öÿÿÿ²ÿÿÿðÿÿÿ‚ÿÿÿ ðÿÿÿ‚ÿÿÿúÿÿÿjÿÿÿ êÿÿÿ´ÿÿÿÞÿÿÿ ÿÿÿJ `ŒFçÿÿÿ}-çÿÿÿ}-çÿÿÿKFçÿÿÿK7ýÿÿÿ‡7ýÿÿÿ–ýÿÿÿ–(ýÿÿÿ‡(ýÿÿÿA7ýÿÿÿA7ýÿÿÿýÿÿÿF}-}-KFK7‡7––(‡(A7A7ºÿÿÿçÿÿÿ}Óÿÿÿçÿÿÿ}ÓÿÿÿçÿÿÿKºÿÿÿçÿÿÿKÉÿÿÿýÿÿÿ‡Éÿÿÿýÿÿÿ–ýÿÿÿ–Øÿÿÿýÿÿÿ‡ØÿÿÿýÿÿÿAÉÿÿÿýÿÿÿAÉÿÿÿýÿÿÿýÿÿÿºÿÿÿ}Óÿÿÿ}ÓÿÿÿKºÿÿÿKÉÿÿÿ‡Éÿÿÿ––Øÿÿÿ‡ØÿÿÿAÉÿÿÿAÉÿÿÿFçÿÿÿƒÿÿÿ-çÿÿÿƒÿÿÿ-çÿÿÿµÿÿÿFçÿÿÿµÿÿÿ7áÿÿÿyÿÿÿ7áÿÿÿjÿÿÿáÿÿÿjÿÿÿ(áÿÿÿyÿÿÿ(áÿÿÿ¿ÿÿÿ7áÿÿÿ¿ÿÿÿ7ýÿÿÿýÿÿÿFƒÿÿÿ-ƒÿÿÿ-µÿÿÿFµÿÿÿ7yÿÿÿ7jÿÿÿjÿÿÿ(yÿÿÿ(¿ÿÿÿ7¿ÿÿÿ7ºÿÿÿçÿÿÿƒÿÿÿÓÿÿÿçÿÿÿƒÿÿÿÓÿÿÿçÿÿÿµÿÿÿºÿÿÿçÿÿÿµÿÿÿÉÿÿÿáÿÿÿyÿÿÿÉÿÿÿáÿÿÿjÿÿÿáÿÿÿjÿÿÿØÿÿÿáÿÿÿyÿÿÿØÿÿÿáÿÿÿ¿ÿÿÿÉÿÿÿáÿÿÿ¿ÿÿÿÉÿÿÿýÿÿÿýÿÿÿºÿÿÿƒÿÿÿÓÿÿÿƒÿÿÿÓÿÿÿµÿÿÿºÿÿÿµÿÿÿÉÿÿÿyÿÿÿÉÿÿÿjÿÿÿjÿÿÿØÿÿÿyÿÿÿØÿÿÿ¿ÿÿÿÉÿÿÿ¿ÿÿÿÉÿÿÿ             $%&&'$%$$$'$%%&&'&#!"!# #     /-.-/,/*,,*++)(+*)+(+ + +(!.-.!" + + ,*)*<=>>?<1033211=<<01<?330<1=2=>2>233?>;9:9;8867754765GEFEGDGBDDBCCA@CBA4C@C474C7C4@9FEF9:8C7C8D5BAB56TUVVWTIHKKJIIUTTHITWKKHTIUJUVJVJKKWVSRQQPSPONOLMOMN_^]]\__\Z\[Z[XY[YZLX[[OLLO[[XLQ]^^RQPO[[\PMYZZNM P88P654@@A5LMYYXLJ `ŒFçÿÿÿ}-çÿÿÿ}-çÿÿÿKFçÿÿÿK7ýÿÿÿ‡7ýÿÿÿ–ýÿÿÿ–(ýÿÿÿ‡(ýÿÿÿA7ýÿÿÿA7ýÿÿÿýÿÿÿF}-}-KFK7‡7––(‡(A7A7ºÿÿÿçÿÿÿ}Óÿÿÿçÿÿÿ}ÓÿÿÿçÿÿÿKºÿÿÿçÿÿÿKÉÿÿÿýÿÿÿ‡Éÿÿÿýÿÿÿ–ýÿÿÿ–Øÿÿÿýÿÿÿ‡ØÿÿÿýÿÿÿAÉÿÿÿýÿÿÿAÉÿÿÿýÿÿÿýÿÿÿºÿÿÿ}Óÿÿÿ}ÓÿÿÿKºÿÿÿKÉÿÿÿ‡Éÿÿÿ––Øÿÿÿ‡ØÿÿÿAÉÿÿÿAÉÿÿÿFçÿÿÿƒÿÿÿ-çÿÿÿƒÿÿÿ-çÿÿÿµÿÿÿFçÿÿÿµÿÿÿ7áÿÿÿyÿÿÿ7áÿÿÿjÿÿÿáÿÿÿjÿÿÿ(áÿÿÿyÿÿÿ(áÿÿÿ¿ÿÿÿ7áÿÿÿ¿ÿÿÿ7ýÿÿÿýÿÿÿFƒÿÿÿ-ƒÿÿÿ-µÿÿÿFµÿÿÿ7yÿÿÿ7jÿÿÿjÿÿÿ(yÿÿÿ(¿ÿÿÿ7¿ÿÿÿ7ºÿÿÿçÿÿÿƒÿÿÿÓÿÿÿçÿÿÿƒÿÿÿÓÿÿÿçÿÿÿµÿÿÿºÿÿÿçÿÿÿµÿÿÿÉÿÿÿáÿÿÿyÿÿÿÉÿÿÿáÿÿÿjÿÿÿáÿÿÿjÿÿÿØÿÿÿáÿÿÿyÿÿÿØÿÿÿáÿÿÿ¿ÿÿÿÉÿÿÿáÿÿÿ¿ÿÿÿÉÿÿÿýÿÿÿýÿÿÿºÿÿÿƒÿÿÿÓÿÿÿƒÿÿÿÓÿÿÿµÿÿÿºÿÿÿµÿÿÿÉÿÿÿyÿÿÿÉÿÿÿjÿÿÿjÿÿÿØÿÿÿyÿÿÿØÿÿÿ¿ÿÿÿÉÿÿÿ¿ÿÿÿÉÿÿÿ           $%&&'$%$$$'$%%&&'&#!"!# #   /-.-/,/*,,*++)(+*)+(+ + +(!.-.!" + + ,*)*<=>>?<1033211=<<01<?330<1=2=>2>233?>;9:9;8867754765GEFEGDGBDDBCCA@CBA4C@C474C7C4@9FEF9:8C7C8D5BAB56TUVVWTIHKKJIIUTTHITWKKHTIUJUVJVJKKWVSRQQPSPONOLMOMN_^]]\__\Z\[Z[XY[YZLX[[OLLO[[XLQ]^^RQPO[[\PMYZZNM P88P654@@A5LMYYXL