Podstawowe zachowanie minigry definiowane jest w urządzeniu Verse verse_commander_minigame. Urządzenie to rozpoczyna minigrę, obsługuje komunikację między UI a postacią, a także plansze stosowane w grze.
Urządzenie to zawiera następujące pola, które można zmodyfikować w edytorze:
HUDController: Urządzenie sterownika interfejsu, które usuwa wszystkie domyślne elementy HUD Fortnite.
PlayVerseCommanderButton: Urządzenie przycisku, które uruchamia minigrę.
NPCSpawner: Urządzenie generatora NPC umożliwiające zespawnowanie postaci na potrzeby minigry.
Gameboards: Lista plansz dla gry. Plansze są odtwarzane w kolejności, w jakiej występują na liście.
UICommandLimit: Maksymalna liczba poleceń, jaką można dodać do kolejki na ekranie, widoczna u dołu listy.
Urządzenie zawiera również zdarzenia niestandardowe do komunikacji z postacią oraz do przekazywania postaci informacji: listę poleceń do wykonania dla postaci oraz przekształcenie, do którego postać zostanie teleportowana w przypadku zresetowania planszy.
# A Verse-authored creative device that can be placed in a level
verse_commander_minigame := class(creative_device):
# The HUD Controller device for the minigame.
@editable
HUDController<private>:hud_controller_device = hud_controller_device{}
# The button that starts the minigame.
@editable
PlayVerseCommanderButton:button_device = button_device{}
Rozpoczynanie minigry
Urządzenie minigry Komandor Verse oczekuje, aż gracz wejdzie w interakcję z urządzeniem przycisku na komputerze, zanim rozpocznie minigrę dla wszystkich graczy. Oczekiwanie to jest zapętlone. Po ukończeniu wszystkich poziomów możesz zagrać w minigrę powtórnie tyle razy, ile zechcesz.
# Runs when the device is started in a running game.
OnBegin<override>()<suspends>:void=
spawn{Cinematic.EnterCinematicModeForAll(GetPlayspace().GetPlayers())}
loop:
PlayVerseCommanderButton.InteractedWithEvent.Await()
Setup()
# Wait for all Gameboards to be set up.
Sleep(2.0)
Pętla gry
Pętla gry rozpoczyna się od pobrania bieżącej planszy. Jeśli to pierwsze podejście gracza do danej planszy, postać teleportuje się do pozycji początkowej na planszy, a plansza przełącza się na własną kamerę, aby otworzyć początkową sekwencję filmową.
Następnie rozpoczyna się wykonywanie wyrażenia race między pętlą poziomu a oczekiwaniem na zdarzenie resetu z UI. To spośród tych dwóch zdarzeń, które nastąpi jako pierwsze, spowoduje anulowanie drugiego. Wówczas wyrażenia w pętli zostaną powtórzone i nastąpi powrót do pobierania bieżącej planszy i ponownie rozpocznie się wykonywanie wyrażenia race.
# Loops over the current gameboard and resets them.
GameLoop<private>()<suspends>:void=
# For the current board, swap to that gameboard's camera and reset the character to the gameboard's starting position.
loop:
if:
Gameboard := Gameboards[CurrentBoard]
then:
# If first time on this board, set up the board
# and move character to starting position.
if:
Pętla poziomu
Funkcja LevelLoop() zarządza logiką planszy. Wykonuje ona wyrażenia race między pętlą poleceń postaci a oczekiwaniem na osiągnięcie celu końcowego planszy. Po osiągnięciu celu końcowego pętla poleceń zostaje anulowana i następuje wywołanie następnej planszy z listy.
Pętla poleceń oczekuje, aż gracz naciśnie przycisk wykonywania, aby otrzymać listę poleceń do wykonania. Wszystkie przyciski, z wyjątkiem przycisku resetowania, zostają dezaktywowane. Postać otrzymuje sygnał wykonania poleceń, a urządzenie Verse oczekuje na odbiór sygnału zakończenia, zanim ponownie uruchomi pętlę, oczekując na więcej poleceń.
W tej pętli zastosowano wyrażenie defer, aby wyczyścić UI, jeśli pętla poleceń lub funkcja LevelLoop() zostaną anulowane. Wyrażenie defer spowoduje wywołanie ResetUIForAllPlayers() tuż przed wyjściem z zakresu, aby zresetować możliwość interakcji z przyciskiem i ponownie go włączyć, a także wyczyścić listę poleceń u dołu.
# Handles command logic for the current gameboard.
LevelLoop<private>(Gameboard:gameboard)<suspends>:void=
# On the current board, race between completing the board and looping player commands.
# The race expression will cancel whichever action doesn't finish first.
race:
loop:
defer:
# If the loop is canceled because the character reached the end goal of the level,
# Or the character finished performing their commands,
# reset the UI for all the players so they can interact with it and have no commands in the queue.
Resetowanie gry
Funkcja AwaitReset() oczekuje, aż gracz wybierze przycisk resetowania. Gdy to zrobi, plansza sama się zresetuje i nakaże postaci teleportowanie się do pozycji początkowej na planszy.
# Waits for the Reset button to be selected, then resets the current gameboard
# and NPC.
AwaitReset<private>(Gameboard:gameboard)<suspends>:void=
ResetButtonSelected.Await()
# Reset the current gameboard, returning the game character to the starting position and
# resetting any barriers or triggers on the board.
BoardResetEvent.Signal(Gameboard.GetStartingCharacterPosition())
# Reset Gameboard
Następny krok
W tej sekcji omówiliśmy podstawową funkcjonalność urządzenia Verse w minigrze. Kompletny kod pozwalający utworzyć urządzenie minigry Komandor Verse znajdziesz w kolejnym, ostatnim kroku.