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

Project1

 找回密码
 注册会员
搜索
楼主: slick
打印 上一主题 下一主题

同一角色不同种类的SP分开使用(13楼做出第二次改进版)

 关闭 [复制链接]

Lv2.观梦者

天仙

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

贵宾

11
发表于 2008-5-31 12:39:34 | 只看该作者
如果能的话
请楼主顺便制作一个VX版的吧
VA脚本开工中...
偷窃脚本1.0 - 已完成
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (暗夜天使)

名侦探小柯

梦石
0
星屑
3299
在线时间
3619 小时
注册时间
2006-9-6
帖子
37400

开拓者贵宾第3届短篇游戏大赛主流游戏组亚军第5届短篇游戏比赛亚军

12
发表于 2008-5-31 16:52:36 | 只看该作者
这个就是传说种的属性能量吧……
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
3
星屑
50
在线时间
177 小时
注册时间
2008-3-21
帖子
939
13
 楼主| 发表于 2009-6-12 08:00:00 | 只看该作者
这个系统已经作了第二次改进,使用方法如下:

武器类型定义方法:
  譬如“钢之剑,600,0”意思是:名称为“钢之剑”的武器,决定了角色SP最大值为600,属性值为0(在本范例中该属性的意义为“格斗”),使用格斗系SP。
  譬如“水之杖,1000,2”意思是:名称为“水之杖”的武器,决定了角色SP最大值为1000,属性值为2(在本范例中该属性的意义为“水”),使用水系SP。
  其中第一个附带参数不能缺省。
  第二个附带参数可以缺省,缺省设置为1,在本范例中是使用默认的格斗技SP。 
  其他使用方法同“武器决定技能”。

改进版对物品的使用也做了调整:
  譬如“火之滋补剂,0”意思是:名称为“火之滋补剂”的物品,附带参数设为0,对应第一种SP,本范例设定为使用后回复角色的炎属性SP。
  譬如“普通滋补剂”意思是:名称为“普通滋补剂”的物品,因为一个附带参数缺省,故使用后回复角色当前正在使用的SP。
  譬如“万能滋补剂,255”意思是:名称为“万能滋补剂”的物品,附带参数设为255,故使用后回复角色所有属性的SP。
    万能SP回复物品的参数一定要设为255。

特别注意:
  该脚本有一定冲突性,主要是SP使用、武器装备变更、以及血条描画方面等。

如果想要投宿住店时回复SP,请在事件调用中加上这个脚本:
for i in 0...$game_party.actors.size
  m=$game_party.actors.cta.size
  for j in 0...m
    if j==$game_party.actors.akind
      k=$game_party.actors.cta[j]
      $game_party.actors.ammo[j]=k
    else
      $game_party.actors.ammo[j]=9999
    end
  end
end

呃。。。至于VX版的嘛。。。Ojz还请期待==|||



  1. # 不同种类的SP分开用 改进版 V1.01 BY SLICK

  2. module RPG
  3.   class Weapon  # 武器名称所能决定SP种类及属性的定义方法(格式像这样:钢匕首,2000,0)
  4.     attr_accessor :w_maxsp
  5.     attr_accessor :w_akind
  6.     def name
  7.       name = @name.split(/,/)[0]
  8.       return name != nil ? name : ''
  9.     end
  10.     def w_maxsp
  11.       w_maxsp = @name.split(/,/)[1]
  12.       return w_maxsp != nil ? w_maxsp.to_i : 0
  13.     end
  14.     def w_akind
  15.       w_akind = @name.split(/,/)[2]
  16.       return w_akind != nil ? w_akind.to_i : 1
  17.     end  
  18.   end  
  19.   class Item  # 定义某种物品能回复哪种SP(格式像这样:普通滋补剂,0)
  20.     attr_accessor :i_rkind
  21.     def name
  22.       name = @name.split(/,/)[0]
  23.       return name != nil ? name : ''
  24.     end
  25.     def i_rkind
  26.       i_rkind = @name.split(/,/)[1]
  27.       return i_rkind != nil ? i_rkind.to_i : nil
  28.     end  
  29.   end  
  30. end

  31. class Game_Actor < Game_Battler
  32.   #--------------------------------------------------------------------------
  33.   # ● 公開インスタンス変数
  34.   #--------------------------------------------------------------------------
  35.   attr_reader   :name                     # 名前
  36.   attr_reader   :character_name           # キャラクター ファイル名
  37.   attr_reader   :character_hue            # キャラクター 色相
  38.   attr_reader   :class_id                 # クラス ID
  39.   attr_reader   :weapon_id                # 武器 ID
  40.   attr_reader   :armor1_id                # 盾 ID
  41.   attr_reader   :armor2_id                # 頭防具 ID
  42.   attr_reader   :armor3_id                # 体防具 ID
  43.   attr_reader   :armor4_id                # 装飾品 ID
  44.   attr_reader   :level                    # レベル
  45.   attr_reader   :exp                      # EXP
  46.   attr_reader   :skills                   # スキル
  47.   
  48.   
  49. #这里做修改==================================  
  50.   attr_accessor :ammo                     # SP残留量
  51.   attr_accessor :akind                    # 使用何种SP
  52.   attr_accessor :cta                      # SP最大容量
  53. #=======================================  
  54.   
  55.   
  56.   #--------------------------------------------------------------------------
  57.   # ● セットアップ
  58.   #     actor_id : アクター ID
  59.   #--------------------------------------------------------------------------
  60.   def setup(actor_id)
  61.     actor = $data_actors[actor_id]
  62.     @actor_id = actor_id
  63.     @name = actor.name
  64.     @character_name = actor.character_name
  65.     @character_hue = actor.character_hue
  66.     @battler_name = actor.battler_name
  67.     @battler_hue = actor.battler_hue
  68.     @class_id = actor.class_id
  69.     @weapon_id = actor.weapon_id
  70.     @armor1_id = actor.armor1_id
  71.     @armor2_id = actor.armor2_id
  72.     @armor3_id = actor.armor3_id
  73.     @armor4_id = actor.armor4_id
  74.     @level = actor.initial_level
  75.     @exp_list = Array.new(101)
  76.     make_exp_list
  77.     @exp = @exp_list[@level]
  78.     @skills = []
  79.     @hp = maxhp
  80.     @sp = maxsp
  81.     @states = []
  82.     @states_turn = {}
  83.     @maxhp_plus = 0
  84.     @maxsp_plus = 0
  85.     @str_plus = 0
  86.     @dex_plus = 0
  87.     @agi_plus = 0
  88.     @int_plus = 0
  89.    
  90.    
  91. #这里做修改==================================   
  92.     @ammo = [0,0,0,0,0,0,0,0,0]# 目前只使用九种能量
  93.     @akind = 1 # 缺省情况下使用格斗技能量
  94.     @cta = [0,0,0,0,0,0,0,0,0]#  这个新版本中每一种能量的最大值都要设定
  95. #=======================================   
  96.    
  97.    
  98.     # スキル習得
  99.     for i in 1..@level
  100.       for j in $data_classes[@class_id].learnings
  101.         if j.level == i
  102.           learn_skill(j.skill_id)
  103.         end
  104.       end
  105.     end
  106.     # オートステートを更新
  107.     update_auto_state(nil, $data_armors[@armor1_id])
  108.     update_auto_state(nil, $data_armors[@armor2_id])
  109.     update_auto_state(nil, $data_armors[@armor3_id])
  110.     update_auto_state(nil, $data_armors[@armor4_id])
  111.   end
  112. end

  113. class Scene_Equip
  114.   #--------------------------------------------------------------------------
  115.   # ● 刷新画面 (右侧窗口被激活的情况下)
  116.   #--------------------------------------------------------------------------
  117.   def update_right
  118.     # 按下 B 键的情况下
  119.     if Input.trigger?(Input::B)
  120.       # 演奏取消 SE
  121.       $game_system.se_play($data_system.cancel_se)
  122.       
  123.       
  124. #装备结束时再次判断一下属性SP值========================      
  125.       neomaxsp=0
  126.       if @actor.weapon_id !=0
  127.         @actor.akind=$data_weapons[@actor.weapon_id].w_akind
  128.       end  
  129.       if @actor.weapon_id !=0
  130.         neomaxsp+=$data_weapons[@actor.weapon_id].w_maxsp
  131.       end  
  132.       @actor.cta[@actor.akind]=neomaxsp
  133.       @actor.ammo[@actor.akind] = [$lammo[@actor.akind],@actor.cta[@actor.akind]].min#弹药种类相同取弹匣小值
  134. #=======================================      
  135.       

  136.       # 切换到菜单画面
  137.       $scene = Scene_Menu.new(2)
  138.       return
  139.     end
  140.     # 按下 C 键的情况下
  141.     if Input.trigger?(Input::C)
  142.       # 固定装备的情况下
  143.       if @actor.equip_fix?(@right_window.index)
  144.         # 演奏冻结 SE
  145.         $game_system.se_play($data_system.buzzer_se)
  146.         return
  147.       end
  148.       # 演奏确定 SE
  149.       $game_system.se_play($data_system.decision_se)
  150.       # 激活物品窗口
  151.       @right_window.active = false
  152.       @item_window.active = true
  153.       @item_window.index = 0
  154.       
  155.       
  156. #开始装备武器时判断一下属性SP值========================      
  157.       $lkind = @actor.akind #弹药种类是否与以前相同?
  158.       $lammo = []
  159.       for ii in [email protected]
  160.         $lammo[ii][email protected][ii]
  161.       end
  162. #=======================================      
  163.       
  164.       
  165.       return
  166.     end
  167.     # 按下 R 键的情况下
  168.     if Input.trigger?(Input::R)
  169.       # 演奏光标 SE
  170.       $game_system.se_play($data_system.cursor_se)
  171.       # 移至下一位角色
  172.       @actor_index += 1
  173.       @actor_index %= $game_party.actors.size
  174.       # 切换到别的装备画面
  175.       $scene = Scene_Equip.new(@actor_index, @right_window.index)
  176.       return
  177.     end
  178.     # 按下 L 键的情况下
  179.     if Input.trigger?(Input::L)
  180.       # 演奏光标 SE
  181.       $game_system.se_play($data_system.cursor_se)
  182.       # 移至上一位角色
  183.       @actor_index += $game_party.actors.size - 1
  184.       @actor_index %= $game_party.actors.size
  185.       # 切换到别的装备画面
  186.       $scene = Scene_Equip.new(@actor_index, @right_window.index)
  187.       return
  188.     end
  189.   end
  190. end

  191. class Game_Battler
  192. #--------------------------------------------------------------------------
  193. SW_SET = [1,2,3,4,5,6,7,8,9] # 此处设定武器和技能关联的属性id
  194. #--------------------------------------------------------------------------
  195. def skill_can_use?(skill_id)
  196.    if self.is_a?(Game_Actor) and self.weapon_id > 0
  197.      sw_boolean = false # 判断武器和技能关联
  198.      s = SW_SET & $data_skills[skill_id].element_set
  199.      if s.empty?
  200.        sw_boolean = true
  201.      else
  202.        for i in s
  203.          if  $data_weapons[self.weapon_id].element_set .include?(i)
  204.            sw_boolean = true
  205.            break
  206.          end
  207.        end
  208.      end
  209.      if sw_boolean == false
  210.        return false
  211.      end
  212.      
  213.      
  214. #这里修改为对各种SP的判断===========================     
  215.      current_sp=self.ammo[self.akind]
  216.      current_maxsp=self.cta[self.akind]
  217. #=======================================     
  218.      
  219.      
  220.      if $data_skills[skill_id].sp_cost > current_sp
  221.        return false
  222.      end
  223.    end
  224.    
  225.    if dead?
  226.      return false
  227.    end
  228.    if $data_skills[skill_id].atk_f == 0 and self.restriction == 1
  229.      return false
  230.    end
  231.    occasion = $data_skills[skill_id].occasion
  232.    if $game_temp.in_battle
  233.      return (occasion == 0 or occasion == 1)
  234.    else
  235.      return (occasion == 0 or occasion == 2)
  236.    end
  237. end
  238. end

  239. class Scene_Battle
  240.   def make_skill_action_result
  241.     # 获取特技
  242.     @skill = $data_skills[@active_battler.current_action.skill_id]
  243.     # 如果不是强制行动
  244.     unless @active_battler.current_action.forcing
  245.       # 因为 SP 耗尽而无法使用的情况下
  246.       unless @active_battler.skill_can_use?(@skill.id)
  247.         # 清除强制行动对像的战斗者
  248.         $game_temp.forcing_battler = nil
  249.         # 移至步骤 1
  250.         @phase4_step = 1
  251.         return
  252.       end
  253.     end

  254.    
  255. # 消耗 SP(区分不同种类)===========================
  256.     if @active_battler.is_a?(Game_Actor)
  257.       @active_battler.ammo[@active_battler.akind] -= @skill.sp_cost
  258.     else  
  259.       @active_battler.sp -= @skill.sp_cost
  260.     end if  
  261. #=======================================

  262.    
  263.     # 刷新状态窗口
  264.     @status_window.refresh
  265.     # 在帮助窗口显示特技名
  266.     @help_window.set_text(@skill.name, 1)
  267.     # 设置动画 ID
  268.     @animation1_id = @skill.animation1_id
  269.     @animation2_id = @skill.animation2_id
  270.     # 设置公共事件 ID
  271.     @common_event_id = @skill.common_event_id
  272.     # 设置对像侧战斗者
  273.     set_target_battlers(@skill.scope)
  274.     # 应用特技效果
  275.     for target in @target_battlers
  276.       target.skill_effect(@active_battler, @skill)
  277.     end
  278.   end
  279. end

  280. #==============================================================================
  281. # 物品对不同SP分别起作用
  282. #==============================================================================

  283. class Game_Battler
  284.   #--------------------------------------------------------------------------
  285.   # ● 应用物品效果
  286.   #     item : 物品
  287.   #--------------------------------------------------------------------------
  288.   def item_effect(item)
  289.     # 清除会心一击标志
  290.     self.critical = false
  291.     # 物品的效果范围是 HP 1 以上的己方、自己的 HP 为 0、
  292.     # 或者物品的效果范围是 HP 0 的己方、自己的 HP 为 1 以上的情况下
  293.     if ((item.scope == 3 or item.scope == 4) and self.hp == 0) or
  294.        ((item.scope == 5 or item.scope == 6) and self.hp >= 1)
  295.       # 过程结束
  296.       return false
  297.     end
  298.     # 清除有效标志
  299.     effective = false
  300.     # 公共事件 ID 是有效的情况下,设置为有效标志
  301.     effective |= item.common_event_id > 0
  302.     # 命中判定
  303.     hit_result = (rand(100) < item.hit)
  304.     # 不确定的特技的情况下设置为有效标志
  305.     effective |= item.hit < 100
  306.     # 命中的情况
  307.     if hit_result == true
  308.       # 计算回复量
  309.       recover_hp = maxhp * item.recover_hp_rate / 100 + item.recover_hp
  310.       

  311. #这里修改了对SP回复率的判断==========================            
  312.       recover_sp = self.cta[self.akind] * item.recover_sp_rate / 100 + item.recover_sp
  313. #=======================================


  314.       if recover_hp < 0
  315.         recover_hp += self.pdef * item.pdef_f / 20
  316.         recover_hp += self.mdef * item.mdef_f / 20
  317.         recover_hp = [recover_hp, 0].min
  318.       end
  319.       # 属性修正
  320.       recover_hp *= elements_correct(item.element_set)
  321.       recover_hp /= 100
  322.       recover_sp *= elements_correct(item.element_set)
  323.       recover_sp /= 100
  324.       # 分散
  325.       if item.variance > 0 and recover_hp.abs > 0
  326.         amp = [recover_hp.abs * item.variance / 100, 1].max
  327.         recover_hp += rand(amp+1) + rand(amp+1) - amp
  328.       end
  329.       if item.variance > 0 and recover_sp.abs > 0
  330.         amp = [recover_sp.abs * item.variance / 100, 1].max
  331.         recover_sp += rand(amp+1) + rand(amp+1) - amp
  332.       end
  333.       # 回复量符号为负的情况下
  334.       if recover_hp < 0
  335.         # 防御修正
  336.         if self.guarding?
  337.           recover_hp /= 2
  338.         end
  339.       end
  340.       # HP 回复量符号的反转、设置伤害值
  341.       self.damage = -recover_hp
  342.       # HP 以及 SP 的回复
  343.       last_hp = self.hp
  344.       self.hp += recover_hp
  345.       
  346.       
  347. #这里修改为对各种属性SP的判断=========================      
  348.       if self.is_a?(Game_Actor)
  349.         case item.i_rkind
  350.           when 255   #对自己所有的SP都起作用
  351.             for ii in 0...self.cta.size
  352.               current_sp = self.ammo[ii]
  353.               if ii==self.akind  #最大SP值的限制只对当前SP起作用
  354.                 current_maxsp=self.cta[ii]
  355.                 current_sp += recover_sp
  356.                 if current_sp > current_maxsp
  357.                   current_sp = current_maxsp
  358.                 end
  359.               else
  360.                 current_sp += recover_sp
  361.               end
  362.               self.ammo[ii] = current_sp
  363.             end  
  364.           when nil   #对自己当前正在使用的SP起作用
  365.             current_sp=self.ammo[self.akind]
  366.             current_maxsp=self.cta[self.akind]  #最大SP值的限制只对当前SP起作用
  367.             current_sp += recover_sp
  368.             if current_sp > current_maxsp
  369.               current_sp = current_maxsp
  370.             end
  371.             self.ammo[self.akind] = current_sp
  372.           else     #对自己某种特定属性的SP起作用
  373.             current_sp=self.ammo[item.i_rkind]
  374.             current_sp += recover_sp
  375.             self.ammo[item.i_rkind] = current_sp
  376.         end
  377.         last_sp = current_sp
  378.         effective =true
  379.       else  
  380.         last_sp = self.sp
  381.         self.sp += recover_sp
  382.         effective |= self.sp != last_sp
  383.       end  
  384. # ======================================


  385.       effective |= self.hp != last_hp
  386.       # 状态变化
  387.       @state_changed = false
  388.       effective |= states_plus(item.plus_state_set)
  389.       effective |= states_minus(item.minus_state_set)
  390.       # 能力上升值有效的情况下
  391.       if item.parameter_type > 0 and item.parameter_points != 0
  392.         # 能力值的分支
  393.         case item.parameter_type
  394.         when 1  # MaxHP
  395.           @maxhp_plus += item.parameter_points
  396.         when 2  # MaxSP
  397.           @maxsp_plus += item.parameter_points
  398.         when 3  # 力量
  399.           @str_plus += item.parameter_points
  400.         when 4  # 灵巧
  401.           @dex_plus += item.parameter_points
  402.         when 5  # 速度
  403.           @agi_plus += item.parameter_points
  404.         when 6  # 魔力
  405.           @int_plus += item.parameter_points
  406.         end
  407.         # 设置有效标志
  408.         effective = true
  409.       end
  410.       # HP 回复率与回复量为 0 的情况下
  411.       if item.recover_hp_rate == 0 and item.recover_hp == 0
  412.         # 设置伤害为空的字符串
  413.         self.damage = ""
  414.         # SP 回复率与回复量为 0、能力上升值无效的情况下
  415.         if item.recover_sp_rate == 0 and item.recover_sp == 0 and
  416.            (item.parameter_type == 0 or item.parameter_points == 0)
  417.           # 状态没有变化的情况下
  418.           unless @state_changed
  419.             # 伤害设置为 "Miss"
  420.             self.damage = "Miss"
  421.           end
  422.         end
  423.       end
  424.     # Miss 的情况下
  425.     else
  426.       # 伤害设置为 "Miss"
  427.       self.damage = "Miss"
  428.     end
  429.     # 不在战斗中的情况下
  430.     unless $game_temp.in_battle
  431.       # 伤害设置为 nil
  432.       self.damage = nil
  433.     end
  434.     # 过程结束
  435.     return effective
  436.   end  
  437. end

  438. class Game_Actor < Game_Battler
  439.   def now_exp
  440.     return @exp - @exp_list[@level]
  441.   end
  442.   def next_exp
  443.     return @exp_list[@level+1] > 0 ? @exp_list[@level+1] - @exp_list[@level] : 0
  444.   end
  445. end

  446. #==============================================================================
  447. # ■ Window_Base
  448. #------------------------------------------------------------------------------
  449. #  血条的绘制
  450. #==============================================================================

  451. class Window_Base < Window
  452.   #--------------------------------------------------------------------------
  453.   # ● 描绘 SP
  454.   #     actor : 角色
  455.   #     x     : 描画目标 X 坐标
  456.   #     y     : 描画目标 Y 坐标
  457.   #     width : 描画目标的宽
  458.   #--------------------------------------------------------------------------
  459.   def draw_actor_sp(actor, x, y, width = 144)
  460.     # 描绘字符串 "SP"
  461.     self.contents.font.color = system_color
  462.     self.contents.draw_text(x, y, 32, 32, $data_system.words.sp)
  463.     # 计算描绘 MaxSP 所需的空间
  464.     if width - 32 >= 108
  465.       sp_x = x + width - 108
  466.       flag = true
  467.     elsif width - 32 >= 48
  468.       sp_x = x + width - 48
  469.       flag = false
  470.     end
  471.     # 描绘 SP
  472.     current_sp=actor.ammo[actor.akind]
  473.     current_maxsp=actor.cta[actor.akind]
  474.     self.contents.font.color = current_sp == 0 ? knockout_color :
  475.       current_sp <= current_maxsp / 4 ? crisis_color : normal_color
  476.     self.contents.draw_text(sp_x, y, 48, 32, current_sp.to_s, 2)
  477.     # 描绘 MaxSP
  478.     if flag
  479.       self.contents.font.color = normal_color
  480.       self.contents.draw_text(sp_x + 48, y, 12, 32, "/", 1)
  481.       self.contents.draw_text(sp_x + 60, y, 48, 32, current_maxsp.to_s)
  482.     end
  483.   end
  484.   #--------------------------------------------------------------------------
  485.   # ● HP ゲージの描画
  486.   #--------------------------------------------------------------------------
  487.   # オリジナルのHP描画を draw_actor_hp_original と名前変更
  488.   alias :draw_actor_hp_original :draw_actor_hp
  489.   def draw_actor_hp(actor, x, y, width = 144)
  490.     # 変数rateに 現在のHP/MHPを代入
  491.     if actor.maxhp != 0
  492.       rate = actor.hp.to_f / actor.maxhp
  493.     else
  494.       rate = 0
  495.     end
  496.     # plus_x:X座標の位置補正 rate_x:X座標の位置補正(%) plus_y:Y座標の位置補正
  497.     # plus_width:幅の補正 rate_width:幅の補正(%) height:縦幅
  498.     # align1:描画タイプ1 0:左詰め 1:中央揃え 2:右詰め
  499.     # align2:描画タイプ2 0:上詰め 1:中央揃え 2:下詰め
  500.     # align3:ゲージタイプ 0:左詰め 1:右詰め
  501.     plus_x = 0
  502.     rate_x = 0
  503.     plus_y = 25
  504.     plus_width = 0
  505.     rate_width = 100
  506.     height = 10
  507.     align1 = 1
  508.     align2 = 2
  509.     align3 = 0
  510.     # グラデーション設定 grade1:空ゲージ grade2:実ゲージ
  511.     # (0:横にグラデーション 1:縦にグラデーション 2:斜めにグラデーション(激重))
  512.     grade1 = 1
  513.     grade2 = 0
  514.     # 色設定。color1:外枠,color2:中枠
  515.     # color3:空ゲージダークカラー,color4:空ゲージライトカラー
  516.     # color5:実ゲージダークカラー,color6:実ゲージライトカラー
  517.     color1 = Color.new(0, 0, 0, 192)
  518.     color2 = Color.new(255, 255, 192, 192)
  519.     color3 = Color.new(0, 0, 0, 192)
  520.     color4 = Color.new(64, 0, 0, 192)
  521.     color5 = Color.new(80 - 24 * rate, 80 * rate, 14 * rate, 192)
  522.     color6 = Color.new(240 - 72 * rate, 240 * rate, 62 * rate, 192)
  523.     # 変数spに描画するゲージの幅を代入
  524.     if actor.maxhp != 0
  525.       hp = (width + plus_width) * actor.hp * rate_width / 100 / actor.maxhp
  526.     else
  527.       hp = 0
  528.     end
  529.     # ゲージの描画
  530.     gauge_rect(x + plus_x + width * rate_x / 100, y + plus_y,
  531.                 width, plus_width + width * rate_width / 100,
  532.                 height, hp, align1, align2, align3,
  533.                 color1, color2, color3, color4, color5, color6, grade1, grade2)
  534.     # オリジナルのHP描画処理を呼び出し
  535.     draw_actor_hp_original(actor, x, y, width)
  536.   end
  537.   #--------------------------------------------------------------------------
  538.   # ● SP ゲージの描画
  539.   #--------------------------------------------------------------------------
  540.   # オリジナルのSP描画を draw_actor_sp_original と名前変更
  541.   alias :draw_actor_sp_original :draw_actor_sp
  542.   def draw_actor_sp(actor, x, y, width = 144)
  543.     # 変数rateに 現在のSP/MSPを代入
  544.     if actor.maxsp != 0
  545.       rate = actor.sp.to_f / actor.cta[actor.akind]
  546.     else
  547.       rate = 1
  548.     end
  549.     # plus_x:X座標の位置補正 rate_x:X座標の位置補正(%) plus_y:Y座標の位置補正
  550.     # plus_width:幅の補正 rate_width:幅の補正(%) height:縦幅
  551.     # align1:描画タイプ1 0:左詰め 1:中央揃え 2:右詰め
  552.     # align2:描画タイプ2 0:上詰め 1:中央揃え 2:下詰め
  553.     # align3:ゲージタイプ 0:左詰め 1:右詰め
  554.     plus_x = 0
  555.     rate_x = 0
  556.     plus_y = 25
  557.     plus_width = 0
  558.     rate_width = 100
  559.     height = 10
  560.     align1 = 1
  561.     align2 = 2
  562.     align3 = 0
  563.     # グラデーション設定 grade1:空ゲージ grade2:実ゲージ
  564.     # (0:横にグラデーション 1:縦にグラデーション 2:斜めにグラデーション(激重))
  565.     grade1 = 1
  566.     grade2 = 0
  567.     # 色設定。color1:外枠,color2:中枠
  568.     # color3:空ゲージダークカラー,color4:空ゲージライトカラー
  569.     # color5:実ゲージダークカラー,color6:実ゲージライトカラー
  570.    
  571.    
  572. #区分SP属性的颜色===============================   
  573.     case actor.akind
  574.       when 0 # 火
  575.         color1 = Color.new(0, 0, 0, 192)
  576.         color2 = Color.new(255, 192, 192, 192)
  577.         color3 = Color.new(0, 0, 0, 192)
  578.         color4 = Color.new(0, 64, 64, 192)
  579.         color5 = Color.new(128 * rate, 0, 0, 192)
  580.         color6 = Color.new(255 * rate, 0, 0, 192)
  581.       when 3 # 水
  582.         color1 = Color.new(0, 0, 0, 192)
  583.         color2 = Color.new(192, 192, 255, 192)
  584.         color3 = Color.new(0, 0, 0, 192)
  585.         color4 = Color.new(64, 64, 0, 192)
  586.         color5 = Color.new(0, 0, 128 * rate, 192)
  587.         color6 = Color.new(0, 0, 255 * rate, 192)
  588.       when 5 # 风
  589.         color1 = Color.new(0, 0, 0, 192)
  590.         color2 = Color.new(192, 255, 224, 192)
  591.         color3 = Color.new(0, 0, 0, 192)
  592.         color4 = Color.new(64, 0, 0, 192)
  593.         color5 = Color.new(0, 128 * rate, 96 * rate, 192)
  594.         color6 = Color.new(0, 255 * rate, 192 * rate, 192)
  595.       when 4 # 地
  596.         color1 = Color.new(0, 0, 0, 192)
  597.         color2 = Color.new(255, 224, 192, 192)
  598.         color3 = Color.new(0, 0, 0, 192)
  599.         color4 = Color.new(0, 0, 0, 192)
  600.         color5 = Color.new(128 * rate, 64 * rate, 0, 192)
  601.         color6 = Color.new(255 * rate, 128 * rate, 0, 192)
  602.       when 2 # 雷
  603.         color1 = Color.new(0, 0, 0, 192)
  604.         color2 = Color.new(192, 224, 255, 192)
  605.         color3 = Color.new(0, 0, 0, 192)
  606.         color4 = Color.new(64, 0, 0, 192)
  607.         color5 = Color.new(0, 96 * rate, 128 * rate, 192)
  608.         color6 = Color.new(0, 192 * rate, 255 * rate, 192)
  609.       when 6 # 光
  610.         color1 = Color.new(0, 0, 0, 192)
  611.         color2 = Color.new(255, 255, 192, 192)
  612.         color3 = Color.new(0, 0, 0, 192)
  613.         color4 = Color.new(0, 0, 64, 192)
  614.         color5 = Color.new(128 * rate, 128 * rate, 64 * rate, 192)
  615.         color6 = Color.new(255 * rate, 255 * rate, 96 * rate, 192)
  616.       when 7 # 暗
  617.         color1 = Color.new(0, 0, 0, 192)
  618.         color2 = Color.new(160, 0, 224, 192)
  619.         color3 = Color.new(0, 0, 0, 192)
  620.         color4 = Color.new(0, 0, 0, 192)
  621.         color5 = Color.new(32 * rate, 0, 64 * rate, 192)
  622.         color6 = Color.new(128 * rate, 0 * rate, 192 * rate, 192)
  623.       when 8 # 毒
  624.         color1 = Color.new(0, 0, 0, 192)
  625.         color2 = Color.new(128, 224, 128, 192)
  626.         color3 = Color.new(0, 0, 0, 192)
  627.         color4 = Color.new(0, 0, 0, 192)
  628.         color5 = Color.new(0, 96 * rate, 0, 192)
  629.         color6 = Color.new(0, 192 * rate, 0, 192)
  630.       else
  631.         color1 = Color.new(0, 0, 0, 192)
  632.         color2 = Color.new(255, 255, 255, 192)
  633.         color3 = Color.new(0, 0, 0, 192)
  634.         color4 = Color.new(0, 0, 0, 192)
  635.         color5 = Color.new(64 * rate, 64 * rate, 64 * rate, 192)
  636.         color6 = Color.new(192 * rate, 192 * rate, 192 * rate, 192)  
  637.     end  
  638. #=======================================      
  639.       
  640.       
  641.     # 変数spに描画するゲージの幅を代入
  642.     current_sp=actor.ammo[actor.akind]
  643.     current_maxsp=actor.cta[actor.akind]
  644.     if current_maxsp != 0
  645.       sp = (width + plus_width) * current_sp * rate_width / 100 / current_maxsp
  646.     else
  647.       sp = (width + plus_width) * rate_width / 100
  648.     end
  649.     # ゲージの描画
  650.     gauge_rect(x + plus_x + width * rate_x / 100, y + plus_y,
  651.                 width, plus_width + width * rate_width / 100,
  652.                 height, sp, align1, align2, align3,
  653.                 color1, color2, color3, color4, color5, color6, grade1, grade2)
  654.     # オリジナルのSP描画処理を呼び出し
  655.     draw_actor_sp_original(actor, x, y, width)
  656.   end
  657.   #--------------------------------------------------------------------------
  658.   # ● ゲージの描画
  659.   #--------------------------------------------------------------------------
  660.   def gauge_rect(x, y, rect_width, width, height, gauge, align1, align2, align3,
  661.                 color1, color2, color3, color4, color5, color6, grade1, grade2)
  662.     case align1
  663.     when 1
  664.       x += (rect_width - width) / 2
  665.     when 2
  666.       x += rect_width - width
  667.     end
  668.     case align2
  669.     when 1
  670.       y -= height / 2
  671.     when 2
  672.       y -= height
  673.     end
  674.     # 枠描画
  675.     self.contents.fill_rect(x, y, width, height, color1)
  676.     self.contents.fill_rect(x + 1, y + 1, width - 2, height - 2, color2)
  677.     if align3 == 0
  678.       if grade1 == 2
  679.         grade1 = 3
  680.       end
  681.       if grade2 == 2
  682.         grade2 = 3
  683.       end
  684.     end
  685.     if (align3 == 1 and grade1 == 0) or grade1 > 0
  686.       color = color3
  687.       color3 = color4
  688.       color4 = color
  689.     end
  690.     if (align3 == 1 and grade2 == 0) or grade2 > 0
  691.       color = color5
  692.       color5 = color6
  693.       color6 = color
  694.     end
  695.     # 空ゲージの描画
  696.     self.contents.gradation_rect(x + 2, y + 2, width - 4, height - 4,
  697.                                   color3, color4, grade1)
  698.     if align3 == 1
  699.       x += width - gauge
  700.     end
  701.     # 実ゲージの描画
  702.     self.contents.gradation_rect(x + 2, y + 2, gauge - 4, height - 4,
  703.                                   color5, color6, grade2)
  704.   end
  705. end

  706. #------------------------------------------------------------------------------
  707. #  Bitmapクラスに新たな機能を追加します。
  708. #==============================================================================

  709. class Bitmap
  710.   #--------------------------------------------------------------------------
  711.   # ● 矩形をグラデーション表示
  712.   #     color1 : スタートカラー
  713.   #     color2 : エンドカラー
  714.   #     align  :  0:横にグラデーション
  715.   #               1:縦にグラデーション
  716.   #               2:斜めにグラデーション(激重につき注意)
  717.   #--------------------------------------------------------------------------
  718.   def gradation_rect(x, y, width, height, color1, color2, align = 0)
  719.     if align == 0
  720.       for i in x...x + width
  721.         red   = color1.red + (color2.red - color1.red) * (i - x) / (width - 1)
  722.         green = color1.green +
  723.                 (color2.green - color1.green) * (i - x) / (width - 1)
  724.         blue  = color1.blue +
  725.                 (color2.blue - color1.blue) * (i - x) / (width - 1)
  726.         alpha = color1.alpha +
  727.                 (color2.alpha - color1.alpha) * (i - x) / (width - 1)
  728.         color = Color.new(red, green, blue, alpha)
  729.         fill_rect(i, y, 1, height, color)
  730.       end
  731.     elsif align == 1
  732.       for i in y...y + height
  733.         red   = color1.red +
  734.                 (color2.red - color1.red) * (i - y) / (height - 1)
  735.         green = color1.green +
  736.                 (color2.green - color1.green) * (i - y) / (height - 1)
  737.         blue  = color1.blue +
  738.                 (color2.blue - color1.blue) * (i - y) / (height - 1)
  739.         alpha = color1.alpha +
  740.                 (color2.alpha - color1.alpha) * (i - y) / (height - 1)
  741.         color = Color.new(red, green, blue, alpha)
  742.         fill_rect(x, i, width, 1, color)
  743.       end
  744.     elsif align == 2
  745.       for i in x...x + width
  746.         for j in y...y + height
  747.           red   = color1.red + (color2.red - color1.red) *
  748.                   ((i - x) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  749.           green = color1.green + (color2.green - color1.green) *
  750.                   ((i - x) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  751.           blue  = color1.blue + (color2.blue - color1.blue) *
  752.                   ((i - x) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  753.           alpha = color1.alpha + (color2.alpha - color1.alpha) *
  754.                   ((i - x) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  755.           color = Color.new(red, green, blue, alpha)
  756.           set_pixel(i, j, color)
  757.         end
  758.       end
  759.     elsif align == 3
  760.       for i in x...x + width
  761.         for j in y...y + height
  762.           red   = color1.red + (color2.red - color1.red) *
  763.                 ((x + width - i) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  764.           green = color1.green + (color2.green - color1.green) *
  765.                 ((x + width - i) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  766.           blue  = color1.blue + (color2.blue - color1.blue) *
  767.                 ((x + width - i) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  768.           alpha = color1.alpha + (color2.alpha - color1.alpha) *
  769.                 ((x + width - i) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  770.           color = Color.new(red, green, blue, alpha)
  771.           set_pixel(i, j, color)
  772.         end
  773.       end
  774.     end
  775.   end
  776. end

复制代码


改进版的范例下载:

http://rpg.blue/upload_program/f ... CKV101_92751188.rar
我的个人空间:
http://434986751.qzone.qq.com
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
3
星屑
50
在线时间
177 小时
注册时间
2008-3-21
帖子
939
14
 楼主| 发表于 2008-6-1 20:17:04 | 只看该作者
以下引用越前リョーマ于2008-5-31 8:52:36的发言:

这个就是传说种的属性能量吧……


这个系统我个人认为,如果制作RM版的CS、洛克人或是POKEMON应该都有用处。
我的个人空间:
http://434986751.qzone.qq.com
回复 支持 反对

使用道具 举报

Lv3.寻梦者

酱油的

梦石
0
星屑
1020
在线时间
2161 小时
注册时间
2007-12-22
帖子
3271

贵宾

15
发表于 2008-6-1 20:43:20 | 只看该作者
比上一版好好多。唔唔。明天測試一下 XD
不做頭像做簽名,看我囧冏有神(多謝山人有情提供 )
回复 支持 反对

使用道具 举报

Lv3.寻梦者

酱油的

梦石
0
星屑
1020
在线时间
2161 小时
注册时间
2007-12-22
帖子
3271

贵宾

16
发表于 2008-6-2 11:14:11 | 只看该作者
使用藥物可以超出SP上限

另外這裏我幫你减少了一些重複定義:

  1. # 不同种类的SP分开用 改进版 V1.01 BY SLICK

  2. module RPG
  3.   class Weapon  # 武器名称所能决定SP种类及属性的定义方法(格式像这样:钢匕首,2000,0)
  4.     attr_writer :w_maxsp
  5.     attr_writer :w_akind
  6.     def name
  7.       name = @name.split(/,/)[0]
  8.       return name != nil ? name : ''
  9.     end
  10.     def w_maxsp
  11.       w_maxsp = @name.split(/,/)[1]
  12.       return w_maxsp != nil ? w_maxsp.to_i : 0
  13.     end
  14.     def w_akind
  15.       w_akind = @name.split(/,/)[2]
  16.       return w_akind != nil ? w_akind.to_i : 1
  17.     end  
  18.   end  
  19.   class Item  # 定义某种物品能回复哪种SP(格式像这样:普通滋补剂,0)
  20.     attr_writer :i_rkind
  21.     def name
  22.       name = @name.split(/,/)[0]
  23.       return name != nil ? name : ''
  24.     end
  25.     def i_rkind
  26.       i_rkind = @name.split(/,/)[1]
  27.       return i_rkind != nil ? i_rkind.to_i : nil
  28.     end  
  29.   end  
  30. end

  31. class Game_Actor < Game_Battler
  32.   #--------------------------------------------------------------------------
  33.   # ● 公開インスタンス変数
  34.   #--------------------------------------------------------------------------
  35. #这里做修改==================================  
  36.   attr_accessor :ammo                     # SP残留量
  37.   attr_accessor :akind                    # 使用何种SP
  38.   attr_accessor :cta                      # SP最大容量
  39. #=======================================  
  40.   
  41.   
  42.   #--------------------------------------------------------------------------
  43.   # ● セットアップ
  44.   #     actor_id : アクター ID
  45.   #--------------------------------------------------------------------------
  46.   alias ooo_setup setup
  47.   def setup(actor_id)
  48.    
  49.    
  50. #这里做修改==================================   
  51.     @ammo = [0,0,0,0,0,0,0,0,0]# 目前只使用九种能量
  52.     @akind = 1 # 缺省情况下使用格斗技能量
  53.     @cta = [0,0,0,0,0,0,0,0,0]#  这个新版本中每一种能量的最大值都要设定
  54. #=======================================   
  55.     ooo_setup(actor_id)
  56.   end
  57. end

  58. class Scene_Equip
  59.   #--------------------------------------------------------------------------
  60.   # ● 刷新画面 (右侧窗口被激活的情况下)
  61.   #--------------------------------------------------------------------------
  62.   def update_right
  63.     # 按下 B 键的情况下
  64.     if Input.trigger?(Input::B)
  65.       # 演奏取消 SE
  66.       $game_system.se_play($data_system.cancel_se)
  67.       
  68.       
  69. #装备结束时再次判断一下属性SP值========================      
  70.       neomaxsp=0
  71.       if @actor.weapon_id !=0
  72.         @actor.akind=$data_weapons[@actor.weapon_id].w_akind
  73.       end  
  74.       if @actor.weapon_id !=0
  75.         neomaxsp+=$data_weapons[@actor.weapon_id].w_maxsp
  76.       end  
  77.       @actor.cta[@actor.akind]=neomaxsp
  78.       @actor.ammo[@actor.akind] = [$lammo[@actor.akind],@actor.cta[@actor.akind]].min#弹药种类相同取弹匣小值
  79. #=======================================      
  80.       

  81.       # 切换到菜单画面
  82.       $scene = Scene_Menu.new(2)
  83.       return
  84.     end
  85.     # 按下 C 键的情况下
  86.     if Input.trigger?(Input::C)
  87.       # 固定装备的情况下
  88.       if @actor.equip_fix?(@right_window.index)
  89.         # 演奏冻结 SE
  90.         $game_system.se_play($data_system.buzzer_se)
  91.         return
  92.       end
  93.       # 演奏确定 SE
  94.       $game_system.se_play($data_system.decision_se)
  95.       # 激活物品窗口
  96.       @right_window.active = false
  97.       @item_window.active = true
  98.       @item_window.index = 0
  99.       
  100.       
  101. #开始装备武器时判断一下属性SP值========================      
  102.       $lkind = @actor.akind #弹药种类是否与以前相同?
  103.       $lammo = []
  104.       for ii in [email protected]
  105.         $lammo[ii][email protected][ii]
  106.       end
  107. #=======================================      
  108.       
  109.       
  110.       return
  111.     end
  112.     # 按下 R 键的情况下
  113.     if Input.trigger?(Input::R)
  114.       # 演奏光标 SE
  115.       $game_system.se_play($data_system.cursor_se)
  116.       # 移至下一位角色
  117.       @actor_index += 1
  118.       @actor_index %= $game_party.actors.size
  119.       # 切换到别的装备画面
  120.       $scene = Scene_Equip.new(@actor_index, @right_window.index)
  121.       return
  122.     end
  123.     # 按下 L 键的情况下
  124.     if Input.trigger?(Input::L)
  125.       # 演奏光标 SE
  126.       $game_system.se_play($data_system.cursor_se)
  127.       # 移至上一位角色
  128.       @actor_index += $game_party.actors.size - 1
  129.       @actor_index %= $game_party.actors.size
  130.       # 切换到别的装备画面
  131.       $scene = Scene_Equip.new(@actor_index, @right_window.index)
  132.       return
  133.     end
  134.   end
  135. end

  136. class Game_Battler
  137. #--------------------------------------------------------------------------
  138. SW_SET = [1,2,3,4,5,6,7,8,9] # 此处设定武器和技能关联的属性id
  139. #--------------------------------------------------------------------------
  140. def skill_can_use?(skill_id)
  141.    if self.is_a?(Game_Actor) and self.weapon_id > 0
  142.      sw_boolean = false # 判断武器和技能关联
  143.      s = SW_SET & $data_skills[skill_id].element_set
  144.      if s.empty?
  145.        sw_boolean = true
  146.      else
  147.        for i in s
  148.          if  $data_weapons[self.weapon_id].element_set .include?(i)
  149.            sw_boolean = true
  150.            break
  151.          end
  152.        end
  153.      end
  154.      if sw_boolean == false
  155.        return false
  156.      end
  157.      
  158.      
  159. #这里修改为对各种SP的判断===========================     
  160.      current_sp=self.ammo[self.akind]
  161.      current_maxsp=self.cta[self.akind]
  162. #=======================================     
  163.      
  164.      
  165.      if $data_skills[skill_id].sp_cost > current_sp
  166.        return false
  167.      end
  168.    end
  169.    
  170.    if dead?
  171.      return false
  172.    end
  173.    if $data_skills[skill_id].atk_f == 0 and self.restriction == 1
  174.      return false
  175.    end
  176.    occasion = $data_skills[skill_id].occasion
  177.    if $game_temp.in_battle
  178.      return (occasion == 0 or occasion == 1)
  179.    else
  180.      return (occasion == 0 or occasion == 2)
  181.    end
  182. end
  183. end

  184. class Scene_Battle
  185.   def make_skill_action_result
  186.     # 获取特技
  187.     @skill = $data_skills[@active_battler.current_action.skill_id]
  188.     # 如果不是强制行动
  189.     unless @active_battler.current_action.forcing
  190.       # 因为 SP 耗尽而无法使用的情况下
  191.       unless @active_battler.skill_can_use?(@skill.id)
  192.         # 清除强制行动对像的战斗者
  193.         $game_temp.forcing_battler = nil
  194.         # 移至步骤 1
  195.         @phase4_step = 1
  196.         return
  197.       end
  198.     end

  199.    
  200. # 消耗 SP(区分不同种类)===========================
  201.     if @active_battler.is_a?(Game_Actor)
  202.       @active_battler.ammo[@active_battler.akind] -= @skill.sp_cost
  203.     else  
  204.       @active_battler.sp -= @skill.sp_cost
  205.     end if  
  206. #=======================================

  207.    
  208.     # 刷新状态窗口
  209.     @status_window.refresh
  210.     # 在帮助窗口显示特技名
  211.     @help_window.set_text(@skill.name, 1)
  212.     # 设置动画 ID
  213.     @animation1_id = @skill.animation1_id
  214.     @animation2_id = @skill.animation2_id
  215.     # 设置公共事件 ID
  216.     @common_event_id = @skill.common_event_id
  217.     # 设置对像侧战斗者
  218.     set_target_battlers(@skill.scope)
  219.     # 应用特技效果
  220.     for target in @target_battlers
  221.       target.skill_effect(@active_battler, @skill)
  222.     end
  223.   end
  224. end

  225. #==============================================================================
  226. # 物品对不同SP分别起作用
  227. #==============================================================================

  228. class Game_Battler
  229.   #--------------------------------------------------------------------------
  230.   # ● 应用物品效果
  231.   #     item : 物品
  232.   #--------------------------------------------------------------------------
  233.   def item_effect(item)
  234.     # 清除会心一击标志
  235.     self.critical = false
  236.     # 物品的效果范围是 HP 1 以上的己方、自己的 HP 为 0、
  237.     # 或者物品的效果范围是 HP 0 的己方、自己的 HP 为 1 以上的情况下
  238.     if ((item.scope == 3 or item.scope == 4) and self.hp == 0) or
  239.        ((item.scope == 5 or item.scope == 6) and self.hp >= 1)
  240.       # 过程结束
  241.       return false
  242.     end
  243.     # 清除有效标志
  244.     effective = false
  245.     # 公共事件 ID 是有效的情况下,设置为有效标志
  246.     effective |= item.common_event_id > 0
  247.     # 命中判定
  248.     hit_result = (rand(100) < item.hit)
  249.     # 不确定的特技的情况下设置为有效标志
  250.     effective |= item.hit < 100
  251.     # 命中的情况
  252.     if hit_result == true
  253.       # 计算回复量
  254.       recover_hp = maxhp * item.recover_hp_rate / 100 + item.recover_hp
  255.       

  256. #这里修改了对SP回复率的判断==========================            
  257.       recover_sp = self.cta[self.akind] * item.recover_sp_rate / 100 + item.recover_sp
  258. #=======================================


  259.       if recover_hp < 0
  260.         recover_hp += self.pdef * item.pdef_f / 20
  261.         recover_hp += self.mdef * item.mdef_f / 20
  262.         recover_hp = [recover_hp, 0].min
  263.       end
  264.       # 属性修正
  265.       recover_hp *= elements_correct(item.element_set)
  266.       recover_hp /= 100
  267.       recover_sp *= elements_correct(item.element_set)
  268.       recover_sp /= 100
  269.       # 分散
  270.       if item.variance > 0 and recover_hp.abs > 0
  271.         amp = [recover_hp.abs * item.variance / 100, 1].max
  272.         recover_hp += rand(amp+1) + rand(amp+1) - amp
  273.       end
  274.       if item.variance > 0 and recover_sp.abs > 0
  275.         amp = [recover_sp.abs * item.variance / 100, 1].max
  276.         recover_sp += rand(amp+1) + rand(amp+1) - amp
  277.       end
  278.       # 回复量符号为负的情况下
  279.       if recover_hp < 0
  280.         # 防御修正
  281.         if self.guarding?
  282.           recover_hp /= 2
  283.         end
  284.       end
  285.       # HP 回复量符号的反转、设置伤害值
  286.       self.damage = -recover_hp
  287.       # HP 以及 SP 的回复
  288.       last_hp = self.hp
  289.       self.hp += recover_hp
  290.       
  291.       
  292. #这里修改为对各种属性SP的判断=========================      
  293.       if self.is_a?(Game_Actor)
  294.         case item.i_rkind
  295.           when 255   #对自己所有的SP都起作用
  296.             for ii in 0...self.cta.size
  297.               current_sp = self.ammo[ii]
  298.               if ii==self.akind  #最大SP值的限制只对当前SP起作用
  299.                 current_maxsp=self.cta[ii]
  300.                 current_sp += recover_sp
  301.                 if current_sp > current_maxsp
  302.                   current_sp = current_maxsp
  303.                 end
  304.               else
  305.                 current_sp += recover_sp
  306.               end
  307.               self.ammo[ii] = current_sp
  308.             end  
  309.           when nil   #对自己当前正在使用的SP起作用
  310.             current_sp=self.ammo[self.akind]
  311.             current_maxsp=self.cta[self.akind]  #最大SP值的限制只对当前SP起作用
  312.             current_sp += recover_sp
  313.             if current_sp > current_maxsp
  314.               current_sp = current_maxsp
  315.             end
  316.             self.ammo[self.akind] = current_sp
  317.           else     #对自己某种特定属性的SP起作用
  318.             current_sp=self.ammo[item.i_rkind]
  319.             current_sp += recover_sp
  320.             self.ammo[item.i_rkind] = current_sp
  321.         end
  322.         last_sp = current_sp
  323.         effective =true
  324.       else  
  325.         last_sp = self.sp
  326.         self.sp += recover_sp
  327.         effective |= self.sp != last_sp
  328.       end  
  329. # ======================================


  330.       effective |= self.hp != last_hp
  331.       # 状态变化
  332.       @state_changed = false
  333.       effective |= states_plus(item.plus_state_set)
  334.       effective |= states_minus(item.minus_state_set)
  335.       # 能力上升值有效的情况下
  336.       if item.parameter_type > 0 and item.parameter_points != 0
  337.         # 能力值的分支
  338.         case item.parameter_type
  339.         when 1  # MaxHP
  340.           @maxhp_plus += item.parameter_points
  341.         when 2  # MaxSP
  342.           @maxsp_plus += item.parameter_points
  343.         when 3  # 力量
  344.           @str_plus += item.parameter_points
  345.         when 4  # 灵巧
  346.           @dex_plus += item.parameter_points
  347.         when 5  # 速度
  348.           @agi_plus += item.parameter_points
  349.         when 6  # 魔力
  350.           @int_plus += item.parameter_points
  351.         end
  352.         # 设置有效标志
  353.         effective = true
  354.       end
  355.       # HP 回复率与回复量为 0 的情况下
  356.       if item.recover_hp_rate == 0 and item.recover_hp == 0
  357.         # 设置伤害为空的字符串
  358.         self.damage = ""
  359.         # SP 回复率与回复量为 0、能力上升值无效的情况下
  360.         if item.recover_sp_rate == 0 and item.recover_sp == 0 and
  361.            (item.parameter_type == 0 or item.parameter_points == 0)
  362.           # 状态没有变化的情况下
  363.           unless @state_changed
  364.             # 伤害设置为 "Miss"
  365.             self.damage = "Miss"
  366.           end
  367.         end
  368.       end
  369.     # Miss 的情况下
  370.     else
  371.       # 伤害设置为 "Miss"
  372.       self.damage = "Miss"
  373.     end
  374.     # 不在战斗中的情况下
  375.     unless $game_temp.in_battle
  376.       # 伤害设置为 nil
  377.       self.damage = nil
  378.     end
  379.     # 过程结束
  380.     return effective
  381.   end  
  382. end

  383. class Game_Actor < Game_Battler
  384.   def now_exp
  385.     return @exp - @exp_list[@level]
  386.   end
  387.   def next_exp
  388.     return @exp_list[@level+1] > 0 ? @exp_list[@level+1] - @exp_list[@level] : 0
  389.   end
  390. end

  391. #==============================================================================
  392. # ■ Window_Base
  393. #------------------------------------------------------------------------------
  394. #  血条的绘制
  395. #==============================================================================

  396. class Window_Base < Window
  397.   #--------------------------------------------------------------------------
  398.   # ● 描绘 SP
  399.   #     actor : 角色
  400.   #     x     : 描画目标 X 坐标
  401.   #     y     : 描画目标 Y 坐标
  402.   #     width : 描画目标的宽
  403.   #--------------------------------------------------------------------------
  404.   def draw_actor_sp(actor, x, y, width = 144)
  405.     # 描绘字符串 "SP"
  406.     self.contents.font.color = system_color
  407.     self.contents.draw_text(x, y, 32, 32, $data_system.words.sp)
  408.     # 计算描绘 MaxSP 所需的空间
  409.     if width - 32 >= 108
  410.       sp_x = x + width - 108
  411.       flag = true
  412.     elsif width - 32 >= 48
  413.       sp_x = x + width - 48
  414.       flag = false
  415.     end
  416.     # 描绘 SP
  417.     current_sp=actor.ammo[actor.akind]
  418.     current_maxsp=actor.cta[actor.akind]
  419.     self.contents.font.color = current_sp == 0 ? knockout_color :
  420.       current_sp <= current_maxsp / 4 ? crisis_color : normal_color
  421.     self.contents.draw_text(sp_x, y, 48, 32, current_sp.to_s, 2)
  422.     # 描绘 MaxSP
  423.     if flag
  424.       self.contents.font.color = normal_color
  425.       self.contents.draw_text(sp_x + 48, y, 12, 32, "/", 1)
  426.       self.contents.draw_text(sp_x + 60, y, 48, 32, current_maxsp.to_s)
  427.     end
  428.   end
  429.   #--------------------------------------------------------------------------
  430.   # ● HP ゲージの描画
  431.   #--------------------------------------------------------------------------
  432.   # オリジナルのHP描画を draw_actor_hp_original と名前変更
  433.   alias :draw_actor_hp_original :draw_actor_hp
  434.   def draw_actor_hp(actor, x, y, width = 144)
  435.     # 変数rateに 現在のHP/MHPを代入
  436.     if actor.maxhp != 0
  437.       rate = actor.hp.to_f / actor.maxhp
  438.     else
  439.       rate = 0
  440.     end
  441.     # plus_x:X座標の位置補正 rate_x:X座標の位置補正(%) plus_y:Y座標の位置補正
  442.     # plus_width:幅の補正 rate_width:幅の補正(%) height:縦幅
  443.     # align1:描画タイプ1 0:左詰め 1:中央揃え 2:右詰め
  444.     # align2:描画タイプ2 0:上詰め 1:中央揃え 2:下詰め
  445.     # align3:ゲージタイプ 0:左詰め 1:右詰め
  446.     plus_x = 0
  447.     rate_x = 0
  448.     plus_y = 25
  449.     plus_width = 0
  450.     rate_width = 100
  451.     height = 10
  452.     align1 = 1
  453.     align2 = 2
  454.     align3 = 0
  455.     # グラデーション設定 grade1:空ゲージ grade2:実ゲージ
  456.     # (0:横にグラデーション 1:縦にグラデーション 2:斜めにグラデーション(激重))
  457.     grade1 = 1
  458.     grade2 = 0
  459.     # 色設定。color1:外枠,color2:中枠
  460.     # color3:空ゲージダークカラー,color4:空ゲージライトカラー
  461.     # color5:実ゲージダークカラー,color6:実ゲージライトカラー
  462.     color1 = Color.new(0, 0, 0, 192)
  463.     color2 = Color.new(255, 255, 192, 192)
  464.     color3 = Color.new(0, 0, 0, 192)
  465.     color4 = Color.new(64, 0, 0, 192)
  466.     color5 = Color.new(80 - 24 * rate, 80 * rate, 14 * rate, 192)
  467.     color6 = Color.new(240 - 72 * rate, 240 * rate, 62 * rate, 192)
  468.     # 変数spに描画するゲージの幅を代入
  469.     if actor.maxhp != 0
  470.       hp = (width + plus_width) * actor.hp * rate_width / 100 / actor.maxhp
  471.     else
  472.       hp = 0
  473.     end
  474.     # ゲージの描画
  475.     gauge_rect(x + plus_x + width * rate_x / 100, y + plus_y,
  476.                 width, plus_width + width * rate_width / 100,
  477.                 height, hp, align1, align2, align3,
  478.                 color1, color2, color3, color4, color5, color6, grade1, grade2)
  479.     # オリジナルのHP描画処理を呼び出し
  480.     draw_actor_hp_original(actor, x, y, width)
  481.   end
  482.   #--------------------------------------------------------------------------
  483.   # ● SP ゲージの描画
  484.   #--------------------------------------------------------------------------
  485.   # オリジナルのSP描画を draw_actor_sp_original と名前変更
  486.   alias :draw_actor_sp_original :draw_actor_sp
  487.   def draw_actor_sp(actor, x, y, width = 144)
  488.     # 変数rateに 現在のSP/MSPを代入
  489.     if actor.maxsp != 0
  490.       rate = actor.sp.to_f / actor.cta[actor.akind]
  491.     else
  492.       rate = 1
  493.     end
  494.     # plus_x:X座標の位置補正 rate_x:X座標の位置補正(%) plus_y:Y座標の位置補正
  495.     # plus_width:幅の補正 rate_width:幅の補正(%) height:縦幅
  496.     # align1:描画タイプ1 0:左詰め 1:中央揃え 2:右詰め
  497.     # align2:描画タイプ2 0:上詰め 1:中央揃え 2:下詰め
  498.     # align3:ゲージタイプ 0:左詰め 1:右詰め
  499.     plus_x = 0
  500.     rate_x = 0
  501.     plus_y = 25
  502.     plus_width = 0
  503.     rate_width = 100
  504.     height = 10
  505.     align1 = 1
  506.     align2 = 2
  507.     align3 = 0
  508.     # グラデーション設定 grade1:空ゲージ grade2:実ゲージ
  509.     # (0:横にグラデーション 1:縦にグラデーション 2:斜めにグラデーション(激重))
  510.     grade1 = 1
  511.     grade2 = 0
  512.     # 色設定。color1:外枠,color2:中枠
  513.     # color3:空ゲージダークカラー,color4:空ゲージライトカラー
  514.     # color5:実ゲージダークカラー,color6:実ゲージライトカラー
  515.    
  516.    
  517. #区分SP属性的颜色===============================   
  518.     case actor.akind
  519.       when 0 # 火
  520.         color1 = Color.new(0, 0, 0, 192)
  521.         color2 = Color.new(255, 192, 192, 192)
  522.         color3 = Color.new(0, 0, 0, 192)
  523.         color4 = Color.new(0, 64, 64, 192)
  524.         color5 = Color.new(128 * rate, 0, 0, 192)
  525.         color6 = Color.new(255 * rate, 0, 0, 192)
  526.       when 3 # 水
  527.         color1 = Color.new(0, 0, 0, 192)
  528.         color2 = Color.new(192, 192, 255, 192)
  529.         color3 = Color.new(0, 0, 0, 192)
  530.         color4 = Color.new(64, 64, 0, 192)
  531.         color5 = Color.new(0, 0, 128 * rate, 192)
  532.         color6 = Color.new(0, 0, 255 * rate, 192)
  533.       when 5 # 风
  534.         color1 = Color.new(0, 0, 0, 192)
  535.         color2 = Color.new(192, 255, 224, 192)
  536.         color3 = Color.new(0, 0, 0, 192)
  537.         color4 = Color.new(64, 0, 0, 192)
  538.         color5 = Color.new(0, 128 * rate, 96 * rate, 192)
  539.         color6 = Color.new(0, 255 * rate, 192 * rate, 192)
  540.       when 4 # 地
  541.         color1 = Color.new(0, 0, 0, 192)
  542.         color2 = Color.new(255, 224, 192, 192)
  543.         color3 = Color.new(0, 0, 0, 192)
  544.         color4 = Color.new(0, 0, 0, 192)
  545.         color5 = Color.new(128 * rate, 64 * rate, 0, 192)
  546.         color6 = Color.new(255 * rate, 128 * rate, 0, 192)
  547.       when 2 # 雷
  548.         color1 = Color.new(0, 0, 0, 192)
  549.         color2 = Color.new(192, 224, 255, 192)
  550.         color3 = Color.new(0, 0, 0, 192)
  551.         color4 = Color.new(64, 0, 0, 192)
  552.         color5 = Color.new(0, 96 * rate, 128 * rate, 192)
  553.         color6 = Color.new(0, 192 * rate, 255 * rate, 192)
  554.       when 6 # 光
  555.         color1 = Color.new(0, 0, 0, 192)
  556.         color2 = Color.new(255, 255, 192, 192)
  557.         color3 = Color.new(0, 0, 0, 192)
  558.         color4 = Color.new(0, 0, 64, 192)
  559.         color5 = Color.new(128 * rate, 128 * rate, 64 * rate, 192)
  560.         color6 = Color.new(255 * rate, 255 * rate, 96 * rate, 192)
  561.       when 7 # 暗
  562.         color1 = Color.new(0, 0, 0, 192)
  563.         color2 = Color.new(160, 0, 224, 192)
  564.         color3 = Color.new(0, 0, 0, 192)
  565.         color4 = Color.new(0, 0, 0, 192)
  566.         color5 = Color.new(32 * rate, 0, 64 * rate, 192)
  567.         color6 = Color.new(128 * rate, 0 * rate, 192 * rate, 192)
  568.       when 8 # 毒
  569.         color1 = Color.new(0, 0, 0, 192)
  570.         color2 = Color.new(128, 224, 128, 192)
  571.         color3 = Color.new(0, 0, 0, 192)
  572.         color4 = Color.new(0, 0, 0, 192)
  573.         color5 = Color.new(0, 96 * rate, 0, 192)
  574.         color6 = Color.new(0, 192 * rate, 0, 192)
  575.       else
  576.         color1 = Color.new(0, 0, 0, 192)
  577.         color2 = Color.new(255, 255, 255, 192)
  578.         color3 = Color.new(0, 0, 0, 192)
  579.         color4 = Color.new(0, 0, 0, 192)
  580.         color5 = Color.new(64 * rate, 64 * rate, 64 * rate, 192)
  581.         color6 = Color.new(192 * rate, 192 * rate, 192 * rate, 192)  
  582.     end  
  583. #=======================================      
  584.       
  585.       
  586.     # 変数spに描画するゲージの幅を代入
  587.     current_sp=actor.ammo[actor.akind]
  588.     current_maxsp=actor.cta[actor.akind]
  589.     if current_maxsp != 0
  590.       sp = (width + plus_width) * current_sp * rate_width / 100 / current_maxsp
  591.     else
  592.       sp = (width + plus_width) * rate_width / 100
  593.     end
  594.     # ゲージの描画
  595.     gauge_rect(x + plus_x + width * rate_x / 100, y + plus_y,
  596.                 width, plus_width + width * rate_width / 100,
  597.                 height, sp, align1, align2, align3,
  598.                 color1, color2, color3, color4, color5, color6, grade1, grade2)
  599.     # オリジナルのSP描画処理を呼び出し
  600.     draw_actor_sp_original(actor, x, y, width)
  601.   end
  602.   #--------------------------------------------------------------------------
  603.   # ● ゲージの描画
  604.   #--------------------------------------------------------------------------
  605.   def gauge_rect(x, y, rect_width, width, height, gauge, align1, align2, align3,
  606.                 color1, color2, color3, color4, color5, color6, grade1, grade2)
  607.     case align1
  608.     when 1
  609.       x += (rect_width - width) / 2
  610.     when 2
  611.       x += rect_width - width
  612.     end
  613.     case align2
  614.     when 1
  615.       y -= height / 2
  616.     when 2
  617.       y -= height
  618.     end
  619.     # 枠描画
  620.     self.contents.fill_rect(x, y, width, height, color1)
  621.     self.contents.fill_rect(x + 1, y + 1, width - 2, height - 2, color2)
  622.     if align3 == 0
  623.       if grade1 == 2
  624.         grade1 = 3
  625.       end
  626.       if grade2 == 2
  627.         grade2 = 3
  628.       end
  629.     end
  630.     if (align3 == 1 and grade1 == 0) or grade1 > 0
  631.       color = color3
  632.       color3 = color4
  633.       color4 = color
  634.     end
  635.     if (align3 == 1 and grade2 == 0) or grade2 > 0
  636.       color = color5
  637.       color5 = color6
  638.       color6 = color
  639.     end
  640.     # 空ゲージの描画
  641.     self.contents.gradation_rect(x + 2, y + 2, width - 4, height - 4,
  642.                                   color3, color4, grade1)
  643.     if align3 == 1
  644.       x += width - gauge
  645.     end
  646.     # 実ゲージの描画
  647.     self.contents.gradation_rect(x + 2, y + 2, gauge - 4, height - 4,
  648.                                   color5, color6, grade2)
  649.   end
  650. end

  651. #------------------------------------------------------------------------------
  652. #  Bitmapクラスに新たな機能を追加します。
  653. #==============================================================================

  654. class Bitmap
  655.   #--------------------------------------------------------------------------
  656.   # ● 矩形をグラデーション表示
  657.   #     color1 : スタートカラー
  658.   #     color2 : エンドカラー
  659.   #     align  :  0:横にグラデーション
  660.   #               1:縦にグラデーション
  661.   #               2:斜めにグラデーション(激重につき注意)
  662.   #--------------------------------------------------------------------------
  663.   def gradation_rect(x, y, width, height, color1, color2, align = 0)
  664.     if align == 0
  665.       for i in x...x + width
  666.         red   = color1.red + (color2.red - color1.red) * (i - x) / (width - 1)
  667.         green = color1.green +
  668.                 (color2.green - color1.green) * (i - x) / (width - 1)
  669.         blue  = color1.blue +
  670.                 (color2.blue - color1.blue) * (i - x) / (width - 1)
  671.         alpha = color1.alpha +
  672.                 (color2.alpha - color1.alpha) * (i - x) / (width - 1)
  673.         color = Color.new(red, green, blue, alpha)
  674.         fill_rect(i, y, 1, height, color)
  675.       end
  676.     elsif align == 1
  677.       for i in y...y + height
  678.         red   = color1.red +
  679.                 (color2.red - color1.red) * (i - y) / (height - 1)
  680.         green = color1.green +
  681.                 (color2.green - color1.green) * (i - y) / (height - 1)
  682.         blue  = color1.blue +
  683.                 (color2.blue - color1.blue) * (i - y) / (height - 1)
  684.         alpha = color1.alpha +
  685.                 (color2.alpha - color1.alpha) * (i - y) / (height - 1)
  686.         color = Color.new(red, green, blue, alpha)
  687.         fill_rect(x, i, width, 1, color)
  688.       end
  689.     elsif align == 2
  690.       for i in x...x + width
  691.         for j in y...y + height
  692.           red   = color1.red + (color2.red - color1.red) *
  693.                   ((i - x) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  694.           green = color1.green + (color2.green - color1.green) *
  695.                   ((i - x) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  696.           blue  = color1.blue + (color2.blue - color1.blue) *
  697.                   ((i - x) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  698.           alpha = color1.alpha + (color2.alpha - color1.alpha) *
  699.                   ((i - x) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  700.           color = Color.new(red, green, blue, alpha)
  701.           set_pixel(i, j, color)
  702.         end
  703.       end
  704.     elsif align == 3
  705.       for i in x...x + width
  706.         for j in y...y + height
  707.           red   = color1.red + (color2.red - color1.red) *
  708.                 ((x + width - i) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  709.           green = color1.green + (color2.green - color1.green) *
  710.                 ((x + width - i) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  711.           blue  = color1.blue + (color2.blue - color1.blue) *
  712.                 ((x + width - i) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  713.           alpha = color1.alpha + (color2.alpha - color1.alpha) *
  714.                 ((x + width - i) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  715.           color = Color.new(red, green, blue, alpha)
  716.           set_pixel(i, j, color)
  717.         end
  718.       end
  719.     end
  720.   end
  721. end

复制代码

還有一個就是
沒有附帶武器就退出裝備界面後會發生 No Method Error
錯誤指向 不同SP分开用(改进) 136行以下句子
      @actor.ammo[@actor.akind] = [$lammo[@actor.akind],@actor.cta[@actor.akind]].min#弹药种类相同取弹匣小值

$lammo 此時爲nil
不做頭像做簽名,看我囧冏有神(多謝山人有情提供 )
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
3
星屑
50
在线时间
177 小时
注册时间
2008-3-21
帖子
939
17
 楼主| 发表于 2008-6-2 19:17:15 | 只看该作者
这回应该不会了吧,这个是改进版V1.02

http://rpg.blue/upload_program/f ... ��V102_92834207.rar


  1. # 不同种类的SP分开用 改进版 V1.02
  2. # 制作 SLICK
  3. # 技术指导/测试 禾西

  4. # 修正了几个BUG
  5. # 修正了V1.01版中卸掉武器就会出脚本错
  6. # 修正了V1.01版中特定药物使用后SP超上限的BUG

  7. module RPG
  8.   class Weapon  # 武器名称所能决定SP种类及属性的定义方法(格式像这样:钢匕首,2000,0)
  9.     attr_writer :w_maxsp
  10.     attr_writer :w_akind
  11.     def name
  12.       name = @name.split(/,/)[0]
  13.       return name != nil ? name : ''
  14.     end
  15.     def w_maxsp
  16.       w_maxsp = @name.split(/,/)[1]
  17.       return w_maxsp != nil ? w_maxsp.to_i : 0
  18.     end
  19.     def w_akind
  20.       w_akind = @name.split(/,/)[2]
  21.       return w_akind != nil ? w_akind.to_i : 1
  22.     end  
  23.   end  
  24.   class Item  # 定义某种物品能回复哪种SP(格式像这样:普通滋补剂,0)
  25.     attr_writer :i_rkind
  26.     def name
  27.       name = @name.split(/,/)[0]
  28.       return name != nil ? name : ''
  29.     end
  30.     def i_rkind
  31.       i_rkind = @name.split(/,/)[1]
  32.       return i_rkind != nil ? i_rkind.to_i : nil
  33.     end  
  34.   end  
  35. end

  36. class Game_Actor < Game_Battler
  37.   #--------------------------------------------------------------------------
  38.   # ● 公開インスタンス変数
  39.   #--------------------------------------------------------------------------
  40. #这里做修改==================================  
  41.   attr_accessor :ammo                     # SP残留量
  42.   attr_accessor :akind                    # 使用何种SP
  43.   attr_accessor :cta                      # SP最大容量
  44. #=======================================  
  45.   


  46. #感谢禾大人帮助精简==============================
  47.   #--------------------------------------------------------------------------
  48.   # ● セットアップ
  49.   #     actor_id : アクター ID
  50.   #--------------------------------------------------------------------------
  51.   alias ooo_setup setup
  52.   def setup(actor_id)
  53. #=======================================   
  54.    

  55.    
  56. #这里做修改==================================   
  57.     @ammo = [0,0,0,0,0,0,0,0,0]# 目前只使用九种能量
  58.     @akind = 1 # 缺省情况下使用格斗技能量
  59.     @cta = [0,0,0,0,0,0,0,0,0]#  这个新版本中每一种能量的最大值都要设定
  60. #=======================================   
  61.     ooo_setup(actor_id)
  62.   end
  63. end

  64. class Scene_Equip
  65.   #--------------------------------------------------------------------------
  66.   # ● 刷新画面 (右侧窗口被激活的情况下)
  67.   #--------------------------------------------------------------------------
  68.   def update_right
  69.     # 按下 B 键的情况下
  70.     if Input.trigger?(Input::B)
  71.       # 演奏取消 SE
  72.       $game_system.se_play($data_system.cancel_se)
  73.       
  74.       
  75. #装备结束时再次判断一下属性SP值========================      
  76.       neomaxsp=0
  77.       if @actor.weapon_id !=0
  78.         @actor.akind=$data_weapons[@actor.weapon_id].w_akind
  79.         neomaxsp+=$data_weapons[@actor.weapon_id].w_maxsp
  80.         @actor.cta[@actor.akind]=neomaxsp
  81.         @actor.ammo[@actor.akind] = [$lammo[@actor.akind],@actor.cta[@actor.akind]].min#弹药种类相同取弹匣小值
  82.       else      #如果扔掉武器,SP就是0
  83.         @actor.akind=1
  84.         @actor.cta[@actor.akind]=0
  85.         @actor.ammo[@actor.akind]=0
  86.       end  
  87.       
  88. #=======================================      
  89.       

  90.       # 切换到菜单画面
  91.       $scene = Scene_Menu.new(2)
  92.       return
  93.     end
  94.     # 按下 C 键的情况下
  95.     if Input.trigger?(Input::C)
  96.       # 固定装备的情况下
  97.       if @actor.equip_fix?(@right_window.index)
  98.         # 演奏冻结 SE
  99.         $game_system.se_play($data_system.buzzer_se)
  100.         return
  101.       end
  102.       # 演奏确定 SE
  103.       $game_system.se_play($data_system.decision_se)
  104.       # 激活物品窗口
  105.       @right_window.active = false
  106.       @item_window.active = true
  107.       @item_window.index = 0
  108.       
  109.       
  110. #开始装备武器时判断一下属性SP值========================      
  111.       $lkind = @actor.akind #弹药种类是否与以前相同?
  112.       $lammo = []
  113.       for ii in [email protected]
  114.         $lammo[ii][email protected][ii]
  115.       end
  116. #=======================================      
  117.       
  118.       
  119.       return
  120.     end
  121.     # 按下 R 键的情况下
  122.     if Input.trigger?(Input::R)
  123.       # 演奏光标 SE
  124.       $game_system.se_play($data_system.cursor_se)
  125.       # 移至下一位角色
  126.       @actor_index += 1
  127.       @actor_index %= $game_party.actors.size
  128.       # 切换到别的装备画面
  129.       $scene = Scene_Equip.new(@actor_index, @right_window.index)
  130.       return
  131.     end
  132.     # 按下 L 键的情况下
  133.     if Input.trigger?(Input::L)
  134.       # 演奏光标 SE
  135.       $game_system.se_play($data_system.cursor_se)
  136.       # 移至上一位角色
  137.       @actor_index += $game_party.actors.size - 1
  138.       @actor_index %= $game_party.actors.size
  139.       # 切换到别的装备画面
  140.       $scene = Scene_Equip.new(@actor_index, @right_window.index)
  141.       return
  142.     end
  143.   end
  144. end

  145. class Game_Battler
  146. #--------------------------------------------------------------------------
  147. SW_SET = [1,2,3,4,5,6,7,8,9] # 此处设定武器和技能关联的属性id
  148. #--------------------------------------------------------------------------
  149. def skill_can_use?(skill_id)
  150.    if self.is_a?(Game_Actor) and self.weapon_id > 0
  151.      sw_boolean = false # 判断武器和技能关联
  152.      s = SW_SET & $data_skills[skill_id].element_set
  153.      if s.empty?
  154.        sw_boolean = true
  155.      else
  156.        for i in s
  157.          if  $data_weapons[self.weapon_id].element_set .include?(i)
  158.            sw_boolean = true
  159.            break
  160.          end
  161.        end
  162.      end
  163.      if sw_boolean == false
  164.        return false
  165.      end
  166.      
  167.      
  168. #这里修改为对各种SP的判断===========================     
  169.      current_sp=self.ammo[self.akind]
  170.      current_maxsp=self.cta[self.akind]
  171. #=======================================     
  172.      
  173.      
  174.      if $data_skills[skill_id].sp_cost > current_sp
  175.        return false
  176.      end
  177.    end
  178.    
  179.    if dead?
  180.      return false
  181.    end
  182.    if $data_skills[skill_id].atk_f == 0 and self.restriction == 1
  183.      return false
  184.    end
  185.    occasion = $data_skills[skill_id].occasion
  186.    if $game_temp.in_battle
  187.      return (occasion == 0 or occasion == 1)
  188.    else
  189.      return (occasion == 0 or occasion == 2)
  190.    end
  191. end
  192. end

  193. class Scene_Battle
  194.   def make_skill_action_result
  195.     # 获取特技
  196.     @skill = $data_skills[@active_battler.current_action.skill_id]
  197.     # 如果不是强制行动
  198.     unless @active_battler.current_action.forcing
  199.       # 因为 SP 耗尽而无法使用的情况下
  200.       unless @active_battler.skill_can_use?(@skill.id)
  201.         # 清除强制行动对像的战斗者
  202.         $game_temp.forcing_battler = nil
  203.         # 移至步骤 1
  204.         @phase4_step = 1
  205.         return
  206.       end
  207.     end

  208.    
  209. # 消耗 SP(区分不同种类)===========================
  210.     if @active_battler.is_a?(Game_Actor)
  211.       @active_battler.ammo[@active_battler.akind] -= @skill.sp_cost
  212.     else  
  213.       @active_battler.sp -= @skill.sp_cost
  214.     end if  
  215. #=======================================

  216.    
  217.     # 刷新状态窗口
  218.     @status_window.refresh
  219.     # 在帮助窗口显示特技名
  220.     @help_window.set_text(@skill.name, 1)
  221.     # 设置动画 ID
  222.     @animation1_id = @skill.animation1_id
  223.     @animation2_id = @skill.animation2_id
  224.     # 设置公共事件 ID
  225.     @common_event_id = @skill.common_event_id
  226.     # 设置对像侧战斗者
  227.     set_target_battlers(@skill.scope)
  228.     # 应用特技效果
  229.     for target in @target_battlers
  230.       target.skill_effect(@active_battler, @skill)
  231.     end
  232.   end
  233. end

  234. #==============================================================================
  235. # 物品对不同SP分别起作用
  236. #==============================================================================

  237. class Game_Battler
  238.   #--------------------------------------------------------------------------
  239.   # ● 应用物品效果
  240.   #     item : 物品
  241.   #--------------------------------------------------------------------------
  242.   def item_effect(item)
  243.     # 清除会心一击标志
  244.     self.critical = false
  245.     # 物品的效果范围是 HP 1 以上的己方、自己的 HP 为 0、
  246.     # 或者物品的效果范围是 HP 0 的己方、自己的 HP 为 1 以上的情况下
  247.     if ((item.scope == 3 or item.scope == 4) and self.hp == 0) or
  248.        ((item.scope == 5 or item.scope == 6) and self.hp >= 1)
  249.       # 过程结束
  250.       return false
  251.     end
  252.     # 清除有效标志
  253.     effective = false
  254.     # 公共事件 ID 是有效的情况下,设置为有效标志
  255.     effective |= item.common_event_id > 0
  256.     # 命中判定
  257.     hit_result = (rand(100) < item.hit)
  258.     # 不确定的特技的情况下设置为有效标志
  259.     effective |= item.hit < 100
  260.     # 命中的情况
  261.     if hit_result == true
  262.       # 计算回复量
  263.       recover_hp = maxhp * item.recover_hp_rate / 100 + item.recover_hp
  264.       

  265. #这里修改了对SP回复率的判断==========================            
  266.       recover_sp = self.cta[self.akind] * item.recover_sp_rate / 100 + item.recover_sp
  267. #=======================================


  268.       if recover_hp < 0
  269.         recover_hp += self.pdef * item.pdef_f / 20
  270.         recover_hp += self.mdef * item.mdef_f / 20
  271.         recover_hp = [recover_hp, 0].min
  272.       end
  273.       # 属性修正
  274.       recover_hp *= elements_correct(item.element_set)
  275.       recover_hp /= 100
  276.       recover_sp *= elements_correct(item.element_set)
  277.       recover_sp /= 100
  278.       # 分散
  279.       if item.variance > 0 and recover_hp.abs > 0
  280.         amp = [recover_hp.abs * item.variance / 100, 1].max
  281.         recover_hp += rand(amp+1) + rand(amp+1) - amp
  282.       end
  283.       if item.variance > 0 and recover_sp.abs > 0
  284.         amp = [recover_sp.abs * item.variance / 100, 1].max
  285.         recover_sp += rand(amp+1) + rand(amp+1) - amp
  286.       end
  287.       # 回复量符号为负的情况下
  288.       if recover_hp < 0
  289.         # 防御修正
  290.         if self.guarding?
  291.           recover_hp /= 2
  292.         end
  293.       end
  294.       # HP 回复量符号的反转、设置伤害值
  295.       self.damage = -recover_hp
  296.       # HP 以及 SP 的回复
  297.       last_hp = self.hp
  298.       self.hp += recover_hp
  299.       
  300.       
  301. #这里修改为对各种属性SP的判断=========================      
  302.       if self.is_a?(Game_Actor)
  303.         case item.i_rkind
  304.           when 255   #对自己所有的SP都起作用
  305.             for ii in 0...self.cta.size
  306.               current_sp = self.ammo[ii]
  307.               if ii==self.akind  #最大SP值的限制只对当前SP起作用
  308.                 current_maxsp=self.cta[ii]
  309.                 current_sp += recover_sp
  310.                 if current_sp > current_maxsp
  311.                   current_sp = current_maxsp
  312.                 end
  313.               else
  314.                 current_sp += recover_sp
  315.               end
  316.               self.ammo[ii] = current_sp
  317.             end  
  318.           when nil   #对自己当前正在使用的SP起作用
  319.             current_sp=self.ammo[self.akind]
  320.             current_maxsp=self.cta[self.akind]  #最大SP值的限制只对当前SP起作用
  321.             current_sp += recover_sp
  322.             if current_sp > current_maxsp
  323.               current_sp = current_maxsp
  324.             end
  325.             self.ammo[self.akind] = current_sp
  326.           else     #对自己某种特定属性的SP起作用
  327.             current_sp=self.ammo[item.i_rkind]
  328.             current_sp += recover_sp
  329.             if item.i_rkind==self.akind    #对不可见的SP就不加限制以防出错
  330.               current_maxsp=self.cta[self.akind]    #对可见的SP就规定上限
  331.               if current_sp > current_maxsp
  332.                 current_sp = current_maxsp
  333.               end
  334.             end  
  335.             self.ammo[item.i_rkind] = current_sp
  336.         end
  337.         last_sp = current_sp
  338.         effective =true
  339.       else  
  340.         last_sp = self.sp
  341.         self.sp += recover_sp
  342.         effective |= self.sp != last_sp
  343.       end  
  344. # ======================================


  345.       effective |= self.hp != last_hp
  346.       # 状态变化
  347.       @state_changed = false
  348.       effective |= states_plus(item.plus_state_set)
  349.       effective |= states_minus(item.minus_state_set)
  350.       # 能力上升值有效的情况下
  351.       if item.parameter_type > 0 and item.parameter_points != 0
  352.         # 能力值的分支
  353.         case item.parameter_type
  354.         when 1  # MaxHP
  355.           @maxhp_plus += item.parameter_points
  356.         when 2  # MaxSP
  357.           @maxsp_plus += item.parameter_points
  358.         when 3  # 力量
  359.           @str_plus += item.parameter_points
  360.         when 4  # 灵巧
  361.           @dex_plus += item.parameter_points
  362.         when 5  # 速度
  363.           @agi_plus += item.parameter_points
  364.         when 6  # 魔力
  365.           @int_plus += item.parameter_points
  366.         end
  367.         # 设置有效标志
  368.         effective = true
  369.       end
  370.       # HP 回复率与回复量为 0 的情况下
  371.       if item.recover_hp_rate == 0 and item.recover_hp == 0
  372.         # 设置伤害为空的字符串
  373.         self.damage = ""
  374.         # SP 回复率与回复量为 0、能力上升值无效的情况下
  375.         if item.recover_sp_rate == 0 and item.recover_sp == 0 and
  376.            (item.parameter_type == 0 or item.parameter_points == 0)
  377.           # 状态没有变化的情况下
  378.           unless @state_changed
  379.             # 伤害设置为 "Miss"
  380.             self.damage = "Miss"
  381.           end
  382.         end
  383.       end
  384.     # Miss 的情况下
  385.     else
  386.       # 伤害设置为 "Miss"
  387.       self.damage = "Miss"
  388.     end
  389.     # 不在战斗中的情况下
  390.     unless $game_temp.in_battle
  391.       # 伤害设置为 nil
  392.       self.damage = nil
  393.     end
  394.     # 过程结束
  395.     return effective
  396.   end  
  397. end

  398. class Game_Actor < Game_Battler
  399.   def now_exp
  400.     return @exp - @exp_list[@level]
  401.   end
  402.   def next_exp
  403.     return @exp_list[@level+1] > 0 ? @exp_list[@level+1] - @exp_list[@level] : 0
  404.   end
  405. end

  406. #==============================================================================
  407. # ■ Window_Base
  408. #------------------------------------------------------------------------------
  409. #  血条的绘制
  410. #==============================================================================

  411. class Window_Base < Window
  412.   #--------------------------------------------------------------------------
  413.   # ● 描绘 SP
  414.   #     actor : 角色
  415.   #     x     : 描画目标 X 坐标
  416.   #     y     : 描画目标 Y 坐标
  417.   #     width : 描画目标的宽
  418.   #--------------------------------------------------------------------------
  419.   def draw_actor_sp(actor, x, y, width = 144)
  420.     # 描绘字符串 "SP"
  421.     self.contents.font.color = system_color
  422.     self.contents.draw_text(x, y, 32, 32, $data_system.words.sp)
  423.     # 计算描绘 MaxSP 所需的空间
  424.     if width - 32 >= 108
  425.       sp_x = x + width - 108
  426.       flag = true
  427.     elsif width - 32 >= 48
  428.       sp_x = x + width - 48
  429.       flag = false
  430.     end
  431.     # 描绘 SP
  432.     current_sp=actor.ammo[actor.akind]
  433.     current_maxsp=actor.cta[actor.akind]
  434.     self.contents.font.color = current_sp == 0 ? knockout_color :
  435.       current_sp <= current_maxsp / 4 ? crisis_color : normal_color
  436.     self.contents.draw_text(sp_x, y, 48, 32, current_sp.to_s, 2)
  437.     # 描绘 MaxSP
  438.     if flag
  439.       self.contents.font.color = normal_color
  440.       self.contents.draw_text(sp_x + 48, y, 12, 32, "/", 1)
  441.       self.contents.draw_text(sp_x + 60, y, 48, 32, current_maxsp.to_s)
  442.     end
  443.   end
  444.   #--------------------------------------------------------------------------
  445.   # ● HP ゲージの描画
  446.   #--------------------------------------------------------------------------
  447.   # オリジナルのHP描画を draw_actor_hp_original と名前変更
  448.   alias :draw_actor_hp_original :draw_actor_hp
  449.   def draw_actor_hp(actor, x, y, width = 144)
  450.     # 変数rateに 現在のHP/MHPを代入
  451.     if actor.maxhp != 0
  452.       rate = actor.hp.to_f / actor.maxhp
  453.     else
  454.       rate = 0
  455.     end
  456.     # plus_x:X座標の位置補正 rate_x:X座標の位置補正(%) plus_y:Y座標の位置補正
  457.     # plus_width:幅の補正 rate_width:幅の補正(%) height:縦幅
  458.     # align1:描画タイプ1 0:左詰め 1:中央揃え 2:右詰め
  459.     # align2:描画タイプ2 0:上詰め 1:中央揃え 2:下詰め
  460.     # align3:ゲージタイプ 0:左詰め 1:右詰め
  461.     plus_x = 0
  462.     rate_x = 0
  463.     plus_y = 25
  464.     plus_width = 0
  465.     rate_width = 100
  466.     height = 10
  467.     align1 = 1
  468.     align2 = 2
  469.     align3 = 0
  470.     # グラデーション設定 grade1:空ゲージ grade2:実ゲージ
  471.     # (0:横にグラデーション 1:縦にグラデーション 2:斜めにグラデーション(激重))
  472.     grade1 = 1
  473.     grade2 = 0
  474.     # 色設定。color1:外枠,color2:中枠
  475.     # color3:空ゲージダークカラー,color4:空ゲージライトカラー
  476.     # color5:実ゲージダークカラー,color6:実ゲージライトカラー
  477.     color1 = Color.new(0, 0, 0, 192)
  478.     color2 = Color.new(255, 255, 192, 192)
  479.     color3 = Color.new(0, 0, 0, 192)
  480.     color4 = Color.new(64, 0, 0, 192)
  481.     color5 = Color.new(80 - 24 * rate, 80 * rate, 14 * rate, 192)
  482.     color6 = Color.new(240 - 72 * rate, 240 * rate, 62 * rate, 192)
  483.     # 変数spに描画するゲージの幅を代入
  484.     if actor.maxhp != 0
  485.       hp = (width + plus_width) * actor.hp * rate_width / 100 / actor.maxhp
  486.     else
  487.       hp = 0
  488.     end
  489.     # ゲージの描画
  490.     gauge_rect(x + plus_x + width * rate_x / 100, y + plus_y,
  491.                 width, plus_width + width * rate_width / 100,
  492.                 height, hp, align1, align2, align3,
  493.                 color1, color2, color3, color4, color5, color6, grade1, grade2)
  494.     # オリジナルのHP描画処理を呼び出し
  495.     draw_actor_hp_original(actor, x, y, width)
  496.   end
  497.   #--------------------------------------------------------------------------
  498.   # ● SP ゲージの描画
  499.   #--------------------------------------------------------------------------
  500.   # オリジナルのSP描画を draw_actor_sp_original と名前変更
  501.   alias :draw_actor_sp_original :draw_actor_sp
  502.   def draw_actor_sp(actor, x, y, width = 144)
  503.     # 変数rateに 現在のSP/MSPを代入
  504.     if actor.maxsp != 0
  505.       rate = actor.sp.to_f / actor.cta[actor.akind]
  506.     else
  507.       rate = 1
  508.     end
  509.     # plus_x:X座標の位置補正 rate_x:X座標の位置補正(%) plus_y:Y座標の位置補正
  510.     # plus_width:幅の補正 rate_width:幅の補正(%) height:縦幅
  511.     # align1:描画タイプ1 0:左詰め 1:中央揃え 2:右詰め
  512.     # align2:描画タイプ2 0:上詰め 1:中央揃え 2:下詰め
  513.     # align3:ゲージタイプ 0:左詰め 1:右詰め
  514.     plus_x = 0
  515.     rate_x = 0
  516.     plus_y = 25
  517.     plus_width = 0
  518.     rate_width = 100
  519.     height = 10
  520.     align1 = 1
  521.     align2 = 2
  522.     align3 = 0
  523.     # グラデーション設定 grade1:空ゲージ grade2:実ゲージ
  524.     # (0:横にグラデーション 1:縦にグラデーション 2:斜めにグラデーション(激重))
  525.     grade1 = 1
  526.     grade2 = 0
  527.     # 色設定。color1:外枠,color2:中枠
  528.     # color3:空ゲージダークカラー,color4:空ゲージライトカラー
  529.     # color5:実ゲージダークカラー,color6:実ゲージライトカラー
  530.    
  531.    
  532. #区分SP属性的颜色===============================   
  533.     case actor.akind
  534.       when 0 # 火
  535.         color1 = Color.new(0, 0, 0, 192)
  536.         color2 = Color.new(255, 192, 192, 192)
  537.         color3 = Color.new(0, 0, 0, 192)
  538.         color4 = Color.new(0, 64, 64, 192)
  539.         color5 = Color.new(128 * rate, 0, 0, 192)
  540.         color6 = Color.new(255 * rate, 0, 0, 192)
  541.       when 3 # 水
  542.         color1 = Color.new(0, 0, 0, 192)
  543.         color2 = Color.new(192, 192, 255, 192)
  544.         color3 = Color.new(0, 0, 0, 192)
  545.         color4 = Color.new(64, 64, 0, 192)
  546.         color5 = Color.new(0, 0, 128 * rate, 192)
  547.         color6 = Color.new(0, 0, 255 * rate, 192)
  548.       when 5 # 风
  549.         color1 = Color.new(0, 0, 0, 192)
  550.         color2 = Color.new(192, 255, 224, 192)
  551.         color3 = Color.new(0, 0, 0, 192)
  552.         color4 = Color.new(64, 0, 0, 192)
  553.         color5 = Color.new(0, 128 * rate, 96 * rate, 192)
  554.         color6 = Color.new(0, 255 * rate, 192 * rate, 192)
  555.       when 4 # 地
  556.         color1 = Color.new(0, 0, 0, 192)
  557.         color2 = Color.new(255, 224, 192, 192)
  558.         color3 = Color.new(0, 0, 0, 192)
  559.         color4 = Color.new(0, 0, 0, 192)
  560.         color5 = Color.new(128 * rate, 64 * rate, 0, 192)
  561.         color6 = Color.new(255 * rate, 128 * rate, 0, 192)
  562.       when 2 # 雷
  563.         color1 = Color.new(0, 0, 0, 192)
  564.         color2 = Color.new(192, 224, 255, 192)
  565.         color3 = Color.new(0, 0, 0, 192)
  566.         color4 = Color.new(64, 0, 0, 192)
  567.         color5 = Color.new(0, 96 * rate, 128 * rate, 192)
  568.         color6 = Color.new(0, 192 * rate, 255 * rate, 192)
  569.       when 6 # 光
  570.         color1 = Color.new(0, 0, 0, 192)
  571.         color2 = Color.new(255, 255, 192, 192)
  572.         color3 = Color.new(0, 0, 0, 192)
  573.         color4 = Color.new(0, 0, 64, 192)
  574.         color5 = Color.new(128 * rate, 128 * rate, 64 * rate, 192)
  575.         color6 = Color.new(255 * rate, 255 * rate, 96 * rate, 192)
  576.       when 7 # 暗
  577.         color1 = Color.new(0, 0, 0, 192)
  578.         color2 = Color.new(160, 0, 224, 192)
  579.         color3 = Color.new(0, 0, 0, 192)
  580.         color4 = Color.new(0, 0, 0, 192)
  581.         color5 = Color.new(32 * rate, 0, 64 * rate, 192)
  582.         color6 = Color.new(128 * rate, 0 * rate, 192 * rate, 192)
  583.       when 8 # 毒
  584.         color1 = Color.new(0, 0, 0, 192)
  585.         color2 = Color.new(128, 224, 128, 192)
  586.         color3 = Color.new(0, 0, 0, 192)
  587.         color4 = Color.new(0, 0, 0, 192)
  588.         color5 = Color.new(0, 96 * rate, 0, 192)
  589.         color6 = Color.new(0, 192 * rate, 0, 192)
  590.       else
  591.         color1 = Color.new(0, 0, 0, 192)
  592.         color2 = Color.new(255, 255, 255, 192)
  593.         color3 = Color.new(0, 0, 0, 192)
  594.         color4 = Color.new(0, 0, 0, 192)
  595.         color5 = Color.new(64 * rate, 64 * rate, 64 * rate, 192)
  596.         color6 = Color.new(192 * rate, 192 * rate, 192 * rate, 192)  
  597.     end  
  598. #=======================================      
  599.       
  600.       
  601.     # 変数spに描画するゲージの幅を代入
  602.     current_sp=actor.ammo[actor.akind]
  603.     current_maxsp=actor.cta[actor.akind]
  604.     if current_maxsp != 0
  605.       sp = (width + plus_width) * current_sp * rate_width / 100 / current_maxsp
  606.     else
  607.       sp = (width + plus_width) * rate_width / 100
  608.     end
  609.     # ゲージの描画
  610.     gauge_rect(x + plus_x + width * rate_x / 100, y + plus_y,
  611.                 width, plus_width + width * rate_width / 100,
  612.                 height, sp, align1, align2, align3,
  613.                 color1, color2, color3, color4, color5, color6, grade1, grade2)
  614.     # オリジナルのSP描画処理を呼び出し
  615.     draw_actor_sp_original(actor, x, y, width)
  616.   end
  617.   #--------------------------------------------------------------------------
  618.   # ● ゲージの描画
  619.   #--------------------------------------------------------------------------
  620.   def gauge_rect(x, y, rect_width, width, height, gauge, align1, align2, align3,
  621.                 color1, color2, color3, color4, color5, color6, grade1, grade2)
  622.     case align1
  623.     when 1
  624.       x += (rect_width - width) / 2
  625.     when 2
  626.       x += rect_width - width
  627.     end
  628.     case align2
  629.     when 1
  630.       y -= height / 2
  631.     when 2
  632.       y -= height
  633.     end
  634.     # 枠描画
  635.     self.contents.fill_rect(x, y, width, height, color1)
  636.     self.contents.fill_rect(x + 1, y + 1, width - 2, height - 2, color2)
  637.     if align3 == 0
  638.       if grade1 == 2
  639.         grade1 = 3
  640.       end
  641.       if grade2 == 2
  642.         grade2 = 3
  643.       end
  644.     end
  645.     if (align3 == 1 and grade1 == 0) or grade1 > 0
  646.       color = color3
  647.       color3 = color4
  648.       color4 = color
  649.     end
  650.     if (align3 == 1 and grade2 == 0) or grade2 > 0
  651.       color = color5
  652.       color5 = color6
  653.       color6 = color
  654.     end
  655.     # 空ゲージの描画
  656.     self.contents.gradation_rect(x + 2, y + 2, width - 4, height - 4,
  657.                                   color3, color4, grade1)
  658.     if align3 == 1
  659.       x += width - gauge
  660.     end
  661.     # 実ゲージの描画
  662.     self.contents.gradation_rect(x + 2, y + 2, gauge - 4, height - 4,
  663.                                   color5, color6, grade2)
  664.   end
  665. end

  666. #------------------------------------------------------------------------------
  667. #  Bitmapクラスに新たな機能を追加します。
  668. #==============================================================================

  669. class Bitmap
  670.   #--------------------------------------------------------------------------
  671.   # ● 矩形をグラデーション表示
  672.   #     color1 : スタートカラー
  673.   #     color2 : エンドカラー
  674.   #     align  :  0:横にグラデーション
  675.   #               1:縦にグラデーション
  676.   #               2:斜めにグラデーション(激重につき注意)
  677.   #--------------------------------------------------------------------------
  678.   def gradation_rect(x, y, width, height, color1, color2, align = 0)
  679.     if align == 0
  680.       for i in x...x + width
  681.         red   = color1.red + (color2.red - color1.red) * (i - x) / (width - 1)
  682.         green = color1.green +
  683.                 (color2.green - color1.green) * (i - x) / (width - 1)
  684.         blue  = color1.blue +
  685.                 (color2.blue - color1.blue) * (i - x) / (width - 1)
  686.         alpha = color1.alpha +
  687.                 (color2.alpha - color1.alpha) * (i - x) / (width - 1)
  688.         color = Color.new(red, green, blue, alpha)
  689.         fill_rect(i, y, 1, height, color)
  690.       end
  691.     elsif align == 1
  692.       for i in y...y + height
  693.         red   = color1.red +
  694.                 (color2.red - color1.red) * (i - y) / (height - 1)
  695.         green = color1.green +
  696.                 (color2.green - color1.green) * (i - y) / (height - 1)
  697.         blue  = color1.blue +
  698.                 (color2.blue - color1.blue) * (i - y) / (height - 1)
  699.         alpha = color1.alpha +
  700.                 (color2.alpha - color1.alpha) * (i - y) / (height - 1)
  701.         color = Color.new(red, green, blue, alpha)
  702.         fill_rect(x, i, width, 1, color)
  703.       end
  704.     elsif align == 2
  705.       for i in x...x + width
  706.         for j in y...y + height
  707.           red   = color1.red + (color2.red - color1.red) *
  708.                   ((i - x) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  709.           green = color1.green + (color2.green - color1.green) *
  710.                   ((i - x) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  711.           blue  = color1.blue + (color2.blue - color1.blue) *
  712.                   ((i - x) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  713.           alpha = color1.alpha + (color2.alpha - color1.alpha) *
  714.                   ((i - x) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  715.           color = Color.new(red, green, blue, alpha)
  716.           set_pixel(i, j, color)
  717.         end
  718.       end
  719.     elsif align == 3
  720.       for i in x...x + width
  721.         for j in y...y + height
  722.           red   = color1.red + (color2.red - color1.red) *
  723.                 ((x + width - i) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  724.           green = color1.green + (color2.green - color1.green) *
  725.                 ((x + width - i) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  726.           blue  = color1.blue + (color2.blue - color1.blue) *
  727.                 ((x + width - i) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  728.           alpha = color1.alpha + (color2.alpha - color1.alpha) *
  729.                 ((x + width - i) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  730.           color = Color.new(red, green, blue, alpha)
  731.           set_pixel(i, j, color)
  732.         end
  733.       end
  734.     end
  735.   end
  736. end

复制代码
我的个人空间:
http://434986751.qzone.qq.com
回复 支持 反对

使用道具 举报

Lv3.寻梦者

酱油的

梦石
0
星屑
1020
在线时间
2161 小时
注册时间
2007-12-22
帖子
3271

贵宾

18
发表于 2008-6-5 08:51:10 | 只看该作者
發布完成 slick.vip +=2
不做頭像做簽名,看我囧冏有神(多謝山人有情提供 )
回复 支持 反对

使用道具 举报

Lv2.观梦者

天仙

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

贵宾

19
发表于 2008-6-6 16:16:28 | 只看该作者
我尝试做了VX版
但是未完成
有人有兴趣继续做下去吧
剩餘部分:
Scene_Battle部分
Game_Battler回復部分
Window繪製血條部分

PS:
把名称定义SP改成使用备注
把SP改成MP

  1. # 不同种类的MP分开用 改进版 V1.02
  2. # 制作 SLICK
  3. # 技术指导/测试 禾西

  4. # 修正了几个BUG
  5. # 修正了V1.01版中卸掉武器就会出脚本错
  6. # 修正了V1.01版中特定药物使用后MP超上限的BUG

  7. class RPG::Weapon < RPG::BaseItem
  8.   # 武器名称所能决定MP种类及属性的定义方法
  9.   # 格式:    MP種類   [w_maxmp 2000]
  10.   #          MP種類   [w_akind 0]
  11.   attr_writer :w_maxmp
  12.   attr_writer :w_akind
  13.   def w_maxmp
  14.     self.note.mplit(/[\r\n]+/).each { |line|
  15.       if line =~ /\[w_maxmp \d+\]/
  16.         a = line.mplit(/ /)[1]
  17.         d = ""
  18.         while ((c = a.slice!(/./m)) != nil)
  19.           d += c if c.is_a?(Integer)
  20.         end
  21.       end
  22.     }
  23.     return d ? d.to_i : nil
  24.   end
  25.   def w_akind
  26.     self.note.mplit(/[\r\n]+/).each { |line|
  27.       if line =~ /\[w_akind \d+\]/
  28.         a = line.mplit(/ /)[1]
  29.         d = ""
  30.         while ((c = a.slice!(/./m)) != nil)
  31.           d += c if c.is_a?(Integer)
  32.         end
  33.       end
  34.     }
  35.     return d ? d.to_i : nil
  36.   end  
  37. end  
  38. class RPG::Item < RPG::UsableItem
  39.   # 定义某种物品能回复哪种MP
  40.   # 格式:    MP種類   [i_rkind 2000]
  41.   attr_writer :i_rkind
  42.     self.note.mplit(/[\r\n]+/).each { |line|
  43.       if line =~ /\[i_rkind \d+\]/
  44.         a = line.mplit(/ /)[1]
  45.         d = ""
  46.         while ((c = a.slice!(/./m)) != nil)
  47.           d += c if c.is_a?(Integer)
  48.         end
  49.       end
  50.     }
  51.     return d ? d.to_i : nil
  52. end  

  53. class Game_Actor < Game_Battler
  54.   #--------------------------------------------------------------------------
  55.   # ● 公開インスタンス変数
  56.   #--------------------------------------------------------------------------
  57. #这里做修改==================================  
  58.   attr_accessor :ammo                     # MP残留量
  59.   attr_accessor :akind                    # 使用何种MP
  60.   attr_accessor :cta                      # MP最大容量
  61. #=======================================  
  62. #感谢禾大人帮助精简==============================
  63.   #--------------------------------------------------------------------------
  64.   # ● セットアップ
  65.   #     actor_id : アクター ID
  66.   #--------------------------------------------------------------------------
  67.   alias ooo_setup setup
  68.   def setup(actor_id)
  69. #=======================================   
  70. #这里做修改==================================   
  71.     @ammo = [0,0,0,0,0,0,0,0,0]# 目前只使用九种能量
  72.     @akind = 1 # 缺省情况下使用格斗技能量
  73.     @cta = [0,0,0,0,0,0,0,0,0]#  这个新版本中每一种能量的最大值都要设定
  74. #=======================================   
  75.     ooo_setup(actor_id)
  76.   end
  77. end

  78. class Scene_Equip < Scene_Base
  79.   #--------------------------------------------------------------------------
  80.   # ● 更新裝備區域選擇
  81.   #--------------------------------------------------------------------------
  82.   def update_equip_selection
  83.     # 按下 B 键的情况下
  84.     if Input.trigger?(Input::B)
  85.       # 演奏取消 SE
  86.       Sound.play_cancel
  87. #装备结束时再次判断一下属性MP值========================      
  88.       neomaxmp=0
  89.       if @actor.weapon_id !=0
  90.         @actor.akind=$data_weapons[@actor.weapon_id].w_akind
  91.         neomaxmp+=$data_weapons[@actor.weapon_id].w_maxmp
  92.         @actor.cta[@actor.akind]=neomaxmp
  93.         @actor.ammo[@actor.akind] = [$lammo[@actor.akind],@actor.cta[@actor.akind]].min#弹药种类相同取弹匣小值
  94.       else      #如果扔掉武器,MP就是0
  95.         @actor.akind=1
  96.         @actor.cta[@actor.akind]=0
  97.         @actor.ammo[@actor.akind]=0
  98.       end  
  99. #=======================================      
  100.       # 切换到菜单画面
  101.       return_scene
  102.     end
  103.     # 按下 R 键的情况下
  104.     elsif Input.trigger?(Input::R)
  105.       Sound.play_cursor # 演奏光标 SE
  106.       next_actor        # 移至下一位角色
  107.     # 按下 L 键的情况下
  108.     elsif Input.trigger?(Input::L)
  109.       Sound.play_cursor # 演奏光标 SE
  110.       prev_actor        # 移至上一位角色
  111.     # 按下 C 键的情况下
  112.     if Input.trigger?(Input::C)
  113.       # 固定装备的情况下
  114.       if @actor.fix_equipment
  115.         Sound.play_buzzer
  116.       else
  117.       # 演奏确定 SE
  118.       Sound.play_decision
  119.       # 激活物品窗口
  120.       @equip_window.active = false
  121.       @item_window.active = true
  122.       @item_window.index = 0
  123. #开始装备武器时判断一下属性MP值========================      
  124.       $lkind = @actor.akind #弹药种类是否与以前相同?
  125.       $lammo = []
  126.       for ii in [email protected]
  127.         $lammo[ii][email protected][ii]
  128.       end
  129. #=======================================      
  130.       return
  131.     end
  132.   end
  133. end

  134. # 需要在Game_Battler內修改
  135. class Scene_Battle < Scene_Base
  136.   
  137.   def make_skill_action_result
  138.     # 获取特技
  139.     @skill = $data_skills[@active_battler.current_action.skill_id]
  140.     # 如果不是强制行动
  141.     unless @active_battler.current_action.forcing
  142.       # 因为 MP 耗尽而无法使用的情况下
  143.       unless @active_battler.skill_can_use?(@skill.id)
  144.         # 清除强制行动对像的战斗者
  145.         $game_temp.forcing_battler = nil
  146.         # 移至步骤 1
  147.         @phase4_step = 1
  148.         return
  149.       end
  150.     end
  151. # 消耗 MP(区分不同种类)===========================
  152.     if @active_battler.is_a?(Game_Actor)
  153.       @active_battler.ammo[@active_battler.akind] -= @skill.mp_cost
  154.     else  
  155.       @active_battler.mp -= @skill.mp_cost
  156.     end if  
  157. #=======================================
  158.     # 刷新状态窗口
  159.     @status_window.refresh
  160.     # 在帮助窗口显示特技名
  161.     @help_window.set_text(@skill.name, 1)
  162.     # 设置动画 ID
  163.     @animation1_id = @skill.animation1_id
  164.     @animation2_id = @skill.animation2_id
  165.     # 设置公共事件 ID
  166.     @common_event_id = @skill.common_event_id
  167.     # 设置对像侧战斗者
  168.     set_target_battlers(@skill.scope)
  169.     # 应用特技效果
  170.     for target in @target_battlers
  171.       target.skill_effect(@active_battler, @skill)
  172.     end
  173.   end
  174. end

  175. #==============================================================================
  176. # 物品对不同MP分别起作用
  177. #==============================================================================

  178. class Game_Battler
  179.   #--------------------------------------------------------------------------
  180.   SW_SET = [1,2,3,4,5,6,7,8,9] # 此处设定武器和技能关联的属性id
  181.   #--------------------------------------------------------------------------
  182.   def skill_can_use?(skill)
  183.     return false unless skill.is_a?(RPG::Skill)
  184.     return false unless movable?

  185.     if self.is_a?(Game_Actor) and self.weapon_id > 0
  186.       sw_boolean = false # 判断武器和技能关联
  187.       s = SW_SET & skill.element_set
  188.       if s.empty?
  189.         sw_boolean = true
  190.       else
  191.         for i in s
  192.           if  $data_weapons[self.weapon_id].element_set .include?(i)
  193.             sw_boolean = true
  194.             break
  195.           end
  196.         end
  197.       end
  198.       if sw_boolean == false
  199.         return false
  200.       end
  201. #这里修改为对各种MP的判断===========================     
  202.       current_mp=self.ammo[self.akind]
  203.       current_maxmp=self.cta[self.akind]
  204. #=======================================     
  205.       return false if calc_mp_cost(skill) > current_mp
  206.     end
  207.    
  208.     return false if dead?
  209.     return false if silent? and skill.mpi_f > 0
  210.     occasion = skill.occasion
  211.     if $game_temp.in_battle
  212.       return skill.battle_ok?
  213.     else
  214.       return skill.menu_ok?
  215.     end
  216.   end
  217.   
  218.   
  219.   #--------------------------------------------------------------------------
  220.   # ● 發動物品效果
  221.   #     user : 物品使用者
  222.   #     item : 物品
  223.   #--------------------------------------------------------------------------
  224.   def item_effect(user, item)
  225.     clear_action_results
  226.     unless item_effective?(user, item)
  227.       @skipped = true
  228.       return
  229.     end
  230.     if rand(100) >= calc_hit(user, item)          # 計算命中率
  231.       @missed = true
  232.       return
  233.     end
  234.     if rand(100) < calc_eva(user, item)           # 計算閃躲率
  235.       @evaded = true
  236.       return
  237.     end
  238.     hp_recovery = calc_hp_recovery(user, item)    # 計算體力回復量
  239.     mp_recovery = calc_mp_recovery(user, item)    # 計算魔力回復量
  240.     make_obj_damage_value(user, item)             # 計算傷害
  241.     @hp_damage -= hp_recovery                     # 體力傷害減去回復量
  242.     @mp_damage -= mp_recovery                     # 魔力傷害減去回復量
  243.     make_obj_absorb_effect(user, item)            # 計算吸收效果
  244.     execute_damage(user)                          # 傷害效果
  245.     item_growth_effect(user, item)                # 能力值提升效果
  246.     if item.physical_attack and @hp_damage == 0   # 判斷是否物理傷害
  247.       return                                    
  248.     end
  249.     apply_state_changes(item)                     # 增減狀態
  250.   end
  251. # 未修改
  252.   #--------------------------------------------------------------------------
  253.   # ● 应用物品效果
  254.   #     item : 物品
  255.   #--------------------------------------------------------------------------
  256.   def item_effect(user, item)
  257.     clear_action_results
  258.     unless item_effective?(user, item)
  259.       @skipped = true
  260.       return
  261.     end
  262.     if rand(100) >= calc_hit(user, item)          # 計算命中率
  263.       @missed = true
  264.       return
  265.     end
  266.     if rand(100) < calc_eva(user, item)           # 計算閃躲率
  267.       @evaded = true
  268.       return
  269.     end
  270.     # 计算回复量
  271.     hp_recovery = calc_hp_recovery(user, item)    # 計算體力回復量
  272.     make_obj_damage_value(user, item)             # 計算傷害
  273.     @hp_damage -= hp_recovery                     # 體力傷害減去回復量
  274.     @mp_damage -= mp_recovery                     # 魔力傷害減去回復量
  275.     make_obj_absorb_effect(user, item)            # 計算吸收效果
  276.     execute_damage(user)                          # 傷害效果

  277. #这里修改了对MP回复率的判断==========================            
  278.     recover_mp = self.cta[self.akind] * item.recover_mp_rate / 100 + item.recover_mp
  279. #=======================================
  280.     recover_mp *= elements_correct(item.element_set)
  281.     recover_mp /= 100
  282.     # 分散
  283.     if item.variance > 0 and recover_hp.abs > 0
  284.       amp = [recover_hp.abs * item.variance / 100, 1].max
  285.       recover_hp += rand(amp+1) + rand(amp+1) - amp
  286.     end
  287.     if item.variance > 0 and recover_mp.abs > 0
  288.       amp = [recover_mp.abs * item.variance / 100, 1].max
  289.       recover_mp += rand(amp+1) + rand(amp+1) - amp
  290.     end
  291.     # 回复量符号为负的情况下
  292.     if recover_hp < 0
  293.       # 防御修正
  294.       if self.guarding?
  295.         recover_hp /= 2
  296.       end
  297.     end
  298.     # HP 回复量符号的反转、设置伤害值
  299.     self.damage = -recover_hp
  300.     # HP 以及 MP 的回复
  301.     last_hp = self.hp
  302.     self.hp += recover_hp
  303.    
  304.       
  305. #这里修改为对各种属性MP的判断=========================      
  306.     if self.is_a?(Game_Actor)
  307.       case item.i_rkind
  308.         when 255   #对自己所有的MP都起作用
  309.           for ii in 0...self.cta.size
  310.             current_mp = self.ammo[ii]
  311.             if ii==self.akind  #最大MP值的限制只对当前MP起作用
  312.               current_maxmp=self.cta[ii]
  313.               current_mp += recover_mp
  314.               if current_mp > current_maxmp
  315.                 current_mp = current_maxmp
  316.               end
  317.             else
  318.               current_mp += recover_mp
  319.             end
  320.             self.ammo[ii] = current_mp
  321.           end  
  322.         when nil   #对自己当前正在使用的MP起作用
  323.           current_mp=self.ammo[self.akind]
  324.           current_maxmp=self.cta[self.akind]  #最大MP值的限制只对当前MP起作用
  325.           current_mp += recover_mp
  326.           if current_mp > current_maxmp
  327.             current_mp = current_maxmp
  328.           end
  329.           self.ammo[self.akind] = current_mp
  330.         else     #对自己某种特定属性的MP起作用
  331.           current_mp=self.ammo[item.i_rkind]
  332.           current_mp += recover_mp
  333.           if item.i_rkind==self.akind    #对不可见的MP就不加限制以防出错
  334.             current_maxmp=self.cta[self.akind]    #对可见的MP就规定上限
  335.             if current_mp > current_maxmp
  336.               current_mp = current_maxmp
  337.             end
  338.           end  
  339.            self.ammo[item.i_rkind] = current_mp
  340.       end
  341.       last_mp = current_mp
  342.       effective =true
  343.     else  
  344.       last_mp = self.mp
  345.       self.mp += recover_mp
  346.       effective |= self.mp != last_mp
  347.     end  
  348. # ======================================


  349.     item_growth_effect(user, item)                # 能力值提升效果
  350.     # HP 回复率与回复量为 0 的情况下
  351.     if item.recover_hp_rate == 0 and item.recover_hp == 0
  352.       # 设置伤害为空的字符串
  353.       self.damage = ""
  354.       # MP 回复率与回复量为 0、能力上升值无效的情况下
  355.       if item.recover_mp_rate == 0 and item.recover_mp == 0 and
  356.          (item.parameter_type == 0 or item.parameter_points == 0)
  357.         # 状态没有变化的情况下
  358.         unless @state_changed
  359.           # 伤害设置为 "Miss"
  360.           self.damage = "Miss"
  361.         end
  362.       end
  363.     end
  364.     # 不在战斗中的情况下
  365.     unless $game_temp.in_battle
  366.       # 伤害设置为 nil
  367.       self.damage = nil
  368.     end
  369.     # 过程结束
  370.     return effective
  371.   end  
  372. end

  373. class Game_Actor < Game_Battler
  374.   def now_exp
  375.     return @exp - @exp_list[@level]
  376.   end
  377.   def next_exp
  378.     return @exp_list[@level+1] > 0 ? @exp_list[@level+1] - @exp_list[@level] : 0
  379.   end
  380. end

  381. #==============================================================================
  382. # ■ Window_Base
  383. #------------------------------------------------------------------------------
  384. #  血条的绘制
  385. #==============================================================================

  386. class Window_Base < Window
  387.   #--------------------------------------------------------------------------
  388.   # ● 繪製角色魔力
  389.   #     actor : 角色
  390.   #     x     : 描畫目標 X 坐標
  391.   #     y     : 描畫目標 Y 坐標
  392.   #     width : 描畫目標寬度
  393.   #--------------------------------------------------------------------------
  394.   def draw_actor_mp(actor, x, y, width = 120)
  395.     draw_actor_mp_gauge(actor, x, y, width)
  396.     self.contents.font.color = system_color
  397.     self.contents.draw_text(x, y, 30, WLH, Vocab::mp_a)
  398.     self.contents.font.color = mp_color(actor)
  399.     last_font_size = self.contents.font.size
  400.     xr = x + width
  401.     if width < 120
  402.       self.contents.draw_text(xr - 44, y, 44, WLH, actor.ammo[actor.akind], 2)
  403.     else
  404.       self.contents.draw_text(xr - 99, y, 44, WLH, actor.ammo[actor.akind], 2)
  405.       self.contents.font.color = normal_color
  406.       self.contents.draw_text(xr - 55, y, 11, WLH, "/", 2)
  407.       self.contents.draw_text(xr - 44, y, 44, WLH, actor.cta[actor.akind], 2)
  408.     end
  409.   end
  410.   
  411.   def mp_color(actor)
  412.     return crisis_color if actor.ammo[actor.akind] < actor.cta[actor.akind] / 4
  413.     return normal_color
  414.   end

  415.   
  416.   
  417.   #--------------------------------------------------------------------------
  418.   # ● HP ゲージの描画
  419.   #--------------------------------------------------------------------------
  420.   # オリジナルのHP描画を draw_actor_hp_original と名前変更
  421.   alias :draw_actor_hp_original :draw_actor_hp
  422.   def draw_actor_hp(actor, x, y, width = 144)
  423.     # 変数rateに 現在のHP/MHPを代入
  424.     if actor.maxhp != 0
  425.       rate = actor.hp.to_f / actor.maxhp
  426.     else
  427.       rate = 0
  428.     end
  429.     # plus_x:X座標の位置補正 rate_x:X座標の位置補正(%) plus_y:Y座標の位置補正
  430.     # plus_width:幅の補正 rate_width:幅の補正(%) height:縦幅
  431.     # align1:描画タイプ1 0:左詰め 1:中央揃え 2:右詰め
  432.     # align2:描画タイプ2 0:上詰め 1:中央揃え 2:下詰め
  433.     # align3:ゲージタイプ 0:左詰め 1:右詰め
  434.     plus_x = 0
  435.     rate_x = 0
  436.     plus_y = 25
  437.     plus_width = 0
  438.     rate_width = 100
  439.     height = 10
  440.     align1 = 1
  441.     align2 = 2
  442.     align3 = 0
  443.     # グラデーション設定 grade1:空ゲージ grade2:実ゲージ
  444.     # (0:横にグラデーション 1:縦にグラデーション 2:斜めにグラデーション(激重))
  445.     grade1 = 1
  446.     grade2 = 0
  447.     # 色設定。color1:外枠,color2:中枠
  448.     # color3:空ゲージダークカラー,color4:空ゲージライトカラー
  449.     # color5:実ゲージダークカラー,color6:実ゲージライトカラー
  450.     color1 = Color.new(0, 0, 0, 192)
  451.     color2 = Color.new(255, 255, 192, 192)
  452.     color3 = Color.new(0, 0, 0, 192)
  453.     color4 = Color.new(64, 0, 0, 192)
  454.     color5 = Color.new(80 - 24 * rate, 80 * rate, 14 * rate, 192)
  455.     color6 = Color.new(240 - 72 * rate, 240 * rate, 62 * rate, 192)
  456.     # 変数mpに描画するゲージの幅を代入
  457.     if actor.maxhp != 0
  458.       hp = (width + plus_width) * actor.hp * rate_width / 100 / actor.maxhp
  459.     else
  460.       hp = 0
  461.     end
  462.     # ゲージの描画
  463.     gauge_rect(x + plus_x + width * rate_x / 100, y + plus_y,
  464.                 width, plus_width + width * rate_width / 100,
  465.                 height, hp, align1, align2, align3,
  466.                 color1, color2, color3, color4, color5, color6, grade1, grade2)
  467.     # オリジナルのHP描画処理を呼び出し
  468.     draw_actor_hp_original(actor, x, y, width)
  469.   end
  470.   #--------------------------------------------------------------------------
  471.   # ● MP ゲージの描画
  472.   #--------------------------------------------------------------------------
  473.   # オリジナルのMP描画を draw_actor_mp_original と名前変更
  474.   alias :draw_actor_mp_original :draw_actor_mp
  475.   def draw_actor_mp(actor, x, y, width = 144)
  476.     # 変数rateに 現在のMP/MMPを代入
  477.     if actor.maxmp != 0
  478.       rate = actor.mp.to_f / actor.cta[actor.akind]
  479.     else
  480.       rate = 1
  481.     end
  482.     # plus_x:X座標の位置補正 rate_x:X座標の位置補正(%) plus_y:Y座標の位置補正
  483.     # plus_width:幅の補正 rate_width:幅の補正(%) height:縦幅
  484.     # align1:描画タイプ1 0:左詰め 1:中央揃え 2:右詰め
  485.     # align2:描画タイプ2 0:上詰め 1:中央揃え 2:下詰め
  486.     # align3:ゲージタイプ 0:左詰め 1:右詰め
  487.     plus_x = 0
  488.     rate_x = 0
  489.     plus_y = 25
  490.     plus_width = 0
  491.     rate_width = 100
  492.     height = 10
  493.     align1 = 1
  494.     align2 = 2
  495.     align3 = 0
  496.     # グラデーション設定 grade1:空ゲージ grade2:実ゲージ
  497.     # (0:横にグラデーション 1:縦にグラデーション 2:斜めにグラデーション(激重))
  498.     grade1 = 1
  499.     grade2 = 0
  500.     # 色設定。color1:外枠,color2:中枠
  501.     # color3:空ゲージダークカラー,color4:空ゲージライトカラー
  502.     # color5:実ゲージダークカラー,color6:実ゲージライトカラー
  503.    
  504.    
  505. #区分MP属性的颜色===============================   
  506.     case actor.akind
  507.       when 0 # 火
  508.         color1 = Color.new(0, 0, 0, 192)
  509.         color2 = Color.new(255, 192, 192, 192)
  510.         color3 = Color.new(0, 0, 0, 192)
  511.         color4 = Color.new(0, 64, 64, 192)
  512.         color5 = Color.new(128 * rate, 0, 0, 192)
  513.         color6 = Color.new(255 * rate, 0, 0, 192)
  514.       when 3 # 水
  515.         color1 = Color.new(0, 0, 0, 192)
  516.         color2 = Color.new(192, 192, 255, 192)
  517.         color3 = Color.new(0, 0, 0, 192)
  518.         color4 = Color.new(64, 64, 0, 192)
  519.         color5 = Color.new(0, 0, 128 * rate, 192)
  520.         color6 = Color.new(0, 0, 255 * rate, 192)
  521.       when 5 # 风
  522.         color1 = Color.new(0, 0, 0, 192)
  523.         color2 = Color.new(192, 255, 224, 192)
  524.         color3 = Color.new(0, 0, 0, 192)
  525.         color4 = Color.new(64, 0, 0, 192)
  526.         color5 = Color.new(0, 128 * rate, 96 * rate, 192)
  527.         color6 = Color.new(0, 255 * rate, 192 * rate, 192)
  528.       when 4 # 地
  529.         color1 = Color.new(0, 0, 0, 192)
  530.         color2 = Color.new(255, 224, 192, 192)
  531.         color3 = Color.new(0, 0, 0, 192)
  532.         color4 = Color.new(0, 0, 0, 192)
  533.         color5 = Color.new(128 * rate, 64 * rate, 0, 192)
  534.         color6 = Color.new(255 * rate, 128 * rate, 0, 192)
  535.       when 2 # 雷
  536.         color1 = Color.new(0, 0, 0, 192)
  537.         color2 = Color.new(192, 224, 255, 192)
  538.         color3 = Color.new(0, 0, 0, 192)
  539.         color4 = Color.new(64, 0, 0, 192)
  540.         color5 = Color.new(0, 96 * rate, 128 * rate, 192)
  541.         color6 = Color.new(0, 192 * rate, 255 * rate, 192)
  542.       when 6 # 光
  543.         color1 = Color.new(0, 0, 0, 192)
  544.         color2 = Color.new(255, 255, 192, 192)
  545.         color3 = Color.new(0, 0, 0, 192)
  546.         color4 = Color.new(0, 0, 64, 192)
  547.         color5 = Color.new(128 * rate, 128 * rate, 64 * rate, 192)
  548.         color6 = Color.new(255 * rate, 255 * rate, 96 * rate, 192)
  549.       when 7 # 暗
  550.         color1 = Color.new(0, 0, 0, 192)
  551.         color2 = Color.new(160, 0, 224, 192)
  552.         color3 = Color.new(0, 0, 0, 192)
  553.         color4 = Color.new(0, 0, 0, 192)
  554.         color5 = Color.new(32 * rate, 0, 64 * rate, 192)
  555.         color6 = Color.new(128 * rate, 0 * rate, 192 * rate, 192)
  556.       when 8 # 毒
  557.         color1 = Color.new(0, 0, 0, 192)
  558.         color2 = Color.new(128, 224, 128, 192)
  559.         color3 = Color.new(0, 0, 0, 192)
  560.         color4 = Color.new(0, 0, 0, 192)
  561.         color5 = Color.new(0, 96 * rate, 0, 192)
  562.         color6 = Color.new(0, 192 * rate, 0, 192)
  563.       else
  564.         color1 = Color.new(0, 0, 0, 192)
  565.         color2 = Color.new(255, 255, 255, 192)
  566.         color3 = Color.new(0, 0, 0, 192)
  567.         color4 = Color.new(0, 0, 0, 192)
  568.         color5 = Color.new(64 * rate, 64 * rate, 64 * rate, 192)
  569.         color6 = Color.new(192 * rate, 192 * rate, 192 * rate, 192)  
  570.     end  
  571. #=======================================      
  572.       
  573.       
  574.     # 変数mpに描画するゲージの幅を代入
  575.     current_mp=actor.ammo[actor.akind]
  576.     current_maxmp=actor.cta[actor.akind]
  577.     if current_maxmp != 0
  578.       mp = (width + plus_width) * current_mp * rate_width / 100 / current_maxmp
  579.     else
  580.       mp = (width + plus_width) * rate_width / 100
  581.     end
  582.     # ゲージの描画
  583.     gauge_rect(x + plus_x + width * rate_x / 100, y + plus_y,
  584.                 width, plus_width + width * rate_width / 100,
  585.                 height, mp, align1, align2, align3,
  586.                 color1, color2, color3, color4, color5, color6, grade1, grade2)
  587.     # オリジナルのMP描画処理を呼び出し
  588.     draw_actor_mp_original(actor, x, y, width)
  589.   end
  590.   #--------------------------------------------------------------------------
  591.   # ● ゲージの描画
  592.   #--------------------------------------------------------------------------
  593.   def gauge_rect(x, y, rect_width, width, height, gauge, align1, align2, align3,
  594.                 color1, color2, color3, color4, color5, color6, grade1, grade2)
  595.     case align1
  596.     when 1
  597.       x += (rect_width - width) / 2
  598.     when 2
  599.       x += rect_width - width
  600.     end
  601.     case align2
  602.     when 1
  603.       y -= height / 2
  604.     when 2
  605.       y -= height
  606.     end
  607.     # 枠描画
  608.     self.contents.fill_rect(x, y, width, height, color1)
  609.     self.contents.fill_rect(x + 1, y + 1, width - 2, height - 2, color2)
  610.     if align3 == 0
  611.       if grade1 == 2
  612.         grade1 = 3
  613.       end
  614.       if grade2 == 2
  615.         grade2 = 3
  616.       end
  617.     end
  618.     if (align3 == 1 and grade1 == 0) or grade1 > 0
  619.       color = color3
  620.       color3 = color4
  621.       color4 = color
  622.     end
  623.     if (align3 == 1 and grade2 == 0) or grade2 > 0
  624.       color = color5
  625.       color5 = color6
  626.       color6 = color
  627.     end
  628.     # 空ゲージの描画
  629.     self.contents.gradation_rect(x + 2, y + 2, width - 4, height - 4,
  630.                                   color3, color4, grade1)
  631.     if align3 == 1
  632.       x += width - gauge
  633.     end
  634.     # 実ゲージの描画
  635.     self.contents.gradation_rect(x + 2, y + 2, gauge - 4, height - 4,
  636.                                   color5, color6, grade2)
  637.   end
  638. end

  639. #------------------------------------------------------------------------------
  640. #  Bitmapクラスに新たな機能を追加します。
  641. #==============================================================================

  642. class Bitmap
  643.   #--------------------------------------------------------------------------
  644.   # ● 矩形をグラデーション表示
  645.   #     color1 : スタートカラー
  646.   #     color2 : エンドカラー
  647.   #     align  :  0:横にグラデーション
  648.   #               1:縦にグラデーション
  649.   #               2:斜めにグラデーション(激重につき注意)
  650.   #--------------------------------------------------------------------------
  651.   def gradation_rect(x, y, width, height, color1, color2, align = 0)
  652.     if align == 0
  653.       for i in x...x + width
  654.         red   = color1.red + (color2.red - color1.red) * (i - x) / (width - 1)
  655.         green = color1.green +
  656.                 (color2.green - color1.green) * (i - x) / (width - 1)
  657.         blue  = color1.blue +
  658.                 (color2.blue - color1.blue) * (i - x) / (width - 1)
  659.         alpha = color1.alpha +
  660.                 (color2.alpha - color1.alpha) * (i - x) / (width - 1)
  661.         color = Color.new(red, green, blue, alpha)
  662.         fill_rect(i, y, 1, height, color)
  663.       end
  664.     elsif align == 1
  665.       for i in y...y + height
  666.         red   = color1.red +
  667.                 (color2.red - color1.red) * (i - y) / (height - 1)
  668.         green = color1.green +
  669.                 (color2.green - color1.green) * (i - y) / (height - 1)
  670.         blue  = color1.blue +
  671.                 (color2.blue - color1.blue) * (i - y) / (height - 1)
  672.         alpha = color1.alpha +
  673.                 (color2.alpha - color1.alpha) * (i - y) / (height - 1)
  674.         color = Color.new(red, green, blue, alpha)
  675.         fill_rect(x, i, width, 1, color)
  676.       end
  677.     elsif align == 2
  678.       for i in x...x + width
  679.         for j in y...y + height
  680.           red   = color1.red + (color2.red - color1.red) *
  681.                   ((i - x) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  682.           green = color1.green + (color2.green - color1.green) *
  683.                   ((i - x) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  684.           blue  = color1.blue + (color2.blue - color1.blue) *
  685.                   ((i - x) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  686.           alpha = color1.alpha + (color2.alpha - color1.alpha) *
  687.                   ((i - x) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  688.           color = Color.new(red, green, blue, alpha)
  689.           set_pixel(i, j, color)
  690.         end
  691.       end
  692.     elsif align == 3
  693.       for i in x...x + width
  694.         for j in y...y + height
  695.           red   = color1.red + (color2.red - color1.red) *
  696.                 ((x + width - i) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  697.           green = color1.green + (color2.green - color1.green) *
  698.                 ((x + width - i) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  699.           blue  = color1.blue + (color2.blue - color1.blue) *
  700.                 ((x + width - i) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  701.           alpha = color1.alpha + (color2.alpha - color1.alpha) *
  702.                 ((x + width - i) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  703.           color = Color.new(red, green, blue, alpha)
  704.           set_pixel(i, j, color)
  705.         end
  706.       end
  707.     end
  708.   end
  709. end

复制代码
VA脚本开工中...
偷窃脚本1.0 - 已完成
回复 支持 反对

使用道具 举报

Lv3.寻梦者

酱油的

梦石
0
星屑
1020
在线时间
2161 小时
注册时间
2007-12-22
帖子
3271

贵宾

20
发表于 2008-6-6 16:57:58 | 只看该作者
其實可以嘗試這種思路:
class Game_Actor < Game_Battler
  attr_accessor :ammo                     # MP残留量
  attr_accessor :akind                    # 使用何种MP
  attr_accessor :cta                      # MP最大容量

  alias ooo_setup setup
  def setup(actor_id)
#=======================================   
#这里做修改==================================   
    @ammo = [0,0,0,0,0,0,0,0,0]# 目前只使用九种能量
    @akind = 1 # 缺省情况下使用格斗技能量
    @cta = [0,0,0,0,0,0,0,0,0]#  这个新版本中每一种能量的最大值都要设定
#=======================================   
    ooo_setup(actor_id)
  end
  def sp=(sp, val=@akind)
    @ammo[val] = [[sp, maxsp].min, 0].max
  end
  def sp(val=@kind)
    return @ammo[val]
  end
  def maxsp
    n = @cta[@kind] + @maxsp_plus
    for i in @states
      n *= $data_states.maxsp_rate / 100.0
    end
    n = [[Integer(n), 0].max, 9999].min
    return n
  end
end

其他不說了...看得明就看吧...
不做頭像做簽名,看我囧冏有神(多謝山人有情提供 )
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-16 09:49

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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