' 'PowerWars. Game concept, graphics and programming by D.Shelley. 'Play testing, helpful hints: My dad, (Steven) and Kevin Morgan. 'The screen structure finding routine was based on information found by 'study of the demo programs on the extras disk. 'This program needs to LOAD a `picarray' image (an image stored in an array) 'and it has to POKE it onto the screen. 'Use of the Basic command PUT and library routines has been eliminated, so 'this program can be compiled with "CURSOR V1.1 by Jürgen Forster", as found 'on the November 1990 Amiga Computing coverdisk. 'compiler directive: OPTION NOWINDOW OPTION NOPCRELATIVE CLEAR ,50000& SCREEN 1,320,256,5,1:DEFINT a-z WINDOW 3,"PowerWars By D.Shelley, 1991",,24,1 DIM BPlane&(4),ship%(78,13),PicArray%(12) DIM b(8,8),c(8,8),p(6,2),m(11,2),nm$(6),v(6),t(500,1),ep(15),cp(15) tMax=500 flash=2:GOSUB LoadPalette:PRINT "Loading. Please wait." 'if you change volume names, etc,(as you probably will), change following 'File$= statements then recompile with cursor (v1.1) File$="PowerWars:PowerWars/ship.multi":GOSUB LoadPic File$="PowerWars:PowerWars/title.picarray":GOSUB LoadPicarray RestartLine: ' epMax=15:cpMax=15 'limit of arrays which store locations of pieces 'when the computer checks for them. Alter if you add more/less pieces ' ERASE ep:ERASE cp:DIM ep(epMax),cp(cpMax) RANDOMIZE TIMER:gamewon=0 RESTORE GOSUB ReadData:GOSUB PlayerSetUp:CLS Xp=8:Yp=11:GOSUB PutPicarray:GOSUB DrawBoard:NoSelected=0 play=1:CALL PrintMessage(play1$,""):MessageFlag$=play1$ IF play1$<>" Computer 1 " OR play2$<>"Computer 2 " THEN COLOR 1,4:LINE (297,57)-(307,97),1,bf:LINE (295,55)-(305,95),4,bf LOCATE 8,38:PRINT "S":LOCATE 9,38:PRINT "E":LOCATE 10,38:PRINT "T" LOCATE 11,38:PRINT "U":LOCATE 12,38:PRINT "P" LINE (295,55)-(305,95),5,b:COLOR 1,2:LINE (297,137)-(307,193),1,bf LINE (295,135)-(305,191),2,bf LOCATE 18,38:PRINT "R":LOCATE 19,38:PRINT "E":LOCATE 20,38:PRINT "S" LOCATE 21,38:PRINT "T":LOCATE 22,38:PRINT "A":LOCATE 23,38:PRINT "R" LOCATE 24,38:PRINT "T":LINE (295,135)-(305,191),5,b:COLOR 1,0 ELSE LINE (297,49)-(307,178),1,bf:LINE (295,47)-(305,176),5,bf COLOR 1,5:LOCATE 7,38:PRINT "S":LOCATE 8,38:PRINT "P":LOCATE 9,38:PRINT "A" LOCATE 10,38:PRINT "C":LOCATE 11,38:PRINT "E":LOCATE 13,38:PRINT "T" LOCATE 14,38:PRINT "O":LOCATE 16,38:PRINT "R":LOCATE 17,38:PRINT "E" LOCATE 18,38:PRINT "S":LOCATE 19,38:PRINT "T":LOCATE 20,38:PRINT "A" LOCATE 21,38:PRINT "R":LOCATE 22,38:PRINT "T":COLOR 1,0 LINE (295,47)-(305,176),2,b END IF Main: IF WINDOW(7)=0 THEN END IF gamewon<>0 THEN GOTO ItIsOver IF INKEY$=" " THEN a$="":CALL Ask("Lose game and restart?",a$,1) WINDOW OUTPUT 3:IF a$="Y" THEN GOTO RestartLine END IF IF UCASE$(INKEY$)="S" THEN a$="":CALL Ask("Go to setup?",a$,1) WINDOW OUTPUT 3:IF a$="Y" THEN GOSUB SetUp END IF button=MOUSE(0):X=MOUSE(1):Y=MOUSE(2) IF button<>0 THEN IF X>294 AND X<306 THEN IF Y>54 AND Y<96 THEN a$="":CALL Ask("Go to setup?",a$,1) WINDOW OUTPUT 3:IF a$="Y" THEN GOSUB SetUp ELSEIF Y>134 AND Y<192 THEN a$="":CALL Ask("Lose game and restart?",a$,1) WINDOW OUTPUT 3:IF a$="Y" THEN GOTO RestartLine END IF END IF END IF IF play=1 THEN IF play1$=" Computer 1 " THEN CALL PrintMessage(play1$,"**Thinking**") GOSUB Computer1 END IF ELSE IF play2$="Computer 2 " THEN CALL PrintMessage(play2$,"*Thinking*") GOSUB Computer2 END IF END IF WHILE MOUSE(0)<>0:WEND:X=MOUSE(1):Y=MOUSE(2) IF NoSelected=1 THEN LINE (boardX*32+3,boardY*25+16)-(boardX*32+34,boardY*25+40),12,b IF X>3 AND X<291 AND Y>16 AND Y<241 THEN bX=(X-3)\32:bY=(Y-16)\25 ship=b(bX,bY) IF ship=0 OR ship=8 THEN IF play=1 THEN message$=play1$ ELSE message$=play2$ IF MessageFlag$<>message$ THEN CALL PrintMessage(message$,"") MessageFlag$=message$ ELSE IF ship>0 THEN ship=ship-1 ELSE ship=ABS(ship)-1 message1$=nm$(ship) message2$=STR$(p(ship,0))+" "+STR$(p(ship,1))+" "+STR$(p(ship,2)) IF MessageFlag$<>message1$ THEN CALL PrintMessage(message1$,message2$) MessageFlag$=message1$ END IF IF NoSelected=0 THEN IF play=1 AND (b(bX,bY)>0 AND b(bX,bY)<8) THEN FOR L=6 TO 10 LINE (bX*32+3,bY*25+16)-(bX*32+34,bY*25+41),L,b NEXT END IF IF play=-1 AND (b(bX,bY)<0 AND b(bX,bY)>-8) THEN FOR L=6 TO 10 LINE (bX*32+3,bY*25+16)-(bX*32+34,bY*25+41),L,b NEXT END IF ELSE ship=b(boardX,boardY):IF ship>0 THEN ship=ship-1 ELSE ship=ABS(ship)-1 Move=p(ship,2)-1:sm=10*(boardY+1)+boardX+1:em=10*(bY+1)+bX+1 flag=0 ThePreCheck: IF NOT((boardX<2 AND bX>6) OR (boardX>6 AND bX<2)) THEN FOR L=0 TO 11 IF sm+m(L,Move)=em THEN flag=1 NEXT END IF IF flag=0 THEN Move=Move-1:IF Move>-1 THEN GOTO ThePreCheck ELSE FOR L=12 TO 15 LINE (bX*32+3,bY*25+16)-(bX*32+34,bY*25+41),L,b NEXT END IF END IF LINE (bX*32+3,bY*25+16)-(bX*32+34,bY*25+41),23,b IF button<>0 THEN GOSUB Mousey END IF GOTO Main END Mousey: IF NoSelected=0 THEN IF play=1 THEN IF b(bX,bY)<1 OR b(bX,bY)=8 THEN message$="Not your":message2$="Piece!" CALL PrintMessage(message$,message2$) RETURN END IF ELSE IF b(bX,bY)>-1 THEN message$="Not your":message2$="Piece!" CALL PrintMessage(message$,message2$) RETURN END IF END IF boardX=bX:boardY=bY:NoSelected=1 LINE (bX*32+3,bY*25+16)-(bX*32+34,bY*25+40),12,b LINE (bX*32+4,bY*25+17)-(bX*32+33,bY*25+39),13,b RETURN END IF IF bX=boardX AND bY=boardY THEN NoSelected=0 LINE (bX*32+3,bY*25+16)-(bX*32+34,bY*25+40),23,b LINE (bX*32+4,bY*25+17)-(bX*32+33,bY*25+39),3+(c(bX,bY)),b IF play=1 THEN message$=play1$ ELSE message$=play2$ CALL PrintMessage(message$,"") RETURN END IF endX=bX:endY=bY MoveCheck: ship=b(boardX,boardY):IF ship>0 THEN ship=ship-1 ELSE ship=ABS(ship)-1 Move=p(ship,2)-1 sm=10*(boardY+1)+boardX+1 em=10*(endY+1)+endX+1 flag=0 TheCheck: IF NOT((boardX<2 AND endX>6) OR (boardX>6 AND endX<2)) THEN FOR L=0 TO 11 IF sm+m(L,Move)=em THEN flag=1 NEXT END IF IF flag=0 THEN Move=Move-1 IF Move<0 THEN CALL PrintMessage("Illegal","Move"):RETURN GOTO TheCheck END IF IF b(endX,endY)<>0 THEN IF b(endX,endY)=8 THEN Hyper: count=0:message$="Hyper-":message2$="space!" CALL PrintMessage(message$,message2$) HyperLoop: count=count+1:endX=INT(RND*9):endY=INT(RND*9) IF count>100 THEN endX=boardX:endY=boardY:GOTO ReDraw IF b(endX,endY)<>0 THEN GOTO HyperLoop GOTO ReDraw END IF IF play=1 THEN IF b(endX,endY)>0 THEN message$="Illegal":message2$="Move." CALL PrintMessage(message$,message2$) RETURN END IF ELSE IF b(endX,endY)<0 THEN message$="Illegal":message2$="Move." CALL PrintMessage(message$,message2$) RETURN END IF END IF GOSUB fight ELSE ReDraw: b(endX,endY)=b(boardX,boardY):b(boardX,boardY)=0 IF play=1 THEN IF endX=8 THEN IF b(endX,endY)=2 THEN b(endX,endY)=4 IF b(endX,endY)=3 THEN b(endX,endY)=1 END IF ELSE IF endX=0 THEN IF b(endX,endY)=-2 THEN b(endX,endY)=-4 IF b(endX,endY)=-3 THEN b(endX,endY)=-1 END IF END IF X1=boardX*32+3:Y1=boardY*25+16:X2=endX*32+3:Y2=endY*25+16 LINE(X1,Y1)-(X1+31,Y1+24),23,b:LINE(X2,Y2)-(X2+31,Y1+24),23,b LINE(X1+1,Y1+1)-(X1+30,Y1+23),3+(c(boardX,boardY)),bf LINE(X1+4,Y1+3)-(X1+27,Y1+21),1,bf:ship=b(endX,endY) IF ship=1 OR ship=-1 THEN c(endX,endY)=c(endX,endY)+ship IF c(endX,endY)<-2 THEN c(endX,endY)=-2 IF c(endX,endY)>2 THEN c(endX,endY)=2 LINE(X2+1,Y2+1)-(X2+30,Y2+23),3+(c(endX,endY)),bf LINE(X2+4,Y2+3)-(X2+27,Y2+21),1,bf END IF IF ship>0 THEN ship=ship-1 ELSE ship=ABS(ship)+6 IF ship<14 THEN Xp=X2+13:Yp=Y2+16:pic=ship:GOSUB PutPic play=-play IF play=1 THEN message$=play1$ ELSE message$=play2$ CALL PrintMessage(message$,"") NoSelected=0 END IF RETURN fight: CALL PrintMessage("Fight!","Fight!") ship1=b(boardX,boardY) ship2=b(endX,endY) sqcol=c(endX,endY) IF ship1>0 THEN ship1=ship1-1 ELSE ship1=ABS(ship1)-1 IF ship2>0 THEN ship2=ship2-1 ELSE ship2=ABS(ship2)-1 f1=p(ship1,0):s1=p(ship1,1) f2=p(ship2,0):s2=p(ship2,1) IF play=1 THEN IF sqcol>0 THEN f1=f1+sqcol ELSE s2=s2-sqcol ELSE IF sqcol<0 THEN f1=f1-sqcol ELSE s2=s2+sqcol END IF WINDOW 4,"A fight!",(35,100)-(265,172),2,1 COLOR 1:PRINT nm$(ship1);" v ";nm$(ship2) COLOR 2:PRINT "Attributes: Force shield" COLOR 6:PRINT "Ship 1:";:COLOR 4:LOCATE ,15:PRINT f1;:LOCATE ,22:PRINT s1 COLOR 6:PRINT "Ship 2:";:COLOR 5:LOCATE ,15:PRINT f2;:LOCATE ,22:PRINT s2 IF f1>s2 THEN COLOR 2:PRINT "Ship 1 wins!":win=1 ELSEIF f1=s2 THEN IF f1>f2 THEN win=1:COLOR 2:PRINT "Ship 1 wins!" ELSEIF f2=f1 THEN COLOR 3:PRINT "Forces are evenly matched!" rand!=RND(1) IF rand!>.5 THEN win=0:COLOR 1:PRINT "It's a draw!" ELSE win=3:COLOR 5:PRINT "Both ships are destroyed!" END IF ELSE COLOR 4:PRINT "Ship 2 wins!":win=2 END IF ELSE COLOR 4:PRINT "Ship 2 wins!":win=2 END IF ReDraw2: IF win=1 THEN IF ship2=6 THEN gamewon=play END IF IF ship2=5 THEN PRINT "PowerSource loses shield." GOSUB mouseclick IF play=1 THEN b(endX,endY)=-7 ELSE b(endX,endY)=7 X1=boardX*32+3:Y1=boardY*25+16:X2=endX*32+3:Y2=endY*25+16 c(boardX,boardY)=c(boardX,boardY)+play IF c(boardX,boardY)<-2 THEN c(boardX,boardY)=-2 IF c(boardX,boardY)>2 THEN c(boardX,boardY)=2 LINE (X1,Y1)-(X1+31,Y1+24),23,b LINE(X1+1,Y1+1)-(X1+30,Y1+23),3+(c(boardX,boardY)),bf LINE(X1+4,Y1+3)-(X1+27,Y1+21),1,bf:ship=b(boardX,boardY) IF ship>0 THEN ship=ship-1 ELSE ship=ABS(ship)+6 IF ship<14 THEN Xp=X1+13:Yp=Y1+16:pic=ship:GOSUB PutPic ship=b(endX,endY) IF ship>0 THEN ship=ship-1 ELSE ship=ABS(ship)+6 IF ship<14 THEN Xp=X2+13:Yp=Y2+16:pic=ship:GOSUB PutPic ELSE GOSUB mouseclick X2=endX*32+3:Y2=endY*25+16 c(endX,endY)=c(endX,endY)+play IF c(endX,endY)<-2 THEN c(endX,endY)=-2 IF c(endX,endY)>2 THEN c(endX,endY)=2 LINE(X2+1,Y2+1)-(X2+30,Y2+23),3+(c(endX,endY)),bf LINE(X2+4,Y2+3)-(X2+27,Y2+21),1,bf GOTO ReDraw END IF ELSEIF win=2 THEN IF ship1=6 THEN gamewon=-play END IF IF ship1=5 THEN PRINT "PowerSource loses shield." GOSUB mouseclick IF play=1 THEN b(boardX,boardY)=7 ELSE b(boardX,boardY)=-7 X1=boardX*32+3:Y1=boardY*25+16:X2=endX*32+3:Y2=endY*25+16 c(endX,endY)=c(endX,endY)-play IF c(endX,endY)<-2 THEN c(endX,endY)=-2 IF c(endX,endY)>2 THEN c(endX,endY)=2 LINE (X1,Y1)-(X1+31,Y1+24),23,b LINE(X1+1,Y1+1)-(X1+30,Y1+23),3+(c(boardX,boardY)),bf LINE(X1+4,Y1+3)-(X1+27,Y1+21),1,bf:ship=b(boardX,boardY) IF ship>0 THEN ship=ship-1 ELSE ship=ABS(ship)+6 IF ship<14 THEN Xp=X1+13:Yp=Y1+16:pic=ship:GOSUB PutPic ship=b(endX,endY) IF ship>0 THEN ship=ship-1 ELSE ship=ABS(ship)+6 IF ship<14 THEN Xp=X2+13:Yp=Y2+16:pic=ship:GOSUB PutPic ELSE GOSUB mouseclick IF play=-1 THEN IF boardX=8 THEN IF b(boardX,boardY)=2 THEN b(boardX,boardY)=4 IF b(boardX,boardY)=3 THEN b(boardX,boardY)=1 END IF ELSE IF boardX=0 THEN IF b(boardX,boardY)=-2 THEN b(boardX,boardY)=-4 IF b(boardX,boardY)=-3 THEN b(boardX,boardY)=-1 END IF END IF b(boardX,boardY)=b(endX,endY):b(endX,endY)=0 X1=boardX*32+3:Y1=boardY*25+16:X2=endX*32+3:Y2=endY*25+16 c(boardX,boardY)=c(boardX,boardY)-play IF c(boardX,boardY)<-2 THEN c(boardX,boardY)=-2 IF c(boardX,boardY)>2 THEN c(boardX,boardY)=2 LINE (X1,Y1)-(X1+31,Y1+24),23,b LINE(X1+1,Y1+1)-(X1+30,Y1+23),3+(c(boardX,boardY)),bf LINE(X1+4,Y1+3)-(X1+27,Y1+21),1,bf LINE(X2,Y2)-(X2+31,Y2+24),23,b LINE(X2+1,Y2+1)-(X2+30,Y2+23),3+(c(endX,endY)),bf LINE(X2+4,Y2+3)-(X2+27,Y2+21),1,bf:ship=b(boardX,boardY) IF ship>0 THEN ship=ship-1 ELSE ship=ABS(ship)+6 IF ship<14 THEN Xp=X1+13:Yp=Y1+16:pic=ship:GOSUB PutPic END IF ELSEIF win=3 THEN IF ship1=5 AND ship2=5 THEN PRINT "PowerSources lose shields." GOSUB mouseclick IF play=1 THEN b(boardX,boardY)=7 ELSE b(boardX,boardY)=-7 IF play=1 THEN b(endX,endY)=-7 ELSE b(endX,endY)=7 X1=boardX*32+3:Y1=boardY*25+16:X2=endX*32+3:Y2=endY*25+16 LINE (X1,Y1)-(X1+31,Y1+24),23,b LINE (X1+1,Y1+1)-(X1+30,Y1+23),3+(c(boardX,boardY)),bf LINE (X1+4,Y1+3)-(X1+27,Y1+21),1,bf ship=b(boardX,boardY) IF ship>0 THEN ship=ship-1 ELSE ship=ABS(ship)+6 IF ship<14 THEN Xp=X1+13:Yp=Y1+16:pic=ship:GOSUB PutPic ship=b(endX,endY) IF ship>0 THEN ship=ship-1 ELSE ship=ABS(ship)+6 IF ship<14 THEN Xp=X2+13:Yp=Y2+16:pic=ship:GOSUB PutPic ELSE GOSUB mouseclick ship=b(boardX,boardY) IF ship<>7 AND ship<>-7 THEN b(boardX,boardY)=0 ship=b(endX,endY) IF ship<>7 AND ship<>-7 THEN b(endX,endY)=0 X1=boardX*32+3:Y1=boardY*25+16:X2=endX*32+3:Y2=endY*25+16 LINE (X1,Y1)-(X1+31,Y1+24),23,b LINE (X1+1,Y1+1)-(X1+30,Y1+23),3+(c(boardX,boardY)),bf LINE (X1+4,Y1+3)-(X1+27,Y1+21),1,bf LINE(X2,Y2)-(X2+31,Y2+24),23,b LINE(X2+1,Y2+1)-(X2+30,Y2+23),3+(c(endX,endY)),bf LINE(X2+4,Y2+3)-(X2+27,Y2+21),1,bf ship=b(boardX,boardY) IF ship<>0 THEN IF ship>0 THEN ship=ship-1 ELSE ship=ABS(ship)+6 IF ship<14 THEN Xp=X1+13:Yp=Y1+16:pic=ship:GOSUB PutPic END IF ship=b(endX,endY) IF ship<>0 THEN IF ship>0 THEN ship=ship-1 ELSE ship=ABS(ship)+6 IF ship<14 THEN Xp=X2+13:Yp=Y2+16:pic=ship:GOSUB PutPic END IF END IF ELSEIF win=0 THEN GOSUB mouseclick X1=boardX*32+3:Y1=boardY*25+16:X2=endX*32+3:Y2=endY*25+16 LINE (X1,Y1)-(X1+31,Y1+24),23,b LINE (X1+1,Y1+1)-(X1+30,Y1+23),3+(c(boardX,boardY)),bf LINE (X1+4,Y1+3)-(X1+27,Y1+21),1,bf LINE(X2,Y2)-(X2+31,Y2+24),23,b LINE(X2+1,Y2+1)-(X2+30,Y2+23),3+(c(endX,endY)),bf LINE(X2+4,Y2+3)-(X2+27,Y2+21),1,bf ship=b(boardX,boardY) IF ship>0 THEN ship=ship-1 ELSE ship=ABS(ship)+6 IF ship<14 THEN Xp=X1+13:Yp=Y1+16:pic=ship:GOSUB PutPic ship=b(endX,endY) IF ship>0 THEN ship=ship-1 ELSE ship=ABS(ship)+6 IF ship<14 THEN Xp=X2+13:Yp=Y2+16:pic=ship:GOSUB PutPic END IF play=-play IF play=1 THEN message$=play1$ ELSE message$=play2$ CALL PrintMessage(message$,""):NoSelected=0 RETURN mouseclick: IF play1$=" Computer 1 " AND play2$="Computer 2 " THEN FOR delay=0 TO 15000:NEXT ELSE PRINT "(Click)":WHILE MOUSE(0)=0:WEND END IF WINDOW CLOSE 4:WINDOW OUTPUT 3 RETURN Computer1: CanTake=0:CanTakePos=-1 GOSUB CheckTakeUs1:CALL PrintMessage(play1$," Thinking ") GOSUB MVTakeUs1:CALL PrintMessage(play1$,"**Thinking**") GOSUB CheckWeTake1:CALL PrintMessage(play1$," Thinking ") GOSUB MVTake1:CALL PrintMessage(play1$,"**Thinking**") ' 'what follows is computer one's actual `intelligence' ' IF MVShip>3 THEN IF MVTake>=MVShip THEN GOTO Take1 ELSE IF MVTake>0 AND RND>.5 THEN GOTO Take1 IF MVShip<3 AND RND>.5 THEN flag=0:rand!=RND:GOTO Move1 END IF IF MVShip>0 THEN GOTO MoveToSafety1 IF MVTake>0 AND RND>.8 THEN GOTO Take1 flag=0:rand!=RND:GOTO Move1 Take1: sm=t(MVTakePos,0)\100:em=t(MVTakePos,0) MOD 100 boardY=(sm\10)-1:boardX=(sm MOD 10)-1:endY=(em\10)-1:endX=(em MOD 10)-1 CALL PrintMessage("Let's","Fight!") CALL FlashSquare(boardX,boardY,flash):CALL FlashSquare(endX,endY,flash) GOTO fight 'fight will return us to Main, so why bother to do it ourselves? Move1: IF RND>.8 THEN RANDOMIZE TIMER boardX=-1:boardY=-1 IF rand!<.3 THEN FOR L=0 TO cpMax sm=cp(L) IF sm>10 THEN sX=(sm MOD 10)-1:sY=(sm\10)-1 IF b(sX,sY)=1 THEN boardX=sX:boardY=sY:L=cpMax END IF NEXT ELSEIF rand!<.6 THEN FOR L=0 TO cpMax sm=cp(L) IF sm>10 THEN sX=(sm MOD 10)-1:sY=(sm\10)-1 IF b(sX,sY)=4 THEN boardX=sX:boardY=sY:L=cpMax END IF NEXT ELSE count=0:GOSUB RndMove1:boardX=sX:boardY=sY END IF IF boardX=-1 THEN rand!=1:GOTO Move1 sm=10*(boardY+1)+boardX+1:ship=b(boardX,boardY)-1 Move=p(ship,2)-1:Move=INT(RND*(Move+1)) MoveChoose1: WHILE Move>-1 FOR L=0 TO ((Move+1)*4-1) em=sm+m(L,Move) IF em>10 AND em<100 THEN endX=(em MOD 10)-1:endY=(em\10)-1 IF endX>-1 AND endX<9 AND endY>-1 AND endY<9 THEN IF b(endX,endY)=0 OR b(endX,endY)=8 THEN IF NOT((boardX<2 AND endX>6) OR (boardX>6 AND endX<2)) THEN IF c(endX,endY)>0 THEN IF flag<0 THEN flag=2 ELSE IF ship=0 THEN flag=1 IF RND>.3 THEN flag=0 ELSE flag=1 END IF ELSE IF flag=0 THEN flag=1 ELSE flag=2 IF flag=1 AND ship=0 AND RND>.5 THEN flag=0 END IF IF flag=1 THEN GOSUB CheckMove1 'deselects flag if move unsafe END IF END IF END IF END IF IF flag=2 THEN L=11:Move=0 IF flag=1 THEN IF RND>.3 THEN L=11:Move=0 ELSE flag=0 END IF END IF NEXT Move=Move-1 WEND IF flag<1 THEN flag=flag-1 IF flag=-10 THEN CALL PrintMessage("The Computer","Gives up!") gamewon=-play:RETURN END IF rand!=RND:GOTO Move1 END IF ship=b(boardX,boardY) 'redraw neeeds this to be straight out of 'the array, not processed as it is above CALL FlashSquare(boardX,boardY,flash):CALL FlashSquare(endX,endY,flash) IF b(endX,endY)=8 THEN GOTO Hyper ELSE GOTO ReDraw MoveToSafety1: IF CanTake=1 THEN 'can we take the ship, instead of retreating? MVTakePos=CanTakePos GOTO Take1 END IF em=t(MVShipPos,1) MOD 100:sm=em 'em (endmove) because sm is the would-be attacker, em is us (the attacked) boardY=(em\10)-1:boardX=(em MOD 10)-1:ship=b(boardX,boardY) ship=ship-1:Move=p(ship,2)-1:flag=0:GOTO MoveChoose1 CheckWeTake1: tPos=0:cpPos=0 FOR lY=0 TO 8 FOR lX=0 TO 8 ship=b(lX,lY):IF ship<1 OR ship=8 THEN GOTO NxtlX1 ship=ship-1:Move=p(ship,2)-1:sm=10*(lY+1)+lX+1 cp(cpPos)=sm:cpPos=cpPos+1 WHILE Move>-1 FOR L=0 TO ((Move+1)*4-1) em=sm+m(L,Move) IF em>10 AND em<100 THEN eY=(em\10)-1:eX=(em MOD 10)-1 IF eX>-1 AND eX<9 AND eY>-1 AND eY<9 THEN IF NOT((lX<2 AND eX>6) OR (lX>6 AND eX<2)) THEN IF b(eX,eY)<0 THEN t(tPos,0)=sm*100+em:tPos=tPos+1:IF tPos>tMax THEN tPos=tMax END IF END IF END IF END IF NEXT Move=Move-1 WEND NxtlX1: NEXT lX NEXT lY t(tPos,0)=-1 IF cpPos<=cpMax THEN FOR L=cpPos TO cpMax cp(L)=-1 NEXT END IF RETURN MVTake1: MVTake=0:MVTakePos=0 IF tPos>0 THEN FOR L=0 TO tPos-1 IF t(L,0)=t(MVShipPos,1) THEN CanTake=1:CanTakePos=L em=t(L,0) MOD 100:eX=(em MOD 10)-1:eY=(em\10)-1 ship=b(eX,eY):ship=ABS(ship)-1 IF v(ship)>MVTake THEN sm=t(L,0)\100:sX=(sm MOD 10)-1:sY=(sm\10)-1 ship1=b(sX,sY)-1:sqcol=c(eX,eY) f1=p(ship1,0):s1=p(ship1,1):f2=p(ship,0):s2=p(ship,1) IF sqcol>0 THEN f1=f1+sqcol ELSE s2=s2-sqcol IF f1>s2 THEN win=1 ELSEIF f1=s2 THEN IF f1>f2 THEN win=1 ELSEIF f2=f1 THEN win=0 ELSE win=2 END IF ELSE win=2 END IF IF win<2 THEN MVTake=v(ship):MVTakePos=L END IF NEXT END IF RETURN CheckTakeUs1: tPos=0:epPos=0 FOR lY=0 TO 8 FOR lX=0 TO 8 ship=b(lX,lY):IF ship>-1 THEN GOTO NextlX1 ship=ABS(ship)-1:Move=p(ship,2)-1:sm=10*(lY+1)+lX+1 ep(epPos)=sm:epPos=epPos+1 WHILE Move>-1 FOR L=0 TO ((Move+1)*4-1) em=sm+m(L,Move) IF em>10 AND em<100 THEN eY=(em\10)-1:eX=(em MOD 10)-1 IF eX>-1 AND eX<9 AND eY>-1 AND eY<9 THEN IF NOT((lX<2 AND eX>6) OR (lX>6 AND eX<2)) THEN IF b(eX,eY)>0 AND b(eX,eY)<8 THEN t(tPos,1)=sm*100+em:tPos=tPos+1:IF tPos>tMax THEN tPos=tMax END IF END IF END IF END IF NEXT Move=Move-1 WEND NextlX1: NEXT lX NEXT lY t(tPos,1)=-1 IF epPos<=epMax THEN FOR L=epPos TO epMax ep(L)=-1 NEXT END IF RETURN MVTakeUs1: MVShip=0:MVShipPos=0 'Most Valuable Ship - now check for our best piece IF tPos>0 THEN FOR L=0 TO tPos-1 em=t(L,1) MOD 100:eX=(em MOD 10)-1:eY=(em\10)-1 ship=b(eX,eY):ship=ship-1 IF v(ship)>MVShip THEN sm=t(L,1)\100:sX=(sm MOD 10)-1:sY=(sm\10)-1 ship1=ABS(b(sX,sY))-1:sqcol=c(eX,eY) f1=p(ship1,0):s1=p(ship1,1):f2=p(ship,0):s2=p(ship,1) IF sqcol<0 THEN f1=f1-sqcol ELSE s2=s2+sqcol IF f1>s2 THEN win=1 ELSEIF f1=s2 THEN IF f1>f2 THEN win=1 ELSEIF f2=f1 THEN win=0 ELSE win=2 END IF ELSE win=2 END IF IF win<2 THEN MVShip=v(ship):MVShipPos=L END IF NEXT END IF RETURN CheckMove1: FOR CL=0 TO epMax Csm=ep(CL) IF Csm>10 AND Csm<100 THEN Csx=(Csm MOD 10)-1:Csy=(Csm\10)-1:Cship=b(Csx,Csy):Cship=ABS(Cship)-1 Cmove=p(Cship,2)-1 WHILE Cmove>-1 FOR CL2=0 TO ((Cmove+1)*4-1) Cem=Csm+m(CL2,Cmove) CeY=(Cem\10)-1:CeX=(Cem MOD 10)-1 IF CeX>-1 AND CeX<9 AND CeY>-1 AND CeY<9 THEN IF NOT((Csx<2 AND CeX>6) OR (Csx>6 AND CeX<2)) THEN IF Cem=em THEN Csqcol=c(CeX,CeY) f1=p(Cship,0):s1=p(Cship,1):f2=p(ship,0):s2=p(ship,1) IF Csqcol<0 THEN f1=f1-Csqcol ELSE s2=s2+Csqcol IF f1>s2 THEN win=1 ELSEIF f1=s2 THEN IF f1>f2 THEN win=1 ELSEIF f2=f1 THEN win=0 ELSE win=2 END IF ELSE win=2 END IF IF win<2 THEN flag=0:Cmove=-1:CL2=11:CL=epMax END IF END IF END IF NEXT Cmove=Cmove-1 WEND ELSE CL=epMax END IF NEXT RETURN RndMove1: count=count+1 cpPos=INT(RND*(cpMax+1)):sm=cp(cpPos) IF sm<11 THEN IF count<20 THEN GOTO RndMove2 cpPos=0:sm=cp(cpPos) END IF sX=(sm MOD 10)-1:sY=(sm\10)-1:count=0 RETURN Computer2: CanTake=0:CanTakePos=-1 GOSUB CheckTakeUs2:CALL PrintMessage(play2$," Thinking ") GOSUB MVTakeUs2:CALL PrintMessage(play2$,"*Thinking* ") GOSUB CheckWeTake2:CALL PrintMessage(play2$," Thinking ") GOSUB MVTake2:CALL PrintMessage(play2$,"*Thinking* ") ' 'what follows is computer two's actual `intelligence' ' IF MVShip>5 THEN IF MVTake>=MVShip THEN GOTO Take2 ELSE IF MVTake>0 AND RND>.2 THEN GOTO Take2 IF MVShip<2 AND RND>.5 THEN flag=0:rand!=RND:GOTO Move2 END IF IF MVShip>0 THEN GOTO MoveToSafety2 IF MVTake>0 AND RND>.3 THEN GOTO Take2 flag=0:rand!=RND:GOTO Move2 Take2: sm=t(MVTakePos,0)\100:em=t(MVTakePos,0) MOD 100 boardY=(sm\10)-1:boardX=(sm MOD 10)-1:endY=(em\10)-1:endX=(em MOD 10)-1 CALL PrintMessage("Let us","Fight!") CALL FlashSquare(boardX,boardY,flash):CALL FlashSquare(endX,endY,flash) GOTO fight 'fight will return us to Main, so why bother to do it ourselves? Move2: IF RND>.8 THEN RANDOMIZE TIMER boardX=-1:boardY=-1 IF rand!<.3 THEN FOR L=0 TO cpMax sm=cp(L) IF sm>10 THEN sX=(sm MOD 10)-1:sY=(sm\10)-1 IF b(sX,sY)=-1 THEN boardX=sX:boardY=sY:L=cpMax END IF NEXT ELSEIF rand!<.6 THEN FOR L=0 TO cpMax sm=cp(L) IF sm>10 THEN sX=(sm MOD 10)-1:sY=(sm\10)-1 IF b(sX,sY)=-4 THEN boardX=sX:boardY=sY:L=cpMax END IF NEXT ELSE count=0:GOSUB RndMove2:boardX=sX:boardY=sY END IF IF boardX=-1 THEN rand!=1:GOTO Move2 sm=10*(boardY+1)+boardX+1:ship=ABS(b(boardX,boardY))-1 Move=p(ship,2)-1:Move=INT(RND*(Move+1)) MoveChoose2: WHILE Move>-1 FOR L=0 TO ((Move+1)*4-1) em=sm+m(L,Move) IF em>10 AND em<100 THEN endX=(em MOD 10)-1:endY=(em\10)-1 IF endX>-1 AND endX<9 AND endY>-1 AND endY<9 THEN IF b(endX,endY)=0 OR b(endX,endY)=8 THEN IF NOT((boardX<2 AND endX>6) OR (boardX>6 AND endX<2)) THEN IF c(endX,endY)>0 THEN IF flag<0 THEN flag=2 ELSE IF ship=0 THEN flag=1 IF RND>.3 THEN flag=0 ELSE flag=1 END IF ELSE IF flag=0 THEN flag=1 ELSE flag=2 IF flag=1 AND ship=0 AND RND>.5 THEN flag=0 END IF IF flag=1 THEN GOSUB CheckMove2 'deselects flag if move unsafe END IF END IF END IF END IF IF flag=2 THEN L=11:Move=0 IF flag=1 THEN IF RND>.3 THEN L=11:Move=0 ELSE flag=0 END IF END IF NEXT Move=Move-1 WEND IF flag<1 THEN flag=flag-1 IF flag=-10 THEN CALL PrintMessage("The Computer","Gives up!") gamewon=-play:RETURN END IF rand!=RND:GOTO Move2 END IF ship=b(boardX,boardY) 'ReDraw neeeds this to be straight out of 'the array, not processed as it is above CALL FlashSquare(boardX,boardY,flash):CALL FlashSquare(endX,endY,flash) IF b(endX,endY)=8 THEN GOTO Hyper ELSE GOTO ReDraw MoveToSafety2: IF CanTake=1 THEN 'can we take the ship, instead of retreating? MVTakePos=CanTakePos GOTO Take2 END IF em=t(MVShipPos,1) MOD 100:sm=em 'em (endmove) because sm is the would-be attacker, em is us (the attacked) boardY=(em\10)-1:boardX=(em MOD 10)-1:ship=b(boardX,boardY) ship=ABS(ship)-1:Move=p(ship,2)-1:flag=0:GOTO MoveChoose2 CheckWeTake2: tPos=0:cpPos=0 FOR lY=0 TO 8 FOR lX=0 TO 8 ship=b(lX,lY):IF ship>-1 THEN GOTO NxtlX2 ship=ABS(ship)-1:Move=p(ship,2)-1:sm=10*(lY+1)+lX+1 cp(cpPos)=sm:cpPos=cpPos+1 WHILE Move>-1 FOR L=0 TO ((Move+1)*4-1) em=sm+m(L,Move) IF em>10 AND em<100 THEN eY=(em\10)-1:eX=(em MOD 10)-1 IF eX>-1 AND eX<9 AND eY>-1 AND eY<9 THEN IF NOT((lX<2 AND eX>6) OR (lX>6 AND eX<2)) THEN IF b(eX,eY)>0 AND b(eX,eY)<8 THEN t(tPos,0)=sm*100+em:tPos=tPos+1:IF tPos>tMax THEN tPos=tMax END IF END IF END IF END IF NEXT Move=Move-1 WEND NxtlX2: NEXT lX NEXT lY t(tPos,0)=-1 IF cpPos<=cpMax THEN FOR L=cpPos TO cpMax cp(L)=-1 NEXT END IF RETURN MVTake2: MVTake=0:MVTakePos=0 IF tPos>0 THEN FOR L=0 TO tPos-1 IF t(L,0)=t(MVShipPos,1) THEN CanTake=1:CanTakePos=L em=t(L,0) MOD 100:eX=(em MOD 10)-1:eY=(em\10)-1 ship=b(eX,eY):ship=ship-1 IF v(ship)>MVTake THEN sm=t(L,0)\100:sX=(sm MOD 10)-1:sY=(sm\10)-1 ship1=ABS(b(sX,sY))-1:sqcol=c(eX,eY) f1=p(ship1,0):s1=p(ship1,1):f2=p(ship,0):s2=p(ship,1) IF sqcol<0 THEN f1=f1-sqcol ELSE s2=s2+sqcol IF f1>s2 THEN win=1 ELSEIF f1=s2 THEN IF f1>f2 THEN win=1 ELSEIF f2=f1 THEN win=0 ELSE win=2 END IF ELSE win=2 END IF IF win<2 THEN MVTake=v(ship):MVTakePos=L END IF NEXT END IF RETURN CheckTakeUs2: tPos=0:epPos=0 FOR lY=0 TO 8 FOR lX=0 TO 8 ship=b(lX,lY):IF ship<1 OR ship=8 THEN GOTO NextlX2 ship=ship-1:Move=p(ship,2)-1:sm=10*(lY+1)+lX+1 ep(epPos)=sm:epPos=epPos+1 WHILE Move>-1 FOR L=0 TO ((Move+1)*4-1) em=sm+m(L,Move) IF em>10 AND em<100 THEN eY=(em\10)-1:eX=(em MOD 10)-1 IF eX>-1 AND eX<9 AND eY>-1 AND eY<9 THEN IF NOT((lX<2 AND eX>6) OR (lX>6 AND eX<2)) THEN IF b(eX,eY)<0 THEN t(tPos,1)=sm*100+em:tPos=tPos+1:IF tPos>tMax THEN tPos=tMax END IF END IF END IF END IF NEXT Move=Move-1 WEND NextlX2: NEXT lX NEXT lY t(tPos,1)=-1 IF epPos<=epMax THEN FOR L=epPos TO epMax ep(L)=-1 NEXT END IF RETURN MVTakeUs2: MVShip=0:MVShipPos=0 'Most Valuable Ship - now check for best piece IF tPos>0 THEN FOR L=0 TO tPos-1 em=t(L,1) MOD 100:eX=(em MOD 10)-1:eY=(em\10)-1 ship=b(eX,eY):ship=ABS(ship)-1 IF v(ship)>MVShip THEN sm=t(L,1)\100:sX=(sm MOD 10)-1:sY=(sm\10)-1 ship1=b(sX,sY)-1:sqcol=c(eX,eY) f1=p(ship1,0):s1=p(ship1,1):f2=p(ship,0):s2=p(ship,1) IF sqcol>0 THEN f1=f1+sqcol ELSE s2=s2-sqcol IF f1>s2 THEN win=1 ELSEIF f1=s2 THEN IF f1>f2 THEN win=1 ELSEIF f2=f1 THEN win=0 ELSE win=2 END IF ELSE win=2 END IF IF win<2 THEN MVShip=v(ship):MVShipPos=L END IF NEXT END IF RETURN CheckMove2: FOR CL=0 TO epMax Csm=ep(CL) IF Csm>10 AND Csm<100 THEN Csx=(Csm MOD 10)-1:Csy=(Csm\10)-1:Cship=b(Csx,Csy):Cship=Cship-1 Cmove=p(Cship,2)-1 WHILE Cmove>-1 FOR CL2=0 TO ((Cmove+1)*4-1) Cem=Csm+m(CL2,Cmove) CeY=(Cem\10)-1:CeX=(Cem MOD 10)-1 IF CeX>-1 AND CeX<9 AND CeY>-1 AND CeY<9 THEN IF NOT((Csx<2 AND CeX>6) OR (Csx>6 AND CeX<2)) THEN IF Cem=em THEN flag=0:Cmove=-1:CL2=11:CL=epMax END IF END IF NEXT Cmove=Cmove-1 WEND ELSE CL=epMax END IF NEXT RETURN RndMove2: count=count+1 cpPos=INT(RND*(cpMax+1)):sm=cp(cpPos) IF sm<11 THEN IF count<20 THEN GOTO RndMove2 cpPos=0:sm=cp(cpPos) END IF sX=(sm MOD 10)-1:sY=(sm\10)-1:count=0 RETURN SetUp: COLOR 1,0:AREA (209,5):AREA (212,1):AREA (215,5):AREAFILL AREA (209,9):AREA (212,13):AREA (215,9):AREAFILL ship=0:cp=0:ep=0:PSource1=0:PSource2=0:col=0:Pship=0 LINE (295,25)-(310,255),0,bf:GOSUB SetUpPrint LINE (296,50)-(306,60),1,bf:LINE (296,70)-(306,80),2,bf LINE (296,90)-(306,100),3,bf:LINE (296,110)-(306,120),4,bf LINE (296,130)-(306,140),5,bf:LINE (294,88)-(308,102),19,b LINE (296,145)-(308,179),1,bf:LINE (295,144)-(305,176),2,bf:COLOR 1,2 LOCATE 19,38:PRINT "E":LOCATE 20,38:PRINT "X":LOCATE 21,38:PRINT "I" LOCATE 22,38:PRINT "T":LINE (294,143)-(306,177),5,b COLOR 1,0 SetUpLoop: WHILE MOUSE(0)=0:WEND:WHILE MOUSE(0)<>0:WEND 'must wait, or else... X=MOUSE(1):Y=MOUSE(2) IF (X>3 AND X<291) AND (Y>16 AND Y<241) THEN bX=(X-3)\32:bY=(Y-16)\25 c(bX,bY)=col IF ship<7 THEN IF Pship=0 THEN b(bX,bY)=ship+1 ELSE b(bX,bY)=-1-ship ELSEIF ship=7 THEN b(bX,bY)=8 ELSEIF ship=8 THEN b(bX,bY)=0 END IF X1=bX*32+3:Y1=bY*25+16:LINE(X1,Y1)-(X1+31,Y1+24),23,b LINE(X1+1,Y1+1)-(X1+30,Y1+23),3+(c(bX,bY)),bf LINE(X1+4,Y1+3)-(X1+27,Y1+21),1,bf:shp=b(bX,bY) IF ship<7 THEN IF shp>0 THEN shp=shp-1 ELSE shp=ABS(shp)+6 IF shp<14 THEN Xp=X1+13:Yp=Y1+16:pic=shp:GOSUB PutPic ELSEIF ship=7 THEN GOSUB DrawHyperSpace END IF ELSEIF X>295 AND X<307 THEN IF Y>49 AND Y<61 THEN LINE (294,28+(col+3)*20)-(308,42+(col+3)*20),0,b col=-2:LINE (294,48)-(308,62),19,b ELSEIF Y>69 AND Y<81 THEN LINE (294,28+(col+3)*20)-(308,42+(col+3)*20),0,b col=-1:LINE (294,68)-(308,82),19,b ELSEIF Y>89 AND Y<101 THEN LINE (294,28+(col+3)*20)-(308,42+(col+3)*20),0,b col=0:LINE (294,88)-(308,102),19,b ELSEIF Y>109 AND Y<121 THEN LINE (294,28+(col+3)*20)-(308,42+(col+3)*20),0,b col=1:LINE (294,108)-(308,122),19,b ELSEIF Y>129 AND Y<141 THEN LINE (294,28+(col+3)*20)-(308,42+(col+3)*20),0,b col=2:LINE (294,128)-(308,142),19,b ELSEIF Y>143 AND Y<177 THEN PSource1=0:PSource2=0:cp=0:ep=0:PFlag=0 FOR lY=0 TO 8 FOR lX=0 TO 8 xx=b(lX,lY) IF xx<0 THEN ep=ep+1 IF xx>0 AND xx<8 THEN cp=cp+1 IF xx=-6 OR xx=-7 THEN IF PSource2=1 THEN PFlag=1 ELSE PSource2=1 END IF IF xx=6 OR xx=7 THEN IF PSource1=1 THEN PFlag=1 ELSE PSource1=1 END IF NEXT NEXT IF PFlag=1 THEN message$="Too many":message2$="PowerSources" CALL PrintMessage(message$,message2$) ELSEIF PSource1=1 AND PSource2=1 THEN GOTO ExitSetUp ELSEIF PSource1=0 OR PSource2=0 THEN message$="PowerSource" IF PSource1=0 AND PSource2=0 THEN message$=message$+"s" message2$="missing":CALL PrintMessage(message$,message2$) ELSEIF cp=0 OR ep=0 THEN CALL PrintMessage("Some pieces","are missing!") END IF END IF ELSEIF X>208 AND X<215 AND Y>0 AND Y<14 THEN IF Y>0 AND Y<6 THEN ship=ship-1 IF ship<0 THEN ship=8:IF Pship=0 THEN Pship=1 ELSE Pship=0 END IF GOSUB SetUpPrint ELSEIF Y>8 AND Y<14 THEN ship=ship+1 IF ship>8 THEN ship=0:IF Pship=0 THEN Pship=1 ELSE Pship=0 END IF GOSUB SetUpPrint END IF END IF GOTO SetUpLoop ExitSetUp: cpMax=cp:epMax=ep:IF cpMax>epMax THEN epMax=cpMax ELSE cpMax=epMax ERASE cp:ERASE ep:DIM cp(cpMax),ep(epMax) LINE (209,0)-(319,15),0,bf:LINE (294,0)-(319,255),0,bf IF play1$<>" Computer 1 " OR play2$<>"Computer 2 " THEN COLOR 1,4:LINE (297,57)-(307,97),1,bf:LINE (295,55)-(305,95),4,bf LOCATE 8,38:PRINT "S":LOCATE 9,38:PRINT "E":LOCATE 10,38:PRINT "T" LOCATE 11,38:PRINT "U":LOCATE 12,38:PRINT "P" LINE (295,55)-(305,95),5,b:COLOR 1,2:LINE (297,137)-(307,193),1,bf LINE (295,135)-(305,191),2,bf LOCATE 18,38:PRINT "R":LOCATE 19,38:PRINT "E":LOCATE 20,38:PRINT "S" LOCATE 21,38:PRINT "T":LOCATE 22,38:PRINT "A":LOCATE 23,38:PRINT "R" LOCATE 24,38:PRINT "T":LINE (295,135)-(305,191),5,b:COLOR 1,0 ELSE LINE (297,49)-(307,178),1,bf:LINE (295,47)-(305,176),5,bf COLOR 1,5:LOCATE 7,38:PRINT "S":LOCATE 8,38:PRINT "P":LOCATE 9,38:PRINT "A" LOCATE 10,38:PRINT "C":LOCATE 11,38:PRINT "E":LOCATE 13,38:PRINT "T" LOCATE 14,38:PRINT "O":LOCATE 16,38:PRINT "R":LOCATE 17,38:PRINT "E" LOCATE 18,38:PRINT "S":LOCATE 19,38:PRINT "T":LOCATE 20,38:PRINT "A" LOCATE 21,38:PRINT "R":LOCATE 22,38:PRINT "T":COLOR 1,0 LINE (295,47)-(305,176),2,b END IF RETURN SetUpPrint: IF Pship=0 THEN message2$=play1$ ELSE message2$=play2$ IF ship=7 THEN message1$="HyperSpace":message2$="" ELSEIF ship=8 THEN message1$="Blank Square":message2$="" ELSE message1$=nm$(ship) END IF CALL PrintMessage(message1$,message2$) RETURN ReadData: RESTORE piecedata: FOR Y=0 TO 8:FOR X=0 TO 8:READ b(X,Y):NEXT X,Y FOR Y=0 TO 8:FOR X=0 TO 8:READ c(X,Y):NEXT X,Y FOR Y=0 TO 2:FOR X=0 TO 6:READ p(X,Y):NEXT X,Y FOR Y=0 TO 2:FOR X=0 TO 11:READ m(X,Y):NEXT X,Y FOR L=0 TO 6:READ nm$(L):NEXT FOR L=0 TO 6:READ v(L):NEXT RETURN 'piece piecedata: DATA 2,1,0,0,0,0,0,-1,-2 DATA 2,0,0,8,0,8,0,0,-2 DATA 3,4,0,0,0,0,0,-4,-3 DATA 5,0,2,0,0,0,-2,0,-5 DATA 6,5,0,0,8,0,0,-5,-6 DATA 5,0,2,0,0,0,-2,0,-5 DATA 3,4,0,0,0,0,0,-4,-3 DATA 2,0,0,8,0,8,0,0,-2 DATA 2,1,0,0,0,0,0,-1,-2 'colour DATA 1,0,0,0,1,0,0,0,-1 DATA 1,0,-1,0,0,0,-1,0,-1 DATA 1,1,0,0,1,0,0,-1,-1 DATA 1,1,0,-2,-1,2,0,-1,-1 DATA 2,1,0,1,0,-1,0,-1,-2 DATA 1,1,0,2,1,-2,0,-1,-1 DATA 1,1,0,0,-1,0,0,-1,-1 DATA 1,0,1,0,0,0,1,0,-1 DATA 1,0,0,0,-1,0,0,0,-1 'piece attributes : force, shield and move DATA 1,2,1,3,2,4,5 DATA 1,1,2,2,3,3,1 DATA 1,2,2,3,3,1,2 'movement data DATA -1,10,-10,1,0,0,0,0,0,0,0,0 DATA -2,9,-11,20,-20,11,-9,2,0,0,0,0 DATA -3,19,-21,8,-12,30,-30,12,-8,21,-19,3 'piece names DATA Repairship,Fighter,Guard,EliteFighter,EliteGuard,PowerSource,PowerSource 'value of piece DATA 4,1,2,5,3,6,7 DrawBoard: FOR lY=0 TO 8:FOR lX=0 TO 8 X1=lX*32+3:Y1=16+lY*25 LINE (X1,Y1)-(X1+31,Y1+24),23,b LINE(X1+1,Y1+1)-(X1+30,Y1+23),3+(c(lX,lY)),bf LINE(X1+4,Y1+3)-(X1+27,Y1+21),1,bf:ship=b(lX,lY) IF ship=8 OR ship=-8 THEN GOSUB DrawHyperSpace ELSEIF ship<>0 THEN IF ship>0 THEN ship=ship-1 ELSE ship=ABS(ship)+6 IF ship<14 THEN Xp=X1+13:Yp=Y1+16:pic=ship:GOSUB PutPic END IF NEXT lX,lY RETURN DrawHyperSpace: LINE (X1+8,Y1+5)-(X1+9,Y1+16),11,b LINE (X1+8,Y1+11)-(X1+23,Y1+12),11,b LINE (X1+22,Y1+5)-(X1+23,Y1+16),11,b RETURN GetScrAddrs: WindowBase&=WINDOW(7) WScreen&=PEEKL(WindowBase&+46) BitMap&=PEEKL(WScreen&+88) FOR BitPlane=0 TO 4 'the depth of screen-1 BPlane&(BitPlane)=PEEKL(BitMap&+8+BitPlane*4) NEXT BitPlane RETURN LoadPic: OPEN File$ FOR INPUT AS 1 length=1000:ReadLength&=length:BufText$="" BufText$=INPUT$(length,1):position=0 InBuf$=SPACE$(3):address&=SADD(BufText$):InBuf&=SADD(InBuf$) IF (InBuf& AND 1)=1 THEN InBuf&=InBuf&=1 GOSUB GetNum:aDim=num:GOSUB GetNum:bDim=num ERASE ship%:DIM ship%(aDim,bDim) InBuf$=SPACE$(3):address&=SADD(BufText$):InBuf&=SADD(InBuf$) IF (InBuf& AND 1)=1 THEN InBuf&=InBuf&=1 FOR L=0 TO bDim FOR L2=0 TO aDim GOSUB GetNum ship%(L2,L)=num NEXT NEXT ReadEnd: CLOSE 1 InBuf$="":BufText$="" RETURN GetNum: POKE InBuf&,PEEK(address&+position) POKE InBuf&+1,PEEK(address&+position+1) num=PEEKW(InBuf&):position=position+2 IF position+1>LEN(BufText$) THEN IF LOF(1)0:mcount=mcount+1 IF mcount=5000 THEN COLOR 7:PRINT "Hey YOU!, let go of the mouse button!" IF mcount=11000 THEN COLOR 4:PRINT "Please?" IF mcount=16000 THEN COLOR 2:PRINT "Well then I'm MAD!" IF mcount>16000 THEN BEEP WEND X=MOUSE(1):Y=MOUSE(2) IF Y>13 AND Y<25 THEN IF X>30 AND X<99 THEN play1$="Human" LINE (30,13)-(99,25),3,b LINE (30,29)-(99,41),0,b ELSEIF X>118 AND X<186 THEN play2$="Human" LINE (118,13)-(186,25),3,b LINE (118,29)-(186,41),0,b END IF ELSEIF Y>29 AND Y<41 THEN IF X>30 AND X<99 THEN play1$=" Computer 1 " LINE (30,29)-(99,41),3,b LINE (30,13)-(99,25),0,b ELSEIF X>118 AND X<186 THEN play2$="Computer 2 " LINE (118,29)-(186,41),3,b LINE (118,13)-(186,25),0,b END IF ELSEIF Y>46 AND Y<57 THEN IF X>30 AND X<57 THEN IF play1$="" OR play2$="" THEN BEEP:COLOR 2:PRINT "Select players first!":PRINT "(Click)" WHILE MOUSE(0)=0:WEND ELSE GOTO GetNames END IF END IF ELSEIF Y>71 AND Y<77 THEN IF X>55 AND X<65 THEN flash=flash-1:IF flash<0 THEN flash=0 END IF ELSEIF Y>57 AND Y<63 THEN IF X>55 AND X<65 THEN flash=flash+1:IF flash>5 THEN flash=5 END IF END IF GOTO GadgetLoop GetNames: name1: IF play1$="Human" THEN COLOR 5:PRINT "Please tell me your name, player one." COLOR 4:PRINT "(up to twelve letters)" COLOR 3:INPUT "Your name";a$ IF LEN(a$)>12 THEN play1$=LEFT$(a$,12) ELSE play1$=a$ IF play1$=" Computer 1 " OR play1$="Computer 1" THEN PRINT "NO player 1, you are not me!" play1$="Human":GOTO name1 END IF COLOR 7:PRINT "Thank you, ";play1$:COLOR 1 END IF name2: IF play2$="Human" THEN COLOR 5:PRINT "Please tell me your name, player two." COLOR 2:PRINT "(up to twelve letters)" COLOR 3:INPUT "Your name";a$ IF LEN(a$)>12 THEN play2$=LEFT$(a$,12) ELSE play2$=a$ IF play2$="Computer 2 " OR play2$="Computer 2" THEN PRINT "NO, player 2, you are not me!" play2$="Human":GOTO name2 END IF COLOR 7:PRINT "Thank you, ";play2$:COLOR 1 END IF a$="":question$=play1$+" Vs "+play2$ IF LEN(question$)>24 THEN question$=LEFT$(question$,24) question$=question$+CHR$(10)+CHR$(13)+"Is this correct?" CALL Ask(question$,a$,1):WINDOW OUTPUT 3 IF a$="N" THEN GOTO PlayerSetUp IF flash=0 THEN flash=-1 RETURN SUB Ask(question$,reply$,scr) STATIC IF LEN(question$)>25 THEN WINDOW 9,"DS BASIC REQUEST!",(45,100)-(275,140),6,scr ELSE WINDOW 9,"DS BASIC REQUEST!",(60,100)-(260,140),6,scr END IF COLOR 5:PRINT question$ LINE (22,24)-(52,34),1,bf:LINE (142,24)-(164,34),1,bf LINE (20,22)-(50,32),5,bf:LINE (140,22)-(162,32),5,bf LOCATE 4,4:COLOR 2,5:PRINT "YES":LOCATE 4,19:COLOR 7,5:PRINT "No":COLOR 1,0 LINE (20,22)-(50,32),2,b:LINE (140,22)-(162,32),7,b WhileLoop: xx=0 WHILE xx=0 xx=MOUSE(0) X$="":X$=INKEY$ IF UCASE$(X$)="Y" THEN xx=1 IF UCASE$(X$)="N" THEN xx=1 WEND:WHILE MOUSE(0)<>0:WEND:X=MOUSE(1):Y=MOUSE(2) IF X>=20 AND X<=50 AND Y>=22 AND Y<=32 THEN reply$="Y" IF X>=140 AND X<=162 AND Y>=22 AND Y<=32 THEN reply$="N" IF X$<>"" THEN reply$=UCASE$(X$) IF reply$<>"" THEN WINDOW CLOSE 9:EXIT SUB GOTO WhileLoop END SUB SUB Convert(col,R!,g!,b!) STATIC R!=col\256:IF R!>0 THEN R!=(1/15)*R! col=col MOD 256:g!=col\16:IF g!>0 THEN g!=(1/15)*g! col=col MOD 16:b!=col:IF b!>0 THEN b!=(1/15)*b! EXIT SUB END SUB SUB PrintMessage(message$,message2$) STATIC COLOR 1 IF LEN(message$)<12 THEN LOCATE 1,28:PRINT " " LOCATE 1,28:PRINT message$ IF LEN(message2$)<12 THEN LOCATE 2,28:PRINT " " LOCATE 2,28:PRINT message2$ EXIT SUB END SUB SUB FlashSquare(bX,bY,n) STATIC X1=bX*32+3:Y1=bY*25+16 FOR R=1 TO n FOR L=20 TO 31 LINE(X1,Y1)-(X1+31,Y1+24),L,b FOR delay=1 TO 500:NEXT NEXT NEXT LINE(X1,Y1)-(X1+31,Y1+24),23,b EXIT SUB END SUB