ページ 1 / 1
【解決済み】イベントの作動条件を防具や装備タイプで判断する方法
Posted: 2021年2月08日(月) 17:23
by Arkroyal
いつもお世話になっております。毎回おかしい質問で色んな方々を困惑させてしまうものです。
今回はイベントと接触した時、現在装備している防具や装備のタイプによって反応を分岐する方法について質問をさせていただきます。
現在こちらが作っているゲームには属性があり、その属性に関連した装備があります。
ダンジョン内にはプレイヤーに色んな利点を提供するイベントがありますが、そのイベントの属性と一致する装備を装着していないとその利点を利用することができない、みたいな感じです。
もちろんこれは分岐を何度も使って判定することで実現できますが、私が知りたい部分はコピペではなく、スクリプトを利用して綺麗にその装備状態を判断させることです。
現在詰まっている部分は以下となります。
1.防具タイプや装備タイプのIDを取得する方法
$gameActors.actor(1)._equips[3]._itemIdでその装備のアイテムIDを取得することはできましたが、
防具タイプの数値を取得しようとする$gameActors.actor(1)._equips[3]._atypeIdはなぜかundefinedが出ます。
これは装備タイプであるetypeIdの場合も同じく、undefinedが出ました。
上のイメージのように設定しておりますけど、atypeId=2やetypeId=6ではなくundefinedが出る理由がわかりません。私が何かを間違ったんでしょうか?
2.イベントでのスクリプトによる分岐の作成
分岐のコピペによる多段の判断の代わり、スクリプトを使って一つの分岐で装備状態を判断することはできるでしょうか?
―――
イベント: 炎の精霊
発動条件: 炎関連の宝石を装備していること
炎属性の宝石の防具(もしくは装備)ID: 7
宝石の装備スロット: 3から6まで
ーーー
このような場合、
装備スロット3に装着している装備の防具IDか装備IDを獲得
↓
その数値が7か否かを判断
↓
一致したらイベント発動、一致しなかったら装備スロット4のIDを習得
↓
…
この流れの判断をさせたいと思っています。
皆様のアドバイスを待たせていただきます。よろしくお願いいたします。
Re: イベントの作動条件を防具や装備タイプで判断する方法
Posted: 2021年2月08日(月) 18:35
by WTR
1. について
× _atypeId
〇 atypeId
アンダースコア "_" が余計についているだけですね。
2. について
装備スロットは標準では5個しかないと思いますが拡張されているんですかね。
いくつあるのかわからないのでとりあえず全スロット検索する方向で考えてみて
アクター1の装備のうち、装備タイプA もしくは 防具タイプB の装備が1つでもあるか、は↓で判定可能と思います。
コード: 全て選択
$gameActors.actor(1).equips().filter(e => e).some(slot => (slot.etypeId === A) || (slot.atypeId === B))
これで要件満たすでしょうか?
Re: イベントの作動条件を防具や装備タイプで判断する方法
Posted: 2021年2月08日(月) 20:15
by Arkroyal
WTR さんが書きました:1. について
× _atypeId
〇 atypeId
アンダースコア "_" が余計についているだけですね。
2. について
装備スロットは標準では5個しかないと思いますが拡張されているんですかね。
いくつあるのかわからないのでとりあえず全スロット検索する方向で考えてみて
アクター1の装備のうち、装備タイプA もしくは 防具タイプB の装備が1つでもあるか、は↓で判定可能と思います。
コード: 全て選択
$gameActors.actor(1).equips().filter(e => e).some(slot => (slot.etypeId === A) || (slot.atypeId === B))
これで要件満たすでしょうか?
ご返答ありがとうございます!試してみた結果をお伝えいたします。
1.$gameActors.actor(1)._equips[3].atypeIdを試してもundefinedが出るのは同じでした。
プラグインのせいかなと思い新しいプロジェクトにて試してましたが、同じくundefinedが出ました。

- q2.png (87.43 KiB) 閲覧された回数 2364 回
参考になれるかはわかりませんが現在のアクター1番の装備スロット状態です。
2.filter(e=>e)の部分に検索したい装備スロットの数値を入れればいいのでしょうか?
上の画像のご覧いただけると宝石の装備スロットは3番から始め、最大4スロットであることを考えると6番が最後になりますよね。これをもとにしてコードを入力してみると
コード: 全て選択
$gameActors.actor(1).equips().filter(3 => 6).some(slot => (slot.etypeId === 6) || (slot.atypeId === 2))
こうなりますが、これであっているのでしょうか?
Re: イベントの作動条件を防具や装備タイプで判断する方法
Posted: 2021年2月08日(月) 20:29
by WTR
うーむ、片手落ちでしたね
_equips[3] ではなく equips()[3] で取得してください。
filter(e => e) は数字に置き換えではなく e のまま。(べつに e でなくて別の文字でもいいのですが…
配列のnullを弾いています。装備がないところが null で怒られてしまうので。
スロット3から6までが対象ではありますが
それ以外の場所に魔法石が装備されることはないと思うので全スロット検索してもいいのかなーと思った次第
Re: イベントの作動条件を防具や装備タイプで判断する方法
Posted: 2021年2月08日(月) 21:08
by Arkroyal
WTR さんが書きました:うーむ、片手落ちでしたね
_equips[3] ではなく equips()[3] で取得してください。
filter(e => e) は数字に置き換えではなく e のまま。(べつに e でなくて別の文字でもいいのですが…
配列のnullを弾いています。装備がないところが null で怒られてしまうので。
スロット3から6までが対象ではありますが
それ以外の場所に魔法石が装備されることはないと思うので全スロット検索してもいいのかなーと思った次第
本当にありがとうございます…!WTR様のおかげですべて解決しました!
もしよろしければもう一つ質問をしてもいいでしょうか?
equipsは関数でもないし、IDナンバーは[]の中に入るのに、どうして()を書く必要があるのでしょうか?
()、_などを書く時と書いてはいけない時の判断がうまくできません…。レファランスを参考にしていろいろ試す時もこれで何度も苦労をしましたけど、何か規則があるのでしょうか?
Re: イベントの作動条件を防具や装備タイプで判断する方法
Posted: 2021年2月08日(月) 22:13
by WTR
equips() は関数なのです。
rpg_objects.js の 3598行目 あたりに書かれています。
Game_Actor.prototype.equips = function() { うんたら…ってやつです。
関数だから () をつけて呼びます。
_equps という配列があるのと、equips() という _equips とは別の配列を返す関数がある。
ちょっとややこしいですね。
_equips は Game_Item というオブジェクトの配列で、中身はそれほど詳しい情報を持っていません。
アクターが何を装備しているかはセーブデータに記録されるのでセーブデータ肥大化を防ぐとかそういう理由で
余計な情報を持たせていないのかなーと個人的には感じました。
データベースに設定した細かい装備性能はセーブデータに含める必要がないので、必要になったら参照するための関数 equips() が用意してある、みたいな。他にも理由があるかもしれませんが。
F8 でコンソールを出して $gameActors.actor(1)._equips と入れてみると
Game_Item がぞろぞろと出てきますが、展開してみると _dataClass, _itemId しかいない
$gameActors.actor(1).equips() だと違う配列が出てきて
atypeId とかetypeId とかも出てきますね。
規則というと…
() を付けるのは関数を呼ぶとき、という理解でいいと思いますし
_ が付くかどうかは一応推奨ルール的なのはあるようなんですが
結局のところ書いた人がどういう名前にしたか(_をつけたか)でしかなく文法的にはどちらでも構わないので
どう言ったらいいのか…コンソールに打ち込んでみて undefined とか云われなかったら正解、みたいな確認が早いのかなーと思います。
Re: イベントの作動条件を防具や装備タイプで判断する方法
Posted: 2021年2月09日(火) 00:20
by Arkroyal
WTR さんが書きました:equips() は関数なのです。
rpg_objects.js の 3598行目 あたりに書かれています。
Game_Actor.prototype.equips = function() { うんたら…ってやつです。
関数だから () をつけて呼びます。
_equps という配列があるのと、equips() という _equips とは別の配列を返す関数がある。
ちょっとややこしいですね。
_equips は Game_Item というオブジェクトの配列で、中身はそれほど詳しい情報を持っていません。
アクターが何を装備しているかはセーブデータに記録されるのでセーブデータ肥大化を防ぐとかそういう理由で
余計な情報を持たせていないのかなーと個人的には感じました。
データベースに設定した細かい装備性能はセーブデータに含める必要がないので、必要になったら参照するための関数 equips() が用意してある、みたいな。他にも理由があるかもしれませんが。
F8 でコンソールを出して $gameActors.actor(1)._equips と入れてみると
Game_Item がぞろぞろと出てきますが、展開してみると _dataClass, _itemId しかいない
$gameActors.actor(1).equips() だと違う配列が出てきて
atypeId とかetypeId とかも出てきますね。
規則というと…
() を付けるのは関数を呼ぶとき、という理解でいいと思いますし
_ が付くかどうかは一応推奨ルール的なのはあるようなんですが
結局のところ書いた人がどういう名前にしたか(_をつけたか)でしかなく文法的にはどちらでも構わないので
どう言ったらいいのか…コンソールに打ち込んでみて undefined とか云われなかったら正解、みたいな確認が早いのかなーと思います。
教えていただき、誠にありがとうございます…!
まだ完璧に理解してはいないですが、WTR様のおかげでスクリプトの理解が少しは深くなったと思います。
教えていただいた知識をもとにもっと勉強していきます!