2. Introdução

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

2. Introdução

Mensagem por Admin em Ter Mar 26, 2013 5:07 pm

SCM é uma linguagem de script utilizada nos jogos da serie Grand Theft Auto (Era 3), utilizada normalmente para orientar as missões do jogo, apartir do GTA San Andreas começou a ser utilizada para orientar outras coisas alem de missões (External Scripts - script.img), como o para-quedas, arcades, casinos, ammu-nation e muitas outras coisas... Before, if you don't know anything about english, you don't go far... É, se você não souber um basico sobre inglês você não vai longe.

0. Rockstar VS. Modders
Muito provavelmente a Rockstar utilizou algo como isso para fazer as scripts do jogo:

Código:
REQUEST_MODEL CAR_CHEETAH
WHILE NOT HAS_MODEL_LOADED CAR_CHEETAH
 WAIT 0
ENDWHILE
CREATE_CAR CAR_CHEETAH -1138.406f -661.471f -100.0f TEST_CAR
MARK_MODEL_AS_NO_LONGER_NEEDED CAR_CHEETAH

O código acima, carrega o modelo 415 (Cheetah), espera enquanto o modelo não estiver disponível, e depois cria o carro 415 (Cheetah) nas coordenadas -1138.406 -661.471 -100.0 na variável "TEST_CAR"

A coisa é meio diferente para os modders...
O mesmo codigo acima, escrito no Sanny Builder:

Código:
0247: load_model #CHEETAH
while 8248:  not model #CHEETAH available
    wait 0
end
00A5: $TEST_CAR = create_car #CHEETAH at -1138.406 -661.471 -100.0
0249: release_model #CHEETAH

Somente dois arquivos estão presentes no jogo em estado decompilado, debug.sc (No Vice City) e main.sc no GTA 3, VC e SA, ambos arquivos pequenos que não explicavam "muita" coisa.

Os arquivos que vieram no game (main.scm para GTA 3 e Vice City, e main.scm e script.img para San Andreas) estavam em estado compilado, e algumas pessoas resolveram fazer um decompilador para tal, a Rockstar nunca disponibilizou qualquer ferramenta para modificar o GTA, então o pessoal teve que trabalhar duro no decompilador...
Após descobrir alguns dos formatos dos opcodes eles teriam algumas informações, como:

Código:
:label02012
0001: 05 E8 00
00D6: 00
003B: 03 01 00 03 02 00
004D: 01 label02012 00

E enfim eles tinham que descobrir o que cada coisa fazia... Tarefa não muito fácil... Mas graças a eles podemos hoje fazer esses mods CLEO maravilhosos que vocês vêem.

o código:

Código:
0001: wait 255

será compilado da seguinte forma:

Código:
01 00 05 FF 00

Sendo assim:

Código:
01 00  // Opcode 0001
05  // Datatype (16 Bits Integer)
FF  // 255 em Hexadecimal
00  // Null Terminator
// Exatamente, o WAIT e coisas parecidas serão ignoradas pelo compilador.

Se você ficou confuso sobre tudo isso abordado acima não se assuste, é normal para quem esta iniciando, não precisa entender, eu abordarei isso tudo novamente em um tutorial mais avançado.

1. Opcodes
e você percebeu, no inicio de cada linha, ou melhor, no inicio de cada comando, você vê 4 caracteres (Hexadecimais ;)) seguido de um ":" (Dois Pontos), esses são os responsáveis por dizer ao jogo o que fazer, eles são chamados de OPCODES, que significa Códigos de Operação (OPeration CODES), em seguida vem os parâmetros, que serão explicados um pouco mais abaixo.

Algumas palavras, o compilador transforma em opcodes, elas são palavras chaves, ou seja, se você digitar elas não precisa colocar o opcode... São elas:

Código:
0001=wait
0002=goto
0002=jump
0003=shake_camera
004f=create_thread
004d=else_jump
004d=jf
004e=end_thread
00d6=if
0051=return
0050=gosub
016B=fading
00d7=create_thread_wb
016a=fade
01B6=set_weather
03a4=thread
04BB=select_interior
0112=wasted_or_busted
0417=start_mission
00d8=mission_cleanup
0317=increment_mission_attempts
0111=set_wb_check_to
0459=end_thread_named

ou seja, se eu digitar:

Código:
thread 'EX'

vai ser o mesmo de colocar

Código:
03A4: thread 'EX'


Mas atenção, isso só funciona com os opcodes que foram citados na lista acima.

2. Comentários
Comentários... ai ai, o que são comentários?
Comentários são segmentos ignorados pelo compilador, no Sanny Builder os comentários são feitos através dos caracteres // e {} para varias linhas.

Exemplo:

Código:
// Comentário de uma linha...
e tem o de varias linhas:
{ Comentário
de
varias
  LINHAS!!!!!!!!
=P}

Tudo que estiver após o // será ignorado pelo compilador do mesmo modo que...
Tudo que estiver entre os {} serão ignorados pelo compilador.

Não ficou claro?

Código:
// Vejamos os exemplos...
0001: wait 1000 // >> Isso aqui vai ser ignorado, o opcode será compilado.
//0001: wait 1000 Ignorado, ou seja essa linha não vai ser compilada, consequentemente o opcode também não vai ser compilado
0001: wait 1
{ Tudo isso abaixo vai ser ignorado
0@ = 4
:label
0001: wait 1000
00D6: if
0@ == 4
004D: jf @label
Fechado o comentário de varias linhas com um }
// Como eu fechei o comentário acima, já pode ir compilando normalmente abaixo
0001: wait 1000

Normalmente eu uso para tirar a operação de algumas coisas da minha script sem remover as linhas.

Faça um experimento, abra o Sanny Builder escreva alguma coisa em uma linha e aperte CTRL+Q.

Tudo bem ate agora?

3. Parâmetros
Tudo após o opcode são parâmetros (Tirando letras fora de '_' ou "_"), na verdade as lindas letras escritas após o opcode são apenas estéticos, para você entender o que cada código de operação faz...

Código:
0001: 1000
0001: Espere 1000 Milisegundos

O Que você entende por 0001: 1000? é, realmente não muita coisa... Justamente por isso temos as "descrições" após o opcode, na hora da Compilação essas "descrições" são totalmente ignoradas como visto ali em cima.
(Todos sabíamos que WAIT significa ESPERAR? Se não, agora esta sabendo...)

Voltando ao assunto de Parâmetros...

Código:
0001: wait 1000

Qual o parâmetro do opcode 0001? Simples, é o 1000!
Quantos parâmetros temos no opcode 0001:? Somente 1...

Código:
0169: set_fade_color_RGB 0 255 100

Quantos parâmetros temos nesse opcode? 3, Quais são eles? 0, 255 e 100. =P

Código:
016A: fade 1 time 50

Quantos parâmetros neste? 2, São eles 1 e 50.

Código:
016B:  fading

Quantos? é... Nenhum

Temos diversos tipos de parâmetros eles não são somente numeros, como por exemplo no seguinte opcode:

Código:
0109: player $PLAYER_CHAR money += 1000000

Temos 2 Parâmetros
$PLAYER_CHAR é o Parametro 1
1000000 é o Parametro 2

Isso você já entendeu, estou certo? Então vamos aprender os tipos de Parâmetros.

3.1. Tipos de Parâmetros
Temos vários tipos de parâmetros.
São eles:

Integer ou Inteiro ou Int
São numeros... Exemplo: -20 ,12 , 1, 9, 856, 1000 e etc... Muitas possibilidades =P

Float ou Real ou Floating Point
São numeros decimais... Exemplo: 2.4 ,2.117 , 500.9, 20.12 e etc..

Models ou Modelos
São identificadores de modelos, exemplo: #CHEETAH, #AK47

Variables ou Variaveis ou Vars
São variaveis, explicarei mais sobre elas em breve... Exemplo: 1@, $5, s$984, 31@s, v$291, 142@v

Short Strings
São cadeias de caracteres (Textos), normalmente tem 8 bytes curtos, exemplo: 'GYM1', 'LC-481'

Long Strings
São textos longos.... exemplo: "Esta tudo indo bem ate agora?, espero que sim =)"

Labels
São pontos para onde a script deve pular ou coisas parecidas, explicarei mais em frente.... exemplo: @MAIN_117


4. Threads

Algo dificil de explicar...

Um exemplo que podemos utilizar é os mods, cada mod esta fazendo uma operação diferente no mesmo momento, cada mod usa uma THREAD diferente, diversos recursos do GTA estão em diferentes threads, como por exemplo a Ammu-Nation é uma thread separada das outras.

Vou utilizar por exemplo os meus mods MP3 Player e Moto Taxi, e em conjunto a missão Sweet's Girl (Que também é uma thread).
A Missão Sweet's Girl começa, e assim inicia sua thread, eu preciso ir rápido ate o lugar marcado no mapa, então eu chamo a Moto Taxi, a thread do moto taxi estava o tempo todo rodando esperando você chamar uma moto taxi (Assim como dezenas das threads do GTA)... Enfim a moto taxi chegou, eu gostaria de ir pelo caminho ouvindo uma musica, então a thread MP3P (do mod MP3 Player) faz as operações necessárias para isso. Ou seja as 3 threads + outras dezenas do seu GTA, estão fazendo diferentes operações, no mesmo momento...

Tudo bem ate aqui?...
Para criar o seu primeiro mod, você vai precisar inicia-lo com uma thread (apos a diretiva CLEO).
thread 'NOMETH'
Não use threads com nomes longos (Use no máximo 8 caracteres) e de preferência não repita os nomes delas...


//Para finalizar a thread CLEO que esta sendo executada, use:
0A93: end_custom_thread

//Para finalizar uma thread CLEO que não seja a que esta em execução, use:
0ABA: end_custom_thread_named 'NOME'

//Para finalizar uma Missão ou Thread do main.scm\script.img, use:
0459: end_thread_named 'INT'

//Para finalizar a thread da missão\main.scm\script.img que esta rodando no momento, use:
004E: end_thread

NOTA: Para finalizar seu mod CLEO você deve utilizar 0A93: end_custom_thread, o 004E: end_thread, não funciona em CLEOs ;)

exemplo 1 :

Código:
{$CLEO}
thread 'EXEMPLO'
:LABEL
wait 0
0ACA: show_text_box "Finalizando Thread CLEO: EXEMPLO"
0A93: end_custom_thread // thread acabou aqui
// Daqui para baixo nada mais será lido.

Exemplo2:
Imagine duas threads em arquivos .cs diferentes (File1.cs - thread: FF1 e File2.cs - thread: FF2)
Então, eu desejo finalizar a thread FF2 (do File2.cs) pelo File1.cs (Que é a thread FF1), como fazer?

Código:
{$CLEO}
thread 'FF1'
0ACA: show_text_box "Finalizando Thread CLEO do outro arquivo (FF2)"
0ABA: end_custom_thread_named 'FF2' // Thread FF2 Finalizada, Arquivo File2.cs "terminou" sua execução.
// Daqui para baixo vai continuar lendo, afinal eu NÃO finalizei a thread desse arquivo (FF1).

Sobre o NOP 0000:
NOP significa "NO oPeration", ou seja o opcode NÃO FAZ NADA, porem o opcode NOP 0000 tem uma "função especial", entre aspas, ele evita um pulo para o offset 0 (Explicarei em breve sobre), se o Sanny te dar um aviso sobre o pulo ao offset 0, basta colocar o NOP 0000: ou uma thread após a directiva CLEO, ou ate mesmo outra coisa...

5. Jumps e Labels
Pegarei como inspiração de explicação sobre labels do Conding Bible 1 (Sanny Builder > Help)

Imagine que cada thread é um LIVRO, esse livro tem diversas paginas... pois bem, essas paginas são as LABELS.

Exemplo:

Código:
:PAGINA_1
// Li
:PAGINA_2
// Continuei Lendo
:PAGINA_3
// Estou Lendo

(Veja, as labels são representadas por : (dois pontos) no inicio de alguma linha)

Isso foi apenas um exemplo, não leve ao pé da letra...
Essas labels presentes no código acima não tem nenhum tipo de utilidade, eu poderia somente utilizar a :PAGINA_1, porque? o motivo é que eu não realizei nenhuma operação que envolvam qualquer pulo para um pedaço de código...

A unica utilidade que eles tem é para indicar pedaços de códigos, para jumps por exemplo, utilizar nas suas operações...

Jump? Mas o que é isso? um pulo? Sim, um pulo para uma label.
Vamos exemplificar:

Código:
:PAGINA_1
// Li
// Não quero ler a pagina 2, então vou "pular" para a pagina 3.
jump @PAGINA_3 // Pulei para a label PAGINA_3, ou seja a PAGINA_2 não vai ser lida.

// Nenhum código abaixo será lido, porque eu pulei para a Pagina_3

:PAGINA_2
// Pagina dois nunca foi lida

:PAGINA_3
// Li
0A93: end_custom_thread // Fechei o livro =P

Entendeu como funciona? usamos o JUMP (ele não precisa do opcode no Sanny Builder, mas o seu opcode é 0002), para pular para a PAGINA_3.

Atenção: Coloque WAIT 0 embaixo de todas as labels para dar processamento ao jogo e não crashar! (o correto seria usar em todas as labels de loop, mas em fase de aprendi use em todas as labels para não se confundir)

Veja a animação abaixo:



Após essa é inacreditável você não ter entendido os jumps e labels =P

A Algumas teclas no Sanny Builder que pode nos auxiliar a ir e voltar uma label...



(esta imagem é animada mas perdeu a animação, a imagem mostra o cursor de digitação indo para a label :PARTE_3 e voltando para o JUMP @PARTE_3)
Ctrl+Num 2 faz você ir de um @ ate a : correspondente a label...
Ctrl+Num 8 faz ao contrario, você vai da : ate a @ mas você precisa ter dado algum Ctrl+Num 2 naquela label antes...

EMBREVE CONTINUAÇÃO

Admin
Admin

Mensagens : 56
Data de inscrição : 19/03/2013
Idade : 46

http://coisas-nessesarias.webnode.com

Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo

- Tópicos similares

 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum