10 REMark ANT HILL
 20 MODE 8
 25 WINDOW 512,256,0,0
 26 title
 30 init_graph
 35 REPeat game
 36  init
 50  draw_scene
 60  REPeat main
 70   one_move
 80   if TIME_UP OR HIT OR HOME THEN EXIT main
 85   delay
 90  END REPeat main
100  end_game
110  IF AGAIN=FALSE THEN EXIT game
120 END REPeat game
130 INK 0
140 PAPER 7
150 CLS
199 STOP

350 DEFine PROCedure init_graph
360  DATA -5245,-10109,-7806,-11646
370  DATA -6783,1665,2,0,8769,8316
380  DATA 0,0,9264,18432,8834,-11524,128
390  DATA 22664,-20228,32,26350,28672,20085
400  do_graph=RESPR(100)
410  RESTORE 360
420  FOR I=do_graph TO do_graph+22*2 STEP 2
430   READ B
440   POKE_W I,B
450  END FOR I
520  C_TAB=RESPR(32*12)
530  def_graph 0,3,0,0,14,15,63,31,51,68,132
540  def_graph 1,3,0,3,20,216,252,168,192,64,16
550  def_graph 2,3,0,0,112,248,252,248,204,34,33
560  def_graph 3,3,0,192,40,27,63,25,3,4,8
570  def_graph 4,6,0,24,24,126,24,60,102,195,195
580  def_graph 5,4,0,1,1,3,3,7,7,15,15
590  def_graph 6,4,0,31,31,63,63,127,127,255,255
600  def_graph 7,4,0,128,128,192,192,224,224,240,240
610  def_graph 8,4,0,248,248,252,252,254,254,255,255
620  def_graph 9,0,0,255,255,255,255,255,255,255,255
630  def_graph 10,1,1,255,255,255,255,255,255,255,255
640  def_graph 11,6,1,24,24,126,24,60,102,195,195
650  FALSE=0
660  TRUE=1
670  AGAIN=TRUE
699 END DEFine init_graph

1000 DEFine PROCedure init
1050  RANDOMISE
1060  XM%=RND(0 TO 20)+10
1070  YM%=2
1080  DIM A%(4,3),A1%(4,2)
1090  FOR I=0 TO 4
1100   A%(I,1)=RND(0 TO 10)+10
1110   A%(I,2)=(I+1)*5+2
1120   A%(I,3)=1
1130   A1%(I,1)=0:A1%(I,2)=1
1135   IF RND>0.5 THEN reverse I
1140  END FOR I
1160  AGAIN=FALSE
1170  HIT=FALSE
1180  HOME=FALSE
1190  TIME_UP=FALSE
1299 END DEFine init

1300 DEFine PROCedure def_graph(S%,F%,B%,R0%,R1%,R2%,R3%,R4%,R5%,R6%,R7%)
1310  LOCal A,FH%,FL%,BH%,BL%
1320  A=C_TAB+32*S%
1330  FH%=(F% DIV 4)*2
1340  FL%=F% && 3
1350  BH%=(B% DIV 4)*2
1360  BL%=B% && 3
1370  charline(R0%)
1380  charline(R1%)
1390  charline(R2%)
1400  charline(R3%)
1410  charline(R4%)
1420  charline(R5%)
1430  charline(R6%)
1440  charline(R7%)
1499 END DEFine def_graph

1500 DEFine PROCedure charline(R%)
1502  LOCal M%,J,I,DL%,DH%
1503  M%=128
1504  FOR J=1 TO 2
1505   DL%=0:DH%=0
1510   FOR I=1 TO 4
1520    IF (R% && M%)=M% THEN
1530     DL%=FH%+DL%*4
1540     DH%=FL%+DH%*4
1550    ELSE
1560     DL%=BH%+DL%*4
1570     DH%=BL%+DH%*4
1580    END IF
1590    M%=M% DIV 2
1600   END FOR I
1610   POKE A,DL%
1620   POKE A+1,DH%
1630   A=A+2
1640  END FOR J
1699 END DEFine charline

1700 DEFine PROCedure graph(X%,Y%,S%)
1710  CALL do_graph,X%,Y%,S%,C_TAB
1799 END DEFine graph

2000 DEFine PROCedure draw_scene
2010  PAPER 2
2020  CLS
2040  FOR X=0 TO 31
2050   graph X,7,9
2060   graph X,12,9
2070   graph X,17,9
2080   graph X,22,9
2090   graph X,27,9
2100  END FOR X
2120  FOR Y=0 TO 2
2125   FOR X=0 TO 31
2130    graph X,Y,10
2135   END FOR X
2140  END FOR Y
2160  shafts 2,3,6
2170  shafts 1,8,11
2180  shafts 2,13,16
2190  shafts 1,18,21
2200  shafts 2,22,26
2220  graph XM%,YM%,11
2240  graph 1,26,5:graph 2,26,7
2250  graph 1,27,6:graph 2,27,8
2270  FOR I=0 TO 4
2280   graph A%(I,1),A%(I,2),A1%(I,1)
2285   graph A%(I,1)+1,A%(I,2),A1%(I,2)
2290  END FOR I
2300  SDATE 2000,1,1,0,0,0
2999 END DEFine draw_scene

3000 DEFine PROCedure move_ant
3020  Q%=RND(1 TO 5)-1
3030  graph A%(Q%,1),A%(Q%,2),9:graph A%(Q%,1)+1,A%(Q%,2),9
3040  IF RND<5E-2 THEN reverse Q%
3050  A%(Q%,1)=A%(Q%,1)+A%(Q%,3)*2
3060  IF A%(Q%,1)<10 THEN
3061   A%(Q%,1) = 10
3062   reverse Q%
3065  END IF
3070  IF A%(Q%,1)>20 THEN
3071   A%(Q%,1)=20
3072   reverse Q%
3075  END IF
3080  graph A%(Q%,1),A%(Q%,2),A1%(Q%,1)
3085  graph A%(Q%,1)+1,A%(Q%,2),A1%(Q%,2)
3090  HIT=got_man(Q%)
3099 END DEFine move_ant

3500 DEFine PROCedure reverse(Q%)
3510  IF A1%(Q%,1)=3 THEN
3520   A1%(Q%,1)=0
3525   A1%(Q%,2)=1
3530  ELSE
3540   A1%(Q%,1)=3
3545   A1%(Q%,2)=2
3550  END IF
3560  A%(Q%,3)=-A%(Q%,3)
3599 END DEFine reverse

4000 DEFine PROCedure one_move
4010  move_man
4020  IF HIT=FALSE THEN
4030   move_ant
4040   get_time
4050  END IF
4099 END DEFine one_move

4500 DEFine PROCedure get_time
4510  TIME$=DATE$
4520  SEC=TIME$(17)*60
4530  SEC=SEC+TIME$(19 TO 20)
4550  IF SEC>MAX THEN TIME_UP=TRUE
4999 END DEFine get_time

5000 DEFine PROCedure move_man
5001  LOCal I%
5003  I%=KEYROW(1)
5004  IF I%=0 THEN END DEFine move_man
5010  IF YM%>4 THEN
5015   graph XM%,YM%,9
5020  ELSE
5022   graph XM%,YM%,10
5025  END IF
5060  IF I%=2 AND XM%>1 THEN XM%=XM%-1
5070  IF I%=16 AND XM%<30 THEN XM%=XM%+1
5080  IF I%=128 AND pix(YM%+1,XM%,1,1)=0 THEN down_shaft
5090  IF pix(YM%,XM%,4,4)=3 THEN
5095   HIT=TRUE
5096   Q%=(YM%-2)/5-1
5098  END IF
5100  IF YM%>4 THEN
5102   graph XM%,YM%,4
5104  ELSE
5106   graph XM%,YM%,11
5107  END IF
5110  IF XM%=3 AND YM%=27 THEN HOME=TRUE
5199 END DEFine move_man

5500 DEFine PROCedure down_shaft
5520  FOR i=1 TO 4
5530   YM%=YM%+1
5540   graph XM%,YM%,4
5550   BEEP 0.1,YM%
5560   graph XM%,YM%,9
5570  END FOR I
5575  YM%=YM%+1
5580  BEEP
5599 END DEFine down_shaft

5600 DEFine PROCedure find_shafts(Y%)
5610  X%=0
5620  REPeat find1
5630   COL=pix(Y%+1,X%,1,1)
5640   X1%=X%
5650   X%=X%+1
5660   IF X%>28 OR COL=0 THEN EXIT find1
5670  END REPeat find1
5680  X2%=0
5690  REPeat find2
5700   COL=pix(Y%+1,X%,1,1)
5705   IF COL=0 THEN X2%=X%
5710   X%=X%+1
5720   IF X%>28 OR COL=0 THEN EXIT find2
5730  END REPeat find2
5799 END DEFine find_shafts

5800 DEFine PROCedure drag(X%)
5810  IF A%(Q%,1)+2=X% THEN XM%=X%: END DEFine drag
5820  IF SGN(X%-A%(Q%,1)-2)<>A%(Q%,3) THEN reverse Q%
5830  REPeat goto_shaft
5840   graph A%(Q%,1),A%(Q%,2),9
5845   graph A%(Q%,1)+1,A%(Q%,2),9
5848   graph A%(Q%,1)+2,A%(Q%,2),9
5850   A%(Q%,1)=A%(Q%,1)+A%(Q%,3)
5860   graph A%(Q%,1),A%(Q%,2),A1%(Q%,1)
5863   graph A%(Q%,1)+1,A%(Q%,2),A1%(Q%,2)
5866   graph A%(Q%,1)+2,A%(Q%,2),4
5870   delay
5880   IF A%(Q%,1)+2=X% THEN EXIT goto_shaft
5890  END REPeat goto_shaft
5895  XM%=X%
5899 END DEFine drag

5900 DEFine PROCedure goto_man(Q%)
5910  IF A%(Q%,1)+1=XM% THEN END DEFine goto_man
5920  IF SGN(XM%-A%(Q%,1)-1)<>A%(Q%,3) THEN reverse Q%
5930  REPeat mve_ant
5940   graph A%(Q%,1),A%(Q%,2),9
5945   graph A%(Q%,1)+1,A%(Q%,2),9
5950   A%(Q%,1)=A%(Q%,1)+A%(Q%,3)
5960   graph A%(Q%,1),A%(Q%,2),A1%(Q%,1)
5970   graph A%(Q%,1)+1,A%(Q%,2),A1%(Q%,2)
5975   delay
5980   IF A%(Q%,1)+1=XM% THEN EXIT mve_ant
5990  END REPeat mve_ant
5999 END DEFine goto_man

6000 DEFine PROCedure end_game
6010  IF HIT THEN
6012   capture
6014  ELSE
6020   IF TIME_UP THEN
6022    hatch
6024   ELSE
6030    IF HOME THEN
6032     destroy_nest
6040    END IF
6050   END IF
6060  END IF
6100  REPeat an_game
6110  AT 24,3
6112  PRINT "Another game Y/N ?";
6114  INPUT N$
6120  IF N$(1)="Y" THEN AGAIN=TRUE
6199 END DEFine end_game

6200 DEFine PROCedure capture
6210  AT 23,3: PRINT "You are captured!"
6220  REPeat ant
6230   IF Q%=4 THEN EXIT ant
6240   goto_man(Q%)
6250   find_shafts A%(Q%,2)
6260   IF ABS(X2%-A%(Q%,1))<ABS(X1%-A%(Q%,1)) AND X2%<> 0 THEN
6262    drag X2%
6264   ELSE
6266    drag X1%
6268   END IF
6270   graph A%(Q%,1)+2,A%(Q%,2),9
6275   graph A%(Q%,1)+3,A%(Q%,2),9
6280   BEEP 0.1,-10
6290   down_shaft
6300   graph XM%,YM%,4
6310   Q%=Q%+1
6320  END REPeat ant
6330  goto_man(Q%)
6340  drag 5
6399 END DEFine capture

6500 DEFine PROCedure hatch
6510  AT 23,3:PRINT "THE ANTS ARE HATCHING "
6520  FOR I=1 TO RND(0 TO 20)+20
6530   X=RND(0 TO 25)+5
6532   Y=RND(0 TO 15)+5
6535   T%=RND(0 TO 4)
6540   graph X,Y,A1%(T%,1)
6545   graph X+1,Y,A1%(T%,2)
6550   BEEP 0.1,I
6555   PAUSE 1
6560  END FOR I
6570  BEEP
6599 END DEFine hatch

6800 DEFine PROCedure destroy_nest
6810  AT 23,2:PRINT "YOU DIT IT"
6815  RESTORE 6900
6820  REPeat tune
6830   READ D,P
6840   IF D=999 THEN EXIT tune
6850   BEEP D,P
6860   PAUSE D*125
6865   BEEP
6870  END REPeat tune
6900  DATA 0.1,14,0.1,13
6910  DATA 0.1,12,0.1,11
6920  DATA 0.2,10,0.2,10
6990  DATA 999,999
6999 END DEFine destroy_nest

8000 DEFine PROCedure title
8010  BORDER 0:INK 6: PAPER 0: CLS
8020  AT 3,14:PRINT "A N T  H I L L"
8040  AT 7,3:PRINT "In this game you have a fixed "
8050  PRINT TO 2;"amount of time to destroy the ants"
8060  PRINT TO 2;"nest before the ants hatch!"
8070  PRINT TO 2;"BEWARE: the soldier ants guarding the"
8080  PRINT TO 2;"tunnels will capture you and take you"
8090  PRINT TO 2;"to the nest to feed the youngs!"
8100  PRINT TO 2;"Good Luck!"
8200  REPeat diff
8300   AT 18,5:PRINT "Which difficulty level -"
8310   PRINT TO 3;"1. Expert, 2> Medium or 3. Novice ";
8320   INPUT DF
8330   IF DF>0 AND DF<4 THEN EXIT diff
8335  END REPeat diff
8340  MAX=(20+DF*10)
8350  AT 22,15
8360  FLASH 1
8370  PRINT "Please wait"
8380  FLASH 0
8399 END DEFine title

8400 DEFine PROCedure shafts(NO,Y1,Y2)
8410  X1%=RND(1 TO 4)+9:X2%=RND(0 TO 4)+16
8420  FOR Y=Y1 TO Y2
8430   IF NO=1 THEN graph INT((X1%+X2%)/2),Y,9
8440   IF NO=2 THEN graph X1%,Y,9:graph X2%,Y,9
8450  END FOR Y
8499 END DEFine shafts

8500 DEFine FuNction got_man(Q%)
8510  IF A%(Q%,2)<>YM% THEN RETurn FALSE
8520  IF A%(Q%,1)<>XM% AND A%(Q%,1)+1<>XM% THEN RETurn FALSE
8530  RETurn TRUE
8599 END DEFine got_man

8600 DEFine PROCedure delay
8610  PAUSE 5
8699 END DEFine delay

8700 DEFine FuNction SGN(N%)
8710  IF N%=0 THEN
8715   RETurn 0
8716  ELSE
8720   IF N%<0 THEN
8725    RETurn -1
8730   ELSE
8740    RETurn 1
8750   END IF
8760  END IF
8699 END DEFine SGN

9500 DEFine FuNction pix(R%,C%,X%,Y%)
9510  LOCal A%,P%,B%,A
9520  P%=C%*8+X%
9530  A=131072+(512*R%+Y%*64+P% DIV 4)*2
9540  B%=PEEK(A+1)
9550  A%=PEEK(A)
9560  P%=P% MOD 4
9570  IF P%=3 THEN RETurn ((2 && A%)*2)+(3 && B%)
9580  IF P%=2 THEN RETurn ((8 && A%) DIV 2)+((12 && B%) DIV 4)
9590  IF P%=1 THEN RETurn ((32 && A%) DIV 8)+((48 && B%) DIV 16)
9600  IF P%=0 THEN RETurn ((128 && A%) DIV 32)+((192 && B%) DIV 64)
9699 END DEFine pix