O comportamento central do minijogo é definido no dispositivo Verse verse_commander_minigame. Esse dispositivo inicia o minijogo, trata da comunicação entre a interface de usuário e o personagem e executa os tabuleiros usados no jogo.
O dispositivo tem os seguintes campos que podem ser modificados no editor:
HUDController: um dispositivo Controlador do HUD para remover todos os elementos padrão do HUD do Fortnite.
PlayVerseCommanderButton: o dispositivo Botão que inicia o minijogo.
NPCSpawner: o dispositivo Gerador de PNJs que possibilita gerar o personagem para o minijogo.
Gameboards: a lista de tabuleiros do jogo. Os tabuleiros serão reproduzidos na ordem em que aparecem na lista.
UICommandLimit: o limite máximo de comandos que podem ser adicionados à fila na tela, na parte inferior da lista.
O dispositivo também contém eventos personalizados para se comunicar com o personagem e passar informações a ele: a lista de comandos a serem executados pelo personagem e a transformação para a qual se teletransportar quando o tabuleiro for redefinido.
# 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{}
Como iniciar o minijogo
Antes de iniciar o minijogo para todos os jogadores, o dispositivo minijogo Comandante Verse espera o jogador interagir com o dispositivo Botão no computador. Essa espera ocorre em um loop. Quando terminar todos níveis, você poderá jogar o minijogo novamente quantas vezes quiser.
# 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)
Loop de jogo
O loop de jogo começa com a obtenção do tabuleiro atual. Se for a primeira vez do jogador no tabuleiro, o personagem será teletransportado para a posição inicial do tabuleiro, e este mudará para a própria câmera e reproduzirá a cinematografia de abertura.
Em seguida, ocorrerá um evento "race" entre o loop de nível e a espera pelo evento de redefinição proveniente da interface de usuário. Se nenhum deles terminar primeiro, um cancelará o outro. As expressões no loop se repetirão e voltarão para obter o tabuleiro atual e iniciar a função "race" novamente.
# 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:
O loop de nível
A função LevelLoop() gerencia a lógica do tabuleiro. Ela executa uma função "race" entre o loop de comandos do personagem e a espera até que o objetivo final do tabuleiro seja alcançado. Quando o objetivo final for alcançado, o loop de comandos será cancelado e o próximo tabuleiro da lista será chamado.
O loop de comandos aguarda até que o jogador aperte o botão de executar para receber a lista de comandos a realizar. Os botões são desativados, exceto o botão de redefinição. Os botões são desativados, exceto o botão de redefinição. O personagem recebe um sinal para executar os comandos, e o dispositivo Verse espera até receber o sinal de pronto para reiniciar o loop e aguardar mais comandos.
Uma expressão defer é usada neste loop para limpar a interface de usuário se o loop de comandos ou a função LevelLoop() for cancelada. A expressão "defer" chamará ResetUIForAllPlayers() logo antes de sair do escopo para redefinir a interatividade dos botões, de modo que eles sejam habilitados novamente e a lista de comandos na parte inferior seja apagada.
# 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.
Como redefinir o jogo
A função AwaitReset() espera o jogador selecionar o botão de redefinição. Depois que isso for feito, o tabuleiro será redefinido e orientará o personagem a se teletransportar para a posição inicial do tabuleiro.
# 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
Próxima etapa
Este documento explicou as principais funcionalidades do dispositivo Verse para o minijogo. Confira a lista completa de códigos para criar o dispositivo Minijogo Comandante Verse na próxima etapa, que será a última.