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

Project1

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

[已经解决] 怎么才能使有条件使用技能?

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
6 小时
注册时间
2012-6-28
帖子
9
跳转到指定楼层
1
发表于 2012-8-17 12:59:45 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

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

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

x
比如要使用技能A才能使用技能B,不然不能使用技能B。

Lv3.寻梦者

梦石
0
星屑
3583
在线时间
3065 小时
注册时间
2011-11-17
帖子
980
6
发表于 2012-8-18 13:57:15 | 只看该作者
  1. #==============================================================================
  2. # ■ Game_Battler (分割定义 3)
  3. #------------------------------------------------------------------------------
  4. #  处理战斗者的类。这个类作为 Game_Actor 类与 Game_Enemy 类的
  5. # 超级类来使用。
  6. #==============================================================================

  7. class Game_Battler
  8.   #--------------------------------------------------------------------------
  9.   # ● 可以使用特技的判定
  10.   #     skill_id : 特技 ID
  11.   #--------------------------------------------------------------------------
  12.   def skill_can_use?(skill_id)
  13.    
  14.     ###################################
  15.    
  16.     for i in [2, 3]######B技能数组
  17.    
  18.      if skill_id == i and not self.states.include?(1) #####没有状态1数组技能无法释放
  19.      return false
  20.    end
  21.     end
  22.    
  23.    
  24.     ###########################
  25.     # SP 不足的情况下不能使用
  26.     if $data_skills[skill_id].sp_cost > self.sp
  27.       return false
  28.     end
  29.     # 战斗不能的情况下不能使用
  30.     if dead?
  31.       return false
  32.     end
  33.     # 沉默状态的情况下、物理特技以外的特技不能使用
  34.     if $data_skills[skill_id].atk_f == 0 and self.restriction == 1
  35.       return false
  36.     end
  37.     # 获取可以使用的时机
  38.     occasion = $data_skills[skill_id].occasion
  39.     # 战斗中的情况下
  40.     if $game_temp.in_battle
  41.       # [平时] 或者是 [战斗中] 可以使用
  42.       return (occasion == 0 or occasion == 1)
  43.     # 不是战斗中的情况下
  44.     else
  45.       # [平时] 或者是 [菜单中] 可以使用
  46.       return (occasion == 0 or occasion == 2)
  47.     end
  48.   end
  49.   #--------------------------------------------------------------------------
  50.   # ● 应用通常攻击效果
  51.   #     attacker : 攻击者 (battler)
  52.   #--------------------------------------------------------------------------
  53.   def attack_effect(attacker)
  54.     # 清除会心一击标志
  55.     self.critical = false
  56.     # 第一命中判定
  57.     hit_result = (rand(100) < attacker.hit)
  58.     # 命中的情况下
  59.     if hit_result == true
  60.       # 计算基本伤害
  61.       atk = [attacker.atk - self.pdef / 2, 0].max
  62.       self.damage = atk * (20 + attacker.str) / 20
  63.       # 属性修正
  64.       self.damage *= elements_correct(attacker.element_set)
  65.       self.damage /= 100
  66.       # 伤害符号正确的情况下
  67.       if self.damage > 0
  68.         # 会心一击修正
  69.         if rand(100) < 4 * attacker.dex / self.agi
  70.           self.damage *= 2
  71.           self.critical = true
  72.         end
  73.         # 防御修正
  74.         if self.guarding?
  75.           self.damage /= 2
  76.         end
  77.       end
  78.       # 分散
  79.       if self.damage.abs > 0
  80.         amp = [self.damage.abs * 15 / 100, 1].max
  81.         self.damage += rand(amp+1) + rand(amp+1) - amp
  82.       end
  83.       # 第二命中判定
  84.       eva = 8 * self.agi / attacker.dex + self.eva
  85.       hit = self.damage < 0 ? 100 : 100 - eva
  86.       hit = self.cant_evade? ? 100 : hit
  87.       hit_result = (rand(100) < hit)
  88.     end
  89.     # 命中的情况下
  90.     if hit_result == true
  91.       # 状态冲击解除
  92.       remove_states_shock
  93.       # HP 的伤害计算
  94.       self.hp -= self.damage
  95.       # 状态变化
  96.       @state_changed = false
  97.       states_plus(attacker.plus_state_set)
  98.       states_minus(attacker.minus_state_set)
  99.     # Miss 的情况下
  100.     else
  101.       # 伤害设置为 "Miss"
  102.       self.damage = "Miss"
  103.       # 清除会心一击标志
  104.       self.critical = false
  105.     end
  106.     # 过程结束
  107.     return true
  108.   end
  109.   #--------------------------------------------------------------------------
  110.   # ● 应用特技效果
  111.   #     user  : 特技的使用者 (battler)
  112.   #     skill : 特技
  113.   #--------------------------------------------------------------------------
  114.   def skill_effect(user, skill)
  115.     # 清除会心一击标志
  116.     self.critical = false
  117.     # 特技的效果范围是 HP 1 以上的己方、自己的 HP 为 0、
  118.     # 或者特技的效果范围是 HP 0 的己方、自己的 HP 为 1 以上的情况下
  119.     if ((skill.scope == 3 or skill.scope == 4) and self.hp == 0) or
  120.        ((skill.scope == 5 or skill.scope == 6) and self.hp >= 1)
  121.       # 过程结束
  122.       return false
  123.     end
  124.     # 清除有效标志
  125.     effective = false
  126.     # 公共事件 ID 是有效的情况下,设置为有效标志
  127.     effective |= skill.common_event_id > 0
  128.     # 第一命中判定
  129.     hit = skill.hit
  130.     if skill.atk_f > 0
  131.       hit *= user.hit / 100
  132.     end
  133.     hit_result = (rand(100) < hit)
  134.     # 不确定的特技的情况下设置为有效标志
  135.     effective |= hit < 100
  136.     # 命中的情况下
  137.     if hit_result == true
  138.       
  139.       
  140.       #################################A技能ID为1 攻击敌人的同时给自己附加状态1
  141.         if skill.id == 1
  142.       user.add_state(1, force = false)
  143.     end
  144.       
  145.     #################################################
  146.       
  147.       
  148.       
  149.       
  150.       
  151.       
  152.       
  153.       # 计算威力
  154.       power = skill.power + user.atk * skill.atk_f / 100
  155.       if power > 0
  156.         power -= self.pdef * skill.pdef_f / 200
  157.         power -= self.mdef * skill.mdef_f / 200
  158.         power = [power, 0].max
  159.       end
  160.       # 计算倍率
  161.       rate = 20
  162.       rate += (user.str * skill.str_f / 100)
  163.       rate += (user.dex * skill.dex_f / 100)
  164.       rate += (user.agi * skill.agi_f / 100)
  165.       rate += (user.int * skill.int_f / 100)
  166.       # 计算基本伤害
  167.       self.damage = power * rate / 20
  168.       # 属性修正
  169.       self.damage *= elements_correct(skill.element_set)
  170.       self.damage /= 100
  171.       # 伤害符号正确的情况下
  172.       if self.damage > 0
  173.         # 防御修正
  174.         if self.guarding?
  175.           self.damage /= 2
  176.         end
  177.       end
  178.       # 分散
  179.       if skill.variance > 0 and self.damage.abs > 0
  180.         amp = [self.damage.abs * skill.variance / 100, 1].max
  181.         self.damage += rand(amp+1) + rand(amp+1) - amp
  182.       end
  183.       # 第二命中判定
  184.       eva = 8 * self.agi / user.dex + self.eva
  185.       hit = self.damage < 0 ? 100 : 100 - eva * skill.eva_f / 100
  186.       hit = self.cant_evade? ? 100 : hit
  187.       hit_result = (rand(100) < hit)
  188.       # 不确定的特技的情况下设置为有效标志
  189.       effective |= hit < 100
  190.     end
  191.     # 命中的情况下
  192.     if hit_result == true
  193.       # 威力 0 以外的物理攻击的情况下
  194.       if skill.power != 0 and skill.atk_f > 0
  195.         # 状态冲击解除
  196.         remove_states_shock
  197.         # 设置有效标志
  198.         effective = true
  199.       end
  200.       # HP 的伤害减法运算
  201.       last_hp = self.hp
  202.       self.hp -= self.damage
  203.       effective |= self.hp != last_hp
  204.       # 状态变化
  205.       @state_changed = false
  206.       effective |= states_plus(skill.plus_state_set)
  207.       effective |= states_minus(skill.minus_state_set)
  208.       # 威力为 0 的场合
  209.       if skill.power == 0
  210.         # 伤害设置为空的字串
  211.         self.damage = ""
  212.         # 状态没有变化的情况下
  213.         unless @state_changed
  214.           # 伤害设置为 "Miss"
  215.           self.damage = "Miss"
  216.         end
  217.       end
  218.     # Miss 的情况下
  219.     else
  220.       # 伤害设置为 "Miss"
  221.       self.damage = "Miss"
  222.     end
  223.     # 不在战斗中的情况下
  224.     unless $game_temp.in_battle
  225.       # 伤害设置为 nil
  226.       self.damage = nil
  227.     end
  228.     # 过程结束
  229.     return effective
  230.   end
  231.   #--------------------------------------------------------------------------
  232.   # ● 应用物品效果
  233.   #     item : 物品
  234.   #--------------------------------------------------------------------------
  235.   def item_effect(item)
  236.     # 清除会心一击标志
  237.     self.critical = false
  238.     # 物品的效果范围是 HP 1 以上的己方、自己的 HP 为 0、
  239.     # 或者物品的效果范围是 HP 0 的己方、自己的 HP 为 1 以上的情况下
  240.     if ((item.scope == 3 or item.scope == 4) and self.hp == 0) or
  241.        ((item.scope == 5 or item.scope == 6) and self.hp >= 1)
  242.       # 过程结束
  243.       return false
  244.     end
  245.     # 清除有效标志
  246.     effective = false
  247.     # 公共事件 ID 是有效的情况下,设置为有效标志
  248.     effective |= item.common_event_id > 0
  249.     # 命中判定
  250.     hit_result = (rand(100) < item.hit)
  251.     # 不确定的特技的情况下设置为有效标志
  252.     effective |= item.hit < 100
  253.     # 命中的情况
  254.     if hit_result == true
  255.       # 计算回复量
  256.       recover_hp = maxhp * item.recover_hp_rate / 100 + item.recover_hp
  257.       recover_sp = maxsp * item.recover_sp_rate / 100 + item.recover_sp
  258.       if recover_hp < 0
  259.         recover_hp += self.pdef * item.pdef_f / 20
  260.         recover_hp += self.mdef * item.mdef_f / 20
  261.         recover_hp = [recover_hp, 0].min
  262.       end
  263.       # 属性修正
  264.       recover_hp *= elements_correct(item.element_set)
  265.       recover_hp /= 100
  266.       recover_sp *= elements_correct(item.element_set)
  267.       recover_sp /= 100
  268.       # 分散
  269.       if item.variance > 0 and recover_hp.abs > 0
  270.         amp = [recover_hp.abs * item.variance / 100, 1].max
  271.         recover_hp += rand(amp+1) + rand(amp+1) - amp
  272.       end
  273.       if item.variance > 0 and recover_sp.abs > 0
  274.         amp = [recover_sp.abs * item.variance / 100, 1].max
  275.         recover_sp += rand(amp+1) + rand(amp+1) - amp
  276.       end
  277.       # 回复量符号为负的情况下
  278.       if recover_hp < 0
  279.         # 防御修正
  280.         if self.guarding?
  281.           recover_hp /= 2
  282.         end
  283.       end
  284.       # HP 回复量符号的反转、设置伤害值
  285.       self.damage = -recover_hp
  286.       # HP 以及 SP 的回复
  287.       last_hp = self.hp
  288.       last_sp = self.sp
  289.       self.hp += recover_hp
  290.       self.sp += recover_sp
  291.       effective |= self.hp != last_hp
  292.       effective |= self.sp != last_sp
  293.       # 状态变化
  294.       @state_changed = false
  295.       effective |= states_plus(item.plus_state_set)
  296.       effective |= states_minus(item.minus_state_set)
  297.       # 能力上升值有效的情况下
  298.       if item.parameter_type > 0 and item.parameter_points != 0
  299.         # 能力值的分支
  300.         case item.parameter_type
  301.         when 1  # MaxHP
  302.           @maxhp_plus += item.parameter_points
  303.         when 2  # MaxSP
  304.           @maxsp_plus += item.parameter_points
  305.         when 3  # 力量
  306.           @str_plus += item.parameter_points
  307.         when 4  # 灵巧
  308.           @dex_plus += item.parameter_points
  309.         when 5  # 速度
  310.           @agi_plus += item.parameter_points
  311.         when 6  # 魔力
  312.           @int_plus += item.parameter_points
  313.         end
  314.         # 设置有效标志
  315.         effective = true
  316.       end
  317.       # HP 回复率与回复量为 0 的情况下
  318.       if item.recover_hp_rate == 0 and item.recover_hp == 0
  319.         # 设置伤害为空的字符串
  320.         self.damage = ""
  321.         # SP 回复率与回复量为 0、能力上升值无效的情况下
  322.         if item.recover_sp_rate == 0 and item.recover_sp == 0 and
  323.            (item.parameter_type == 0 or item.parameter_points == 0)
  324.           # 状态没有变化的情况下
  325.           unless @state_changed
  326.             # 伤害设置为 "Miss"
  327.             self.damage = "Miss"
  328.           end
  329.         end
  330.       end
  331.     # Miss 的情况下
  332.     else
  333.       # 伤害设置为 "Miss"
  334.       self.damage = "Miss"
  335.     end
  336.     # 不在战斗中的情况下
  337.     unless $game_temp.in_battle
  338.       # 伤害设置为 nil
  339.       self.damage = nil
  340.     end
  341.     # 过程结束
  342.     return effective
  343.   end
  344.   #--------------------------------------------------------------------------
  345.   # ● 应用连续伤害效果
  346.   #--------------------------------------------------------------------------
  347.   def slip_damage_effect
  348.     # 设置伤害
  349.     self.damage = self.maxhp / 10
  350.     # 分散
  351.     if self.damage.abs > 0
  352.       amp = [self.damage.abs * 15 / 100, 1].max
  353.       self.damage += rand(amp+1) + rand(amp+1) - amp
  354.     end
  355.     # HP 的伤害减法运算
  356.     self.hp -= self.damage
  357.     # 过程结束
  358.     return true
  359.   end
  360.   #--------------------------------------------------------------------------
  361.   # ● 属性修正计算
  362.   #     element_set : 属性
  363.   #--------------------------------------------------------------------------
  364.   def elements_correct(element_set)
  365.     # 无属性的情况
  366.     if element_set == []
  367.       # 返回 100
  368.       return 100
  369.     end
  370.     # 在被赋予的属性中返回最弱的
  371.     # ※过程 element_rate 是、本类以及继承的 Game_Actor
  372.     #   和 Game_Enemy 类的定义
  373.     weakest = -100
  374.     for i in element_set
  375.       weakest = [weakest, self.element_rate(i)].max
  376.     end
  377.     return weakest
  378.   end
  379. end
复制代码

点评

Game_Battler 3 里 自己位置 技能ID 状态ID自己改 脚本效果 A技能攻击敌人的同时 给角色附加状态X B技能如果没有状态X就无法释放 就是先放A技能后才能放B  发表于 2012-8-18 14:00

评分

参与人数 1星屑 +200 收起 理由
hcm + 200 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
6 小时
注册时间
2012-6-28
帖子
9
5
 楼主| 发表于 2012-8-18 13:01:50 | 只看该作者
yagami 发表于 2012-8-17 13:08
首先 使用A技能时 给角色 附加个状态X
然后B技能的使用条件是角色必须有状态X这段添加到可以使用特技的判定 ...

小弟新手。。看得出来吧。。脚本不是很会用,麻烦教一下,谢谢{:2_249:}
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
6 小时
注册时间
2012-6-28
帖子
9
4
 楼主| 发表于 2012-8-17 17:18:38 | 只看该作者
yagami 发表于 2012-8-17 13:08
首先 使用A技能时 给角色 附加个状态X
然后B技能的使用条件是角色必须有状态X这段添加到可以使用特技的判定 ...

其实我是想做到像佐助那样必须先使用豪火龙之术后才能使用麒麟,两个都是攻击技能。

点评

你仔细理解下 我上面的意思 2个也都是攻击技能 A技能攻击敌人的同时给自己加个状态 B技能就靠这状态才能发动 换句话说 没用过A技能B技能用不了  发表于 2012-8-17 18:18
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3583
在线时间
3065 小时
注册时间
2011-11-17
帖子
980
3
发表于 2012-8-17 13:08:34 | 只看该作者
首先 使用A技能时 给角色 附加个状态X
然后B技能的使用条件是角色必须有状态X
  1. for i in [2, 3]######技能数组
  2.    
  3.      if skill_id == i and not self.states.include?(1) #####没有状态1数组技能无法释放
  4.      #状态不存在时,技能无法使用
  5.      return false
  6.    end
  7.     end
复制代码
这段添加到可以使用特技的判定
  1.   if skill.id == 1
  2.       user.add_state(1, force = false)
  3.     end
复制代码
这段添加到应用特技效果 命中下面
2处都在Game_Battler里找

点评

状态要勾选不能抵抗  发表于 2012-8-17 13:10
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
112 小时
注册时间
2011-7-13
帖子
71
2
发表于 2012-8-17 13:08:11 手机端发表。 | 只看该作者
公共事件中加入条件分歧,在技能或战斗中使用公共事件 
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-12-3 04:54

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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