CDW オプションルーチンを整理した


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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です