← Devlog
v0.3.7-pre-alpha

Ultraviolet v0.3.7-pre-alpha: mapa się składa i drugi pass sprzątania

Cztery buildy w jednym poście, a tylko pierwsze trzy zmieniają coś, co widać. v0.3.3 dało bossa i swingi do czytania. Od tego czasu misja przestała być korytarzem.

  • v0.3.4 — cała mapa to jedna scena, ładowana naraz, zamiast pokoi streamowanych po jednym. Kryterium: gra dokładnie tak samo.
  • v0.3.5 — wall-jump i kamera, która cię prowadzi. Kryterium: gra lepiej.
  • v0.3.6 — generator układa pokoje 2D chodzeniem po siatce, więc mapa składa się w pion. Pula pokoi przebudowana od zera. Jest minimapa. Kryterium: gra inaczej.
  • v0.3.7 — drugi pass sprzątania, jak v0.3.0. Dziewięć faz, gra dokładnie tak samo, a jedyna widoczna rzecz: postawa wall-slide wreszcie dotyka ściany.

v0.3.4–v0.3.6 były otagowane, ale nigdy nie trafiły tutaj, więc ten build niesie wszystkie cztery naraz.


Misja to mapa, nie linia

Stara misja to łańcuch pokoi, przez które szedłeś po jednym, streamowanych przy seamie. Nowa to jedna ciągła mapa — każdy pokój stoi naraz na siatce 640×360 — a generator układa ją self-avoiding walk w dwóch wymiarach: w prawo, w górę, w dół, czasem cofając się. Mapa składa się w pion (ok. 8×4 komórek teraz, wobec starej linii 17×1) i może zawijać się sama na siebie.

Największy kawałek to był pomiar, nie pomysł: wszystkie szesnaście starych pokoi już siedziało na tej siatce 640×360, co do piksela — bounds kamery, pozycje drzwi, spawn, wysokość podłogi, wszystko było funkcją komórki siatki. Nikt nie nazwał siatki. Nazwanie zamieniło „zszyj następny pokój z poprzednim” w „czytaj pozycję pokoju z siatki”, i cała klasa bugów wyrównania seamów przestała istnieć.

Pulę pokoi przebudowano od zera. Stare to były korytarze — jeden wjazd, jeden wyjazd — i nie da się na nich dokleić ruchu pionowego. Nowe kafle z jednego szablonu: każdy kafel ma cztery strony, wszystkie uszczelnione, a mapa otwiera tylko te, które naprawdę łączy. Dziura w podłodze i dziura w ścianie to ta sama operacja. W środku każdego kafla biegnie kolumna pionowa: szyb do wspinaczki i dziura u podstawy na tej samej osi — bo wspinaczka kończąca się pod pełną podłogą to nie przejście.

Trzy liczby w tej kolumnie są zmierzone, nie wybrane: kanał wspinaczki 88 px szeroki (tyle uniesie climb), crossing 64 px (ciała 34), dziura spadu 64 px (skok ~79, więc przeskakujesz trasę poziomą nad luką).


Wall-jump

Komórka siatki ma 360 px wysokości. Podwójny skok ~76. Schody co 26. Pionowe połączenie z krawędzi to czternaście szczebli — więc wall-jump, z trzema regułami z designu:

  • Slide wymaga trzymania w stronę ściany. Zmierzenie ściany w powietrzu nic nie robi, więc stary platforming nietknięty.
  • Odbicie przywraca podwójny skok — świeży, w powietrzu.
  • Ale nie dwa razy z tej samej ściany. Jedna ściana, jeden kick. Szyb to zygzak: lewa, prawa, lewa. Potrzebujesz dwóch ścian naprzeciw, żeby wejść.

Stripy wall_contact / wall_slide / wall_jump leżały nieużywane w projekcie od dawna. Wreszcie grają.


Kamera patrzy tam, gdzie idziesz

Kamera siedziała na środku gracza. Teraz prowadzi ruch, patrzy w górę lub w dół, gdy o to prosisz, i przy szybkim spadaniu sama patrzy w dół — widzisz ziemię, zanim wylądujesz. Kadr trochę szerszy (widać ~36% pokoju zamiast 29%).

Jedna rzecz wpadła gratis: Camera2D.offset ma wreszcie jednego właściciela. Screen-shake zerował to pole co klatkę, więc cokolwiek innego pisałoby tam i zniknęłoby bez śladu. Design złapał to, zanim napisano linię kodu.


Minimapa

Mały widok w rogu przez całą misję i cała odkryta mapa na trzymanym Tab (nad panelem relikwii/tatuaży/dusz, który Tab już pokazywał). Reguła odkrywania: pokój, w którym byłeś, w pełni; sąsiedni pokojowi, w którym byłeś, tylko obrys; reszta w ogóle nie — sekret nigdy przed wejściem.


Jeden gracz na całą misję — drzwi już nie leczą

To zmiana, którą poczujesz najmocniej. W każdym hoście pokoju była świeża instancja Player i komponent ustawiający HP na full przy loadzie — więc każde przejście ekranu leczyło do pełna. Gałąź, sekret, marsz do areny Legionu. Zawsze wchodziłeś na bossa z pełnym paskiem.

Teraz nic nie podmienia sceny w misji, więc nic tego nie odpala. HP niesiesz całą drogę. Sekrety, relikwiarium i arena bossa otwierają się w scenie misji, obok zamrożonej mapy — wracasz tym samym drzwiami, mapa się nie resetuje, martwi zostają martwi. Idziesz do Legionu z tym, co zostało.

Decyzja designu, która za to płaci — gwarantowana kaplica przed drzwiami bossa, leczenie za koszt — jeszcze nie istnieje. Na razie run to jedna nieprzerwana krzywa zasobów; czy to zniesiesz bez kaplicy — otwarte pytanie tego buildu.


Trzy rundy playtestu i jedna linia kodu

W v0.3.6 mapę grano trzy razy i za każdym razem raport o geometrii: „nie da się dojść do pokoi wyżej”, „idąc w prawo wypadasz z mapy na zawsze”, „tego poziomu nie da się skończyć”. Naprawiono realne rzeczy — brak kill-plane w scenie misji, dekor w ścieżce chodu (39 px clearance na ciało 34 px), odbite animacje wall-slide, nieresponsywny wall-kick — i przebudowano pulę.

Ale przyczyna wszystkich trzech raportów to jedna linia: spine connector pisał każdą krawędź jako „w prawo”. Pokoje stały we właściwych miejscach (pozycja z komórki siatki), ale dane o pokojach kłamały, które drzwi gdzie patrzą — a uszczelki, portale i minimapa ufają tym danym. 479 z 500 seedów było niewygrywalnych. Patrz w opis, nie w opisywany obiekt.


v0.3.7 — drugi pass sprzątania

Jak v0.3.0 kiedyś: wersja celowo bez zmian gameplayu. Ten sam poprzecznik — gra dokładnie tak samo — i tym razem udowodnione: generator map daje identyczną bajt po bajcie mapę dla tego samego seeda na 60 seedach względem kodu sprzed cleanupu. Test suite poszedł 31 → 33.

Dziewięć faz, każda zwija jeden kawałek duplikacji: wykluczenia warstw fizyki, które cztery miejsca liczyły osobno; konwencja markerów, której uczyły się dwa systemy inaczej; trzy prawie identyczne paski HUD w jeden; portal, relikwiarium i NPC w jedną bazę interaktywnych obiektów; dwie długie metody rozbite na kroki, które już były; scaffolding testów, który każdy suite budował od zera. Plus stos martwego kodu i cztery komentarze dokumentacji na złych funkcjach.

Jedyna widoczna zmiana: klatki wall_contact / wall_slide rysują ciało kilka pikseli przed krawędzią komórki, i w przeciwieństwie do ledge-hang nic tego nie korygowało — więc poza wall-slide unosiła się od ściany z obu stron. Teraz jest przypięta do ściany.


Sterowanie

Bez zmian od v0.3.3, z wall-jumpem.

AkcjaKlawiaturaPad (Xbox)
Ruch← / →lewy stick / d-pad
Skok (podwójny)Spacja / EnterA
Wall-slide / wall-jumpw powietrzu trzymaj w stronę ściany, żeby slide · skok, żeby odbićto samo
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
Ripostaautomatyczna — hit w 0,4 s po parady, ten sam wrógto samo
Unik (dash, i-frames)ShiftLB
Strzał (8 kierunków)SRT
PrzeładowanieR (auto przy pustym)Y
Interakcja / wyrzucenieEX
Patrz w górę / dółtrzymaj ↑ / ↓ (stojąc)to samo
Pełna mapa + podgląd (trzymaj)TabSelect
Pauza / menuEscStart
Chwyt krawędziautomatyczny; wspinaczka = skok / ↑, zejście = ↓to samo

Uwaga: mała minimapa w rogu przez całą misję. Trzymany Tab otwiera podgląd tylko do odczytu — na początku cała odkryta mapa, potem aktywna relikwia, tatuaże i liczba dusz.


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. Pokoje to płasko cieniowane bloki — siatka prawdziwa, wygląd nie.
  • Placeholderowy dźwięk. Chropowate zastępstwa, dwa utwory w pętli.
  • Nikt nie przeszedł pełnej misji end to end — wejście do bossa — na mapie 2D. Tylko kawałki.
  • Brak kaplicy. Run to jedna nieprzerwana krzywa zasobów; kieszeń leczenia przed drzwiami bossa nie jest zbudowana.
  • Mapa jeszcze za niska. Cel 12×6 komórek; realne mapy wychodzą ~13,6 szerokości na ~2,5 wysokości. Szerokość blisko, wysokość potrzebuje dłuższego spine i więcej pionowych kafli w puli.
  • Balans niedostrojony — obrażenia, HP wrogów, koszty, rampa wrogów na pokój, siła kicka wall-jump.
  • 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óra część mapy / arena bossa), jak odtworzyć, platforma. Przy problemie mapy seed bardzo pomaga — uruchom z --map-seed=N po --, żeby przypiąć, albo opisz minimapę.

ODCZUCIA — działa, ale jak się gra?

  • Mapa — czyta się jako jedno połączone miejsce, czy gubisz się? Minimapa wystarcza, czy chcesz więcej bez trzymania Tab?
  • Wall-jump — szyb czytelny, czy fiddly? „Trzymaj w stronę ściany” — dobry trigger, czy slide, gdy nie chciałeś?
  • Kamera — patrzenie w dół przy spadaniu pomaga, czy dezorientuje? Gdzieś za ostro się przewraca?
  • Brak leczenia przy drzwiach — run zniesiony bez kaplicy, czy DOA u bossa? Ile HP zwykle zostaje na starcie?
  • Wejście → boss — da się w ogóle? Gdzie run się rozpada?

Zostaw feedback w komentarzach pod grą albo tym postem.

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

— SolarNine · v0.3.7-pre-alpha