查看: 3098|回复: 11

[已经解决] 请问如何使用公共事件确定技能的使用者?

[复制链接]
梦石
0
星屑
50
在线时间
18 小时
注册时间
2015-5-13
回帖
27
发表于 2017-6-16 22:51:35 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 guoxiaomi 于 2017-6-16 23:52 编辑

想要达到的效果:角色使用“嘲讽”技能,对象敌人下回合只会攻击该角色(游戏中不只一个角色可以使用“嘲讽”技能)

搜到了叶子的嘲讽脚本,是通过创建状态、技能使用者和对象敌人都获得同一状态实现的,使用者需要用公共事件来加上同一个状态。举个栗子:技能设置为:敌人附加20号状态,公共事件是角色附加20号状态。

可是不明白该怎么判断使用技能的角色。请问这个公共事件该怎么设置呢?

或者有其他方法可以达到嘲讽吗?(应该没有比这个脚本更简单的方法了吧)

(花了一个小时实在是搜索无果才发帖提问的……头疼)

脚本如下:
[pre lang="ruby"]# ============================================================================
# 嘲讽脚本 v1.1 by 叶子
# 特别鸣谢:
# 柳柳 (是柳柳解决了最关键的技术问题,叶子我充其量只是个策划者和打字员)
# SailCat (从SailCat的脚本中学到不少RGSS知识,只是叶子天生愚钝,还是菜鸟一个)
# ......
# ============================================================================
#脚本用途:
#实现嘲讽效果(废话)
#通过一个极其简单的判断,让怪物固定攻击某一角色
#区别于事件的强制行动,怪物该用技能时还是会用技能
#由于判断极其简单,所以可以自己将这个判断替换Scene_Battle 4中相应内容
#原理:
#怪物中了特定的状态后(默认20到23号状态),
#自动寻找与它有相同状态(20到23号)的角色,
#找到后就以该角色为目标,找不到就照原样行动
#脚本使用说明:
#方法一.直接复制后插入到Main前面(方便快速,懒人最爱)
#方法二.将脚本中标明的更改内容复制,替换Scene_Battle 4中相应内容(可能可以减少冲突,推荐)
#1.创建4个状态,默认分别为20至23号(要改的话改相应内容...只有两处)
#2.4个状态设置成两两互斥(例如20号状态在右边状态栏里的21,22,23号状态全部设置成“-”)
#3.设置n个回合xx%解除(注意:只有被嘲讽者和嘲讽者同时存在这个状态时,嘲讽才生效)
#4.带有嘲讽效果的特技,数据库里设定附加状态21到24号状态其中一个,带公共事件:给使用者加上同一个状态
#(公共事件不太好判断谁是使用者,而Sailcat的“23种战斗特效的公共事件版”的脚本就可以判断,建议使用)
# ============================================================================
class Scene_Battle
#--------------------------------------------------------------------------
# ● 生成基本行动结果
#--------------------------------------------------------------------------
def make_basic_action_result
   # 攻击的情况下
   if @active_battler.current_action.basic == 0
     # 设置攻击 ID
     @animation1_id = @active_battler.animation1_id
     @animation2_id = @active_battler.animation2_id
     # 行动方的战斗者是敌人的情况下
     if @active_battler.is_a?(Game_Enemy)
       if @active_battler.restriction == 3
         target = $game_troop.random_target_enemy
       elsif @active_battler.restriction == 2
          target = $game_party.random_target_actor
       else
         #=====以下更改内容=========
         target_got = false
         for a in $game_party.actors
           if (@active_battler.state?(20) and a.state?(20)) \
             or (@active_battler.state?(21) and a.state?(21)) \
             or (@active_battler.state?(22) and a.state?(22)) \
             or (@active_battler.state?(23) and a.state?(23))
               target = a
               target_got = true
           end
         end
         unless target_got
             index = @active_battler.current_action.target_index
             target = $game_party.smooth_target_actor(index) #原有内容
         end
        #=====以上更改内容=========
      end
     end
     # 行动方的战斗者是角色的情况下
     if @active_battler.is_a?(Game_Actor)
       if @active_battler.restriction == 3
         target = $game_party.random_target_actor
       elsif @active_battler.restriction == 2
         target = $game_troop.random_target_enemy
       else
         index = @active_battler.current_action.target_index
         target = $game_troop.smooth_target_enemy(index)
       end
     end
     # 设置对像方的战斗者序列
     @target_battlers = [target]
     # 应用通常攻击效果
     for target in @target_battlers
       target.attack_effect(@active_battler)
     end
     return
   end
   # 防御的情况下
   if @active_battler.current_action.basic == 1
     # 帮助窗口显示"防御"
     @help_window.set_text($data_system.words.guard, 1)
     return
   end
   # 逃跑的情况下
   if @active_battler.is_a?(Game_Enemy) and
      @active_battler.current_action.basic == 2
     #  帮助窗口显示"逃跑"
     @help_window.set_text("逃跑", 1)
     # 逃跑
     @active_battler.escape
     return
   end
   # 什么也不做的情况下
   if @active_battler.current_action.basic == 3
     # 清除强制行动对像的战斗者
     $game_temp.forcing_battler = nil
     # 移至步骤 1
     @phase4_step = 1
     return
   end
end
#--------------------------------------------------------------------------
# ● 设置物品或特技对像方的战斗者
#     scope : 特技或者是物品的范围
#--------------------------------------------------------------------------
def set_target_battlers(scope)
   # 行动方的战斗者是敌人的情况下
   if @active_battler.is_a?(Game_Enemy)
     # 效果范围分支
     case scope
     when 1  # 敌单体
       index = @active_battler.current_action.target_index
       #==以下更改内容===============
         target_got = false
         for a in $game_party.actors
           if (@active_battler.state?(20) and a.state?(20)) \
             or (@active_battler.state?(21) and a.state?(21)) \
             or (@active_battler.state?(22) and a.state?(22)) \
             or (@active_battler.state?(23) and a.state?(23))
               @target_battlers.push(a)
               target_got = true
           end
         end
         unless target_got
         @target_battlers.push($game_party.smooth_target_actor(index)) #原有内容
         end
      #==以上更改内容===============
     when 2  # 敌全体
       for actor in $game_party.actors
         if actor.exist?
           @target_battlers.push(actor)
         end
       end
     when 3  # 我方单体
       index = @active_battler.current_action.target_index
       @target_battlers.push($game_troop.smooth_target_enemy(index))
     when 4  # 我方全体
       for enemy in $game_troop.enemies
         if enemy.exist?
           @target_battlers.push(enemy)
         end
       end
     when 5  # 我方单体 (HP 0)  
       index = @active_battler.current_action.target_index
       enemy = $game_troop.enemies[index]
       if enemy != nil and enemy.hp0?
         @target_battlers.push(enemy)
       end
     when 6  # 我方全体 (HP 0)  
       for enemy in $game_troop.enemies
         if enemy != nil and enemy.hp0?
           @target_battlers.push(enemy)
         end
       end
     when 7  # 使用者
       @target_battlers.push(@active_battler)
     end
   end
   # 行动方的战斗者是角色的情况下
   if @active_battler.is_a?(Game_Actor)
     # 效果范围分支
     case scope
     when 1  # 敌单体
       index = @active_battler.current_action.target_index
       @target_battlers.push($game_troop.smooth_target_enemy(index))
     when 2  # 敌全体
       for enemy in $game_troop.enemies
         if enemy.exist?
           @target_battlers.push(enemy)
         end
       end
     when 3  # 我方单体
       index = @active_battler.current_action.target_index
       @target_battlers.push($game_party.smooth_target_actor(index))
     when 4  # 我方全体
       for actor in $game_party.actors
         if actor.exist?
           @target_battlers.push(actor)
         end
       end
     when 5  # 我方单体 (HP 0)  
       index = @active_battler.current_action.target_index
       actor = $game_party.actors[index]
       if actor != nil and actor.hp0?
         @target_battlers.push(actor)
       end
     when 6  # 我方全体 (HP 0)  
       for actor in $game_party.actors
         if actor != nil and actor.hp0?
           @target_battlers.push(actor)
         end
       end
     when 7  # 使用者
       @target_battlers.push(@active_battler)
     end
   end
end
end[/pre]
梦石
1
星屑
24088
在线时间
3339 小时
注册时间
2011-7-8
回帖
3862

开拓者

发表于 2017-6-16 23:55:12 | 显示全部楼层
获取当前行动中的角色,和目标数组:
脚本添加:
  1. class Scene_Battle  
  2.   attr_reader :active_battler
  3.   attr_reader :target_battlers
  4. end
复制代码

然后使用 $scene.active_batter 和 $scene.target_battlers 获得对应的 Game_Battler 对象

评分

参与人数 1星屑 +200 收起 理由
RyanBern + 200 6

查看全部评分

熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复 1 0

使用道具 举报

梦石
0
星屑
12161
在线时间
4435 小时
注册时间
2014-4-11
回帖
5616

开拓者

发表于 2017-6-17 08:54:37 | 显示全部楼层
用脚本的话比较好实现。在角色建立一个变量。然后使用嘲讽后,被嘲讽者的这个变量赋值嘲讽者。被其他人嘲讽,这个变量就重新复制其他人。嘲讽消失,这个变量就赋值0
通过判断这个变量来判断是否被嘲讽,以及被谁嘲讽
回复

使用道具 举报

梦石
0
星屑
50
在线时间
18 小时
注册时间
2015-5-13
回帖
27
 楼主| 发表于 2017-6-17 09:42:49 | 显示全部楼层
guoxiaomi 发表于 2017-6-16 23:55
获取当前行动中的角色,和目标数组:
脚本添加:

请问具体应该怎么用呢……脚本盲……
回复

使用道具 举报

梦石
0
星屑
50
在线时间
18 小时
注册时间
2015-5-13
回帖
27
 楼主| 发表于 2017-6-17 09:47:00 | 显示全部楼层
yang1zhi 发表于 2017-6-17 08:54
用脚本的话比较好实现。在角色建立一个变量。然后使用嘲讽后,被嘲讽者的这个变量赋值嘲讽者。被其他人嘲讽 ...

{:2_263:}不明白该怎么做……我脚本盲……哭唧唧
回复

使用道具 举报

梦石
0
星屑
1442
在线时间
328 小时
注册时间
2016-4-4
回帖
126

开拓者

发表于 2017-6-19 00:04:35 | 显示全部楼层
775933591 发表于 2017-6-17 09:47
不明白该怎么做……我脚本盲……哭唧唧
获取当前行动中的角色,和目标数组:
脚本添加:
class Scene_Battle  
  attr_reader :active_battler
  attr_reader :target_battlers
end
复制代码

然后使用 $scene.active_batter 和 $scene.target_battlers 获得对应的 Game_Battler 对象

将此脚本放至main前  
然后 在公共事件中写判定时
条件分歧-页面4-脚本:$game_party.actors[0] == $scene.active_buttler 来获取使用者

点评

你不要瞎解释……  发表于 2017-6-19 08:20
回复

使用道具 举报

梦石
0
星屑
50
在线时间
28 小时
注册时间
2015-5-22
回帖
11
发表于 2017-6-19 06:33:51 | 显示全部楼层
回复

使用道具 举报

梦石
1
星屑
24088
在线时间
3339 小时
注册时间
2011-7-8
回帖
3862

开拓者

发表于 2017-6-19 08:22:51 | 显示全部楼层
本帖最后由 guoxiaomi 于 2017-6-21 00:40 编辑

在main前插入脚本,公共事件里,用$scene.active_battler.add_state(20)

忘了添加状态是不是 add_state了
熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复

使用道具 举报

梦石
0
星屑
50
在线时间
18 小时
注册时间
2015-5-13
回帖
27
 楼主| 发表于 2017-6-20 20:38:38 | 显示全部楼层
guoxiaomi 发表于 2017-6-19 08:22
在main前插入脚本,公共事件里,用$scene.active_batter.add_state(20)

忘了添加状态是不是 add_state了 ...

昨天有事没用电脑;试了一下,把脚本插入main前之后,技能设置成给敌人附加20号状态、同时使用公共事件,公共事件是脚本$scene.active_batter.add_state(20)
测试时,使用嘲讽技能后报错
“执行脚本时发生 NoMethodError
undefined method 'active_batter'for #<Scene_Battle:0x2987ca0>”

请问该怎么办呢……
我嘲讽脚本是直接插入main前的,是不是应该用第一种用法,就是“将脚本中标明的更改内容复制,替换Scene_Battle 4中相应内容”,这样的(但是不知道对应的地方是指哪里……)

点评

我的锅,是battler  发表于 2017-6-20 22:09
回复

使用道具 举报

梦石
0
星屑
50
在线时间
18 小时
注册时间
2015-5-13
回帖
27
 楼主| 发表于 2017-6-20 22:36:50 | 显示全部楼层
guoxiaomi 发表于 2017-6-19 08:22
在main前插入脚本,公共事件里,用$scene.active_batter.add_state(20)

忘了添加状态是不是 add_state了 ...

哈哈哈哈哈哈在脚本搜索batter半天,原来是在公共事件里打错了
问题已解决
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部