El comportamiento central del minijuego se define en el dispositivo verse_commander_minigame de Verse. Este dispositivo inicia el minijuego, gestiona la comunicación entre la IU y el personaje, y ejecuta los tableros utilizados en el juego.
Este dispositivo tiene los siguientes campos que puedes modificar en el editor:
HUDController: un dispositivo de controlador del HUD para eliminar todos los elementos predeterminados del HUD de Fortnite.
PlayVerseCommanderButton: el dispositivo de botón que inicia el minijuego.
NPCSpawner: el dispositivo de generador de PNJ para que el jugador aparezca en el minijuego.
Tableros de juego: la lista de tableros para el juego. Los tableros se juegan en el orden en que aparecen en la lista.
UICommandLimit: el límite máximo de comandos que se pueden poner en cola en la pantalla al final de la lista.
El dispositivo también contiene eventos personalizados para comunicarse con el personaje y pasarle información: la lista de los comandos que el personaje debe ejecutar y la transformación a la que el personaje debe teletransportarse cuando se restablece el tablero.
# 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{}
Cómo iniciar el minijuego
El dispositivo de minijuego Verse Commander espera a que el jugador interactúe con el dispositivo de botón en la computadora antes de iniciar el minijuego para todos los jugadores. Esta espera se realiza en bucle. Una vez que termines todos los niveles, podrás repetir el minijuego tantas veces como quieras.
# 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)
Bucle de juego
El bucle de juego comienza obteniendo el tablero actual. Si es la primera vez que un jugador está en este tablero, el personaje se teletransporta a la posición inicial del tablero y el tablero cambia a su cámara y reproduce su cinemática de apertura.
Después, hay una carrera entre el bucle de nivel y la espera del evento de restablecimiento de la IU. Si cualquiera de los dos termina primero, cancela al otro. Las expresiones en el bucle se repiten y vuelven a obtener el tablero actual y comienzan la carrera de nuevo.
# 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:
Bucle de nivel
La función LevelLoop() gestiona la lógica del tablero de juego. Compite entre el bucle de comandos para el personaje y la espera de que se alcance el objetivo final del tablero. Una vez alcanzado el objetivo final, el bucle de comandos se cancela y se pasa al siguiente tablero de la lista.
El bucle de comandos espera a que el jugador presione el botón Ejecutar para recibir la lista de comandos a realizar. Los botones se desactivan, excepto el botón Restablecer. El personaje recibe la señal para ejecutar los comandos y el dispositivo de Verse espera a recibir la señal de finalizado antes de reiniciar el bucle y esperar más comandos.
En este bucle se utiliza un defer para despejar la IU si se cancela el bucle de comandos o la función LevelLoop(). La expresión defer llamará a ResetUIForAllPlayers() justo antes de salir del ámbito para restablecer la interactividad de los botones para que vuelvan a estar habilitados y borrar la lista de comandos de la parte inferior.
# 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.
Cómo restablecer el juego
La función AwaitReset() espera a que el jugador seleccione el botón de restablecimiento. Una vez que lo hace, el tablero se restablece y le dice al personaje que se teletransporte a la posición inicial en el tablero.
# 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óximo paso
Esta sección describe la funcionalidad principal del dispositivo de Verse para el minijuego. Puedes encontrar la lista completa de código para crear el dispositivo de minijuego Verse Commander en el siguiente y último paso.