『装備なし』状態を禁止したい

せくもん
記事: 72
登録日時: 2018年6月09日(土) 21:48

『装備なし』状態を禁止したい

投稿記事by せくもん » 2018年6月19日(火) 19:30

VX aceにて、アクターが装備スロット1~4(デフォルトでは盾、頭、身体、装飾品)の装備品を身に付けていない状態で
装備画面を終了しようとすると『装備をしていない部位があります!』等のエラーメッセージが出て
装備画面を終了出来ないシステムを作ろうとして行き詰ってしまいました。

スクリプトの『Scene_Equip』40行目を
@command_window.set_handler(:cancel, method(:on_scene_cancel))
に書き換えメソッド『on_scene_cancel』を新たに作成。

def on_scene_cancel
if

else
SceneManager.call(Scene_Menu)
end
end

ここまでは何とか思いついたのですが『if』部分の条件式の書き方が分かりません。
試しに『$game_actors[1].equips[1].id == nil』等を入れてみたのですがアクター1番が盾を装備していないと
『ノーメソッドエラー』が出てゲームが終了してしまったり、 『SceneManager.call(Scene_equip)』等を書き加えても
画面が止まって装備画面に戻れなくなってしまいます。

初歩的な質問で恐縮ですが、どなたかお知恵をお借りできませんでしょうか?

奏ねこま
記事: 702
登録日時: 2016年1月20日(水) 20:04

Re: 『装備なし』状態を禁止したい

投稿記事by 奏ねこま » 2018年6月19日(火) 22:14

ご要望の内容とは異なりますが、1つの案として。

コード: 全て選択

class Window_EquipCommand
  def col_max
    return 2
  end

  def make_command_list
    add_command(Vocab::equip2,   :equip)
    add_command(Vocab::optimize, :optimize)
  end
end

class Window_EquipItem
  def current_item_enabled?
    index == item_max - 1 ? false : enable?(@data[index])
  end
end

このスクリプトを導入すると、「全てをはずす」コマンドが消え、
装備品選択では空欄が選べなくなります。
TOMO
記事: 343
登録日時: 2015年11月16日(月) 20:12
連絡を取る:

Re: 『装備なし』状態を禁止したい

投稿記事by TOMO » 2018年6月19日(火) 22:49

コード: 全て選択

if $game_party.members.all?{|member|member.equips.all?{|item|item != nil}}
return_scene
else
エラーメッセージの処理
@command_window.activate
end
で可能だと思います
せくもん
記事: 72
登録日時: 2018年6月09日(土) 21:48

Re: 『装備なし』状態を禁止したい

投稿記事by せくもん » 2018年6月19日(火) 23:38

お二方とも、ご返答ありがとうございます。
TOMOさんの用意して下さったコードで大分理想に近い形にはなったのですが
条件式の

$game_party.members.all?{|member|member.equips.all?{|item|item != nil}}

から、装備スロット0番(デフォルトの武器)のみを除外する場合はどう記述したらよろしいでしょうか?

重ね重ねの質問で、申し訳ありません。
TOMO
記事: 343
登録日時: 2015年11月16日(月) 20:12
連絡を取る:

Re: 『装備なし』状態を禁止したい

投稿記事by TOMO » 2018年6月20日(水) 02:02

equipsをarmorsに変更すれば可能です
せくもん
記事: 72
登録日時: 2018年6月09日(土) 21:48

Re: 『装備なし』状態を禁止したい

投稿記事by せくもん » 2018年6月20日(水) 22:18

ご返答ありがとうございます。
equipsをarmorsやweaponsに変更して試したところ、equipsでは
エラーメッセージの処理→@command_window.activateとelseの処理をしていたものが
条件成立のifの処理を行い、普通にメニュー画面に戻る様になってしまいました。
RPG探検隊さんの『サイドビュースクリプト』を導入しているので
念の為、新規プロジェクトを作成し、『Scene_Equip』をコピーして試したみたのですが
同様の結果になるみたいです。
TOMO
記事: 343
登録日時: 2015年11月16日(月) 20:12
連絡を取る:

Re: 『装備なし』状態を禁止したい

投稿記事by TOMO » 2018年6月20日(水) 22:45

「SceneManager.call(Scene_Menu)」とかでなく、
「return_scene」もしくは「SceneManager.return」で直前の画面に戻ります
せくもん
記事: 72
登録日時: 2018年6月09日(土) 21:48

Re: 『装備なし』状態を禁止したい

投稿記事by せくもん » 2018年6月20日(水) 23:07

if $game_party.members.all?{|member|member.xxxxx.all?{|item|item != nil}}
Audio.se_play("Audio/SE/shop", 100, 100)
return_scene
else
Audio.se_play("Audio/SE/Buzzer1", 100, 100)
@command_window.activate
end

SEを入れて分かりやすくしてみたんですけど、
『xxxxx』の部分に『equips』を入れて装備品を外すとブザーが鳴って装備画面に戻れますが
『armors』を入れた場合、装備を外しても外した装備を全て所持品から消去しても
レジの音が鳴ってメニュー画面に移動してしまいます。
TOMO
記事: 343
登録日時: 2015年11月16日(月) 20:12
連絡を取る:

Re: 『装備なし』状態を禁止したい

投稿記事by TOMO » 2018年6月20日(水) 23:58

コード: 全て選択

    result = true
    $game_party.members.each do |member|
      member.equip_slots.each_with_index do |slot_id, index|
        if slot_id > 0 && member.equip_change_ok?(slot_id) && member.equips[index].nil?
          result = false
          break
        end
      end
    end
   
    if result
      Audio.se_play("Audio/SE/shop", 100, 100)
      return_scene
    else
      Audio.se_play("Audio/SE/Buzzer1", 100, 100)
      @command_window.activate
    end
これで大丈夫なはずです
せくもん
記事: 72
登録日時: 2018年6月09日(土) 21:48

Re: 『装備なし』状態を禁止したい

投稿記事by せくもん » 2018年6月21日(木) 21:31

何度もお手間をかけさせてしまいすいませんでした。
お陰さまで希望通りの挙動を再現することが出来ました。
どうもありがとうございます。

奏ねこまさんの案も今後の参考にさせて頂きます。

ちなみにゲームのreadmeやスタッフロール等に
『スクリプト協力: TOMO』の様に記述する事は支障ありませんでしょうか?

“VX / Ace:質問” へ戻る