赞 | 5 |
VIP | 71 |
好人卡 | 22 |
积分 | 6 |
经验 | 32145 |
最后登录 | 2013-8-9 |
在线时间 | 184 小时 |
Lv2.观梦者 天仙
- 梦石
- 0
- 星屑
- 620
- 在线时间
- 184 小时
- 注册时间
- 2008-4-15
- 帖子
- 5023
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
本帖最后由 雪流星 于 2012-2-7 22:36 编辑
使用方法已经写在脚本里。
附件上传半天没回应,所以转存网盘:下载演示工程
- #===============================================================================
- # ■ [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
复制代码
|
|