TempleOSCDV4.10.ISO

This commit is contained in:
Terry A. Davis authored and minexew committed 2018-09-08 21:47:44 +02:00
1 parent c5954d3371
commit 9206246147
181 files changed
+4468 -4313

No files matched your search

Binary file not shown.
Binary file not shown.
+251 -270
View File
@@ -1,6 +1,6 @@
//Uses $LK,"fixed-point",A="FI:::/Demo/Lectures/FixedPoint.CPP"$.
RegSetDftEntry("TempleOS/EagleDive","I64 best_score=0;\n");
RegSetDftEntry("TempleOS/EagleDive","F64 best_score=9999;\n");
RegExeBranch("TempleOS/EagleDive");
//Keep these power of two so shift is used instead of multiply
@@ -34,15 +34,6 @@ RegExeBranch("TempleOS/EagleDive");
@@ -68,6 +59,12 @@ RegExeBranch("TempleOS/EagleDive");
@@ -94,44 +91,6 @@ RegExeBranch("TempleOS/EagleDive");
@@ -153,43 +112,6 @@ RegExeBranch("TempleOS/EagleDive");
@@ -281,24 +203,39 @@ class Panel
U16 update,num_sides;
CColorROPU32 color;
Obj *next_obj,*last_obj;
} *panel_root,*panels[MAP_HEIGHT][MAP_WIDTH];
} *panel_head,*panels[MAP_HEIGHT][MAP_WIDTH];
I64 critical_section_flag;
I16 elevations[MAP_HEIGHT][MAP_WIDTH];
CD3 normals[MAP_HEIGHT][MAP_WIDTH];
F64 game_t0,è,é1,é2,speed;
I64 strip_height,x,y,z,game_score;
Bool game_over;
class MPCtrl {
I64 init_not_done_flags,update_not_done_flags,app_not_done_flags;
I64 strip_width[MP_MAX_PROCESSORS];
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;
U0 WrapAngles()
{
è=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);
}
U0 EDTransform(CDC *dc,I64 *x,I64 *y,I64 *z)
{
I64 zz;
@@ -392,13 +329,13 @@ U0 MPDoPanels(CTask *task)
tempo=MAlloc(sizeof(Obj),task);
tempo->p.x=(i+w/2)*MAP_SCALE;
tempo->p.y=(j+h/2)*MAP_SCALE;
if (Rand<0.2) {
if (Rand<0.1) {
tempo->fish=FALSE;
if (RandI16&1)
tempo->img=$IB,"<2>",BI=2$; //Boat
else
tempo->img=$IB,"<3>",BI=3$; //Boat
tempo->p.z=(WATER_ELEVATION+1)*MAP_SCALE;
tempo->p.z=(WATER_ELEVATION+2)*MAP_SCALE;
} else {
tempo->fish=TRUE;
tempo->img=$IB,"<1>",BI=1$; //Fish
@@ -476,8 +413,8 @@ U0 MPDoPanels(CTask *task)
while (LBts(&critical_section_flag,0))
Yield;
if (end_ptr)
end_ptr->next=panel_root;
panel_root=start_ptr;
end_ptr->next=panel_head;
panel_head=start_ptr;
LBtr(&critical_section_flag,0);
}
LBtr(&mp.init_not_done_flags,Gs->num);
@@ -523,7 +460,7 @@ for each spot.
InitElevations;
MemSet(panels,0,sizeof(panels));
CalcNormals;
panel_root=NULL;
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);
@@ -674,9 +611,9 @@ U0 MPDrawIt(CTask *task,CDC *dc)
//World to screen coordinates
Mat4x4IdentEqu(dc->r);
Mat4x4RotZ(dc->r,é2);
Mat4x4RotZ(dc->r,heading);
Mat4x4RotX(dc->r,è);
Mat4x4RotZ(dc->r,é1);
Mat4x4RotZ(dc->r,roll);
DCMat4x4Set(dc,dc->r);
//Screen to world coordinates
@@ -687,9 +624,10 @@ U0 MPDrawIt(CTask *task,CDC *dc)
//y=mx+b and y=(-1/m)x+b are perpendicular.
s2w=Mat4x4IdentNew;
Mat4x4RotZ(s2w,-é1);
Mat4x4RotZ(s2w,-roll);
Mat4x4RotX(s2w,-è);
Mat4x4RotZ(s2w,-é2);
Mat4x4RotZ(s2w,-heading);
xh=0;
yh=0;
zh=-256;
@@ -827,88 +765,97 @@ U0 DrawHorizon(CDC *dc)
dc->depth_buf=NULL;
CColorROPU32 ground_color;
if (z/COORDINATE_SCALE<(WATER_ELEVATION+3)*MAP_SCALE)
ground_color=BLUE;
else
ground_color=LTGREEN;
Mat4x4IdentEqu(dc->r);
Mat4x4RotZ(dc->r,é2);
Mat4x4RotX(dc->r,è);
Mat4x4RotZ(dc->r,é1);
DCMat4x4Set(dc,dc->r);
dc->flags&=~DCF_TRANSFORMATION;
dc->transform=&EDTransform;
dc->x=cx;
dc->y=cy;
Mat4x4RotZ(s2w,-é1);
Mat4x4RotX(s2w,-è);
Mat4x4RotZ(s2w,-é2);
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 (-ã/2<=é1<ã/2 ^^ -ã/2<=Wrap(è-ã/2)<ã/2)
dc->color=LTCYAN;
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
dc->color=ground_color;
GrFillPoly3(dc,4,p);
p[0].y=dc->height-1;
p[1].y=dc->height-1;
if (-ã/2<=é1<ã/2 ^^ -ã/2<=Wrap(è-ã/2)<ã/2)
dc->color=ground_color;
else
dc->color=LTCYAN;
GrFillPoly3(dc,4,p);
} else {
if (y2<y1) {
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 (!y1 && y2==dc->height-1) {
if (!x1 && x2==dc->width-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 ^^ -ã/2<=é1<ã/2 ^^ -ã/2<=Wrap(è-ã/2)<ã/2)
dc->color=LTCYAN;
else
dc->color=ground_color;
GrFillPoly3(dc,4,p);
p[0].x=dc->width-1;
p[1].x=dc->width-1;
if (x1<x2 ^^ -ã/2<=é1<ã/2 ^^ -ã/2<=Wrap(è-ã/2)<ã/2)
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;
@@ -917,8 +864,8 @@ U0 DrawHorizon(CDC *dc)
U0 Core0EagleDive()
{
CDC *dc=DCAlias(main_dc,Fs);
I64 i,xx,yy,elev,height,bkcolor,cx=Fs->pix_width>>1,cy=Fs->pix_height>>1;
F64 min_strip_width,roll,pitch,heading;
I64 i,xx,yy,elev,height,cx=Fs->pix_width>>1,cy=Fs->pix_height>>1;
F64 min_strip_width,tt;
update_jiffy_limit=cnts.jiffies+JIFFY_FREQ/40;
@@ -930,28 +877,26 @@ U0 Core0EagleDive()
elev=MAX_I64;
height=z/COORDINATE_SCALE-elev;
if (height<0) {
if (elev>WATER_ELEVATION*MAP_SCALE) {
dc->color=bkcolor=BLACK;
if (!game_over) {
GrRect(dc,0,0,dc->width,dc->height);
music.mute=TRUE;
Beep;
game_over=TRUE;
music.mute=FALSE;
}
} else
bkcolor=BLUE;
} else
bkcolor=LTCYAN;
if (height<0 && elev>WATER_ELEVATION*MAP_SCALE && !game_tf) {
music.mute=TRUE;
Beep;
game_tf=tS;
music.mute=FALSE;
}
if (height>=0 && !(-ã/4<=Wrap(è-ã)<ã/4)) {
DrawHorizon(dc);
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);
while (mp.update_not_done_flags)
Sleep(1);
@@ -961,41 +906,36 @@ U0 Core0EagleDive()
strip_height=ClampI64(
strip_height*Clamp(0.25*min_strip_width/strip_height,0.9,1.1),
64,1024);
} else {
dc->color=bkcolor;
GrRect(dc,0,0,dc->width,dc->height);
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->pen_width=2;
if (bkcolor==BLUE)
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);
heading=Wrap(é2,0);
roll=é1;
pitch=Wrap(-è-ã/2,-ã);
if (Abs(pitch)>ã/2) {
pitch=Wrap(ã-pitch,-ã);
roll=Wrap(roll+ã,-ã);
heading=Wrap(heading+ã,0);
}
GrPrint(dc,0,0,"Roll:%5.1f Pitch:%5.1f Heading:%5.1f",
roll*180/ã,pitch*180/ã,heading*180/ã);
GrPrint(dc,0,FONT_HEIGHT,"Height:%5d Score:%d High:%d [Core Strip:%3d]",
height,game_score,best_score,strip_height);
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);
if (game_over && Blink) {
dc->color=RED;
GrPrint(dc,(Fs->pix_width-9*FONT_WIDTH)/2,
(Fs->pix_height-FONT_HEIGHT)/2,"Game Over");
} else if (tS-game_t0<5.0 && Blink) {
dc->color=WHITE;
GrPrint(dc,(Fs->pix_width-10*FONT_WIDTH)/2,
(Fs->pix_height-FONT_HEIGHT)/2,"Catch Fish");
}
//We made an alias of this we don't want freed.
//We made an alias of this we don't want freed.
dc->depth_buf=NULL;
DCDel(dc);
WinMgrSync;
@@ -1006,7 +946,7 @@ Obj *FishFind(I64 x1,I64 y1,I64 *_dd)
{
I64 dd,best_dd=MAX_I64;
Obj *res=NULL,*tempo;
Panel *tempp=panel_root;
Panel *tempp=panel_head;
while (tempp) {
tempo=tempp->next_obj;
while (tempo!=&tempp->next_obj) {
@@ -1030,17 +970,18 @@ Obj *FishFind(I64 x1,I64 y1,I64 *_dd)
U0 AnimateTask(I64)
{//Steadily moves the airplane fwd.
I64 *s2w,x1,y1,z1,dx,dy,dz,dd;
F64 t0=tS,mS,é,d,pitch;
F64 t0=tS,mS,é,d;
Obj *tempo;
while (TRUE) {
mS=1000*(tS-t0);
t0=tS;
if (!game_over) {
if (!game_tf) {
//Screen to world coordinates
s2w=Mat4x4IdentNew;
Mat4x4RotZ(s2w,-é1);
Mat4x4RotZ(s2w,-roll);
Mat4x4RotX(s2w,-è);
Mat4x4RotZ(s2w,-é2);
Mat4x4RotZ(s2w,-heading);
dx=0;dy=0;dz=1<<16;
Mat4x4MulXYZ(s2w,&dx,&dy,&dz);
x-=speed*mS*COORDINATE_SCALE*dx/1<<16;
@@ -1048,20 +989,20 @@ U0 AnimateTask(I64)
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;
pitch=Wrap(-è-ã/2,-ã);
if (Abs(pitch)>ã/2) {
pitch=Wrap(ã-pitch,-ã);
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 (tempo=FishFind(x1,y1,&dd)) {
if (rolled_over || !(tempo=FishFind(x1,y1,&dd)))
claws_down=0;
else {
d=Sqrt(dd);
x1-=tempo->p.x;
y1-=tempo->p.y;
@@ -1071,9 +1012,11 @@ U0 AnimateTask(I64)
else
claws_down=0.01;
if (d<MAP_SCALE*2) {
game_score++;
if (game_score>best_score)
best_score=game_score;
if (!--fish_left) {
game_tf=tS;
if (game_tf-game_t0<best_score)
best_score=game_tf-game_t0;
}
QueRem(tempo);
Free(tempo);
music.mute=TRUE;
@@ -1128,19 +1071,21 @@ U0 Init()
I64 i,xx,yy;
main_dc=DCNew(GR_WIDTH,GR_HEIGHT);
critical_section_flag=0;
game_over=FALSE;
game_score=0;
game_tf=0;
fish_left=10;
MemSet(&mp,0,sizeof(MPCtrl));
InitMap;
DCDepthBufAlloc(main_dc);
strip_height=128;
è =-90.0*ã/180.0;
é1 = 0.0*ã/180.0;
é2 = 0.0*ã/180.0;
speed = 2.5;
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;
@@ -1158,7 +1103,7 @@ U0 Init()
U0 CleanUp()
{
Panel *tempp=panel_root,*tempp1;
Panel *tempp=panel_head,*tempp1;
MPEnd;
while (tempp) {
tempp1=tempp->next;
@@ -1173,8 +1118,6 @@ U0 CleanUp()
U0 EagleDive()
{
I64 ch,sc;
F64 pp,tt1,tt2;
SettingsPush; //See $LK,"SettingsPush",A="MN:SettingsPush"$
MenuPush(
"File {"
@@ -1202,24 +1145,26 @@ U0 EagleDive()
try //in case <CTRL-ALT-c> is pressed.
do {
if (ScanKey(&ch,&sc)) {
pp=è; tt1=é1; tt2=é2;
switch (ch) {
case 0:
switch (sc.u8[0]) {
case SC_CURSOR_DOWN:
è +=-CTRLS_SCALE*Cos(tt1);
é2+=-CTRLS_SCALE*Sin(tt1)*Sin(è);
break;
case SC_CURSOR_UP:
è -=-CTRLS_SCALE*Cos(tt1);
é2-=-CTRLS_SCALE*Sin(tt1)*Sin(è);
break;
case SC_CURSOR_RIGHT:
é1+=CTRLS_SCALE;
break;
case SC_CURSOR_LEFT:
é1-=CTRLS_SCALE;
break;
start:
case SC_CURSOR_DOWN:
è-=CTRLS_SCALE*Cos(roll);
heading-=CTRLS_SCALE*Sin(roll)*Sin(è);
break;
case SC_CURSOR_UP:
è+=CTRLS_SCALE*Cos(roll);
heading+=CTRLS_SCALE*Sin(roll)*Sin(è);
break;
case SC_CURSOR_RIGHT:
roll+=CTRLS_SCALE;
break;
case SC_CURSOR_LEFT:
roll-=CTRLS_SCALE;
break;
end:
WrapAngles;
}
break;
case '\n':
@@ -1230,9 +1175,6 @@ U0 EagleDive()
Fs->draw_it=&DrawIt;
break;
}
é1=Wrap(é1);
è =Wrap(è);
é2=Wrap(é2);
} else
Core0EagleDive;
} while (ch!=CH_SHIFT_ESC && ch!=CH_ESC);
@@ -1240,7 +1182,7 @@ U0 EagleDive()
PutExcept;
SettingsPop;
CleanUp;
RegWriteBranch("TempleOS/EagleDive","I64 best_score=%d;\n",best_score);
RegWriteBranch("TempleOS/EagleDive","F64 best_score=%5.4f;\n",best_score);
MenuPop;
}
@@ -1253,17 +1195,56 @@ EagleDive;
&
 üÿÿÿ
üÿÿÿáÿÿÿ
á˙˙˙):_é˙˙˙ˇ‘˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Line truncated
>þÿÿ ÿÿÿw ÿÿÿXwá>þÿÿá>þÿÿ ÿÿÿjÿÿÿw ÿÿÿjÿÿÿXjÿÿÿwájÿÿÿ>þÿÿájÿÿÿ      %KK%µÿÿÿKÚÿÿÿµÿÿÿKÚÿÿÿKK%K%µÿÿÿÚÿÿÿµÿÿÿÚÿÿÿKÚÿÿÿÚÿÿÿp%Úÿÿÿp%%pÚÿÿÿ%pÚÿÿÿÚÿÿÿK%ÚÿÿÿK%%KÚÿÿÿ%K000000000 ␍0␍ 0
0␍ 0
0
0  0  0 0
0␍ 0␍ʰÿÿÿ8ÿÿÿ<8ÿÿÿȰÿÿÿÈPPȰÿÿÿÈ8ÿÿÿP8ÿÿÿ°ÿÿÿìÿÿÿÎÿÿÿÜÎÿÿÿÜ2ìÿÿÿÜ2Ü2Üìÿÿÿ2ÜÎÿÿÿÜÎÿÿÿìÿÿÿÜ    
á˙˙˙):_é˙˙˙ˇ‘˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Line truncated

  
    ␍ ␍   ␍    ‹
á>þÿÿáwX ÿÿÿw ÿÿÿ>þÿÿá>þÿÿjÿÿÿáwjÿÿÿXjÿÿÿ ÿÿÿwjÿÿÿ ÿÿÿ>þÿÿjÿÿÿ      µÿÿÿ%KK%KKÚÿÿÿKµÿÿÿÚÿÿÿKµÿÿÿ%K%KÚÿÿÿµÿÿÿÚÿÿÿ&Úÿÿÿp&%pÛÿÿÿ%pÛÿÿÿÚÿÿÿp&ÚÿÿÿK&%KÛÿÿÿ%KÛÿÿÿÚÿÿÿK000000000 ␍0␍ 0
0␍ 0
0
0  0  0 0
0␍ 0␍
    ␍ ␍   ␍    P
á>þÿÿÿÿÿáwÿÿÿXÿÿÿ ÿÿÿwÿÿÿ ÿÿÿ>þÿÿÿÿÿQ]ýÿÿQ2„®þÿÿ2®þÿÿ]ýÿÿ       öÿÿÿöÿÿÿ
öÿÿÿ
öÿÿÿ
öÿÿÿöÿÿÿÜ
öÿÿÿÜ
Üöÿÿÿ
Ü»þÿÿd000000000p¨ àÿÿÿàÿÿÿàÿÿÿ àÿÿÿÉàÿÿÿàÿÿÿÉ àÿÿÿ  Éàÿÿÿ É>àÿÿÿÉÁÿÿÿàÿÿÿÉ>àÿÿÿîÁÿÿÿàÿÿÿî> ÉÁÿÿÿ É> îÁÿÿÿ î]çÿÿÿDóÿÿÿ©p XW+L]ÏD Âp8qWDep%RW2Eƒv jƒp2wW>kƒƒEj�9ƒ}&j‰�¨␍vµƒ}?j‰3�¨&vµÁÿÿÿùÿÿÿ¨ÿÿÿ®ÿÿÿÁÿÿÿe•ÿÿÿÎÿÿÿeÁÿÿÿ¨ÿÿÿ ®ÿÿÿÚÿÿÿX•ÿÿÿçÿÿÿX®ÿÿÿÁÿÿÿe•ÿÿÿÎÿÿÿe¢ÿÿÿ•ÿÿÿ‰ÿÿÿ¢ÿÿÿ®ÿÿÿÚÿÿÿX•ÿÿÿçÿÿÿX¢ÿÿÿ®ÿÿÿ‰ÿÿÿ»ÿÿÿ¢ÿÿÿœÿÿÿ‰ÿÿÿ¨ÿÿÿœÿÿÿ‰ÿÿÿèƒÿÿÿ•ÿÿÿè¢ÿÿÿ¨ÿÿÿ‰ÿÿÿµÿÿÿœÿÿÿ•ÿÿÿÛƒÿÿÿ¢ÿÿÿÛ8çÿÿÿîóÿÿÿî2ÚÿÿÿŠ çÿÿÿŠ8 îî2Š Š2ÚÿÿÿŠ çÿÿÿŠ+Îÿÿÿ&Úÿÿÿ&2Š Š+óÿÿÿ&&+ÎÿÿÿÎÿÿÿ +ôÿÿÿùÿÿÿ+ôÿÿÿ+Îÿÿÿ,Îÿÿÿ, +ùÿÿÿ+íÿÿÿçÿÿÿîÇÿÿÿóÿÿÿáùÿÿÿùÿÿÿŠÔÿÿÿ}íÿÿÿ úÇÿÿÿîùÿÿÿ –Ôÿÿÿ+Šùÿÿÿùÿÿÿ�Ôÿÿÿùÿÿÿ„ùÿÿÿ,àÿÿÿùÿÿÿ ùÿÿÿ+�Ôÿÿÿ+„+,àÿÿÿ+ ùÿÿÿàÿÿÿWíÿÿÿdùÿÿÿ,àÿÿÿ,W,íÿÿÿd,000000000000 0 
0
0␍  0␍ 0  0 ␍ 0
 0 0
 0 
0 ␍ 0␍ 0 0 0 0 0 0 0 0 0 0 0 00000 0000 0000 0! "0"#!0%$&0&'%0! $0$%!0#"&0&'#0" $0$&"0#!%0%'# 0)(* 0*+) 0-,. 0./- 0)(, 0,-) 0+*. 0./+ 0*(, 0,.* 0+)- 0-/+010202310546067501040451032606730204046203150573098:0:;90=<>0>?=098<0<=90;:>0>?;0:8<0<>:0;9=0=?;0A@B0BCA0EDF0FGE0A@D0DEA0CBF0FGC0B@D0DFB0CAE0EGC0IHJ0JKI0MLN0NOM0IHL0LMI0KJN0NOK0JHL0LNJ0KIM0MOK0QPR0RSQ0UTV0VWU0QPT0TUQ0SRV0VWS0RPT0TVR0SQU0UWS0YXZ0Z[Y0]\^0^_]0YX\0\]Y0[Z^0^_[0ZX\0\^Z0[Y]0]_[0a`b0bca0edf0fge0a`d0dea0cbf0fgc0b`d0dfb0cae0egc0ihj0jki0mln0nom0ihl0lmi0kjn0nok0jhl0lnj0kim0mok!
>þÿÿàÿÿÿvàÿÿÿWÿÿÿvÿÿÿÿÿÿ>þÿÿÿÿÿÿÿÿ\ýÿÿP1Pƒ1®þÿÿ\ýÿÿ®þÿÿ      p¨~~ßÿÿÿ~Ê~ßÿÿÿÊ@@ßÿÿÿ@Ê@ßÿÿÿÊ~>Ê~ÁÿÿÿÊ~>î~Áÿÿÿî@>Ê@ÁÿÿÿÊ@>î@Áÿÿÿîw\jC©@pY3WM^\ÏQCÂ'prWf8pR,WEè‚ Üi,pw WkÜ‚EÏi9á‚'ÔiŽªuá‚@Ôi4Ž'ªueÁÿÿÿÂY¨ÿÿÿœ­ÿÿÿf�”ÿÿÿfLÁÿÿÿ@¨ÿÿÿƒ­ÿÿÿYw”ÿÿÿYœ­ÿÿÿf�”ÿÿÿfÉ¡ÿÿÿ½ˆÿÿÿƒ­ÿÿÿYw”ÿÿÿY°¡ÿÿÿ¤ˆÿÿÿ¡ÿÿÿµˆÿÿÿÖœÿÿÿéɃÿÿÿ鵡ÿÿÿ©ˆÿÿÿÉœÿÿÿܽƒÿÿÿÜw7õjõ�2‘ƒ ‘Q7éEéj2…^ …�2‘ƒ ‘©*-œ-j2…^ …ƒ*!w!©*␍©␍LïÿÿÿLøÿÿÿïÿÿÿ©*2©2LLøÿÿÿwìÿÿÿéjÆÿÿÿÜYøÿÿÿ…LÓÿÿÿxQìÿÿÿEÆÿÿÿõ3øÿÿÿž'Óÿÿÿ‘Yøÿÿÿ‘YÓÿÿÿ…Y-Yßÿÿÿ!'øÿÿÿ‘'Óÿÿÿ…'-'ßÿÿÿ!YLßÿÿÿúíìÿÿÿY-Lßÿÿÿ-ú-íìÿÿÿ- 

␍ ␍   ␍ 
 
  
 ␍␍    ! ""#!%$&&'%! $$%!#"&&'#" $$&"#!%%'#)(**+)-,../-)(,,-)+*../+*(,,.*+)--/+10223154667510445132667320446231557398::;9=<>>?=98<<=9;:>>?;:8<<>:;9==?;A@BBCAEDFFGEA@DDEACBFFGCB@DDFBCAEEGCIHJJKIMLNNOMIHLLMIKJNNOKJHLLNJKIMMOKQPRRSQUTVVWUQPTTUQSRVVWSRPTTVRSQUUWSYXZZ[Y]\^^_]YX\\]Y[Z^^_[ZX\\^Z[Y]]_[a`bbcaedffgea`ddeacbffgcb`ddfbcaeegcihjjkimlnnomihllmikjnnokjhllnjkimmokp¨Âþÿÿ >Âþÿÿàÿÿÿ>Âþÿÿ Âþÿÿàÿÿÿƒþÿÿ >ƒþÿÿàÿÿÿ>ƒþÿÿ ƒþÿÿàÿÿÿÂþÿÿ>ÂþÿÿÁÿÿÿÂþÿÿ>%ÂþÿÿÁÿÿÿ%ƒþÿÿ>ƒþÿÿÁÿÿÿƒþÿÿ>%ƒþÿÿÁÿÿÿ%»þÿÿ]í¯þÿÿDáƒþÿÿp�wþÿÿWƒ¢þÿÿ]–þÿÿDújþÿÿp¨^þÿÿWœ}þÿÿp‰pþÿÿW},þÿÿƒW þÿÿjKpþÿÿp¯dþÿÿW¢ þÿÿƒ}þÿÿjp%þÿÿƒ]þÿÿjQúýÿÿ�Díýÿÿv8%þÿÿƒvþÿÿjjúýÿÿ�]íýÿÿvQ©þÿÿÁÿÿÿúœþÿÿ¨ÿÿÿúáþÿÿ®ÿÿÿœÔþÿÿ•ÿÿÿœ�þÿÿÁÿÿÿíƒþÿÿ¨ÿÿÿíÈþÿÿ®ÿÿÿ�»þÿÿ•ÿÿÿ�áþÿÿ®ÿÿÿœÔþÿÿ•ÿÿÿœ␍ÿÿÿ¢ÿÿÿKÿÿÿ‰ÿÿÿKÈþÿÿ®ÿÿÿ�»þÿÿ•ÿÿÿ�ôþÿÿ¢ÿÿÿ>çþÿÿ‰ÿÿÿ>ÿÿÿ¢ÿÿÿKúþÿÿ‰ÿÿÿKÿÿÿœÿÿÿ ␍ÿÿÿƒÿÿÿ úþÿÿ¢ÿÿÿ>íþÿÿ‰ÿÿÿ>␍ÿÿÿœÿÿÿÿÿÿƒÿÿÿ¯þÿÿ8 –þÿÿ KþÿÿW 2þÿÿ2 ¯þÿÿ8>–þÿÿ>KþÿÿW>2þÿÿ2>KþÿÿW 2þÿÿ2 çýÿÿv ÎýÿÿQ KþÿÿW>2þÿÿ2>çýÿÿv>ÎýÿÿQ>»ýÿÿp»ýÿÿK»ýÿÿ�d»ýÿÿjpáýÿÿpáýÿÿKáýÿÿ�dáýÿÿjpœþÿÿíÿÿÿ ©þÿÿÇÿÿÿ 8þÿÿÔÿÿÿ Eþÿÿ®ÿÿÿ œþÿÿíÿÿÿ>©þÿÿÇÿÿÿ>8þÿÿÔÿÿÿ>Eþÿÿ®ÿÿÿ>8þÿÿÔÿÿÿ Eþÿÿ®ÿÿÿ Ôýÿÿ»ÿÿÿ áýÿÿ•ÿÿÿ 8þÿÿÔÿÿÿ>Eþÿÿ®ÿÿÿ>Ôýÿÿ»ÿÿÿ>áýÿÿ•ÿÿÿ>»ýÿÿÁÿÿÿ»ýÿÿœÿÿÿ»ýÿÿ¢ÿÿÿv»ýÿÿ|ÿÿÿ]áýÿÿÁÿÿÿáýÿÿœÿÿÿáýÿÿ¢ÿÿÿváýÿÿ|ÿÿÿ]000000000000 0 
0
0␍  0␍ 0  0 ␍ 0
 0 0
 0 
0 ␍ 0␍ 0 0 0 0 0 0 0 0 0 0 0 00000 0000 0000 0! "0"#!0%$&0&'%0! $0$%!0#"&0&'#0" $0$&"0#!%0%'# 0)(* 0*+) 0-,. 0./- 0)(, 0,-) 0+*. 0./+ 0*(, 0,.* 0+)- 0-/+010202310546067501040451032606730204046203150573098:0:;90=<>0>?=098<0<=90;:>0>?;0:8<0<>:0;9=0=?;
0A@B
0BCA
0EDF
0FGE
0A@D
0DEA
0CBF
0FGC
0B@D
0DFB
0CAE
0EGC0IHJ0JKI0MLN0NOM0IHL0LMI0KJN0NOK0JHL0LNJ0KIM0MOK0QPR0RSQ0UTV0VWU0QPT0TUQ0SRV0VWS0RPT0TVR0SQU0UWS
0YXZ
0Z[Y
0]\^
0^_]
0YX\
0\]Y
0[Z^
0^_[
0ZX\
0\^Z
0[Y]
0]_[0a`b0bca0edf0fge0a`d0dea0cbf0fgc0b`d0dfb0cae0egc0ihj0jki0mln0nom0ihl0lmi0kjn0nok0jhl0lnj0kim0mok
+38 -38
View File
@@ -46,14 +46,14 @@ class Obj
I32 torpedos,max_torpedos;
F64 torpedos_range;
U8 fire[(FIRE_WIDTH*FIRE_HEIGHT+7)/8];
} obj_root;
} obj_head;
class Torpedo
{
Torpedo *next,*last;
Obj *target;
F64 x,y,é,speed,timeout;
} torpedo_root;
} torpedo_head;
#define SA_PARKED 0
#define SA_LAUNCHING 1
@@ -96,9 +96,9 @@ Obj *ObjFind(F64 x,F64 y,
I64 flag_mask=OF_ACTIVE|OF_RETURNING,I64 flag_val=OF_ACTIVE,
I64 type_mask=-1,I64 player_mask=-1,F64 *_d=NULL)
{
Obj *tempo=obj_root.next,*best=NULL;
Obj *tempo=obj_head.next,*best=NULL;
F64 dd,best_dd=MAX_F64;
while (tempo!=&obj_root) {
while (tempo!=&obj_head) {
if (tempo->flags&flag_mask==flag_val &&
Bt(&type_mask,tempo->type)&&Bt(&player_mask,tempo->player)) {
dd=Sqr(tempo->x-x)+Sqr(tempo->y-y);
@@ -163,15 +163,15 @@ U0 DrawIt(CTask *task,CDC *dc)
Obj *tempo;
Torpedo *tempt;
tempt=torpedo_root.next;
while (tempt!=&torpedo_root) {
tempt=torpedo_head.next;
while (tempt!=&torpedo_head) {
dc->color=WHITE;
GrPlot(dc,tempt->x,tempt->y);
tempt=tempt->next;
}
tempo=obj_root.next;
while (tempo!=&obj_root) {
tempo=obj_head.next;
while (tempo!=&obj_head) {
if (tempo->flags&OF_ACTIVE && tempo->flags&OF_SHIP) {
SpriteZ3B(dc,tempo->x,tempo->y,0,
imgs[tempo->player][tempo->type],tempo->é+ã/2);
@@ -221,8 +221,8 @@ U0 DrawIt(CTask *task,CDC *dc)
tempo=tempo->next;
}
tempo=obj_root.next;
while (tempo!=&obj_root) {
tempo=obj_head.next;
while (tempo!=&obj_head) {
if (tempo->flags&OF_ACTIVE && !(tempo->flags&OF_SHIP))
SpriteZ3B(dc,tempo->x,tempo->y,0,
imgs[tempo->player][tempo->type],tempo->é+ã/2);
@@ -279,8 +279,8 @@ U0 Init()
w=Fs->pix_width,h=Fs->pix_height;
Squadron *temps;
Obj *tempo,*tempo1;
QueInit(&obj_root);
QueInit(&torpedo_root);
QueInit(&obj_head);
QueInit(&torpedo_head);
next_noise=tS;
Fs->scroll_x=0;
@@ -309,7 +309,7 @@ U0 Init()
tempo1->torpedos =tempo1->max_torpedos=0;
tempo1->torpedos_range =0.0;
tempo1->next_action_time=0;
QueIns(tempo1,obj_root.last);
QueIns(tempo1,obj_head.last);
}
for (ship=0;ship<num_carriers[player];ship++) {
@@ -330,7 +330,7 @@ U0 Init()
tempo1->torpedos =tempo1->max_torpedos=0;
tempo1->torpedos_range =0.0;
tempo1->next_action_time=0;
QueIns(tempo1,obj_root.last);
QueIns(tempo1,obj_head.last);
for (squadron=0;squadron<num_squadrons_per_carrier[player];
squadron++,num_squadrons++) {
@@ -349,7 +349,7 @@ U0 Init()
tempo->ship_guns=0; tempo->ship_guns_range=0.0;
tempo->torpedos =tempo->max_torpedos=1;
tempo->torpedos_range =20.0;
QueIns(tempo,obj_root.last);
QueIns(tempo,obj_head.last);
}
}
}
@@ -359,8 +359,8 @@ U0 Init()
temps->next_in_squadron=temps->last_in_squadron=temps;
temps->squadron=i;
}
tempo=obj_root.next;
while (tempo!=&obj_root) {
tempo=obj_head.next;
while (tempo!=&obj_head) {
if (tempo->squadron>=0) {
temps=&squadrons[tempo->squadron];
temps->host =tempo->host;
@@ -374,8 +374,8 @@ U0 Init()
U0 CleanUp()
{
QueDel(&obj_root,TRUE);
QueDel(&torpedo_root,TRUE);
QueDel(&obj_head,TRUE);
QueDel(&torpedo_head,TRUE);
Free(squadrons);
}
@@ -389,8 +389,8 @@ Obj *ObjLaunch(I64 player,I64 squadron=-1,
if (host && cur_time>host->next_action_time) {
if (é==MAX_F64)
é=Arg(x-host->x,y-host->y);
tempo=obj_root.next;
while (tempo!=&obj_root) {
tempo=obj_head.next;
while (tempo!=&obj_head) {
if (tempo->host==host && (squadron<0||tempo->squadron==squadron) &&
!(tempo->flags&OF_ACTIVE) &&
(tempo->squadron<0||squadrons[tempo->squadron].action==SA_PARKED||
@@ -564,8 +564,8 @@ U0 SquadronActions()
U0 AI(I64 player,F64 period)
{
Obj *tempo;
tempo=obj_root.next;
while (tempo!=&obj_root) {
tempo=obj_head.next;
while (tempo!=&obj_head) {
if (tempo->player==player) {
if (tempo->type==OT_CARRIER && Rand<5*period)
SquadronLaunch(player,tempo->x,tempo->y);
@@ -620,8 +620,8 @@ U0 Combat(F64 period)
F64 d;
Obj *tempo,*tempo1;
Torpedo *tempt;
tempo=obj_root.next;
while (tempo!=&obj_root) {
tempo=obj_head.next;
while (tempo!=&obj_head) {
tempo->flags&=~OF_SHOOTING;
if (tempo->flags&OF_ACTIVE &&
(tempo1=ObjFind(tempo->x,tempo->y,OF_ACTIVE,OF_ACTIVE,,
@@ -639,7 +639,7 @@ U0 Combat(F64 period)
tempo1->death_time=tempt->timeout=tS+d;
tempt->target=tempo1;
tempt->é=Arg(tempo1->x-tempo->x,tempo1->y-tempo->y);
QueIns(tempt,torpedo_root.last);
QueIns(tempt,torpedo_head.last);
Sweep(2000,2000,300);
} else if (tempo->ship_guns>0 && d<tempo->ship_guns_range) {
tempo->flags|=OF_SHOOTING;
@@ -670,8 +670,8 @@ U0 Combat(F64 period)
}
tempo=tempo->next;
}
tempo=obj_root.next;
while (tempo!=&obj_root) {
tempo=obj_head.next;
while (tempo!=&obj_head) {
tempo1=tempo->next;
if (tempo->type==OT_FIGHTER &&
(tempo->life_percent<=0.0 || tempo->flags&OF_ACTIVE &&
@@ -680,8 +680,8 @@ U0 Combat(F64 period)
ObjDel(tempo);
tempo=tempo1;
}
tempo=obj_root.next;
while (tempo!=&obj_root) {
tempo=obj_head.next;
while (tempo!=&obj_head) {
tempo1=tempo->next;
if (tempo->life_percent<=0.0)
ObjDel(tempo);
@@ -700,8 +700,8 @@ U0 AnimateTask(I64)
period=GAME_SPEED_SCALE*game_speed/ANIMATE_FREQ;
SquadronActions;
tempo=obj_root.next;
while (tempo!=&obj_root) {
tempo=obj_head.next;
while (tempo!=&obj_head) {
if (tempo->flags&OF_ACTIVE && tempo->fuel>0) {
if (tempo->dé) {
d=tempo->dé;
@@ -717,8 +717,8 @@ U0 AnimateTask(I64)
tempo=tempo->next;
}
tempt=torpedo_root.next;
while (tempt!=&torpedo_root) {
tempt=torpedo_head.next;
while (tempt!=&torpedo_head) {
tempt1=tempt->next;
if (tS>tempt->timeout) {
tempo=tempt->target;
@@ -736,8 +736,8 @@ U0 AnimateTask(I64)
tempt=tempt1;
}
tempo=obj_root.next;
while (tempo!=&obj_root) {
tempo=obj_head.next;
while (tempo!=&obj_head) {
if (tempo->host && !(tempo->flags&OF_ACTIVE)) {
tempo->x=tempo->host->x;
tempo->y=tempo->host->y;
@@ -745,8 +745,8 @@ U0 AnimateTask(I64)
tempo=tempo->next;
}
tempo=obj_root.next;
while (tempo!=&obj_root) {
tempo=obj_head.next;
while (tempo!=&obj_head) {
if (tempo->flags&OF_ACTIVE) {
if (tempo->host) {
d=Sqrt(Sqr(tempo->x-tempo->host->x)+Sqr(tempo->y-tempo->host->y));
+49 -95
View File
@@ -65,16 +65,14 @@ class Animal
#define WATERFALL_HEIGHT (MAP_HEIGHT/20)
#define WATERFALL_DROPS 512
#define WATERFALL_ACCELERATION 10
#define COURSE_LEN (MAP_HEIGHT*2)
I32 *r_x,*r_y,*r_width,*wfd_x;
I32 *r_x,*r_width,*wfd_x;
F64 *wfd_t0,waterfall_tf;
I64 river_lo,river_hi,waterfall_x,waterfall_y,waterfall_width;
I64 waterfall_x,waterfall_y,waterfall_width;
U0 RiverNew()
{
r_x=MAlloc(COURSE_LEN*sizeof(I32));
r_y=MAlloc(COURSE_LEN*sizeof(I32));
r_width=MAlloc(COURSE_LEN*sizeof(I32));
river_lo=river_hi=COURSE_LEN/2;
r_x=MAlloc(MAP_HEIGHT*sizeof(I32));
r_width=MAlloc(MAP_HEIGHT*sizeof(I32));
wfd_x=MAlloc(WATERFALL_DROPS*sizeof(I32));
wfd_t0=MAlloc(WATERFALL_DROPS*sizeof(F64));
waterfall_tf=Sqrt(2*WATERFALL_HEIGHT/WATERFALL_ACCELERATION);
@@ -82,89 +80,50 @@ U0 RiverNew()
U0 RiverMake()
{
I64 i,j,k,x,y,dx,dy,w,old_x,old_y;
//Plan lower course of river
old_x=-1;old_y=-1;
x=MAP_WIDTH<<32/2; y=(MAP_HEIGHT+WATERFALL_HEIGHT)<<32/2;
dx=0; dy=1<<32;
w=15<<32;
i=(COURSE_LEN+WATERFALL_HEIGHT)/2;
while (y.i32[1]<MAP_HEIGHT-MAP_BORDER && i<COURSE_LEN) {
if (old_x.i32[1]!=x.i32[1]||old_y.i32[1]!=y.i32[1]) {
r_x[i]=x.i32[1]; r_y[i]=y.i32[1]; r_width[i]=w.i32[1];
river_hi=i++;
old_x=x; old_y=y;
}
dx=ClampI64(dx+RandI32/64,-MAX_I32,MAX_I32)-MAX_I32/256;
dy=ClampI64(dy+RandI32/64,0,MAX_I32);
w=ClampI64(w+RandI32*2,10*MAX_U32,150*MAX_U32);
x+=dx; y+=dy;
}
//Plan waterfall
i=(COURSE_LEN-WATERFALL_HEIGHT)/2;
for (j=0;j<6;j++) {
x=MAP_WIDTH<<32/2; y=(MAP_HEIGHT-WATERFALL_HEIGHT)<<32/2;
for (k=0;k<WATERFALL_HEIGHT/4;k++) {
r_x[i]=x.i32[1]; r_y[i]=y.i32[1]; r_width[i]=15;
i++;
y+=6<<32;
I64 i,x=2*MAP_WIDTH<<32/3,y,dx=0,w=15<<32;
waterfall_y=(MAP_HEIGHT-WATERFALL_HEIGHT)/2*Rand+
(MAP_HEIGHT-WATERFALL_HEIGHT)/4;
for (y=MAP_BORDER;y<MAP_HEIGHT-MAP_BORDER;y++) {
r_x[y]=x.i32[1]; r_width[y]=w.i32[1];
if (waterfall_y-5<y<waterfall_y+WATERFALL_HEIGHT+5) {
waterfall_width=r_width[y];
waterfall_x=r_x[y]-waterfall_width/2;
} else {
dx=ClampI64(dx+RandI32/64,-MAX_I32,MAX_I32)-MAX_I32/256;
w=ClampI64(w+RandI32*2,10*MAX_U32,150*MAX_U32);
x+=dx;
}
}
waterfall_width=r_width[COURSE_LEN/2];
waterfall_x=r_x[COURSE_LEN/2]-waterfall_width/2;
waterfall_y=(MAP_HEIGHT-WATERFALL_HEIGHT)/2;
for (i=0;i<WATERFALL_DROPS;i++) {
wfd_x[i]=Rand*waterfall_width+waterfall_x;
wfd_t0[i]=tS-Rand*waterfall_tf;
}
//Plan upper course of river
old_x=-1;old_y=-1;
x=MAP_WIDTH<<32/2; y=(MAP_HEIGHT-WATERFALL_HEIGHT)<<32/2;
dx=0; dy=-1<<32;
w=15<<32;
i=(COURSE_LEN-WATERFALL_HEIGHT)/2-1;
while (y.i32[1]>=MAP_BORDER && i>=0) {
if (old_x.i32[1]!=x.i32[1]||old_y.i32[1]!=y.i32[1]) {
r_x[i]=x.i32[1]; r_y[i]=y.i32[1]; r_width[i]=w.i32[1];
river_lo=i--;
old_x=x; old_y=y;
}
dx=ClampI64(dx+RandI32/64,-MAX_I32,MAX_I32)+MAX_I32/256;
dy=ClampI64(dy+RandI32/64,-MAX_I32,0);
w=ClampI64(w+RandI32*2,10*MAX_U32,150*MAX_U32);
x+=dx; y+=dy;
}
//Plot waterfall cliff
Sprite3B(map_dc,waterfall_x,waterfall_y,0,$IB,"<10>",BI=10$);
//Plot sand bar
x=0; y=0;
for (i=river_lo;i<=river_hi;i++) {
if (!((MAP_HEIGHT-WATERFALL_HEIGHT)/2-9<r_y[i]<
(MAP_HEIGHT+WATERFALL_HEIGHT)/2+9)) {
x=0;
for (y=MAP_BORDER;y<MAP_HEIGHT-MAP_BORDER;y++) {
if (!(waterfall_y-9<y<waterfall_y+WATERFALL_HEIGHT+9)) {
map_dc->color=YELLOW;
map_dc->pen_width=r_width[i]+5;
GrPlot3(map_dc,r_x[i]+x.i32[1],r_y[i]+y.i32[1],0);
map_dc->pen_width=r_width[y]+10;
GrPlot3(map_dc,r_x[y]+x.i32[1],y,0);
}
x=ClampI64(x+RandI32,-6*MAX_U32,6*MAX_U32);
y=ClampI64(y+RandI32,-6*MAX_U32,6*MAX_U32);
}
//Plot water
for (i=river_lo;i<=river_hi;i++) {
for (y=MAP_BORDER;y<MAP_HEIGHT-MAP_BORDER;y++) {
map_dc->color=BLUE;
map_dc->pen_width=r_width[i];
GrPlot3(map_dc,r_x[i],r_y[i],0);
map_dc->pen_width=r_width[y];
GrPlot3(map_dc,r_x[y],y,0);
}
}
U0 RiverDel()
{
Free(r_x);
Free(r_y);
Free(r_width);
Free(wfd_x);
Free(wfd_t0);
@@ -174,16 +133,16 @@ U0 RiverDel()
class RiverDrop
{
RiverDrop *next,*last;
I64 idx,dx,dy;
} rd_root;
I64 y,dx,dy;
} rd_head;
Bool rd_lock;
U0 RiverDropsDel()
{
while (LBts(&rd_lock,0))
Yield;
QueDel(&rd_root,TRUE);
QueInit(&rd_root);
QueDel(&rd_head,TRUE);
QueInit(&rd_head);
LBtr(&rd_lock,0);
}
@@ -192,33 +151,32 @@ U0 RiverDropsNext(CTask *mem_task)
RiverDrop *tempr,*tempr1;
while (LBts(&rd_lock,0))
Yield;
tempr=rd_root.next;
while (tempr!=&rd_root) {
tempr=rd_head.next;
while (tempr!=&rd_head) {
tempr1=tempr->next;
if (++tempr->idx>river_hi) {
if (++tempr->y>=MAP_HEIGHT-MAP_BORDER) {
QueRem(tempr);
Free(tempr);
} else {
do {
if (RandU16&1 && GrPeek(map_dc,r_x[tempr->idx]+tempr->dx,
r_y[tempr->idx]+tempr->dy)==BLUE)
if (RandU16&1 && GrPeek(map_dc,r_x[tempr->y]+tempr->dx,
tempr->y+tempr->dy)==BLUE)
break;
tempr->dx=ClampI64(tempr->dx+RandU16%3-1,-r_width[tempr->idx]/2,
r_width[tempr->idx]/2);
tempr->dy=ClampI64(tempr->dy+RandU16%3-1,-r_width[tempr->idx]/2,
r_width[tempr->idx]/2);
} while (GrPeek(map_dc,r_x[tempr->idx]+tempr->dx,
r_y[tempr->idx]+tempr->dy)!=BLUE &&
GrPeek(map_dc,r_x[tempr->idx],
r_y[tempr->idx])==BLUE); //Might be reinitializing
tempr->dx=ClampI64(tempr->dx+RandU16%3-1,-r_width[tempr->y]/2,
r_width[tempr->y]/2);
tempr->dy=ClampI64(tempr->dy+RandU16%3-1,-r_width[tempr->y]/2,
r_width[tempr->y]/2);
} while (GrPeek(map_dc,r_x[tempr->y]+tempr->dx,
tempr->y+tempr->dy)!=BLUE &&
GrPeek(map_dc,r_x[tempr->y],tempr->y)==BLUE);//Might be reiniting
}
tempr=tempr1;
}
tempr=MAlloc(sizeof(RiverDrop),mem_task);
tempr->idx=river_lo;
tempr->y=MAP_BORDER;
tempr->dx=0;
tempr->dy=0;
QueIns(tempr,rd_root.last);
QueIns(tempr,rd_head.last);
LBtr(&rd_lock,0);
}
@@ -229,14 +187,10 @@ U0 RiverDropsDraw(CDC *dc,I64 cx,I64 cy)
RiverDrop *tempr;
while (LBts(&rd_lock,0))
Yield;
tempr=rd_root.next;
while (tempr!=&rd_root) {
if ((MAP_HEIGHT-WATERFALL_HEIGHT)/2<r_y[tempr->idx]
<(MAP_HEIGHT+WATERFALL_HEIGHT)/2)
dc->color=WHITE;
else
dc->color=LTBLUE;
GrPlot(dc,r_x[tempr->idx]+tempr->dx-cx,r_y[tempr->idx]+tempr->dy-cy);
tempr=rd_head.next;
dc->color=LTBLUE;
while (tempr!=&rd_head) {
GrPlot(dc,r_x[tempr->y]+tempr->dx-cx,tempr->y+tempr->dy-cy);
tempr=tempr->next;
}
LBtr(&rd_lock,0);
@@ -535,7 +489,7 @@ U0 ReInit()
GrBorder(map_dc,MAP_BORDER/2,MAP_BORDER/2,
MAP_WIDTH-(MAP_BORDER+1)/2,MAP_HEIGHT-(MAP_BORDER+1)/2);
for (i=river_lo;i<=river_hi;i++)
for (i=MAP_BORDER;i<=MAP_HEIGHT-MAP_BORDER;i++)
RiverDropsNext(Fs);
MemSet(a,0,NUM_ANIMALS*sizeof(Animal));
@@ -563,7 +517,7 @@ U0 Init()
{
RiverNew;
rd_lock=0;
QueInit(&rd_root);
QueInit(&rd_head);
map_dc=DCNew(MAP_WIDTH,MAP_HEIGHT);
a=MAlloc(NUM_ANIMALS*sizeof(Animal));
ReInit;
+1 -1
View File
@@ -18,7 +18,7 @@ U0 StadiumGen()
WinMgrSync(2,TRUE);
dc2=DCScreenCapture;
dc=DCExtract(dc2,0,FONT_HEIGHT,GR_WIDTH,GR_HEIGHT);
dc=DCExt(dc2,0,FONT_HEIGHT,GR_WIDTH,GR_HEIGHT);
DCDel(dc2);
GRAWrite("StadiumBG",dc,DCSF_COMPRESSED|DCSF_PALETTE_GET);
+23 -23
View File
@@ -109,7 +109,7 @@ class Track
I64 x,z;
F64 é,d;
CD3I32 left[4],center[4],right[4];
} track_root,
} track_head,
*track_start[MP_MAX_PROCESSORS],*track_end[MP_MAX_PROCESSORS];
CDC *track_map;
@@ -158,7 +158,7 @@ Track *TrackFind(Track *_tempt,I64 x,I64 z)
tempt=_tempt;
while (TRUE) {
tempt=tempt->next;
if (tempt==&track_root)
if (tempt==&track_head)
tempt=tempt->next;
dd=SqrI64(tempt->x-x)+SqrI64(tempt->z-z);
if (dd<best) {
@@ -170,7 +170,7 @@ Track *TrackFind(Track *_tempt,I64 x,I64 z)
tempt=_tempt;
while (TRUE) {
tempt=tempt->last;
if (tempt==&track_root)
if (tempt==&track_head)
tempt=tempt->last;
dd=SqrI64(tempt->x-x)+SqrI64(tempt->z-z);
if (dd<best) {
@@ -185,8 +185,8 @@ Track *TrackFind(Track *_tempt,I64 x,I64 z)
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 *tempt,*last=track_root.last;
if (last==&track_root)
Track *tempt,*last=track_head.last;
if (last==&track_head)
last=NULL;
tempt=CAlloc(sizeof(Track));
@@ -226,10 +226,10 @@ U0 TrackSlice(F64 *_x,F64 *_z,F64
tempt->x=x;
tempt->z=z;
tempt->é=é;
tempt->num=track_root.last->num+1;
tempt->d =track_root.last->d+d;
tempt->num=track_head.last->num+1;
tempt->d =track_head.last->d+d;
QueIns(tempt,track_root.last);
QueIns(tempt,track_head.last);
if (tempt->num&1)
tempt->c=RED;
@@ -254,7 +254,7 @@ U0 TrackSlice(F64 *_x,F64 *_z,F64
U0 CoupleEnds()
{
Track *first=track_root.next,*last=track_root.last;
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));
@@ -269,8 +269,8 @@ U0 InitTrack()
Track *tempt;
F64 x,z,é,d;
MemSet(&track_root,0,sizeof(Track));
QueInit(&track_root);
MemSet(&track_head,0,sizeof(Track));
QueInit(&track_head);
t_minx=t_minz=MAX_I64;
t_maxx=t_maxz=MIN_I64;
@@ -295,11 +295,11 @@ U0 InitTrack()
CoupleEnds;
tempt=track_root.next;
tempt=track_head.next;
for (i=0;i<mp_cnt;i++) {
j=(i+1)*track_root.last->num/mp_cnt+1;
j=(i+1)*track_head.last->num/mp_cnt+1;
track_start[i]=tempt;
while (tempt!=&track_root && tempt->num!=j)
while (tempt!=&track_head && tempt->num!=j)
tempt=tempt->next;
track_end[i]=tempt;
}
@@ -311,10 +311,10 @@ U0 InitTrack()
track_map->color=LTGRAY;
GrRect(track_map,0,0,track_map->width,track_map->height);
tempt=track_root.next;
tempt=track_head.next;
track_map->color=YELLOW;
track_map->pen_width=3;
while (tempt!=&track_root) {
while (tempt!=&track_head) {
GrPlot3(track_map,track_map->width-(tempt->x-t_minx)>>MAP_BITS,
(tempt->z-t_minz)>>MAP_BITS,0);
tempt=tempt->next;
@@ -498,7 +498,7 @@ U0 DrawIt(CTask *task,CDC *dc)
s=tS-t0;
dc->color=BLACK;
GrPrint(dc,0,0,"%0.1f%% Time:%0.2f Best:%0.2f",
100.0*distance/track_root.last->d,s,best_score);
100.0*distance/track_head.last->d,s,best_score);
}
U0 AnimateTask(I64)
@@ -520,7 +520,7 @@ U0 AnimateTask(I64)
if (i) {
if (tempt!=tempc->t) {
tempt2=tempt->next;
if (tempt2==&track_root)
if (tempt2==&track_head)
tempt2=tempt2->next;
tempc->é=Arg(-tempt2->z+tempc->p.z,-tempt2->x+tempc->p.x);
}
@@ -548,7 +548,7 @@ U0 AnimateTask(I64)
}
if (!game_over) {
distance+=0.01*c[0].speed;
if (distance>track_root.last->d&& c[0].t->num<track_root.last->num>>1) {
if (distance>track_head.last->d&& c[0].t->num<track_head.last->num>>1) {
tf=tS;
game_over=TRUE;
Beep;
@@ -601,7 +601,7 @@ U0 Init()
InitTrack;
InitBushes;
tempt=track_root.next;
tempt=track_head.next;
for (i=0;i<NUM_CARS;i++) {
tempc=&c[i];
tempc->t=tempt;
@@ -617,8 +617,8 @@ U0 Init()
tempc->img=$IB,"<6>",BI=6$;
tempc->speed=2500.0;
}
d=(i+1)*track_root.last->d/NUM_CARS;
while (tempt->next!=&track_root && tempt->d<d)
d=(i+1)*track_head.last->d/NUM_CARS;
while (tempt->next!=&track_head && tempt->d<d)
tempt=tempt->next;
}
distance=0;
@@ -631,7 +631,7 @@ U0 CleanUp()
{
while (mp_not_done_flags)
Yield;
QueDel(&track_root,TRUE);
QueDel(&track_head,TRUE);
DCDel(track_map);
}
+26 -26
View File
@@ -109,14 +109,14 @@ class Peasant
Peasant *next,*last;
F64 x,y,é,door_opened_t0;
Bool stopped;
} peasant_root;
} peasant_head;
class Step
{
Step *next,*last;
U16 x,y;
F64 t0;
} step_root,king_step_root;
} step_head,king_step_head;
U0 DrawIt(CTask *task,CDC *dc)
{
@@ -157,8 +157,8 @@ U0 DrawIt(CTask *task,CDC *dc)
}
}
tempst=step_root.next;
while (tempst!=&step_root) {
tempst=step_head.next;
while (tempst!=&step_head) {
if (tS-tempst->t0<2.0)
dc->color=DKGRAY;
else
@@ -171,8 +171,8 @@ U0 DrawIt(CTask *task,CDC *dc)
DCDepthBufAlloc(dc);
dc->flags|=DCF_TRANSFORMATION;
dc->pen_width=1;
tempp=peasant_root.next;
while (tempp!=&peasant_root) {
tempp=peasant_head.next;
while (tempp!=&peasant_head) {
Mat4x4IdentEqu(r);
Mat4x4RotY(r,tempp->é+ã/2);
Mat4x4RotX(r,ã/6);
@@ -230,7 +230,7 @@ U0 StepNew(CTask *task,I64 x,I64 y,F64
temps->x=x;
temps->y=y;
temps->t0=tS;
QueIns(temps,king_step_root.last);
QueIns(temps,king_step_head.last);
}
if (left_right) {
@@ -238,23 +238,23 @@ U0 StepNew(CTask *task,I64 x,I64 y,F64
temps->x=x-3.5*Sin(é)+2.0*Cos(é);
temps->y=y+3.5*Cos(é)+2.0*Sin(é);
temps->t0=tS;
QueIns(temps,step_root.last);
QueIns(temps,step_head.last);
temps=MAlloc(sizeof(Step),task);
temps->x=x-3.5*Sin(é)+5.0*Cos(é);
temps->y=y+3.5*Cos(é)+5.0*Sin(é);
temps->t0=tS;
QueIns(temps,step_root.last);
QueIns(temps,step_head.last);
} else {
temps=MAlloc(sizeof(Step),task);
temps->x=x+3.5*Sin(é)+0.0*Cos(é);
temps->y=y-3.5*Cos(é)+0.0*Sin(é);
temps->t0=tS;
QueIns(temps,step_root.last);
QueIns(temps,step_head.last);
temps=MAlloc(sizeof(Step),task);
temps->x=x+3.5*Sin(é)+3.0*Cos(é);
temps->y=y-3.5*Cos(é)+3.0*Sin(é);
temps->t0=tS;
QueIns(temps,step_root.last);
QueIns(temps,step_head.last);
}
}
@@ -275,11 +275,11 @@ U0 Init()
trees[i].fire_frame_idx=0;
}
QueInit(&step_root);
QueInit(&king_step_root);
QueInit(&step_head);
QueInit(&king_step_head);
SpriteExtents($IB,"<12>",BI=12$,&min_x,&max_x,&min_y,&max_y);
QueInit(&peasant_root);
QueInit(&peasant_head);
for (i=0;i<NUM_PEASANTS;i++) {
tempp=MAlloc(sizeof(Peasant));
tempp->x=RandU16%(w-2*BORDER-(max_x-min_x+1))+BORDER-min_x;
@@ -287,7 +287,7 @@ U0 Init()
tempp->é=ã*2*Rand;
tempp->door_opened_t0=0;
tempp->stopped=FALSE;
QueIns(tempp,peasant_root.last);
QueIns(tempp,peasant_head.last);
}
animate_phase=0;
animate_mS=0;
@@ -305,16 +305,16 @@ U0 Init()
U0 CleanUp()
{
DCDel(snow_tile);
QueDel(&peasant_root,TRUE);
QueDel(&step_root,TRUE);
QueDel(&king_step_root,TRUE);
QueDel(&peasant_head,TRUE);
QueDel(&step_head,TRUE);
QueDel(&king_step_head,TRUE);
}
U0 Follow(CTask *,Peasant *tempp)
{
Step *temps=king_step_root.next;
Step *temps=king_step_head.next;
F64 d,best_d=MAX_F64;
while (temps!=&king_step_root) {
while (temps!=&king_step_head) {
if ((d=Sqr(temps->x-tempp->x)+Sqr(temps->y-tempp->y)) &&
d<15*15) {
d+=1000*Sqr(tS-temps->t0);
@@ -336,8 +336,8 @@ U0 AnimateTask(I64)
w=Fs->parent_task->pix_width;
h=Fs->parent_task->pix_height;
temps=step_root.next;
while (temps!=&step_root) {
temps=step_head.next;
while (temps!=&step_head) {
temps1=temps->next;
if (tS-temps->t0>5.0) {
QueRem(temps);
@@ -346,8 +346,8 @@ U0 AnimateTask(I64)
temps=temps1;
}
temps=king_step_root.next;
while (temps!=&king_step_root) {
temps=king_step_head.next;
while (temps!=&king_step_head) {
temps1=temps->next;
if (tS-temps->t0>3.0) {
QueRem(temps);
@@ -357,8 +357,8 @@ U0 AnimateTask(I64)
}
not_stopped_cnt=0;
tempp=peasant_root.next;
while (tempp!=&peasant_root) {
tempp=peasant_head.next;
while (tempp!=&peasant_head) {
if (tempp->stopped) {
if (tempp->door_opened_t0 && tS>tempp->door_opened_t0+1.0) {
tempp->door_opened_t0=0;
Binary file not shown.