@tukinem, post #1
WBStartup
; 1 punkt za przeskrollowana bitmape
; 10 punktow za przeskok
; 10 punktow za unik pod czaszka
; 50 punktow za klejnot
#DEV=0
SCROLLVISION.b=0
#EKRAN_GRY
#EKRAN_BELKI
#EKRAN_DEV
#SCOREMAX=$5f5e0fe
#F1 =$50
#F2 =$51
#TRAWA =100
#CHMURA1=105
#CHMURA2=111
#ZIEMIA =117
#SKOK =121
#ZJAZD =123
#DROGA =125
#KRZAKI =130
#KLEJNOT=135
#ELIKSIR=139
#CZASZKA=143
#GAMOVER=147
#SFX_SKOK = 0
#SFX_WROG = 1
#SFX_MIKSTURA = 2
#MUSIC_LEV1 = 0
#MUSIC_LEV2 = 2
#MUSIC_LEV3 = 4
#MUSIC_G_OVER = 6
#MUSIC_MENU = 8
#MUSIC_ANIM = 0
NEWTYPE .colour
r.b
g.b
b.b
blank.b
End NEWTYPE
NEWTYPE .scroll
mx.w ; pozycja X bitmapy w copperliscie
scrollpos.b ; pozycja wklejania kafli
mappos.b ; pozycja gracza w tablicy mapy
mirror.b ; <BOOL> czy to kafle dublowane poziomo
firstmirror.b ; <BOOL> czy to dopiero start
End NEWTYPE
NEWTYPE .gracz
speed.w ; szybkosc scrolla
Y.w ; wysokosc
G.w ; grafika
J.b ; skok
blockfire.b ; blokada autofire
l.b ; ilosc zyc
dzwiek.b ; <BOOL> zmienna dzwieku wozeczka
score.l ; ilosc punktow
distonelive.w ; dystans do przyspieszenia
newspeed.w ; nowa szybkosc do ustawienia
afterdeath.b ; <BOOL> czy byla strata zycia
eliksiry.b ; ilosc posiadanych eliskirow
C.w ; schylanie
End NEWTYPE
NEWTYPE .obj
x.w
y.w
g.w
gmin.w
gmax.w
End NEWTYPE
NEWTYPE .music
_data.l ; pointer
_size.l ; size of data
_ram.b ; <bool> more than 256k Chip RAM
End NEWTYPE
DEFTYPE .colour C
DEFTYPE .scroll OPT
DEFTYPE .gracz G
DEFTYPE .music M
DEFTYPE .l score,MPointer
DEFTYPE. w copoffset,offset,drogaoffset,toffset
DEFTYPE .w chmura1offset,chmura2offset,trawaoffset
DEFTYPE .w skokoffset
DEFTYPE .b copperblock,noobjcounter,blockpotions,MoreRAM
; WYPISANIE TEKSTU W CLI (SHELL)
Tagfile.l = AllocMem_(FileSize("DAT/TAG.txt"),0)
BLoad "DAT/TAG.txt",Tagfile
For i.l = 0 To FileSize("DAT/TAG.txt")-4 Step 4
Print Mkl$(Peek.l(Tagfile+i))
Next
NPrint ""
FreeMem_ Tagfile,FileSize("DAT/TAG.txt")
; TWORZE LISTE OBIEKTOW ORAZ BUFOR DLA BOBOW
Dim List obiekty.obj(30)
Buffer 0,6000
UnBuffer 0
; TWORZE PALETY KOLOROW W GRZE
InitPalette 0,2 : PalRGB 0,1,$d,$d,$d
InitPalette 1,2
; OBSLUGA URUCHAMIANIA GRY Z DOPISANIEM PARAMETRU
Select NumPars
Case 0
If AvailMem_(2)>236000
M\_ram = True
EndIf
Case 1
If Par$(1)="256"
M\_ram = False
EndIf
End Select
Statement WAITVBL{howmany.l}
; CZEKANIE NA WYGASZENIE PIONOWE EKRANU
WAITVBL_LABEL
LEA $dff004,a0
'VBL1
LSR (a0)
BCC.b 'VBL1
'VBL2
LSR (a0)
BCS.b 'VBL2
DBF d0,WAITVBL_LABEL
End Statement
WAITVBL{100}
BLITZ
.STATEMENTS
Statement NoMask {SHAPE_NUMBER.w , HOWMANYLINES.w}
; USUNIECIE PRZEZROCZYSTOSCI KOLORU 0
GetReg d2,Peek.l(Addr Shape(SHAPE_NUMBER)+18)
MOVE.l d2,a0 ; A0 pointer for shape's mask
SUBQ.w #1,d1 ; D1 counter for loop
LoopOfMemoryFilling
MOVE.w #$ffff,(a0)+
DBF d1,LoopOfMemoryFilling
End Statement
Statement SilentFloppy{bool.b}
; URUCHOMIENIE SILNICZKA STACJI DF0-DF3
ReadFloppyParameter
TST.b d0
BEQ.b 'silent
'loud
MOVE.b #%01111000,d0
MOVE.b d0,$bfd100
NOP
NOP
ANDI.b #%01111111,d0
MOVE.b d0,$bfd100
NOP
NOP
ANDI.b #%00000111,d0
MOVE.b d0,$bfd100
BRA 'out
'silent
MOVE.b #%01111000,d0
MOVE.b d0,$bfd100
NOP
NOP
ORI.b #%10000000,d0
MOVE.b d0,$bfd100
NOP
NOP
ANDI.b #%10000111,d0
MOVE.b d0,$bfd100
'out
End Statement
Statement LOSUJ_MAPE{adres.l}
; ALGORYTM RYOWANIA DALSZEJ CZESCI MAPY
SHARED OPT
SHARED chmura1offset
SHARED chmura2offset
SHARED krzakioffset
SHARED skokoffset
SHARED noobjcounter
SHARED obiekty()
SHARED blockpotions
Poke.w adres-42,0
If noobjcounter>0 Then noobjcounter-1
If blockpotions>0 Then blockpotions-1
; 0 zwykla droga
; 1 chmura1
; 2 chmura2
; 3 skok
; 4 krzaki
; 5 klejnot
; 6 eliksir
; 7 czaszka
; SCROLLPOS<39
; SCROLLPOS>22
If Peek.w(adres-44)=0 AND OPT\scrollpos<38 AND OPT\scrollpos>22 Then losowanie.b = Rnd(8+12)
If skokoffset=-2
Poke.w adres-44,#ZJAZD
losowanie=0
EndIf
Select losowanie
Case 1
If chmura1offset>0 Then losowanie=0 : BRA 'WYJDZ
If chmura2offset>0 Then losownaie=0 : BRA 'WYJDZ
If krzakioffset>0 Then losowanie=0 : BRA 'WYJDZ
If skokoffset<0 Then losowanie=0 : BRA 'WYJDZ
Case 2
If chmura1offset>0 Then losowanie=0 : BRA 'WYJDZ
If chmura2offset>0 Then losownaie=0 : BRA 'WYJDZ
If krzakioffset>0 Then losowanie=0 : BRA 'WYJDZ
If skokoffset<0 Then losowanie=0 : BRA 'WYJDZ
Case 3
If chmura1offset>0 Then losowanie=0 : BRA 'WYJDZ
If chmura2offset>0 Then losownaie=0 : BRA 'WYJDZ
If krzakioffset>0 Then losowanie=0 : BRA 'WYJDZ
If skokoffset<0 Then losowanie=0 : BRA 'WYJDZ
If noobjcounter>0 Then losowanie=0 : BRA 'WYJDZ
Case 4
If chmura1offset>0 Then losowanie=0 : BRA 'WYJDZ
If chmura2offset>0 Then losownaie=0 : BRA 'WYJDZ
If krzakioffset>0 Then losowanie=0 : BRA 'WYJDZ
If skokoffset<0 Then losowanie=0 : BRA 'WYJDZ
Case 5
If chmura1offset>0 Then losowanie=0 : BRA 'WYJDZ
If chmura2offset>0 Then losowanie=0 : BRA 'WYJDZ
If krzakioffset>0 Then losowanie=0 : BRA 'WYJDZ
If skokoffset<0 Then losowanie=0 : BRA 'WYJDZ
If noobjcounter>0 Then losowanie=0 : BRA 'WYJDZ
If blockpotions>0 Then losownaie=0 : BRA 'WYJDZ
Case 6
If chmura1offset>0 Then losowanie=0 : BRA 'WYJDZ
If chmura2offset>0 Then losowanie=0 : BRA 'WYJDZ
If krzakioffset>0 Then losowanie=0 : BRA 'WYJDZ
If skokoffset<0 Then losowanie=0 : BRA 'WYJDZ
If noobjcounter>0 Then losowanie=0 : BRA 'WYJDZ
If blockpotions>0 Then losowanie=0 : BRA 'WYJDZ
Case 7
If chmura1offset>0 Then losowanie=0 : BRA 'WYJDZ
If chmura2offset>0 Then losowanie=0 : BRA 'WYJDZ
If krzakioffset>0 Then losowanie=0 : BRA 'WYJDZ
If skokoffset<0 Then losowanie=0 : BRA 'WYJDZ
If noobjcounter>0 Then losowanie=0 : BRA 'WYJDZ
End Select
Select losowanie
Case 1
Poke.w adres-44,#CHMURA1
chmura1offset=1
Case 2
Poke.w adres-44,#CHMURA2
chmura2offset=1
Case 3
Poke.w adres-44,#SKOK
skokoffset=-4
noobjcounter=12
Case 4
Poke.w adres-44,#KRZAKI
krzakioffset=1
Case 5
If AddLast(obiekty())
Poke.w adres-44,#KLEJNOT
obiekty()\g=#KLEJNOT
obiekty()\gmin=#KLEJNOT
obiekty()\gmax=#KLEJNOT+3
obiekty()\x=OPT\mx+320
obiekty()\y=64
noobjcounter=12
blockpotions=60
EndIf
Case 6
If AddLast(obiekty())
Poke.w adres-44,#ELIKSIR
obiekty()\g=#ELIKSIR
obiekty()\gmin=#ELIKSIR
obiekty()\gmax=#ELIKSIR+3
obiekty()\x=OPT\mx+320
obiekty()\y=64
noobjcounter=12
blockpotions=60
EndIf
Case 7
If AddLast(obiekty())
Poke.w adres-44,#CZASZKA
obiekty()\g=#CZASZKA
obiekty()\gmin=#CZASZKA
obiekty()\gmax=#CZASZKA+3
obiekty()\x=OPT\mx+320
obiekty()\y=64
noobjcounter=12
EndIf
End Select
'WYJDZ
End Statement
Statement LIVES{ilosc.b}
; RYSOWANIE ILOSCI ZYC NA BELCE EKRANU
Use BitMap 1
Boxf 208,16,247,23,0
For a.b = 0 To ilosc-1
Scroll 80,0,8,8,208+a LSL 3,16,3
Next
Use BitMap 0
End Statement
Statement SCORE{score.l}
; WYPISANIE ILOSCI PUNKTOW NA BELCE EKRANU
Use BitMap 1
Format "00000000"
lancuch.s = Str$(score)
For a=0 To 7
Scroll (Peek.b(&lancuch+a)-48) LSL 3,0,8,8,128+a LSL 3,20,3
Next
Format ""
Use BitMap 0
End Statement
Statement ELIKSIRY{e.b}
; RYSOWANIE POSIADANYCH ELIKSIROW NA BELCE EKRANU
Use BitMap 1
Boxf 56,8,120,23,0 ; zmazanie starych
For a=1 To e
Blit #ELIKSIR+3,56+a LSL 4,8 ; rysowanie nowych
Next
Use BitMap 0
End Statement
Statement UsunZListy{map.w}
; USUNIECIE OBIEKTU ANIMOWANEGO Z EKRANU GRY
SHARED obiekty()
ResetList obiekty()
While NextItem (obiekty())
If obiekty()\x=QWrap(obiekty()\x,map-16,map+16) OR obiekty()\x=QWrap(obiekty()\x,map+320,map+352)
KillItem obiekty()
EndIf
Wend
End Statement
Statement LOAD_MUSIC{plik$,tryb.b}
; LADOWANIE MUZYKI DO PAMIECI I USTAWIENIE PIERWSZEGO PATTERNU
SHARED M
QAMIGA
If M\_ram=True
Select tryb
Case True
FreeMem_ M\_data,M\_size
M\_size = FileSize(plik$)
M\_data = AllocMem_(M\_size,2)
BLoad plik$,M\_data
Case False
FreeMem_ M\_data,M\_size
End Select
EndIf
BLITZ
End Statement
Statement PLAY_MUSIC{tryb.b,pattern.b}
; ODTWARZANIE MUZYKI
SHARED M
If M\_ram=True
Select tryb
Case True
MTInit M\_data,0,pattern
MTPlay On
Case False
MTEnd
End Select
EndIf
End Statement
Statement SFX{sound_bank.b}
; ODTWORZENIE SAMPLA W FORMACIE IFF 8SVX
SHARED M
If M\_ram<>False
MTSoundFX sound_bank,64
EndIf
End Statement
Statement ShowSlice{SliceNO.b , PaletteNO.b , BitmapNO.b , x.w , y.w}
; WYSWIETLENIE AKTUALNEGO EKRANU
Use Slice SliceNO
Use Palette PaletteNO
Show BitmapNO,x,y
End Statement
Statement SliceSplit{a.w,b.w,c.w,d.w,e.w}
; TECZA TWORZONA COPPEREM
ColSplit a,b,c,d,e
End Statement
Statement EKRAN{nazwa.s}
; TWORZENIE EKRANU WRAZ Z WCZYTANIEM BITMAPY
QAMIGA
BLoad nazwa,Peek.l(Addr BitMap(0)+8)
BLITZ
SilentFloppy{0}
ShowSlice{0,0,0,0,0}
WAITVBL{250}
ShowSlice{0,1,0,0,0}
End Statement
;//////////////////////////////////
BitMap 0,320,200,1
FreeSlices
Slice 0,64+NTSC*20,320,200,$fff8,1,8,2,320,320
ShowSlice{0,1,0,0,0}
EKRAN{"DAT/AUTHOR.DAT"}
EKRAN{"DAT/INFO.DAT"}
EKRAN{"DAT/CREDITS.DAT"}
LOAD_MUSIC{"DAT/TONYGO.MOD",True}
WAITVBL{0}
PLAY_MUSIC{False,0}
JMP MAINMENU
.LoadGame
PLAY_MUSIC{False,0}
ShowSlice {0,1,0,0,0}
UnBuffer 0
QAMIGA
If M\_ram=True
LoadSound #SFX_SKOK,"SFX/skok.iff"
LoadSound #SFX_WROG,"SFX/wrog.iff"
LoadSound #SFX_MIKSTURA,"SFX/mikstura.iff"
EndIf
;FreeSlices
JSR MAKE_MASKS
LoadShapes 100,"DAT/TILESET.SHP"
NoMask {#GAMOVER,112}
Free BitMap 0
BitMap 0,672,160,1
BitMap 1,320,38,1 : BLoad "DAT/HUD.DAT",Peek.l(Addr BitMap(1)+8)
BitMap 3,96,8,1 : BLoad "DAT/HUDITEMS.DAT",Peek.l(Addr BitMap(3)+8)
CNIF #DEV=1
BitMap 2,640,48,1 : BitMapOutput 2 : Colour 1,0
CEND
Use BitMap 0 : JSR MAKE_WORLD
BLITZ
SilentFloppy{0}
NoMask {#ELIKSIR+3,16}
Statement INITSLICES{SCROLLVISION.b}
FreeSlices
If SCROLLVISION=0
Slice 0,64+NTSC*20,320,160,$fff8,1,8,2,672,160
Else
Slice 0,64+NTSC*20,640,160,$fff9,1,8,2,672,160
EndIf
Slice 1,225+NTSC*20,320,38,$fff8,1,8,2,320,38
Show 1
Use Palette 0
End Statement
INITSLICES{0}
ShowSlice{0,0,0,OPT\mx,0}
ShowSlice{1,0,1,0,0}
CNIF #DEV=1
Slice 2,244+NTSC*20,640,48,$fff9,1,8,2,640,48
ShowSlice {0,0,2,0,0}
CEND
Use BitMap 0
ClearList obiekty()
G\distonelive=0
G\speed = 1
G\newspeed = 0
G\score = 0
G\eliksiry = 0
G\afterdeath=False
SCORE {G\score}
ELIKSIRY {G\eliksiry}
LIVES {G\l}
G\J = 0
G\Y = 0
G\C = 0
copperblock= False
MOVE.w #$0,CONTROL
WAITVBL{50}
If G\l>0
BBlit 0,0,96+OPT\mx,72
While Peek.b(?CONTROL)=0
JSR INPUT
Wend
EndIf
G\blockfire=True
;CHIPRAM{}
CNIF #DEV=1
BitMapOutput 2
CEND
BLITZ
If G\l=0
G\afterdeath=True
G\speed=4
PLAY_MUSIC{True,#MUSIC_ANIM}
Else
PLAY_MUSIC{True,#MUSIC_LEV1}
EndIf
.MAINLOOP
WAITVBL{0}
; PRZELACZANIE EKRANU POMIEDZY SCROLLEM A WYSWIETLENIEM
; PELNEJ BITMAPY
If RawStatus(#F1) AND SCROLLVISION=1
SCROLLVISION = 0
copperblock = False
INITSLICES{SCROLLVISION.b}
EndIf
If RawStatus(#F2) AND SCROLLVISION=0
SCROLLVISION = 1
copperblock = False
INITSLICES{SCROLLVISION.b}
EndIf
If SCROLLVISION=0
ShowSlice {0,0,0,OPT\mx+G\speed,0}
Else
ShowSlice {0,0,0,16,0}
EndIf
If G\afterdeath=False
UnBuffer 0
BBlit 0,G\G,96+OPT\mx,72+G\Y
; PAUZA W GRZE
If RawStatus($19)
SilentFloppy {False}
If M\_ram=True : MTPlay Off : EndIf
PalRGB 0,1,$4,$4,$4
ShowSlice {0,0,0,OPT\mx+G\speed,0}
ShowSlice {1,0,1,0,0}
While RawStatus($19) : WAITVBL{0} : Wend
While NOT RawStatus($19) : WAITVBL{0} : Wend
While RawStatus($19) : WAITVBL{0} : Wend
PalRGB 0,1,$d,$d,$d
ShowSlice {0,0,0,OPT\mx+G\speed,0}
ShowSlice {1,0,1,0,0}
If M\_ram=True : MTPlay On : EndIf
EndIf
;PUNKTY ZA PRZEJAZD
If OPT\mx=16
G\score+1
SCORE{G\score}
G\distonelive+1
EndIf
JSR INPUT
JSR KUCHARZ
; KOLIZJE
Select Peek.w(?MAP+OPT\mappos LSL 1)
Case #SKOK
If G\J=0
JSR STRATA_ZYCIA
EndIf
Case #ZJAZD
If G\J=0
JSR STRATA_ZYCIA
Else
G\score+10
SCORE{G\score}
EndIf
Case #KLEJNOT
If G\Y<-16
G\score+100
SCORE{G\score}
SFX{#SFX_MIKSTURA}
Poke.w ?MAP+OPT\mappos LSL 1,0
UnBuffer 0
Boxf OPT\mappos LSL 4,64,OPT\mappos LSL 4+31,79,0
Boxf OPT\mappos LSL 4+336,64,OPT\mappos LSL 4+367,79,0
UsunZListy{OPT\mx+112}
EndIf
Case #ELIKSIR
If G\J<>0
If G\eliksiry<3
SFX{#SFX_MIKSTURA}
Poke.w ?MAP+OPT\mappos LSL 1,0
UnBuffer 0
Boxf OPT\mappos LSL 4,64,OPT\mappos LSL 4+31,79,0
Boxf OPT\mappos LSL 4+336,64,OPT\mappos LSL 4+367,79,0
UsunZListy{OPT\mx+112}
G\eliksiry+1
ELIKSIRY{G\eliksiry}
EndIf
EndIf
Case #CZASZKA
If G\C=0
If G\eliksiry>0
G\eliksiry-1
ELIKSIRY{G\eliksiry}
Poke.w ?MAP+OPT\mappos LSL 1,0
UnBuffer 0
Boxf OPT\mappos LSL 4,64,OPT\mappos LSL 4+31,87,0
Boxf OPT\mappos LSL 4+336,64,OPT\mappos LSL 4+367,87,0
UsunZListy{OPT\mx+112}
SFX{#SFX_WROG}
Else
UnBuffer 0
Boxf OPT\mappos LSL 4,64,OPT\mappos LSL 4+31,87,0
Boxf OPT\mappos LSL 4+336,64,OPT\mappos LSL 4+367,87,0
JSR STRATA_ZYCIA
EndIf
EndIf
End Select
; PRZYSPIESZENIE
Select G\distonelive
Case 1 : If OPT\mx = 48
G\newspeed=2
EndIf
Case 4 : JSR SPEEDUP
Case 5 : G\newspeed=4
If OPT\mx =48
PLAY_MUSIC{True,#MUSIC_LEV2}
EndIf
Case 39 : JSR SPEEDUP
Case 40 : G\newspeed=8
If OPT\mx = 48
PLAY_MUSIC{True,#MUSIC_LEV3}
EndIf
End Select
; SCROLL PODCZAS STRATY ZYCIA
Else
If G\l>1
If offset>0
offset-1
Else
UnBuffer 0
BBlit 0,G\G,96+OPT\mx,72+G\Y
MOVE.w #$0,CONTROL
G\l-1 : LIVES{G\l}
G\newspeed=2
If G\l>0
While Peek.b(?CONTROL)=False
JSR INPUT
G\afterdeath=False
Wend
PLAY_MUSIC{True,#MUSIC_LEV1}
EndIf
EndIf
Else
LIVES{0}
G\speed=4
UnBuffer 0
If OPT\mx<160
BBlit 0,#GAMOVER,OPT\mx+96,64
EndIf
JSR INPUT
If Peek.b(?CONTROL)=$FFFFFFFF : G\l=5 : JMP LoadGame : EndIf
EndIf
EndIf
; ALGORYTM TWORZENIA MAPY
If OPT\mx MOD 16=0
Boxf OPT\scrollpos LSL 4,0,OPT\scrollpos LSL 4+15,160,0
Boxf (OPT\scrollpos-41) LSL 4,0,(OPT\scrollpos-41) LSL 4+15,160,0
ResetList obiekty()
While NextItem(obiekty())
If OPT\scrollpos LSL 4=obiekty()\x
KillItem obiekty()
EndIf
Wend
LOSUJ_MAPE{?MAP+OPT\scrollpos LSL 1}
EndIf
; RYSOWANIE MAPY
If OPT\mx MOD 16=0
If chmura1offset>0
Block #CHMURA1+chmura1offset,OPT\scrollpos LSL 4,8
chmura1offset+1
chmura1offset = QWrap(chmura1offset,0,5)
EndIf
If chmura2offset>0
Block #CHMURA2+chmura2offset,OPT\scrollpos LSL 4,24
chmura2offset+1
chmura2offset = QWrap(chmura2offset,0,6)
EndIf
Select Peek.w(?MAP+OPT\scrollpos LSL 1)
Case 0
End Select
If skokoffset=0
Block #DROGA+drogaoffset,OPT\scrollpos LSL 4,112
drogaoffset+1 : drogaoffset = QWrap(drogaoffset,0,5)
Block #ZIEMIA,OPT\scrollpos LSL 4,128
Else
Block #DROGA+skokoffset,OPT\scrollpos LSL 4,112
skokoffset+1
Block #ZIEMIA-skokoffset,OPT\scrollpos LSL 4,128
EndIf
Block #TRAWA+trawaoffset,OPT\scrollpos LSL 4,144
trawaoffset+1 : trawaoffset=QWrap(trawaoffset,0,5)
If krzakioffset>0
Block #KRZAKI+krzakioffset-1,OPT\scrollpos LSL 4,88
krzakioffset+1 : krzakioffset=QWrap(krzakioffset,0,6)
EndIf
EndIf
; RYSOWANIE CZASZEK I KLEJNOTOW
Use BitMap 0
If OPT\mx MOD 16=0
ResetList obiekty()
While NextItem(obiekty())
obiekty()\g+1
obiekty()\g = QWrap(obiekty()\g , obiekty()\gmin , obiekty()\gmax+1)
Block obiekty()\g,obiekty()\x,obiekty()\y
Block obiekty()\g,obiekty()\x-336,obiekty()\y
Wend
EndIf
If OPT\mx MOD 16=8
; POMINIECIE PIERWSZEGO PRZERZUTU GRAFIK
If OPT\mirror=True
BlockScroll OPT\scrollpos LSL 4,0,16,160,(OPT\scrollpos LSL 4)-336,0
Else
OPT\mirror=True
EndIf
; DZWIEK JADACEGO WOZECZKA
If M\_ram=False
;/////////////////////////////////////////////////////////
; STEROWANIE SILNIKIEM KROKOWYM STACJI DYSKIETEK DF0-DF3
BCHG #1,$bfd100
NOP
NOP
BCLR #0,$bfd100
NOP
NOP
BSET #0,$bfd100
;/////////////////////////////////////////////////////////
EndIf
EndIf
; OBSLUGA SCROLLA
OPT\mx+G\speed
While OPT\mx MOD G\speed<>0
OPT\mx-1
Wend
OPT\mx=QWrap(OPT\mx,16,352)
; POZYCJA RYSOWANIA MAPY
OPT\scrollpos=(OPT\mx+320) LSR 4
OPT\mappos =(OPT\mx+96) LSR 4
OPT\mappos = QWrap(OPT\mappos,0,21)
; DZWIEK SKOKU
If G\J=50 : SFX{#SFX_SKOK} : EndIf
; NAPISY DODATKOWE
CNIF #DEV=1
Locate 50,0 : NPrint "Go-Go-Go dEvELoPeR VeRsIon"
Locate 0,0 : NPrint "mx ",OPT\mx," "
Locate 0,1 : NPrint "mappos ",OPT\mappos," "
Locate 0,2 : NPrint "scrollpos ",OPT\scrollpos," "
Locate 0,3 : NPrint "drogaoffse",drogaoffset," "
Locate 0,4 : NPrint "skokoffset",skokoffset," "
Format "###"
For a=0 To 4
Locate 20+a LSL 2,0 : NPrint Str$(Peek.w(?MAP+a LSL 1))
Locate 20+a LSL 2,1 : NPrint Str$(Peek.w(?MAP+10+a LSL 1))
Locate 20+a LSL 2,2 : NPrint Str$(Peek.w(?MAP+20+a LSL 1))
Locate 20+a LSL 2,3 : NPrint Str$(Peek.w(?MAP+30+a LSL 1))
Next
Locate 20,4 : NPrint "CONTROL: ",Peek.b(?CONTROL)," ",Peek.b(?CONTROL+1)
ResetList obiekty()
If NextItem(obiekty())
Locate 40,1 : NPrint obiekty()\x," ",OPT\mx," "
EndIf
Format ""
CEND
CNIF #DEV=1
; If OPT\mx=20 Then MouseWait
CEND
BRA MAINLOOP
.GAME_OVER
QAMIGA
BLoad "DAT/GAMEOVER.DAT",Peek.l(Addr BitMap(0)+8)
BLITZ
'LOOP
If RawStatus($45) : BRA MAINMENU : EndIf
If Joyb(0)=1 : BRA MAINMENU : EndIf
If Joyb(1)=1 : BRA MAINMENU : EndIf
If RawStatus($40) : BRA MAINMENU : EndIf
BRA 'LOOP
.SPEEDUP
BBlit 0,#GAMOVER+1,OPT\mx+96,40
RTS
.MAINMENU
While RawStatus($45) : WAITVBL{0} : Wend
FreeSlices
For offset=0 To 147
Free Shape offset
If offset<=3 : Free Sound offset : EndIf
Next
Slice 0,64+NTSC*20,320,200,$fff8,1,8,2,320,200
ShowSlice{0,1,0,0,0}
Free BitMap 0
BitMap 0,320,200,1
QAMIGA
BLoad "DAT/MAINMENU.DAT",Peek.l(Addr BitMap(0)+8)
BLITZ
SilentFloppy{0}
PLAY_MUSIC{True,#MUSIC_MENU}
ShowSlice{0,0,0,0,0}
While NOT RawStatus($45)
WAITVBL{0}
If RawStatus($40) OR Joyb(1)=1 OR Joyb(0)=1
PLAY_MUSIC{False,0}
G\l=0
JMP LoadGame
EndIf
Wend
.KONIEC
AMIGA
End
.MAKE_WORLD
CopyMemQuick_ ?FIRST_MAP,?MAP,44
For a=0 To 21
If chmura1offset>0
Block #CHMURA1+chmura1offset,a LSL 4,8
chmura1offset+1
chmura1offset = QWrap(chmura1offset,0,5)
EndIf
If chmura2offset>0
Block #CHMURA2+chmura2offset,a LSL 4,24
chmura2offset+1
chmura2offset = QWrap(chmura2offset,0,6)
EndIf
Select Peek.w(?MAP+a LSL 1)
Case 0
Block #DROGA+drogaoffset,a LSL 4,112
drogaoffset+1
drogaoffset = QWrap(drogaoffset,0,5)
Block #ZIEMIA,a LSL 4,128
Case #CHMURA1
Block #CHMURA1,a LSL 4,8 : chmura1offset=1
Block #DROGA+drogaoffset,a LSL 4,112
drogaoffset+1
drogaoffset = QWrap(drogaoffset,0,5)
Block #ZIEMIA,a LSL 4,128
Case #CHMURA2
Block #CHMURA2,a LSL 4,24 : chmura2offset=1
Block #DROGA+drogaoffset,a LSL 4,112
drogaoffset+1
drogaoffset = QWrap(drogaoffset,0,5)
Block #ZIEMIA,a LSL 4,128
Case #ZJAZD
Block #ZJAZD ,a LSL 4,112
Block #ZIEMIA+2,a LSL 4,128
Case #ZJAZD+1
Block #ZJAZD+1, a LSL 4,112
Block #ZIEMIA+3,a LSL 4,128
drogaoffset=0
Case #KRZAKI
krzakioffset=1
Block #DROGA+drogaoffset,a LSL 4,112
drogaoffset+1
drogaoffset = QWrap(drogaoffset,0,5)
Block #ZIEMIA,a LSL 4,128
End Select
; TRAWA
b+1
b=QWrap(b,0,5)
Block #TRAWA+b,a LSL 4,144
; KRZAKI
If krzakioffset>0
Block #KRZAKI+krzakioffset,a LSL 4,88
krzakioffset+1
krzakioffset = QWrap(krzakioffset,0,5)
EndIf
Next
OPT\mx=16
OPT\mirror=False
skokoffset=0
OPT\scrollpos=(OPT\mx+320) LSR 4
OPT\mappos =(OPT\mx+96) LSR 4
OPT\mappos = QWrap(OPT\mappos,0,21)
RTS
.INPUT
; ODCZYT KLAWIATURY/JOYSTICKA/MYSZY W CZYSTYM
; ASEMBLERZE 68k
MOVEM.l D0-D2,-(A7)
MOVEQ #0,D0
MOVEQ #0,D1
'KeyboardRead
MOVE.b $bfec01,D2 ; read
ROR.b #1,D2 ;
EOR.b #$ff,D2 ; rawsatus
;'ESC_KEY
CMP.b #$45,d2
BEQ.b 'EndOfGame
'ResetControl
MOVE.w #0,CONTROL
'Check_FIRE
BTST #6,$bfe001 ; left mouse
BEQ.b 'PutFire ; checking
BTST #7,$bfe001 ; joystick
; fire
BEQ.b 'PutFire ; checking
CMP.b #$40,D2 ; space
BEQ.b 'PutFire ; key
'Check_CROUCH
BTST #10,$dff016 ; right mouse
BEQ.b 'Crouch ; checking
MOVE.w $dff00c,d0 ; joystick
MOVE.w D0,D1 ;
LSR.w #1,D0 ; down
EOR.w d0,D1 ;
BTST #0,D1 ; checking
BNE.b 'Crouch ;
CMP.b #$4D,D2 ; put
BEQ.b 'Crouch ; down key
BRA 'Out
'PutFire
MOVE.b #$ff,CONTROL
BRA 'Out
'Crouch
MOVE.b #$ff,CONTROL+1
BRA 'Out
'EndOfGame
MOVEM.l (a7)+,d0-d2
JMP MAINMENU
'Out
MOVEM.l (A7)+,D0-D2
; KOLORY
If copperblock=False
If RawStatus($33) AND RawStatus($18) AND RawStatus($28)
; SilentFloppy {False}
JSR COPPERRAINBOW
EndIf
EndIf
RTS
BLITZ
.KUCHARZ
; STEROWANIE W ASEMBLERZE 68k
; SKAKANIE
MOVEM.l d0/d1/a0,-(a7)
GetReg d0,&G\speed
MOVE.l d0,a0
CMP.w #1,(a0)
BEQ.b PRZYSPIESZENIE
TST.b CONTROL
BEQ.b 'blockfire
TST.w 6(a0)
BNE.b 'blockfire
MOVE.w #$38ff,6(a0)
'blockfire
TST.b 7(a0)
BEQ.b 'jumpanim
TST.b 6(a0)
BNE.b 'jumpanim
TST.b CONTROL
BNE.b 'jumpanim
MOVE.b #0,7(a0)
'jumpanim
MOVEQ #0,d0
MOVEQ #0,d1
MOVE.b 6(a0),d0
TST.b d0
BEQ.b 'quit
BSET #1,$bfe001
MOVE.w #0,20(a0)
MOVE.w (a0),d1
LSR.b #1,d1
SUB.b d1,d0
LSL.b #1,d1
CMP.b #50,d0 : BEQ.b 'cas7
CMP.b #49,d0 : BEQ.b 'cas7
CMP.b #48,d0 : BEQ.b 'cas7
CMP.b #47,d0 : BEQ.b 'cas7
CMP.b #46,d0 : BEQ.b 'cas6
CMP.b #45,d0 : BEQ.b 'cas6
CMP.b #44,d0 : BEQ.b 'cas6
CMP.b #43,d0 : BEQ.b 'cas6
CMP.b #42,d0 : BEQ.b 'cas5
CMP.b #41,d0 : BEQ.b 'cas5
CMP.b #40,d0 : BEQ.b 'cas5
CMP.b #39,d0 : BEQ.b 'cas5
CMP.b #38,d0 : BEQ.b 'cas4
CMP.b #37,d0 : BEQ.b 'cas4
CMP.b #36,d0 : BEQ.b 'cas4
CMP.b #35,d0 : BEQ.b 'cas4
CMP.b #34,d0 : BEQ.b 'cas3
CMP.b #33,d0 : BEQ.b 'cas3
CMP.b #32,d0 : BEQ.b 'cas3
CMP.b #31,d0 : BEQ.b 'cas3
CMP.b #12,d0 : BEQ.b 'cas2
CMP.b #11,d0 : BEQ.b 'cas2
CMP.b #10,d0 : BEQ.b 'cas2
CMP.b #9,d0 : BEQ.b 'cas2
CMP.b #8,d0 : BEQ.b 'cas1
CMP.b #7,d0 : BEQ.b 'cas1
CMP.b #6,d0 : BEQ.b 'cas1
CMP.b #5,d0 : BEQ.b 'cas1
CMP.b #4,d0 : BEQ.b 'cas0
BRA 'quit
'cas7 : MOVE.w #12,4(a0) : BRA 'quit
'cas6 : MOVE.w #13,4(a0) : BRA 'quit
'cas5 : LSL.b #1,d1:SUB.w d1,2(a0):MOVE.w #14,4(a0):BRA 'quit
'cas4 : SUB.w d1,2(a0) : BRA 'quit
'cas3 : MOVE.w #15,4(a0) : BRA 'quit
'cas2 : ADD.w d1,2(a0) : MOVE.w #16,4(a0) : BRA 'quit
'cas1 : LSL.b #1,d1 : ADD.w d1,2(a0) : BRA 'quit
'cas0 : MOVEQ #0,d0 : MOVE.w d0,4(a0) : toffset=0
'quit
MOVE.b d0,6(a0)
'wyskok
PRZYSPIESZENIE
MOVEQ #0,d0
MOVE.l d0,d1
MOVE.w 16(a0),d1
MOVE.w (a0),d0
CMP.b d1,d0
BHI.b kucanie
TST.b 6(a0)
BNE.b kucanie
MOVE.w d1,(a0)
;BSET #1,$bfe001
kucanie
TST.b 6(a0)
BNE.b STER_WYJDZ
TST.b CONTROL+1
BEQ.b 'resetcrouch
GetReg d1,OPT\mx MOD 16
TST.b d1
BNE.b STER_WYJDZ
CMP.w #17,4(a0)
BLT.b 'firstgraphic
'animation
ADDQ.w #1,4(a0)
CMP.w #20,4(a0)
BHI.b 'firstgraphic
BCLR #1,$bfe001
BRA STER_WYJDZ
'firstgraphic
MOVE.w #17,20(a0)
MOVE.w 20(a0),4(a0)
BRA STER_WYJDZ
'resetcrouch
MOVE.w #0,20(a0)
BSET #1,$bfe001
STER_WYJDZ
MOVEM.l (a7)+,d0/d1/a0
; ANIMACJA KUCHARZA
If OPT\mx MOD 16=8
If G\J=False AND G\C=False
toffset+1
toffset=QWrap(toffset,0,32)
G\G = Peek.b(?TFRAME+toffset)
Else
toffset=0
EndIf
EndIf
; STEROWANIE W BLITZ BASIC 2
;If Peek.b(?CONTROL)=True AND G\J=False AND G\blockfire=False
; G\J=56
; G\blockfire=True
;EndIf
;G\speed=2
;If G\blockfire=True
; If Peek.b(?CONTROL)=False AND G\J=False
; G\blockfire=False
; EndIf
;EndIf
;If G\J>0
; G\J-(G\speed LSR 1)
; Select G\J
; Case 50 : G\G=12
; Case 49 : G\G=12
; Case 48 : G\G=12
; Case 47 : G\G=12
; Case 46 : G\G=13
; Case 45 : G\G=13
; Case 44 : G\G=13
; Case 43 : G\G=13
; Case 42 : G\Y-G\speed LSL 1 : G\G=14
; Case 41 : G\Y-G\speed LSL 1 : G\G=14
; Case 40 : G\Y-G\speed LSL 1 : G\G=14
; Case 39 : G\Y-G\speed LSL 1 : G\G=14
; Case 38 : G\Y-G\speed
; Case 37 : G\Y-G\speed
; Case 36 : G\Y-G\speed
; Case 35 : G\Y-G\speed
; Case 34 : G\G=15
; Case 33 : G\G=15
; Case 32 : G\G=15
; Case 31 : G\G=15
; Case 12 : G\Y+G\speed : G\G=16
; Case 11 : G\Y+G\speed : G\G=16
; Case 10 : G\Y+G\speed : G\G=16
; Case 9 : G\Y+G\speed : G\G=16
; Case 8 : G\Y+G\speed LSL 1
; Case 7 : G\Y+G\speed LSL 1
; Case 6 : G\Y+G\speed LSL 1
; Case 5 : G\Y+G\speed LSL 1
; Case 4 : G\J = False
; End Select
;EndIf
RTS
.STRATA_ZYCIA
PLAY_MUSIC{True,#MUSIC_G_OVER}
UnBuffer 0 : BBlit 0,21,OPT\mx+96,72 : WAITVBL{10}
UnBuffer 0 : BBlit 0,22,OPT\mx+96,72 : WAITVBL{10}
UnBuffer 0 : BBlit 0,23,OPT\mx+96,72 : WAITVBL{10}
UnBuffer 0 : BBlit 0,24,OPT\mx+96,72 : WAITVBL{10}
offset=26
If G\l>1
While Peek.b(?CONTROL)=0
WAITVBL{5}
JSR INPUT
offset = 51-offset
Blit offset,OPT\mx+111,64
Wend
EndIf
UnBuffer 0
Boxf OPT\mx+112,64,OPT\mx+124,80,0
G\afterdeath=True
G\distonelive=0
G\speed=1
G\J=0
G\C=0
G\G=0
G\Y=0
G\blockfire=True
G\newspeed=1
offset=128
If G\l<=1
PLAY_MUSIC{True,#MUSIC_ANIM}
EndIf
RTS
.COPPERRAINBOW:
; KOLOROWANIE CALEGO EKRANU GRY I BELKI COPPEREM
Use Slice 0
'COPPERLOOP1
ADDQ.b #1,COPPER+4
ADDQ.b #1,COPPER+5
ADDQ.b #2,COPPER+6
BSR ASM_RAINBOW
ADDQ.l #1,COPPER
CMP.b #$e,COPPER+6
BLT.b 'COPPERLOOP1
'COPPERLOOP2
BSR ASM_RAINBOW
SUBQ.b #1,COPPER+4
SUBQ.b #1,COPPER+5
ADDQ.l #2,COPPER
TST.b COPPER+4
BGT.b 'COPPERLOOP2
MOVE.w #0,COPPER+4
'COPPERLOOP3
BSR ASM_RAINBOW
SUBQ.b #1,COPPER+6
ADDQ.l #4,COPPER
TST.b COPPER+6
BGT.b 'COPPERLOOP3
MOVE.b #0,COPPER+6
BSR ASM_RAINBOW
MOVE.l #0,COPPER
For a=0 To 15
SliceSplit {1,$f-a,$f-a,$f-a,8+a}
SliceSplit {1,$f-a,$f-a,$f-a,24+a}
Next
SliceSplit {1,$d,$d,$d,40}
For a=0 To 4
SliceSplit {1,$b-a LSL 1,$b-a LSL 1,$8-a LSL 1,120+a LSL 2}
Next
For a=0 To 14
SliceSplit {1,$b-a LSR 1,$b-a LSR 1,$8-a LSR 2,144+a}
Next
;
Use Slice 1
For a=0 To 9
SliceSplit {1,$b+a LSR 1,$8+a LSR 1,$8+a LSR 1,a LSL 1}
SliceSplit {1,$f-a LSR 1,$c-a LSR 1,$c-a LSR 1,19+a LSL 1}
Next
MOVEQ #0,d0
MOVEQ #0,d1
MOVEQ #0,d2
MOVEQ #0,d3
MOVEQ #0,d4
BSR TOKE_JSR_RAINBOW
copperblock=True
RTS
.ASM_RAINBOW
MOVEM.l d0-d5,-(a7)
MOVEQ #0,d0
MOVE.l d0,d1
MOVE.l d1,d2
MOVE.l d2,d3
MOVE.l d3,d4
MOVE.b COPPER+4,d1
MOVE.b COPPER+5,d2
MOVE.b COPPER+6,d3
MOVE.l COPPER,d4
BSR TOKE_JSR_RAINBOW
MOVEM.l(a7)+,d0-d5
RTS
.TOKE_JSR_RAINBOW
TokeJsr ColSplit
RTS
AMIGA
.MAKE_MASKS
LoadShapes 0,"DAT/KUCHARZ.SHP"
; WYCINANIE I USTAWIANIE MASEK
Free BitMap 0
BitMap 0,320,320,1
LoadBitMap 0,"SRC/KUCHARZ_MASK.IFF"
offset.w=0
For b=0 To 2
For a=0 To 3
GetaShape 99,a*48,b*48,48,48
CopyMem_ Peek.l(Addr Shape(99)+14) , Peek.l(Addr Shape(offset)+18) , 48*48/8
offset+1
Next
Next
For a=0 To 4
GetaShape 99,a*48,144,48,48
CopyMem_ Peek.l(Addr Shape(99)+14) , Peek.l(Addr Shape(offset)+18) , 48*48/8
offset+1
Next
For a=0 To 3
GetaShape 99,a*48,192,48,48
CopyMem_ Peek.l(Addr Shape(99)+14) , Peek.l(Addr Shape(offset)+18) , 48*48/8
offset+1
Next
;KUCHARZ UMIERA
For a=0 To 3
GetaShape 99,a*48,240,48,48
CopyMem_ Peek.l(Addr Shape(99)+14) , Peek.l(Addr Shape(offset)+18) , 48*48/8
offset+1
Next
For a=0 To 1
GetaShape 99,a*16,288,16,16
CopyMem_ Peek.l(Addr Shape(99)+14) , Peek.l(Addr Shape(offset)+18) , 16*16/8
offset+1
Next
Free Shape 99
Free BitMap 0
RTS
Even
FIRST_MAP:
Dc.w #ZJAZD,#ZJAZD+1,#KRZAKI,#CHMURA2,0,0,0,0,0,0
Dc.w 0,#CHMURA1,0,0,0,#KRZAKI,0,#KRZAKI,0,0
Dc.w 0,0
MAP:
Dcb.l 11,0
TFRAME
Dc.b 8, 9, 10, 11, 4, 5, 6, 7, 0, 1, 2, 3, 8, 9, 10, 11
Dc.b 4, 5, 6, 7, 0, 1, 2, 3, 8, 9,10,11, 4, 5, 6, 7
CONTROL
Dc.w 0
COPPER
Dc.b 0,0,0,0,0,0,0,0 @tukinem, post #1
@Don_Adan, post #12
@tukinem, post #13
@Don_Adan, post #15
@Don_Adan, post #12
1. nie uzywaj kombinacji jsr/bsr z rts za nimi, tylko od razu jmp/bra
2. Nie zeruj rejestru d4, jesli zaraz potem uzywasz "MOVE.l COPPER,d4"
3. Nie znam sie na BB2 ale zamiast
BSR TOKE_JSR_RAINBOW
nie mozesz od razu dac?
TokeJsr ColSplit
Szybciej i krocej.
Colsplit 0,$f,$f,$f,0 ; linia 0 na kolor $fff
Colsplit 0,$e,$e,$e,2 ; linia 2 na kolor $eee
Colsplit 0,$d,$d,$d,4 ; linia 4 na kolor $ddd
; ^^^ przy takim kodzie plik exe najbardziej puchnie ^^^
;------------------------------------------------------------------------------
Statement SliceSplit {copperlista.b , R.b , G.b , B.b , Linia.w} ; tworze procedure w BlitzBasicu
ColSplit copperlista,R,G,B,Linia
EndStatement
SliceSplit {0,$f,$f,$f,0}
SliceSplit {0,$e,$e,$e,2}
SliceSplit {0,$d,$d,$d,4}
;^^^ ten kod po kompilacji zajmie o wiele mniej danych od poprzedniego, lecz jednak sporo tu basica ^^^
;-------------------------------------------------------------------------------------
.COPPERLOOP1:
ADDQ.b #1,COPPER+4
ADDQ.b #1,COPPER+5
ADDQ.b #2,COPPER+6
BSR ASM_RAINBOW
ADDQ.l #1,COPPER
CMP.b #$e,COPPER+6
BLT.b 'COPPERLOOP1
RTS
.ASM_RAINBOW:
MOVEM.l d0-d5,-(a7)
MOVEQ #$0,d0 ; ustawiam nr copperlisty dla parametru ktory bedzie w D0
ANDI.l #$f,d1 ; zeruje bity 8-31
ANDI.l #$f,d2 ; to samo
ANDI.l #$f,d3 ; to samo
MOVE.b COPPER+4,d1 ; kolor R do parametru w D1
MOVE.b COPPER+5,d2 ; kolor G do parametru w D2
MOVE.b COPPER+6,d3 ; kolor B do parametru w D3
MOVE.l COPPER,d4 ; nr linii na ekranie
BSR TOKE_JSR_RAINBOW ; skok do wywołania funkcji
MOVEM.l(a7)+,d0-d5
RTS
.TOKE_JSR_RAINBOW
TokeJsr ColSplit ; Jesli nie zrobie skoku, a wpisze w kodzie kilkukrotnie TokeJsr, to zwiekszy plik exe
RTS
;^^^ ta metoda jest najmniej pamieciożerna. Mamy tu jedynie TokeJSR, który wywołuje funkcję ColSplit, jednak polega on na parametrach, które wstawiam ręcznie do rejestrów Dn ^^^4. Dobrze by bylo jakbys dla Copper, uzyl globalnie jakiegos rejestru adresowego, np.:
lea Copper,a4
5.
Cos takiego:
ADDQ.b #1,COPPER+4
ADDQ.b #1,COPPER+5
ADDQ.b #2,COPPER+6
Mozesz zastapic
add.l #$01010200,COPPER+4
@rbej1977, post #18
@tukinem, post #19
@RDudek, post #20
@tukinem, post #21
@RDudek, post #24
@tukinem, post #17
@Don_Adan, post #27