Project1

标题: 同一角色不同种类的SP分开使用(13楼做出第二次改进版) [打印本页]

作者: slick    时间: 2008-5-30 05:33
标题: 同一角色不同种类的SP分开使用(13楼做出第二次改进版)
最近我同学也在玩RMXP,托我用脚本开发了一个这样的系统。。。。。。
不知大家感觉如何

这个系统是基于“武器决定技能”和“二刀流”设计的。

游戏开始时主角的SP为0(已无视掉游戏中默认的SP),装备武器后可获得武器所决定的最大SP值,及其SP种类。目前这个教学范例中SP只有九种,值为0-8,分别对应“属性”一栏中的前九个项目。

武器类型定义方法:
  譬如“钢匕首,2000,0”意思是:名称为“钢匕首”的武器,决定了角色SP最大值为2000,属性值为0(在本范例中该属性的意义为“格斗”),使用格斗系SP。
  譬如“水之杖,3000,2”意思是:名称为“水之杖”的武器,决定了角色SP最大值为3000,属性值为2(在本范例中该属性的意义为“水”),使用水系SP。
  其他使用方法同“武器决定技能”和“二刀流”。

特点:
  1、本范例允许同一名角色拥有最多九种不同种类的SP,当然你也可以自行修改(具体位置在范例内部“二刀流”脚本中)。
  2、使用SP回复道具时,会补充当前正在使用的SP,而对同一个角色的其他种类SP不会产生影响。
  3、住旅店休息或使用“完全回复”命令时,不会对任何SP产生影响。
    4、每一种属性的SP都可以画成不同的颜色,在“显示血条”脚本中修改。

范例下载:
http://rpg.blue/upload_program/f ... YSLICK_92525475.rar


看,这个是你当前属性的SP


换一件武器后


就改用了另一种属性的SP


如果你试图回复它


换一种属性后,SP值又不一样了


换回原来的武器后


发现原来的SP值还在

作者: 禾西    时间: 2008-5-30 07:29
範例很大...{/fd}不知道內裏腳本寫得如何。創意是不錯啦
[LINE]1,#dddddd[/LINE]
Orz 非常糾結...可以把這個腳本單獨提取出來嗎...
作者: slick    时间: 2008-5-30 17:11
因为这个系统涉及的因素比较多,所以提取出的修改脚本很大,建议

把不同的class语句块分开写,否则很容易出错。

脚本第一部分:血条的绘制(1/4)

  1. # ————————————————————————————————————
  2. # 本脚本来自www.66rpg.com,转载请保留此信息
  3. # ————————————————————————————————————

  4. # 免责声明:- -|||本脚本修改自“二刀流”和沉影不器的“武器决定技能”,以及“血条绘制”

  5. #==============================================================================
  6. # 绘制不同颜色的血条及SP条
  7. #==============================================================================

  8. #==============================================================================
  9. # ■ Game_Actor
  10. #------------------------------------------------------------------------------
  11. #  アクターを扱うクラスです。このクラスは Game_Actors クラス ($game_actors)
  12. # の内部で使用され、Game_Party クラス ($game_party) からも参照されます。
  13. #==============================================================================

  14. class Game_Actor < Game_Battler
  15.   def now_exp
  16.     return @exp - @exp_list[@level]
  17.   end
  18.   def next_exp
  19.     return @exp_list[@level+1] > 0 ? @exp_list[@level+1] - @exp_list[@level] : 0
  20.   end
  21. end

  22. #==============================================================================
  23. # ■ Window_Base
  24. #------------------------------------------------------------------------------
  25. #  ゲーム中のすべてのウィンドウのスーパークラスです。
  26. #==============================================================================

  27. class Window_Base < Window
  28.   #--------------------------------------------------------------------------
  29.   # ● 描绘 SP
  30.   #     actor : 角色
  31.   #     x     : 描画目标 X 坐标
  32.   #     y     : 描画目标 Y 坐标
  33.   #     width : 描画目标的宽
  34.   #--------------------------------------------------------------------------
  35.   def draw_actor_sp(actor, x, y, width = 144)
  36.     # 描绘字符串 "SP"
  37.     self.contents.font.color = system_color
  38.     self.contents.draw_text(x, y, 32, 32, $data_system.words.sp)
  39.     # 计算描绘 MaxSP 所需的空间
  40.     if width - 32 >= 108
  41.       sp_x = x + width - 108
  42.       flag = true
  43.     elsif width - 32 >= 48
  44.       sp_x = x + width - 48
  45.       flag = false
  46.     end
  47.     # 描绘 SP
  48.     current_sp=actor.ammo[actor.akind]
  49.     current_maxsp=actor.cta
  50.     self.contents.font.color = current_sp == 0 ? knockout_color :
  51.       current_sp <= current_maxsp / 4 ? crisis_color : normal_color
  52.     self.contents.draw_text(sp_x, y, 48, 32, current_sp.to_s, 2)
  53.     # 描绘 MaxSP
  54.     if flag
  55.       self.contents.font.color = normal_color
  56.       self.contents.draw_text(sp_x + 48, y, 12, 32, "/", 1)
  57.       self.contents.draw_text(sp_x + 60, y, 48, 32, current_maxsp.to_s)
  58.     end
  59.   end
  60.   #--------------------------------------------------------------------------
  61.   # ● HP ゲージの描画
  62.   #--------------------------------------------------------------------------
  63.   # オリジナルのHP描画を draw_actor_hp_original と名前変更
  64.   alias :draw_actor_hp_original :draw_actor_hp
  65.   def draw_actor_hp(actor, x, y, width = 144)
  66.     # 変数rateに 現在のHP/MHPを代入
  67.     if actor.maxhp != 0
  68.       rate = actor.hp.to_f / actor.maxhp
  69.     else
  70.       rate = 0
  71.     end
  72.     # plus_x:X座標の位置補正 rate_x:X座標の位置補正(%) plus_y:Y座標の位置補正
  73.     # plus_width:幅の補正 rate_width:幅の補正(%) height:縦幅
  74.     # align1:描画タイプ1 0:左詰め 1:中央揃え 2:右詰め
  75.     # align2:描画タイプ2 0:上詰め 1:中央揃え 2:下詰め
  76.     # align3:ゲージタイプ 0:左詰め 1:右詰め
  77.     plus_x = 0
  78.     rate_x = 0
  79.     plus_y = 25
  80.     plus_width = 0
  81.     rate_width = 100
  82.     height = 10
  83.     align1 = 1
  84.     align2 = 2
  85.     align3 = 0
  86.     # グラデーション設定 grade1:空ゲージ grade2:実ゲージ
  87.     # (0:横にグラデーション 1:縦にグラデーション 2:斜めにグラデーション(激重))
  88.     grade1 = 1
  89.     grade2 = 0
  90.     # 色設定。color1:外枠,color2:中枠
  91.     # color3:空ゲージダークカラー,color4:空ゲージライトカラー
  92.     # color5:実ゲージダークカラー,color6:実ゲージライトカラー
  93.     color1 = Color.new(0, 0, 0, 192)
  94.     color2 = Color.new(255, 255, 192, 192)
  95.     color3 = Color.new(0, 0, 0, 192)
  96.     color4 = Color.new(64, 0, 0, 192)
  97.     color5 = Color.new(80 - 24 * rate, 80 * rate, 14 * rate, 192)
  98.     color6 = Color.new(240 - 72 * rate, 240 * rate, 62 * rate, 192)
  99.     # 変数spに描画するゲージの幅を代入
  100.     if actor.maxhp != 0
  101.       hp = (width + plus_width) * actor.hp * rate_width / 100 / actor.maxhp
  102.     else
  103.       hp = 0
  104.     end
  105.     # ゲージの描画
  106.     gauge_rect(x + plus_x + width * rate_x / 100, y + plus_y,
  107.                 width, plus_width + width * rate_width / 100,
  108.                 height, hp, align1, align2, align3,
  109.                 color1, color2, color3, color4, color5, color6, grade1, grade2)
  110.     # オリジナルのHP描画処理を呼び出し
  111.     draw_actor_hp_original(actor, x, y, width)
  112.   end
  113.   #--------------------------------------------------------------------------
  114.   # ● SP ゲージの描画
  115.   #--------------------------------------------------------------------------
  116.   # オリジナルのSP描画を draw_actor_sp_original と名前変更
  117.   alias :draw_actor_sp_original :draw_actor_sp
  118.   def draw_actor_sp(actor, x, y, width = 144)
  119.     # 変数rateに 現在のSP/MSPを代入
  120.     if actor.maxsp != 0
  121.       rate = actor.sp.to_f / actor.maxsp
  122.     else
  123.       rate = 1
  124.     end
  125.     # plus_x:X座標の位置補正 rate_x:X座標の位置補正(%) plus_y:Y座標の位置補正
  126.     # plus_width:幅の補正 rate_width:幅の補正(%) height:縦幅
  127.     # align1:描画タイプ1 0:左詰め 1:中央揃え 2:右詰め
  128.     # align2:描画タイプ2 0:上詰め 1:中央揃え 2:下詰め
  129.     # align3:ゲージタイプ 0:左詰め 1:右詰め
  130.     plus_x = 0
  131.     rate_x = 0
  132.     plus_y = 25
  133.     plus_width = 0
  134.     rate_width = 100
  135.     height = 10
  136.     align1 = 1
  137.     align2 = 2
  138.     align3 = 0
  139.     # グラデーション設定 grade1:空ゲージ grade2:実ゲージ
  140.     # (0:横にグラデーション 1:縦にグラデーション 2:斜めにグラデーション(激重))
  141.     grade1 = 1
  142.     grade2 = 0
  143.     # 色設定。color1:外枠,color2:中枠
  144.     # color3:空ゲージダークカラー,color4:空ゲージライトカラー
  145.     # color5:実ゲージダークカラー,color6:実ゲージライトカラー


  146.     #=====================================================================
  147.     # 颜色区分,这里是关键
  148.     case actor.akind
  149.       when 1 # 火
  150.         color1 = Color.new(0, 0, 0, 192)
  151.         color2 = Color.new(255, 192, 192, 192)
  152.         color3 = Color.new(0, 0, 0, 192)
  153.         color4 = Color.new(0, 64, 64, 192)
  154.         color5 = Color.new(128 * rate, 0, 0, 192)
  155.         color6 = Color.new(255 * rate, 0, 0, 192)
  156.       when 2 # 水
  157.         color1 = Color.new(0, 0, 0, 192)
  158.         color2 = Color.new(192, 192, 255, 192)
  159.         color3 = Color.new(0, 0, 0, 192)
  160.         color4 = Color.new(64, 64, 0, 192)
  161.         color5 = Color.new(0, 0, 128 * rate, 192)
  162.         color6 = Color.new(0, 0, 255 * rate, 192)
  163.       when 3 # 风
  164.         color1 = Color.new(0, 0, 0, 192)
  165.         color2 = Color.new(192, 255, 224, 192)
  166.         color3 = Color.new(0, 0, 0, 192)
  167.         color4 = Color.new(64, 0, 0, 192)
  168.         color5 = Color.new(0, 128 * rate, 96 * rate, 192)
  169.         color6 = Color.new(0, 255 * rate, 192 * rate, 192)
  170.       when 4 # 地
  171.         color1 = Color.new(0, 0, 0, 192)
  172.         color2 = Color.new(255, 224, 192, 192)
  173.         color3 = Color.new(0, 0, 0, 192)
  174.         color4 = Color.new(0, 0, 0, 192)
  175.         color5 = Color.new(128 * rate, 64 * rate, 0, 192)
  176.         color6 = Color.new(255 * rate, 128 * rate, 0, 192)
  177.       when 5 # 雷
  178.         color1 = Color.new(0, 0, 0, 192)
  179.         color2 = Color.new(192, 224, 255, 192)
  180.         color3 = Color.new(0, 0, 0, 192)
  181.         color4 = Color.new(64, 0, 0, 192)
  182.         color5 = Color.new(0, 96 * rate, 128 * rate, 192)
  183.         color6 = Color.new(0, 192 * rate, 255 * rate, 192)
  184.       when 6 # 光
  185.         color1 = Color.new(0, 0, 0, 192)
  186.         color2 = Color.new(255, 255, 192, 192)
  187.         color3 = Color.new(0, 0, 0, 192)
  188.         color4 = Color.new(0, 0, 64, 192)
  189.         color5 = Color.new(128 * rate, 128 * rate, 64 * rate, 192)
  190.         color6 = Color.new(255 * rate, 255 * rate, 96 * rate, 192)
  191.       when 7 # 暗
  192.         color1 = Color.new(0, 0, 0, 192)
  193.         color2 = Color.new(160, 0, 224, 192)
  194.         color3 = Color.new(0, 0, 0, 192)
  195.         color4 = Color.new(0, 0, 0, 192)
  196.         color5 = Color.new(32 * rate, 0, 64 * rate, 192)
  197.         color6 = Color.new(128 * rate, 0 * rate, 192 * rate, 192)
  198.       when 8 # 毒
  199.         color1 = Color.new(0, 0, 0, 192)
  200.         color2 = Color.new(128, 224, 128, 192)
  201.         color3 = Color.new(0, 0, 0, 192)
  202.         color4 = Color.new(0, 0, 0, 192)
  203.         color5 = Color.new(0, 96 * rate, 0, 192)
  204.         color6 = Color.new(0, 192 * rate, 0, 192)
  205.       else
  206.         color1 = Color.new(0, 0, 0, 192)
  207.         color2 = Color.new(255, 255, 255, 192)
  208.         color3 = Color.new(0, 0, 0, 192)
  209.         color4 = Color.new(0, 0, 0, 192)
  210.         color5 = Color.new(64 * rate, 64 * rate, 64 * rate, 192)
  211.         color6 = Color.new(192 * rate, 192 * rate, 192 * rate, 192)  
  212.     end  
  213.     #=====================================================================


  214.     # 変数spに描画するゲージの幅を代入
  215.     current_sp=actor.ammo[actor.akind]
  216.     current_maxsp=actor.cta
  217.     if current_maxsp != 0
  218.       sp = (width + plus_width) * current_sp * rate_width / 100 / current_maxsp
  219.     else
  220.       sp = (width + plus_width) * rate_width / 100
  221.     end
  222.     # ゲージの描画
  223.     gauge_rect(x + plus_x + width * rate_x / 100, y + plus_y,
  224.                 width, plus_width + width * rate_width / 100,
  225.                 height, sp, align1, align2, align3,
  226.                 color1, color2, color3, color4, color5, color6, grade1, grade2)
  227.     # オリジナルのSP描画処理を呼び出し
  228.     draw_actor_sp_original(actor, x, y, width)
  229.   end
  230.   #--------------------------------------------------------------------------
  231.   # ● EXP ゲージの描画
  232.   #--------------------------------------------------------------------------
  233.   # オリジナルのEXP描画を draw_actor_sp_original と名前変更
  234.   alias :draw_actor_exp_original :draw_actor_exp
  235.   def draw_actor_exp(actor, x, y, width = 204)
  236.     # 変数rateに 現在のexp/nextexpを代入
  237.     if actor.next_exp != 0
  238.       rate = actor.now_exp.to_f / actor.next_exp
  239.     else
  240.       rate = 1
  241.     end
  242.     # plus_x:X座標の位置補正 rate_x:X座標の位置補正(%) plus_y:Y座標の位置補正
  243.     # plus_width:幅の補正 rate_width:幅の補正(%) height:縦幅
  244.     # align1:描画タイプ1 0:左詰め 1:中央揃え 2:右詰め
  245.     # align2:描画タイプ2 0:上詰め 1:中央揃え 2:下詰め
  246.     # align3:ゲージタイプ 0:左詰め 1:右詰め
  247.     plus_x = 0
  248.     rate_x = 0
  249.     plus_y = 25
  250.     plus_width = 0
  251.     rate_width = 100
  252.     height = 10
  253.     align1 = 1
  254.     align2 = 2
  255.     align3 = 0
  256.     # グラデーション設定 grade1:空ゲージ grade2:実ゲージ
  257.     # (0:横にグラデーション 1:縦にグラデーション 2:斜めにグラデーション(激重))
  258.     grade1 = 1
  259.     grade2 = 0
  260.     # 色設定。color1:外枠,color2:中枠
  261.     # color3:空ゲージダークカラー,color4:空ゲージライトカラー
  262.     # color5:実ゲージダークカラー,color6:実ゲージライトカラー
  263.     color1 = Color.new(0, 0, 0, 192)
  264.     color2 = Color.new(255, 255, 192, 192)
  265.     color3 = Color.new(0, 0, 0, 192)
  266.     color4 = Color.new(64, 0, 0, 192)
  267.     color5 = Color.new(80 * rate, 80 - 80 * rate ** 2, 80 - 80 * rate, 192)
  268.     color6 = Color.new(240 * rate, 240 - 240 * rate ** 2, 240 - 240 * rate, 192)
  269.     # 変数expに描画するゲージの幅を代入
  270.     if actor.next_exp != 0
  271.       exp = (width + plus_width) * actor.now_exp * rate_width /
  272.                                                           100 / actor.next_exp
  273.     else
  274.       exp = (width + plus_width) * rate_width / 100
  275.     end
  276.     # ゲージの描画
  277.     gauge_rect(x + plus_x + width * rate_x / 100, y + plus_y,
  278.                 width, plus_width + width * rate_width / 100,
  279.                 height, exp, align1, align2, align3,
  280.                 color1, color2, color3, color4, color5, color6, grade1, grade2)
  281.     # オリジナルのEXP描画処理を呼び出し
  282.     draw_actor_exp_original(actor, x, y)
  283.   end
  284.   #--------------------------------------------------------------------------
  285.   # ● 延迟时间描画
  286.   #--------------------------------------------------------------------------
  287.   def draw_actor_delay_time(actor, x, y, width = 144)
  288.     # 変数rateに 現在のSP/MSPを代入
  289.     if actor.delay_time_max != 0
  290.       rate = actor.delay_time.to_f / actor.delay_time_max
  291.     else
  292.       rate = 0
  293.     end
  294.     # plus_x:X座標の位置補正 rate_x:X座標の位置補正(%) plus_y:Y座標の位置補正
  295.     # plus_width:幅の補正 rate_width:幅の補正(%) height:縦幅
  296.     # align1:描画タイプ1 0:左詰め 1:中央揃え 2:右詰め
  297.     # align2:描画タイプ2 0:上詰め 1:中央揃え 2:下詰め
  298.     # align3:ゲージタイプ 0:左詰め 1:右詰め
  299.     plus_x = 0
  300.     rate_x = 0
  301.     plus_y = 25
  302.     plus_width = 0
  303.     rate_width = 100
  304.     height = 10
  305.     align1 = 1
  306.     align2 = 2
  307.     align3 = 0
  308.     # グラデーション設定 grade1:空ゲージ grade2:実ゲージ
  309.     # (0:横にグラデーション 1:縦にグラデーション 2:斜めにグラデーション(激重))
  310.     grade1 = 1
  311.     grade2 = 0
  312.     # 色設定。color1:外枠,color2:中枠
  313.     # color3:空ゲージダークカラー,color4:空ゲージライトカラー
  314.     # color5:実ゲージダークカラー,color6:実ゲージライトカラー
  315.     color1 = Color.new(0, 0, 0, 192)
  316.     color2 = Color.new(255, 255, 192, 192)
  317.     color3 = Color.new(0, 0, 0, 192)
  318.     color4 = Color.new(0, 64, 0, 192)
  319.     color5 = Color.new(100 * rate, 100 * rate, 0, 192)
  320.     color6 = Color.new(255 * rate, 255 * rate, 0, 192)
  321.     # 変数spに描画するゲージの幅を代入
  322.     if actor.delay_time_max != 0
  323.       sp = (width + plus_width) * actor.delay_time * rate_width / 100 / actor.delay_time_max
  324.     else
  325.       sp = (width + plus_width) * rate_width / 100
  326.     end
  327.     # ゲージの描画
  328.     gauge_rect(x + plus_x + width * rate_x / 100, y + plus_y,
  329.                 width, plus_width + width * rate_width / 100,
  330.                 height, sp, align1, align2, align3,
  331.                 color1, color2, color3, color4, color5, color6, grade1, grade2)
  332.     # 描绘字符串 "行动时间"
  333.     self.contents.font.color = system_color
  334.     self.contents.font.size = 20
  335.     self.contents.draw_text(x, y, 120, 32, 'Delay')
  336.     self.contents.font.color = normal_color
  337.     self.contents.draw_text(x, y, 120, 32, actor.delay_time.to_s, 2)
  338.   end
  339.   #--------------------------------------------------------------------------
  340.   # ● 咏唱时间描画
  341.   #--------------------------------------------------------------------------
  342.   def draw_actor_casting_time(actor, x, y, width = 144)
  343.     # 変数rateに 現在のSP/MSPを代入
  344.     time = actor.casting_time_max - actor.casting_time
  345.     if actor.casting_time_max != 0
  346.       rate = time.to_f / actor.casting_time_max
  347.     else
  348.       rate = 0
  349.     end
  350.     # plus_x:X座標の位置補正 rate_x:X座標の位置補正(%) plus_y:Y座標の位置補正
  351.     # plus_width:幅の補正 rate_width:幅の補正(%) height:縦幅
  352.     # align1:描画タイプ1 0:左詰め 1:中央揃え 2:右詰め
  353.     # align2:描画タイプ2 0:上詰め 1:中央揃え 2:下詰め
  354.     # align3:ゲージタイプ 0:左詰め 1:右詰め
  355.     plus_x = 0
  356.     rate_x = 0
  357.     plus_y = 25
  358.     plus_width = 0
  359.     rate_width = 100
  360.     height = 10
  361.     align1 = 1
  362.     align2 = 2
  363.     align3 = 0
  364.     # グラデーション設定 grade1:空ゲージ grade2:実ゲージ
  365.     # (0:横にグラデーション 1:縦にグラデーション 2:斜めにグラデーション(激重))
  366.     grade1 = 1
  367.     grade2 = 0
  368.     # 色設定。color1:外枠,color2:中枠
  369.     # color3:空ゲージダークカラー,color4:空ゲージライトカラー
  370.     # color5:実ゲージダークカラー,color6:実ゲージライトカラー
  371.     color1 = Color.new(0, 0, 0, 192)
  372.     color2 = Color.new(255, 255, 192, 192)
  373.     color3 = Color.new(0, 0, 0, 192)
  374.     color4 = Color.new(0, 64, 0, 192)
  375.     color5 = Color.new(100 * rate, 100 * rate, 0, 192)
  376.     color6 = Color.new(255 * rate, 255 * rate, 0, 192)
  377.     # 変数spに描画するゲージの幅を代入
  378.     if actor.casting_time_max != 0
  379.       sp = (width + plus_width) * time * rate_width / 100 / actor.casting_time_max
  380.     else
  381.       sp = (width + plus_width) * rate_width / 100
  382.     end
  383.     # ゲージの描画
  384.     gauge_rect(x + plus_x + width * rate_x / 100, y + plus_y,
  385.                 width, plus_width + width * rate_width / 100,
  386.                 height, sp, align1, align2, align3,
  387.                 color1, color2, color3, color4, color5, color6, grade1, grade2)
  388.     # 描绘字符串 "行动时间"
  389.     self.contents.font.color = system_color
  390.     self.contents.font.size = 20
  391.     self.contents.draw_text(x, y, 120, 32, 'Cast')
  392.     self.contents.font.color = normal_color
  393.     self.contents.draw_text(x, y, 120, 32, time.to_s, 2)
  394.   end
  395.   #--------------------------------------------------------------------------
  396.   # ● ゲージの描画
  397.   #--------------------------------------------------------------------------
  398.   def gauge_rect(x, y, rect_width, width, height, gauge, align1, align2, align3,
  399.                 color1, color2, color3, color4, color5, color6, grade1, grade2)
  400.     case align1
  401.     when 1
  402.       x += (rect_width - width) / 2
  403.     when 2
  404.       x += rect_width - width
  405.     end
  406.     case align2
  407.     when 1
  408.       y -= height / 2
  409.     when 2
  410.       y -= height
  411.     end
  412.     # 枠描画
  413.     self.contents.fill_rect(x, y, width, height, color1)
  414.     self.contents.fill_rect(x + 1, y + 1, width - 2, height - 2, color2)
  415.     if align3 == 0
  416.       if grade1 == 2
  417.         grade1 = 3
  418.       end
  419.       if grade2 == 2
  420.         grade2 = 3
  421.       end
  422.     end
  423.     if (align3 == 1 and grade1 == 0) or grade1 > 0
  424.       color = color3
  425.       color3 = color4
  426.       color4 = color
  427.     end
  428.     if (align3 == 1 and grade2 == 0) or grade2 > 0
  429.       color = color5
  430.       color5 = color6
  431.       color6 = color
  432.     end
  433.     # 空ゲージの描画
  434.     self.contents.gradation_rect(x + 2, y + 2, width - 4, height - 4,
  435.                                   color3, color4, grade1)
  436.     if align3 == 1
  437.       x += width - gauge
  438.     end
  439.     # 実ゲージの描画
  440.     self.contents.gradation_rect(x + 2, y + 2, gauge - 4, height - 4,
  441.                                   color5, color6, grade2)
  442.   end
  443. end

  444. #------------------------------------------------------------------------------
  445. #  Bitmapクラスに新たな機能を追加します。
  446. #==============================================================================

  447. class Bitmap
  448.   #--------------------------------------------------------------------------
  449.   # ● 矩形をグラデーション表示
  450.   #     color1 : スタートカラー
  451.   #     color2 : エンドカラー
  452.   #     align  :  0:横にグラデーション
  453.   #               1:縦にグラデーション
  454.   #               2:斜めにグラデーション(激重につき注意)
  455.   #--------------------------------------------------------------------------
  456.   def gradation_rect(x, y, width, height, color1, color2, align = 0)
  457.     if align == 0
  458.       for i in x...x + width
  459.         red   = color1.red + (color2.red - color1.red) * (i - x) / (width - 1)
  460.         green = color1.green +
  461.                 (color2.green - color1.green) * (i - x) / (width - 1)
  462.         blue  = color1.blue +
  463.                 (color2.blue - color1.blue) * (i - x) / (width - 1)
  464.         alpha = color1.alpha +
  465.                 (color2.alpha - color1.alpha) * (i - x) / (width - 1)
  466.         color = Color.new(red, green, blue, alpha)
  467.         fill_rect(i, y, 1, height, color)
  468.       end
  469.     elsif align == 1
  470.       for i in y...y + height
  471.         red   = color1.red +
  472.                 (color2.red - color1.red) * (i - y) / (height - 1)
  473.         green = color1.green +
  474.                 (color2.green - color1.green) * (i - y) / (height - 1)
  475.         blue  = color1.blue +
  476.                 (color2.blue - color1.blue) * (i - y) / (height - 1)
  477.         alpha = color1.alpha +
  478.                 (color2.alpha - color1.alpha) * (i - y) / (height - 1)
  479.         color = Color.new(red, green, blue, alpha)
  480.         fill_rect(x, i, width, 1, color)
  481.       end
  482.     elsif align == 2
  483.       for i in x...x + width
  484.         for j in y...y + height
  485.           red   = color1.red + (color2.red - color1.red) *
  486.                   ((i - x) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  487.           green = color1.green + (color2.green - color1.green) *
  488.                   ((i - x) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  489.           blue  = color1.blue + (color2.blue - color1.blue) *
  490.                   ((i - x) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  491.           alpha = color1.alpha + (color2.alpha - color1.alpha) *
  492.                   ((i - x) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  493.           color = Color.new(red, green, blue, alpha)
  494.           set_pixel(i, j, color)
  495.         end
  496.       end
  497.     elsif align == 3
  498.       for i in x...x + width
  499.         for j in y...y + height
  500.           red   = color1.red + (color2.red - color1.red) *
  501.                 ((x + width - i) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  502.           green = color1.green + (color2.green - color1.green) *
  503.                 ((x + width - i) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  504.           blue  = color1.blue + (color2.blue - color1.blue) *
  505.                 ((x + width - i) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  506.           alpha = color1.alpha + (color2.alpha - color1.alpha) *
  507.                 ((x + width - i) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  508.           color = Color.new(red, green, blue, alpha)
  509.           set_pixel(i, j, color)
  510.         end
  511.       end
  512.     end
  513.   end
  514. end
复制代码

作者: slick    时间: 2008-5-30 17:13
脚本第二部分:(2/4)

  1. #==============================================================================
  2. # 物品对不同SP分别起作用
  3. #==============================================================================

  4. class Game_Battler
  5.   #--------------------------------------------------------------------------
  6.   # ● 应用物品效果
  7.   #     item : 物品
  8.   #--------------------------------------------------------------------------
  9.   def item_effect(item)
  10.     # 清除会心一击标志
  11.     self.critical = false
  12.     # 物品的效果范围是 HP 1 以上的己方、自己的 HP 为 0、
  13.     # 或者物品的效果范围是 HP 0 的己方、自己的 HP 为 1 以上的情况下
  14.     if ((item.scope == 3 or item.scope == 4) and self.hp == 0) or
  15.        ((item.scope == 5 or item.scope == 6) and self.hp >= 1)
  16.       # 过程结束
  17.       return false
  18.     end
  19.     # 清除有效标志
  20.     effective = false
  21.     # 公共事件 ID 是有效的情况下,设置为有效标志
  22.     effective |= item.common_event_id > 0
  23.     # 命中判定
  24.     hit_result = (rand(100) < item.hit)
  25.     # 不确定的特技的情况下设置为有效标志
  26.     effective |= item.hit < 100
  27.     # 命中的情况
  28.     if hit_result == true
  29.       # 计算回复量
  30.       recover_hp = maxhp * item.recover_hp_rate / 100 + item.recover_hp
  31.       recover_sp = maxsp * item.recover_sp_rate / 100 + item.recover_sp
  32.       if recover_hp < 0
  33.         recover_hp += self.pdef * item.pdef_f / 20
  34.         recover_hp += self.mdef * item.mdef_f / 20
  35.         recover_hp = [recover_hp, 0].min
  36.       end
  37.       # 属性修正
  38.       recover_hp *= elements_correct(item.element_set)
  39.       recover_hp /= 100
  40.       recover_sp *= elements_correct(item.element_set)
  41.       recover_sp /= 100
  42.       # 分散
  43.       if item.variance > 0 and recover_hp.abs > 0
  44.         amp = [recover_hp.abs * item.variance / 100, 1].max
  45.         recover_hp += rand(amp+1) + rand(amp+1) - amp
  46.       end
  47.       if item.variance > 0 and recover_sp.abs > 0
  48.         amp = [recover_sp.abs * item.variance / 100, 1].max
  49.         recover_sp += rand(amp+1) + rand(amp+1) - amp
  50.       end
  51.       # 回复量符号为负的情况下
  52.       if recover_hp < 0
  53.         # 防御修正
  54.         if self.guarding?
  55.           recover_hp /= 2
  56.         end
  57.       end
  58.       # HP 回复量符号的反转、设置伤害值
  59.       self.damage = -recover_hp
  60.       
  61.       
  62.       # HP 以及 SP 的回复(这里是关键)========================
  63.       last_hp = self.hp
  64.       self.hp += recover_hp
  65.       if self.is_a?(Game_Actor)
  66.         current_sp=self.ammo[self.akind]
  67.         current_maxsp=self.cta
  68.         last_sp = current_sp
  69.         current_sp += recover_sp
  70.         if current_sp > current_maxsp
  71.           current_sp = current_maxsp
  72.         end  
  73.         self.ammo[self.akind] = current_sp
  74.         effective =true
  75.       else  
  76.         last_sp = self.sp
  77.         self.sp += recover_sp
  78.         effective |= self.sp != last_sp
  79.       end  
  80.       effective |= self.hp != last_hp
  81.       #======================================================
  82.       
  83.       
  84.       # 状态变化
  85.       @state_changed = false
  86.       effective |= states_plus(item.plus_state_set)
  87.       effective |= states_minus(item.minus_state_set)
  88.       # 能力上升值有效的情况下
  89.       if item.parameter_type > 0 and item.parameter_points != 0
  90.         # 能力值的分支
  91.         case item.parameter_type
  92.         when 1  # MaxHP
  93.           @maxhp_plus += item.parameter_points
  94.         when 2  # MaxSP
  95.           @maxsp_plus += item.parameter_points
  96.         when 3  # 力量
  97.           @str_plus += item.parameter_points
  98.         when 4  # 灵巧
  99.           @dex_plus += item.parameter_points
  100.         when 5  # 速度
  101.           @agi_plus += item.parameter_points
  102.         when 6  # 魔力
  103.           @int_plus += item.parameter_points
  104.         end
  105.         # 设置有效标志
  106.         effective = true
  107.       end
  108.       # HP 回复率与回复量为 0 的情况下
  109.       if item.recover_hp_rate == 0 and item.recover_hp == 0
  110.         # 设置伤害为空的字符串
  111.         self.damage = ""
  112.         # SP 回复率与回复量为 0、能力上升值无效的情况下
  113.         if item.recover_sp_rate == 0 and item.recover_sp == 0 and
  114.            (item.parameter_type == 0 or item.parameter_points == 0)
  115.           # 状态没有变化的情况下
  116.           unless @state_changed
  117.             # 伤害设置为 "Miss"
  118.             self.damage = "Miss"
  119.           end
  120.         end
  121.       end
  122.     # Miss 的情况下
  123.     else
  124.       # 伤害设置为 "Miss"
  125.       self.damage = "Miss"
  126.     end
  127.     # 不在战斗中的情况下
  128.     unless $game_temp.in_battle
  129.       # 伤害设置为 nil
  130.       self.damage = nil
  131.     end
  132.     # 过程结束
  133.     return effective
  134.   end  
  135. end
复制代码

作者: slick    时间: 2008-5-30 17:16
脚本第三部分:修改自“二刀流”,这里让武器决定角色所使用的不同种SP及其最大值

  1. #=============================================================
  2. # 武器决定角色的SP种类及其最大值,以及角色本身的技能
  3. #=============================================================

  4. #=============================================================
  5. # 这个语句块定义了武器决定的SP最大值及其属性
  6. module RPG
  7.   class Weapon
  8.     attr_accessor :w_maxsp
  9.     attr_accessor :w_akind
  10.     def name
  11.       name = @name.split(/,/)[0]
  12.       return name != nil ? name : ''
  13.     end
  14.     def w_maxsp
  15.       w_maxsp = @name.split(/,/)[1]
  16.       return w_maxsp != nil ? w_maxsp.to_i : 0
  17.     end
  18.     def w_akind
  19.       w_akind = @name.split(/,/)[2]
  20.       return w_akind != nil ? w_akind.to_i : 0
  21.     end  
  22.   end  
  23. end
  24. #=============================================================  

  25. class Special_Element
  26.   #--------------------------------------------------------------------------
  27.   # ● 特殊な属性を定義する定数
  28.   #--------------------------------------------------------------------------
  29.   TWO_WEAPONS = "二刀流"

  30.   #--------------------------------------------------------------------------
  31.   # ● 特殊な属性をすべて取得
  32.   #--------------------------------------------------------------------------
  33.   def self.special_elements
  34.     # 特殊な属性をすべて列挙
  35.     elements = [
  36.       TWO_WEAPONS
  37.     ]
  38.     return elements
  39.   end

  40.   #--------------------------------------------------------------------------
  41.   # ● 属性名からその属性のIDを得る
  42.   #--------------------------------------------------------------------------
  43.   def self.get_index(name)
  44.     return $data_system.elements.index(name)
  45.   end
  46.   
  47.   #--------------------------------------------------------------------------
  48.   # ● 正規表現にマッチするすべての属性のIDとマッチ情報を得る
  49.   #     戻り値 : 二次元配列 [n][0]にID、[n][1]にマッチ情報(MatchData)
  50.   #--------------------------------------------------------------------------
  51.   def self.get_indices(regexp)
  52.     indices = []
  53.     for i in 1...$data_system.elements.size
  54.       indices.push([i, $~]) if regexp =~ $data_system.elements[i]
  55.     end
  56.   end
  57.   
  58.   #--------------------------------------------------------------------------
  59.   # ● 特殊な属性を取り除く
  60.   #     element_set     : 取り除く前の属性IDの配列
  61.   #     ignore_elements : 取り除きたい属性 ID・名前・正規表現で指定可能
  62.   #     戻り値          : 取り除いた結果の属性IDの配列
  63.   #--------------------------------------------------------------------------
  64.   def self.delete(element_set)
  65.     result = element_set.dup
  66.     for ignore in Special_Element::special_elements
  67.       case ignore
  68.       when Integer
  69.         result.delete(ignore)
  70.       when String
  71.         result.delete(Special_Element::get_index(ignore))
  72.       when Regexp
  73.         for i in result
  74.           result[i] = nil if ignore =~ $data_system.elements[result[i]]
  75.         end
  76.         result.delete(nil)
  77.       end
  78.     end
  79.     return result
  80.   end
  81. end

  82. class Game_Battler
  83.   #--------------------------------------------------------------------------
  84.   # ● 属性修正の計算
  85.   #     element_set : 属性
  86.   #--------------------------------------------------------------------------
  87.   def elements_correct(element_set)
  88.     # --- ここから変更部分 ---
  89.     element_set = Special_Element::delete(element_set)
  90.     # --- 変更部分終わり ---
  91.     # 無属性の場合
  92.     if element_set == []
  93.       # 100 を返す
  94.       return 100
  95.     end
  96.     # 与えられた属性の中で最も弱いものを返す
  97.     # ※メソッド element_rate は、このクラスから継承される Game_Actor
  98.     #   および Game_Enemy クラスで定義される
  99.     weakest = -100
  100.     for i in element_set
  101.       weakest = [weakest, self.element_rate(i)].max
  102.     end
  103.     return weakest
  104.   end
  105. end

  106. class Game_Actor < Game_Battler
  107.   #--------------------------------------------------------------------------
  108.   # ● 公開インスタンス変数
  109.   #--------------------------------------------------------------------------
  110.   attr_reader   :name                     # 名前
  111.   attr_reader   :character_name           # キャラクター ファイル名
  112.   attr_reader   :character_hue            # キャラクター 色相
  113.   attr_reader   :class_id                 # クラス ID
  114.   attr_reader   :weapon_id                # 武器 ID
  115.   # --- ここから追加部分 ---
  116.   attr_reader   :weapon2_id               # 二刀流武器 ID
  117.   # --- 追加部分終わり ---
  118.   attr_reader   :armor1_id                # 盾 ID
  119.   attr_reader   :armor2_id                # 頭防具 ID
  120.   attr_reader   :armor3_id                # 体防具 ID
  121.   attr_reader   :armor4_id                # 装飾品 ID
  122.   attr_reader   :level                    # レベル
  123.   attr_reader   :exp                      # EXP
  124.   attr_reader   :skills                   # スキル
  125.   attr_accessor :ammo                     # SP残留量
  126.   attr_accessor :akind                    # 使用何种SP
  127.   attr_accessor :cta                      # SP最大容量
  128.   #--------------------------------------------------------------------------
  129.   # ● セットアップ
  130.   #     actor_id : アクター ID
  131.   #--------------------------------------------------------------------------
  132.   def setup(actor_id)
  133.     actor = $data_actors[actor_id]
  134.     @actor_id = actor_id
  135.     @name = actor.name
  136.     @character_name = actor.character_name
  137.     @character_hue = actor.character_hue
  138.     @battler_name = actor.battler_name
  139.     @battler_hue = actor.battler_hue
  140.     @class_id = actor.class_id
  141.     @weapon_id = actor.weapon_id
  142.     # --- ここから追加部分 ---
  143.     @weapon2_id = 0
  144.     # --- 追加部分終わり ---
  145.     @armor1_id = actor.armor1_id
  146.     @armor2_id = actor.armor2_id
  147.     @armor3_id = actor.armor3_id
  148.     @armor4_id = actor.armor4_id
  149.     @level = actor.initial_level
  150.     @exp_list = Array.new(101)
  151.     make_exp_list
  152.     @exp = @exp_list[@level]
  153.     @skills = []
  154.     @hp = maxhp
  155.     @sp = maxsp
  156.     @states = []
  157.     @states_turn = {}
  158.     @maxhp_plus = 0
  159.     @maxsp_plus = 0
  160.     @str_plus = 0
  161.     @dex_plus = 0
  162.     @agi_plus = 0
  163.     @int_plus = 0
  164.     @ammo = [0,0,0,0,0,0,0,0,0]# 目前只使用九种能量
  165.     @akind = 0 # 缺省情况下使用格斗技能量
  166.     @cta=0
  167.     # スキル習得
  168.     for i in 1..@level
  169.       for j in $data_classes[@class_id].learnings
  170.         if j.level == i
  171.           learn_skill(j.skill_id)
  172.         end
  173.       end
  174.     end
  175.     # オートステートを更新
  176.     update_auto_state(nil, $data_armors[@armor1_id])
  177.     update_auto_state(nil, $data_armors[@armor2_id])
  178.     update_auto_state(nil, $data_armors[@armor3_id])
  179.     update_auto_state(nil, $data_armors[@armor4_id])
  180.   end

  181.   #--------------------------------------------------------------------------
  182.   # ● 通常攻撃の属性取得
  183.   #--------------------------------------------------------------------------
  184.   def element_set
  185.     weapon = $data_weapons[@weapon_id]
  186.     # --- ここから変更部分 ---
  187.     weapon2 = $data_weapons[@weapon2_id]
  188.     result = []
  189.     result.concat(weapon.element_set) if weapon != nil
  190.     result.concat(weapon2.element_set) if weapon2 != nil
  191.     return result
  192.     # --- 変更部分終わり ---
  193.   end
  194.   #--------------------------------------------------------------------------
  195.   # ● 通常攻撃のステート変化 (+) 取得
  196.   #--------------------------------------------------------------------------
  197.   def plus_state_set
  198.     weapon = $data_weapons[@weapon_id]
  199.     # --- ここから変更部分 ---
  200.     weapon2 = $data_weapons[@weapon2_id]
  201.     result = []
  202.     result.concat(weapon.plus_state_set) if weapon != nil
  203.     result.concat(weapon2.plus_state_set) if weapon2 != nil
  204.     return result
  205.     # --- 変更部分終わり ---
  206.   end
  207.   #--------------------------------------------------------------------------
  208.   # ● 通常攻撃のステート変化 (-) 取得
  209.   #--------------------------------------------------------------------------
  210.   def minus_state_set
  211.     weapon = $data_weapons[@weapon_id]
  212.     # --- ここから変更部分 ---
  213.     weapon2 = $data_weapons[@weapon2_id]
  214.     result = []
  215.     result.concat(weapon.minus_state_set) if weapon != nil
  216.     result.concat(weapon2.minus_state_set) if weapon2 != nil
  217.     return result
  218.     # --- 変更部分終わり ---
  219.   end

  220.   #--------------------------------------------------------------------------
  221.   # ● 基本腕力の取得
  222.   #--------------------------------------------------------------------------
  223.   def base_str
  224.     n = $data_actors[@actor_id].parameters[2, @level]
  225.     weapon = $data_weapons[@weapon_id]
  226.     armor1 = $data_armors[@armor1_id]
  227.     armor2 = $data_armors[@armor2_id]
  228.     armor3 = $data_armors[@armor3_id]
  229.     armor4 = $data_armors[@armor4_id]
  230.     # --- ここから追加部分 ---
  231.     weapon2 = $data_weapons[@weapon2_id]
  232.     # そのまま加算すると強すぎなので半分にしてみるテスト
  233.     n += weapon2 != nil ? weapon2.str_plus / 2 : 0
  234.     # --- 追加部分終わり ---
  235.     n += weapon != nil ? weapon.str_plus : 0
  236.     n += armor1 != nil ? armor1.str_plus : 0
  237.     n += armor2 != nil ? armor2.str_plus : 0
  238.     n += armor3 != nil ? armor3.str_plus : 0
  239.     n += armor4 != nil ? armor4.str_plus : 0
  240.     return [[n, 1].max, 999].min
  241.   end

  242.   #--------------------------------------------------------------------------
  243.   # ● 基本器用さの取得
  244.   #--------------------------------------------------------------------------
  245.   def base_dex
  246.     n = $data_actors[@actor_id].parameters[3, @level]
  247.     weapon = $data_weapons[@weapon_id]
  248.     armor1 = $data_armors[@armor1_id]
  249.     armor2 = $data_armors[@armor2_id]
  250.     armor3 = $data_armors[@armor3_id]
  251.     armor4 = $data_armors[@armor4_id]
  252.     # --- ここから追加部分 ---
  253.     weapon2 = $data_weapons[@weapon2_id]
  254.     # そのまま加算すると強すぎなので半分にしてみるテスト
  255.     n += weapon2 != nil ? weapon2.dex_plus / 2 : 0
  256.     # --- 追加部分終わり ---
  257.     n += weapon != nil ? weapon.dex_plus : 0
  258.     n += armor1 != nil ? armor1.dex_plus : 0
  259.     n += armor2 != nil ? armor2.dex_plus : 0
  260.     n += armor3 != nil ? armor3.dex_plus : 0
  261.     n += armor4 != nil ? armor4.dex_plus : 0
  262.     return [[n, 1].max, 999].min
  263.   end

  264.   #--------------------------------------------------------------------------
  265.   # ● 基本素早さの取得
  266.   #--------------------------------------------------------------------------
  267.   def base_agi
  268.     n = $data_actors[@actor_id].parameters[4, @level]
  269.     weapon = $data_weapons[@weapon_id]
  270.     armor1 = $data_armors[@armor1_id]
  271.     armor2 = $data_armors[@armor2_id]
  272.     armor3 = $data_armors[@armor3_id]
  273.     armor4 = $data_armors[@armor4_id]
  274.     # --- ここから追加部分 ---
  275.     weapon2 = $data_weapons[@weapon2_id]
  276.     # そのまま加算すると強すぎなので半分にしてみるテスト
  277.     n += weapon2 != nil ? weapon2.agi_plus / 2 : 0
  278.     # --- 追加部分終わり ---
  279.     n += weapon != nil ? weapon.agi_plus : 0
  280.     n += armor1 != nil ? armor1.agi_plus : 0
  281.     n += armor2 != nil ? armor2.agi_plus : 0
  282.     n += armor3 != nil ? armor3.agi_plus : 0
  283.     n += armor4 != nil ? armor4.agi_plus : 0
  284.     return [[n, 1].max, 999].min
  285.   end

  286.   #--------------------------------------------------------------------------
  287.   # ● 基本魔力の取得
  288.   #--------------------------------------------------------------------------
  289.   def base_int
  290.     n = $data_actors[@actor_id].parameters[5, @level]
  291.     weapon = $data_weapons[@weapon_id]
  292.     armor1 = $data_armors[@armor1_id]
  293.     armor2 = $data_armors[@armor2_id]
  294.     armor3 = $data_armors[@armor3_id]
  295.     armor4 = $data_armors[@armor4_id]
  296.     # --- ここから追加部分 ---
  297.     weapon2 = $data_weapons[@weapon2_id]
  298.     # そのまま加算すると強すぎなので半分にしてみるテスト
  299.     n += weapon2 != nil ? weapon2.int_plus / 2 : 0
  300.     # --- 追加部分終わり ---
  301.     n += weapon != nil ? weapon.int_plus : 0
  302.     n += armor1 != nil ? armor1.int_plus : 0
  303.     n += armor2 != nil ? armor2.int_plus : 0
  304.     n += armor3 != nil ? armor3.int_plus : 0
  305.     n += armor4 != nil ? armor4.int_plus : 0
  306.     return [[n, 1].max, 999].min
  307.   end

  308.   #--------------------------------------------------------------------------
  309.   # ● 基本攻撃力の取得
  310.   #--------------------------------------------------------------------------
  311.   def base_atk
  312.     weapon = $data_weapons[@weapon_id]
  313.     # --- ここから変更部分 ---
  314.     weapon2 = $data_weapons[@weapon2_id]
  315.     # そのまま加算すると強すぎなので半分にしてみるテスト
  316.     n = weapon2 != nil ? weapon2.atk / 2 : 0
  317.     return weapon != nil ? weapon.atk + n : n
  318.     # --- 変更部分終わり ---
  319.   end

  320.   #--------------------------------------------------------------------------
  321.   # ● 基本物理防御の取得
  322.   #--------------------------------------------------------------------------
  323.   def base_pdef
  324.     weapon = $data_weapons[@weapon_id]
  325.     armor1 = $data_armors[@armor1_id]
  326.     armor2 = $data_armors[@armor2_id]
  327.     armor3 = $data_armors[@armor3_id]
  328.     armor4 = $data_armors[@armor4_id]
  329.     pdef1 = weapon != nil ? weapon.pdef : 0
  330.     pdef2 = armor1 != nil ? armor1.pdef : 0
  331.     pdef3 = armor2 != nil ? armor2.pdef : 0
  332.     pdef4 = armor3 != nil ? armor3.pdef : 0
  333.     pdef5 = armor4 != nil ? armor4.pdef : 0
  334.     # --- ここから追加部分 ---
  335.     weapon2 = $data_weapons[@weapon2_id]
  336.     # そのまま加算すると強すぎなので半分にしてみるテスト
  337.     pdef1 += weapon2 != nil ? weapon2.pdef / 2 : 0
  338.     # --- 追加部分終わり ---
  339.     return pdef1 + pdef2 + pdef3 + pdef4 + pdef5
  340.   end

  341.   #--------------------------------------------------------------------------
  342.   # ● 基本魔法防御の取得
  343.   #--------------------------------------------------------------------------
  344.   def base_mdef
  345.     weapon = $data_weapons[@weapon_id]
  346.     armor1 = $data_armors[@armor1_id]
  347.     armor2 = $data_armors[@armor2_id]
  348.     armor3 = $data_armors[@armor3_id]
  349.     armor4 = $data_armors[@armor4_id]
  350.     mdef1 = weapon != nil ? weapon.mdef : 0
  351.     mdef2 = armor1 != nil ? armor1.mdef : 0
  352.     mdef3 = armor2 != nil ? armor2.mdef : 0
  353.     mdef4 = armor3 != nil ? armor3.mdef : 0
  354.     mdef5 = armor4 != nil ? armor4.mdef : 0
  355.     # --- ここから追加部分 ---
  356.     weapon2 = $data_weapons[@weapon2_id]
  357.     # そのまま加算すると強すぎなので半分にしてみるテスト
  358.     mdef1 += weapon2 != nil ? weapon2.mdef / 2 : 0
  359.     # --- 追加部分終わり ---
  360.     return mdef1 + mdef2 + mdef3 + mdef4 + mdef5
  361.   end

  362.   #--------------------------------------------------------------------------
  363.   # ● 通常攻撃 攻撃側アニメーション ID の取得
  364.   #--------------------------------------------------------------------------
  365.   def animation1_id
  366.     weapon = $data_weapons[@weapon_id]
  367.     # --- ここから変更部分 ---
  368.     weapon2 = $data_weapons[@weapon2_id]
  369.     animations = []
  370.     animations.push(weapon.animation1_id) if weapon != nil
  371.     animations.push(weapon2.animation1_id) if weapon2 != nil
  372.     animations.delete(0)
  373.     return animations.empty? ? 0 : animations
  374.     # --- 変更部分終わり ---
  375.   end

  376.   #--------------------------------------------------------------------------
  377.   # ● 通常攻撃 対象側アニメーション ID の取得
  378.   #--------------------------------------------------------------------------
  379.   def animation2_id
  380.     weapon = $data_weapons[@weapon_id]
  381.     # --- ここから変更部分 ---
  382.     weapon2 = $data_weapons[@weapon2_id]
  383.     animations = []
  384.     animations.push(weapon.animation2_id) if weapon != nil
  385.     animations.push(weapon2.animation2_id) if weapon2 != nil
  386.     animations.delete(0)
  387.     return animations.empty? ? 0 : animations
  388.     # --- 変更部分終わり ---
  389.   end

  390.   #--------------------------------------------------------------------------
  391.   # ● 装備の変更
  392.   #     equip_type : 装備タイプ(変更点:-1なら二刀流の盾部分の武器)
  393.   #     id    : 武器 or 防具 ID  (0 なら装備解除)
  394.   #--------------------------------------------------------------------------
  395.   def equip(equip_type, id)
  396.     case equip_type
  397.     when 0  # 武器
  398.       if id == 0 or $game_party.weapon_number(id) > 0
  399.         $game_party.gain_weapon(@weapon_id, 1)
  400.         @weapon_id = id
  401.         $game_party.lose_weapon(id, 1)
  402.         # --- ここから追加部分 ---
  403.         # 二刀武器じゃないものを装備した場合、盾の部分の二刀武器を外す
  404.         if id != 0 and !$data_weapons[id].element_set.include?(Special_Element::get_index(Special_Element::TWO_WEAPONS))
  405.           $game_party.gain_weapon(@weapon2_id, 1)
  406.           @weapon2_id = 0
  407.         end
  408.         # --- 追加部分終わり ---
  409.       end
  410.     when 1  # 盾
  411.       if id == 0 or $game_party.armor_number(id) > 0
  412.         update_auto_state($data_armors[@armor1_id], $data_armors[id])
  413.         $game_party.gain_armor(@armor1_id, 1)
  414.         @armor1_id = id
  415.         $game_party.lose_armor(id, 1)
  416.         # --- ここから追加部分 ---
  417.         # 二刀武器を装備していた場合は外す
  418.         if id != 0
  419.           $game_party.gain_weapon(@weapon2_id, 1)
  420.           @weapon2_id = 0
  421.         end
  422.         # --- 追加部分終わり ---
  423.       end
  424.     when 2  # 頭
  425.       if id == 0 or $game_party.armor_number(id) > 0
  426.         update_auto_state($data_armors[@armor2_id], $data_armors[id])
  427.         $game_party.gain_armor(@armor2_id, 1)
  428.         @armor2_id = id
  429.         $game_party.lose_armor(id, 1)
  430.       end
  431.     when 3  # 身体
  432.       if id == 0 or $game_party.armor_number(id) > 0
  433.         update_auto_state($data_armors[@armor3_id], $data_armors[id])
  434.         $game_party.gain_armor(@armor3_id, 1)
  435.         @armor3_id = id
  436.         $game_party.lose_armor(id, 1)
  437.       end
  438.     when 4  # 装飾品
  439.       if id == 0 or $game_party.armor_number(id) > 0
  440.         update_auto_state($data_armors[@armor4_id], $data_armors[id])
  441.         $game_party.gain_armor(@armor4_id, 1)
  442.         @armor4_id = id
  443.         $game_party.lose_armor(id, 1)
  444.       end
  445.       # --- ここから追加部分 ---
  446.       when -1 # 二刀流の盾部分の武器
  447.       if id == 0 or $game_party.weapon_number(id) > 0
  448.         $game_party.gain_weapon(@weapon2_id, 1)
  449.         @weapon2_id = id
  450.         $game_party.lose_weapon(id, 1)
  451.         # 盾を外す
  452.         $game_party.gain_armor(@armor1_id, 1)
  453.         @armor1_id = 0
  454.         # 既に装備している武器が二刀武器じゃない場合は外す
  455.         if id != 0 and @weapon_id != 0 and !$data_weapons[@weapon_id].element_set.include?(Special_Element::get_index(Special_Element::TWO_WEAPONS))
  456.           $game_party.gain_weapon(@weapon_id, 1)
  457.           @weapon_id = 0
  458.         end
  459.       end
  460.       # --- 追加部分終わり ---
  461.     end
  462.   end

  463.   #--------------------------------------------------------------------------
  464.   # ● 二刀流可能なアクターかどうか
  465.   #--------------------------------------------------------------------------
  466.   def can_two_weapons?
  467.     return class_element_set.include?(Special_Element::get_index(Special_Element::TWO_WEAPONS))
  468.   end

  469.   #--------------------------------------------------------------------------
  470.   # ● アクターの所属クラスの属性がAのものを取得
  471.   #--------------------------------------------------------------------------
  472.   def class_element_set
  473.     element_set = []
  474.     for i in 1...$data_classes[@class_id].element_ranks.xsize
  475.       element_set.push(i) if $data_classes[@class_id].element_ranks[i] == 1
  476.     end
  477.     return element_set
  478.   end
  479. end

  480. class Window_EquipRight < Window_Selectable
  481.   #--------------------------------------------------------------------------
  482.   # ● リフレッシュ
  483.   #--------------------------------------------------------------------------
  484.   def refresh
  485.     self.contents.clear
  486.     @data = []
  487.     @data.push($data_weapons[@actor.weapon_id])
  488.     # --- ここから変更部分 ---
  489.     @data.push(@actor.weapon2_id != 0 ? $data_weapons[@actor.weapon2_id] : $data_armors[@actor.armor1_id])
  490.     # --- 変更部分終わり ---
  491.     @data.push($data_armors[@actor.armor2_id])
  492.     @data.push($data_armors[@actor.armor3_id])
  493.     @data.push($data_armors[@actor.armor4_id])
  494.     @item_max = @data.size
  495.     self.contents.font.color = system_color
  496.     self.contents.draw_text(4, 32 * 0, 92, 32, $data_system.words.weapon)
  497.     self.contents.draw_text(4, 32 * 1, 92, 32, $data_system.words.armor1)
  498.     self.contents.draw_text(4, 32 * 2, 92, 32, $data_system.words.armor2)
  499.     self.contents.draw_text(4, 32 * 3, 92, 32, $data_system.words.armor3)
  500.     self.contents.draw_text(5, 32 * 4, 92, 32, $data_system.words.armor4)
  501.     draw_item_name(@data[0], 92, 32 * 0)
  502.     draw_item_name(@data[1], 92, 32 * 1)
  503.     draw_item_name(@data[2], 92, 32 * 2)
  504.     draw_item_name(@data[3], 92, 32 * 3)
  505.     draw_item_name(@data[4], 92, 32 * 4)
  506.   end
  507. end

  508. class Window_EquipItem < Window_Selectable
  509.   #--------------------------------------------------------------------------
  510.   # ● リフレッシュ
  511.   #--------------------------------------------------------------------------
  512.   def refresh
  513.     if self.contents != nil
  514.       self.contents.dispose
  515.       self.contents = nil
  516.     end
  517.     @data = []
  518.     # 装備可能な武器を追加
  519.     if @equip_type == 0
  520.       weapon_set = $data_classes[@actor.class_id].weapon_set
  521.       for i in 1...$data_weapons.size
  522.         if $game_party.weapon_number(i) > 0 and weapon_set.include?(i)
  523.           @data.push($data_weapons[i])
  524.         end
  525.       end
  526.     end
  527.     # --- ここから追加部分 ---
  528.     # 二刀流可能なアクターの場合は、盾に二刀武器も表示
  529.     if @equip_type == 1 and @actor.can_two_weapons?
  530.       weapon_set = $data_classes[@actor.class_id].weapon_set
  531.       for i in 1...$data_weapons.size
  532.         if $game_party.weapon_number(i) > 0 and weapon_set.include?(i) and $data_weapons[i].element_set.include?(Special_Element::get_index(Special_Element::TWO_WEAPONS))
  533.           @data.push($data_weapons[i])
  534.         end
  535.       end
  536.     end
  537.     # --- 追加部分終わり ---
  538.     # 装備可能な防具を追加
  539.     if @equip_type != 0
  540.       armor_set = $data_classes[@actor.class_id].armor_set
  541.       for i in 1...$data_armors.size
  542.         if $game_party.armor_number(i) > 0 and armor_set.include?(i)
  543.           if $data_armors[i].kind == @equip_type-1
  544.             @data.push($data_armors[i])
  545.           end
  546.         end
  547.       end
  548.     end
  549.     # 空白を追加
  550.     @data.push(nil)
  551.     # ビットマップを作成し、全項目を描画
  552.     @item_max = @data.size
  553.     self.contents = Bitmap.new(width - 32, row_max * 32)
  554.     for i in 0...@item_max-1
  555.       draw_item(i)
  556.     end
  557.   end
  558. end

  559. class Scene_Equip
  560.   #--------------------------------------------------------------------------
  561.   # ● リフレッシュ
  562.   #--------------------------------------------------------------------------
  563.   def refresh
  564.     # アイテムウィンドウの可視状態設定
  565.     @item_window1.visible = (@right_window.index == 0)
  566.     @item_window2.visible = (@right_window.index == 1)
  567.     @item_window3.visible = (@right_window.index == 2)
  568.     @item_window4.visible = (@right_window.index == 3)
  569.     @item_window5.visible = (@right_window.index == 4)
  570.     # 現在装備中のアイテムを取得
  571.     item1 = @right_window.item
  572.     # 現在のアイテムウィンドウを @item_window に設定
  573.     case @right_window.index
  574.     when 0
  575.       @item_window = @item_window1
  576.     when 1
  577.       @item_window = @item_window2
  578.     when 2
  579.       @item_window = @item_window3
  580.     when 3
  581.       @item_window = @item_window4
  582.     when 4
  583.       @item_window = @item_window5
  584.     end
  585.     # ライトウィンドウがアクティブの場合
  586.     if @right_window.active
  587.       # 装備変更後のパラメータを消去
  588.       @left_window.set_new_parameters(nil, nil, nil)
  589.     end
  590.     # アイテムウィンドウがアクティブの場合
  591.     if @item_window.active
  592.       # 現在選択中のアイテムを取得
  593.       item2 = @item_window.item
  594.       # 装備を変更
  595.       last_hp = @actor.hp
  596.       last_sp = @actor.sp
  597.       last_akind = @actor.akind #弹药种类是否与以前相同?
  598.       last_ammo = @actor.ammo[@actor.akind]
  599.       # --- ここから変更部分 ---
  600.       # 現在の装備を保存(装備の種類を増やしている場合はここを変更)
  601.       equipments = [@actor.weapon2_id, @actor.weapon_id, @actor.armor1_id, @actor.armor2_id, @actor.armor3_id, @actor.armor4_id]
  602.       @actor.equip(equip_type(@right_window.index, item2), item2 == nil ? 0 : item2.id)
  603.       # --- 変更部分終わり ---
  604.       # 装備変更後のパラメータを取得
  605.       new_atk = @actor.atk
  606.       new_pdef = @actor.pdef
  607.       new_mdef = @actor.mdef
  608.       #================================================================这里是关键!
  609.       neomaxsp=0
  610.       if @actor.weapon_id !=0
  611.         @actor.akind=$data_weapons[@actor.weapon_id].w_akind
  612.       end  
  613.       if @actor.weapon_id !=0
  614.         neomaxsp+=$data_weapons[@actor.weapon_id].w_maxsp
  615.       end  
  616.       @actor.cta=neomaxsp
  617.       if @actor.akind==last_akind
  618.         @actor.ammo[@actor.akind] = [last_ammo,@actor.cta].min#弹药种类相同取弹匣小值
  619.       end  
  620.       #================================================================
  621.       # --- ここから変更部分 ---
  622.       # 装備を戻す
  623.       for i in 0...equipments.size
  624.         @actor.equip(i - 1, equipments[i])
  625.       end
  626.       # --- 変更部分終わり ---
  627.       @actor.hp = last_hp
  628.       @actor.sp = last_sp
  629.       
  630.       # レフトウィンドウに描画
  631.       @left_window.set_new_parameters(new_atk, new_pdef, new_mdef)
  632.     end
  633.   end

  634.   #--------------------------------------------------------------------------
  635.   # ● フレーム更新 (アイテムウィンドウがアクティブの場合)
  636.   #--------------------------------------------------------------------------
  637.   def update_item
  638.     # B ボタンが押された場合
  639.     if Input.trigger?(Input::B)
  640.       # キャンセル SE を演奏
  641.       $game_system.se_play($data_system.cancel_se)
  642.       # ライトウィンドウをアクティブ化
  643.       @right_window.active = true
  644.       @item_window.active = false
  645.       @item_window.index = -1
  646.       return
  647.     end
  648.     # C ボタンが押された場合
  649.     if Input.trigger?(Input::C)
  650.       # 装備 SE を演奏
  651.       $game_system.se_play($data_system.equip_se)
  652.       # アイテムウィンドウで現在選択されているデータを取得
  653.       item = @item_window.item
  654.       # --- ここから変更部分 ---
  655.       # 装備を変更
  656.       @actor.equip(equip_type(@right_window.index, item), item == nil ? 0 : item.id)
  657.       # --- 変更部分終わり ---
  658.       # ライトウィンドウをアクティブ化
  659.       @right_window.active = true
  660.       @item_window.active = false
  661.       @item_window.index = -1
  662.       # ライトウィンドウ、アイテムウィンドウの内容を再作成
  663.       @right_window.refresh
  664.       # --- ここから変更部分 ---
  665.       # めんどくさいのですべてのウィンドウをリフレッシュ
  666.       @item_window1.refresh
  667.       @item_window2.refresh
  668.       @item_window3.refresh
  669.       @item_window4.refresh
  670.       @item_window5.refresh
  671.       # --- 変更部分終わり ---
  672.       return
  673.     end
  674.   end
  675.   
  676.   # --- ここから追加部分 ---
  677.   #--------------------------------------------------------------------------
  678.   # ● 二刀流用の装備部位取得
  679.   #--------------------------------------------------------------------------
  680.   def equip_type(index, item)
  681.     return index * (item.is_a?(RPG::Armor) ? 1 : -1)
  682.   end
  683.   # --- 追加部分終わり ---
  684. end

  685. class Scene_Battle
  686.   #--------------------------------------------------------------------------
  687.   # ● 基本アクション 結果作成
  688.   #--------------------------------------------------------------------------
  689.   def make_basic_action_result
  690.     # 攻撃の場合
  691.     if @active_battler.current_action.basic == 0
  692.       # --- ここから変更部分 ---
  693.       # アニメーション ID を設定
  694.       @animation1_id = @active_battler.animation1_id.is_a?(Array) ? @active_battler.animation1_id.dup : @active_battler.animation1_id
  695.       @animation2_id = @active_battler.animation2_id.is_a?(Array) ? @active_battler.animation2_id.dup : @active_battler.animation2_id
  696.       # --- 変更部分終わり ---
  697.       # 行動側バトラーがエネミーの場合
  698.       if @active_battler.is_a?(Game_Enemy)
  699.         if @active_battler.restriction == 3
  700.           target = $game_troop.random_target_enemy
  701.         elsif @active_battler.restriction == 2
  702.           target = $game_party.random_target_actor
  703.         else
  704.           index = @active_battler.current_action.target_index
  705.           target = $game_party.smooth_target_actor(index)
  706.         end
  707.       end
  708.       # 行動側バトラーがアクターの場合
  709.       if @active_battler.is_a?(Game_Actor)
  710.         if @active_battler.restriction == 3
  711.           target = $game_party.random_target_actor
  712.         elsif @active_battler.restriction == 2
  713.           target = $game_troop.random_target_enemy
  714.         else
  715.           index = @active_battler.current_action.target_index
  716.           target = $game_troop.smooth_target_enemy(index)
  717.         end
  718.       end
  719.       # 対象側バトラーの配列を設定
  720.       @target_battlers = [target]
  721.       # 通常攻撃の効果を適用
  722.       for target in @target_battlers
  723.         target.attack_effect(@active_battler)
  724.       end
  725.       return
  726.     end
  727.     # 防御の場合
  728.     if @active_battler.current_action.basic == 1
  729.       # ヘルプウィンドウに "防御" を表示
  730.       @help_window.set_text($data_system.words.guard, 1)
  731.       return
  732.     end
  733.     # 逃げるの場合
  734.     if @active_battler.is_a?(Game_Enemy) and
  735.        @active_battler.current_action.basic == 2
  736.       # ヘルプウィンドウに "逃げる" を表示
  737.       @help_window.set_text("逃げる", 1)
  738.       # 逃げる
  739.       @active_battler.escape
  740.       return
  741.     end
  742.     # 何もしないの場合
  743.     if @active_battler.current_action.basic == 3
  744.       # アクション強制対象のバトラーをクリア
  745.       $game_temp.forcing_battler = nil
  746.       # ステップ 1 に移行
  747.       @phase4_step = 1
  748.       return
  749.     end
  750.   end

  751.   #--------------------------------------------------------------------------
  752.   # ● フレーム更新 (メインフェーズ ステップ 3 : 行動側アニメーション)
  753.   #--------------------------------------------------------------------------
  754.   def update_phase4_step3
  755.     # --- ここから変更部分 ---
  756.     # アニメーションの配列の先頭を取り出す
  757.     if @animation1_id.is_a?(Integer)
  758.       @animation1_id = [@animation1_id]
  759.     end
  760.     animation = @animation1_id.shift
  761.     # 行動側アニメーション (ID が 0 の場合は白フラッシュ)
  762.     if animation == 0
  763.       @active_battler.white_flash = true
  764.     else
  765.       @active_battler.animation_id = animation
  766.       @active_battler.animation_hit = true
  767.     end
  768.     # アニメーションがなくなったらステップ 4 に移行
  769.     @phase4_step = 4 if @animation1_id.empty?
  770.     # --- 変更部分終わり ---
  771.   end

  772.   #--------------------------------------------------------------------------
  773.   # ● フレーム更新 (メインフェーズ ステップ 4 : 対象側アニメーション)
  774.   #--------------------------------------------------------------------------
  775.   def update_phase4_step4
  776.     # --- ここから変更部分 ---
  777.     # アニメーションの配列の先頭を取り出す
  778.     if @animation2_id.is_a?(Integer)
  779.       @animation2_id = [@animation2_id]
  780.     end
  781.     animation = @animation2_id.shift
  782.     # 対象側アニメーション
  783.     for target in @target_battlers
  784.       target.animation_id = animation
  785.       target.animation_hit = (target.damage != "Miss")
  786.     end
  787.     # アニメーションの長さにかかわらず、最低 8 フレーム待つ
  788.     @wait_count = 8
  789.     # アニメーションがなくなったらステップ 5 に移行
  790.     @phase4_step = 5 if @animation2_id.empty?
  791.     # --- 変更部分終わり ---
  792.   end
  793. end
复制代码

作者: slick    时间: 2008-5-30 17:16
脚本最后一部分:修改自“武器决定技能”

  1. class Game_Battler
  2. #--------------------------------------------------------------------------
  3. SW_SET = [1,2,3,4,5,6,7,8,9] # 此处设定武器和技能关联的属性id
  4. #--------------------------------------------------------------------------
  5. def skill_can_use?(skill_id)
  6.    if self.is_a?(Game_Actor) and self.weapon_id > 0
  7.      sw_boolean = false # 判断武器和技能关联
  8.      s = SW_SET & $data_skills[skill_id].element_set
  9.      if s.empty?
  10.        sw_boolean = true
  11.      else
  12.        for i in s
  13.          if  $data_weapons[self.weapon_id].element_set .include?(i)
  14.            sw_boolean = true
  15.            break
  16.          end
  17.        end
  18.      end
  19.      if sw_boolean == false
  20.        return false
  21.      end
  22.      current_sp=self.ammo[self.akind]#这里修改为对各种SP的判断
  23.      current_maxsp=self.cta
  24.      if $data_skills[skill_id].sp_cost > current_sp
  25.        return false
  26.      end
  27.    end
  28.    
  29.    if dead?
  30.      return false
  31.    end
  32.    if $data_skills[skill_id].atk_f == 0 and self.restriction == 1
  33.      return false
  34.    end
  35.    occasion = $data_skills[skill_id].occasion
  36.    if $game_temp.in_battle
  37.      return (occasion == 0 or occasion == 1)
  38.    else
  39.      return (occasion == 0 or occasion == 2)
  40.    end
  41. end
  42. end
  43. #==============================================================================

  44. class Window_Skill < Window_Selectable
  45. #--------------------------------------------------------------------------
  46. def refresh
  47.    if self.contents != nil
  48.      self.contents.dispose
  49.      self.contents = nil
  50.    end
  51.    @data = []
  52.    for i in [email protected]
  53.      skill = $data_skills[@actor.skills[i]]
  54.      if skill != nil and @actor.skill_can_use?(skill.id) # 排除无法使用的技能
  55.        @data.push(skill)
  56.      end
  57.    end
  58.    @item_max = @data.size
  59.    if @item_max > 0
  60.      self.contents = Bitmap.new(width - 32, row_max * 32)
  61.      for i in 0...@item_max
  62.        draw_item(i)
  63.      end
  64.    end
  65. end
  66. end
  67. #==============================================================================

  68. class Scene_Battle
  69. #--------------------------------------------------------------------------
  70. def scope_id
  71.    scope = 0
  72.    for i in 1...$data_system.elements.size
  73.      if $data_system.elements[i] =~ /全体化/
  74.        scope = i
  75.        break
  76.      end
  77.    end
  78.    return scope
  79. end
  80. #--------------------------------------------------------------------------
  81. def update_phase3_basic_command
  82.    if Input.trigger?(Input::B)
  83.      $game_system.se_play($data_system.cancel_se)
  84.      phase3_prior_actor
  85.      return
  86.    end
  87.    if Input.trigger?(Input::C)
  88.      case @actor_command_window.index
  89.      when 0  # 攻击
  90.        $game_system.se_play($data_system.decision_se)
  91.        @active_battler.current_action.kind = 0
  92.        @active_battler.current_action.basic = 0
  93.        # 开始选择敌人
  94.        if @active_battler.weapon_id > 0 and
  95.          $data_weapons[@active_battler.weapon_id].element_set.include?(scope_id)
  96.          phase3_next_actor
  97.        else
  98.          start_enemy_select
  99.        end
  100.      when 1  # 特技
  101.        $game_system.se_play($data_system.decision_se)
  102.        @active_battler.current_action.kind = 1
  103.        start_skill_select
  104.      when 2  # 防御
  105.        $game_system.se_play($data_system.decision_se)
  106.        @active_battler.current_action.kind = 0
  107.        @active_battler.current_action.basic = 1
  108.        phase3_next_actor
  109.      when 3  # 物品
  110.        $game_system.se_play($data_system.decision_se)
  111.        @active_battler.current_action.kind = 2
  112.        start_item_select
  113.      end
  114.      return
  115.    end
  116. end
  117. #--------------------------------------------------------------------------
  118. def make_basic_action_result # 改写自 随机全体化的武器装备(柳柳)
  119.    if @active_battler.current_action.basic == 0
  120.      @animation1_id = @active_battler.animation1_id
  121.      @animation2_id = @active_battler.animation2_id
  122.      if @active_battler.is_a?(Game_Enemy)
  123.        if @active_battler.restriction == 3
  124.          target = $game_troop.random_target_enemy
  125.        elsif @active_battler.restriction == 2
  126.          target = $game_party.random_target_actor
  127.        else
  128.          index = @active_battler.current_action.target_index
  129.          target = $game_party.smooth_target_actor(index)
  130.        end
  131.      end
  132.      if @active_battler.is_a?(Game_Actor)
  133.        if @active_battler.restriction == 3
  134.          target = $game_party.random_target_actor
  135.        elsif @active_battler.restriction == 2
  136.          target = $game_troop.random_target_enemy
  137.        else
  138.          # 武器带[全体化]属性时
  139.          if @active_battler.weapon_id > 0 and
  140.            $data_weapons[@active_battler.weapon_id].element_set.include?(scope_id)
  141.            for enemy in $game_troop.enemies
  142.              if enemy.exist?
  143.                @target_battlers.push(enemy)
  144.              end
  145.            end
  146.          end
  147.          index = @active_battler.current_action.target_index
  148.          target = $game_troop.smooth_target_enemy(index)
  149.        end
  150.      end
  151.      if @target_battlers == []
  152.        # 设置对像方的战斗者序列
  153.        @target_battlers = [target]
  154.      end
  155.      for target in @target_battlers
  156.        target.attack_effect(@active_battler)
  157.      end
  158.      return
  159.    end
  160.    if @active_battler.current_action.basic == 1
  161.      @help_window.set_text($data_system.words.guard, 1)
  162.      return
  163.    end
  164.    if @active_battler.is_a?(Game_Enemy) and
  165.       @active_battler.current_action.basic == 2
  166.      @help_window.set_text("逃跑", 1)
  167.      @active_battler.escape
  168.      return
  169.    end
  170.    if @active_battler.current_action.basic == 3
  171.      $game_temp.forcing_battler = nil
  172.      @phase4_step = 1
  173.      return
  174.    end
  175. end
  176.   #--------------------------------------------------------------------------
  177.   # ● 生成特技行动结果
  178.   #--------------------------------------------------------------------------
  179.   def make_skill_action_result
  180.     # 获取特技
  181.     @skill = $data_skills[@active_battler.current_action.skill_id]
  182.     # 如果不是强制行动
  183.     unless @active_battler.current_action.forcing
  184.       # 因为 SP 耗尽而无法使用的情况下
  185.       unless @active_battler.skill_can_use?(@skill.id)
  186.         # 清除强制行动对像的战斗者
  187.         $game_temp.forcing_battler = nil
  188.         # 移至步骤 1
  189.         @phase4_step = 1
  190.         return
  191.       end
  192.     end

  193.     # 消耗 SP(区分不同种类)==============================================================
  194.     if @active_battler.is_a?(Game_Actor)
  195.       @active_battler.ammo[@active_battler.akind] -= @skill.sp_cost
  196.     else  
  197.       @active_battler.sp -= @skill.sp_cost
  198.     end if  
  199.     #======================================================================================

  200.     # 刷新状态窗口
  201.     @status_window.refresh
  202.     # 在帮助窗口显示特技名
  203.     @help_window.set_text(@skill.name, 1)
  204.     # 设置动画 ID
  205.     @animation1_id = @skill.animation1_id
  206.     @animation2_id = @skill.animation2_id
  207.     # 设置公共事件 ID
  208.     @common_event_id = @skill.common_event_id
  209.     # 设置对像侧战斗者
  210.     set_target_battlers(@skill.scope)
  211.     # 应用特技效果
  212.     for target in @target_battlers
  213.       target.skill_effect(@active_battler, @skill)
  214.     end
  215.   end
  216. end
复制代码

作者: 禾西    时间: 2008-5-30 18:50
...太過複雜了 Orz
我說這個腳本如果牽涉沉影的「武器决定技能」還算合理。但是怎麼跟「二刀流」也扯上關係啦?==a
作者: slick    时间: 2008-5-30 22:57
以下引用禾西于2008-5-30 10:50:09的发言:
...太過複雜了 Orz
我說這個腳本如果牽涉沉影的「武器决定技能」還算合理。但是怎麼跟「二刀流」也扯上關係啦?==a


我也 Ojz个。。。。。。

范例工程:http://rpg.blue/upload_program/f ... _SLICK_92588168.rar

不过谢谢禾大人提醒,确实复杂了,所以我把那个精简成了一个外挂脚本附上来,如下

# 不同种类的SP分开用 精简版 BY SLICK

  1. module RPG
  2.   class Weapon            # 武器名称所能决定SP种类及属性的定义方法(格式像这样:钢匕首,2000,0)
  3.     attr_accessor :w_maxsp
  4.     attr_accessor :w_akind
  5.     def name
  6.       name = @name.split(/,/)[0]
  7.       return name != nil ? name : ''
  8.     end
  9.     def w_maxsp
  10.       w_maxsp = @name.split(/,/)[1]
  11.       return w_maxsp != nil ? w_maxsp.to_i : 0
  12.     end
  13.     def w_akind
  14.       w_akind = @name.split(/,/)[2]
  15.       return w_akind != nil ? w_akind.to_i : 0
  16.     end  
  17.   end  
  18. end

  19. class Game_Actor < Game_Battler
  20.   #--------------------------------------------------------------------------
  21.   # ● 公開インスタンス変数
  22.   #--------------------------------------------------------------------------
  23.   attr_reader   :name                     # 名前
  24.   attr_reader   :character_name           # キャラクター ファイル名
  25.   attr_reader   :character_hue            # キャラクター 色相
  26.   attr_reader   :class_id                 # クラス ID
  27.   attr_reader   :weapon_id                # 武器 ID
  28.   attr_reader   :armor1_id                # 盾 ID
  29.   attr_reader   :armor2_id                # 頭防具 ID
  30.   attr_reader   :armor3_id                # 体防具 ID
  31.   attr_reader   :armor4_id                # 装飾品 ID
  32.   attr_reader   :level                    # レベル
  33.   attr_reader   :exp                      # EXP
  34.   attr_reader   :skills                   # スキル
  35.   attr_accessor :ammo                     # SP残留量
  36.   attr_accessor :akind                    # 使用何种SP
  37.   attr_accessor :cta                      # SP最大容量
  38.   #--------------------------------------------------------------------------
  39.   # ● セットアップ
  40.   #     actor_id : アクター ID
  41.   #--------------------------------------------------------------------------
  42.   def setup(actor_id)
  43.     actor = $data_actors[actor_id]
  44.     @actor_id = actor_id
  45.     @name = actor.name
  46.     @character_name = actor.character_name
  47.     @character_hue = actor.character_hue
  48.     @battler_name = actor.battler_name
  49.     @battler_hue = actor.battler_hue
  50.     @class_id = actor.class_id
  51.     @weapon_id = actor.weapon_id
  52.     @armor1_id = actor.armor1_id
  53.     @armor2_id = actor.armor2_id
  54.     @armor3_id = actor.armor3_id
  55.     @armor4_id = actor.armor4_id
  56.     @level = actor.initial_level
  57.     @exp_list = Array.new(101)
  58.     make_exp_list
  59.     @exp = @exp_list[@level]
  60.     @skills = []
  61.     @hp = maxhp
  62.     @sp = maxsp
  63.     @states = []
  64.     @states_turn = {}
  65.     @maxhp_plus = 0
  66.     @maxsp_plus = 0
  67.     @str_plus = 0
  68.     @dex_plus = 0
  69.     @agi_plus = 0
  70.     @int_plus = 0
  71.     @ammo = [0,0,0,0,0,0,0,0,0]# 目前只使用九种能量
  72.     @akind = 1 # 缺省情况下使用格斗技能量
  73.     @cta=0
  74.     # スキル習得
  75.     for i in 1..@level
  76.       for j in $data_classes[@class_id].learnings
  77.         if j.level == i
  78.           learn_skill(j.skill_id)
  79.         end
  80.       end
  81.     end
  82.     # オートステートを更新
  83.     update_auto_state(nil, $data_armors[@armor1_id])
  84.     update_auto_state(nil, $data_armors[@armor2_id])
  85.     update_auto_state(nil, $data_armors[@armor3_id])
  86.     update_auto_state(nil, $data_armors[@armor4_id])
  87.   end
  88. end

  89. class Scene_Equip
  90.   #--------------------------------------------------------------------------
  91.   # ● リフレッシュ
  92.   #--------------------------------------------------------------------------
  93.   def refresh
  94.     # 设置物品窗口的可视状态
  95.     @item_window1.visible = (@right_window.index == 0)
  96.     @item_window2.visible = (@right_window.index == 1)
  97.     @item_window3.visible = (@right_window.index == 2)
  98.     @item_window4.visible = (@right_window.index == 3)
  99.     @item_window5.visible = (@right_window.index == 4)
  100.     # 获取当前装备中的物品
  101.     item1 = @right_window.item
  102.     # 设置当前的物品窗口到 @item_window
  103.     case @right_window.index
  104.     when 0
  105.       @item_window = @item_window1
  106.     when 1
  107.       @item_window = @item_window2
  108.     when 2
  109.       @item_window = @item_window3
  110.     when 3
  111.       @item_window = @item_window4
  112.     when 4
  113.       @item_window = @item_window5
  114.     end
  115.     # 右窗口被激活的情况下
  116.     if @right_window.active
  117.       # 删除变更装备后的能力
  118.       @left_window.set_new_parameters(nil, nil, nil)
  119.     end
  120.     # 物品窗口被激活的情况下
  121.     if @item_window.active
  122.       # 获取现在选中的物品
  123.       item2 = @item_window.item
  124.       # 变更装备
  125.       last_hp = @actor.hp
  126.       last_sp = @actor.sp
  127.       last_akind = @actor.akind #弹药种类是否与以前相同?
  128.       last_ammo = @actor.ammo[@actor.akind]
  129.       @actor.equip(@right_window.index, item2 == nil ? 0 : item2.id)
  130.       # 获取变更装备后的能力值
  131.       new_atk = @actor.atk
  132.       new_pdef = @actor.pdef
  133.       new_mdef = @actor.mdef
  134.       # 关键部分:武器决定角色的SP属性及其最大值
  135.       neomaxsp=0
  136.       if @actor.weapon_id !=0
  137.         @actor.akind=$data_weapons[@actor.weapon_id].w_akind
  138.       end  
  139.       if @actor.weapon_id !=0
  140.         neomaxsp+=$data_weapons[@actor.weapon_id].w_maxsp
  141.       end  
  142.       @actor.cta=neomaxsp
  143.       if @actor.akind==last_akind
  144.         @actor.ammo[@actor.akind] = [last_ammo,@actor.cta].min#弹药种类相同取弹匣小值
  145.       end  
  146.       # 返回到装备
  147.       @actor.equip(@right_window.index, item1 == nil ? 0 : item1.id)
  148.       @actor.hp = last_hp
  149.       @actor.sp = last_sp
  150.       # 描画左窗口
  151.       @left_window.set_new_parameters(new_atk, new_pdef, new_mdef)
  152.     end
  153.   end  
  154. end

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

  197. class Scene_Battle
  198.   def make_skill_action_result
  199.     # 获取特技
  200.     @skill = $data_skills[@active_battler.current_action.skill_id]
  201.     # 如果不是强制行动
  202.     unless @active_battler.current_action.forcing
  203.       # 因为 SP 耗尽而无法使用的情况下
  204.       unless @active_battler.skill_can_use?(@skill.id)
  205.         # 清除强制行动对像的战斗者
  206.         $game_temp.forcing_battler = nil
  207.         # 移至步骤 1
  208.         @phase4_step = 1
  209.         return
  210.       end
  211.     end
  212.     # 消耗 SP(区分不同种类)
  213.     if @active_battler.is_a?(Game_Actor)
  214.       @active_battler.ammo[@active_battler.akind] -= @skill.sp_cost
  215.     else  
  216.       @active_battler.sp -= @skill.sp_cost
  217.     end if  
  218.     # 刷新状态窗口
  219.     @status_window.refresh
  220.     # 在帮助窗口显示特技名
  221.     @help_window.set_text(@skill.name, 1)
  222.     # 设置动画 ID
  223.     @animation1_id = @skill.animation1_id
  224.     @animation2_id = @skill.animation2_id
  225.     # 设置公共事件 ID
  226.     @common_event_id = @skill.common_event_id
  227.     # 设置对像侧战斗者
  228.     set_target_battlers(@skill.scope)
  229.     # 应用特技效果
  230.     for target in @target_battlers
  231.       target.skill_effect(@active_battler, @skill)
  232.     end
  233.   end
  234. end

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

  238. class Game_Battler
  239.   #--------------------------------------------------------------------------
  240.   # ● 应用物品效果
  241.   #     item : 物品
  242.   #--------------------------------------------------------------------------
  243.   def item_effect(item)
  244.     # 清除会心一击标志
  245.     self.critical = false
  246.     # 物品的效果范围是 HP 1 以上的己方、自己的 HP 为 0、
  247.     # 或者物品的效果范围是 HP 0 的己方、自己的 HP 为 1 以上的情况下
  248.     if ((item.scope == 3 or item.scope == 4) and self.hp == 0) or
  249.        ((item.scope == 5 or item.scope == 6) and self.hp >= 1)
  250.       # 过程结束
  251.       return false
  252.     end
  253.     # 清除有效标志
  254.     effective = false
  255.     # 公共事件 ID 是有效的情况下,设置为有效标志
  256.     effective |= item.common_event_id > 0
  257.     # 命中判定
  258.     hit_result = (rand(100) < item.hit)
  259.     # 不确定的特技的情况下设置为有效标志
  260.     effective |= item.hit < 100
  261.     # 命中的情况
  262.     if hit_result == true
  263.       # 计算回复量
  264.       recover_hp = maxhp * item.recover_hp_rate / 100 + item.recover_hp
  265.       recover_sp = maxsp * item.recover_sp_rate / 100 + item.recover_sp
  266.       if recover_hp < 0
  267.         recover_hp += self.pdef * item.pdef_f / 20
  268.         recover_hp += self.mdef * item.mdef_f / 20
  269.         recover_hp = [recover_hp, 0].min
  270.       end
  271.       # 属性修正
  272.       recover_hp *= elements_correct(item.element_set)
  273.       recover_hp /= 100
  274.       recover_sp *= elements_correct(item.element_set)
  275.       recover_sp /= 100
  276.       # 分散
  277.       if item.variance > 0 and recover_hp.abs > 0
  278.         amp = [recover_hp.abs * item.variance / 100, 1].max
  279.         recover_hp += rand(amp+1) + rand(amp+1) - amp
  280.       end
  281.       if item.variance > 0 and recover_sp.abs > 0
  282.         amp = [recover_sp.abs * item.variance / 100, 1].max
  283.         recover_sp += rand(amp+1) + rand(amp+1) - amp
  284.       end
  285.       # 回复量符号为负的情况下
  286.       if recover_hp < 0
  287.         # 防御修正
  288.         if self.guarding?
  289.           recover_hp /= 2
  290.         end
  291.       end
  292.       # HP 回复量符号的反转、设置伤害值
  293.       self.damage = -recover_hp
  294.       # HP 以及 SP 的回复
  295.       last_hp = self.hp
  296.       self.hp += recover_hp
  297.       if self.is_a?(Game_Actor)
  298.         current_sp=self.ammo[self.akind]
  299.         current_maxsp=self.cta
  300.         last_sp = current_sp
  301.         current_sp += recover_sp
  302.         if current_sp > current_maxsp
  303.           current_sp = current_maxsp
  304.         end  
  305.         self.ammo[self.akind] = current_sp
  306.         effective =true
  307.       else  
  308.         last_sp = self.sp
  309.         self.sp += recover_sp
  310.         effective |= self.sp != last_sp
  311.       end  
  312.       effective |= self.hp != last_hp
  313.       # 状态变化
  314.       @state_changed = false
  315.       effective |= states_plus(item.plus_state_set)
  316.       effective |= states_minus(item.minus_state_set)
  317.       # 能力上升值有效的情况下
  318.       if item.parameter_type > 0 and item.parameter_points != 0
  319.         # 能力值的分支
  320.         case item.parameter_type
  321.         when 1  # MaxHP
  322.           @maxhp_plus += item.parameter_points
  323.         when 2  # MaxSP
  324.           @maxsp_plus += item.parameter_points
  325.         when 3  # 力量
  326.           @str_plus += item.parameter_points
  327.         when 4  # 灵巧
  328.           @dex_plus += item.parameter_points
  329.         when 5  # 速度
  330.           @agi_plus += item.parameter_points
  331.         when 6  # 魔力
  332.           @int_plus += item.parameter_points
  333.         end
  334.         # 设置有效标志
  335.         effective = true
  336.       end
  337.       # HP 回复率与回复量为 0 的情况下
  338.       if item.recover_hp_rate == 0 and item.recover_hp == 0
  339.         # 设置伤害为空的字符串
  340.         self.damage = ""
  341.         # SP 回复率与回复量为 0、能力上升值无效的情况下
  342.         if item.recover_sp_rate == 0 and item.recover_sp == 0 and
  343.            (item.parameter_type == 0 or item.parameter_points == 0)
  344.           # 状态没有变化的情况下
  345.           unless @state_changed
  346.             # 伤害设置为 "Miss"
  347.             self.damage = "Miss"
  348.           end
  349.         end
  350.       end
  351.     # Miss 的情况下
  352.     else
  353.       # 伤害设置为 "Miss"
  354.       self.damage = "Miss"
  355.     end
  356.     # 不在战斗中的情况下
  357.     unless $game_temp.in_battle
  358.       # 伤害设置为 nil
  359.       self.damage = nil
  360.     end
  361.     # 过程结束
  362.     return effective
  363.   end  
  364. end

  365. class Game_Actor < Game_Battler
  366.   def now_exp
  367.     return @exp - @exp_list[@level]
  368.   end
  369.   def next_exp
  370.     return @exp_list[@level+1] > 0 ? @exp_list[@level+1] - @exp_list[@level] : 0
  371.   end
  372. end

  373. #==============================================================================
  374. # ■ Window_Base
  375. #------------------------------------------------------------------------------
  376. #  血条的绘制
  377. #==============================================================================

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

  627. #------------------------------------------------------------------------------
  628. #  Bitmapクラスに新たな機能を追加します。
  629. #==============================================================================

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


作者: 颠倒的彩虹    时间: 2008-5-30 22:58
牛人
作者: 禾西    时间: 2008-5-31 07:28
腳本要用
[quote]
  1. [/code][/quote]
  2. 框起來...其他看注釋。這次好了很多。XD{/qiang}
  3. [code]
  4. # 武器名称所能决定SP种类及属性的定义方法(格式像这样:钢匕首,2000,0)
  5. =begin
  6. 描述太隱藏了,至少在個醒目的位置嘛!(雖然置頂常常被人忽視)
  7. =end
  8. module RPG
  9.   class Weapon            
  10.     attr_accessor :w_maxsp
  11.     attr_accessor :w_akind
  12.     def name
  13.       name = @name.split(/,/)[0]
  14.       return name != nil ? name : ''
  15.     end
  16.     def w_maxsp
  17.       w_maxsp = @name.split(/,/)[1]
  18.       return w_maxsp != nil ? w_maxsp.to_i : 0
  19.     end
  20.     def w_akind
  21.       w_akind = @name.split(/,/)[2]
  22.       return w_akind != nil ? w_akind.to_i : 0
  23.     end  
  24.   end  
  25. end

  26. class Game_Actor < Game_Battler
  27.   #--------------------------------------------------------------------------
  28.   # ● 公開インスタンス変数
  29.   #--------------------------------------------------------------------------
  30. =begin
  31. 分割定義下,重複的函數不用重複聲明也能使用。
  32. 除非需要修改,否則不要列出
  33. =end
  34.   #attr_reader   :name                     # 名前
  35.   #attr_reader   :character_name           # キャラクター ファイル名
  36.   #attr_reader   :character_hue            # キャラクター 色相
  37.   #attr_reader   :class_id                 # クラス ID
  38.   #attr_reader   :weapon_id                # 武器 ID
  39.   #attr_reader   :armor1_id                # 盾 ID
  40.   #attr_reader   :armor2_id                # 頭防具 ID
  41.   #attr_reader   :armor3_id                # 体防具 ID
  42.   #attr_reader   :armor4_id                # 装飾品 ID
  43.   #attr_reader   :level                    # レベル
  44.   #attr_reader   :exp                      # EXP
  45.   #attr_reader   :skills                   # スキル
  46.   attr_accessor :ammo                     # SP残留量
  47.   attr_accessor :akind                    # 使用何种SP
  48.   attr_accessor :cta                      # SP最大容量
  49. =begin
  50. alias 函數可以幫助你修改函數(方法)的名字
  51. =end
  52.   alias setup ammo_setup
  53.   def setup(actor_id)
  54.     @ammo = [0,0,0,0,0,0,0,0,0]# 目前只使用九种能量
  55.     @akind = 1 # 缺省情况下使用格斗技能量
  56.     @cta=0
  57.     ammo_setup(actor_id)
  58.   end
  59. =begin
  60. 這樣可以達到减少衝突的效果
  61. =end
  62. end

  63. class Scene_Equip
  64.   #--------------------------------------------------------------------------
  65.   # ● リフレッシュ
  66.   #--------------------------------------------------------------------------
  67.   def refresh
  68.     # 设置物品窗口的可视状态
  69.     @item_window1.visible = (@right_window.index == 0)
  70.     @item_window2.visible = (@right_window.index == 1)
  71.     @item_window3.visible = (@right_window.index == 2)
  72.     @item_window4.visible = (@right_window.index == 3)
  73.     @item_window5.visible = (@right_window.index == 4)
  74.     # 获取当前装备中的物品
  75.     item1 = @right_window.item
  76.     # 设置当前的物品窗口到 @item_window
  77.     case @right_window.index
  78.     when 0
  79.       @item_window = @item_window1
  80.     when 1
  81.       @item_window = @item_window2
  82.     when 2
  83.       @item_window = @item_window3
  84.     when 3
  85.       @item_window = @item_window4
  86.     when 4
  87.       @item_window = @item_window5
  88.     end
  89.     # 右窗口被激活的情况下
  90.     if @right_window.active
  91.       # 删除变更装备后的能力
  92.       @left_window.set_new_parameters(nil, nil, nil)
  93.     end
  94.     # 物品窗口被激活的情况下
  95.     if @item_window.active
  96.       # 获取现在选中的物品
  97.       item2 = @item_window.item
  98.       # 变更装备
  99.       last_hp = @actor.hp
  100.       last_sp = @actor.sp
  101. #------------------------------------------------------------------------------
  102.       last_akind = @actor.akind #弹药种类是否与以前相同?
  103.       last_ammo = @actor.ammo[@actor.akind]
  104. #------------------------------------------------------------------------------
  105.       @actor.equip(@right_window.index, item2 == nil ? 0 : item2.id)
  106.       # 获取变更装备后的能力值
  107.       new_atk = @actor.atk
  108.       new_pdef = @actor.pdef
  109.       new_mdef = @actor.mdef
  110. =begin
  111. 修改部分需要使用------------------或者其他標志性符號分割開來。
  112. =end
  113. #------------------------------------------------------------------------------
  114.       # 关键部分:武器决定角色的SP属性及其最大值
  115.       neomaxsp=0
  116.       if @actor.weapon_id !=0
  117.         @actor.akind=$data_weapons[@actor.weapon_id].w_akind
  118.       end  
  119.       if @actor.weapon_id !=0
  120.         neomaxsp+=$data_weapons[@actor.weapon_id].w_maxsp
  121.       end  
  122.       @actor.cta=neomaxsp
  123.       if @actor.akind==last_akind
  124.         @actor.ammo[@actor.akind] = [last_ammo,@actor.cta].min#弹药种类相同取弹匣小值
  125.       end  
  126. #------------------------------------------------------------------------------
  127.       # 返回到装备
  128.       @actor.equip(@right_window.index, item1 == nil ? 0 : item1.id)
  129.       @actor.hp = last_hp
  130.       @actor.sp = last_sp
  131.       # 描画左窗口
  132.       @left_window.set_new_parameters(new_atk, new_pdef, new_mdef)
  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. =begin
  141. 同樣,請使用 alias
  142. =end
  143.   alias skill_can_use? ammo_skill_can_use?
  144.   def skill_can_use?(skill_id)
  145.     if self.is_a?(Game_Actor) and self.weapon_id > 0
  146.       sw_boolean = false # 判断武器和技能关联
  147.       s = SW_SET & $data_skills[skill_id].element_set
  148.       if s.empty?
  149.         sw_boolean = true
  150.       else
  151.         for i in s
  152.           next unless $data_weapons[self.weapon_id].element_set .include?(i)
  153. =begin
  154. 用next 是單純好看而已...
  155. =end
  156.           sw_boolean = true
  157.           break
  158.          end
  159.        end
  160.      end
  161. =begin
  162.      return false if sw_boolean == false
  163. 單純好看而已...==|||
  164. =end
  165.      return false if sw_boolean == false
  166.      current_sp=self.ammo[self.akind]#这里修改为对各种SP的判断
  167.      current_maxsp=self.cta
  168.      if $data_skills[skill_id].sp_cost > current_sp
  169.        return false
  170.      end
  171.    end
  172.    ammo_skill_can_use?(skill_id)
  173. end
  174. end

  175. class Scene_Battle
  176.   def make_skill_action_result
  177.     # 获取特技
  178.     @skill = $data_skills[@active_battler.current_action.skill_id]
  179.     # 如果不是强制行动
  180.     unless @active_battler.current_action.forcing
  181.       # 因为 SP 耗尽而无法使用的情况下
  182.       unless @active_battler.skill_can_use?(@skill.id)
  183.         # 清除强制行动对像的战斗者
  184.         $game_temp.forcing_battler = nil
  185.         # 移至步骤 1
  186.         @phase4_step = 1
  187.         return
  188.       end
  189.     end
  190. #------------------------------------------------------------------------------
  191.     # 消耗 SP(区分不同种类)
  192.     if @active_battler.is_a?(Game_Actor)
  193.       @active_battler.ammo[@active_battler.akind] -= @skill.sp_cost
  194.     else  
  195.       @active_battler.sp -= @skill.sp_cost
  196.     end if  
  197. =begin
  198. 爲甚麼這裏會有個if....
  199. =end
  200. #------------------------------------------------------------------------------
  201.     # 刷新状态窗口
  202.     @status_window.refresh
  203.     # 在帮助窗口显示特技名
  204.     @help_window.set_text(@skill.name, 1)
  205.     # 设置动画 ID
  206.     @animation1_id = @skill.animation1_id
  207.     @animation2_id = @skill.animation2_id
  208.     # 设置公共事件 ID
  209.     @common_event_id = @skill.common_event_id
  210.     # 设置对像侧战斗者
  211.     set_target_battlers(@skill.scope)
  212.     # 应用特技效果
  213.     for target in @target_battlers
  214.       target.skill_effect(@active_battler, @skill)
  215.     end
  216.   end
  217. end

  218. #==============================================================================
  219. # 物品对不同SP分别起作用
  220. #==============================================================================

  221. class Game_Battler
  222.   #--------------------------------------------------------------------------
  223.   # ● 应用物品效果
  224.   #     item : 物品
  225.   #--------------------------------------------------------------------------
  226.   def item_effect(item)
  227.     # 清除会心一击标志
  228.     self.critical = false
  229.     # 物品的效果范围是 HP 1 以上的己方、自己的 HP 为 0、
  230.     # 或者物品的效果范围是 HP 0 的己方、自己的 HP 为 1 以上的情况下
  231.     if ((item.scope == 3 or item.scope == 4) and self.hp == 0) or
  232.        ((item.scope == 5 or item.scope == 6) and self.hp >= 1)
  233.       # 过程结束
  234.       return false
  235.     end
  236.     # 清除有效标志
  237.     effective = false
  238.     # 公共事件 ID 是有效的情况下,设置为有效标志
  239.     effective |= item.common_event_id > 0
  240.     # 命中判定
  241.     hit_result = (rand(100) < item.hit)
  242.     # 不确定的特技的情况下设置为有效标志
  243.     effective |= item.hit < 100
  244.     # 命中的情况
  245.     if hit_result == true
  246.       # 计算回复量
  247.       recover_hp = maxhp * item.recover_hp_rate / 100 + item.recover_hp
  248.       recover_sp = maxsp * item.recover_sp_rate / 100 + item.recover_sp
  249.       if recover_hp < 0
  250.         recover_hp += self.pdef * item.pdef_f / 20
  251.         recover_hp += self.mdef * item.mdef_f / 20
  252.         recover_hp = [recover_hp, 0].min
  253.       end
  254.       # 属性修正
  255.       recover_hp *= elements_correct(item.element_set)
  256.       recover_hp /= 100
  257.       recover_sp *= elements_correct(item.element_set)
  258.       recover_sp /= 100
  259.       # 分散
  260.       if item.variance > 0 and recover_hp.abs > 0
  261.         amp = [recover_hp.abs * item.variance / 100, 1].max
  262.         recover_hp += rand(amp+1) + rand(amp+1) - amp
  263.       end
  264.       if item.variance > 0 and recover_sp.abs > 0
  265.         amp = [recover_sp.abs * item.variance / 100, 1].max
  266.         recover_sp += rand(amp+1) + rand(amp+1) - amp
  267.       end
  268.       # 回复量符号为负的情况下
  269.       if recover_hp < 0
  270.         # 防御修正
  271.         if self.guarding?
  272.           recover_hp /= 2
  273.         end
  274.       end
  275.       # HP 回复量符号的反转、设置伤害值
  276.       self.damage = -recover_hp
  277.       # HP 以及 SP 的回复
  278.       last_hp = self.hp
  279.       self.hp += recover_hp
  280.       if self.is_a?(Game_Actor)
  281. =begin
  282. 這段是不是只要改了這個....?沒有標記的話極其容易出現衝突。因爲超多人喜歡修改
  283. item_effect(item)這一段。修改的同時記得注釋掉你修改了的原本腳本
  284. =end
  285. #------------------------------------------------------------------------------
  286.         current_sp=self.ammo[self.akind]
  287.         current_maxsp=self.cta
  288.         last_sp = current_sp
  289.         current_sp += recover_sp
  290.         if current_sp > current_maxsp
  291.           current_sp = current_maxsp
  292.         end

  293.         self.ammo[self.akind] = current_sp
  294. #------------------------------------------------------------------------------
  295.         effective =true
  296.       else  
  297.         last_sp = self.sp
  298.         self.sp += recover_sp
  299.         effective |= self.sp != last_sp
  300.       end  
  301.       effective |= self.hp != last_hp
  302.       # 状态变化
  303.       @state_changed = false
  304.       effective |= states_plus(item.plus_state_set)
  305.       effective |= states_minus(item.minus_state_set)
  306.       # 能力上升值有效的情况下
  307.       if item.parameter_type > 0 and item.parameter_points != 0
  308.         # 能力值的分支
  309.         case item.parameter_type
  310.         when 1  # MaxHP
  311.           @maxhp_plus += item.parameter_points
  312.         when 2  # MaxSP
  313.           @maxsp_plus += item.parameter_points
  314.         when 3  # 力量
  315.           @str_plus += item.parameter_points
  316.         when 4  # 灵巧
  317.           @dex_plus += item.parameter_points
  318.         when 5  # 速度
  319.           @agi_plus += item.parameter_points
  320.         when 6  # 魔力
  321.           @int_plus += item.parameter_points
  322.         end
  323.         # 设置有效标志
  324.         effective = true
  325.       end
  326.       # HP 回复率与回复量为 0 的情况下
  327.       if item.recover_hp_rate == 0 and item.recover_hp == 0
  328.         # 设置伤害为空的字符串
  329.         self.damage = ""
  330.         # SP 回复率与回复量为 0、能力上升值无效的情况下
  331.         if item.recover_sp_rate == 0 and item.recover_sp == 0 and
  332.            (item.parameter_type == 0 or item.parameter_points == 0)
  333.           # 状态没有变化的情况下
  334.           unless @state_changed
  335.             # 伤害设置为 "Miss"
  336.             self.damage = "Miss"
  337.           end
  338.         end
  339.       end
  340.     # Miss 的情况下
  341.     else
  342.       # 伤害设置为 "Miss"
  343.       self.damage = "Miss"
  344.     end
  345.     # 不在战斗中的情况下
  346.     unless $game_temp.in_battle
  347.       # 伤害设置为 nil
  348.       self.damage = nil
  349.     end
  350.     # 过程结束
  351.     return effective
  352.   end  
  353. end

  354. #==============================================================================
  355. # 描繪SP(新方法)
  356. #==============================================================================
  357. class Game_Actor < Game_Battler
  358.   def now_exp
  359.     return @exp - @exp_list[@level]
  360.   end
  361.   def next_exp
  362.     return @exp_list[@level+1] > 0 ? @exp_list[@level+1] - @exp_list[@level] : 0
  363.   end
  364. end

  365. #==============================================================================
  366. # ■ Window_Base
  367. #------------------------------------------------------------------------------
  368. #  血条的绘制
  369. #==============================================================================

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

  619. #------------------------------------------------------------------------------
  620. #  Bitmapクラスに新たな機能を追加します。
  621. #==============================================================================

  622. class Bitmap
  623.   #--------------------------------------------------------------------------
  624.   # ● 矩形をグラデーション表示
  625.   #     color1 : スタートカラー
  626.   #     color2 : エンドカラー
  627.   #     align  :  0:横にグラデーション
  628.   #               1:縦にグラデーション
  629.   #               2:斜めにグラデーション(激重につき注意)
  630.   #--------------------------------------------------------------------------
  631.   def gradation_rect(x, y, width, height, color1, color2, align = 0)
  632.     if align == 0
  633.       for i in x...x + width
  634.         red   = color1.red + (color2.red - color1.red) * (i - x) / (width - 1)
  635.         green = color1.green +
  636.                 (color2.green - color1.green) * (i - x) / (width - 1)
  637.         blue  = color1.blue +
  638.                 (color2.blue - color1.blue) * (i - x) / (width - 1)
  639.         alpha = color1.alpha +
  640.                 (color2.alpha - color1.alpha) * (i - x) / (width - 1)
  641.         color = Color.new(red, green, blue, alpha)
  642.         fill_rect(i, y, 1, height, color)
  643.       end
  644.     elsif align == 1
  645.       for i in y...y + height
  646.         red   = color1.red +
  647.                 (color2.red - color1.red) * (i - y) / (height - 1)
  648.         green = color1.green +
  649.                 (color2.green - color1.green) * (i - y) / (height - 1)
  650.         blue  = color1.blue +
  651.                 (color2.blue - color1.blue) * (i - y) / (height - 1)
  652.         alpha = color1.alpha +
  653.                 (color2.alpha - color1.alpha) * (i - y) / (height - 1)
  654.         color = Color.new(red, green, blue, alpha)
  655.         fill_rect(x, i, width, 1, color)
  656.       end
  657.     elsif align == 2
  658.       for i in x...x + width
  659.         for j in y...y + height
  660.           red   = color1.red + (color2.red - color1.red) *
  661.                   ((i - x) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  662.           green = color1.green + (color2.green - color1.green) *
  663.                   ((i - x) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  664.           blue  = color1.blue + (color2.blue - color1.blue) *
  665.                   ((i - x) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  666.           alpha = color1.alpha + (color2.alpha - color1.alpha) *
  667.                   ((i - x) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  668.           color = Color.new(red, green, blue, alpha)
  669.           set_pixel(i, j, color)
  670.         end
  671.       end
  672.     elsif align == 3
  673.       for i in x...x + width
  674.         for j in y...y + height
  675.           red   = color1.red + (color2.red - color1.red) *
  676.                 ((x + width - i) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  677.           green = color1.green + (color2.green - color1.green) *
  678.                 ((x + width - i) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  679.           blue  = color1.blue + (color2.blue - color1.blue) *
  680.                 ((x + width - i) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  681.           alpha = color1.alpha + (color2.alpha - color1.alpha) *
  682.                 ((x + width - i) / (width - 1.0) + (j - y) / (height - 1.0)) / 2
  683.           color = Color.new(red, green, blue, alpha)
  684.           set_pixel(i, j, color)
  685.         end
  686.       end
  687.     end
  688.   end
  689. end
复制代码

作者: 雪流星    时间: 2008-5-31 12:39
如果能的话
请楼主顺便制作一个VX版的吧
作者: 越前リョーマ    时间: 2008-5-31 16:52
这个就是传说种的属性能量吧……
作者: slick    时间: 2008-6-1 20:17
以下引用越前リョーマ于2008-5-31 8:52:36的发言:

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


这个系统我个人认为,如果制作RM版的CS、洛克人或是POKEMON应该都有用处。

作者: 禾西    时间: 2008-6-1 20:43
比上一版好好多。唔唔。明天測試一下 XD
作者: 禾西    时间: 2008-6-2 11:14
使用藥物可以超出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
作者: slick    时间: 2008-6-2 19:17
这回应该不会了吧,这个是改进版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

复制代码

作者: 禾西    时间: 2008-6-5 08:51
發布完成 slick.vip +=2
作者: 雪流星    时间: 2008-6-6 16:16
我尝试做了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

复制代码

作者: 禾西    时间: 2008-6-6 16:57
其實可以嘗試這種思路:
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

其他不說了...看得明就看吧...
作者: 雪流星    时间: 2008-6-6 17:41
def sp=(sp, val=@akind)
   @ammo[val] = [[sp, maxsp].min, 0].max
   return @ammo[val]   # <==== 這句可以省略
end
作者: 小夜楼风    时间: 2008-6-14 16:41
提示: 作者被禁止或删除 内容自动屏蔽
作者: slick    时间: 2009-6-12 08: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




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1