Game Design

Game design related posts

Existence – Postmortem

Olá pessoal! Mais um post no blog, desculpem pela falta de atividade nessas últimas semanas, então… No último final de semana participei pela nona vez a Ludum Dare, e aqui vai um post mais extenso, mostrando um pouco do meu processo.

Link para o jogo.

Game Design

Após sair o tema Shapeshifting, comecei a pensar em alguma coisa, mas queria sair do óbvio que era fazer com o que o jogador tomasse (literalmente) formas diferentes. Então como tinha assistido “Angel Beats” dias antes, pensei em algo depois da morte. Comecei a pesquisar coisas assim, e acabei chegando nessa página da wikipedia, sobre as três marcas da existência, por isso o nome Existence e adaptei os nomes dos três NPCs (Verdade, Abnegação e Coragem). Então o jogador, está morto, e meio que inspirado em “Grin Fandango”, ele está numa jornada para (no caso desse jogo) renascer. Ao completar cada quests dos NPCs a aparência do jogador se transforma, ganha uma nova forma para representar a jornada de não apenas uma vida, mas de qualquer pessoa. Isso é basicamente a ideia do jogo.

Então já estava na cabeça que queria fazer um jogo de plataforma, mas para ser interessante, seria bom um combate!! Meus jogos anteriores de plataforma eram de plataformas com puzzles, então queria fazer algo diferente. A mecânica de combate inspirada em vários jogos de plataforma como: “Muramasa Rebirth”, “Guacamelee”,  “Dust: An Elysian Tail”.

Image2

Para dar mais profundidade ao jogo, queria dar elementos de aleatoriedade, então coloquei a mecânica das cartas. Ela foi inspirada na mecânica de manipular os documentos de “Papers, Please”, a Unity UI tem API bem simples para fazer drag’n’drop dos elementos da UI, e é bem rápido fazer algo com ela.

Outro detalhe, é que o jogador pode atacar os NPCs, mas eles avisam para o jogador se preparar, pois eles vão revidar. Se o jogador provocar todos os 3 NPCs, o jogo passará a ter um tom avermelhando. Uma surpresa para os jogadores, já que alguns irão atacar os npcs outros não. E se o jogador matar um NPC, ele não é mais obrigado a completar aquela quest, mas essa ação leva para um final ruim do jogo: o sofrimento eterno.

Itens

Como o todo jogo de combate, é importante ter itens e alguma progressão. Para isso determinei esses itens:

  • Coração: Recupera 10% do máximo de pontos de vida. São dadas pelos inimigos e caixas.
  • +1: Dá uma vida. São dadas pelos inimigos e caixas
  • Cartas Roxas: são dadas apenas pelos inimigos.
    • Aumentam até 3 atributos:
      • velocidade de movimento (3 níveis)
      • dano do ataque (4 níveis)
      • cooldown do ataque. (3 níveis)
    • Estes valores são determinados pelo número de inimigos atributos:
      • Até 5 inimigos são cartas básicas que aumentam só um dos atributos.
      • Até 15 inimigos são cartas que aumentam apenas dois atributos.
      • >= 15, aumentam qualquer valor.
  • Cartas Amarelas: são dadas pelos NPCs ao completar uma quest.
    • Aumentam a vida do jogador
    • Aumentam o número de golpes no combo
    • Alteram visualmente o jogador para uma nova forma.

Inimigos

Também precisamos de inimigos, aqui são as principais regras deles:

  1. Cobra Normal (isolada): 3 pontos de vida, 1 ponto de ataque.
  2. Cobra Preta (isolada): 8 pontos de vida, 3 ponto de ataque.
  3. Cobra Normal (na zona de combate):
    1. Pontos de Vida: 40% dos pontos de vida do jogador, mas tem 10% de chances de ter 70% da vida do jogador.
    2. Pontos de Ataque: 60% de pontos de ataque do jogador, mas tem 10% de chances de ter 150% dos pontos de ataque do jogador.
  4. Cobra Preta (na zona de combate)
    1. Pontos de Vida: : mesmo cálculo da cobra normal + 3.
    2. Pontos de Ataque: mesmo cálculo da cobra normal multiplicado por 2.

E as cobras também um ponto fraco: elas recebem stum se o jogador pular em cima delas, e uma cobra pode dar stun na outra, acaba deixando o jogo meio cômico, outra coisa importante, foi deixar os ataques das cobras bastante telegrafados, para o jogador desviar deles. Também deixei um tempo relativamente grande, para deixar o jogo mais fácil, num jogo, de jams especialmente, é bom ajudar e conduzir o jogador chegar até o fim.

Arte

Como o jogo se passa num purgatório, pensei que ambientação seria no Paraíso, um lugar verdejante com bastante água. Usei essa imagem como referência para o cenário.

paradise1

Em seguida foi fazer o tileset com o Asesprite e o Clip Studio Paint.

Tilemap

Depois vieram os sprites dos personagens (com muitos frames!!). O sprite do jogador tem 4 formas, porém para economizar, as 3 outras formas e o NPCs foram feitos apenas modificando a primeira forma, assim deu tempo de fazer todas essas animações.

  • Parado (2 frames)
  • Andando (4 frames)
  • Pulando (2 frames)
  • Down (2 frames)
  • Ataque1 (4 frames)
  • Ataque2 (4 frames)
  • Ataque3 (4 frames)
  • Hit (2 frames)
  • Morte (13 frames)
  • Transformação (6 frames)

Totalizando 172 frames para o jogador.

Para o NPCs:

  • Parado (2 frames)
  • Andando (4 frames)
  • Pulo (2 frames)
  • Down (2 frames)
  • Ataque1 (4 frames)
  • Ataque2 (4 frames)
  • Ataque3 (4 frames)
  • Hit (2 frames)
  • Morte (3 frames)

Totalizando 37 frames para os NPCs.

Para a Cobra:

  • Parado (4 frames)
  • Andando (4 frames)
  • Jump (4 frames)
  • Hit (2 frames)
  • Morte (14 frames)
  • Stun (2 frames)
  • Ataque1 (4 frames)

Totalizando 34 frames para a Cobra.

Somando tudo, dá 243 frames apenas para 3 elementos do jogo! Mas para conseguir esse volume de frames, foi preciso fazer o trabalho da forma mais rápida possível, além de utilizar a PSDAnim, durante o processo de produção e exportação desses frames. Outro elemento que ajudou a dar mais variedade, foi a utilizada da DPSpritePalette, para criar variações de cores desses sprites dentro do jogo rapidamente!

Em seguida, para o design das cartas, tive a ajuda da Keli que as fez no domingo, e utilizei o que ela fez como base para os elementos da interface (botões, fundos, etc).

Level Design

Durante as primeiras ideias nas primeiras horas decidir que jogo terá 2 quests: liberar o caminho da água da Abnegação e coletar a carta da Coragem. Domingo, coloquei essa ideia no papel, e dividi a fase em áreas menores com certas funções:

e8b7980831d0bed17ee5fac5ff5ea798

  1. Início: o jogo começa com as cores meio estranhas, para fazer o jogador sentir a estranheza do mundo, e tem como função fazer o jogador se acostumar com os controles básicos (andar, pular), ter a primeira experiência de combate contra um inimigo, espinhos, descobrir os checkpoints (caso morra), coletar itens de vida. Ao falar com a Verdade, ao saber que o jogador estar morto, as cores mudam momentaneamente para tons de cinza, e em seguida as cores ficam um pouco mais “normais” e recebe a carta do 2-hit combo.
  2. Combate 1: nessa parte é apresentado a mecânica de combate obrigatório, em que o jogador só continua se derrotar todos os inimigos da área. Isso fiz baseado no jogo Murasama Rebirth, acho que é algo bem legal. Depois um desafio de salto de plataforma, sem grandes perigos. Nesse momento também é apresentada as caixas, que podem ser destruída e dar itens ao jogador.
  3. Quest 1: Aqui o jogador começa pulando mais espinhos, aqui planejava colocar os espinhos junto com alguns inimigos, mas a IA era muito burra e morria facilmente neles (hue). Aparece a Abnegação, que tentei dar mais personalidade fazendo com que ela dê um item de cura para o jogador toda vez que se aproximar. Em seguida o jogador deve subir as plataformas, enfrentar alguns inimigos (pela primeira vez a cobra preta é apresentada), coletar itens e destruir as caixas. Para evitar deixar essa parte muito linear, optei por colocar caminho dos dois lados, com vidas e inimigos em cada lado, para fazer o jogador explorá-los. Ao liberar a cachoeira, entra em ação o efeito de metaballs, as cores ficam no tom natural e é possível ouvir o som da água corrente.
  4. Combate 2: Mais combate para tomar tempo do jogador e fazer ele aproveitar a nova habilidade recebida (3-hit combo).
  5. Quest 2: A coragem diz para o jogador coletar sua carta. Aqui também tentei dar mais personalidade para ela, fazendo ele dizer “apenas para os mais corajosos”. Nesse momento para deixar o jogo mais “tenso”, é feito um efeito de noite, onde apenas os checkpoints são iluminados. Aqui começa uma região de batalhas contra as cobras pretas, que possuem mais pontos de vida e ataque. Ao coletar a carta, o jogador é avisado para voltar para falar com a Coragem e caminho acima é liberado.
  6. Fim: Ao chegar no colisor um pouco antes do checkpoint o evento de end game é disparado, e baseado nas ações do jogador ums dos finais é ativado:
    1. Se provocou os 3 NPCs, vai para o final ruim (3).
    2. Se não provovou nenhum NPC e completou as duas quests, vai para o final bom (1).
    3. Se foi nenhuma das anteriores, vai para o final (2).

mapa

Audio

O audio não tive muito tempo para fazer, já eram 21 horas de segunda, quando comecei a fazer os efeitos sonoros e a música. O jogo que fiz tem muitos feedbacks para o jogador e era preciso muitos efeitos, pelo tempo decidi fazer apenas 14, que considerei essenciais:

Jogador
01- Pular
02- Hit groud
03- Attack
04- Hit
05- Morte
06- Ativar Carta
07- Transformação

Itens
08- Coletar HP
09- Coletar Vida
10- Coletar Carta

Sfx Inimigos
11- Atacar (npc, cobra)
12- Pular (npc, cobra)
13- Hit (npc, cobra)
14- Morte (npc, cobra, caixa)

DvnSfxMaker foi usado em 13 deles e em apenas um gravei minha própria voz. Não tive tempo de manipular esses efeitos individualmente, então só normalizei cada um deles, apliquei um equalização (para para cortar os subgraves e os agudos) e coloquei um compressor com um ratio alto.

cc12775a8781903554894bde648bb18f.png

Para a música dinâmica, usei a técnica de vertical layering exibida nesse vídeo da Winifred Phillips com 4 camadas: base, água, combate e npc. As quatros são iniciadas ao mesmo tempo no jogo e inicialmente as 3 últimas tem volume 0. À medida que certos eventos ocorram uma camada sofre um “fade in”: ao chegar perto de um NPC, o volume da camada npc sobe, se entra numa batalha, acontece o mesmo para a camada batalha, etc. A base é apenas um loop de bateria com um baixo tocando um padrão de 4 compassos. Já a camada de combate, adiciona uma guitarra e adiciona mais notas ao baixo,  preenchendo os espaços vazios da base para deixá-lo mais pulsante. E o npc é apenas um pad fazendo acordes.

e96be171c598fe21eb403eb7ee134ede

Bom, é isso pessoal, até o próximo post!

 

Advertisements

Devlog #05

Olá pessoal! Mais um sábado, mais um devlog!

Nesta semana achei que fiz pouca coisa do projeto.. afinal só me recuperei da Ludum Dare na quarta.. hehe. Então, vejamos… o que foi feito… Incorporar e refatorei  alguns códigos feito na Ludum Dare dentro da DPEngine que é o meu framework base para os meus jogos.

Também fiz um update na DPLoadScreen para suportar a mudanças introduzidas versão 5.3 da Unity e temos uma nova feature: agora é possível fazer telas de carregamento com aquele “Carregamento Completo! Pressione qualquer tecla para continuar”. Logo estará na Asset Store este update!

É isso, de volta a programação normal e espero amanhã trabalhar mais no jogo. Até a próxima semana!

Project 0807 – Portmortem

Olá pessoal! No final de semana não teve updates no blog porque participei da Ludum Dare, uma tradicional competição de desenvolvimento de jogos.

Sshot02

Jogar AGORA!

Sempre quando participo de uma jam entro num modo berserker, em que o tempo se dilata e o sono não existe.

Passei dois dias, cerca de 43 horas só programando, criando sprites e sons apenas de placeholder. O sábado foi basicamente para criar o sistema combate com combos e o domingo passei criando a IA, evolução do personagem, sistema de insanidade, menus e outras coisinhas.

LD

Como estava o jogo 24 horas depois depois do início

Na madrugada de segunda-feira os principais componentes do jogo já estavam prontos, comecei a fazer o level design, e horas depois fui dormir pensando em fazer a arte quando acordar.

LevelDesign

Level Design feito no Photoshop Elements!

Quando acordei nem abri a Unity, senão poderia perder tempo programando algo e abri o Clip Studio Paint para fazer os sprites. Lá eu já tenho preparado meus brushes de pixel art. Então, fiz uma listinha de animações a serem feitas.

526775538b8d907236c93921c3381e6b

Fazendo as animações no Clip Studio Paint junto com a PSDAnim

Ainda bem que não parei para contar quantos sprites eu teria que fazer, senão desistido! Só de animações do jogador e de um inimigo foram quase 300!! Se juntar com os outros assets, são mais de 300!! Para fazer todos esses assets tive que simplificar bastante a arte dos personagens. Mais uma vez, a PSDAnim foi extremamente útil! A PSDAnim não é apenas visualizar, ela foi pensada também para exportar os frames prontos para serem usados. Depois de pronto todos os sprites, todos os arquivos foram processados de uma vez só, por um script em python que estava incluso nas versões antigas da PSDAnim. (na versão atual há um menu para exportar apenas o arquivo carregado).

QUADROS2

Frames exportados de uma vez só!

Quando terminei a arte já eram 7 horas, e precisava integrar todos esses sprites dentro da Unity. Agora outro ponto que preciso automatizar é a criação de Animations e e do AnimationController dentro da Unity! Aí sim, ficará uma toolchain perfeita! Quando terminei essa parte, já eram umas 22 horas. Então foram os detalhes finais: adição da DPSpritePalette para efeitos de mudança de paleta (diferentes tipos de inimigo, quando sobre dano, e efeito de transformação).

Finalmente os últimos minutos foram de play test, e ajustes no level design. Não tive tempo de fazer os  efeitos sonoros finais e de criar as músicas… Mas é isso. Gostei do resultado final, talvez ainda tenha algum bug aqui ou acolá. :P. Agora preciso de mais alguns dias para descansar e voltar com a programação normal do blog! Até!

 

 

DEVLOG #04

Devlog time!

Nesta semana me distanciei um pouco da programação e acabei focando em alguns aspectos de audio. Segunda recebi o serial do Strummed Acoustic que havia comprado na sexta e resolvi passar um tempo brincando com ele. Abaixo você pode ouvir a primeira trilha que fiz com ele. Mas depois descobri alguns usos mais efetivos. É melhor combinar patterns simples e alternar rapidamente entre eles dentro do mesmo compasso.

No dia seguinte, por não ter comprado o Solo Violin da Eastwest, resolvi criar meu próprio patch de violino solo usando samples que estão no freesound.org. Baixei os samples, abri o Structure e depois de 2 dias criando patchs para várias articulações, keyswitches, round-robins, ajustando a posição, volume e afinação de cada sample, cheguei a um resultado que me surpreendeu! Ficou melhor que qualquer patch de violino solo da Miraslov Philharmonic, do Notion e da própria Structure!! Valeu a pena perder esses dois dias com isso. Já tenho planos para fazer outras sample libraries. hehe

structure.png

Por fim, passei mais um dia para fazer uma limpeza dos plugins que eu havia instalado no Reaper. Fui testando cada um e classificando melhor até chegar num número reduzido de plugins.

structure2.png

Bom, é isso. até a próxima semana!

Devlog #02

Mais um sábado, mais um post de devlog!

Nesta semana adicionei várias coisas! Comecei testando a implementação de um reconhecedor de padrões para ser utilizado em alguns puzzles do jogo. Como foi feito? A base de entrada era composta por 6 classes, contendo 8 amostras cada. Em seguida, criei dois classificadores usando o algoritmo k-NN (com k=3 ou 5), sendo que o primeiro utilizaria momentos de Hu para o vetor de características e o segundo apenas o histograma. Escolhi estas características, pois são rápidas de implementar e não tem uma grande complexidade para serem computadas em tempo-real (as imagens utilizadas no jogo são de 128×128 px). Posteriormente, os resultados dos dois classificadores são combinados e classe com o maior número de indicações (os classificadores faz k1 e k2 indicações) é a escolhida. Porém, se ela não atingisse mais da metade dos votos ((k1+k2)/2), o padrão de entrada seria rejeitado. Pois bem, depois de vários testes fui ajustando o classificador, mas a taxa de acerto não estava sendo suficientemente boa. Fim do primeiro dia…

No segundo dia, fiz mais experimentações, e nada satisfatório… Talvez outras características?… Por fim, acabei eliminando este método, pois pensei em outro mais familiar para os jogadores. Imagine a tela de bloqueio do seu celular. Dividi a imagem em zonas, e em seguida calculo o histograma de cada zona. Se o valor dos pixels preenchidos for maior que um limiar, significa que aquela zona foi marcada. Ter um limiar  é importante, pois o jogador pode pintar sem querer alguma zona ao deslocar o cursor de pintura. Outro ponto importante desta forma é valorizar traços retos e diagonais, já que o controle do cursor é preferencialmente feito por um joystick. Então, nada de desenhos complexos.

Reconhecerdor de Padrões

Nos dias seguintes, foram basicamente de implementações de mecânicas para jogos de plataforma: botões acionáveis, plataformas móveis, escadas, itens coletáveis, etc.

Enfim, uma semana de bastante trabalho e muitas ideias para a próxima semana… Até o próximo sábado!

DevLog #01 + Update do Desafio Semanal

Estou estreando outra série de posts chamada DevLog! Aqui falarei um pouco do desenvolvimento do jogo que é a expansão do jogo “Our Worlds” que criei na Ludum Dare #30. No momento, só tenho programado as funcionalidades, ainda não toquei na programação gráfica nem a arte do jogo. Algumas novidades:

Sistema de Itens e Inventário: Ontem programei a parte gráfica do inventário. Inicialmente, resolvi colocá-la acima do personagem. Depois testarei em algum lugar fixo na tela.

Editor de Fases: O jogo está sendo criado com a DPEngine, que é um framework que criei um tempo atrás para jogos 2D em pixel art e possui um sistema rápido e próprio de colisões por pixel! Logo, as fases não são baseadas em tiles nem polígonos de colisão. São utilizadas máscaras (imagens) para determinar onde há ou não colisões. Esse método tem algumas vantagens, como utilizar máscaras irregulares e/ou dinâmicas de colisão . Uma desvantagem é que utiliza mais memória, mas isso não é problema hoje em dia. Para o editor de fases, o que fiz foi incluir a rasterização dos polígonos criados pela PolyMesh e suporte para salvar e carregar uma polymesh em um arquivo.

Polígono rasterizado


E sobre o desafio semanal…

Desafio Semanal

Bom.. tive que adiar a data final para a próxima semanal. Acabei tendo que fazer outras coisas no horário planejado, mas está indo! Anteontem fiz alguns testes de tamanho. Resolvi utilizar tiles 16×16 e construí os shapes de alguns prédios para testar a escala. Parece bom.