设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 1830|回复: 3
打印 上一主题 下一主题

[已经过期] 请问一下,偷窃脚本的偷窃技能怎么用?

[复制链接]

Lv4.逐梦者

梦石
2
星屑
3024
在线时间
398 小时
注册时间
2016-8-16
帖子
123

开拓者

跳转到指定楼层
1
发表于 2016-8-17 18:01:41 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
如题,请问一下大神们。另附自己做的图标一张

IconSet.png (698.91 KB, 下载次数: 31)

IconSet.png

Lv3.寻梦者

梦石
0
星屑
3841
在线时间
723 小时
注册时间
2014-3-29
帖子
509
2
发表于 2016-8-18 10:10:16 | 只看该作者
【看到有口袋才回复的。
话说。你的偷窃脚本是啥。最好把脚本展示出来。
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
2
星屑
3024
在线时间
398 小时
注册时间
2016-8-16
帖子
123

开拓者

3
 楼主| 发表于 2016-8-18 18:06:17 | 只看该作者

#===============================================================================
# ■ [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
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
7450
在线时间
1100 小时
注册时间
2006-7-18
帖子
572
4
发表于 2016-8-18 20:42:48 | 只看该作者
本帖最后由 雷影 于 2016-8-18 21:04 编辑

脚本说明已经说的很明白了吧!?
在怪物的备注栏里写上 [loot w1] 表示这个怪物身上能偷到数据库里编号1的武器!
[loot w1]   1武器好像是手斧
[loot a1]    1号防具记得是布衣
[loot i1]     1号道具好像是回复药
[loot g100]金钱100

嫌麻烦的话把
STEAL_PARAMETER = 3 # 偷窃參數設定(1-3:掉落物品1-3、4:使用註釋設定)
打开,这样偷盗的目标就是敌人掉落物!

    STEAL_SKILL_ID = [
        3,  # 技能“偷窃”,一般的偷窃技能
        4   # 技能“凌空飞星”,偷窃时顺便伤害(仙4中韩菱纱的偷窃技能之一)
      ]
这一部分是设置偷盗技能!3 4号技能有偷盗效果!可以自己改!
3号技能是普通偷窃!
4号技能加入伤害公式就是又打又偷的效果!


武器防具的备注中写入:[no_steal] 装备这个装备时免疫偷窃(被敌人偷袭必定会失败)

NO_STEAL_STATE = [6, 7] #这里设定不会被偷窃的状态,比如6是石化,7是死亡,处于这两种状态时,被偷窃不会成功!

物品的備註裡面填寫 [loot_rate 1~100]表示被敌人偷窃时,这个物品被偷走的概率。
100的话是被敌人偷窃时100%会被偷走!

PS:重看了一遍发现,似乎没判定敌人偷窃时,没有贵重品过关道具方面的判断!
不知道敌人会不会偷窃走过关道具……得测试一下……
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-16 22:29

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表