| 
 
| 赞 | 4 |  
| VIP | 71 |  
| 好人卡 | 22 |  
| 积分 | 7 |  
| 经验 | 32145 |  
| 最后登录 | 2013-8-9 |  
| 在线时间 | 184 小时 |  
 Lv2.观梦者 天仙 
	梦石0 星屑680 在线时间184 小时注册时间2008-4-15帖子5023 
 | 
| 
本帖最后由 雪流星 于 2012-2-7 22:36 编辑
x
加入我们,或者,欢迎回来。您需要 登录 才可以下载或查看,没有帐号?注册会员  
 使用方法已经写在脚本里。
 附件上传半天没回应,所以转存网盘:下载演示工程
 复制代码
#===============================================================================
# ■ [VA] 偷窃脚本
#   [VA] Steal
#-------------------------------------------------------------------------------
#
#-------------------------------------------------------------------------------
#    更新作者: 雪流星
#    许可协议: FSL -NAM
#    引用网址: http://rpg.blue/forum.php?mod=viewthread&tid=221800
#-------------------------------------------------------------------------------
=begin
    - 2.03.2012  By 雪流星
      * 初版;
        说明:
        在敌人的备注里面填写 [loot 类型ID]
        类型可以为 "w"(武器)、"a"(防具)、"i"(物品)或"g"(金钱)
        ID 为数字,当类型为金钱时,ID则视为金钱数量
        范例:[loot w1]   表示可以偷到 1 号武器
              [loot g100] 表示可以偷到 100G 的金钱
        没有填写的敌人则必定偷窃失败
 
        角色被偷窃过后不能再次被偷窃
        队伍金钱比随机偷窃的金额还低的话,则全部被偷走
        例如队伍金钱为99G,但随机偷窃金额为100G,则最终被偷窃金额为99G
        
        队伍中没有随机偷窃物品/装备的话,则偷窃失败
        
    - 2.06.2012  By 雪流星
      * 功能修改:我方队员被偷窃物品的算法
                  能够偷窃的敌人可以指定偷窃物
                  在敌人的备注里面填写 [steals 类型ID] (与敌人被偷物的设定相似)
                  没有填写时默认为随机偷窃
      * 功能修改:我方队员被偷物品的机率设定和算法
                  在物品的备注里面填写 [loot_rate 数值]
                  数值越大,则被偷窃机率越大
                  数值最低为 1,最大为 100
                  没有填写时默认为 1
                  
      * 功能增加:增加可以防止偷窃的状态和装备
                  在脚本 NO_STEAL_STATE 指定禁止偷窃的状态
                  角色/敌人被附加此状态时(无论是用技能、物品、事件)
                  偷窃必定失败
                  
                  在装备(武器/防具)的备注里填写 [no_steal]
                  则装备此武器/防具时,偷窃必定失败
    
      * 功能增加:物品/装备/金钱被偷之后,会自动加入敌人的掉落物中
                  战胜后可以取回
                  若战败、敌人逃走、中断战斗则无法取回
=end
#===============================================================================
$fscript = {} if $fscript == nil
$fscript["Snstar2006Steal"] = "1.0"
#-------------------------------------------------------------------------------
# ▼ 通用配置模块
#-------------------------------------------------------------------------------
module FSL
  module Snstar2006Steal
      #STEAL_PARAMETER = 3 # 偷窃参数设定(1-3:掉落物品1-3、4:使用注释设定)
      
      # 技能设定,需要在数据库中设定其他参数
        # 最后一个不能有逗号 ", "
      STEAL_SKILL_ID = [
        3,  # 技能“偷窃”,一般的偷窃技能
        4   # 技能“凌空飞星”,偷窃时顺便伤害(仙4中韩菱纱的偷窃技能之一)
      ]
      STEAL_VOCAB = "偷窃"
      NO_STEAL_STATE = [26, 27]
      GOLD_STEAL_ODDS = 3
  end
end
class RPG::BaseItem
  include FSL::Snstar2006Steal
  #--------------------------------------------------------------------------
  # ● 获取被偷物
  # 返回 [类型, ID/金额]
  #--------------------------------------------------------------------------
  def get_loot
    return unless self.is_a?(RPG::Enemy)
    self.note.split(/[\r\n]+/).each{ |line|
      if line =~ /\[(?:loot|被偷窃|被偷窃) (\D)(\d+)\]/
        return [$1 ? $1 : "i", $2 ? $2.to_i : 0]
      end}
    return ["i", 1]
  end
  #--------------------------------------------------------------------------
  # ● 获取指定偷窃物
  # 返回 [类型, ID/金额]
  #--------------------------------------------------------------------------
  def get_steal_item
    return unless self.is_a?(RPG::Enemy)
    self.note.split(/[\r\n]+/).each{ |line|
      if line =~ /\[(?:steals|偷窃|偷窃) (\D)(\d+)\]/
        return [$1 ? $1 : "none", $2 ? $2.to_i : 0]
      end}
    return ["none", 0]
  end
  #--------------------------------------------------------------------------
  # ● 判断技能是否为偷窃技能
  #--------------------------------------------------------------------------
  def is_thiefskill?
    return false unless self.is_a?(RPG::Skill)
    return FSL::Snstar2006Steal::STEAL_SKILL_ID.include?(id)
  end
  #--------------------------------------------------------------------------
  # ● 获取偷窃率基数
  #--------------------------------------------------------------------------
  def steal_odds
    return unless self.is_a?(RPG::EquipItem) or self.is_a?(RPG::Item)
    self.note.split(/[\r\n]+/).each{ |line|
      if line =~ /\[(?:loot_rate|偷窃机率|偷窃机率) (\d+)\]/
        odds = [[100, $1 ? $1.to_i : 1].min, 1].max
        return odds
      end
    }
    return 1
  end
  #--------------------------------------------------------------------------
  # ● 判断是否禁止偷窃
  #--------------------------------------------------------------------------
  def equip_no_steal?
    return unless self.is_a?(RPG::EquipItem)
    self.note.split(/[\r\n]+/).each{ |line|
      if line =~ /\[(no_steal|禁止偷窃|禁止偷窃)\]/
        return true
      end}
    return false
  end
end
class Game_Battler < Game_BattlerBase
  include FSL::Snstar2006Steal
  attr_accessor :stolen
  #--------------------------------------------------------------------------
  # ● 初始化
  #--------------------------------------------------------------------------
  alias steal_initialize initialize
  def initialize
    steal_initialize
    initialize_steal_parameters
  end
  def initialize_steal_parameters
    @stolen_item = nil
    @steal_item = []
    @stolen = false
  end
  alias steal_on_battle_end on_battle_end
  def on_battle_end
    steal_on_battle_end
    initialize_steal_parameters
  end
  #--------------------------------------------------------------------------
  # ● 判断角色是否能偷窃
  #--------------------------------------------------------------------------
  def can_steal?
    if actor? # 角色为我方队员时
      return false if usable_skills.empty? # 判断可用技能是否为空
      usable_skills.each{ |skill| 
        return true if skill.is_thiefskill? # 判断可用技能中是否有偷窃技能
      }
    else
      return false if @actions.empty? # 判断行动列表是否为空
      @actions.each { |action|
        return true if action.item.is_thiefskill? # 判断行动列表中是否有偷窃技能
      }
    end
    return false
  end
  #--------------------------------------------------------------------------
  # ● 返回被偷物名称
  #--------------------------------------------------------------------------
  def stolen_item
    if @stolen_item.is_a?(RPG::BaseItem) # 判断被偷物品类型
      return @stolen_item.name # 返回被偷物品名称
    else
      return @stolen_item.to_s+Vocab.currency_unit # 返回被偷金额+单位
    end
  end
  #--------------------------------------------------------------------------
  # ● 判断是否能被偷窃
  #--------------------------------------------------------------------------
  def can_be_stolen?
    return false if @stolen # 已被偷窃
    NO_STEAL_STATE.each { |state|
      return false if state?(state) # 已附加“禁止偷窃”状态
    }
    if actor? # 为队员的时候
      return false if $game_party.all_items.size == 0 && $game_party.gold == 0
      equips.each{ |equip|
        next unless equip # 装备为空时跳过
        return false if equip.equip_no_steal? # 判断装备是否“禁止偷窃”
      }
    end
    return true
  end
  #--------------------------------------------------------------------------
  # ● 判断是否有指定偷窃物品
  #--------------------------------------------------------------------------
  def steals_item?(user)
    return false unless can_be_stolen? # 判断是否能被偷窃
    return false if user.actor? # 判断使用者是否为队员
    if @steal_item.empty? # 未生成偷窃物品
      @steal_item = user.enemy.get_steal_item  # 获取指定偷窃物品
    end
    # 判断是否有指定错误
    return false if @steal_item[0]=="none" 
    return false if @steal_item[1]==0
    return true
  end
  #--------------------------------------------------------------------------
  # ● 应用技能/物品效果
  #--------------------------------------------------------------------------
  alias steal_item_apply item_apply
  def item_apply(user, item)
    steal_item_apply(user, item)
    if @result.hit? && item.is_thiefskill? # 判断成功率和技能类型
      unless can_be_stolen? # 判断是否能被偷窃
        @result.success = false # 偷窃失败标记
        return
      end
      if user.actor? # 判断偷窃者是否为队员
        loot = calc_loot # 计算被偷窃物品
        if (loot.is_a?(Integer)) # 判断被偷物品类型
          $game_party.gain_gold(loot) # 队伍获取金钱
        else
          $game_party.gain_item(loot, 1) # 队伍获取物品
        end
        @result.success = true # 偷窃成功标记
        @stolen = true # 被偷窃标记
      else
        loot = calc_loseitem(user) # 计算被偷窃物品
        case loot # 判断被偷物品类型
        when Integer # 被偷物为金钱时
          if $game_party.gold > 0 # 判断队伍是否有金钱
            loot = [loot, $game_party.gold].min # 判断金额是否足够
            $game_party.lose_gold(loot) # 队伍失去金币
            @result.success = true # 偷窃成功标记
            @stolen = true # 被偷窃标记
          else
            @result.success = false # 偷窃失败标记
          end
        when RPG::BaseItem # 被偷物为物品、武器或防具时
          
          if $game_party.has_item?(loot) # 判断队伍是否拥有该物品
            $game_party.gain_item(loot, -1) # 队伍失去物品
            @result.success = true # 偷窃成功标记
            @stolen = true # 被偷窃标记
            change_drop_item(user) # 修改敌人掉落物
          else
            @result.success = false # 偷窃失败标记
          end
        end
      end
      @stolen_item = loot # 记录被偷物
    end
  end
  #--------------------------------------------------------------------------
  # ● 计算敌人被偷物
  #--------------------------------------------------------------------------
  def calc_loot
    loot_data = enemy.get_loot
    return get_loot_item(loot_data[0], loot_data[1])
  end
  #--------------------------------------------------------------------------
  # ● 计算队员被偷物
  #--------------------------------------------------------------------------
  def calc_loseitem(user)
    # 若是敌人有指定偷窃物
    if !steals_item?(user)
      steal_item = random_loseitem # 随机产生偷窃物
      case steal_item
      when RPG::Item
        @steal_item[0] = "i"
      when RPG::Weapon
        @steal_item[0] = "w"
      when RPG::Armor
        @steal_item[0] = "a"
      when Integer
        @steal_item[0] = "g"
      end
      if steal_item.is_a?(Integer)
        @steal_item[1] = steal_item
      else
        @steal_item[1] = steal_item.id
      end
      return steal_item # 返回偷窃物
    end
    return get_loot_item(@steal_item[0], @steal_item[1]) # 返回偷窃物
  end
  #--------------------------------------------------------------------------
  # ● 随机产生队员被偷物
  #--------------------------------------------------------------------------
  def random_loseitem
    possible_item = []
    result_item = []
    if $game_party.all_items.size > 0
      # 随机抓取队伍物品中的20个物品
      20.times{ 
        random_item = $game_party.all_items[rand($game_party.all_items.size)]
        possible_item.push(random_item) 
      }
      possible_item.uniq! # 移除重复选取的物品
      possible_item.each{ |item| 
        item.steal_odds.times{result_item.push(item)} # 根据偷窃机率增加
      }
    end
    gold_steal_rate_real = [[GOLD_STEAL_ODDS, 100].min, 1].max # 金钱被偷窃率修正
    gold_steal_rate_real.times{ # 根据金钱被偷窃机率增加
      result_item.push(rand(10) * [1, 10, 100][rand(3)]) # 随机产生被偷窃的金额
    }
    item = result_item[rand(result_item.size)]
    return item
  end
  #--------------------------------------------------------------------------
  # ● 获取被偷物
  #--------------------------------------------------------------------------
  def get_loot_item(type, id)
    case type
    when "g"
      return id # 返回金钱数
    when "w"
      return $data_weapons[id]
    when "a"
      return $data_armors[id]
    else
      return $data_items[id]
    end
  end
  #--------------------------------------------------------------------------
  # ● 修改敌人掉落物品
  #--------------------------------------------------------------------------
  def change_drop_item(user)
    enemy = user.enemy
    return unless enemy.is_a?(RPG::Enemy)
    
    if @stolen_item.is_a?(Integer) # 被偷窃金钱时
      change_drop_gold(@stolen_item)
    else # 被偷窃物品/装备时
      user.change_drop_item(get_loot_item(@steal_item[0], @steal_item[1]))
    end
  end
end
class Game_Enemy < Game_Battler
  #--------------------------------------------------------------------------
  # ● 修改敌人掉落物品
  #--------------------------------------------------------------------------
  alias steal_make_drop_items make_drop_items
  def make_drop_items
    dis = steal_make_drop_items
    if @additional_drop_item
      dis.push(@additional_drop_item)
    end
    @additional_drop_item = nil
    return dis
  end
  alias steal_gold gold
  def gold
    return steal_gold + @additional_drop_gold.to_i
  end
  def change_drop_item(drop_item)
    @additional_drop_item = drop_item
  end
  def change_drop_gold(drop_gold)
    @additional_drop_gold = 0
    @additional_drop_gold = drop_gold
  end
end
class Window_ActorCommand < Window_Command
  include FSL::Snstar2006Steal
  #--------------------------------------------------------------------------
  # ● 生成指令列表;加入偷窃指令(未使用)
  #--------------------------------------------------------------------------
  alias steal_make_command_list make_command_list
  def make_command_list
      return unless steal_make_command_list
      #add_steal_command
  end
  #--------------------------------------------------------------------------
  # ● 加上“偷窃”指令(未使用)
  #--------------------------------------------------------------------------
  def add_steal_command
    return unless @actor.can_steal?
    add_command(STEAL_VOCAB, :steal)
    #@actor.actions.push(Game_Action.new(@actor))
  end
end
class Window_BattleLog < Window_Selectable
  #--------------------------------------------------------------------------
  # ● 显示偷窃结果
  #--------------------------------------------------------------------------
  def display_thief_results(target, item)
    return unless item.is_thiefskill?
    if target.result.used
      last_line_number = line_number
      if target.result.hit? && target.result.success # 判断偷窃是否成功
        if target.enemy?
          add_text(sprintf("偷窃获得%s", target.stolen_item))
        else
          add_text(sprintf("被偷窃失去%s", target.stolen_item))
        end
      else
        add_text("已被偷窃过") if target.stolen
        add_text("偷窃失败")
      end
      wait
      wait
    end
  end
end
class Scene_Battle < Scene_Base
  include FSL::Snstar2006Steal
  #--------------------------------------------------------------------------
  # ● 生成指令窗口;加入偷窃句柄(未使用)
  #--------------------------------------------------------------------------
  alias steal_create_actor_command_window create_actor_command_window
  def create_actor_command_window
    steal_create_actor_command_window
    @actor_command_window.set_handler(:steal, method(:command_steal))
  end
  #--------------------------------------------------------------------------
  # ● 执行偷窃指令(未使用)
  #--------------------------------------------------------------------------
  def command_steal
    BattleManager.actor.input.set_skill(STEAL_SKILL_ID)
    select_enemy_selection
  end
  #--------------------------------------------------------------------------
  # ● 应用技能/物品效果
  #--------------------------------------------------------------------------
  alias steal_apply_item_effects apply_item_effects
  def apply_item_effects(target, item)
    steal_apply_item_effects(target, item)
    @log_window.display_thief_results(target, item)
  end
end
  
   
   
   
   
   
   | 
 |