16 listopada 2025

Więcej pomysłów niż dostępnego czasu

 Kilka ostatnich dni pozwoliło mi na wprowadzenie sporej ilości zmian w generatorze. Problematyczne stało się to, że rozgrzebałem jednocześnie kilka funkcjonalności i żadna nie działa tak jak powinna, a ja przeskakuję na kolejną i tu trochę kodu wrzucę, tam dodam trzy linijki... Przy takim trybie pisania ciężko kończy  się jakikolwiek projekt. Postaram się poniżej opisać co dodałem i może takie podsumowanie pozwoli mi na spojrzenie z góry na projekt i dokończenie po kolei rozgrzebanych elementów.

Dwie profesje

Dodałem możliwość wybrania dwóch profesji do generowanej postaci oraz uwzględnieniu w nich poziomów zaawansowania. Spora zmiana na plus względem poprzedniego podejścia do tego tematu. Teraz wiem skąd wynikają wartości składające się na cechy oraz raczej nie ma w tym błędów (tak mi się przynajmniej wydaje) Stworzenie opisanej wcześniej meta-profesji z dwóch było dobrym kierunkiem.

Postać dwu profesyjna z uwzględnionymi w cechach
poziomami per profesja

Na zakładce statystyk widać skąd wynika suma. Tu  
Żywotność dla poziomów 1-3 została powiększona o większą 
wartość wynikającą z profesji Wojownika a poziomy 4-5 już z Kupca

I tu pierwsza (grubsza) niedoróbka,
Na zakładce z odpornościami można dodać
bonus wnikający z poziomów ale tylko do.... odporności psychicznej

Plus jest taki że przynajmniej dobrze się liczy. 
Musze dodać jakichś... checkbox czy coś wskazujący,
w którą bazową pompujesz rzuty.


Zakładka Broni

Dodałem dwie nowe zakładki do generatora, w których będzie można dopełnić definicje postaci. Pierwsza z nich to zakładka broni.

Rzeczona zakładka

Wybór będzie standardowy - dobieramy grupę broni, dobieramy broń i losujemy biegłość. Na razie pracuję nad tym, aby w ogóle działała poprawnie, a postać prawidłowo się aktualizowała.

Wybór grup broni

Wybór broni noszonej przez postać

I efekt wyboru broni do postaci. Jak widać prace nad nim trwają.

Bez kłopotu można dobrać wiele broni.


W tej zakładce kryje się multum logiki i do tej pory pokryłem niewielką  jej część. Podstawowe problemy to oznaczenie, że broń jest preferowana w kontekście wybranej rasy i później zawodu (vide profesja Kowal i jego bonus do młotów) . Generator musi też wiedzieć jakie grupy broni wylosowano żeby per wybór np. różnych mieczy nie losował biegłości wielokrotnie, podobnie z poziomem biegłości, oburęcznością itp. itd. Znawcy zasad KC-tów wiedzą, że to ciężki kawałek charakterystyki postaci. Później trzeba do tego dodać cechy postaci, przeliczyć możliwe obrażenia (możliwe 6! rodzajów - ponieważ broń może być do walki wręcz i zasięgowa). W skrócie multum kodu. Na koniec trzeba to wyświetlić na podsumowaniu postaci w kc-towym szablonie.


Zakładka Zbroje

Tutaj na szczęście nie będzie jakichś cudów. Jest o wiele prostsza niż to co jest w zakładce broni. Wybór elementu i wrzucenie do cech w postać. Praca jest zaledwie rozgrzebana do poziomu wczytania listy pancerzy i tarcz na ekran.

Wybór pancerza

I sam efekt rozwinięcia listy. Jak łatwo zauważyć
 sama lista rozwijalna ma pewne niedoróbki.

I tyle można zrobić, wybrane elementy nigdzie nie są uwzględniane.


Podsumowując

Zostało jeszcze sporo od napisania. Z samego c# i godota zaczęły przychodzić mi z pomocą EventHandlery ponieważ zwykłe przenoszenie do głównego kontrolera informacji o zmianach na zakładce broni jest tak rozbudowane, że w przypadku próby zbudowania tego przez zwyczajne przenoszenie danych między klasami doprowadziłoby do powstania kilkudziesięciu metod mających tylko za zadanie przerzucania stanu.

Stąd też powstała klasa-singleton trzymająca definicje sygnałów (powoli skłaniam się do podzielenia jej per zakładka oraz per główne akcje na ekranie).

using Godot;
using OptionsMetadata;

partial class GeneratorSignal : Node
{
    [Signal]
    public delegate void AddLevelClickedEventHandler(int index);

    [Signal]
    public delegate void CharacterReadyEventHandler();

    [Signal]
    public delegate void ReloadCharacterEventHandler(CharacterSheet character);

    [Signal]
    public delegate void CharacterChangedEventHandler();

    [Signal]
    public delegate void WeaponGropupRemovedEventHandler(WeaponMetadata metadata);

    [Signal]
    public delegate void WeaponSkillIncreaseEventHandler(WeaponMetadata metadata);

    [Signal]
    public delegate void WeaponDoubleHandAddedEventHandler(WeaponMetadata metadata);

    [Signal]
    public delegate void WeaponSkilUpdatedEventHandler(WeaponMetadata metadata);

    private static readonly GeneratorSignal _Instance = new();

    private GeneratorSignal() { }

    public static GeneratorSignal Instance
    {
        get { return _Instance; }
    }
}

I zwykła obsługa emisji sygnałów przez Emit

    public void OnAddDoubleHandPressed()
    {
        GeneratorSignal.Instance.EmitSignal(
            GeneratorSignal.SignalName.WeaponDoubleHandAdded,
            weaponMetadata
        );
    }


i przechwytywania przez Connect i obsługa Callable

private void ConnectSignals()
    {
        GeneratorSignal.Instance.Connect(
            GeneratorSignal.SignalName.AddLevelClicked,
            new Callable(this, nameof(OnSomethingHappened))
        );

        GeneratorSignal.Instance.Connect(
            GeneratorSignal.SignalName.CharacterChanged,
            new Callable(this, nameof(CharacterChanged))
        );
    }

p.s.

Jak już tu dotarłeś.... Czyta ktoś czyta co tu piszę? Wrzuć komentarz będzie mi przyjemniej:)

Brak komentarzy:

Prześlij komentarz

Tu możesz wstawić swój komentarz