Hej. Od dłuższego czasu chodzi mi po głowie problem. Napotykam go od wielu lat, i wciąż nie wypracowałem na niego rozwiązania, liczę, że może ktoś tutaj ma jakiś pomysł, lub coś mi umyka.
Mimo, że zawsze projektuję sobie kod w fajny sposób, najczęściej jako osobne, względnie hermetyczne systemy (np. system levelowania postaci i jej atrybutów, system wznoszenia budynków na gridzie, itd.) nadchodzi taki moment, że trzeba dodać system "R" (od rozp...).
Czyli system, który wpływa na wiele innych rzeczy, oraz ma pełno zależności.
Chociażby:
- tutorial - w formie interaktywnej, gdzieś czekamy aż coś gracz zrobi, wtedy częstujemy go kolejnymi okienkami/wskazówkami
- wszelkiej maści perki i techtree - jeśli postać podskoczyła mniej niż 6 razy w ciągu ostatniej minuty, wrogów nie ma w zasięgu 10 metrów i NPC z naszej drużyny podrapał się po tyłku, dodaj graczowi duży fajny miecz do ekwipunku i odegraj hejnał. Dodatkowo wrogowie otrzymują 2x więcej damage przez kolejne 3 minuty - idealny przykład, gdzie nie ma opcji, na wyciągnięcie jakichkolwiek reguł do implementacji. A dajmy, że perków będziemy mieli kilkadziesiąt.
Rozwiazania:
-
brutal force - lecimy po całym kodzie, wstawiamy warunki i odpowiednio implementujemy. Jeśli perk X jest aktywny, to przemnóż damage w 'ReceiveDamage' od Enemy.
-
konkretne implementacje bazowej klasy Perk - każdy perk jest zaimplementowany na swój sposób. Wciąż wymusza to konkretne wypracowane rozwiązania w pozostałych systemach. Enemy musi mieć jakiś DamageMultiplier, który będzie modyfikowany z poziomu implementacji perka. Trochę lepiej, ale imo to wciąż dalekie od rozsądnego rozwiązania?
-
Subclass Sandbox - na to trafiłem w książce 'Programowanie gier. Wzorce', nie za wiele się różni od powyższego rozwiązania. Przekazujemy sobie interfejsy systemów do piaskownicy dla perków, i na nich operujemy.
-
skrypty zewnętrzne / visual scripting - zamiast implementacji konkretnych perków w kodzie. Plus bo wygodniej, minus bo zapewne wolniej działa. Wada rozwiązania taka sama jak w poprzednich - trzeba odpowiednio przygotować pozostałe systemy