PICKET
A Space Combat Sim in the Shape of the 1993 Ones
1993年頃の名作の形をした宇宙戦闘シミュレーター





Overview
概要Picket is a space combat sim built the way they were built in 1993: solid flat-shaded hulls, a cockpit you fly from the inside of, named wingmen who stay dead, and a jump drive that will not spin up while something hostile is close aboard. It is named for the ship posted ahead of the fleet to give warning — which is also the job.
Picketは、1993年当時と同じ作り方で作った宇宙戦闘シミュレーターです。フラットシェーディングの立体的な船体、内側から操縦するコックピット、撃墜されたら戻らない名前のある僚機、そして近くに敵がいる間は起動しないジャンプドライブ。名前は、艦隊の前方に配置されて危険を知らせる哨戒艦(picket)から取りました。それがこのゲームでの任務でもあります。
It is in the spirit of Wing Commander (1990) and Elite (1984), and it takes their constraints seriously rather than decoratively. Everything is drawn into a 320×200 framebuffer and blown up with nearest-neighbour filtering, so the pixels stay chunky; music and every sound effect are synthesised at runtime by a two-operator FM synth, with nothing sampled. Adopting the limits is what forces the design decisions to be real ones.
Wing Commander(1990年)とElite(1984年)の精神を受け継ぎ、当時の制約を飾りではなく本気で取り入れています。すべてを320×200のフレームバッファに描画し、最近傍補間で拡大するため、ピクセルは粗いままです。音楽と効果音はすべて、2オペレーターのFMシンセで実行時に合成しており、録音した音は一切使っていません。制約を受け入れることで、設計上の判断が本物の判断になります。
How it was built
開発The campaign is twelve missions in four acts, with briefings, debriefs, scripted radio beats and an unlockable dossier. Nine years ago the Ridge fought a war it lost by winning; one ship was still working when the shooting stopped, and its standing order was recover, repair, return to service. Nobody cancelled it. Objectives are deliberately not all 'kill everything' — hold a scan on a drifting hull, escort an unarmed lighter, break a tow, race four scouts' signal timers, survive and jump out, and finally take nine kilometres of slipway apart node by node.
キャンペーンは4幕12ミッションで、ブリーフィング、デブリーフィング、台本どおりの無線、解放できる資料集があります。9年前、リッジは勝つことで負けた戦争を戦いました。戦闘が終わったとき、まだ動いていた船が一隻だけあり、その常設命令は「回収し、修理し、再び任務に就かせよ」でした。誰もその命令を取り消しませんでした。目標はあえて「すべて撃墜」ばかりにしていません。漂流する船体をスキャンし続ける、武装のない艀を護衛する、曳航を断ち切る、4機の偵察機の信号タイマーと競う、生き延びて離脱する、そして最後に9キロメートルの船台を拠点ごとに解体します。
What it does
機能Vane, Ash, Koto and Bril fly with you, and if one dies she is gone for the rest of the campaign. From Act III the tender flies your dead back at you, by name, at exactly the skill number they had, because that is what the flight recorder wrote down. A lost pilot's record is struck through and marked RECOVERABLE; once the revenants start flying it reads IN SERVICE — NOT OURS.
ヴェイン、アッシュ、コト、ブリルが一緒に飛び、撃墜されるとキャンペーンの最後まで戻りません。第3幕からは、母艦が失われた仲間を名前つきで、当時の技能値そのままに差し向けてきます。フライトレコーダーがそう記録したからです。失われたパイロットの記録には取り消し線と「回収可能」の文字が入り、彼女たちが敵として飛び始めると「稼働中・味方ではない」に変わります。
They come in, take their shot, break off through the merge and extend into clear space before turning back — passes you can point at, rather than a ring of ships orbiting your canopy. They lead their shots and run when they are hurt. The fight is tuned so it cannot be won without you: rounds fired by one AI at another land at a fraction of strength, damped hardest for your own wingmen, so Vane can hold a bandit off you but cannot clear the sky while you watch.
敵は接近して撃ち、すれ違いざまに離脱し、開けた空間まで距離を取ってから引き返してきます。キャノピーの周りを回り続ける輪ではなく、目で追える航過です。偏差射撃をし、損傷すれば逃げます。プレイヤーなしでは勝てないよう調整しています。AI同士の射撃は威力が一部しか届かず、特に味方の僚機は大きく抑えています。ヴェインは敵を引きつけてはくれますが、見ているだけで空を片付けてはくれません。
2.6 seconds to spin up, and it refuses to start with hostiles inside 700 units. You cannot simply leave when it turns bad — you have to make space first.
起動に2.6秒かかり、700ユニット以内に敵がいると起動しません。状況が悪くなっても、すぐには逃げられません。まず距離を作る必要があります。
Warp points inside a mission. Fly into the throat, hold the drive key, and the mission builds a different piece of sky around you: the tow lane's far end, the yard interior, the tender's berth. The ring will not fire with hostiles close, same as the drive.
ミッション内のワープポイントです。リングに飛び込み、ドライブのキーを押し続けると、周囲に別の宙域が組み立てられます。曳航路の向こう端、造船所の内部、母艦の係留区画などです。ドライブと同様、近くに敵がいるとリングは作動しません。
Arm them and the sight grows a seeker gate. It takes the nearest contact on your nose by itself — twenty-eight degrees, out to 1600 units — and holding it there for under a second closes the brackets to a lock. Let it slide off the nose and the lock bleeds back out. One lock, one missile, and the missile leads its target instead of chasing it.
ミサイルを選ぶと照準にシーカーの枠が現れ、機首の前方28度・1600ユニット以内で最も近い目標を自動で捉えます。1秒弱そのまま保つと枠が閉じてロックオンし、機首から外れるとロックは徐々に解けます。ロック1回につきミサイル1発で、ミサイルは目標を追いかけるのではなく、未来位置を狙って飛びます。
Kestrel Gate, Anvil Picket, Harrow Reach, Marrow Field, Tessellate Yard and Sable Deep, each with its own colour of void, its own star, near-field dust and clouds at infinity. Kestrel's ice giant carries a ring that throws a shadow across itself; Anvil's homeworld has lights on its night side. The hulls run from a 30-hit-point recovery drone to a fortress and nine kilometres of fleet tender.
ケストレル・ゲート、アンヴィル・ピケット、ハロウ・リーチ、マロウ・フィールド、テッセレート・ヤード、セーブル・ディープ。それぞれに固有の空間の色、恒星、手前の塵、遠景の雲があります。ケストレルの巨大氷惑星には自らに影を落とす環があり、アンヴィルの母星は夜の側に街の灯りがあります。船体は耐久30の回収ドローンから、要塞、全長9キロメートルの母艦まであります。
Under the hood
技術の詳細Re-squaring the basis every frame毎フレーム基底を直す
Orientation is a full 3×3 rotation matrix integrated from angular velocity, which drifts out of orthonormality within a minute or two of flying — the axes stop being unit length and square to each other and the ship starts to shear. Gram-Schmidt re-squares it each frame, treating forward as authoritative because it is what the player aims with.
向きは角速度から積分した完全な3×3の回転行列で持ちますが、1〜2分飛ぶと正規直交からずれていきます。軸が単位長でも互いに直交でもなくなり、機体がゆがみ始めます。毎フレームGram-Schmidt法で直し、プレイヤーが照準に使う「前方」を基準にします。
Painter's algorithm and its limits画家のアルゴリズムとその限界
Objects are depth-sorted, then faces within each object — correct for convex hulls that do not overlap, and what the era did. Faces straddling the camera plane are clipped against the near plane first, because a polygon crossing z=0 projects to infinity. Planets are drawn as shaded discs rather than meshed spheres: at that distance a sphere is a disc, and the terminator, banding and lit limb each cost one arc.
物体を奥行き順に並べ、次に各物体の面を並べます。重ならない凸形状の船体なら正しく、当時のゲームもこの方法でした。カメラ平面をまたぐ面は先に近クリップ面で切り取ります。z=0をまたぐポリゴンは無限遠に投影されるからです。惑星は球のメッシュではなく陰影つきの円盤で描きます。その距離では球は円盤に見え、明暗境界線、縞模様、明るい縁はそれぞれ円弧一本で済みます。
Keying the cockpit plateコックピット画像の切り抜き
The canopy was supplied as a green screen, and three things had to be right, each of which failed visibly first. Key on saturation rather than brightness — the screen green runs 2.7× red while the ribs' own highlight is only 1.3×, so a brightness key eats the highlight and punches holes in the metal. Downsample by block rather than by point, since each output pixel covers ~3.6 source pixels and sampling one leaves green speckle along every edge. And de-spill, or every outline wears a halo. The tool reports orphan pixels removed; that number should be 0.
キャノピーはグリーンバックで用意されていて、正しくすべき点が3つあり、どれも最初は目に見えて失敗しました。明るさではなく彩度で抜くこと。背景の緑は赤の2.7倍ですが、骨組みのハイライトは1.3倍しかなく、明るさで抜くとハイライトが消えて金属に穴が開きます。縮小は点ではなくブロック単位で行うこと。出力の1ピクセルは元画像の約3.6ピクセルに相当し、1点だけを拾うと輪郭に緑の点が残ります。そして色かぶりを除去すること。しないと輪郭に縁取りが出ます。ツールは除去した孤立ピクセル数を報告し、その値は0であるべきです。
A fight that cannot be won without youプレイヤーなしでは勝てない戦い
Rounds fired by one AI at another land at a fraction of their strength, damped hardest for your own wingmen. Vane can hold a bandit off you, but she cannot clear the sky while you watch — which is the difference between having a flight and being a spectator to one.
AI同士の射撃は威力の一部しか届かず、特に味方の僚機は大きく抑えています。ヴェインは敵を引きつけてくれますが、見ているだけで空を片付けてはくれません。それが、編隊を率いることと、編隊の戦いを眺めることの違いです。
Stack
技術構成Plain ES5 in classic script tags — no build step, no bundler, no dependencies. Orientation is a full 3×3 basis rather than a heading, because a fighter has to be able to point anywhere; it is integrated from angular velocity and drifts out of orthonormality within a minute or two of flying, so every frame the basis is re-squared with Gram-Schmidt, treating forward as authoritative because it is what the player aims with. The stick commands an angular rate the airframe accelerates toward and damps out of, so centring it does not stop the rotation dead — that lag is what gives the ship mass. Hidden surfaces are handled by painter's algorithm: objects depth-sorted, then faces within each object, with faces straddling the camera plane clipped against the near plane first because a polygon crossing z=0 projects to infinity. Planets are real bodies at real coordinates lit by the same sun as the hulls, drawn as shaded discs rather than meshed spheres — at that distance a sphere is a disc, and the terminator, banding and lit limb each cost one arc. The cockpit is a painted plate whose canopy was supplied as a green screen and keyed to transparency, so the world renders full-frame with the plate over it and the frame ribs occlude for free, with no clipping maths at all.
クラシックなscriptタグで読み込む素のES5で、ビルド工程もバンドラーも依存ライブラリもありません。戦闘機はどの方向にも向けなければならないため、向きは方位角ではなく完全な3×3の基底で持ちます。角速度から積分すると1〜2分の飛行で正規直交からずれていくため、毎フレームGram-Schmidt法で直し、プレイヤーが照準に使う「前方」を基準にします。スティックは角速度を指示し、機体はそこへ加速し、減衰しながら戻ります。そのためスティックを中央に戻しても回転はぴたりとは止まらず、その遅れが機体に質量を感じさせます。隠面処理は画家のアルゴリズムで、物体を奥行き順に並べ、さらに各物体の面を並べます。カメラ平面をまたぐ面は先に近クリップ面で切り取ります。z=0をまたぐポリゴンは無限遠に投影されてしまうからです。惑星は実際の座標にある本物の天体で、船体と同じ太陽に照らされ、球体のメッシュではなく陰影をつけた円盤として描きます。その距離では球は円盤に見え、明暗境界線、縞模様、明るい縁はそれぞれ円弧一本で済みます。コックピットは描かれた一枚の画像で、キャノピー部分はグリーンバックで用意されたものを透明に抜いています。そのため世界を画面全体に描き、その上に画像を重ねるだけで、フレームの骨組みによる遮蔽がクリッピング計算なしで実現します。
Where it is now
現状と今後Picket is a complete twelve-mission campaign in four acts, with six locations, twenty-two hulls, a roster that persists its dead and an in-game flight manual. It runs from any local server today but has not been packaged or published — a signed macOS shell around the same unmodified game, as Causeway ships, is the obvious next step.
Picketは4幕12ミッションのキャンペーンとして完成しており、6つの宙域、22種の船体、撃墜された仲間が戻らない編成、ゲーム内の飛行マニュアルを備えています。現在はローカルサーバーから動かせますが、パッケージ化や公開はしていません。Causewayと同じように、手を加えないゲームを署名済みのmacOSアプリで包むのが次の自然なステップです。
The two things that make it feel like 1993 are not the pixels. They are that your wingmen are finite, and that leaving is something you have to arrange rather than something you can do. Both are rules, not effects — and rules are what the era actually got right.
1993年らしさを生むのはピクセルではありません。僚機に限りがあること、そして離脱は好きなときにできるものではなく、段取りを整えて行うものだということです。どちらも演出ではなくルールで、当時が本当に正しくとらえていたのはルールでした。