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

Project1

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

[已经解决] 【脚本求助】简单的求一个“必中”属性的脚本。

[复制链接]

Lv3.寻梦者

梦石
0
星屑
1593
在线时间
1456 小时
注册时间
2010-10-22
帖子
1017
1
发表于 2012-9-17 10:51:03 | 显示全部楼层
是指设置了这个属性的职业/敌人/状态,其攻击、特技命中率100%吗?
【2022.06.03】原本以为已经不可能再找回来的东西重新找回来了,原本一直念念不忘的坑终于再一次拿起铲子了。一别竟近10年,你好,我的世界我的梦。
回复

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1593
在线时间
1456 小时
注册时间
2010-10-22
帖子
1017
2
发表于 2012-9-17 12:36:00 | 显示全部楼层
本帖最后由 kangxi0109 于 2012-9-17 12:37 编辑
闻人翎 发表于 2012-9-17 12:30
就是说。一个是技能属性【必中】。勾选了此属性的技能必定命中。
一个是角色状态【必中】。附加了此状态 ...


基本上有头绪了...敌人需要吗?
下午考试,今晚应该就可以交货了。
不过,不是独立脚本,事实上这个设置只要在原脚本里加些东西就可以了。
【2022.06.03】原本以为已经不可能再找回来的东西重新找回来了,原本一直念念不忘的坑终于再一次拿起铲子了。一别竟近10年,你好,我的世界我的梦。
回复

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1593
在线时间
1456 小时
注册时间
2010-10-22
帖子
1017
3
发表于 2012-9-17 13:24:35 | 显示全部楼层
闻人翎 发表于 2012-9-17 12:41
敌人的技能附加【必中】属性或者附加了【必中状态】自然也会必中啊。。。。。今晚静等大神的高作。
...

比想象中的简单,在工程的Game_Battler 3里,分普通攻击和特技两个部分。
原理吗...很简单,就是在战斗中,判定是否命中之后,额外添加一个条件判断,无论前面的判定是否命中【三个凡是】:凡是攻击者(角色)的职业是属于设置了“必中”属性的职业,强制命中;凡是攻击者(敌人)的属性设置中设置了“必中”属性的,强制命中;凡是状态栏中带有设置了“必中”属性的状态,强制命中...这样子就可以直接无视闪避率为100%的敌人。
关于工程:
1.幽灵设置为“必中”,回避率100%
2.战士设置为“必中”
另:“必中”的属性需要设置为A才会生效(状态除外)。
教程-任务.zip (231.34 KB, 下载次数: 140)

点评

这个范本第一次下载成功了,显示压缩文件被破坏。之后再次下载就下载不下来了。请修复。  发表于 2012-9-17 22:45
PS.本人不是大神,是半个新手。  发表于 2012-9-17 13:26
【2022.06.03】原本以为已经不可能再找回来的东西重新找回来了,原本一直念念不忘的坑终于再一次拿起铲子了。一别竟近10年,你好,我的世界我的梦。
回复

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1593
在线时间
1456 小时
注册时间
2010-10-22
帖子
1017
4
发表于 2012-9-17 23:51:30 | 显示全部楼层
闻人翎 发表于 2012-9-17 12:41
敌人的技能附加【必中】属性或者附加了【必中状态】自然也会必中啊。。。。。今晚静等大神的高作。
...

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

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1593
在线时间
1456 小时
注册时间
2010-10-22
帖子
1017
5
发表于 2012-9-18 23:30:47 | 显示全部楼层
本帖最后由 kangxi0109 于 2012-9-19 14:09 编辑
闻人翎 发表于 2012-9-18 22:50
我够了,怎么测试都是有冲突。
给你我的游戏里面的脚本。你在里面添加那个技能设置必中和状态设置必中的 ...


发上来的脚本本身就有错误...end的问题...建议改脚本的时候要步步为营步步检查...{:2_258:}
其中

  1.     # 过程结束
  2.     return true
  3.   end
  4.     # HP 的伤害减法运算
  5.       self.hp -= self.damage
  6.     end<这个错了,要注释掉=_=
  7.     if self.state?(153) #风毒   
  8.       # 设置伤害
  9.       self.damage = self.hp / 4
  10.       # HP 的伤害减法运算
  11.       self.hp -= self.damage
  12.     end
复制代码
除了这个还有别的,你自己找一下吧...{:2_270:}
技能的话,是我疏忽了,将第二段改为下面的样子吧...

  1.     #===================================添加↓
  2.     #攻击方为角色且职业属性20号为A的场合
  3.     if user.is_a?(Game_Actor) && $data_classes[user.class_id].element_ranks[20] == 1
  4.       hit_result = true #命中开关打开
  5.       #攻击方为敌人且属性20号为A的场合
  6.     elsif user.is_a?(Game_Enemy) && $data_enemies[user.id].element_ranks[20] == 1
  7.       hit_result = true #命中开关打开
  8.       #状态不为空
  9.     elsif user.states.size != 0
  10.       for i in 0 ... user.states.size
  11.       #其包含的状态中存在设置有20号属性的状态的场合
  12.         if $data_states[user.states[i]].guard_element_set.include?(20)
  13.           hit_result = true #命中开关打开
  14.           break #直接中断循环
  15.         end
  16.       end
  17.       #如果技能属性中带有20号属性的场合
  18.     elsif $data_skills[skill.id].element_set.include?(20)
  19.       hit_result = true #命中开关打开
  20.     end
  21.     #===================================添加↑
复制代码
另:这些脚本都是在独立工程中测试通过了的,我自己的工程也有大量类似的设置...因此建议楼主另外建一个独立工程测试看看。

评分

参与人数 1梦石 +2 收起 理由
hcm + 2 认可答案

查看全部评分

【2022.06.03】原本以为已经不可能再找回来的东西重新找回来了,原本一直念念不忘的坑终于再一次拿起铲子了。一别竟近10年,你好,我的世界我的梦。
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-5-16 07:33

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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