Niemal udało mi się skończyć kod służący obsłudze questów. Na tę chwilę bohater nadal jest w stanie zająć się tylko jednym zadaniem, ale kod jest już przygotowany pod to, aby mógł ich otrzymać więcej. Poprawiłem mechanizm rozpoznawania, którą aktualnie kwestię powinien otrzymać od NPC w efekcie zmienił się format jsona, z którego czytam dane dla zadań przekazywanych graczowi. Dla urozmaicenia dorzuciłem muzyczkę grającą w pętli w tle podczas rozgrywki i zmieniającą się przy zakończeniu questa u NPC. Mechanizm umożliwia łatwe przełączanie utworów podczas wydarzeń z gry (przejścia między obszarami, wejścia w dany obszar czy np. walki)
Aktualny wygląd jsona opisującego sam quest z możliwościami dialogowymi poniżej. Nie do końca jestem przekonany w trzymaniu wskazania na startowy dialog dot. questa w tym pliku (pole EntryDialog) ale na razie spełnia on swoją funkcję.
Jak łatwo można się domyślić RevisitDialog odpowiada za to co mówi NPC jeśli odwiedzimy go przed zakończeniem zadnia zaś CompletedDialog za dialog gdy wszystkie podzadania są zakończone i otrzymamy nagrodę.
[
{
"Id": "CANDLES_RECOVER",
"Title": "Odzyskaj lichtarze dla tajemniczej nieznajomej",
"Description": "W swiatyni seta znajduja sie lichtarze,
nizeznajoma chce je odzyskac",
"Giver": "Tajemnicza nieznajoma z karczmy",
"GiverId": "MYSTERIOUS_STRANGER",
"Status": "ACCEPTED",
"EntryDialog": "res://assets/dialog/levels/taverupperlevel/
PrincessTalkOne.json",
"RevisitDialog": "res://assets/dialog/levels/taverupperlevel/
PrincessTalkTwo.json",
"CompletedDialog": "res://assets/dialog/levels/taverupperlevel/
PrincessTalkCompleted.json",
"Tasks": [
{
"TaskCompleted": false,
"TargetLocation": "SET_TEMPLE",
"Type": "DISCOVER"
},
{
"TaskCompleted": false,
"Type": "FETCH",
"TargetLocation": "SET_TEMPLE",
"TargetNumber": "1",
"TargetName": "CANDLE_01"
}
],
"Reward": {
"Xp": 100,
"Gold": 1000
}
}
]
Z innych ważnych zmian:
- mocno skomplikował się plik zarządzania questami,
- podobnie ilość sygnałów (events) jakie są do tego przypisane
- postać niezależna nie steruje już tak mocno samym oknem dialogowym (chociaż... trochę musi) oraz - - nie jest zależna od pliku z questami (a była co akurat było bez sensu)
- bez problemu mogę też dodawać dialogi do npc-tów, którzy nie przekazują żadnych questów.
- Poprawnie działa (raczej :) ) podsumowanie zadania i późniejsze interakcje z npc gdy nie ma już żadnego zadania dla gracza.
A poniżej kilka zrzutów
|
Dialog przy pierwszym spotkaniu, po którym możemy otrzymać zadanie.
|
Poniżej jest to linia gdzie do węzła o typie AudioStreamPlayer2D podpinam się w sygnał Finished (czyli zakończenia się grania dźwięku) i uruchamiam funkcję RemoveChildNode()
private void QuestDone(String questDone)
{
AudioStreamPlayer2D questCompletedPlayer = new AudioStreamPlayer2D();
questCompletedPlayer.Stream = ResourceLoader.Load<AudioStreamWav>("res://assets/audio/music/questcompleted.wav");
questCompletedPlayer.SetVolumeDb(-30);
questCompletedPlayer.Autoplay = true;
questCompletedPlayer.Name = "questcompleted";
AddChild(questCompletedPlayer);
questCompletedPlayer.Play();
backgroundPlayer.Stop();
questCompletedPlayer.Finished += () => RemoveChildNode();
}