2 points par GN⁺ 2023-08-11 | 1 commentaires | Partager sur WhatsApp
  • Contient le code du jeu de la réédition 2023 de Quake II ainsi que le code source du jeu original à titre de référence, afin de permettre aux utilisateurs de créer des mods pour le jeu
  • Les mods peuvent être chargés dans la réédition de la même manière que dans le jeu original, en utilisant +set game mymod au lancement ou en saisissant game mymod dans la console pendant l’exécution
  • Pour éviter de modifier les fichiers du jeu original, il est recommandé d’installer les mods dans le répertoire %USERPROFILE%\Saved Games\Nightdive Studios\Quake II
  • La réédition utilise une nouvelle API pour la communication entre le serveur et les modules du jeu, et introduit un module de jeu client léger, similaire au module cgame de Quake III Arena, afin de pouvoir modifier des comportements client auparavant codés en dur
  • La base de code combine les modules de jeu baseq2, ctf, rogue et xatrix du jeu original, et nécessite un compilateur C++17
  • La compilation n’a été testée qu’avec Clang, VS2019 et VS2022, et fonctionne en C++17 comme en C++20 ; avec C++20, la dépendance à fmtlib peut être omise
  • Les dépendances sont fmtlib et jsoncpp, et peuvent être installées avec vcpkg install jsoncpp:x64-windows fmt:x64-windows
  • Il est possible que la DLL de la réédition ne charge pas correctement les cartes des extensions d’origine, car certaines cartes ont été modifiées pour résoudre des problèmes de spawnflags en conflit
  • Les mods existants peuvent éventuellement être portés pour s’adapter aux changements de l’interface d’export du jeu, mais comme tous les packs d’extension sont pris en charge dans une base de code unique et que de nouvelles fonctionnalités ont entraîné de grands changements de structure et d’organisation, une réécriture peut être nécessaire pour utiliser la nouvelle base de code
  • La logique interne de la DLL du jeu a été ajustée à un tickrate de 40 Hz au lieu des 10 Hz du moteur d’origine, 40 Hz ayant été retenu comme compromis entre des pas de 25 ms et les contraintes de bande passante et de CPU
  • Le système de sauvegarde enregistre désormais les données de niveau et de jeu en JSON UTF-8 au lieu d’utiliser des offsets de pointeurs et des copies mémoire, et il n’interface plus directement avec le système de fichiers
  • La réédition de Quake II utilise la version 2023 du protocole serveur ; la plupart des messages restent rétrocompatibles, mais certains ont été ajustés pour de nouvelles fonctionnalités, des comportements modifiés et des limites relevées
  • id Software ne peut pas fournir de support pour cette version et recommande de s’appuyer sur des ressources pilotées par la communauté

1 commentaires

 
GN⁺ 2023-08-11
Avis sur Hacker News
  • Quake II a été ma première expérience d’écriture en C.
    Le code était clair, cohérent et direct ; je n’irais pas jusqu’à dire que c’est la meilleure source que j’aie jamais lue, mais il a placé la barre haut. Par la suite, j’ai vu dans les sources de nombreux jeux toutes sortes de bizarreries, comme des indentations qui dépassaient le bord droit de l’écran ou d’énormes fonctions qui faisaient une multitude de choses, et ça m’a servi de première leçon : on peut faire des choses formidables avec du code simple.
    À la fin des années 1990 et au début des années 2000, je donnais des cours de VR à des enfants avec Quake et Quake II. On installait un casque VR et quelques PC avec Q.E.D. ou Qoole, et on faisait créer à des élèves de 12 à 14 ans, ou de 14 à 18 ans, leur propre jeu de réalité virtuelle.
    En pratique, ils créaient des niveaux Quake/Quake II sans monstres ni armes, et racontaient une histoire via des messages affichés à l’écran par des triggers dans le niveau. Une équipe avait fait un niveau où il fallait traverser du slime puis activer une pompe avec un bouton pour l’évacuer ; une autre avait créé un labyrinthe 3D d’eau flottant dans l’espace, à traverser à la nage. J’ai encore quelques niveaux réalisés par des élèves sur mon disque dur, même si certains ne s’exécutent plus très bien.
    Pour les cours, j’avais créé un mod qui donnait un pistolet lance-fusées éclairantes à la place du blaster. C’était essentiellement le blaster, mais avec des effets sonores différents, sans modèle d’arme, et avec des projectiles affectés par la gravité, qui rebondissaient puis s’éteignaient au bout d’un certain temps. Si vous aviez suivi ce cours, vous n’auriez peut-être pas pu essayer le casque, car il ne fonctionnait pas toujours correctement.

    • Le code d’id est assurément propre et bien structuré, mais pour le grand public il était assez difficile à comprendre.
      Les commentaires à l’intérieur des fonctions sont relativement rares, et on tombe souvent sur des expressions cryptiques déconcertantes si l’on n’a pas une solide compréhension de la 3D. C’est normal, puisqu’il s’agit du travail d’un pionnier du secteur comme Carmack, mais pour le suivre avec assurance, il faut beaucoup de connaissances préalables et une certaine inclination pour les maths.
    • Je suis moi aussi coupable d’avoir écrit ce genre de code.
      À l’époque, j’écrivais chroniquement du code macaroni : 25 lignes de code servaient d’ossature à une douzaine de fonctionnalités, sur lesquelles venaient encore s’empiler une douzaine d’autres choses. L’exécution était incroyablement rapide, mais la dette technique s’accumulait vite, et ces fonctions finissaient par devenir intouchables, parce que les modifier risquait de casser tout ce qui reposait dessus.
      J’essayais d’expliquer avec des commentaires, mais la communication était mauvaise : j’écrivais seulement ce que faisait la fonction, pas comment elle fonctionnait. Des choses comme « traitement de la table SINE », « défragmentation de fragments de table », « interprétation binaire ». Tout le monde disait : « C’est quoi ce truc ? Mais qu’est-ce que c’est rapide. » Si ça avait été dans un autre domaine que le jeu vidéo, je pense que ni moi ni le produit n’aurions tenu longtemps.
    • Si vous aimez le code d’id, John Carmack on Inlined Code (2014) pourrait aussi vous intéresser : https://news.ycombinator.com/item?id=12120752
    • Je n’ai jamais vraiment fouillé en détail le code source d’id Software, mais j’ai vu beaucoup de sources de jeux absolument affreuses. La barre de référence est extrêmement basse.
      Ce qui m’a surpris, c’est que des jeux à succès, amusants et suffisamment stables soient sortis avec, en coulisses, un code relevant du désastre complet. Si un tel bric-à-brac approximatif peut quand même rapporter assez d’argent, je me demande parfois si les efforts et le temps que je consacre à éviter le chaos en valent vraiment la peine.
    • Ce serait super de pouvoir partager des captures d’écran des productions de ce cours. Ça a l’air vraiment génial.
  • J’ai ri à ce passage : https://github.com/ESWAT/john-carmack-plan-archive/blob/mast...
    Dans le .plan de John Carmack du 31 janvier 1997, il raconte être allé chez un concessionnaire Ferrari pour acheter une nouvelle F355 comme voiture « raisonnable », puis avoir vu une F40 devant lui et l’avoir finalement achetée. Il y écrivait ensuite qu’il avait désormais trop de Ferrari et prévoyait d’offrir sa première Ferrari comme prix au vainqueur d’un tournoi Quake.
    Le prix était une 328 GTS de 1987 avec turbo, parue dans le magazine Turbo en janvier 1994, qui sortait 360 ch aux roues arrière sur banc à rouleaux châssis, avec un moteur neuf et une peinture neuve, même si l’intérieur avait encore besoin de travaux. Il comptait aussi fournir de l’argent pour couvrir les taxes et l’assurance.

    • Un acheteur potentiel arrive ? Alors il suffit de garer par hasard la F40 juste à côté de l’entrée.
  • Pour partager une anecdote sur Quake II : c’est le premier jeu de tir à la première personne que j’ai terminé jusqu’au bout.
    J’y ai joué pendant une semaine, l’été, en rendant visite à un ami qui vivait dans un autre État ; sinon, je pense qu’on ne me l’aurait jamais autorisé. Au début, comme je n’avais joué qu’à DOOM, j’utilisais les mêmes commandes, et comme ça marchait étonnamment bien, j’ai avancé sans trop y penser.
    Puis, soudain, la vue s’est retrouvée bloquée au plafond et j’ai été complètement déconcerté. J’ai fini par comprendre que j’avais touché la souris, et après l’avoir tripotée un bon moment, j’ai découvert le concept de contrôle de la vue à la souris. Après ça, le jeu est devenu beaucoup plus facile.
    Il n’y avait pas Internet, ni mon ami ni moi ne connaissions le contrôle de la vue à la souris, et je n’avais jamais vu quelqu’un jouer à un vrai FPS en 3D. Aujourd’hui, cette connaissance est tellement répandue qu’il est difficile d’imaginer à quel point les interfaces de jeu de l’époque pouvaient sembler étranges et venues d’ailleurs. Je suis content que le code source soit publié.

    • Au cas où vous ne le sauriez pas, il s’agit du code source de la réédition de Quake II. Le code source original de Quake II est public depuis des années[0], tout comme plusieurs classiques d’id Software[1].
      [0]: https://github.com/id-Software/Quake-2
      [1]: https://github.com/id-Software
    • Ça me rappelle la première fois que j’ai vu plusieurs personnes jouer à un FPS en LAN.
      C’était vers 1999 à la ComicCon de Rome, en Italie, à l’époque où Half-Life venait tout juste de passer gold master et où la démo multijoueur avait été publiée. Au moins 20 personnes jouaient toutes à Half-Life en multijoueur LAN, et elles utilisaient même la souris. C’était complètement dingue.
      Ensuite, je suis allé à d’innombrables LAN parties jusqu’en 2005, mais le matchmaking en ligne a tué QuakeNet et toute la culture sociale qui allait avec.
  • Ah, ça ravive des souvenirs
    En 1999, Quake II était le jeu auquel je jouais, et littéralement presque le seul. J’ai passé un temps énorme sur QII, et j’ai écrit mon premier code en créant des mods
    Dire que Quake II m’a fait passer de simple utilisateur d’ordinateur à programmeur n’est pas exagéré. Il a orienté ma vie adulte et ma carrière
    En créant mon premier mod, j’ai appris les calculs vectoriels, à comprendre une base de code existante, et à intégrer des builds automatiques pour tester rapidement. J’ai aussi un peu touché au mapping et à l’art 3D, mais j’ai vite compris que je n’étais ni artiste ni designer
    À l’époque, je n’avais absolument aucune gestion de versions ni politique de sauvegarde, donc j’ai perdu tout le code original. Le jeu dans lequel je me suis plongé ensuite de façon similaire a été Tribes 2, et le scripting et le modding qu’il permettait étaient vraiment impressionnants

    • J’ai retrouvé le binaire de mon mod dans une pile interminable de fichiers
      https://xn0.co/Xeno-Mod_1.9_Setup.exe
      Bien sûr, tout le monde sur HN va naturellement télécharger et lancer un exécutable venu de n’importe quelle source sur Internet ! Mais si vous avez le QII original et que vous êtes curieux, vous pouvez l’exécuter sans risque
    • Tribes 2 a été ma première expérience de modding, et ce jeu occupe lui aussi une place très spéciale dans mon cœur. Plus tard, Sphere et RunUO, des émulateurs d’Ultima Online, m’ont fait passer de gamer à programmeur
    • Découvrir la console déroulante a été comme une révélation
      Hommage : http://guake-project.org/
  • Incroyable, ça me ramène tout droit dans les années 90. Plus précisément, je parle du premier Quake
    Il y avait sur le sol de ma chambre un PC qui devait être un Pentium 166MMX, et un ami avait apporté une machine similaire, un peu plus rapide, autour de 233. Nous n’avions pas de carte LAN
    On a utilisé le vieux câble parallèle de mon père pour faire croire à Windows qu’il s’agissait d’une connexion LAN, et ça a suffisamment bien marché pour qu’on joue pendant quelques jours. Puis on s’est un peu lassés et on a plongé dans la scène modding, sans en créer nous-mêmes, mais en téléchargeant et en testant ceux qui étaient publics. Je n’oublierai jamais Girobot et KQP (Killer Quake Patch)
    Les bots Girobot étaient assez redoutables, tant qu’ils ne restaient pas coincés dans le décor. Le vrai filon, c’était KQP, qui ajoutait toutes sortes de mods, d’armes et de systèmes de bots complètement dingues. Le Vampire Gun faisait mourir le joueur touché en se désagrégeant lentement, mais pas trop lentement, en morceaux de chair, et ça me faisait éclater de rire à chaque fois. Les années 90 me manquent vraiment

    • Par “Girobot”, tu veux dire Gyrobot[1] de “Gyro Gearloose” ?
      Pour info, il me semble que KQP incluait aussi ZeusBots
      [1] https://github.com/Jason2Brownlee/QuakeBotArchive
    • J’avais 8 Go de mods, maps et skins pour le multijoueur de Quake 2, téléchargés au modem, et parfois via une T1. Ces mods me manquent vraiment
    • Le vieux câble parallèle de ton père : vous étiez connectés en null modem ? J’avais la même configuration avec mon colocataire de fac dans notre appartement. C’était le milieu des années 90, on jouait à Doom 2 et aux FPS de l’époque, de bons souvenirs
  • J’ai vu des gens râler ailleurs parce qu’il n’y a pas de version Linux de la réédition, mais le source est publié comme ça, et il est indiqué qu’il a été testé avec clang. Gros applaudissements à id pour avoir respecté ses principes

    • Je me demande pourquoi ils ont publié ce code source. Est-ce purement par principe, ou bien parce que l’ancien code était aussi sous GPL et qu’il y avait une obligation légale ?
      Je pense qu’ils possédaient aussi l’ancien code, donc il n’y aurait pas eu d’obligation légale
    • Cette version est sortie sur toutes les grandes plateformes, et je suis presque certain qu’aujourd’hui Nintendo comme Sony utilisent Clang/LLVM dans leurs chaînes d’outils SDK. Ils avaient peut-être aussi Linux en tête, mais je pense que la motivation principale était de faire en sorte que ça compile sur les consoles modernes
    • Ce n’est que le code du jeu, pas le code source du moteur, non ? Ou alors j’ai raté quelque chose ?
  • Il y a trop de jeux qui ne sont plus vendus et qui ne tournent plus sur les piles logicielles et matérielles modernes
    J’aimerais qu’il existe une loi imposant de publier un logiciel en open source, du point de vue de son importance culturelle, si aucun patch n’a été publié pendant 20 ans pour le faire tourner sur de nouvelles plateformes

  • Je me demande ce que vous pensez de l’usage de _t comme suffixe de type en C/C++, comme dans ce source
    Si je comprends bien, c’est réservé aux types définis par le langage, mais je n’ai jamais vu d’alternative raisonnable. Sans suffixe, le code devient parfois bizarre. Par exemple, pour un type personnalisé “viewport”, je trouve que viewport_t viewport; est mieux que viewport viewport;

    • À ma connaissance, c’est plutôt une règle POSIX que quelque chose de propre au langage C. Quoi qu’il en soit, je l’utilise dans mon code personnel, mais dans les standards de code avec lesquels j’ai travaillé, c’était souvent interdit, même dans des environnements non POSIX
      En général, je ne vais pas jusqu’à m’y opposer : je nomme les types comme le guide de style le demande. Le préfixe t est pire, et écrire le mot entier typedef l’est encore plus
    • D’après ce que je comprends, ce n’est pas C qui réserve le suffixe _t, mais POSIX
      Cela dit, en travaillant sur les bases de code id Tech, j’ai pris l’habitude de _s/_t, et j’ai décidé que ça ne me gênait pas que ma base de code C soit estampillée pour toujours “non conforme POSIX”. Quoi que cela veuille dire en pratique. En C++, j’utilise simplement InitialCamelCase
    • Ça ne plaira pas à tout le monde, mais j’ai tendance à utiliser CamelCase pour les types et under_scores pour les variables. On se retrouve bien avec des formes comme Viewport viewport;, mais au moins on voit facilement que Viewport est un type
    • Quand l’IDE n’aide pas beaucoup, c’est utile si l’on doit comprendre ce qui est quoi simplement en regardant le code sous les yeux
    • Le guide de style C là où je travaille impose d’utiliser _type
      Fait intéressant, l’énorme base de code de notre produit embarqué utilisant un OS maison n’emploie pas de types comme uint32_t pour les entiers à largeur fixe. À la place, un en-tête commun à l’entreprise définit uint32, etc., sans suffixe _t. Je ne sais pas pourquoi cette décision a été prise
  • Pendant ma jeunesse, ce jeu était tout pour moi. Il m’a fait découvrir pour la première fois les clans, les ladders et une vraie culture du jeu en ligne
    Ma map, c’était The Edge, et mes armes étaient le railgun ou le lance-roquettes. À l’époque, avec la connexion par modem, trouver un serveur avec une bonne latence était essentiel. Le plus agaçant, c’étaient les gens qui utilisaient cette arme qui provoquait du lag chez tout le monde
    Je sais que Q3 est un jeu plus important, qui a parachevé le genre, mais mon préféré restera toujours Quake 2. Il avait aussi un solo solide et des extensions, et son rythme me convenait parfaitement. Avec l’arrivée de Q3, tout est devenu trop rapide

    • Les serveurs Quake Live utilisant la physique VQL pourraient te plaire
      VQL est bien plus proche de Q2, tandis que PQL se rapproche davantage de CPMA ou de QuakeWorld. En prime, The Edge est aussi jouable dans Quake Live
    • Toucher au railgun puis finir à la mitrailleuse, gg
  • Si tu es fan de Quake 2 et que tu as accès à un Oculus Quest 2, je te conseille d’essayer Quake2Quest. C’est vraiment particulier de se retrouver à courir soi-même dans des maps sur lesquelles on a passé énormément de temps autrefois