Pages

domingo, 14 de agosto de 2016

AI Iinteligencia Artificial

Introdução:
-----------

  O que será mostrado neste tutorial é válido tanto para IA no CMD quanto para IA no CNS. Você não precisa ser um grande conhecedor em CMD ou CNS para elaborar uma IA.
É importante, porém, que você saiba as regras a serem obedecidas no CMD. Saber fazer
comandos, ordená-los de forma adequada e conhecer alguns Sctrls e Triggers é importante para o entendimento do Tutorial e também da IA.
  A IA compreende uma seqüência de comandos para ativá-la e as rotinas que serão executadas de acordo com as imposições estabelecidas pelos Triggers.


==============================================
Seqüência de Comandos:
----------------------

A Seqüência de Comandos da IA deve vir antes dos comandos do seu personagem.
Eles são os primeiros a aparecer no CMD. Estes comandos devem ser exclusivos 
do computador, pois caso contrário, se um jogador humano (você) acioná-los sem querer, 
o seu personagem terá "vida própria" e passará a jogar sozinho, sem 
que você tenha o controle dele.

-> Em alguns chars a Seqüência de Comandos vem entre ou depois dos comandos 
do personagem. Façamos da maneira mais fácil, que é colocar 
os comandos da IA no início do CMD.

Exemplo:

[Command]
name = "CPU_1"
command = F, F, F, F, F, F
time = 1

[Command]
name = "CPU_2"
command = a, a, a, a, a, a
time = 1

[Command]
name = "CPU_3"
command = D, U, D, U, D, U 
time = 1

[Command]
name = "CPU_4"
command = F, x, F, B, y, B 
time = 1


[Command]
name = "CPU_5" -> Nome do comando. Poderia ser "IA_5" ou qualquer outro que você quisesse. Para facilitar as coisas agora e depois, sugiro que coloque o mesmo nome
nos comandos, mudando apenas o número, como vê no exemplo. 
          
command = c, z, c, z, c, z -> Comando a ser executado pelo computador. 
O número de dígitos serve também para garantir a exclusividade da IA, a fim de que um jogador humano (você) não possa acioná-la. Por este motivo, dê preferência a 
comandos com elevado número de dígitos. Algo entre 6 a 12 dígitos, por exemplo.

time = 1 -> Tempo para executá-lo. Somente uma máquina pode executar este comando em tão pouco tempo. 1 game-tick = 1/60 = 0,01666... segundo!!! 
Isto é, portanto, humanamente impossível de ser realizado.


De acordo com a probabilidade, quanto mais comandos como estes forem colocados,
maior a chance de a IA ser ativada em menos tempo. Varia muito o número de comandos, 
pois há programadores que colocam 15 e outros que colocam cerca de 50 comandos para a IA. 


==============================================
Setando uma Variável:
---------------------

  Este procedimento serve para que, ao setar uma variável, 
a IA seja acionada durante a luta.
  Primeiro deve-se escolher uma variável dentre as 60 disponíveis para acionar a IA.
Geralmente escolhe-se a Var(59), mas você pode escolher a que quiser, contanto que
a mesma não esteja sendo usada no CNS. Dê preferência a uma Var de valor alto,
para que ela não seja resetada entre rounds, estando, neste caso, 
com um valor maior ou igual ao do parâmetro IntPersistIndex* no CNS.
  Toda variável no início possui valor 0, e para aciná-la deve-se atribuir um valor 
a mesma. Peguemos como exemplo a Var(59) e atribuamos a ela o 
valor 1 usando o Sctrl VarSet.

OBS*: Você deve mudar o valor do parâmetro IntPersistIndex no CNS. 
Se no exemplo a Var é 59, mude para 58. Enfim, basta colocar um valor
inferior a Var escolhida. Fazendo isto ela não resetará entre rounds.

Exemplo:

[Statedef -1]

;-------------------------
; Inteligência Artificial
;==============

[State -1]
type = VarSet
trigger1 = command = "CPU_1"
trigger2 = command = "CPU_2"
trigger3 = command = "CPU_3"
trigger4 = command = "CPU_4"
trigger5 = command = "CPU_5"
trigger6 = command = "CPU_6"
trigger7 = command = "CPU_7"
trigger8 = command = "CPU_8"
trigger9 = command = "CPU_9"
trigger10 = command = "CPU_10"
trigger11 = command = "CPU_11"
trigger12 = command = "CPU_12"
trigger13 = command = "CPU_13"          
trigger14 = command = "CPU_14"
trigger15 = command = "CPU_15"
trigger16 = command = "CPU_16"
v = 59
value = 1

Como vê, 16 comandos podem ser acionados pela IA. 

Coloque tantos triggers como este quantos forem o número de comandos colocados
na Seqüência de Comandos. Então se você colocou 40 comandos para a IA, 
coloque 40 triggers aqui. O básico ao setar uma variável é usar o Trigger 
Command, mas você pode usar Triggerall com o Trigger Ctrl, por exemplo. 

PS: O que foi dito agora deverá ser feito independente do que optou, pela IA 
no CMD ou no CNS. Se você optou pela IA no CMD, faça esta parte logo abaixo de 
"[Statedef -1]". Se preferiu fazer a IA no CNS, faça esta parte logo abaixo 
de "[Statedef -2]" ou "[Statedef -3]".


==============================================
Rotinas da IA:
--------------

1º Exemplo: Rotina de Stand Guard
---------------------------------

[State -1, 1]
type = ChangeState
trigger1 = Ctrl 
trigger1 = RoundState = 2
trigger1 = var(59) != 0 
trigger1 = Random <= 650
trigger1 = P2BodyDist X <= 75
trigger1 = StateType = S
trigger1 = P2MoveType = A 
value = 130

Ctrl -> Apenas se tiver o controle.

RoundState = 2 -> Esta rotina só ocorrerá durante a luta em sí, não podendo
ser acionada nem na introdução e nem no desfecho dela.

Var(59) != 0 -> Ela é de ação exclusiva da IA, não podendo ser executada
por um jogador humano.

Random <= 650 -> A probabilidade de isto ocorrer é de 65%. Desta forma, há 35% de chance de o personagem atacar também. Assim ele não fica somente na defesa.

P2BodyDist X <= 75 -> O oponente deve estar a menos de 75 pixels de distância.

StateType = S -> O personagem deve estar em pé, já que a própria 
defesa é Stand (130).

P2MoveType = A -> O adversário deve estar atacando.


=====================================

2º Exemplo: Projétil
--------------------

Neste exemplo, o personagem lança um projétil qualquer contra o oponente.

;Esfera de Fogo
[State -1, 2]
type = ChangeState
trigger1 = Ctrl 
trigger1 = RoundState = 2
trigger1 = var(59) != 0 
trigger1 = p2bodydist X >= 140
trigger1 = Random <= 400
trigger1 = statetype = S 
trigger1 = p2statetype != C
value    = 1200

Diferenças em relação ao primeiro exemplo:
- Distância em relação ao oponente em que a IA executará a rotina: X >= 140 (pixels)
- Probabilidade de a rotina ocorrer: 40%, Random <= 400
- Dependendo do projétil, o adversário não pode estar agachado. "P2statetype != C" 

Coloquei este segundo exemplo para que você perceba o que é básico em uma rotina.
Triggers que definem controle, distância, probabilidade e estado do personagem são
fundamentais. A criatividade e bom senso do programador definirão o que mais será 
colocado na rotina.

-> Se for usar trigger2, 3, 4 e assim por diante, coloque "RoundState = 2" 
e "var(59) != 0" em Triggerall. A ordem das rotinas pode ser qualquer uma.
O importante é a chance de ocorrência da rotina (usando-se Random, GameTime,...).


-----------------------------------------------------------------------------------
  As rotinas, tanto no CMD como no CNS, são parecidas. Mas há particularidades,
como as que estão logo abaixo. 

Rotinas no CMD:
---------------
Assim como a Seqüência de Comandos vem antes dos comandos do seu personagem,
as rotinas da IA também devem vir antes das rotinas do seu char. 
Nas rotinas feitas nesse arquivo deve-se usar "State -1". 

Rotinas no CNS:
---------------
São parecidas com as do CMD, mas nas rotinas no CNS deve-se usar  
"State -2" ou "State -3". Alguns programadores optam por fazer as rotinas em outro 
arquivo CNS, mas isto não é regra, apenas para ficar organizado.

Para ser mais claro, em ambos os casos as rotinas vêm logo abaixo do Sctrl VarSet.

Exemplo:

Se fosse no CMD, teríamos:

[Statedef -1]

;-------------------------
; Inteligência Artificial
;==============

.
.
.
trigger13 = command = "CPU_13"          
trigger14 = command = "CPU_14"
trigger15 = command = "CPU_15"
trigger16 = command = "CPU_16"
v = 59
value = 1

(Coloque as rotinas a partir daqui, em "State -1")


Se fosse no CNS, teríamos:

[Statedef -2] ou [Statedef -3]

;-------------------------
; Inteligência Artificial
;==============

.
.
.
trigger13 = command = "CPU_13"          
trigger14 = command = "CPU_14"
trigger15 = command = "CPU_15"
trigger16 = command = "CPU_16"
v = 59
value = 1

(Coloque as rotinas a partir daqui, em "State -2" ou "State -3") 


-> Nas Rotinas, o Sctrl ChangeState é o mais usado, já que é ele
que muda o estado do personagem. 
Porém, verifica-se em alguns personagens o uso de Sctrls como
PowerAdd, PowerSet, LifeAdd em seus CMDs. 
Sctrls como AssertSpecial, Helper, Explod, HitBy/NotHitBy, Playsnd 
são alguns exemplos que podem ser aplicados na IA feita no arquivo CNS.
Lembre-se de colocar em toda rotina, seja qual for o Sctrl, 
os triggers "RoundState = 2" e "Var(59) != 0". 
Eles são muito importantes (explicado no 1º exemplo de Rotinas da IA).

-----------------------------------------------------------------------------------

Espero que o tutorial o auxilie durante a criação de Inteligência Artificial.

Boa Sorte,

0 comentários:

Postar um comentário

Mapa