home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AmigActive 26
/
AACD 26.iso
/
AACD
/
Programming
/
AllPlaton
/
MegaTron
/
MegaTron.AMOS
/
MegaTron.amosSourceCode
< prev
next >
Encoding:
Amiga
Atari
Commodore
DOS
FM Towns/JPY
Macintosh
Macintosh JP
NeXTSTEP
RISC OS/Acorn
Shift JIS
UTF-8
Wrap
AMOS Source Code
|
1994-03-02
|
25.2 KB
|
1,038 lines
' *************************************
' * *
' * Mega Tron V1.0 *
' * Written by Chris Hodges *
' * *
' *************************************
'
' PL
' 00: X,Y,RX,RY,CO
' 05: STATUS (1=ALIVE/0=DEAD)
' 06: DEVICE (OFF/JOY1/JOY0/KEY1/KEY2/KEY3/COM)
' 07: SCORE,MONEY
' 09: AUTOMATIC ENABLED
' 10: WEAPON1,WEAPON2,WEAPON3
' 13: SHIELD
' 14: LAST CONTACT COLOUR
'
' CONF
' 00: MUSIC,SOUND,AUTOPLOT,INTELLIGENCE,GAME SPEED,ROUNDS
'
' KEYS
' 00: LEFT,RIGHT,UP,DOWN,WEAPON1,WEAPON2,WEAPON3
'
' EX
' 00: X,Y,CO,RA
'
' RO
' 00: X,Y,CO,EN,FUEL,KC
'
Close Workbench
Global MXPL,MXEX,MXRO,CH,SO,FC
MXPL=10 : MXEX=10 : MXRO=10
Dim PL(MXPL-1,14),CONF(5),KEYS(4,6),DEV$(6),CO$(12),WEAP$(9),WP(9),EXTKEYS$(15)
Dim EX(MXEX-1,3),RO(MXRO-1,5)
Global PL(),CONF(),DEV$(),CO$(),WEAP$(),WP(),EX(),RO()
Degree
Hide On
Extension_16_0456 "MegaTron.mus",-3
Extension_16_008A 3
Break Off
TITLE
Load "MegaTron.sam",5
Extension_16_008A 5
INIT
Do
MENU
Exit If Param=0
SO=CONF(1)
RAWRESET
GAMEON
Loop
If CONF(0) Then Call Start(9)+8 : Call Start(9)+4
End
Procedure TITLE
MXDR=49
Dim DR(MXDR,1),ST$(5,5)
Unpack 8 To 0 : Screen Hide
Unpack 10 To 3 : Screen Hide
Get Palette 0 : For A=0 To 15 : Colour A+16,$FFF : Next
Screen 0
For A=0 To 15 : Colour A+16,Colour(A) : Next
Screen Open 2,320,32,2,0 : Screen Hide
Curs Off : Flash Off : Paper 0 : Pen 1 : Cls
LG=Logbase(0)
Screen Open 1,320,256,32,0 : Screen Hide
Curs Off : Flash Off : Paper 0 : Pen 1 : Cls
For A=0 To 31 : Colour A,0 : Next
Screen Copy 0 To 1
Screen 0 : Paste Bob 0,48,1 : Screen 1
Gosub DROPINIT
Double Buffer
Autoback 0
ST=Start(9)
Loke ST+10,Start(3)
Call ST
Call ST+6
Screen Show
Fade 2 To 0
Screen 2
Repeat
Screen Swap 1 : Wait Vbl
C=0
For A=0 To MXDR
If DR(A,1)<40
Inc C
Paste Bob DR(A,0)-7,DR(A,1)-16,2
Add DR(A,1),Rnd(1)+1
End If
Next
Extension_16_0882 0,16,48,304,80 To 1,16,48,LG-48*40
Until C=0
Screen 2 : Cls
Restore TEX
For PG=0 To 5
For LI=0 To 5
Read A$
ST$(PG,LI)=A$
Exit If A$=""
Next
Next
Screen 1
PG=0
Do
Screen Copy 0 To Logic(1)
Fill Logbase(4) To Logbase(4)+40*256,0
Gosub PASTMASK
Screen Swap
Gosub WHITIN
Screen Copy Physic(1) To Logic(1)
Gosub PASTTEXT
Screen Swap
Gosub FADIN
For A=0 To 99
Multi Wait
Exit If Fire(1) or Mouse Key or(Inkey$<>""),2
Next
Gosub WHITIN
Screen Swap
Gosub FADIN
Add PG,1,0 To 5
Loop
Gosub WHITIN
Screen Swap
Gosub FADIN
Screen 3 : For A=0 To 15 : Colour A,$FFF : Next
Screen 1
Fade 1 To 3 : Wait 16
Fade 1 : Wait 16
For A=0 To 3 : Screen Close A : Next
Pop Proc
PASTMASK:
Y=104
For LI=0 To 5
Exit If ST$(PG,LI)=""
X=160-Len(ST$(PG,LI))*8
For A=1 To Len(ST$(PG,LI))
C=Asc(Mid$(ST$(PG,LI),A,1))-32
Screen Copy 3,(C mod 20)*16,(C/20)*16,(C mod 20)*16+16,(C/20)*16+16 To Logic(1),X,Y,%1100000
Add X,16
Next
Add Y,24
Next
Return
WHITIN:
Fade 2 To 3
Wait 32
Return
PASTTEXT:
Y=104
For LI=0 To 5
Exit If ST$(PG,LI)=""
X=160-Len(ST$(PG,LI))*8
For A=1 To Len(ST$(PG,LI))
C=Asc(Mid$(ST$(PG,LI),A,1))-29
Paste Bob X,Y,C
Add X,16
Next
Add Y,24
Next
Return
FADIN:
Fade 1 To 0
Wait 16
Return
DROPINIT:
Do
X=16
For A=0 To MXDR
DR(A,0)=X : DR(A,1)=0
Add X,Rnd(4)+5
Exit If X>=312,2
Next
Loop
For A=A To MXDR
DR(A,1)=100
Next
Return
TEX:
Data " ","WELCOME TO MEGATRON"," ","WRITTEN BY","CHRIS HODGES",""
Data " ","THIS IS SHAREWARE","ENJOY IT...","AND IF YOU LIKE IT","SEND ME SOME MONEY",""
Data "WRITE TO"," ","CHRIS HODGES","KENNEDYSTR. 8","82178 PUCHHEIM","WEST GERMANY"
Data " "," ","& THANKS &",""
Data "GREETINGS"," ","HENDRIK H. HEIMER","MICHAEL BERCHTOLD","THOMAS NOELKER","RALF SCHWOEBEL"
Data "GREETINGS"," ","HANS PETER, TOBIAS","RALF, XAVER, TOBI","FLORIAN, MICHAEL","MICHI AND MARKUS"
End Proc
Procedure INIT
Shared EXTKEYS$(),KEYS()
Restore DEVS
For A=0 To 6
Read DEV$(A)
Next
Restore WEAPONS
For A=0 To 9
Read WEAP$(A)
Next
Restore PRICE
For A=0 To 9
Read WP(A)
Next
Restore FARBEN
For A=1 To 11
Read CO$(A)
Next
Restore KEYS
For A=0 To 4
For K=0 To 6
Read KEYS(A,K)
Next
Next
Restore EXTKEYS
For A=0 To 15
Read EXTKEYS$(A)
Next
For A=0 To MXPL-1
For AA=0 To 13 : PL(A,AA)=0 : Next
PL(A,6)=6
PL(A,4)=A+2 : PL(A,10)=Rnd(9) : PL(A,11)=Rnd(9) : PL(A,12)=Rnd(9)
Next
PL(0,6)=1
CONF(0)=1 : CONF(1)=1 : CONF(2)=0 : CONF(3)=1
CONF(4)=20 : CONF(5)=10 : FC=3
Pop Proc
DEVS:
Data "disabl","joy 1","joy 2","keys 1","keys 2","keys 3","compu."
WEAPONS:
Data "none","speed up","imploder","tunnel","autopilot","boxes","circle","rockets"
Data "shield","teleport"
PRICE:
Data 0,2,250,500,300,600,750,500,1000,250
FARBEN:
Data "white","red","green","blue","magenta","cyan","amber","yellow","grey","l-green","pink"
EXTKEYS:
Data "joy 1 left","joy 1 right","joy 1 up","joy 1 down","joy 1 fire","","",""
Data "joy 2 left","joy 2 right","joy 2 up","joy 2 down","joy 2 fire","","",""
KEYS:
Data $80,$81,$82,$83,$84,$65,$67
Data $88,$89,$8A,$8B,$8C,$64,$66
Data $4F,$4E,$4C,$4D,$46,$5F,$41
Data $2D,$2F,$3E,$1E,$2E,$43,$4A
Data $31,$32,$10,$20,$40,$42,$63
End Proc
Procedure RAWRESET
For A=0 To MXPL-1
PL(A,8)=0 : PL(A,7)=0 : PL(A,13)=0 : PL(A,9)=0
Next
End Proc
Procedure PLAZERRESET
For A=0 To MXEX-1
EX(A,2)=0
Next
For A=0 To MXRO-1
RO(A,4)=0
Next
CO=0
For A=0 To MXPL-1
If PL(A,6)>0 Then Inc CO
Next
P=0
For A=0 To MXPL-1
If PL(A,6)>0
PL(A,0)=160+Cos((P*360)/CO)*80
PL(A,1)=112+Sin((P*360)/CO)*80
If Abs(PL(A,0)-160)>Abs(PL(A,1)-112)
PL(A,2)=Sgn(160-PL(A,0)) : PL(A,3)=0
Else
PL(A,3)=Sgn(112-PL(A,1)) : PL(A,2)=0
End If
PL(A,5)=1
Inc P
Else
PL(A,5)=0
End If
PL(A,9)=0 : PL(A,13)=0
Next
End Proc[CO]
Procedure MENU
Shared EXTKEYS$(),KEYS()
ACPL=0
Dim ST$(1,1)
ST$(0,0)="off" : ST$(1,0)="on"
ST$(0,1)="low" : ST$(1,1)="high"
Set Rainbow 0,0,182,"","",""
Screen Open 1,320,64,16,0 : Screen Hide
Curs Off : Flash Off : Paper 0 : Pen 1
Screen Display 1,128,229,320,64
Ink 1,0 : Gr Writing 0
For A=0 To 15 : Colour A,0 : Next
Gosub UPDATLASTSCORE
Wait Vbl
Screen Show
Fade 1,0,$FFF,$F00,$F0,$44F,$F0F,$FF,$F80,$FF0,$888,$8F8,$F8F
Wait 8
Screen Open 0,640,180,8,0 : Screen Hide
Curs Off : Flash Off : Paper 0 : Pen 1 : Cls
Screen Display 0,128,40,320,256
Screen Offset 0,0,0
Ink 1,0 : Gr Writing 0
Palette 0,0,0,0,0,0,0,0
For A=0 To 199
C=Rnd(2)
If C=0 Then C=7
X=Rnd(319) : Y=Rnd(179)
Extension_16_0388 X,Y,C
Next
T1["Welcome to Megatron by Chris Hodges",0,1]
T1["Start game",24,3]
T1["Player options menu / Load & Save",40,5]
T1["Redefine keys",56,5]
Gosub UPDATMAINMENU
T1["Quit game",168,3]
Wait Vbl
Rainbow 0,0,40,182
Screen Show
MXBS=9
Fade 2,0,$FFF,$444,$FF0,$440,$F0F,$404,$888
Gosub FADINRAIN
TM=10 : SM=10 : CH=FC
Do
Gosub CHECKS
If MK=0 and RX=0 Then SM=0
If MK
If NCP=0 or NCP=9 : Exit : End If
If NCP=1 : Gosub PLAZERMENU : End If
If NCP=2 : Gosub REDEFINE : End If
End If
If MK Then RX=1
If(TM=0) and RX
If NCP>2 and NCP<9 : TM=10 : End If
If NCP=3
CONF(0)=1-CONF(0)
If CONF(0)=0
Call Start(9)+8 : Call Start(9)+4
FC=0
Else
Call Start(9) : Call Start(9)+6
FC=3 : CH=3
End If
T1["Music: "+ST$(CONF(0),0),72,1]
End If
If NCP=4
CONF(1)=1-CONF(1)
T1["Sound: "+ST$(CONF(1),0),88,1]
End If
If NCP=5
CONF(3)=1-CONF(3)
T1["Computer intelligence: "+ST$(CONF(3),1),104,1]
End If
If NCP=6
Add CONF(4),RX,1 To 20
T1["Game speed:"+Str$(CONF(4)),120,1]
End If
If NCP=7
CONF(2)=1-CONF(2)
T1["Autoplot: "+ST$(CONF(2),0),136,1]
End If
If NCP=8
Add CONF(5),RX,1 To 20
T1["Rounds per game:"+Str$(CONF(5)),152,1]
End If
End If
Loop
Fade 2 : Timer=0
Gosub FADOUTRAIN
While Timer<32 : Multi Wait : Wend
Screen Close 0 : Rainbow Del : View
Screen 1 : Fade 1 : Wait 16
Screen Close 1
Pop Proc[NCP=0]
UPDATLASTSCORE:
Cls
T["Last game's score table",-1,0,1]
Pen 1 : Locate 0,2 : Print "device score money device score money"
Y=3 : X=0
For A=0 To MXPL-1
If PL(A,6)
Pen PL(A,4)
Locate X,Y
SC=PL(A,7)
SC$=String$("0",6-Len(Str$(SC)))+Mid$(Str$(SC),2)
MN=PL(A,8)
MN$=String$("0",6-Len(Str$(MN)))+Mid$(Str$(MN),2)
Print DEV$(PL(A,6));" ";SC$;" ";MN$;
Inc Y : If Y>7 : Y=3 : Add X,20 : End If
End If
Next
Return
UPDATMAINMENU:
T1["Music: "+ST$(CONF(0),0),72,1]
T1["Sound: "+ST$(CONF(1),0),88,1]
T1["Computer intelligence: "+ST$(CONF(3),1),104,1]
T1["Game speed:"+Str$(CONF(4)),120,1]
T1["Autoplot: "+ST$(CONF(2),0),136,1]
T1["Rounds per game:"+Str$(CONF(5)),152,1]
Return
CHECKS:
Gosub ACTUALCURS
Multi Wait : View : I$=Inkey$
SC=Scancode : KS=Key Shift
If KS
Trap SC= Extension_16_0506(KS)+$60
End If
RX=(I$=Cleft$)-(I$=Cright$)+Jleft(1)-Jright(1)
RY=(I$=Cup$)-(I$=Cdown$)+Jup(1)-Jdown(1)
MK=(I$=Chr$(13))+(I$=" ")+Fire(1)
If RY=0 and RX=0 and MK=0 Then TM=0
If TM=0 and RY Then Add NCP,RY,0 To MXBS : TM=10
If(MK or RX) and CONF(1) and(SM=0)
SM=10 : Sam Play Extension_16_04F8(CH),5 : Add CH,1,FC To 3
End If
SM=Max(SM-1,0)
TM=Max(TM-1,0)
Return
CHECK2:
Gosub ACTUALCURS
Multi Wait : View : I$=Inkey$
SC=Scancode : KS=Key Shift
If KS
Trap SC= Extension_16_0506(KS)+$60
End If
If Fire(1) Then SC=$84
If Fire(0) Then SC=$8C
Return
FADINRAIN:
If CONF(1) : Sam Play Extension_16_04F8(CH),9 : Add CH,1,FC To 3 : End If
OCP=1 : NCP=0 : FL=0
For A=7 To 0 Step -1
For B=0 To MXBS
For AA=0 To 7
Rain(0,B*16+AA+20)=Max(AA-A,0)
Rain(0,B*16+34-AA)=Max(AA-A,0)
Next
Next
Multi Wait : View
Next
Return
FADOUTRAIN:
For A=0 To 7
Rain(0,OCP*16+A+20)=A
Rain(0,OCP*16+34-A)=A
Next
If CONF(1) : Sam Play Extension_16_04F8(CH),9 : Add CH,1,FC To 3 : End If
For A=0 To 7
For B=0 To 181
Rain(0,B)=Max(Rain(0,B)-1,0)
Next
Multi Wait : View
Next
Return
PLAZERMENU:
Gosub FADOUTRAIN
Ink 0 : Bar 320,0 To 639,179
For A=0 To 99
C=Rnd(2)
If C=0 Then C=7
X=Rnd(319) : Y=Rnd(179)
Extension_16_0388 X+320,Y,C
Next
T2["Player options menu",0,1]
T2["Return to main menu",24,5]
Gosub UPDATPLY
T2["Load old settings",136,3]
T2["Save new settings",152,3]
If CONF(1) Then Sam Play Extension_16_04F8(CH),6 : Add CH,1,FC To 3
For A=0 To 320 Step 8
Screen Offset 0,A,0
Wait Vbl
Next
MXBS=8
Gosub FADINRAIN
Do
Gosub CHECKS
If MK
If NCP=0
CO=0
For A=0 To MXPL-1
If PL(A,6)>0 : Inc CO : End If
Next
If CO<2
If CONF(1) and(SM=0) : SM=10 : Sam Play Extension_16_04F8(CH),1 : Add CH,1,FC To 3 : End If
Else
Exit
End If
End If
If NCP=7 : Gosub OPTSLOAD : End If
If NCP=8 : Gosub OPTSSAVE : End If
End If
If MK Then RX=1
If(TM=0) and RX
If NCP : TM=10 : End If
If NCP=1 : Add ACPL,RX,0 To MXPL-1 : Gosub UPDATPLY : End If
If NCP=2
Add PL(ACPL,4),RX,2 To 11
T2["Player"+Str$(ACPL+1)+"s color: "+CO$(PL(ACPL,4)),56,1]
End If
If NCP=3
Add PL(ACPL,6),RX,0 To 6
T2["Player"+Str$(ACPL+1)+"s device: "+DEV$(PL(ACPL,6)),72,1]
End If
If NCP>3 and NCP<7
Add PL(ACPL,NCP+6),RX,0 To 9
A$="Player"+Str$(ACPL+1)+"s weapon"+Str$(NCP-3)+": "+WEAP$(PL(ACPL,NCP+6))
A$=A$+" ("+Mid$(Str$(WP(PL(ACPL,NCP+6))),2)+")"
T2[A$,24+NCP*16,1]
End If
End If
Loop
Gosub FADOUTRAIN
MXBS=9
If CONF(1) Then Sam Play Extension_16_04F8(CH),6 : Add CH,1,FC To 3
For A=320 To 0 Step -8
Screen Offset 0,A,0
Wait Vbl
Next
Gosub FADINRAIN
Return
OPTSSAVE:
A$=""
For A=0 To 5
A$=A$+Chr$(CONF(A))
Next
For A=0 To 4
For K=0 To 6
A$=A$+Chr$(KEYS(A,K))
Next
A$=A$+Chr$($FF)
Next
For A=0 To MXPL-1
For B=0 To 14
A$=A$+Chr$(0)+Chr$(PL(A,B)/$10000)+Chr$(PL(A,B)/256)+Chr$(PL(A,B) mod 256)
Next
Next
Open Out 1,"MegaTron.cfg"
Print #1,A$;
Close 1
Return
OPTSLOAD:
If Exist("MegaTron.cfg")=0 Then Return
If CONF(0) Then Call Start(9)+8 : Call Start(9)+4
FC=0
Extension_16_0456 "MegaTron.cfg",15
ST=Start(15)
For A=0 To 5
CONF(A)=Peek(ST) : Inc ST
Next
For A=0 To 4
For K=0 To 6
KEYS(A,K)=Peek(ST) : Inc ST
Next
Inc ST
Next
For A=0 To MXPL-1
Exit If ST=>Start(15)+Length(15)
For B=0 To 14
PL(A,B)=Leek(ST) : Add ST,4
Next
Next
Erase 15
If CONF(0) Then Call Start(9) : Call Start(9)+6 : FC=3
CH=FC
Gosub UPDATPLY
Gosub UPDATMAINMENU
Screen 1 : Fade 1
For B=0 To 15 : Gosub CHECK2 : Next
Gosub UPDATLASTSCORE
Fade 1,0,$FFF,$F00,$F0,$44F,$F0F,$FF,$F80,$FF0,$888,$8F8,$F8F
Screen 0
Return
UPDATPLY:
T2["Player selected:"+Str$(ACPL+1),40,1]
T2["Player"+Str$(ACPL+1)+"s color: "+CO$(PL(ACPL,4)),56,1]
T2["Player"+Str$(ACPL+1)+"s device: "+DEV$(PL(ACPL,6)),72,1]
For A=4 To 6
A$="Player"+Str$(ACPL+1)+"s weapon"+Str$(A-3)+": "+WEAP$(PL(ACPL,A+6))
A$=A$+" ("+Mid$(Str$(WP(PL(ACPL,A+6))),2)+")"
T2[A$,24+A*16,1]
Next
Return
REDEFINE:
Gosub FADOUTRAIN
Ink 0 : Bar 320,0 To 639,179
For A=0 To 199
C=Rnd(2)
If C=0 Then C=7
X=Rnd(319) : Y=Rnd(112)
Extension_16_0388 X+320,Y,C
Next
T2["Redefine keys menu",0,1]
T2["Return to main menu",24,5]
T2["Define joystick 1 special keys",40,1]
T2["Define joystick 2 special keys",56,1]
T2["Define keys set 1",72,1]
T2["Define keys set 2",88,1]
T2["Define keys set 3",104,1]
If CONF(1) Then Sam Play Extension_16_04F8(CH),6 : Add CH,1,FC To 3
For A=0 To 320 Step 8
Screen Offset 0,A,0
Wait Vbl
Next
MXBS=5
Gosub FADINRAIN
Do
Gosub CHECKS
If MK
If NCP=0 : Exit : End If
If NCP=1 : PRT=1 : DEV=0 : Gosub DEFINEJOY : End If
If NCP=2 : PRT=2 : DEV=1 : Gosub DEFINEJOY : End If
If NCP=3 : PRT=1 : DEV=2 : Gosub DEFINEKEYS : End If
If NCP=4 : PRT=2 : DEV=3 : Gosub DEFINEKEYS : End If
If NCP=5 : PRT=3 : DEV=4 : Gosub DEFINEKEYS : End If
End If
Loop
Gosub FADOUTRAIN
MXBS=9
If CONF(1) Then Sam Play Extension_16_04F8(CH),6 : Add CH,1,FC To 3
For A=320 To 0 Step -8
Screen Offset 0,A,0
Wait Vbl
Next
Gosub FADINRAIN
Return
DEFINEJOY:
Ink 0 : Bar 320,120 To 639,179
T2["Press the keys for joystick"+Str$(PRT),120,5]
For K=0 To 6 : Gosub SHOKEY : Next
For K=4 To 6
Repeat : Gosub CHECK2 : Until SC=0
Gosub DEFINE
Next
Ink 0 : Bar 320,120 To 639,129
Return
DEFINEKEYS:
Ink 0 : Bar 320,120 To 639,179
T2["Press the keys for keyset"+Str$(PRT),120,5]
For K=0 To 6 : Gosub SHOKEY : Next
For K=0 To 6
Repeat : Gosub CHECK2 : Until SC=0
Gosub DEFINE
Next
Ink 0 : Bar 320,120 To 639,129
Return
SHOKEY:
Gosub GEDIR
T[A$,X,140+Y*8,1]
SC=KEYS(DEV,K)
If SC>$7F
A$=EXTKEYS$(SC-$80)
Else
A$= Extension_16_08B4(SC)
End If
T[A$,X+56,140+Y*8,5]
Return
GEDIR:
If K=0 Then A$="Left :" : X=320 : Y=0
If K=1 Then A$="Right:" : X=320 : Y=1
If K=2 Then A$="Up :" : X=320 : Y=2
If K=3 Then A$="Down :" : X=320 : Y=3
If K=4 Then A$="Weap1:" : X=480 : Y=0
If K=5 Then A$="Weap2:" : X=480 : Y=1
If K=6 Then A$="Weap3:" : X=480 : Y=2
Return
DEFINE:
Gosub GEDIR
T[A$,X,140+Y*8,3]
Repeat
Gosub CHECK2
Until SC>0
If SC=$45
SC=KEYS(DEV,K)
Else
KEYS(DEV,K)=SC
End If
T[A$,X,140+Y*8,1]
Ink 0 : Bar X+56,140+Y*8 To X+159,147+Y*8
If SC>$7F
A$=EXTKEYS$(SC-$80)
Else
A$= Extension_16_08B4(SC)
End If
T[A$,X+56,140+Y*8,3]
Repeat
Gosub CHECK2
Until SC=0
Return
ACTUALCURS:
If NCP<>OCP
If CONF(1) : Sam Play Extension_16_04F8(CH),4 : Add CH,1,FC To 3 : End If
For A=0 To 7
Rain(0,OCP*16+A+20)=A
Rain(0,OCP*16+34-A)=A
Next
FL=0 : OCP=NCP
End If
For A=0 To 7
Rain(0,NCP*16+A+20)=Max(A-Abs(FL),0)+(Abs(FL*A)/4)*$10
Rain(0,NCP*16+34-A)=Max(A-Abs(FL),0)+(Abs(FL*A)/4)*$10
Next
Add FL,1,-7 To 7
Return
End Proc
Procedure GAMEON
Screen Open 0,320,256,16,0 : Screen Hide
Curs Off : Flash Off : Paper 0 : Pen 1
Gr Writing 0
For A=0 To 15 : Colour A,0 : Next
Screen Show
Clip 0,0 To 320,216
For ROUNDS=1 To CONF(5)
PLAZERRESET
NP=Param
Cls
Ink 1 : Box 0,0 To 319,215
Box 1,1 To 318,214
Fade 2,0,$FFF,$F00,$F0,$44F,$F0F,$FF,$F80,$FF0,$888,$8F8,$F8F
For A=0 To MXPL-1
If PL(A,5) Then Gosub DRAPLAYERS
Next
T["Round"+Str$(ROUNDS),-1,96,1]
Gosub UPDAT
UPP=0
For A=5 To 1 Step -1
Ink 1 : Text 156,108+Text Base,Mid$(Str$(A),2)
If SO Then Sam Play Extension_16_04F8(CH),4 : Add CH,1,FC To 3
Wait 25
Ink 0 : Bar 156,108 To 164,116
Next
If SO Then Sam Play Extension_16_04F8(CH),8 : Add CH,1,FC To 3
T["Round"+Str$(ROUNDS),-1,96,0]
TIM=0
While NP>1
Wait Vbl
Gosub UPDATMONEY
Inc TIM : If TIM=CONF(4) Then Multi Wait : TIM=0
I$=Inkey$ : SC=Scancode : KS=Key Shift
If I$=Chr$(27) Then Fade 2 : Wait 32 : Exit 2
If I$="p" Then While Inkey$="" : Multi Wait : Wend
Gosub CONTROL
MOVEEXPLO
MOVEROCKET
MOVEROCKET
If Rnd(100)=0 and CONF(2) Then Extension_16_0388 Rnd(317)+1,Rnd(223)+1,Rnd(11)
Ink 1 : Box 0,0 To 319,215
Box 1,1 To 318,214
For A=0 To MXPL-1
If PL(A,5)
Gosub MOVE
Gosub DRAPLAYERS
End If
Next
Wend
For A=0 To MXPL-1
If PL(A,5) Then Add PL(A,7),2 : Add PL(A,8),1000
Next
Fade 2
For A=0 To 31
Multi Wait
MOVEEXPLO
Ink 1 : Box 0,0 To 319,215
Box 1,1 To 318,214
Next
Next
Clip
Screen Close 0
Pop Proc
UPDAT:
UY=27 : UX=0 : UPP=0
For D=0 To MXPL-1
If PL(D,6)
Pen PL(D,4)
SC=PL(D,7)
SC$=String$("0",6-Len(Str$(SC)))+Mid$(Str$(SC),2)
MN=PL(D,8)
MN$=String$("0",6-Len(Str$(MN)))+Mid$(Str$(MN),2)
Locate UX,UY : Print DEV$(PL(D,6));" ";SC$;" ";MN$;
Inc UY : If UY>31 : UY=27 : Add UX,20 : End If
End If
Next
Return
UPDATMONEY:
If UPP=0 Then UY=27 : UX=0
If PL(UPP,6)
Pen PL(UPP,4)
MN=PL(UPP,8)
MN$=String$("0",6-Len(Str$(MN)))+Mid$(Str$(MN),2)
Locate UX+13,UY : Print MN$;
Inc UY : If UY>31 : UY=27 : Add UX,20 : End If
End If
Add UPP,1,0 To MXPL-1
Return
CONTROL:
If SC=0 Then OSC=SC
If SC and(SC<>OSC) Then OSC=SC : ACTION[SC]
If KS=0 Then OKS=KS
If KS and(KS<>OKS) Then OKS=KS : Trap ACTION[ Extension_16_0506(KS)+$60]
JX=Abs(Jleft(1)+Jright(1)*2)
JY=Abs(Jup(1)+Jdown(1)*2)
If JX
ACTION[$7F+JX]
Else
If JY
ACTION[$81+JY]
End If
End If
JF1=Fire(1)
If JF1=0 Then OJF1=JF1
If JF1 and JF1<>OJF1 Then OJF1=JF1 : ACTION[$84]
JX=Abs(Jleft(0)+Jright(0)*2)
JY=Abs(Jup(0)+Jdown(0)*2)
If JX
ACTION[$87+JX]
Else
If JY
ACTION[$89+JY]
End If
End If
JF0=Fire(0)
If JF0=0 Then OJF0=JF0
If JF0 and JF0<>OJF0 Then OJF0=JF0 : ACTION[$8C]
Return
DRAPLAYERS:
If PL(A,13)
Dec PL(A,13)
Ink 0 : Draw PL(A,0)+(PL(A,3)+PL(A,2))*5,PL(A,1)+(PL(A,2)+PL(A,3))*5 To PL(A,0)+(PL(A,2)-PL(A,3))*5,PL(A,1)+(PL(A,3)-PL(A,2))*5
End If
If PL(A,9) or PL(A,13)
Extension_16_0388 PL(A,0),PL(A,1),1
Else
Extension_16_0388 PL(A,0),PL(A,1),PL(A,4)
End If
Return
MOVE:
If(PL(A,6)=6 and Rnd(100000)<PL(A,8)) and CONF(3) Then ACTION[-A]
P= Extension_16_039E(PL(A,0)+PL(A,2),PL(A,1)+PL(A,3))
If P>0 and PL(A,9)>0 Then Gosub COMPI
If PL(A,6)=6 and((Rnd(100)=0 and CONF(3)) or P) Then Gosub COMPI
If P
PL(A,5)=0 : Dec NP
SETEXPLO[PL(A,0),PL(A,1),PL(A,4)]
If P=PL(A,4) : P=PL(A,14) : End If
For EN=0 To MXPL-1
If PL(EN,5) and(PL(EN,4)=P)
Inc PL(EN,7)
Add PL(EN,8),500
Gosub UPDAT
End If
Next
Else
PL(A,9)=Max(PL(A,9)-1,0)
Add PL(A,0),PL(A,2)
Add PL(A,1),PL(A,3)
If Abs(PL(A,2))=1 or Abs(PL(A,3))=1 : Add PL(A,8),2 : End If
End If
Return
COMPI:
If P and(P<>PL(A,4)) Then PL(A,14)=P
R=Rnd(3)
For T=0 To 4
If R=0 Then RX=-1 : RY=0
If R=1 Then RX=1 : RY=0
If R=2 Then RY=-1 : RX=0
If R=3 Then RY=1 : RX=0
P= Extension_16_039E(PL(A,0)+RX,PL(A,1)+RY)
If P and(P<>PL(A,4)) Then PL(A,14)=P
If P=0
PL(A,2)=RX : PL(A,3)=RY
If SO and(CONF(0)=0) : Sam Play Extension_16_04F8(CH),5 : Add CH,1,FC To 3 : End If
Return
End If
If T>2 Then ACTION[-A] : P= Extension_16_039E(PL(A,0)+RX,PL(A,1)+RY)
Add R,1,0 To 3
Next
Return
End Proc
Procedure SETEXPLO[XX,YY,C]
For A=0 To MXEX-1
If EX(A,2)=0
EX(A,0)=XX : EX(A,1)=YY : EX(A,2)=C : EX(A,3)=1
If SO : Sam Play Extension_16_04F8(CH),1 : Add CH,1,FC To 3 : End If
Pop Proc[A]
End If
Next
End Proc[-1]
Procedure MOVEEXPLO
For A=0 To MXEX-1
If EX(A,2)
If EX(A,3)<11
Ink EX(A,2) : Extension_16_05E6 EX(A,0),EX(A,1),EX(A,3)
Inc EX(A,3)
Else
If EX(A,3)=20
Ink 0 : Extension_16_05E6 EX(A,0),EX(A,1),10
EX(A,2)=0
Else
Ink 0 : Circle EX(A,0),EX(A,1),21-EX(A,3)
Inc EX(A,3)
End If
End If
End If
Next
End Proc
Procedure SETROCKET[XX,YY,C,E]
For A=0 To MXRO-1
If RO(A,4)=0
RO(A,0)=XX : RO(A,1)=YY : RO(A,2)=C : RO(A,3)=E : RO(A,4)=150
RO(A,5)=-1
If SO : Sam Play Extension_16_04F8(CH),6 : Add CH,1,FC To 3 : End If
Exit
End If
Next
End Proc
Procedure MOVEROCKET
For A=0 To MXRO-1
If RO(A,4)
EN=RO(A,3)
RX=Sgn(PL(EN,0)-RO(A,0)) : RY=Sgn(PL(EN,1)-RO(A,1))
If RO(A,5)=>0 : Extension_16_0388 RO(A,0),RO(A,1),RO(A,5) : End If
P= Extension_16_039E(RO(A,0)+RX,RO(A,1)+RY)
Dec RO(A,4)
If PL(EN,5)=0 or RO(A,4)=0 or(P>0 and P<>RO(A,2))
SETEXPLO[RO(A,0),RO(A,1),RO(A,2)]
If Param=>0 : EX(Param,3)=10 : End If
RO(A,4)=0
Else
RO(A,5)=P
Add RO(A,0),RX
Add RO(A,1),RY
Extension_16_0388 RO(A,0),RO(A,1),1
End If
End If
Next
End Proc
Procedure ACTION[KEY]
Shared KEYS()
If KEY<=0 Then Gosub COMPACT Else Gosub HUMACT
Pop Proc
HUMACT:
For A=0 To MXPL-1
If PL(A,5)
D=PL(A,6)
If D>0 and D<6
For K=0 To 6
If KEYS(D-1,K)=KEY
On K+1 Gosub TLEFT,TRIGHT,TUP,TDOWN,WEAPON,WEAPON,WEAPON
Exit
End If
Next
End If
End If
Next
Return
COMPACT:
K=Rnd(2)+4 : A=-KEY
Gosub WEAPON
Return
TLEFT:
If PL(A,2)=0 Then PL(A,2)=-1 : PL(A,3)=0 : If SO Then Sam Play Extension_16_04F8(CH),5 : Add CH,1,FC To 3
Return
TRIGHT:
If PL(A,2)=0 Then PL(A,2)=1 : PL(A,3)=0 : If SO Then Sam Play Extension_16_04F8(CH),5 : Add CH,1,FC To 3
Return
TUP:
If PL(A,3)=0 Then PL(A,3)=-1 : PL(A,2)=0 : If SO Then Sam Play Extension_16_04F8(CH),5 : Add CH,1,FC To 3
Return
TDOWN:
If PL(A,3)=0 Then PL(A,3)=1 : PL(A,2)=0 : If SO Then Sam Play Extension_16_04F8(CH),5 : Add CH,1,FC To 3
Return
WEAPON:
WP=PL(A,K+6)
If PL(A,8)<WP(WP) Then Return
C=0
For T=0 To MXPL-1
If PL(T,5) Then Inc C
Next
If C=0 Then Return
Repeat
EN=Rnd(MXPL-1)
Until PL(EN,5) and A<>EN
Add PL(A,8),-WP(WP)
On WP Gosub SPEEDUP,IMPLODER,TUNNEL,AUTOPILOT,BOES,BIGBOX,ROCKETS,SHIELD,TELEPORT
Return
SPEEDUP:
PL(A,2)=Sgn(PL(A,2))*2 : PL(A,3)=Sgn(PL(A,3))*2
Return
IMPLODER:
If SO Then Sam Play Extension_16_04F8(CH),10 : Add CH,1,FC To 3
Ink 0 : Extension_16_05E6 PL(A,0),PL(A,1),10
Return
TUNNEL:
If SO Then Sam Play Extension_16_04F8(CH),7 : Add CH,1,FC To 3
Ink PL(A,4)
Draw PL(EN,0)+PL(EN,3),PL(EN,1)+PL(EN,2) To PL(EN,0)+PL(EN,3)+PL(EN,2)*20,PL(EN,1)+PL(EN,2)+PL(EN,3)*20
Draw PL(EN,0)-PL(EN,3),PL(EN,1)-PL(EN,2) To PL(EN,0)-PL(EN,3)+PL(EN,2)*20,PL(EN,1)-PL(EN,2)+PL(EN,3)*20
Return
AUTOPILOT:
If SO Then Sam Play Extension_16_04F8(CH),3 : Add CH,1,FC To 3
Add PL(A,9),250
Return
BOES:
If SO Then Sam Play Extension_16_04F8(CH),2 : Add CH,1,FC To 3
Ink PL(A,4)
Box PL(EN,0)-7,PL(EN,1)-7 To PL(EN,0)-2,PL(EN,1)-2
Box PL(EN,0)+7,PL(EN,1)-7 To PL(EN,0)+2,PL(EN,1)-2
Box PL(EN,0)-7,PL(EN,1)+7 To PL(EN,0)-2,PL(EN,1)+2
Box PL(EN,0)+7,PL(EN,1)+7 To PL(EN,0)+2,PL(EN,1)+2
Return
BIGBOX:
If SO Then Sam Play Extension_16_04F8(CH),2 : Add CH,1,FC To 3
Ink PL(A,4)
Circle PL(EN,0),PL(EN,1),48
Return
ROCKETS:
SETROCKET[PL(A,0),PL(A,1),PL(A,4),EN]
Return
SHIELD:
Add PL(A,13),250
Return
TELEPORT:
If SO Then Sam Play Extension_16_04F8(CH),9 : Add CH,1,FC To 3
PL(A,0)=Rnd(317)+1 : PL(A,1)=Rnd(213)+1
Gosub IMPLODER
Return
End Proc
Procedure T[T$,XX,Y,C]
If XX<0 Then XX=160-Len(T$)*4
YY=Y+Text Base
Ink C : Text XX,YY,T$
End Proc
Procedure T1[T$,Y,C]
XX=160-Len(T$)*4 : YY=Y+Text Base
Ink 0 : Bar XX-8,Y To XX+Len(T$)*8+8,Y+9
Ink C+1 : Text XX+1,YY+1,T$
Ink C : Text XX,YY,T$
End Proc
Procedure T2[T$,Y,C]
XX=480-Len(T$)*4 : YY=Y+Text Base
Ink 0 : Bar XX-32,Y To XX+Len(T$)*8+32,Y+9
Ink C+1 : Text XX+1,YY+1,T$
Ink C : Text XX,YY,T$
End Proc