Nota: Não fique muito preocupado se você não entender completamente esta parte. Fará mais sentido quando for mostrado como usar as informações.As missões PSO são divididas em duas partes:.dat (contém dados de andar, ou seja, dados de monstros, objetos e eventos).bin (contém o script de montagem PSO para executar a missão) * A montagem será referida como ASM a partir de agora.Para Tethealla, esses dois arquivos estão organizados cuidadosamente em um arquivo .qst para que o servidor possa descompactar e enviar para os clientes para execução.Para que uma missão funcione, ela requer dados de NPC/monstro, objeto e evento. Em seguida, requer um script para dizer ao cliente o que exatamente fazer com muitos desses NPCs e objetos (e outras funções não relacionadas), para que a missão funcione corretamente.Dados de Monstros, Objetos e EventosVamos pegar uma missão como exemplo (Endless Nightmare 1)
Esta é uma visão geral do Pioneer 2 do Endless Nightmare 1. Como você pode ver, muitos monstros (as setas vermelhas) e objetos (as setas verdes) estão colocados no Pioneer 2. Os monstros variam de monstros reais a NPCs, enquanto os objetos variam de objetos de cenário, pontos de Spawn de jogadores e várias colisões para executar eventos ou partes do script. Monstros e objetos têm seus próprios parâmetros, conforme exibido abaixo, mas muitos objetos requerem interações com o script ASM (geralmente definido por uma Função) para poder realizar certos eventos.
Os parâmetros de um Soldado Vermelho (esquerda) e os parâmetros do Principal Warp (direita).Configurar seus monstros e objetos é bastante fácil, como será explicado na segunda parte do guia.Os dados de eventos do mapa também são um processo bastante simples. Na maior parte, os dados de eventos do mapa são usados simplesmente para processar ondas de inimigos, revelar objetos (se ligados a uma onda) e desbloquear portas. Para contextualizar, vamos olhar para a Floresta 1 de EN1 para ter uma ideia melhor.
Esta é uma visão geral dos dois primeiros quartos da Floresta 1. As setas vermelhas são os monstros da primeira sala de inimigos, enquanto as setas verdes são os numerosos objetos no mapa (enquanto a seta amarela é apenas um monstro/objeto destacado).Como você provavelmente sabe, a missão não gera todos os inimigos de uma vez. Este é o papel dos eventos do mapa. Os eventos do mapa informam o jogo para gerar apenas certas ondas de inimigos, e uma vez que uma onda termina, realizar outras ações, como chamar outros eventos ou desbloquear portas.
Acima estão dois inimigos que fazem parte da primeira sala. Como você pode ver, eles estão configurados para ondas diferentes, mas você ainda deve ser capaz de informar ao cliente quando os inimigos devem aparecer. (Note que qualquer coisa atribuída à Onda #0 aparecerá imediatamente ao entrar no mapa).Na imagem do mapa acima, o objeto destacado é uma 'Colisão de Evento'. Isso faz com que um certo evento do mapa ocorra quando os jogadores colidem com o objeto invisível (que tem um determinado raio, então o jogador pode estar em qualquer lugar dentro desse círculo).Essa colisão de evento em particular chamará o Evento 111. Os eventos para a primeira sala estão escritos abaixo, com explicações sobre como eles funcionam.
Código: Selecionar todos
#111 // Calls Wave 1 in Map Section 11, with a delay of 50 frames after the event is called.
Section: 11
Wave: 1
Delay: 50
Call 1111 // After the wave is cleared, event 1111 will run.
#1111 // Calls Wave 2 in Map Section 11, with a delay of 50 frames after the event is called.
Section: 11
Wave: 2
Delay: 50
Call 1112 // After the wave is cleared, event 1112 will run.
#1112 // Calls Wave 3 in Map Section 11, with a delay of 50 frames after the event is called.
Section: 11
Wave: 3
Delay: 50
Unlock 4 // After the wave is cleared, doors with Door ID 4 will be unlocked.
Unlock 5 // After the wave is cleared, doors with Door ID 5 will be unlocked.
Unlock 6 // After the wave is cleared, doors with Door ID 6 will be unlocked.
Parece complicado, né? Bem, não se preocupe porque na verdade é relativamente simples se você entender o que cada coisa faz. Vamos desvendar isso.Quando uma missão é iniciada, ela imediatamente executa a Função 0 (que é a linha que começa com o azul 0). A Função 0 geralmente define os episódios, define os mapas, diz à missão quais funções executar ao entrar em áreas e diz a essa missão quais funções executar quando a missão estiver concluída ao conversar com a mulher da guilda. Ela pode fazer quantas coisas você quiser, mas esses são alguns exemplos que devem ser colocados na Função 0.
Código: Selecionar todos
0: set_episode 00000000 // Sets the quest to Episode 1. (This is not actually in the script as the quest is from V1/2, which didn't have episodes, but let's pretend it is)
set_floor_handler 00000000, 150 // Whenever Floor 0 (Pioneer 2) is entered, run Function 150.
set_floor_handler 00000001, 151 // Whenever Floor 1 (Forest 1) is entered, run Function 151.
set_floor_handler 00000002, 152 // Whenever Floor 2 (Forest 2) is entered, run Function 152.
set_qt_success 250 // When Register 255 is set (more on that later, but basically when the quest is clear), run Function 250 when talking to the guild lady.
BB_Map_Designate 00, 0000, 00, 00 // Set Floor 0 (Pioneer 2) to be Map 0 (Pioneer 2) and Variant 0. (3rd byte is unknown)
BB_Map_Designate 01, 0001, 00, 01 // Set Floor 1 (Forest 1) to be Map 1 (Forest 1) and Variant 1.
BB_Map_Designate 02, 0002, 00, 01 // Set Floor 2 (Forest 2) to be Map 2 (Forest 2) and Variant 1.
get_difflvl2 R83 // Store the difficulty level in Register 83 (0 = Normal, 1 = Hard, 2 = Very Hard, 3 = Ultimate)
ret // Return to caller
Vamos usar a função de sucesso da missão (250) como exemplo. Isso acontece quando você fala com a mulher da guilda após a missão ser concluída.
Código: Selecionar todos
250: jmpi_= R83, 00000000, 251 // If Register 83 is equal to 0 (normal difficulty), jump to function 251.
jmpi_= R83, 00000001, 252 // If Register 83 is equal to 1 (hard difficulty), jump to function 252.
jmpi_= R83, 00000002, 253 // If Register 83 is equal to 2 (very hard difficulty), jump to function 253.
jmpi_= R83, 00000003, 254 // If Register 83 is equal to 3 (ultimate difficulty), jump to function 254.
ret // Return to caller (this is not actually necessary, because a jump makes the script stop running where it is and start running elsewhere, so to speak)
251: window_msg 'You've been awarded 2000 Meseta.' // Brings up a window message that displays the text written.
bgm 00000001 // Plays the quest clear jingle
winend // Closes the window message
pl_add_meseta2 000007D0 // Adds 2000 Meseta to the player's inventory
ret // Return to caller (a jump is not regarded as a caller, so the script will just end here)
252: window_msg 'You've been awarded 4000 Meseta.'
bgm 00000001
winend
pl_add_meseta2 // 00000FA0 // Adds 4000 Meseta to the player's inventory
ret