Kolega Mono zrobił to, co zapowiedział - podczas Sylwestra 2023/2024 przygotował atarowską wersję programu "W poszukiwaniu bliźniaka Ziemi" z Bajtka 2/1986. To była jakaś jego zajawka z młodości, którą postanowił sobie zrealizować dla przyjemności. Gra w Bajtku jest spektrumową wersją programu zamieszczonego w Creative Computing 11/1985.
Mono wiernie odtworzył program, jest tylko jedna i to wyraźna różnica - w wersji Atari mamy ekran tytułowy (przygotowałem mu proste ATASCII art).
Mono zrobił jeszcze drugą wersję, ma tytuł "Bliźniak CC", a literki CC oznaczają, że to wersja zgodna z oryginalnym listingiem z Creative Computing, a nie ze zmienioną wersją z Bajtka. Obie wersje programu lądują w naszych archiwum gier.
Tych różnic nie jest zbyt dużo i polegają generalnie na innych współczynnikach przy obliczaniu różnych wielkości opisujących planetę, a i to tylko niektórych - większość jest identyczna. W jednym przypadku w wersji bajtkowej dołożony został dodatkowy warunek przy decyzji czy planeta jest kamienista. Nie znam się na astronomii, żeby wywnioskować jakie są powody tych zmian, ale zwróciliśmy też wczoraj uwagę że w krótkim wprowadzeniu do gry wersja CC mówi, że podróżujemy przez galaktykę, a wersja bajtkowa że przez kosmos. Może mamy lokalną fizykę :) A tak bardziej na poważnie (o ile można mówić o powadze wklepując stary program ze "starej śmierdzącej gazety" w Sylwestra), to może autorowi wersji bajtkowej chodziło o to żeby gra była dynamiczniejsza i wielkości opisujące planety bardziej zróżnicowane (albo odwrotnie - patrz uwaga o mojej ignorancji).
W wersji dla Atari BASIC: - zdefiniowałem zmienną CLS$ zastępującą mi wraz z instrukcją PRINT instrukcję CLS, - trzymam rodzaje planet w jednej zmiennej tekstowej S$ (czytanej READ-em z linii DATA) którą potem adresuję za pomocą S$(2*J,2*J+1), bo nie mamy tablicy ciągów, - zamieniłem tablicę komunikatów T$ wypisywaniem frazy wprost w konkretnym miejscu, - zamieniłem tablicę ciągów C$ opisującą rodzaj planety (kamienista, gazowa, wyparowana, itd.) na tablicę numerów ciągów C i procedurę wypisującą ciąg bazując na C(I), - INKEY$ zastąpiłem sekwencją GET #1,A:Y$=CHR$(A) otworzywszy uprzednio kanał dla "K:", - funkcję LN zastąpiłem funkcją LOG, - no i RND to nasze RND(0).
Okazało się też że w listingu z archiwum zx-blizniak.7z (nie mam pojęcia skąd ja to mam) jest też kilka błędów związanych prawdopodobnie ze słabą jakością skanu z którego był zrobiony OCR - program syntaktycznie jest poprawny i się tokenizuje, ale działał poprawnie nie będzie: - linia 342: GOTO 360 zamiast GOTO 350, - linia 423: (.9+RND*.4) zamiast (.8+RND*.4), - linia 524: LET I(I)=L*RND*3 zamiast LET I(I)=.1*RND*3, - numery linii 2132 i 2133 powinny być w istocie liniami 2182 i 2183, - linia 2164: jest "01","02","03",itd. zamiast "O1","O2","O3",...
Różnice wersji ZX w stosunku do oryginalnej wersji z CC: - linia 322: L=EXP(1.5*LOG(M)) zamiast L=EXP(3.5*LOG(M)), - linia 323: TA=EXP(-1.1*LOG(M))*10000 zamiast TA=EXP(-2.5*LOG(M))*10000, - linia 464: RND(0)*2.2*LOG(MP) zamiast RND(0)*5*LOG(MP), - linia 530: jest warunek IF O(I)>173 AND A<=AC AND MP<=3 THEN zamiast IF O(I)>173 AND C(I)=2 THEN, - linia 742: dodano warunek IF O(I)>2000 THEN którego nie ma w oryginale, - linia 1030: "PRZEMIERZAMY KOSMOS" zamiast "PRZEMIERZAMY GALAKTYKE".
@Kaz: Chciałem nadmienić iż gra się nazywa "Bliźniak Ziemii", a nie "Bliźniak Mono" :P
Bliźniak Mono to drugi Mono czyli bliźniacy Mono to po prostu Stereo :)
A odnośnie wczorajszego programowania Bliźniaka na żywo, dzięki Jurku za wykład o różnicach między Sinclair Basic i Atari Basic i praktyczne porady, jak im zaradzić, przenosząc program z ZX Spectrum na Atari. Może to powinien być osobny wątek, gdzie zamieszczone by były przykłady różnic i sposób ich rozwiązania?
Tam jest jeszcze jedna kłopotliwa sprawa w kodzie o której dyskutowaliśmy m.in. z PeriNoidem wczoraj na zómie. Autor wersji ZX chyba z rozpędu popełnił drobną optymalizację wprowadzając błąd i zmieniając też nieco sposób działania programu. Mianowicie w wersji CC jest:
328FOR J=1TO63:IF M>S(J) THEN330 329NEXT J 330PRINT "spectral type of star: ";S$(J):PRINT
a w ZX:
328FOR J=1TO63: IF M>S(J) THENGO TO330: NEXT J 330 CLS : PRINT "TYP WIDMOWY GWIAZDY: ",S$(J): PRINT
Ideą pętli jest, zdaje się, wyszukanie w tablicy S elementu mniejszego niż M i opuszczenie jej (pomijam już wyciek pamięci), a następnie wypisanie typu gwiazdy. Optymalizacja polegająca na przeniesieniu NEXT z osobnej linii na koniec poprzedniej spowoduje że pętla wykona się tylko raz, bo instrukcja IF pomija wszystko aż do końca bieżącej linii w przypadku gdy warunek nie jest spełniony. Więc niezależnie od warunku nastąpi przejście do linii 330 z J=1.
W atarowskiej wersji zrobiłem więc analogicznie do oryginału: