SimCity rodando no navegador com WebAssembly e OpenGL
(micropolisweb.com)- Micropolis Web, baseado no SimCity Classic original da Maxis, foi disponibilizado em uma forma que roda no navegador, permitindo experimentar o clássico simulador de cidades sem instalação separada
- O projeto é uma versão portada por Don Hopkins do jogo projetado por Will Wright e continua mudando, ainda em um estado experimental, não finalizado
- O repositório no GitHub, vídeos de demonstração, além do livro e dos diagramas de Chaim Gingold, são fornecidos em conjunto para explorar mais a fundo a implementação e a história do SimCity
- Os controles usam arrastar do mouse, roda do mouse, teclas de direção, teclas alfanuméricas e numéricas, permitindo mover, ampliar, carregar cidades, ajustar a velocidade, alterar a taxa de imposto e trocar o tileset
- O nome “Micropolis” é usado de acordo com os termos da Micropolis Public Name License, e recursos adicionais e easter eggs ainda estão em preparação
Micropolis Web rodando no navegador
- Micropolis Web é uma versão do Micropolis executada com WebAssembly
- A base é o SimCity Classic original da Maxis, com port feito por Don Hopkins do jogo projetado por Will Wright
- O estado atual está mais próximo de um experimento inacabado em constante mudança do que de um produto finalizado
- Há um canal de apoio ao desenvolvimento adicional em Patreon
- O repositório do código-fonte pode ser visto em MicropolisCore
- Vídeos relacionados:
- Materiais de referência:
- O nome “Micropolis” é usado de acordo com os termos da Micropolis Public Name License
Como controlar e observações restantes
-
Controles do mouse
- Arraste com o botão esquerdo para mover a tela
- Use a roda do mouse para ampliar ou reduzir
-
Controles do teclado
- Use as setas para mover a tela
- Use as teclas de vírgula e ponto para ampliar e reduzir
- Use teclas alfabéticas para carregar várias cidades
- Use a tecla
\para gerar - Use as teclas numéricas para definir a velocidade
- Use a tecla
0para alternar a pausa - Use as teclas de colchetes para reduzir ou aumentar a taxa de imposto
- Use
-e=para trocar o tileset - Pressione o botão “X” na parte superior para ocultar a janela de instruções
- Recursos adicionais e easter eggs estão em preparação
- O aviso começa dizendo para não pressionar a barra de espaço, mas a explicação seguinte não está completa no texto fornecido
1 comentários
Opiniões no Hacker News
É divertido portar jogos antigos para a web. Hoje em dia, muitos jogos são menores que uma página web comum, então carregam rápido e rodam bem
Acabei de portar Quake 3 e estou me divertindo mexendo nele: https://thelongestyard.link/
Demo 1 do Micropolis Web: https://www.youtube.com/watch?v=wlHGfNlE8Os
Micropolis Web é a versão para navegador do Micropolis, o SimCity open source, e usa WebAssembly, WebGL e SvelteKit. É baseado no código original do SimCity Classic, projetado por Will Wright e portado por Don Hopkins; a primeira demo já roda o simulador em WebAssembly e a animação de tiles em WebGL, mas a maior parte da interface de usuário ainda está em desenvolvimento
Site ao vivo: https://MicropolisWeb.com
Código-fonte e documentação: https://github.com/SimHacker/MicropolisCore
Livro de Chaim Gingold, "Building SimCity": https://mitpress.mit.edu/9780262547482/building-simcity/
"SimCity Reverse Diagrams" de Chaim Gingold: https://smalltalkzoo.thechm.org/users/Dan/uploads/SimCityRev...
Micropolis Web Space Inventory Cellular Automata Music 1: https://www.youtube.com/watch?v=BBVyCpmVQew
A música foi criada por Juho Hietala, Blamstrain, e o Space Inventory Cellular Automata foi implementado por Don Hopkins: https://blamstrain.com/
Gingold, Chaim. “Play Design.” Ph.D. thesis, University of California Santa Cruz, 2016. https://www.proquest.com/docview/1806122688
O porte de Micropolis para Wasm parece poder ser uma nova etapa de desenvolvimento. SimCity Classic no Macintosh influenciou muito, na minha infância, a forma como eu pensava sobre computadores e software, e fico feliz em ver isso ganhando nova vida
Não sou gamer, mas lembro de ter jogado SimCity quando era criança. Não sei se a jogabilidade mudou nos últimos 25 anos mais ou menos, ou se o navegador está quebrado, mas parece que nada funciona
Dá para carregar uma cidade e vê-la se mexer, mas acho que no SimCity antigo dava para construir a própria cidade. Não deveria haver uma forma de o jogador realmente jogar?
"Space Inventory" é, na verdade, um conjunto de algumas regras de autômatos celulares. Uma delas é uma difusão térmica caótica com wrap, em 8 bits e ditherizada, parecida com "Heat"; outra é uma variante de "EcoLibra", publicada no Autodesk Cellab, criada por Rudy Rucker com John Walker. Ela combina "Life" e "Brian's Brain" com "Anneal" ("Vote 4/5")
https://www.fourmilab.ch/cellab/
https://www.fourmilab.ch/cellab/manual/rules.html#EcoLiBra
https://www.fourmilab.ch/cellab/manual/rules.html#Life
https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life
https://www.fourmilab.ch/cellab/manual/rules.html#Brain
https://en.wikipedia.org/wiki/Brian%27s_Brain
https://www.fourmilab.ch/cellab/manual/rules.html#Vote
https://conwaylife.com/wiki/List_of_Life-like_rules
https://www.fourmilab.ch/cellab/manual/rules.html#Heat
Em 1991, acrescentei essas regras de autômatos celulares ao SimCity, fazendo com que os valores das células fossem exibidos como tiles do SimCity. Distribuí por FTP anônimo uma demo gratuita e totalmente funcional, mas usava os autômatos celulares como DRM: depois de alguns minutos de jogo, se não houvesse licença, a cidade derretia
https://www.donhopkins.com/home/catalog/simcity/simcity-anno...
https://www.donhopkins.com/home/catalog/simcity/simcity-revi...
https://www.donhopkins.com/home/HyperLook-SimCity-Manual.pdf
https://www.donhopkins.com/home/catalog/hyperlook/HyperLook-...
https://www.donhopkins.com/home/catalog/hyperlook/SimCity.IN...
As instruções de instalação diziam que era possível obter uma chave de licença ou executar em modo demo; nesse modo, depois de 5 minutos ou ao tentar salvar, a cidade derreteria, então a mensagem era para comprar uma licença
Eu não esperava muito no mobile, mas no Firefox do Android esta página travou o navegador. Precisei matar o processo, e isso é raro.
Como referência, tenho um joguinho que eu mesmo portei para o navegador. Fazer rodar foi muito fácil graças à combinação Emscripten+SDL2, mas, sinceramente, o maior esforço foi fazer com que ele fosse realmente jogável no celular: https://play.neverball.org/
https://github.com/SimHacker/MicropolisCore/issues/1
Em vez de esperar até ficar completo e perfeito, eu queria publicar o quanto antes para que outras pessoas pudessem testar. Por isso ainda há muito a fazer em interface de usuário, estabilidade, suporte multiplataforma, mobile etc.
Assim que o simulador e o renderizador de tiles começaram a funcionar, adicionei um mínimo de zoom/pan, uma interface de controle por teclado e uma janela de dicas que pode ser fechada pelo botão "+" no canto superior direito.
O que eu realmente espero é integrar com uma linguagem de programação visual como Snap! para permitir live coding, áreas de plugins, robôs, sistemas de monitoramento e controle, visualização e exportação de dados, e interfaces alternativas como dashboards do Grafana.
Celulares Android podem ser conectados por cabo USB a um Mac ou PC, e iPhones a um Mac; então dá para verificar o console remoto, depurar e até fazer live coding pelo Chrome ou pelo depurador do Safari no Mac. Se as condições forem favoráveis, também pode funcionar por Wi‑Fi, mas talvez o Google tenha removido o recurso ou a Apple o tenha bloqueado desde o início.
Antigamente, portei um cliente de RuneScape para a web.
https://play.rsps.app/
Usa Wasm, TypeScript e WebGL.
Repositório do código-fonte: https://github.com/SimHacker/MicropolisCore
O que acontece ao apertar a barra de espaço é realmente surpreendente. O fractal é incrível.
https://www.youtube.com/watch?v=0Gy9hJauXns
Fico me perguntando se modelos de linguagem de grande porte conseguiriam portar imediatamente um jogo desses
Tenho usado o ChatGPT no desenvolvimento e ele tem ajudado bastante, mas exige muitas iterações e instruções, então está longe de ser algo imediato. LLMs não vão substituir programadores, mas programadores que usam LLMs vão substituir os que não usam
Foi útil para receber explicações sobre a documentação e as melhores práticas de ferramentas como Emscripten e Embind, fazer o makefile funcionar, analisar o código, classificar métodos e variáveis de instância como private/public, e escrever o boilerplate das declarações do Embind e a documentação. Também deu para usá-lo como uma espécie de grep avançado, capaz de entender a sintaxe do código e aceitar consultas em inglês
https://github.com/SimHacker/MicropolisCore/blob/main/Microp...
Esse processo não foi automático nem imediato; no total levou 33 anos e ainda não terminou. Precisei guiar bastante o ChatGPT com base na minha experiência de ter portado a versão de Mac do SimCity para o HyperLook do sistema de janelas NeWS em 1991 e, depois, para várias outras plataformas
Um jogo como SimCity valia o esforço de abandonar a UI do Mac, separar o simulador da UI e reescrever uma UI de alta qualidade para o HyperLook do NeWS. Depois também criei uma UI para TCL/Tk no X11, e essa estrutura também tornou possível o SimCity multiplayer em rede
X11 SimCity Demo: https://www.youtube.com/watch?v=Jvi98wVUmQA
Multi Player SimCityNet for X11 on Linux: https://www.youtube.com/watch?v=_fVl4dGwUrA
TCL Doc: https://github.com/SimHacker/MicropolisCore/blob/main/notes/...
Callbacks: https://github.com/SimHacker/MicropolisCore/blob/main/notes/...
Décadas depois, após lançar o SimCity como open source e publicar versões TCL/Tk/X11 para OLPC e Linux, organizei o código do simulador em C++ e usei SWIG para definir a API e os callbacks, conectando-os ao Python. A refatoração em C++ ajudou muito na modularização, na documentação e no porte para várias plataformas
Micropolis Core: https://github.com/SimHacker/micropolis/tree/master/Micropol...
Doxygen documentation (current): https://micropolisweb.com/doc/
Development Plan (old): https://github.com/SimHacker/MicropolisCore/blob/main/notes/...
OLPC Plan (old): https://github.com/SimHacker/MicropolisCore/blob/main/notes/...
To Do (old): https://github.com/SimHacker/MicropolisCore/blob/main/notes/...
User Interface Plan (old): https://github.com/SimHacker/MicropolisCore/blob/main/notes/...
OLPC Notes (old): https://github.com/SimHacker/MicropolisCore/blob/main/notes/...
Também criei uma interface desktop em PyGTK/Cairo/X11 e uma interface web cliente/servidor baseada em TurboGears/AMF/OpenLaszlo/Flash
Micropolis Online (SimCity) Web Demo (old): https://www.youtube.com/watch?v=8snnqQSI0GE
Bil Simser integrou o motor do simulador ao C# com SWIG: https://github.com/SimHacker/micropolis/tree/master/Micropol...
Por já ter esses documentos de design e experiência de implementação, consegui orientar bem o ChatGPT com prompts para o design da API Emscripten/Embind; ele foi útil para escrever boilerplate e validar o design, mas não ajudou muito a conceber o design em si. Também foi muito útil para aprender detalhes e melhores práticas de TypeScript, SvelteKit, node, WebGL, canvas, CSS e HTML
Por que há um corpo de bombeiros em quase todos os quarteirões da cidade?
Os controles não funcionam e, assim que o navegador carrega alguma coisa, a ventoinha da CPU começa a girar. Tem certeza de que isso não é só um minerador de criptomoedas malfeito? Se não for, não entendo por que publicar algo que não funciona
Não tenho dinheiro para comprar todos os tipos de computadores e celulares e, mesmo que tivesse, não teria tempo para testar tudo pessoalmente. Ninguém está me pagando para fazer isso, mas, se quiser, você pode apoiar pelo Patreon: https://www.patreon.com/DonHopkins
Ainda assim, este projeto é algo que faço por paixão, não uma fonte de renda. No momento também estou oferecendo um produto especial em que fico calado por 5 minutos por mês sobre o tema que você quiser
Todo o código-fonte está disponível no GitHub, e você pode reportar bugs ou fazer o build por conta própria. O navegador também inclui ferramentas de depuração e engenharia reversa para inspecionar o binário WebAssembly e o JavaScript compilado. Os shaders WebGL estão em texto puro, então também dá para verificar se correspondem ao código-fonte no repositório
https://github.com/SimHacker/MicropolisCore
Se encontrar evidências de software de mineração malfeito, pode denunciar ao FBI, à Interpol e ao GitHub. Como estou publicando o código-fonte e os binários com meu nome, minha conta do GitHub e meu domínio, também é fácil rastrear a origem
Um exemplo de relatório de bug útil identificou o problema incluindo informações do sistema e stack trace, e graças a isso consegui corrigi-lo em poucos minutos: https://github.com/SimHacker/MicropolisCore/issues/1
Também fico curioso se você tentou pressionar as teclas numéricas para controlar a velocidade. Considerando os números na parte superior do teclado, "1" desacelera para 1 frame por segundo com 1 tick do simulador por frame, e "9" roda a 120 frames por segundo com 50 ticks por frame. No Chrome do meu Mac M1, ele roda de forma suave e a interface também é bem responsiva
Seria bom saber quais controles não funcionam, qual é seu hardware, sistema operacional, navegador e GPU, e se havia erros no console de desenvolvedor do navegador. Incluir o stack trace do console no relatório de bug ajuda bastante