(EN-US) This is the repository for my bachelor's degree final project at UFSM: a game prototype made to explore the Entity-Component-System (ECS) architecture and procedural dungeon generation. While the game is not fully playable (or even enjoyable) at the moment, it fulfills my expectations. A more profound development will occur independently in another repository, after my graduation.
(PT-BR) Este é o repositório do meu trabalho de conclusão de curso (TCC) na UFSM: um protótipo de jogo elaborado para explorar a arquitetura Entity-Component-System (ECS) e geração procedural de dungeons. Embora o jogo não seja totalmente jogável (ou mesmo divertido) no momento, ele cumpre minhas expectativas. Um desenvolvimento mais aprofundado ocorrerá de forma independente em outro repositório, após a minha graduação.
/src/map_gen/ contains all the algorithms presented in the article. They're generally easy to follow, but for fully understanding WaveFunctionCollapse it would be wise to read Gridbugs' article (my implementation directly derives from it) or Karth & Smith research paper. Keep in mind that the procgen pipelines are still far from perfect, and I'll still keep working on them. I'm also working on the general game mechanics and in the future I'll play with procedural narrative -- a new interest for me.
However, this is a game prototype (not a procedural dungeon generation tool!) and still not ready for playing. But if you know your way around Rust and want to fiddle with the procgen algorithms, feel free to do it!
If you want to contact me for whatever reason, send me an email. You can use the email on my GitHub profile or the one in the paper.
First, install and configure Rust in your machine.
Then, clone this repository, navigate to it and run cargo run
from your terminal emulator.
Tell me if you have any problems.
While in-game:
- Use the Vi-keys to move or select targets.
- Space for contextual action (e.g. open doors).
- 'i' to access inventory.
- 'e' to access equipment.
- 'z' to switch between melee/ranged weapons.
- 'f' to target and fire.
- 'r' to reload.
Ou, "seria bom se eu fizesse tudo isso!". Ordem de prioridade, mais ou menos.
- Estruturar o básico do básico do bracket-lib (RLTK) + specs, utilizando o tutorial desenvolvido por Wolverson como base;
- Movimento do jogador @;
- Estrutura básica de um mapa;
- Arquivo separado para a renderização do mapa e das entidades;
- Sistema de FOV (field-of-view);
- Câmera/viewport (divergências começam aqui);
- Implementar uma UI básica e aproveitar para aprimorar os estados de jogo (game states);
- Mobs e estrutura básica do sistema de combate;
- Alguns métodos construtivos de geração de mapas:
- Random Walkers;
- Cellular Automata (CA);
- Assegurar conectividade.
- BSP (binary space partitioning) dungeons;
- Diggers/Tunnelers.
- Retoques finais.
- Sistema de geração de mapas (pipeline) híbrido utilizando
WFC em conjunto com outros algoritmos;
- Carregar mapa externo desenhado manualmente;
- Aplicar WFC sobre o mapa atual;
- Assegurar conectividade pelo método do flood-fill (CA);
- Inserção de estruturas pré-fabricadas no mapa;
- Temáticas diferentes de mapas:
- TDCL (top-down cavern-like);
- TDML (top-down mansion-like);
- Florestas;
- Ruínas;
- WFC como arquitetura externa/interna.
- Inventário e consumo de itens;
- Equipamento;
- Baús de tesouro;
- Seleção de regiões no mapa para aplicar algoritmos de geração;
- Usar RON (e não JSON) para estruturar os raws;
- Sistema de serialização/desserialização básico usando RON + serde para mobs, itens e cores.
Naturalmente, à medida que vou desenvolvendo posso ter de alterar/aprimorar itens da checklist já marcados. Isso é um processo natural; considere que itens marcados já possuem a estrutura básica concluída.
- O sistema de spawning está longe do adequado.
- Distorção dos tiles dependendo da resolução.
- Alguns crashes ocorrem de vez em quando na etapa de geração de mapas.
- Causa provável: acesso ao índice 0 do mapa (não utilizado).
- Por enquanto, o WFC não reinicia quando há contradição (raro de acontecer).
Se você tiver alguma boa ideia ou sugestão, sinta-se livre para abrir um issue.
Veja o arquivo da minha monografia para a lista de referências. Outros projetos do GitHub que tiveram porções de código utilizadas (ou que serviram de base para algo) estão referenciados em forma de comentários nos arquivos de código relevantes.