/* move.c for PUZZ Martin Round. January 1990 */ unsigned char work [MAXACROSS] [MAXDOWN]; int scorex,scorey,scoreapen,scorebpen; extern char line[MAXLINE]; extern int sqrsacross,sqrsdown; extern unsigned char goal [MAXACROSS] [MAXDOWN]; extern unsigned char grid [MAXACROSS] [MAXDOWN]; extern unsigned char movelist [MAXPIECES] [4]; extern int topleftx,toplefty; extern int sqrwidth,sqrheight; extern int slide; extern int moves; extern int dmapwidth,dmapheight; extern int audio; extern struct RastPort *dbuff; extern void play_note(int,int); void off () /* turn off any sounds currently playing */ { if (audio) { play_note (100,0); play_note (100,1); play_note (100,2); play_note (100,3); } } void tune() { if (audio) { off(); play_note (48,0); play_note (48,1); Delay (16); off(); Delay (8); play_note (43,2); Delay (8); play_note (42,3); play_note (100,2); Delay (8); play_note (43,2); play_note (100,3); Delay (8); play_note (45,3); play_note (100,2); Delay (24); play_note (43,2); play_note (100,3); Delay (24); off(); Delay (16); play_note (47,0); play_note (47,1); Delay (16); off(); Delay (16); play_note (48,0); play_note (48,1); play_note (52,2); play_note (52,3); Delay (16); off(); } } void movesquare(rp,x,y,width,height,dx,dy) struct RastPort *rp; int x,y,width,height,dx,dy; { ClipBlit ( rp,topleftx + x,toplefty + y, /* source posn */ dbuff,x+dx,y+dy, /* dest posn */ width,height, /* size */ 0xc0 /* direct copy */ ); } int canmove(int piece, int direction) /* returns 0 if it can't */ { int i,j,old; for (j=0; j 4) move -=4; /* opposite direction of move */ for (i=0; i<3; i++) if (move == movelist [piece] [i]) { while (i < 3) { movelist [piece] [i] = movelist [piece] [i+1]; i++; } movelist [piece] [3] = move; /* last in new list */ return; } } int suggestmove(int piece) /* 1 left, 2 up, 3 right, 4 down, 0 can't */ { int i,move; for (i=0; i<4; i++) /* look through move list */ { if (canmove(piece,(move = movelist [piece] [i]))) { sortlist (piece,move); return (move); } } return (0); } void moveonepiece(struct RastPort *rp,int piece,int direction) { int i,j,finished; /* prepare double buffer */ ClipBlit ( rp,topleftx,toplefty, /* source posn */ dbuff,0,0, /* dest posn */ dmapwidth,dmapheight, /* size */ 0xc0 /* direct copy */ ); for (j=0; j zy) { for (i=zy+1; i zx) { for (i=zx+1; i zy) { for (i=zy+1; i<=y; i++) if ((grid [x] [i]) && (piece != grid [x] [i])) { if (canmove(piece = grid [x] [i],direction)) { if (flag) { flag = 0; updatescore(rp); } moveonepiece(rp,piece,direction); } else return; } } else { for (i=zy-1; i>=y; i--) if ((grid [x] [i]) && (piece != grid [x] [i])) { if (canmove(piece = grid [x] [i],direction)) { if (flag) { flag = 0; updatescore(rp); } moveonepiece(rp,piece,direction); } else return; } } } else { if (x > zx) { for (i=zx+1; i<=x; i++) if ((grid [i] [y]) && (piece != grid [i] [y])) { if (canmove(piece = grid [i] [y],direction)) { if (flag) { flag = 0; updatescore(rp); } moveonepiece(rp,piece,direction); } else return; } } else { for (i=zx-1; i>=x; i--) if ((grid [i] [y]) && (piece != grid [i] [y])) { if (canmove(piece = grid [i] [y],direction)) { if (flag) { flag = 0; updatescore(rp); } moveonepiece(rp,piece,direction); } else return; } } } } void clicked(struct RastPort *rp,int xclick,int yclick) { int x,y,piece; if ((xclick= sqrsacross) return; if ((y = ((yclick-toplefty)/sqrheight)) >= sqrsdown) return; if ((piece = grid [x] [y]) == 0) return; if (piece == 255) return; if (slide == 2) { if (movepiece(rp,piece) == 0) slidepieces(rp,piece); } else movepiece(rp,piece); if (audio) play_note(100,0); }