2 ポイント 投稿者 GN⁺ 2023-08-11 | 1件のコメント | WhatsAppで共有
  • 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 依存を省略可能
  • 依存関係は fmtlibjsoncpp で、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件のコメント

 
GN⁺ 2023-08-11
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 を作った。基本的にはブラスターだが、効果音が違い、武器モデルがなく、弾が重力の影響を受けて跳ね返り、一定時間が経つと消えるように変更していた。その授業に参加していたとしても、ヘッドセットを試せなかったかもしれない。いつも正常に動くとは限らなかったからだ。

    • id のコードは確かにきれいで構造も良いが、一般の人にとってはかなり理解しにくかった。
      関数内のコメントは比較的少なく、3D グラフィックスへの深い理解がないと面食らう 暗号のような式もよく出てくる。Carmack のような業界の先駆者の成果物なのだから当然ではあるが、自信を持って追っていくには多くの前提知識と、ある程度の 数学的な素養が必要だ。
    • 自分にもそういうコードを書いた罪がある。
      昔は慢性的に マカロニコードを書いていて、25行のコードが12種類の機能の骨組みになり、その上にまた12種類が積み重なるような具合だった。実行はものすごく速いが、技術的負債は急速にたまり、結局その関数群は、触ると上に載っている多くのものが壊れる危険があるため、手を出せなくなった。
      コメントで説明しようとはしたが、コミュニケーションがうまくなく、関数が何をするかだけを書いて、どう動くのかは書かなかった。「SINE テーブル処理」「テーブルのデフラグ」「バイナリ解釈」といった具合だった。みんな「これは一体何なんだ? でも速さはとんでもないな」と言っていた。ビデオゲーム以外の分野だったら、自分も製品も長くは持たなかったと思う。
    • id のコードが好きなら、John Carmack on Inlined Code (2014) も気に入るかもしれない: https://news.ycombinator.com/item?id=12120752
    • id Software のソースを詳しく掘ったことはないが、本当にひどいゲームのソースはたくさん見てきた。基準線が極端に低い。
      成功していて、面白く、十分に安定しているゲームが、裏側では完全な災害のようなコードでリリースされていたことに驚かされた。そんな雑につぎはぎしたゴミでも十分に利益を出せるなら、混乱を防ぐために費やしている自分の努力と時間が、ときどき疑わしくなる。
    • この授業の成果物のスクリーンショットを共有できるなら見てみたい。本当にすごく面白そうだ。
  • このくだりで笑った: 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馬力を出し、新しいエンジンと新しい塗装が入っているが、内装には手を入れる必要があるという。税金と保険を賄う現金も一緒に渡すつもりだった。

    • 潜在的な買い手が来るって? じゃあ F40 を偶然にも入口のすぐ横に停めておけばいいな。
  • Quake II の思い出を一つ書くと、私が初めて最後までクリアした 一人称シューティングゲームが Quake II だった。
    夏に別の州に住む友人を訪ねたとき、1週間プレイした。そうでなければ絶対に許可されなかったと思う。始めたときは、もともと DOOM しかやったことがなかったので、その操作方法をそのまま使っていたが、意外と通用して、あまり深く考えずに進めていた。
    ところが突然、視点が天井に固定されて完全に困惑した。実はマウスを触っていたのだと分かり、しばらくいじった末に マウスで視点を操作するという概念に気づいた。その後、ゲームはずっと簡単になった。
    インターネットもなく、自分も友人もマウスで視点操作することを知らず、本物の 3D FPS をプレイしている人を見たこともなかった。今では知識があまりに広く行き渡っているので、当時のゲームインターフェースがどれほど見慣れず、異質だったかを想像するのは難しい。ソースコードが公開されてうれしい。

    • もし知らなかったなら、これは Quake II 再リリース版のソースコードだ。元の Quake II のソースコードは何年も前から公開されており[0]、id Software のいくつもの古典作品も一緒に公開されている[1]。
      [0]: https://github.com/id-Software/Quake-2
      [1]: https://github.com/id-Software
    • 初めて複数人が LAN で FPS をプレイしているのを見たときのことを思い出す。
      1999年ごろ、イタリア・ローマの ComicCon にいた。Half-Life がちょうどゴールドマスターに入り、マルチプレイのデモが公開された時期だった。少なくとも20人が全員 LAN マルチプレイの Half-Life をプレイしていて、しかもマウスまで使っていた。狂ったような光景だった。
      その後2005年まで数多くの LAN パーティーに行ったが、オンラインマッチメイキングが QuakeNet と社交文化を殺してしまった。
  • ああ、懐かしいな
    1999年、Quake IIは自分がやっていたゲームで、文字どおりほぼ唯一のゲームだった。QIIにものすごい時間をつぎ込み、Mod制作で初めてコードを書いた
    Quake IIが自分をコンピュータユーザーからプログラマーに変えたと言っても過言ではない。成人後の人生とキャリアの方向を決めてくれた
    最初のModを作りながら、ベクトル計算、既存コードベースの理解、高速テストのための自動ビルド統合を学んだ。マップ制作や3Dアートにも少し手を出したが、すぐに自分はアーティストでもデザイナーでもないと悟った
    当時はバージョン管理もバックアップ方針もまったくなかったので、元のコードは全部なくしてしまった。その次に同じくらいハマったゲームはTribes 2で、そこで可能だったスクリプティングとModdingは本当にすごかった

    • 果てしないファイルの山から自分のModのバイナリを見つけた
      https://xn0.co/Xeno-Mod_1.9_Setup.exe
      HNのみんなは当然、どこのインターネット由来かわからない実行ファイルでもダウンロードして実行するだろうけど! それでもオリジナルのQIIを持っていて気になるなら、実行しても安全だ
    • Tribes 2が自分にとって初めてのModding体験で、そのゲームも自分の中でとても特別な位置を占めている。その後、Ultima OnlineエミュレーターのSphereとRunUOが、自分をゲーマーからプログラマーに変えてくれた
    • ドロップダウンコンソールを発見したときは啓示のようだった
      オマージュ: 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年代が本当に恋しい

    • 「Girobot」って、「Gyro Gearloose」のGyrobot[1]のことかな?
      ちなみにKQPにはZeusBotsも含まれていたと思う
      [1] https://github.com/Jason2Brownlee/QuakeBotArchive
    • モデムで、ときにはT1でダウンロードしたQuake 2マルチプレイ用のMod、マップ、スキンが8GBもあった。あのModたちが本当に懐かしい
    • 父親の古いパラレルケーブルって、ヌルモデムで接続したのかな? 大学時代のルームメイトとアパートで同じ構成を使っていた。90年代半ばだったのでDoom 2や当時のFPSをやっていて、いい思い出だ
  • 再リリース版にLinux版がないと他所でぼやいているのを見たが、こうしてソースを公開していて、clangでテスト済みだと書かれている。原則を守ったidに大きな拍手を送りたい

    • なぜ今回のソースコードを公開したのか気になる。純粋に原則からなのか、昔のコードもGPLだったので法的義務があったのかはわからない
      昔のコードも彼らが所有していたはずだから、法的義務はなかったのではないかと思う
    • このバージョンは主要プラットフォーム全体にリリースされており、今のNintendoとSonyはいずれもSDKツールチェーンにClang/LLVMを使っているとかなり確信している。Linuxも念頭にあった可能性はあるが、現代のコンソールでビルドできるようにすることが主な動機だったのだと思う
    • これはゲームコードだけで、エンジンのソースコードではないように見えるけど、自分は何か見落としているのかな?
  • もはや販売されておらず、現代のソフトウェア・ハードウェアスタックでは動かないゲームが多すぎる
    ソフトウェアについて、20年間新しいプラットフォームで動くようにするパッチを出していないなら、文化的重要性の観点からオープンソースとして公開すべき、という法律があればいいのにと思う

  • このソースのように、C/C++で型のサフィックスに**_t**を使うことについてどう思うか気になる
    自分の理解では、言語定義の型用に予約されているが、合理的な代替案を見たことがない。サフィックスがないとコードが変になることもある。たとえば「viewport」用のカスタム型なら、viewport viewport;よりviewport_t viewport;のほうがいいと思う

    • それはC言語そのものというよりPOSIX側の規則だと思う。いずれにせよ自分の個人コードでは使っているが、自分が関わってきたコーディング標準では、非POSIX環境でもよく禁止されていた
      たいていは反対するほどではないので、スタイルガイドが望むとおりに型名を付ける。tプレフィックスはもっと悪いし、typedefという単語全体を付けるのもさらに悪い
    • 自分の理解では、_tサフィックスを予約しているのはCではなくPOSIXだ
      それでもid Techのコードベースを扱ううちに_s/_tの癖が付き、自分のCコードベースに永久に「POSIX非準拠」というラベルが貼られても構わないと判断した。それが実際に何を意味するにせよ。C++では単にInitialCamelCaseを使っている
    • みんなの好みに合うわけではないだろうが、自分は型にはCamelCaseを使い、変数にはunder_scoresを使うほうだ。Viewport viewport;のような形にはなるが、少なくともViewportが型だということはわかりやすい
    • IDEがあまり助けてくれないとき、目の前のコードだけを見て何が何なのか把握しなければならないなら便利だ
    • 自分の職場のCスタイルガイドでは_typeを使うことになっている
      興味深いことに、カスタムOSを使う組み込み製品の巨大なコードベースでは、固定幅整数型にuint32_tのような型を使っていない。代わりに会社共通ヘッダーが、_tサフィックスなしでuint32などを定義している。なぜそう決めたのかはわからない
  • 成長期の自分にとって、このゲームがすべてだった。クラン、ラダー、そして本物のオンラインゲーム文化を初めて教えてくれた
    自分のマップは The Edge で、武器はレールガンかロケットランチャーだった。当時はダイヤルアップ接続だったので、レイテンシの良いサーバーを見つけることが重要だった。一番イライラしたのは、全員にラグを引き起こすあの銃を使う人たちだった
    Q3 がこのジャンルを完成させた、より大きなゲームだというのは分かっているけれど、自分が一番好きなのはいつだって Quake 2 だ。しっかりしたシングルプレイと拡張パックもあったし、スピード感も自分にはちょうどよかった。Q3 が出てから、すべてが速すぎるようになった

    • VQL 物理を使う Quake Live サーバーが気に入るかもしれない
      VQL は Q2 にずっと近く、PQL は CPMA や QuakeWorld により近い。おまけに The Edge も Quake Live でプレイできる
    • レールガンで当てて、マシンガンで仕留める、gg
  • Quake 2 のファンで、Oculus Quest 2 を使えるなら Quake2Quest を試してみるのをおすすめする。昔ものすごく長い時間を過ごしたマップを、自分の足で走り回っているような感覚は本当に新鮮だ