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に入ります。
これで挙動がスッキリしました。