[#1] GoGoGo - gra dla każdej AMIGI
Jako, że nie tak dawno napisałem projekt TonyGO, okazuje się, że cała moja praca poszła na marne, gdyż Rafał sobie zadecydował, że gra będzie płatna. Mini-gra. Stwierdziłem, że nie po to pracowałem nad kodem i dopieszczałem go, aby udowodnić światu, że w basicu można napisać grę lekką na minimalną konfigurację Amigi. Stworzyłem o wiele ulepszony projekt lustrzany od TonyGO.

Można pobierać:
GoGoGo - Itch.io
GoGoGo - Aminet.net

Prezentuję Wam grę GoGoGo. Wraz z Selurem i Eightbm stworzyliśmy na bazie kodu TonyGO tą grę. Jest to prosta minigra, w której zbieramy eliksiry, przeskakujemy przez doły oraz unikamy kontaktu z przeciwnikami. Jest to moja pierwsza w życiu gra w pełnym scrollu. Mapa rysuje się algorytmem i jest nieskończona.

Jeśli uruchomimy grę na 99% Amig, to będziemy mieć grę z dźwiękami oraz muzyką. Jeśli uruchomimy na Amidze 1000 z 256kB Chip RAM, to dźwięki będą odgrywane silniczkiem krokowym stacji dyskietek. Tym głośnym silniczkiem, którego dźwięk emulowany jest w GOTEKu. TonyGO jedynie działa na dźwięku z silniczka stacji, którego GOTEK nie emuluje.

Podczas gry można sobie wcisnąć F2 i obejrzeć, jak scroll się rysuje na ekranie hires. F1 powraca do zwykłej scrollowanej wersji w lowresie. TonyGO tego nie posiada.

C+O+L uruchamia nam kolory - dla tych, co lubią liczyć ilość kolorów w grze.

Mamy tu 3 prędkości scrolla. W TonyGO nie wiadomo, kiedy gra przyspiesza. Tu ostrzega nas napis "SPEED UP".

Jeśli nie posiadamy Amigi 1000, a chcielibyśmy sobie uruchomić grę w trybie Floppy-Sound, to można bez problemu. W ADFie jest ikonka uruchamiająca grę w tym trybie. Można również sobie uruchomić z CLI dopisując parametr 256 np "DF0:GoGoGo 256".

Przechodząc z menu głównego do samej rozgrywki uruchamia nam się początkowo animacja z napisem "Game Over" tak, jak to miało miejsce w automatach do gier. Rafał bardzo chciał taki sposób w TonyGO, ale nie ma tam tego. Tutaj jest

Co jeszcze?

W grze możemy sterować naprzemienne joystickiem / klawiaturą / myszą.

Dodatkowo w ADFie zamieściłem w pliku KOD.TXT pełny kod gry dla chętnych.

Gra jest w pełni darmowa i proszę o rozpowszechnianie wszem i wobec.

Będzie można zakupić grę na dyskietce u Retronics, lecz ja się zrzekłem jakiegokolwiem wynagrodzenia za to. To jest tylko mini gra, o której świat pewnie za tydzień, lub dwa zapomni. Dla mnie to przełamanie granic i napisanie pierwszej w życiu scrollowanki na Amigę.

Tu nagrałem gameplay na emulowanej Amidze 500 512kB CHIP RAM:


a tutaj gameplay z emulowanej Amigi 1000 256 kB CHIP RAM - kickstart 1.0 -> Kickstart Disk 1.3


Ostatnia aktualizacja: 07.10.2024 03:03:53 przez tukinem
7
[#2] Re: GoGoGo - gra dla każdej AMIGI

@tukinem, post #1

Rozumiem, że nie każdemu chce się uruchamiać WinUAE, a wielu pewnie chciałoby obejrzeć kod gry.

Nie potrafię zbyt pięknie pisać kodu do gier, ale nie ukrywam tego i chciałbym pokazać, jak to wygląda poprzeplatanie Blitz Basic z Asemblerem.

Życzę przyjemnej lektury:

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
9
[#3] Re: GoGoGo - gra dla każdej AMIGI

@tukinem, post #2

BrawoOK
1
[#4] Re: GoGoGo - gra dla każdej AMIGI

@tukinem, post #1

Galante !!
1
[#5] Re: GoGoGo - gra dla każdej AMIGI

@tukinem, post #1

Kierowca podobny do Bartollini Bartłomieja, herbu Zielona Pietruszka szeroki uśmiech Gratulacje OK
[#6] Re: GoGoGo - gra dla każdej AMIGI

@_tBn_, post #5

Każdemu się tak kojarzy

Początkowo zrobiłem piłeczkę z wredną miną która się odbijała i obkręcała dookoła podczas scrolla, ale Selur zmienił to na kucharza.
4
[#7] Re: GoGoGo - gra dla każdej AMIGI

@tukinem, post #1

Przyjemna gierka! Moim zdaniem, od razu powinna się uruchamiać wersja z kolorami. Trochę popykałem, ale w tym wieku refleks już nie ten...
1
[#8] Re: GoGoGo - gra dla każdej AMIGI

@mastaszek, post #7

No ta trzecia prędkość jest trudna. Tam jest scroll 8 pix na ramkę, a ja myślałem jeszcze o dodaniu 16 pix na ramkę, ale to już byłoby zabójstwo

Po drugie gra jest zgodna z NTSC, więc tam jest lekko płynniej przy 60 FPSach
[#9] Re: GoGoGo - gra dla każdej AMIGI

@tukinem, post #8

Kiedy Ty na to znajdujesz czas i checi ;) Mi moje projekty ida jak krew z nosa ;) Gre odpalilem na a1200 z pistormem cm4 i z warped vision, dziala dobrze i gra sie fajnie.
1
[#10] Re: GoGoGo - gra dla każdej AMIGI

@marggines, post #9

Każdą wolną chwilę poświęcam. Jak to hobby

Nie potrzeba aż takiej bestii żeby tą minigierkę uruchomić, ale dobrze, że na takim sprzęcie też działa
[#11] Re: GoGoGo - gra dla każdej AMIGI

@tukinem, post #10

Przypomina mi klasyczne gry z lat 80-tych na 8 bitowce. Proste ale bardzo fajne.
1
[#12] Re: GoGoGo - gra dla każdej AMIGI

@tukinem, post #1

Troche przejrzalem pobieznie kod, i jak chcesz troche przyspieszyc dzialanie i zmniejszyc rozmiar pliku to:

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.
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
Oczywiscie, o ile te wartosci sa gdzies resetowane w petli, bo tak to reset nastepuje po osiagnieciu $ff.
[#13] Re: GoGoGo - gra dla każdej AMIGI

@Don_Adan, post #12

Musiałbym się bliżej przyjrzeć, ale pewnie we wszystkich przypadkach masz rację.

Co do BSR TokeJSRColsplit, to lepiej zrobić podprogram i tam wpisać funkcję z BB, niż kilkukrotnie jej używać. Tutaj walczyłem o to, aby plik exe jak najbardziej odchudzić.

Sam TokeJSR również w jakiś sposób skraca funkcje, jedynie trzeba ręcznie przypisać parametry dla funkcji poszczególnym rejestrom Dn.

Ostatnia aktualizacja: 07.10.2024 13:51:54 przez tukinem
[#14] Re: GoGoGo - gra dla każdej AMIGI

@Don_Adan, post #12

Oczywiscie to ma byc:


add.l #$01010200,COPPER+4
[#15] Re: GoGoGo - gra dla każdej AMIGI

@tukinem, post #13

Uzywasz ja kilkukrotnie, i mozesz te odwolania zastapic bezposrednio kilkukrotnie.
W tym podprogramie nic nie ma, tylko jsr do tej procedury.
Tylko Ci to pamiec zzera i spowalnia program.
Chyba, ze to jest macro.
Kazde jsr/bsr odklada na stosie nastepny adres po tej instrukcji.


Edycja, ale zrobisz jak zechcesz.

Ostatnia aktualizacja: 07.10.2024 13:54:58 przez Don_Adan
[#16] Re: GoGoGo - gra dla każdej AMIGI

@Don_Adan, post #15

Nie rozumiesz. TokeJSR Colsplit to jest funkcja, a nie nazwa podprogramu. Ona wywołuje funkcję Colsplit, która używa chyba 4 parametrów jak dobrze pamiętam.

Ostatnia aktualizacja: 07.10.2024 13:55:29 przez tukinem

Ostatnia aktualizacja: 07.10.2024 13:55:45 przez tukinem
[#17] Re: GoGoGo - gra dla każdej AMIGI

@Don_Adan, post #12

Teraz już mam czas. Mogę rzucić okiem i odpowiedzieć kolejno:
1. nie uzywaj kombinacji jsr/bsr z rts za nimi, tylko od razu jmp/bra

tu nie bardzo rozumiem, o których miejscach w kodzie piszesz, ale możliwe, że faktycznie zamiast BRA/JMP zrobiłem BSR/JSR, po czym na końcu podprogramu jest kolejny skok zamiast RTS

2. Nie zeruj rejestru d4, jesli zaraz potem uzywasz "MOVE.l COPPER,d4"

Tu racja. Sugerowałem się poprzednimi rejestrami, do których szły bajtowe dane, podczas, gdy tu przesyłam cały long.

3. Nie znam sie na BB2 ale zamiast
BSR TOKE_JSR_RAINBOW

nie mozesz od razu dac?
TokeJsr ColSplit

Szybciej i krocej.

Tu się sam zdziwiłem, jak w dziwnych przypadkach plik uruchamialny potrafi urosnąć, ale podam Ci kilka przykładów:
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

Opłaci się dla 4x MOVE wyrzucać dodatkowo A0 na stos przed użyciem i ustawiać mu adres do zmiennej COPPER? Później TokeJSR i tak używa jedynie rejestrów danych.

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


To mi się bardzo podoba. Na pewno nie przekroczę wartości $ff. Tu gdybym przekroczył $f, to Blitz wywaliłby błąd przed przepisaniem do ASM. COPPER+4 to kolor czerwony, COPPER+5 to zielony i COPPER+6 to niebieski. Wiemy, że maksymalne nasycenie dla danego koloru w OCS/ECS to $F, czyli 15 i tego się musiałem trzymać pisząc kolorowanie copperem, więc $ff nie ma szans, żeby przekroczyło. Widać tu Twoje doświadczenie i umiejętność skracania :) 3x ADDQ na pewno opłaca się zamienić na 1x ADD.l, tyle że to by mi zmniejszyło plik exe może o 8 bajtów. To już nie jest na tyle potrzebne, ale na pewno przyda mi się na przyszłość.
[#18] Re: GoGoGo - gra dla każdej AMIGI

@tukinem, post #17

Tylko dlaczego wygląda to znacznie gorzej niż wersja na małe Atari pod nazwą Tony Go?.
[#19] Re: GoGoGo - gra dla każdej AMIGI

@rbej1977, post #18

Chodzi Ci o brak paralaksy zapewne. Tak to właśnie jest przy rywalizacji. To samo było przy zwykłym Tonym. Napisałem grę jako pierwszy, a oni "przepisali" sobie z mojego githuba wszelkie dane. Gdy ja miałem skończony projekt, oni zaczęli kombinować i wymyślać różne dodatkowe bajery.

Poza paralaksą i przesuwaniem się do przodu i cofaniem nie wiem, gdzie gra wygląda lepiej. Zobaczymy, czy wersja na Atari ogarnie tryb NTSC, bo przy zwykłym Tonym były reklamacje przez błędy związane z brakiem spójności z NTSC. Koder grafiki do gry dostał ode mnie, maski do grafik sam stworzyłem i również ich używa.

Tony na Atari ST też pewnie będzie "lepszy". Koder dostał mojego githuba i pierwsze co zrobił, to zdeasemblował sobie kod do czystego asm 68k i teraz sobie przerabia pod ST. Na pewno coś doda od siebie. Trudno. Prawdę mówiąc, gdyby nie moja praca, to nie powstałaby ani jedna wersja gry ani Tony, ani TonyGO, ale TonyGO na Amigę trafił do kosza, więc Amigowcom zostaje GoGoGo
- niestety, bo nie ma grafik Tonego
- stety, bo każdy może sobie pobrać za darmo
1
[#20] Re: GoGoGo - gra dla każdej AMIGI

@tukinem, post #19

Wyjaśnię, bo chyba wprowadzasz ludzi w błąd. Zrobiłeś GO!GO!GO! według mojego pomysłu, ale mogłeś choć coś pozmieniać. To kopia 1:1; zmieniłeś tylko grafiki, a nawet nie zmieniles wielkości duszków i grafik. Wasza grafika jest ładna; lubię monochromatyczny styl, doceniam to, ale wydając GO!GO!GO! bez mojej wiedzy, zabiłeś wydanie GO! Tony Go! na Amigę. O paralaksie ci pisałem, ale mówiłeś, że nie potrafisz tego zrobić. Tak czy inaczej, popełniłeś prawdziwe świństwo, kopiując 1:1 pomysł i rozgrywkę. Może i lepiej, że tak wyszło. Jedno jest pewne: już nic dla mnie nie zrobisz. Takie zachowanie jest mało w porządku, a zaufanie jest najważniejsze. Pozdrawiam serdecznie i bez kontaktu!
[#21] Re: GoGoGo - gra dla każdej AMIGI

@RDudek, post #20

To teraz ja wyjaśnię. Pomysł nie był jedynie twój, a wspólny. Po drugie wzorowany na T-Rex. Po trzecie:

- punktacja w grze to mój pomysł
- algorytm tworzenia dalszej mapy to również mój pomysł
- animacja z napisem "game over" to też mój pomysł

Ty zrobiłeś jedynie grafikę i animację. Paralaksy nie było w planach, bo gra była minimalnie napisana dla 256 kB chip ram.

Świństwa robisz ty pisząc co innego atarowskim pismakom, że "gra jest słaba bo pisana w Blitz Basicu" i że ja jestem partaczem, bo nie zrobiłem pełnej paraboli skakania. Wzorowałem się na filmie XXLa o którym nawet tam nie wspomniałeś.

Chciałem napisać Tonego na MS DOSa, to napisałeś, że każdy łebek skrobnie to w Unity. Nie wiem co ma MS-DOS do Unity, ale mniejsza z tym. Teraz się wychwalasz, że jednak powstanie, ale nie przez łebka, a jednak aż studenta do tego potrzeba było. Gdy ci to wypomniałem, to przyczepiłeś się, że chodziło ci o ms dos. Ale nie tak dawno znowu się zacząłeś przechwalać że na jakiś ruski pecet powstaje na procesorze Intel 8080. Czyżby Intel to nie był PC retro? Sam sobie przeczysz i zmieniasz zdanie.

Nawet koder z C64 nie chciał już dłużej z tobą współpracować. Zmieniłeś hobby w biznesy i interesy. Dla ciebie to nie jest zabawa tylko zbieranie kasy od graczy, gdzie społeczność i tak jest coraz mniejsza. Byle minigrę chciałbyś wydawać w boxach i doić pieniądze na sztucznej komercji.

To ty zabiłeś TonyGO, bo miała to być minigra, ale wszędzie tylko zdzierałbyś kasę z ludzi wołając 3$ za grę która jest dosłownie na 5 minut. Tak się nie robi. Z tego dutków nie będzie góralu i nie zaśmiecaj tu forum. Gogogo to jest inna gra bez twoich super wypasionych graficzek. Zostań przy tworzeniu na swoje gameboye, atarki i rosyjskie złomy, ale trzymaj się z daleka od Commodore i Amigi.
6
[#22] Re: GoGoGo - gra dla każdej AMIGI

@tukinem, post #1

a po co ten Bartolini co chwila ogląda się za siebie? To jakieś Wacky Races i nie ma lusterka czy zajumał komuś samochód i nie ma lusterka?
1
[#23] Re: GoGoGo - gra dla każdej AMIGI

@snajper, post #22

spytaj "pomysłodawcy", bo gra jest podobno kopią 1:1
[#24] Re: GoGoGo - gra dla każdej AMIGI

@tukinem, post #21

Naprawdę jesteś tak szalony? Pomysł był mój w całości – robiłem animowane gify, żeby pokazać, jak to widzę, na kilka miesięcy zanim siadłeś do kodu. A teraz mówisz, że robię komercję? Przypomnę ci rozliczenie za GO! Tony Go!: koder 50%, muzyk 50%, grafik 0%. Ogarnij się, człowieku. Wiesz, ile zarobiłeś na Tony zanim jeszcze ją skończyłeś? Wysyłałem ci pieniądze motywacyjne... ponad 6 tysięcy. Nie chce mi się sprawdzać dokładnie, bo pewnie było tego więcej. A to jeszcze nie licząc tego, co zarobiłeś na sprzedaży gry. Ech, daj sobie spokój, chłopie. Na Zachodzie wygląda to tak, że jak zawalisz w firmie, to wylatujesz – no i poleciałeś.
[#25] Re: GoGoGo - gra dla każdej AMIGI

@snajper, post #22

no to moj pomysl ze Tony sie oglada... taki moje widzimisie
1
[#26] Re: GoGoGo - gra dla każdej AMIGI

@RDudek, post #24

Nie chrzań i otrzeźwiej!

Nigdy nie chciałem nic za TonyGO i Eightbm jest mi świadkiem. To ty wciskasz kasę na siłę a potem wymagasz. Ja ci nie bronię wydawać TonyGO, ale to jest świństwo ładować taką pchełkę w sprzedaż bo to nie jest nic warte.

Skoro tak jest u ciebie na zachodzie to sobie tam działaj z Zachodem. Dla mnie szkoda zachodu na marnowanie czasu z kimś kto ma rozdwojenie jaźni.
1
[#27] Re: GoGoGo - gra dla każdej AMIGI

@tukinem, post #17

Podstawowe to sa 2 rodzaje optymalizacji.
Optymalizacja szybkosci i optymalizacja miejsca.
Zwykle, gdy kod jest krotszy to jest szybszy, ale nie zawsze tak jest.
Optymalizacje miejsca, mozna podzielic na optymalizacje miejsca w pamieci i optymalizacje miejsca na dyskietce.
addq.b #1,COPPER+4 to sa 6 bajty w pamieci, i 10 bajtow na dyskietce (dochodzi reloc)
addq.b #1,4(A4) to sa 4 bajty w pamieci i 4 bajty na dyskietce, no i oczywiscie jest szybsze w dzialaniu.
[#28] Re: GoGoGo - gra dla każdej AMIGI

@Don_Adan, post #27

No właśnie - różnica to kilka bajtów.

Porównując wywołanie funkcji w basicu, to już dochodzi sterta dodatkowego kodu począwszy od przerzucania na stos wraz z stertą niezrozumiałego kodu tworzonego przez kompilator, skoku do samej funkcji, a kończąc na powrocie ze stosu. Dlatego nie zależało mi na starannie napisanym kodzie w asm, a bardziej na zamianie basica na sam, bo tu się zyskiwało na każdym kroku po kilka kilobajtów.
[#29] Re: GoGoGo - gra dla każdej AMIGI

@RDudek, post #25

Jak mawiaja Chinczycy jeden obrazek to jak 1000 slow... https://www.youtube.com/watch?v=W4Juxm9k-Ac
[#30] Re: GoGoGo - gra dla każdej AMIGI

@RDudek, post #29

A co było pierwsze?. Mi się wydaje że o Tony GO słyszałem najpierw bo ten GO GO to świeży temat.

Ostatnia aktualizacja: 07.10.2024 19:11:00 przez rbej1977
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem