【解決済み】スクリプトで…

アバター
草津たぬきち
記事: 36
登録日時: 2015年12月05日(土) 14:08

【解決済み】スクリプトで…

投稿記事by 草津たぬきち » 2017年9月21日(木) 01:40

こんばんは。ご教授願います。

1.変数1番に格納されているIDの装備を強制的に捨てさせるにはどうすればよいですか?

2.条件分岐に「パーティーメンバーの1番のアクターがステート1になっている」を指定するにはどのように表記すればよいですか?

自分の考えている通りのプラグインはないようなので
なんとかイベントとスクリプトで再現しようとしています。
どちらもスクリプトでなら出来ると思うのですがどのように表記すればよいでしょうか。
最後に編集したユーザー 草津たぬきち on 2017年10月05日(木) 21:34 [ 編集 1 回目 ]

アバター
しぐれん
記事: 972
登録日時: 2017年3月28日(火) 22:22
連絡を取る:

Re: スクリプトで…

投稿記事by しぐれん » 2017年9月21日(木) 02:26

草津たぬきち さんが書きました:1.変数1番に格納されているIDの装備を強制的に捨てさせるにはどうすればよいですか?


アイテムを捨てさせる処理は$gameParty.loseItem(アイテムの定義,個数)です。
変数1番の数値を確認するには$gameVariables.value(1)で行います。
アイテムの定義ですが、今回は装備品ですので武器または防具のどちらかによって異なります。
武器なら$dataWeapons[武器のID]、防具なら$dataArmors[防具のID]です。
いずれの場合もアクターが装備している装備品はチェックしません。
最終的には
$gameParty.loseItem($dataWeapons[$gameVariables.value(1)],1)で処理します。
(武器の場合)
草津たぬきち さんが書きました:2.条件分岐に「パーティーメンバーの1番のアクターがステート1になっている」を指定するにはどのように表記すればよいですか?

まずアクターの取得ですが、以下の方法を参考にしてください。
https://qiita.com/Sigureya/items/96a3a9b2b2be02c2f936
注意点として、$gameParty.members()で帰ってくるのは配列であるため先頭のアクターは0番ということです。
アクターが特定のステートになっているかどうかはアクターのisStateAffected(ステートID)で行います。
$gameParty.members()[0].isStateAffected(1)で目的の内容は作れると思います。

なお、上記のコードは実際には動かしていないので誤字などで動かない可能性もありますのでご注意を。
現在、プラグイン依頼はお休み中です。
アバター
草津たぬきち
記事: 36
登録日時: 2015年12月05日(土) 14:08

Re: スクリプトで…

投稿記事by 草津たぬきち » 2017年9月22日(金) 01:17

しぐれん様

丁寧な説明ありがとうございます。
1、2、共に思い通りの結果を得ることが出来ました。

ただし、その後のイベントの処理でエラーが出てしまいました。
今回の質問の部分には直接関係ないようなのですが、1番に格納されている装備のIDを
装備名に変換してメッセージに表示させるため
スクリプト「YEP_MessageCore.js」の装備IDの名前を表示させる制御文字で
「\na[\V[1]]」のように使いたかったのですが、「Cannot read property 'name' of null」と出てしまいました。
そこで「YEP_MessageCore.js」を使いたい理由は「\na[]」の制御文字だけだったため一旦offにし
別の方法を探すことにしました。

とりあえず、変数7番に変数1番のIDの装備名を代入して「\V[7]」で表示させようと思い
「$gameVariables.setValue(7,$dataArmors[$gameVariables.value(1)].name)」
のようなスクリプトを作ってみたのですが、同じく「Cannot read property 'name' of null」が出てしまいます。
根本的に何か違うのでしょうか。

一応イベントは
条件分岐:パーティーメンバーの0番のアクターがステート「錆び」になっていた場合
乱数で装備箇所を選び、装備IDを変数1番に代入、
「(装備名)が壊れた」などのメッセージを表示し
その装備を強制解除し、そのまま捨てる
のようになっています。

単純に装備IDを取得するとき、装備名の文字列も変数7番に代入しておけばいい気もしますが
他に何かよい解決法はあるでしょうか。
アバター
しぐれん
記事: 972
登録日時: 2017年3月28日(火) 22:22
連絡を取る:

Re: スクリプトで…

投稿記事by しぐれん » 2017年9月22日(金) 01:40

「Cannot read property 'name' of null」ですので、ぬるぽが発生していると思います。
(nullのオブジェクトの中身を取得しようとした場合のエラー)

先に\v[1]を表示する処理を入れて、変数1の数値をチェックしてみてください。
現在、プラグイン依頼はお休み中です。
アバター
草津たぬきち
記事: 36
登録日時: 2015年12月05日(土) 14:08

Re: スクリプトで…

投稿記事by 草津たぬきち » 2017年9月23日(土) 01:06

ありがとうございます。

$gameVariables.value(1)で変数を取得したのち、メッセージで\V[1]\^を表示する処理の前に入れると
「Cannot read property 'name' of null」はでなくなりました。
ぬるぽがなんなのかわかりませんでしたが「こっちを読み込む前にそっちを先に読んじゃダメ」的な意味でしょうか。

とりあえず先には進めましたが、また次の問題が…。

条件分岐:パーティーメンバーの0番のアクターがステート「錆び」になっていた場合
乱数で装備箇所を選び、装備IDを変数1番に代入しそれを一旦確認。
「(装備名)が壊れた」などのメッセージを表示し
その装備を強制解除し、そのまま捨てて、「錆び」を解除

上記処理を乱数の装備可処分コピーし、更に人数分コピーするわけですが
指定した装備箇所に何も装備していない場合にいきなり「Cannot read property 'name' of null」が出てしまいます。
…またこいつです。
これは変数に何も代入されてないのに$gameVariables.value(1)をしているからでしょうか。
そうだとすると$gameVariables.value(1)のまえに
条件分岐で「何も装備されていない場合」を条件に次の装備箇所にラベルジャンプすればいけそうな気がします。

$gameParty.members()[0].hasArmor($gameActors._equips[2-1]._Armor))
試してないですけどこんがらがってきて良くわからなくなってきてます...。
アバター
しぐれん
記事: 972
登録日時: 2017年3月28日(火) 22:22
連絡を取る:

Re: スクリプトで…

投稿記事by しぐれん » 2017年9月23日(土) 02:31

ぬるぽというのは、null参照エラーのことですが、詳しくはググってください。
「こっちを読み込む前にそっちを先に読んじゃダメ」でおそらくあっています。

そのnullは装備品を装備していない部位があるアクターで発生していませんか?
装備を何もつけていないアクターを「錆び」状態にすると、必ずnullエラーが発生すると思います。
loseItem()を呼び出す前にその装備品が存在するかを確認しましょう。

それと、人数分処理をコピーして作るとありますが、どこかで書き間違えによるバグが起こる気がするので少し不安です。
とりあえず、nullエラーは以下のような内容にすれば回避できるはずです。

コード: 全て選択

const equip =$dataArmors[$gameVariables.value(1);
if(equip){
  $gameVariables.setValue(7,equip].name)
}

これが何をやっているかというと、まずequipという変数に一度装備品を捕まえて、
存在するかどうかをチェックして存在する場合のみ処理するような内容です。
また、エラーはおそらく.nameで名前を取り出している時に起きていると思います。
現在、プラグイン依頼はお休み中です。
アバター
まっつUP
記事: 1155
登録日時: 2016年8月11日(木) 15:38
お住まい: タケノコ王国

Re: スクリプトで…

投稿記事by まっつUP » 2017年9月23日(土) 11:06

草津たぬきち様
お世話になります。
この記述をイベントコマンド「スクリプト」に入れて実行した場合は
先頭のアクターがID4のステートにかかっている場合
防具がどれかなくなって変数7にアイテムのIDが入ることを確認できますでしょうか。
(武器もなくしたい場合は若干記述を変える必要があります。)

コード: 全て選択

var actor = $gameParty.members()[0];
if(actor.isStateAffected(4)){
    var equip = actor.armors();
    var sabislot = Math.randomInt(equip.length);
    var item = equip[sabislot];
    actor.discardEquip(item);
    $gameVariables.setValue(7,item.id);
}
RPGで笑顔を・・・

ツイッター(ツクラーの巣窟)(閲覧は自己責任でお願いします)
https://twitter.com/mattuup

github
https://github.com/mattuup/RPGMakerMZ
アバター
草津たぬきち
記事: 36
登録日時: 2015年12月05日(土) 14:08

Re: スクリプトで…

投稿記事by 草津たぬきち » 2017年9月24日(日) 00:33

しぐれん様
ありがとうございます。

早速試してみたところ、エラー「undefined token ;」と出ました。
これは「なんか変なとこに;がありまっせ?」ということかと思い、直後の「;」を
消してみたんですが別の「undefined token if」がでたりなんかして。
つっこんだ場所が悪いのかと色々試してはみたのですが…。




まっつUP様
ありがとうございます。

スクリプトを実行してみたところ変数7番に装備のIDが格納されていることが確認できました。
私はそのIDを名前でメッセージとして表示したかったため、変数7を1に変更し、下に
$gameVariables.setValue(7,$dataArmors[$gameVariables.value(1)].name)と
メッセージで「\V[7]」を記入したところ、問題なく装備名が表示されました。
しかし、何も装備していない場合「Cannt read property 'id' undefined」とエラーが出てしまいました。
アバター
しぐれん
記事: 972
登録日時: 2017年3月28日(火) 22:22
連絡を取る:

Re: スクリプトで…

投稿記事by しぐれん » 2017年9月24日(日) 00:44

コード: 全て選択

const equip =$dataArmors[$gameVariables.value(1)];
if(equip){
  $gameVariables.setValue(7,equip].name)
}



こうでした。
閉じかっこを忘れていました。
現在、プラグイン依頼はお休み中です。
アバター
まっつUP
記事: 1155
登録日時: 2016年8月11日(木) 15:38
お住まい: タケノコ王国

Re: スクリプトで…

投稿記事by まっつUP » 2017年9月24日(日) 00:57

草津たぬきち様
エラーを再現できませんでした。
$gameVariables.setValue(7,item.id);を
$gameVariables.setValue(1,item.id);
$gameVariables.setValue(7,$dataArmors[$gameVariables.value(1)].name);に
変えて実行したということですか。
あと、まだうまく行っていない場合は新規プロジェクトで
テストを行っているかどうかを教えて下さい。

追記:先のスクリプトはアクターが特定のステートにかかっている時
装備している防具の内いずれかを無くすという仕様を想定しています。
RPGで笑顔を・・・

ツイッター(ツクラーの巣窟)(閲覧は自己責任でお願いします)
https://twitter.com/mattuup

github
https://github.com/mattuup/RPGMakerMZ

“MV:質問” へ戻る