世界一明快なスーパーマリオブラザーズのオリジナルコード抽象化(マリオの移動処理部分)
抽象化ルール
・変数は強調文字
・【】で括ってあるときはジャンプ先ラベル
・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_HighPosにPlayer_Y_HighPosをセット
・JumpOrigin_Y_PositionにPlayer_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:
・VerticalForceにJumpMForceData[ポインタ]をセット
・VerticalForceDownにFallMForceData[ポインタ]をセット
・Player_Y_MoveForceにInitMForceData[ポインタ]をセット
・Player_Y_SpeedにPlayerYSpdData[ポインタ]をセット
・(マリオのサイズと状態で再生する音を変更)
・→【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:
・MaximumLeftSpeedにMaxLeftXSpdData[ポインタ]をセット
・MaximumRightSpeedにMaxRightXSpdData[ポインタ]をセット
・ポインタにアドレス$00をセット
・FrictionAdderにFrictionData[ポインタ]をセット
・PlayerFacingDirとPlayer_MovingDirが一致→【ExitPhy】
・FrictionAdderを2倍にする
・→【ExitPhy】
ExitPhy:
・呼び出し元へ戻る
OnGroundStateSub:
(接地状態処理)
・サブルーチン【GetPlayerAnimSpeed】を呼び出し
・Left_Right_Buttonsが0ならば→【GndMove】
・PlayerFacingDirにLeft_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_SpeedがMaximumRightSpeed未満であれば→【XSpdSign】
・Player_X_SpeedにMaximumRightSpeedをセット
・→【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_SpeedがMaximumLeftSpeedより上であれば→【XSpdSign】
・Player_X_SpeedにMaximumLeftSpeedをセット
・→【SetAbsSpd】
XSpdSign:
・→【SetAbsSpd】
SetAbsSpd:
・Player_XSpeedAbsoluteにPlayer_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:
・VerticalForceにVerticalForceDownをセット
・→【LRAir】
JumpSwimSub:
・Player_Y_Speedが0以上であれば→【DumpFall】
・Aボタンが押され続けているのであれば→【ProcSwim】
・JumpOrigin_Y_PositionからPlayer_Y_Positionを引き、DiffToHaltJump未満であれば→【ProcSwim】
・→【DumpFall】
DumpFall:
・VerticalForceにVerticalForceDownをセット
・→【ProcSwim】
ProcSwim:
・→【LRAir】
LRAir:
・左右入力が無ければ→【JSMove】
・サブルーチン【ImposeFriction】を呼び出し
・→【JSMove】
JSMove:
・サブルーチン【MovePlayerHorizontally】を呼び出し
・状態が(死亡)であればVerticalForceに0x28をセット
・→【ExitMov1】
ExitMov1:
・→【MovePlayerVertically】
MovePlayerVertically:
・アドレス$00にVerticalForceをセット
・→【ImposeGravity】
ImposeGravity:
・Player_YMF_DummyにPlayer_Y_MoveForceを加算
・アドレス$07にPlayer_Y_Speedの正負(0または-1)をセット
・Player_Y_PositionにPlayer_Y_Speedを加算
・Player_YMF_Dummyが256以上なら256を引き、Player_Y_Positionに+1
・Player_Y_MoveForceにVerticalForceを加算
・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:
・呼び出し元に戻る
ここから先は
¥ 500
この記事が気に入ったらチップで応援してみませんか?


購入者のコメント