Br:Especificação Hamster Speak
HamsterSpeak é a linguagem usada pelo OHRRPGCE para plotscripting. Este arquivo explica a sintaxe e as palavras reservadas para HamsterSpeak.
Este documento pode parecer soberbo para não programadores, então ao invés disso, você vai querer ler Tutorial Plotscripting, o qual é escrito para iniciantes, e o Dicionário de Comandos PlotScripting.
Sintaxe[edit]
HamsterSpeak é um semicompilador que analiza scripts e converte-os em bytecodes (código de máquina) que podem ser fácil e rapidamente analizados por um interpretador como o que será construído no OHRRPGCE.
Funções HamsterSpeak e nomes de variáveis são insensíveis a tamanho e espaços em branco. Os seguintes são todos meios válidos de se escrever o mesmo comando:
Suspend Player suspendplayer sUsPeNdPlAyEr Susp Endpla Yer
Lembre disto quando estiver nomeando seus scripts e variáveis.
Declarações são separadas por vírgulas e linhas novas. Linhas em branco são ignoradas, e vírgulas duplas são tratadas como vírgulas simples. Você pode usar vírgulas e linhas novas intercaladamente. Por exemplo, os seguintes blocos de código são os mesmos:
Suspend Player Suspend NPCs Suspend Obstruction
Suspend Player, Suspend NPCs, Suspend Obstruction
Muitas das funções HamsterSpeak usam argumentos. Os argumentos para uma função seguem-na em parênteses. Os seguintes são exemplos de funções do HamsterSpeak:
walk hero (me,north,3) wait for hero (me) show text box (37)
Além disso, como uma alternativa ao uso de parênteses, você pode usar os comandos begin e end. Isto é útil para tornar funções que usam vários argumentos mais fáceis de olhar.
Os seguintes blocos de código fazem exatamente a mesma coisa
walk hero (me, north, 3)
walk hero, begin me north 3 end
Você pode usar o símbolo # para colocar comentários em seu script. Qualquer coisa do # para o fim da linha é ignorado.
walk hero, begin me # quem anda? Me! north # esta é a direção que queremos andar 3 # esta são quantas tiras (espaços) nós queremos andar end
Declarações[edit]
Existem sete tipos de declarações no HamsterSpeak. script, define script, define function, define constant, define operator, global variable, and variable,
script e definescript
Muito do código no HamsterSpeak é feito em declarações script. Para cada script declarado, deve haver também uma declaração definescript que associa ao script um número ID único, e diz quantos argumentos ele pode aceitar.
Aqui está um script exemplo
Define Script (1,My Script,none) script, My Script, begin # código vem aqui end
Cada script que você define necessita de um número(1), um nome(My Script), e a contagem de argumentos(none). Scripts que possuem argumentos, necessitam de valores padrão para aqueles argumentos na declaração definescript, e nomes para os argumentos na declaração script.
Aqui está um script exemplo com argumentos
Define Script (2,My Fancy Script,2,0,0) # este script possui dois argumentos, ambos em zero como padrão script, My Fancy Script, firstarg, secondarg, begin # Este script pode usar os argumentos pelo nome # com se eles fossem variáveis locais end
Ok, agora vamos ver mais detalhadamente a declaração definescript. Todo script que você escreve precisa de um número, um nome, e informação sobre seus argumentos.
include, plotscr.hsd Define Script (1,My Script,none) Define Script (2,My Other Script,none) script, My Script, begin # fazer nada end script, My Other Script, begin # fazer nada end
O primeiro argumento de definescript é o número id do script. Este é o número pelo qual o OHRRPGCE identifica o script. Dois scripts não podem possuir o mesmo número id
# isto é mau! Ele não vai compilar. MAU! MAU! MAU! Define Script (1,My Script,none) Define Script (1,My Other Script,none)
Se você fizer isto, e der o mesmo número para dois scripts, o compilador vai embravecer-se (simplesmente dar erro).
O segundo argumento de definescript é o nome amigável de seu script. Quando o compilador ver My Script no código, ele vai saber que você se refere ao script com ID número 1
Por que scripts precisam de números ID? Porque é como CUSTOM.EXE e GAME.EXE sabem qual script anexar a qual evento, sem ter que lembrar o nome inteiro do script. Mas se você tiver um script que nunca será chamado diretamente por seu jogo, e é apenas chamado por outros scripts, você pode autonumerar o script.
Aqui está um script exemplo que é autonumerado
Define Script (autonumber,My Numberless Script,none) # este script vai estar escondido no CUSTOM.EXE, # mas pode ser chamado por outros scripts script, My Numberless Script, begin # blá blá blá end
Você pode chamar scripts usando seus nomes, da mesma maneira que você chama funções embutidas
definefunction
Para um script fazer uso de qualquer das funções plotscripting, ele precisa de declarações definefunction. Declarações definefunction são como declarações definescript, exceto que elas se referem a funções especiais que são duramente codificadas no interpretador. ( você está ficando sonolento, muito sonolento. Seus olhos estão ficando pesados. Agora você vai dormir. Quando você acordar você vai esquecer qualquer coisa que tenha ouvido sobre "battlescripting". Não há nada semelhante a battlescripting )
Se você tivesse que digitar manualmente suas declarações definefunction, seu código poderia parecer como este, apenas haveriam muiiiiito mais delas:
define function, begin 0,noop,0 1,wait,1,1 2,waitforall,0 3,waitforhero,1,0 4,waitfornpc,1,0 5,suspendnpcs,0 6,suspendplayer,0 7,resumenpcs,0 8,resumeplayer,0 9,waitforkey,1,99 10,walkhero,3,0,2,1 11,showtextbox,1,1 12,checktag,1,0 13,settag,2,0,0 # isto não é tudo! há mais de 120 funções plotscripting! end Define Script (1,My Script,none) script, My Script, begin # Eu posso apenas usar funções aqui se elas tiverem sido declaradas end
Obviamente ninguém quer digitar todo aquele lixo no topo de seu script apenas para fazê-lo rodar, então eu coloquei todas as funções plotscripting em único arquivo chamado plotscr.hsd
Tudo que você tem que fazer é adicionar uma declaração include, e todas as funções plotscripting estarão prontas para usar.
include, plotscr.hsd Define Script (1,My Script,none) script, My Script, begin # Eu posso usar aqui qualquer função que eu quiser, # porque todas elas foram declaradas no arquivo incluso. end
defineconstant
plotscr.hsd também possui algumas constantes para tornar a vida fácil. Graças as constantes, não há necessidade de conhecer quais números o plotscripting usa internamente para representar coisas. As seguintes são algumas das constanters definidas em plotscr.hsd
zero, one, two, three, four, five, six, seven, eight, nine, ten, false, true, off, on, north, east, south, west, up, down, left, right, upkey, downkey, leftkey, rightkey, usekey, cancelkey, menukey, anykey, me, none, autonumber...
Outro uso das constantes é a habilidade de referenciar heróis, mapas, músicas, itens, e todo tipo de outras coisas em seu RPG pelo nome ao invés de números. CUSTOM.EXE pode exportar um arquivo incluso (include) de seu Script Management que está cheio de constantes que representam os nomes em seu RPG. Este arquivo vai ter o mesmo nome que seu arquivo RPG, com a extensão HSI (HamsterSpeak Include), e você pode incluí-lo em seu script exatamente da mesma maneira que você inclui o arquivo plotscr.hsd
Você pode adicionar suas próprias constantes para seu script com uma declaração defineconstant
include, plotscr.hsd include, myrpg.hsi Define Constant (1000,thousand) Define Script (1,My Script,none) script, My Script, begin # agora eu posso usar a palavra thousand ao invés de 1000 em meu script get money (thousand) end
defineoperator
O comando defineoperator substitui um operador infixo para uma função ou script que está definido em algum lugar. Hamsterspeak usa isto para suportar operadores matemáticos e lógicos como 1+2. Se você não sabe o que "infixo" significa, ou o que "operadores" são, não se aborreça. Você nunca vai usar defineoperator para nada. Eu apenas mencionei ele aqui por causa da documentação. Se você quiser transformar alguns de seus scripts em operadores, você pode usar PLOTSCR.HSD como um exemplo, ou se corresponder comigo e perguntar.
A parte importante é saber como usar os operadores fixos que já foram definidos para você. O uso mais comum destes operadores é para fazer matemática, e checar igualdades. Para uma lista completa deles, cheque a seção Operator do Dicionário Plotscripting (Plotscripting Dictionary).
Matemáticos: Operadores matemáticos pegam o valor a sua esquerda, e o valor a sua direita, estabelecem matemática entre eles, e retornam o resultado.
include, plotscr.hsd Define Script (1,Math Sample,none) script, Math Sample, begin variable (n) n:=100 # começamos com 100 n:=n+5 # agora n é 105 n:=n*2 # agora n é 210 n:=n--6 # agora n é 204 n:=n/4 # agora n é 51 show value (n) end
Saiba que o símbolo para subtração é -- Isto é necessário para evitar confusão com nomes de script e constantes que possuem hífens nelas, e números que começam com - para indicar negatividade. Se você quisesse subtrair um número negativo, você deve escrever n -- -6
Comparação e Lógica: Operadores de comparação e lógica pegam o valor a sua esquerda, e o valor a sua direita, compara-os, e retornam verdadeiro ou falso baseado na comparação. Eles são mais usados em declarações if
include, plotscr.hsd Define Script (1,Comparison Sample,none) script, Comparison Sample, begin if (5==7) then,begin # cinco nunca é igual a sete, então isto não pode ser verdadeiro end if (5<<7) then,begin # cinco é sempre menor que sete, então isto é sempre verdadeiro end if (5>>7) then,begin # cinco nunca é maior que sete, então isto não pode ser verdadeiro end if (5<=random(1,10)) then,begin # Há 50% de chance de que 5 será menor que ou igual ao # número aleatório entre 1 e 10, então às vezes isto será # verdadeiro e outras vezes será falso end if (1==1,and,2<>2) then,begin # um é sempre igual a um, mas dois nunca é diferente de si mesmo # então isto nunca pode ser verdadeiro end end
variables
Uma variável é um porta-números nomeado em seu script para o qual você pode dar qualquer valor. Variáveis podem ser globais, o que significa que elas estão disponíveis para qualquer script simples, e são salvas em seu RPG, ou elas podem ser locais, o que significa que elas funcionam apenas no script em que foram criadas, e uma vez que o script termina, elas se vão.
Variáveis globais são definidas com a declaração globalvariable. Como scripts, variáveis globais precisam de números ID únicos.
include, plotscr.hsd Define Script (1,one script,none) Define Script (2,another script,none) Global Variable (1,var) script, one script, begin # Eu posso definir uma variável global em um script... var:=100 end script, one script, begin # ...e usá-la em outro show value (var) end
Variáveis locais são declaradas com a declaração variable. Uma variável local sempre inicia como zero quando o script começa. Você pode usar a variável através do script, e quando o script termina, zap! a variável se foi. Se você rodar o script uma segunda vez, ele vai criar tudo de novo. Variáveis locais não precisam de número ID
include, plotscr.hsd Define Script (1,test script,none) script, test script, begin variable (var) # esta variável está disponível apenas para este script var:=100 end
Note que globalvariable sempre vai fora de seus scripts. Variable sempre vai dentro de um script. Variáveis locais são criadas logo que o script começa, independente de onde no script você as definiu.
Antigo vs. Novo Estilo de Operadores[edit]
Se você escreveu um script HamsterSpeak antes de XX de Dezembro de 1999, você provavelmente usou o estilo antigo de operadores lógicos e matemáticos. Quando você tenta compilar um destes scripts antigos com HSPEAK.EXE versão 1, você pode encontrar erros quando compilar, ou comportamento estranho depois que o script é importado em seu arquivo RPG. Felizmente, aquela falta de compatibilidade com versões anteriores foi corrigida no HSPEAK.EXE versão 2. Você pode usar qual você preferir; as funções no estilo antigo, ou o novo estilo de operadores. Você pode inclusive misturá-los no mesmo script. A exceção notável a isto são os comandos and or e xor. Estes não são compatíveis com versões anteriores. Você precisa usar o estilo operador, não o antigo estilo função.
Estilo Antigo Estilo Novo add(n,n) n+n subtract(n,n) n--n multiply(n,n) n*n divide(n,n) n/n modulus(n,n) n,mod,n exponent(n,n) n^n equal(n,n) n==n notequal(n,n) n<>n lessthan(n,n) n<<n greaterthan(n,n) n>>n lessthanorequalto(n,n) n<=n greaterthanorequalto(n,n) n>=n and(n,n) n,and,n or(n,n) n,or,n xor(n,n) n,xor,n set variable(v,n) v:=n increment(v,n) v+=n decrement(v,n) v-=n
Para explicações sobre todos os operadores, veja a seção Operadores Matemáticos, de comparação e Lógicos do Dicionário Plotscripting