≪解決!≫納品依頼イベントによるスプリクトエラー

デビルバスター
記事: 43
登録日時: 2019年3月16日(土) 08:05

≪解決!≫納品依頼イベントによるスプリクトエラー

投稿記事by デビルバスター » 2023年1月08日(日) 21:11

どうもデビルバスターです。
依頼で指定のアイテムの数を納品する独自のイベントがありまして、扱いやすいようにスプリクトコードを使って、実際にやってみました。
しかし以下のエラーが発生してしまいました。
スプリクトコード↓

コード: 全て選択

$game_party.lose_item\
($data_items[$game_variables[89]]\
, $game_variables[91])

コモン変数89=アイテムID
コモン変数91=指定された納品ノルマの数

納品時にアイテムの必要ノルマ数分を減らすスプリクトコードに問題が発生しており、どこを区切ればいいか、手詰まりの状態です。
何所が間違っているのでしょうか?スプリクトに詳しい方に教えていただけないでしょうか?
添付ファイル
進捗.png
最後に編集したユーザー デビルバスター on 2023年1月09日(月) 21:57 [ 編集 2 回目 ]

フリーゲーム『World Odyssey』プロジェクト製作中
Twitter→https://twitter.com/dehilbastar
DEDEN
記事: 53
登録日時: 2018年8月25日(土) 15:06

Re: 納品依頼イベントによるスプリクトエラー

投稿記事by DEDEN » 2023年1月08日(日) 22:50

デビルバスター様 こんばんは
こちらでコードをコピペして実行してみたところ普通に動きました
エラーコードでは($data_items[$game_variables[89]])の部分のカッコが閉じられてないよと書いてあるので
もう一度よく確認してみて下さい
それでも解決しなければ宜しければこのようにエディタのスクリーンショットを載せてみて下さい
添付ファイル
スクリーンショット (2425).png
スクリーンショット (2425).png (5.85 KiB) 閲覧数: 468 回
デビルバスター
記事: 43
登録日時: 2019年3月16日(土) 08:05

Re: 納品依頼イベントによるスプリクトエラー

投稿記事by デビルバスター » 2023年1月09日(月) 17:22

大変申し訳ございません・・・!!
このコードは正しく起動できており、問題なのはアイテムの減少処理でした。

コード: 全て選択

$game_party.lose_item\
($data_items[$game_variables[89]]\
, $game_variables[91])

アイテムIDと必要数を変数にして、そのアイテムIDを所持している変数分減らす処理ですが、
そちらがエラーになっている状態です。
フリーゲーム『World Odyssey』プロジェクト製作中
Twitter→https://twitter.com/dehilbastar
DEDEN
記事: 53
登録日時: 2018年8月25日(土) 15:06

Re: 【修正】納品依頼イベントによるスプリクトエラー

投稿記事by DEDEN » 2023年1月09日(月) 21:13

コードが途中で改行しちゃって崩れてるのが原因ですね
イベントコマンドのスクリプトはevalというテキストをスクリプトに変換するメソッドを通しているからか融通が利かない所があるので注意が必要です

コード: 全て選択

item_data = $data_items[$game_variables[89]]
size = $game_variables[91]
$game_party.lose_item(item_data,size)

一行にコードが収まらないときはこのように一旦ローカル変数に代入すると良いですよ
デビルバスター
記事: 43
登録日時: 2019年3月16日(土) 08:05

Re: 【修正】納品依頼イベントによるスプリクトエラー

投稿記事by デビルバスター » 2023年1月09日(月) 21:57

動作確認してみたところ。無事・・・解決に至りました!!
スプリクトコードを入力する際、文字数が多すぎて、折り返し行替えが起きるため、他の方から「\」による方法で行えば、その後のコードも読み込まれるとの話を聞きましたが、これにも限界があるのですね・・・。

また一つ、スプリクトの知識を学ぶことが出来ました!
有難うございました!
フリーゲーム『World Odyssey』プロジェクト製作中
Twitter→https://twitter.com/dehilbastar
白夜||極夜
記事: 2
登録日時: 2022年11月06日(日) 19:29

Re: ≪解決!≫納品依頼イベントによるスプリクトエラー

投稿記事by 白夜||極夜 » 2023年1月28日(土) 18:52

解決済みではありますが情報共有のために別のやり方を提示しておきます。
VXAceで使われているRGSS3はRuby1.9.2をベースにしているためRubyの仕様に従って改行のルールが決まっています。
コードを改行する際に \(バックスラッシュ、または半角¥マーク)を末尾に追加するとコードの途中でも改行可能ですが、それ以外にも演算子などの直後に改行する事でも複数行コードを実行できます。
例えば上記のコードであれば以下のように分解できます。
これらの位置であれば改行してあっても問題なく動きます。

コード: 全て選択

$game_party.
lose_item(
$data_items[
$game_variables[
89]],
$game_variables[
91])


またイベント内のスクリプトが実行されるコードのスコープはGame_Interpreterになります。
なので行数が非常に多くなるような複雑なコードを書く場合、Game_Interpreterに新しいメソッドを追加し、そのメソッドを呼び出すようにすることで、更に自由なコード記述が可能になります。

スクリプトエディタの記述

コード: 全て選択

class Game_Interpreter
  def test_code
    $game_party.lose_item($data_items[$game_variables[89]], $game_variables[91])
  end
end

イベントスクリプトの記述

コード: 全て選択

test_code


スクリプトが書けるのであれば後者の方が汎用性は高いです。何度も同じ処理を呼び出すようなスクリプトを書くならコモンイベントよりも便利です。


ちなみにイベントスクリプトや上記のGame_Interpreterにメソッド追加する方法だとコードのデバッグができません。(イベントスクリプトでエラーが出るとcommand_355 の eval(script) のエラーとして扱われてスクリプト内のエラー箇所がわからない)
ですがcommand_355 を少し書き換えることでコードのデバッグが可能になります。

コード: 全て選択

class Game_Interpreter
  alias _fix_command_355  :command_355
  def command_355
    return test if @list[@index].parameters[0] == 'test'
    _fix_command_355
  end
  def test
  end
end

スクリプトエディタで上記のように記述し、イベント内からは「test」のスクリプトを呼び出すようにします。
そして実際のコードはtest内に書けば、エラーが出た場合にtestメソッド内でエラーするのでエラー箇所の特定も容易です。

補足
・最後のコードでaliasの第二引数だけシンボル化しているのは、その方がスクリプトエディタで見やすいからです。(オススメ)
・一番最初の投稿でエラーが出ている理由は、最後の部分の区切りミスです。

コード: 全て選択

, $game_variables[91]) #コレが正しい

, $game_\ #エラーが出たコード(変数名を\で区切ったため正常に認識できない)
variables[91])

\で区切る場合は、あくまでも文節の区切りに使えるだけで変数名やメソッド名は区切れません。
プログラマ暦: FBasic、N88Basic、Delphi3-5、parl、php、Java6-8、Ruby
PCツクール暦: Dante98、Dante98II、だんだんダンジョン、VXAce
コンシューマエディタ暦: 絵描衛門、SuperDante、ツクールアドバンス
2022現在、VXAceで開発中。Ruby(RGSS3)面白い。
phpBB運営経験あり。
名前の || はor演算子です。名前を呼ぶ時は白夜と極夜のどちらでも良いという意味です。

“VX / Ace:質問” へ戻る