Quake II Rerelease Game Source - code du jeu pour la réédition 2023 de Quake II
(github.com/id-Software)- 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 mymodau lancement ou en saisissantgame mymoddans 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
cgamede 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,rogueetxatrixdu 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 à
fmtlibpeut ê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
spawnflagsen 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
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.
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.
À 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.
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.
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.
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é.
[0]: https://github.com/id-Software/Quake-2
[1]: https://github.com/id-Software
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
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
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
Pour info, il me semble que KQP incluait aussi ZeusBots
[1] https://github.com/Jason2Brownlee/QuakeBotArchive
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 pense qu’ils possédaient aussi l’ancien code, donc il n’y aurait pas eu d’obligation légale
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 queviewport viewport;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
test pire, et écrire le mot entiertypedefl’est encore plus_t, mais POSIXCela 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 InitialCamelCaseunder_scorespour les variables. On se retrouve bien avec des formes commeViewport viewport;, mais au moins on voit facilement queViewportest un type_typeFait intéressant, l’énorme base de code de notre produit embarqué utilisant un OS maison n’emploie pas de types comme
uint32_tpour les entiers à largeur fixe. À la place, un en-tête commun à l’entreprise définituint32, etc., sans suffixe_t. Je ne sais pas pourquoi cette décision a été prisePendant 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
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
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