diff options
author | nrootconauto <nrootconauto@gmail.com> | 2022-07-06 09:10:05 -0400 |
---|---|---|
committer | nrootconauto <nrootconauto@gmail.com> | 2022-07-06 09:10:05 -0400 |
commit | 8af67e45703b893956cbe9620ae7b380d084be33 (patch) | |
tree | 992fa5180924d0eb4993b48eeb7ba88c67872283 | |
parent | 1b56228da8abf41d14d36b24780c22a51e7d3e04 (diff) |
Removed old versions on Talons and Varoom.windows_recent
Signed-off-by: nrootconauto <nrootconauto@gmail.com>
-rw-r--r-- | T/TalonsMC.HC | 1329 | ||||
-rw-r--r-- | T/Varoom.HC | 799 |
2 files changed, 0 insertions, 2128 deletions
diff --git a/T/TalonsMC.HC b/T/TalonsMC.HC deleted file mode 100644 index 9b61c3b..0000000 --- a/T/TalonsMC.HC +++ /dev/null @@ -1,1329 +0,0 @@ -//Uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.HC"$. - -RegDft("TempleOS/Talons","F64 best_score=9999;\n"); -RegExe("TempleOS/Talons"); -//Keep these power of two so shift is used instead of multiply -//to index arrays. -#define MAP_WIDTH 1024 -#define MAP_HEIGHT 1024 - -#define MAP_SCALE 150 -#define DISPLAY_SCALE 100 -#define CTRLS_SCALE 0.05 - -//I think I did these so the heads-up showed intelligable numbers. -//Scaling is a mess. -#define COORDINATE_SCALE 256 -#define COORDINATE_BITS 8 - -#define WATER_ELEVATION 15 -#define BIRD_ELEVATION 10 -#define ROCK_ELEVATION 45 -#define SNOW_ELEVATION 55 - -//Too big makes off-scrn draws take place. -#define PANEL_SIZE_MAX 16 - - - - - - $SP,"<1>",BI=1$ - - - - - - - - - - - - - - - - - - - - $SP,"<2>",BI=2$ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $SP,"<3>",BI=3$ - - - - - - - - - - - - - - - - - - - - - - $SP,"<4>",BI=4$ - - - - - - - - - - - - - - - - $SP,"<5>",BI=5$ - - - - - - - - - - - - - - - - $SP,"<6>",BI=6$ - - - - - - - - -#define LS_TYPES 3 -U8 *landscape_small_imgs[LS_TYPES]={$IB,"<4>",BI=4$,$IB,"<5>",BI=5$,$IB,"<6>",BI=6$}, - *landscape_large_imgs[LS_TYPES]; - -#define B_NUM 256 -class Bird -{ - Bird *next,*last; - CD3I64 p; - F64 é; -} b_head[mp_cnt]; - -class Obj -{ - Obj *next,*last; - CD3I64 p; - U8 *img; - Bool fish; -}; - -class Panel -{//Polygon or Obj - Panel *next; - CD3I32 *pts; - I64 cnt; - U16 update,num_sides; - CColorROPU32 color; - Obj *next_obj,*last_obj; -} *panel_head,*panels[MAP_HEIGHT][MAP_WIDTH]; - -I64 critical_section_flag; -I16 elevations[MAP_HEIGHT][MAP_WIDTH]; -CD3 normals[MAP_HEIGHT][MAP_WIDTH]; - -class MPCtrl { - I64 init_not_done_flags,update_not_done_flags,app_not_done_flags; - I64 strip_width[MP_PROCESSORS_NUM]; - Bool app_done; -} mp; - -F64 game_t0,game_tf,pitch,roll,heading,è,speed; -Bool invert_pitch,rolled_over; -I64 strip_height,x,y,z,fish_left; -CD3 v; -U0 WrapAngles() -{ - I64 r[4][4],x,y,z; - - è=Wrap(è); - pitch=Wrap(-è-ã/2); - if (Abs(pitch)>ã/2) { - invert_pitch=TRUE; - pitch=Wrap(ã-pitch); - } else - invert_pitch=FALSE; - roll=Wrap(roll); - if (invert_pitch ^^ -ã/2<=roll<ã/2) - rolled_over=FALSE; - else - rolled_over=TRUE; - heading=Wrap(heading,0); - - //World to scrn coordinates - Mat4x4IdentEqu(r); - Mat4x4RotZ(r,heading); - Mat4x4RotX(r,è); - Mat4x4RotZ(r,roll); - - //We use velocity vector for dog-fighting. - x=0x100000000*speed; y=0; z=0; - Mat4x4MulXYZ(r,&x,&y,&z); - v.x=x/ToF64(0x100000000); v.y=y/ToF64(0x100000000); v.z=z/ToF64(0x100000000); -} - -U0 EDTransform(CDC *dc,I64 *x,I64 *y,I64 *z) -{ - I64 zz; - Mat4x4MulXYZ(dc->r,x,y,z); - *z=zz=-*z; - if (zz>0) { - *x = dc->x + *x * DISPLAY_SCALE/zz; //Foreshortening - *y = dc->y - *y * DISPLAY_SCALE/zz; - } else { - *x = dc->x + *x; - *y = dc->y - *y; - } -} - -U0 CalcNormals() -{/*Find the normal vect with a curl. - -i,j and k are the axis unit vectors, -not to be confused with my local index variables. - -i j k -0 1 dz2 -1 0 dz1 - -Normal: dz1*i + dz2*j - k -*/ - I64 i,j; - for (j=0;j<MAP_HEIGHT-1;j++) { - for (i=0;i<MAP_WIDTH-1;i++) { - normals[j][i].x=elevations[j][i+1]-elevations[j][i]; - normals[j][i].y=elevations[j+1][i]-elevations[j][i]; - normals[j][i].z=-1; - D3Unit(&normals[j][i]); - } - MemSet(&normals[j][i],0,sizeof(CD3)); - } - for (i=0;i<MAP_WIDTH-1;i++) - MemSet(&normals[j][i],0,sizeof(CD3)); -} - -Bool TestSameSlope(I64 x,I64 y,I64 w,I64 h) -{ - CD3 p,*s; - I64 k1,k2; - if (!(0<=x && x+w<MAP_WIDTH && 0<=y && y+h<MAP_HEIGHT)) - return FALSE; - s=&normals[y][x]; - for (k2=0;k2<h;k2++) - for (k1=0;k1<w;k1++) - if (D3NormSqr(D3Sub(&p,&normals[y+k2][x+k1],s))>.10) - return FALSE; - return TRUE; -} - -U0 MPDoPanels(CTask *task) -{ - I64 i,j,l,k1,k2,w,h,threshold,lo,hi; - Bool cont; - Panel *tmpp,*start_ptr=NULL,*end_ptr=NULL; - CD3I32 *poly; - Obj *tmpo; - lo=Gs->num*(MAP_HEIGHT-1)/mp_cnt; - hi=(Gs->num+1)*(MAP_HEIGHT-1)/mp_cnt; - for (threshold=8;threshold>=1;threshold--) - for (j=lo;j<hi;j++) { - for (i=0;i<MAP_WIDTH-1;i++) { - if (!panels[j][i]) { - w=1; - h=1; - do { - cont=FALSE; - if (w<PANEL_SIZE_MAX && TestSameSlope(i,j,w+1,h)) { - w++; - cont=TRUE; - } - if (h<PANEL_SIZE_MAX && TestSameSlope(i,j,w,h+1)) { - h++; - cont=TRUE; - } - } while (cont); - if (w>=threshold || h>=threshold) { - tmpp=CAlloc(sizeof(Panel),task); - QueInit(&tmpp->next_obj); - l=elevations[j][i]; - if (l<=WATER_ELEVATION*MAP_SCALE && - elevations[j][i+w-1]<=WATER_ELEVATION*MAP_SCALE && - elevations[j+h-1][i]<=WATER_ELEVATION*MAP_SCALE && - elevations[j+h-1][i+w-1]<=WATER_ELEVATION*MAP_SCALE) { - tmpp->color=BLUE; - if (Rand<0.05) { - tmpo=MAlloc(sizeof(Obj),task); - tmpo->p.x=(i+w/2)*MAP_SCALE; - tmpo->p.y=(j+h/2)*MAP_SCALE; - if (Rand<0.1) { - tmpo->fish=FALSE; - if (RandI16&1) - tmpo->img=landscape_large_imgs[0]; //Boat - else - tmpo->img=landscape_large_imgs[1]; //Boat - tmpo->p.z=(WATER_ELEVATION+2)*MAP_SCALE; - } else { - tmpo->fish=TRUE; - tmpo->img=$IB,"<1>",BI=1$; //Fish - tmpo->p.z=WATER_ELEVATION*MAP_SCALE; - } - QueIns(tmpo,tmpp->last_obj); - } - } else { - if (l<ROCK_ELEVATION*MAP_SCALE) { - if (RandI16&1) - tmpp->color=LTGREEN; - else - tmpp->color=GREEN+LTGREEN<<16+ROPF_DITHER; - if (Rand<0.03) { - tmpo=MAlloc(sizeof(Obj),task); - tmpo->p.x=(i+w/2)*MAP_SCALE; - tmpo->p.y=(j+h/2)*MAP_SCALE; - tmpo->p.z=l; - tmpo->img=landscape_large_imgs[2]; //Tree - tmpo->fish=FALSE; - QueIns(tmpo,tmpp->last_obj); - } - } else if (l<SNOW_ELEVATION*MAP_SCALE) { - if (!(RandU16&3)) { - if (RandI16&1) - tmpp->color=LTGRAY; - else - tmpp->color=DKGRAY+LTGRAY<<16+ROPF_DITHER; - } else { - if (RandI16&1) - tmpp->color=LTGREEN; - else - tmpp->color=GREEN+LTGREEN<<16+ROPF_DITHER; - } - } else { - if (!(RandU16&3)) { - if (RandI16&1) - tmpp->color=WHITE; - else - tmpp->color=LTGRAY; - } else { - if (RandI16&1) - tmpp->color=LTGRAY+WHITE<<16+ROPF_DITHER; - else - tmpp->color=DKGRAY+LTGRAY<<16+ROPF_DITHER; - } - } - } - tmpp->num_sides=4; - poly=tmpp->pts=MAlloc(sizeof(CD3I32)*tmpp->num_sides,task); - poly[0].x=MAP_SCALE*i; - poly[0].y=MAP_SCALE*j; - poly[0].z=elevations[j%MAP_HEIGHT][i%MAP_WIDTH]; - poly[1].x=MAP_SCALE*(i+w); - poly[1].y=MAP_SCALE*j; - poly[1].z=elevations[j%MAP_HEIGHT][(i+w)%MAP_WIDTH]; - poly[2].x=MAP_SCALE*(i+w); - poly[2].y=MAP_SCALE*(j+h); - poly[2].z=elevations[(j+h)%MAP_HEIGHT][(i+w)%MAP_WIDTH]; - poly[3].x=MAP_SCALE*i; - poly[3].y=MAP_SCALE*(j+h); - poly[3].z=elevations[(j+h)%MAP_HEIGHT][i%MAP_WIDTH]; - tmpp->next=start_ptr; - start_ptr=tmpp; - if (!end_ptr) - end_ptr=tmpp; - for (k2=0;k2<h;k2++) - for (k1=0;k1<w;k1++) - panels[j+k2][i+k1]=tmpp; - } - } - } - } - if (end_ptr) { - while (LBts(&critical_section_flag,0)) - Yield; - if (end_ptr) - end_ptr->next=panel_head; - panel_head=start_ptr; - LBtr(&critical_section_flag,0); - } - LBtr(&mp.init_not_done_flags,Gs->num); -} - -U0 InitElevations() -{ - I64 i,j,l,x,y,xx,yy,x1,y1,x2,y2; - MemSet(elevations,0,sizeof(elevations)); - for (i=0;i<MAP_WIDTH*MAP_HEIGHT/128;i++) { - x=RandU32%MAP_WIDTH; - y=RandU32%MAP_HEIGHT; - j=1<<(RandU32%6); - l=0; - while (j--) { - if (!l && RandU16<U16_MAX/4) - l=RandU16%(j+1); - if (l) { - x1=ClampI64(x-j,0,MAP_WIDTH-1); - x2=ClampI64(x+j,0,MAP_WIDTH-1); - y1=ClampI64(y-j,0,MAP_HEIGHT-1); - y2=ClampI64(y+j,0,MAP_HEIGHT-1); - for (yy=y1;yy<y2;yy++) - for (xx=x1;xx<x2;xx++) - elevations[yy][xx]+=MAP_SCALE/2; - l--; - } - } - } - - for (j=0;j<MAP_HEIGHT;j++) - for (i=0;i<MAP_WIDTH;i++) - if (elevations[j][i]<WATER_ELEVATION*MAP_SCALE) - elevations[j][i]=WATER_ELEVATION*MAP_SCALE; -} - -U0 InitMap() -{/*We make a topographic data structure "elevations[][]" -and convert it to panels. "panels[][]" holds the panels -for each spot. -*/ - I64 i; - InitElevations; - MemSet(panels,0,sizeof(panels)); - CalcNormals; - panel_head=NULL; - mp.init_not_done_flags=1<<mp_cnt-1; - for (i=0;i<mp_cnt;i++) - Spawn(&MPDoPanels,Fs,"Do Panels",i); - while (mp.init_not_done_flags) - Sleep(1); -} - -F64 claws_down; - -#define HAND_X (1.0-claws_down)*(0.3*w)+claws_down*(0.4*w) -#define HAND_Y (1.0-claws_down)*(h-125)+claws_down*h - - - - -$SP,"<7>",BI=7$ -$SP,"<8>",BI=8$ - - - -U0 ClawDraw(CDC *dc,I64 x1,I64 y1,I64 x2,I64 y2,I64 w,I64 segments,Bool talon) -{ - I64 i,j; - for (i=0,j=segments;i<segments;i++,j--) { - dc->thick=w; - dc->color=BLACK; - GrLine3(dc, - j*x1/segments+i*x2/segments, - j*y1/segments+i*y2/segments,0, - (j-1)*x1/segments+(i+1)*x2/segments, - (j-1)*y1/segments+(i+1)*y2/segments,0); - dc->thick=w-2; - dc->color=YELLOW; - GrLine3(dc, - j*x1/segments+i*x2/segments, - j*y1/segments+i*y2/segments,0, - (j-1)*x1/segments+(i+1)*x2/segments, - (j-1)*y1/segments+(i+1)*y2/segments,0); - } - if (talon) { - if (y1<y2) - Sprite3B(dc,x1,y1,0,$IB,"<7>",BI=7$); - else - Sprite3B(dc,x1,y1,0,$IB,"<8>",BI=8$); - } -} - -U0 ClawsDraw(CTask *task,CDC *dc) -{ - F64 claws_up=1.0-claws_down; - I64 w=task->pix_width,h=task->pix_height; - dc->flags|=DCF_SYMMETRY; - DCSymmetrySet(dc,w>>1,0,w>>1,1); - - ClawDraw(dc,HAND_X-30,HAND_Y-50*claws_up,HAND_X-5,HAND_Y, 22,4,TRUE); - ClawDraw(dc,HAND_X-10,HAND_Y-60*claws_up,HAND_X,HAND_Y, 22,4,TRUE); - ClawDraw(dc,HAND_X+10,HAND_Y-60*claws_up,HAND_X,HAND_Y, 22,4,TRUE); - ClawDraw(dc,HAND_X+30,HAND_Y-50*claws_up,HAND_X+5,HAND_Y, 22,4,TRUE); - ClawDraw(dc,HAND_X+25,HAND_Y+40*claws_up,HAND_X+5,HAND_Y, 22,4,TRUE); - - ClawDraw(dc,HAND_X,HAND_Y,6*w/20,h,38,5,FALSE); -} - -CDC *main_dc; -I64 main_dc_lock=0; -U0 DrawIt(CTask *task,CDC *dc) -{ - __SleepUntilValue(&main_dc_lock,1,0); - main_dc_lock=1; - main_dc->flags|=DCF_NO_TRANSPARENTS; - GrBlot(dc,0,0,main_dc); - if (claws_down) - ClawsDraw(task,dc); - main_dc_lock=0; -} - -/* -$SP,"<9>",BI=9$ - - - - - - - - - - - - - - - - - - -$SP,"<10>",BI=10$ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Cores render strips that +/- 15%. The cores check the panel map array -and render the panel for each square, marking-it done. - -The depth buf is not locked in the graphic routines -so we get some glitches. -*/ - -I64 update_jiffy_limit; - -U0 MPDrawIt(CTask *task,CDC *dc) -{ - I64 j,update=winmgr.updates&65535,strip_width,*s2w,x1,y1,z1,xx,yy, - xh,yh,zh,yh2,xh2,x1h,y1h,x1wa,y1wa,x1wb,y1wb,x3,y3,z3,dd,dd_old, - cx=task->pix_width>>1,cy=task->pix_height>>1,r[16],*elems1,*elems_hard; - Panel reg *tmpp; - Bird *tmpb; - Obj *tmpo; - Bool w_on_map,h_on_map; - - xx=x/(MAP_SCALE*COORDINATE_SCALE); - yy=y/(MAP_SCALE*COORDINATE_SCALE); - - //World to scrn coordinates - Mat4x4IdentEqu(dc->r); - Mat4x4RotZ(dc->r,heading); - Mat4x4RotX(dc->r,è); - Mat4x4RotZ(dc->r,roll); - DCMat4x4Set(dc,dc->r); - - //Scrn to world coordinates - - //This gives us the vects for stepping through the grid in - //the direction the plane is facing. we step horizontally and vertically - //and use the reciprocal slope principle - //y=mx+b and y=(-1/m)x+b are perpendicular. - - s2w=Mat4x4IdentNew; - Mat4x4RotZ(s2w,-roll); - Mat4x4RotX(s2w,-è); - Mat4x4RotZ(s2w,-heading); - - xh=0; - yh=0; - zh=-256; - Mat4x4MulXYZ(s2w,&xh,&yh,&zh); - - //The layer for core1 is not cleared automatically - //it is persistent. I have carefully syncronized to the update - //cycle initiated by Core0 to prevent flicker. - - dc->flags|=DCF_TRANSFORMATION; - dc->transform=&EDTransform; - dc->x=cx; - dc->y=cy; - - //dc->x and the translation part of dc->r are ident in effect, - //but we use both to show-off. We could add offsets together and - //use one or the other. - - x1=-x>>COORDINATE_BITS; - y1=-y>>COORDINATE_BITS; - z1=-z>>COORDINATE_BITS; - Mat4x4MulXYZ(dc->r,&x1,&y1,&z1); - Mat4x4TranslationEqu(dc->r,x1,y1,z1); - - //This is a refinement. - if (Abs(è*180/ã)>90) { - x3=0; - y3=-cy; - z3=0; - Mat4x4MulXYZ(s2w,&x3,&y3,&z3); - xx+=x3; - yy+=y3; - } - - if (Gs->num&1) {//alt left-right,right-left - yh2=-yh; - xh2=-xh; - } else { - yh2=yh; - xh2=xh; - } - - //Calc starting point. - x1wa=xx<<8+xh*strip_height>>1/1.3*(Gs->num+1.15); - y1wa=yy<<8+yh*strip_height>>1/1.3*(Gs->num+1.15); - x1wb=0; - y1wb=0; - - xh=-xh; //Back to front to help with depth. - yh=-yh; - - //Take half steps to cover whole grid. - xh>>=1; yh>>=1; - xh2>>=1; yh2>>=1; - w_on_map=FALSE; - dd_old=I64_MAX; - for (strip_width=0;__GetTicks<update_jiffy_limit;strip_width++) { - x1h=x1wa; - y1h=y1wa; - h_on_map=FALSE; - for (j=0;j<strip_height && __GetTicks<update_jiffy_limit;j++) { - x1=x1h>>8; y1=y1h>>8; - if (0<=x1<MAP_WIDTH && 0<=y1<MAP_HEIGHT) { - if ((tmpp=panels[y1][x1]) && tmpp->update!=update) { - tmpp->update=update; - dc->color=tmpp->color; - tmpp->cnt=GrFillPoly3(dc,tmpp->num_sides,tmpp->pts); - tmpo=tmpp->next_obj; - while (tmpo!=&tmpp->next_obj) { - Sprite3(dc,tmpo->p.x,tmpo->p.y,tmpo->p.z,tmpo->img); - tmpo=tmpo->next; - } - } - h_on_map=TRUE; - } else if (h_on_map) - break; - x1h+=xh; - y1h+=yh; - } - if (h_on_map) - w_on_map=TRUE; - else if (w_on_map) { - strip_width=I64_MAX; - break; - } - x1wb-=yh2; - y1wb+=xh2; - if (strip_width&1) { - x1wa-=x1wb; - y1wa-=y1wb; - } else { - x1wa+=x1wb; - y1wa+=y1wb; - } - if (!w_on_map) { - dd=SqrI64(x1wa>>8-MAP_WIDTH>>1)+SqrI64(y1wa>>8-MAP_HEIGHT>>1); - if (dd>dd_old) - break; - dd_old=dd; - } - } - - tmpb=b_head[Gs->num].next; - while (tmpb!=&b_head[Gs->num]) { - elems1=SpriteInterpolate(Tri(tS,0.2),$IB,"<2>",BI=2$,$IB,"<3>",BI=3$); - - Mat4x4IdentEqu(r); - Mat4x4RotZ(r,tmpb->é); - elems_hard=SpriteTransform(elems1,r); - - Sprite3(dc,tmpb->p.x,tmpb->p.y,tmpb->p.z,elems_hard); - Free(elems_hard); - Free(elems1); - - tmpb=tmpb->next; - } - - Free(s2w); - mp.strip_width[Gs->num]=strip_width; - LBtr(&mp.update_not_done_flags,Gs->num); -} - -U0 CoreAPTalonsTask(CTask *master_task) -{ - CDC *dc=DCAlias(main_dc,master_task); - while (!mp.app_done) { - __SleepUntilValue(&mp.update_not_done_flags,1<<Gs->num,1<<Gs->num); - if (!mp.app_done) - MPDrawIt(master_task,dc); - } - - //We made an alias of this we don't want freed. - dc->depth_buf=NULL; - - DCDel(dc); - LBtr(&mp.app_not_done_flags,Gs->num); -} - -U0 DrawHorizon(CDC *dc) -{ - I64 x1,y1,z1,x2,y2,z2,xh,yh,zh,*s2w=Mat4x4IdentNew, - cx=Fs->pix_width>>1, - cy=Fs->pix_height>>1; - CD3I32 p[4]; - I32 *old_db=dc->depth_buf; - dc->depth_buf=NULL; - CColorROPU32 ground_color; - - if (game_tf && fish_left) - DCFill(dc,BLACK); - else if (-ã/4<=Wrap(è-ã)<ã/4) - DCFill(dc,LTCYAN); - else { - if (z/COORDINATE_SCALE<(WATER_ELEVATION+3)*MAP_SCALE) - ground_color=BLUE; - else - ground_color=LTGREEN; - - Mat4x4IdentEqu(dc->r); - Mat4x4RotZ(dc->r,heading); - Mat4x4RotX(dc->r,è); - Mat4x4RotZ(dc->r,roll); - - DCMat4x4Set(dc,dc->r); - dc->flags&=~DCF_TRANSFORMATION; - dc->transform=&EDTransform; - dc->x=cx; - dc->y=cy; - - Mat4x4RotZ(s2w,-roll); - Mat4x4RotX(s2w,-è); - Mat4x4RotZ(s2w,-heading); - - xh=0; - yh=0; - zh=-256; - Mat4x4MulXYZ(s2w,&xh,&yh,&zh); - Free(s2w); - - x1=xh+yh*32; y1=yh-xh*32; z1=0; - (*dc->transform)(dc,&x1,&y1,&z1); - x2=xh-yh*32; y2=yh+xh*32; z2=0; - (*dc->transform)(dc,&x2,&y2,&z2); - DCClipLine(dc,&x1,&y1,&x2,&y2); - - MemSet(p,0,sizeof(p)); - if (x2<x1) { - SwapI64(&x1,&x2); - SwapI64(&y1,&y2); - } - if (!x1 && x2==dc->width-1) { - p[0].x=0; - p[0].y=0; - p[1].x=dc->width-1; - p[1].y=0; - p[2].x=dc->width-1; - p[2].y=y2; - p[3].x=0; - p[3].y=y1; - if (rolled_over) - dc->color=ground_color; - else - dc->color=LTCYAN; - GrFillPoly3(dc,4,p); - p[0].y=dc->height-1; - p[1].y=dc->height-1; - if (rolled_over) - dc->color=LTCYAN; - else - dc->color=ground_color; - GrFillPoly3(dc,4,p); - } else { - if (y2<y1) { - SwapI64(&x1,&x2); - SwapI64(&y1,&y2); - } - if (!y1 && y2==dc->height-1) { - p[0].x=0; - p[0].y=0; - p[1].x=0; - p[1].y=dc->height-1; - p[2].x=x2; - p[2].y=dc->height-1; - p[3].x=x1; - p[3].y=0; - if (x1<x2 ^^ rolled_over) - dc->color=ground_color; - else - dc->color=LTCYAN; - GrFillPoly3(dc,4,p); - p[0].x=dc->width-1; - p[1].x=dc->width-1; - if (x1<x2 ^^ rolled_over) - dc->color=LTCYAN; - else - dc->color=ground_color; - GrFillPoly3(dc,4,p); - } else - DCFill(dc,LTCYAN); //Not correct. - } - } - - dc->depth_buf=old_db; -} - -U0 Core0Talons() -{ - __SleepUntilValue(&main_dc_lock,1,0); - main_dc_lock=1; - CDC *dc=DCAlias(main_dc,Fs); - I64 i,xx,yy,elev,height,cx=Fs->pix_width>>1,cy=Fs->pix_height>>1; - F64 min_strip_width,tt; - - update_jiffy_limit=__GetTicks+JIFFY_FREQ/40; - - xx=x/(MAP_SCALE*COORDINATE_SCALE); - yy=y/(MAP_SCALE*COORDINATE_SCALE); - if (0<=xx<MAP_WIDTH && 0<=yy<MAP_HEIGHT) - elev=elevations[yy][xx]; - else - elev=I64_MAX; - - height=z/COORDINATE_SCALE-elev; - if (height<0 && elev>WATER_ELEVATION*MAP_SCALE && !game_tf) { - music.mute=TRUE; - Beep; - game_tf=tS; - music.mute=FALSE; - } - - DrawHorizon(dc); - - if (game_tf) { - tt=game_tf-game_t0; - if (Blink) { - dc->color=RED; - GrPrint(dc,(Fs->pix_width-9*FONT_WIDTH)/2, - (Fs->pix_height-FONT_HEIGHT)/2,"Game Over"); - } - } else { - DCDepthBufRst(dc); - mp.update_not_done_flags=1<<mp_cnt-1; - MPDrawIt(Fs,dc); - __SleepUntilValue(&mp.update_not_done_flags,-1,0); - - min_strip_width=F64_MAX; - for (i=0;i<mp_cnt;i++) - min_strip_width=Min(min_strip_width,32.0*mp.strip_width[i]/(i+32.0)); - strip_height=ClampI64( - strip_height*Clamp(0.25*min_strip_width/strip_height,0.9,1.1), - 64,1024); - - - tt=tS-game_t0; - if (tt<5.0 && Blink) { - dc->color=WHITE; - GrPrint(dc,(Fs->pix_width-13*FONT_WIDTH)/2, - (Fs->pix_height-FONT_HEIGHT)/2-4*FONT_HEIGHT,"Catch 10 Fish"); - } - } - - dc->thick=2; - if (game_tf && fish_left) - dc->color=WHITE; - else - dc->color=BLACK; - dc->flags&=~DCF_TRANSFORMATION; - GrLine3(dc,cx+5,cy,0,cx-5,cy,0); - GrLine3(dc,cx,cy+5,0,cx,cy-5,0); - if (invert_pitch) - GrPrint(dc,0,0,"Pitch:%5.1f Roll:%5.1f Heading:%5.1f " - "Height:%5d [Core Strip:%3d]", - pitch*180/ã,Wrap(roll+ã)*180/ã,Wrap(heading+ã,0)*180/ã, - height,strip_height); - else - GrPrint(dc,0,0,"Pitch:%5.1f Roll:%5.1f Heading:%5.1f " - "Height:%5d [Core Strip:%3d]", - pitch*180/ã,roll*180/ã,heading*180/ã,height,strip_height); - GrPrint(dc,0,FONT_HEIGHT,"Fish Remaining:%d Time:%3.2f Best:%3.2f", - fish_left,tt,best_score); - - main_dc_lock=0; - //We made an alias of this we don't want freed. - dc->depth_buf=NULL; - DCDel(dc); - Refresh; -} - - -Obj *FishFind(I64 x1,I64 y1,I64 *_dd) -{ - I64 dd,best_dd=I64_MAX; - Obj *res=NULL,*tmpo; - Panel *tmpp=panel_head; - while (tmpp) { - tmpo=tmpp->next_obj; - while (tmpo!=&tmpp->next_obj) { - if (tmpo->fish) { - dd=SqrI64(tmpo->p.x-x1)+SqrI64(tmpo->p.y-y1); - if (dd<best_dd) { - best_dd=dd; - res=tmpo; - } - } - tmpo=tmpo->next; - } - tmpp=tmpp->next; - } - *_dd=best_dd; - return res; -} - -#define ANIMATE_MS 10 - -U0 AnimateTask(I64) -{//Steadily moves the airplane fwd. - I64 i,*s2w,x1,y1,z1,dx,dy,dz,dd; - F64 t0=tS,ms,é,d; - Obj *tmpo; - Bird *tmpb; - while (TRUE) { - ms=1000*(tS-t0); - t0=tS; - if (!game_tf) { -//Scrn to world coordinates - s2w=Mat4x4IdentNew; - Mat4x4RotZ(s2w,-roll); - Mat4x4RotX(s2w,-è); - Mat4x4RotZ(s2w,-heading); - - dx=0;dy=0;dz=1<<16; - Mat4x4MulXYZ(s2w,&dx,&dy,&dz); - x-=speed*ms*COORDINATE_SCALE*dx/1<<16; - y-=speed*ms*COORDINATE_SCALE*dy/1<<16; - z-=speed*ms*COORDINATE_SCALE*dz/1<<16; - Free(s2w); - x1=x/COORDINATE_SCALE; y1=y/COORDINATE_SCALE; z1=z/COORDINATE_SCALE; - if (z1<(WATER_ELEVATION+3)*MAP_SCALE) { - if (z1<WATER_ELEVATION*MAP_SCALE) { - z=WATER_ELEVATION*MAP_SCALE*COORDINATE_SCALE; - if (invert_pitch) { - if (pitch<-ã/8) - è+=ms/1000.0*Sign(3*ã/8-è); - } else if (pitch<-ã/8) - è+=ms/1000.0*Sign(-3*ã/8-è); - WrapAngles; - } - speed=1.0; - if (rolled_over || !(tmpo=FishFind(x1,y1,&dd))) - claws_down=0; - else { - d=Sqrt(dd); - x1-=tmpo->p.x; - y1-=tmpo->p.y; - é=ACos((dx*x1+dy*y1)/(d*1<<16)); - if (é>0 && d<MAP_SCALE*4) - claws_down=Saw(d,MAP_SCALE*4); - else - claws_down=0.01; - if (d<MAP_SCALE*2) { - if (!--fish_left) { - game_tf=tS; - if (game_tf-game_t0<best_score) - best_score=game_tf-game_t0; - } - QueRem(tmpo); - Free(tmpo); - music.mute=TRUE; - Snd(74); Sleep(200); Snd; - music.mute=FALSE; - } - } - } else { - claws_down=0; - if (-ã/4<=è<=ã/4) - speed+=0.0005; - else if (-3*ã/4<=è<=3*ã/4) - speed+=0.0001; - else - speed-=0.0001; - speed=Clamp(speed+(0.0005-0.0002*Abs(è)/(ã/4)),0.1,5.0); - } - - for (i=0;i<mp_cnt;i++) { - tmpb=b_head[i].next; - while (tmpb!=&b_head[i]) { - tmpb->p.x+=10*ms/1000*MAP_SCALE*Cos(tmpb->é); - tmpb->p.y+=10*ms/1000*MAP_SCALE*Sin(tmpb->é); - - tmpb->p.z=BIRD_ELEVATION*MAP_SCALE+ - elevations[tmpb->p.y/MAP_SCALE%MAP_HEIGHT][tmpb->p.x/MAP_SCALE%MAP_WIDTH]; - tmpb->é+=2*ã*ms/1000/10; - tmpb=tmpb->next; - } - } - } - Refresh; - } -} - -U0 MPEnd() -{ - update_jiffy_limit=0; - mp.app_not_done_flags=1<<mp_cnt-1-1; - mp.app_done=TRUE; - mp.update_not_done_flags=1<<mp_cnt-1-1; -//Wait for all cores to exit - while (mp.app_not_done_flags) - Sleep(1); -} - -U0 TaskEndCB() -{ - MPEnd; - Exit; -} - -U0 SongTask(I64) -{ - Fs->task_end_cb=&SndTaskEndCB; - MusicSettingsRst; - while (TRUE) { - Play("5eCGFsD4A5e.C4sG5eGDqCDeGsGG4qG"); - Play("5eCGFsD4A5e.C4sG5eGDqCDeGsGG4qG"); - Play("5eGECGC4A5FCsC4B5C4B5e.GsG4qGB"); - Play("5eGECGC4A5FCsC4B5C4B5e.GsG4qGB"); - } -} - -U0 PreInit() -{ - I64 i,*r=Mat4x4IdentNew; - Mat4x4Scale(r,10.0); - for (i=0;i<LS_TYPES;i++) - landscape_large_imgs[i]=SpriteTransform(landscape_small_imgs[i],r); - Free(r); -} - -U0 PostCleanUp() -{ - I64 i; - for (i=0;i<LS_TYPES;i++) - Free(landscape_large_imgs[i]); -} - -U0 Init() -{ - I64 i,xx,yy; - Bird *tmpb; - - main_dc=DCNew(GR_WIDTH,GR_HEIGHT); - critical_section_flag=0; - game_tf=0; - fish_left=10; - - MemSet(&mp,0,sizeof(MPCtrl)); - InitMap; - DCDepthBufAlloc(main_dc); - - strip_height=128; - - è =-90.0*ã/180.0; - roll =0; - heading=0; - speed =2.5; - claws_down=0; - WrapAngles; - - x=MAP_WIDTH>>1 *COORDINATE_SCALE*MAP_SCALE; - y=MAP_HEIGHT>>1*COORDINATE_SCALE*MAP_SCALE; - z=64 *COORDINATE_SCALE*MAP_SCALE; - - xx=x/(MAP_SCALE*COORDINATE_SCALE); - yy=y/(MAP_SCALE*COORDINATE_SCALE); - z+=elevations[yy][xx]*COORDINATE_SCALE; - - for (i=0;i<mp_cnt;i++) - QueInit(&b_head[i]); - - for (i=0;i<B_NUM;i++) { - tmpb=MAlloc(sizeof(Bird)); - tmpb->p.x=Rand*MAP_WIDTH*MAP_SCALE; - tmpb->p.y=Rand*MAP_HEIGHT*MAP_SCALE; - tmpb->p.z=BIRD_ELEVATION*MAP_SCALE+ - elevations[tmpb->p.y/MAP_SCALE][tmpb->p.x/MAP_SCALE]; - tmpb->é=2*ã*Rand; - QueIns(tmpb,b_head[i%mp_cnt].last); - } - - for (i=1;i<mp_cnt;i++) - Spawn(&CoreAPTalonsTask,Fs,"AP Talons",i); - Fs->task_end_cb=&TaskEndCB; - game_t0=tS; -} - -U0 CleanUp() -{ - I64 i; - Panel *tmpp=panel_head,*tmpp1; - MPEnd; - while (tmpp) { - tmpp1=tmpp->next; - QueDel(&tmpp->next_obj); - Free(tmpp->pts); - Free(tmpp); - tmpp=tmpp1; - } - for (i=0;i<mp_cnt;i++) { - QueDel(&b_head[i]); - QueInit(&b_head[i]); - } - DCDel(main_dc); -} - -U0 Talons() -{ - I64 ch,sc; - SettingsPush; //See $LK,"SettingsPush",A="MN:SettingsPush"$ - MenuPush( - "File {" - " Abort(,CH_SHIFT_ESC);" - " Exit(,CH_ESC);" - "}" - "Play {" - " Restart(,'\n');" - " Down(,,SC_CURSOR_UP);" - " Up(,,SC_CURSOR_DOWN);" - " Left(,,SC_CURSOR_LEFT);" - " Right(,,SC_CURSOR_RIGHT);" - "}" - ); - AutoComplete; - WinBorder; - WinMax; - DocCursor; - DocClear; - "Initializing...\n"; - Fs->song_task=Spawn(&SongTask,NULL,"Song",,Fs); - PreInit; - Init; - Fs->animate_task=Spawn(&AnimateTask,NULL,"Animate",,Fs); - Fs->draw_it=&DrawIt; - try //in case <CTRL-ALT-c> is pressed. - do { - if (ScanKey(&ch,&sc)) { - switch (ch) { - case 0: - switch (sc.u8[0]) { - case SC_CURSOR_DOWN: - è-=CTRLS_SCALE*Cos(roll); - heading-=CTRLS_SCALE*Sin(roll)*Sin(è); - WrapAngles; - break; - case SC_CURSOR_UP: - è+=CTRLS_SCALE*Cos(roll); - heading+=CTRLS_SCALE*Sin(roll)*Sin(è); - WrapAngles; - break; - case SC_CURSOR_RIGHT: - roll+=CTRLS_SCALE; - WrapAngles; - break; - case SC_CURSOR_LEFT: - roll-=CTRLS_SCALE; - WrapAngles; - break; - } - break; - case '\n': - Fs->draw_it=NULL; - CleanUp; - Refresh; - Init; - Fs->draw_it=&DrawIt; - break; - default: - goto c0; - } - } else{ - c0: - Core0Talons; - } - } while (ch!=CH_SHIFT_ESC && ch!=CH_ESC); - catch - PutExcept; - SettingsPop; - CleanUp; - PostCleanUp; - MenuPop; - RegWrite("TempleOS/Talons","F64 best_score=%5.4f;\n",best_score); -} - -Talons; - - -ýÿÿÿ - -ÿÿÿÿ+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 - - - - - - - - - - - - - - diff --git a/T/Varoom.HC b/T/Varoom.HC deleted file mode 100644 index 061cd5b..0000000 --- a/T/Varoom.HC +++ /dev/null @@ -1,799 +0,0 @@ - - - - - - $SP,"<1>",BI=1$ - - - - $SP,"<2>",BI=2$ - - - - - - - - $SP,"<3>",BI=3$ - - - - - - - - - - - - - - - - - - - - - $SP,"<4>",BI=4$ - - - - - - - - - - $SP,"<5>",BI=5$ - - - - - - - - - - - - - - - - - - - - - - - - - - - - $SP,"<6>",BI=6$ - - - - - - - - - - - - -RegDft("TempleOS/Varoom","F64 best_score=9999;\n"); -RegExe("TempleOS/Varoom"); - -I64 gr_x_offsets[8]={-1,0,1,-1,1,-1,0,1}, - gr_y_offsets[8]={-1,-1,-1,0,0,1,1,1}; - -F64 distance,t0,tf; -Bool game_over; - -#define BORDER 7500 -#define RADIUS 10000 -#define WIDTH 2000 -#define SHOULDER 200 -#define D_é (2*ã/360) //Curve track slice is one degree. -#define D_S (2*ã*RADIUS/360) //Straight track is degree at 10000. -#define DIPS 5 -#define DIP_DEPTH 50 -class Track -{ - Track *next,*last; - I32 num; - CColorROPU16 c,pad; - I64 x,z; - F64 é,d; - CD3I32 left[4],center[4],right[4]; -} track_head, - *track_start[MP_PROCESSORS_NUM],*track_end[MP_PROCESSORS_NUM]; - -CDC *track_map; -#define MAP_BITS 9 -I64 t_minx,t_maxx,t_minz,t_maxz; - -#define BUSHES_NUM 512 -class Bush -{ - CD3I32 p; - Bool sym,pad[3]; - U8 *img; -} b[BUSHES_NUM]; - -#define CARS_NUM 8 -class Car -{ - CD3I32 p; - F64 é,dé,speed; - U8 *img; - Track *t; -} c[CARS_NUM]; - -I64 DipY(I64 x,I64 z) -{ - F64 m,a; - R2P(&m,&a,x,z); - return DIP_DEPTH*m*Cos(DIPS*a)/RADIUS; -} - -#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); -} - -Track *TrackFind(Track *_tmpt,I64 x,I64 z) -{ - Track *res=_tmpt,*tmpt; - I64 dd,best=SqrI64(res->x-x)+SqrI64(res->z-z); - - tmpt=_tmpt; - while (TRUE) { - tmpt=tmpt->next; - if (tmpt==&track_head) - tmpt=tmpt->next; - dd=SqrI64(tmpt->x-x)+SqrI64(tmpt->z-z); - if (dd<best) { - best=dd; - res=tmpt; - } else - break; - } - tmpt=_tmpt; - while (TRUE) { - tmpt=tmpt->last; - if (tmpt==&track_head) - tmpt=tmpt->last; - dd=SqrI64(tmpt->x-x)+SqrI64(tmpt->z-z); - if (dd<best) { - best=dd; - res=tmpt; - } else - break; - } - return res; -} - -U0 TrackSlice(F64 *_x,F64 *_z,F64 é,F64 d) -{ - F64 x=*_x,z=*_z,c=Cos(é),s=Sin(é),dx=d*s,dz=-d*c; - Track *tmpt,*last=track_head.last; - if (last==&track_head) - last=NULL; - - tmpt=CAlloc(sizeof(Track)); - if (last) { - MemCpy(&tmpt->center[0],&last->center[3],sizeof(CD3I32)); - MemCpy(&tmpt->center[1],&last->center[2],sizeof(CD3I32)); - } - tmpt->center[2].x=x+(WIDTH/2)*c+dx; - tmpt->center[2].z=z+(WIDTH/2)*s+dz; - tmpt->center[2].y=DipY(tmpt->center[2].x,tmpt->center[2].z); - tmpt->center[3].x=x-(WIDTH/2)*c+dx; - tmpt->center[3].z=z-(WIDTH/2)*s+dz; - tmpt->center[3].y=DipY(tmpt->center[3].x,tmpt->center[3].z); - - if (last) { - MemCpy(&tmpt->left[0],&last->left[3],sizeof(CD3I32)); - MemCpy(&tmpt->left[1],&last->left[2],sizeof(CD3I32)); - } - tmpt->left[2].x=x-(WIDTH/2)*c+dx; - tmpt->left[2].z=z-(WIDTH/2)*s+dz; - tmpt->left[2].y=DipY(tmpt->left[2].x,tmpt->left[2].z); - tmpt->left[3].x=x-(WIDTH/2+SHOULDER)*c+dx; - tmpt->left[3].z=z-(WIDTH/2+SHOULDER)*s+dz; - tmpt->left[3].y=DipY(tmpt->left[3].x,tmpt->left[3].z); - - if (last) { - MemCpy(&tmpt->right[0],&last->right[3],sizeof(CD3I32)); - MemCpy(&tmpt->right[1],&last->right[2],sizeof(CD3I32)); - } - tmpt->right[2].x=x+(WIDTH/2+SHOULDER)*c+dx; - tmpt->right[2].z=z+(WIDTH/2+SHOULDER)*s+dz; - tmpt->right[2].y=DipY(tmpt->right[2].x,tmpt->right[2].z); - tmpt->right[3].x=x+(WIDTH/2)*c+dx; - tmpt->right[3].z=z+(WIDTH/2)*s+dz; - tmpt->right[3].y=DipY(tmpt->right[3].x,tmpt->right[3].z); - - tmpt->x=x; - tmpt->z=z; - tmpt->é=é; - tmpt->num=track_head.last->num+1; - tmpt->d =track_head.last->d+d; - - QueIns(tmpt,track_head.last); - - if (tmpt->num&1) - tmpt->c=RED; - else - tmpt->c=WHITE; - - if (x<t_minx) t_minx=x; - if (x>t_maxx) t_maxx=x; - if (z<t_minz) t_minz=z; - if (z>t_maxz) t_maxz=z; - - x+=dx; - *_x=x; - z+=dz; - *_z=z; - - if (x<t_minx) t_minx=x; - if (x>t_maxx) t_maxx=x; - if (z<t_minz) t_minz=z; - if (z>t_maxz) t_maxz=z; -} - -U0 CoupleEnds() -{ - Track *first=track_head.next,*last=track_head.last; - MemCpy(&first->center[0],&last->center[3],sizeof(CD3I32)); - MemCpy(&first->center[1],&last->center[2],sizeof(CD3I32)); - MemCpy(&first->left[0] ,&last->left[3] ,sizeof(CD3I32)); - MemCpy(&first->left[1] ,&last->left[2] ,sizeof(CD3I32)); - MemCpy(&first->right[0] ,&last->right[3] ,sizeof(CD3I32)); - MemCpy(&first->right[1] ,&last->right[2] ,sizeof(CD3I32)); -} - -U0 InitTrack() -{ - I64 i,j; - Track *tmpt; - F64 x,z,é,d; - - MemSet(&track_head,0,sizeof(Track)); - QueInit(&track_head); - - t_minx=t_minz=I64_MAX; - t_maxx=t_maxz=I64_MIN; - - x=0; z=0; é=0; - for (d=0;d<6*RADIUS;d+=D_S) - TrackSlice(&x,&z,é,D_S); - for (i=0;i<180;i++,é+=D_é) - TrackSlice(&x,&z,é,D_é*RADIUS); - for (d=0;d<RADIUS;d+=D_S) - TrackSlice(&x,&z,é,D_S); - for (i=0;i<90;i++,é-=D_é) - TrackSlice(&x,&z,é,D_é*RADIUS); - for (i=0;i<180;i++,é+=D_é) - TrackSlice(&x,&z,é,D_é*RADIUS); - for (i=0;i<90;i++,é-=D_é) - TrackSlice(&x,&z,é,D_é*RADIUS); - for (d=0;d<RADIUS;d+=D_S) - TrackSlice(&x,&z,é,D_S); - for (i=0;i<180;i++,é+=D_é) - TrackSlice(&x,&z,é,D_é*RADIUS); - - CoupleEnds; - - tmpt=track_head.next; - for (i=0;i<mp_cnt;i++) { - j=(i+1)*track_head.last->num/mp_cnt+1; - track_start[i]=tmpt; - while (tmpt!=&track_head && tmpt->num!=j) - tmpt=tmpt->next; - track_end[i]=tmpt; - } - - t_minx-=BORDER; t_minz-=BORDER; - t_maxx+=BORDER; t_maxz+=BORDER; - track_map=DCNew((t_maxx-t_minx+1<<MAP_BITS-1)>>MAP_BITS, - (t_maxz-t_minz+1<<MAP_BITS-1)>>MAP_BITS); - - track_map->color=LTGRAY; - GrRect(track_map,0,0,track_map->width,track_map->height); - tmpt=track_head.next; - track_map->color=YELLOW; - track_map->thick=3; - while (tmpt!=&track_head) { - GrPlot3(track_map,track_map->width-(tmpt->x-t_minx)>>MAP_BITS, - (tmpt->z-t_minz)>>MAP_BITS,0); - tmpt=tmpt->next; - } -} - -#define HORIZON_DIP 200 - -Bool PrepPoly(CD3I32 *p,I64 *r,I64 cx,I64 h,CD3I32 *poly) -{ - I64 x,y,z,i; - F64 s; - for (i=0;i<4;i++) { - x=p[i].x-c[0].p.x; - y=p[i].y-c[0].p.y; - z=p[i].z-c[0].p.z; - Mat4x4MulXYZ(r,&x,&y,&z); - s=100.0/(AbsI64(z)+50); - poly[i].y=s*y+h; - if (z<-200 || !(-h<poly[i].y<2*h)) - return FALSE; - poly[i].x=s*x+cx; - poly[i].z=z+GR_Z_ALL; - } - return TRUE; -} - -I64 mp_not_done_flags; - -U0 MPUpdateWin(CDC *dc2) -{ - CTask *task=dc2->win_task; - 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].é); - Car *tmpc; - CD3I32 poly[4]; - Track *tmpt,*tmpt1; - CDC *dc=DCAlias(gr.dc2,task); - - Mat4x4IdentEqu(r); - Mat4x4RotY(r,ã-c[0].é); - Mat4x4RotX(r,75*ã/180-dip_é); - - dc->depth_buf=dc2->depth_buf; - - //Track - tmpt =track_start[Gs->num]; - tmpt1=track_end [Gs->num]; - while (tmpt!=tmpt1) { - dc->color=DKGRAY; - if (PrepPoly(&tmpt->center,r,cx,h,poly)) { - GrFillPoly3(dc,4,poly); - dc->color=tmpt->c; - if (PrepPoly(&tmpt->left,r,cx,h,poly)) - GrFillPoly3(dc,4,poly); - if (PrepPoly(&tmpt->right,r,cx,h,poly)) - GrFillPoly3(dc,4,poly); - } - tmpt=tmpt->next; - } - - dc->flags|=DCF_TRANSFORMATION; - for (i=Gs->num;i<BUSHES_NUM;i+=mp_cnt) { - x=b[i].p.x-c[0].p.x; y=b[i].p.y-c[0].p.y; z=b[i].p.z-c[0].p.z; - Mat4x4MulXYZ(r,&x,&y,&z); - if (z>0) { - s=100.0/(AbsI64(z)+50); - Mat4x4IdentEqu(dc->r); - Mat4x4Scale(dc->r,s*2); - DCMat4x4Set(dc,dc->r); - if (b[i].sym) { - dc->flags|=DCF_SYMMETRY|DCF_JUST_MIRROR; - DCSymmetrySet(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;i<CARS_NUM;i+=mp_cnt) { - tmpc=&c[i]; - x=tmpc->p.x-c[0].p.x; y=tmpc->p.y-c[0].p.y; z=tmpc->p.z-c[0].p.z; - Mat4x4MulXYZ(r,&x,&y,&z); - if (z>0) { - s=100.0/(AbsI64(z)+50); - Mat4x4IdentEqu(dc->r); - Mat4x4Scale(dc->r,s*2); - Mat4x4RotX(dc->r,Dipé(tmpc->p.x,tmpc->p.z,-tmpc->é)); - Mat4x4RotY(dc->r,tmpc->é-c[0].é); - DCMat4x4Set(dc,dc->r); - Sprite3B(dc,s*x+cx,s*y+h,z+GR_Z_ALL,tmpc->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; - Mat4x4MulXYZ(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].é); - Car *tmpc=&c[0]; - - dc->color=LTCYAN; - GrRect(dc,0,0,w,HORIZON_DIP*Sin(dip_é)+FONT_HEIGHT*4.5); - - Mat4x4IdentEqu(r); - Mat4x4RotY(r,ã-c[0].é); - Mat4x4RotX(r,75*ã/180-dip_é); - - DCDepthBufAlloc(dc); - - //Sun - x=c[0].p.x; y=0; z=1000000-c[0].p.z; - Mat4x4MulXYZ(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<<mp_cnt-1; - for (i=0;i<mp_cnt;i++) - JobQue(&MPUpdateWin,dc,i); - while (mp_not_done_flags) - Yield; - - Mat4x4IdentEqu(r); - Mat4x4RotY(r,tmpc->dé); - Mat4x4RotX(r,0.4-8*dip_é); //Made this up - dc->transform=&VRTransform; - dc->x=task->pix_width>>1; - dc->y=task->pix_height-150; - dc->z=GR_Z_ALL; - Sprite3Mat4x4B(dc,0,0,-100,c[0].img,r); - - //Map - GrBlot(dc,w-track_map->width,h-track_map->height,track_map); - - dc->thick=2; - for (i=0;i<CARS_NUM;i++) { - if (i) - dc->color=LTPURPLE; - else - dc->color=LTCYAN; - GrPlot3(dc,w-(c[i].p.x-t_minx)>>MAP_BITS, - h-track_map->height+(c[i].p.z-t_minz)>>MAP_BITS,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%% Time:%0.2f Best:%0.2f", - 100.0*distance/track_head.last->d,s,best_score); -} - -U0 AnimateTask(I64) -{ - Car *tmpc; - I64 i,x,z; - Bool on_track; - Track *tmpt,*tmpt2; - while (TRUE) { - if (!game_over) - Snd(12.0*Log2(c[0].speed/500+0.7)); - else - Snd; - for (i=0;i<CARS_NUM;i++) { - tmpc=&c[i]; - tmpc->p.x-=0.01*tmpc->speed*Cos(tmpc->é-ã/2); - tmpc->p.z+=0.01*tmpc->speed*Sin(tmpc->é-ã/2); - tmpt=TrackFind(tmpc->t,tmpc->p.x,tmpc->p.z); - if (i) { - if (tmpt!=tmpc->t) { - tmpt2=tmpt->next; - if (tmpt2==&track_head) - tmpt2=tmpt2->next; - tmpc->é=Arg(-tmpt2->z+tmpc->p.z,-tmpt2->x+tmpc->p.x); - } - } else { - tmpc->é+=0.01*tmpc->dé; - x=track_map->width-(tmpc->p.x-t_minx)>>MAP_BITS; - z=(tmpc->p.z-t_minz)>>MAP_BITS; - if (GrPeek(track_map,x,z)!=YELLOW) { - on_track=FALSE; - tmpc->speed-=0.01*tmpc->speed; - if (tmpc->speed<0) tmpc->speed=0; - } else - on_track=TRUE; - } - tmpc->t=tmpt; - tmpc->p.y=DipY(tmpc->p.x,tmpc->p.z); - } - if (!game_over && on_track) { - for (i=1;i<CARS_NUM;i++) - if (D3I32DistSqr(&c[i].p,&c[0].p)<CAR_LENGTH>>1*CAR_LENGTH>>1) { - game_over=TRUE; - Noise(500,22,34); - Sleep(500); - break; - } - if (!game_over) { - distance+=0.01*c[0].speed; - if (distance>track_head.last->d&& c[0].t->num<track_head.last->num>>1) { - tf=tS; - game_over=TRUE; - Beep; - if (tf-t0<best_score) { - best_score=tf-t0; - Beep; - } - } - } - } - Sleep(10); - } -} - -U8 *imgs[8]={$IB,"<1>",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 InitBushes() -{ - Bush *tmpb; - I64 i,j,x,z; - track_map->color=LTGREEN; - track_map->thick=1; - for (i=0;i<BUSHES_NUM;i++) { - tmpb=&b[i]; - -ib_restart: - tmpb->p.x=Rand*(t_maxx-t_minx)+t_minx; - tmpb->p.z=Rand*(t_maxz-t_minz)+t_minz; - x=track_map->width-(tmpb->p.x-t_minx)>>MAP_BITS; - z=(tmpb->p.z-t_minz)>>MAP_BITS; - for (j=0;j<8;j++) - if (GrPeek(track_map,x+gr_x_offsets[j],z+gr_y_offsets[j])!=LTGRAY) - goto ib_restart; - - GrPlot(track_map,x,z); - tmpb->p.y=DipY(tmpb->p.x,tmpb->p.z); - tmpb->sym=RandU16&1; - tmpb->img=imgs[i&7]; - } -} - - -U0 Init() -{ - Car *tmpc; - Track *tmpt; - F64 d; - I64 i; - - InitTrack; - InitBushes; - tmpt=track_head.next; - for (i=0;i<CARS_NUM;i++) { - tmpc=&c[i]; - tmpc->t=tmpt; - tmpc->p.x=tmpt->x; - tmpc->p.z=tmpt->z; - tmpc->p.y=DipY(tmpc->p.x,tmpc->p.z); - tmpc->é =-tmpt->é; - tmpc->dé=0; - if (!i) { - tmpc->img=$IB,"<5>",BI=5$; - tmpc->speed=0; - } else { - tmpc->img=$IB,"<6>",BI=6$; - tmpc->speed=2500.0; - } - d=(i+1)*track_head.last->d/CARS_NUM; - while (tmpt->next!=&track_head && tmpt->d<d) - tmpt=tmpt->next; - } - distance=0; - tf=0; - t0=tS; - game_over=FALSE; -} - -U0 CleanUp() -{ - while (mp_not_done_flags) - Yield; - QueDel(&track_head,TRUE); - DCDel(track_map); -} - -U0 Varoom() -{ - I64 sc; - MenuPush( - "File {" - " Abort(,CH_SHIFT_ESC);" - " Exit(,CH_ESC);" - "}" - "Play {" - " Restart(,'\n');" - " Accelerator(,,SC_CURSOR_UP);" - " Brake(,,SC_CURSOR_DOWN);" - " Left(,,SC_CURSOR_LEFT);" - " Right(,,SC_CURSOR_RIGHT);" - "}" - ); - SettingsPush; //See $LK,"SettingsPush",A="MN:SettingsPush"$ - try { - Fs->text_attr=YELLOW<<4+BLUE; - Fs->win_inhibit=WIG_TASK_DFT-WIF_SELF_FOCUS - -WIF_SELF_GRAB_SCROLL-WIF_FOCUS_TASK_MENU; - AutoComplete; - WinBorder; - WinMax; - DocCursor; - DocClear; - Init; - Fs->draw_it=&DrawIt; - Fs->animate_task=Spawn(&AnimateTask,NULL,"Animate",,Fs); - while (TRUE) - switch (GetKey(&sc)) { - case 0: - switch (sc.u8[0]) { - case SC_CURSOR_LEFT: - c[0].dé-=ã/60; - break; - case SC_CURSOR_RIGHT: - c[0].dé+=ã/60; - break; - case SC_CURSOR_UP: - c[0].speed+=300; - break; - case SC_CURSOR_DOWN: - c[0].speed-=900; - if (c[0].speed<0) c[0].speed=0; - break; - } - break; - case '\n': - CleanUp; - Init; - break; - case CH_SHIFT_ESC: - case CH_ESC: - goto vr_done; - } -vr_done: //Don't goto out of try - } catch - PutExcept; - SettingsPop; - CleanUp; - MenuPop; - RegWrite("TempleOS/Varoom","F64 best_score=%5.4f;\n",best_score); -} - -Varoom; - - - -þÿÿÿîÿÿÿúÿÿÿèÿÿÿ - - - - - - - - - - - -úÿÿÿðÿÿÿúÿÿÿäÿÿÿ -æÿÿÿöÿÿÿ -ìÿÿÿ - - - - - -äÿÿÿúÿÿÿäÿÿÿúÿÿÿ -æÿÿÿüÿÿÿæÿÿÿüÿÿÿ -îÿÿÿúÿÿÿ -" - - - - - - - - - - - - - - - - - - - - -úÿÿÿÄÿÿÿøÿÿÿúÿÿÿ -üÿÿÿÂÿÿÿ -úÿÿÿÄÿÿÿæÿÿÿ¤ÿÿÿ -üÿÿÿÂÿÿÿäÿÿÿ¤ÿÿÿ -øÿÿÿ¼ÿÿÿúÿÿÿ†ÿÿÿ - -þÿÿÿºÿÿÿ - - - - - - - - - -þÿÿÿ`ÿÿÿìÿÿÿ„ÿÿÿ -ìÿÿÿ„ÿÿÿöÿÿÿ¬ÿÿÿ -öÿÿÿ¬ÿÿÿâÿÿÿžÿÿÿ -âÿÿÿžÿÿÿØÿÿÿ¨ÿÿÿ -Øÿÿÿ¨ÿÿÿîÿÿÿºÿÿÿ -îÿÿÿºÿÿÿòÿÿÿºÿÿÿ -ôÿÿÿ¸ÿÿÿúÿÿÿ¸ÿÿÿ - - - -þÿÿÿŽÿÿÿþÿÿÿjÿÿÿ -þÿÿÿjÿÿÿôÿÿÿ‚ÿÿÿ -ôÿÿÿ‚ÿÿÿøÿÿÿœÿÿÿ -ôÿÿÿ´ÿÿÿîÿÿÿ¦ÿÿÿ -èÿÿÿ²ÿÿÿÞÿÿÿ¦ÿÿÿ - - -øÿÿÿ€ÿÿÿ - -þÿÿÿ~ÿÿÿ - - - -öÿÿÿ²ÿÿÿðÿÿÿ‚ÿÿÿ -ðÿÿÿ‚ÿÿÿúÿÿÿjÿÿÿ -êÿÿÿ´ÿÿÿÞÿÿÿ ÿÿÿ - - - - |