atarionline.pl Scorch - pełna gra - Forum Atarum

Jeśli chcesz wziąć udział w dyskusjach na forum - zaloguj się. Jeżeli nie masz loginu - poproś o członkostwo.

  • :
  • :

Vanilla 1.1.4 jest produktem Lussumo. Więcej informacji: Dokumentacja, Forum.

    • 1: CommentAuthorPeri Noid
    • CommentTime31 Dec 2022
     
    Toż parametry przez stos to standardowe podejście z "dużych" systemów operacyjnych, default w Uniksach czy języku C.
    • 2: CommentAuthormono
    • CommentTime31 Dec 2022 zmieniony
     
    Ale one nie są przekazywane przez stos. One są w kodzie programu, ale za instrukcją jsr:
    jsr PRINTF
    .byte 'Ciąg %s do wyświetlenia.',0
    .word string
    lda #$AB
    ldx #$CD
    ldy #$EF
    ...

    Natomiast taki PRINTF bierze adres powrotu, czyli bajtu w kodzie znajdującego się za skokiem i względem niego pobiera wartości parametrów:
    PRINTF:
    pla
    sta adr
    pla
    sta adr+1
    ldx #0

    inc adr
    sne
    inc adr+1
    lda (adr,x)
    ...

    lda adr+1
    pha
    lda adr
    pha
    rts

    Stąd mowa o stosie.
    • 3:
       
      CommentAuthorPecus
    • CommentTime31 Dec 2022
     
    To świetny pomysł był! Tyle że zastępował makro, które może i zbyt często powtarza się w grze, ale za to nie rusza rejestrów indeksowych i zmiennych robiąc wszystko akumulatorem.

    W naszej grze rejestr X przez 90% czasu trzyma jedną z ważnych zmiennych (dla przyspieszenia gry i utrudnienia pisania kodu ;P ).
    A tu niestety nie da się zrobić wywołania bez ruszenia X, więc trzeba było zachowywać i odtwarzać, no i się wyrównało :)

    Mi jednak bardziej od optymalizacji (bo co tu jeszcze w tak optymalnym kodzie optymalizować :) ) więcej radochy daje poprawianie błędów.

    Do dziś męczy mnie samotny piksel po Nuclear Winter, który czasem nie opadał przy lewej krawędzi ekranu. W dalszym ciągu nie odkryłem dlaczego tam pozostaje, a to że go teraz nie ma to raczej zasługa tego, że doszedłem w jakim przypadku się pojawia i maskuję ten przypadek :P
    • 4:
       
      CommentAuthorpirx
    • CommentTime1 Jan 2023
     
    ->link<-

    AND THE VIDEO!!!
    • 5:
       
      CommentAuthorPecus
    • CommentTime1 Jan 2023
     
    Happy New Year!
    • 6: CommentAuthorAdam
    • CommentTime1 Jan 2023 zmieniony
     
    Szczęśliwego, szczęśliwego...

    A gdzie filmik z włączonymi kolorami? :)
    Nawet Saberman/ Zbylu milczy, chociaż kiedyś co tydzień robił filmik ze Scorcha ;)
    • 7:
       
      CommentAuthorzbylu
    • CommentTime1 Jan 2023
     
    Wywołany do tablicy, prezentuję rozgrywkę z ostatniej wersji Scorch.
    • 8:
       
      CommentAuthorPecus
    • CommentTime1 Jan 2023 zmieniony
     
    Jako, że nowych wersji już (chyba :) ) nie będzie :) to chciałem coś tu napisać.

    Czytajcie manual! Nie gryzie :)
    ->link<-
    A stosowanie broni defensywnych bardzo urozmaica rozgrywkę.
    W manualu działanie każdej jest dość dobrze opisane, a do tego opisane są zasady wg których działają przeciwnicy komputerowi.
    Znajomość tych reguł czyni grę ciekawszą.

    Gra posiada "trainera" i jako, że kod jest dostępny na GitHubie już ktoś powinien to znaleźć :) - nie jest jakoś szczególnie ukryty (bo w pliku binarnym jest "zaszyfrowany").
    Trainer daje na starcie graczowi, który go aktywuje wszystkie bronie w ilości 99 szt. wtedy wystarczy pamiętać o Auto Defense na początku każdej rundy i da się wygrywać nawet z Cyborgiem.

    Trainera można dać także graczowi sterowanemu przez komputer czy w ogóle wielu graczom. Ale Moroon z aktywnym trainerem jest wyjątkowo zabójczy :) (to taki Easter Egg).

    W ostatniej wersji broń defensywna "Lazy Darwin" po jej zastosowaniu (ustawia ona wtedy cel na najsłabszego przeciwnika) umożliwia dalsze samodzielne celowanie (wcześniej też tak było) a samo celowanie jest wizualizowane (a tego wcześniej nie było) w postaci lotu pocisku. Nie miałem wcześniej pomysłu gdzie ten efekt wcisnąć :)

    No i istnieje BFG! :) Bardzo trudne do zdobycia ale "trainer" zmienia to całkowicie :)
    • 9: CommentAuthorAdam
    • CommentTime1 Jan 2023
     
    @Zbylu: dzięki, natomiast pisząc o wersji "z włączonymi kolorami" miałem na myśli kolorowe góry, co uzyskuje się przez dwukrotne naciśnięcie TAB w menu przy starcie rozgrywki :) Takiego filmiku brakuje.

    @all: popieram słowa Pecusia, zachęcam wszystkich do przynajmniej przejrzenia instrukcji
    • 10:
       
      CommentAuthorpirx
    • CommentTime17 Jan 2023 zmieniony
     
    ->link<-

    ###### Version 1.25
    2023-01-17

    Y2K Compliance Edition
    This version is 5200 SuperSystem focused.
    - the correct production year in the splash screens!!!
    - very rare hangups when accessing the inventory seemingly eliminated, thanks @RB5200 for testing!
    - a new feature - pressing [Tab] (atari800) or [5] (5200) when selecting the wind power switches wind mode to changing with each turn, which makes aiming arguably more challenging! It is indicated by "?" next to the "Wind" in the main menu.
    - pressing [G] during the game changes the color scheme (classic, Polish rainbow, Xmas).
    - all these changes were made possible because of the extensive code size optimization by @Pecus
    • 11:
       
      CommentAuthorPecus
    • CommentTime17 Jan 2023 zmieniony
     
    No i taki zupełny drobiazg....
    W czasie gry klawisz G (tylko na a800) cyklicznie zmienia Gradient na Górach (stąd G :P ).

    Aaaa Paweł dopisał, no cóż - będzie dwa razy :)
    • 12:
       
      CommentAuthorPecus
    • CommentTime18 Jan 2023
     
    To ja tu wrzucę pytanie do programistów, bo męczy mnie to od miesięcy :)

    Mamy takie makro:
    .MACRO WAIT
    ;WAIT
    ;waits one frame (1/50 s(PAL) or 1/60s(NTSC))
    ?zero LDA VCOUNT
    cmp #$05 ; if line<5 then wait for line>4
    bcc ?zero
    cmp #$70
    bcc ?WA ; if line>=112 then
    sbc #10 ; last lines correction
    ?WA cmp VCOUNT
    beq ?WA
    bcc ?WA
    ?WFRAME cmp VCOUNT
    beq ?nowait
    bcs ?WFRAME
    ?nowait
    .ENDM

    Jego obecny wygląd wynika z długiej ewolucji tego kawałka "kodu" :)
    Ma ono czekać jedną ramkę - typowe opóźnienie.
    Oczywiście (jak widać) czeka patrząc która linia jest aktualnie rysowana i czekając aż znowu będzie ta sama (mniej więcej :) ).

    Na początku robi korektę pierwszych kilku linii, bo czasem RMT wchodzi na nie ze swoim VBI i w związku z tym może niedoczekać :)
    Podobnie jest ze sprawdzaniem końcowych linii, to akurat wynikło z testowania gry w NTSC.

    Nie można porównywać dokładnie, bo na niektórych ekranach są przerwania DLI, które wykonują się ponad jedną linię i jak się na taką trafi to duda (pierwsze wersje tej procki miały takie sprawdzanie, ale na początku nie było tak długich DLI i potem po wydłużeniu DLI miałem dziwne przypadki zwiechów - dobrze że jest altirrowy debugger :)

    No i teraz pytanie.
    Ma ktoś pomysł jak to ładnie zrobić?
    I od razu powiem, że czekanie na tyknięcie systemowego zegara też działa, ale gorzej wtedy wygląda np. kręcenie lufą czołgu na wysokiej górze (a właściwie to nie widać lufy :) ).
    • 13: CommentAuthortebe
    • CommentTime18 Jan 2023
     
    a dlaczego nie w ten sposób ?

    na przerwaniu VBL

    lda #0
    sta reset_vbl

    a w swoim programie

    lda #1
    sta reset_vbl

    wait lda reset_vbl
    bne wait
    • 14:
       
      CommentAuthorPecus
    • CommentTime18 Jan 2023 zmieniony
     
    Odpowiedź masz w ostatnim zdaniu, ale za mało precyzyjnie to napisałem.
    Ta procka jest wywoływana zawsze jeśli trzeba gdzieś coś opóźnić.
    Otóż nie ma w Scorchu podwójnego buforowania (za mało pamięci, zmniejsza szybkość, nie pomyśleliśmy o tym :) ).
    Czyli np. ruch lufą to jej czyszczenie i ponowne rysowanie, a przy obracaniu w czasie celowania po każdym czyszczeniu i rysowaniu takie opóźnienie. I już wiadomo, przy VBLu kończy się ono zawsze w podobnym miejscu ekranu, co powoduje efekt taki, że jeśli czołg jest na ekranie poniżej/powyżej którejś linii (wynika to z czasu czyszczenia lufy), to jego lufy nie widać w czasie kręcenia, bo nakłada się tam moment skasowania lufy przed ponownym narysowaniem na moment tworzenia obrazu przez ANTIC.

    I nad tym nie bardzo da się panować, łatwiej zrobić taką prockę opóźniającą jak widzisz (wtedy lufka miga, ale przynajmniej jest). Bo te lufki to tylko jeden z przykładów.

    Jest też gotowe makro:
    .macro waitRTC
    lda RTCLOK+2
    ?wa cmp RTCLOK+2
    beq ?wa
    .endm

    bo mamy działające przerwania systemowe, więc nie problem podmienić, tyle że.... patrz wyżej (sprawdzałem nie raz).
    • 15:
       
      CommentAuthorpirx
    • CommentTime19 Jan 2023 zmieniony
     
    czyli chodzi o wait 1 ramkie, ale od losowego miejsca na ekranie, co zmniejsza efekt "wow, ale mryga".
    kuuurka wodna sobie mysle a moze dac pentle opozniajaco z nopami i nazwac to dniem?
    • 16:
       
      CommentAuthorPecus
    • CommentTime19 Jan 2023
     
    Nie idźmy tą drogą, bo trzeba będzie X czy Y użyć :)
    • 17:
       
      CommentAuthorPecus
    • CommentTime19 Jan 2023
     
    Zoptymalizowałem do czegoś takiego:
    .MACRO WAIT
    ; WAIT
    ; waits one frame (1/50 s(PAL) or 1/60s(NTSC))
    ?ze LDA VCOUNT
    cmp #16 ; if line<16 then wait for line>15 (long VBI protection)
    bcc ?ze
    sbc #10 ; last lines correction
    ?wa cmp VCOUNT
    bcc ?wa
    ?wf cmp VCOUNT
    bcs ?wf
    .ENDM

    ale ciągle mi się to jakoś nie do końca podoba :)
    • 18:
       
      CommentAuthorYosh
    • CommentTime7 dni temu
     
    Zastanów się czy przerwania systemowe są ci do czegoś wogole potrzebne - wyłączenie ich to moment, przyspiesza to grę (systemowe jest opasłe) a cały kod robi się deterministyczny co do cyklu - wtedy głupie

    lda #100
    @ cmp VCOUNT
    bne @

    po prostu działa.
    • 19:
       
      CommentAuthorPecus
    • CommentTime7 dni temu zmieniony
     
    Nie działa jeśli masz zmienną wartość po LDA (a tak właśnie będzie) i wiele przerwań DLI, które zajmują więcej niż jedną linię. Wtedy jak trafisz akurat na tę linię (a jak pisałem jest ich wiele) to masz zwis, bo pętla staje się nieskończona.

    Poza tym wyłączenie systemowego VBI nie wiele przyspieszy, bo trzeba wtedy samodzielnie ogarnąć obsługę paru rzeczy, które normalnie to przerwanie robi. Np. dzięki rejestrom cieniom mamy eliminację drgań styków (był z tym problem przy zastosowaniu czytania bezpośrednio z rejestrów sprzętowych).
    A to dodatkowo kawałeczek kodu do napisania, co przy wolnych kilku bajtach stanowi wyzwanie.
    • 20:
       
      CommentAuthorpirx
    • CommentTime7 dni temu
     
    dodam, że w 5200 nie da się wyłączyć przerwań systemowych...
    • 21:
       
      CommentAuthorPecus
    • CommentTime4 dni temu
     
    A czy wiecie, że od wersji 1.21, dzięki moim optymalizacjom kodu, nie było śmiesznych gadek czołgów :)

    Jedną nazwę procki pomyliłem i się nie to zoptymalizowało :)

    Już poprawione.
    :)
    • 22:
       
      CommentAuthorjhusak
    • CommentTime4 dni temu zmieniony
     
    @Pecus
    A czy ta procka z atariki nie jest fajniejsza?
    bit VCOUNT
    bmi *-3
    bit VCOUNT
    bpl *-3


    Poza tym, jeśli często tego używasz, macro cały czas rozwija kod i można by przyoszczędzić.
    • 23:
       
      CommentAuthorpirx
    • CommentTime4 dni temu
     
    ha, podmieniłem, potestujem.
    macro jest tylko raz użyte i to tak
    sne:wait
    • 24:
       
      CommentAuthorPecus
    • CommentTime4 dni temu zmieniony
     
    @jhusak
    Ładna procka. I zero rejestrów :)
    Ale mam dwie uwagi/obawy.
    1. Kończy się zawsze w tym samym miejscu ekranu. Co oznacza także, że nie równo "odmierza" czas ramki. A i lufki w Scorchu mogą znikać, tylko na innej wysokości :)
    2. W NTSC niebezpiecznie mało linii ma do dyspozycji i jak akurat w tych liniach będzie dłuższe DLI to duda. Zawiśnie na drugiej pętelce. Oczywiście tego nie przetestowałem, ale na oko....

    Czyli nie dawałbym jej w bibliotece uniwersalnych makr jako wzór.

    Właśnie sprawdziłem w Scorchu w NTSC.
    Zwis po Return w menu głównym (czyli chyba pierwsze użycie), a nawet nie ma tam DLI, bo zwis jest na wyłączonym ekranie :) za to VBI jest, ale to nie powinno wpływać.

    Ja bym tego w atariki nie dawał :)
    • 25:
       
      CommentAuthorPecus
    • CommentTime4 dni temu zmieniony
     
    To jeszcze (jak już piszę o "nowej wersji") udało mi się naprawić błąd, który był od zawsze :)

    Nie rzucał się w oczy, czasem mnie trochę wkurzał jak się przytrafił przy testowaniu. I w końcu postanowiłem go namierzyć.

    Otóż czasem w przypadku kiedy trafiliśmy inny czołg dokładnie w środek (z dokładnością do pojedynczego piksela), to odejmowało mu mało energii i przeżywał takie trafienie (przy Baby Missile odejmowało jakieś 10 jednostek, a powinno 88).
    Teraz jest już jak trzeba.

    Przy okazji dorobiłem sobie "wizualizację" pomiaru odległości czołgów od centrum eksplozji, by było mi łatwiej znaleźć źródło problemu. Pawłowi (i mnie też) się to spodobało i w nowej wersji można włączyć wizualizację tego, co ukryte przed graczem (a przynajmniej kilku rzeczy).

    A jak jest realizowany pomiar odległości? :)
    • 26:
       
      CommentAuthorpirx
    • CommentTime4 dni temu
     
    ->link<-

    ###### Version 1.26
    2023-01-23

    Early morning edition. It is 5:11 am and I am writing this instead of dreaming of electric sheep.
    For the last 6 weeks, the versions we released had an awful bug - the conversations of tanks were completely invisible. Thanks for pointing this out, RB5200.
    - tanks talk to each other again
    - better stochastic non-blocking wait one frame
    - rare distance measurement bug fixed (rarely a tank survived a direct hit)
    - 5200: second fire (by RB5200)
    - "visual debug" mode in A800 version, triggered by pressing [CTRL]+[HELP]. It displays distances measured, laser aiming, and aiming technique. It leaves a mess on the screen, but it does not impair the game, just makes it a bit harder.
    • 27:
       
      CommentAuthorpirx
    • CommentTime3 dni temu
     
    procka z atariki okazała się niedobra (bo to zła procka była) - NTSC ma tylko 130 linii (VCOUNTowych)... zwis od razu... zaskakująco na 5200 NTSC działa, bo tam VBLANK jakoś inaczej się zatrzaskuje.
    • 28:
       
      CommentAuthorjhusak
    • CommentTime3 dni temu zmieniony
     
    @pirx, Ty nie śpisz? Jest 2:30 w nocy…

    Pozdro!

    A może BVC/BVS?
    • 29:
       
      CommentAuthorpirx
    • CommentTime3 dni temu
     
    2:30 to ja mam teraz i nie śpię ;(((
    • 30:
       
      CommentAuthorjhusak
    • CommentTime3 dni temu zmieniony
     
    To wstawaj, bo już po 10!
    • 31:
       
      CommentAuthorPecus
    • CommentTime3 dni temu zmieniony
     
    @jhusak
    BVS/BVC zadziała tyle, że w PAL odmierzy mniej niż pół ramki :) , a może lepiej BMI/BVC (pierwsza/druga pętla) ale to też nie rozwiązuje problemu 1.
    Takie cuś czeka do konkretnego miejsca ekranu a nie konkretny czas.

    Akurat taki zestaw pętli będzie czekał przez czas 1 do (w szczególnych przypadkach) 2 ramek. W zależności od tego kiedy się tę prockę wywoła.

    Poza tym, moja po optymalizacji zaczyna mi się już chyba podobać :)

    P.-S. O 9.30 Paweł jeszcze nie spał :P
    • 32: CommentAuthoradi
    • CommentTime2 dni temu
     
    Absolutnie nie chcę drażnić Twórcy, ale na obrazku tytułowym zobaczyłem wywrotkę Kamaz. Przydałoby się zamazać ten element chroniący kabinę kierowcy. Samochód będzie bardziej przypominał wyrzutnię. Ludzie odbierają świat wzrokowo i pierwsze skojarzenie ma duże znaczenie w ocenie całości.
    • 33:
       
      CommentAuthorpirx
    • CommentTime2 dni temu zmieniony
     
    to KAMA3 a nie żaden kamaz.
    [----]
    • 34:
       
      CommentAuthorPecus
    • CommentTime2 dni temu
     
    KA--Z temu winny :)
    • 35: CommentAuthorAdam
    • CommentTime2 dni temu zmieniony
     
    Przypomnę, co pisał autor obrazka:

    Kaz:

    (...) jakby ktoś nie kojarzył, to przedstawiony pojazd to M142 Himars, w Wojsku Polskim znany jako Homar.

    Wygląda to tak:



    Dodam, że te M142 używane są obecnie na ukraińskim froncie.
    • 36: CommentAuthoradi
    • CommentTime1 dzień temu
     
    Wszelkie podobieństwo jest przypadkowe :)
    • 37:
       
      CommentAuthorJacques
    • CommentTime1 dzień temu
     
    Podobny to jest do Steyra jak już ;-)

    • 38:
       
      CommentAuthorpirx
    • CommentTime1 dzień temu
     
    to tak jak mi adi kojarzy sie z adi dasslerem, czyli adolfem dasslerem
    :]
    • 39: CommentAuthoradi
    • CommentTime1 dzień temu
     
    Jak się kończą argumenty to zaczynają się wycieczki osobiste.
    Jak chcecie zostać z wywrotką, nie mam nic przeciwko. Trochę to śmieszne ale na upór nie ma rady :)
    • 40:
       
      CommentAuthorpirx
    • CommentTime1 dzień temu
     
    adi, ależ ja nie mam żadnych argumentów i nigdy nie miałem :) próbowałem się powstrzymać od argumentu ad hitlerum, ale KTOŚ TO MUSIAŁ ZROBIĆ, ŻEBY PRZEGRAĆ :)))
    • 41: CommentAuthoradi
    • CommentTime1 dzień temu zmieniony
     
    To dobrze że się godzimy :).
    Ja też nie miałem żadnych złych intencji, po prostu zauważyłem, że jeden słaby element psuje widok całości pewnie bardzo dobrej (piszę "pewnie", bo grę widziałem na razie tylko na Youtube).
    Włożyliście mnóstwo pracy i efekt jest doskonały. Szkoda, żeby go psuła jakaś wywrotka. Może jak ktoś ogląda dużo wiadomości i ciągle widzi te wyrzutnie, ma inne skojarzenia. Ja jestem nastawiony bardziej pokojowo, a wiadomości wcale nie oglądam (czasem zerknę coś na Interii) i skojarzyła mi się wywrotka. Zastanawiałem się jaki ona ma sens. Może coś z zasypywaniem ziemi :). Dopiero potem, na drugi dzień zrozumiałem że to wyrzutnia, jak zobaczyłem większy obrazek. Stąd moja uwaga, jak najbardzej pokojowa.
    • 42:
       
      CommentAuthorPecus
    • CommentTime12 godzin temu
     
    No nie wiem Panowie, mnie ten obrazek skojarzył się wczoraj z rozdziawioną paszczą aligatora :)
    Ale może późno już było :)
    • 43: CommentAuthoradi
    • CommentTime10 godzin temu
     
    Może adigatora? :)