Script types
Mais ações
Existem dez tipos diferentes de scripts ACS.
Scripts especiais
Oito tipos são especiais e são executados sob circunstâncias específicas. Eles são:
| Tipo de script | Ativador | Quando |
|---|---|---|
| OPEN | Mundo | Imediatamente depois que o nível é carregado pela primeira vez (uma vez por nível) |
| ENTER | Jogador | Quando um jogador entra no nível (uma vez por jogador por nível) |
| RETURN | Jogador | Quando um jogador retorna ao nível em um hub após sair |
| RESPAWN | Jogador | Quando um jogador reaparece em um jogo multiplayer |
| DEATH | Jogador | Quando um jogador morre |
| LIGHTNING | Mundo | Sempre que um relâmpago pisca no nível atual |
| UNLOADING | Mundo | Depois que a saída do nível é acionada, mas antes do próximo nível carregar |
| DISCONNECT | Mundo | Quando um jogador desconecta de um jogo multiplayer |
| KILL | Thing | Quando um thing com a flag +USEKILLSCRIPTS é morto, ou quando ForceKillScripts está habilitado na GameInfo definition. |
| REOPEN | Mundo | Imediatamente depois que o nível é carregado novamente a partir de outro nível dentro do hub. |
OPEN
| Note: Código que afeta o ativador do script não deve ser usado em um script OPEN, já que o "ativador" nesses tipos de script é o mundo do jogo e não um jogador específico. Use o tipo ENTER se você quiser scriptar ações que afetem diretamente o(s) jogador(es) no início do nível. |
O nível executa um script OPEN quando ele é iniciado. O objetivo de scripts OPEN é controlar o nível como um todo. Você pode garantir que ele sempre será executado, e apenas uma vez. Eles frequentemente contêm código que monitora o nível e espera por certas circunstâncias.
Um exemplo poderia ser:
script 1 OPEN
{
Delay(35 * 30);
Door_Close(5, 20, 0);
}
ENTER
Semelhante aos scripts OPEN, estes rodam uma vez por jogador e são garantidos de rodar. Eles frequentemente contêm Thing_ChangeTID para dar um TID ao jogador, e outros scripts específicos do jogador como HUDs customizadas. O jogador é TID 0 em um script ENTER, e este é o primeiro ponto em que você consegue acessar o TID do jogador com certeza, já que não há como defini-lo enquanto o mapa está sendo construído.
Um exemplo:
script 1 ENTER
{
Thing_ChangeTID(0, 1000);
}
Uma versão melhor desse mesmo script que suportaria multiplayer seria algo assim:
script 1 ENTER
{
Thing_ChangeTID(0, 1000+PlayerNumber());
}
Scripts normalmente podem ser terminados pelo special ACS_Terminate. Porém, isso não é verdade para scripts ENTER. Se você escolher manter um script ENTER rodando em loop infinito (com restart no fim, ou um while loop, ou outros métodos) não existe forma de parar esse script com ACS_Terminate. Você pode, no entanto, terminar o script ENTER com a palavra-chave terminate chamada de dentro do próprio script.
- Nota: No Skulltag, espectadores nunca disparam um script ENTER.
RETURN
Como scripts ENTER, estes rodam uma vez por jogador e são garantidos de rodar. Diferente de scripts ENTER, eles rodam toda vez que o jogador (re)entra no nível, somente se o nível já tiver sido visitado anteriormente (ENTER roda na primeira vez; RETURN roda nas vezes seguintes). Esse tipo de script geralmente é usado se você precisa fazer algum tipo de checagem repetida toda vez que o jogador entra no nível.
script 1 RETURN
{
If(GetActorProperty(0, Predefinição:Const) < 75)
{
SetActorProperty(0, Predefinição:Const, 75);
}
}
RESPAWN
Para jogos cooperativos e multiplayer, esses scripts podem ser usados. Eles ativam quando um jogador reaparece após morrer, e atuam naquele jogador. Normalmente fazem código parecido com ENTER, redefinindo propriedades que o jogador perde quando morre.
script 1 RESPAWN
{
SetActorProperty(0, Predefinição:Const, 0.5);
}
DEATH
Executa quando um jogador morre. O jogador que morreu é o ativador do script, então o número dele pode ser determinado em um jogo multiplayer usando a função PlayerNumber.
script 1 DEATH // Solta o Ídolo Dourado, se o jogador morrendo o tiver.
{
if (CheckInventory("GoldenIdolOfImportance") {
Thing_Spawn(1337+PlayerNumber(), T_MYGOLDENIDOL, 0, 0);
}
}
LIGHTNING
Depois que o efeito de relâmpago ocorre, esse tipo de script é executado. É bem incomum ver esse tipo de script e ele tem um uso bem óbvio.
script 1 LIGHTNING
{
Delay(Random(20, 200));
AmbientSound("world/thunder", 127);
}
O som "world/thunder" é o som de trovão de Hexen.
UNLOADING
Isto é quase o inverso de OPEN. Ele é chamado quando o nível está saindo.
Em um script UNLOADING, tudo até a primeira função que atrasa (delay) terá a chance de executar. Se o script precisar esperar, ele continuará a execução quando os jogadores voltarem ao mapa. Como esse tipo de script é executado com o equivalente de ACS_Execute e não ACS_ExecuteAlways, ele pode bloquear a si mesmo de executar na próxima vez que o nível for descarregado caso ainda não tenha terminado suas tarefas.
A diferença entre o “oposto” de OPEN e UNLOADING é que OPEN só é chamado uma vez, mesmo que você saia do mapa e retorne a ele em um hub. UNLOADING será chamado toda vez que o mapa for descarregado.
Um exemplo:
script 1 UNLOADING
{
Thing_Spawn(10, Predefinição:Const, 0, 0);
}
DISCONNECT
Um script DISCONNECT deve ser declarado com um único argumento. O ZDoom vai passar o número do jogador que desconectou para essa variável. Como o jogador já saiu do jogo quando esse script é chamado, nenhuma ação pode ser tomada naquele jogador. O script é executado pelo próprio mundo.
Scripts DISCONNECT ativam imediatamente antes do ator do jogador ser destruído, definindo o jogador que está saindo como ativador em vez do mundo. Note que quaisquer delays ou esperas farão o script redefinir o ativador de volta para o mundo.
Um exemplo:
script 999 (int gone) DISCONNECT
{
PrintBold(s:"Player ", n:gone + 1, s:" has left the building!");
}
- Nota: No Skulltag, scripts DISCONNECT também são executados quando um jogador vira espectador.
KILL
Executa quando um thing que pode ser morto morre e ele tem a flag +USEKILLSCRIPTS, ou quando ForceKillScripts foi habilitado na GameInfo definition. O thing que morreu é o ativador do script. Funciona de forma parecida com scripts DEATH para jogadores, exceto para things que podem ser mortos.
script 1 KILL // Faz monstros darem bônus de vida ao jogador ao morrer.
{
if(!CheckFlag(0, "ISMONSTER"))
{
terminate;
}
SetActivatorToTarget(0);
GiveInventory("HealthBonus", 1);
}
REOPEN
Executa quando o nível é reentrado como parte de um hub, como um script RETURN exceto que atua no nível em si e não nos jogadores.
script 1 REOPEN
{
Thing_Spawn(16, Predefinição:Const, 0, 0);
}
Scripts fechados
Um script que não se encaixa em uma das categorias acima é conhecido como um script fechado (closed). Esse tipo de script deve ter uma lista de argumentos, mesmo que seja apenas (void). Exemplos de scripts fechados incluem:
script 1 (void) // Não recebe argumentos
{
}
script 13 (int x, int y) // Recebe dois argumentos e armazena em x e y.
{
}
Scripts net
Qualquer um dos scripts acima (abertos ou fechados) pode ser executado em um jogo single-player ou quando cheats estão habilitados ao “puká-los” pelo console, usando o comando puke. Porém, ao jogar um multiplayer em que cheats estão desligados por padrão, ainda pode ser desejável permitir que usuários chamem scripts sob demanda, tipicamente ao pressionar uma tecla bindada para um puke. Para permitir isso, você pode definir o script com a palavra-chave "net". Isso torna o script pukável mesmo quando cheats estão desabilitados.
Scripts net são definidos colocando a palavra-chave net no final da linha que define o script:
script 7 (int x) net // Script fechado que pode ser pukado no multiplayer
{
}
script 109 ENTER net // Script ENTER que também pode ser pukado manualmente no multiplayer
{
}
- Nota: Scripts net do Skulltag funcionam de uma forma diferente. Para mais informações, veja Tipos de Script do Skulltag.
Scripts nomeados
Scripts podem ser usados em ACS e DECORATE com strings em vez de números de script.
Veja Named scripts para mais informações.