Jeśli kogoś nadal nurtuje to pytanie, przygotowałem prostą odpowiedź.
1. Wersja na Atari 2600 - jak możemy przeczytać w instrukcji gry, po przekroczeniu 999'999 pkt licznik zamienia się w "!!!!!!". Na youtube możemy znaleźć filmik pokuazujący tą zmianę. Od tej chwili każde zdobycie punktu powoduje utratę życia. Teoretyczne maksimum tej wersji to 2000 mostów (za każdy mostek dostajemy 500pkt)
2. Wersja na Atari 5200 i XL/XE. Tu nie mamy żadnej wzmianki w instrukcji o wykrzyknikach. Do testu uzyłem emulatora Atari800Win, zablokowałem licznik "żyć", oraz wyłączyłem detekcje kolizji "Player-Player" oraz "Player-Playfiled". Następnie włączyłem autofire, oraz zablokowałem klawisz "góra". Emulator przyspieszyłem "F7" i czekalem na efekt. Po ok 5godzinach licznik wskazywał "6106" mostów oraz "9999990"pkt. Kazdy zdobyty punkt powodował utrate życia.
W obu przypadkach granicą gry nie jest wyczerpanie się mozliwości generatora rzeczki, ale licznik punktów...
To naturalne że przy tej objętości gry nie można zmieścić układu leveli w inny sposób niż jako generowanych na bieżąco. A tym samym liczba leveli może być nieograniczona. W związku z tym autorka jak widać zablokowała możliwość przekręcenia licznika, gdyby to zmienić tj wylączyć, to grać można w nieskończoność. Przy okazji normalnie grając 5 godzin da się dojść do około 200 mostu - wiem z autopsji ;)
Jakieś 15 lat temu zrobiłem to samo (no ale nie na emulatorze ;) ). Więcej powiem, nie blokowałem licznika żyć. Po prostu dłubnąłęm w kodzie tak ze samolocik działał jak pocisk, a do tego z wyłączonym sprawdzaniem współrzędnej poziomej. Czyli ginęło wszystko co znalazło się na poziomie samolociku. Licznika nie trzeba było blokować bo zawsze i tak jak paliwo się kończyło (bo też było niszczone) był w zapasie przynajmniej jeden dodatkowy premiowy żyć - tyle było punktów z tego niszczenia wszystkiego :) A no i kolizje z brzegiem były wyłączone.... No i takiego River Raida odpaliliśmy z kumplem wkładając joystick pod pokrywę tapczanu, żeby naciskała naprzód cały czas..... i poszliśmy do kina.
Po powrocie był most około Twojego 61xx i zatrzymany licznik punktów.
Ciekawe, jak wierna bedzie wersja pecetowska? ;) Przyznam, ze rzadko trafiaja do mnie remake'i starych gier, glownie przez ta hiperrealistyczna grafike, ktora nie pasuje do uproszczonych zasad gier 8-bitowych. Ale ten projekt na ponizszym filmiku bardzo mi sie podoba!
to wlasnie takie remake'i do mnie nie docieraja. Przy prostych zasadach swiata niepotrzebnie komplikuja grafike, staraja sie ja zrobic fotorealistyczna zamiast symboliczna.
Kształt rzeki, przeszkadzajki i mosty są liczone algorytmem, a nie zaprojektowane, dlatego po każdym kolejnym moście powstaje nam dalszy ciąg w nieskończoność. Fizycznie jest to możliwe, a nawet bardzo proste - również do wyobrażenia sobie i wpadnięcia na to samemu. Pamięć nie ma tu nic do rzeczy, no chyba, że ktoś ma w głowie też tylko tyle ile stockowe Atari:-)
Czyli chodzi o to, że jest to algorytm, który mając jakiś początek (powiedzmy pierwszy most) później generuje zawsze tak samo wyglądającą nieskończoną liczbę mostów? O tym nie pomyślałem, genialne :)
Ale tak w sumie nawet jeśli poziomy byłyby predefiniowane, to co stoi na przeszkodzie podawać je w kółko (co zresztą i tak ma miejsce, niezależnie od tego, czy są efektem algorytmu czy zakodowanego kształtu)
Jakby były podawane w kółko, to też by było to zauważone. Chodzi o to, że za młodych lat grałem namiętnie w tę grę i nigdy nie doszedłem końca (setny most to było pewnie jakieś jednorazowe osiągnięcie). Teraz dzięki emulatorowi i save'om miałem nadzieję dojścia do końca - no i inaczej się gra, wiedząc, że koniec jest, a inaczej - że nie ma :)
Na A2600 River Raid kończy się po przekroczeniu 1 000 000 punktów. Zamiast licznika punktów wyświetlają się wykrzykniki i samolocik leci dalej, ale trafienie w przeciwnika niszczy samolot:
Tu ktoś przekroczył 1 000 000 (356 most) na maluchu i po stracie życia licznik zaczął migać a gra stanęła: Czyżby tak wyglądał koniec River Raid na XE/XL?
Tutaj: ->link<- jest deasemblacja River Raid z Atari 2600. W/g opisu z listingu:
; Section generation: ; The river is divided into sections which are generated by random. The random ; number generator can generate 57337 different sections. Each section is ; divided into 16 blocks. The last block is the bridge. For each other block a ; random Id is generated, which defines the shape of the river. The river is ; randomly generated with or without islands. ; Each block is 32 lines high and is divided into two parts. Those parts are ; neccessary for the bridge only, because it is smaller than a whole block. ; ; All objects are also randomly generated. There is one object in each block. ; First the game randomly selects if a fuel tank, an enemy object (ship, plane ; or helicopter) or a house should be generated. Then a starting x-position is ; defined and finally the direction (left/right) of the object is set. ; The ships and helicopters start patroling also randomly.
Nie sprawdzałem jak jest na Atari800, ale pewnie podobnie, czyli może być 57337 mostów.
Generator liczb losowych (na którym oparte jest tworzenie plansz) jest programowy i startuje zawsze od tej samej wartości, przez co ciąg generowanych liczb jest zawsze taki sam. Dzięki temu plansze są takie same.
Mnie zastanawia, jak przy "losowym" generowaniu plansz osiągnięto efekt zwiększania się poziomu trudności ;)
Może poprzez ograniczenie początkowo występowania niektórych obiektów? Czyli jest sobie kilka obiektów różnych, ale dostępnych jest tylko część z nich, a później wraz z kolejnym mostem zwiększa się dostępność tych obiektów o 1. Nie wiem czy tak jest, ale tak sobie myślę, bo w RR na XL/XE jest tak, że w pierwszych etapach nie ma balonów, strzelających helikopterków, przelatujących białych samolocików. Na samym początku nie ma też ruchomych obiektów, a później już raczej większość jest ruchoma. To narastanie stopnia trudności następuje na kilku pierwszych mostach, a później już wydaje się, że jest jednolicie pod tym względem.
Wraz ze wzrostem numeru poziomu zwiększa się gestość wrogów, a zmniejsza się szerokość przesmyków. W początkowych levelach, nawet jak jest wyspa, to scieżka przelotu jest stosunkowo szeroka. Jednak z czasem ta szerokość się wyraźnie zmniejsza.
Zatem podsumowując - gra posiada (może posiadać) algorytm polegający na tym, że mając zadaną jakąś wartość początkową, na podstawie algorytmu zapisanego w skończonej ilości pamięci może generować nieskończoną i zawsze identyczną liczbę poziomów.
Czy jest przykład takiego algorytmu do pokazania w trochę prostszy sposób?
Nie wydaje mi się, aby mogło być w nim cokolwiek z losowości (wyklucza to identyczność leveli za każdym razem), i o ile mogę sobie wyobrazić rysowanie w nieskończoność figur w Logo, o tyle uzyskanie takiego efektu w River Raid, gdzie do symetrii i uchwycenia powtórzeń jest bardzo daleko, to IMHO jest niemałym osiągnięciem programistyczno-algorytmicznym.
@Liwiusz, poczytaj sobie, jak działa generator liczb pseudolosowych. On stara się "udawać" losowość, ale jest deterministyczny: startując od tego samego ziarna (seed) dostaje się zawsze ten sam ciąg wartości. Na małym Atari tego typu generator jest umieszczony w POKEY-u.
Ostatnio np. przy "Druidarium" KK zrobił tak, że na starcie gry wybieramy tylko wartość ziarna zapisaną szesnastkowo, a na tej podstawie generowana jest cała zawartość danego levelu.
Jak generatory liczb pseudolosowych często używa się LFSR zarówno w wersji softwareowej, jak i sprzętowej, bo konstrukcja takiego generatora jest bardzo prosta. W asm wygląda to mniej więcej tak:
lsr scc eor #$18
dla generatora o wielomianie x5+x4+1. 0 jest wartością niedopuszczalną.
NextRandom16 SUBROUTINE ; implements a 16 bit LFSR which generates a new random number: LDA randomHi ; 3 ASL ; 2 ASL ; 2 ASL ; 2 EOR randomHi ; 3 ASL ; 2 ROL randomLo ; 5 ROL randomHi ; 5 ; (JTZ: randomHi is very random, randomLo is NOT when more than one bit is used, ; because: randomLo[x+1] = randomLo[x]*2 + 0/1, but randomLo is used more often, ; randomHi only for new enemy and which. This could make the game a bit predictable.) RTS ; 6
Jeśli zmienić inicjalizację seed-a to można generować nowe plansze ;)
; initial values for the random number generator: SEED_LO = $14 ; change "to go, where no one has gone before" :) SEED_HI = $A8
A ja mam inne pytanie. Czy jest możiwość 'hacka' polegającego na tym, że wpisujemy inną wartość ziarna generatora liczb pseudolosowych i uzyskać inne poziomy?
W pierwszej części mapki są efektem losowym. Losowo są wstawiane kamienie, diamenty i puste pola. Losowo ale powtarzalnie ocxywiscie. Podejrzewam, że metoda mrob i błędów autor testował kolejne hashe, aż mapka była grywalna. Są też instrukcjie 'prosta linia od pola xy do xy'. Naprawdę pomysłowe. Wieczorkiem podrzucę linka do artykułu z grubą analizą.
@mav: Super. Są gdzieś źródła river raid, czy to jest jakaś deasemblacja? W sensie gry i tak sa w asemblerze głównie więc to się jakoś inaczej nazywa. Tak czy inaczej, czy interesuje kogoś jakie są algorytmy do gry agent U.S.A, mnie to zawsze gryzło, jak rozprzestrzenia się epidemia, a przede wszystkim jak zrobiona jest sprawa pigułek-lekarstw(rozmnarzających się). Czy pigułki rozdane cywilom spowalniają rozwój epidemi, czy cywile też rozmnażają pigułki, czy lekarstwo jest rozprzestrzeniane przez cywili(na niektorych stacjach widac ze cywile rozdaja lekarstwo, bez interwancji gracza). Tak wiele pytań. Ktoś jeszcze się nad tym zastanawiał? Albo ktoś coś wie?
@astrofor na pewno cywile rzucają kryształy gdy spotkają zarażonego. Aby tak się stało musisz rozdać cywilom kryształy, w ten sposób "fortyfikując" miasto. To jest też sposób na wykaraskanie się z zarażenia głównego bohatera. Podróżujesz losowo, aż trafisz na dobra duszę, która podrzuci ci kryształ. Tyle instrukcja. ->link<-
[EDIT] Ilość kryształów w danym mieście jest podawana na mapie. OIDP to same z siebie się nie rozmnażają.
bruno_j: Dziekuje za cenna informacje, ze gdzies mozna sprawdzic ilosc krysztalkow w danym miescie. Pewnie w tym specjalnym info kiosku. Chyba tez krysztalki sie nie przemieszczaja do innych miast, chociaz na logikę powinny bo do pociagow wsiadaja tez ludzie z krysztalkami. Ciekawe tez czy ilosc krysztalkow w miescie jest dokladnie rowna ilosci krysztalkow jaka pozbierali ludzie w danym miescie. Jezeli tak, to czy licza sie tez krysztalki ktore ludzie zbieraja poza ekranem(mozna zostawic krysztalki na planszy i wyjsc do innej). Ciekawe tez jak wplywa rozwoj epidemi na ilosc krysztalkow w miescie. Czy na przyklad jak jest duzo krysztalkow to epidamia nie rozprzestrzenia sie w tym miescie. W sumie mala gra a sporo sie dzieje.
Dziwne, że do tej pory nikt tego jeszcze nie zrobił... No chyba, że zrobił;) Swoją drogą ta gra używa soft duszków, czy hardware'owe (rozmnożone jakoś)?
Gra używa duszków hardware'owych, rozmnażanych co sekcję.
Gra na Atari800 jest w zasadzie nieco rozbudowanym portem z Atari 2600, więcej przeszkadzajek bo jest więcej duszków, i tło jest rozbudowane bo używana jest standardowa grafika.
W wersji Atari800 jest tak jak na 2600 "kernel", który kontroluje wyświetlanie i co linię zmienia parametry duszków. Tło jest rysowane na vblank.
Zawsze podziwiałem tą grę. A teraz, gdy mam w końcu jakieś blade pojęcie o ograniczeniach platformy, podziwiam jeszcze bardziej. RR otwiera moją listę wszechczasów (nr2 i nr3 to Hired Guns i pierwszy Quake).
bulder dash tez nie ma zakonczenia. Tu znalazlem dodatkowe info o generowaniu leveli. ->link<- A tu ktos uzywa gramatyki generatywnej, do tworzenia leveli w blderdashu, ->link<- Bardzo ciekawe. Ja rozumiem ze tworzenie leveli w orginalym bulder dashu wygladalo tak ze za pomoca jakiegos seeda, za pomoca generetora dalo sie wygenerowac odpowiednio dlugi ciag zawsze tych samych liczb, tworca boulder dasha zmienial tak dlugo seeda az ciag liczb, tworzyl level mozliwy do przejscia. Dobrze mysle ?
Co ciekawe, boulderdash constictor kit także posiadał możliwość losowego umieszczania obiektów. Jestem ciekawy, czy wtedy też używa tego triku, czy z racji już większej pamięci jednak po prostu tworzy statyczną mapę.
Oczywiście za dzieciaka kompletnie nawet mi do głowy nie przyszło, że za tym stoi tak ciekawy mechanizm.