Jamy & Nory

Michalis Kamburelis

Kilka fragmentów kodu i część dokumentacji:
Michał Sałaban
Rafał Wawrzkowicz


Spis rzeczy

Ogólny opis projektu

Jamy & Nory to gra utrzymana w konwencji MUD, czyli multiple user dungeon. Projekt składa się z dwóch zasadniczych komponentów: programu serwera i programu klienta. Serwer zarządza światem gry i pozwala przyłączać się do gry (poprzez Internet) klientom. Klient pozwala użytkownikowi włączyć się do świata działającego na wskazanym serwerze. Użytkownik połączony z serwerem za pomocą swojego klienta staje się graczem. Gracz może poruszać się po świecie gry i wpływać na niego na wiele sposobów - podnosząc przedmioty, zabijając potwory, a także walcząc i rozmawiając z innymi graczami.

Gracz może w dowolnej chwili opuścić grę (używając polecenia koniec). Również nieoczekiwane zakończenie procesu klienta i idące za tym zerwanie połączenia w ,,brutalny'' sposób nie spowodują utraty informacji na serwerze. Bez względu na to w jaki sposób klient odłączy się od gry, aktualny stan jego postaci zostanie zachowany na serwerze. Użytkownik może potem połączyć się ponownie i będzie mógł kontynuować grę swoją dotychczasową postacią. Przy ponownym podłączeniu się będzie musiał podać imię swojej postaci oraz jej hasło (wszystkie postacie graczy przechowywane na serwerze są zabezpieczone hasłem aby nikt nie mógł grać postacią stworzoną przez kogoś innego).

Nawiasem mówiąc rodzi to pewne problemy, bo pozwala graczowi zawsze uciec przed walką poprzez opuszczenie gry. Taka sytuacja jest nie do uniknięcia - nie możemy np. karać gracza śmiercią postaci za opuszczenie gry w czasie walki, gdyż w ten sposób awaria oprogramowania, sprzętu lub zerwanie połączenia (nie z winy klienta) powodowałyby utratę dotychczasowego dorobku postaci, co z pewnością nie byłoby mile widziane. Zresztą gra działa w taki sposób, że od walki i tak zazwyczaj można uciec po prostu przechodząc do sąsiedniego pomieszczenia.

Po świecie gry może poruszać się dowolnie wielu graczy. Z drugiej strony, gra nie zostaje zawieszona nawet wówczas gdy wszyscy klienci odłączą się od serwera. Niezależnie od graczy świat cały czas podlega przemianom, postacie sterowane sztuczną inteligencją same z siebie podejmują różne akcje - chodzą po świecie, atakują się wzajemnie, itd.

Przed uruchomieniem

Oficjalna strona dystrybucji programu jest na stronach Michalisa. Stamtąd możesz ściągnąć program w wersji skompilowanej, dokumentację (tą którą właśnie czytasz) wygenerowaną w różnych formatach oraz źródła do programu. Jeśli chcesz po prostu możliwie łatwo pograć w grę to polecam ściągnąć wersję skompilowaną.

Program jest napisany w Javie. Aby go uruchomić potrzebujesz Java Runtime Environment.

Po zainstalowaniu Java Runtime Environment musisz ustawić zmienną środowiskową CLASSPATH tak żeby zawierało pełną nazwę pliku (tzn. ze ścieżką) do jamy_i_nory.jar.


Uruchamianie

Łączenie klienta i serwera

Serwer gry rozpoczyna pracę po uruchomieniu skryptu jamy_server z podkatalogu bin/ naszego projektu. Składnia wywołania jest następująca:

  jamy_server [--help] [--port PORT] [parametry określające interfejs]...

Serwer naszej gry może czekać na połączenia na dowolnym porcie TCP, domyślnie działa na porcie 1111 ale można to zmienić parametrem -port, np. polecenie

  jamy_server --port 2323
uruchomi serwer nasłuchujący na porcie 2323.

Proces klienta rozpoczynamy wydając polecenie o składni

  jamy_client <adres-serwera> [--help] [--port PORT] [parametry określające interfejs]...
gdzie <adres-serwera> to numer IP serwera (np. 123.456.123.456) lub nazwa serwera rozpoznawana przez DNS (np. ii.uni.wroc.pl). Klient spróbuje połączyć się z działającym serwerem naszej gry na podanym komputerze. Domyślnie będzie próbował połączyć się z serwerem na porcie 1111, ale, podobnie jak w przypadku serwera, można to zmienić podając parametr -port, np.
  jamy_client ii.uni.wroc.pl --port 2323
połączy się z serwerem działającym na komputerze ii.uni.wroc.pl nasłuchującym na porcie 2323.

Przykłady

Prosty przykład.

Aby uruchomić serwer i klienta na tym samym komputerze można wydać polecenia

           
  jamy_server
  jamy_client 127.0.0.1

Zamiast ostatniego polecenia można równoważnie użyć

  jamy_local_client

Przykład prosty ale z problemami.

Jeżeli w powyższym przykładzie serwer przy próbie uruchomienia się odpowie Address already in use to port 1111 komputera jest już zajęty przez inny program. Musimy wtedy nakazać serwerowi naszej gry aby działał na innym porcie. Załóżmy że chcemy uruchomić nasz serwer na porcie 2323. Wpisujemy wtedy

  jamy_server --port 2323

Aby połączyć się z naszym serwerem z tego samego komputera użyjemy polecenia

   
  jamy_local_client --port 2323

Jeżeli nasz komputer jest widoczny w sieci pod adresem my.computer.net to ktokolwiek w sieci chcąc dołączyć się do naszej gry będzie mógł wydać polecenie

  jamy_client my.computer.net --port 2323

Więcej przykładów?

Można wykorzystać parametry -port aby na jednym komputerze uruchomić wiele wersji naszego serwera. Każdy taki serwer prowadziłby oddzielną grę w oddzielnym świecie. Gracze mogliby wtedy wybierać spośród kilku serwerów do których chcą się przyłączyć.

JamySingle

Poza serwerem i klientem w katalogu single/ znajduje się jeszcze klasa JamySingle, niesieciowa wersja gry dla jednego użytkownika. Realizuje wszystkie potrzebne dla jednego gracza funkcje. Gramy wtedy sami z komputerem, czyli gra przestaje być grą typu MUD - staje się zwykłą tekstową przygodówką.

Aby zagrać w JamySingle należy wpisać polecenie o składni

  jamy_single [--help] [parametry określające interfejs]...

Klasa JamySingle powstała przy okazji, w trakcie robienia serwera i klienta gry, ale zostaje już na stałe w programie bo dowodzi że kod ,,Jam i nor'' jest elegancko zorganizowany i można w nim z łatwością oddzielić fragmenty zajmujące się komunikacją sieciową od mechanizmów gry.

Pomoc

Zarówno proces klienta jak i serwera można uruchomić z parametrem -help. Wypisują wowczas krótką instrukcję: jak należy je uruchomić oraz jakie są dozwolone parametry w linii poleceń. Parametry które nie zostały opisane w tej sekcji, oznaczane jako [parametry określające interfejs]..., są omówione w sekcji 5 o obsłudze.

Mechanika gry

Gracze wcielają się w przedstawiciela jednej z ras (ludzie, elfy, krasnoludy). Od wyboru rasy zależą początkowe zdolności postaci. Postacie mogą

Gra nigdzie nie nakazuje graczom walczyć lub współpracować ze sobą nawzajem. Podobnie istoty sterowane przez komputer - mogą być groźne dla innych graczy (i innych istot sterowanych przez komputer) ale nie muszą być. Ideą gry jest aby do pewnego stopnia symulować świat rzeczywisty i pozwalać graczom na względną swobodę działań.

Postacie

Postacie mogą być kierowane przez ludzi lub przez serwer gry. Gracz patrząc na drugą postać nie jest w stanie powiedzieć czy jest ona sterowana przez serwer gry czy przez innego człowieka. Generalnie, gracze mogą się przed sobą ujawnić prowadząc rozmowę za pomocą komendy powiedz (patrz opis dostępnych komend gry 5). Chociaż zawsze pozostaje niepewność że wmontowaliśmy do naszej gry niezwykle zmyślną sztuczną inteligencję a'la Eliza....

Zdolności każdej z postaci opisane są przez poniższy zbiór cech:

Przedmioty

Każdemu przedmiotowi przypisany jest krótki opis oraz waga (w kilogramach). Przedmiot może należeć do jednej z poniższych klas:

Postać może jednocześnie używać jednej broni, jednej zbroi i dwóch pierścieni. Ponadto może nosić w plecaku dowolne przedmioty, jednak magiczne przedmioty noszone w plecaku nie mogą modyfikować cech gracza, zbroja w plecaku nie daje obrony, a bronią w plecaku nie można zadawać obrażeń.

W grze występują też przedmioty które zawierają w sobie inne przedmioty, np. wszelkie plecaki. szkatułki, skrzynki itp. Waga takich przedmiotów jest zawsze podawana jako suma wagi opakowania (np. pustego plecaka) i wag przedmiotów w środku. Przedmioty takie można rozpakowywać poleceniem rozpakuj.

Modyfikatory

Wszystkie cechy postaci oraz przedmiotów są opisane przez modyfikatory. Pełen obraz zdolności postaci jest obliczany poprzez zsumowanie wszystkich aktualnych modyfikatorów działających na postać.

Modyfikator cech

Opisuje liczbę punktów którą dodaje się lub odejmuje od cech postaci. Może on być przypisany rasie (determinując początkowe cechy postaci), przedmiotom oraz fragmentom świata (np. na bagnie zręczność wszystkich postaci będzie zredukowana).

Modyfikator uderzenia

Jest podstawą do określania liczby punktów życia, które traci postać zraniona przy użyciu danej broni. Zapisujemy go jako nkm+c. Za każdym razem gdy dana broń rani postać obliczamy ile punktów życia zabiera uderzenie przez zsumowanie n wyników rzutów kostką m-ścienną i dodanie stałego czynnika c.

Cecha ta charakteryzuje każdą broń oraz rasę (aby określić jakie obrażenie zadaje nieuzbrojona postać, tzn. walcząca pięściami, pazurami, mackami itd.)

Walka

Wynik walki, w której postać A atakuje postać B obliczany jest następująco:


\begin{displaymath}
A_{pkt} = \frac{A_{sila} + A_{zrecznosc}}{2} + (1k6)
\end{displaymath}


\begin{displaymath}
B_{pkt} = \frac{B_{sila} + B_{zrecznosc}}{2} + (1k6)
\end{displaymath}

Jeśli $A_{pkt} > B_{pkt}$ to mówimy że cios trafia i zadaje obrażenia wynikające z modyfikatora uderzenia broni używanej przez A zmniejszone o wartość obronną zbroi i skóry postaci B.


Obsługa

I klient i serwer działają na zasadzie przyjmowania wpisywanych poleceń i wyświetlania odpowiedzi, np. klient na polecenie opisz mnie odpowiada dokładnym opisem gracza a serwer w odpowiedzi na polecenie gracze wypisuje wszystkich graczy znajdujących się aktualnie w świecie. Ponadto niektóre informacje mogą być wypisywane bez ostrzeżenia - np. klient może w każdej chwili poinformować gracza że nowa postać weszła do pomieszczenia, a serwer może w każdej chwili poinformować że do gry przyłączył się nowy klient.

Podczas obsługi serwera możliwość wydawania komend nie będzie zbyt często wykorzystywana - w końcu serwer powinien działać sprawnie bez żadnego nadzoru. Natomiast podczas pracy z klientem gracz będzie zazwyczaj nieustannie wpisywał kolejne komendy i czytał odpowiedzi.

Obsługa klienta

Po uruchomieniu programu klienta, połączeniu z serwerem i stworzeniu postaci (lub wybraniu już istniejącej) użytkownik może rozpocząć grę. Do poruszania się w świecie ,,Jam i nor'' służą poniższe komendy:

Ponieważ gra jest ciągle rozwijana, powyższa lista może szybko stać się nieaktualna. Najlepszym źródłem informacji jest komenda pomoc.

Wersja niesieciowa (JamySingle) zachowuje się tak samo jak klient gry, tyle że nie łączy się z żadnym serwerem. Co znaczy tyle że wersja niesieciowa obsługuje identyczny zbiór komend co klient.

Obsługa serwera

Uruchomiony serwer gry udostępnia podobny interfejs co klient. Administrator serwera widzi rozmaite komunikaty diagnostyczne, przede wszystkim informujące o przyłączaniu i odłączaniu się graczy. Ponadto ma możliwość inspekcji i modyfikacji aktualnego stanu gry.

Określenie postać oznacza powyżej, tak jak wszędzie, gracza lub postać sterowaną przez komputer (czyli istoty wypisywane przez polecenia gracze i stworzenia).

Różne interfejsy

Niniejszym zostanie wyjaśnione co znaczyły parametry oznaczone w sekcji 3 o Uruchamianiu jako

  [parametry określające interfejs]...

Zarówno dla klienta, dla serwera jak i dla wersji niesieciowej dostępne są trzy rodzaje interfejsu. Każdy z nich zapewnia taką samą funkcjonalność - to którego interfejsu używać pozostaje do wyboru użytkownika.

Aplecik

Osoby znające Javę może zainteresować fakt że dostępna jest też wersja programu klienta jako aplet Javy. Ten aplet nie jest jeszcze zainstalowany na żadnej stronie w Internecie bo nie ma jeszcze nigdzie żadnego oficjalnego serwera gry, który działałby 24 godziny na dobę. Więc i tak trzeba sobie samemu uruchamiać serwer gry na własnym komputerze (albo uzywać wersji niesieciowej) więc równie dobrze można sobie samemu uruchamiać program klienta. Więc aplet nie ma w tym momencie zastosowania, jako że zasadniczą jego zaletą jest fakt że użytkownik nie musiałby nic ściągać ani ustawiać na swoim komputerze - wystarczyłoby żeby jego przeglądarka WWW obsługiwała Javę i aplet ,,sam by się uruchomił'', połączył z odpowiednim serwerem itp.

Tym niemniej wersja testowa apletu (jeszcze nie w pełni skończona - na pewno skończę ją gdy będzie realny sens używania tego apletu) jest dostępna - jest to klasa ClientApplet w pakiecie jamy_i_nory.client. Jeśli ktoś jest zainteresowany to może ten aplet uruchomić w swojej przegląradce WWW. Posiadając źródła programu można też stworzyć odpowiedni plik jar, jamy_i_nory_client_applet.jar, zawierający tylko klasy potrzebne temu apletowi.

Standardowa konsola Windows

Uwaga dla użytkowników standardowej konsoli pod Windows (nie chodzi tu o powłokę, command.com czy np. bash, ale o samo używanie standardowej konsoli Windows):

Podsumowując: pod Windows nie należy używać interfejsu konsolowego lub też używać innej konsoli niż ta dostarczona z systemem - jak już wspomniałem polecam konsolę rxvt Cygwina.

About this document ...

This document was generated using the LaTeX2HTML translator Version 2002-2-1 (1.70)

Copyright © 1993, 1994, 1995, 1996, Nikos Drakos, Computer Based Learning Unit, University of Leeds.
Copyright © 1997, 1998, 1999, Ross Moore, Mathematics Department, Macquarie University, Sydney.

The command line arguments were:
latex2html -no_navigation -split 0 -no_auto_link -dir html/ jamy_i_nory.tex

The translation was initiated by Kambi on 2004-02-20


Kambi 2004-02-20