← Devlog
v0.3.1-pre-alpha

Ultraviolet v0.3.1-pre-alpha: wrogowie walczą jako grupa

Krótki cykl, jedna zmiana: wrogowie wiedzą już o sobie nawzajem.

v0.2.9 zrobiło misje proceduralne — świeży graf pokoi za każdym wyjściem z huba. Ten build tego nie dotyka. Chodzi o to, co dzieje się w pokoju z trzema albo czterema wrogami. Do tej pory każdy był prywatnym automatem na własnym cyklu ataku: czworo obok ciebie to cztery niezależne timery swingów co 1,1 s, kiedy wypadało, a walka grupowa to zasyp, nie coś, co da się czytać. v0.3.1 stawia w środku sędziego.

(Jest też v0.3.0 między nimi, osobno otagowany — czysty refactor, zero zmiany gameplayu. Więcej niżej.)


Sędzia ataków (EnemyDirector)

Reguła w jednej linii: wróg potrzebuje tokenu, żeby zamachnąć się albo dojść. Są dwa tokeny (max_attackers, domyślnie 2). Reszta trzyma pierścień na dystansie wyczekiwania i czeka.

Token się rotuje. Wróg bierze go w drodze do ciebie, wymachuje, puszcza w momencie końca swinga — podłoga krąży, zamiast należeć do tych samych dwóch przez całą walkę. Posiadacz, który nie może do ciebie dojść (krawędź, ściana, sojusznik na drodze), traci token po 3-sekundowej dzierżawie, żeby nie zablokować kolejki, a wróg, który właśnie ustąpił, nie może go chwycić przez 0,8 s.

Tłum czyta się więc jak okrąg do obchodzenia, nie sterta: dwóch naciska, trzeci i czwarty krążą po swoją kolej. Czy dwoje naraz jest trafione, czy powinno być jedno — pojedynki z publicznością — to główna rzecz, o którą proszę o feedback. To gałka, nie decyzja, którą chcę wziąć z kodu.

To też element, którego potrzebuje prawdziwy boss. Legion (Koncept §8) w ogóle nie atakuje — tylko przywołuje — więc cała walka to tłum. Bez sędziego to spawner zalewający ekran. To v0.3.2.


Uczciwe telegraphy

Blokujący wróg czytał wewnętrzną flagę gracza „czy atakuję” — która przełączała się, zanim cokolwiek widać było na ekranie. Nie dało się wyprzedzić czegoś, co też nie patrzyło na ekran.

Teraz reaguje na to, co widać: rozpoczęty wind-up albo combo już w toku od drugiego hitu. Czyli pierwszy hit zawsze wpada — blok to reakcja na fakt, że już wymachujesz, nie przewidywanie. Jest okno reakcji (~0,2 s) zamiast natychmiastowej gardy, i gałki per typ na opóźnienie reakcji i szansę bloku, więc typ da się czytelny bez ślepoty.


Martwa strefa we własnym ataku

Raport — „normalny atak czuje się nieresponsywnie” — okazał się prawdziwy i konkretny. Trzymanie przycisku ataku między oknem tapu a pełnym charge — ok. dziesiąta do pół sekundy, bardzo łatwo trafić przypadkiem — szło w „cancel” i dawało zero ataku. To samo przy puszczeniu gotowego charge bez staminy. Wciśnięcie ataku i cisza to najgorsze, co przycisk ataku może zrobić.

Nowa reguła: każde puszczenie coś robi. Pełny charge ze staminą daje uderzenie ładowane; reszta daje normalne. Okno tapu poszło z 0,12 s na 0,18 s. (To już czysta logika gameplayu — zwykła funkcja, którą test przechodzi przez cały zakres czasu trzymania co 0,02 s.)


Spacing, kiting, krawędzie

  • Kolejka trzyma dystans. Wrogowie bez tokenu trzymają pierścień z wąskim pasem, więc podchodzą i cofają zamiast jitterować na progu. Dodano spacing tłumu: wszyscy szli do tego samego punktu z tej samej strony i stali ramię w ramię — jedna plama z kilkoma paskami HP. Teraz ten, kto ściska bliższego sojusznika, ustępuje, a linia sortuje się po odległości.
  • Łucznik kitinguje. Nie prosi o token, dopóki ma strzał — więc nie głodzi kolejki melee, trzymając token, którego nie wyda, i wraca na pierścień, czyli cofa się, gdy się zbliżasz. Jego pierścień to ~110 px: w swoim zasięgu, poza zasięgiem katany. Potrzebuje też czystej linii ognia — raycast od lufy do celu; trzyma strzał, jeśli pierwsze trafienie promienia to ściana albo jeden z sojuszników. W rogu wciąż wymachuje.
  • Wrogowie zatrzymują się na krawędziach. Pościg patrzył tylko w kierunek gracza, więc wrogowie szli w pustkę za tobą. Teraz sonduje podłoże tuż przed sobą; kierunek pościgu zeruje się na krawędzi, patrol zawraca przy ścianie albo skocie.

Staty wrogów to już dane

Wszystko, co sprawia, że jeden wróg walczy inaczej niż drugi — zasięgi wykrycia i ataku, prędkości, trzy timingi ataku, cały profil obrony — to teraz eksportowane pole na bazowym wrogu, nie override podklasy. Nowy typ to scena z innymi liczbami, nie nowa klasa. To fundament pod elity (§4.2): twardsze, szybsze, dłuższe wersje tego, co już jest. W kodzie zostaje zachowanie naprawdę inne — drugi tryb ataku (strzał łucznika) i Legion w ogóle nie atakujący. Liczby to dane; zachowanie to hook.


Dlaczego jest v0.3.0, którego nie widać

Kod wrogów rozdzielono na lokomocję i walkę — zanim cokolwiek z powyższego. Restrukturyzacja wyszła jako osobny tagowany build, v0.3.0, z jednym kryterium poprawności: gra dokładnie tak samo. To przeciwieństwo kryterium tego buildu („gra lepiej”), a osobne wersje oznaczają, że regresja w v0.3.1 nie zostanie wzięta za zamierzoną zmianę. v0.3.0 też podniósł projekt z zera testów automatycznych do 15 headless suite’ów, każda sprawdzona, że pada, gdy to, co strzeże, jest zepsute — tak złapano jedyny realny bug sędziego (deadlock: token dało się wziąć tylko z zasięgu melee, a wroga bez tokenu trzymało na zewnątrz pierścienia wyczekiwania — po wdrożeniu sędziego żaden świadomy wróg już nie atakował; wszystkie istniejące testy były zielone, bo albo spawnowały wroga już w zasięgu, albo tylko sprawdzały, że zaczął iść).


Sterowanie

Bez zmian względem v0.2.9.

AkcjaKlawiaturaPad (Xbox)
Ruch← / →lewy stick / d-pad
Skok (podwójny)Spacja / EnterA
Melee (combo 3-hit)A — tapRB
Atak ładowanyA — trzymaj ≥ ~0.5 sRB — trzymaj
Wariant trzeciego hitutrzymaj ↓ ciężki · nic = szybki · ↑ = launcherto samo
Blok / paradaD — trzymaj / tap tuż przed hitemLT
Unik (dash, i-frames)ShiftLB
Strzał (8 kierunków)SRT
PrzeładowanieR (auto przy pustym)Y
Interakcja / wyrzucenieEX
Pauza / menuEscStart
Podgląd (relikwia + tatuaże, tylko odczyt)Tab — trzymajSelect — trzymaj
Chwyt krawędziautomatyczny; wspinaczka = skok / ↑, zejście = ↓to samo

Jak uruchomić

SystemPlikUwagi
Windowsultraviolet.exe (+ ultraviolet.pck obok)SmartScreen — „Więcej informacji” → „Uruchom mimo to”.
Linuxultraviolet.x86_64 (+ .pck obok)chmod +x, potem ./ultraviolet.x86_64.
macOSUltraviolet.appNiepodpisane: prawy przycisk → Otwórz → potwierdź, albo xattr -dr com.apple.quarantine Ultraviolet.app.

Wyjście: Esc w menu głównym zamyka grę. W runie Esc otwiera pauzę — stamtąd wyjście do menu głównego.


Wciąż pre-alpha — czego nie ma

  • Placeholderowa grafika. Gracz ma zastępczy pakiet sprite’ów; wrogowie, teren i UI to kolorowe prostokąty (czerwony melee / żółty łucznik / niebieski bloker).
  • Placeholderowy dźwięk. Chropowate zastępstwa, niewybalansowane; dwa utwory w pętli.
  • Boss to stub. „Legion” to niebieski bloker z dodatkowym HP, który blokuje wyjście, dopóki nie padnie. Prawdziwa walka — pod którą budowano sędziego ataków — to v0.3.2.
  • Balans niedostrojony — obrażenia, HP wrogów, koszty, rampa liczby wrogów na pokój.
  • max_attackers (2), dystans wyczekiwania (68), pierścień łucznika (110), okno tapu (0,18 s) — gałki strojenia, nie finalne wartości.
  • Brak ekranu śmierci, licznika prób, meta-progresji poza tatuażami.

Jak zgłaszać feedback

BŁĄD — co się stało, gdzie (menu / hub / który pokój), jak odtworzyć, platforma. Przy walce podaj liczbę wrogów i kolory.

ODCZUCIA — działa, ale jak się gra? Ten build to prawie wyłącznie feel:

  • Dwóch atakujących naraz, czy jeden? Przy jednym czyta się jak pojedynek z publicznością; przy dwóch presja trzyma, ale może być gęsto. Co lepsze przy trzech–czterech wokół — a co przy dwóch?
  • Czy bloker nie stał się za łatwy? „Pierwszy hit zawsze wpada” miało uczynić blok fair. Czy zamiast tego rozbroiło niebieskich — można ich po prostu mashować?
  • Dystans wyczekiwania — wrogowie krążący i cofający się po swingach: czekają na kolej, czy tchórze marnujący czas? Łucznik na ~110 px — tylko irytujący?
  • Okno tapu — normalny atak wychodzi naturalnie, bez świadomego szybszego tapowania? Charge startuje za późno w drugą stronę?
  • 3–4 wrogów naraz, teraz z sędzią — łamigłówka, czy wciąż przeciążenie?

Zostaw feedback w komentarzach pod grą albo tym postem. Testerzy z pełnym przewodnikiem mają tam skupioną checklistę.

Dzięki za granie w coś, co wciąż jest głównie prostokątami.

— SolarNine · v0.3.1-pre-alpha