Project1

标题: 战斗效果脚本使用问题 [打印本页]

作者: 347780682    时间: 2014-12-26 22:44
标题: 战斗效果脚本使用问题
[attach]269736[/attach]
我想问下透视技能 使用后会进入麻痹状态 怎么取消掉麻痹状态?

偷窃技能所偷偷窃的物品是怎么放置的 (我用透视技能在游戏看下了 战利品和可偷窃物品是分开的)
RUBY 代码复制
  1. #==============================================================================
  2. # 本脚本来自[url]www.66RPG.com[/url],使用和转载请保留此信息
  3. #==============================================================================
  4.  
  5. # ▼▲▼ XRXS19. 特殊効果詰め合わせ:戦闘用 with 29 parts ver..18a ▼▲▼
  6. # by 桜雅 在土, 和希, シムナフ
  7.  
  8. #==============================================================================
  9. # ■ 以下内容定义各特技的属性名
  10. #==============================================================================
  11. class Game_Battler
  12.   RERAISE_STATE_NAME = /复活/           
  13.   LIBLA_SKILL_ELEMENT_NAME = "透视"     
  14.   POWERSTOCK_SKILL_ELEMENT_NAME = "聚气"
  15.   POWERSTOCK_BASE_RATE = 0.5            #——每回合聚气威力上升倍率
  16.   STEAL_SKILL_ELEMENT_NAME = "偷窃"
  17.   ELEMENT_NAME_SP_DAMAGE = "SP损伤"
  18.   ELEMENT_NAME_HP_DRAIN = "HP吸收"
  19.   ELEMENT_NAME_SP_DRAIN = "SP吸收"
  20.   ELEMENT_NAME_CRITICAL_HIT = "必杀"
  21.   ELEMENT_NAME_CERTAIN_HIT = "必中"
  22.   ELEMENT_NAME_HP_COST = "HP消耗"
  23. end
  24. class Game_BattleAction
  25.   ELEMENT_NAME_SPEED_PRIORITY = "优先度"
  26. end
  27. class Scene_Battle
  28.   ELEMENT_NAME_HP_COST = "HP消耗"
  29.   ELEMENT_NAME_DERIVER = "派生"
  30.   ELEMENT_NAME_MOVE_TIMES = "行动回数"
  31.   ELEMENT_NAME_AREA_ENEMY_ALL = "全体化"
  32.   ELEMENT_NAME_AREA_WHOLE = "全域化"
  33.   ELEMENT_NAME_AREA_ENEMY_RAND = "敌方随机"
  34.   ELEMENT_NAME_AREA_ACTOR_RAND ="我方随机"
  35.   ELEMENT_NAME_AREA_ALL_RANDOM ="对象随机"
  36.   RERAISE_HP = 1
  37.   RERAISE_HP_PERCENT = 0
  38.   RERAISE_ANIMATION_ID = 26
  39. end
  40. module Cover_Module
  41.   ELEMENT_NAME_COVER = "援助"
  42.   STATE_NAME_COVER = "援助"
  43.   COVER_HP_PERCENT = 100
  44.   COVER_EFFECT_PERCENT = 100
  45.   COVER_EFFECT_CHAR = "Covered!"
  46.   COVER_ANIMATION_ID = 64
  47.   COVER_DEFAULT_NUMBER = 2
  48. end
  49. #==============================================================================
  50. $xrxs19_special_effections_set_work = true
  51. #--------------------------------------------------------------------------
  52. # ● 属性修正の計算?改
  53. #--------------------------------------------------------------------------
  54. class Game_Battler
  55. def elements_correct(element_set)
  56. # 無属性の場合 100 を返す
  57. return 100 if element_set == []
  58. # 与えられた属性のレートを全て乗算
  59. result = 100
  60. for i in element_set
  61. result *= self.element_rate(i) / 100.0
  62. end
  63. return result.to_i
  64. end
  65. end
  66. #==============================================================================
  67. # ■ Game_Battler
  68. #==============================================================================
  69. class Game_Battler
  70. #--------------------------------------------------------------------------
  71. # ● 追加公開インスタンス変数
  72. #--------------------------------------------------------------------------
  73. attr_accessor :reraise_state
  74. attr_accessor :reraised # リレイズしたかどうか
  75. attr_accessor :metamor_target # 変身対象
  76. attr_accessor :battler_name # バトラーグラフィック
  77. attr_reader :battler_name_original # バトラーグラフィック初期値
  78. attr_writer :hp0_ban # HP/SPの 0 化または最大制限の解除
  79. attr_writer :certain_hit # 必中受け(Trueだと攻撃を避けられない)
  80. attr_accessor :covered_friends #庇っている味方の配列
  81. attr_accessor :effect_message #
  82. attr_accessor :current_friend #かばっている味方
  83. attr_accessor :cover_remain #かばう可能な残り回数
  84. #--------------------------------------------------------------------------
  85. # ● 初期化
  86. #--------------------------------------------------------------------------
  87. alias xrxs19_battler_initialize initialize
  88. def initialize
  89. xrxs19_battler_initialize
  90. # 「かばう」用変数初期化
  91. @covered_friends = []
  92. @effect_message = nil
  93. @current_friend = nil
  94. @cover_remain = 0
  95. end
  96. #--------------------------------------------------------------------------
  97. # ● ステートの付加
  98. # state_id : ステート ID
  99. # force : 強制付加フラグ (オートステートの処理で使用)
  100. #--------------------------------------------------------------------------
  101. alias xrxs19_add_state add_state
  102. def add_state(state_id, force = false)
  103. xrxs19_add_state(state_id, force)
  104. # 「かばう」のステート付加の場合
  105. if state_id == get_cover_state_id()
  106. self.cover_remain = COVER_DEFAULT_NUMBER
  107. end
  108. end
  109. #--------------------------------------------------------------------------
  110. # ● HP の変更
  111. #--------------------------------------------------------------------------
  112. def hp=(hp)
  113. if @hp0_ban
  114. @hp = hp
  115. else
  116. @hp = [[hp, maxhp].min, 0].max
  117. # 戦闘不能を付加または解除
  118. for i in 1...$data_states.size
  119. if $data_states[i].zero_hp
  120. if self.dead?
  121. # 追加
  122. for x in 1...$data_states.size
  123. # ステート名は変更可。
  124. if $data_states[x].name[RERAISE_STATE_NAME] != nil
  125. reraise_id = $data_states[x].id
  126. break
  127. end
  128. end
  129. # リレイズ復活
  130. if reraise_id != nil && self.state?(reraise_id)
  131. self.remove_state(reraise_id)
  132. @reraised = true
  133. # 戦闘不能マイナスステートに設定されているものを解除
  134. if $data_states[i].minus_state_set != []
  135. for j in $data_states[i].minus_state_set
  136. remove_state(j)
  137. end
  138. end
  139. elsif
  140. # ここまで
  141. add_state(i)
  142. end
  143. else
  144. remove_state(i)
  145. end
  146. end
  147. end
  148. end
  149. end
  150. #--------------------------------------------------------------------------
  151. # ● SP の変更
  152. #--------------------------------------------------------------------------
  153. def sp=(sp)
  154. if @hp0_ban
  155. @sp = sp
  156. else
  157. @sp = [[sp, maxsp].min, 0].max
  158. end
  159. end
  160. #--------------------------------------------------------------------------
  161. # ● ステート [攻撃を回避できない] 判定
  162. #--------------------------------------------------------------------------
  163. alias xrxs19_cant_evade? cant_evade?
  164. def cant_evade?
  165. return true if @certain_hit
  166. return xrxs19_cant_evade?
  167. end
  168. #--------------------------------------------------------------------------
  169. # ● 通常攻撃の効果適用
  170. #--------------------------------------------------------------------------
  171. alias xrxs19_attack_effect attack_effect# alias したものは effect_it 内で使用
  172. def attack_effect(attacker)
  173. # 通常攻撃の場合、skill = nil で呼ぶ
  174. return effect_it(attacker, nil)
  175. end
  176. #--------------------------------------------------------------------------
  177. # ● スキルの効果適用
  178. #--------------------------------------------------------------------------
  179. alias xrxs19_skill_effect skill_effect # alias したものは effect_it 内で使用
  180. def skill_effect(user, skill)
  181. # スキルの場合は、skill を指定して呼ぶ
  182. return effect_it(user, skill)
  183. end
  184. #--------------------------------------------------------------------------
  185. # ● 効果適用
  186. #--------------------------------------------------------------------------
  187. def effect_it(user, skill = nil)
  188. # 実行前の数値を保持
  189. last_hp = self.hp
  190. last_sp = self.sp
  191. @hp0_ban = true
  192. # 武器IDの取得
  193. weapon_id = user.is_a?(Game_Actor) ? user.weapon_id : 0
  194. # 特殊効果:必中
  195. if skill != nil and skill_element_include?(skill, ELEMENT_NAME_CERTAIN_HIT)
  196. self.certain_hit = true
  197. elsif skill == nil and equip_weapon_element_include?(user, ELEMENT_NAME_CERTAIN_HIT)
  198. self.certain_hit = true
  199. end
  200. # 基本実行、skill が nil かどうかで通常攻撃とスキルを分別
  201. if skill == nil
  202. bool = xrxs19_attack_effect(user)
  203. else
  204. bool = xrxs19_skill_effect(user, skill)
  205. end
  206. # ダメージ測定
  207. damage = last_hp - self.hp
  208. # 必中の解除
  209. self.certain_hit = false
  210. # 特殊効果:スティール/アイテム奪取
  211. if skill != nil and skill_element_include?(skill, STEAL_SKILL_ELEMENT_NAME)
  212. self.steal_effect(user, skill) if self.is_a?(Game_Enemy)
  213. elsif skill == nil and equip_weapon_element_include?(user, STEAL_SKILL_ELEMENT_NAME)
  214. self.steal_effect(user, skill) if self.is_a?(Game_Enemy)
  215. end
  216. # 特殊効果:対象に変身
  217. if skill != nil and skill_element_include?(skill, "变身")
  218. if user.metamor_target == nil
  219. if self.metamor_target == nil
  220. # 変身状態で無い場合、変身
  221. user.metamor_target = self
  222. else
  223. # 対象が変身状態の場合、対象の変身対象に変身する。
  224. user.metamor_target = self.metamor_target
  225. end
  226. else
  227. # 変身状態の場合、変身を解除する
  228. user.metamor_target = user
  229. end
  230. # 自分への変身を禁止
  231. user.metamor_target = nil if user.metamor_target == user
  232. # 対象のダメージ表示を消す
  233. self.damage = nil if self.damage == "Miss"
  234. # HP/SP最大値変更への対応
  235. @hp0_ban = false
  236. user.hp = user.hp
  237. user.sp = user.sp
  238. end
  239. # 特殊効果:武器を投げる
  240. if (skill != nil and skill_element_include?(skill, "武器投掷"))
  241. # 投擲武器の取得
  242. throw_weapon = $data_weapons[user.current_action.basic]
  243. # 武器の消費
  244. if $xrxs24_weapon_property_system_work
  245. $game_party.lose_weapon(throw_weapon.id, user.current_action.basic_ex)
  246. else
  247. $game_party.lose_weapon(throw_weapon.id, 1)
  248. end
  249. # ダメージの変更
  250. self.hp += damage if bool
  251. damage = throw_weapon.atk
  252. if weapon_element_include?(throw_weapon.id, "投掷威力")
  253. damage = damage * @one.to_i / 100
  254. end
  255. self.damage = damage
  256. self.hp -= self.damage
  257. bool = true
  258. end
  259. # 特殊効果:消費金額に順ずる固定ダメージ
  260. if skill != nil and skill_element_include?(skill, "金钱投掷")
  261. # ゴールドの消費
  262. last_gold = $game_party.gold
  263. $game_party.gain_gold(-1 * ($game_party.gold * skill.variance / 100 + skill.power))
  264. self.hp += damage if bool
  265. damage = last_gold - $game_party.gold
  266. self.damage = damage
  267. self.hp -= self.damage
  268. bool = true
  269. end
  270. # 基本実行でfalse(Miss等)の場合、ここで終了する
  271. # つまり、この上までにダメージに関係なく実行される特殊効果をいれて
  272. # これより下はダメージに関係する特殊効果を入れる。
  273. # "武器投擲"と"銭投げ"はMissでも金額を消費するため上に。
  274. return false if bool == false
  275. # 特殊効果:防御能力の判定
  276. if damage > 0 and self.guarding?
  277. # 特殊効果:防御能力 2(強防御)
  278. if battler_element_rank?(self, "防御能力") == 2
  279. damage /= 2
  280. self.damage -= damage
  281. self.hp += damage
  282. end
  283. # 特殊効果:防御能力 1(無効防御)
  284. if battler_element_rank?(self, "防御能力") == 1
  285. self.hp += damage
  286. damage = 0
  287. self.damage = damage
  288. end
  289. end
  290. # 特殊効果:必殺確実クリティカル
  291. if (skill != nil and skill_element_include?(skill, ELEMENT_NAME_CRITICAL_HIT)) or
  292. (skill == nil and equip_weapon_element_include?(user, ELEMENT_NAME_CRITICAL_HIT)) and damage > 0
  293. if self.critical
  294. self.critical = false
  295. damage /= 2
  296. self.damage -= damage
  297. self.hp += damage
  298. end
  299. if @one == nil or rand(100) < @one.to_i
  300. self.critical = true
  301. self.hp -= damage
  302. damage *= 2
  303. self.damage = damage
  304. end
  305. end
  306. # 特殊効果:使用者の 最大HP - 現在HP 固定ダメージ
  307. if skill != nil and skill_element_include?(skill, "固定HP差分")
  308. self.hp += damage
  309. damage = user.maxhp - user.hp
  310. self.damage = damage
  311. self.hp -= self.damage
  312. self.critical = false # 固定ダメージ故クリティカルを禁止
  313. end
  314. # 特殊効果:使用者の 現在HP 固定ダメージ
  315. if skill != nil and skill_element_include?(skill, "现在HP损伤")
  316. self.hp += damage
  317. damage = user.hp
  318. self.damage = damage
  319. self.hp -= self.damage
  320. self.critical = false # 固定ダメージ故クリティカルを禁止
  321. end
  322. # 特殊効果:現在HPに順ずる固定ダメージ
  323. if skill != nil and skill_element_include?(skill, "固定现在HP")
  324. self.hp += damage
  325. damage = self.hp * skill.variance / 100 + skill.power
  326. damage *= -1 if skill.power < 0
  327. self.damage = damage
  328. self.hp -= self.damage
  329. self.critical = false # 固定ダメージ故クリティカルを禁止
  330. end
  331. # 特殊効果:最大HPに順ずる固定ダメージ
  332. if skill != nil and skill_element_include?(skill, "固定最大HP")
  333. self.hp += damage
  334. damage = self.maxhp * @one.to_i / 100
  335. damage *= -1 if skill.power < 0
  336. self.damage = damage
  337. self.hp -= self.damage
  338. self.critical = false # 固定ダメージ故クリティカルを禁止
  339. end
  340. # 特殊効果:HPではなくSPにダメージを与える
  341. if (skill != nil and skill_element_include?(skill, ELEMENT_NAME_SP_DAMAGE)) or
  342. (skill == nil and equip_weapon_element_include?(user, ELEMENT_NAME_SP_DAMAGE))
  343. self.hp += damage
  344. self.sp -= damage
  345. self.damage = "SP " + damage.to_s
  346. # このタイミングで戦闘不能判定
  347. @hp0_ban = false
  348. self.sp = self.sp
  349. real_damage = last_sp - self.sp
  350. else
  351. # このタイミングで戦闘不能判定
  352. @hp0_ban = false
  353. self.hp = self.hp
  354. real_damage = last_hp - self.hp
  355. end
  356. # 使用者のHP/SPもリセット
  357. user.hp = user.hp
  358. user.sp = user.sp
  359. # 特殊効果:与えたダメージを自分のHPとして吸収
  360. if (skill != nil and skill_element_include?(skill, ELEMENT_NAME_HP_DRAIN)) or
  361. (skill == nil and equip_weapon_element_include?(user, ELEMENT_NAME_HP_DRAIN))
  362. user.damage = -real_damage * @one.to_i / 100
  363. user.hp -= user.damage
  364. end
  365. # 特殊効果:与えたダメージを自分のSPとして吸収
  366. if (skill != nil and skill_element_include?(skill, ELEMENT_NAME_SP_DRAIN)) or
  367. (skill == nil and equip_weapon_element_include?(user, ELEMENT_NAME_SP_DRAIN))
  368. user.damage = -real_damage * @one.to_i / 100
  369. user.sp -= user.damage
  370. user.damage = "SP " + user.damage.to_s
  371. end
  372. return true
  373. end
  374. #--------------------------------------------------------------------------
  375. # ● バトラーの指定名の属性のランクを判定
  376. #--------------------------------------------------------------------------
  377. def battler_element_rank?(battler, element_name)
  378. for i in 1..$data_system.elements.size
  379. if $data_system.elements[i] == element_name
  380. if self.is_a?(Game_Actor)
  381. return $data_classes[battler.class_id].element_ranks[i]
  382. else
  383. return $data_enemies[battler.id].element_ranks[i]
  384. end
  385. end
  386. end
  387. return 3
  388. end
  389. #--------------------------------------------------------------------------
  390. # ● MaxHP の取得
  391. #--------------------------------------------------------------------------
  392. alias xrxs19_maxhp maxhp
  393. def maxhp
  394. if !@metamor_target.nil?
  395. return @metamor_target.maxhp
  396. end
  397. xrxs19_maxhp
  398. end
  399. #--------------------------------------------------------------------------
  400. # ● MaxSP の取得
  401. #--------------------------------------------------------------------------
  402. alias xrxs19_maxsp maxsp
  403. def maxsp
  404. if !@metamor_target.nil?
  405. return @metamor_target.maxsp
  406. end
  407. xrxs19_maxsp
  408. end
  409. #--------------------------------------------------------------------------
  410. # ● 腕力の取得
  411. #--------------------------------------------------------------------------
  412. alias xrxs19_str str
  413. def str
  414. if !@metamor_target.nil?
  415. return @metamor_target.str
  416. end
  417. xrxs19_str
  418. end
  419. #--------------------------------------------------------------------------
  420. # ● 器用さの取得
  421. #--------------------------------------------------------------------------
  422. alias xrxs19_dex dex
  423. def dex
  424. if !@metamor_target.nil?
  425. return @metamor_target.dex
  426. end
  427. xrxs19_dex
  428. end
  429. #--------------------------------------------------------------------------
  430. # ● 素早さの取得
  431. #--------------------------------------------------------------------------
  432. alias xrxs19_agi agi
  433. def agi
  434. if !@metamor_target.nil?
  435. return @metamor_target.agi
  436. end
  437. xrxs19_agi
  438. end
  439. #--------------------------------------------------------------------------
  440. # ● 魔力の取得
  441. #--------------------------------------------------------------------------
  442. alias xrxs19_int int
  443. def int
  444. if !@metamor_target.nil?
  445. return @metamor_target.int
  446. end
  447. xrxs19_int
  448. end
  449. #--------------------------------------------------------------------------
  450. # ● 攻撃力の取得
  451. #--------------------------------------------------------------------------
  452. alias xrxs19_atk atk
  453. def atk
  454. if !@metamor_target.nil?
  455. return @metamor_target.atk
  456. end
  457. xrxs19_atk
  458. end
  459. #--------------------------------------------------------------------------
  460. # ● 物理防御の取得
  461. #--------------------------------------------------------------------------
  462. alias xrxs19_pdef pdef
  463. def pdef
  464. if !@metamor_target.nil?
  465. return @metamor_target.pdef
  466. end
  467. xrxs19_pdef
  468. end
  469. #--------------------------------------------------------------------------
  470. # ● 魔法防御の取得
  471. #--------------------------------------------------------------------------
  472. alias xrxs19_mdef mdef
  473. def mdef
  474. if !@metamor_target.nil?
  475. return @metamor_target.mdef
  476. end
  477. xrxs19_mdef
  478. end
  479. #--------------------------------------------------------------------------
  480. # ● 回避修正の取得
  481. #--------------------------------------------------------------------------
  482. alias xrxs19_eva eva
  483. def eva
  484. if !@metamor_target.nil?
  485. return @metamor_target.eva
  486. end
  487. xrxs19_eva
  488. end
  489. end
  490.  
  491. #==============================================================================
  492. # ■ Game_BattleAction
  493. #==============================================================================
  494. class Game_BattleAction
  495. #--------------------------------------------------------------------------
  496. # ● 公開インスタンス変数
  497. #--------------------------------------------------------------------------
  498. attr_accessor :speed_priority # スピード優先度
  499. attr_accessor :weapon_id # 武器 ID
  500. attr_accessor :basic_ex # 基本拡張(補助的に数値を保持)
  501. #--------------------------------------------------------------------------
  502. # ● クリア
  503. #--------------------------------------------------------------------------
  504. alias xrxs19_clear clear
  505. def clear
  506. @weapon_id = 0
  507. xrxs19_clear
  508. end
  509. #--------------------------------------------------------------------------
  510. # ● スキルの優先度取得
  511. #--------------------------------------------------------------------------
  512. def speed_priority
  513. if @kind == 0 and @basic == 0
  514. # 通常攻撃の場合
  515. elsif @kind == 1
  516. # スキルの場合
  517. return 0 if $data_skills[@skill_id] == nil
  518. for i in $data_skills[@skill_id].element_set
  519. if $data_system.elements[i] != nil
  520. if $data_system.elements[i] =~ /^#{ELEMENT_NAME_SPEED_PRIORITY}([+-]?[0-9]+)/
  521. return $1.to_i
  522. end
  523. end
  524. end
  525. end
  526. return 0
  527. end
  528. end
  529. #==============================================================================
  530. # ■ Game_Actor
  531. #==============================================================================
  532. class Game_Actor < Game_Battler
  533. #--------------------------------------------------------------------------
  534. # ● セットアップ
  535. #--------------------------------------------------------------------------
  536. alias xrxs19_setup setup
  537. def setup(actor_id)
  538. xrxs19_setup(actor_id)
  539. @reraised = false
  540. @reraise_state = 0
  541. @metamor_target = nil
  542. @battler_name_original = @battler_name
  543. end
  544. #--------------------------------------------------------------------------
  545. # ● MaxHP の取得
  546. #--------------------------------------------------------------------------
  547. alias xrxs19_maxhp maxhp
  548. def maxhp
  549. if !@metamor_target.nil?
  550. return @metamor_target.maxhp
  551. end
  552. xrxs19_maxhp
  553. end
  554. #--------------------------------------------------------------------------
  555. # ● スキルの使用可能判定
  556. #--------------------------------------------------------------------------
  557. alias xrxs19_skill_can_use? skill_can_use?
  558. def skill_can_use?(skill_id)
  559. # スキルを取得
  560. [url=home.php?mod=space&uid=260100]@skill[/url] = $data_skills[skill_id]
  561. # HP消費スキルの場合
  562. if skill_element_include?(@skill, ELEMENT_NAME_HP_COST) and @actor_id > 0
  563. # HP が足りない場合は使用不可
  564. if $data_skills[skill_id].sp_cost > self.hp
  565. return false
  566. end
  567. # SP消費量を回復させ、SP が足りない場合を回避(最大値を超えて回復)
  568. self.hp0_ban = true
  569. self.sp += @skill.sp_cost
  570. bool = xrxs19_skill_can_use?(skill_id)
  571. # SPを元に戻す
  572. self.sp -= @skill.sp_cost
  573. self.hp0_ban = false
  574. return bool
  575. else
  576. return xrxs19_skill_can_use?(skill_id)
  577. end
  578. end
  579. end
  580. #==============================================================================
  581. # ■ Game_Enemy
  582. #==============================================================================
  583. class Game_Enemy < Game_Battler
  584. #--------------------------------------------------------------------------
  585. # ● オブジェクト初期化
  586. #--------------------------------------------------------------------------
  587. alias xrxs19_initialize initialize
  588. def initialize(troop_id, member_index)
  589. xrxs19_initialize(troop_id, member_index)
  590. @reraised = false
  591. @reraise_state = 0
  592. @metamor_target = nil
  593. @battler_name_original = @battler_name
  594. end
  595. end
  596. #==============================================================================
  597. # ■ Window_Item
  598. #==============================================================================
  599. class Window_Item < Window_Selectable
  600. #--------------------------------------------------------------------------
  601. # ● オブジェクト初期化
  602. #--------------------------------------------------------------------------
  603. alias xrxs19_initialize initialize
  604. def initialize
  605. xrxs19_initialize
  606. refresh
  607. end
  608. #--------------------------------------------------------------------------
  609. # ● 値の受け渡し
  610. #--------------------------------------------------------------------------
  611. def set_itemkind(itemkind)
  612. @itemkind = itemkind
  613. refresh
  614. end
  615. #--------------------------------------------------------------------------
  616. # ● 値の受け渡し
  617. #--------------------------------------------------------------------------
  618. def set_restrict(restrict)
  619. @restrict = restrict
  620. refresh
  621. end
  622. #--------------------------------------------------------------------------
  623. # ● リフレッシュ
  624. #--------------------------------------------------------------------------
  625. alias xrxs19_refresh refresh
  626. def refresh
  627. if @itemkind != 11
  628. xrxs19_refresh
  629. return
  630. end
  631. # 11 = 制限:投擲武器のみ
  632. if self.contents != nil
  633. self.contents.dispose
  634. self.contents = nil
  635. end
  636. @data = []
  637. @data_id = []
  638. for i in 1...$data_weapons.size
  639. if $game_party.weapon_number(i) > 0
  640. @data.push($data_weapons[i]) if weapon_element_include?(i, "投掷威力")
  641. end
  642. end
  643. # 項目数が 0 でなければビットマップを作成し、全項目を描画
  644. @item_max = @data.size
  645. if @item_max > 0
  646. self.contents = Bitmap.new(width - 32, row_max * 32)
  647. for i in 0...@item_max
  648. draw_item(i)
  649. end
  650. end
  651. end
  652. #--------------------------------------------------------------------------
  653. # ● 項目の描画
  654. #--------------------------------------------------------------------------
  655. alias xrxs19_draw_item draw_item
  656. def draw_item(index)
  657. if @itemkind != 11
  658. xrxs19_draw_item(index)
  659. return
  660. end
  661. # 11 = 制限:投擲武器のみ
  662. item = @data[index]
  663. number = $game_party.weapon_number(item.id)
  664. self.contents.font.color = normal_color
  665. x = 4 + index % @column_max * (288 + 32)
  666. y = index / @column_max * 32
  667. rect = Rect.new(x, y, self.width / @column_max - 32, 32)
  668. self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
  669. bitmap = RPG::Cache.icon(item.icon_name)
  670. opacity = self.contents.font.color == normal_color ? 255 : 128
  671. self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
  672. self.contents.draw_text(x + 28, y, 212, 32, item.name, 0)
  673. self.contents.draw_text(x + 240, y, 16, 32, ":", 1)
  674. self.contents.draw_text(x + 256, y, 24, 32, number.to_s, 2)
  675. end
  676. end
  677. #==============================================================================
  678. # ■ Scene_Battle
  679. #==============================================================================
  680. class Scene_Battle
  681. #--------------------------------------------------------------------------
  682. # ● メイン処理
  683. #--------------------------------------------------------------------------
  684. alias xrxs19_main main
  685. def main
  686. @phase4_5_done = false
  687. xrxs19_main
  688. end


RUBY 代码复制
  1. #--------------------------------------------------------------------------
  2. # ● フレーム更新 (アクターコマンドフェーズ)
  3. #--------------------------------------------------------------------------
  4. alias xrxs19_update_phase3 update_phase3
  5. def update_phase3
  6. # 武器のみアイテムウィンドウが有効の場合
  7. if @item_window_weapons != nil and @item_window_weapons.visible
  8. update_phase3_item_window_weapons
  9. return
  10. end
  11. # 他
  12. xrxs19_update_phase3
  13. end
  14. #--------------------------------------------------------------------------
  15. # ● フレーム更新 (アクターコマンドフェーズ : スキル選択)
  16. #--------------------------------------------------------------------------
  17. alias xrxs19_update_phase3_skill_select update_phase3_skill_select
  18. def update_phase3_skill_select
  19. # C ボタンが押された場合
  20. if Input.trigger?(Input::C)
  21. # スキルウィンドウで現在選択されているデータを取得
  22. @skill = @skill_window.skill
  23. if skill_element_include?(@skill, "武器投掷")
  24. # 使用できない場合
  25. if @skill == nil or not @active_battler.skill_can_use?(@skill.id)
  26. # ブザー SE を演奏
  27. $game_system.se_play($data_system.buzzer_se)
  28. return
  29. end
  30. # 決定 SE を演奏
  31. $game_system.se_play($data_system.decision_se)
  32. # アクションを設定
  33. @active_battler.current_action.skill_id = @skill.id
  34. # アイテム選択へ移行する
  35. start_item_select_from_skill(@one.to_i)
  36. return
  37. end
  38. end
  39. xrxs19_update_phase3_skill_select
  40. end
  41. #--------------------------------------------------------------------------
  42. # ● フレーム更新 (アクターコマンドフェーズ : 武器のみアイテム選択)
  43. #--------------------------------------------------------------------------
  44. def update_phase3_item_window_weapons
  45. # 武器アイテムウィンドウを可視状態にする
  46. @item_window_weapons.visible = true
  47. # 武器アイテムウィンドウを更新
  48. @item_window_weapons.update
  49. # B ボタンが押された場合
  50. if Input.trigger?(Input::B)
  51. # キャンセル SE を演奏
  52. $game_system.se_play($data_system.cancel_se)
  53. # 武器アイテムの選択を終了
  54. end_item_select_from_skill
  55. return
  56. end
  57. # C ボタンが押された場合
  58. if Input.trigger?(Input::C)
  59. # 決定 SE を演奏
  60. $game_system.se_play($data_system.decision_se)
  61. # アイテムウィンドウで現在選択されているデータを取得
  62. @item = @item_window_weapons.item
  63. # アクションを設定
  64. @active_battler.current_action.basic = @item.id
  65. if $xrxs24_weapon_property_system_work
  66. # アイテムウィンドウで現在選択されているデータを取得
  67. @item_room_no = @item_window_weapons.item_room_no
  68. # アクションを設定
  69. @active_battler.current_action.basic_ex = @item_room_no
  70. end
  71. # 武器のみアイテムウィンドウを不可視化
  72. @item_window_weapons.visible = false
  73. # 効果範囲が敵単体の場合
  74. if @skill.scope == 1
  75. # エネミーの選択を開始
  76. start_enemy_select
  77. # 効果範囲が味方単体の場合
  78. elsif @skill.scope == 3 or @skill.scope == 5
  79. # アクターの選択を開始
  80. start_actor_select
  81. # 効果範囲が単体ではない場合
  82. else
  83. # アイテムの選択を終了
  84. end_item_select_from_skill
  85. # 次のアクターのコマンド入力へ
  86. phase3_next_actor
  87. end
  88. return
  89. end
  90. end
  91. #--------------------------------------------------------------------------
  92. # ● スキルからのアイテム選択開始
  93. #--------------------------------------------------------------------------
  94. def start_item_select_from_skill(restrict = 0)
  95. # 投擲アイテムウィンドウを作成 ( 武器のみ:投擲可能のみ )
  96. @item_window_weapons = Window_Item.new
  97. if restrict == 1
  98. @item_window_weapons.set_itemkind(11)
  99. else
  100. @item_window_weapons.set_itemkind(1)
  101. end
  102. # ヘルプウィンドウを関連付け
  103. @item_window_weapons.help_window = @help_window
  104. # スキルウィンドウを無効化
  105. @skill_window.active = false
  106. @skill_window.visible = false
  107. end
  108. #--------------------------------------------------------------------------
  109. # ● スキルからのアイテム選択終了
  110. #--------------------------------------------------------------------------
  111. def end_item_select_from_skill
  112. # 武器のみアイテムウィンドウを解放
  113. @item_window_weapons.dispose
  114. @item_window_weapons = nil
  115. # ヘルプウィンドウを隠す
  116. @help_window.visible = false
  117. # スキルウィンドウを有効化
  118. @skill_window.active = true
  119. @skill_window.visible = true
  120. end
  121. #--------------------------------------------------------------------------
  122. # ● エネミー選択開始
  123. #--------------------------------------------------------------------------
  124. alias xrxs19_start_enemy_select start_enemy_select
  125. def start_enemy_select
  126. return if start_select_check
  127. xrxs19_start_enemy_select
  128. end
  129. #--------------------------------------------------------------------------
  130. # ● アクター選択開始
  131. #--------------------------------------------------------------------------
  132. alias xrxs19_start_actor_select start_actor_select
  133. def start_actor_select
  134. return if start_select_check
  135. xrxs19_start_actor_select
  136. end
  137. #--------------------------------------------------------------------------
  138. # ● 選択開始時のチェック
  139. #--------------------------------------------------------------------------
  140. def start_select_check
  141. # "全体化"、"全域化"、"対象ランダム"の判定
  142. case @active_battler.current_action.kind
  143. when 0 # 攻撃
  144. # ここで「攻撃」使用者の武器IDを保持しておく
  145. @active_battler.current_action.weapon_id = @active_battler.weapon_id
  146. # チェックに戻る
  147. if equip_weapon_element_include?(@active_battler, ELEMENT_NAME_AREA_ENEMY_ALL) or
  148. equip_weapon_element_include?(@active_battler, ELEMENT_NAME_AREA_WHOLE) or
  149. equip_weapon_element_include?(@active_battler, ELEMENT_NAME_AREA_ENEMY_RAND) or
  150. equip_weapon_element_include?(@active_battler, ELEMENT_NAME_AREA_ACTOR_RAND) or
  151. equip_weapon_element_include?(@active_battler, ELEMENT_NAME_AREA_ALL_RANDOM)
  152. phase3_next_actor
  153. return true
  154. end
  155. when 1 # スキル
  156. if skill_element_include?(@skill, ELEMENT_NAME_AREA_ENEMY_ALL) or
  157. skill_element_include?(@skill, ELEMENT_NAME_AREA_WHOLE) or
  158. skill_element_include?(@skill, ELEMENT_NAME_AREA_ENEMY_RAND) or
  159. skill_element_include?(@skill, ELEMENT_NAME_AREA_ACTOR_RAND) or
  160. skill_element_include?(@skill, ELEMENT_NAME_AREA_ALL_RANDOM)
  161. end_skill_select
  162. phase3_next_actor
  163. return true
  164. end
  165. when 2 # アイテム
  166. if item_element_include?(@item, ELEMENT_NAME_AREA_ENEMY_ALL) or
  167. item_element_include?(@item, ELEMENT_NAME_AREA_WHOLE) or
  168. item_element_include?(@item, ELEMENT_NAME_AREA_ENEMY_RAND) or
  169. item_element_include?(@item, ELEMENT_NAME_AREA_ACTOR_RAND) or
  170. item_element_include?(@item, ELEMENT_NAME_AREA_ALL_RANDOM)
  171. end_item_select
  172. phase3_next_actor
  173. return true
  174. end
  175. end
  176. return false
  177. end
  178. #--------------------------------------------------------------------------
  179. # ● フレーム更新 (メインフェーズ ステップ 1 : アクション準備)
  180. #--------------------------------------------------------------------------
  181. alias xrxs19_update_phase4_step1 update_phase4_step1
  182. def update_phase4_step1
  183. # 初期化
  184. @phase4_act_continuation = 0
  185. @phase4_act_times_max = 1
  186. @skill = nil
  187. @weapon_id = nil
  188. # 戻す
  189. xrxs19_update_phase4_step1
  190. end
  191. #--------------------------------------------------------------------------
  192. # ● フレーム更新 (メインフェーズ ステップ 2 : アクション開始)
  193. #--------------------------------------------------------------------------
  194. alias xrxs19_update_phase4_step2 update_phase4_step2
  195. def update_phase4_step2
  196. #リレイズ判定
  197. next_phase_ok = true
  198. next_phase_ok = update_reraise_effect(@active_battler)
  199. if !next_phase_ok
  200. return
  201. end
  202. if next_phase_ok
  203. # ステップ 2 へ
  204. xrxs19_update_phase4_step2
  205. end
  206. end
  207. #--------------------------------------------------------------------------
  208. # ● 基本アクション 結果作成
  209. #--------------------------------------------------------------------------
  210. alias xrxs19_make_basic_action_result make_basic_action_result
  211. def make_basic_action_result
  212. # 攻撃の場合
  213. if @active_battler.current_action.basic == 0
  214. # 武器IDの取得
  215. @weapon_id = @active_battler.is_a?(Game_Actor) ? @active_battler.weapon_id : 0
  216. # 指定行動回数取得 ( "行動回数"が無い場合は 1 のまま )
  217. weapon_element_include?(@weapon_id, ELEMENT_NAME_MOVE_TIMES)
  218. @phase4_act_times_max = @one.to_i if @one != nil
  219. # アニメーション ID を設定
  220. @animation1_id = @active_battler.animation1_id
  221. @animation2_id = @active_battler.animation2_id
  222. # 初期化
  223. @target_battlers = []
  224. # 対象側バトラーの配列を設定
  225. # "全体化"の判定
  226. if equip_weapon_element_include?(@active_battler, ELEMENT_NAME_AREA_ENEMY_ALL)
  227. # 行動側バトラーがエネミーの場合
  228. if @active_battler.is_a?(Game_Enemy)
  229. if @active_battler.restriction == 3
  230. @target_battlers = $game_troop.enemies
  231. else
  232. @target_battlers = $game_party.actors
  233. end
  234. end
  235. # 行動側バトラーがアクターの場合
  236. if @active_battler.is_a?(Game_Actor)
  237. if @active_battler.restriction == 3
  238. @target_battlers = $game_party.actors
  239. else
  240. @target_battlers = $game_troop.enemies
  241. end
  242. end
  243. end
  244. # "敵ランダム"の判定
  245. if equip_weapon_element_include?(@active_battler, ELEMENT_NAME_AREA_ENEMY_RAND)
  246. # 行動側バトラーがエネミーの場合
  247. if @active_battler.is_a?(Game_Enemy)
  248. if @active_battler.restriction == 3
  249. tb_array = $game_troop.enemies
  250. else
  251. tb_array = $game_party.actors
  252. end
  253. end
  254. # 行動側バトラーがアクターの場合
  255. if @active_battler.is_a?(Game_Actor)
  256. if @active_battler.restriction == 3
  257. tb_array = $game_party.actors
  258. else
  259. tb_array = $game_troop.enemies
  260. end
  261. end
  262. @target_battlers = [tb_array[rand(tb_array.size)]]
  263. end
  264. # "味方ランダム"の判定
  265. if equip_weapon_element_include?(@active_battler, ELEMENT_NAME_AREA_ACTOR_RAND)
  266. # 行動側バトラーがエネミーの場合
  267. if @active_battler.is_a?(Game_Enemy)
  268. if @active_battler.restriction == 3
  269. tb_array = $game_party.actors
  270. else
  271. tb_array = $game_troop.enemies
  272. end
  273. end
  274. # 行動側バトラーがアクターの場合
  275. if @active_battler.is_a?(Game_Actor)
  276. if @active_battler.restriction == 3
  277. tb_array = $game_troop.enemies
  278. else
  279. tb_array = $game_party.actors
  280. end
  281. end
  282. @target_battlers = [tb_array[rand(tb_array.size)]]
  283. end
  284. # "全域化"の判定
  285. if equip_weapon_element_include?(@active_battler, ELEMENT_NAME_AREA_WHOLE)
  286. @target_battlers = $game_party.actors + $game_troop.enemies
  287. end
  288. # "対象ランダム"の判定
  289. if equip_weapon_element_include?(@active_battler, ELEMENT_NAME_AREA_ALL_RANDOM)
  290. tb_array = $game_party.actors + $game_troop.enemies
  291. @target_battlers = [tb_array[rand(tb_array.size)]]
  292. end
  293. if @target_battlers.size > 0
  294. ##かばう追加
  295. get_target_battlers_after_cover!(@target_battlers, @active_battler)
  296. # 通常攻撃の効果を適用
  297. for target in @target_battlers
  298. target.attack_effect(@active_battler)
  299. end
  300. return
  301. end
  302. end
  303. xrxs19_make_basic_action_result
  304. end
  305. #--------------------------------------------------------------------------
  306. # ● スキルまたはアイテムの対象側バトラー設定
  307. #--------------------------------------------------------------------------
  308. alias xrxs19_set_target_battlers set_target_battlers
  309. def set_target_battlers(scope)
  310. case @active_battler.current_action.kind
  311. when 1
  312. # "全体化"の判定
  313. if skill_element_include?(@skill, ELEMENT_NAME_AREA_ENEMY_ALL)
  314. scope = 2
  315. return
  316. end
  317. # "全域化"の判定
  318. scope = 8 if skill_element_include?(@skill, ELEMENT_NAME_AREA_WHOLE)
  319. # "敵ランダム"の判定
  320. scope = 9 if skill_element_include?(@skill, ELEMENT_NAME_AREA_ENEMY_RAND)
  321. # "味方ランダム"の判定
  322. scope =10 if skill_element_include?(@skill, ELEMENT_NAME_AREA_ACTOR_RAND)
  323. # "対象ランダム"の判定
  324. scope =11 if skill_element_include?(@skill, ELEMENT_NAME_AREA_ALL_RANDOM)
  325. when 2
  326. # "全体化"の判定
  327. if item_element_include?(@item, ELEMENT_NAME_AREA_ENEMY_ALL)
  328. scope = 2
  329. return
  330. end
  331. # "全域化"の判定
  332. scope = 8 if item_element_include?(@item, ELEMENT_NAME_AREA_WHOLE)
  333. # "敵ランダム"の判定
  334. scope = 9 if item_element_include?(@item, ELEMENT_NAME_AREA_ENEMY_RAND)
  335. # "味方ランダム"の判定
  336. scope =10 if item_element_include?(@item, ELEMENT_NAME_AREA_ACTOR_RAND)
  337. # "対象ランダム"の判定
  338. scope =11 if item_element_include?(@item, ELEMENT_NAME_AREA_ALL_RANDOM)
  339. end
  340. case scope
  341. when 8
  342. @target_battlers = $game_party.actors + $game_troop.enemies
  343. return
  344. when 9
  345. # 行動側バトラーがエネミーの場合
  346. if @active_battler.is_a?(Game_Enemy)
  347. tb_array = $game_party.actors
  348. end
  349. # 行動側バトラーがアクターの場合
  350. if @active_battler.is_a?(Game_Actor)
  351. tb_array = $game_troop.enemies
  352. end
  353. @target_battlers = [tb_array[rand(tb_array.size)]]
  354. return
  355. when 10
  356. # 行動側バトラーがエネミーの場合
  357. if @active_battler.is_a?(Game_Enemy)
  358. tb_array = $game_troop.enemies
  359. end
  360. # 行動側バトラーがアクターの場合
  361. if @active_battler.is_a?(Game_Actor)
  362. tb_array = $game_party.actors
  363. end
  364. @target_battlers = [tb_array[rand(tb_array.size)]]
  365. return
  366. when 11
  367. tb_array = $game_party.actors + $game_troop.enemies
  368. @target_battlers = [tb_array[rand(tb_array.size)]]
  369. return
  370. end
  371. # 呼び戻す
  372. xrxs19_set_target_battlers(scope)
  373. ##追加
  374. get_target_battlers_after_cover!(@target_battlers, @active_battler)
  375. end
  376. #--------------------------------------------------------------------------
  377. # ● スキルアクション 結果作成
  378. #--------------------------------------------------------------------------
  379. alias xrxs19_make_skill_action_result make_skill_action_result
  380. def make_skill_action_result
  381. # スキルを取得
  382. @skill = $data_skills[@active_battler.current_action.skill_id]
  383. # 既に一回以上行動している場合
  384. if @phase4_act_continuation >= 1
  385. # SP消費分のSPを回復させて擬似的にSPを減らさない
  386. @active_battler.sp += @skill.sp_cost
  387. else
  388. # 指定行動回数取得
  389. skill_element_include?(@skill, ELEMENT_NAME_MOVE_TIMES)
  390. @phase4_act_times_max = @one.to_i if @one != nil
  391. # 特殊効果:消費金額に順ずる固定ダメージ
  392. if skill_element_include?(@skill, "金钱投掷")
  393. # ゴールドウィンドウを作成
  394. if @gold_window == nil or @gold_window.visible == false
  395. @gold_window = Window_Gold.new
  396. @gold_window.x = 640 - @gold_window.width
  397. @gold_window.y = 64
  398. @gold_window.opacity = 160
  399. @gold_window.visible = true
  400. end
  401. end
  402. # HP消費スキルの場合
  403. if skill_element_include?(@skill, ELEMENT_NAME_HP_COST)
  404. # HPが足りるか判定
  405. if @active_battler.hp <= @skill.sp_cost
  406. # 足りない場合
  407. # ステップ 1 に移行
  408. @phase4_step = 1
  409. return
  410. end
  411. # SP消費分のSPを回復させて擬似的にSPを減らさない(最大値を超えて回復)
  412. @active_battler.hp0_ban = true
  413. @active_battler.sp += @skill.sp_cost
  414. # 戻す
  415. xrxs19_make_skill_action_result
  416. # HPを消費
  417. @active_battler.hp -= @skill.sp_cost
  418. # HP/SPの制限の解除
  419. @active_battler.hp0_ban = false
  420. return
  421. end
  422. end
  423. xrxs19_make_skill_action_result
  424. ##追加
  425. make_cover_skill_action_result()
  426. end
  427. #--------------------------------------------------------------------------
  428. # ● フレーム更新 (メインフェーズ ステップ 3 : 行動側アニメーション)
  429. #--------------------------------------------------------------------------
  430. alias xrxs19_update_phase4_step3 update_phase4_step3
  431. def update_phase4_step3
  432. # 既に一回以上行動している場合
  433. if @phase4_act_continuation >= 1
  434. # ステップ 4 に移行
  435. @phase4_step = 4
  436. @wait_count = 0
  437. return
  438. end
  439. xrxs19_update_phase4_step3
  440. # ちからためメッセージ表示。
  441. for target in @target_battlers
  442. if !target.action_message.nil?
  443. @help_window.set_text(target.action_message, 1)
  444. target.action_message = nil
  445. end
  446. end
  447. end
  448. #--------------------------------------------------------------------------
  449. # ● フレーム更新 (メインフェーズ ステップ 4 : 対象側アニメーション)
  450. #--------------------------------------------------------------------------
  451. alias xrxs19_update_phase4_step4 update_phase4_step4
  452. def update_phase4_step4
  453. # 武器投擲時、「武器のアニメーション」を対象に使う
  454. if skill_element_include?(@skill, "武器投掷")
  455. @animation2_id = $data_weapons[@active_battler.current_action.basic].animation2_id
  456. end
  457. # ゴールドウィンドウを更新
  458. @gold_window.refresh if @gold_window != nil
  459. if skill_element_include?(@skill, "变身")
  460. tb_array = @target_battlers
  461. @target_battlers = [@active_battler]
  462. xrxs19_update_phase4_step4
  463. @target_battlers = tb_array
  464. else
  465. xrxs19_update_phase4_step4
  466. end
  467. # かばわれたメンバーのアニメーション
  468. for target in @target_battlers
  469. if target.current_friend != nil
  470. target.current_friend.animation_id = COVER_ANIMATION_ID
  471. end
  472. end
  473. # 既に一回以上行動している場合
  474. if @phase4_act_continuation >= 1
  475. @wait_count = 0
  476. end
  477. end
  478. #--------------------------------------------------------------------------
  479. # ● フレーム更新 (メインフェーズ ステップ 5 : ダメージ表示)
  480. #--------------------------------------------------------------------------
  481. alias xrxs19_update_phase4_step5 update_phase4_step5
  482. def update_phase4_step5
  483. # 呼び戻す
  484. xrxs19_update_phase4_step5
  485. # かばわれたメンバーのダメージ
  486. for target in @target_battlers
  487. if target.current_friend != nil
  488. target.current_friend.damage_pop = true
  489. #かばっている状態の初期化
  490. target.current_friend = nil
  491. end
  492. end
  493. # 生存確認
  494. target_still_left = false
  495. for target in @target_battlers
  496. # ターゲットが生き残っているか判別
  497. target_still_left = true if !target.dead?
  498. # 戦闘不能時で、変身を解除
  499. if target.dead? and target.metamor_target != nil
  500. target.animation_id = 17 # 戦闘不能変身解除時のアニメーションID
  501. target.animation_hit = true
  502. target.battler_name = target.battler_name_original
  503. target.metamor_target = nil
  504. end
  505. end
  506. # ダメージ表示
  507. if @active_battler.damage != nil
  508. @active_battler.damage_pop = true
  509. end
  510. # 変身対象のバトラーグラフィックをコピー
  511. if skill_element_include?(@skill, "变身")
  512. if @active_battler.metamor_target != nil
  513. @active_battler.battler_name = @active_battler.metamor_target.battler_name
  514. else
  515. @active_battler.battler_name = @active_battler.battler_name_original
  516. end
  517. end
  518. # ターゲットの敵への処理
  519. for target in @target_battlers
  520. # スティール結果メッセージ表示。ただし、複数ターゲットの表示は不可能
  521. if !target.effect_message.nil?
  522. @help_window.set_text(target.effect_message, 1)
  523. target.effect_message = nil
  524. end
  525. end
  526. # 行動した回数のカウントを 1 加算
  527. @phase4_act_continuation += 1
  528. # 実行済み行動回数が、指定行動回数に達したかを判別
  529. if @phase4_act_continuation < @phase4_act_times_max
  530. # 達していない場合
  531. # 生存している場合、続ける。
  532. if target_still_left
  533. # 指定行動回数に満たない場合は繰り返す為、ステップ 2 に移行
  534. @phase4_step = 2
  535. @wait_count = 0
  536. # スキル使用中の場合はヘルプウィンドウを隠すのをやめる
  537. if @active_battler.current_action.kind == 1
  538. @help_window.visible = true
  539. end
  540. end
  541. else
  542. # 達した場合
  543. # 敵が生存、かつ skillが"派生"属性を持つ場合
  544. if target_still_left and
  545. (skill_element_include?(@skill, ELEMENT_NAME_DERIVER) or
  546. (@weapon_id != nil and equip_weapon_element_include?(@active_battler, ELEMENT_NAME_DERIVER)))
  547. if @one.to_i > 0
  548. # 回数をリセット
  549. @phase4_act_continuation = 0
  550. @phase4_act_times_max = 1
  551. # 武器攻撃ではなくなるため @weapon_id を nil 化
  552. @weapon_id = nil
  553. # 新しいスキルID
  554. @active_battler.current_action.kind = 1
  555. @active_battler.current_action.skill_id = @one.to_i
  556. # ステップ 2 に移行
  557. @phase4_step = 2
  558. @wait_count = 0
  559. end
  560. end
  561. end
  562. # ゴールドウィンドウを隠す
  563. @gold_window.visible = false if @gold_window != nil
  564. end
  565. #--------------------------------------------------------------------------
  566. # ● フレーム更新 (メインフェーズ ステップ 6 : リレイズ表示→リフレッシュ)
  567. #--------------------------------------------------------------------------
  568. alias xrxs19_update_phase4_step6 update_phase4_step6
  569. def update_phase4_step6
  570. next_phase_ok = true
  571. #リレイズ判定
  572. for enemy in $game_troop.enemies
  573. next_phase_ok = update_reraise_effect(enemy)
  574. if !next_phase_ok
  575. return
  576. end
  577. end
  578. for actor in $game_party.actors
  579. next_phase_ok = update_reraise_effect(actor)
  580. if !next_phase_ok
  581. return
  582. end
  583. end
  584. if next_phase_ok
  585. xrxs19_update_phase4_step6
  586. end
  587. end
  588. #===================================================
  589. #リレイズエフェクト
  590. #===================================================
  591. def update_reraise_effect(battler)
  592. if battler.reraised
  593. case battler.reraise_state
  594. when 0
  595. battler.reraise_state = 1 # コラプス待ち
  596. @wait_count = 16
  597. return false
  598. when 1
  599. battler.reraise_state = 2 # 復活アニメーション
  600. ##IDは好きなアニメーションIDを指定
  601. battler.animation_id = RERAISE_ANIMATION_ID
  602. @wait_count = 8
  603. return false#
  604. when 2
  605. #復活処理
  606. battler.hp = battler.maxhp * RERAISE_HP_PERCENT / 100 + RERAISE_HP
  607. battler.reraise_state = 3 #アピアーアニメーション
  608. @wait_count = 8
  609. return false#
  610. when 3
  611. battler.reraise_state = 0 #終了?通常処理に戻る
  612. battler.reraised = false #フラグを初期値へ
  613. @status_window.refresh
  614. return true
  615. end
  616. else
  617. return true
  618. end
  619. end
  620. #--------------------------------------------------------------------------
  621. # ● アフターバトルフェーズ開始
  622. #--------------------------------------------------------------------------
  623. alias xrxs19_update_phase5 update_phase5
  624. def update_phase5
  625. next_phase_ok = false
  626. # 次のアクターへ
  627. @phase5_i = -1 if @phase5_i == nil
  628. @phase5_i += 1
  629. if @phase5_i < $game_party.actors.size
  630. actor = $game_party.actors[@phase5_i]
  631. # 変身状態の味方がいるか判別し、それを解除する
  632. if actor.metamor_target != nil
  633. actor.animation_id = 17 # 戦闘終了変身解除時のアニメーションID
  634. actor.animation_hit = true
  635. actor.battler_name = actor.battler_name_original
  636. actor.metamor_target = nil
  637. # ステータスウィンドウをリフレッシュ
  638. @status_window.refresh
  639. # アニメーションの長さにかかわらず、最低 4 フレーム待つ
  640. @wait_count = 4
  641. end
  642. else
  643. next_phase_ok = true
  644. end
  645. if next_phase_ok
  646. xrxs19_update_phase5
  647. end
  648. end
  649. #--------------------------------------------------------------------------
  650. # ● 行動順序作成
  651. #--------------------------------------------------------------------------
  652. alias xrxs19_make_action_orders make_action_orders
  653. def make_action_orders
  654. xrxs19_make_action_orders
  655. # 優先度の大きい順 (同値の場合は素早さの速い順) に並び替え
  656. @action_battlers.sort! do |a, b|
  657. if a.current_action.speed_priority > b.current_action.speed_priority
  658. -1
  659. elsif a.current_action.speed_priority < b.current_action.speed_priority
  660. +1
  661. elsif a.current_action.speed > b.current_action.speed
  662. -1
  663. elsif a.current_action.speed < b.current_action.speed
  664. +1
  665. else
  666. 0 # a <=> b
  667. end
  668. end
  669. end
  670. #--------------------------------------------------------------------------
  671. # ● バトル終了
  672. #--------------------------------------------------------------------------
  673. alias xrxs19_battle_end battle_end
  674. def battle_end(result)
  675. for i in 0...$game_party.actors.size
  676. actor = $game_party.actors[i]
  677. # 変身状態の味方がいるか判別し、それを解除する
  678. if actor.metamor_target != nil
  679. actor.battler_name = actor.battler_name_original
  680. actor.metamor_target = nil
  681. end
  682. end
  683. xrxs19_battle_end(result)
  684. end
  685. end
  686. #=============================================================================
  687. # ◇ スティール
  688. #=============================================================================
  689. class Game_Battler
  690. #--------------------------------------------------------------------------
  691. # ● 公開インスタンス変数
  692. #--------------------------------------------------------------------------
  693. attr_accessor :effect_message
  694. #--------------------------------------------------------------------------
  695. # ● オブジェクト初期化
  696. #--------------------------------------------------------------------------
  697. alias before_steal_original_battler_initialize initialize
  698. def initialize
  699. before_steal_original_battler_initialize()
  700. @effect_message = nil
  701. @steal_skill_id = $data_system.elements.index(STEAL_SKILL_ELEMENT_NAME)
  702. end
  703. end
  704. class Game_Enemy < Game_Battler
  705. #--------------------------------------------------------------------------
  706. # ● オブジェクト初期化
  707. #--------------------------------------------------------------------------
  708. alias before_steal_original_enemy_initialize initialize
  709. def initialize(troop_id, member_index)
  710. before_steal_original_enemy_initialize(troop_id, member_index)
  711. @item_possession = true
  712. end
  713. #===================================================
  714. #
  715. #===================================================
  716. def name
  717. name = $data_enemies[@enemy_id].name.split(/-/)[0]
  718. if !name.nil?
  719. return name = name.strip()
  720. else
  721. return ''
  722. end
  723. end
  724. #===================================================
  725. #ノーマルアイテムの指定 
  726. #エネミーネームに -n種類 ID 個数(-na 10 10) と入れて指定。
  727. #種類は、i(アイテム) w(武器) a(防具)のいずれか一つ
  728. #個数は省略可能、自動で1扱い。
  729. #また、ドロップアイテムと同一にしたい場合は
  730. #エネミーネームに -nd 個数(-nd 2) と入れて指定。
  731. #個数は省略可能、自動で1扱い。
  732. #===================================================
  733.  
  734. def normal_item
  735. return get_item_from_name("n")#オプション"n"の文字列から取得
  736. end
  737.  
  738. #===================================================
  739. #レアアイテムの指定 
  740. #エネミーネームに -r種類 ID 個数(-na 10 10) と入れて指定。
  741. #種類は、i(アイテム) w(武器) a(防具)のいずれか一つ
  742. #個数は省略可能、自動で1扱い。
  743. #また、ドロップアイテムと同一にしたい場合は
  744. #エネミーネームに -rd 個数(-nd 2) と入れて指定。
  745. #個数は省略可能、自動で1扱い。
  746. #===================================================
  747.  
  748. def rare_item
  749. return get_item_from_name("r")#オプション"r"の文字列から取得
  750. end
  751.  
  752. #===================================================
  753. #*Nameからアイテムを抜き出す処理
  754. #===================================================
  755. def get_item_from_name(opt)
  756. names = $data_enemies[@enemy_id].name.split(/-/)
  757. if names.size > 1
  758. for i in 1...names.size
  759. if names[i][0,1] != opt
  760. next
  761. end
  762.  
  763. names[i].sub!(/^.(.*)/){$1}
  764. ary = names[i].split(/ /)
  765.  
  766. if ary[0][0,1] == "g"
  767. cgy = "g"
  768. id = 0
  769. if ary[1].nil?
  770. ary[1] = "1"
  771. elsif ary[1].sub!(/^([0-9]+)/){$1}.nil?
  772. ary[1] = "1"
  773. end
  774. possession = {"Category"=>cgy, "ID"=>id, "Num"=>ary[1].to_i}
  775. return possession
  776.  
  777. elsif ary[0][0,1] == "d"
  778. cgy = ""
  779. id = 0
  780. if self.item_id != 0
  781. cgy = "i"
  782. id = self.item_id
  783. elsif self.weapon_id != 0
  784. cgy = "w"
  785. id = self.weapon_id
  786. elsif self.armor_id != 0
  787. cgy = "a"
  788. id = self.armor_id
  789. else
  790. return nil
  791. end
  792.  
  793. if ary[1].nil?
  794. ary[1] = "1"
  795. elsif ary[1].sub!(/^([0-9]+)/){$1}.nil?
  796. ary[1] = "1"
  797. end
  798. possession = {"Category"=>cgy, "ID"=>id, "Num"=>ary[1].to_i}
  799. return possession
  800.  
  801. elsif !ary[0].sub!(/^([iwa])/){$1}.nil? && !ary[1].sub!(/^([0-9]+)/){$1}.nil?
  802. if ary[2].nil? || ary[2].sub!(/^([0-9]+)/){$1}.nil?
  803. ary[2] = "1"
  804. end
  805. possession = {"Category"=>ary[0], "ID"=>ary[1].to_i, "Num"=>ary[2].to_i}
  806. return possession
  807.  
  808. end
  809. end
  810. end
  811. return nil
  812. end
  813.  
  814. #===================================================
  815. #スティールエフェクト
  816. #===================================================
  817.  
  818. def steal_effect(user, skill) # 引数skillを追加
  819.  
  820. pos = self.normal_item
  821.  
  822. if !@item_possession || pos.nil?
  823. @effect_message = "对方身上没东西了。"
  824. #self.damage = "偷窃失败"
  825. return false
  826. end
  827.  
  828. #盗み成功判定 アジリティが同一で50%、2倍で100%
  829. if rand(100) <= ((user.agi+0.01)/(self.agi+0.01))*100/2
  830. r_pos = self.rare_item
  831. #レアアイテム判定
  832. if !r_pos.nil? && rand(10) <= 1
  833. pos = r_pos
  834. end
  835.  
  836. case pos["Category"]
  837. when "i"
  838. item = $data_items[pos["ID"]]
  839. if item.nil?
  840. print "这个物品不存在!"
  841. return false
  842. end
  843. $game_party.gain_item(item.id, pos["Num"])
  844. when "w"
  845. item = $data_weapons[pos["ID"]]
  846. if item.nil?
  847. print "这个物品不存在!"
  848. return false
  849. end
  850. $game_party.gain_weapon(item.id, pos["Num"])
  851. when "a"
  852. item = $data_armors[pos["ID"]]
  853. if item.nil?
  854. print "这个物品不存在!"
  855. return false
  856. end
  857. $game_party.gain_armor(item.id, pos["Num"])
  858. when "g"
  859. # ゴールド獲得
  860. $game_party.gain_gold(pos["Num"])
  861. end
  862.  
  863. if pos["Category"] == "g"
  864. @effect_message = "#{pos["Num"]}#{$data_system.words.gold}偷到!"
  865. else
  866. @effect_message = "#{item.name}#{pos["Num"]}个偷到!"
  867. end
  868. @item_possession = false
  869.  
  870. self.damage = "偷窃成功!" if self.damage == "偷窃失败"
  871. return true
  872. else
  873. @effect_message = "对方身上没东西了???"
  874. #self.damage = "偷窃失败
  875. return false
  876. end
  877.  
  878. return false # 念のためfalse返す処理追加
  879. # 多分なくてもifの結果(false)が返ると思うけど…
  880. end
  881. end


RUBY 代码复制
  1. #=============================================================================
  2. # ■ ライブラ スキル実装スクリプト 2004/09/24 - 0.1α
  3. #=============================================================================
  4. class Game_Battler
  5. #--------------------------------------------------------------------------
  6. # ● 追加公開インスタンス変数
  7. #--------------------------------------------------------------------------
  8. attr_accessor :libla_reserve # ライブラ予約
  9. #--------------------------------------------------------------------------
  10. # ● 初期化
  11. #--------------------------------------------------------------------------
  12. alias before_libra_initialize initialize
  13.  
  14. def initialize
  15. before_libra_initialize
  16. # 「ライブラ」属性のID取得
  17. @libra_element_id = $data_system.elements.index(LIBLA_SKILL_ELEMENT_NAME)
  18. @libra_element_id = 0 if @libra_element_id.nil?
  19. # 今回の行動フェイズでライブラを受けたかどうかフラグ、初期化
  20. @libla_reserve = false
  21. end
  22. #--------------------------------------------------------------------------
  23. # ● スキルの効果適用
  24. # user : 使用者 (バトラー)
  25. # skill: スキル
  26. #--------------------------------------------------------------------------
  27. alias before_libra_skill_effect skill_effect
  28. def skill_effect(user, skill)
  29. #「ライブラ」スキルかどうかの判定。
  30. if skill.element_set.include?(@libra_element_id)
  31. # 命中率を適用する場合は下のif文のコメントを外してください
  32. #if rand(100) < skill.hit
  33. # このバトラーがエネミーなら情報ウィンドウを表示する
  34. if self.is_a?(Game_Enemy)
  35. self.libla_reserve = true
  36. end
  37. # 命中率を適用する場合は下のelse~endのコメントを外してください
  38. #else
  39. # self.damage = "Miss"
  40. #end
  41. # 普通のスキル判定は行わない。
  42. return true
  43. else
  44. return before_libra_skill_effect(user, skill)
  45. end
  46. end
  47. end
  48. #==============================================================================
  49. # ■ Scene_Battle
  50. #==============================================================================
  51. class Scene_Battle
  52. #--------------------------------------------------------------------------
  53. # ● フレーム更新 (メインフェーズ ステップ 5 : ダメージ表示)
  54. #--------------------------------------------------------------------------
  55. alias before_libra_update_phase4_step5 update_phase4_step5
  56. def update_phase4_step5
  57. # ダメージ表示
  58. for target in @target_battlers
  59. if target.libla_reserve
  60. libra_window = Window_EnemyStatus.new(target)
  61. loop do
  62. # ゲーム画面を更新
  63. Graphics.update
  64. # 入力情報を更新
  65. Input.update
  66. # ボタンが押されたら情報ウィンドウを閉じてループを中断
  67. if Input.trigger?(Input::C) or Input.trigger?(Input::B)
  68. libra_window.dispose
  69. libra_window = nil
  70. break
  71. end
  72. end
  73. end
  74. # ライブラ予約フラグを解除
  75. target.libla_reserve = false
  76. end
  77. before_libra_update_phase4_step5
  78. end
  79. end
  80. #==============================================================================
  81. # ■ Window_EnemyStatus
  82. #------------------------------------------------------------------------------
  83. #  エネミーのステータスを表示するステータスウィンドウです。
  84. #==============================================================================
  85. class Window_EnemyStatus < Window_Base
  86. #--------------------------------------------------------------------------
  87. # ● オブジェクト初期化
  88. # enemy : エネミー
  89. #--------------------------------------------------------------------------
  90. def initialize(enemy)
  91. super(0, 64, 640, 256)
  92. self.contents = Bitmap.new(width - 32, height - 32)
  93. self.back_opacity = 127
  94. @enemy = enemy
  95. refresh
  96. end
  97. #--------------------------------------------------------------------------
  98. # ● リフレッシュ
  99. #--------------------------------------------------------------------------
  100. def refresh
  101. self.contents.clear
  102. draw_enemy_name(@enemy, 4, 0)
  103. draw_enemy_state(@enemy, 4, 48)
  104. draw_enemy_hp(@enemy,196, 48, 172)
  105. draw_enemy_sp(@enemy,196, 72, 172)
  106. draw_enemy_parameter(@enemy, 4, 120, 0)
  107. draw_enemy_parameter(@enemy, 4, 144, 1)
  108. draw_enemy_parameter(@enemy, 4, 168, 2)
  109. draw_enemy_parameter(@enemy, 4, 192, 7)
  110. draw_enemy_parameter(@enemy,196, 120, 3)
  111. draw_enemy_parameter(@enemy,196, 144, 4)
  112. draw_enemy_parameter(@enemy,196, 168, 5)
  113. draw_enemy_parameter(@enemy,196, 192, 6)
  114. self.contents.font.color = system_color
  115. self.contents.draw_text(384, 24, 80, 32, "EXP")
  116. self.contents.draw_text(384, 48, 80, 32, "金钱")
  117. self.contents.draw_text(384, 96, 96, 32, "战利品")
  118. self.contents.draw_text(384, 144, 96, 32, "偷窃物")
  119. self.contents.font.color = normal_color
  120. self.contents.draw_text(384 + 80, 24, 84, 32, @enemy.exp.to_s, 2)
  121. self.contents.draw_text(384 + 80, 48, 84, 32, @enemy.gold.to_s, 2)
  122. draw_item_name(get_enemy_item(@enemy,1), 384 + 16, 120)
  123. draw_item_name(get_enemy_item(@enemy,2), 384 + 16, 168)
  124. draw_item_name(get_enemy_item(@enemy,3), 384 + 16, 192)
  125. end
  126. #--------------------------------------------------------------------------
  127. # ○ アイテムの取得
  128. #--------------------------------------------------------------------------
  129. def get_enemy_item( enemy, type )
  130. case type
  131. when 1:
  132. if enemy.item_id != nil and enemy.item_id != 0
  133. return $data_items[enemy.item_id]
  134. elsif enemy.weapon_id != nil and enemy.weapon_id != 0
  135. return $data_weapons[enemy.weapon_id]
  136. elsif enemy.armor_id != nil and enemy.armor_id != 0
  137. return $data_armors[enemy.armor_id]
  138. else
  139. return nil
  140. end
  141. when 2:
  142. info = enemy.get_item_from_name("n")
  143. return nil if info == nil
  144. case info["Category"]
  145. when "i"
  146. return $data_items[info["ID"]]
  147. when "w"
  148. return $data_weapons[info["ID"]]
  149. when "a"
  150. return $data_armors[info["ID"]]
  151. otherwise
  152. return nil
  153. end
  154. when 3:
  155. info = enemy.get_item_from_name("r")
  156. return nil if info == nil
  157. case info["Category"]
  158. when "i"
  159. return $data_items[info["ID"]]
  160. when "w"
  161. return $data_weapons[info["ID"]]
  162. when "a"
  163. return $data_armors[info["ID"]]
  164. otherwise
  165. return nil
  166. end
  167. otherwise
  168. return nil
  169. end
  170. end
  171. #--------------------------------------------------------------------------
  172. # ● 名前の描画
  173. # enemy : エネミー
  174. # x : 描画先 X 座標
  175. # y : 描画先 Y 座標
  176. #--------------------------------------------------------------------------
  177. def draw_enemy_name(enemy, x, y)
  178. self.contents.font.color = normal_color
  179. self.contents.draw_text(x, y, 120, 32, enemy.name)
  180. end
  181. #--------------------------------------------------------------------------
  182. # ● ステートの描画
  183. # enemy : エネミー
  184. # x : 描画先 X 座標
  185. # y : 描画先 Y 座標
  186. # width : 描画先の幅
  187. #--------------------------------------------------------------------------
  188. def draw_enemy_state(enemy, x, y, width = 120)
  189. text = make_battler_state_text(enemy, width, true)
  190. self.contents.font.color = enemy.hp == 0 ? knockout_color : normal_color
  191. self.contents.draw_text(x, y, width, 32, text)
  192. end
  193. #--------------------------------------------------------------------------
  194. # ● HP の描画
  195. # enemy : エネミー
  196. # x : 描画先 X 座標
  197. # y : 描画先 Y 座標
  198. # width : 描画先の幅
  199. #--------------------------------------------------------------------------
  200. def draw_enemy_hp(enemy, x, y, width = 144)
  201. # 文字列 "HP" を描画
  202. self.contents.font.color = system_color
  203. self.contents.draw_text(x, y, 32, 32, $data_system.words.hp)
  204. # MaxHP を描画するスペースがあるか計算
  205. if width - 32 >= 108
  206. hp_x = x + width - 108
  207. flag = true
  208. elsif width - 32 >= 48
  209. hp_x = x + width - 48
  210. flag = false
  211. end
  212. # HP を描画
  213. self.contents.font.color = enemy.hp == 0 ? knockout_color :
  214. enemy.hp <= enemy.maxhp / 4 ? crisis_color : normal_color
  215. self.contents.draw_text(hp_x, y, 48, 32, enemy.hp.to_s, 2)
  216. # MaxHP を描画
  217. if flag
  218. self.contents.font.color = normal_color
  219. self.contents.draw_text(hp_x + 48, y, 12, 32, "/", 1)
  220. self.contents.draw_text(hp_x + 60, y, 48, 32, enemy.maxhp.to_s)
  221. end
  222. end
  223. #--------------------------------------------------------------------------
  224. # ● SP の描画
  225. # enemy : エネミー
  226. # x : 描画先 X 座標
  227. # y : 描画先 Y 座標
  228. # width : 描画先の幅
  229. #--------------------------------------------------------------------------
  230. def draw_enemy_sp(enemy, x, y, width = 144)
  231. # 文字列 "SP" を描画
  232. self.contents.font.color = system_color
  233. self.contents.draw_text(x, y, 32, 32, $data_system.words.sp)
  234. # MaxSP を描画するスペースがあるか計算
  235. if width - 32 >= 108
  236. sp_x = x + width - 108
  237. flag = true
  238. elsif width - 32 >= 48
  239. sp_x = x + width - 48
  240. flag = false
  241. end
  242. # SP を描画
  243. self.contents.font.color = enemy.sp == 0 ? knockout_color :
  244. enemy.sp <= enemy.maxsp / 4 ? crisis_color : normal_color
  245. self.contents.draw_text(sp_x, y, 48, 32, enemy.sp.to_s, 2)
  246. # MaxSP を描画
  247. if flag
  248. self.contents.font.color = normal_color
  249. self.contents.draw_text(sp_x + 48, y, 12, 32, "/", 1)
  250. self.contents.draw_text(sp_x + 60, y, 48, 32, enemy.maxsp.to_s)
  251. end
  252. end
  253. #--------------------------------------------------------------------------
  254. # ● パラメータの描画
  255. # enemy : エネミー
  256. # x : 描画先 X 座標
  257. # y : 描画先 Y 座標
  258. # type : パラメータの種類 (0~6)
  259. #--------------------------------------------------------------------------
  260. def draw_enemy_parameter(enemy, x, y, type)
  261. case type
  262. when 0
  263. parameter_name = $data_system.words.atk
  264. parameter_value = enemy.atk
  265. when 1
  266. parameter_name = $data_system.words.pdef
  267. parameter_value = enemy.pdef
  268. when 2
  269. parameter_name = $data_system.words.mdef
  270. parameter_value = enemy.mdef
  271. when 3
  272. parameter_name = $data_system.words.str
  273. parameter_value = enemy.str
  274. when 4
  275. parameter_name = $data_system.words.dex
  276. parameter_value = enemy.dex
  277. when 5
  278. parameter_name = $data_system.words.agi
  279. parameter_value = enemy.agi
  280. when 6
  281. parameter_name = $data_system.words.int
  282. parameter_value = enemy.int
  283. when 7
  284. parameter_name = "回避"
  285. parameter_value = enemy.eva
  286. end
  287. self.contents.font.color = system_color
  288. self.contents.draw_text(x, y, 120, 32, parameter_name)
  289. self.contents.font.color = normal_color
  290. self.contents.draw_text(x + 120, y, 36, 32, parameter_value.to_s, 2)
  291. end
  292. end
  293. #=============================================================================
  294. # ◇ ちからため スキル実装スクリプト by 和希
  295. #=============================================================================
  296. class Game_Battler
  297. #--------------------------------------------------------------------------
  298. # ● 追加公開インスタンス変数
  299. #--------------------------------------------------------------------------
  300. attr_accessor :powerstock # 「ちからため」回数
  301. attr_accessor :action_message # ヘルプウィンドウに表示する文字
  302. #--------------------------------------------------------------------------
  303. # ● 初期化
  304. #--------------------------------------------------------------------------
  305. alias before_powerstock_original_initialize initialize
  306. def initialize
  307. before_powerstock_original_initialize
  308. @powerstock = 0
  309. @powerstock_skill_id = $data_system.elements.index(POWERSTOCK_SKILL_ELEMENT_NAME)
  310. @powerstock_skill_id = 0 if @powerstock_skill_id == nil
  311. @effect_message = nil
  312. end
  313. #--------------------------------------------------------------------------
  314. # ● 通常攻撃の効果適用
  315. # attacker : 攻撃者 (バトラー)
  316. #--------------------------------------------------------------------------
  317. alias before_powerstock_original_attack_effect attack_effect
  318. def attack_effect(attacker)
  319. # 攻撃者が「ちからため」しているか?
  320. if attacker.powerstock > 0
  321. bool_powerstock = true
  322. # 攻撃者の力を一時的に上昇させる
  323. stock_attacker_str = attacker.str
  324. attacker.str += ( stock_attacker_str * POWERSTOCK_BASE_RATE * attacker.powerstock ).to_i
  325. # ヘルプメッセージに「ちからためx?」を出す
  326. @action_message = POWERSTOCK_SKILL_ELEMENT_NAME
  327. @action_message += " x"
  328. @action_message += attacker.powerstock.to_s
  329. # ストックを消す
  330. attacker.powerstock = 0
  331. else
  332. bool_powerstock = false
  333. end
  334. # fukuyamaさん↓のミス発見ありがとうございました
  335. result = before_powerstock_original_attack_effect(attacker)
  336. # 力を上昇させていた場合、元に戻す
  337. if bool_powerstock
  338. attacker.str = stock_attacker_str
  339. end
  340. return result
  341. end
  342. #--------------------------------------------------------------------------
  343. # ● スキルの効果適用
  344. # user : 使用者 (バトラー)
  345. # skill: スキル
  346. #--------------------------------------------------------------------------
  347. alias before_powerstock_original_skill_effect skill_effect
  348. def skill_effect(user, skill)
  349. #「ちからため」スキルかどうかの判定。
  350. if skill.element_set.include?(@powerstock_skill_id)
  351. # 命中率を適用する場合は下のif文のコメントを外してください
  352. #if rand(100) < skill.hit
  353. @powerstock += 1 # 「ちからため」回数を1増やす
  354. # ダメージに"Charge"をセットする
  355. self.damage = "Charge"
  356. # 命中率を適用する場合は下のelse~endのコメントを外してください
  357. #else
  358. # self.damage = "Miss"
  359. #end
  360. # 普通のスキル判定は行わない。
  361. return true
  362. else
  363. return before_powerstock_original_skill_effect(user, skill)
  364. end
  365. end
  366. end
  367. #=============================================================================
  368. # ◇ 見切りステート by 和希
  369. #=============================================================================
  370. class Game_Battler
  371. # 見切りステートの名前
  372. ABANDONS_SKILL_STATE_NAME = "断念"
  373. #--------------------------------------------------------------------------
  374. # ● 通常攻撃の効果適用
  375. #--------------------------------------------------------------------------
  376. alias before_abandons_original_attack_effect attack_effect
  377.  
  378. def attack_effect(attacker)
  379. # 見切りステートが存在するか?
  380. if nil != (abandons_skill = get_abandons_id)
  381. # 見切りステートにかかっているか?
  382. if self.state?(abandons_skill)
  383. ## 避ける!
  384. # クリティカルフラグをクリア
  385. self.critical = false
  386. # ダメージに "Avoid!!" を設定
  387. self.damage = "Avoid!!"
  388. # 見切りステートを解除
  389. self.remove_state(abandons_skill,true)
  390. # メソッド終了
  391. return false
  392. end
  393. end
  394. # 見切りステート状態でなかった時は通常どおり
  395. return before_abandons_original_attack_effect(attacker)
  396. end
  397. #--------------------------------------------------------------------------
  398. # ● 見切りステータスのID取得
  399. #--------------------------------------------------------------------------
  400. def get_abandons_id
  401. result = nil
  402. if @abandons_status_id == nil
  403. for i in 1 ... $data_states.size
  404. if $data_states[i].name[/\A#{ABANDONS_SKILL_STATE_NAME}\Z/]
  405. result = $data_states[i].id
  406. break
  407. end
  408. end
  409. @abandons_status_id = ( result != nil ? result : 0 )
  410. elsif @abandons_status_id > 0
  411. result = @abandons_status_id
  412. end
  413. return result
  414. end
  415. end
  416. #=============================================================================
  417. # ◇ かばう by シムナフ
  418. #=============================================================================
  419. #==============================================================================
  420. # ■ Scene_Battle
  421. #==============================================================================
  422. class Scene_Battle
  423. #追加
  424. attr_reader :active_battler
  425. #ここまで
  426. ##新メソッド
  427. def make_cover_skill_action_result
  428. cover_num = 0
  429. cover_bool = false
  430. for i in @skill.element_set
  431. if !($data_system.elements[i][/^#{ELEMENT_NAME_COVER}/].nil?)
  432. cover_bool = true
  433. elm_num = $data_system.elements[i][/([+-]*[0-9]+)/]
  434. if !(elm_num.nil?)
  435. cover_num += elm_num.to_i
  436. end
  437. end
  438. end
  439.  
  440. if cover_bool.equal?(true)
  441. ##自分のみが対象だった場合は味方からランダムに1人をかばう
  442. if @target_battlers.include?(@active_battler)
  443. if @target_battlers.size == 1
  444. if @target_battlers[0].is_a?(Game_Actor)
  445. friends = $game_party.actors.dup
  446. friends.delete(@active_battler)
  447. @target_battlers = [friends[rand(friends.size)]]
  448. elsif @target_battlers[0].is_a?(Game_Enemy)
  449. friends = $game_troop.enemies.dup
  450. friends.delete(@active_battler)
  451. @target_battlers = [friends[rand(friends.size)]]
  452. end
  453. else
  454. @target_battlers.delete(@active_battler)
  455. end
  456. end
  457.  
  458. @active_battler.covered_friends = @target_battlers.dup
  459. @active_battler.add_state(get_cover_state_id())##ステート付加時にデフォルト回数で発動回数が設定される
  460. if (cover_num > 0)
  461. @active_battler.cover_remain = cover_num#発動回数が有った場合はその回数で上書き
  462. end
  463. for target in @target_battlers
  464. target.damage = COVER_EFFECT_CHAR
  465. end
  466. end
  467. end
  468. ##ここまで
  469. end
  470.  
  471. class Game_Party
  472. ##追加エイリアス
  473. include Cover_Module
  474. #--------------------------------------------------------------------------
  475. # ● 対象アクターのスムーズな決定
  476. # actor_index : アクターインデックス
  477. #--------------------------------------------------------------------------
  478.  
  479. alias before_cover_original_smooth_target_actor smooth_target_actor
  480.  
  481. def smooth_target_actor(actor_index)
  482. if $scene.is_a?(Scene_Battle)
  483. battler = $scene.active_battler()
  484. else
  485. battler = nil
  486. end
  487.  
  488. target = [before_cover_original_smooth_target_actor(actor_index)]
  489. get_target_battlers_after_cover!(target, battler)
  490.  
  491. return target[0]
  492. end
  493. ##ここまで
  494. end
  495.  
  496. class Game_Troop
  497. ##追加エイリアス
  498. include Cover_Module
  499. #--------------------------------------------------------------------------
  500. # ● 対象エネミーのスムーズな決定
  501. # enemy_index : エネミーインデックス
  502. #--------------------------------------------------------------------------
  503.  
  504. alias before_cover_original_smooth_target_enemy smooth_target_enemy
  505.  
  506. def smooth_target_enemy(enemy_index)
  507. if $scene.is_a?(Scene_Battle)
  508. battler = $scene.active_battler()
  509. else
  510. battler = nil
  511. end
  512.  
  513. target = [before_cover_original_smooth_target_enemy(enemy_index)]
  514. get_target_battlers_after_cover!(target, battler)
  515.  
  516. return target[0]
  517. end
  518. ##ここまで
  519. end
  520.  
  521.  
  522. #==============================================================================
  523. # ◇ 付加属性名称判定モジュール
  524. #==============================================================================
  525. module Check_ElementName_Set
  526. #--------------------------------------------------------------------------
  527. # ● スキルが指定名の属性を持つか判定
  528. #--------------------------------------------------------------------------
  529. def skill_element_include?(skill, element_name)
  530. @one = @two = nil
  531. return false if skill == nil or !skill.is_a?(RPG::Skill)
  532. for i in skill.element_set
  533. if $data_system.elements[i] =~ /#{element_name}([+-]?[0-9]+)?(%)?/
  534. @one = $1
  535. @two = $2
  536. return true
  537. end
  538. end
  539. return false
  540. end
  541. #--------------------------------------------------------------------------
  542. # ● アイテムが指定名の属性を持つか判定
  543. #--------------------------------------------------------------------------
  544. def item_element_include?(item, element_name)
  545. @one = @two = nil
  546. return false if item == nil or !item.is_a?(RPG::Item)
  547. for i in item.element_set
  548. if $data_system.elements[i] =~ /#{element_name}([+-]?[0-9]+)?(%)?/
  549. @one = $1
  550. @two = $2
  551. return true
  552. end
  553. end
  554. return false
  555. end
  556. #--------------------------------------------------------------------------
  557. # ● 武器が指定名の属性を持つか判定
  558. #--------------------------------------------------------------------------
  559. def weapon_element_include?(weapon_id, element_name)
  560. @one = @two = nil
  561. return false if weapon_id == nil or weapon_id <= 0
  562. for i in $data_weapons[weapon_id].element_set
  563. if $data_system.elements[i] =~ /#{element_name}([+-]?[0-9]+)?(%)?/
  564. @one = $1
  565. @two = $2
  566. return true
  567. end
  568. end
  569. return false
  570. end
  571. #--------------------------------------------------------------------------
  572. # ● 防具が指定名の属性を持つか判定
  573. #--------------------------------------------------------------------------
  574. def armor_element_include?(armor_id, element_name)
  575. @one = @two = nil
  576. return false if armor_id == nil or armor_id <= 0
  577. for i in $data_armors[armor_id].guard_element_set
  578. if $data_system.elements[i] =~ /#{element_name}([+-]?[0-9]+)?(%)?/
  579. @one = $1
  580. @two = $2
  581. return true
  582. end
  583. end
  584. return false
  585. end
  586. #--------------------------------------------------------------------------
  587. # ● 防具が指定名の属性を持つ場合その後に付く接尾テキストを取得
  588. #--------------------------------------------------------------------------
  589. def armor_element_suftext(armor_id, element_name)
  590. return nil if armor_id == nil or armor_id <= 0
  591. for i in $data_armors[armor_id].guard_element_set
  592. if $data_system.elements[i] =~ /#{element_name}(.*)/
  593. return $1
  594. end
  595. end
  596. return nil
  597. end
  598. #--------------------------------------------------------------------------
  599. # ● アクターが指定名の属性を持つ武器を装備しているかか判定
  600. #--------------------------------------------------------------------------
  601. def equip_weapon_element_include?(actor, element_name)
  602. @one = @two = nil
  603. return false if !actor.is_a?(Game_Actor)
  604. return false if actor.weapon_id == nil or actor.weapon_id <= 0
  605. bool = false
  606. one_total = 0
  607. for i in $data_weapons[actor.weapon_id].element_set
  608. if $data_system.elements[i] =~ /#{element_name}([+-]?[0-9]+)?(%)?/
  609. one_total += $1.to_i
  610. @two = $2
  611. bool = true
  612. end
  613. end
  614. # 武器管理システムXC.が導入されている場合
  615. if $xrxs24_weapon_property_system_work
  616. for i in [PROPERTY_ELEMENT_GRANT_1st, PROPERTY_ELEMENT_GRANT_2nd,
  617. PROPERTY_ELEMENT_GRANT_3rd, PROPERTY_ELEMENT_GRANT_4th]
  618. if $data_system.elements[actor.weapon_property[i]] =~ /#{element_name}([+-]?[0-9]+)?(%)?/
  619. one_total += $1.to_i
  620. @two = $2
  621. bool = true
  622. end
  623. end
  624. end
  625. @one = one_total
  626. return bool
  627. end
  628. #--------------------------------------------------------------------------
  629. # ● アクターが指定名の属性を持つ武器/防具を装備中か判定 数値の合計も保持
  630. #--------------------------------------------------------------------------
  631. def actor_element_equip?(actor, element_name)
  632. one_total = 0
  633. bool = false
  634. return false if !actor.is_a?(Game_Actor)
  635. weapon = $data_weapons[actor.weapon_id]
  636. armor1 = $data_armors[actor.armor1_id]
  637. armor2 = $data_armors[actor.armor2_id]
  638. armor3 = $data_armors[actor.armor3_id]
  639. armor4 = $data_armors[actor.armor4_id]
  640. if equip_weapon_element_include?(actor, element_name)
  641. one_total += @one.to_i
  642. bool = true
  643. end
  644. if armor_element_include?(armor1.id, element_name)
  645. one_total += @one.to_i
  646. bool = true
  647. end
  648. if armor_element_include?(armor2.id, element_name)
  649. one_total += @one.to_i
  650. bool = true
  651. end
  652. if armor_element_include?(armor3.id, element_name)
  653. one_total += @one.to_i
  654. bool = true
  655. end
  656. if armor_element_include?(armor4.id, element_name)
  657. one_total += @one.to_i
  658. bool = true
  659. end
  660. @one = one_total
  661. return bool
  662. end
  663. end
  664. #=============================================================================
  665. # ◇ かばうModule
  666. #=============================================================================
  667. ####以下新規追加Module
  668. module Cover_Module
  669. #--------------------------------------------------------------------------
  670. # ● かばう 後のターゲット配列生成
  671. #--------------------------------------------------------------------------
  672. def get_target_battlers_after_cover!(target_battlers, active_battler = nil)
  673. #HP割合の低い順にソート
  674. #target_battlers.sort_by!{|b| (b.hp.to_f/b.maxhp.to_f)}
  675. target_battlers.sort!{|a,b| (a.hp.to_f/a.maxhp.to_f) <=> (b.hp.to_f/b.maxhp.to_f)}
  676. #HP割合の多い順にソート
  677. actors = $game_party.actors.sort_by{|b| (b.hp.to_f/b.maxhp.to_f)}.reverse
  678. enemies = $game_troop.enemies.sort_by{|b| (b.hp.to_f/b.maxhp.to_f)}.reverse
  679.  
  680. for i in 0...target_battlers.size
  681. if target_battlers[i].is_a?(Game_Actor)
  682. for actor in actors
  683. new_target = get_target_after_cover(active_battler,target_battlers[i],actor)
  684. if !new_target.equal?(target_battlers[i]) && new_target.current_friend.nil? #かばう人がすでにかばっていた場合かばえない
  685. new_target.effect_message = "#{new_target.name}は#{target_battlers[i].name}をかばった!"
  686. new_target.current_friend = target_battlers[i]
  687. new_target.current_friend.damage = COVER_EFFECT_CHAR
  688. target_battlers[i] = new_target
  689. break
  690. end
  691. end
  692. end
  693.  
  694. if target_battlers[i].is_a?(Game_Enemy)
  695. for enemy in enemies
  696. new_target = get_target_after_cover(active_battler,target_battlers[i],enemy)
  697. if !new_target.equal?(target_battlers[i]) && new_target.current_friend.nil? #かばう人がすでにかばっていた場合かばえない
  698. new_target.effect_message = "#{new_target.name}は#{target_battlers[i].name}をかばった!"
  699. new_target.current_friend = target_battlers[i]
  700. new_target.current_friend.damage = COVER_EFFECT_CHAR
  701. target_battlers[i] = new_target
  702. break
  703. end
  704. end
  705. end
  706. end
  707. #ターゲット重複を排除する(かばった人が2度ダメージを受けない)
  708. target_battlers.uniq!()
  709. #「かばう」ステートの解除判定
  710. for target in target_battlers
  711. if !target.current_friend.nil?
  712. #かばう 残り回数がなくなった場合
  713. target.cover_remain -= 1
  714. if target.cover_remain <= 0
  715. target.remove_state(get_cover_state_id())
  716. target.cover_remain = 0
  717. end
  718. end
  719. end
  720. end
  721. #--------------------------------------------------------------------------
  722. # ● かばう の発動判定
  723. #--------------------------------------------------------------------------
  724. def get_target_after_cover(battler, target, coverer)
  725. #味方からのターゲットは庇わない
  726. if battler.is_a?(Game_Actor)
  727. if target.is_a?(Game_Actor)
  728. return target
  729. end
  730. end
  731. if battler.is_a?(Game_Enemy)
  732. if target.is_a?(Game_Enemy)
  733. return target
  734. end
  735. end
  736. #庇う人が動けない時は庇わない
  737. if !(coverer.movable? && coverer.exist?)
  738. return target
  739. end
  740. #庇う人が かばう のステートになっている時のみ
  741. if !coverer.state?(get_cover_state_id())
  742. return target
  743. end
  744. #ターゲットが既に他の人を庇っている時は無効
  745. if target.state?(get_cover_state_id())
  746. return target
  747. end
  748. #ターゲットと庇う人が同じの場合は無効
  749. if target.equal?(coverer)
  750. return target
  751. end
  752. #発動確率判定
  753. if !(rand(100) <= COVER_EFFECT_PERCENT)
  754. return taget
  755. end
  756. #ターゲットのHP割合判定
  757. if !(100.0*target.hp.to_f/target.maxhp.to_f <= COVER_HP_PERCENT)
  758. return target
  759. end
  760. #「かばっている味方配列」が空だったら、全ての味方を庇う
  761. if coverer.covered_friends.size.zero?
  762. return coverer
  763. else
  764. for covered_friend in coverer.covered_friends
  765. if target.equal?(covered_friend)
  766. return coverer
  767. end
  768. end
  769. end
  770. return target
  771. end
  772. #--------------------------------------------------------------------------
  773. # ● かばう のStateID
  774. #--------------------------------------------------------------------------
  775. def get_cover_state_id
  776. result = nil
  777. if @cover_status_id == nil
  778. for i in 1 ... $data_states.size
  779. if $data_states[i].name[/\A#{STATE_NAME_COVER}\Z/]
  780. result = $data_states[i].id
  781. break
  782. end
  783. end
  784. @cover_status_id = ( result != nil ? result : 0 )
  785. elsif @cover_status_id > 0
  786. result = @cover_status_id
  787. end
  788. return result
  789. end
  790. end
  791. ####Module End
  792. #//////////////////////////////////////////////////////////////////////////////
  793. # ◇ インクルード
  794. #//////////////////////////////////////////////////////////////////////////////
  795. module Check_ElementName_Set
  796. include Fixed_PropertyNumber if $xrxs24_weapon_property_system_work
  797. end
  798. class Game_Battler
  799. include Check_ElementName_Set
  800. include Cover_Module
  801. end
  802. class Window_Item < Window_Selectable
  803. include Check_ElementName_Set
  804. end
  805. class Scene_Battle
  806. include Check_ElementName_Set
  807. include Cover_Module
  808. end
  809. #==============================================================================
  810. # ◇ RPG::再定義「"SP "を含む場合SPダメージとして色を変更」
  811. #==============================================================================
  812. module RPG
  813. class Sprite < ::Sprite
  814. alias xrxs19_damage damage
  815. def damage(value, critical)
  816. if value.is_a?(String) and value.include?($data_system.words.sp)
  817. # 解放
  818. dispose_damage
  819. # 数値部分を抜き取る
  820. value = value.scan(/[+-]?[0-9]+/)[0].to_i
  821. # 表示文字列の設定
  822. damage_string = $data_system.words.sp + " " + value.abs.to_s
  823. # 描写
  824. bitmap = Bitmap.new(160, 48)
  825. bitmap.font.name = "黑体"
  826. bitmap.font.size = 32
  827. bitmap.font.color.set(0, 0, 0)
  828. bitmap.draw_text(-1, 12-1, 160, 36, damage_string, 1)
  829. bitmap.draw_text(+1, 12-1, 160, 36, damage_string, 1)
  830. bitmap.draw_text(-1, 12+1, 160, 36, damage_string, 1)
  831. bitmap.draw_text(+1, 12+1, 160, 36, damage_string, 1)
  832. if value < 0
  833. bitmap.font.color.set(128, 255, 255)
  834. else
  835. bitmap.font.color.set(255, 176, 144)
  836. end
  837. bitmap.draw_text(0, 12, 160, 36, damage_string, 1)
  838. if critical
  839. bitmap.font.size = 20
  840. bitmap.font.color.set(0, 0, 0)
  841. bitmap.draw_text(-1, -1, 160, 20, "CRITICAL", 1)
  842. bitmap.draw_text(+1, -1, 160, 20, "CRITICAL", 1)
  843. bitmap.draw_text(-1, +1, 160, 20, "CRITICAL", 1)
  844. bitmap.draw_text(+1, +1, 160, 20, "CRITICAL", 1)
  845. bitmap.font.color.set(255, 255, 255)
  846. bitmap.draw_text(0, 0, 160, 20, "CRITICAL", 1)
  847. end
  848. @_damage_sprite = ::Sprite.new(self.viewport)
  849. @_damage_sprite.bitmap = bitmap
  850. @_damage_sprite.ox = 80
  851. @_damage_sprite.oy = 20
  852. @_damage_sprite.x = self.x
  853. @_damage_sprite.y = self.y - self.oy / 2
  854. @_damage_sprite.z = 3000
  855. @_damage_duration = 40
  856. else
  857. # 通常時?戻す
  858. xrxs19_damage(value, critical)
  859. end
  860. end
  861. end
  862. end
  863.  
  864. #==============================================================================
  865. # 本脚本来自[url]www.66RPG.com[/url],使用和转载请保留此信息
  866. #==============================================================================





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