#============================================================================== # ■ 技能装备系统 for RGSS1 by:VIPArcher # -- 本脚本来自 [url]https://rpg.blue[/url] 使用或转载请保留以上信息。 #============================================================================== # 让技能可以像装备一样装备到角色身上,战斗中仅可使用已经装备的技能,其他场景可 # 以随意使用,技能装备场景技能槽栏激活状态下(如有队友)按左右键切换当前角色。 # $scene = Scene_SetEquipSkill.new(actor_index, skill_index) 呼出场景。 # actor_index : 该角色在队伍中的位置 ; skill_index : 技能槽光标的起始位置 #============================================================================== $VIPArcherScript ||= {};$VIPArcherScript[:battle_skill] = 20150717 #------------------------------------------------------------------------------- module VIPArcher end #============================================================================== # ★ 设定部分 ★ #============================================================================== module VIPArcher::Battle_Skill #技能槽名字 Skills_Slot_Name = ['技能槽一','技能槽二','技能槽三','技能槽四','技能槽五'] #可使用的场合名称 SKILL_OCCASION = ['平时', '战斗中', '菜单中', '不能使用'] #效果范围名称 SKILL_SCOPE = ['无', '敌单体', '敌全体', '己方单体', '己方全体', '己方单体(战斗不能)', '己方全体(战斗不能)', '使用者'] #未装备技能时技能槽显示内容 BLANK_TEXT = '- 空技能槽 -' #空技能槽帮助窗口文本 BLANK_HELP = '空的技能槽,可以装备战斗技能。' #"[卸下技能]"的图标文件名(不需要则设置为 nil 或 false) RELEASE_ICON = '047-Skill04' #"[卸下技能]"帮助窗口文本 RELEASE_HELP = '卸下已装备的技能。' #"[卸下技能]"按钮名称 RELEASE_TEXT = '[卸下技能]' end #============================================================================== # ☆ 设定结束 ☆ #============================================================================== class Symbol def to_proc Proc.new { |*args| args.shift.__send__(self, *args) } end end class Game_Actor < Game_Battler include VIPArcher::Battle_Skill attr_reader :battle_skill #已装备技能 alias battle_skill_initialize initialize def initialize(actor_id) @battle_skill = Array.new(Skills_Slot_Name.size){ nil } battle_skill_initialize(actor_id) end def add_battle_skill(skill,id) @battle_skill[id] = nil if skill.zero? return if @battle_skill.include?(skill) @battle_skill[id] = skill if skills.include?(skill) end alias battle_skill_learn_skill learn_skill def learn_skill(skill_id) battle_skill_learn_skill(skill_id) auto_add_battle_skill(skill_id) unless @battle_skill.include?(skill_id) end def auto_add_battle_skill(skill_id) @battle_skill.each_index do |index| return @battle_skill[index] = skill_id if @battle_skill[index].nil? end end alias battle_skill_forget_skill forget_skill def forget_skill(skill_id) battle_skill_forget_skill(skill_id) if @battle_skill.include?(skill_id) @battle_skill[@battle_skill.index(skill_id)] = nil end end end class Window_Selectable < Window_Base def create_contents self.contents.dispose if self.contents self.contents = Bitmap.new(width - 32, row_max * 32) end end class Window_EquipSkillLeft < Window_Base include VIPArcher::Battle_Skill def initialize(actor, skill = nil) super(0, 64, 272, 192) self.contents = Bitmap.new(width - 32, height - 32) @actor, [url=home.php?mod=space&uid=260100]@skill[/url] = actor, skill refresh end def refresh self.contents.clear draw_actor_name(@actor, 4, 0) draw_actor_level(@actor, 132, 0) draw_skill_info unless @skill.nil? end def set_skill(skill) @skill = skill refresh end def draw_skill_info self.contents.font.color = system_color self.contents.draw_text(0, 32, 128, 32, '使用场合') self.contents.font.color = normal_color self.contents.draw_text(32, 64, 128, 32, SKILL_OCCASION[@skill.occasion]) self.contents.font.color = system_color self.contents.draw_text(0, 96, 128, 32, '效果范围') self.contents.font.color = normal_color self.contents.draw_text(32, 128, 320, 32, SKILL_SCOPE[@skill.scope]) end end class Window_EquipSkillSlot < Window_Selectable include VIPArcher::Battle_Skill attr_writer :skill_info_window def initialize(actor, skill_index = 0) super(272, 64, 368, 192) @actor, self.index = actor, skill_index refresh end def data @actor.battle_skill end def item data[self.index] ? $data_skills[data[self.index]] : nil end def refresh @item_max = data.size create_contents self.contents.font.color = system_color Skills_Slot_Name.each_with_index do |name,id| self.contents.draw_text(4, 32 * id, 92, 32, name) end data.each_with_index do |skill_id,id| if skill_id.nil? self.contents.font.color = normal_color self.contents.draw_text(128 , 32 * id,192, 32, BLANK_TEXT) else draw_item_name($data_skills[skill_id], 128, 32 * id) end end end def update_help @help_window.set_text(item.nil? ? BLANK_HELP : item.description) @skill_info_window.set_skill(item) if @skill_info_window end end class Window_SkillItem < Window_Selectable include VIPArcher::Battle_Skill attr_writer :skill_info_window def initialize(actor) super(0, 256, 640, 224) @actor, @column_max, self.active, self.index = actor, 2, false, -1 refresh end def item @data[self.index] ? $data_skills[@data[self.index]] : nil end def refresh @data = [] skills = @actor.skills.select{|skill| !@actor.battle_skill.include?(skill)} skills.each{|skill| @data.push(skill) } @data.push(nil) # 添加[卸下装备] @item_max = @data.size create_contents @data.each_index{|index| draw_item(index)} end def draw_item(index) x = 4 + index % 2 * (288 + 32) y = index/ 2 * 32 #这残念的Sublime Text高亮=。= self.contents.font.color = normal_color if @data[index] skill = $data_skills[@data[index]] bitmap = RPG::Cache.icon(skill.icon_name) self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24)) self.contents.draw_text(x + 28, y, 212, 32, skill.name) else bitmap = RPG::Cache.icon(RELEASE_ICON) if RELEASE_ICON self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24)) if bitmap self.contents.draw_text(x + 28, y, 212, 32, RELEASE_TEXT) end end def update_help @help_window.set_text(item.nil? ? RELEASE_HELP : item.description) @skill_info_window.set_skill(item) if @skill_info_window end end class Window_Skill < Window_Selectable def refresh @data = [] if $scene.instance_of?(Scene_Battle) @actor.battle_skill else @actor.skills end.each do |skill| @data.push($data_skills[skill]) unless skill.nil? end @item_max = @data.size create_contents unless @item_max.zero? @data.each_index{|index| draw_item(index) } end end class Scene_SetEquipSkill def initialize(actor_index = 0, skill_index = 0) @actor_index, @skill_index = actor_index, skill_index end def main @actor = $game_party.actors[@actor_index] create_all_window Graphics.transition [Graphics,Input,self].map(&:update) while $scene.equal?(self) Graphics.freeze dispose_all_window end def create_all_window @help_window = Window_Help.new @right_window = Window_EquipSkillSlot.new(@actor,@skill_index) @left_window = Window_EquipSkillLeft.new(@actor,@right_window.item) @skillitem_window = Window_SkillItem.new(@actor) @right_window.help_window = @help_window @skillitem_window.help_window = @help_window @right_window.skill_info_window = @left_window @skillitem_window.skill_info_window = @left_window end def update update_all_windows return update_right if @right_window.active return update_item if @skillitem_window.active end def update_right return scene_return if Input.trigger?(Input::B) return on_slot_ok if Input.trigger?(Input::C) return process_pagedown if Input.trigger?(Input::RIGHT) return process_pageup if Input.trigger?(Input::LEFT) end def update_item return on_item_cancel if Input.trigger?(Input::B) return on_item_ok if Input.trigger?(Input::C) end def on_item_ok $game_system.se_play($data_system.equip_se) skill = @skillitem_window.item @actor.add_battle_skill(skill.nil? ? 0 : skill.id,@right_window.index) @right_window.active = true @skillitem_window.active = false @skillitem_window.index = -1 @right_window.refresh @skillitem_window.refresh end def on_item_cancel $game_system.se_play($data_system.cancel_se) @right_window.active = true @skillitem_window.active = false @skillitem_window.index = -1 end def scene_return $game_system.se_play($data_system.cancel_se) $scene = Scene_Map.new end def on_slot_ok $game_system.se_play($data_system.decision_se) @equipskill_id = @right_window.index @right_window.active = false @skillitem_window.active = true @skillitem_window.index = 0 end def process_pageup $game_system.se_play($data_system.cursor_se) @actor_index += $game_party.actors.size - 1 @actor_index %= $game_party.actors.size $scene = Scene_SetEquipSkill.new(@actor_index, @right_window.index) end def process_pagedown $game_system.se_play($data_system.cursor_se) @actor_index += 1 @actor_index %= $game_party.actors.size $scene = Scene_SetEquipSkill.new(@actor_index, @right_window.index) end def update_all_windows instance_variables.each do |varname| ivar = instance_variable_get(varname) ivar.update if ivar.is_a?(Window) end end def dispose_all_window instance_variables.each do |varname| ivar = instance_variable_get(varname) ivar.dispose if ivar.is_a?(Window) end end end class Interpreter #-------------------------------------------------------------------------- # ● 条件分支 #-------------------------------------------------------------------------- alias battle_skill_command_111 command_111 def command_111 result = false # 条件判定 if [@parameters[0],@parameters[2]] == [4,2] actor = $game_actors[@parameters[1]] if actor != nil if $scene.instance_of?(Scene_Battle) result = (actor.battle_skill.include?(@parameters[3])) else result = (actor.skill_learn?(@parameters[3])) end end # 判断结果保存在 hash 中 @branch[@list[@index].indent] = result # 判断结果为真的情况下 if @branch[@list[@index].indent] == true # 删除分支数据 @branch.delete(@list[@index].indent) # 继续 return true end # 不符合条件的情况下 : 指令跳转 return command_skip else battle_skill_command_111 end end end
203.23 KB, 下载次数: 59
欢迎光临 Project1 (https://rpg.blue/) | Powered by Discuz! X3.1 |