@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