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

Project1

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

[已经过期] 一个脚本的解释和用法

[复制链接]

Lv2.观梦者

梦石
0
星屑
723
在线时间
530 小时
注册时间
2010-6-9
帖子
840
跳转到指定楼层
1
发表于 2010-7-7 23:28:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 负零 于 2010-7-7 23:29 编辑

范例里敌人【魔王】备注写
  1. <カウンター S:104>
  2. 種別 I
  3. ターゲット無視
  4. 割り込み
  5. </カウンター>
复制代码
敌人【吸血鬼】备注里面写
  1. <カウンター S:30 20%>
  2. </カウンター>
  3. <カウンター A 50%>
  4. </カウンター>
复制代码
看了许久看不出来 只好到站上求教...
  1. #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
  2. #_/    ◆ カウンター - KGC_Counter ◆ VX ◆
  3. #_/    ◇ Last update : 2009/09/13 ◇
  4. #_/----------------------------------------------------------------------------
  5. #_/  特定の行動に対するカウンターを作成します。
  6. #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

  7. #==============================================================================
  8. # ★ カスタマイズ項目 - Customize BEGIN ★
  9. #==============================================================================

  10. module KGC
  11. module Counter
  12.   # ◆ カウンター回数を制限する
  13.   #  true  : カウンターは 1 回のアクションにつき 1 回のみ。
  14.   #  false : 条件を満たした数だけカウンター発動。
  15.   RESTRICT_COUNTER = true

  16.   # ◆ 通常攻撃カウンターのメッセージ
  17.   #  %s : 攻撃者の名前
  18.   VOCAB_COUNTER_ATTACK = "%sの反撃!"

  19.   # ◆ 割り込みカウンターのメッセージ
  20.   #   \\N : 行動者の名前
  21.   #   \\C : カウンター発動者の名前
  22.   #   \\A : 割り込む行動の名前
  23.   #  '~' で指定する場合、\ は一つで OK。
  24.   #  カウンター定義内で指定した場合は、そちらを優先。
  25.   VOCAB_INTERRUPT_COUNTER = '\Cは\Nの行動に割り込んだ!'
  26. end
  27. end

  28. #==============================================================================
  29. # ☆ カスタマイズ項目終了 - Customize END ☆
  30. #==============================================================================

  31. $imported = {} if $imported == nil
  32. $imported["Counter"] = true

  33. module KGC
  34. module Counter
  35.   module Regexp
  36.     # カウンター定義開始
  37.     BEGIN_COUNTER = /<(?:COUNTER|カウンター)\s*([ASI])?(\s*\:\s*\d+)?
  38.                      (\s+\d+[%%])?(\s*\/)?>/ix
  39.     # カウンター定義終了
  40.     END_COUNTER = /<\/(?:COUNTER|カウンター)>/i

  41.     # ~ カウンター条件 ~
  42.     # 行動種別
  43.     KIND = /^\s*(?:KIND|種別)\s*([AGSI])(\s*\:\s*\d+(?:\s*,\s*\d+)*)?/i
  44.     # 攻撃タイプ
  45.     ATTACK_TYPE = /^\s*(PHYSICAL|MAGICAL|物理|魔法)(?:_ATTACK|攻撃)/i
  46.     # 属性
  47.     ELEMENT = /^\s*(?:ELEMENT|属性)\s*(\d+(?:\s*,\s*\d+)*)/i
  48.     # 打撃関係度
  49.     ATK_F = /^\s*(?:ATK_F|打撃関係度)\s*(\d+)(?:\s*以上)?/i
  50.     # 精神関係度
  51.     SPI_F = /^\s*(?:SPI_F|精神関係度)\s*(\d+)(?:\s*以上)?/i
  52.     # 残存 HP/MP
  53.     REMAIN_HPMP = /^\s*(?:REMAIN_|残存)?(HP|MP)\s*(\d+)(?:\s*[%%]\s*)
  54.                    (OVER|UNDER|以上|以下)/ix
  55.     # ターゲット無視
  56.     IGNORE_TARGET = /^\s*(?:IGNORE_TARGET|ターゲット無視)/i
  57.     # 行動割り込み
  58.     INTERRUPT = /^\s*(?:ACTION_|行動)?(?:INTERRUPT|割り?込み)\s*$/i

  59.     # ~ メッセージ ~
  60.     INTERRUPT_MESSAGE = /^\s*(?:INTERRUPT_MESSAGE|割り?込みメッセージ)\s*\"
  61.                          ([^\"]*)(\")?/ix
  62.   end

  63.   KIND_ALL   = -1  # 種別 : ALL
  64.   KIND_BASIC =  0  # 種別 : 基本
  65.   KIND_SKILL =  1  # 種別 : スキル
  66.   KIND_ITEM  =  2  # 種別 : アイテム

  67.   BASIC_ATTACK = 0  # 基本行動 : 攻撃
  68.   BASIC_GUARD  = 1  # 基本行動 : 防御

  69.   TYPE_ALL      = -1  # 攻撃タイプ : ALL
  70.   TYPE_PHYSICAL =  0  # 攻撃タイプ : 物理
  71.   TYPE_MAGICAL  =  1  # 攻撃タイプ : 魔法

  72.   REMAIN_TYPE_OVER  = 0  # 残存 : x 以上
  73.   REMAIN_TYPE_UNDER = 1  # 残存 : x 以下

  74.   # 種別変換表
  75.   COUNTER_KINDS = {
  76.     "A" => KIND_BASIC,
  77.     "G" => KIND_BASIC,
  78.     "S" => KIND_SKILL,
  79.     "I" => KIND_ITEM,
  80.   }

  81.   # 基本行動変換表
  82.   COUNTER_BASIC = {
  83.     "A" => BASIC_ATTACK,
  84.     "G" => BASIC_GUARD
  85.   }

  86.   # 攻撃タイプ変換表
  87.   COUNTER_TYPES = {
  88.     "PHYSICAL" => TYPE_PHYSICAL,
  89.     "物理"     => TYPE_PHYSICAL,
  90.     "MAGICAL"  => TYPE_MAGICAL,
  91.     "魔法"     => TYPE_MAGICAL
  92.   }

  93.   #--------------------------------------------------------------------------
  94.   # ○ カウンター行動リストの作成
  95.   #     note : メモ欄
  96.   #--------------------------------------------------------------------------
  97.   def self.create_counter_action_list(note)
  98.     result = []

  99.     counter_flag = false
  100.     action = nil

  101.     interrupt_message = ""
  102.     define_interrupt_message = false
  103.     note.each_line { |line|
  104.       if line =~ KGC::Counter::Regexp::BEGIN_COUNTER
  105.         match = $~.clone
  106.         # カウンター定義開始
  107.         action = Game_CounterAction.new
  108.         if match[1] != nil
  109.           action.kind = COUNTER_KINDS[match[1].upcase]
  110.         end
  111.         case action.kind
  112.         when KIND_SKILL
  113.           next if match[2] == nil
  114.           action.skill_id = match[2][/\d+/].to_i
  115.         when KIND_ITEM
  116.           next if match[2] == nil
  117.           action.item_id = match[2][/\d+/].to_i
  118.         end
  119.         if match[3] != nil
  120.           action.execute_prob = match[3][/\d+/].to_i
  121.         end
  122.         counter_flag = true
  123.         if match[4] != nil
  124.           # そのまま定義終了
  125.           result << action
  126.           counter_flag = false
  127.         end
  128.       end

  129.       next unless counter_flag

  130.       # 割り込みメッセージ定義中
  131.       if define_interrupt_message
  132.         if line =~ /\s*([^\"]*)(\")?/
  133.           action.interrupt_message += $1.chomp
  134.           define_interrupt_message = ($2 == nil)
  135.         end
  136.         next
  137.       end

  138.       case line
  139.       when KGC::Counter::Regexp::END_COUNTER
  140.         # カウンター定義終了
  141.         result << action
  142.         counter_flag = false

  143.       when KGC::Counter::Regexp::KIND
  144.         # 行動種別
  145.         match = $~.clone
  146.         action.condition.kind = COUNTER_KINDS[match[1].upcase]
  147.         if action.condition.kind == KIND_BASIC
  148.           action.condition.basic = COUNTER_BASIC[match[1].upcase]
  149.           if action.condition.basic == nil
  150.             action.condition.basic = KGC::Counter::BASIC_ATTACK
  151.           end
  152.         end
  153.         if match[2] != nil
  154.           ids = []
  155.           match[2].scan(/\d+/).each { |num| ids << num.to_i }
  156.           case action.condition.kind
  157.           when KIND_SKILL
  158.             action.condition.skill_ids = ids
  159.           when KIND_ITEM
  160.             action.condition.item_ids = ids
  161.           end
  162.         end

  163.       when KGC::Counter::Regexp::ATTACK_TYPE
  164.         # 攻撃タイプ
  165.         action.condition.type = COUNTER_TYPES[$1.upcase]

  166.       when KGC::Counter::Regexp::ELEMENT
  167.         # 属性
  168.         elements = []
  169.         $1.scan(/\d+/).each { |num| elements << num.to_i }
  170.         action.condition.element_set |= elements

  171.       when KGC::Counter::Regexp::ATK_F
  172.         # 打撃関係度
  173.         action.condition.atk_f = $1.to_i

  174.       when KGC::Counter::Regexp::SPI_F
  175.         # 精神関係度
  176.         action.condition.spi_f = $1.to_i

  177.       when KGC::Counter::Regexp::REMAIN_HPMP
  178.         type = REMAIN_TYPE_OVER
  179.         case $3.upcase
  180.         when "UNDER", "以下"
  181.           type = REMAIN_TYPE_UNDER
  182.         end
  183.         case $1.upcase
  184.         when "HP"  # 残存 HP
  185.           action.condition.remain_hp = $2.to_i
  186.           action.condition.remain_hp_type = type
  187.         when "MP"  # 残存 MP
  188.           action.condition.remain_mp = $2.to_i
  189.           action.condition.remain_mp_type = type
  190.         end

  191.       when KGC::Counter::Regexp::IGNORE_TARGET
  192.         # ターゲット無視
  193.         action.condition.ignore_target = true

  194.       when KGC::Counter::Regexp::INTERRUPT
  195.         # 行動割り込み
  196.         action.condition.interrupt = true

  197.       when KGC::Counter::Regexp::INTERRUPT_MESSAGE
  198.         # 割り込みメッセージ
  199.         define_interrupt_message = true
  200.         action.interrupt_message += $1.chomp
  201.         define_interrupt_message = ($2 == nil)
  202.       end
  203.     }
  204.     return result
  205.   end
  206. end
  207. end

  208. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

  209. #==============================================================================
  210. # ■ Vocab
  211. #==============================================================================

  212. module Vocab
  213.   # カウンター関連メッセージ
  214.   CounterAttack = KGC::Counter::VOCAB_COUNTER_ATTACK
  215.   InterruptCounter = KGC::Counter::VOCAB_INTERRUPT_COUNTER
  216. end

  217. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

  218. #==============================================================================
  219. # ■ RPG::BaseItem
  220. #==============================================================================

  221. class RPG::BaseItem
  222.   #--------------------------------------------------------------------------
  223.   # ○ カウンター行動リスト
  224.   #--------------------------------------------------------------------------
  225.   def counter_actions
  226.     if @__counter_actions == nil
  227.       @__counter_actions = KGC::Counter.create_counter_action_list(self.note)
  228.     end
  229.     return @__counter_actions
  230.   end
  231. end

  232. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

  233. #==============================================================================
  234. # ■ RPG::Enemy
  235. #==============================================================================

  236. class RPG::Enemy
  237.   #--------------------------------------------------------------------------
  238.   # ○ カウンター行動リスト
  239.   #--------------------------------------------------------------------------
  240.   def counter_actions
  241.     if @__counter_actions == nil
  242.       @__counter_actions = KGC::Counter.create_counter_action_list(self.note)
  243.     end
  244.     return @__counter_actions
  245.   end
  246. end

  247. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

  248. #==============================================================================
  249. # ■ RPG::State
  250. #==============================================================================

  251. class RPG::State
  252.   #--------------------------------------------------------------------------
  253.   # ○ カウンター行動リスト
  254.   #--------------------------------------------------------------------------
  255.   def counter_actions
  256.     if @__counter_actions == nil
  257.       @__counter_actions = KGC::Counter.create_counter_action_list(self.note)
  258.     end
  259.     return @__counter_actions
  260.   end
  261. end

  262. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

  263. #==============================================================================
  264. # ■ Game_BattleAction
  265. #==============================================================================

  266. class Game_BattleAction
  267.   #--------------------------------------------------------------------------
  268.   # ○ 公開インスタンス変数
  269.   #--------------------------------------------------------------------------
  270.   attr_accessor :made_targets             # 作成済みターゲット
  271.   #--------------------------------------------------------------------------
  272.   # ● ターゲットの配列作成
  273.   #--------------------------------------------------------------------------
  274.   alias make_targets_KGC_Counter make_targets
  275.   def make_targets
  276.     if @made_targets == nil
  277.       @made_targets = make_targets_KGC_Counter
  278.     end
  279.     return @made_targets
  280.   end
  281.   #--------------------------------------------------------------------------
  282.   # ○ アクション名
  283.   #--------------------------------------------------------------------------
  284.   def action_name
  285.     case kind
  286.     when 0  # 基本
  287.       case basic
  288.       when 0  # 攻撃
  289.         return Vocab.attack
  290.       when 1  # 防御
  291.         return Vocab.guard
  292.       when 2  # 逃走
  293.         return Vocab.escape
  294.       when 3  # 待機
  295.         return Vocab.wait
  296.       end
  297.     when 1  # スキル
  298.       return skill.name
  299.     when 2  # アイテム
  300.       return item.name
  301.     end
  302.     return ""
  303.   end
  304. end

  305. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

  306. #==============================================================================
  307. # □ Game_CounterAction
  308. #------------------------------------------------------------------------------
  309. #   カウンター行動を扱うクラスです。
  310. #==============================================================================

  311. class Game_CounterAction
  312.   #--------------------------------------------------------------------------
  313.   # ○ 公開インスタンス変数
  314.   #--------------------------------------------------------------------------
  315.   attr_accessor :kind                     # 種別 (基本 / スキル / アイテム)
  316.   attr_accessor :basic                    # 基本 (攻撃 / 防御 / 逃走 / 待機)
  317.   attr_accessor :skill_id                 # スキル ID
  318.   attr_accessor :item_id                  # アイテム ID
  319.   attr_accessor :execute_prob             # 発動確率
  320.   attr_accessor :condition                # 発動条件
  321.   attr_accessor :interrupt_message        # 割り込みメッセージ
  322.   #--------------------------------------------------------------------------
  323.   # ○ オブジェクト初期化
  324.   #--------------------------------------------------------------------------
  325.   def initialize
  326.     clear
  327.   end
  328.   #--------------------------------------------------------------------------
  329.   # ○ クリア
  330.   #--------------------------------------------------------------------------
  331.   def clear
  332.     @kind              = KGC::Counter::KIND_BASIC
  333.     @basic             = KGC::Counter::BASIC_ATTACK
  334.     @skill_id          = 0
  335.     @item_id           = 0
  336.     @execute_prob      = 100
  337.     @condition         = Game_CounterCondition.new
  338.     @interrupt_message = ""
  339.   end
  340.   #--------------------------------------------------------------------------
  341.   # ○ 有効判定
  342.   #     attacker : 攻撃者
  343.   #     defender : 被攻撃者
  344.   #--------------------------------------------------------------------------
  345.   def valid?(attacker, defender)
  346.     return false unless attacker.actor? ^ defender.actor?  # 相手が味方

  347.     return condition.valid?(attacker, defender)
  348.   end
  349.   #--------------------------------------------------------------------------
  350.   # ○ 発動判定
  351.   #--------------------------------------------------------------------------
  352.   def exec?
  353.     return (execute_prob > rand(100))
  354.   end
  355. end

  356. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

  357. #==============================================================================
  358. # □ Game_CounterCondition
  359. #------------------------------------------------------------------------------
  360. #   カウンター条件を扱うクラスです。
  361. #==============================================================================

  362. class Game_CounterCondition
  363.   #--------------------------------------------------------------------------
  364.   # ○ 公開インスタンス変数
  365.   #--------------------------------------------------------------------------
  366.   attr_accessor :kind                     # 種別 (ALL / 基本 / スキル / アイテム)
  367.   attr_accessor :basic                    # 基本 (攻撃 / 防御 / 逃走 / 待機)
  368.   attr_accessor :skill_ids                # スキル ID リスト
  369.   attr_accessor :item_ids                 # アイテム ID リスト
  370.   attr_accessor :type                     # 攻撃タイプ (ALL / 物理 / 魔法)
  371.   attr_accessor :element_set              # 属性
  372.   attr_accessor :atk_f                    # 打撃関係度
  373.   attr_accessor :spi_f                    # 精神関係度
  374.   attr_accessor :remain_hp                # 残存 HP
  375.   attr_accessor :remain_hp_type           # 残存 HP の形式 (以上 / 以下)
  376.   attr_accessor :remain_mp                # 残存 MP
  377.   attr_accessor :remain_mp_type           # 残存 MP の形式 (以上 / 以下)
  378.   attr_accessor :ignore_target            # ターゲット無視
  379.   attr_accessor :interrupt                # 行動割り込み
  380.   #--------------------------------------------------------------------------
  381.   # ○ オブジェクト初期化
  382.   #--------------------------------------------------------------------------
  383.   def initialize
  384.     clear
  385.   end
  386.   #--------------------------------------------------------------------------
  387.   # ○ クリア
  388.   #--------------------------------------------------------------------------
  389.   def clear
  390.     @kind           = KGC::Counter::KIND_ALL
  391.     @basic          = KGC::Counter::BASIC_ATTACK
  392.     @skill_ids      = []
  393.     @item_ids       = []
  394.     @type           = KGC::Counter::TYPE_ALL
  395.     @element_set    = []
  396.     @atk_f          = 0
  397.     @spi_f          = 0
  398.     @remain_hp      = 0
  399.     @remain_hp_type = KGC::Counter::REMAIN_TYPE_OVER
  400.     @remain_mp      = 0
  401.     @remain_mp_type = KGC::Counter::REMAIN_TYPE_OVER
  402.     @ignore_target  = false
  403.     @interrupt      = false
  404.   end
  405.   #--------------------------------------------------------------------------
  406.   # ○ 有効判定
  407.   #     attacker : 攻撃者
  408.   #     defender : 被攻撃者
  409.   #--------------------------------------------------------------------------
  410.   def valid?(attacker, defender)
  411.     obj = nil
  412.     if attacker.action.skill?
  413.       obj = attacker.action.skill
  414.     elsif attacker.action.item?
  415.       obj = attacker.action.item
  416.     end

  417.     return false unless kind_valid?(attacker, defender, obj)
  418.     return false unless attack_type_valid?(attacker, defender, obj)
  419.     return false unless element_valid?(attacker, defender, obj)
  420.     return false unless atk_f_valid?(attacker, defender, obj)
  421.     return false unless spi_f_valid?(attacker, defender, obj)
  422.     return false unless remain_hpmp_valid?(attacker, defender, obj)

  423.     return true
  424.   end
  425.   #--------------------------------------------------------------------------
  426.   # ○ 種別有効判定
  427.   #     attacker : 攻撃者
  428.   #     defender : 被攻撃者
  429.   #     obj      : スキルまたはアイテム
  430.   #--------------------------------------------------------------------------
  431.   def kind_valid?(attacker, defender, obj)
  432.     return true  if @kind == KGC::Counter::KIND_ALL
  433.     return false if @kind != attacker.action.kind

  434.     case @kind
  435.     when KGC::Counter::KIND_BASIC
  436.       return (@basic == attacker.action.basic)
  437.     when KGC::Counter::KIND_SKILL
  438.       # スキル ID 判定
  439.       return true if @skill_ids.empty?
  440.       @skill_ids.each { |sid|
  441.         return true if sid == attacker.action.skill_id
  442.       }
  443.       return false
  444.     when KGC::Counter::KIND_ITEM
  445.       # アイテム ID 判定
  446.       return true if @item_ids.empty?
  447.       @item_ids.each { |iid|
  448.         return true if iid == attacker.action.item_id
  449.       }
  450.       return false
  451.     end
  452.     return false
  453.   end
  454.   #--------------------------------------------------------------------------
  455.   # ○ 攻撃タイプ有効判定
  456.   #     attacker : 攻撃者
  457.   #     defender : 被攻撃者
  458.   #     obj      : スキルまたはアイテム
  459.   #--------------------------------------------------------------------------
  460.   def attack_type_valid?(attacker, defender, obj)
  461.     return true if @type == KGC::Counter::TYPE_ALL

  462.     if obj == nil
  463.       # 物理カウンターでない
  464.       return false if @type != KGC::Counter::TYPE_PHYSICAL
  465.     else
  466.       # [物理攻撃] なら物理、そうでなければ魔法カウンター判定
  467.       if @type != (obj.physical_attack ?
  468.           KGC::Counter::TYPE_PHYSICAL : KGC::Counter::TYPE_MAGICAL)
  469.         return false
  470.       end
  471.     end
  472.     return true
  473.   end
  474.   #--------------------------------------------------------------------------
  475.   # ○ 属性有効判定
  476.   #     attacker : 攻撃者
  477.   #     defender : 被攻撃者
  478.   #     obj      : スキルまたはアイテム
  479.   #--------------------------------------------------------------------------
  480.   def element_valid?(attacker, defender, obj)
  481.     return true if @element_set.empty?

  482.     if attacker.action.attack?
  483.       elements = attacker.element_set
  484.     else
  485.       return false if obj == nil
  486.       # 属性リスト取得
  487.       if $imported["SetAttackElement"]
  488.         elements = defender.get_inherited_element_set(attacker, obj)
  489.       else
  490.         elements = obj.element_set
  491.       end
  492.     end
  493.     return !(@element_set & elements).empty?
  494.   end
  495.   #--------------------------------------------------------------------------
  496.   # ○ 打撃関係度有効判定
  497.   #     attacker : 攻撃者
  498.   #     defender : 被攻撃者
  499.   #     obj      : スキルまたはアイテム
  500.   #--------------------------------------------------------------------------
  501.   def atk_f_valid?(attacker, defender, obj)
  502.     return true if @atk_f == 0

  503.     n = (attacker.action.attack? ? 100 : (obj != nil ? obj.atk_f : 0) )
  504.     return (@atk_f <= n)
  505.   end
  506.   #--------------------------------------------------------------------------
  507.   # ○ 精神関係度有効判定
  508.   #     attacker : 攻撃者
  509.   #     defender : 被攻撃者
  510.   #     obj      : スキルまたはアイテム
  511.   #--------------------------------------------------------------------------
  512.   def spi_f_valid?(attacker, defender, obj)
  513.     return true if @spi_f == 0

  514.     n = (attacker.action.attack? ? 0 : (obj != nil ? obj.spi_f : 0) )
  515.     return (@spi_f <= n)
  516.   end
  517.   #--------------------------------------------------------------------------
  518.   # ○ 残存 HP/MP 有効判定
  519.   #     attacker : 攻撃者
  520.   #     defender : 被攻撃者
  521.   #     obj      : スキルまたはアイテム
  522.   #--------------------------------------------------------------------------
  523.   def remain_hpmp_valid?(attacker, defender, obj)
  524.     hp_rate = defender.hp * 100 / defender.maxhp
  525.     case @remain_hp_type
  526.     when KGC::Counter::REMAIN_TYPE_OVER
  527.       return false unless (hp_rate >= @remain_hp)
  528.     when KGC::Counter::REMAIN_TYPE_UNDER
  529.       return false unless (hp_rate <= @remain_hp)
  530.     end

  531.     mp_rate = defender.mp * 100 / [defender.maxmp, 1].max
  532.     case @remain_mp_type
  533.     when KGC::Counter::REMAIN_TYPE_OVER
  534.       return false unless (mp_rate >= @remain_mp)
  535.     when KGC::Counter::REMAIN_TYPE_UNDER
  536.       return false unless (mp_rate <= @remain_mp)
  537.     end

  538.     return true
  539.   end
  540. end

  541. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

  542. #==============================================================================
  543. # □ Game_CounterInfo
  544. #------------------------------------------------------------------------------
  545. #   カウンター情報を扱うクラスです。
  546. #==============================================================================

  547. class Game_CounterInfo
  548.   #--------------------------------------------------------------------------
  549.   # ○ 公開インスタンス変数
  550.   #--------------------------------------------------------------------------
  551.   attr_accessor :battler                  # 行動者
  552.   attr_accessor :action                   # カウンター行動
  553.   attr_accessor :target_index             # 対象インデックス
  554.   #--------------------------------------------------------------------------
  555.   # ○ オブジェクト初期化
  556.   #--------------------------------------------------------------------------
  557.   def initialize
  558.     @battler      = nil
  559.     @action       = nil
  560.     @target_index = 0
  561.   end
  562. end

  563. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

  564. #==============================================================================
  565. # ■ Game_Battler
  566. #==============================================================================

  567. class Game_Battler
  568.   #--------------------------------------------------------------------------
  569.   # ○ カウンター行動リストの取得
  570.   #--------------------------------------------------------------------------
  571.   def counter_actions
  572.     result = []
  573.     states.each { |state| result += state.counter_actions }
  574.     return result
  575.   end
  576. end

  577. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

  578. #==============================================================================
  579. # ■ Game_Actor
  580. #==============================================================================

  581. class Game_Actor < Game_Battler
  582.   #--------------------------------------------------------------------------
  583.   # ○ カウンター行動リストの取得
  584.   #--------------------------------------------------------------------------
  585.   def counter_actions
  586.     result = super
  587.     equips.compact.each { |item| result += item.counter_actions }
  588.     return result
  589.   end
  590. end

  591. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

  592. #==============================================================================
  593. # ■ Game_Enemy
  594. #==============================================================================

  595. class Game_Enemy < Game_Battler
  596.   #--------------------------------------------------------------------------
  597.   # ○ カウンター行動リストの取得
  598.   #--------------------------------------------------------------------------
  599.   def counter_actions
  600.     return (super + enemy.counter_actions)
  601.   end
  602. end

  603. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

  604. #==============================================================================
  605. # ■ Scene_Battle
  606. #==============================================================================

  607. class Scene_Battle < Scene_Base
  608.   #--------------------------------------------------------------------------
  609.   # ● 開始処理
  610.   #--------------------------------------------------------------------------
  611.   alias start_KGC_Counter start
  612.   def start
  613.     start_KGC_Counter

  614.     @counter_added = false
  615.     @counter_infos = []
  616.   end
  617.   #--------------------------------------------------------------------------
  618.   # ● 戦闘行動の処理
  619.   #--------------------------------------------------------------------------
  620.   alias process_action_KGC_Counter process_action
  621.   def process_action
  622.     process_action_KGC_Counter

  623.     register_ignore_target_counter_action
  624.     unset_counter_action
  625.   end
  626.   #--------------------------------------------------------------------------
  627.   # ○ カウンター行動の解除
  628.   #--------------------------------------------------------------------------
  629.   def unset_counter_action
  630.     return unless @counter_exec

  631.     # 行動を元に戻す
  632.     @active_battler.action.forcing      = @former_action.forcing
  633.     @active_battler.action.kind         = @former_action.kind
  634.     @active_battler.action.basic        = @former_action.basic
  635.     @active_battler.action.skill_id     = @former_action.skill_id
  636.     @active_battler.action.item_id      = @former_action.item_id
  637.     @active_battler.action.target_index = @former_action.target_index
  638.     @active_battler.action.made_targets = nil
  639.     @active_battler.action.make_targets

  640.     @former_action     = nil
  641.     @counter_exec      = false
  642.     @counter_interrupt = false
  643.   end
  644.   #--------------------------------------------------------------------------
  645.   # ● 次に行動するべきバトラーの設定
  646.   #--------------------------------------------------------------------------
  647.   alias set_next_active_battler_KGC_Counter set_next_active_battler
  648.   def set_next_active_battler
  649.     set_counter_action

  650.     unless @counter_exec
  651.       set_next_active_battler_KGC_Counter
  652.     end
  653.   end
  654.   #--------------------------------------------------------------------------
  655.   # ○ カウンター行動の作成
  656.   #--------------------------------------------------------------------------
  657.   def set_counter_action
  658.     @former_action     = nil
  659.     @counter_exec      = false
  660.     @counter_added     = false
  661.     @counter_interrupt = false
  662.     counter = @counter_infos.shift  # <-- Game_CounterInfo
  663.     return if counter == nil

  664.     last_active_battler = @active_battler
  665.     @active_battler     = counter.battler
  666.     # 元の行動を退避
  667.     @former_action = @active_battler.action.clone
  668.     @counter_exec  = true
  669.     # カウンター行動を設定
  670.     @active_battler.action.kind     = counter.action.kind
  671.     @active_battler.action.basic    = counter.action.basic
  672.     @active_battler.action.skill_id = counter.action.skill_id
  673.     @active_battler.action.item_id  = counter.action.item_id

  674.     # カウンター対象を設定
  675.     target_index = counter.target_index
  676.     # 対象が味方なら自分に対して発動
  677.     if @active_battler.action.for_friend?
  678.       target_index = @active_battler.index
  679.     end
  680.     @active_battler.action.target_index = target_index
  681.     @active_battler.action.made_targets = nil
  682.     @active_battler.action.make_targets

  683.     unless @active_battler.action.valid?
  684.       # カウンター発動不能ならキャンセル
  685.       unset_counter_action
  686.       @active_battler = last_active_battler
  687.     else
  688.       @active_battler.action.forcing = true
  689.     end
  690.   end
  691.   #--------------------------------------------------------------------------
  692.   # ● 戦闘行動の実行
  693.   #--------------------------------------------------------------------------
  694.   alias execute_action_KGC_Counter execute_action
  695.   def execute_action
  696.     unless @counter_exec
  697.       register_interrupt_counter_action
  698.     end

  699.     if @counter_interrupt
  700.       execute_interrupt_counter
  701.     else
  702.       execute_action_KGC_Counter
  703.     end
  704.     unset_counter_action
  705.     @active_battler.action.made_targets = nil
  706.   end
  707.   #--------------------------------------------------------------------------
  708.   # ● 戦闘行動の実行 : 攻撃
  709.   #--------------------------------------------------------------------------
  710.   alias execute_action_attack_KGC_Counter execute_action_attack
  711.   def execute_action_attack
  712.     if @counter_exec
  713.       # 攻撃時メッセージを無理矢理書き換える
  714.       old_DoAttack = Vocab::DoAttack
  715.       Vocab.const_set(:DoAttack, Vocab::CounterAttack)
  716.     end

  717.     execute_action_attack_KGC_Counter

  718.     if @counter_exec
  719.       # 後始末
  720.       Vocab.const_set(:DoAttack, old_DoAttack)
  721.     end
  722.   end
  723.   #--------------------------------------------------------------------------
  724.   # ● 行動結果の表示
  725.   #     target : 対象者
  726.   #     obj    : スキルまたはアイテム
  727.   #--------------------------------------------------------------------------
  728.   alias display_action_effects_KGC_Counter display_action_effects
  729.   def display_action_effects(target, obj = nil)
  730.     display_action_effects_KGC_Counter(target, obj)

  731.     unless target.skipped
  732.       register_counter_action(target)
  733.     end
  734.   end
  735.   #--------------------------------------------------------------------------
  736.   # ○ カウンター行動の登録
  737.   #     target    : 被攻撃者
  738.   #     interrupt : 割り込みフラグ
  739.   #--------------------------------------------------------------------------
  740.   def register_counter_action(target, interrupt = false)
  741.     return unless can_counter?(target)

  742.     # 有効なカウンター行動をセット
  743.     target.counter_actions.each { |counter|
  744.       break if counter_added?
  745.       next  if counter.condition.ignore_target
  746.       next  if counter.condition.interrupt ^ interrupt  # <-- if x != y
  747.       judge_counter_action(@active_battler, target, counter)
  748.     }
  749.   end
  750.   #--------------------------------------------------------------------------
  751.   # ○ カウンター可否
  752.   #     target : 被攻撃者
  753.   #--------------------------------------------------------------------------
  754.   def can_counter?(target = nil)
  755.     return false if @counter_exec   # カウンターに対するカウンターは行わない
  756.     return false if counter_added?  # カウンター済み
  757.     if target != nil
  758.       return false unless target.movable?  # 行動不能
  759.     end

  760.     if $imported["CooperationSkill"]
  761.       # 連係スキルにはカウンターを適用しない
  762.       return false if @active_battler.is_a?(Game_CooperationBattler)
  763.     end

  764.     return true
  765.   end
  766.   #--------------------------------------------------------------------------
  767.   # ○ カウンター登録済み判定
  768.   #--------------------------------------------------------------------------
  769.   def counter_added?
  770.     return (KGC::Counter::RESTRICT_COUNTER && @counter_added)
  771.   end
  772.   #--------------------------------------------------------------------------
  773.   # ○ カウンター判定
  774.   #     attacker : 攻撃者
  775.   #     target   : 被攻撃者
  776.   #     counter  : カウンター行動
  777.   #--------------------------------------------------------------------------
  778.   def judge_counter_action(attacker, target, counter)
  779.     return unless counter.valid?(attacker, target)
  780.     return unless counter.exec?

  781.     info = Game_CounterInfo.new
  782.     info.battler = target
  783.     info.action  = counter
  784.     info.target_index = attacker.index
  785.     @counter_infos << info
  786.     @counter_added = true
  787.   end
  788.   #--------------------------------------------------------------------------
  789.   # ○ ターゲット無視のカウンター行動の登録
  790.   #     interrupt : 割り込み判定
  791.   #--------------------------------------------------------------------------
  792.   def register_ignore_target_counter_action(interrupt = false)
  793.     return unless can_counter?
  794.     return if @active_battler.nil?

  795.     target_unit = (@active_battler.actor? ? $game_troop : $game_party).members
  796.     target_unit.each { |battler|
  797.       next unless can_counter?(battler)
  798.       battler.counter_actions.each { |counter|
  799.         break if counter_added?
  800.         next  unless counter.condition.ignore_target
  801.         next  if counter.condition.interrupt ^ interrupt  # <-- if x != y
  802.         judge_counter_action(@active_battler, battler, counter)
  803.       }
  804.     }
  805.   end
  806.   #--------------------------------------------------------------------------
  807.   # ○ 割り込みカウンター行動の登録
  808.   #--------------------------------------------------------------------------
  809.   def register_interrupt_counter_action
  810.     return unless can_counter?

  811.     # 自分が対象
  812.     targets = @active_battler.action.make_targets
  813.     if targets != nil
  814.       targets.each { |t|
  815.         break if counter_added?
  816.         register_counter_action(t, true)
  817.       }
  818.     end

  819.     # ターゲット無視
  820.     register_ignore_target_counter_action(true) unless counter_added?

  821.     @counter_interrupt = counter_added?
  822.   end
  823.   #--------------------------------------------------------------------------
  824.   # ○ 割り込みカウンターの実行
  825.   #--------------------------------------------------------------------------
  826.   def execute_interrupt_counter
  827.     counter = @counter_infos[0]
  828.     text = counter.action.interrupt_message.clone
  829.     text = Vocab::InterruptCounter.clone if text.empty?

  830.     text.gsub!(/\\\\/, "\\")
  831.     text.gsub!(/\\N([^\[]|$)/i) { "#{@active_battler.name}#{$1}" }
  832.     text.gsub!(/\\C([^\[]|$)/i) { "#{counter.battler.name}#{$1}" }
  833.     text.gsub!(/\\A([^\[]|$)/i) { "#{@active_battler.action.action_name}#{$1}" }
  834.     @message_window.add_instant_text(text)
  835.     wait(45)
  836.   end
  837. end
复制代码

Lv1.梦旅人

kissye的宠物<

梦石
0
星屑
61
在线时间
1563 小时
注册时间
2008-8-11
帖子
6174

贵宾

2
发表于 2010-7-7 23:39:58 | 只看该作者
KCG的范例呃,工程名称?
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
723
在线时间
530 小时
注册时间
2010-6-9
帖子
840
3
 楼主| 发表于 2010-7-8 00:07:40 | 只看该作者
回复 木葬枫 的帖子
RPG超级整合,名字是我改的...


   
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-9 06:26

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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