| 027D53 |
STZ $23DA |
$23DA=#$00 |
|
| 027D56 |
STZ $2458 |
$2458=#$00 |
|
| 027D59 |
STZ $245A |
$245A=#$00 |
|
| 027D5C |
JSR $7E9D |
SR: $027E9D |
パルプンテ結果決定 |
| 027D5F |
JSR $7F10 |
SR: $027F10 |
行動後追加Msg表示? |
| 027D62 |
JSR $7B52 |
SR: $027B52 |
|
| 027D65 |
LDA $00 |
A=DP($00) |
|
| 027D67 |
STA $23EA |
$23EA=A |
|
| 027D6A |
LDA $02 |
A=DP($02) |
|
| 027D6C |
STA $23EC |
$23EC=A |
|
| 027D6F |
JSL $C2CE9A |
SR: $02CE9A |
エフェクト描画 |
| 027D73 |
JSR $7DC4 |
SR: $027DC4 |
遊び人の火遊び処理 |
| 027D76 |
JSL $C28375 |
SR: $028375 |
1キャラクター行動開始時変数初期化処理 |
| 027D7A |
LDY #$0000 |
Y=#$0000 |
|
| 027D7D |
STZ $23FA |
$23FA=#$00 |
|
| 027D80 |
LDA #$0000 |
A=#$0000 |
|
| 027D83 |
PEA #$23AD |
Push #$23AD |
|
| 027D86 |
PEA #$007F |
Push #$007F |
|
| 027D89 |
PEA #$7E00 |
Push #$7E00 |
|
| 027D8C |
JSL $C902E9 |
SR: $0902E9 |
RAM上情報変更 |
| 027D90 |
JSR $7DD1 |
SR: $027DD1 |
メガンテ実行時の効果決定(即死かダメージか) |
| 027D93 |
JSR $8400 |
SR: $028400 |
1キャラクター行動開始時変数初期化処理 |
| 027D96 |
BCS #$22 |
if(c==on) goto $027DBA |
|
| 027D98 |
JSR $8426 |
SR: $028426 |
戦闘行動が対象に有効か調べる(無効c=on) |
| 027D9B |
BCS #$1D |
if(c==on) goto $027DBA |
|
| 027D9D |
JSR $8795 |
SR: $028795 |
|
| 027DA0 |
JSR $87B9 |
SR: $0287B9 |
一撃必殺武器ヒット判定(ヒットc=on) |
| 027DA3 |
BCS #$15 |
if(c==on) goto $027DBA |
|
| 027DA5 |
JSR $885E |
SR: $02885E |
戦闘行動実体SR実行 |
| 027DA8 |
JSR $88B3 |
SR: $0288B3 |
攻撃により目が覚めた・我に返った処理 |
| 027DAB |
JSR $7E01 |
SR: $027E01 |
眠り毒麻痺追加攻撃処理 |
| 027DAE |
JSR $88CF |
SR: $0288CF |
もろはのつるぎ装備時の反射ダメージ処理 |
| 027DB1 |
JSR $896D |
SR: $02896D |
やいばのよろい装備時の反射ダメージ処理 |
| 027DB4 |
JSR $89C5 |
SR: $0289C5 |
なげきのたて装備時の反射ダメージ処理 |
| 027DB7 |
JSR $8A2C |
SR: $028A2C |
|
| 027DBA |
INY |
Y++ |
|
| 027DBB |
CPY #$0018 |
Y>=#$0018? |
|
| 027DBE |
BCC #$BD |
if(c==off) goto $027D7D |
|
| 027DC0 |
JSR $8A96 |
SR: $028A96 |
戦闘行動追加処理 |
| 027DC3 |
RTS |
return |
|
ここが実際の戦闘行動を実行している部分です。ポイントは「戦闘行動は参加キャラクター分全部に対して実行するかどうかの判断を行う」という点です。$027D7D-BEまでが1キャラクター分の実行部分に相当します。ターゲット情報(1体,グループ, 全体など)と照らし合わせて、#$01~$17までのキャラクターが実行対象になるかを判断して($027D98)、対象である場合のみ実行する、というようになっています。戦闘行動($020060-)の「行動プログラムアドレス」で指定している開始アドレスは$027DA5で呼ばれます。つまり、「行動プログラムアドレス」に記述されている処理は「対象1体に対してのみの処理」を記述することが期待されます。対象選択は「対象数」「選択対象」の値でコントロールすることになります。また、メガンテの術者死亡処理など1回だけ実行させたい処理は$027DC0で呼ばれるように設定する必要があります。
| 027E9D |
LDA $23EE |
A=$23EE |
|
| 027EA0 |
CMP #$0048 |
A==#$0048? |
戦闘行動がパルプンテの場合 |
| 027EA3 |
BNE #$07 |
if(z==off) goto $027EAC |
|
| 027EA5 |
JSL $C2CE9A |
SR: $02CE9A |
エフェクト描画 |
| 027EA9 |
JSR $7EAD |
SR: $027EAD |
パルプンテ結果選択処理 |
| 027EAC |
RTS |
return |
|
| 027EAD |
LDA #$FFFF |
A=#$FFFF |
|
| 027EB0 |
STA $00 |
DP($00)=A |
|
| 027EB2 |
STZ $02 |
DP($02)=#$00 |
|
| 027EB4 |
PEA #$2011 |
Push #$2011 |
|
| 027EB7 |
PEA #$0020 |
Push #$0020 |
|
| 027EBA |
PEA #$7E00 |
Push #$7E00 |
|
| 027EBD |
JSL $C9029E |
SR: $09029E |
イベント戦闘かチェック |
| 027EC1 |
BEQ #$07 |
if(z==on) goto $027ECA |
|
| 027EC3 |
LDA $00 |
A=DP($00) |
|
| 027EC5 |
AND #$E504 |
A&=#$E504 |
イベント戦闘の場合は一部の結果は選択対象外にする |
| 027EC8 |
STA $00 |
DP($00)=A |
|
| 027ECA |
LDX #$0000 |
X=#$0000 |
|
| 027ECD |
JSL $C01407 |
SR: $001407 |
乱数発生 $0000-FFFF dp,Xの1になっているビットをランダムで0にする? |
| 027ED1 |
BCC #$FE |
if(c==off) goto $027ED1 |
|
| 027ED3 |
ASL |
A<<1 |
|
| 027ED4 |
TAX |
X=A |
|
| 027ED5 |
LDA $C27EF0,X |
A=$027EF0+X |
パルプンテ結果配列から結果の戦闘行動を取得する |
| 027ED9 |
JSR $75C6 |
SR: $0275C6 |
|
| 027EDC |
STA $242A |
$242A=A |
|
| 027EDF |
LDA $23E4 |
A=$23E4 |
|
| 027EE2 |
STA $2428 |
$2428=A |
|
| 027EE5 |
JSL $C270F2 |
SR: $0270F2 |
|
| 027EE9 |
LDA $2430 |
A=$2430 |
|
| 027EEC |
STA $23E6 |
$23E6=A |
|
| 027EEF |
RTS |
return |
|
パルプンテ実行時の結果の選択は、SR: $001407をコールして、#$FFFFの中からランダムでビットをOFFにしていき、ONになっているビットが1つだけになるまで繰り返し(c=onで判定)、その際にONになっているビットの下から数えて何番目か(例:0008なら3、1000なら12)をAレジスタにセットさせることで、パルプンテ結果戦闘行動IDの配列($027EF0-)へのオフセット作っています。イベント戦闘フラグがONになっている場合は、都合の悪い結果(全員会心、くだけちる)などはビットをOFFにして元から選択されないようになっています。$E504=1110010100000100なので、実行されるのはべホイミ(味方)、べホマラー(味方)、オールザオリク、ならびかたかえる、やまびこ、オールキアリクだけ、ということになります。ちなみにK.Mixで実装した「遊び人の使える遊び」の選択はこの部分をパクった参考にしたものです。次回以降のエントリで説明しますが、毒針等の一撃死も同様で、イベント戦闘中には発生しないようになっています。
コメント