atarionline.pl Action! - co robie źle ? - 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: CommentAuthortatko74
    • CommentTime12 Apr 2024
     
    Witam
    Bawie sie Action!'em i przy zabawie z tablicami coś mi nie gra.
    Może ktoś podopowie o co chodzi - gdzie bład - w programie - w moim myśleniu ?

    kod:
    MODULE
    BYTE mx=[10]
    BYTE my=[5]
    BYTE ARRAY tablica(1000)

    PROC generator()
    BYTE test,px,py
    Graphics(0)
    PrintE ("")
    PrintE ("gen")
    for py=1 to my
    do
    print("# ")
    for px=1 to mx
    do
    test=rand(2)
    tablica(py*px)=test
    printb (tablica(py*px))
    print(",")
    od
    printE(" #")
    od
    PrintE ("koniec")

    PrintE ("poka")
    for py=1 to my
    do
    print("# ")
    for px=1 to mx
    do
    printb (tablica(py*px))
    print(",")
    od
    printE(" #")
    od
    PrintE ("koniec")
    RETURN


    a efekt na skrinie - jak widać "przelecenie" po raz drugi tablicy pokazuje inne wartości =/
    • 2:
       
      CommentAuthorjhusak
    • CommentTime12 Apr 2024
     
    Tam chyba jest jakiś błąd z indeksami tablicy, spróbuj wyliczyć indeks wcześniej do zmiennej i podaj zmienną jako indeks.
    • 3:
       
      CommentAuthorGeorge
    • CommentTime12 Apr 2024
     
    py*px nie omiata całej 50 elementowej tablicy.
    Bo na przykład 2 * 3 = 3 * 2
    Do elementu 6 wchodzisz dwa razy i ustawiasz losowo.
    Wyświetlasz w innym miejscu niż wynika z indeksu.

    Drugie wyświetlenie wyświetla indeks 6 w tych samych dwóch miejscach na ekranie, ale z drugą wylosowaną wartością, pierwsze wyświetlenie wyświetla obie losowe wartości.

    poszedłbym po pierwsze w indeksowanie od zera, a następnie indeksował: py*10+px, ale to pierwsze nie jest konieczne, tylko chyba wygodniej poźniej na ekranie znaleźć wartość.
    • 4:
       
      CommentAuthorjhusak
    • CommentTime12 Apr 2024 zmieniony
     
    A, jasne. Lampka mię się nie zaświeciła z tym powtarzaniem indeksów :D

    Poza tym tu chodzi o ćwiczenie chyba, a nie o część programu, bo sobie nie wyobrażam tak pokrętnej logiki przy kodowaniu czegokolwiek :)

    Ale nie przejmuj się tatko74 - to norma przy zabawie. Coś miało zająć 5 minut, a zajmuje godzinę, bo błąd się schował w miejscu, gdzie go nie podejrzewamy :)
    • 5:
       
      CommentAuthorGeorge
    • CommentTime12 Apr 2024
     
    No niby tak można adresować ekran, ale mnożenie na Atari zbyt drogie :)
    • 6: CommentAuthortatko74
    • CommentTime12 Apr 2024
     
    Sprawdzę inne metody :)
    Dziś już wjechał płyn złocisty więc czas na zadumę XD i złote przeboje :)
    Ale - może czegoś nie doczytałem - a Action nie można zdefiniować tablicy dwuwymiarowej ?
    • 7:
       
      CommentAuthorGeorge
    • CommentTime15 Apr 2024 zmieniony
     
    Nie.
    Ale możesz sobie zrobić
    CARD ARRAY addrs
    , gdzie będziesz przechowywać adresy innych tablic.
    • 8: CommentAuthortatko74
    • CommentTime15 Apr 2024
     
    Hej
    Dzięki za odpowiedzi
    Finalnie wygląda to tak jak poniżej
    To nie jest żaden konkretny projekt, a wyłącznie moje zabawy z Action!, próby "z czym to się je" :)
    Teraz działa jak oczekiwałem. Troche irytujące jest że nie moge użyć funkcji jako argumentu - no chyba że czegoś nie wiem.
    Np.:
    test=rand(3)
    SETIT(px,py,test)

    nie potrzebna zmienna - bo mogło by być
    SETIT(px,py,rand(3))


    Efekt zmagań z Action!
    MODULE
    BYTE mx=[32]
    BYTE my=[9]
    BYTE ARRAY tablica(1000)

    BYTE FUNC GETIT(BYTE x,y)
    RETURN(tablica(y*mx+x))

    PROC SETIT(BYTE x,y,c)
    tablica(y*mx+x)=c
    RETURN

    PROC GEN()
    BYTE test,px,py
    PrintE ("gen")
    for py=0 to my-1
    do
    for px=0 to mx-1
    do
    test=rand(3)
    SETIT(px,py,test)
    od
    od
    RETURN

    PROC POKA()
    BYTE test,px,py
    PrintE ("poka")
    for py=0 to my-1
    do
    for px=0 to mx-1
    do
    test=GETIT(px,py)
    printb (test)
    od
    printE(" ")
    od
    RETURN

    PROC MAIN()
    Graphics(0)
    GEN()
    POKA()
    RETURN
    • 9:
       
      CommentAuthorjhusak
    • CommentTime15 Apr 2024 zmieniony
     
    Trzeba mieć na uwadze, że Action! nie ma prawie żadnych optymalizacji, jednocześnie generując maksymalnie znośny kod przy tych założeniach.
    To właściwie jest TRANSLATOR i tak został zaprojektowany.

    Więc, jeśli piszesz:
    a=2+3*5, to zostanie wygenerowany kod 3*5 (skok pod A000, gdzie jest procka mnożenia), potem add #2 i sta a. Normalne kompilatory widzą to jako stałą 17.

    Jednocześnie zamieniając tablica(y*mx+x) na GET/SETIT dodajesz w najgłębszej pętli mnóstwo (kilkadziesiąt bajtów) kodu przekazującego sobie dane. Chociaż pierwsze 3 bajty argumentów są przekazywane w rejestrach A,X,Y, a reszta przez rejestry na stronie zerowej.
    • 10: CommentAuthortatko74
    • CommentTime15 Apr 2024
     
    Hej
    Jestem świadom tego potworka - znaczy jakie zamieszanie jest 'w tle'.
    Ale to tylko zabawa - a ja się bawię Action! - i nie chciał bym tej zabawy zaczynać od... asamblera :)
    Sądzę iż jakakolwiek próba zastąpienia tego mnożenia pewnie tak by się zakończyła.
    Co do dodatkowych funkcji i procedur - jestem świadom iż taki kod generuję więcej skoków,zmiennych itd., ale jak pisałem wyżej - sprawdzam jak się tego używa. Zwłaszcza że ze mnie d... nie programista XD.
    • 11:
       
      CommentAuthorjhusak
    • CommentTime15 Apr 2024
     
    Eeee, tam. Dobrze sobie radzisz :)
    • 12:
       
      CommentAuthoramarok
    • CommentTime15 Apr 2024
     
    @tatko74. Jakiś czas temu bawiłem się Action! i popełniłem kilka prostych programików. Można znaleźć je tutaj: ->link<-

    Troche irytujące jest że nie moge użyć funkcji jako argumentu - no chyba że czegoś nie wiem.

    Da się to w jakiś sposób obejść, jak w każdym języku. Możesz zobaczyć przykłady w poniższych zadaniach gdzie funkcje lub procedury są przekazywane jako argumenty do procedur w roli funktorów czy predykatów:
    - Repeat ->link<-
    - Rate counter ->link<-
    - Sort using custom comparator ->link<-
    • 13: CommentAuthortatko74
    • CommentTime16 Apr 2024
     
    @amarok - jestem pod wrażeniem - i dzięki za linka - nie omieszkam tam zaglądać :)
    • 14: CommentAuthorCuzz
    • CommentTime21 Apr 2024
     
    ja się na tym nie znam ale z tego co wiem jeśli action rozumie pseudo asembler matematyczny ale ze wsparciem węwnetrznej architerktury procesora co przybliża to do gier typu river raid draconus to da się normalnie zrobić coś na poważnie, jest tylko mały problem, trzeba mieć pomysł na gre, a to wymaga talentu artystycznego, i tu trzeba już szanować programistę. Mój talent się kończy na pokemonach. Jednego tylko nie rozumiem jak wy robicie te gry zespołowo, dla mnie to zong, musicie sie dobrze znać. ja próbowałem kodować ekspresjami, to żałosne. Moge się pochwalić, że znalazłem sposób na pisanie nowych gier. Robie to w altirze, która sie wiesza, ale kod sie wykonuje. Pojawia się nowy pliczek. To chyba windows próbuje blokować. Czarny ekran, a potem system sie na chwile wyłącza, to chyba TPM słynne. Mnie to nie obchodzi , bo to zwykłe hobby. A co do action , powinni to dać do podstawówek bo jest prostszy od c++. Nie uwierzycie jakie to żałosne próbować coś debugować, po prostu coś pisze a engine gry dalej ten sam, serio trzeba od początku, inaczej albo kod sie rozlezie, albo engine sam go wyrzuci albo zabezpieczenia. W action jest inaczej to wszystko jest twoje co piszesz, masz nad tym pełną kontrole, to nic że to matematyka a nie logika. Jest tego pewien plus bo ma sie antica, mozna wygenerować wiele ciekawych efektów w prosty sposób. A jeśli chodzi o pozycjonowanie grafiki jest to proste i jeśli sie to potrafi w action to na prawde mozna juz prawie wszystko. jesli wprowadziłem kogoś w bład to sorry ale ja w nim nie programuje, wlasciwie to komputer to skomplikowana maszyna nawet 8-bitowce nie są proste . nie sugerujcie sie .
    • 15: CommentAuthortatko74
    • CommentTime15 May 2024 zmieniony
     
    W Action nie działa odliczanie wstecz w pętli FOR ?

    BYTE i 
    Put(125)
    PrintE ("1do10")
    for i=1 to 10 step 1
    do
    PrintF ("%I,",i)
    od
    PrintE ("")
    PrintE ("10do1")
    for i=10 to 1 step -1 ; tu po prostu nic sie nie dzieje :/
    do
    PrintF ("%I,",i)
    od
    PrintE ("")
    • 16:
       
      CommentAuthorjhusak
    • CommentTime15 May 2024 zmieniony
     
    Instrukcja nic nie mówi o wartościach parametrów FOR.
    Natomiast FOR I=10 TO 10 STEP -1 DO PrintBE(I) OD

    wypisuje:
    10
    9
    8
    7
    6
    5
    4
    3
    2
    1
    0

    Wiem, gupie.

    Podobnie, jak za -1 podamy 255 czy 65535.

    Ale nie używał bym tego tak.
    • 17: CommentAuthortatko74
    • CommentTime15 May 2024
     
    No fakt - i to zawsze "do zera" :/
    W instrukcji też to zauważyłem - a raczej nie zauważyłem :)
    Poradzimy sobie inaczej... ;)
    Skoro @jhusak cię tu złapałem :)
    Poradziłeś sobie jakoś z tym komunikatem "adler32 does not match" w atari800 ?
    • 18:
       
      CommentAuthorjhusak
    • CommentTime15 May 2024 zmieniony
     
    jeszcze nie kompilowałem nowych źródeł. Zawsze to robię, jak coś rozpoczynam, a teraz raczej kończę :)

    A nie - w starych też jest ten problem. Aby go ominąć, musiałem nagrywać wielokrotnie skrypt, aż zadziałał. Trzeba też było robić długie, dużo dłuższe pauzy.
    • 19: CommentAuthortatko74
    • CommentTime24 May 2024
     
    Dlaczego to kończy się zwiechą ? :/
    Jak wprowadzać znaki bezpośrednio do pamięci - bez "print" ?

    PROC MAIN()
    BYTE i,continue
    CARD scrmem

    GRAPHICS(1)
    scrmem=peekc(88)

    for i=0 to 255
    do
    poke(scrmem+i,i)
    od

    RETURN
    • 20:
       
      CommentAuthorjhusak
    • CommentTime24 May 2024 zmieniony
     
    Dobrze robisz, a to nie zwiecha, tylko zapętlenie pętli for. Jak chcesz, żeby się nie zapętlało, to wpisz "to 254" albo zamień typ "i" na card.

    To dość częsta przypadłość kompilatorów, bo standardowo przy takim rodzaju pętli porównanie na końcu jest <=, więc w tym przypadku zawsze prawdziwe dla każdego i. Dlatego w asm się to pisze z pominięciem jednego porównania, np.

    ; petla 0-255 w asm
    ldx #0
    label
    zrób cośtam
    inx
    bne label



    Tak naprawdę jest to pętla "repeat until"

    No i do takich zastosowań nie musisz pisać "proc main()" i "return"

    BYTE i
    byte pointer scrmem

    GRAPHICS(1)
    scrmem=peekc(88)

    for i=0 to 255
    do
    scrmem^=i
    scrmem==+1
    od
    ; do od


    Tu troszkę bardziej zaawansowane podejście, a i krótsze w kompilacji :)
    • 21:
       
      CommentAuthorPeri Noid
    • CommentTime24 May 2024 zmieniony
     
    Czyli twoje, @jhusak, też się zapętli? ;-)
    • 22:
       
      CommentAuthorjhusak
    • CommentTime24 May 2024
     
    Oczywiście, ale zapełni cały ekran i widać, gdzie się zapętliło :)
    • 23: CommentAuthortebe
    • CommentTime24 May 2024
     
    w MP się nie zapętli, nawet dla typu BYTE
    • 24: CommentAuthortatko74
    • CommentTime31 May 2024
     
    I znowu ja :/

    Chce się pobawić definiowaniem swoich znaków.
    Na początek test - kopiowanie znaków i ich aktywacja - coś jak zwykle nie tak :/

    BYTE i,continue,setnew
    CARD chset,setadr


    GRAPHICS(0)

    setnew=peek(106)-4
    poke(106,setnew) ;obniżenie gornej granicy ram

    chset=57344 ;adres org tablicy znakow
    setadr=setnew*256 ;adres nowej tablicy znakow
    MOVEBLOCK(chset,setadr,1024) ;kopiowanie tablicy znakow na nowe miejsce

    poke(756,setnew) ;wskazanie nowego adresu znakow

    for i=0 to 120
    do
    printf("%C",i)
    od

    continue = GetD(7)


    Co znów nie tak ? XD
    • 25:
       
      CommentAuthorjhusak
    • CommentTime31 May 2024
     
    W złym miejscu Graphics i odwrotnie parametry do moveblock.

    BYTE i,continue,setnew
    CARD chset,setadr

    setnew=peek(106)-4
    poke(106,setnew) ;obniżenie gornej granicy ram
    GRAPHICS(0)
    chset=57344 ;adres org tablicy znakow
    setadr=setnew*256 ;adres nowej tablicy znakow
    MOVEBLOCK(SETADR,CHSET,1024) ;kopiowanie tablicy znakow na nowe miejsce

    poke(756,setnew) ;wskazanie nowego adresu znakow

    for i=0 to 120
    do
    printf("%C",i)
    od

    continue = GetD(7)
    • 26: CommentAuthortatko74
    • CommentTime1 Jun 2024
     
    Wielkie dzięki
    Zamiast spojrzeć do podręcznika, przyjąłem że "co","gdzie","ile", a tu "gdzie","co","ile" XD
    • 27:
       
      CommentAuthorKaz
    • CommentTime1 Jun 2024
     
    a z którego podręcznika korzystasz (tudzież "nie korzystasz")? :)
    Bo mamy nowszą wersje w Bibliotece Atarowca, polecam.
    • 28:
       
      CommentAuthorKaz
    • CommentTime1 Jun 2024 zmieniony
     
    To miałem na myśli:
    ->link<-

    Tam nawet jesteś wspomniany :)
    • 29: CommentAuthorlzd
    • CommentTime1 Jun 2024
     

    Kaz:

    Bo mamy nowszą wersje w Bibliotece Atarowca, polecam.

    Chyba najlepsze opracowanie Action!, jakie widziałem. Brakuje tylko klikalnego spisu treści. Może autor dodałby taki albo udostępnił plik źródłowy, tobym poprawił.
    • 30:
       
      CommentAuthorKaz
    • CommentTime1 Jun 2024
     
    Napisałem do autora.
    • 31: CommentAuthortatko74
    • CommentTime1 Jun 2024
     
    LOL !
    Nawet ładniejsze niż moje :)
    Pozdrawiam Krzysztofa :)
    A co do klikania po spisie - to było by fajnie - próbowałem, ale coś mi się rozjeżdżało więc zrezygnowałem.
    • 32: CommentAuthortatko74
    • CommentTime7 Jun 2024 zmieniony
     
    I znów :)

    Chciałem wyczyścić pamięć ekranu bez używania Graphics.
    Pomyślałem o Zero i ew. SetBlock
    Niestety obie procedurki powodują "czarny ekran" i tyle
    Mimo że w kodzie coś się dalej dzieje to już tego nie widać
    Pomaga tylko reset :/
    SetBlock(scrmem,scrmem+199,0)
    Zero(scrmem,scrmem+199)


    199 bo chodzi konkretnie o Gr.2

    Oczywiście "scrmem" to efekt scrmem=peekc(88)


    !!!!!!!!!!!!!!!!!!!!!!!!!!
    Jak zwykle moja skucha - drugim parametrem nie jest adres końcowy tylko rozmiar XD
    Przepraszam za zawracanie gitary
    • 33:
       
      CommentAuthorjhusak
    • CommentTime7 Jun 2024
     
    Świetnie, że to rozkminiasz - bo te procedurki to jakieś pokłosie wczesnych unixów czy innych, a tam są zdefiniowane parametry w jakiś logiczny sposób (na zasadzie niezbędnego minimum).

    Tak więc jeśli chcesz wypełnić pamięć, masz kilka sposobów określania parametrów, ale najsensowniejszy z nich to:
    parametr 1 - adres
    parametr 2 - długość
    ew. parametr 3 - wartość.

    Przy przepisywaniu są dwie konwencje: adres docelowy, adres źródłowy parametry, oraz odwrotnie, źródłowy docelowy i parametry.

    Człowiek dowiaduje się tego na początku, a potem używa już kalki.

    Potem jaki piszesz kod zgodnie z tymi kalkami, to jest on przejrzystszy dla osób trzecich.

    Więc próbuj i się dowiaduj! :) To jest niesamowita satysfakcja coś zakodować i to działa :)
    • 34: CommentAuthortatko74
    • CommentTime24 Jun 2024 zmieniony
     
    I znowu XD

    Tym razem z innej beczki - kompilacja
    Pisze sobie coś, kompiluje, zapisuje (w"h1:test.xex").
    Pod monitorem, zaraz po kompilacji, się wykonuje prawidłowo.

    Próbuje odpalić bezpośrednio xex (próbowałem w atari800 i Altirra) i owszem, się wykonuje ale tylko raz (mimo wew. pętli "DO..OD") i wywala do selftestu.
    Poniżej przykładowy trywialny programik.

    INCLUDE "H6:SYS.ACT"

    PROC test()
    BYTE i

    FOR i=0 to 10
    DO
    printE("test")
    OD
    RETURN

    PROC MAIN()
    BYTE continue
    DO
    test()
    continue = GetD(7)
    IF continue=27 THEN EXIT FI
    OD
    RETURN


    Edit:
    Jak zrobiłem tak z programikiem podmieniającym znaki to selftest miał już pozmieniane :)
    • 35:
       
      CommentAuthorjhusak
    • CommentTime24 Jun 2024
     
    Nie pamiętam, czy DO OD nie jest po prostu { i } albo begin end w pascalu. Trzeba by to okrasić jakimś whilem czy czymś... (to wydaje mi się fałszywy trop, zwłaszcza, że działa pod monitorem)

    Druga sprawa, to możesz czytać z zamkniętego kanału ( normalnie #7 jest chyba zamknięty) i kod Ci się wywala. Ale to z pamięci piszę.

    Spróbuj przed OD i DO go zamknąć i otworzyć do odczytu urządzenie K:
    • 36: CommentAuthortatko74
    • CommentTime24 Jun 2024 zmieniony
     
    I to jest to - potwierdzone :)
    Dzięki :)
    I napisali ludzie inteligentni :

    "Można tego kanału użyć w programie do pobrania znaków z K:, ale należy pamiętać, że jest on już otwarty"

    Czyli pod monitorem jest otwarty ciągle - a samodzielnie już trzeba pamiętać by go otworzyć :)

    edit:
    dla potomnych, tak powinna wyglądać proc. MAIN

    PROC MAIN()
    BYTE continue
    Close (7)
    Open (7,"K:",4,0)
    DO
    test()
    continue = GetD(7)
    IF continue=27 THEN EXIT FI
    OD
    Close (7)
    RETURN
    • 37: CommentAuthortatko74
    • CommentTime25 Jun 2024
     
    I znów - nowy dzień , nowe wyzwania :)

    To działa
    BYTE ARRAY blank = [1 1 1 1 1 1 ]
    CARD blkmem
    blkmem = peekc(@blank)
    printCE(blkmem)


    A to nie działa?
    BYTE ARRAY blank(100)
    CARD blkmem
    blkmem = peekc(@blank)
    printCE(blkmem)


    błąd 17
    • 38: CommentAuthortatko74
    • CommentTime26 Jun 2024
     
    podbijam
    • 39:
       
      CommentAuthorjhusak
    • CommentTime26 Jun 2024
     
    Z jakiegoś powodu nie działa... Bad Expression Format. przy podstawianiu peekc. Nie wiem, jak bardzo BAD.

    Nie wiem też, co chcesz osiągnąć. Bo tablica to jej adres. tablica(4) np. to wartość spod komórki liczona od adresu tablicy + 4.

    Więc blkmem=peekc(adres adresu tablicy) ... hm..

    Ja bym napisał blkmem=blank, ale też nie działa, error 9 - No a constant.
    • 40: CommentAuthortatko74
    • CommentTime26 Jun 2024 zmieniony
     
    Teoretycznie powinno działać blkmem=@blank - ale też nie działa
    A przy którychś zabawach mi to działało - z tablicą o określonej wielkości (2500 byte)- miałem PlanAdr=peekc(@plan) i ok.

    Chce uzuskać adres początkowy tablicy by mógł ją np. wyzerować ZERO(adr,size) lub przenieść zawartość MoveBlock(src,adr,size).
    • 41: CommentAuthortatko74
    • CommentTime26 Jun 2024
     
    A żeby było zabawniej - to działa :
    MODULE
    BYTE ARRAY plan(500)
    BYTE ARRAY test(500)
    CARD PlanAdr
    CARD TestAdr

    PlanAdr=peekc(@plan)
    TestAdr=peekc(@test)
    printcE(PlanAdr)
    printcE(TestAdr)
    • 42: CommentAuthortatko74
    • CommentTime26 Jun 2024 zmieniony
     
    A teraz hicior

    Pobawiłem się XD i zacząłem szukać na ślepo

    Jeśli zadeklarowana tablica nie ma "wypełnienia" danymi przy deklaracji (np. BYTE ARRAY blank = [1 2 3]), a określoną wielkość i jest ona mniejsza niż 257 (np. BYTE ARRAY blank(256)) to powyższy kod wywala bład ! Ale wystarczy że ma zadeklarowane 257 lub więcej i wszystko gra !
    Przy takich rozmiarach działa też wersja PlanAdr=@plan, jak podręcznik przykazał.

    Czary ...

    Ktoś umie to wytłumaczyć ?
    • 43: CommentAuthortebe
    • CommentTime26 Jun 2024
     
    napisz do autorów Action!
    • 44: CommentAuthortatko74
    • CommentTime26 Jun 2024
     
    No chyba marne szanse na patch'a XD
    • 45:
       
      CommentAuthorpirx
    • CommentTime26 Jun 2024
     
    oj tam, bo bys jakis struktur danych uzywac. jest jedna struktura danych, pamiec od 0000 do ffff.
    • 46: CommentAuthortatko74
    • CommentTime26 Jun 2024
     
    A się Was chłopaki dowcip z wieczora trzyma XD
    • 47:
       
      CommentAuthorjhusak
    • CommentTime27 Jun 2024 zmieniony
     
    Dobrze by było (jeśli nie jest jeszcze) dopisać do listy błędów Action!.
    Poza tym ten magiczny "MODULE" pewnie zmienia postać rzeczy. Nigdy nie rozumiałem, po co to jest i co to robi.
    • 48: CommentAuthortatko74
    • CommentTime27 Jun 2024
     
    A jest gdzieś taka lista ?
    • 49:
       
      CommentAuthorjhusak
    • CommentTime27 Jun 2024 zmieniony
     
    ->link<-
    I nie ma tam twojego błędu.
    • 50: CommentAuthortatko74
    • CommentTime27 Jun 2024 zmieniony
     
    Eeeeee po angielsku .... nie podejme się XD
    Ale nie widziałem tej miejscówki - więc i tak dziękuje :)