Ships Battle
Origem e Motivação
O nascimento desse projeto se deu pela vontade de seu membro idealizador criar um jogo desse genêro, tanto pela vontade de aprender mais sobre o desenvolvimento de jogos 3D como pelo gosto dessa área. A idéia do jogo surgiu quando começamos a ver aspectos sobre computação gráfica tri-dimensional, mas foi só depois quando o grupo começou o desenvolvimento do Circuit of Mana, e da decisão de adicionar suporte à jogos 3D na nossa engine para o desenvolvimento do Circuit que esse jogo começou a tomar forma "fisica", sendo criado paralelamente ao Circuit e usando a mesma engine.
Plataforma
O Ships Battle (nome work-in-progress) é um jogo desenvolvido com a UGDK, e portanto roda em PC/Linux/MacOS e está sendo desenvolvido primariamente em C++ com poucos scripts em Python. Ele será feito em 3D, com visão primariamente third-person mas com possibilidade do jogador mudar o modo da camera (em relação a sua nave). A interação será feita por teclado/mouse ou por gamepad. Suporte a multiplayer se dará através de networking.
Principais Características
Tri-dimensional: o jogo será em 3D (duh)! Não só os gráficos mas também a jogabilidade, permitindo que naves se movam livremente nos 6 graus de liberdade (translação e rotação nos 3 eixos), dado que as capacidades da nave permitam. Além disso grande cuidado será dado à simulação física para que tudo isso aconteça de (quasi) real, com as naves podendo sofrer com a gravidade, inércia e outros fatores.
Customizabilidade: ou modability, em inglês. O foco do jogo é as naves, e tudo nelas poderá ser customizado pelo jogador, desde o modelo geométrico até as características dos sistemas internos dela como armas, escudos e até as inteligências artificiais. Além de outras partes do jogo, como mapas, que também poderão ser customizados.
Descrição
A idéia do jogo é que o jogador controlará sua nave espacial em missões, tendo que pensar taticamente para conseguir triunfar sobre seus inimigos e atingir seu objetivo, explorando as capacidades de sua nave e fraquezas dos oponentes.
Um ponto importante do jogo é a customizabilidade das naves, com o propósito de cada jogador ter a "sua nave", e a capacidade do jogo de analise da capacidade das mesmas para poder estimar se um dado conflito entre um conjunto de naves está balanceado.
Missões
A princípio a forma mais básica de missão é uma simples batalha contra um inimigo, e quem terminar vivo vence. Porém nesse modo simples ainda poderemos ter mais de duas equipes competindo, compostas de naves controladas por jogadores humanos ou de inteligência artificial (IA). Também será possível que jogadores humanos formem esquadrões ou frotas com outros ou principalmente com as naves IA, podendo passar ordens a elas para que funcionem mais eficientemente em grupo numa batalha.
Nada impede de criarmos outros modos de jogo seguindo essa idéia de jogabilidade, por exemplo, alguma forma de defesa de uma área outra de outra entidade. Ter uma campanha no jogo, ou seja, uma sequência de missões que segue e apresenta uma história também é uma idéia boa mas a princípio não temos nenhuma idéia de história para criar uma campanha.
Detalhes
Esses são os detalhes atuais de funcionalidades do jogo, como determinadas em sua concepção inicial e atualizadas ao longo do tempo.
Mapas
- Espaço 3D grande, aberto, possivelmente com fronteiras pra limitar movimento e possibilitar transição pra outro mapa fronteiriço, ai isso daria a noção de uma mapa no espaço mesmo e não só uma região de jogo.
- Possíveis objetos de mapa: outros corpos celestes, como planetas, luas, estrelas, asteróides, etc
- Fenômenos fisicos como luz, gravidade, e outros.
- Modelo com possivelmente sub-modelos móveis (como motores).
- Esquema de hardpoint dos sistemas na nave, para determinar o espaço no modelo da nave que tal sistema ocupa. Como cada sistema poderá ser danificado/afetado separadamente, tal região também indica que se ela for atingida por armas inimigas tal sistema será danificado.
- Sistema para calcular “SCORE” da nave, para classificar ela. Score total (seguindo algum padrão) e Score para cada sistema:
- Armas: levar em consideração DPS (fire rate, dano, cooldown, etc), gasto de energia e possível limitação de direção de tiro. Em caso de projéteis, também as capacidades do projétil (velocidade, manobrabilidade, alcance, etc)
- lembre-se de energia necessária para cada sistema
- Sistema de controle da grade de energia: como a energia gerada pelo reator é dividida entre os sistemas da nave, sendo que sistemas tem um requerimento básico, e menos que isso faz eles ficarem piores, mais energia melhora eles.
- Sistema de gerenciamento de reparos dos sistemas durante batalhas.
Motores
- FTL (faster-than-light): para viagem entre mapas.
- Sub-FTL (FTL in-system): para grande velocidade para a frente da nave dentro do sistema, charge-up e tal como FTL.
- Impulso: velocidade váriavel (baixa-alta), gasta energia, direção limitada (ou fixa ou necessita que motores sejam rotacionados -> direcionalidade do motor), usado para movimento normal num mapa. Posicionamento do motor na nave e direção de empuxo podem acarretar rotação (que por padrão tentará ser compensada pelos thrusters).
- Thrusters: motores simples para manobração, velocidade bem baixa, quase nada de energia, direção básica para onde o thruster aponta e sua posição na nave determinam a rotação que ele causará na nave.
Armas
- Sistema de charge/fire separados, com eventos e hooks pra scripts separados, sendo que se atira quanso carrega X ou não é variável (pode ser possível ou não, automatico ou não, dependendo da arma/AI).
- TIPOS: projéteis (com munição ou não (recarregáveis)) e raios.
- Possivelmente grupos de armas diferentes em uma nave para classificar elas (como pulsos, raios, torpedos, etc)
Sistemas Básicos
Conjunto de sistemas básicos que estarão presente em todas naves de alguma forma:
- Motor FTL
- Motor Impulso
- Motor Thrusters
- Armas
- Sensores
- Escudos
- Reator de energia
- Centro de comando: sistema que comanda a nave, a "ponte" como é comum em histórias de ficção científica e na marinha.
- Centro de reparos: sistema que gerencia o reparo de outros sistemas durante uma batalha.
Enquanto todas naves terão esses sistemas (no nivel de implementação do código), pelas caracteristicas delas alguns sistemas podem ser "opcionais", por exemplo, você poderá fazer uma nave sem escudos, ou sem uma classe de motores.
Controle
- Normalmente o jogador que controla a nave (duh) pelo formato de input que ele acha melhor (teclado/mouse ou gamepad, talvez até pelos olhos se o mestrado de um membro do grupo der resultados)
- Possibilidade de delegar coisas pra AI (exemplo: AI atira um grupo de armas enqto player controla o resto)
- Visualizador gráfico da capacidade de movimento (rotação/translação) para cada direção, de acordo com motores (impulse/thrusters, no estado atual).
- Esquema de controle decente para possibitar uso de todos movimentos possíveis da nave (rotação e translação em 3 eixos -> 6 graus de liberdade)
Customização
O jogo terá vários aspectos customizáveis. A principio, pelo processo de desenvolvimento dele, tais coisas serão feitas externamente ao jogo, mas a idéia é que para cada um desses quesitos customizáveis exista uma forma (um editor) in-game para customização (criação e edição de conteudo). Eles são:
- Naves, partindo de partes prontas ou talvez até de scriptar suas próprias coisas, além de ter seus modelos e hardpoints.
- Edição dos hardpoints (caracteristicas dos sistemas de uma nave) é mais simples (que a outra parte) e será mais completo.
- Criação de sistemas novos para a nave (como armas especiais) provavelmente necessitará de algum aspecto de programação por parte do criador, mais sobre isso depois.
- Criação/edição do modelo fisico da nave é algo mais complexo e existem programas profissionais bem complexos que tratam disso. Portanto se criarmos algo assim in-game será um formato bem simplificado, provavelmente criando a nave seguindo algum algoritmo de geração procedural ou de criação por partes prontas.
- Módulos de AI pra sua nave, assim a AI dele se preocupa em gerenciar uma parte da nave (ou ela inteira) seguindo suas instruções enquanto o jogador controla outra, para simplificar a necessidade de input e micro-management do jogador, sem sair do contexto de uma nave espacial - afinal de contas, não é estranho imaginar que numa nave de tamanho razoável terá uma certa pessoa (AI) para cuidar de cada aspecto.
- As AIs serão especificadas por um formato de árvore de decisão com blocos, onde cada bloco representa um aspecto (uma ação, um teste, etc). Existirão vários blocos já feitos para usuários criarem suas AIs.
- Blocos novos também poderão ser criados pelo usuário, mas isso provavelmente necessitará de algum aspecto de programação por parte do criador, mais sobre isso depois.
- Mapas: região de espaço, posicionamento no "espaço"/"galáxia" do jogo, definindo elementos do mapa como planetas, asteroides, e outros corpos celestes e suas propriedades como gravidade, iluminação, etc.
Batalha (formato básico)
- N vs N naves, possivelmente com times (ai seria N1 vs N2 vs N3 ...)
- Balanceamento: partindo do SCORE das naves envolvidas, que nos dá uma estimativa da capacidade de cada time, dar opções para balancear o jogo:
- Alterando equipes equilibrando soma dos scores (mudando um jogador/nave de lá pra cá)
- Adicionando wingmens para um jogador ou equipe: outras naves totalmente controladas pela AI mas que podem receber comandos de algum jogador, e seguem o padrão/AI de frota do jogador/equipe. As classes de naves tem que ser preferencialmente das do mesmo tipo usada pelo jogador/equipe em questão.
Possíveis Extensões (para o futuro)
- Outros modos de jogo, como:
- Galaxy conquest / war simulator
- Campanha (single/coop/ competitiva? ), sendo que campanhas poderiam ser criadas por usuários também.
- Possibilidade de invasão de naves para danificação e possível captura delas. Isso poderia adicionar outro “sistema” da nave: segurança
- Tripulação:
- Crew: tripulação básica, pode alocar elas pra um sistema ou outro da nave (até reparos) para melhorar desempenho daquele sistema
- OFICIAIS: ver abaixo
- OFICIAIS: seria um recurso do jogador pra usar ao longo do jogo inteiro (com qualquer nave), meio como um elemento de RPG
- cada sistema da nave pode ter slot pra N oficiais (poucos, normalmente 1), um oficial lá pode melhorar desempenho ou até habilitar alguma feature/habilidade nova
- cada oficial tem um sistema de XP q ele ganha trabalhando num sistema, quanto mais XP melhor o buff dele naquele sistema
- se tiver boarding, oficiais podem ter vida e coisa de segurança assim como crew, mas eles são melhores, talvez fiquem no centro de controle da nave ou naquele sistema onde ele tá alocado, e podem batalhar na segurança da nave e até morrer
- mas se tiver boarding, deveremos pensar melhor em como adquirir outros oficiais.
Desenvolvimento
Esse jogo está sendo desenvolvido seguindo a forma de milestones (marcos de desenvolvimento: A idéia é que a primeira milestone contenha as funcionalidades básicas do jogo (como representação de uma nave e de sistemas básicos), e a cada milestone novas funcionalidades sejam adicionadas, de tal forma que cada milestone quando terminada represente um jogo já usável mas talvez não completo nem divertido ainda mas melhor que o anterior.
Desenvolvimento desse jogo começou junto com o Circuit of Mana e do suporte 3D da UGDK. Por tanto, o jogo está sendo desenvolvido lado a lado com a UGDK 3D. Mas esse jogo, por só ter um membro do grupo trabalhando, está progredindo de forma devagar, com pausas no trabalho devido às responsabilidades acadêmicas de tal membro.
Primeira Milestone
A "primeira milestone", ou seja, a primeira versão "usável" do jogo ainda está em desenvolvimento, e os aspectos a serem trabalhados estão listados como Issues no repositório do projeto no GitHub do USPGameDev.
Aspectos Técnicos Interessantes
Sendo um dos dois primeiros jogos 3D desenvolvidos pelo grupo, já enfrentamos alguns desafios na implementação. Alguns desses desafios foram resolvidos de uma forma interessante (que nos dá um tanto quanto de orgulho) e achamos bom listá-las aqui:
Cascata de Dano
Cada sistema numa nave ocupa uma região no modelo da nave, possivelmente sobreposto com outro sistema. Além disso, a nave em si (o modelo dela), é um sistema - o "casco" da nave, que se for destruido a nave também é. O desafio é saber quais sistemas tem que ser danificados de que forma, dado as caracteristicas da arma que atingiu a nave, e em que ponto ocorreu o impacto.
Para resolver isso, usamos o sistema de colisão da UGDK, a engine de física Bullet. Nessa engine, especificamos "mundos" de colisão, que contém objetos que colidem entre si. Assim, um mapa é um mundo com as naves e projeteis (e outros) que colidem entre si. Mas cada nave também é um mundo de colisão próprio, com cada sistema sendo um objeto nesse mundo, e o impacto de uma arma é outro. Com isso, a engine de colisão nos diz (de forma correta e muito eficiente) quais sistemas foram atingidos.
Sistema Linear de Movimento
Uma nave pode conter N motores, e cada motor pode apontar seu empuxo para uma região em relação a nave, e aplicar empuxo (força) entre seu empuxo máximo e nada (desligado). Além disso a cada dado momento só quer se mover a uma determinada direção em uma determinada velocidade.
Para resolver isso foi necessário implementar como resolver um sistema linear de equações no jogo, para cada nave conseguir determinar quais motores ligar em uma direção, sob uma potência, para que a nave se movimente na direção desejada com a potência desejada.