[掲示板へもどる]
一括表示

記事No: 21781 [関連記事]
タイトル自作選択肢で、可変DBに値を変更してセーブデータに書き込み、初期化しない方法がわかりません
投稿日: 2025/10/26 10:54
投稿者ゆう [rLde561]

[やりたいこと]
自作選択肢で、可変DBに初期値から値を変更してセーブし、タイトル画面に戻っても値を保持したまま自作選択肢に反映させたい。

[やってみたこと]
基本システム(3.660)上で、自作セーブデータをタイトル画面に作りました。
直打ちではタイトル画面、コモンイベント上でもその場限りでは、セーブデータの書き込みや自作セーブデータでも書き込みされます。
自作選択肢も可変DBの初期値は反映されて表示や行動ができています。

[やってみた結果、どううまくいかないか]
セーブデータの書き込みに、変数を使うとセーブが書き込めなかったりできても処理が中途半端になり、それならと自作セーブデータで丸ごとセーブしたりしたのですが、可変DBが処理中断してタイトル画面に戻ると初期設定値に戻ってしまう。
タイトル画面に戻ると可変DBが初期化される仕様なのはわかりますが、ならなぜ他の基本セーブデータでは初期化されないのでしょうか。

一応、理由はわからないのですが、自作選択肢内でセーブデータの読み込みに成功したイベントを置いておきます。
書き込みのタイトル画面変遷での初期化だけは、理由も見当つかず、本当にお手上げです。


●ラベル地点「★おまけセーブ読込」 <<<<<<<<<<<<<<<<<<<<<<<<★
■変数操作: CSelf21[データ番号] = 0 + 0
■変数操作: CSelf47 = 3 + 0
■変数操作: CSelf45[おまけセーブ番号] = 1125000003 + 0
■変数操作: CSelf45[おまけセーブ番号] = 可変DB[ 25:0:3 ] (選択肢001:解放されたら1) + 0
■文字列操作:S0[[サンプル]一時文字列] = "Save/omake.sav"
■DB読込(可変): CSelf46[0か1] = 可変DB[ "cin選択肢内容":CSelf21[データ番号]:CSelf47 ] (25:-:-)
■回数付きループ [ 20 ]回
|■セーブデータの内容読込: CSelf46[0か1] = セーブデータ[S0[[サンプル]一時文字列]]の V[CSelf45[おまけセーブ番号]]
|■デバッグ文:\cself[45]:可変変数
|■DB読込(可変): CSelf46[0か1] = 可変DB[ "cin選択肢内容":CSelf21[データ番号]:CSelf47 ] (25:-:-)
|■デバッグ文:\cself[46]:0か1\n\cdb[25:0:\cself[47]]=\cself[45]
|■変数操作: CSelf47 += 5 + 0
|■変数操作: CSelf45[おまけセーブ番号] += 0 + 0
|■
◇ループここまで◇◇
●ラベル「★おまけセーブ読込おわり」に飛ぶ >>>>>>>>>>>>>>>>>>>>>>>>>


記事No: 21782 [関連記事]
タイトルRe: 自作選択肢で、可変DBに値を変更してセーブデータに書き込み、初期化しない方法がわかりません
投稿日: 2025/10/26 19:04
投稿者Masaqq [FiprrgO824]

ゆう様
 
私が内容を正確に把握できているかどうか分かりませんが
何か参考になればと思い返信します。
 
 
<原因の推測>
1:処理順の問題
選択肢の表示内容を書き込む前に、選択肢が表示処理されている可能性。

イベントが実行される処理順(起動優先順)は以下のようになっています。
  並列マップイベント→自動マップイベント→自動コモンイベント→並列コモンイベント
(ウディタの説明書より引用)

ウディタ内の暗黙の仕様(【4】イベントが実行される順番)
hhttps://silversecond.com/WolfRPGEditor/Help/01specifi.html


2:自己原因のバグや処理不足
自作部分でおかしいことに気づかないケースは高確率であります。
セルフチェックが難しそうな場合は、うまくいかない部分を提出したり
全体的な処理の流れを説明することも考えてください。
 

3:機能外の処理、またはバグ
全部のデータがセーブファイルから書き込み/読み込みできる訳ではありません。
下記説明書にいくつか注意書きがあるのでチェックしてみてください。

[セーブ・ロード操作]の説明書
hhttps://silversecond.com/WolfRPGEditor/Help/04ev_file.html


バグっぽい場合は、別のゲームデータで最小構成で組んで再現を確認してください。
バグならバグ報告掲示板で報告すれば喜ばれると思います。


<対応案>
作ろうとしている処理を推察するに、おまけフラグを検知して、
その選択肢表示のイベント内で
その表示前に選択肢を作る処理を組むのが無難な気はします。

S[0]=Save/omake.savのファイルが存在するかどうかSys24を取得して
条件分岐で処理した方が比較的安全と思います。

S0 は 3000000で指定可能
Sys24は 9000024で指定可能


〜イベントコードの雑例〜
■文字列操作:S0[システムファイル名] = "Save/omake.sav"
■セーブデータの内容読込: CSelf20[チェック] = セーブデータ[S0[システムファイル名]]の Sys24:[読]セーブデータ読込判定(1=成功 0=失敗)
■条件分岐(数値): 【1】 CSelf20[チェック] が 0 と同じ 【2】 CSelf20[チェック] が 1 と同じ
-◇分岐: 【1】 [ CSelf20[チェック] が 0 と同じ ]の場合↓
|▼ 読み込み失敗
|■ ※選択肢を削除処理〜
|■
-◇分岐: 【2】 [ CSelf20[チェック] が 1 と同じ ]の場合↓
|▼ 読み込み成功
|■ ※選択肢を追加処理〜
|■
◇分岐終了◇
■文章選択肢:/ 【1】スタート / 【2】コンティニュー / 【3】\cdb[25:*:5] / 【4】\cdb[25:*:10]
-◇選択肢:【1】 スタート の場合↓
|■
-◇選択肢:【2】 コンティニュー の場合↓
|■
-◇選択肢:【3】 \cdb[25:*:5] の場合↓
|■
-◇選択肢:【4】 \cdb[25:*:10] の場合↓
|■
-◇キャンセルの場合
|■
◇分岐終了◇


以上になります。


記事No: 21783 [関連記事]
タイトルRe: 自作選択肢で、可変DBに値を変更してセーブデータに書き込み、初期化しない方法がわかりません
投稿日: 2025/10/26 23:36
投稿者ゆう [rLde561]

Masaqq様

迅速な返信ありがとうございます。

最初の書き込みをしてからまたいろいろといじくり回しました。
わかりにくい説明の中、丁寧な説明をありがとうございます。
Save/omake.savは、起動時に作るように閃きました。

【現在のコモンイベントの流れ】
今は、Save/omake.savで直接セーブ・ロードをして、可変DBの値を記録する方法に気付きましたが、四苦八苦しております。詳しくは【やってみた結果、どううまくいかないか】で。

まず下地を回数ループで作りまして、10×10で20個選択肢があり、カーソル移動もできて、中身も下記の状態で動くことができています。ここは説明不足でした、すみません。

まず、?????という文字列が可変DBで0の時に、無反応。正常です。
それ以外の1で決定キーを押すことで、別のコモンイベントで絵や文章表示をする、という処理をしています。

ウディタのデフォルトの選択肢では1つにつき基本10個までしか扱えないので、自作選択肢を選んだところです。

【やってみた結果、どううまくいかないか】
現在は大きく2つ。
1.基本システムのタイトル画面から別マップへ飛んで、自動実行したマップにコモンイベントで管理しています。
  問題はキャンセルキーを起動後の最初は2回押さないと元のタイトル画面へ戻れないことです。ちょっと不便なので、これをどうにかしたい。
  タイトル画面に戻るだと、初期化されるとのことなので別の方法を使っています。

2.Save/omake.savから直接ロードして値を記録しているはずなので、
  セーブデータの値を丸ごと変更されているのにセーブされていない? ことです。
  これはゲームを起動するごとに初期化されているようなので、こちらも四苦八苦中です。
Masaqq様の説明も受けて、最初にSave/omake.sav(共通セーブデータ)をスタートから、ではなく最初から用意すればいいと気付けました。ありがとうございます。

【おまけに関わるコマンドコード】
(変数名がないものは基本的に専用か汎用です)

1.タイトル画面、デフォルトの選択肢で4番目の、起動は自動実行のもの。

|■場所移動:主人公 ▲マップID4[load] X:0 Y:0 [トランジション + 暗転有り]
|■文字列操作:S0[[サンプル]一時文字列] = "Save/omake.sav"
|■回数付きループ [ 0 ]回
| |■DB読込(可変): このEvのSelf3 = 可変DB[ 25:0:8 ] (cin選択肢内容:選択肢001:解放されたら1)
| |■イベントの挿入: コモン240:[ おまけの選択肢下地 ]
| |■
|◇ループここまで◇◇
|■条件分岐(数値): 【1】 V0[] が 10 以外 【2】 V0[] が 10 と同じ
|-◇分岐: 【1】 [ V0[] が 10 以外 ]の場合↓
| |■イベントの挿入: コモン240:[ おまけの選択肢下地 ]
| |■データのロード: S0[[サンプル]一時文字列]
| |■変数操作: V0[] = 0 + 0
| |■
|-◇分岐: 【2】 [ V0[] が 10 と同じ ]の場合↓
| |■セーブデータの内容読込: V0[] = セーブデータ[S0[[サンプル]一時文字列]]の V0[]
| |■変数操作: V0[] = 0 + 0
| |■イベント処理中断
| |■
|◇分岐終了◇
|■イベントの挿入: コモン240:[ おまけの選択肢下地 ]
|■場所移動:主人公 ▲マップID0[タイトルマップ] X:9 Y:6 [トランジション + 暗転有り]

2.コモンイベント「おまけの選択肢下地」(メイン。長いため表示部分は省略します)
  決定キーを押すと、別に用意したコモンが1の時、動きます。いろいろちょっと適当。
  

■文章選択肢:/ 【1】
-◇選択肢:【1】 の場合↓
|■
-◇キャンセルの場合
|■
◇分岐終了◇
■条件分岐(数値): 【1】 CSelf0 が 10 以外 【2】 CSelf0 が 10 と同じ
-◇分岐: 【1】 [ CSelf0 が 10 以外 ]の場合↓
|■データのロード: S0[[サンプル]一時文字列]
|■
-◇分岐: 【2】 [ CSelf0 が 10 と同じ ]の場合↓
|■
◇分岐終了◇
■変数操作: V0[] = 10 + 0
■変数操作: CSelf21[データ番号] = 0 + 0
■文字列操作:CSelf7[タイプ名] = "cin選択肢内容"
■DB読込(可変): CSelf5[下部説明文] = 可変DB[ "cin選択肢内容":CSelf21[データ番号]:1 ] (25:-:ヒント)



●ラベル地点「★選択肢下地」 <<<<<<<<<<<<<<<<<<<<<<<<★

(表示系は動作に必要ないため、省略させていただきます。
 必要であれば、コモンイベント添付します……お見苦しいですが)

■キー入力:CSelf0 [入力待ち【!】] 4方向 決定(10) キャンセル(11)
■条件分岐(数値): 【1】 CSelf0 が 11 と同じ 【2】 CSelf0 が 10 と同じ 【3】 CSelf0 が 2 と同じ 【4】 CSelf0 が 4 と同じ
-◇分岐: 【1】 [ CSelf0 が 11 と同じ ]の場合↓
|■変数操作: V0[] = 10 + 0
|▼ タイトルに戻るため、可変DBを初期化しないために自力で削除する。
|●ラベル地点「★おまけ削除!」 <<<<<<<<<<<<<<<<<<<<<<<<★
|■ウェイト:1 フレーム
|■ピクチャ消去:1 〜 999 / 0(0)フレーム
|▼ 全セルフ変数初期化
|■ウェイト:1 フレーム
|■変数操作: V0[] = 1600000 + 0
|■回数付きループ [ 99 ]回
| |■変数操作: V[V0[]] = 0 + 0
| |■変数操作: V0[] += 1 + 0
| |■
|◇ループここまで◇◇
|■ウェイト:1 フレーム
|■変数操作: V0[] = 10 + 0
|■データのセーブ: S0[[サンプル]一時文字列]
|■場所移動:主人公 ▲マップID0[タイトルマップ] X:19 Y:1 [トランジション + 暗転有り]
|■条件分岐(数値): 【1】 CSelf0 が 11 以外 【2】 CSelf0 が 11 と同じ
|-◇分岐: 【1】 [ CSelf0 が 11 以外 ]の場合↓
| |■
|-◇分岐: 【2】 [ CSelf0 が 11 と同じ ]の場合↓
| |■場所移動:主人公 ▲マップID0[タイトルマップ] X:11 Y:4 [トランジション + 暗転有り]
| |■イベント処理中断
| |■変数操作: V0[] = 0 + 0
| |■
|◇分岐終了◇
|■条件分岐(数値): 【1】 V0[] が 10 以外 【2】 V0[] が 10 と同じ
|-◇分岐: 【1】 [ V0[] が 10 以外 ]の場合↓
| |■
|-◇分岐: 【2】 [ V0[] が 10 と同じ ]の場合↓
| |■場所移動:主人公 ▲マップID0[タイトルマップ] X:11 Y:4 [トランジション + 暗転有り]
| |■イベント処理中断
| |■変数操作: V0[] = 0 + 0
| |■
|◇分岐終了◇
|▼
|▼
|▼
|▼
|■
-◇分岐: 【2】 [ CSelf0 が 10 と同じ ]の場合↓
|▼

(決定キーの処理、カーソル移動も問題ないため省略させていただきます)

|■
◇分岐終了◇
■条件分岐(数値): 【1】 V0[] が 10 以外 【2】 V0[] が 10 と同じ
-◇分岐: 【1】 [ V0[] が 10 以外 ]の場合↓
|■
-◇分岐: 【2】 [ V0[] が 10 と同じ ]の場合↓
|■場所移動:主人公 ▲マップID0[タイトルマップ] X:11 Y:4 [トランジション + 暗転有り]
|■イベント処理中断
|■変数操作: V0[] = 0 + 0
|■
◇分岐終了◇
■条件分岐(数値): 【1】 CSelf0 が 11 以外 【2】 CSelf0 が 11 と同じ
-◇分岐: 【1】 [ CSelf0 が 11 以外 ]の場合↓
|■
-◇分岐: 【2】 [ CSelf0 が 11 と同じ ]の場合↓
|■場所移動:主人公 ▲マップID0[タイトルマップ] X:11 Y:4 [トランジション + 暗転有り]
|■イベント処理中断
|■変数操作: V0[] = 0 + 0
|■
◇分岐終了◇




●ラベル地点「★おまけセーブ読込」 <<<<<<<<<<<<<<<<<<<<<<<<★
■デバッグ文:■バグ取り開始
■変数操作: CSelf21[データ番号] = 0 + 0
■変数操作: CSelf47 = 3 + 0
■変数操作: CSelf45[おまけセーブ番号] = 1125000003 + 0
■変数操作: CSelf45[おまけセーブ番号] = 可変DB[ 25:0:3 ] (選択肢001:解放されたら1) + 0
■文字列操作:S0[[サンプル]一時文字列] = "Save/omake.sav"
■DB読込(可変): CSelf46[0か1] = 可変DB[ "cin選択肢内容":CSelf21[データ番号]:CSelf47 ] (25:-:-)
■回数付きループ [ 20 ]回
|■セーブデータの内容読込: CSelf46[0か1] = セーブデータ[S0[[サンプル]一時文字列]]の V[CSelf45[おまけセーブ番号]]
|■デバッグ文:\cself[45]:可変変数
|■DB読込(可変): CSelf46[0か1] = 可変DB[ "cin選択肢内容":CSelf21[データ番号]:CSelf47 ] (25:-:-)
|■デバッグ文:\cself[46]:0か1\n\cdb[25:0:\cself[47]]=\cself[45]
|■変数操作: CSelf47 += 5 + 0
|■変数操作: CSelf45[おまけセーブ番号] += 0 + 0
|■
◇ループここまで◇◇
●ラベル「★おまけセーブ読込おわり」に飛ぶ >>>>>>>>>>>>>>>>>>>>>>>>>
■条件分岐(数値): 【1】 V0[] が 10 以外 【2】 V0[] が 10 と同じ
-◇分岐: 【1】 [ V0[] が 10 以外 ]の場合↓
|■
-◇分岐: 【2】 [ V0[] が 10 と同じ ]の場合↓
|■場所移動:主人公 ▲マップID0[タイトルマップ] X:11 Y:4 [トランジション + 暗転有り]
|■イベント処理中断
|■変数操作: V0[] = 0 + 0
|■
◇分岐終了◇
■条件分岐(数値): 【1】 CSelf0 が 11 以外 【2】 CSelf0 が 11 と同じ
-◇分岐: 【1】 [ CSelf0 が 11 以外 ]の場合↓
|■
-◇分岐: 【2】 [ CSelf0 が 11 と同じ ]の場合↓
|■場所移動:主人公 ▲マップID0[タイトルマップ] X:11 Y:4 [トランジション + 暗転有り]
|■イベント処理中断
|■変数操作: V0[] = 0 + 0
|■
◇分岐終了◇

ここでコモンイベント終了です。呼び出しのみです。なぜ2回押さないとならないのかはいろいろ試し中です。
だいぶ省略しておりますが、その部分は関係ない、表示や決定キー後の処理のため関係ないと思った次第です。コモンイベント本体が必要でしたら、用意します。(配布目的で作っていますので)


記事No: 21784 [関連記事]
タイトルRe: 自作選択肢で、可変DBに値を変更してセーブデータに書き込み、初期化しない方法がわかりません
投稿日: 2025/10/27 01:55
投稿者Masaqq [FiprrgO824]

ゆう様

私も正直、細かく読み取るのは苦手なので
ある程度推測で対応していて申し訳ないところではありますが
追加で推測と対応を書いてみました。


<推測と対応:1>
キャンセルを多く押す必要があることについて
マップEvの自動実行や並列実行などで場所移動したケース
あるいは、条件を満たさなくなった途端に処理が終わると思っているケースに多いのですが
後続処理により最後尾まで処理されている可能性があります。

場所移動の直後に「イベント処理中断」などで後続処理を切ることで
余計なキー入力待ちの処理がなくせるかもしれません。

あとは、謎のキー入力待ちや選択肢で止まっている状態で
[F8キー]機能で調べれば、何のイベント処理中か調べるのも有効かもしれません。


<推測と対応:2>
そもそも正常にセーブorロードが出来ていない可能性を考えます。
どのようにセーブ&ロードができていることを確認してますか?

Save/omake.savが正常にセーブ/ロードできているか確認をしてください。
セーブ前に書き込んだ内容の存在チェックをする必要もあるかもしれません。

Sys24のチェックはわりと有効です
ファイルが見つからなければそもそもロードできないのと
ファイルが見つかればほぼロードはできていると思われます。

ロードが出来ているなら、セーブが出来てないか
セーブはできているが確認方法が間違っているか
ロードしたうえで更に余計な処理をしているかです。
どこまで処理が通っているのか切り分けしてみてください。


<推測と対策:3>
確認用のパラメーター指定がそもそも間違っている

■デバッグ文:■バグ取り開始
■変数操作: CSelf21[データ番号] = 0 + 0
■変数操作: CSelf47 = 3 + 0
■変数操作: CSelf45[おまけセーブ番号] = 1125000003 + 0
?変数操作: CSelf45[おまけセーブ番号] = 可変DB[ 25:0:3 ] (選択肢001:解放されたら1) + 0
■文字列操作:S0[[サンプル]一時文字列] = "Save/omake.sav"
■DB読込(可変): CSelf46[0か1] = 可変DB[ "cin選択肢内容":CSelf21[データ番号]:CSelf47 ] (25:-:-)
■回数付きループ [ 20 ]回
|?セーブデータの内容読込: CSelf46[0か1] = セーブデータ[S0[[サンプル]一時文字列]]の V[CSelf45[おまけセーブ番号]]
|■デバッグ文:\cself[45]:可変変数
|■DB読込(可変): CSelf46[0か1] = 可変DB[ "cin選択肢内容":CSelf21[データ番号]:CSelf47 ] (25:-:-)
|■デバッグ文:\cself[46]:0か1\n\cdb[25:0:\cself[47]]=\cself[45]
|■変数操作: CSelf47 += 5 + 0
|?変数操作: CSelf45[おまけセーブ番号] += 0 + 0
|■

よくよく見ると上記行頭の■を?に変えた3行が気になります。
?1、CDB自体の値を取得している。1行前の式が正しいのではないか
?2、回数ループ内のセーブ読み込みでVが付いている(X番変数呼出)。
?3、おまけセーブ番号+=0になっている

?1コードを[Qキー]で一時的にコメントアウトしたり
?3の値を正常に加算したり

なにか勘違いしてないか確認してみてください。


基本的なデバッグ方法で地味な作業にはなりますが
書き込み前後で読み込み後にどのようにパラメーターを指定したかチェックする方法も有効です。
※[文章の表示](デバッグ)で使えるValWatch:ON=変数名の利用が有効な時もあります。

デバッグの雑例:
■デバッグ文: CSelf46[0か1] \cself[46] ( \cself[45] )
■デバッグ文:ValWatch:ON=1125000003



<その他>※あまり参考にならないかも

ゲームを起動ごとに初期化されている件?
どこかでCDBを初期化してる可能性か
あるいはomake.savをロードしたあとに適切な処理を行っていない可能性?

 予備変数などにファイル識別値として格納して
 omake.savをまるごとセーブしたあとに予備変数に書き込むことで
 分岐処理しやすくなるかもしれません。

  処理の雑例:
  ■変数操作: CSelf10 = 1 + 0
  ■データのセーブ: S0[システムファイル名]
  ■セーブデータに書き込み:セーブデータ[S0[システムファイル名]]の V1-0[セーブファイル識別] = CSelf10

 →omake.savをロードしたあとに自動設定読み込みなどで
  このV1[0]の値を見てCDB初期化部分をスキップ処理するなど


過去の現象で、一度ロード(読み込み)して失敗した場合などに
処理を高速化するためか次のロードでも既に読み込んだことになって失敗するケースはあった気がします。
(新しいウディタVerでは基本的に起きないとは思う)

あとは細かいことですが
変数のネーミングなどにも気を使うと自力読解しやすくなるかもしれません。
(人によりけりですが、文系っぽく読みやすくなる)


参考URL(ウディタの説明書)
■デバッグコマンド一覧
hhttps://silversecond.com/WolfRPGEditor/Help/01debug.html


以上になります。