//Set snap to 4 and width to 4 //if you edit this map. //Don't forget to change the //starting pos. $BG,0$ $SP,"map",1$ $SP,"hero",2$ $SP,"hero_attack",3$ $SP,"template",4$ //This is a template you can copy and use to make a tile. //WHITE is the transparent color. $SP,"tree",5$ $SP,"path",6$ $SP,"water1",7$ $SP,"water2",8$ $SP,"goblin",9$ $SP,"wall1",10$ $SP,"wall2",11$ $BG$ //These are indexed by color #. //See $LK,"COLORS","MN:RED"$. U8 *tiles1[16]= {NULL,$IB,"<7>",7$ ,$IB,"<5>",5$ ,NULL, $IB,"<6>",6$ ,NULL,NULL,NULL, NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL}; U8 *tiles2[16]= {NULL,$IB,"<8>",8$ ,$IB,"<5>",5$ ,NULL, $IB,"<6>",6$ ,NULL,NULL,NULL, NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL}; #define SCREEN_SCALE 24 #define SCREEN_WIDTH 24 #define SCREEN_HEIGHT 24 I64 screen_x,screen_y; #define MAP_SCALE 4 I64 map_width,map_height; U8 *map=NULL; I64 man_x,man_y,man_dx,man_dy; Bool man_attack; F64 man_attack_t0; #define NUM_MONSTERS 16 class Monster { I64 x,y,dx,dy; Bool dead,pad[7]; } monsters[NUM_MONSTERS]; #define LOS_SCALE 4 Bool LOSPlot(U8 *,I64 x,I64 y,I64) { if (!map[(y/LOS_SCALE)*map_width+(x/LOS_SCALE)]) return FALSE; else return TRUE; } Bool LOS(I64 x1,I64 y1,I64 x2,I64 y2) { //Line of sight return Line(NULL,x1*LOS_SCALE+LOS_SCALE/2,y1*LOS_SCALE+LOS_SCALE/2,0, x2*LOS_SCALE+LOS_SCALE/2,y2*LOS_SCALE+LOS_SCALE/2,0,&LOSPlot); } U0 DrawIt(CTask *task,CDC *dc) { CDC *dc_t=DCAlias(gr_dc,task); I64 i,x,y,xx,yy,x1,y1,z1,color; CD3I32 poly[4]; U8 **_tiles; task->text_attr=BLACK<<4; if (Blink(5,tP(task))) _tiles=tiles1; else _tiles=tiles2; GrRotXEqu(dc_t->r,60*2*ã/360); GrRotZEqu(dc_t->r,15*2*ã/360); GrSetRotMat(dc_t,dc_t->r); dc_t->x=task->win_pixel_width/2; dc_t->y=task->win_pixel_height/2; dc_t->flags|=DCF_TRANSFORMATION; //You could make it much more efficient //if you did it like $LK,"::/SparrowOS/Demo/GameStarters/BigGuns.CPP.Z","FI:::/SparrowOS/Demo/GameStarters/BigGuns.CPP.Z"$ //with a $LK,"CDC","MN:CDC"$. for (y=-SCREEN_HEIGHT/2;ycolor=color; GrFillPoly3(dc_t,4,poly); } } } } } dc_t->color=LTGRAY; for (x=-SCREEN_WIDTH/2;x<=SCREEN_WIDTH/2;x++) GrLine3(dc_t,x*SCREEN_SCALE,-SCREEN_HEIGHT/2*SCREEN_SCALE,0,x*SCREEN_SCALE,SCREEN_HEIGHT/2*SCREEN_SCALE-1,0); for (y=-SCREEN_HEIGHT/2;y<=SCREEN_HEIGHT/2;y++) GrLine3(dc_t,-SCREEN_WIDTH/2*SCREEN_SCALE,y*SCREEN_SCALE,0,SCREEN_WIDTH/2*SCREEN_SCALE,y*SCREEN_SCALE-1,0); for (y=-SCREEN_HEIGHT/2;y",10$); } if (xx+1",11$); } } } } } for (i=0;iflags|=DCF_SYMMETRY|DCF_JUST_MIRROR; GrSetSymmetry(dc,x1,y1,x1,y1+1); } else dc->flags&=~(DCF_SYMMETRY|DCF_JUST_MIRROR); CSpritePlot3(dc,x1,y1,z1,$IB,"<9>",9$); } x1=(man_x-screen_x)*SCREEN_SCALE+SCREEN_SCALE/2; y1=(man_y-screen_y)*SCREEN_SCALE+SCREEN_SCALE/2; z1=0; if (tP(task)-man_attack_t0<0.2) { x1+=Tri(tP(task)-man_attack_t0,0.2)*SCREEN_SCALE*man_dx; y1+=Tri(tP(task)-man_attack_t0,0.2)*SCREEN_SCALE*man_dy; } GrTransform(dc_t,&x1,&y1,&z1); if (man_dx<0) { dc->flags|=DCF_SYMMETRY|DCF_JUST_MIRROR; GrSetSymmetry(dc,x1,y1,x1,y1+1); } else dc->flags&=~(DCF_SYMMETRY|DCF_JUST_MIRROR); if (tP(task)-man_attack_t0<0.2) CSpritePlot3(dc,x1,y1,z1,$IB,"<3>",3$); else CSpritePlot3(dc,x1,y1,z1,$IB,"<2>",2$); DCDel(dc_t); } U0 Attack() { I64 i; man_attack_t0=tP; Noise(100,300,1000); for (i=0;i",1$,&minx,&maxx,&miny,&maxy); map_width =(maxx-minx+1)/MAP_SCALE; map_height=(maxy-miny+1)/MAP_SCALE; Free(map); map=MAlloc(map_width*map_height*sizeof(U8)); dc=DCNew(DCT_COLOR8,map_width*MAP_SCALE,map_height*MAP_SCALE); CSpritePlot3(dc,-minx,-miny,0,$IB,"<1>",1$); for (y=0;yanimate_task=Spawn(&AnimateTask,NULL,"Animate",Fs); DocCursor; DocClear; Fs->draw_it=&DrawIt; try { while (TRUE) { switch (GetMsg(&ch,&sc,1<SCREEN_WIDTH/2-3) { screen_x+=SCREEN_WIDTH/2; if (screen_x+SCREEN_WIDTH/2>map_width) screen_x=map_width-SCREEN_WIDTH/2; } } break; case SC_CURSOR_LEFT: if (man_attack) { man_dx=-1; man_dy=0; Attack; } else if (man_x-1>=0 && map[man_y*map_width+(man_x-1)]==RED) { man_x--; if (man_x-screen_x<-SCREEN_WIDTH/2+3) { screen_x-=SCREEN_WIDTH/2; if (screen_x-SCREEN_WIDTH/2<0) screen_x=SCREEN_WIDTH/2; } } break; case SC_CURSOR_UP: if (man_attack) { man_dx=0; man_dy=-1; Attack; } else if (man_y-1>=0 && map[(man_y-1)*map_width+man_x]==RED) { man_y--; if (man_y-screen_y<-SCREEN_HEIGHT/2+3) { screen_y-=SCREEN_HEIGHT/2; if (screen_y-SCREEN_HEIGHT/2<0) screen_y=SCREEN_HEIGHT/2; } } break; case SC_CURSOR_DOWN: if (man_attack) { man_dx=0; man_dy=1; Attack; } else if (man_y+1SCREEN_HEIGHT/2-3) { screen_y+=SCREEN_HEIGHT/2; if (screen_y+SCREEN_HEIGHT/2>map_height) screen_y=map_height-SCREEN_HEIGHT/2; } } break; } } break; case MSG_KEY_UP: if (ch==CH_SPACE) man_attack=FALSE; break; } } dg_done: GetMsg(,,1<