2 pontos por GN⁺ 2023-08-11 | 1 comentários | Compartilhar no WhatsApp
  • Contém o código do jogo da edição relançada de Quake II 2023 e o código original do jogo para referência, permitindo que usuários criem mods para o jogo
  • Os mods podem ser carregados no relançamento da mesma forma que no jogo original; ao iniciar, use +set game mymod ou, durante a execução, digite game mymod no console
  • Para evitar modificar os arquivos originais do jogo, recomenda-se instalar os mods no diretório %USERPROFILE%\Saved Games\Nightdive Studios\Quake II
  • O relançamento usa uma nova API para comunicação entre o servidor e os módulos do jogo, e introduz um módulo leve de jogo do cliente, semelhante ao módulo cgame de Quake III Arena, para permitir alterar comportamentos do cliente que antes eram hardcoded
  • A base de código combina os módulos de jogo baseq2, ctf, rogue e xatrix do jogo original, e requer um compilador C++17
  • A compilação foi testada apenas com Clang, VS2019 e VS2022, e funciona tanto com C++17 quanto com C++20; ao usar C++20, a dependência de fmtlib pode ser omitida
  • As dependências são fmtlib e jsoncpp, e podem ser instaladas com vcpkg install jsoncpp:x64-windows fmt:x64-windows
  • A DLL da edição relançada pode não carregar corretamente os mapas dos pacotes de expansão originais, e em alguns casos os mapas foram modificados para resolver problemas de spawnflags conflitantes
  • Mods existentes podem talvez ser portados para se adequar às mudanças na interface de exportação do jogo, mas como houve grandes alterações na estrutura e no layout para suportar todos os pacotes de expansão em uma única base de código e refletir novos recursos, pode ser necessário reescrevê-los ao usar a nova base de código
  • A lógica interna da DLL do jogo foi ajustada para um tickrate de 40hz em vez dos 10hz do motor original, escolhendo 40hz como equilíbrio entre passos de 25ms e considerações de largura de banda e CPU
  • O sistema de salvamento grava dados de nível e do jogo em JSON UTF-8 em vez de usar offsets de ponteiro e cópia de memória, e não faz mais interface direta com o sistema de arquivos
  • O relançamento de Quake II usa o protocolo de servidor version 2023; a maioria das mensagens continua compatível com versões anteriores, mas alguns ajustes foram feitos para novos recursos, mudanças de funcionalidade e limites ampliados
  • A id Software não pode oferecer suporte para este lançamento e recomenda o uso de recursos conduzidos pela comunidade

1 comentários

 
GN⁺ 2023-08-11
Opiniões no Hacker News
  • Quake II foi minha primeira experiência escrevendo C
    O código era claro, consistente e direto; não vou dizer que foi o melhor código-fonte que já li, mas elevou bastante meu padrão. Depois disso vi muito código esquisito em fontes de vários jogos, como aninhamentos que passavam do lado direito da tela e funções gigantes que faziam inúmeras coisas, e isso virou uma lição inicial de que é possível fazer coisas incríveis com código simples
    No fim dos anos 1990 e começo dos 2000, eu dava aulas de VR para crianças usando Quake e Quake II. Colocávamos headsets de VR e alguns PCs com Q.E.D. ou Qoole instalado, e alunos de 12 a 14 anos ou de 14 a 18 criavam seus próprios jogos de realidade virtual
    Na prática, eles faziam níveis de Quake/Quake II sem monstros nem armas, e contavam histórias usando gatilhos dentro do nível para exibir mensagens na tela. Uma equipe criou um nível em que era preciso atravessar slime e apertar um botão para ligar uma bomba e drenar o slime; outra fez um labirinto 3D de água flutuando no espaço para o jogador atravessar nadando. Ainda tenho no disco rígido alguns níveis feitos pelos alunos, mas parte deles não roda direito
    Para as aulas, criei um mod que dava uma pistola de sinalizadores em vez do blaster. Basicamente era o blaster, mas com efeitos sonoros diferentes, sem modelo de arma, e com os projéteis alterados para serem afetados pela gravidade, quicarem e se apagarem depois de certo tempo. Se você esteve nessa aula, talvez nem tenha conseguido usar o headset, porque ele nem sempre funcionava direito

    • O código da id é certamente limpo e bem estruturado, mas, do ponto de vista de uma pessoa comum, era bem difícil de entender
      Comentários dentro das funções eram relativamente raros e, sem um bom entendimento de gráficos 3D, apareciam com frequência expressões quase criptográficas que deixavam a pessoa perdida. Sendo produto de um líder da indústria como Carmack, isso é natural, mas para acompanhá-lo com confiança era preciso bastante conhecimento prévio e uma certa inclinação matemática
    • Eu também sou culpado de ter escrito código assim
      Antigamente eu escrevia código-macaroni de forma crônica: 25 linhas viravam a espinha dorsal de uma dúzia de funcionalidades, e mais outra dúzia era empilhada por cima. Rodava absurdamente rápido, mas a dívida técnica crescia depressa, e no fim aquelas funções se tornavam intocáveis pelo risco de quebrar muita coisa construída em cima delas
      Tentei explicar com comentários, mas a comunicação não era boa: eu escrevia o que a função fazia, não como ela funcionava. Coisas como “processamento da tabela SINE”, “desfragmentação de pedaços da tabela”, “interpretação binária”. Todo mundo dizia: “que diabos é isso? Mas é rápido pra caramba”. Se fosse em outra área que não videogames, acho que nem eu nem o produto teríamos durado muito
    • Se você gosta do código da id, talvez também curta John Carmack on Inlined Code (2014): https://news.ycombinator.com/item?id=12120752
    • Nunca mergulhei a fundo no código-fonte da id Software, mas já vi muito código de jogo realmente horrível. A barra é extremamente baixa
      Foi surpreendente ver que jogos bem-sucedidos, divertidos e estáveis o suficiente foram lançados tendo, por trás, código que era um desastre completo. Se até esse lixo montado de qualquer jeito pode dar lucro o bastante, às vezes me pergunto se todo o esforço e tempo que gasto tentando evitar o caos valem mesmo a pena
    • Seria ótimo se você pudesse compartilhar capturas de tela dos resultados dessas aulas. Parece muito legal
  • Ri desta parte: https://github.com/ESWAT/john-carmack-plan-archive/blob/mast...
    No .plan de John Carmack de 31 de janeiro de 1997, ele conta que foi a uma concessionária Ferrari comprar uma F355 nova como um carro “razoável”, viu uma F40 parada na frente e acabou comprando. Depois escreveu também que, como tinha Ferraris demais, planejava dar sua primeira Ferrari como prêmio ao vencedor de um torneio de Quake
    O prêmio era uma 328 GTS 1987 com turbo, que apareceu na revista Turbo em janeiro de 1994, entregava 360 cv nas rodas traseiras em dinamômetro de chassi, tinha motor novo e pintura nova, mas o interior ainda precisava de cuidados. Ele também pretendia incluir dinheiro para cobrir impostos e seguro

    • Um comprador em potencial está vindo? Então é só deixar uma F40 “por acaso” estacionada bem ao lado da entrada
  • Para deixar uma anedota sobre Quake II: foi o primeiro jogo de tiro em primeira pessoa que zerei
    Joguei durante uma semana no verão, quando visitei um amigo que morava em outro estado; de outra forma, acho que eu nunca teria recebido permissão. Quando comecei, eu só tinha jogado DOOM, então usei exatamente o mesmo esquema de controles e, por incrível que pareça, funcionou, então fui seguindo sem pensar muito
    Até que, de repente, a visão ficou presa no teto e fiquei completamente confuso; depois descobri que eu tinha encostado no mouse e, após ficar mexendo nele por um bom tempo, entendi o conceito de controlar a visão com o mouse. Depois disso, o jogo ficou muito mais fácil
    Eu não tinha internet, nem eu nem meu amigo conhecíamos controle de visão pelo mouse, e eu nunca tinha visto ninguém jogar um FPS 3D de verdade. Hoje esse conhecimento é tão difundido que é difícil imaginar o quanto as interfaces de jogos daquela época pareciam estranhas e alienígenas. Fico feliz que o código-fonte tenha sido aberto

    • Caso você não soubesse, este é o código-fonte da versão relançada de Quake II. O código-fonte original de Quake II já estava aberto havia muitos anos[0], junto com vários outros clássicos da id Software[1]
      [0]: https://github.com/id-Software/Quake-2
      [1]: https://github.com/id-Software
    • Lembro da primeira vez que vi várias pessoas jogando FPS em LAN
      Foi por volta de 1999, na ComicCon em Roma, Itália, quando Half-Life tinha acabado de chegar ao gold master e o demo multiplayer havia sido lançado. Havia pelo menos 20 pessoas, todas jogando Half-Life multiplayer em LAN, e usando mouse. Era uma cena insana
      Depois disso fui a inúmeras LAN parties até 2005, mas o matchmaking online matou a QuakeNet e a cultura social
  • Ah, que nostalgia.
    Em 1999, Quake II era o jogo que eu jogava — literalmente quase o único. Passei uma quantidade absurda de tempo no QII e escrevi meu primeiro código fazendo mods.
    Não é exagero dizer que Quake II me transformou de usuário de computador em programador. Ele definiu o rumo da minha vida adulta e da minha carreira.
    Ao criar meu primeiro mod, aprendi cálculo vetorial, a entender uma base de código existente e a integrar builds automáticos para testes rápidos. Também mexi um pouco com criação de mapas e arte 3D, mas logo percebi que eu não era artista nem designer.
    Na época, eu não tinha nenhum controle de versão nem política de backup, então perdi todo o código original. O jogo seguinte em que me envolvi de forma parecida foi Tribes 2, e o scripting e o modding possíveis nele eram realmente incríveis.

    • Encontrei o binário do meu mod em uma pilha interminável de arquivos.
      https://xn0.co/Xeno-Mod_1.9_Setup.exe
      Claro que todo mundo no HN obviamente vai baixar e executar um executável de uma fonte aleatória da internet! Ainda assim, se você tiver o QII original e estiver curioso, é seguro executar.
    • Tribes 2 foi minha primeira experiência com modding, e esse jogo também ocupa um lugar muito especial no meu coração. Depois, Sphere e RunUO, emuladores de Ultima Online, me transformaram de gamer em programador.
    • Descobrir o console drop-down foi como uma revelação.
      Homenagem: http://guake-project.org/
  • Incrível, me levou direto de volta aos anos 90. Para ser mais exato, estou falando do primeiro Quake.
    Havia um PC no chão do quarto, acho que era um Pentium 166MMX, e um amigo trouxe uma máquina parecida, um pouco mais rápida, talvez 233. Não tínhamos placas de LAN.
    Usei o velho cabo paralelo do meu pai para enganar o Windows e fazê-lo achar que era uma conexão LAN, e funcionou bem o bastante para jogarmos por alguns dias. Depois enjoamos um pouco e mergulhamos na cena de modding, mas sem criar nada nós mesmos — baixávamos coisas públicas e testávamos. Nunca vou esquecer Girobot e KQP (Killer Quake Patch).
    Os bots do Girobot eram bem fortes, desde que não ficassem presos no terreno. A verdadeira mina de ouro era o KQP, que adicionava todo tipo de mods, armas e sistemas de bots malucos. A Vampire Gun fazia o jogador atingido morrer se desfazendo lentamente — mas não devagar demais — em pedaços de carne, e isso me fazia rachar de rir toda vez. Sinto muita falta dos anos 90.

    • Quando você diz “Girobot”, quer dizer o Gyrobot[1] do “Gyro Gearloose”?
      Pelo que sei, o KQP também incluía ZeusBots.
      [1] https://github.com/Jason2Brownlee/QuakeBotArchive
    • Eu tinha 8 GB de mods, mapas e skins para multiplayer de Quake 2 baixados por modem e, às vezes, por T1. Sinto muita falta desses mods.
    • O velho cabo paralelo do seu pai — vocês se conectaram por null modem? Usei a mesma configuração com meu colega de quarto da faculdade no apartamento. Era meados dos anos 90, então jogávamos Doom 2 e os FPS daquela época. Boas lembranças.
  • Vi gente reclamando em outros lugares que o relançamento não tem versão para Linux, mas eles publicaram o código-fonte assim, e está dito que foi testado com clang. Grande aplauso para a id por manter seus princípios.

    • Fico curioso para saber por que eles publicaram este código-fonte agora. Não sei se foi puramente por princípio ou se havia uma obrigação legal porque o código antigo também era GPL.
      Imagino que não houvesse obrigação legal, já que o código antigo provavelmente também pertencia a eles.
    • Esta versão saiu para todas as principais plataformas, e tenho quase certeza de que hoje tanto a Nintendo quanto a Sony usam Clang/LLVM em suas toolchains de SDK. Linux pode até ter sido considerado, mas imagino que a principal motivação tenha sido fazê-lo compilar em consoles modernos.
    • Isso parece ser só o código do jogo, não o código-fonte do engine. Estou deixando passar alguma coisa?
  • Há muitos jogos que não são mais vendidos e não rodam em stacks modernos de software e hardware.
    Seria bom haver uma lei dizendo que, se você não lançou patches por 20 anos para fazer um software rodar em novas plataformas, deveria publicá-lo como open source do ponto de vista da importância cultural.

  • Fico curioso para saber o que vocês acham de usar _t como sufixo de tipo em C/C++, como neste código-fonte.
    Pelo que entendo, é reservado para tipos definidos pela linguagem, mas nunca vi uma alternativa razoável. Sem o sufixo, o código às vezes fica estranho. Por exemplo, para um tipo customizado de “viewport”, acho viewport_t viewport; melhor do que viewport viewport;.

    • Pelo que sei, isso é uma regra mais do POSIX do que da linguagem C em si. De todo modo, eu uso no meu código pessoal, mas nos padrões de codificação com que trabalhei isso era frequentemente proibido, mesmo em ambientes não POSIX.
      Normalmente não é algo que eu conteste, então nomeio os tipos conforme o guia de estilo quiser. O prefixo t é pior, e usar a palavra inteira typedef também é pior.
    • Pelo que entendo, quem reserva o sufixo _t é o POSIX, não C.
      Ainda assim, peguei o hábito de _s/_t trabalhando com bases de código id Tech, e decidi que tudo bem se minha base de código C ficar para sempre com o rótulo de “não compatível com POSIX”. Seja lá o que isso realmente signifique. Em C++, uso simplesmente InitialCamelCase.
    • Não vai agradar a todos os gostos, mas eu costumo usar CamelCase para tipos e under_scores para variáveis. Acaba aparecendo algo como Viewport viewport;, mas pelo menos é fácil perceber que Viewport é um tipo.
    • Quando a IDE não ajuda muito, isso é útil se você precisa olhar apenas para o código à sua frente e entender o que é o quê.
    • O guia de estilo C do lugar onde trabalho determina o uso de _type.
      Curiosamente, a enorme base de código de um produto embarcado que usa um SO customizado não usa tipos como uint32_t para inteiros de largura fixa. Em vez disso, um cabeçalho comum da empresa define uint32 etc., sem o sufixo _t. Não sei por que decidiram assim.
  • Na minha juventude, esse jogo era tudo para mim. Foi ele que me apresentou pela primeira vez a clãs, ladders e à verdadeira cultura dos jogos online
    Meu mapa era The Edge, e as armas eram a railgun ou o lançador de foguetes. Na época, com conexão discada, era importante encontrar servidores com boa latência. O mais irritante eram as pessoas que usavam aquela arma que causava lag para todo mundo
    Sei que Q3 é o jogo maior, que aperfeiçoou o gênero, mas meu favorito sempre será Quake 2. Ele também tinha um single-player sólido e expansões, e o ritmo era perfeito para mim. Com a chegada de Q3, tudo ficou rápido demais

    • Talvez você goste dos servidores de Quake Live que usam física VQL
      VQL é muito mais próxima de Q2, enquanto PQL é mais parecida com CPMA ou QuakeWorld. De quebra, The Edge também pode ser jogado no Quake Live
    • Acertar com a railgun e finalizar com a metralhadora, gg
  • Se você é fã de Quake 2 e tem acesso a um Oculus Quest 2, recomendo experimentar Quake2Quest. É uma sensação realmente diferente correr pessoalmente pelos mapas onde passei tanto tempo antigamente