sábado, 14 de novembro de 2009

Criando a Primeira Missão p1 - Metralhadoras, Veículos e Comboio

Bom pessoal...

Nesta semana dei mais uma estudada no editor e nos fóruns da codemasters, e já consegui juntar informação suficiente para criar uma primeira missão, com objetivos primários, secundários, e até um scriptzinho inteligente para trabalhar detecção de inimigo.
Não cheguei a criar a missão para o blog, portanto, irei pegar a missão que tenho pronta, dissecá-la e tentar explicar passo a passo. Portanto não sei quantos posts levarei para explicar tudo, mesmo porque é muita coisa para um post só.
Vamos ao que interessa. O que há na missão ?
Unidades Customizadas, com armas Night Ops e Silienciadas.
Formação de Comboio (não basta apenas dar o move em formação columns).
Rendezvous Points.
Apoio aéro inimigo.
Objetivos Primários e Secundários.
Veículos normais e estáticos.

Começe baixando o arquivo da missão aqui
http://rapidshare.com/files/313223222/CP_M1.rar.html



Vocês não irão conseguir abrir o arquivo direto em seu editor porque no arquivo existem unidades customizadas. Para você conseguir "ler" a missão, você terá que baixar um arquivo chamado EntityDatabase.xml, que na verdade é o arquivo com a lista de unidades do editor (aliás isso vai ser uma complicação a mais para os modders de addons).. Explicarei mais adiante como alterar o arquivo. Segue o link do mesmo abaixo.
http://rapidshare.com/files/307236748/EntityDatabase.rar.html

Descompacte o arquivo na pasta database do mission editor, que normalmente fica em ...\operation flashpoint dragon rising\Mission Editor\Database
Faça uma cópia do EntityDatabase.xml caso vc queira retorná-lo algum dia.


Vamos então partir diretamente para o que ainda não foi falado no blog.


-Veículos

Ainda não havia falado nada sobre veículos no blog.
Em geral, os "veículos" tanto móveis quanto estáticos irão trabalhar com a mesma palheta de Editor de Propriedades: todos possuem os mesmos atributos para a edição, no entanto veículos móveis possuem mais atributos como armamento, efeitos sonoros e descrição dos lugares no veículo. Segue a imagem com as propriedades padrão de veículos.
Nesta missão existem veículos estáticos ( 4 Metralhadoras em D22 x3y4), veículos blindados (tanto na estação de óleo em D22 x3y4 como os reforços em D21X1Y5), ou de transporte sem armamento ou blindagem (o comboio), e 1 helicóptero

-Tripulação

Tripulação Virtual

Existem 2 tipos de tripulação dos veículos do jogo: as unidades e a "tripulação virtual" assim chamada(que só funciona com veículos blindados fechados). Para informar que um veículo possui tripulação virtual, basta ativar o botao "Has Virtual Crew", e caso ele não esteja habilitado para seleção é porque o veículo apenas permite tripulação "de verdade".



No mapa do mission editor, a indicação de uma unidade com tripulação virtual ou real são bem claras:
O veículo com tripulação real possui "bolinhas" ao lado direito indicando a respectiva unidade.
O veículo com tripulação virtual apenas assume a cor do lado (vermelho para LPA e Azul para USMC) e não possui nenhuma indicação.
Além disso dentro do jogo, veículos com tripulação virtual não permitem que jogadores acessem o driver, gunners ou commander do veículo em nenhum momento.

Tripulação Real

No caso da tripulação real, o procedimento será diferente, apenas mais trabalhoso.
Crie a(s) unidade(s) no mapa que irão integrar a tripulação do veículo. Importante você integrar todos os tripulantes do veículo dentro de um único Echelon. Crie 1 echelon por veículo, caso todos precisem "caminhar" juntos, crie um Squad e ligue os echelons dos veículos no squad.
Crie o(s) veículo(s).


Depois no Editor de Propriedades, no tópico Vehicle (visivel na imagem acima), há uma lista dos lugares disponíveis no veículo, chamada Seat. Basta apenas você selecionar o lugar na lista, pressionar o botão Pick e clicar na unidade que irá ocupar aquele lugar. Assim que você seleciona, a unidade então parece sumir do echelon ao qual estava linkada e irá aparecer como uma boilinha ao lado direito do veiculo.
Por padrão, ao assignar a unidade no veículo, ela já estará dentro dele (mount). O ofp sempre foi assim: ter um veículo assignado não significa que você está dentro dele. Então vc precisa linkar o veículo com a unidade e depois dar o mount para a unidade entrar no veículo. Com o botão pick vc já faz os 2. E caso você queira que o AI inicie a missão fora do veículo, basta selecioná-lo na lista Seat, pressionar o botal dismout e caso você queira que logo no início da missão ele corra e entre no veículo, basta ativar o Botão "Moving at Start", do contrário vc terá que usar a função OFP:mount via script.
Abaixo um exemplo de uma unidade montada, outra apenas linkada e outra sem link algum.




Abaixo um exemplo de um veículo completamente montado.


Metralhadoras

Pessoal, em teoria, para vc tripular uma metralhadora estática, o procedimento é o mesmo. No entanto, pelo que li no forum da codemaster, o jogo está bugado, e o pick do editor simplesmente não funciona no jogo (embora no editor pareça ter funcionado). Portanto teremos que linkar a unidade na metralhadora via funções scripts.
Não adianta você colocar o comando na função onMissionStart(), porque quando o cenário fica pesado e tem muitas unidades, o comando não funciona no início, tem que haver um delay(tempo). Portanto, você pode fazer isso, ou por um timer que irei falar mais adiante, ou por uma triggerzone (como eu fiz na missão).
O procedimento é o mesmo. Crie um echelon (dê um nome a ele), uma unidade apenas; link a unidade ao echelon e só.
Crie a metralhadora e também dê um nome a ela.


Agora, crie a triggerzone com uma distância suficiente para que precise de alguns para que você chegue nela.
Insira um elemento Level Script, que está em Systems -> Scripting. Dê 2 cliques no elemento para abrir o editor e crie função onEnter_nomeDaTriggerZone. Obviamente que a palavra "nomeDaTriggerZone' é para ser substituído pelo nome que você deu a sua triggerzone.
Dentro da função você irá executar o comando OFP:manEmplacementWeapon para fazer a unidade montar no veículo. A função deve ficar assim:
function onEnter_nomeDaTriggerZone(zoneName, unitName) OFP:manEmplacementWeapon("nome_echelon_mg_gunner", "nome_da_metralhadora", "OVERRIDE"); end
Os nomes em Itálico, são os nomes que você deu aos seus componentes no mapa, substitua-os.
Assim que você passar pela trigger, o soldado será montado na metralhadora.
Na nossa missão, a chamada OFP:manEmplacementWeapon está na função onEnter_trEnbIniPin, cujo a trigger trEnbIniPin é a primeira triggerzone logo abaixo das unidades USMC, basicamente no início da missão.

Waypoints

Na nossa missão, existem waypoints para unidades, veículos aéreos e veículos terrestres.
Dêem uma olhada nas coordenadas D22 X3Y4, que na verdade é a Estação de Bombeamento de Óleo, cujo é o objetivo principal da missão.
Notem que ao redor da base existe um único conjunto de Waypoints, que no editor possui um nome: Path Name (ou nome do caminho). Você não tem como nomear um path, ele monta o nome do primeiro waypoint do caminho, com a letra p no final. No caso da missão, o nome do primeiro waypoint é wayBasePatrol, e automaticamente o nome wayBasePatrolp foi gerado no campo Path Name.


Esse path não pertence apenas a um único echelon. Pelo contrário, ela pode ser compartilhada entre diversos echelons de qualquer lado (tanto China quanto Americano). Além disso, você pode fazer o grupo partir de qualquer ponto do caminho(path) e não apenas do início. Aqui por exemplo iremos fazer o echelon GrupoRef2 (abaixo a direita) iniciar o caminho a partir do primeiro waypoint. Já o GrupoRef1 (acima a esquerda) iniciará o caminho a partir do terceiro waypoint. E ambos iniciarão no modo cíclico, ou seja, ao chegar ao fim, o próximo waypoint será o primeiro.
Aqui no caso, utilizarei a função OFP:patrol, para fazer o grupo percorrer o caminho. E farei chamada na função de evento onMissionStart (assim que a missão for iniciada essa função é chamada), como vemos na nossa missão.

function onMissionStart()
...
...
OFP:patrol("GrupoRef2", "wayBasePatrolp", "ECYCLIC", 0, "OVERRIDE");
OFP:patrol("GrupoRef1", "wayBasePatrolp", "ECYCLIC", 2, "OVERRIDE");
...
...
end

Você também pode utilizar a função OFP:move. Não testei a diferença das duas. Ambas percorrem os caminhos dos waypoints (embora o OFP:move também funcione apenas com coordenadas de posições puras). Mas acredito que a diferença esteja no comportamento dos AIS.


Waypoints de Comboios

Apanhei para descobrir como criar um comboio que funcionasse. De início pensei que bastaria apenas eu criar um grupão, colocar todos dentro dos veículos, e mandálos seguir em uma estrada com Doctrine (o antigo Behaviour do ofp1) "At Ease" e em formação Column (coluna, ou a filinha indiana). Nada disso, na missão o comboio sempre saia da formação de coluna para formação linha ou V . Penei muito até que descobri o macete.

Em resumo, você tem que criar todos os veículos separados: crie o veículo que irá liderar o comboio, depois os outros que integrarão o mesmo. Você só irá definir o path, seja com o "Pick Waypoint", seja com o OFP:move ou OFP:patrol para o lider do comboio. Para todos os demais, você utilizará o comando OFP:follow.

Note que dentro da missão, lá na Estação de Bombeamento, exite um jeep e 2 caminhões de combustivel.
O jeep, chamado de jeepComboio, já possui o waypoint linkado direto no editor, e o comando follow para os caminhões(chamados de fuelTruck1 e fuelTruck2), estão na função onMissionStart(). Lembre-se que cada veículo deve possuir sua tripulação em um único echelon, e não se esqueça de nomear esses echelons, pois serão usados na chamada Follow. Aqui na missão, os nomes são EchelonTruck1 e EchelonTruck2.
Depois basta apenas mandar o grupo EchelonTruck1 (que pertence ao caminhao fuelTruck1) seguir(follow) o jeepComboio (estou mandando seguir o veiculo e não o grupo que tripula o jeep); e o grupo EchelonTruck2(do caminhão fuelTruck2) irá seguir o caminhão fuelTruck1.
Ficando assim:

function onMissionStart()
...
...
OFP:follow("EchelonTruck1", "jeepComboio", 30, "OVERRIDE");
OFP:follow("EchelonTruck2", "FuelTruck1", 30, "OVERRIDE");
...
...
end
Bom amigos. Acredito que já existe bastante informação para um tópico só. Ainda resta tratar alguns tipos de movimentos, como o defendPos, rapidMove, SearchAndDestroy, que na verdade todos possuem os mesmos parâmetros, o que muda é a forma com que o AI irá se mover.
Dêem também uma olhada no help do editor, na função OFP:setVehicleMood, que tem a tarefa de definir um comportamento para veículos (agressivo, passivo, etc).
Mais a frente também falarei de reforço aéreo: mount e waypoint dos pilotos.
Fuçem a vontade na missão. É tudo bem simples.

Saudações a todos.

Nenhum comentário:

Seguidores