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

Project1

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

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

 关闭 [复制链接]

Lv3.寻梦者

梦石
3
星屑
50
在线时间
177 小时
注册时间
2008-3-21
帖子
939
跳转到指定楼层
1
发表于 2008-5-30 05:33:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
最近我同学也在玩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值还在
我的个人空间:
http://434986751.qzone.qq.com

Lv3.寻梦者

酱油的

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

贵宾

2
发表于 2008-5-30 07:29:24 | 只看该作者
範例很大...{/fd}不知道內裏腳本寫得如何。創意是不錯啦


Orz 非常糾結...可以把這個腳本單獨提取出來嗎...
不做頭像做簽名,看我囧冏有神(多謝山人有情提供 )
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
3
星屑
50
在线时间
177 小时
注册时间
2008-3-21
帖子
939
3
 楼主| 发表于 2008-5-30 17:11:46 | 只看该作者
因为这个系统涉及的因素比较多,所以提取出的修改脚本很大,建议

把不同的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
复制代码
我的个人空间:
http://434986751.qzone.qq.com
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
3
星屑
50
在线时间
177 小时
注册时间
2008-3-21
帖子
939
4
 楼主| 发表于 2008-5-30 17:13:46 | 只看该作者
脚本第二部分:(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
复制代码
我的个人空间:
http://434986751.qzone.qq.com
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
3
星屑
50
在线时间
177 小时
注册时间
2008-3-21
帖子
939
5
 楼主| 发表于 2008-5-30 17:16:08 | 只看该作者
脚本第三部分:修改自“二刀流”,这里让武器决定角色所使用的不同种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
复制代码
我的个人空间:
http://434986751.qzone.qq.com
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
3
星屑
50
在线时间
177 小时
注册时间
2008-3-21
帖子
939
6
 楼主| 发表于 2008-5-30 17:16:38 | 只看该作者
脚本最后一部分:修改自“武器决定技能”

  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
复制代码
我的个人空间:
http://434986751.qzone.qq.com
回复 支持 反对

使用道具 举报

Lv3.寻梦者

酱油的

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

贵宾

7
发表于 2008-5-30 18:50:09 | 只看该作者
...太過複雜了 Orz
我說這個腳本如果牽涉沉影的「武器决定技能」還算合理。但是怎麼跟「二刀流」也扯上關係啦?==a
不做頭像做簽名,看我囧冏有神(多謝山人有情提供 )
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
3
星屑
50
在线时间
177 小时
注册时间
2008-3-21
帖子
939
8
 楼主| 发表于 2008-5-30 22:57:02 | 只看该作者
以下引用禾西于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
复制代码

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

使用道具 举报

Lv1.梦旅人

大火烧了毛毛虫

梦石
0
星屑
205
在线时间
288 小时
注册时间
2006-3-18
帖子
2335
9
发表于 2008-5-30 22:58:26 | 只看该作者
牛人
回复 支持 反对

使用道具 举报

Lv3.寻梦者

酱油的

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

贵宾

10
发表于 2008-5-31 07:28:18 | 只看该作者
腳本要用
[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
复制代码
不做頭像做簽名,看我囧冏有神(多謝山人有情提供 )
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-16 06:56

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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