Zaloguj się, aby móc dodać artykuł

Kategorie artykułów
Logowanie


Zapamietaj mnie
Facebook
25.11
25.11.2012 11:23 ch3rry
System zadań w grze.
Hej

Zastanawiam się w jaki sposób napisać system zadań, który zminimalizowałby edycję kodu gry.

Tzn. dodawanie nowego zadania nie wiązałoby sie z edycją plików - nie mówie tutaj o zupełnym braku, ale wolałbym, żeby ingerencja była jak najmniejsza.

Pewnie trzeba zrobić w bazie tabele z zadaniami i Npc'tami.

Ale co dalej? Dzięki z góry za pomoc. Nie oczekuje kodu, wystarczy tylko teoria.
 
Komentarze
01.06.2013 20:37

Katrii
Bardzo pomocny temat
 
24.05.2013 14:42

Globalhawk
O dobre pomysły właśnie tego szukałem pobawię się dzisiaj z systemem zadań w mojej gierce
 
14.02.2013 10:26

Thoran
Cytat Zamieszczone przez Glibnes Zobacz posta
Jaki problem? Zapisujesz dane o zadaniach jako wielowymiarowe tablice a potem robisz zwykłego includa. Dodawanie tak samo proste jak do bazy danych, a dodatkowo nie obciążasz bazy niepotrzebnymi zapytaniami przy każdym uruchomieniu skryptu.
Skoro zapytania są potrzebne do wyciągnięcia danych to jak mogą być niepotrzebne? ^^
Mysql jest stworzony by w ułamku sekundy przetworzyć dziesiątki tysięcy rekordów (przy odpowiednio założonych indeksach), spróbuj to samo zrobić na pliku o dużej wielkości (np. 1 GB) w PHP. Wszystko najlepiej trzymać w bazie danych, jeśli zaś chcemy trochę odstresować kod to można robić cache danych, które często są pobierane a które często się nie zmieniają, ale nadal jeśli są to duże ilości danych to lepiej niech leżą w bazie.
Samo stworzenie systemu zadań nie jest trudne, na pewno będą potrzebne tabele takie jak:

1. Opisy zadań (trzymasz tutaj opis zadania)
2. Tabela zadań (tutaj mamy informacje o zadaniu np. który NPC je daje)
3. Tabela z warunkami spełnienia zadania
4. Tabela z nagrodami za zadanie
5. Tabela na informację że gracz wziął zadanie (tutaj też oznaczamy czy je wypełnił)
6. Tabela na zależności między zadaniami (np. jeśli jedno zadanie wymaga wypełnienia jakiegoś innego)

Wtedy łatwo tworzysz zależności między zadaniami tak jak w twoim przykładzie.
 
13.02.2013 15:21

Glibnes
Cytat Zamieszczone przez Sachem Zobacz posta
a dlaczego nie do bazy? po co miałbym się męczyć z plikiem i jego wskaźnikiem. czemu nie miałbym mieć backupu questów robionego razem z backupem bazy?
Jaki problem? Zapisujesz dane o zadaniach jako wielowymiarowe tablice a potem robisz zwykłego includa. Dodawanie tak samo proste jak do bazy danych, a dodatkowo nie obciążasz bazy niepotrzebnymi zapytaniami przy każdym uruchomieniu skryptu.
 
11.02.2013 19:18

Sachem
Cytat Zamieszczone przez Glibnes Zobacz posta
opis zadań dodaj do jednego pliku (nie do bazy).
a dlaczego nie do bazy? po co miałbym się męczyć z plikiem i jego wskaźnikiem. czemu nie miałbym mieć backupu questów robionego razem z backupem bazy?
 
26.11.2012 08:46

netruner80
Cytat Zamieszczone przez Glibnes Zobacz posta
Nie ma co zajmować bazy danych rzeczami, które są praktycznie stałe.
Praktycznie stałe a nie stałe. Te zadania mają być dodawany w łatwy sposób więc chyba stałe nie będą. Zresztą lepiej łatwiej mieć wszystko w bazie po to ona jest. Łatwiej panować nad wszystkim

Nic nie przeszkadza żeby dodać w bazie ścieżkę zadań. Prostsze jest później robienie statystyk czy historii i zarządzanie tym .
 
26.11.2012 08:27

hobibit
sprawa komplikuje się kiedy quest ma kilka etapów np
Tak jak pisałem, system wymaga dopracowania a to jest tylko szkielet. Nic nie stoi na przeszkodzie żeby w opisie questa dodać cały ten tor zadań który gracz musi zrobić a w rzeczywistości zrobić tak że skończenie jednego questa powoduje automatyczny start innego, przez co wykonuje się łańcuch questów.

Jeśli chodzi o przechowywanie w bazie danych to jest to moim zdaniem najlepsze rozwiązanie bo generuje porządek. Jednak nic nie stoi na przeszkodzie żeby po wpisaniu tego w bazie w grze napisać dobre cashowanie... takie które raz na całą grę pobiera dane do 'casha' a kolejny raz po zmianie bazy w bazie danych.
Sam tak zrobiłem z przedmiotami w jednej z moich gier.
 
25.11.2012 18:57

Glibnes
Ja bym nie radził dodawać zadań do bazy, chyba że po starcie serwera załadować je do tabeli przechowywanej w pamięci. Nie ma co zajmować bazy danych rzeczami, które są praktycznie stałe.
Co do "etapowości" - wystarczy w tabeli użytkownika dodaj pole zawierające stany każdego questa jaki został zaczęty i zapisywać to np. jako tablicę danych (potem serialize lub json_encode i można zapisywać w bazie bez problemu).
 
25.11.2012 16:36

ch3rry
sprawa komplikuje się kiedy quest ma kilka etapów np.:

1. Idziesz do NPC1 i on mówi, żeby od NPC2 przynieść mu jakiś tam mieczyk.
2. Idziesz do tego NPC2, on ma ten mieczyk dla NPC1, ale da nam go w zamian, za zebranie 5 bryłek złota.
3. Zbierasz bryłki, idziesz do NPC2 - dostajesz mieczyk.
4. Oddajesz go NPC1 i kończysz questa.
 
25.11.2012 16:20

hobibit
Wystarczy pomyśleć... a w zasadzie trzeba pomyśleć.
Myślisz jakie rodzaje questów chcesz mieć w grze. Myślisz nad wszystkim po koleji a potem myślisz jak to zrobić żeby było w bazie danych.

Mój pomysł jest skomplikowany ale mi się podoba.
Moja propozycja wygląda tak:
id | start | start_dana | wartosc | wartosc_dane | wartosc_ilosc | opis

start - wyzwalacz
start_dana - wartość pomocnicza wyzwalacza
wartosc, wartosc_dana i wartosc_ilosc - watrosci odpowiadajace za cel questa
opis - opis

Więc tak załóżmy że chcesz mieć możliwość rozpoczynania questa z różnych powodów:
pierwszy powód to to że gracz wszedł na dane pole, wtedy wyzwalacz = 'pole', natomiast start_dana to id pola na którym gracz musi stanąć żeby quest się zaczą
inny powód to rozmowa z npc-em, wtedy wyzwalacz = 'npc' a start_dana to id npc-a z którym gracz rozmawia
lub jeśli quest jest odpalany kiedy inny quest sie skonczył wtedy start = 'koniec_questa'

Więc za każdym razem kiedy gracz wchodzi na pole jest sprawdzane czy wyzwolił jakiś quest i za każdym razem jak rozmawia z npc-em sprawdzane jest czy zaczą jakiś quest. Można to oczywiście udoskonalić jakoś, ja zarys podaje.

Więc pierwsza linijka w bazie odpowiada za to co gracz musi zrobić żeby zacząć quest, kolejne są odpowiedzialne za inne rzeczy, na przykład za to co gracz musi zrobić żeby wykonać quest. Wtedy start = 'quest', a start_dana to id questa który się zaczął, potem wartość zależy od tego co gracz musi zrobić:
jeśli quest polega na tym że musimy porozmawiać z innym npc-em to wartosc='npc' a wartosc_dana to id npc-a z którym mamy porozmawiać
jeśli quest polega na zebraniu przedmiotów to wartosc = 'przedmiot', wartosc_dana to id przedmiotu który mamy zebrać a wartosc_ilosc to ilość przedmiotów które mamy zebrać
jeśli quest polega na zabijaniu potworów to wartosc='potwor', wartość_dana to id potwora, a wartosc_ilosc to ilość potworów do zabicia

Teraz kiedy się quest kończy co się dzieje?
Dodajemy kolejny wiersz w którym start='koniec', start_dana to id questa który się kończy a w wartosc wstawiamy nagrodę za quest, 'zloto', 'exp', 'przedmiot' itp.

To mój pomysł, można oczywiście go rozwijać ale daje całkiem spore możliwości moim zdaniem.
 
25.11.2012 13:07

ch3rry
Szkielet oparty o wyzwalacze?

Szczerze to nie wiem o co chodzi.
 
25.11.2012 13:00

Glibnes
Napisz sobie szkielet oparty o wyzwalacze (w kodzie gry), a opis zadań dodaj do jednego pliku (nie do bazy).

Jak będziesz chciał dodać jakieś nowe zadanie, dodajesz jego "opis" do pliku z zadaniami i w odpowiednim miejscu w grze dodajesz tylko wyzwalacz, który ma wykonać kod zadania. Jeśli dobrze napiszesz sobie szkielet to nie będziesz miał zbyt dużego dodatkowego narzutu operacji do wykonania. Dodatkowo, będziesz mógł dodać do kilku miejsc to samo zadanie do wykonania bez mnożenia tego samego kodu.