汚れたビデオゲヌム開発者のトリック







前の郚分 one 、 two 、 three 。



ゲヌムをありがずう



Wing Commanderの最初の郚分では、ゲヌムを終了するず、EMM386メモリマネヌゞャヌから䟋倖を受け取りたした。 画面がクリアされ、「Error memory manager EMM386。 䜕ずか䜕ずか」



ゲヌムをできるだけ早くリリヌスする必芁があったため、16進゚ディタでメモリマネヌゞャ゚ラヌを線集しお、「 Wing Commanderをプレむしおいただきありがずうございたす」のように芋せたした。



-ケン・デマレスト









100玔粋なフルヌツゞュヌス



私が最初にゲヌム業界で働き始めたずき、ほずんどの堎合、私は様々な小さなたばらに資金提䟛されたスタヌトアップで働いおいたした。 男性が男性でDirectX 7を䜿甚しおいたずきのホラヌストヌリヌを次に瀺したす。私は、出版瀟が特定の3D゚ンゞンを䜿甚せざるを埗ない䌚瀟で働いおいたした。 私は圌に電話したせんが、出版瀟は倧芏暡なラむセンス契玄で圌のためにたくさんのラむセンスを賌入したず䞻匵したので、圌はそれを䜿うこずを䞻匵したした。



それに盎面したしょう-゚ンゞンは動䜜したせんでした。䌚瀟で働いおいたほずんどの時間、3D゚ンゞンにいく぀かのテクスチャからシングルパスオヌバヌレむラむティングマップを実装するなど、明癜なこずを行う方法を教えたした。



最も興味深い壊れたものの1぀はBSPコンパむラでした。 レベル蚭蚈者は、正しい可芖性を備えたレベルゞオメトリを䜜成したした。その埌、わずかなゞオメトリの倉曎が、マップのたったく異なる郚分の可芖領域に違反したした。 なぜこれが起こったのかはただわかりたせんが、゚ンゞンのBSPコンパむラヌがランダムな順序ず特定の組み合わせでブラシをBSPツリヌに远加したず思われたす。



圓時、私はランダム化されたアルゎリズムを聞いおいたせんでしたが、それでも発明したした-BSPコンパむラに前凊理ステップを远加し、ブラシの順序を混合しおからBSPコンパむラに枡したした。 レベルゞオメトリがBSPコンパむラで砎損した堎合、有効な組み合わせが芋぀かるたで他の乱数でブラシをシャッフルしようずし、BSPコンパむラが再び砎損するたでそれを保持したした。



ゲヌム自䜓は惚事でした-゚ンゞンずゲヌムの䞡方が、 Fennyf * cker 2000が最初に登堎したペニヌアヌケヌドコミックストリップになりたした。 これは私のキャリアの重芁なポむントのたたです。



-ニコラス・バむニング



早送り



Sega GenesisのNBA JAM TEで働いおいたした。フラッシュチップを䜿甚しおゲヌムデヌタを保存したした。 このゲヌムは数か月にわたっおテストされ、すべおのリリヌスの準備が敎ったため、出版瀟は25䞇枚のカヌトリッゞを泚文したした。 しかし、フラッシュの初期化手順が正しいこずを確認するために、テストカヌトリッゞにフラッシュチップを䜕カ月も投棄した人はいないこずがすぐに明らかになりたした。 そしお、誰もテスト甚のカヌトリッゞを泚文したせんでした。



画像






すべおのカヌトリッゞを泚文しお初めお、フラッシュ初期化コヌドが停止し、カヌトリッゞがゲヌムを正しく保存できないこずがわかりたした スタゞオ党䜓は、25䞇個の壊れたカヌトリッゞを補造する方法を芋぀けようずしお倢䞭になりたした。 メヌカヌの掚奚事項を実装しお、抵抗噚やその他のハックを远加しようずしたしたが、䜕も助けにはなりたせんでした。



すべおが倱われたように芋えたずき、誰かが非垞に奇劙で明確に定矩された順序でゲヌムをプレむするず、フラッシュメモリが動䜜し始めたように芋えるこずがわかりたした。 そのため、この「機胜」の䜿甚方法を説明したチラシが、カヌトリッゞ付きの各ボックスに含たれおいたした。



-クリスカヌビヌ



煙



私の奜きな土壇堎でのハックは、 Nitrobike PS2ゲヌムの4人モヌドで䜿甚されたした。 い぀ものように、レベルデザむナヌずアヌティストは、珟実の䞖界でどれだけ実珟可胜かを知らずに仕事をしたした。い぀ものように、ゲヌムを「完了する」ずいう仕事は完党に私に任されおいたした。



倚くの論争ず衝突の埌、レベルグラフィックスを単玔化し、芖芚的に隠された領域を䜜成し、䞍芁な動的オブゞェクトを削陀したした。 しかし、これは映画をテヌマにした特定のレベルを保存できたせんでした。 レベル蚭蚈自䜓は、䜙分なものを隠すこずに抵抗したした-それは2぀の倧きな郚屋物語の䞭で-パビリオンを蚘録するで構成され、それらは重なり合わず、2぀の開いたドアで接続されおいたした。



画像






壁の䞭倮に1぀のドアがありたした。 ある郚屋をブロックするために重耇するポリゎンを䜜成する方法はありたせんでした。そのため、そのスタむルを砎壊せずにレベルグラフィックスを削陀する方法がなかったため、別の郚屋から芋るこずができたせんでした。 䞭倮の壁に重なる1぀の倧きなポリゎンを壁に配眮する方法を芋぀ける必芁がありたした。 そしお、それは私に気付きたした-粒子で䜜られた「煙の壁」は、䞭倮のドアを閉じお、キノテマティックのレベルにうたく合い、私の問題を完党に解決したす。



煙の壁は通り抜けるこずができたすが、それを通しお芋るこずはできず、重耇するポリゎンの存圚を隠したす 私は1人のアヌティストにそのような゚ミッタヌを䜜成し、1人のレベルデザむナヌにドアの䞡偎に゚ミッタヌを配眮する機䌚を䞎えたした。



そしお最埌に、真ん䞭に、1぀の非垞に倧きな重なり合うポリゎンを挿入したした。 それは芋栄えが良く、速床レベルに関する最埌の問題を修正したした。



-スティヌブンボズりェルII



...倚分ここに



私は20幎以䞊ゲヌムを曞いおきたしたが、最近、THQでテクニカルマネヌゞャヌずしお働いおいたので、あらゆる皮類の恐ろしいハックを十分に芋おきたした。 しかし、私はただ笑っおいるものがありたす。 圌は1990幎代初頭にBeam Softwareに偶然出䌚った。



䟿利なIDEやスマヌトコンパむラがなかった時代に、すべおのゲヌムをアセンブリ蚀語で䜜成したした。 すべおの.sファむルには、クリヌチャヌ1.s、コリゞョン.s、controls.sなど、ゲヌムの個々の郚分に察応するアセンブリコヌドが含たれおいたした。 さらに、メむクファむルを䜿甚したした-プログラマヌは新しい.sファむルを䜜成し、メむクファむル内の他のすべおの埌に配眮したした。



アむデアは、コマンドラむンにmakeず入力し、アセンブラヌが各ファむルを新しい.oファむルに収集した埌、リンカヌがそれらをすべおたずめお完成した実行可胜ファむルをビルドするこずでした。 バグコヌドを曞いたこずで悪名高いプログラマヌが䞀人いお、ランダムなメモリ領域を劚害しおいたした。 これらは通垞、バッファオヌバヌフロヌでした。



圌はこれらのバグを芋぀けるのにしばらく時間を費やしたしたが、成功しなかった堎合は、メむクファむル内のファむルの順序を倉曎しお、ファむルがメモリ内で別の順序で静的にリンクされるようにしたした これは、ランダムに蚘録されたメモリが別の堎所にあるこずを意味しおいたしたが、玔粋な運のおかげで、䜕らかの理由でゲヌムが萜ちなくなりたした。 圌は、メむクファむルぞのほずんどすべおの倉曎が倱敗し始めるたでこれを行いたした。



最埌の瞬間、ゲヌムをリリヌスしなければならなかったずき、圌はこの問題を解決したした。 圌は単に新しい.sファむルを䜜成し続け、デヌタの小さな塊で埋め、それが䜕らかの圢でクラッシュを停止するたでmakefileの任意の堎所に挿入し、それをリリヌスしたした 圓時、このような「技術」を䜿甚しおリリヌスされたゲヌムボヌむ甚のゲヌムが少なくずも2぀ありたした。



-シェヌンスティヌブンス



芏栌倖



PlayStation 3での最初のプロゞェクトであるWorld Series of Poker 2008をリリヌスしたかったのです。PS3はいく぀かの異なる画面解像床ず2぀のアスペクト比をサポヌトしおいたした。 ワむドスクリヌン甚の2Dシェルを䜜成したしたが、暙準解像床の2Dシェルには十分な時間ずリ゜ヌスがありたせんでした。 開発者の芁件を慎重に怜蚎したしたが、レタヌボックス化が犁止される理由は芋぀かりたせんでした。



したがっお、暙準の比率モヌドは、画像の䞊䞋に黒いバヌがあるワむドスクリヌンモヌドでした。 パブリッシャヌは、それを修正するための芁件を調敎するこずに必死でしたが、その埌あきらめお、ゲヌムをそのたたリリヌスしたした。 さらに、自分のPS3を賌入しおから数時間埌、暙準のアスペクト比のテレビで遊んだ埌、ワむドスクリヌンテレビを賌入したした。 倚くの人がこの奇跡の技術PS3を叀い真空管テレビに接続しおいるずは思いたせん



画像








-スティヌブンボズりェルII



定数の远求



䜕らかの理由で、既存のコヌドベヌスず、叀いコヌドラむブラリを䜿甚するために䜜成された新しい数十億行のコヌドずの間に倧きな非互換性がありたした。 最初のコヌドは、「安党な」プログラミングの考えに近い人々によっお曞かれ、゚ラヌを避けるために可胜な限り厳密で制限されおいたす。 したがっお、圌らはCONSTず呌ばれるC / C ++蚀語関数を䜿甚したした。



CONSTは「定数」を意味したす。 関数内で読み取り専甚倉数を倉曎できないようにしたす。 CONSTを䜿甚するコヌドずCONSTを䜿甚しないコヌドは互いに互換性がないこずが刀明したため、コンパむラヌは呪われたした。 開発チヌムは、コヌドにハックを挿入するこずを決定し、トリッキヌな小さなトリックを実行したした。define const。定数は...䜕もない、空の堎所でした。 したがっお、構築はconst int x;



コンパむル前の前凊理䞭に、 int x;



になりたしたint x;



。 これは、車を賌入し、2぀の車茪を倖しおオヌトバむずしお䜿甚するこずに䌌おいたす。



個人的に、私はCONSTがひどく嫌いなので、このトリックが奜きでした。 しかし、このアプロヌチをシヌトベルトをハサミで切るこずに䌌おいるず考える人もいたした。



-匿名



リアリティバむト



PlayStation 3甚のUnreal Engine 3゚ンゞンのゲヌムにバグがありたしたこれはPS3甹UE3で最初にリリヌスされたプロゞェクトでしたデバッグモヌドでは、ゲヌムはマルチプレむダヌゲヌムに接続したずきにprintf䞭に䞍可解に萜ちたした。



デバッグモヌドでは、クラむアントは、サヌバヌをロヌドするように呜じた各コンテンツパッケヌゞのすべおのハッシュを衚瀺したした。明らかに、このアセンブリのハッシュの1぀はでした。 問題に察する適切な解決策を芋぀けるこずはできたせんでしたが、ifndef PS3は、バグが消える次のデヌタアセンブリたで非垞にうたく機胜したした。



箄1幎埌、次のプロゞェクトで同じバグに遭遇し、たったく同じ修正を䜿甚したした。 クラッシュは、ゲヌムのリリヌス埌、コンテンツのパッチに取り組んでいたずきに発生したした。 DLC /パッチの䜜成は、コンパむル枈みのUnrealScriptにパッチを適甚できない方法で実行されたしたが、2぀のリモヌトプロシヌゞャコヌルが信頌できるものずしおマヌクされないバグがありたした。 これは、確認の受信たでコヌルのパケットが再送信されるこずを意味したす。 したがっお、接続が䞍十分な状況では、ロビヌでの準備ず音声䌝送の状態を有効にする機胜が呌び出されないこずがありたした。 ただし、リモヌトプロシヌゞャコヌルを信頌できるものずしおマヌクできるのはUnrealScriptのみであり、UnrealScriptにパッチを適甚するこずはできたせん。



したがっお、ロヌド時に、ロヌドされたすべおのUFunctionオブゞェクトC ++のスクリプト関数の衚珟をルヌプし、名前の文字列比范を実行し、これらの2぀の呌び出しに「信頌できる」フラグを割り圓おたした。 すべおがうたくいきたした。



-匿名



デヌタの準備ができたした



最初のXboxのXbox Live Arcadeゲヌムは、完党に.xexファむルにパッケヌゞ化されおいたした。 これを実装するために、すべおのデヌタを.zipファむルに保存したした。このファむルは、実行可胜ファむルにデヌタセクションずしお埋め蟌たれおいたす。 埐々にファむルが倧きくなり、デヌタセクションをメモリにロヌドできなくなり、アンパックするのに十分なメモリを割り圓おお、目的のファむルを取り出すこずができなくなりたした。



この問題を修正するために、ゲヌムをロヌドした埌、実行可胜ファむルのPEヘッダヌを読み取り、デヌタセクションにオフセットを曞き蟌むコヌドを䜜成したした。 これにより、実行可胜ファむルを読み取るファむルストリヌムは、異なるzipファむルのオフセットに単玔に切り替えお、デヌタセクションをメモリにロヌドせずに実行可胜ファむルから盎接出力するこずができたした。



-パット・りィル゜ン



ピンホヌルカメラ



叀いケヌスに぀いお説明したす。Force21は、珟圚のチヌムを監芖するためにフロヌティングカメラを䜿甚した最初の3次元RTSの1぀でした。 プロゞェクトの終わりに向けお、チヌムがチヌムに続いお停止するずいう奇劙なバグがありたした。チヌムが動き続けおいる間に停止し、䜕も動かせたせんでした。 これはランダムに発生し、゚ラヌを再珟できたせんでした。



これは、テスタヌの1人が、プレヌダヌのテクニックの近くで空爆が発生したずきにこれがより頻繁に発生するこずに気付くたで続きたした。 この情報のおかげで、゚ラヌの原因を芋぀けるこずができたした。 カメラは速床ず加速床を䜿甚し、衝突にも関䞎する可胜性があるため、このような特性を備えたPhysicalObjectクラスから継承したした。 しかし、圌にはもう1぀の特城がありたした。PhysicalObjectは損傷を感知できるずいうこずです。 空爆はかなり倧きな半埄で倧きなダメヌゞを䞎えたため、文字通りカメラを「殺した」。



カメラが損傷を受けないようにこの゚ラヌを修正したしたが、安党のために、装甲ず゚ネルギヌの倀を膚倧な倀に増やしたした。 私たちのゲヌムには、䞖界で最も匷力なカメラがあったず自信を持っお蚀えるず思いたす。



-ゞムノァンワヌス



画像






ヘキサピラビリティ



N64甚の新しいテトリスをテストしおいたした。 い぀でも再珟できるクラッシュがありたした。画面にレゞスタのダンプが衚瀺され、その埌ゲヌムがクラッシュしたした。 ハングを取り陀くには、N64の電源を切っおから入れ盎さなければなりたせんでした。リセットキヌも反応したせんでした。



バヌゞョンごずに、開発者はバグが修正されたず蚀い、私はバヌゞョンごずにそれをプレむしたした。 リリヌス期限が迫っおいたため、ゲヌムをリリヌスするために、開発者はクラッシュに぀ながるすべおのバグを排陀する必芁がありたした。 任倩堂は他瀟のゲヌムも独自にテストしたため、任倩堂はゲヌムをリリヌスするためにそれを承認する必芁がありたした。しかし、圌らはこのバグを取り陀くこずができたせんでした。



たた、ゲヌムにはバグに関連しない秘密のコヌドがあり、さたざたな機胜のロックを解陀するために入力できたした。 開発者が16進ダンプ画面を「おめでずう 秘密のコヌドを発芋したした コン゜ヌルを再床無効にしおから有効にし、HALUCIナヌザヌ名を入力したす。 そしお圌はそうしたした。 これにより、ゲヌムがリリヌスされたした。



-匿名



ショヌトスタック



1982-83幎、私はIMAGICのいく぀かのむンタヌンの1人でしたが、圓時は党員がIntellivisionのカヌトリッゞを䜜成しおいたした。 プログラマヌの䞀人が孊校に戻る必芁があったので、圌らは私に圌のゲヌムのハングでバグを修正するこずを遞択したした。 これは、タむマヌ割り蟌みハンドラヌでのスタックオヌバヌフロヌであるこずが刀明したした。



ハンドラヌの唯䞀のタスクはスクリヌンタむマヌの衚瀺を曎新するこずであるため、スタックの深さをテストするために、割り蟌み手順の最初にコヌドを远加したした。 スタックオヌバヌフロヌの危険性がある堎合、プロシヌゞャは䜕もせずにリタヌンを実行したした。 ハンドラヌは毎秒䜕回も呌び出されるため、プレヌダヌは䜕も気付かず、゚ラヌは修正されたした。



-匿名



基本に戻る



同僚のマむク・ミヌクず私は、アヌケヌドマシンからKlaxタむルを収集するゲヌムをGame Boy Colorに移怍したした。 私たちのお気に入りのゲヌムの1぀をシステムに移怍するのは、興味深い、集䞭的な6週間のプロゞェクトでした。



Cの゜ヌスコヌド実際には、ロボットモンスタヌの惑星からの脱出、ほずんどのロボットモンスタヌのみがコメント化され、 Klaxコヌドに眮き換えられたしたがあり、よく曞かれた元のアヌケヌドゲヌムプログラマヌのデむブ゚ッカヌズずよく話したしたAmiga BASICで週末のプロトタむプを䜜成し、玄1日でCに移怍したした。



アセンブラヌZ80でゲヌムを゚ンコヌドしたした。 興味深いこずがたくさんありたした。たずえば、実際のデバッガヌがなかったため、ホワむトボヌド䞊のコヌドを曞き盎し、別のホワむトボヌドのメモリの内容を曎新しお、行ごずにメンタルりォヌクしたした。 良い時がありたした。



締め切りはすでに迫っおいたしたが、すべおうたくいきたした。 アヌケヌドバヌゞョンをプレむし、GBCのバヌゞョンをテストしたずころ、奇劙なスコアリングバグが芋぀かりたした。 問題自䜓は芚えおいたせんが、倧きな十字架がいく぀かの察角線に分割されおいるような状況がありたした。 アヌケヌドマシンず比范したGBC䞊のポむントが正しく蚈算されなかった可胜性がありたす。



蚀うたでもなく、私はこれを午埌11時30分頃期限の盎前に発芋したした。 アセンブラコヌドをアヌケヌドマシンのCコヌドず比范しお、コヌドを100䞇回実行したしたが、バグは発生したせんでした。 ポむントを正しく数え、コヌドはCプログラムずたったく同じ順序で実行されたした。これは、DaveがAmiga BASICで最初に行ったこずを1行ず぀転送するだけでした。 デむブはマむクに少し䌌おいたず思う-圌はアセンブラヌずBASICに぀いお倚くを知っおいたが、圌は20幎前にKlaxが䜜られたずきにCが奜きではなかった。



画像






最埌に、朝の5時頃、これに䞀晩䞭費やしお、うたくいかなかったかもしれないず思いたしたが、詊しおみる䟡倀がありたした。 マむクはスコアシステムをQuick BASICで䜜成し、ポむントはアヌケヌドマシンずたったく同じ方法でカりントされ始めたした。 次に、BASICを1行ず぀Z80アセンブラヌに移動したした。



うたくいきたした。 神はその理由を知っおいたすが、プログラムはアヌケヌドマシンずたったく同じように動䜜したしたおそらくこれは、元のコヌドがBASICで䜜成されたずいう事実に䜕らかの関係があるのでしょう。 Atariアセンブリを送信し、䞡方のバヌゞョンのコヌドを印刷しお、カフェに行きたした。 朝食時に、コヌドを1時間芋おも、それがなぜ異なる動䜜をするのか理解しおいたせんでした。 私たちは今日、コヌドが同䞀の結果を䞎えたはずだず誓うこずができたす しかし、時には、手遅れになったら、ブヌドゥヌ教のプログラミングをする時が来たした



-クリス・チャヌラ



ハッキングが状況を救えるのはゲヌムだけではありたせん。 ボヌナスずしおそれらを含めないためにあたりにも奜奇心が匷い2぀のゲヌム以倖の䟋がありたす。



窓甚ワッシャヌ



5幎前、私はビデオ監芖甚の゜フトりェア開発の分野でプログラマヌずしお働いおいたした。 非垞に繊现で掗緎されたセキュリティ゜フトりェアを䜜成したした。 玠晎らしい、機胜の良い補品がありたした。 ゜フトりェアの最も難しい郚分は、画面䞊に50のビデオストリヌムを同時に衚瀺するこずでした。 ゜フトりェアには膚倧な量のメモリが必芁で、24時間幎䞭無䌑で機胜する必芁がありたした。



リリヌスの数週間前に、ベヌタ版を顧客に配信したした。 1週間埌、1分あたり玄4 KBの巚倧なメモリリヌクが発生したした。 リヌクの調査に数日を費やしたしたが、結果が埗られず、リリヌス前に修正する時間もありたせんでした。 メモリは゜フトりェアの重芁な郚分であり、このサむズのリヌクはアプリケヌションを完党に殺しおしたいたす。 テスト䞭Windows、コヌドりィンドりに戻るために゜フトりェアりィンドりを最小化する必芁があり、その間に占有メモリの倧幅な枛少に気付きたした。



その埌、りィンドりを通知領域たたは[スタヌト]メニュヌバヌに移動するず、Windowsは未䜿甚/解攟されたメモリを即座に埩元するこずを思い出したした。 これは私たちのチャンスでした アプリケヌションにタむマヌを远加したした。これにより、数分ごずにりィンドりが[スタヌト]メニュヌパネルに移動し、すぐにフルスクリヌンで展開されたした。 画面䞊ではちら぀きのように芋えたしたが、うたくいきたした その埌、アプリケヌションを起動するこずができたした。これにより、バグを修正するためにもう少し時間がかかりたした数日埌に発芋されたした-りィンドりハンドルが適切にクリヌニングを実行したせんでした。



-ペハン・ラりニ



結果は異なる堎合がありたす。



1970幎代、チヌムず私は銀行システムに取り組みたした。 長い間忘れられおいたプログラミング蚀語MPL2で䜜成したした。 この蚀語には256個のグロヌバル倉数の制限があり、それらはすべおシステムに新しい関数を远加するために䜿甚されおいたため、コヌドのさたざたな郚分で2぀の異なる目的のために解攟たたは䜿甚できる倉数を探す必芁がありたした。



それは危険で長いプロセスでした。 プログラム内では、各関数は、関数のスコヌプによっお制限される256個の独自の倉数を持぀こずができたす。 か぀お、私が家にいたずき、掞察が私に降りかかった。 翌朝、私は䞊叞にすべおのコヌドを関数にラップするこずを提案したした。 次に、プログラムに256個のグロヌバル倉数を䜿甚したす。これは、これたでに䜿甚された256個が「内郚」関数に確実に保存されるためです。



プログラム自䜓は、さらにいく぀かの倉数を宣蚀するだけで、゜ヌスプログラム党䜓が配眮される関数を呌び出したす。 しかし、圌女は自分の256個の倉数だけでなく、新しい256個のグロヌバル倉数も「芋る」こずができたした。 私の䞊叞は懐疑的でしたが、2時間の線集時間枠を䞎えられ、それが機胜するこずを芋おst然ずしたした。 数幎間、チヌムが盎面した問題を回避するこずができたした。



All Articles