見出し画像

世界一明快なスーパーマリオブラザーズのオリジナルコード抽象化(マリオの移動処理部分)

抽象化ルール

・変数は強調文字
・【】で括ってあるときはジャンプ先ラベル
・2バイトで表現されていた変数はひとつの変数に合成
・変数はすべて32bit符号付き整数として処理の整合性を確保

必要な配列:

JumpMForceData = [$20, $20, $1e, $28, $28, $0d, $04]
FallMForceData = [$70, $70, $60, $90, $90, $0a, $09]
InitMForceData = [$00, $00, $00, $00, $00, $80, $00]
PlayerYSpdData = [$fc, $fc, $fc, $fb, $fb, $fe, $ff]
MaxLeftXSpdData = [$d8, $e8, $f0]
MaxRightXSpdData = [$28, $18, $10, $0c]
FrictionData = [$e4, $98, $d0]

PlayerMovementSubs:

(ここからスタート)
・マリオが小さい場合は大きいマリオがしゃがんでいるものとして扱う
・マリオが小さい場合→【SetCrouch】
・プレイヤーの状態(地上・ジャンプ・落下)を確認する
・(ジャンプ・落下)の場合→【ProcMove】
・大きいマリオはこの処理まで到達する
・下入力が無い場合しゃがみフラグが立たないようにする
・→【SetCrouch

SetCrouch:

・マリオにしゃがみフラグを立てる
・→【ProcMove】

ProcMove:

・サブルーチン【PlayerPhysicsSub】を呼び出し
・マリオが巨大化等アニメーションの途中なら→【NoMoveSub
・→【MoveSubs

MoveSubs:

(ここは必ずswitch~case等の排他選択を使う事)
・(地上)の場合はサブルーチン【OnGroundStateSub】を呼び出し
・(ジャンプ)の場合はサブルーチン【JumpSwimSub】を呼び出し
・(落下)の場合はサブルーチン【FallingSub】を呼び出し
・→【NoMoveSub

NoMoveSub:

・呼び出し元へ戻る
(ここまでで1フレーム)

PlayerPhysicsSub:

・状態が(地上・ジャンプ・落下)の場合→【CheckForJumping
・呼び出し元へ戻る

CheckForJumping:

・JumpspringAnimCtrlが0以外である場合→【NoJump
・Aボタンが押されていない場合→【Nojump
・Aボタンが押された瞬間の場合→【ProcJumping

NoJump:

・→【X_Physics

ProcJumping:

(Aボタン入力後)
・プレイヤーが(地上)の場合→【initJs
・状態が(泳ぎ)以外の場合→【NoJump
・→【X_Physics

InitJS:

(ジャンプ初期化)
JumpSwimTimerに0x20をセット
Player_YMF_Dummyに0x00をセット
Player_Y_MoveForceに0x00をセット
JumpOrigin_Y_HighPosPlayer_Y_HighPosをセット
JumpOrigin_Y_PositionPlayer_Y_Positionを代入
・ポインタに0をセット
・プレイヤーの状態を(ジャンプ)に変更
Player_XSpeedAbsoluteが0x09未満の場合→【ChkWtr
・ポインタに1をセット
Player_XSpeedAbsoluteが0x10未満の場合→【ChkWtr
・ポインタに2をセット
Player_XSpeedAbsoluteが0x19未満の場合→【ChkWtr
・ポインタに3をセット
Player_XSpeedAbsoluteが0x1C未満の場合→【ChkWtr
・ポインタに4をセット
・→【ChkWtr

ChkWtr:

・DiffToHaltJumpに0x01をセット
・→【GetYPhy

GetYPhy:

VerticalForceJumpMForceData[ポインタ]をセット
VerticalForceDownFallMForceData[ポインタ]をセット
Player_Y_MoveForceInitMForceData[ポインタ]をセット
Player_Y_SpeedPlayerYSpdData[ポインタ]をセット
・(マリオのサイズと状態で再生する音を変更)
・→【X_Physics

X_Physics:

・ポインタに0をセット
アドレス$00に0x00をセット
・状態が(地上)の場合→【ProcPRun
Player_XSpeedAbsoluteが0x19以上の場合→【GetXPhy
・→【ChkRFast

ProcPRun:

・マリオの移動方向と入力方向が不一致の場合→【ChkRFast
・Bボタンが押されていた場合→【SetRTmr
RunningTimerが0ではない場合→【GetXPhy
・→【ChkRFast

ChkRFast:

・ポインタを+1
アドレス$00を+1
RunningSpeedが0ではない場合→【FastXSp
Player_XSpeedAbsoluteが0x21未満の場合→【GetXPhy
・→【FastXSp

FastXSp:

・アドレス$00を+1
・→【GetXPhy

SetRTmr:

RunningTimerに0x0Aをセット
・→【GetXPhy

GetXPhy:

MaximumLeftSpeedMaxLeftXSpdData[ポインタ]をセット
MaximumRightSpeedMaxRightXSpdData[ポインタ]をセット
・ポインタにアドレス$00をセット
FrictionAdderFrictionData[ポインタ]をセット
PlayerFacingDirPlayer_MovingDirが一致→【ExitPhy】
FrictionAdderを2倍にする
・→【ExitPhy

ExitPhy:

・呼び出し元へ戻る

OnGroundStateSub:

(接地状態処理)
・サブルーチン【GetPlayerAnimSpeed】を呼び出し
Left_Right_Buttonsが0ならば→【GndMove
PlayerFacingDirLeft_Right_Buttonsをセット
・→【GndMove

GndMove:

・サブルーチン【ImposeFriction】を呼び出し
・サブルーチン【MovePlayerHorizontally】を呼び出し
・呼び出し元へ戻る

ImposeFriction:

・入力方向に壁がある場合→【JoypFrict
Player_X_Speedが0ならば→【SetAbsSpd
Player_X_Speedが正ならば→【RghtFrict
Player_X_Speedが負ならば→【LeftFrict
・→【JoypFrict

JoypFrict:

・右が押されていなければ→【RghtFrict
・→【LeftFrict

LeftFrict:

FrictionAdderが256以上であるならPlayer_X_Speedに+1
FrictionAdderを256で剰余算し、結果をPlayer_X_MoveForceに足す
Player_X_MoveForceが256以上ならPlayer_X_MoveForceを-256し、Player_X_Speedに+1
Player_X_SpeedMaximumRightSpeed未満であれば→【XSpdSign
Player_X_SpeedMaximumRightSpeedをセット
・→【SetAbsSpd

RghtFrict:

FrictionAdderが256以上であるならPlayer_X_Speedに-1
FrictionAdderを256で剰余算し、結果をPlayer_X_MoveForceから引く
Player_X_MoveForceが負ならPlayer_X_MoveForceを+256し、Player_X_Speedに-1
Player_X_SpeedMaximumLeftSpeedより上であれば→【XSpdSign
Player_X_SpeedMaximumLeftSpeedをセット
・→【SetAbsSpd

XSpdSign:

・→【SetAbsSpd

SetAbsSpd:

Player_XSpeedAbsolutePlayer_X_Speedの絶対値をセット
・呼び出し元へ戻る

MovePlayerHorizontally:

Player_X_Speedを16倍しPlayer_X_MoveForceに加算する
Player_X_MoveForceが255以下になるまでPlayer_X_MoveForce-256とPlayer_X_Position+sign(Player_X_Speed)を繰り返す
・呼び出し元に戻る

FallingSub:

VerticalForceVerticalForceDownをセット
・→【LRAir

JumpSwimSub:

Player_Y_Speedが0以上であれば→【DumpFall
・Aボタンが押され続けているのであれば→【ProcSwim
JumpOrigin_Y_PositionからPlayer_Y_Positionを引き、DiffToHaltJump未満であれば→【ProcSwim
・→【DumpFall

DumpFall:

VerticalForceVerticalForceDownをセット
・→【ProcSwim

ProcSwim:

・→【LRAir

LRAir:

・左右入力が無ければ→【JSMove
・サブルーチン【ImposeFriction】を呼び出し
・→【JSMove

JSMove:

・サブルーチン【MovePlayerHorizontally】を呼び出し
・状態が(死亡)であればVerticalForceに0x28をセット
・→【ExitMov1

ExitMov1:

・→【MovePlayerVertically

MovePlayerVertically:

アドレス$00VerticalForceをセット
・→【ImposeGravity

ImposeGravity:

Player_YMF_DummyPlayer_Y_MoveForceを加算
アドレス$07Player_Y_Speedの正負(0または-1)をセット
Player_Y_PositionPlayer_Y_Speedを加算
Player_YMF_Dummyが256以上なら256を引き、Player_Y_Positionに+1
Player_Y_MoveForceVerticalForceを加算
Player_Y_MoveForceが256以上なら256を引きPlayer_Y_Speedに+1
Player_Y_Speedが0x04未満なら→【ChkUpM】
Player_Y_MoveForceが0x80未満なら【ChkUpM】
Player_Y_Speedに0x04をセット
Player_Y_MoveForceに0x00をセット
・→【ChkUpM

ChkUpM:

・→【ExVMove

ExVMove:

・呼び出し元に戻る

ここから先は

0字

¥ 500

この記事が気に入ったらチップで応援してみませんか?

購入者のコメント

コメントするには、 ログイン または 会員登録 をお願いします。
世界一明快なスーパーマリオブラザーズのオリジナルコード抽象化(マリオの移動処理部分)|neko800
word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word

mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1