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