Project1

标题: 求1个装备鉴定的脚本 [打印本页]

作者: kaspersky    时间: 2011-7-13 09:34
提示: 作者被禁止或删除 内容自动屏蔽
作者: 夜风袭    时间: 2011-7-13 09:36
http://rpg.blue/article-41127.html
  1. module RPG
  2. class Item
  3.    def name
  4.      return @name.split(/#/)[0]
  5.    end
  6.    def indentify
  7.      return @name.split(/#/)[1]
  8.    end  
  9.   end

  10. class Weapon
  11.    def name
  12.      return @name.split(/#/)[0]
  13.    end
  14.    def indentify
  15.      return @name.split(/#/)[1]
  16.    end  
  17.   end
  18.   
  19. class Armor
  20.    def name
  21.      return @name.split(/#/)[0]
  22.    end
  23.    def indentify
  24.      return @name.split(/#/)[1]
  25.    end  
  26.   end
  27. end

  28. module OPTION
  29. CALL_WINDOW = Proc.new{$Scene.call_window }
  30. end  

  31. class Game_System
  32. #--------------------------------------------------------------------------
  33. # ● 定义实例变量
  34. #--------------------------------------------------------------------------
  35. attr_accessor :item_indentify_table             # 物品鉴定表
  36. attr_accessor :weapon_indentify_table            # 武器鉴定表
  37. attr_accessor :armor_indentify_table             # 防具鉴定表
  38. #--------------------------------------------------------------------------
  39. # ● 初始化对像
  40. #--------------------------------------------------------------------------
  41. alias ori_initialize initialize
  42. def initialize
  43.    ori_initialize
  44.    @item_indentify_table = IT.new.set_item
  45.    @weapon_indentify_table = IT.new.set_weapon
  46.    @armor_indentify_table = IT.new.set_armor
  47. end
  48. end

  49. #--------------------------------------------------------------------------
  50. # ● 存储数据表的IT类
  51. #--------------------------------------------------------------------------
  52. class IT
  53. def initialize
  54.    @items = $data_items
  55.    @weapons = $data_weapons
  56.    @armors = $data_armors
  57. end

  58. def set_item
  59.    hash = {}
  60.    for i in [email protected]
  61.     hash[@items[i].name] = @items[i].indentify
  62.    end
  63.    return hash
  64. end  
  65. def set_weapon
  66.    hash = {}
  67.    for i in [email protected]
  68.     hash[@weapons[i].name] = @weapons[i].indentify
  69.    end
  70.    return hash
  71. end
  72. def set_armor
  73.    hash = {}
  74.    for i in [email protected]
  75.     hash[@armors[i].name] = @armors[i].indentify
  76.    end
  77.    return hash
  78. end  

  79. end  


  80. #==============================================================================
  81. # ■ Window_Item
  82. #------------------------------------------------------------------------------
  83. #  物品画面、战斗画面、显示浏览物品的窗口。
  84. #==============================================================================

  85. class Window_Item < Window_Selectable

  86. #--------------------------------------------------------------------------
  87. # ● 描绘项目
  88. #     index : 项目编号
  89. #--------------------------------------------------------------------------
  90. def draw_item(index)
  91.    item = @data[index]
  92.    case item
  93.    when RPG::Item
  94.      number = $game_party.item_number(item.id)
  95.      # 添加判断(物品)
  96.      indentify = $game_system.item_indentify_table[item.name]
  97.    when RPG::Weapon
  98.      number = $game_party.weapon_number(item.id)
  99.      # 添加判断(武器)
  100.      indentify = $game_system.weapon_indentify_table[item.name]
  101.    when RPG::Armor
  102.      # 添加判断(防具)
  103.      number = $game_party.armor_number(item.id)
  104.      indentify = $game_system.armor_indentify_table[item.name]
  105.    end
  106.    if item.is_a?(RPG::Item) and
  107.       $game_party.item_can_use?(item.id)
  108.      self.contents.font.color = normal_color
  109.    else
  110.      self.contents.font.color = disabled_color
  111.    end
  112.    x = 4 + index % 2 * (288 + 32)
  113.    y = index / 2 * 32
  114.    rect = Rect.new(x, y, self.width / @column_max - 32, 32)
  115.    self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
  116.    bitmap = RPG::Cache.icon(item.icon_name)
  117.    opacity = self.contents.font.color == normal_color ? 255 : 128
  118.    self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
  119.    
  120.    if indentify == "0"
  121.      self.contents.draw_text(x + 28, y, 212, 32,"未鉴定", 0)
  122.    else  
  123.      self.contents.draw_text(x + 28, y, 212, 32, item.name, 0)
  124.    end
  125.    
  126.    self.contents.draw_text(x + 240, y, 16, 32, ":", 1)
  127.    self.contents.draw_text(x + 256, y, 24, 32, number.to_s, 2)
  128. end

  129. end

  130. #==============================================================================
  131. # ■ Scene_Item
  132. #------------------------------------------------------------------------------
  133. #  处理物品画面的类。
  134. #==============================================================================

  135. class Scene_Item

  136. #--------------------------------------------------------------------------
  137. # ● 刷新画面 (目标窗口被激活的情况下)
  138. #--------------------------------------------------------------------------
  139. def update_target
  140.    # 按下 B 键的情况下
  141.    if Input.trigger?(Input::B)
  142.      # 演奏取消 SE
  143.      $game_system.se_play($data_system.cancel_se)
  144.      # 由于物品用完而不能使用的场合
  145.      unless $game_party.item_can_use?(@item.id)
  146.        # 再次生成物品窗口的内容
  147.        @item_window.refresh
  148.      end
  149.      # 删除目标窗口
  150.      @item_window.active = true
  151.      @target_window.visible = false
  152.      @target_window.active = false
  153.      return
  154.    end
  155.    # 按下 C 键的情况下
  156.    if Input.trigger?(Input::C)
  157.      # 如果物品用完的情况下
  158.      if $game_party.item_number(@item.id) == 0
  159.        # 演奏冻结 SE
  160.        $game_system.se_play($data_system.buzzer_se)
  161.        return
  162.      end
  163.      
  164.      p $game_system.item_indentify_table[@item.name]
  165.      # 判断是否为未鉴定物品
  166.      if $game_system.item_indentify_table[@item.name] == "0"
  167.        # 演奏冻结 SE
  168.        $game_system.se_play($data_system.buzzer_se)
  169.        return
  170.      end
  171.      # --------------------
  172.      
  173.      # 目标是全体的情况下
  174.      if @target_window.index == -1
  175.        # 对同伴全体应用物品使用效果
  176.        used = false
  177.        for i in $game_party.actors
  178.          used |= i.item_effect(@item)
  179.        end
  180.      end
  181.      # 目标是单体的情况下
  182.      if @target_window.index >= 0
  183.        # 对目标角色应用物品的使用效果
  184.        target = $game_party.actors[@target_window.index]
  185.        used = target.item_effect(@item)
  186.      end
  187.      # 使用物品的情况下
  188.      if used
  189.        # 演奏物品使用时的 SE
  190.        $game_system.se_play(@item.menu_se)
  191.        # 消耗品的情况下
  192.        if @item.consumable
  193.          # 使用的物品数减 1
  194.          $game_party.lose_item(@item.id, 1)
  195.          # 再描绘物品窗口的项目
  196.          @item_window.draw_item(@item_window.index)
  197.        end
  198.        # 再生成目标窗口的内容
  199.        @target_window.refresh
  200.        # 全灭的情况下
  201.        if $game_party.all_dead?
  202.          # 切换到游戏结束画面
  203.          $scene = Scene_Gameover.new
  204.          return
  205.        end
  206.        # 公共事件 ID 有效的情况下
  207.        if @item.common_event_id > 0
  208.          # 预约调用公共事件
  209.          $game_temp.common_event_id = @item.common_event_id
  210.          # 切换到地图画面
  211.          $scene = Scene_Map.new
  212.          return
  213.        end
  214.      end
  215.      # 无法使用物品的情况下
  216.      unless used
  217.        # 演奏冻结 SE
  218.        $game_system.se_play($data_system.buzzer_se)
  219.      end
  220.      return
  221.    end
  222. end
  223. end

  224. #==============================================================================
  225. # ■ Window_EquipItem
  226. #------------------------------------------------------------------------------
  227. #  装备画面、显示浏览变更装备的候补物品的窗口。
  228. #==============================================================================

  229. class Window_EquipItem < Window_Selectable

  230. #--------------------------------------------------------------------------
  231. # ● 项目的描绘
  232. #     index : 项目符号
  233. #--------------------------------------------------------------------------
  234. def draw_item(index)
  235.    item = @data[index]
  236.    x = 4 + index % 2 * (288 + 32)
  237.    y = index / 2 * 32
  238.    case item
  239.    when RPG::Weapon
  240.      number = $game_party.weapon_number(item.id)
  241.      # 添加判断(武器)
  242.      indentify = $game_system.weapon_indentify_table[item.name]
  243.    when RPG::Armor
  244.      number = $game_party.armor_number(item.id)
  245.      # 添加判断(防具)
  246.      indentify = $game_system.armor_indentify_table[item.name]
  247.    end
  248.    bitmap = RPG::Cache.icon(item.icon_name)
  249.    self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24))
  250.    self.contents.font.color = normal_color
  251.    
  252.    if indentify == "0"
  253.      self.contents.draw_text(x + 28, y, 212, 32,"未鉴定", 0)
  254.    else
  255.      self.contents.draw_text(x + 28, y, 212, 32, item.name, 0)
  256.    end
  257.    
  258.    self.contents.draw_text(x + 240, y, 16, 32, ":", 1)
  259.    self.contents.draw_text(x + 256, y, 24, 32, number.to_s, 2)
  260. end


  261. end


  262. #==============================================================================
  263. # ■ Scene_Equip
  264. #------------------------------------------------------------------------------
  265. #  处理装备画面的类。
  266. #==============================================================================

  267. class Scene_Equip

  268. #--------------------------------------------------------------------------
  269. # ● 刷新画面 (物品窗口被激活的情况下)
  270. #--------------------------------------------------------------------------
  271. def update_item
  272.    # 按下 B 键的情况下
  273.    if Input.trigger?(Input::B)
  274.      # 演奏取消 SE
  275.      $game_system.se_play($data_system.cancel_se)
  276.      # 激活右侧窗口
  277.      @right_window.active = true
  278.      @item_window.active = false
  279.      @item_window.index = -1
  280.      return
  281.    end
  282.    
  283.    
  284.    # 按下 C 键的情况下
  285.    if Input.trigger?(Input::C)

  286.      case @item_window.item
  287.        when RPG::Weapon
  288.          # 添加判断(武器)
  289.          indentify = $game_system.weapon_indentify_table[@item_window.item.name]
  290.        when RPG::Armor
  291.          # 添加判断(防具)
  292.          indentify = $game_system.armor_indentify_table[@item_window.item.name]
  293.       end
  294.      
  295.      if @item_window.item != nil
  296.        if indentify == "0"  
  297.          return
  298.        end
  299.      end
  300.      
  301.      # 演奏装备 SE
  302.      $game_system.se_play($data_system.equip_se)
  303.      # 获取物品窗口现在选择的装备数据
  304.      item = @item_window.item
  305.      # 变更装备
  306.      @actor.equip(@right_window.index, item == nil ? 0 : item.id)
  307.      # 激活右侧窗口
  308.      @right_window.active = true
  309.      @item_window.active = false
  310.      @item_window.index = -1
  311.      # 再生成右侧窗口、物品窗口的内容
  312.      @right_window.refresh
  313.      @item_window.refresh
  314.      return
  315.    end
  316. end
  317. end

  318. class Game_Party
  319. attr_reader   :items     
  320. attr_reader   :weapons
  321. attr_reader   :armors
  322. end

  323. class Window_Item_Indentify < Window_Selectable
  324. def initialize
  325.    super(160,80,320,320)
  326.    self.contents = Bitmap.new(width - 32, height - 32)
  327.    @column_max = 1
  328.    @item_max = items[0].size + weapons[0].size + armors[0].size - 1
  329.    @data = []
  330.    refresh
  331.    self.index = 0
  332. end

  333. def items
  334.    hash = {}
  335.    item_names = []
  336.    item_ids = []
  337.    items = $game_party.items
  338.    items.each_key{|key|item_names.push($data_items[key].name)}
  339.    items.each_key{|key|item_ids.push(key)}
  340.    return [item_names,item_ids]
  341. end

  342. def weapons
  343.    hash = {}
  344.    weapon_names = []
  345.    weapon_ids = []
  346.    weapons = $game_party.weapons
  347.    weapons.each_key{|key|weapon_names.push($data_weapons[key].name)}
  348.    weapons.each_key{|key|weapon_ids.push(key)}
  349.    return [weapon_names,weapon_ids]
  350. end

  351. def armors
  352.    hash = {}
  353.    armor_names = []
  354.    armor_ids = []
  355.    armors = $game_party.armors
  356.    armors.each_key{|key|armor_names.push($data_armors[key].name)}
  357.    armors.each_key{|key|armor_ids.push(key)}
  358.    return [armor_names,armor_ids]
  359. end  

  360. def all
  361.    all = []
  362.    items[1].each{|id| all.push($data_items[id])}
  363.    weapons[1].each{|id| all.push($data_weapons[id])}
  364.    armors[1].each{|id| all.push($data_armors[id])}
  365.    return all
  366. end  

  367. def refresh
  368.    self.contents.clear
  369.    for i in 0...all.size
  370.      case all[i]
  371.        when RPG::Item
  372.          indentify = $game_system.item_indentify_table[all[i].name]
  373.        when RPG::Weapon
  374.          indentify = $game_system.weapon_indentify_table[all[i].name]
  375.        when RPG::Armor
  376.          indentify = $game_system.armor_indentify_table[all[i].name]
  377.      end

  378.      bitmap = RPG::Cache.icon(all[i].icon_name)
  379.      self.contents.blt(0,i*32,bitmap,Rect.new(0, 0, 24, 24))
  380.      
  381.      if indentify == "0"  
  382.        self.contents.draw_text(64,i*32,200,32,"未鉴定")
  383.      else
  384.        self.contents.draw_text(64,i*32,200,32,all[i].name)
  385.      end
  386.    end
  387. end  
  388. end  

  389. class Scene_Indentify
  390. def main
  391.    @spriteset = Spriteset_Map.new
  392.    @window = Window_Item_Indentify.new
  393.    @help_window = Window_Help.new
  394.    @help_window.active = false
  395.    @help_window.y = 0
  396.    Graphics.transition
  397.    loop do
  398.      Graphics.update
  399.      Input.update
  400.      update
  401.      if $scene != self
  402.        break
  403.      end
  404.    end  
  405.    Graphics.freeze
  406.    @help_window.dispose
  407.    @window.dispose
  408.    @spriteset.dispose
  409. end

  410. def update
  411.    @help_window.update
  412.    if @window.active
  413.      window_update
  414.    end  
  415.    
  416.    if @help_window.active
  417.      help_window_update
  418.    end  
  419. end  

  420. def window_update
  421.    @window.update
  422.    if Input.trigger?(Input::C)
  423.      data = @window.all[@window.index]
  424.      case @window.all[@window.index]
  425.        when RPG::Item
  426.          indentify = $game_system.item_indentify_table[data.name]
  427.          if indentify == "0"
  428.            indentify = $game_system.item_indentify_table[data.name] = 1
  429.            @window.active = false
  430.            @help_window.active = true
  431.            @help_window.set_text("鉴定结果"+ data.name )
  432.          end  
  433.        when RPG::Weapon
  434.          indentify = $game_system.weapon_indentify_table[data.name]
  435.          if indentify == "0"
  436.            indentify = $game_system.weapon_indentify_table[data.name] = 1
  437.            @window.active = false
  438.            @help_window.active = true
  439.            @help_window.set_text("鉴定结果"+ data.name )
  440.          end  
  441.        when RPG::Armor
  442.          indentify = $game_system.armor_indentify_table[data.name]
  443.          if indentify == "0"
  444.            indentify = $game_system.armor_indentify_table[data.name] = 1
  445.            @window.active = false
  446.            @help_window.active = true
  447.            @help_window.set_text("鉴定结果"+ data.name )
  448.          end  
  449.        end
  450.    end  
  451.      
  452.    if Input.trigger?(Input::B)   
  453.      $game_system.se_play($data_system.cancel_se)
  454.      $scene = Scene_Map.new
  455.    end  

  456. end

  457. def help_window_update
  458.    if Input.press?(Input::C)   
  459.      $game_system.se_play($data_system.decision_se)
  460.      for i in 0..30
  461.        Graphics.update
  462.      end  
  463.      $scene = Scene_Map.new
  464.    end  
  465. end

  466. end  
复制代码





欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1