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

Project1

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

[已经解决] 怎样制作装备某个防具后使用特技减少消耗SP值

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
115 小时
注册时间
2010-5-3
帖子
346
跳转到指定楼层
1
发表于 2010-10-1 20:04:37 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

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

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

x
如题,也就是装备上例如一个饰品以后,该角色使用所有特技消耗的SP减少一定百分比,脱下装备后复原,也是类似仙剑里面的那些香袋之类的物品,谢谢大家

Lv1.梦旅人

梦石
0
星屑
50
在线时间
37 小时
注册时间
2008-6-13
帖子
99
2
发表于 2010-10-4 20:58:00 | 只看该作者
本帖最后由 lxczzzcxl 于 2010-10-5 10:00 编辑

(以上已去除)
主要内容是这段:

  1.     jms = 1.0
  2.     $scis.each do |scn|
  3.       if state?(scn)
  4.         jms = jms * (100 - $scjm[scn]) / 100
  5.       end
  6.     end     
复制代码
所以两个200%减免就等于啥都没有……
(1.0*(100-200)/100=-1.0;
-1.0*(100-200)/100=1.0)
可以改一下算法……

  1.     jms = 1.0
  2.     $scis.each do |scn|
  3.       if state?(scn)
  4.         jms = jms - ($scjm[scn] / 100)
  5.       end
  6.     end     
复制代码
在这种情况下 两个200%等于400%
(1.0-200/100-200/100=-3.0)

整合两种模式
  1. $scjm_mode = 2
  2. # 模式 1 乘法计算
  3. # 模式 2 加法计算
  4. # 真是够傻瓜化了……

  5. $scjm = {
  6.   17 => 20 ,
  7.   18 => 100 ,
  8.   19 => 200 ,
  9.   20 => 200}
  10. # 17 号状态 20 %减免
  11. # 18 号状态 不耗魔
  12. # 19 20号状态 笑而不语
  13. # ......
  14. $scis = [17, 18, 19, 20]
  15. # 17, 18, 19, 20 号状态带有减免效果
  16. # 别嫌烦! 我是脚本白痴!

  17. #==============================================================================
  18. # ■ Game_Battler 打酱油定义
  19. #------------------------------------------------------------------------------
  20. #  处理战斗者的类。这个类作为 Game_Actor 类与 Game_Enemy 类的
  21. # 超级类来使用。
  22. #==============================================================================
  23. class Game_Battler
  24.   def skill_can_use?(skill_id)
  25.     jms = 1.0
  26.     if $scjm_mode = 1
  27.       $scis.each do |scn|
  28.         if state?(scn)
  29.           jms = jms * (100 - $scjm[scn]) / 100
  30.         end
  31.       end
  32.     else
  33.       $scis.each do |scn|
  34.         if state?(scn)
  35.           jms = jms - ($scjm[scn] / 100)
  36.         end
  37.       end  
  38.     end
  39.     # SP 不足的情况下不能使用
  40.     if ($data_skills[skill_id].sp_cost * jms).to_i > self.sp
  41.       return false
  42.     end
  43.     # 战斗不能的情况下不能使用
  44.     if dead?
  45.       return false
  46.     end
  47.     # 沉默状态的情况下、物理特技以外的特技不能使用
  48.     if $data_skills[skill_id].atk_f == 0 and self.restriction == 1
  49.       return false
  50.     end
  51.     # 获取可以使用的时机
  52.     occasion = $data_skills[skill_id].occasion
  53.     # 战斗中的情况下
  54.     if $game_temp.in_battle
  55.       # [平时] 或者是 [战斗中] 可以使用
  56.       return (occasion == 0 or occasion == 1)
  57.     # 不是战斗中的情况下
  58.     else
  59.       # [平时] 或者是 [菜单中] 可以使用
  60.       return (occasion == 0 or occasion == 2)
  61.     end
  62.   end
  63. end

  64. #==============================================================================
  65. # ■ Scene_Battle 打酱油定义
  66. #------------------------------------------------------------------------------
  67. #  处理战斗画面的类。
  68. #==============================================================================

  69. class Scene_Battle
  70.   def make_skill_action_result
  71.     # 获取特技
  72.     @skill = $data_skills[@active_battler.current_action.skill_id]
  73.     # 如果不是强制行动
  74.     unless @active_battler.current_action.forcing
  75.       # 因为 SP 耗尽而无法使用的情况下
  76.       unless @active_battler.skill_can_use?(@skill.id)
  77.         # 清除强制行动对像的战斗者
  78.         $game_temp.forcing_battler = nil
  79.         # 移至步骤 1
  80.         @phase4_step = 1
  81.         return
  82.       end
  83.     end
  84.     jms = 1.0
  85.     if $scjm_mode = 1
  86.       $scis.each do |scn|
  87.         if @active_battler.state?(scn)
  88.           jms = jms * (100 - $scjm[scn]) / 100
  89.         end
  90.       end
  91.     else
  92.       $scis.each do |scn|
  93.         if @active_battler.state?(scn)
  94.           jms = jms - ($scjm[scn] / 100)
  95.         end
  96.       end  
  97.     end
  98.     # 消耗 SP
  99.     @active_battler.sp -= (@skill.sp_cost * jms).to_i
  100.     # 刷新状态窗口
  101.     @status_window.refresh
  102.     # 在帮助窗口显示特技名
  103.     @help_window.set_text(@skill.name, 1)
  104.     # 设置动画 ID
  105.     @animation1_id = @skill.animation1_id
  106.     @animation2_id = @skill.animation2_id
  107.     # 设置公共事件 ID
  108.     @common_event_id = @skill.common_event_id
  109.     # 设置对像侧战斗者
  110.     set_target_battlers(@skill.scope)
  111.     # 应用特技效果
  112.     for target in @target_battlers
  113.       target.skill_effect(@active_battler, @skill)
  114.     end
  115.   end
  116. end

  117. #==============================================================================
  118. # ■ Window_Skill 打酱油定义
  119. #------------------------------------------------------------------------------
  120. #  特技画面、战斗画面、显示可以使用的特技浏览的窗口。
  121. #==============================================================================

  122. class Window_Skill < Window_Selectable
  123.   def draw_item(index)
  124.     skill = @data[index]
  125.     if @actor.skill_can_use?(skill.id)
  126.       self.contents.font.color = normal_color
  127.     else
  128.       self.contents.font.color = disabled_color
  129.     end
  130.     jms = 1.0
  131.     if $scjm_mode = 1
  132.       $scis.each do |scn|
  133.         if @actor.state?(scn)
  134.           jms = jms * (100 - $scjm[scn]) / 100
  135.         end
  136.       end
  137.     else
  138.       $scis.each do |scn|
  139.         if @actor.state?(scn)
  140.           jms = jms - ($scjm[scn] / 100)
  141.         end
  142.       end  
  143.     end
  144.     x = 4 + index % 2 * (288 + 32)
  145.     y = index / 2 * 32
  146.     rect = Rect.new(x, y, self.width / @column_max - 32, 32)
  147.     self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
  148.     bitmap = RPG::Cache.icon(skill.icon_name)
  149.     opacity = self.contents.font.color == normal_color ? 255 : 128
  150.     self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
  151.     self.contents.draw_text(x + 28, y, 204, 32, skill.name, 0)
  152.     self.contents.draw_text(x + 232, y, 48, 32, (skill.sp_cost * jms).to_i.to_s, 2)
  153.   end
  154. end

  155. #==============================================================================
  156. # ■ Scene_Skill 打酱油定义
  157. #------------------------------------------------------------------------------
  158. #  处理特技画面的类。
  159. #==============================================================================

  160. class Scene_Skill
  161.   def update_skill
  162.     # 按下 B 键的情况下
  163.     if Input.trigger?(Input::B)
  164.       # 演奏取消 SE
  165.       $game_system.se_play($data_system.cancel_se)
  166.       # 切换到菜单画面
  167.       $scene = Scene_Menu.new(1)
  168.       return
  169.     end
  170.     # 按下 C 键的情况下
  171.     if Input.trigger?(Input::C)
  172.       # 获取特技窗口现在选择的特技的数据
  173.       @skill = @skill_window.skill
  174.       # 不能使用的情况下
  175.       if @skill == nil or not @actor.skill_can_use?(@skill.id)
  176.         # 演奏冻结 SE
  177.         $game_system.se_play($data_system.buzzer_se)
  178.         return
  179.       end
  180.       # 演奏确定 SE
  181.       $game_system.se_play($data_system.decision_se)
  182.       # 效果范围是我方的情况下
  183.       if @skill.scope >= 3
  184.         # 激活目标窗口
  185.         @skill_window.active = false
  186.         @target_window.x = (@skill_window.index + 1) % 2 * 304
  187.         @target_window.visible = true
  188.         @target_window.active = true
  189.         # 设置效果范围 (单体/全体) 的对应光标位置
  190.         if @skill.scope == 4 || @skill.scope == 6
  191.           @target_window.index = -1
  192.         elsif @skill.scope == 7
  193.           @target_window.index = @actor_index - 10
  194.         else
  195.           @target_window.index = 0
  196.         end
  197.       # 效果在我方以外的情况下
  198.       else
  199.         # 公共事件 ID 有效的情况下
  200.         if @skill.common_event_id > 0
  201.           # 预约调用公共事件
  202.           $game_temp.common_event_id = @skill.common_event_id
  203.           # 演奏特技使用时的 SE
  204.           $game_system.se_play(@skill.menu_se)
  205.           # 消耗 SP
  206.           jms = 1.0
  207.           if $scjm_mode = 1
  208.             $scis.each do |scn|
  209.               if @actor.state?(scn)
  210.                 jms = jms * (100 - $scjm[scn]) / 100
  211.               end
  212.             end
  213.           else
  214.             $scis.each do |scn|
  215.               if @actor.state?(scn)
  216.                 jms = jms - ($scjm[scn] / 100)
  217.               end
  218.             end  
  219.           end         
  220.           @actor.sp -= (@skill.sp_cost * jms).to_i
  221.           # 再生成各窗口的内容
  222.           @status_window.refresh
  223.           @skill_window.refresh
  224.           @target_window.refresh
  225.           # 切换到地图画面
  226.           $scene = Scene_Map.new
  227.           return
  228.         end
  229.       end
  230.       return
  231.     end
  232.     # 按下 R 键的情况下
  233.     if Input.trigger?(Input::R)
  234.       # 演奏光标 SE
  235.       $game_system.se_play($data_system.cursor_se)
  236.       # 移至下一位角色
  237.       @actor_index += 1
  238.       @actor_index %= $game_party.actors.size
  239.       # 切换到别的特技画面
  240.       $scene = Scene_Skill.new(@actor_index)
  241.       return
  242.     end
  243.     # 按下 L 键的情况下
  244.     if Input.trigger?(Input::L)
  245.       # 演奏光标 SE
  246.       $game_system.se_play($data_system.cursor_se)
  247.       # 移至上一位角色
  248.       @actor_index += $game_party.actors.size - 1
  249.       @actor_index %= $game_party.actors.size
  250.       # 切换到别的特技画面
  251.       $scene = Scene_Skill.new(@actor_index)
  252.       return
  253.     end
  254.   end
  255.   def update_target
  256.     # 按下 B 键的情况下
  257.     if Input.trigger?(Input::B)
  258.       # 演奏取消 SE
  259.       $game_system.se_play($data_system.cancel_se)
  260.       # 删除目标窗口
  261.       @skill_window.active = true
  262.       @target_window.visible = false
  263.       @target_window.active = false
  264.       return
  265.     end
  266.     # 按下 C 键的情况下
  267.     if Input.trigger?(Input::C)
  268.       # 因为 SP 不足而无法使用的情况下
  269.       unless @actor.skill_can_use?(@skill.id)
  270.         # 演奏冻结 SE
  271.         $game_system.se_play($data_system.buzzer_se)
  272.         return
  273.       end
  274.       # 目标是全体的情况下
  275.       if @target_window.index == -1
  276.         # 对同伴全体应用特技使用效果
  277.         used = false
  278.         for i in $game_party.actors
  279.           used |= i.skill_effect(@actor, @skill)
  280.         end
  281.       end
  282.       # 目标是使用者的情况下
  283.       if @target_window.index <= -2
  284.         # 对目标角色应用特技的使用效果
  285.         target = $game_party.actors[@target_window.index + 10]
  286.         used = target.skill_effect(@actor, @skill)
  287.       end
  288.       # 目标是单体的情况下
  289.       if @target_window.index >= 0
  290.         # 对目标角色应用特技的使用效果
  291.         target = $game_party.actors[@target_window.index]
  292.         used = target.skill_effect(@actor, @skill)
  293.       end
  294.       # 使用特技的情况下
  295.       if used
  296.         # 演奏特技使用时的 SE
  297.         $game_system.se_play(@skill.menu_se)
  298.         # 消耗 SP
  299.         jms = 1.0
  300.         if $scjm_mode = 1
  301.           $scis.each do |scn|
  302.             if @actor.state?(scn)
  303.               jms = jms * (100 - $scjm[scn]) / 100
  304.             end
  305.           end
  306.         else
  307.           $scis.each do |scn|
  308.             if @actor.state?(scn)
  309.               jms = jms - ($scjm[scn] / 100)
  310.             end
  311.           end  
  312.         end                  
  313.         @actor.sp -= (@skill.sp_cost * jms).to_i
  314.         # 再生成各窗口内容
  315.         @status_window.refresh
  316.         @skill_window.refresh
  317.         @target_window.refresh
  318.         # 全灭的情况下
  319.         if $game_party.all_dead?
  320.           # 切换到游戏结束画面
  321.           $scene = Scene_Gameover.new
  322.           return
  323.         end
  324.         # 公共事件 ID 有效的情况下
  325.         if @skill.common_event_id > 0
  326.           # 预约调用公共事件
  327.           $game_temp.common_event_id = @skill.common_event_id
  328.           # 切换到地图画面
  329.           $scene = Scene_Map.new
  330.           return
  331.         end
  332.       end
  333.       # 无法使用特技的情况下
  334.       unless used
  335.         # 演奏冻结 SE
  336.         $game_system.se_play($data_system.buzzer_se)
  337.       end
  338.       return
  339.     end
  340.   end  
  341. end
复制代码
……MS模式2容易出错哈………………

评分

参与人数 1星屑 +400 收起 理由
fux2 + 400 幸苦了!

查看全部评分

美工是什么?我没听说过。
音乐是什么?我没听说过。
动画设计是什么?我没听说过。
地图修饰是什么?我没听说过。
横版战斗是什么?我没听说过。
属性平衡是什么?我没听说过。
我所做的只是用我这整天只考及格的语文水平写剧本而已。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-24 00:06

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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