CDW SAVE セーブ、LOAD ロードを実装した


2022年 7月 8日
 
 
 まだ完全では無いけど、セーブ、ロードを実装した。

 だいぶ時間がかかったけど、たしかに仕事しながらだと進まないというのもあるけど、セーブ機能も案外ややこしいので手間取った、というのもある。

 SAVE、LOAD機能を実装するくらいになると製作も終盤になる、なぜかと言うとセーブするデータがある程度そろわないと作りにくいから。
 
 

 今回のセーブデータは、システムデータ sys.dat、ゲームデータ data.dat、初期配置データ sdat.dat、リプレイデータ rep_data.datがある。
 
 
 セーブ初期

 dtf データフラグは読み込みの際に、その番のデータがあるか。

 datがセーブするデータだけど、セーブの仕方がこれで良いのかどうか分からないけど、自分はベタに一つの変数 datに全部放り込んで bsaveする方法にしてる。

 効率は悪い(ややこしい)と思うけど、他に方法を知らない。

 セーブするデータの総量を算出して datbにし、dim dat,datbで定義してる。

 sdatは初期配置データで「始めからやりなおし RESTART」の時のデータ、まだ実装してない。

 sysはシステムデータ。
 
 
 システムデータセーブ

 1~7までは、いわいるコンフィング関係のデータで、例えば表示速度とかゲームレベルとか、ゲーム中に変えられるようなデータ。

 音関係はまだ実装してないので入ってない。

 30~はセーブ画面のミニマップ表示用のマップデータを 8つ分。

 ミニマップというのはこれ

 今回、苦労したものの一つがこれで、これが無いとセーブデータの内容が具体的に分かりにくいと思ったので作った。

 表示速度的にどうかとも思ったけど、表示毎フレーム 8マップ分、2ドットの大きさで 1つずつ描く仕様になってる。

 copyが使えればねえ。
 
 
 表示

 ミニマップの所が、そのミニマップ表示の部分。

 ゲーム画面が 1画面~3画面と 3種類あるので、その HEXの横 xの数を、システムデータ sysの最後に 8マップ分格納している。

 smfは、セーブモードフラグで、0=通常、1や2はセーブしますか、ロードしますかの画面。

 これもまだ出来てないけど「セーブしますか?」のような文字を描く。

 YESを押せばセーブされます、それ以外だと smf=0に戻ります。
 
 
 データセーブ

 見ての通り、dat データ n番目にデータを次々と放り込むベタなやり方になってます。

 ロードはこの逆です。

 システムデータとリプレイデータもセーブしてます、後は初期配置データもセーブされるよう後で実装します。
 
 
 ロードはこうなります。

 リプレイデータのセーブファイルの大きさは「可変」にしました、量が大きいので。

 existでファイルがあるか調べ、無ければ strsizeに-1が入り、有れば strsizeにそのデータ量が入ります。

 dim定義で、その strsizeを指定してやります。

 dim repd2,strsizeですね。

 repdは実際に使うリプレイのデータで、100000個で固定です。

 ロードした repd2のデータを repdに移して使います。

 saveの時も使用している repdデータだけを repd2に移してセーブしてます、ファイルのデータ量を抑えられます。

 つまり、ゲーム中で使ってる repdデータは 100000個で固定して使い、セーブファイルだけ必要な量だけにしてセーブしてます。
 
 
 セーブメイン

 操作関係で、横スワイプだとオプション画面等の切り替えになります。

 縦スワイプでゲームに戻ります。

 
 

 左側のファイル表示を押せばセーブ、右側がロードです。

 一番下はオートセーブで、ゲ-ムのターンエンド時に自動でセーブされます、データ的には dara0になります。

 一般セーブは 7箇所で data1~data7になります。
 
 
 
 セーブ関係のソースでは以上ですけど、これの難しいのは「どのタイミングでセーブするか」で、これもまだ完全では無いんですけど、プレイヤー操作時のセーブは問題ありませんけど、CPUの場合はどの時点でセーブするのか難しいです。

 オプションと並列になってるので、オプションはいつでも操作出来る方が望ましいのでしょうけど、セーブのタイミングを同じにはできません、操作アルゴリズム中の中断デ-タなんてできる訳ありません。

 そこで、セーブ操作をした後、その CPUの勢力が操作を終えた時点でセーブされるようにしてます。

 セーブを決定すると、その CPUの操作が終わるまで表示をスキップするようにしてます。

 操作が終わった時点でセーブします。

コメントを残す

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