REM - TeleChess Amiga REM - Beta Test version 0.95 REM - By REM - Tom Conroy & REM James Hastings-Trew REM - Copyright 1987, Telegame Software REM - This version of TeleChess is REM - compatible with the TeleChess-64 REM - for the Commodore 64 MainLoop: GOSUB DefineModeArray GOSUB Initalize GOSUB SetMenu GOSUB GetOutlines GOSUB LoadPieces GOSUB PieceMemSetup GOSUB PrintBoard GOTO Chatout WHILE 1 GOSUB MouseScan WEND ElectPawn: IF InTransit = 1 THEN InTransit = 5 IF InTransit = 11 THEN InTransit = 15 RETURN ModifyBoard: '---------------------------------------- PieceMemSetup: RESTORE FOR n=1 TO 8 FOR m=1 TO 8 READ b(n,m) NEXT m NEXT n IF flip=0 THEN x=4 END IF IF flip=0 THEN crosspiece FOR n=1 TO 8:FOR I=1 TO 8 IF(b(n,I)<10 AND b(n,I)>0) THEN b(n,I)=b(n,I)+10:GOTO loop6 IF b(n,I)>10 THEN b(n,I)=b(n,I)-10 loop6: NEXT I:NEXT n b(1,4)=16:b(1,5)=15:b(8,4)=6:b(8,5)=5 crosspiece: FOR n = 0 TO 6 READ cross(n) NEXT FOR n = 11 TO 16 READ cross(n) NEXT FOR n = 100 TO 106 READ cross(n) NEXT FOR n = 111 TO 116 READ cross(n) NEXT FOR z=1 TO 8:FOR I=1 TO 8 bb(z,I)=b(z,I) NEXT I:NEXT z RETURN DATA 4,2,3,5,6,3,2,4 DATA 1,1,1,1,1,1,1,1 DATA 0,0,0,0,0,0,0,0 DATA 0,0,0,0,0,0,0,0 DATA 0,0,0,0,0,0,0,0 DATA 0,0,0,0,0,0,0,0 DATA 11,11,11,11,11,11,11,11 DATA 14,12,13,15,16,13,12,14 DATA 7,6,2,3,1,4,5 DATA 20,16,17,15,18,19 DATA 14,13,9,10,8,11,12 DATA 27,23,24,22,25,26 '------------------------------------ ChatLoop: Chatout: IF LOC(1)<>0 THEN ChatIn a$=INKEY$ IF a$="" THEN GOSUB Colors IF a$ = "" AND local = 1 THEN local = 0 : GOTO Chatout IF a$ = "" AND local = 0 THEN local = 1 : GOTO Chatout IF a$="" THEN ChatIn IF a$=CHR$(13)THEN a$="... " GOTO PrintAndSend END IF IF a$=CHR$(8) AND LEN(t$)>0 THEN PrintAndSend IF (ASC(a$)<32 OR ASC(a$)>64) AND (ASC(a$)<97 OR ASC(a$)>122)THEN ChatIn IF ASC(a$)>64 THEN b=ASC(a$)-32:a$=CHR$(b) PrintAndSend: IF a$=CHR$(8) THEN a$=CHR$(20) PRINT#1,a$; IF a$=CHR$(20) THEN a$="" t$=LEFT$(t$,LEN(t$)-1) END IF t$=t$+a$ t$=RIGHT$(t$,18) LOCATE 2,21:COLOR 30 PRINT t$ GOTO ChatIn ChatIn: IF LOC(1)=0 THEN MouseScan a$=INPUT$(1,1) IF a$=CHR$(254)THEN GOSUB ReceiveMove GOTO ChatIn END IF IF a$=CHR$(91)THEN PRINT#1,CHR$(226); GOTO ChatIn END IF IF a$=CHR$(20) AND LEN(y$)>0 THEN a$="":y$=LEFT$(y$,LEN(y$)-1) IF LEN(Speak$) > 0 THEN Speak$=LEFT$(Speak$,LEN(Speak$)-1) LOCATE 2,2:COLOR 17 PRINT y$ END IF IF ASC(a$+CHR$(0))>90 OR ASC(a$+CHR$(0))<32 THEN ChatIn y$=y$+a$:y$=RIGHT$(y$,18) IF LEN(Speak$) < 255 THEN Speak$=Speak$+a$ LOCATE 2,2:COLOR 17 PRINT y$ IF RIGHT$(Speak$,4)="... " THEN talk$ = TRANSLATE$ (LEFT$(Speak$,LEN(Speak$)-4)) Speak$="" IF SpeakFlag = 1 THEN SAY (talk$),Voice% END IF GOTO ChatIn '-------------------------------------------- ReceiveMove: Ok=0 Loop3: re=1:PRINT#1,CHR$(91); Loop2: tl=TIMER+5 WHILE TIMER0 THEN a$=INPUT$(1,1) IF a$<>""THEN tl=TIMER-1 WEND IF a$=CHR$(254) THEN Loop3 IF a$=CHR$(226) THEN RETURN cor(re)=ASC(a$+CHR$(0)) cor(re)=cor(re)-32 re=re+1 IF re<6 THEN Loop2 checksum=cor(1)+cor(2)+cor(3)+cor(4) IF checksum<>cor(5) THEN RecmoveFail PRINT#1,CHR$(96); Ok=1 bb(f1,f2) = b(f1,f2) bb(s1,s2) = b(s1,s2) s1=cor(1):s2=cor(2):f1=cor(3):f2=cor(4) GOSUB MovePiece RETURN RecmoveFail: PRINT#1,CHR$(99); tl=TIMER+5 WHILE TIMER""THEN tl=TIMER-1 WEND IF a$=CHR$(254)THEN GOTO Loop3 RETURN '-------------------------------------- SendMove: IF local = 1 THEN Ok = 1:RETURN Ok=0:IF s1 = f1 AND s2 = f2 THEN RETURN sy=9-s1:sx=9-s2:fy=9-f1:fx=9-f2: REM translate co-ordinates ck=(sy+sx+fy+fx):try=0: REM calculate checksum Loop4: tl=TIMER+5 PRINT#1,CHR$(254);: REM transmit send request REM wait for acknowledge WHILE tl>TIMER a$="":IF LOC(1)<>0 THEN a$=INPUT$(1,1) IF a$<>"" THEN tl=TIMER-1 WEND IF a$<>"" THEN Loop5 try=try+1 IF try<10 THEN Loop4 IF try=10 THEN RETURN :REM give up after 10 attempts Loop5: IF a$<>CHR$(91)THEN Loop4 PRINT#1,CHR$(sy+32); PRINT#1,CHR$(sx+32); PRINT#1,CHR$(fy+32); PRINT#1,CHR$(fx+32); PRINT#1,CHR$(ck+32); tl=TIMER+5 WHILE TIMER""THEN tl=TIMER-1 WEND IF a$<>CHR$(96)THEN Loop4 : REM try again if not sent ok Ok=1 : RETURN '----------------------------------------- CordToGrid: REM - XCORD= XPixel Cordinate REM - YCORD= YPixel Cordinate REM - Returns XGRID and YGRID nongrid=0 IF Xcord < 6 OR Xcord > 199 THEN nongrid=1:RETURN IF Ycord < 28 OR Ycord > 191 THEN nongrid=1:RETURN Xcord = Xcord + 17 xgrid = INT (Xcord / 24) Ycord = Ycord -28 ygrid = INT ((Ycord / 19)+1) RETURN '------------------------------------------ GridToCord: Xcord = -19 + (xgrid * 24) Ycord = 9 + (ygrid * 19) RETURN '------------------------------------------ PlacePiece: REM N=YGRID REM M=XGRID ygrid=n:xgrid=m GOSUB GridToCord pn = b(n,m) IF (xgrid+ygrid)/2 <> INT ((xgrid+ygrid)/2) THEN pn=pn+100 PUT (Xcord,Ycord), piece%(1,cross(pn)), PSET RETURN '------------------------------------------ PrintBoard: FOR n=1 TO 8: FOR m = 1 TO 8 GOSUB PlacePiece Skip: NEXT NEXT PUT (267,30),Button%(1,2),PSET WINDOW CLOSE 4 RETURN '------------------------------------------ MovePiece: IF s1 = f1 AND s2 = f2 THEN RETURN IF b(s1,s2)=0 THEN RETURN InTransit = b(s1,s2) n=s1:m=s2 Capture = 0 : IF b(f1,f2) <> 0 THEN Capture = 1 IF SoundFlag = 1 THEN GOSUB Tune1 FOR silly = 1 TO 4 b(s1,s2)=InTransit : GOSUB PlacePiece : GOSUB OneSecDelay b(s1,s2)=0 : GOSUB PlacePiece : GOSUB OneSecDelay NEXT n=f1:m=f2 IF (InTransit = 1 OR InTransit = 11) AND (f1 = 8 OR f1 = 1) THEN GOSUB ElectPawn FOR silly = 1 TO 3 b(f1,f2) = 0 : GOSUB PlacePiece : GOSUB OneSecDelay b(f1,f2) = InTransit : GOSUB PlacePiece : GOSUB OneSecDelay NEXT IF Capture = 1 AND SoundFlag =1 THEN GOSUB Tune2 IF SoundFlag = 1 THEN GOSUB Tune3 RETURN OneSecDelay: Delay = TIMER WHILE TIMER < Delay + 0.2 WEND RETURN '------------------------------------------ LoadPieces: PieceLoop1: p = 0 xgrid = 1 : ygrid = 1 : GOSUB PieceLoop2 xgrid = 7 : ygrid = 1 : GOSUB PieceLoop2 xgrid = 3 : ygrid = 1 : GOSUB PieceLoop2 xgrid = 4 : ygrid = 4 : GOSUB PieceLoop2 xgrid = 5 : ygrid = 1 : GOSUB PieceLoop2 xgrid = 2 : ygrid = 2 : GOSUB PieceLoop2 xgrid = 1 : ygrid = 3 : GOSUB PieceLoop2 xgrid = 8 : ygrid = 1 : GOSUB PieceLoop2 xgrid = 2 : ygrid = 1 : GOSUB PieceLoop2 xgrid = 6 : ygrid = 1 : GOSUB PieceLoop2 xgrid = 4 : ygrid = 1 : GOSUB PieceLoop2 xgrid = 5 : ygrid = 4 : GOSUB PieceLoop2 xgrid = 1 : ygrid = 2 : GOSUB PieceLoop2 xgrid = 2 : ygrid = 3 : GOSUB PieceLoop2 xgrid = 8 : ygrid = 8 : GOSUB PieceLoop2 xgrid = 2 : ygrid = 8 : GOSUB PieceLoop2 xgrid = 6 : ygrid = 8 : GOSUB PieceLoop2 xgrid = 4 : ygrid = 8 : GOSUB PieceLoop2 xgrid = 5 : ygrid = 5 : GOSUB PieceLoop2 xgrid = 1 : ygrid = 7 : GOSUB PieceLoop2 xgrid = 1 : ygrid = 3 : GOSUB PieceLoop2 xgrid = 1 : ygrid = 8 : GOSUB PieceLoop2 xgrid = 7 : ygrid = 8 : GOSUB PieceLoop2 xgrid = 3 : ygrid = 8 : GOSUB PieceLoop2 xgrid = 4 : ygrid = 5 : GOSUB PieceLoop2 xgrid = 5 : ygrid = 8 : GOSUB PieceLoop2 xgrid = 2 : ygrid = 7 : GOSUB PieceLoop2 xgrid = 1 : ygrid = 3 : GOSUB PieceLoop2 GET (267,30)-(280,37),Button%(1,1) GET (267,47)-(280,54),Button%(1,2) RETURN PieceLoop2: p = p + 1 GOSUB GridToCord x1 = Xcord y1 = Ycord x2 = x1+22 y2 = y1+17 GET (x1,y1)-(x2,y2),piece%(1,p) RETURN '------------------------------------------ GetOutlines: FOR n=1 TO 6 OPEN "Piece"+STR$(n) FOR INPUT AS 2 OBJECT.SHAPE n,INPUT$(LOF(2),2) CLOSE 2 NEXT RETURN '------------------------------------------ MouseScan: IF MoveToMake = 1 THEN MoveToMake = 0 : GOTO SendTheMove a = MOUSE(0) IF a < 0 THEN ButtonIsPressed GOSUB CheckMenu GOTO Chatout '------------------------------------------ SetMenu: MENU 1,0,1,"Project" MENU 1,1,1,"Establish Connect" MENU 1,2,1,"Load Game " MENU 1,3,1,"Save Game " MENU 1,4,1,"Quit " MENU 2,0,1,"Options" MENU 2,1,1,"Be Black " MENU 2,2,1,"Be White " MENU 2,3,1,"Reset Board " MENU 2,4,0,"Modify Board" MENU 2,5,1,"Sound Off " MENU 2,6,1,"Speech Off " MENU 3,0,1,"Info" MENU 3,1,1,"Authors " MENU 3,2,1,"More Info " MENU 3,3,1,"Versions " MENU 3,4,1,"TeleGames " MENU 4,0,0," " RETURN '------------------------------------------ Initalize: SoundFlag = 1 SpeakFlag = 1 DIM piece%(183,29) DIM cross(117) DIM cascii(90) DIM Button%(58,2) RETURN '------------------------------------------ OpenWindow: WINDOW 3," TeleChess",(21,50)-(250,165),0,2 RETURN Closewindow: WINDOW CLOSE 3 RETURN '------------------------------------------ CoverScreen: WINDOW 4,"TeleChess",,0,2 LOCATE 10,2:COLOR 2 PRINT "Please Wait... Working..." WINDOW OUTPUT 2 RETURN '------------------------------------------ Clicker: a=0 WHILE a=0 a=MOUSE(0) WEND GOSUB Closewindow RETURN '---------------------------------- Tune1: FOR vol = 255 TO 0 STEP -15 SOUND 90,1,vol,3 SOUND 130,1,vol,2 NEXT RETURN Tune2: FOR vol=12 TO 1 STEP -1 SOUND vol*20,1,255,2 FOR silly = 1 TO 20 : NEXT SOUND vol*20,1,255,3 NEXT RETURN Tune3: SOUND 500,0.2,255,3 RETURN '---------------------------------- OppsPressed: FOR z=1 TO 8:FOR I=1 TO 8 b(z,I)=bb(z,I) NEXT I:NEXT z GOSUB CoverScreen GOSUB PrintBoard PRINT#1," SYSTEM MESSAGE: OTHER PLAYER HAS PRESSED UNDO... "; RETURN '---------------------------------- CheckMenu: selecta = MENU(0) IF selecta = 0 THEN RETURN selectb = MENU(1) ON selecta GOTO Project,Options,Info RETURN Project: ON selectb GOTO EstablishConnect,LoadGame,SaveGame,Quit RETURN EstablishConnect: IF SoundFlag = 1 THEN GOSUB Tune1 WINDOW 3," TeleChess",(13,68)-(187,148),0,2 COLOR 17,1 PRINT " Please Type In The " PRINT " Proper Modem Command " PRINT " To Connect You To " PRINT " The Other Player " PRINT " " COLOR 3 PRINT " EXAMPLE: ATDT (PH#) " PRINT " ATS0=1 " PRINT " ATA " PRINT " " COLOR 1,17 PRINT " "; LOCATE 10,1 INPUT "Command:";ModemCommand$ WINDOW CLOSE 3 PRINT#1,ModemCommand$ IF SoundFlag = 1 THEN GOSUB Tune1 RETURN RETURN LoadGame: IF SoundFlag = 1 THEN GOSUB Tune1 WINDOW 3,"Load Game",(10,50)-(260,57),0,2 COLOR 17:PRINT "Path/Filename:"; COLOR 13 : INPUT filename$ IF filename$="" THEN WINDOW CLOSE 3:RETURN OPEN filename$ FOR INPUT AS 2 INPUT #2,flip FOR n = 1 TO 8 FOR m = 1 TO 8 INPUT #2,b(n,m) NEXT NEXT CLOSE #2 WINDOW CLOSE 3 GOSUB CoverScreen GOSUB PrintBoard IF SoundFlag = 1 THEN GOSUB Tune1 RETURN SaveGame: IF SoundFlag = 1 THEN GOSUB Tune1 WINDOW 3,"Save Game",(10,50)-(250,57),0,2 COLOR 17:PRINT "Path/Filename:"; COLOR 13 : INPUT filename$ IF filename$="" THEN WINDOW CLOSE 3:RETURN OPEN filename$ FOR OUTPUT AS 2 WRITE #2,flip FOR n = 1 TO 8 FOR m = 1 TO 8 WRITE #2,b(n,m) NEXT NEXT CLOSE #2 PRINT : COLOR 17,1 : LOCATE 1,1 : PRINT "Game Saved... "; FOR n = 1 TO 2000 : NEXT WINDOW CLOSE 3 IF SoundFlag = 1 THEN GOSUB Tune1 RETURN Quit: SCREEN CLOSE 2 IF SoundFlag = 1 THEN GOSUB Tune1 END Options: ON selectb GOTO BeBlack,BeWhite,ResetBoard,ModifyBoard,SoundToggle,TalkToggle RETURN BeBlack: IF SoundFlag = 1 THEN GOSUB Tune1 IF flip = 1 THEN RETURN flip = 1 GOSUB CoverScreen GOSUB PieceMemSetup GOSUB PrintBoard RETURN BeWhite: IF SoundFlag = 1 THEN GOSUB Tune1 IF flip = 0 THEN RETURN flip = 0 GOSUB CoverScreen GOSUB PieceMemSetup GOSUB PrintBoard RETURN ResetBoard: IF SoundFlag = 1 THEN GOSUB Tune1 GOSUB CoverScreen GOSUB PieceMemSetup GOSUB PrintBoard RETURN ModifyBoard: IF SoundFlag = 1 THEN GOSUB Tune1 RETURN SoundToggle: IF SoundFlag = 0 THEN SoundOn SoundFlag = 0 MENU 2,5,1,"Sound On " RETURN SoundOn: SoundFlag = 1 MENU 2,5,1,"Sound Off " RETURN TalkToggle: IF SpeakFlag = 1 THEN TurnItOff SpeakFlag = 1 : Speak$ = TRANSLATE$ ("Ok, I'm back") : SAY (Speak$) MENU 2,6,1,"Speech Off " RETURN TurnItOff: SpeakFlag = 0 : Speak$ = TRANSLATE$ ("My lips are sealed") : SAY (Speak$) MENU 2,6,1,"Speech On " RETURN Info: ON selectb GOTO Authors,MoreInfo,Versions,TeleGames Authors: IF SoundFlag = 1 THEN GOSUB Tune1 WINDOW 3,"TeleChess",(21,50)-(259,130),0,2 COLOR 25,13 PRINT " Programming: Tom Conroy " PRINT " Artwork: James Hastings-Trew " PRINT " " COLOR 3,13 PRINT " Don't feel obligated to send " PRINT " money if you use this " PRINT " program. But, if you do, " PRINT " we'll say nice things about " PRINT " you for days! (Honest...) " PRINT " " COLOR 17,1 PRINT " [Click To Continue] "; GOSUB Clicker IF SoundFlag = 1 THEN GOSUB Tune1 RETURN Colors: GOSUB OpenWindow WIDTH 14 FOR n = 0 TO 31 COLOR n PRINT n; NEXT INPUT a$ GOSUB Closewindow WIDTH 60 RETURN MoreInfo: IF SoundFlag = 1 THEN GOSUB Tune1 WINDOW 3,"TeleChess",(21,42)-(243,162),0,2 COLOR 25,13 PRINT " Please send freeware " PRINT " donations (If Any) to " COLOR 30,13 PRINT " " PRINT " TeleGame Software " PRINT " Sub PO 37 " PRINT " Saskatoon, Sask. " PRINT " S7H 0X0 " COLOR 1 PRINT " Call At 306-373-0656 " PRINT " " COLOR 17,13 PRINT " Please Note: Your freeware " PRINT " donations will go toward " PRINT " supporting the authors " PRINT " Fudrucker's Lunch Fund " PRINT " " COLOR 17,1 PRINT " [Click To Continue] "; GOSUB Clicker IF SoundFlag = 1 THEN GOSUB Tune1 RETURN Versions: IF SoundFlag = 1 THEN GOSUB Tune1 WINDOW 3,"TeleChess",(21,50)-(259,122),0,2 COLOR 25,13 PRINT " This TeleChess is Compatible " PRINT " with the following versions. " PRINT " " COLOR 3,13 PRINT " Commodore 64 - TeleChess 1.5 " COLOR 4,13 PRINT " Atari 520 ST - TeleChess 1.0 " COLOR 5,13 PRINT " MS-DOS - TeleChess 1.0 " COLOR 6,13 PRINT " Macintosh - TeleChess 1.0 " PRINT " " COLOR 17,1 PRINT " [Click To Continue] "; GOSUB Clicker IF SoundFlag = 1 THEN GOSUB Tune1 RETURN TeleGames: IF SoundFlag = 1 THEN GOSUB Tune1 WINDOW 3,"TeleChess",(21,50)-(259,130),0,2 COLOR 25,13 PRINT " Other TeleGames Being " PRINT " Considered " PRINT " " COLOR 3,13 PRINT " TeleGammon - Backgammon " PRINT " TeleCheckers - Checkers " PRINT " TeleDeck - Any Card Game " PRINT " " PRINT " Feel Free To Suggest More! " PRINT " " COLOR 17,1 PRINT " [Click To Continue] "; GOSUB Clicker IF SoundFlag = 1 THEN GOSUB Tune1 RETURN '---------------------------------- ButtonIsPressed: Xcord = MOUSE(3) Ycord = MOUSE(4) GOSUB CordToGrid IF nongrid <> 0 THEN ClickBox bb(f1,f2) = b(f1,f2) bb(s1,s2) = b(s1,s2) s1 = ygrid s2 = xgrid IF b(s1,s2) = 0 THEN Chatout InTransit = b(s1,s2) b(s1,s2) = 0 n = s1 : m = s2 GOSUB PlacePiece GOSUB GetNumber WHILE MOUSE(0) <1 OBJECT.X Outline,MOUSE(5)-10 OBJECT.Y Outline,MOUSE(6)-7 OBJECT.ON Outline WEND Xcord = MOUSE(5) Ycord = MOUSE(6) GOSUB CordToGrid f1 = ygrid f2 = xgrid MoveToMake = 1 GOTO ChatIn SendTheMove: GOSUB SendMove OBJECT.OFF :IF Ok=0 THEN n=s1:m=s2:b(s1,s2)=InTransit:GOSUB PlacePiece:GOTO Chatout IF b(f1,f2)<>0 AND SoundFlag = 1 THEN GOSUB Tune2 IF (InTransit = 1 OR InTransit = 11) AND (f1 = 8 OR f1 = 1) THEN GOSUB ElectPawn b(f1,f2)=InTransit n = f1 : m = f2 GOSUB PlacePiece IF SoundFlag = 1 THEN GOSUB Tune3 GOTO Chatout '---------------------------------- ClickBox: IF Xcord < 270 OR Xcord > 277 THEN GOTO Chatout IF Ycord > 31 AND Ycord < 36 THEN GOSUB Check IF Ycord > 48 AND Ycord < 53 THEN GOSUB Opps1 IF Ycord > 65 AND Ycord < 70 THEN GOSUB Hurry IF Ycord > 82 AND Ycord < 87 THEN GOSUB Mate GOTO Chatout Check: PUT (267,30),Button%(1,1),PSET PRINT#1," CHECK... "; PUT (267,30),Button%(1,2),PSET RETURN Opps1: PUT (267,47),Button%(1,1),PSET GOSUB OppsPressed PUT (267,47),Button%(1,2),PSET RETURN Hurry: PUT (267,64),Button%(1,1),PSET PRINT#1," ZZZZZ..ZZZZ..ZZZZZ... "; PUT (267,64),Button%(1,2),PSET RETURN Mate: PUT (267,81),Button%(1,1),PSET PRINT#1," CHECKMATE... YOU LOSE... " PUT (267,81),Button%(1,2),PSET RETURN '---------------------------------- GetNumber: Outline = InTransit IF Outline > 100 THEN Outline = Outline - 100 IF Outline > 10 THEN Outline = Outline - 10 RETURN '---------------------------------- DefineModeArray: Voice%(0) = 110 Voice%(1) = 0 Voice%(2) = 170 Voice%(3) = 1 Voice%(4) = 22200 Voice%(5) = 45 Voice%(6) = 10 Voice%(7) = 0 Voice%(8) = 0 RETURN