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.
| Akcja | Klawiatura | Pad (Xbox) |
|---|---|---|
| Ruch | ← / → | lewy stick / d-pad |
| Skok (podwójny) | Spacja / Enter | A |
| Melee (combo 3-hit) | A — tap | RB |
| Atak ładowany | A — trzymaj ≥ ~0.5 s | RB — trzymaj |
| Wariant trzeciego hitu | trzymaj ↓ ciężki · nic = szybki · ↑ = launcher | to samo |
| Blok / parada | D — trzymaj / tap tuż przed hitem | LT |
| Unik (dash, i-frames) | Shift | LB |
| Strzał (8 kierunków) | S | RT |
| Przeładowanie | R (auto przy pustym) | Y |
| Interakcja / wyrzucenie | E | X |
| Pauza / menu | Esc | Start |
| Podgląd (relikwia + tatuaże, tylko odczyt) | Tab — trzymaj | Select — trzymaj |
| Chwyt krawędzi | automatyczny; wspinaczka = skok / ↑, zejście = ↓ | to samo |
Jak uruchomić
| System | Plik | Uwagi |
|---|---|---|
| Windows | ultraviolet.exe (+ ultraviolet.pck obok) | SmartScreen — „Więcej informacji” → „Uruchom mimo to”. |
| Linux | ultraviolet.x86_64 (+ .pck obok) | chmod +x, potem ./ultraviolet.x86_64. |
| macOS | Ultraviolet.app | Niepodpisane: 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