コミュニティアイコン プチコン 非公式コミュニティ トピック

アバター
みどり ◆UuFOYlGswjhS
2018/8/13 17:58
質問
DATファイルを自作ゲームの新旧ver対応にするには
例えば、ver1.5.7では5つの要素をセーブ。ver1.6.0では7つの要素をセーブ。こうすると同じファイルではエラーが出てしまいます。そのエラーを回避する方法を教えてください。

コメント

アバター
あまさとしおん 2018/8/13 18:13 ◆mzDKTVUAtwqE
まずセーブファイルにversionを記録しましょう(先頭or末尾)
旧バージョンをすでに公開している場合は末尾にします。(互換のため)
末尾が1600ならver1.6.0、そうでないならば過去のversion、と言う風になります。
(例。数字を1000倍にする場合)
あとはversionに応じて読み込む処理を変えるだけです
アバター
あまさとしおん 2018/8/13 18:16 ◆mzDKTVUAtwqE
実装例
(version記録が無い場合は1.5.0と仮定した場合で、1.5.7と1.6.0に対応する例)

LOAD "DAT:ほげほげ",ARRAY,0
GET_VER=POP(ARRAY)
IF GET_VER==1600 THEN
 (1.6.0の処理)
ELSEIF GET_VER==1570 THEN
 (1.5.7の処理)
ELSE
 PUSH ARRAY,GET_VER 'POPで消えた分を戻す
 (1.5.0の処理)
ENDIF

※全角スペースはインデント1段階の意味
アバター
しょうご 2018/8/13 18:37 ◆tpp2zBc4h8pI
自分はもう面倒なので今作っているゲームでは互換性を切るようにしました。セーブデータを更新すると、旧バージョンでは起動できなくなるようにしています。
アバター
みどり 2018/8/13 19:02 ◆UuFOYlGswjhS
なるほど…参考にしてみます。
アバター
しょぼーん 2018/8/13 20:16 ◆lp6HwPeaFWPI
LENとかヘッダつけるとかファイル名とかでバージョン識別してセーブファイルに互換性をつけるプログラムを走らせればいいです。
アバター
おちゃめ 2018/8/16 6:17 ◆jH1opV6FnGyx
新バージョン旧バージョンのセーブデータをどうしても使いたいのでしたら一番簡単なのは旧バージョンのセーブデータを新バージョンのセーブデータに変換するプログラムを作ることです。
変換はあまさとしおんさんの解説のような感じで問題ありません。

もしも、同様のゲーム(バージョンアップの際にセーブデータの仕様が変わるようなゲーム)を私が作るとしたらDAT(数値配列)ではなくTXT(文字列)でセーブデータを用意すると思います。
文字列ならば読み込みは普通にできるので文字列内にセーブデータの仕様の情報を埋め込むことで今後どのようなバージョンアップを行ってもプログラム内で対応が可能となります。
アバター
たんじぇ 2018/8/22 12:20 ◆WDmFkVwZ4yMl
データの保存の仕方にもよりけりで、保存データの互換性の設計は結構考えないとたいへんだったりします。

まずはバージョン情報がほとんどの場合に必要で、本当はデータの先頭にあったほうがよかったりします。(最初に1バイトもしくは1行を読み込んでバージョン判定して読み込み処理が分岐できるので)

今のバージョンで先頭のデータが絶対に100を超えないとか、255までしか無いとかなら、あまさとしおんさんのとおりその値を絶対に超えるような 1600 などを入れてしまって、これが1600以上なら新バージョンとして、未満なら旧バージョンとして読込・保存をするようにすることもできます。
バージョンが読み込めるようになればデータの持ち方は分岐で新しくすることもできます

1.5.7でファイルを読み込むと5つの要素を配列に代入するはずで、1.6.0でファイルを読み込んでも今までどおり5つの要素が読み込んで配列に代入しておいて、新しい2つの要素はプログラム実行で更新され、
1.6.0でファイルを保存するときに、バージョンありの新ファイル名に7つの要素を保存するようにすることもできます。(これが おちゃめさんが言っている変換プログラムの代わりにもなる)

新旧が混在するので、1.6.0でファイルを読み込むときは。先に新ファイルがあるかチェックして、あれば新ファイルからバージョンや7つの要素を読み込み、なければ旧ファイルから5つの要素を読み込み
ってすることで、新旧のファイルが混在しても大丈夫です。
バージョンが上がっても新ファイルチェックをして無ければ旧ファイルを読み込む処理がずっと必要なので、2.0.0では旧ファイルが対応されなくなります、ってして2.0.0では新ファイルのみ対応ということもできます。
アバター
たんじぇ 2018/8/22 12:22 ◆WDmFkVwZ4yMl
セーブデータ系の特徴などはいろいろあるけどやりかたによる特徴を書いておきます

テキストデータ
- 1行単位で読み込めるので順番をほとんど気にしなくていい
- テキストなので文字列を分割して処理するコードが必要
- 「version = 1.6」 のようなデータにして、「=」で分割して「version」ならアノ変数に「1.6」を代入ってやりかたを、すべての項目にする
- iniファイルのように値のグループ分けもできる( [SYSTEM] のように [] で囲まれたらグループ開始って処理するコードが必要)
- 人間が見て分かるので勝手に書き換えられやすい

バイナリデータ
- 配列に読み込んで、配列の何番目がどのデータと決めて読み込む
- 工夫しないと保存・読み込みが大変なので、ほとんどの場合はヘッダを付ける

バイナリデータのヘッダあり
- 先頭に16バイトなどの決め打ちでファイルの情報をもつ(バージョンとか何個目のセーブデータとか読み込み時にプログラムが気にする情報)
- ファイルサイズが固定なデータによくある形式、ゲームセーブデータもだいたいコレ
- 何番目の配列位置からどのデータが何バイトある、というのはプログラムが持っている(配列何番目がこの値って処理する)
- データの拡張を気にするなら、なまえ4文字 の場合でも16文字分とか、HPが INT型変数1つじゃなくて4つくらいもっておいて将来の拡張を考えている場合もある(拡張した部分はバージョンによって読み込むかどうかの分岐をする)

バイナリデータのヘッダとテーブルあり
- データの何番目から何バイトに何の情報が入っている、という一覧をデータに入れておく(コレがテーブルって呼ばれる情報、一覧が最大何個か(テーブル長)はヘッダに書いておく、データの何番目が -1とか、何の情報がEND なら一覧が終わりと判断もできる)
- ファイルサイズが固定じゃない画像ファイルによくある形式、ゲームではあんまり見かけない形式、バージョンアップがよくあるPCソフトのデータもだいたいコレ

コメントを書く

  • こちらは「プチコン3号」「プチコンBIG」など、プチコンシリーズに関する話題を扱ったコミュニティです
  • プチコンシリーズにまったく関係ない書き込みはご遠慮下さい。削除の対象となります
  • こちらにはその他のゲームや雑談のコミュニティはなく、作る予定もありません (ひとりで管理できないため)。ごめんなさい
  • ユーザー登録なしで書き込みができます
  • 秘密の合い言葉は成りすましの防止 (トリップ機能)、書き込みの編集時の本人認証に使用します
  • 秘密の合い言葉に他人に推測されやすい言葉、他サービスと同じパスワードは入力しないでください。
  • 書き込むと、投稿時に入力したお名前と秘密の暗号が記憶され、ログイン状態になります

- WEB PATIO -