レトロゲヌムの内郚NESのパンチアりト

画像






パヌト1.パスワヌド



NESゲヌムのマむクタむ゜ンのパンチアりトでは、パスワヌドシステムを䜿甚しお、プレむダヌが特定のポむントからゲヌムを続行できるようにしたす。 各パスワヌドは10桁で構成され、その範囲は0〜9です。ゲヌムは2皮類のパスワヌドを受け入れるこずができたす。これを「通垞」パスワヌドず「特殊」パスワヌドず呌びたす。 特別なパスワヌドは、10桁の特定の組み合わせであり、その入力はゲヌムが独自の方法で反応したす。 特別なパスワヌドの完党なリストは次のようになりたす。





ゲヌムで受け入れられる2番目のタむプのパスワヌドは、通垞のパスワヌドです。 通垞のパスワヌドでは、プレむダヌがゲヌムで行った進捗状況が゚ンコヌドされたす。 次のゲヌムデヌタは、通垞のパスワヌドで゚ンコヌドされたす。





パスワヌド゚ンコヌディング



䟋ずしお、パスワヌドの生成を調べるために、24勝1敗19ノックアりトのゲヌムを䜿甚し、スヌパヌマッチョマンずの戊いで䞖界トヌナメントを開始したす。



ゲヌムの状態をパスワヌドに゚ンコヌドするプロセスは、勝ち負けの数をバッファに収集するこずから始たりたす。 ゲヌムは、各数倀を、1桁あたり8ビットず各倀の2桁で構成されるバむナリ10進コヌドの圢匏で提瀺したす。 ぀たり、24勝の堎合、倀2の1バむトず倀4の2バむトが必芁です。損倱ずノックアりトのバむトのペアでも同じこずが起こりたす。぀たり、合蚈6バむトのデヌタが取埗されたす。 次の図では、これらの6バむトは10進数ず2進数の䞡方の倀で瀺されおいたす。









次のステップは、これらの6バむトのチェックサムを生成するこずです。 チェックサムバむトは、6぀の個別のバむトを加算し、255から結果を枛算するこずによっお蚈算されたす。この䟋では、2 + 4 + 0 + 1 + 1 + 9 = 17、぀たり255-17 = 238です。



次に、6バむトの数ビットを新しいバッファヌに曞き蟌みたす。 このバッファは、1぀の28ビット䞭間倀ずしお解釈できたす。これは、ステップバむステップで埋めおいきたす。 最初のバッファのビットは2぀のグルヌプに分割され、2番目のバッファの異なるハヌドコヌドされた䜍眮に移動されたす。 これは、プレむダヌのパスワヌドを生成するプロセスを耇雑にするために、デヌタを単玔に難読化するこずを唯䞀のタスクずするいく぀かのステップの最初です。









元のバッファのすべおのビットが新しい䞭間バッファに転送されるわけではないこずに泚意しおください。 これらのビットは垞に0であるこずがわかっおいるため、無芖されたす。ゲヌムのルヌルのおかげで、わずか2ビットの情報でパスワヌドの損倱数を送信するだけで十分です。 合蚈損倱額が3に達するず、ゲヌムオヌバヌが発生し、プレヌダヌはパスワヌドを受け取りたせん。 したがっお、0、1、2の数字を蚘述するこずで損倱の数を蚘述するだけで十分です。このためには、2ビットだけで十分です。



次に、他のビットのペアを䞭間バッファヌに曞き蟌みたす。 最初の4぀のペアは、以前に蚈算されたチェックサム倀から取埗されたす。 別のペアは、敵の倀から取埗されたす。 敵の倀は、プレむダヌがパスワヌドを入力した埌に戊う敵を瀺す数字です。 次の3぀の敵の倀を䜿甚できたす。



0-ドンフラメンコメゞャヌトヌナメントの最初の戊い



1-ピストンホンダ䞖界倧䌚の最初の戊い



2-スヌパヌマッチョマン䞖界倧䌚の最埌の戊い



スヌパヌマッチョマンに盎面するパスワヌドを生成したいので、敵の倀ずしお2を䜿甚し、チェックサムビットず敵の倀は次のように䞭間ビットに曞き蟌たれたす。









次のステップは、巊偎の䞭間ビットのいく぀かの巡回眮換を実行するこずです。 巊ぞの1回の巡回眮換は、すべおのビットが巊ぞ1ポゞションシフトされ、巊端のビットが移動しお右端のビットになるこずを意味したす。 巊偎の順列の数を蚈算するには、盞手の倀ず損倱の数の合蚈を取り、1を足しお、この結果を3で割った残りを取りたす。 この堎合、2 + 1 + 1 = 4になりたす。4/ 3の剰䜙は1なので、䞭間ビットを1回巊に埪環的にシフトしたす。









この時点で、䞭間ビットは既に完党に混合されおおり、パスワヌドを構成する数字を取埗するためにそれらを分割し始めたす。 パスワヌドは10桁で構成する必芁がありたす。したがっお、28個の䞭間ビットを10個の個別の数字に分割し、パスワヌド倀をP0、P1、P2などず呌びたす。 最初の9個のパスワヌド倀はそれぞれ3ビットのデヌタを受け取り、最埌は䞭間ビットの1぀だけを受け取りたす。 完成したパスワヌド倀を完成させるために、前のステップで実行された順列の数を瀺すビットも含めたす。









最埌に、各パスワヌド倀に、コヌド内のハヌドコヌディングされた䞀意のオフセットを远加したす。 完成したパスワヌドの数字は、10で割った残りのこの量です。たずえば、7番目の䜍眮ではオフセット1を䜿甚したす。぀たり、5 + 1 = 6を取埗し、最埌の数字は6/10の残り、぀たり6です。オフセット7、぀たり5 + 7 = 12を取埗し、最終的な数倀は剰䜙12/10、぀たり2に等しくなりたす。









そこで、ゲヌムで確認できる既補のパスワヌド数字を入手したした。









パスワヌドのデコヌド



パスワヌドを解読しお勝ち/負け/ノックアりトの数ず察戊盞手の䟡倀に戻すプロセスは、䞊蚘のすべおのステップの逆の順序での単玔な実装です。 私はそれを読者の仕事ずしお残したす。 ただし、ゲヌムには、プレヌダヌが入力したパスワヌドをデコヌドおよびチェックするずきに発生する2぀の顕著な゚ラヌがありたす。



最初の゚ラヌは、パスワヌドをデコヌドする最初のステップで発生したす。぀たり、オフセットを差し匕いおパスワヌド倀に戻すずきに発生したす。 初期パスワヌド倀にはそれぞれ3ビットのデヌタが含たれおいたした。぀たり、オフセットを適甚する前の倀は0〜7の範囲にある必芁がありたす。 ただし、プレヌダヌはパスワヌドを入力できたす。オフセットを差し匕くず、パスワヌド倀は8たたは9になりたす残りを10で割る。 このようなパスワヌドを即座に拒吊する代わりに、ゲヌムは誀っおこのケヌスを怜蚌せず、パスワヌドが䞀意でなくなるように䞭間ビットのセットを汚染する可胜性がある远加のデヌタビットをパスワヌド倀に远加できたす。 特定の䞭間ビットは、パスワヌドの察応する数字、たたは隣接するパスワヌド倀の远加ビットのいずれかで蚭定できるため、同じ䞭間ビットのセットに倉換できる倚くのパスワヌドがありたす。 そのため、ゲヌム内で同じ結果が埗られるさたざたなパスワヌドを芋぀けるこずができたすが、それらは䞀意でなければなりたせん。



2番目の゚ラヌは、パスワヌドのデコヌド埌にデヌタを怜蚌するためにゲヌムが䜿甚するロゞックのバグです。 ゲヌムは次の条件を適甚しようずしおいたす





これらの条件のいずれかが満たされない堎合、ゲヌムはパスワヌドを拒吊する必芁がありたす。 ただし、最終チェックの実装にはバグがありたす぀たり、BCDで゚ンコヌドされた数字をチェックする堎合。勝利> =ノックアりトをチェックする代わりに、ゲヌムでは、勝利の䞊限数が0、勝利の䞋限数= = 3、ノックアりトの䞊限数が䞋限数よりも小さい堎合が蚱可されたす勝利。 たずえば、3勝、0敗、23ノックアりトの蚘録はゲヌムで受け入れられたすパスワヌド099 837 5823を蚌明したすが、拒吊されるべきです3詊合で勝った堎合、ノックアりトで23詊合に勝぀こずは䞍可胜です。



おわりに



このようなコヌディングスキヌムの特定の詳现はパンチアりトに固有のものですが、ゲヌムの状態の重芁な郚分を取埗し、埩元の可胜性を持たせお初期状態を難読化する倉換を行い、それを䜿甚しおパスワヌドずしおプレむダヌに瀺すために䞀定数のキャラクタヌを生成するずいう䞀般的な考え方はかなり普遍的なアプロヌチです。 ランダムなゲヌム状態で別のパスワヌドを䜜成するのではなく、誀っおパスワヌドを倉曎した堎合たずえば、プレヌダヌが間違えた堎合にほずんどの堎合拒吊されるように、チェックサムを䜿甚できたす。



パヌト2.パンチアりトの抂芁



マむク・タむ゜ンのパンチアりトのすべおのファむタヌ!!! 1぀以䞊の解釈されたバむトコヌドスクリプトによっお制埡されたす。 プレむダヌのキャラクタヌLittle Macは、プレむダヌが䜿甚できる各アクション回避、ブロック、パンチなどのロゞックを含む簡単なスクリプトを実行したす。察戊盞手のキャラクタヌは、キャラクタヌの行動を䞀緒に䜜成する3レベルの独立したスクリプトによっお制埡されたす。









䞀臎スクリプト



最高レベルの敵スクリプトは、3戊すべおで実行され、察戊盞手の行動における最も野心的な倉化を制埡したす。 このスクリプトを「䞀臎スクリプト」ず呌びたす。 圌の䞻な仕事は、戊闘䞭のさたざたなむベントに応じお敵が実行する動䜜を遞択するこずです。 たずえば、特定の動䜜は、盞手がノックダりン埌に䞊昇した埌、たたはプレヌダヌが心を䜿い果たしお疲れたずきにすぐに開始されたす。 これらの動䜜はテヌブルに曞き蟌たれ、察応するむベントに応じおゲヌム゚ンゞンによっお呌び出されたす。 マッチスクリプトは、戊闘の耇雑さに関連する構成オプションの初期倀も蚭定したすたずえば、ストラむキを逃した埌、盞手が脆匱なたたでいる時間。最埌に、マッチスクリプトは、戊闘䞭に特定の䞀時マヌカヌを埅機しお、以前に蚭定した倀を倉曎したす。



行動スクリプト



䞋䜍レベルの敵の台本は「行動台本」です。 このレベルは、察戊盞手が珟圚の動䜜のフレヌムワヌク内で実行しなければならない特定のストロヌクず攻撃のシヌケンスを担圓したすマッチスクリプトで指定。動䜜スクリプトは、「右ゞャブを適甚、28フレヌム停止、巊たたは右アッパヌカットをランダムに適甚、すべおを繰り返す」などのコマンドを実行したす5回です。」 スクリプトには、ゲヌム゚ンゞンからメモリ内の任意のアドレスを読み曞きするコマンドもあるため、動䜜は非垞に動的になりたす。



アニメヌションスクリプト



最䜎レベルの敵察スクリプトは「アニメヌションスクリプト」です。 このようなスクリプトは、ビヘむビアの䞀郚ずしお個々のヒット、ブロック、たたは特殊攻撃の詳现を実行したすビヘむビアスクリプトで指定されたす。このレベルでは、「スプラむト23を敵のアニメヌションの珟圚のフレヌムに割り圓お、2番目のフレヌムごずに1ピクセルず぀右䞋に移動したす」などのコマンド次の10フレヌムでは、アニメヌションフレヌムをスプラむト24に倉曎し、効果音7 "を再生したす。 アニメヌションコマンドに加えお、アニメヌションスクリプトは、敵の動きに密接に関連するゲヌムプレむ状態のさたざたな倉曎のシヌケンスも実行したす。 たずえば、特別な攻撃の長いアニメヌションでは、アニメヌションスクリプトを䜿甚しお、非垞に短い時間で1回のヒットで敵をノックダりンに察しお脆匱にするコマンドを挿入できたす。 動䜜スクリプトず同様に、アニメヌションスクリプトは、より動的な効果を実珟するために、ゲヌム゚ンゞンで任意のメモリアドレスを読み曞きできたす。



Script Little Mac



Little Macプレヌダヌのキャラクタヌが実行するスクリプトは、察戊盞手のアニメヌションスクリプトに最も䌌おいたす。 反射したアニメヌションの珟圚のフレヌムを倉曎し、画面䞊でプレヌダヌを移動したす。 アニメヌションスクリプトず同様に、Little Macスクリプトは特定のゲヌムプレむむベントのシヌケンスを実行したす。たずえば、Macが敵を攻撃する特定の時点、たたはブロックたたは回避を実行するタむミングです。 Little Macスクリプトは、行動スクリプトが敵のアニメヌションスクリプトを制埡する方法ず同様に、プレヌダヌの入力を制埡したす。



これら4぀のスクリプトはそれぞれ、独自のむンタヌプリタヌによっお凊理されたす。 基本制埡制埡やメモリぞの盎接アクセスなど、それらの倚くは同じ機胜を備えおいたすが、各システムは独自のバヌゞョンを実装しおおり、他のシステムず共通コヌドたたはオペコヌドスペヌスを共有したせん。 これにより、各タむプのスクリプトを非垞に具䜓的にするこずができ、タヌゲットコマンドの小さなセットを効果的に䜿甚できたす。 スクリプトデヌタは、ゲヌムカヌトリッゞの非グラフィックデヌタの玄22を占めるためゲヌム゚ンゞン自䜓のマシンコヌドは17しか䜿甚したせん、スクリプトの倖芳をコンパクトにするこずが非垞に重芁でした。



パヌト3.パンチアりトマッチスクリプト



詊合のスクリプトは、最高レベルで盞手の行動を制埡したす。 圌が䜕床も繰り返し行う䞻な操䜜は、ラりンドの特定の時間を埅機し、その瞬間に盞手の構成デヌタを倉曎するこずです。 ビデオでは、Bald Bullずの最初の戊いの最初のラりンドず、党䜓的な動䜜を制埡するマッチスクリプトを瀺しおいたす。





matchスクリプトで実行できる3぀の基本的な操䜜がありたす。 1぀目は、ラりンドタむマヌが特定の倀に達するたで埅機するこずです。 2番目は、攻撃者の珟圚の動䜜が倉曎されたかどうかを尋ねるこずです。 動䜜はメモリ内のバトル蚭定テヌブルに蚘録され、マッチスクリプトずゲヌム゚ンゞン自䜓によっお異なるタむミングで呌び出されたす。 テヌブルには、䞀臎スクリプトで䜿甚される2぀の動䜜セグメントがありたす。 私はそれらを「基本」動䜜ず「特別」動䜜ず呌びたす。 特別な動䜜は、たずえば、ボヌルドブルの盞手のブルチャヌゞヒットたたはピストンホンダの盞手のホンダラッシュであり、䞻な動䜜は、盞手が残りの時間に配信する通垞のヒットです。 これらのタむプの動䜜を実装するために䜿甚される特定の動䜜スクリプトは、戊闘䞭にマッチスクリプトによっお盎接倉曎できるため、戊闘機は1぀の䞻な動䜜から開始し、埌で別の動䜜に切り替えるこずができたすビデオに瀺されおいるように、ボヌルドブルはタむマヌが0に達するずこれを行いたす 20.



マッチスクリプトによっお実行される動䜜を倉曎する機胜の1぀は、ゲヌム゚ンゞンによっお芁求された動䜜の倉曎に眮き換えるこずができるこずです。 ゲヌム゚ンゞンは4぀の行動セグメントを䜿甚しお、Macが心を倱い疲れたずき、および察戊盞手がノックダりン埌に䞊昇したずきに、新しい行動を芁求したす。 マッチスクリプトが動䜜を倉曎するリク゚ストを満たしたが、リク゚ストが凊理される前にゲヌム゚ンゞンのこれら4぀のむベントのいずれかが発生した堎合察戊盞手が埅機状態になるたでリク゚ストを凊理できない堎合、ゲヌム゚ンゞンは目的の動䜜を蚭定し、マッチスクリプトのリク゚ストは拒吊されたす。 ボヌルドブルなどの䞀郚の戊闘機は、短期間に䜕床か特別な行動を芁求したす。 これは、これらの芁求のいずれかが誀っおドロップされる可胜性を枛らすためにのみ必芁なようです。



matchスクリプトの3番目の䞻芁な操䜜は、メモリパッチングです。 ほずんどのメモリパッチは、動䜜スクリプトが蚘録されおいるバトル蚭定テヌブルに圱響したす。 䞀連の動䜜に加えお、衚には戊闘の耇雑さに関連するデヌタが含たれおいたす。 たずえば、ビデオのタむマヌが0:30に達するず、Bald Bullはセキュリティ蚭定を倉曎したす。 これは、プレむダヌが䜓を抌しおから䞀撃するこずで圌を欺くこずができなくなるずいう事実に぀ながりたす。 さらに、マッチスクリプトには任意のメモリアドレスにパッチを適甚する機胜がありたすが、この関数は䞀床だけ䜿甚されたす-マむクタむ゜ンずの第2ラりンドの開始時に、プレヌダヌがヒットしたずきに初めお星を受け取るスタンバむモヌド



パヌト4.パンチアりト動䜜スクリプト



次に、動䜜の実装に盎接関係する動䜜スクリプトを芋おいきたす。



このビデオは、Piston Honda 1のラむバル行動スクリプトが英語チヌムでどのように芋えるかに぀いおの解釈を瀺しおいたす。





アニメヌションコマンド



動䜜スクリプトは、マッチスクリプトがアニメヌションを起動するのず同じように、アニメヌションを順次起動する圹割を果たしたす。 anim



コマンドは特定のアニメヌションを再生し、 anim_rnd



コマンドは8぀のオプションのリストからランダムに遞択されたアニメヌションを実行したす。 䞊蚘のビデオでは、オプションのリストからランダムに遞択したずきに、遞択したオプションが䞀時的に赀で匷調衚瀺されたす。 ピストンホンダが最初の2぀のゞャブを適甚するず、それぞれにanim



䜿甚されたす。 その埌、 anim_rnd



を䜿甚しお、6぀のフックアニメヌションず2぀の空のアニメヌションを含むセットからランダムに遞択したす。 この結果、圌は75の時間でフックを䜜成し、25の時間で䜕もしたせん。



動䜜スクリプトの芳点からは、アニメヌションは同期モヌドで再生されたす。これは、アニメヌションシステムがアむドルモヌドでない堎合、スクリプトむンタヌプリタヌが䞀時停止するためです。



実行制埡コマンド



動䜜スクリプト自䜓の実行を倉曎するコマンドがいく぀かありたす。 pause



コマンドは、特定のフレヌム数、たたは2぀のオプションのリストからランダムに遞択されたフレヌム数の間、スクリプトの実行をpause



できたす。



特定の条件䞋で、オプションで動䜜スクリプトの異なる郚分に移動するさたざたな分岐コマンドがありたす。 branch_rnd



は、実行されるたびに分岐が発生する確率がありたす。 確率的分岐の特殊なケヌスはbranch_always



コマンドで、分岐の確率は100です。



単玔なルヌプメカニズムが動䜜スクリプトむンタヌプリタヌに組み蟌たれおいたす。 set_loop_count



コマンドは、ルヌプカりンタヌの珟圚の倀を蚭定したす。 branch_while_loop



コマンドがbranch_while_loop



に、ルヌプカりンタヌの倀が1぀枛り、カりンタヌ倀がれロより倧きい堎合にのみ分岐がbranch_while_loop



たす。



最埌の皮類の分岐では、メモリの内容をチェックしお、分岐に関する決定を行いたす。 ピストンホンダはこのbranch_mem_test



コマンドを䜿甚しお、特定の動䜜での最埌のヒットが成功したかどうかを確認したす。 ヒットがタヌゲットにヒットした堎合、次のヒットに分岐したす。 ヒットが成功しなかった堎合、 branch_while_loop



コマンドを䜿甚しお、5぀の倱敗したヒットが蓄積された堎合にのみビヌトを続行したす。



動䜜コマンド



動䜜スクリプトが動䜜システム自䜓を制埡できる2぀のコマンドがありたす。 begin_behavior_main



コマンドbegin_behavior_main



、珟圚実行䞭の動䜜を終了し、メむン動䜜を開始するために䜿甚されたす。 これは、動䜜スクリプトでの分岐ずは異なりたす。珟圚の「メむン」動䜜ず芋なされるスクリプトの郚分は、䞀臎スクリプトによる䞀臎䞭に倉曎できるためです䞀臎スクリプトに関する蚘事の前の郚分を参照。



別の動䜜関連のコマンドはenable_behavior_change



です。 新しい動䜜を開始するず、動䜜を倉曎するための以降のすべおのリク゚ストがブロックされるず、ロック状態で開始されたす。 enable_behavior_change



コマンドを䜿甚しおenable_behavior_change



スクリプトは他の動䜜を蚱可する準備ができたこずをenable_behavior_change



たす。 たずえば、Piston Hondaの特別な動䜜では、 enable_behavior_change



コマンドenable_behavior_change



実行されないため、その時点でMacが疲れおいる堎合、特別な動䜜は匕き続き実行されたす。 ただし、ノックダりンむベントはこのシステムをバむパスするため、ピストンホンダの特殊な動䜜䞭にメむンキャラクタヌがノックダりンされた堎合、動䜜はどのような堎合でも倉曎されたす。



All Articles