スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

web拍手 by FC2   

[RGSS]スキルショップ

使い方は → こちら

[RGSS]スキルショップ
スキルを購入して習得できます。

スクリーンショット サムネイルクリックで拡大画像が見られます。
rgss_skshop.jpg

プログラムは続きにあります。

=begin
===============================================================================
  ☆★☆★☆★☆★ スキルショップ ★☆★☆★☆★☆
=============================================================================== 

 製作・開発:STERS

  Page::http://stersblog.blog15.fc2.com/

導入方法------------------------------------------------------------------

    このスクリプトを Scene_Debug より下 Main より上に
   新しく作ったセクションにコピペして入れてください。
    
--------------------------------------------------------------------------

これを導入することで
スキルショップ( スキルを買って修得する )
ができるようになります。

使い方--------------------------------------------------------------------
1.まずはこのスクリプトを導入してください。
    (必須ではありませんが文字列中央寄せがあるといいかもです。)

2.「アクターの制限」の部分を指定してください。
     指定されたアクターは、指定したスキルが購入できません。

3.買うためにアイテムをつくります。
    このときに「アイテム名」にそのアイテムを買うと
    覚えられるスキルの名前を書いといてください。
  ( スキルが見つからない場合、エラーが発生します。 )

4.呼び出したい部分で
    $skill_shop = true
    を記述しそのすぐあとに、2番目で作った買うアイテムを
  ショップの処理で買うようにすれば呼び出せます。

=end
module Skill_Shop
  # アクターの制限
  # [アクターID, スキル名, 取得可能レベル]の順で指定
  #
  # 絶対に修得が不可能な物を作る場合は「取得可能レベル」を
  # 設定可能な最高レベルより上にする
  #
  ACTOR = [[1, "ヒール", 5],
           [1, "ヒール+", 10],
           [1, "ヒールΩ", 20],
           ]
end
#==============================================================================
# ■ Window_ShopCommand
#------------------------------------------------------------------------------
#  ショップ画面で、用件を選択するウィンドウです。
#==============================================================================
class Window_ShopCommand < Window_Selectable
  alias skill_shop_org_init initialize unless $@
  def initialize(x=0,y=0,w=0,h=0)
    if $skill_shop == true
      super(x,y,w,h)
      return
    end
    skill_shop_org_init
  end
end
class Window_SkillShopCommand < Window_ShopCommand
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize
    super(0, 64, 480, 64)
    self.contents = Bitmap.new(width - 32, height - 32)
    @item_max = 2
    @column_max = 2
    @commands = ["スキルを覚える", "キャンセル"]
    refresh
    self.index = 0
  end
  #--------------------------------------------------------------------------
  # ● 項目の描画
  #     index : 項目番号
  #--------------------------------------------------------------------------
  def draw_item(index)
    x = 4 + index * 240   
    self.contents.draw_text(x, 0, 128, 32, @commands[index])
  end
end

#==============================================================================
# ■ Window_ShopStatus
#------------------------------------------------------------------------------
#  ショップ画面で、アイテムの所持数やアクターの装備を表示するウィンドウです。
#==============================================================================
class Window_SkillShopStatus < Window_ShopStatus
  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    if @item == nil
      return
    end
    self.contents.font.color = system_color
    self.contents.draw_text(4, 0, 200, 32, "このスキルは")
    for i in 0...$game_party.actors.size
      for index in 1...$data_skills.size
        skill = $data_skills[index]
        if @item.name == skill.name
          id = skill.id
          break
        end
      end
      actor = $game_party.actors[i]
      flag = false
      for index in Skill_Shop::ACTOR
        if index[0] == actor.id and index[2] >= actor.level and index[1] == skill.name
          flag = true
        end
      end
      self.contents.font.color = normal_color
      self.contents.draw_text(4, 64 + 64 * i, 120, 32, actor.name)
      if flag == true
        self.contents.font.color = disabled_color
        self.contents.draw_text(104, 94 + 64 * i, 200, 32, "修得不可")
        next
      end
      if $game_party.actors[i].skill_learn?(id)
        self.contents.font.color = disabled_color
        self.contents.draw_text(104, 94 + 64 * i, 200, 32, "修得済み")
      else
        self.contents.font.color = normal_color
        self.contents.draw_text(104, 94 + 64 * i, 200, 32, "未修得")
      end
    end
  end
end

#==============================================================================
# ■ Window_ShopBuy
#------------------------------------------------------------------------------
#  ショップ画面で、購入できる商品の一覧を表示するウィンドウです。
#==============================================================================
class Window_SkillShopBuy < Window_ShopBuy
  #--------------------------------------------------------------------------
  # ● 項目の描画
  #     index : 項目番号
  #--------------------------------------------------------------------------
  def draw_item(index)
    item = @data[index]
    price = item.price
    case item
    when RPG::Item
      number = $game_party.item_number(item.id)
    when RPG::Weapon
      number = $game_party.weapon_number(item.id)
    when RPG::Armor
      number = $game_party.armor_number(item.id)
    end
    if price <= $game_party.gold and number < 99
      self.contents.font.color = normal_color
      @disabled_flag = false
    else
      self.contents.font.color = disabled_color
      @disabled_flag = true
    end
    for i in 0...$game_party.actors.size
      for idex in 1...$data_skills.size
        skill = $data_skills[idex]
        if item.name == skill.name
          id = skill.id
          break
        end
      end
      if $game_party.actors[i].skill_learn?(id)
        self.contents.font.color = disabled_color
      else
        if @disabled_flag != true
          self.contents.font.color = normal_color
        end
      end
    end
    x = 4
    y = index * 32  
    rect = Rect.new(x, y, self.width - 32, 32)
    self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
    bitmap = RPG::Cache.icon(item.icon_name)
    opacity = self.contents.font.color == normal_color ? 255 : 128
    self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
    self.contents.draw_text(x + 28, y, 212, 32, item.name, 0)
    self.contents.draw_text(x + 240, y, 88, 32, price.to_s, 2)
  end
  #--------------------------------------------------------------------------
  # ● 売っているアイテムの取得
  #--------------------------------------------------------------------------
  def buy_item
    return @data[self.index]
  end
end

#==============================================================================
# ■ Scene_Shop
#------------------------------------------------------------------------------
#  ショップ画面の処理を行うクラスです。
#==============================================================================
class Scene_Shop
  alias skillshop_org_main main unless $@
  def main
    if $skill_shop == true
      $scene = Scene_SkillShop.new
      return
    end
    skillshop_org_main
  end
end
class Scene_SkillShop < Scene_Shop
  #--------------------------------------------------------------------------
  # ● メイン処理
  #--------------------------------------------------------------------------
  def main
    @help_window = Window_Help.new
    @command_window = Window_SkillShopCommand.new
    @gold_window = Window_Gold.new
    @gold_window.x = 480
    @gold_window.y = 64
    @dummy_window = Window_Base.new(0, 128, 640, 352)
    @buy_window = Window_SkillShopBuy.new($game_temp.shop_goods)
    @buy_window.active = false
    @buy_window.visible = false
    @buy_window.help_window = @help_window
    @status_window = Window_SkillShopStatus.new
    @status_window.visible = false
    s = []
    for i in 0...$game_party.actors.size
      s[i] = $game_party.actors[i].name
    end
    @actor_command = Window_Command.new(368, s)
    if defined?(@actor_command.mode_change)
      @actor_command.mode_change(true)
    end
    @actor_command.visible = false
    @actor_command.active = false
    @actor_command.opacity = 255
    @actor_command.x = 0
    @actor_command.y = 480 - @actor_command.height
    @actor_command.z = 9999
    skill_hantei
    Graphics.transition
    loop do
      Graphics.update
      Input.update
      update
      if $scene != self
        break
      end
    end
    $skill_shop = false
    Graphics.freeze
    @help_window.dispose
    @command_window.dispose
    @gold_window.dispose
    @dummy_window.dispose
    @buy_window.dispose
    @status_window.dispose
    @actor_command.dispose
  end
  #--------------------------------------------------------------------------
  # ○ スキル判定(アクターウィンドウ用)
  #--------------------------------------------------------------------------
  def skill_hantei
    hantei = []
    buy = @buy_window.buy_item
    id = 0
    for index in 1...$data_skills.size
      skill = $data_skills[index]
      if buy.name == skill.name
        id = skill.id
        break
      end
    end
    for ind in Skill_Shop::ACTOR
      for i in 0...$game_party.actors.size
        actor = $game_party.actors[i]
        if ind[0] == actor.id and ind[2] >= actor.level and ind[1] == skill.name
          hantei[i] = true
        end
      end
    end
    for i in 0...$game_party.actors.size
      if $game_party.actors[i].skill_learn?(id)
        hantei[i] = true
      end
    end
    loop = 0
    for aruka in hantei
      if aruka == true
        @actor_command.disable_item(loop)
      end
      loop += 1
    end
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  def update
    @help_window.update
    @command_window.update
    @gold_window.update
    @dummy_window.update
    @buy_window.update
    @status_window.update
    @actor_command.update
    if @command_window.active
      update_command
      return
    end
    if @buy_window.active
      update_buy
      return
    end
    if @actor_command.active
      update_actor
      return
    end
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新 (コマンドウィンドウがアクティブの場合)
  #--------------------------------------------------------------------------
  def update_command
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      $scene = Scene_Map.new
      return
    end
    if Input.trigger?(Input::C)
      case @command_window.index
      when 0
        $game_system.se_play($data_system.decision_se)
        @command_window.active = false
        @dummy_window.visible = false
        @buy_window.active = true
        @buy_window.visible = true
        @buy_window.refresh
        @status_window.visible = true
      when 1
        $game_system.se_play($data_system.decision_se)
        $scene = Scene_Map.new
      end
      return
    end
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新 (購入ウィンドウがアクティブの場合)
  #--------------------------------------------------------------------------
  def update_buy
    @status_window.item = @buy_window.item
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      @command_window.active = true
      @dummy_window.visible = true
      @buy_window.active = false
      @buy_window.visible = false
      @status_window.visible = false
      @status_window.item = nil
      # ヘルプテキストを消去
      @help_window.set_text("")
      return
    end
    if Input.trigger?(Input::C)
      @item = @buy_window.item
      if @item == nil or @item.price > $game_party.gold
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      for i in 0...$game_party.actors.size
        for idex in 1...$data_skills.size
          skill = $data_skills[idex]
          if @item.name == skill.name
            id = skill.id
            break
          end
        end
        if $game_party.actors[i].skill_learn?(id)
          if i == $game_party.actors.size - 1
            $game_system.se_play($data_system.buzzer_se)            
            return
          else
            next
          end
        else
          break
        end
      end
      $game_system.se_play($data_system.decision_se)
      @actor_command.refresh
      @actor_command.visible = true
      @actor_command.active = true
      @buy_window.active = false
      skill_hantei
    end
  end
  #--------------------------------------------------------------------------
  # ○ フレーム更新 (アクター選択ウィンドウがアクティブの場合)
  #--------------------------------------------------------------------------
  def update_actor
    if Input.trigger?(Input::B)
      @actor_command.visible = false
      @actor_command.active = false
      @actor_command.index = 0
      @buy_window.active = true
      @gold_window.refresh
      @buy_window.refresh
      @status_window.refresh
      return
    end
    if Input.trigger?(Input::C)
      for i in 1...$data_skills.size
        skill = $data_skills[i]
        if @item.name == skill.name
          id = skill.id
          break
        end
      end
      index = @actor_command.index
      flag = false
      for ind in Skill_Shop::ACTOR
        if ind[0] == $game_party.actors[index].id and 
            ind[2] >= $game_party.actors[index].level and 
            ind[1] == skill.name
          flag = true
        end
      end
      unless $game_party.actors[index].skill_learn?(id) or flag == true
        $game_party.actors[index].learn_skill(id)
        $game_party.lose_gold(@item.price)
        $game_system.se_play($data_system.shop_se)
        @gold_window.refresh
        @buy_window.refresh
        @status_window.refresh
        @actor_command.refresh
        skill_hantei
      else
        $game_system.se_play($data_system.buzzer_se)
      end
    end
  end
end

web拍手 by FC2   

コメントの投稿


非公開コメント

コメント

STERS's Development Room

STERSの開発室っぽい何か。


プロフィール

Name:STERS
Unity3D/C#/PHP/js/C++/VB
などを勉強中です

[STERS's Room]
[ファイル置き場]

カテゴリー
最近の記事
最近のコメント
カレンダー
04 ≪│2017/05│≫ 06
- 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31 - - -
RSSリンクの表示
ブログ内Google検索
Google
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。