10 REM "Lights Out"
   20 REM Based on the game by Tiger Electronics.
   30 VDU 20,26
   40 VDU 29,18;2;
   50 GCOL 128
   60 CLG
   70 REM Global variables.
   80 DIM board%(4,4)
   90 playerX%=2
  100 playerY%=2
  110 lastFlash%=TIME
  120 :
  130 REPEAT
  140   REM Fetch the puzzle data.
  150   REPEAT
  160     READ puzzle%
  170     IF puzzle%=-1 RESTORE
  180   UNTIL puzzle%<>-1
  190   REM Set up the game board.
  200   PROC_initBoard(puzzle%)
  210   REM Main game loop - wait until cellCount% = 0.
  220   REPEAT
  230     k%=FN_waitGameKeyFlash
  240     IF k% AND 1 THEN playerY%=playerY%-1
  250     IF k% AND 2 THEN playerY%=playerY%+1
  260     IF k% AND 4 THEN playerX%=playerX%-1
  270     IF k% AND 8 THEN playerX%=playerX%+1
  280     :
  290     IF playerX%=5 THEN playerX%=0
  300     IF playerX%=-1 THEN playerX%=4
  310     IF playerY%=5 THEN playerY%=0
  320     IF playerY%=-1 THEN playerY%=4
  330     :
  340     IF k% AND 16 THEN PROC_pressCell(playerX%,playerY%)
  350   UNTIL cellCount%=0
  360 UNTIL FALSE
  370 END
  380 :
  390 DEF PROC_drawCell(x%,y%)
  400 GCOL 127
  410 MOVE x%*12,y%*12
  420 PLOT 97,10,10
  430 IF board%(x%,y%) ENDPROC
  440 GCOL 0
  450 MOVE x%*12+1,y%*12+1
  460 PLOT 97,8,8
  470 ENDPROC
  480 :
  490 DEF PROC_flashCell(x%,y%)
  500 IF TIME-lastFlash%<20 ENDPROC
  510 lastFlash%=TIME
  520 GCOL 4,0
  530 MOVE x%*12+2,y%*12+2
  540 PLOT 97,6,6
  550 ENDPROC
  560 :
  570 DEF FN_getGameKey
  580 r%=0
  590 IF INKEY(-58) THEN r%=r% OR 1
  600 IF INKEY(-42) THEN r%=r% OR 2
  610 IF INKEY(-26) THEN r%=r% OR 4
  620 IF INKEY(-122) THEN r%=r% OR 8
  630 IF INKEY(-74) THEN r%=r% OR 16
  640 =r%
  650 :
  660 DEF FN_waitGameKeyFlash
  670 REPEAT
  680   PROC_flashCell(playerX%,playerY%)
  690 UNTIL FN_getGameKey=0
  700 r%=0
  710 REPEAT
  720   PROC_flashCell(playerX%,playerY%)
  730   r%=FN_getGameKey
  740 UNTIL r%
  750 PROC_drawCell(playerX%,playerY%)
  760 =r%
  770 :
  780 DEF PROC_invertCell(x%,y%)
  790 IF x%<0 OR x%>4 OR y%<0 OR y%>4 THEN ENDPROC
  800 board%(x%,y%)=NOT board%(x%,y%)
  810 IF board%(x%,y%) THEN cellCount%=cellCount%+1 ELSE cellCount%=cellCount%-1
  820 PROC_drawCell(x%,y%)
  830 ENDPROC
  840 :
  850 DEF PROC_pressCell(x%,y%)
  860 *REFRESH OFF
  870 PROC_invertCell(x%,y%)
  880 PROC_invertCell(x%+1,y%)
  890 PROC_invertCell(x%-1,y%)
  900 PROC_invertCell(x%,y%+1)
  910 PROC_invertCell(x%,y%-1)
  920 *REFRESH ON
  930 ENDPROC
  940 :
  950 DEF PROC_initBoard(puzzle%)
  960 *REFRESH OFF
  970 cellCount%=0
  980 FOR y=0 TO 4
  990   FOR x=0 TO 4
 1000     board%(x,y)=-(puzzle% AND 1)
 1010     cellCount%=cellCount%+(puzzle% AND 1)
 1020     puzzle%=puzzle%/2
 1030     PROC_drawCell(x,y)
 1040   NEXT x
 1050 NEXT y
 1060 *REFRESH ON
 1070 ENDPROC
 1080 :
 1090 REM Level data.
 1100 DATA &5400
 1110 DATA &15A82B5
 1120 DATA &ADEF6A
 1130 DATA &D823B
 1140 DATA &1EEF47B
 1150 DATA &56AA
 1160 DATA &23C2CF
 1170 DATA &10C3107
 1180 DATA &10848E5
 1190 DATA &EA73DF
 1200 DATA &CC4007
 1210 DATA &47E1E4
 1220 DATA &14F5AFD
 1230 DATA &4742CF
 1240 DATA &8653DF
 1250 DATA &CD5E4F
 1260 DATA &6C00
 1270 DATA &10851C3
 1280 DATA &1E8C63E
 1290 DATA &C199DF
 1300 DATA &42934D
 1310 DATA &1E50027
 1320 DATA &B89BAF
 1330 DATA &1A238A7
 1340 DATA &FFB884
 1350 DATA &A8808A
 1360 DATA &15519B5
 1370 DATA &D33253
 1380 DATA &E22BEE
 1390 DATA &BE1726
 1400 DATA &1AD404
 1410 DATA &1B2009F
 1420 DATA &A24322
 1430 DATA &1E49701
 1440 DATA &E8B9CE
 1450 DATA &13CD
 1460 DATA &1007111
 1470 DATA &8E56B5
 1480 DATA &1557D5B
 1490 DATA &E508AA
 1500 DATA -1