Quake II Rerelease Game Source - Quake II 2023再リリース向けゲームコード
(github.com/id-Software)- Quake II 2023再リリース版のゲームコードと参照用のオリジナルゲームコードを収録し、ユーザーがゲームをモッド化できるようにするソースコード
- モッドはオリジナルゲームと同じ方法で再リリース版にロードでき、起動時に
+set game mymodを使うか、実行中にコンソールでgame mymodを入力して利用可能 - オリジナルのゲームファイルを変更しないため、モッドは
%USERPROFILE%\Saved Games\Nightdive Studios\Quake IIディレクトリにインストールする方式を推奨 - 再リリース版はサーバーとゲームモジュール間の通信に新しいAPIを使用し、従来ハードコードされていたクライアント動作を変更できるよう、Quake III Arena の
cgameモジュールに似た薄いクライアントゲームモジュールを導入 - コードベースはオリジナルゲームの
baseq2,ctf,rogue,xatrixゲームモジュールを統合した形で、C++17 コンパイラが必要 - コンパイルは Clang、VS2019、VS2022 でのみテストされており、C++17 と C++20 の両方でコンパイル可能。C++20 を使う場合は
fmtlib依存を省略可能 - 依存関係は fmtlib と jsoncpp で、
vcpkg install jsoncpp:x64-windows fmt:x64-windowsでインストール可能 - 再リリース版の DLL ではオリジナル拡張パックのマップが正しくロードされない場合があり、競合する
spawnflags問題を解決するためにマップが修正されていることがある - 既存モッドはゲーム export インターフェースの変更に合わせて移行できる可能性があるが、すべての拡張パックを単一コードベースでサポートし、新機能を反映するため構造とレイアウトに大きな変更があるため、新しいコードベースを使う場合は書き直しが必要な可能性
- ゲーム DLL 内部ロジックはオリジナルエンジンの 10hz ではなく40hz tickrateに調整されており、25ms 単位のステップと帯域幅・CPU 負荷のバランスを理由に 40hz を採用
- セーブシステムはポインタオフセットやメモリコピーの代わりに、レベル・ゲームデータを UTF-8 JSON として記録し、もはやファイルシステムと直接インターフェースしない
- Quake II 再リリース版はサーバープロトコルversion 2023を使用し、ほとんどのメッセージは下位互換だが、新機能・変更機能・引き上げられた制限のため一部調整されている
- id Software はこのリリースに対するサポートを提供できず、コミュニティ主導のリソース活用を推奨
1件のコメント
Hacker News のコメント
Quake II は、私が初めて C を書いた経験だった。
コードは明快で一貫していて素直だった。これまで読んだ中で最高のソースだとまでは言わないが、自分の基準を高くしてくれた。その後、いろいろなゲームのソースで、画面の右端を越えていくようなネストや、無数のことをこなす巨大な関数といった奇妙なコードをたくさん見たが、シンプルなコードでもすごいことができるという初期の教訓になった。
1990年代末から2000年代初めにかけて、Quake と Quake II を使って子どもたちに VR の授業をしていた。VR ヘッドセットと、Q.E.D. や Qoole を入れた PC を何台か用意し、12〜14歳または14〜18歳の生徒たちに自分だけの仮想現実ゲームを作らせていた。
実際には、モンスターや銃のない Quake/Quake II のレベルを作るというものだった。レベル内のトリガーで画面メッセージを表示し、物語を伝えていた。あるチームはスライムを渡り、ボタンでポンプを動かしてスライムを抜くレベルを作り、別のチームは宇宙に浮かぶ水の 3D 迷路を作って、泳いで通り抜けるようにしていた。今でも生徒が作ったレベルのいくつかをハードディスクに持っているが、一部はうまく動かない。
授業用には、ブラスターの代わりに照明弾銃を持たせる mod を作った。基本的にはブラスターだが、効果音が違い、武器モデルがなく、弾が重力の影響を受けて跳ね返り、一定時間が経つと消えるように変更していた。その授業に参加していたとしても、ヘッドセットを試せなかったかもしれない。いつも正常に動くとは限らなかったからだ。
関数内のコメントは比較的少なく、3D グラフィックスへの深い理解がないと面食らう 暗号のような式もよく出てくる。Carmack のような業界の先駆者の成果物なのだから当然ではあるが、自信を持って追っていくには多くの前提知識と、ある程度の 数学的な素養が必要だ。
昔は慢性的に マカロニコードを書いていて、25行のコードが12種類の機能の骨組みになり、その上にまた12種類が積み重なるような具合だった。実行はものすごく速いが、技術的負債は急速にたまり、結局その関数群は、触ると上に載っている多くのものが壊れる危険があるため、手を出せなくなった。
コメントで説明しようとはしたが、コミュニケーションがうまくなく、関数が何をするかだけを書いて、どう動くのかは書かなかった。「SINE テーブル処理」「テーブルのデフラグ」「バイナリ解釈」といった具合だった。みんな「これは一体何なんだ? でも速さはとんでもないな」と言っていた。ビデオゲーム以外の分野だったら、自分も製品も長くは持たなかったと思う。
成功していて、面白く、十分に安定しているゲームが、裏側では完全な災害のようなコードでリリースされていたことに驚かされた。そんな雑につぎはぎしたゴミでも十分に利益を出せるなら、混乱を防ぐために費やしている自分の努力と時間が、ときどき疑わしくなる。
このくだりで笑った: https://github.com/ESWAT/john-carmack-plan-archive/blob/mast...
1997年1月31日の John Carmack の .plan で、新しい F355 を「合理的な」車として買うため Ferrari の店に行ったところ、目の前にあった F40 を見て結局それを買った、という内容だ。その後、Ferrari が多くなりすぎたので、最初の Ferrari を Quake トーナメントの優勝賞品にする計画も書かれていた。
賞品は1987年式の 328 GTS ターボチャージャーモデルで、1994年1月の Turbo 誌に掲載され、シャシーダイナモで後輪360馬力を出し、新しいエンジンと新しい塗装が入っているが、内装には手を入れる必要があるという。税金と保険を賄う現金も一緒に渡すつもりだった。
Quake II の思い出を一つ書くと、私が初めて最後までクリアした 一人称シューティングゲームが Quake II だった。
夏に別の州に住む友人を訪ねたとき、1週間プレイした。そうでなければ絶対に許可されなかったと思う。始めたときは、もともと DOOM しかやったことがなかったので、その操作方法をそのまま使っていたが、意外と通用して、あまり深く考えずに進めていた。
ところが突然、視点が天井に固定されて完全に困惑した。実はマウスを触っていたのだと分かり、しばらくいじった末に マウスで視点を操作するという概念に気づいた。その後、ゲームはずっと簡単になった。
インターネットもなく、自分も友人もマウスで視点操作することを知らず、本物の 3D FPS をプレイしている人を見たこともなかった。今では知識があまりに広く行き渡っているので、当時のゲームインターフェースがどれほど見慣れず、異質だったかを想像するのは難しい。ソースコードが公開されてうれしい。
[0]: https://github.com/id-Software/Quake-2
[1]: https://github.com/id-Software
1999年ごろ、イタリア・ローマの ComicCon にいた。Half-Life がちょうどゴールドマスターに入り、マルチプレイのデモが公開された時期だった。少なくとも20人が全員 LAN マルチプレイの Half-Life をプレイしていて、しかもマウスまで使っていた。狂ったような光景だった。
その後2005年まで数多くの LAN パーティーに行ったが、オンラインマッチメイキングが QuakeNet と社交文化を殺してしまった。
ああ、懐かしいな
1999年、Quake IIは自分がやっていたゲームで、文字どおりほぼ唯一のゲームだった。QIIにものすごい時間をつぎ込み、Mod制作で初めてコードを書いた
Quake IIが自分をコンピュータユーザーからプログラマーに変えたと言っても過言ではない。成人後の人生とキャリアの方向を決めてくれた
最初のModを作りながら、ベクトル計算、既存コードベースの理解、高速テストのための自動ビルド統合を学んだ。マップ制作や3Dアートにも少し手を出したが、すぐに自分はアーティストでもデザイナーでもないと悟った
当時はバージョン管理もバックアップ方針もまったくなかったので、元のコードは全部なくしてしまった。その次に同じくらいハマったゲームはTribes 2で、そこで可能だったスクリプティングとModdingは本当にすごかった
https://xn0.co/Xeno-Mod_1.9_Setup.exe
HNのみんなは当然、どこのインターネット由来かわからない実行ファイルでもダウンロードして実行するだろうけど! それでもオリジナルのQIIを持っていて気になるなら、実行しても安全だ
オマージュ: http://guake-project.org/
すごい、まるごと90年代に連れ戻される。正確には最初のQuakeの話だけど
寝室の床にPentium 166MMXだったと思うPCがあり、友人が少し速い233くらいの似たようなマシンを持ってきた。LANカードはなかった
父の古いパラレルケーブルを使って、WindowsにLAN接続であるかのように思い込ませたところ、十分うまく動いて数日間プレイできた。そのうち少し飽きてModシーンにハマったが、自分で作るのではなく、公開されているものをダウンロードして試していた。GirobotとKQP(Killer Quake Patch)は絶対に忘れられない
Girobotのボットたちは地形に引っかかりさえしなければかなり強かった。本当の宝の山はKQPで、あらゆるぶっ飛んだModや武器、ボットシステムを追加してくれた。Vampire Gunは、当たったプレイヤーがゆっくりと、しかし遅すぎない速度で肉塊の破片になって崩れ落ちて死ぬようにするもので、毎回腹を抱えて笑った。90年代が本当に恋しい
ちなみにKQPにはZeusBotsも含まれていたと思う
[1] https://github.com/Jason2Brownlee/QuakeBotArchive
再リリース版にLinux版がないと他所でぼやいているのを見たが、こうしてソースを公開していて、clangでテスト済みだと書かれている。原則を守ったidに大きな拍手を送りたい
昔のコードも彼らが所有していたはずだから、法的義務はなかったのではないかと思う
もはや販売されておらず、現代のソフトウェア・ハードウェアスタックでは動かないゲームが多すぎる
ソフトウェアについて、20年間新しいプラットフォームで動くようにするパッチを出していないなら、文化的重要性の観点からオープンソースとして公開すべき、という法律があればいいのにと思う
このソースのように、C/C++で型のサフィックスに**_t**を使うことについてどう思うか気になる
自分の理解では、言語定義の型用に予約されているが、合理的な代替案を見たことがない。サフィックスがないとコードが変になることもある。たとえば「viewport」用のカスタム型なら、
viewport viewport;よりviewport_t viewport;のほうがいいと思うたいていは反対するほどではないので、スタイルガイドが望むとおりに型名を付ける。
tプレフィックスはもっと悪いし、typedefという単語全体を付けるのもさらに悪い_tサフィックスを予約しているのはCではなくPOSIXだそれでもid Techのコードベースを扱ううちに
_s/_tの癖が付き、自分のCコードベースに永久に「POSIX非準拠」というラベルが貼られても構わないと判断した。それが実際に何を意味するにせよ。C++では単にInitialCamelCaseを使っているunder_scoresを使うほうだ。Viewport viewport;のような形にはなるが、少なくともViewportが型だということはわかりやすい_typeを使うことになっている興味深いことに、カスタムOSを使う組み込み製品の巨大なコードベースでは、固定幅整数型に
uint32_tのような型を使っていない。代わりに会社共通ヘッダーが、_tサフィックスなしでuint32などを定義している。なぜそう決めたのかはわからない成長期の自分にとって、このゲームがすべてだった。クラン、ラダー、そして本物のオンラインゲーム文化を初めて教えてくれた
自分のマップは The Edge で、武器はレールガンかロケットランチャーだった。当時はダイヤルアップ接続だったので、レイテンシの良いサーバーを見つけることが重要だった。一番イライラしたのは、全員にラグを引き起こすあの銃を使う人たちだった
Q3 がこのジャンルを完成させた、より大きなゲームだというのは分かっているけれど、自分が一番好きなのはいつだって Quake 2 だ。しっかりしたシングルプレイと拡張パックもあったし、スピード感も自分にはちょうどよかった。Q3 が出てから、すべてが速すぎるようになった
VQL は Q2 にずっと近く、PQL は CPMA や QuakeWorld により近い。おまけに The Edge も Quake Live でプレイできる
Quake 2 のファンで、Oculus Quest 2 を使えるなら Quake2Quest を試してみるのをおすすめする。昔ものすごく長い時間を過ごしたマップを、自分の足で走り回っているような感覚は本当に新鮮だ