Dwa buildy w jednym poście. v0.3.1 dało sędziego między wrogami, żeby tłum dało się czytać. Te dwa sprawiają, że wrogowie — i boss — są warte czytania.
v0.3.2zastępuje stub bossa Legionem: nie atakuje, dzieli się na roj wychodzący z ciała. (Osobny tag, ale to pierwszy build na itch z nim.)v0.3.3to enemy AI v3: każdy swing był stałym wind-upem 0,35 s. Teraz to wybór — trzy ruchy rozróżnialne kolorem telegraphu — plus timing, którego nie da się w pełni przewidzieć, i warunki czytające twoją postawę, skok, retreat.
Kryterium poprawności dla v0.3.3, w tym samym duchu co v0.3.0 („gra tak samo”) i v0.3.1 („gra lepiej”):
gra trudniej, ale każdą śmierć da się wytłumaczyć.
Nie „więcej HP i szybsze swingi”. Trudność ma wynikać z błędnych decyzji — nie przeczytałeś koloru, spanikowałeś i dashem, stałeś w bloku — nie z informacji, których nie dano.
Boss dzieli się zamiast wymachiwać
Legion (Koncept §8) ma jedną regułę: nigdy cię nie atakuje. Stoi na arenie z paskiem HP na dole ekranu i tabliczką z imieniem nad sobą, co kilka sekund błyska ok. 0,6 s, zakorzenia się i z ciała odchodzi roj. Cała walka to tłum.
Cztery decyzje projektowe to napędziły, pierwsze dwie się rozwiązują. Klasyczny pasek HP, możliwy do obrażeń cały czas — co zwykle zaprasza do „ignoruj addy, przytul bossa”. Ale roj spawnuje się z niego, więc stanie na pasku to stanie w roju, a split przy każdej fali wypycha cię z zasięgu katany. Zarządzanie tłumem nie jest bramką na pasek; to cena wstępu.
Reszta:
- Postawa tak, wyrzucenie nie. Parady i bloki łamią jego postawę i otwierają długie okno obrażeń, ale prompt
[E]wyrzucenia nigdy się nie pojawia — księcia nie kończysz ręką. Jego śmierć to wyrzucenie i daje pierwszą duszę, jaką gra kiedykolwiek wyprodukowała (§7.1: jedna dusza, jeden tatuaż). - Twardy limit roju — 4 w fazie I, 6 w II, 7 w III. Przy limicie nie błyska na pustym summonie.
- Push to pierwszy nieparowalny ruch w grze (§6.3: książęta je dostają). Pokrywa jego wind-up i oddaje kontrolę; dash wciąż go bije, więc „dash to unik” zostaje.
- Cała hierarchia §4.2 wyszła razem z nim. Spawn / named / prince to jedno pole,
rank, na bazowym wrogu — rządzi dokładnie trzema rzeczami (tabliczka imienia, czy wyrzucenie dozwolone, postawa). Reszta elitowości to profil@exportzv0.3.1, więc elita to scena z innymi liczbami, nie nowa klasa. Postawa skaluje tylko to, co daje zwykły hit — flinch i knockback — więc boss wciąż otwiera się na parady na pełnej sile. Skalowanie „w oczywistym miejscu” cicho skasowałoby grę postawy w każdej walce z bossem przy wciąż zielonych testach.
Jeden bug wart opowiedzenia: Health.invincibility_time domyślnie 0,4 s i nic tego nie nadpisywało. OK dla spawna na 3 HP; na czymkolwiek z paskiem HP bar capuje ~2,5 trafień na sekundę i zjada hity 2 i 3 combo katany. Boss z domyślnymi i-frames czyta się jako długi, nie trudny. Legion ma 0,1 s, przypięte asercją.
Trzy ruchy, trzy kolory
Każdy zwykły wróg ma teraz krótką listę zasobów AttackDef zamiast trzech eksportowanych liczb. Wróg z pustą listą zachowuje się dokładnie jak w v0.3.1 — ta równość to cała pierwsza faza.
Spawn dostaje dwa z nich:
- Jab — szybki, krótki, kolor typu. Blok albo parada.
- Heavy — bursztyn. Nie nieblokowalny: trzymany blok kosztuje 45 staminy zamiast 15, więc dwa w gardę ją łamią. Odpowiedź to parada (telegraph 0,55 s, najszersze okno w grze) albo dash.
- Low — fiolet. Ruch, którego trzymany guard nie łapie. Ma odpowiedź pozycyjną — skok — dlatego to nie „nieparowalne tylko dla księcia”. Fiolet znaczy zejdź z drogi, ten sam kolor pójdzie na ruchy księcia.
Bloker dostaje jab + heavy (karze turtling). Thrall Legionu dostają tylko jab, szybszy — roj z mix-upem jest nieczytelny, faza III musi zostać czytelna. Elity wszystkie trzy, plus trik niżej.
Kolor telegraphu to cały read. Wybór ruchu według pasma dystansu, ważony, wagi gięte warunkami.
Timing, którego nie da się w pełni przewidzieć
- Trzymane swingi. Czasem wróg trzyma w pełni narysowany wind-up dodatkowe 0,15–0,35 s. Reguła absolutna: telegraph musi widocznie trwać — wielokąt swinga świeci, sprite trzyma narysowaną klatkę. „Wciąż wind-up”, nie „timer cicho się przesunął”. To granica między opóźnieniem a kłamstwem.
- Whiff ≠ hit. Aktywna faza bez kontaktu — brak hitu, bloku, parady — dostaje
recovery × 1,4. Jedna reguła i otwiera footsies: wywołanie heavy i kara za whiff staje się podstawą, a wróg, który machnął w powietrze, wygląda na ukarany. - Chainy. Po hicie albo bloku wróg może iść w drugi (rzadko trzeci) swing zamiast recovery. Link chainu ma krótki wind-up 0,20 s, więc trzeba od razu rozpoznać „nie skończył”. Max trzy linki, nigdy dwa heavy w jednym chainie, brak chainu bez tokenu ataku. 0,20 s to też naturalny dash-catch — i-frames dasha 0,18 s — nikt tego nie kodował ani nie czytał twojego inputu; robi to geometria.
Warunki — wróg czyta to, co widać
Wszystkie czytają widoczny stan gracza, nigdy wewnętrzną flagę (reguła, którą v0.3.1 raz złamało i naprawiło):
- Trzymany guard > 1,2 s → waga heavy ×3. Twoja garda na ekranie, reakcja fair.
- Jesteś w powietrzu w zasięgu → wróg trzyma swing i trafia przy lądowaniu. Zabija skok jako darmowy escape bez animacji anti-air.
- Whiffnąłeś charged attack → wróg w zasięgu wchodzi od razu najcięższym ruchem — ale nigdy nie pomija własnego cooldownu ataku. Symetrycznie do kary za whiff wyżej.
- Cofasz się 2 s → pierścień wyczekiwania zacieśnia się do 80%. Anti-kiting; presja rośnie z sytuacji, nie z timera. (Tu był realny bug: test „cofania się” był per-klatkę, próg 0,5 px, co przy 60 fps odrzucało retreat wolniejszy niż 30 px/s i zachowywałoby się inaczej przy innym FPS. Teraz to prędkość.)
- Masz guard break → wróg wybiera najszybszy ruch, nie największy. Break to kara, nie niespodziewana egzekucja.
- Sam wróg poniżej 30% HP → ciężej i przestaje trzymać dystans. „Desperacja” to zmiana charakteru, nie buff.
Sędzia, wersja 2
Dwie dopiski do EnemyDirector:
- Drugie, rzadsze piętro dla heavy — co najwyżej jeden swing łamiący guard w powietrzu w całej walce. Dwa bursztynowe wind-upy naraz są nieczytelne; czytelność wygrywa z głębią.
- Flanker. Przy trzech i więcej wrogach jeden trzyma pierścień po drugiej stronie ciebie. Pierścień to teraz pozycja, nie dystans, więc ten sam kod obchodzi zamiast drugiego trybu ruchu. Tył był bezpieczny, więc walka czwórką to kolejka; teraz retreat nie jest automatycznie dobry i pozycja to zasób. (Potrzeba było czterech warunków, zanim crossing w ogóle by skończył — flanker przechodzi przez ciała sojuszników, nie ustępuje w drodze, nie zatrzymuje się na swing.
min_enemies_to_flank = 3wyszło z padającego testu, który okazał się brakującą regułą designu: przy dwóch wrogach obejście zostawia jednego z przodu, co jest łatwiejsze.)
Nowe narzędzie gracza: riposta
Po udanej parady otwiera się okno 0,4 s, w którym następny hit na tym samym wrogu:
- zadaje podwójne obrażenia,
- i wrzuca duży kawał rezonansu (dotąd parada karmiła rezonans wolno, przez postawę).
Dlaczego to i nic więcej: jedyną nagrodą parady była postawa, więc przeciw twardszym wrogom racjonalnie ją pomijałeś na rzecz dasha. Riposta zamyka pętlę i daje agresywnemu graczowi odpowiedź na presję — bez nowego przycisku, bez nowego systemu. Okno jest przywiązane do wroga, którego sparowałeś, więc nie sparujesz jednego i wykorzystasz na innym.
Agresja też obija postawę, nie tylko parada (34) i trafienie w blok (22): katana 10, finisher combo 20, charged attack 30, gorący strzał 12 (zimny nie obija). Pełne combo to 40 postawy w ~0,9 s z wyciszoną regeneracją. Trasa parady jest szybsza (trzy parady); trasa agresji pewniejsza (nie wymaga okna 0,15 s). To kolejność przypięta asercją, żeby tuning nie odwrócił tego po cichu.
Legion v2
§8 nietknięte — wciąż nigdy nie atakuje. Głębokość poszła w to, co i jak summonuje:
- Skład fali per faza — faza I to szybka presja, II dodaje shieldbearera (wolny bloker wchodzący w gardę), III dodaje thralla dystansowego, żeby nie stać w miejscu.
- Formacje zamiast równego wachlarza — ściana między tobą a nim, albo szczypce z obu stron.
- Reaktywne summonowanie — przebijesz do niego, gdy retinue osłabła, i dzieli się natychmiast, formacja ściany, na własnym krótszym cooldownie. „Chowanie za retinue” to aktywne zachowanie, nie tylko pierścień.
- Presja fazy III — przestaje się cofać i idzie do przodu, fale wchodzą jako szczypce, raz wychodzi elita named.
- Retinue broni złamanego bossa. Gdy jego postawa pęka i otwiera się okno obrażeń, cała żywa retinue dostaje priorytet ataku i zbiega na niego. Okno przestaje być darmowe: trzy sekundy na pasku HP i płacisz tłumem w plecy, albo rezygnujesz i czyścisz roj najpierw. To kształt decyzji, o który chodzi w tej wersji.
Późna dopiska tylko dla elit: late reveal. Swing elity najpierw ma kolor wroga, dopiero 0,15 s przed trafieniem przełącza na kolor ruchu (bursztyn albo fiolet) — dokładnie jedno okno parady. Uczciwa wersja feintu: nie rozwiążesz wcześnie, ale możesz zareagować. Animacja musiała trzymać ten sam sekret — current_attack() ukrywa ruch do reveal, inaczej klip zdradziłby przy jeszcze milczącym kolorze.
Sterowanie
Bez zmian, z jedną dopiską: riposta jest automatyczna — parada, potem normalny hit na tym samym wrogu w 0,4 s.
| 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 |
| Riposta | automatyczna — hit w 0,4 s po parady, ten sam wróg | to samo |
| 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 + dusze, 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 / duży fioletowy Legion; elita ma własny kolor plus tabliczka). Kolory swingów — jab / bursztyn / fiolet — to osobna warstwa od koloru ciała.
- Placeholderowy dźwięk. Chropowate zastępstwa, dwa utwory w pętli.
- Nikt nie grał jeszcze faz 4–8
v0.3.3. Telegraph heavy (0,55 s), szansa trzymanego swinga (35%), kara za whiff (×1,4), okno riposty (0,4 s), chipy postawy (10/20/30/12), lead reveal (0,15 s) — gałki, nie finalne wartości. - Arena Legionu to płaski pokój 1280×360 z jedną krawędzią. Czy uniesie walkę tłumem 6–7 wrogów — otwarte; jeśli nie, dostanie dwie platformy, nie rebuild. 60 HP i limity roju 4/6/7 to liczby z sufitu.
- Balans niedostrojony — obrażenia, HP wrogów, koszty, rampa liczby wrogów na pokój.
- Brak ekranu śmierci, licznika prób, meta-progresji poza tatuażami (i pierwszą duszą od Legionu).
Jak zgłaszać feedback
BŁĄD — co się stało, gdzie (menu / hub / który pokój / arena bossa), jak odtworzyć, platforma. Przy walce podaj liczbę wrogów, kolory ciał i jaki kolor miał swing, który cię dostał.
ODCZUCIA — działa, ale jak się gra? Te buildy to prawie wyłącznie feel, a pytanie ponad wszystko:
- Czy każdą śmierć da się wytłumaczyć? „Nie przeczytałem koloru”, „spanikowałem w dash”, „stałem w bloku” — OK, to trudność. „Nie miałem jak tego zobaczyć” — to bug. Powiedz, które były które.
- Heavy — telegraph 0,55 s za wolny (zaproszenie) czy trafiony (najszersze okno parady w grze)? 45 staminy na blok to koszt, czy wyrok?
- Flanker — czy walka 3–4 wrogów stała się inna, czy tylko trudniejsza? Czy retreat przestał być automatyczną dobrą odpowiedzią?
- Riposta — czy parada stała się warta robienia, czy dodge wciąż po prostu lepszy?
- Legion — czy można ignorować roj i spalić bossa? Czy płaska arena wystarcza, żeby rozdzielić roj, czy jedna sterta przy ścianie? Czy okno po przełamaniu postawy to realna decyzja, czy oczywisty one-way?
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.3-pre-alpha