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

Project1

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

[RMVA发布] VA 偷竊腳本 v1.0 (新添演示工程+截图)

[复制链接]

Lv2.观梦者

天仙

梦石
0
星屑
610
在线时间
184 小时
注册时间
2008-4-15
帖子
5023

贵宾

跳转到指定楼层
1
发表于 2012-2-4 11:19:04 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 雪流星 于 2012-2-7 22:36 编辑

使用方法已经写在脚本里。
附件上传半天没回应,所以转存网盘:下载演示工程

  1. #===============================================================================
  2. # ■ [VA] 偷窃脚本
  3. #   [VA] Steal
  4. #-------------------------------------------------------------------------------
  5. #
  6. #-------------------------------------------------------------------------------
  7. #    更新作者: 雪流星
  8. #    许可协议: FSL -NAM
  9. #    引用网址: http://rpg.blue/forum.php?mod=viewthread&tid=221800
  10. #-------------------------------------------------------------------------------
  11. =begin
  12.     - 2.03.2012  By 雪流星
  13.       * 初版;
  14.         说明:
  15.         在敌人的备注里面填写 [loot 类型ID]
  16.         类型可以为 "w"(武器)、"a"(防具)、"i"(物品)或"g"(金钱)
  17.         ID 为数字,当类型为金钱时,ID则视为金钱数量
  18.         范例:[loot w1]   表示可以偷到 1 号武器
  19.               [loot g100] 表示可以偷到 100G 的金钱
  20.         没有填写的敌人则必定偷窃失败

  21.         角色被偷窃过后不能再次被偷窃
  22.         队伍金钱比随机偷窃的金额还低的话,则全部被偷走
  23.         例如队伍金钱为99G,但随机偷窃金额为100G,则最终被偷窃金额为99G
  24.         
  25.         队伍中没有随机偷窃物品/装备的话,则偷窃失败
  26.         
  27.     - 2.06.2012  By 雪流星
  28.       * 功能修改:我方队员被偷窃物品的算法
  29.                   能够偷窃的敌人可以指定偷窃物
  30.                   在敌人的备注里面填写 [steals 类型ID] (与敌人被偷物的设定相似)
  31.                   没有填写时默认为随机偷窃

  32.       * 功能修改:我方队员被偷物品的机率设定和算法
  33.                   在物品的备注里面填写 [loot_rate 数值]
  34.                   数值越大,则被偷窃机率越大
  35.                   数值最低为 1,最大为 100
  36.                   没有填写时默认为 1
  37.                   
  38.       * 功能增加:增加可以防止偷窃的状态和装备
  39.                   在脚本 NO_STEAL_STATE 指定禁止偷窃的状态
  40.                   角色/敌人被附加此状态时(无论是用技能、物品、事件)
  41.                   偷窃必定失败
  42.                   
  43.                   在装备(武器/防具)的备注里填写 [no_steal]
  44.                   则装备此武器/防具时,偷窃必定失败
  45.    
  46.       * 功能增加:物品/装备/金钱被偷之后,会自动加入敌人的掉落物中
  47.                   战胜后可以取回
  48.                   若战败、敌人逃走、中断战斗则无法取回

  49. =end
  50. #===============================================================================
  51. $fscript = {} if $fscript == nil
  52. $fscript["Snstar2006Steal"] = "1.0"

  53. #-------------------------------------------------------------------------------
  54. # ▼ 通用配置模块
  55. #-------------------------------------------------------------------------------

  56. module FSL
  57.   module Snstar2006Steal
  58.       #STEAL_PARAMETER = 3 # 偷窃参数设定(1-3:掉落物品1-3、4:使用注释设定)
  59.       
  60.       # 技能设定,需要在数据库中设定其他参数
  61.         # 最后一个不能有逗号 ", "
  62.       STEAL_SKILL_ID = [
  63.         3,  # 技能“偷窃”,一般的偷窃技能
  64.         4   # 技能“凌空飞星”,偷窃时顺便伤害(仙4中韩菱纱的偷窃技能之一)
  65.       ]
  66.       STEAL_VOCAB = "偷窃"
  67.       NO_STEAL_STATE = [26, 27]
  68.       GOLD_STEAL_ODDS = 3
  69.   end
  70. end
  71. class RPG::BaseItem
  72.   include FSL::Snstar2006Steal
  73.   #--------------------------------------------------------------------------
  74.   # ● 获取被偷物
  75.   # 返回 [类型, ID/金额]
  76.   #--------------------------------------------------------------------------
  77.   def get_loot
  78.     return unless self.is_a?(RPG::Enemy)
  79.     self.note.split(/[\r\n]+/).each{ |line|
  80.       if line =~ /\[(?:loot|被偷窃|被偷窃) (\D)(\d+)\]/
  81.         return [$1 ? $1 : "i", $2 ? $2.to_i : 0]
  82.       end}
  83.     return ["i", 1]
  84.   end
  85.   #--------------------------------------------------------------------------
  86.   # ● 获取指定偷窃物
  87.   # 返回 [类型, ID/金额]
  88.   #--------------------------------------------------------------------------
  89.   def get_steal_item
  90.     return unless self.is_a?(RPG::Enemy)
  91.     self.note.split(/[\r\n]+/).each{ |line|
  92.       if line =~ /\[(?:steals|偷窃|偷窃) (\D)(\d+)\]/
  93.         return [$1 ? $1 : "none", $2 ? $2.to_i : 0]
  94.       end}
  95.     return ["none", 0]
  96.   end
  97.   #--------------------------------------------------------------------------
  98.   # ● 判断技能是否为偷窃技能
  99.   #--------------------------------------------------------------------------
  100.   def is_thiefskill?
  101.     return false unless self.is_a?(RPG::Skill)
  102.     return FSL::Snstar2006Steal::STEAL_SKILL_ID.include?(id)
  103.   end
  104.   #--------------------------------------------------------------------------
  105.   # ● 获取偷窃率基数
  106.   #--------------------------------------------------------------------------
  107.   def steal_odds
  108.     return unless self.is_a?(RPG::EquipItem) or self.is_a?(RPG::Item)
  109.     self.note.split(/[\r\n]+/).each{ |line|
  110.       if line =~ /\[(?:loot_rate|偷窃机率|偷窃机率) (\d+)\]/
  111.         odds = [[100, $1 ? $1.to_i : 1].min, 1].max
  112.         return odds
  113.       end
  114.     }
  115.     return 1
  116.   end
  117.   #--------------------------------------------------------------------------
  118.   # ● 判断是否禁止偷窃
  119.   #--------------------------------------------------------------------------
  120.   def equip_no_steal?
  121.     return unless self.is_a?(RPG::EquipItem)
  122.     self.note.split(/[\r\n]+/).each{ |line|
  123.       if line =~ /\[(no_steal|禁止偷窃|禁止偷窃)\]/
  124.         return true
  125.       end}
  126.     return false
  127.   end
  128. end
  129. class Game_Battler < Game_BattlerBase
  130.   include FSL::Snstar2006Steal
  131.   attr_accessor :stolen
  132.   #--------------------------------------------------------------------------
  133.   # ● 初始化
  134.   #--------------------------------------------------------------------------
  135.   alias steal_initialize initialize
  136.   def initialize
  137.     steal_initialize
  138.     initialize_steal_parameters
  139.   end
  140.   def initialize_steal_parameters
  141.     @stolen_item = nil
  142.     @steal_item = []
  143.     @stolen = false
  144.   end
  145.   alias steal_on_battle_end on_battle_end
  146.   def on_battle_end
  147.     steal_on_battle_end
  148.     initialize_steal_parameters
  149.   end
  150.   #--------------------------------------------------------------------------
  151.   # ● 判断角色是否能偷窃
  152.   #--------------------------------------------------------------------------
  153.   def can_steal?
  154.     if actor? # 角色为我方队员时
  155.       return false if usable_skills.empty? # 判断可用技能是否为空
  156.       usable_skills.each{ |skill|
  157.         return true if skill.is_thiefskill? # 判断可用技能中是否有偷窃技能
  158.       }
  159.     else
  160.       return false if @actions.empty? # 判断行动列表是否为空
  161.       @actions.each { |action|
  162.         return true if action.item.is_thiefskill? # 判断行动列表中是否有偷窃技能
  163.       }
  164.     end
  165.     return false
  166.   end
  167.   #--------------------------------------------------------------------------
  168.   # ● 返回被偷物名称
  169.   #--------------------------------------------------------------------------
  170.   def stolen_item
  171.     if @stolen_item.is_a?(RPG::BaseItem) # 判断被偷物品类型
  172.       return @stolen_item.name # 返回被偷物品名称
  173.     else
  174.       return @stolen_item.to_s+Vocab.currency_unit # 返回被偷金额+单位
  175.     end
  176.   end
  177.   #--------------------------------------------------------------------------
  178.   # ● 判断是否能被偷窃
  179.   #--------------------------------------------------------------------------
  180.   def can_be_stolen?
  181.     return false if @stolen # 已被偷窃
  182.     NO_STEAL_STATE.each { |state|
  183.       return false if state?(state) # 已附加“禁止偷窃”状态
  184.     }
  185.     if actor? # 为队员的时候
  186.       return false if $game_party.all_items.size == 0 && $game_party.gold == 0
  187.       equips.each{ |equip|
  188.         next unless equip # 装备为空时跳过
  189.         return false if equip.equip_no_steal? # 判断装备是否“禁止偷窃”
  190.       }
  191.     end
  192.     return true
  193.   end
  194.   #--------------------------------------------------------------------------
  195.   # ● 判断是否有指定偷窃物品
  196.   #--------------------------------------------------------------------------
  197.   def steals_item?(user)
  198.     return false unless can_be_stolen? # 判断是否能被偷窃
  199.     return false if user.actor? # 判断使用者是否为队员
  200.     if @steal_item.empty? # 未生成偷窃物品
  201.       @steal_item = user.enemy.get_steal_item  # 获取指定偷窃物品
  202.     end
  203.     # 判断是否有指定错误
  204.     return false if @steal_item[0]=="none"
  205.     return false if @steal_item[1]==0
  206.     return true
  207.   end
  208.   #--------------------------------------------------------------------------
  209.   # ● 应用技能/物品效果
  210.   #--------------------------------------------------------------------------
  211.   alias steal_item_apply item_apply
  212.   def item_apply(user, item)
  213.     steal_item_apply(user, item)
  214.     if @result.hit? && item.is_thiefskill? # 判断成功率和技能类型
  215.       unless can_be_stolen? # 判断是否能被偷窃
  216.         @result.success = false # 偷窃失败标记
  217.         return
  218.       end
  219.       if user.actor? # 判断偷窃者是否为队员
  220.         loot = calc_loot # 计算被偷窃物品
  221.         if (loot.is_a?(Integer)) # 判断被偷物品类型
  222.           $game_party.gain_gold(loot) # 队伍获取金钱
  223.         else
  224.           $game_party.gain_item(loot, 1) # 队伍获取物品
  225.         end
  226.         @result.success = true # 偷窃成功标记
  227.         @stolen = true # 被偷窃标记
  228.       else
  229.         loot = calc_loseitem(user) # 计算被偷窃物品
  230.         case loot # 判断被偷物品类型
  231.         when Integer # 被偷物为金钱时
  232.           if $game_party.gold > 0 # 判断队伍是否有金钱
  233.             loot = [loot, $game_party.gold].min # 判断金额是否足够
  234.             $game_party.lose_gold(loot) # 队伍失去金币
  235.             @result.success = true # 偷窃成功标记
  236.             @stolen = true # 被偷窃标记
  237.           else
  238.             @result.success = false # 偷窃失败标记
  239.           end
  240.         when RPG::BaseItem # 被偷物为物品、武器或防具时
  241.          
  242.           if $game_party.has_item?(loot) # 判断队伍是否拥有该物品
  243.             $game_party.gain_item(loot, -1) # 队伍失去物品
  244.             @result.success = true # 偷窃成功标记
  245.             @stolen = true # 被偷窃标记
  246.             change_drop_item(user) # 修改敌人掉落物
  247.           else
  248.             @result.success = false # 偷窃失败标记
  249.           end
  250.         end
  251.       end
  252.       @stolen_item = loot # 记录被偷物
  253.     end
  254.   end
  255.   #--------------------------------------------------------------------------
  256.   # ● 计算敌人被偷物
  257.   #--------------------------------------------------------------------------
  258.   def calc_loot
  259.     loot_data = enemy.get_loot
  260.     return get_loot_item(loot_data[0], loot_data[1])
  261.   end
  262.   #--------------------------------------------------------------------------
  263.   # ● 计算队员被偷物
  264.   #--------------------------------------------------------------------------
  265.   def calc_loseitem(user)
  266.     # 若是敌人有指定偷窃物
  267.     if !steals_item?(user)
  268.       steal_item = random_loseitem # 随机产生偷窃物
  269.       case steal_item
  270.       when RPG::Item
  271.         @steal_item[0] = "i"
  272.       when RPG::Weapon
  273.         @steal_item[0] = "w"
  274.       when RPG::Armor
  275.         @steal_item[0] = "a"
  276.       when Integer
  277.         @steal_item[0] = "g"
  278.       end
  279.       if steal_item.is_a?(Integer)
  280.         @steal_item[1] = steal_item
  281.       else
  282.         @steal_item[1] = steal_item.id
  283.       end
  284.       return steal_item # 返回偷窃物
  285.     end
  286.     return get_loot_item(@steal_item[0], @steal_item[1]) # 返回偷窃物
  287.   end
  288.   #--------------------------------------------------------------------------
  289.   # ● 随机产生队员被偷物
  290.   #--------------------------------------------------------------------------
  291.   def random_loseitem
  292.     possible_item = []
  293.     result_item = []
  294.     if $game_party.all_items.size > 0
  295.       # 随机抓取队伍物品中的20个物品
  296.       20.times{
  297.         random_item = $game_party.all_items[rand($game_party.all_items.size)]
  298.         possible_item.push(random_item)
  299.       }
  300.       possible_item.uniq! # 移除重复选取的物品
  301.       possible_item.each{ |item|
  302.         item.steal_odds.times{result_item.push(item)} # 根据偷窃机率增加
  303.       }
  304.     end
  305.     gold_steal_rate_real = [[GOLD_STEAL_ODDS, 100].min, 1].max # 金钱被偷窃率修正
  306.     gold_steal_rate_real.times{ # 根据金钱被偷窃机率增加
  307.       result_item.push(rand(10) * [1, 10, 100][rand(3)]) # 随机产生被偷窃的金额
  308.     }
  309.     item = result_item[rand(result_item.size)]
  310.     return item
  311.   end
  312.   #--------------------------------------------------------------------------
  313.   # ● 获取被偷物
  314.   #--------------------------------------------------------------------------
  315.   def get_loot_item(type, id)
  316.     case type
  317.     when "g"
  318.       return id # 返回金钱数
  319.     when "w"
  320.       return $data_weapons[id]
  321.     when "a"
  322.       return $data_armors[id]
  323.     else
  324.       return $data_items[id]
  325.     end
  326.   end
  327.   #--------------------------------------------------------------------------
  328.   # ● 修改敌人掉落物品
  329.   #--------------------------------------------------------------------------
  330.   def change_drop_item(user)
  331.     enemy = user.enemy
  332.     return unless enemy.is_a?(RPG::Enemy)
  333.    
  334.     if @stolen_item.is_a?(Integer) # 被偷窃金钱时
  335.       change_drop_gold(@stolen_item)
  336.     else # 被偷窃物品/装备时
  337.       user.change_drop_item(get_loot_item(@steal_item[0], @steal_item[1]))
  338.     end
  339.   end
  340. end
  341. class Game_Enemy < Game_Battler
  342.   #--------------------------------------------------------------------------
  343.   # ● 修改敌人掉落物品
  344.   #--------------------------------------------------------------------------
  345.   alias steal_make_drop_items make_drop_items
  346.   def make_drop_items
  347.     dis = steal_make_drop_items
  348.     if @additional_drop_item
  349.       dis.push(@additional_drop_item)
  350.     end
  351.     @additional_drop_item = nil
  352.     return dis
  353.   end
  354.   alias steal_gold gold
  355.   def gold
  356.     return steal_gold + @additional_drop_gold.to_i
  357.   end
  358.   def change_drop_item(drop_item)
  359.     @additional_drop_item = drop_item
  360.   end
  361.   def change_drop_gold(drop_gold)
  362.     @additional_drop_gold = 0
  363.     @additional_drop_gold = drop_gold
  364.   end
  365. end
  366. class Window_ActorCommand < Window_Command
  367.   include FSL::Snstar2006Steal
  368.   #--------------------------------------------------------------------------
  369.   # ● 生成指令列表;加入偷窃指令(未使用)
  370.   #--------------------------------------------------------------------------
  371.   alias steal_make_command_list make_command_list
  372.   def make_command_list
  373.       return unless steal_make_command_list
  374.       #add_steal_command
  375.   end
  376.   #--------------------------------------------------------------------------
  377.   # ● 加上“偷窃”指令(未使用)
  378.   #--------------------------------------------------------------------------
  379.   def add_steal_command
  380.     return unless @actor.can_steal?
  381.     add_command(STEAL_VOCAB, :steal)
  382.     #@actor.actions.push(Game_Action.new(@actor))
  383.   end
  384. end

  385. class Window_BattleLog < Window_Selectable
  386.   #--------------------------------------------------------------------------
  387.   # ● 显示偷窃结果
  388.   #--------------------------------------------------------------------------
  389.   def display_thief_results(target, item)
  390.     return unless item.is_thiefskill?
  391.     if target.result.used
  392.       last_line_number = line_number
  393.       if target.result.hit? && target.result.success # 判断偷窃是否成功
  394.         if target.enemy?
  395.           add_text(sprintf("偷窃获得%s", target.stolen_item))
  396.         else
  397.           add_text(sprintf("被偷窃失去%s", target.stolen_item))
  398.         end
  399.       else
  400.         add_text("已被偷窃过") if target.stolen
  401.         add_text("偷窃失败")
  402.       end
  403.       wait
  404.       wait
  405.     end
  406.   end
  407. end
  408. class Scene_Battle < Scene_Base
  409.   include FSL::Snstar2006Steal
  410.   #--------------------------------------------------------------------------
  411.   # ● 生成指令窗口;加入偷窃句柄(未使用)
  412.   #--------------------------------------------------------------------------
  413.   alias steal_create_actor_command_window create_actor_command_window
  414.   def create_actor_command_window
  415.     steal_create_actor_command_window
  416.     @actor_command_window.set_handler(:steal, method(:command_steal))
  417.   end
  418.   #--------------------------------------------------------------------------
  419.   # ● 执行偷窃指令(未使用)
  420.   #--------------------------------------------------------------------------
  421.   def command_steal
  422.     BattleManager.actor.input.set_skill(STEAL_SKILL_ID)
  423.     select_enemy_selection
  424.   end
  425.   #--------------------------------------------------------------------------
  426.   # ● 应用技能/物品效果
  427.   #--------------------------------------------------------------------------
  428.   alias steal_apply_item_effects apply_item_effects
  429.   def apply_item_effects(target, item)
  430.     steal_apply_item_effects(target, item)
  431.     @log_window.display_thief_results(target, item)
  432.   end
  433. end
复制代码






VA脚本开工中...
偷窃脚本1.0 - 已完成

Lv1.梦旅人

梦石
0
星屑
50
在线时间
27 小时
注册时间
2011-4-24
帖子
56
2
发表于 2012-2-4 13:01:33 | 只看该作者
恩恩 等待雪流星大大的下一个版本
然后,里面的[xp]真的不用修改么喵~

点评

改了...  发表于 2012-2-4 13:11
回复 支持 反对

使用道具 举报

Lv2.观梦者

天仙

梦石
0
星屑
610
在线时间
184 小时
注册时间
2008-4-15
帖子
5023

贵宾

3
 楼主| 发表于 2012-2-7 09:40:19 | 只看该作者
- 2.06.2012 更新
* 功能修改:我方队员被偷窃物品的算法
* 功能修改:我方队员被偷物品的机率设定和算法
* 功能增加:增加可以防止偷窃的状态和装备
* 功能增加:物品/装备/金钱被偷之后,会自动加入敌人的掉落物中
* 几个 BUG 修改
VA脚本开工中...
偷窃脚本1.0 - 已完成
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
66
在线时间
434 小时
注册时间
2006-5-25
帖子
201
4
发表于 2012-2-7 17:12:01 | 只看该作者
本帖最后由 xmheart 于 2012-2-7 18:09 编辑

增加的功能几乎包括所有跟偷窃有关的方面了,最好能有范例看看。先顶一下。。。。。


刚试了一下脚本,会出现这个。。。。。。(不过我不是新建工程来测试的)

点评

已经更新  发表于 2012-2-7 21:33
回复 支持 反对

使用道具 举报

Lv2.观梦者

天仙

梦石
0
星屑
610
在线时间
184 小时
注册时间
2008-4-15
帖子
5023

贵宾

5
 楼主| 发表于 2012-2-8 12:26:09 | 只看该作者
已更新演示工程与截图
工程内大部分文字已经转成简体,部分就懒得转了

点评

是我的疏忽,其中一個方法少了一句,沒有測試到  发表于 2012-2-9 22:44
上边那个错误是怎么了,我没有在备注里面写上相关的东西有影响么?  发表于 2012-2-9 14:01
VA脚本开工中...
偷窃脚本1.0 - 已完成
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
59 小时
注册时间
2012-3-4
帖子
86
6
发表于 2012-3-5 11:36:53 | 只看该作者
好东西

评分

参与人数 1星屑 -40 收起 理由
Kimu -40

查看全部评分

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
72 小时
注册时间
2012-5-18
帖子
48
7
发表于 2012-5-31 14:47:29 | 只看该作者
给各位技术大师跪了,会自己写脚本真心厉害啊。
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
301
在线时间
573 小时
注册时间
2005-10-27
帖子
1164
8
发表于 2012-6-1 05:19:44 | 只看该作者
这个太牛了!为了下这个不得不注册了那个网盘
认真地猥琐,猥琐地认真
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
11 小时
注册时间
2013-8-23
帖子
21
9
发表于 2013-8-29 10:52:22 | 只看该作者
原来。。。你这里就有啊。。。表示压力好大啊。。。。。因为跟tseyik大大要了个。。。它给的是日文版本的。。。虽然看的懂一点点的啦。。。但是这个更方便快捷哇。。。。
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
48 小时
注册时间
2014-5-7
帖子
49
10
发表于 2014-5-7 19:15:45 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-4-24 01:14

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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