2022年 8月 5日
と言う訳でオプションルーチンを整理しました。

前回までは *game_mainルーチン内からオプションを呼び出してましたけど、ご覧のように一度 *game_mainルーチンを抜けてから *optionルーチンに入るようにしてます。
これによって何とか SAVE、LOADのタイミングの整合性を取る事ができました。
プレイヤー操作の場合は、そのまま抜けても大丈夫です。
*player
kf=0 ; キーフラグ
kln1=0 ; 押した国
kln2=0 ; 攻め込む国
repeat
scr_key ; キー入力
; 押してない
repeat 1
if k=256 : break ; 放してない
if kf=0 : break ; 一度も押してない
if kf=2 : kf=0 : break ; スクロールモード
; オプション
if kf=3 : mainf=6 : break
;if kf=3 : gosub *option : kf=0 : break
; 押して放した
kf=0 ; リセット
mkn_syo ; HEX座標(mkn)
if mkn<0 { ; 画面外
if kln1=0 : gosub *tarn_end
kln1=0 : break
}
if map(mkn)<1 : kln1=0 : break ; 領土外
ldn=map(mkn) ; 国No.
if kln1=ldn : kln1=0 : break ; 同じ国の場合リセット
if kln1=0 : kln1=ldn : break ; 国選択
if lpd(kln1)!pn1 and kln1!ldn : kln1=ldn : break ; 別の国を選択
repeat 1 ; 攻め込む
if kln1=0 : break ; 選択してない
if lpd(kln1)!pn1 : break ; 自国では無い
if lpd(ldn)=pn1 : break ; 自領なので攻め込まない
if ldcd(kln1)<2 : kln1=0 : break ; ダイスが2以上無い
f=0 : ldlg=kln1*ldlb
repeat ldlb ; 隣接国か
if ldl(ldlg+cnt)=ldn : f=1 : break
loop
if f=0 : kln1=0 : break
kln2=ldn
gosub *battle ; 戦闘へ
loop
kln1=0
kln2=0
loop
if k=512 {
if kln1=0 : gosub *tarn_end : break ; ターンエンド
if kln1>0 : kln1=0
}
if mainf!5 or tarn_endf=1 or msf=0 or loadf=1 : break
if k=32 : dbgf=(dbgf+1)\2 ; デバッグ
redraw 0
sc_mput ; スクロールマップ表示
n=0 : if kln1>0 : n=1
stk_put n ; ストック表示
dg_put ; デバッグ表示
redraw 1
await 1000/50
loop
; ウエイト表示
kf=0 : bpwt1c=0
repeat
scr_key ; スクロール入力
if kf>0 and k!256 : kf=0 : break ; 放した
redraw 0
sc_mput
stk_put ; ストック表示
redraw 1
await 1000/50
if bpwt1f<6 { ; 表示ウエイト
if bpwt1c>=bpwt1 : break
bpwt1c+
}
loop
return
;オプションの部分ですね、mainf=6でオプションモードに切り替えてます。
その下にコメントアウトで変更前の gosub *optionがあるのが分かります。
if mainf!5 or tarn_endf=1 or msf=0 or loadf=1 : break で抜けてます。
CPUの場合は、ターンエンド時のダイス積み増し表示の時にキー入力を受付、入力があった場合は全部ダイス増を終わって次のプレイヤーに変わるタイミングでオプションに入ります。
#deffunc te_put int _te_putf; ターンエンド表示
if te_kf=3 : return ; セーブのため無表示
te_putf=_te_putf
kf=0 : bpwt1c=0 : te_kf=0
repeat
scr_key ; スクロール入力
if kf>0 and k!256 : kf=0 : break ; 放した
if kf=3 : te_kf=3 : break ; オプション予約
;if kf=3 : gosub *option : kf=0 : break
redraw 0
sc_mput
n=0 : if tef=1 or te_putf=1 : n=1
stk_put n ; ストック表示
redraw 1
await 1000/50
if bpwt1f<6 { ; 表示ウエイト
if bpwt1c>=bpwt1/5 : break
bpwt1c+
}
loop
return
if kf=3 : te_kf=3 : break の部分で待機モードになり、その場合先頭の if te_kf=3 : returnの部分で表示をスキップします。
ここでもコメントアウトで変更前の gosub *optionがあるのが分かります、変更前はここから直接オプションを呼び出していた訳です。
*game_mainのルーチンです。
*game_main
repeat plb
pn1=pad(padn)
padn+ : if padn=plb : padn=0 : save 0 : break ; 全部終わり
if pfd(pn1)=0 : continue ; 滅んでる
; cu表情
repeat ldb,1 : ldn=cnt
if lpd(ldn)!pn1 : continue
if ldcu(ldn)=0 : continue
cupf(ldcu(ldn))=0 ; フラットに
loop
if pfd(pn1)=1 : msf=1 ; メインスイッチフラグ
if pfd(pn1)=2 : msf=2 ; CPU
tarn_endf=0 ; ターンエンドフラグ
while tarn_endf=0
switch msf
case 1 ; プレイヤー
gosub *player
if mainf!5 : padn- : tarn_endf=1 : swbreak
swbreak
case 2 ; CPU
gosub *strategy
gosub *tarn_end
if te_kf=3 {
mainf=6 : swbreak ; オプションへ
}
swbreak
swend
if mainf!5 : break
wend
if mainf!5 : break
loop
if mainf=5 : padn=0
return
CPUのターンエンド処理(gosub *tarn_end)をした後に、スイッチである te_kf=3で mainf=6にしてオプションモードにして抜けるようにしてます。
プレイヤーの場合は順番である padnを -1してからセーブします、これは先頭で padn+してるので、LOAD時やオプションからの復帰時もこのプレイヤーから始めるためです。
後はセーブ時にプレイヤー順番である padnを控えておきます。
#deffunc save int _saven,int _savef saven=_saven ; セーブNo. savef=_savef ; フラグ sys_save ; システムデータ、セーブ if savef=1 : return ; システムデータのみ ; データ格納 n=0 dat(n)=lx : n+ ; スクロール表示位置 dat(n)=scf : n+ ; スクロールフラグ dat(n)=dbpl : n+ ; 最大戦力プレイヤー dat(n)=plb : n+ ; プレイヤー数 dat(n)=padn : n+ ; 現在の順番 dat(n)=mb : n+ ; 全HEX数 dat(n)=ldb : n+ ; 国数 repeat mb : dat(n)=map(cnt) : n+ : loop ; マップ repeat mb : dat(n)=hwd(cnt) : n+ : loop ; HEXの外周枠情報 repeat lddb : dat(n)=ld(cnt) : n+ : loop ; 領土 repeat (ldb+1)*ldlb+1 : dat(n)=ldl(cnt) : n+ : loop ; 隣接国 repeat ldb+1 : dat(n)=lpd(cnt) : n+ : loop ; 領土のプレイヤー repeat ldb+1 : dat(n)=ldcd(cnt) : n+ : loop ; ダイス数 repeat ldb+1 : dat(n)=ldcu(cnt) : n+ : loop ; キャラクターユニット repeat ldb+1 : dat(n)=dpd(cnt) : n+ : loop ; 国のダイス表示順番 repeat ldb+1 : dat(n)=lcx(cnt) : n+ : loop ; 中間座標x repeat ldb+1 : dat(n)=lcy(cnt) : n+ : loop ; 中間座標y repeat ldb+1 : dat(n)=ldhx1(cnt): n+ : loop ; 最左ライン repeat ldb+1 : dat(n)=ldhx2(cnt): n+ : loop ; 最右ライン repeat ldb+1 : dat(n)=ldhy1(cnt): n+ : loop ; 最上ライン repeat ldb+1 : dat(n)=ldhy2(cnt): n+ : loop ; 最下ライン repeat plb+1 : dat(n)=pfd(cnt) : n+ : loop ; プレイヤー操作 repeat plb+1 : dat(n)=pld(cnt) : n+ : loop ; プレイヤーの領土数 repeat plb+1 : dat(n)=pdca(cnt) : n+ : loop ; 増ダイス数 repeat plb+1 : dat(n)=pad(cnt) : n+ : loop ; 行動順 repeat plb+1 : dat(n)=dp(cnt) : n+ : loop ; 全ダイス戦力数 repeat plb+1 : dat(n)=dcpn(cnt) : n+ : loop ; 表示ダイスグラNo. repeat plb+1 : dat(n)=pdsd(cnt) : n+ : loop ; ストックダイス数 repeat 21 : dat(n)=clpn(cnt) : n+ : loop ; カラー s="data"+saven+".dat" bsave s,dat ; データセーブ ; スタートデータセーブ s="sdata"+saven+".dat" bsave s,sdat ; リプレイデータセーブ dim repd2,repc repeat repc repd2(cnt)=repd(cnt) loop repd2(0)=repc ; カウンター repd2(1)=repk ; データ位置 bsave "rep_data"+saven+".dat",repd2 return
5番目くらいのデータですね。
LOADの時に、この padnを呼び出して、続きの順番から *game_mainに入ります。
これで挙動がスッキリしました。