Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: System questów w grze MMO
Forum PHP.pl > Forum > PHP
Mephistofeles
Potrzebuję zaprojektować taki system, który umożliwi mi tworzenie questów w grze MMORPG (przez przeglądarkę, na symfony).
Macie jakieś ciekawe pomysły?

Ja myślałem nad rozwiązaniem na bazie eventów, każda akcja w grze (zatopienie statku, przejęcie fortu, zdobycie przedmiotu...) wywołuje zdarzenie, które jest kierowane do systemu. Rejestrowałbym rozpoczęte przez gracza zadania w bazie, a każde takie zadanie podpinało by swoje event listenery jak w symfony. Gdy zdarzenie pasuje quest przechodzi na kolejny etap/kończy się z jakimś bonusem dla gracza. Etap questu też byłby zapisywany do bazy, i w zależności od etapu rejestrowane by były inne listenery.
wookieb
Cytat(Mephistofeles @ 14.11.2010, 20:31:42 ) *
podpinało by swoje event listenery jak w symfony.

To, że event listener (a właściwie Event Dispatcher) jest w Symfony wcale nie znaczy, że ona to wynalazła. Taka architektura jest znana od dawien dawna a dopisywanie "jak w symfony" wprowadza wielu w błąd "przypisywania wynalazku".

Cytat(Mephistofeles @ 14.11.2010, 20:31:42 ) *
Gdy zdarzenie pasuje quest przechodzi na kolejny etap/kończy się z jakimś bonusem dla gracza. Etap questu też byłby zapisywany do bazy, i w zależności od etapu rejestrowane by były inne listenery.

Eventowe podejście jest bardzo dobre. Tak samo jak i pomysł aby zdarzenia podpinać wtedy kiedy quest zostanie rozpoczęty.
Gdybyś tylko rozwinął swoją myśl za pomocą kawałka kodu to moglibyśmy konkretniej porozmawiać.
Mephistofeles
Wiem, tylko że najbliższa znana mi implementacja w PHP jest właśnie w symfony. Nawiasem mówiąc według dokumentacji ten akurat system zdarzeń jest wzorowany na Cocoa (z MacOSa).

Jutro postaram się coś wytworzyć, dzisiaj już stan umysłu mi nie pozwala winksmiley.jpg.
mathijas
Hmmmm zastanawiam się jak by to zrobić stricte obiektowo.

1. Model UserAction mógłby mieć pole $related_quests=array().
2. Podczas wykonania akcji (funkcją UserAction::execute), sprawdzane byłoby, czy istnieje powiązanie między User::$id, a Quest::$id (przy czym Quest::$id pochodzi z UserAction::$related_quests
3. Jeśli znalazły się Questy związane z tą akcją, można utworzyć model UserQuest(Quest::$id), a w nim uruchomić UserQuest::Quest()::executeStage(User::$id, self::$stage+1).

Wszystkie modele i operacje oczywiście musiałyby znaleźć stosowne odzwierciedlenie w bazie danych.

PS. Statyczne odwołania ze względu na pokazanie co gdzie, nie do implementacji :D.

Można by w ten sposób zrezygnować z Eventów i zaimplementować w dowolnym projekcie... Ale to raczej przemyślenia niż propozycja.
Mephistofeles
Przykładowo:
  1. // ładowanie nieukończonych aktywnych zadań
  2. $captain->loadActiveQuests();
  3. // wewnątrz metody następuje pobranie aktywnych questów i dla każdego wywołanie registerEventListeners(), w której podpinane są wszystkie nasłuchiwane zdarzenia
  4.  
  5. // następuje jakaś akcja, powiedzmy kapitan gracza wszedł do portu na wyspie X
  6. $dispatcher->notify(new sfEvent($captain, 'captain.reached_island', array('island_id' => $island->getId())));
  7.  
  8. // w listenerze podpiętym do tego zdarzenia następuje sprawdzenie, czy wyspa zgadza się ze wzorcem:
  9. if ($event['island_id' == 1)
  10. {
  11. $captain = $event->getSubject();
  12. $captain->addGold(1000);
  13. $captain->addExperience(200);
  14.  
  15. $this->setState(PiratesQuest::QUEST_DONE); // oznaczam quest jako wykonany i zapisuję w tabeli z questami stan
  16. }
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.