Pokazywanie postów oznaczonych etykietą rpg. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą rpg. Pokaż wszystkie posty

08 października 2025

Ja tu tylko programuję

Łatwo stwierdzić po datach, że od lutego niewiele się tu działo, a to z dość zaskakującego powodu. Gdzieś na początku kwietnia złapałem covida. Ten ostro mnie przeczołgał i przy okazji całkowicie wybił z rytmu oraz chęci pisania. Wystarczyło 2-3 tygodnie niezbyt dobrego samopoczucia (to tak oględnie mówiąc), aby przez kolejne miesiące nie wrócić do Sladuma i programowania w domowym zaciszu .

Dopiero niedawno naszła mnie chęć do wieczornych posiadówek z Godot i C#, a ich efektem jest rozszerzenie generatora postaci KC. I to właśnie o nim będzie ten wpis.

Aktualny stan mini projektu to możliwość wylosowania postaci z wybranych kilku ras, większości dostępnych profesji i dodania poziomu zaawansowania i kilku drobiazgów. 

Zrzut z niezbyt pięknego menu generatora


Lista obsługiwanych profesji 

Konfiguracja dla generatora została przygotowana na podstawie plików JSON. Te znów to efekt obróbki danych zawartych w moim starym generatorze napisanym w javaScript. Dostępny jest on-line na stronie Kryształów Czasu pod linkiem Tworzenie postaci do Kryształów Czasu na samym dole. 

A o samym kodzie 

Mamy teraz erę SI stąd mocno skorzystałem z tego narzędzia przy przekształceniu zawartości plików javascript do postaci json. Kilka iteracji promtów i otrzymałem eleganckie skrypty, które dane z javoscriptowchy obiektów generowały jsony. Te znów przerzuciłem do projektu w godot. Poniżej przykładowy plik definiujący cechy dla człowieka.

{
    "name": "Human",
    "genders": [
        {
            "gender": "male",
            "traits": [
                {
                    "name": "HP",
                    "base": 100
                },
                {
                    "name": "SF",
                    "base": 50
                },
                {
                    "name": "AG",
                    "base": 35
                },
                {
                    "name": "SP",
                    "base": 25
                },
                {
                    "name": "IQ",
                    "base": 60
                },
                {
                    "name": "WD",
                    "base": 70
                },
                {
                    "name": "SP",
                    "base": 0,
                    "special": true
                },
                {
                    "name": "CH",
                    "base": 40
                },
                {
                    "name": "PR",
                    "base": 20
                },
                {
                    "name": "FH",
                    "base": 10
                },
                {
                    "name": "DA",
                    "base": 0
                }
            ],
            "height": {
                "min": 150,
                "middleFrom": 171,
                "middleTo": 180,
                "max": 200
            },
            "weight": {
                "min": 50,
                "middleFrom": 71,
                "middleTo": 80,
                "max": 100
            }
        },
        {
            "gender": "female",
            "traits": [
                {

 Stąd już prosta (tia) droga do wygenerowania postaci zgodnie z założonymi w systemie zasadami. 

Tu zakładka z cechami podstawowymi

I zakładka odporności

Aktualnie pracuję nad uwzględnieniem poziomów postaci w zwiększaniu wysokości odporności per poziom postaci. Stąd pasek z kwadracikami na zamieszczonym powyżej zrzucie ekranowym z zakładki  `Resistances` . .

W konsoli można tymczasem podejrzeć kolejność wylosowanych cech oraz co - kiedy zostało wylosowane.


Co już jest zrobione:

  • wybór ras
  • wybór profesji
  • wybór poziomu 1-10
  • wybór charakteru
  • losowanie cech
  • uwzględnienie w nich wybranego poziomu
  • wyliczenie odporności
  • pochodzenie
  • dochód 
  • uwzględnienie pochodzenia w cechach postaci 

Czego brakuje?

  • losowania zalet
  • losowania wad
  • losowania zawodów zależnych od pochodzenia
  • postaci dwuprofesyjnej
  • dodawania poziomu do odporności
  • losowania biegłości
  • wybór broni
  • wybór zbroi
  • ładniejszego wyglądu
  • filtry na dostęp do profesji dla poszczególnych ras 

Dodatki, które chce zaimplementować

  • możliwości otworzenia na telefonie
  • możliwość zapisu postaci
  • możliwość odczytu postaci
  • dodawanie podnoszenia postaci po jednym poziomie

Czego się nauczyłem

Patrząc w kod to lepszej obsługi kolekcji w c# oraz dostępu do statycznych property. Szczególnie zadowolony jestem z (napisanego na nowo) kodu odpowiadającego za losowanie z użyciem wirtualnych kostek k10, k100 itp.

Wywołanie mocno się uprościło:

 var statRoll = Dices.d100.Roll;

Definicje klas poszczeg ólnych kostek są maksymalnie uproszczone (zmienia się oczywiście zakres od-do)

    public class D100 : Dice
    {
        private readonly Random rng = new Random();
        public int Roll => rng.Next(1, 101);
    }

A całość opakowuje klasa wystawiająca dostęp statycznie 

public class Dices
{
    public static readonly Dice add0 = new D0();
    public static readonly Dice d5 = new D5();
    public static readonly Dice d10 = new D10();
    public static readonly Dice d10Premium = new D10Premium();
    public static readonly Dice d50 = new D50();
    public static readonly Dice d100 = new D100();
    public static readonly Dice d76100 = new D76100();

Kod jest o niebo lepszy od mojego ostatniego podejścia do problemu implementacji kostek i rzucania nimi (ze 4 posty niżej pisałem o tym)

Na potrzeby zbierania wyników, których  sumy tworzą cechy widoczne na karcie postaci, utworzyłem specjalny obiekt rozszerzający typ Dictionary. Dało mi to eleganckie obejście problemu związanego z wiedza skąd biorą się wartości, z których powstają cechy. Obiekt na starcie buduje definicje cech jakie można losować w jego zakresie. Zachowuję przy tym kolejność dodawania składników pochodzących od profesji, rasy itp. co znacznie ułatwia obliczenia i szukanie ewentualnych błędów. Rozdzielenie odpowiedzialności wymusiło, że powstały dwa: jeden dla cech postaci a jeden dla odporności.

Mój stary kod w javascript radził sobie z tym elementem o wiele, wiele gorzej.

public class RessRollsCollection : Dictionary<StatDefinition.StatName, List<int>>
{
    public RessRollsCollection()
    {
        Init();
    }

    private void Init()
    {

        this.Add(StatDefinition.StatName.BM, new());
        this.Add(StatDefinition.StatName.ILLUSION, new());
        this.Add(StatDefinition.StatName.SUGESTION, new());
        this.Add(StatDefinition.StatName.CURSES, new());
        this.Add(StatDefinition.StatName.SHOCK, new());
        this.Add(StatDefinition.StatName.SPECIAL, new());
        this.Add(StatDefinition.StatName.BP, new());
        this.Add(StatDefinition.StatName.POISON, new());
        this.Add(StatDefinition.StatName.FUMES, new());
        this.Add(StatDefinition.StatName.TEMPERATURES, new());
        this.Add(StatDefinition.StatName.ELECTRITY, new());
        this.Add(StatDefinition.StatName.PETRIFICATION, new());
    }
public void AddStat(StatDefinition.StatName key, int value)
    {
        if (this.TryGetValue(key, out List<int> values))
        {
            values.Add(value);
        }
        else
        {
            Console.WriteLine($"Klucz: {key} nie istnieje.");
        }
    }
public int GetResistanceValue(StatDefinition.StatName searchedStat)
    {
        int computedStat = 0;
        if (this.TryGetValue(searchedStat, out List<int> values))
        {
            foreach (int number in values)
            {
                computedStat += number;
            }
        }
        return computedStat;
    }

Wyliczenie cech na poziomie karty postaci przekształciło się z prostackiego przypisania 

rolledHero.TEMPERATURES= 10 

do sumy zliczanej z pojedynczych elementów z wskazanych w obiekcie kolekcji.

   public int TEMPERATURES
    {
        get { return ResCollection.GetResistanceValue(StatDefinition.StatName.TEMPERATURES); }
    }

Nie zależy mi jakoś na wydajności rozwiązania a iterowania w koło Wojtek po kolekcjach cech i odporności niekoniecznie mi przeszkadza.

Na potrzeby odczytania jsonów powstał generyczny wczytywacz :)

        public static class JsonLoader
        {
            public static T LoadJson<T>(string filepath)
            {
                try
                {
                    string json = File.ReadAllText(filepath);
                    return JsonSerializer.Deserialize<T>(
                        json,
                        new JsonSerializerOptions { PropertyNameCaseInsensitive = true }
                    );
                }
                catch (FileNotFoundException)
                {
                    Console.WriteLine($"❌ Plik nie znaleziony: {filepath}");
                }
                catch (JsonException ex)
                {
                    Console.WriteLine($"❌ Błąd JSON w pliku {filepath}: {ex.Message}");
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"❌ Inny błąd: {ex.Message}");
                }

                return default;
            }
        }


Piszę i pisze o c# a co z godot?

Cóż.. mało go tutaj: D 

Zaledwie kilka scen zlepianych w całość. Same w sobie nie są niczym nadzwyczajnym, zwykły TabContainer i trochę marginesów z labelkami i listami wyboru... Jak zacznę dodawać do nich jakiś sensowny wygląd napiszę więcej, a teraz po prostu nie ma za bardzo o czym.


No dobra coś ciekawego było. Przez jakiś czas ekran dwa razy ładował mi konfigurację co powodowało dublowanie wyników w listach rozwijalnych. Linijka kodu poniżej (z 56 linii) pozwoliła mi ustalić skąd startowany jest ekran.



Okazało się, że pomimo usunięcia ze sceny przycisku, którym przez jakiś ręcznie ładowałem konfigurację to tenże button nadal był widoczny, ale tylko w tekstowej definicji sceny w pliku tscn, Nie był widoczny w drzewie i na ekranie w trybie edycji w godot. Miał też dalej podpiętą akcję ładowania zawartości mechanizmu losowania jsonów i do tego (tu już nie wiem jak... nie wnikałem) restartował ekran.

Tyle!





29 października 2024

Co u Sladuma ...

A dzieje się, dziękuję.


W celu ułatwienia sobie sprawdzenia czy to co dodaję działa stworzyłem scenę testową, na której umieszczam tworzone elementy. I na tę chwilę postać umie:
  • otwierać skrzynki
  • otwierać drzwi 
  • dla testu dodałem pułapkę podłogową z dwoma stanami (no w sumie mam tylko dwa rysunki animacji) i potrafi zadać obrażenia bohaterowi (ten nie umiera bo tego jeszcze nie obsługuję)
  • i chyba najfajniejsze - od nowa zrobiłem okno dialogowe bo poprzednie nie działało dobrze
  • dialog wczytywany jest z pliku json
  • tekst wyświetla się w okienku 
Na razie dialog w pełni nie działa, ale jest OK. Dodatkowo dzięki sztuczce podpatrzonej w ramach 
https://www.youtube.com/watch?v=WaotOuDNio8

okienko pojawia się ALE animacje w grze kręcą się dalej.

 

Zrzucik z opisami 






07 stycznia 2018

Wojownik Autostrady dead line

W jednym z komentarzy na moim blogu Borejko zasugerował, aby grę wypuścić na rocznicę urodzin Joe Devera, czyli 12 lutego. Taki typowy deadline wydania. I chyba tak też się stanie.

Ale zanim to nastąpi postaram się uruchomić beta-testy. Przygotowuję samą grę jak i ... uwaga, domenę w sieci, w której gra wyląduje! Domena nie będzie bezpośrednio nawiązywała do nazwy gry, ale będzie to moje małe miejsce w Internecie. Docelowo trafi tam także Sladum.

Walka z prostymi opisami efektów obrażeń.
Postaram się włączyć w stronę system zgłaszania błędów, ale jeśli mi się to nie uda to poproszę ew. klikających o wrzucanie błędów tu, na bloga. Tak czy inaczej następne tygodnie zapowiadają się na ciekawe.

A w samej grze, z dużych rzeczy, brakuje już tylko możliwości przełączenia się na wersję angielską. Dodałem wspominany we wcześniejszych wpisach opisowy tryb walki, w którym przy okazji obrażeń dodawane są proste, jednozdaniowe efekty ciosów. Gra dostaje lekko rpgowy szlif i gdyby mieć nielimitowaną ilość czasu (lub wsparcie) można by ten element dopieścić (np. uzależnić opisy obrażeń od typu używanej broni). Ale naprawdę nie mam już na to czasu. I siły i chęci. Tak czy inaczej działa i urozmaica walkę.

Ten element jak i wykonane ostatnio poprawki skłoniły mnie do pewnego przemyślenia. Dlaczego napisanie, wydawałoby się, prostej gry zajęło tyle czasu i powstało tak dużo kodu? Przecież to zwykła gra tekstowa z jednym bohaterem. Nawet nie ma sensownej grafiki. Skąd ten narzut czasowy?
Na spokojnie oceniając prace nad grą doszedłem do następujących wniosków:
  • pierwszy raz zrobiłem grę od 0 do (właściwie) końca, i to końcówka, która już zajęła ponad miesiąc czasu, zburzyła kilka wcześnie zaimplementowanych mechanizmów,  w efekcie trzeba było je przepisać lub poprawić
  • źle oceniłem poziom komplikacji części elementów np.  wykonanie mapy zajęło mi tak ze 3x więcej czasu niż przewidywałem  (i spokojnie jeszcze można nad nią posiedzieć), podobnie obsługa kostki czy menu postaci
  • obsługa zasad gry, nawet tak prostych jak w paragrafówce, może być niesamowicie skomplikowana (szczególnie jeśli ich twórca sam się do nich nie stosuje)
  •  przerobienie tak dużej ilości paragrafów do formy czytelnej dla silnika gry (350 sztuk!) to po prostu masakra i nie sądzę abym jeszcze raz miał na to ochotę
  • nocne pisanie skutkuje duplikowaniem kodu i przedłużeniem pracy nad, wydawałoby się, prostymi rzeczami
  • przydałaby się pomoc innej osoby w pisaniu gry, zawsze to ktoś z odmiennym podejściem do rzeczywistości i nowe pomysły. Część stworzonych rzeczy (np. zapis na local Storage) pojawiło się dzięki podszeptom osób, którym powiedziałem o projekcie lub pokazywałem działające elementy.

Oczywiście jest też jeden wielki plus, którym jest wyrobienie nawyku programowania w domu. Wieczorami nie marnowałem czasu na głupoty, a na naukę i pisanie gry. Pomoże to przy kolejnych projektach.

Jak tylko zakończę ten jeden :)

24 grudnia 2017

Angularowy Wojownik beta testy ?

Pojawił się propozycja od osób, które widziały grę w aktualnej wersji, aby wystawić ją  do testów.  Takie typowe beta-testy przed ostatecznym wdrożeniem i zanim program zdobędzie wszystkie założone możliwości.

Po rozważeniu pomysłu powoli skłaniam się ku tej propozycji.  Jedyna trudność to postawienie gry w miejscu, do którego miałbym łatwy dostęp czyli serwer z ftp i zarejestrowana domena. A takowego miejsca w tej chwili nie mam :D  (co, patrząc na to co robię na co dzień, jest dziwne :) ) .

W najbliższych dniach zamierzam więc wykupić domenę oraz jakąś lokalizację w sieci, w której będę mógł zająć trochę miejsca. Przy okazji wystawię jakiegoś redmina czy inną jire / bugzille (heheheh)  na potrzeby samego procesu zgłaszania błędów przez zainteresowanych użyszkodników :).

A paragrafówka spytacie...
Poprawiam różne drobne błędy. To tu to tam czasem coś się przewróci. Dorobiłem kilka prostych ekranów powitalno - wprowadzających, wyciąłem sporo zbędnego kodu (mój kod nie przeszedł mojego code-review :D) i jeszcze drugie tyle muszę wyciąć, zmieniłem trochę wygląd menu postaci (teraz prawie mi się podoba) i dodałem rysunki.
Przez chwilę korciło mnie, aby całe menu postaci zrobić na html-owych canvas, ale na szczęście powstrzymałem swoje absurdalne zapędy. Patrząc na moją prędkość nocnego pisania kodu wydłużyłoby to proces powstawania gry o kolejny miesiąc :D

Pisanie kodu w nocy idzie mi dużo, dużo wolniej niż w dzień. Nie przeskoczę jednak tego problemu pracując na pełny etat. Koniec marudzenia, niedokończone rozwiązania wołają!

I randomowy zrzut :), przecież notka bez tego to jak brak notki.
Menu postaci wygląda już trochę inaczej ale co tam:)



26 listopada 2017

Angularowy Wojownik Autostrady cd...

Sporo kodu upłynęło od ostatniego wpisu. A co się w tym czasie wydarzyło?

Najważniejsza rzecz - silnik umożliwia przejście od pierwszego do ostatniego paragrafu  z uwzględnieniem zaimplementowanych reguł gry. Dostępne jest klikalne menu bohatera. Można zmienić kilka z ustawień gry, zapisać i wczytać postać. 
Pojawiło się trochę ikonek i różnych powiadomień zgodnych z treścią paragrafów czy związanych ze stanem postaci. W tej chwili zajmuję się dodatkami oraz dopieszczeniem istniejących mechanizmów. Jeszcze trochę i będę mógł zaprezentować wam efekt prac.

Poniżej kilka zrzutów ekranowych, ale nie przyzwyczajajcie się do nich zbytnio. Wygląd jeszcze ulegnie zmianie.

Ekran startowy. Link Graf przenosi do grafu paragrafów, a Edytor do edytora paragrafów.

A tu ekran startowy gdy mamy zapisaną postać

Efekt tworzenia nowego bohatera.

A tu widać menu ustawień podczas zapisu postaci.

14 listopada 2017

Angularowy Wojownik Autostrady cd

Oj sporo czasu minęło od ostatniego wpisu. Spieszę powiedzieć że nie był to czas stracony. Angularowy Wojownik Autostrady powstaje i to bardzo intensywnie. Udało mi się wyrobić nawyk programowania na komputerze dzięki czemu nawet 15 minutowe posiadówki za klawiaturą pozwalają napisać kilka linii kodu.

A sam projekt?

Cóż :-) przerobiłem niemal wszystkie paragrafy na wersję interaktywną. Z 350 paragrafów jeszcze 7 nie zachowuje się jak trzeba.
Powstał nowy, błyszczący silnik zarządzający grą. Jego poziom komplikacji jest nieporównywalnie większy od tego co zrobiłem dla Sladuma (wybacz stary :) ) i jednocześnie otrzymał sporo nowych możliwości.
Wykorzystuje sporo z tego co daje angular - w efekcie, aby wszystko działało tak jak potrzebuję musiałem podnieść używaną wersję z 1.3 do 1.5. Wreszcie pojawiły się dialogi, korzystam z angularowych eventów, local storage i canvasów. Ogólnie zastosowane rozwiązania zasługują na osobny wpis (a może nawet kilka). Postaram się je w miarę możliwości zrobić.

A jak to teraz wygląda?
Tak wyglądało z miesiąc temu:


A tak wygląda teraz:


17 sierpnia 2017

Paragrafówka przygoda w Angularze cz3

Powoli pracę nad angularowa paragrafówką dobiegają końca. Od ostatniego wpisu poprawiłem wiele niedoróbek, dodałem obsługę warunkowego wyłączania wyjść/wejść do paragrafów dzięki czemu np. nie da się dwa razy przeszukać pomieszczenia czy dwukrotnie wejść w tryb walki z raz pokonanym przeciwnikiem.
Po drodze powstała obsługa pułapek i kilka mechanicznych elementów gry. Niewiele zostało do dopisania (min.: wliczanie bonusów z przedmiotów w walce czy leczenie się).
Nadal nie ma modalnego okienka ekwipunku postaci! Nie udało mi się pokonać problemów z wyświetleniem głupiego modalnego diva ze wsparciem Angulara. W sieci znalazłem co najmniej kilkanaście przykładów opisujących jak to zrobić, ale żaden te z tych, które użyłem nie zadziałał. W końcu i to zaziała ale sądziłem że jest to rozwiązanie przysłowiowo dostępne prosto z pudełka.
Fajnie działa opcja sprawdzenia czy dane wyjście z paragrafu jest dostępne lub niedostępne. Efekt jest lepszy niż sobie obiecywałem po tym rozwiązaniu. Pokaże to na przykładzie działających paragrafów.
W ramach oryginalnego paragrafu 27 definicja była następująca:
Widać, że ilość obsługiwanych opcji jest duża i ew. gracz może po prostu ominąć te, które są dla niego niewygodne.
Dzięki wprowadzeniu kilku mechanizmów obsługiwanych z poziomy angulara pierwsze podejście do paragrafu wygląda następująco:
Co się stało? Otóż pojawiły się następujące rzeczy:
  • Sprawdzane jest czy postać posiada w ekwipunku klucz do drzwi
  • Jeśli go nie posiada, blokowane są wyjścia odpowiadające za obsługę klucza
A teraz chwilę pozwiedzaliśmy dostępne paragrafy (i nie wyważyliśmy drzwi) i mamy w ręce klucz pasujący do drzwi. Dostępne wyjścia prezentują się następująco:
jednocześnie dzieje się coś dodatkowego. Bez klucza (lub wyważenia drzwi) nie można było wejść do świątyni, ale i przejście ze środka świątyni na dziedziniec było zablokowane! (paragraf 11)
jednak w momencie gdy trafimy do paragrafu 11 z kluczem zdobytym na dziedzińcu (lub też wyważyliśmy drzwi) zmienia się ilość dostępnych możliwości:
Efekt jest przyjemny i intuicyjny. Chciałbym już oddać to co napisałem, ale jeszcze muszę się powstrzymać. Nie wszystko działa tak jak trzeba.

10 lipca 2017

Paragrafowa przygoda w Angularze cz1

Wspominałem w poprzednim wpisie o pewnej niespodziance przygotowywanej wraz z przygotowaną paragrafową grą Przygoda barbarzyńcy Sladuma. Tydzień temu nie wiedziałem jednak czy będę miał czas i chęci (jakże są ważne), aby zrobić to co miałem na myśli.


Zaczęło się niewinnie. Nie dalej jak dwa tygodnie temu stwierdziłem, że nauczę się AngularJS - webowego frameworka do JavyScript. Umożliwia on - podobnie jak jQuery - na zaawansowaną pracę na poziomie przeglądarki z wyświetlanym kodem HTML. Trochę takie jQuery na sterydach. Jak pewnie podejrzewacie, nauka czegokolwiek związanego z programowanie wiąże się z pisaniem miej lub bardziej skomplikowanych programów pokazujących podstawy języka czy frameworku. I w tym wypadku zacząłem tak samo, ale po przerobieniu tego i owego z książki (zawierającej błędy w napisanym kodzie!)  doszedłem do wniosku, że ten sposób nauki jest, ogólnie rzecz ujmując, mało wydajny i do dupy. Robienie pseudostron z opisanych w książce przykładów czy wyświetlanie przysłowiowego "Hello world" nie jest zbyt rozwijające i bynajmniej nie pozwala na nauczenie się czegokolwiek w sensownym czasie. Trzeba podejść do tematu tak, aby nie znudził po kilku godzinach nauki.

Z tego też powodu wpadłem na pomysł, aby przy nauce Angulara zrobić całkowicie interaktywną grę paragrafową. Połączę dzięki temu przyjemne (robienie gier) z  pożytecznym (nauka frameworku). Częściowo jest to też efekt malkontenckich uwag mojego kolegi, którego mierził obowiązek wyjmowania kości do gry w grę uruchomioną na przeglądarce oraz że jest tak mało interaktywna. 

 W efekcie mam na tapecie paragrafówkę Przygoda Sladuma przerabianą na, ni mniej, ni więcej, grę tekstową, w której interakcja, poza klikaniem na paragrafy i okazyjnie na aktywne przyciski, nie wymaga od grającego więcej wysiłku. Testy i walka rozwiązywane są przez wbudowany silnik gry paragrafowej napisany w javaScript na frameworku Angular.

W tej chwili postęp prac w stworzeniu w pełni interaktywnej paragrafówki oceniam na jakieś 50%. Zbudowałem mechanizm przekierowań między paragrafami (oparty $location), szablonów ekranów (angularowe szablony), prowadzenia walki, testów pojedynczej cechy, losowania kostek (angularowe serwisy), wyświetlanie paragrafów i wstępna obsługa błędów (angularowe kontrolery). Brakuje dobrej obsługi błędów przekierowań i kilku aspektów mechaniki gry paragrafowej. Muszę też popracować nad  wyglądem np. listy wyników rzutów przy walce czy wygląd ekraniku ekwipunku. 

Efekty są zachęcający. Wszystkie działania gracza oraz podjęte akcje trzyma w pamięci przeglądarka, nie trzeba przechodzić między stronami, aby otworzyć kolejny paragraf. Wbudowałem proste zabezpieczenie przed oszukiwaniem poprzez cofanie stron :p. Prace trwają.


Poniżej kilka zrzutów:

Walka:

Przykład walki z dwoma przeciwnikami
Ciąg dalszy walki, dla postaci Sladuma, w zależności od potrzeb, aktywują się umiejętności przydatne w walce. Oczywiście
paski Żywotności zmieniają się dynamicznie.



Wygląd paragrafu przed testem wymagającym jednego rzutu.

Test nieudany + przekierowanie


Test udany + przekierowanie


p.s.
Jeśli zajrzy tu ktoś zainteresowany ja działa Angular użyty do stworzenia gry oczywiście mogę o tym napisać.

04 lipca 2017

Gra paragrafowa z KC w tle

Zapewne wiecie czym są gry paragrafowe. Jeśli nie to odsyłał do Wikipedii. A dlaczego o tym piszę? Powód jest prosty.
Właśnie jedną napisałem.
Tak - nie kłamie :). Pomysł pojawił sie przypadkiem podczas pisania postów na forum kc-towym.  
Dzięki zaangażowaniu i silnej woli udało się skończyć projekt!.

Gra została zamknięta w 80 paragrafach.
Spytacie - a gdzie można w nią zagrać?

A TUTAJ: Przygoda barbarzyńcy Sladuma

p.s. W związku z tym projektem przygotowuje jeszcze jedną niespodziankę. Jest jeszcze w fazie tworzenia i opracowywania koncepcji, ale efekty są obiecujące!

12 grudnia 2016

Rogalik - grafika cd

W weekend poprawiłem trochę kod, znalazłem kilka miejsc, w których nadmiernie zapychałem pamięć grafiką i pewnie jeszcze wiele takich miejsc zostało.
Ale.
W tej chwili połączyłem generator mapy (ten z kwadracików widoczny kilka postów temu) z główną pętlą graficzną rysującą mapę. Pokoje planszy generowane są w momencie wejścia z wszystkim elementami składowymi jak pułapki/potwory/skarby - tylko nie ma to jeszcze przełożenia na wygląd pomieszczeń. Może do końca tygodnia się to zmieni, problemem jest przygotowanie odpowiedniej ilości plików opisujących cięte na potrzeby gry obrazków.

Szybkość odświeżania grafiki to 60 klatek / sekunda - i to ze względu na to iż przewijanie mapy przy mniejszej ilości klatek generowało uciążliwy lag.
Sama mapa nie jest jeszcze generowana tylko w widocznym dla gracza obszarze, ale już przygotowuję kod, który jest gotowy na takie zadanie. Właściwi w tym co widać poniżej brakuje tylko wyświetlenia pozycji drużyny tak, aby było wiadomo w którym klocku jesteśmy i mogę dalej wrócić do rzeźbienia mechaniki gry oraz poprawienia błędów w animowaniu poklatkowym (niestey kilka dziwnych błędów się wdarło)







W międzyczasie znalazłem coś takiego:

Jest to jakieś przykładowe (chyba- nie mam pewności|) gui "plecaka postaci" jakiegoś rogalika. W ten deseń chciałbym zrobić to w swojej gierce.
Trzeba przyznać że to co ludzie linkują do Pinteresta jest inspirujące:)


Aktualizacja
Poziom wygenerowany z animującymi się potworami.





ps.
Spojrzałem ile pamięci zjada moja "gierka" - w skrócie tak z 10x za dużo w stosunku do tego co oferuje ...


22 listopada 2016

Rogalik cd. :)


Projekt toczy się powoli do przodu.
Program (bo daleko mu jeszcze do jakiejkolwiek gry) rozrasta się i zyskuje kolejne moduły. Proces jest czasochłonny, ale z mojego punktu widzenia dosyć ciekawy. Pokazuje inne podejście do programowania i wymaga zmiany niektórych przyzwyczajeń.
Ekran gry. W pasku widać wylosowane potwory.
Sama gra - z punktu widzenia osoby patrzącej z zewnątrz - zmienia się niewiele. Od ponad tygodnia nadal mam tylko główne okno gry, które generuje labirynt. Z tą różnicą ze klocki są większe niż ostatnio - w oczekiwanej przeze mnie wielkości 112x112 px. Wynika to z tego, że krawędź pola pokoju będzie składała się z 6 grafik ścian i jednej grafiki drzwi. Tak ja widać poniżej - pole typu pokój. Wersja ASCI:


            ╔══─══╗
            ║               ║
            ║               ║
            │               │
            ║               ║
            ║               ║
            ╚══─══╝

Korytarze będą oczywiście węższe i opakowane grafiką. :).
Napisałem też pierwsze elementy, które wiążą rozsypany kod gry ze sobą. W efekcie rośnie poziom komplikacji i pojawiają się trudne w stworzeniu moduły - np. zarządzanie fazami gry czy główna pętla graficzna. Ale do rzeczy.

 W tej chwili jest (i działa - dodałem testy w JUnit :) ) :
- losowania zdefiniowanych przez grę bohaterów
- wstępny projekt gui dla statystyk i ekwipunku bohaterów (wzorowany na tym z Diablo / Torchligt ale bez grafiki)
Ekran bohatera
- moduł określający fazę gry (to chyba będzie, poza walką i rozpatrywaniem czarów, jeden z najbardziej skomplikowanych elementów gry)
- wyświetlanie okien wykrywania pułapek, przekupstwa, napotkania potworów, ekwipunku i statystyk postaci
- pełny mechanizm generujący labirynt (na tę chwilę 1 poziomowy)
- wylosowane w ramach labiryntu pomieszczenia otrzymują w pełni funkcjonalne wyposażenie w postaci pułapek/potworów/skarbów
- mechanizm generowania potworów i ich cech
- mechanizm generowania skarbów i cech skarbów
- wstępne mechanizmy dotyczące bufora grafiki i cięcia grafiki na klocki (będą w wielkości 16x16 pixeli)
- wstępny mechanizm silnika graficznego do animacji

Posiedziałem przy generatorze mapy (właściwie to główne okienko gry), tak aby był przyjazny użytkownikowi - np. poprzez centrowanie obszaru na klocku, w którym znajduje się drużyna czy też umożliwienie przeglądania obszaru z pomocą myszy. Jednak po zmarnowanych na to kilku godzinkach doszedłem do wniosku, że za wcześnie na ten element i powinna nim zarządzać pętla generująca grafikę, a nie z poziomu javaFX.
Zrezygnowałem też z włączenia wcześniej wykonanego generatora podziemi do gry bo efekt końcowy nie był tak fajny jak zastosowanie znalezionej grafiki.

Ale jeszcze go wykorzystam!

W tej chwili (nie liczę grafiki) gra "zbudowana" jest z ok. 68 klas, a pewnie dojdzie drugie tyle. Tak właśnie wygląd ta prostota :].

Ehh siadając przy tym nie sądziłem, że tyle tego wyjdzie, a nie oszukując się - to dopiero początek.



14 listopada 2016

A może roguelike?

Idę za ciosem.

Zachęcony efektem działania generatora podziemi stwierdziłem, że użyję go w większym projekcie. Generator ma stać się częścią prostej (tak wydawało się na początku) gry roguelike.
Żeby nie wymyślać koła i zasad gry od zera wykopałem starą planszówkę znaną na zachodzie jako Citadel of Blood, a w Polsce skopiowaną (zpiraconą przez Encore) i znaną pod nazwą Labirynt Śmierci. Generator będzie odpowiedzialny za tworzenie wyglądu poszczególnych klocków z których będą się składać podziemia, tak aby nie korzystać z niezbyt pięknych kafelków z których składała się oryginalna plansza.
W tej chwili wersja 0,0001 beta tworzy planszę z możliwymi połączeniami oraz ustala typ pomieszczenia, do którego trafia drużyna. W tle dzieje się trochę magii programistycznej
i  staram się robić te elementy gry, które nie sprawiają mi kłopotów programistycznych. W tej chwili dostępne są pierwsze wersje maszyny losującej potwory i skarby oraz mechanizm zarządzający turami gry.

Poniżej widać przykładowy działania generatora.


Kwadracik zielony to aktualna pozycja „drużyny” zwiedzającej podziemi. Podziemia tworzone są na bieżąco przy przechodzeniu między klockami (niebieskie kwadratowe pola) i na bieżąco określana jest liczba dostępnych wyjść/wejść z pomieszczeń. Czarne ramki to oczywście nieprzekraczalne „ściany”.

A tu widać w pełni wygenerowany poziom podziemi.




W tej chwili kwadraciki mają 64x64 px wielkości a sama plansza to 8x8 kwadratów (docelowo nie będzie tak skalowana).

Dla każdego z kafelków – w oparciu o ilość wejść – chcę wygenerować z pomocą już napisanego generatora wygląd. I tak do obszaru o 3 wejściach kafelek będzie wyglądał tak:





A tak dwa połączone klocki – jeden z 3 wejściami i drugi z jednym.








Taki przynajmniej jest plan. Na razie jestem jeszcze parę kroków przed połączeniem generatorów ze sobą.


Rzeczy wymagające dużo pracy idą w tej chwili na później – min. obsługa walki, grafika, ekrany i sensowne gui. Co do grafiki - będzie pixelartowa (oczywiście). Znalazłem w międzyczasie komplet grafik, które w 100% pokrywają moje zapotrzebowanie na elementy składające się na gry. Chcę wykorzystać DawnLike - 16x16 Universal Rogue-like tileset v1.81



Wygląda tak:


Będę mógł przećwiczyć obsługę grafiki i tworzenie animacji.

Mądrzy ludzie mówią, że najtrudniej napisać swoją pierwszą grę. Cóż – zobaczymy czy uda mi się ją zrobić i doprowadzić do grywalnej wersji. W miarę postępów (widocznych) będę dodawał kolejne wpisy.

Jeśli kogoś interesuje kod i co wykorzystuję - to także mogę go wrzucać. Piszę oczywiście w javie ze wsparciem javyfx  i kilku zewnętrznych bibliotek użytkowych.

14 sierpnia 2014

Jak ojciec wylewa dziecko z kąpielą


Coś paladynowi musiało pomóc, gdyż nawet jego Święty Miecz Ewidentnego Dobra nie miał takiej mocy, by zabić tak wielkiego i potężnego demona. I to mniej niż dwudziestoma ciosami.

Pewnie wiecie, że Artur Szyndler wystartował z akcją na polakpotrafi mającą na celu uzbieranie pieniędzy na powieść osadzoną w świecie Kryształów Czasu. Miała się ona stać bazą do zremasterowanej wersji samego rpg-a. Obudził nadzieje, tak jak i niemałe emocje.
Dodatkowo kwota, o którą się stara, jest dla większości niebagatelna - przecież 55 tys. piechotą nie chodzi. Jednak właściwie nic nie było wiadomo o samej powieści, jaka jest, jak jest napisana. Podobno tajemniczy testerzy ocenili ją bardzo, ale to bardzo wysoko. Dodatkowo użycie w zapowiedzi zwrotu polski Tolkien rozpaliło  zainteresowanych. Tak jak i zatrudnienie Jarosława Musiała, dużego zespołu muzyków, rysowników...

Opadając na ziemię, przeciął na pół małą sadzonkę drzewka. Drzewka, z którego miało wyrosnąć najświętsze dla druidów Pradrzewo. Drzewka, które jako Drzewo Równowagi przez następne tysiące lat miało chronić Archipelag Centralny.

Udało się jednak przekonać autora, aby zaprezentował kawałek z tego dzieła szerokiej opinii publicznej. Także w celu zachęcenia do kupna tych nie do końca przekonanych.

Sam cudów się nie spodziewałem. I sięgnąłem po tekst..

Wokół szalała burza. Serie błyskawic w jednej chwili ukazywały się na tle niższych szczytów otaczających miasteczko. Dalekie, niebotycznie wyniosłe góry pojawiały się, gdy niebo rozświetlały najpotężniejsze z błyskawic. Płonące gdzieniegdzie na niskich zboczach drzewa lub fragmenty lasu znamionowały coś nienaturalnego. Wewnątrz kotliny nie spadła jeszcze żadna kropla.

Przeczytawszy  pierwszy rozdział sądziłem, że to jakiś żart. Ot, nie poprawiona wersja. Brnąc w tekst przegryzłem się przez kolejne udostępnione próbki. Było gorzej, coraz gorzej. Miałem wrażenie, że nikt nie zajrzał poza pierwsze dwie strony tekstu, które jeszcze, jako - tako , trzymały się kupy. W sumie było tego kilkanaście stron, które czytałem niemal godzinę.

Sędziwa ręka Asteriusza powoli powędrowała w kierunku zwłok władcy nieistniejącego już zamku. Z rozpostartej dłoni na odległości pół metra rozeszła się poświata w kształcie niebiańskiej białej gwiazdy. Powiększając się, otoczyła ona skręcone ciało. Następnie z głośnym melodyjnym plaśnięciem wchłonęła się w nie, z lekkim chrzęstem prostując członki i kark. W miejscu, gdzie zamiast twarzy znajdowała się ciemna pustka, zeszła ciemność i pojawiły się oznaki życia.

Koniec końców był to najdłużej czytany fragment tekstu od momentu, gdy nauczyłem się czytać. Tak złego kawałka prozy spodziewałbym się po człowieku, który dopiero co opuścił szkołę podstawową, a nie od osoby która twierdzi, że te jego wypociny, ktoś podobno korygował. Strach pomyśleć jak wyglądały bez niej. Próbka przypomina wczesną wersję alfa, której nikt, nawet sam autor, nie przeczytał w całości. Nawet ciężko mi tu znęcać się nad samym tekstem. Nazwanie tego kompromitacją to mało... Trudno mi powiedzieć kto podkusił autora do wydania w formie w jakiej teraz się znajduje

- Przybyliśmy tu w sprawie, z powodu której Ochria może być starta z tego świata i wyczyszczona z wszelkich form egzystencji. Z powodu której nieskończona liczba bogów zastanawia się nad czymś, co nigdy by im nie przyszło do głowy. Nad niechybną, nieodwołalną i nieodległą w czasie zagładą. Zagładą, z którą wiąże się unicestwienie ich planów, światów, form egzystencji wraz z nieskończoną ilością istnień i ich dusz. Taki mały niebiański horror

Zresztą zajrzyjcie do niego sami. Tekst dostępny jest tutaj.

Przez chwilę wyglądało na to, że każda para jeździec-wierzchowiec rozpada się na cztery części. Jednak tylko połówki rycerzy, tryskając fontannami karmazynowej krwi z metalicznym trzaskiem spadły na wybrukowany dziedziniec.

Można spokojnie pogratulować Arturowi Szyndlerowi - na dobre stłukł Kryształy Czasu i pogrzebał szanse jakiejkolwiek reedycji systemu rpg.

W tym momencie skóra na brzuchu pękła i pojawiła się szponiasta zielonkawa rączka. Za moment wynicowała się druga. Chwilę później naprężyły się one i przez otwór wychyliła się główka orczątka. Jej bezwłosa powierzchnia pokryta była krzepnącą posoką w kolorze zieleni zmieszanej z rdzą.

p.s.
 Tak - wrzutki kursywą pochodzą z powieści...


20 marca 2014

Rozszczepiacz

Jedna z wielu broni obcych (prawdopodobnie pochodzi od obcych identyfikowanych jako Jelek, gdyż to oni są z nią najczęściej spotykani). Jest to długa i nieporęczna tuba z dwoma uchwytami umieszczonymi bliżej jednego z końców. W jednym z uchwytów (nie zawsze tym samym) umieszczony jest spust.

19 marca 2014

Raksasa

rys. Martin Kepler
Poniższy wpis jest tekstem dla świata Kontakt, rozwinięciem pomysłu z komentarzy do wpisu Światotworzenie.

Mieszkańcy planety XXX (tak - nadal nie ma nazwy :D) , zwani wali,od setek lat zajmowali się polowaniem na niezwykłe zwierzęta zamieszkujących planetę. Ogromne, trawożerne, gadopodobne bestie przez wiele lat nie miały naturalnych wrogów w sowim środowisku. Chroniły ich gigantyczne rozmiary oraz niezwykle gruba skóra. Największe osobniki wagą dochodziły do kilkuset ton. Dopiero gwałtowny rozwój populacji mieszkańców planety spowodował, że pojawiło się nowe zagrożenie ich życia.

12 grudnia 2013

Adres do Generatora Postaci KC

Najnowsza odsłona generator jest już dostępna on-line.

Jak macie ochotę stworzyć postać do Kryształów Czasu, lub po prostu zobaczyć jak działa, to zapraszam pod link: http://www.krysztalyczasu.pl/download/generator2/index.htm


W przypadku znalezienia błędów - skrobnijcie mi o tym w komentarzach.
p.s. Generator w wersji pierwszej także jest dostępny. Link znajduje się po prawej, obok menu.

25 listopada 2013

Generator v2.0

Zapewne nie będzie zaskoczeniem informacją, że nadal pracuje nad ulepszeniem generatora postaci. W tej chwili pojawiły się dodatkowe opcje związane ze szczegółowymi elementami tworzenia bohatera. Są to wykluczenia profesji w zależności od rasy i wybranej pierwszej profesji (nie będzie już możliwe stworzenie paladyna/zabójcy), ograniczenie doboru ekwipunku  i zbroi do pieniędzy wylosowanych podczas tworzenia, krótki rys historyczny postaci, ograniczenia w doborze charakterów.
Jako, że jest to mój plac zabaw, zmieniłem trochę tabelę broni – część grup broni została złączona i nie ma już trzech typów toporów czy dwóch typów kusz. Zgodne jest to z propozycjami wysuniętymi na moim blogu i na forum kc-tów. Awansem dodałem profesję kowala run. Też dostępną na blogu.
Nadal nie ma doboru czarów i wyświetlania umiejętności. Z czasem i te elementy pojawią się. Mam już gotową listę czarów maga.

A kiedy będzie dostępna?
When it’s done!

08 listopada 2013

19 dni z Kryształami Czasu

Nie miałem ostatnio za wiele czasu na pisanie. Prawdę powiedziawszy dzisiaj też nie mam, ale słowo się rzekło. Obiecałem wziąć udział w miesiącu dla KC, wiec należy dopełnić zobowiązania. Wpis obejmie wszystkie dni, w których nie brałem udziału.

10 października 2013

Najdziwniejsza sytuacja jaka przytrafiła mi się podczas sesji.

Wydarzenie może nie najdziwniejsze, ale niesamowicie zaskakujące: gracz zlikwidował głównego
złego prowadzonej przygody pierwszym zadanym ciosem: krytyk tnący, obrażenia x10 - obcięcie głowy, dobrze ponad 3000 tys obrażeń....

08 października 2013

Moja ulubiona postać, którą grałem/łam w KC

Nie mam takowej, ponieważ 99% moich sesji to prowadzenie KC.
I, prawdę powiedziawszy, to chyba miałem jedną postać, którą grałem przez dwie przygody (a może tylko przez jedną...)
Jak się nazywa? Nie pamiętam. Kim był? Chyba jakimś wojownikiem, bo akurat brakowało w drużynie. Z jego istnienia pamiętam jedynie akcję, w której walczyłem mieczem do rak dwóch (walka z konia z czymś latającym) oraz eksploracje podziemi.