自作料理効果が消えるバグ対応

ページ名:自作料理効果が消えるバグ対応

自作料理の上昇分が消えるバグの対応方法

正確には、
『アイテムをCtrl移動したり分割した場合に、自作アイテムフラグがリセットされる不具合の修正方法』
となる。
ふと気になって調べてみたから、需要とか気にせず共有しておく。

※注意※
この文章は、2023/03/04(ゲームバージョン0.29.4)時点でのものです。
将来的にずっと同じ方法が使える保証はありません。
というか、バージョンアップで修正されるべき。

※重要な注意※
ゲームやセーブデータに不具合が発生したりしても執筆者は一切関知しません。
自分でバックアップして自分でなんとかしてください。

 

0、準備

UndertaleModToolのインストールや設定を行おう。

ゲームデータとかセーブデータはバックアップしておこう。

codeを書き出しておこう。

このページで扱うコード

gml_GlobalScript_scr_move_item_quickly.gml
アイテムのクイック移動処理(Ctrl+クリックとか、ショップ関係とか)

gml_Script_scr_sposta_item.gml
アイテムが移動した場合の処理(アイテム分割もここにある)

spostaはイタリア語で『動く』という意味の単語。
このゲームの制作者がイタリアの方だからだと思うが、
ファイル名とか変数名にちょいちょいイタリア語が使われてて、
同じような意味の言葉も、英語とイタリア語が混在で時々戸惑う。
たとえば、上記の move_item と sposta_item とか。

1、何をしたいか

このゲームでは、基本的に、
『アイテムID 個数 場所のX,Y座標』
でアイテムを管理している。

アイテムの基本情報に含まれないものは、追加のパラメータで設定されていて、
自分がクラフトしたアイテムだと、
created_from_player
というパラメータが1に設定される。
これは、料理だけじゃなく、弾薬等の自作アイテムでも設定されるが、
現状、created_from_playerを参照しているのは、
Chefスキルによる食料アイテムの効果上昇だけとなっている。

ちなみに、created_from_playerが設定されるかどうか、にスキルは関係ないので、
Chefスキル取得前に作った料理でもChefの恩恵を受けることができる。
(シェフとはいったい……)

Ctrl移動とか、アイテム分割では、
created_from_player の値を正しく受け渡せてないので消える。

これを、正しく受け渡してやるようにするのが目標となる。

2、何もしてないのに壊れました!

自環境では発生するトラブルだが、もしかしたら環境依存かもしれない。
作業者の環境で発生しないなら、この項目は飛ばしてかまわない。

さて、まずはCtrlクリック移動できないのはとても不便なので、それを修正したい。

が、その前に確認しておきたいことがある。

gml_GlobalScript_scr_move_item_quickly.gml

を開いた直後の、110~114行目と、175~179行目あたり。

ここで、特に意味もなく、改行とかを追加して、
エディタ領域からフォーカスを外す。(エディタ領域外の適当な場所をクリックする)
すると、UndertaleModToolの自動整形処理が動いて、

なんか全然違う処理が突然わいてきてびっくりする。

この状態から、もう一度、自動整形処理を動かすと、
「配列のインデックスを負の数にしてはいけません」というエラーになる。

この状態でゲームを始めることもできるが、
トレーダーの販売品をクリックするとエラーになってゲームが落ちる。

何らかの影響(コードのバージョン違いとか、動作するけど問題があるデータ定義とか?)
でこんなことになっちゃうのだろうと思うのだが……

UndertaleModTool側で、リファクタリングの挙動を調整とかできるかもしれないんだけど、
ちょっと調べた感じではよくわからなかった。

元の処理を何度書き戻しても同様の修正が発生してしまうので、

trader_nearest.loot_qnt[i] += item_id_clicked.qnt
 ↓
trader_nearest.loot_qnt[i] = (trader_nearest.loot_qnt[i] + item_id_clicked.qnt)

trader_nearest.loot_qnt[i] -= _qnt_da_aggiungere
 ↓
trader_nearest.loot_qnt[i] = (trader_nearest.loot_qnt[i] - _qnt_da_aggiungere)

のように書き換えておこう。

根本原因がわからないので場当たり的な対応でしかないが、
 += や -= を使わない処理に書き換わっているので、
なんかそのへんで引っかかることがあるのかもしれない、と、
 += や -= を使わないような形式にしたら通ったので、それでいいということにしておいた。

さて、これで、ようやくコードを修正できるようになった。
本題に戻ろう……

3、Ctrlクリック移動に対応

さて本題。

gml_GlobalScript_scr_move_item_quickly.gml

を開く。

261行目あたりに、移動したときに、アイテムの耐久度を移行する処理。
があるので、これを真似て、

temp_item.created_from_player = item_id_clicked.created_from_player

という行を追加する。

あとは保存すればOK。

4、アイテム分割に対応

Ctrl移動に比べると重要じゃないようにも思うけど、
代替手段がない、という点ではやっぱり不便だ。

gml_Script_scr_sposta_item.gml

を開く。

戯れにコード解説

62 分割可能(この上の方で判定済み)で、
64 Ctrlが押されていて、
66 ドラッグしている元アイテムが1個以上だったら。

68 新規アイテムの情報を作る

69 新規個数=元アイテムの個数を2で割ったもの
70 残り個数=元アイテムの個数から新規個数を引いたもの

71 新規アイテムのIDは元アイテムと同じ
72 新規アイテムの個数は新規個数(元の個数を2で割ったもの)

73 新規アイテムのx座標はドロップ先のx座標
74 新規アイテムのy座標はドロップ先のy座標
75 新規アイテムのスプライトIDは元アイテムと同じ
76 新規アイテムの回転状況は元アイテムと同じ

77 元アイテムの個数は残り個数(元アイテムの個数から新規個数を引いたもの)
78 元アイテムのx座標はドラッグ開始したときのx座標
79 元アイテムのy座標はドラッグ開始したときのy座標

元アイテムのcreated_from_playerを移行したいので、

temp_item.created_from_player = item_id_dragged.created_from_player

を追加してやる

あとは、保存するだけである。

5、そのほか

データ構造的に考えて、
アイテムをスタックさせた場合、created_from_playerは必ずどちらかに上書きになる。

現状で、created_from_playerが意味を持つのは食料アイテムだけであり、
食料アイテムはスタック可能数が基本的に1なので問題はないのだが、

データ修正等で食料のスタック数を増やした場合や、
食料以外でcreated_from_playerによる処理を追加したい場合など、
今のままの処理では対応しきれない。

created_from_playerが異なっていたらアイテムがスタックされない。
のような処理が必要になると思うが、銃弾とかがスタックできないとめんどくさいし、
なかなか色々と大変そうだな、とか思う。(他人事)

 


このページの総アクセス数: 4271

今日: 9

昨日: 11

シェアボタン: このページをSNSに投稿するのに便利です。

コメント

返信元返信をやめる

※ 悪質なユーザーの書き込みは制限します。

最新を表示する
名無し

ふと気になって発生原因を調べて、ついでに解決方法も調べたんだけど、
自分はChefスキル使ってないからわりとどうでもいい。
でもまあ、せっかく調べたんだから公開しておこうと思ったり。

返信
2023-03-04 22:59:35

NG表示方式

NGID一覧