home *** CD-ROM | disk | FTP | other *** search
AMOS Source Code | 1992-08-30 | 22.3 KB | 763 lines |
- Set Buffer 14
- Dim F(29,29,1),T1(24),T2(24),BLK(16),B(81,4)
- Global B(),S$,T2(),F(),VIW
- Gosub INIT
- Gosub CLEAR
- Screen 0
- Gosub DEFUPDAT
- For A=0 To 31 : Colour A,0 : Next
- Screen Show 0 : Fade 3 To 1 : Screen 1
- Wait 50
- Screen 1 : For A=0 To 31 : Colour A,0 : Next
- Screen Show 1 : Fade 3 To 0
- Screen 0
- Doke Start(9)+20,0
- Call Start(9)
- Wait Vbl
- SCROL["WELCOME TO APFELMONSTER EDITOR DELUXE VERSION 1.0!"]
- Repeat : Until Mouse Key or(Inkey$<>"") or Fire(1)
- PAGE=1 : NEWPAGE[0]
- Repeat : Until Mouse Key=0 and Fire(1)=0
- CORX=0 : CORY=0
- MD=1 : CHAR=1 : WALL=0 : IMAGE=0
- Gosub UPAPFEL : Gosub UPMONST
- Amal On
- Do
- I$=Inkey$ : X=X Mouse-128 : Y=Y Mouse-40 : M=Mouse Key : B=0
- RX=((I$=Cleft$)-(I$=Cright$))*2+Jleft(1)-Jright(1)+(X<10)-(X>309)
- RY=((I$=Cup$)-(I$=Cdown$))*2+Jup(1)-Jdown(1)+(Y<10)-(Y>245)
- ' RX=(X<10)-(X>309)
- ' RY=(Y<10)-(Y>245)
- If X>283 and Y>19 and X<314 and Y<50 and M Then OX=(X-294)*16 : OY=(Y-25)*16 : M=0 : RX=0 : RY=0
- OX=Max(0,Min(160,OX+RX*2))
- OY=Max(0,Min(304,OY+RY*2))
- Amreg(0)=OX : Amreg(1)=OY
- If Y>89 Then BX=(X+OX)/16 : BY=(Y-90+OY)/16 : If CORX<>BX or CORY<>BY Then Gosub UPCOR
- If M and Y<89 Then Gosub CHECKBUT
- If M and Y>89 Then Gosub SETBLOCKS
- If B Then Gosub ACTION
- If Fire(1) Then Gosub BLITZ : Repeat : Until Fire(1)=0
- Screen Offset 1,OX,OY : Wait Vbl
- Loop
- End
- ACTION:
- If B<10 Then Gosub DEFAUL : Return
- If B=29 or B=63 Then MD=1 : PAGE=1 : NEWPAGE[0] : Gosub UPCHAR : Gosub UPWALL : Gosub UPAPFEL : Gosub UPMONST
- If B=16 or B=45 or B=46 Then MD=7 : PAGE=2 : NEWPAGE[1] : Gosub UPFLGNUM : Gosub UPFLGBUT1 : Gosub UPFLGBUT2 : Gosub UPFLGBLK
- If B=36 Then MD=8 : PAGE=3 : NEWPAGE[2] : Gosub UPTELE
- If B=37 Then MD=9 : PAGE=4 : NEWPAGE[3] : Gosub UPSWI : Gosub UPFLGBLK
- If B=17 Then MD=10 : PAGE=5 : NEWPAGE[4] : Gosub UPMFLGS : Gosub UPMATTR
- If B=10 Then Screen 1 : Bob Off : Screen 0 : Gosub LADEN : Gosub UPBOBS
- If B=11 Then Gosub SPEICHERN
- If B=12 Then Screen 1 : Bob Off : Screen 0 : Gosub CLEAR : Gosub UPBOBS
- If B=13 Then Pop : Goto QUIT
- If B=14 Then Screen 1 : Bob Off : Screen 0 : Gosub MAKESH : Gosub UPBOBS
- If B=15 Then Gosub FL
- If B=18 and MD=4 Then Add DI,1,0 To 3 : Gosub UPAPFEL
- If B=18 and MD<>4 Then MD=4
- If B=19 Then MD=5
- If B=20 Then Add MNR,-1,0 To 3 : Gosub UPMONST : MD=6
- If B=21 Then MD=6
- If B=22 Then Add MNR,1,0 To 3 : Gosub UPMONST : MD=6
- If B=23 Then Add CHAR,-1,0 To 24 : Gosub UPCHAR : MD=1
- If B=24 Then MD=1
- If B=25 Then Add CHAR,1,0 To 24 : Gosub UPCHAR : MD=1
- If B=26 Then Add WALL,-1,0 To 15 : Gosub UPWALL : MD=3
- If B=27 Then MD=3
- If B=28 Then Add WALL,1,0 To 15 : Gosub UPWALL : MD=3
- If B=30 Then F(BBX,BBY,0)=((F(BBX,BBY,0)+2) and 6)+(F(BBX,BBY,0) and 249) : Gosub UPFLGBUT1
- If B=31 Then F(BBX,BBY,0)=((F(BBX,BBY,0)+1) and 1)+(F(BBX,BBY,0) and 254) : Gosub UPFLGBUT2
- If B=32 Then F(BBX,BBY,0)=(Max((F(BBX,BBY,0)-8),0) and 248)+(F(BBX,BBY,0) and 7) : Gosub UPFLGNUM
- If B=33 Then F(BBX,BBY,0)=(Min((F(BBX,BBY,0)+8),232) and 248)+(F(BBX,BBY,0) and 7) : Gosub UPFLGNUM
- If B=34 Then Gosub SUFLGBLK : Gosub UPFLGBLK
- If B=35 Then Gosub ADFLGBLK : Gosub UPFLGBLK
- If B=38 Then Add TELE,-1,0 To 29
- If B=39 Then Poke ST+40+TELE*2,Max(Peek(ST+40+TELE*2)-1,1)
- If B=40 Then Poke ST+41+TELE*2,Max(Peek(ST+41+TELE*2)-1,1)
- If B=41 Then Add TELE,1,0 To 29
- If B=42 Then Poke ST+40+TELE*2,Min(Peek(ST+40+TELE*2)+1,28)
- If B=43 Then Poke ST+41+TELE*2,Min(Peek(ST+41+TELE*2)+1,28)
- If B=44 Then Doke ST+40+TELE*2,0
- If B>37 and B<45 Then Gosub UPTELE
- If B=47 Then Add SWI,-1,0 To 14 : ACT=0
- If B=48 Then Add SWI,1,0 To 14 : ACT=0
- If B=49 Then Add ACT,-1,0 To 4
- If B=50 Then Add ACT,1,0 To 4
- If B=51 Then Poke ST+100+SWI*20+ACT*4,Max(Peek(ST+100+SWI*20+ACT*4)-1,1)
- If B=52 Then Poke ST+100+SWI*20+ACT*4,Min(Peek(ST+100+SWI*20+ACT*4)+1,28)
- If B=53 Then Poke ST+101+SWI*20+ACT*4,Max(Peek(ST+101+SWI*20+ACT*4)-1,1)
- If B=54 Then Poke ST+101+SWI*20+ACT*4,Min(Peek(ST+101+SWI*20+ACT*4)+1,28)
- If B>54 and B<61 Then A=ST+102+SWI*20+ACT*4
- If B=55 Then Poke A,((Peek(A)+2) and 6)+(Peek(A) and 249) : Gosub UPFLGBUT1
- If B=56 Then Poke A,((Peek(A)+1) and 1)+(Peek(A) and 254) : Gosub UPFLGBUT2
- If B=57 Then Poke A,(Max((Peek(A)-8),0) and 248)+(Peek(A) and 7) : Gosub UPFLGNUM
- If B=58 Then Poke A,(Min((Peek(A)+8),232) and 248)+(Peek(A) and 7) : Gosub UPFLGNUM
- If B=59 Then Gosub SUFLGBLK2 : Gosub UPFLGBLK
- If B=60 Then Gosub ADFLGBLK2 : Gosub UPFLGBLK
- If B=61 Then For A=100 To 119 : Poke ST+SWI*20+A,0 : Next : ACT=0
- If B=62 Then Loke ST+100+SWI*20+ACT*4,0
- If(B>46 and B<51) or B=61 or B=62 Then Gosub UPFLGBUT1 : Gosub UPFLGBUT2 : Gosub UPFLGNUM : Gosub UPFLGBLK
- If(B>46 and B<55) or B=61 or B=62 Then Gosub UPSWI
- If B>63 and B<80 Then A=ST+24+MNR*4
- If B=64 Then Poke A+2,Max(Peek(A+2)-1,0)
- If B=65 Then Poke A+2,Min(Peek(A+2)+1,8)
- If B=66 Then Poke A,Max(Peek(A)-1,1)
- If B=67 Then Poke A,Min(Peek(A)+1,28)
- If B=68 Then Poke A+1,Max(Peek(A+1)-1,1)
- If B=69 Then Poke A+1,Min(Peek(A+1)+1,28)
- If B=70 Then Poke A+3,Max((Peek(A+3) and 3)-1,0)+(Peek(A+3) and 252)
- If B=71 Then Poke A+3,Min((Peek(A+3) and 3)+1,3)+(Peek(A+3) and 252)
- If B=72 Then Add MNR,-1,0 To 3 : Gosub UPMATTR
- If B=73 Then Add MNR,1,0 To 3 : Gosub UPMATTR
- If B=74 Then Bchg 2,A+3
- If B=75 Then Bchg 5,A+3
- If B=76 Then Bchg 6,A+3
- If B=77 Then Bchg 3,A+3
- If B=78 Then Bchg 4,A+3
- If B=79 Then Bchg 7,A+3
- If B>63 and B<74 Then Gosub UPMFLGS : Gosub UPBOBS
- Return
- ADFLGBLK:
- If F(BBX,BBY,1)>219 Then Add F(BBX,BBY,1),1,220 To 235 : Return
- If F(BBX,BBY,1)>162 Then Return
- If F(BBX,BBY,1)=0 Then F(BBX,BBY,1)=1 : Gosub FLGBLK : Return
- F(BBX,BBY,1)=Min(F(BBX,BBY,1)+7,168)
- Gosub FLGBLK
- Return
- SUFLGBLK:
- If F(BBX,BBY,1)>219 Then Add F(BBX,BBY,1),-1,220 To 235 : Return
- F(BBX,BBY,1)=Max(F(BBX,BBY,1)-7,0)
- Gosub FLGBLK
- Return
- ADFLGBLK2:
- If Peek(A+1)<220 and Peek(A+1)>0 Then Poke A+1,Peek(A+1)+7
- If Peek(A+1)>219 or Peek(A+1)=0 Then Poke A+1,Peek(A+1)+1
- If Peek(A+1)>168 and Peek(A+1)<220 Then Poke A+1,220 : Return
- If Peek(A+1)>235 Then Poke A+1,0 : Return
- Return
- SUFLGBLK2:
- If Peek(A+1)<220 and Peek(A+1)>1 Then Poke A+1,Peek(A+1)-7
- If Peek(A+1)>219 or Peek(A+1)<2 Then Poke A+1,Peek(A+1)-1
- If Peek(A+1)=255 Then Poke A+1,235 : Return
- If Peek(A+1)<220 and Peek(A+1)>167 Then Poke A+1,167 : Return
- Return
- FLGBLK:
- BX=BBX : BY=BBY : Gosub CHECKBOBS
- If REF=1 Then Screen 1 : Bob Off : Screen 0
- XX=BBX : YY=BBY : Gosub MAKESHADOW
- If REF Then Gosub UPBOBS
- Return
- SETBLOCKS:
- If MD=4 or MD=5 or MD=6 or MD>7 Then BX=Max(Min(BX,28),1) : BY=Max(Min(BY,28),1)
- BBX=BX : BBY=BY
- Gosub CHECKBOBS
- If REF=1 Then Screen 1 : Bob Off : Screen 0
- If MD=1 and M=1 Then XX=BX : YY=BY : F(BX,BY,0)=0 : F(BX,BY,1)=T1(CHAR) : Gosub MAKESHADOW
- If(MD=1 or MD=3) and M=2 Then XX=BX : YY=BY : F(BX,BY,0)=0 : F(BX,BY,1)=1 : Gosub MAKESHADOW
- If MD=2 Then Gosub FLOOD
- If MD=3 and M=1 Then PB[WALL+221,BX*16,BY*16] : F(BX,BY,0)=1 : F(BX,BY,1)=WALL+220
- If MD=4 Then AMX=BX : AMY=BY
- If MD=5 Then HMX=BX : HMY=BY
- If MD=6 Then Doke ST+24+4*MNR,BX*256+BY
- If MD=7 Then Gosub UPFLGNUM : Gosub UPFLGBUT1 : Gosub UPFLGBUT2 : Gosub UPFLGBLK
- If MD=8 Then Doke ST+40+TELE*2,BX*256+BY : Gosub UPTELE
- If MD=9 Then Doke ST+100+SWI*20+ACT*4,BX*256+BY : Gosub UPSWI
- If MD=10 Then Doke ST+24+MNR*4,BX*256+BY : REF=1
- If REF Then Gosub UPBOBS
- Return
- CHECKBOBS:
- REF=0
- For A=0 To 3
- If BX=Peek(ST+24+A*4) and BY=Peek(ST+25+A*4) Then REF=1 : Exit
- Next
- If(BX=AMX and BY=AMY) or(BX=HMX and BY=HMY) Then REF=1
- If MD=8 Then REF=0
- Return
- BLITZ:
- For A=1 To 31 : Colour A,$FFF : Next : Fade 2 To 1
- Return
- QUIT:
- Amal Off
- Sprite Off
- Call Start(9)+2
- Screen Close 1
- Screen Close 0
- End
- TEX:
- ' Ink 6,CT : Text XT,YT+6,TT$
- 'Return
- For ABC=1 To Len(TT$)
- BCD=Max(1,Instr(S$,Mid$(TT$,ABC,1)))
- Cls CT,XT,YT To XT+7,YT+7
- Put Block BCD+299,XT,YT
- Add XT,8
- Next
- Return
- DEFAUL:
- Add TIME,((B=1)-(B=2))*10,0 To 590
- Add LE,(B=3)-(B=4),0 To 99
- Add SECR,(B=5)-(B=6),0 To 99
- If B=1 or B=2 Then Gosub UPTIME
- If B=3 or B=4 Then Gosub UPLEVEL
- If B=5 or B=6 Then Gosub UPSECRET
- If B=7 Then Gosub EDINAME
- If B=8 and VIW=1 Then VIW=0 : Gosub LITTLMAP
- If B=9 and VIW=0 Then VIW=1 : Gosub LITTLMAP
- Return
- DEFUPDAT:
- XT=182 : YT=62 : CT=0 : TT$=NAME$ : Gosub TEX
- A$=Chr$(48+TIME/60)+":"+Chr$(48+(TIME-TIME/60*60)/10)+Chr$(48+(TIME-TIME/10*10))
- XT=238 : YT=26 : CT=3 : TT$=A$ : Gosub TEX
- If LE<10 Then A$="0"+Str$(LE)-" " Else A$=Str$(LE)-" "
- XT=238 : YT=34 : CT=3 : TT$=A$ : Gosub TEX
- If SECR<10 Then A$="0"+Str$(SECR)-" " Else A$=Str$(SECR)-" "
- XT=238 : YT=42 : CT=3 : TT$=A$ : Gosub TEX
- Return
- UPCOR:
- CORX=BX : CORY=BY
- If BX<10 Then A$="0"+Str$(BX)-" " Else A$=Str$(BX)-" "
- If BY<10 Then A$=A$+" 0"+Str$(BY)-" " Else A$=A$+Str$(BY)
- XT=238 : YT=18 : CT=3 : TT$=A$ : Gosub TEX
- Return
- UPTIME:
- A$=Chr$(48+TIME/60)+":"+Chr$(48+(TIME-TIME/60*60)/10)+Chr$(48+(TIME-TIME/10*10))
- XT=238 : YT=26 : CT=3 : TT$=A$ : Gosub TEX
- Return
- UPLEVEL:
- If LE<10 Then A$="0"+Str$(LE)-" " Else A$=Str$(LE)-" "
- XT=238 : YT=34 : CT=3 : TT$=A$ : Gosub TEX
- Return
- UPSECRET:
- If SECR<10 Then A$="0"+Str$(SECR)-" " Else A$=Str$(SECR)-" "
- XT=238 : YT=42 : CT=3 : TT$=A$ : Gosub TEX
- Return
- UPFLGNUM:
- If MD=7 Then A=(F(BBX,BBY,0) and 248)/8
- If MD=9 Then A=(Peek(ST+102+SWI*20+ACT*4) and 248)/8
- If A<10 Then A$="0"+Str$(A)-" " Else A$=Str$(A)-" "
- XT=122 : YT=29 : CT=3 : TT$=A$ : Gosub TEX
- Return
- UPTELE:
- If TELE<10 Then A$="0"+Str$(TELE)-" " Else A$=Str$(TELE)-" "
- XT=91 : YT=29 : CT=3 : TT$=A$ : Gosub TEX
- A=Peek(ST+40+TELE*2)
- If A<10 Then A$="0"+Str$(A)-" " Else A$=Str$(A)-" "
- If A=0 Then A$="NO"
- XT=127 : YT=29 : CT=3 : TT$=A$ : Gosub TEX
- A=Peek(ST+41+TELE*2)
- If A<10 Then A$="0"+Str$(A)-" " Else A$=Str$(A)-" "
- If A=0 Then A$="NO"
- XT=163 : YT=29 : CT=3 : TT$=A$ : Gosub TEX
- Return
- UPSWI:
- If SWI<10 Then A$="0"+Str$(SWI)-" " Else A$=Str$(SWI)-" "
- XT=45 : YT=34 : CT=3 : TT$=A$ : Gosub TEX
- TT$="0"+Str$(ACT)-" " : XT=45 : YT=42 : CT=3 : Gosub TEX
- A=Peek(ST+100+SWI*20+ACT*4)
- If A<10 Then A$="0"+Str$(A)-" " Else A$=Str$(A)-" "
- If A=0 Then A$="NO"
- XT=29 : YT=50 : CT=3 : TT$=A$ : Gosub TEX
- A=Peek(ST+101+SWI*20+ACT*4)
- If A<10 Then A$="0"+Str$(A)-" " Else A$=Str$(A)-" "
- If A=0 Then A$="NO"
- XT=70 : YT=50 : CT=3 : TT$=A$ : Gosub TEX
- Return
- UPFLGBUT1:
- If MD=7 Then A=(F(BBX,BBY,0) and 6)/2
- If MD=9 Then A=(Peek(ST+102+SWI*20+ACT*4) and 6)/2
- If A=0 Then Screen Copy 0,176,232,226,242 To 0,70,27
- If A=1 Then Screen Copy 0,227,232,277,242 To 0,70,27
- If A=2 Then Screen Copy 0,278,232,328,242 To 0,70,27
- If A=3 Then Screen Copy 0,176,243,226,253 To 0,70,27
- Return
- UPFLGBUT2:
- If MD=7 Then A=F(BBX,BBY,0) and 1
- If MD=9 Then A=Peek(ST+102+SWI*20+ACT*4) and 1
- If A=0 Then Screen Copy 0,227,243,277,253 To 0,70,38
- If A=1 Then Screen Copy 0,278,243,328,253 To 0,70,38
- Return
- UPFLGBLK:
- If MD=7 Then Put Block F(BBX,BBY,1)+1,150,30
- If MD=9 Then Put Block Peek(ST+103+SWI*20+ACT*4)+1,150,30
- Return
- UPMFLGS:
- TT$="0"+Str$(Peek(ST+26+MNR*4))-" "
- If Peek(ST+26+MNR*4)=0 Then TT$="NO"
- XT=114 : YT=17 : CT=3 : Gosub TEX
- A=Peek(ST+24+MNR*4)
- If A<10 Then A$="0"+Str$(A)-" " Else A$=Str$(A)-" "
- XT=114 : YT=25 : CT=3 : TT$=A$ : Gosub TEX
- A=Peek(ST+25+MNR*4)
- If A<10 Then A$="0"+Str$(A)-" " Else A$=Str$(A)-" "
- XT=114 : YT=33 : CT=3 : TT$=A$ : Gosub TEX
- A=Peek(ST+27+MNR*4) and 3
- If A=3 Then A=8
- If A=2 Then A=4
- If A=1 Then A=2
- If A=0 Then A=1
- TT$="0"+Str$(A)-" " : XT=114 : YT=41 : CT=3 : Gosub TEX
- Ink 0 : Bar 150,30 To 165,44
- If Peek(ST+26+MNR*4) Then Paste Bob 150,30,6+Peek(ST+26+MNR*4)
- Return
- UPMATTR:
- For A=74 To 79
- If Point(B(A,0),B(A,1))=10 Then REALISE[A]
- Next
- A=Peek(ST+27+MNR*4)
- If A and 4 Then PRESS[74]
- If A and 32 Then PRESS[75]
- If A and 64 Then PRESS[76]
- If A and 8 Then PRESS[77]
- If A and 16 Then PRESS[78]
- If A and 128 Then PRESS[79]
- Return
- UPCHAR:
- Put Block T1(CHAR)+1,150,31
- Return
- UPWALL:
- Put Block WALL+221,150,51
- Return
- UPAPFEL:
- Ink 0 : Bar 100,31 To 114,45
- Paste Bob 100,31,2+DI
- Gosub UPBOBS
- Return
- UPMONST:
- Ink 0 : Bar 109,51 To 123,65
- If Peek(ST+26+MNR*4) Then Paste Bob 109,51,6+Peek(ST+26+MNR*4)
- Gosub UPBOBS
- Return
- UPBOBS:
- Screen 1 : Wait Vbl
- Bob 1,AMX*16,AMY*16,DI+2
- Bob 2,HMX*16,HMY*16,6
- For A=0 To 3
- If Peek(ST+26+A*4) Then Bob 3+A,Peek(ST+24+A*4)*16,Peek(ST+25+A*4)*16,Peek(ST+26+A*4)+6 Else Bob Off 3+A
- Next
- Screen 0
- Return
- EDINAME:
- Hide
- SCROL["EDIT NAME!"]
- POS=1 : POSA=2
- A$=""
- Repeat
- I$=Upper$(Inkey$) : M=Mouse Key
- If M=2 Then NAME$=Space$(12) : I$=Chr$(13)
- If Instr(S$,I$)>0 Then NAME$=Left$(NAME$,POS-1)+I$+Right$(NAME$,12-POS) : POS=Min(POS+1,12)
- If I$=Chr$(8) Then POS=Max(POS-1,1) : NAME$=Left$(NAME$,POS-1)+" "+Right$(NAME$,12-POS)
- If I$=Cleft$ Then POS=Max(POS-1,1)
- If I$=Cright$ Then POS=Min(POS+1,12)
- If POS<>POSA
- Ink 0 : Draw 174+POSA*8,69 To 180+POSA*8,69
- Ink 23 : Draw 174+POS*8,69 To 180+POS*8,69
- POSA=POS
- End If
- If NAME$<>A$ Then A$=NAME$ : XT=182 : YT=62 : CT=0 : TT$=NAME$ : Gosub TEX
- Until I$=Chr$(13) or M=1
- Ink 0 : Draw 174+POSA*8,69 To 181+POSA*8,69
- Show
- Return
- INIT:
- Close Editor : Close Workbench
- Unpack 8 To 0 : Screen Hide 0
- For Y=0 To 11
- For X=0 To 19
- If(Point(X*16,Y*16)<>0) or(X+Y=0) Then Get Block X+Y*20+1,X*16,Y*16,16,16,0
- Next
- Next
- Unpack 6 To 0 : Screen Hide 0
- Screen Open 1,30*16,30*16,32,0 : Screen Hide 1
- Curs Off : Paper 0 : Pen 1 : Flash Off : Cls 1
- Get Palette 0
- Screen Display 1,128,129,320,176
- S$=" ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.,:'/!"+Chr$(22)
- Screen 0
- For A=0 To 24
- Read T1(A)
- Next
- For A=0 To 24
- Read T2(A)
- Next
- For A=1 To 79
- Read B(A,0),B(A,1),B(A,2),B(A,3)
- ' Box B(A,0),B(A,1) To B(A,2),B(A,3)
- Next
- Reserve As Work 7,2200
- ST=Start(7)
- For A=0 To 399
- Poke ST+A,0
- Next
- For A=400 To 2198 Step 2
- Poke ST+A,0 : Poke ST+A+1,1
- Next
- For A=0 To Len(S$)-1
- Get Block A+300,(A mod 4)*8+320,(A/4)*8,8,8,1
- Next
- Sprite 2,0,0,41
- Sprite 4,0,0,40
- Channel 0 To Sprite 2
- Channel 1 To Sprite 4
- A$="A: L X=RA/16+411; L Y=RB/16+59; PP; J A; "
- Amal 0,A$
- A$="A: P; I YM<129 J B; "
- A$=A$+"L R0=RA/16*16; L R0=RA-R0; L X=XM+R0/16*16-R0;"
- A$=A$+" L R1=RB/16*16; L R1=RB-R1; L Y=YM-1+R1/16*16-R1+1; J A; "
- A$=A$+"B: L X=0; L Y=0; P; J A; "
- Amal 1,A$
- Screen 0
- OX=0 : OY=0 : X=0 : Y=0 : RZ=0 : Z=0 : LE=0
- Limit Mouse 128,40 To 447,304
- Change Mouse 2
- S=Start(9)
- Loke S+4,Logbase(1)+76*44+1
- Loke S+8,Logbase(2)+76*44+1
- Loke S+12,Logbase(1)+200*44+22
- Loke S+16,Logbase(2)+200*44+22
- Return
- LADEN:
- If Exist("Levels/"+Str$(LE)-" ")=0 Then SCROL["LEVEL DOESN'T EXIST!"] : Return
- SCROL["LOADING..."]
- Erase 7 : Reserve As Work 7,2200
- Bload "Levels/"+Str$(LE)-" ",Start(7)
- ST=Start(7)
- AMX=Peek(ST) : AMY=Peek(ST+1) : DI=Deek(ST+2) : TIME=Deek(ST+6)
- HMX=Peek(ST+22) : HMY=Peek(ST+23)
- SECR=Deek(ST+8)
- NAME$=""
- For A=10 To 21 : NAME$=NAME$+Chr$(Peek(ST+A)) : Next
- For YY=0 To 29
- For XX=0 To 29
- F(XX,YY,0)=Peek(ST+400+YY*60+XX*2)
- F(XX,YY,1)=Peek(ST+401+YY*60+XX*2)
- Next
- Next
- Gosub ZEIGEN
- Gosub DEFUPDAT
- SCROL["DONE!"]
- Gosub BLITZ
- VIW=0
- Return
- SPEICHERN:
- SCROL["SAVING..."]
- ST=Start(7)
- Doke ST,AMX*256+AMY : Doke ST+2,DI : Doke ST+6,TIME
- Doke ST+8,SECR
- For A=1 To 12 : Poke ST+A+9,Asc(Mid$(NAME$,A,1)) : Next
- Doke ST+22,HMX*256+HMY
- APPLES=0
- For YY=0 To 29
- For XX=0 To 29
- If F(XX,YY,1)>7 and F(XX,YY,1)<22 Then Inc APPLES
- Poke ST+400+YY*60+XX*2,F(XX,YY,0)
- Poke ST+401+YY*60+XX*2,F(XX,YY,1)
- Next
- Next
- Doke ST+4,APPLES
- Bsave "Levels/"+Str$(LE)-" ",ST To ST+2200
- SCROL["DONE!"]
- Gosub BLITZ
- Return
- MAKESHADOW:
- SH=0
- If XX<1 Then Goto SKIP1
- F=F(XX-1,YY,1) : If F=220 or F=223 or F=225 or F=227 or F=233 Then SH=1
- If F=225 or F=231 or F=232 or F=235 Then SH=5
- SKIP1:
- If YY<1 Then Goto SKIP2
- F=F(XX,YY-1,1) : If F=221 or F=223 or F=228 or F=235 Then SH=2
- If F=222 or F=231 or F=233 or F=234 Then SH=6
- SKIP2:
- If XX<1 or YY<1 Then Goto SKIP3
- F=F(XX-1,YY-1,1) : If F=224 or F=226 or F=229 or F=230 Then SH=3
- If F=223 or F=231 or F=233 or F=235 Then SH=4
- SKIP3:
- If F(XX,YY,1)>0 Then A=((F(XX,YY,1)-1)/7)*7+SH Else A=-1
- PB[A+2,XX*16,YY*16]
- F(XX,YY,1)=A+1
- Return
- FL:
- SCROL["CLICK ON PLAYFIELD TO FILL..."] : MD=2
- Return
- FLOOD:
- Screen 1 : Bob Off : Screen 0
- SCROL["FILLING..."]
- Screen Open 2,320,32,4,0 : Screen Hide 2 : A=0
- Curs Off : Flash Off : Cls 0
- FA=F(BX,BY,0) : F=F(BX,BY,1) : If F>0 and F<219 Then F=(F-1)/7 : A=1
- For YY=0 To 29
- For XX=0 To 29
- FF=F(XX,YY,1) : If FF>0 and A=1 Then FF=(FF-1)/7
- If F=FF Then Plot XX,YY,1
- Next
- Next
- Ink 2,0 : Paint BX,BY,1
- For YY=0 To 29
- For XX=0 To 29
- F=F(XX,YY,1)
- If Point(XX,YY)=2 Then F(XX,YY,0)=FA : F(XX,YY,1)=T1(CHAR)+(F-1) mod 7
- Next
- Next
- Screen Close 2
- Gosub ZEIGEN
- SCROL["DONE!"]
- Gosub BLITZ
- Gosub UPBOBS
- Return
- MAKESH:
- Screen 1 : Bob Off : Screen 0
- SCROL["MAKING SHADOWS..."]
- For YY=0 To 29
- For XX=0 To 29
- F=F(XX,YY,1)
- If F>0 and F<220 Then Gosub MAKESHADOW
- Next
- Next
- SCROL["DONE!"]
- Gosub BLITZ
- Gosub UPBOBS
- Return
- CLEAR:
- Screen 1 : Bob Off : Screen 0
- SCROL["CLEARING LEVEL..."]
- For Y=0 To 29
- For X=0 To 29
- F(X,Y,0)=0 : F(X,Y,1)=1
- Next
- Next
- For A=24 To 399
- Poke ST+A,0
- Next
- MNR=0
- AMX=1 : AMY=1 : DI=0 : HMX=28 : HMY=28 : TIME=0 : SECR=0
- TELE=0 : SWI=0 : ACT=0 : VIW=0
- NAME$="APFELMONSTER"
- Loke ST+24,$2020100 : Doke ST+28,257 : Doke ST+32,257 : Doke ST+36,257
- Gosub ZEIGEN
- SCROL["DONE!"]
- Gosub BLITZ
- Gosub UPBOBS
- Return
- ZEIGEN:
- Screen 1
- For YZ=0 To 29
- For XZ=0 To 29
- Put Block F(XZ,YZ,1)+1,XZ*16,YZ*16
- Next
- Next
- Screen 0
- Gosub LITTLMAP1
- Return
- LITTLMAP:
- SCROL["UPDATING LITTLE MAP!"]
- If VIW Then Gosub LITTLMAP2 Else Gosub LITTLMAP1
- Return
- LITTLMAP1:
- For YZ=0 To 29
- For XZ=0 To 29
- A=F(XZ,YZ,1)+1
- If A<221 Then C=T2((A+6)/7) Else C=5
- If A=1 Then C=0
- Plot XZ+284,YZ+20,C
- Next
- Next
- Return
- LITTLMAP2:
- For YZ=0 To 29
- For XZ=0 To 29
- A=F(XZ,YZ,0)
- If A and 1 Then C=5 Else C=1
- A=A and 6
- If A=1 Then C=27
- If A=2 Then C=13
- If A=3 Then C=28
- Plot XZ+284,YZ+20,C
- Next
- Next
- Return
- CHECKBUT:
- B=0
- If MD=2 Then MD=1 : SCROL["FILL ABORTED!"]
- For A=1 To 9
- If X>B(A,0) and Y>B(A,1) and X<B(A,2) and Y<B(A,3) Then B=A : Exit
- Next
- If A<10 Then Goto SKIP
- If PAGE=1 Then STA=10 : STO=28
- If PAGE=2 Then STA=29 : STO=37
- If PAGE=3 Then STA=38 : STO=45
- If PAGE=4 Then STA=46 : STO=62
- If PAGE=5 Then STA=63 : STO=79
- For A=STA To STO
- If X>B(A,0) and Y>B(A,1) and X<B(A,2) and Y<B(A,3) Then B=A : Exit
- Next
- If A>STO Then Return
- SKIP:
- P=0
- Repeat
- M=Mouse Key : X=X Mouse-128 : Y=Y Mouse-40 : A=0
- If X>B(B,0) and Y>B(B,1) and X<B(B,2) and Y<B(B,3) Then A=1
- If B<7 and A=1 Then Gosub DEFAUL : Wait 4 : M=Mouse Key
- If A=1 and P=0 Then P=1 : PRESS[B]
- If A=0 and P=1 Then P=0 : REALISE[B]
- Until M=0
- If P=0 Then B=0 : Return
- If B<74 Then REALISE[B]
- If B<7 Then B=0
- Return
- ' Table 1 (Chartable)
- Data 0,1,8,15,22,29,36,43,50,57
- Data 64,71,78,85,92,99,106,113,120,127,134,141,148,155,162
- ' Table 2 (Colortable)
- Data 0,2,10,22,29,29,29,29,29,29,19,9
- Data 24,13,30,30,30,30,30,30,30,30,30,26,0
- ' Menu Buttons Set 1 Default (1-9)
- Data 229,26,236,33
- Data 270,26,277,33
- Data 229,34,236,41
- Data 254,34,261,41
- Data 229,42,236,49
- Data 254,42,261,49
- Data 180,60,278,70
- Data 280,55,317,65
- Data 280,66,317,76
- ' Menu Buttons Set 2 Main Menu (10-28)
- Data 3,27,45,37
- Data 3,38,45,48
- Data 3,49,45,59
- Data 3,60,45,70
- Data 46,27,96,37
- Data 46,38,96,48
- Data 46,49,96,59
- Data 46,60,96,70
- Data 99,30,116,47
- Data 118,30,135,47
- Data 99,50,107,67
- Data 108,50,125,67
- Data 127,50,135,67
- Data 140,30,148,47
- Data 149,30,166,47
- Data 168,30,176,47
- Data 140,50,148,67
- Data 149,50,166,67
- Data 169,50,176,67
- ' Menu Buttons Set 3 Flags (29-37)
- Data 3,16,68,47
- Data 70,27,120,37
- Data 70,38,120,48
- Data 122,16,137,26
- Data 122,38,137,48
- Data 140,29,148,46
- Data 168,29,176,46
- Data 32,49,178,59
- Data 32,60,178,70
- ' Menu Buttons Set 4 Teleporter (38-45)
- Data 91,16,106,26
- Data 127,16,142,26
- Data 163,16,178,26
- Data 91,38,106,48
- Data 127,38,142,48
- Data 163,38,178,48
- Data 3,38,45,48
- Data 3,50,178,70
- ' Menu Buttons Set 5 Switch (46-62)
- Data 3,16,68,32
- Data 36,34,43,41
- Data 61,34,68,41
- Data 36,42,43,49
- Data 61,42,68,49
- Data 20,50,27,57
- Data 45,50,52,57
- Data 61,50,68,57
- Data 86,50,93,57
- Data 70,27,120,37
- Data 70,38,120,48
- Data 122,16,137,26
- Data 122,38,137,48
- Data 140,29,148,46
- Data 168,29,176,46
- Data 3,60,45,70
- Data 46,60,111,70
- ' Menu Buttons Set 6 Monster (63-79)
- Data 3,16,60,36
- Data 105,17,112,24
- Data 130,17,137,24
- Data 105,25,112,32
- Data 130,25,137,32
- Data 105,33,112,40
- Data 130,33,137,40
- Data 105,41,112,48
- Data 130,41,137,48
- Data 140,29,148,46
- Data 168,29,176,46
- Data 3,38,60,48
- Data 3,49,88,59
- Data 91,49,178,59
- Data 3,60,38,70
- Data 41,60,108,70
- Data 111,60,178,70
- Procedure PB[BLK,X,Y]
- Screen 1 : Put Block BLK,X,Y
- If VIW=0
- If BLK<221 : C=T2((BLK+5)/7) : Else C=5 : End If
- If BLK=1 : C=0 : End If
- Else
- A=F(X/16,Y/16,0)
- If A and 1 : C=5 : Else C=1 : End If
- A=A and 6
- If A=1 : C=27 : End If
- If A=2 : C=13 : End If
- If A=3 : C=28 : End If
- Plot XZ+284,YZ+20,C
- End If
- Screen 0 : Plot X/16+284,Y/16+20,C
- End Proc
- Procedure SCROL[T$]
- ' Repeat : Until Deek(Start(9)+20)=0
- Loke Start(9)+26,0
- Cls 0,176,200 To 352,230
- T$=" "+T$ : XT=176 : YT=200 : TT$=Left$(T$,22) : Gosub TEX2
- RASY=8 : SCL=Len(T$)*8
- While Len(T$)>22
- T$=Mid$(T$,23)
- XT=176 : YT=200+RASY : TT$=Left$(T$,22) : Gosub TEX2
- Add RASY,8
- Wend
- Loke Start(9)+12,Logbase(1)+200*44+22
- Loke Start(9)+16,Logbase(2)+200*44+22
- Doke Start(9)+20,0
- Loke Start(9)+22,0
- Loke Start(9)+26,SCL
- Pop Proc
- TEX2:
- For ABC=1 To Len(TT$)
- BCD=Max(1,Instr(S$,Mid$(TT$,ABC,1)))
- Put Block BCD+299,XT,YT
- Add XT,8
- Next
- Return
- End Proc
- Procedure NEWPAGE[A]
- Screen Copy 0,(A and 1)*176,88+(A/2)*56,(A and 1)*176+176,144+(A/2)*56 To 0,3,16
- If A=1 Then SCROL["ATTRIBUTES"]
- If A=2 Then SCROL["TELEPORTERS"]
- If A=3 Then SCROL["SWITCHES"]
- If A=4 Then SCROL["MONSTERS"]
- End Proc
- Procedure PRESS[A]
- B(A,4)=1
- C1=Point(B(A,0),B(A,1))
- C2=Point(B(A,2),B(A,3))
- Ink C2 : Draw B(A,0),B(A,3)-1 To B(A,0),B(A,1)
- Draw B(A,0),B(A,1) To B(A,2)-1,B(A,1)
- Ink C1 : Draw B(A,0)+1,B(A,3) To B(A,2),B(A,3)
- Draw B(A,2),B(A,1)+1 To B(A,2),B(A,3)
- End Proc
- Procedure REALISE[A]
- B(A,4)=0
- C1=Point(B(A,0),B(A,1))
- C2=Point(B(A,2),B(A,3))
- Ink C2 : Draw B(A,0),B(A,3)-1 To B(A,0),B(A,1)
- Draw B(A,0),B(A,1) To B(A,2)-1,B(A,1)
- Ink C1 : Draw B(A,0)+1,B(A,3) To B(A,2),B(A,3)
- Draw B(A,2),B(A,1)+1 To B(A,2),B(A,3)
- End Proc