=begin ◆ Game_Character 及び Sprite_Character 強化 ( ある程度スクリプトを理解できる人向けです ) 最終更新:2008/02/12 【概要】 マップキャラクターにバトラーを関連付けたり、 Sprite_Battlerと同じように「ダメージポップ」「ループアニメ」「コラプス」などを 可能にします。 【使い方】 イベントコマンドの「スクリプト」で次のように記述します。 ● マップキャラクターにエネミーを関連付ける --------------------------------------- character_enemy(character_id, enemy_id) --------------------------------------- character_id : キャラクターID (0ならプレイヤー、1以上はイベントID) enemy_id : 関連付けるエネミーのID ※Game_Characterの公開インスタンス変数「battler」に格納されます。 ● マップキャラクターにアクターを関連付ける --------------------------------------- character_actor(character_id, actor_id) --------------------------------------- character_id : キャラクターID (0ならプレイヤー、1以上はイベントID) enemy_id : 関連付けるアクターのID ※Game_Characterの公開インスタンス変数「battler」に格納されます。 ● キャラクター逃走 ------------------------------ character_escape(character_id) ------------------------------ character_id : キャラクターID (0ならプレイヤー、1以上はイベントID) ● キャラクターループアニメーション ---------------------------------------------------- character_loop_animation(character_id, animation_id) ---------------------------------------------------- character_id : キャラクターID (0ならプレイヤー、1以上はイベントID) animation_id : アニメーションID ※ バトラーが関連付けられている場合はステートアニメが自動的に表示されます。 ● キャラクター明滅 ON -------------------------------- character_blink_on(character_id) -------------------------------- character_id : キャラクターID (0ならプレイヤー、1以上はイベントID) ● キャラクター明滅 OFF --------------------------------- character_blink_off(character_id) --------------------------------- character_id : キャラクターID (0ならプレイヤー、1以上はイベントID) ● キャラクター白フラッシュ ----------------------------------- character_white_flash(character_id) ----------------------------------- character_id : キャラクターID (0ならプレイヤー、1以上はイベントID) ● キャラクターダメージポップ -------------------------------------- character_damage(character_id, damage) -------------------------------------- character_id : キャラクターID (0ならプレイヤー、1以上はイベントID) damage : ポップさせるダメージ値。負なら回復色。 ※ バトラーが関連付けられている場合は実際にダメージが反映されます。 ● キャラクターコラプス -------------------------------------- character_collapse(character_id, type) -------------------------------------- character_id : キャラクターID (0ならプレイヤー、1以上はイベントID) type : タイプ (1 : エネミーコラプス, 2 : アクターコラプス) 省略した場合はエネミーコラプス。 ※ バトラーが関連付けられている場合、そのバトラーが戦闘不能になったときに 自動的にキャラクターがコラプスします。 ※ コラプス後、イベントの場合は「一時消去」されます。 ※ プレイヤーをコラプスさせた場合は「cancel_collapsed」で解除できます。 【 以下はバトラーが関連付けられているキャラクターに対して使用します 】 ● キャラクター HP 増減 ------------------------------------------------------ character_hp(character_id, value, permit_dead) ------------------------------------------------------ character_id : キャラクターID (0ならプレイヤー、1以上はイベントID) value : 増減値 permit_dead : 戦闘不能許可 (true : 許可, false : 不許可) 省略した場合は不許可。 ● キャラクター SP 増減 --------------------------------- character_sp(character_id, value) --------------------------------- character_id : キャラクターID (0ならプレイヤー、1以上はイベントID) value : 増減値 ● キャラクターステート付加 ------------------------------------------- character_add_state(character_id, state_id) ------------------------------------------- character_id : キャラクターID (0ならプレイヤー、1以上はイベントID) state_id : 付加するステートのID ● キャラクターステート解除 ---------------------------------------------- character_remove_state(character_id, state_id) ---------------------------------------------- character_id : キャラクターID (0ならプレイヤー、1以上はイベントID) state_id : 解除するステートのID ● キャラクター全回復 ----------------------------------- character_recover_all(character_id) ----------------------------------- character_id : キャラクターID (0ならプレイヤー、1以上はイベントID) =end #============================================================================== # ■ Game_Character #============================================================================== class Game_Character #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :hidden # 隠れフラグ attr_accessor :damage_pop # ダメージ表示フラグ attr_accessor :damage # ダメージ値 attr_accessor :critical # クリティカルフラグ attr_accessor :loop_animation_id # ループアニメーション ID attr_accessor :animation_hit # アニメーション ヒットフラグ attr_accessor :white_flash # 白フラッシュフラグ attr_accessor :blink # 明滅フラグ attr_accessor :collapse # コラプスフラグ attr_accessor :collapsed # コラプス済みフラグ attr_accessor :battler # バトラー #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- alias zenith_initialize initialize def initialize @damage_pop = false @damage = nil @critical = false @animation_hit = true @white_flash = false @blink = false @collapse = 0 @collapsed = false zenith_initialize end #-------------------------------------------------------------------------- # ● バトラーと関連付けられているか #-------------------------------------------------------------------------- def battler? return @battler != nil end #-------------------------------------------------------------------------- # ● バトラー戦闘不能処理 #-------------------------------------------------------------------------- def battler_dead # バトラーが関連付けられていなければ終了 unless battler? return end # 戦闘不能ならコラプス if @battler.dead? and not @collapsed if @battler.is_a?(Game_Enemy) @collapse = 1 else @collapse = 2 end elsif not @battler.dead? and @collapsed @collapsed = false end end #-------------------------------------------------------------------------- # ● バトラーステートアニメ処理 #-------------------------------------------------------------------------- def battler_state # バトラーが関連付けられていなければ終了 unless battler? return end # ステートアニメーション設定 @loop_animation_id = @battler.state_animation_id end #-------------------------------------------------------------------------- # ● バトラーステート付加 #-------------------------------------------------------------------------- def add_state(state_id) # バトラーが関連付けられていなければ終了 unless battler? return end # ステートを付加 @battler.add_state(state_id) # 継続 return true end #-------------------------------------------------------------------------- # ● バトラーステート解除 #-------------------------------------------------------------------------- def remove_state(state_id) # バトラーが関連付けられていなければ終了 unless battler? return end # ステートを解除 @battler.remove_state(state_id) # 継続 return true end #-------------------------------------------------------------------------- # ● バトラー全回復 #-------------------------------------------------------------------------- def recover_all # バトラーが関連付けられていなければ終了 unless battler? return end # 全回復 @battler.recover_all # 継続 return true end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- alias zenith_update update def update # 戦闘不能処理 battler_dead # バトラーステートアニメ処理 battler_state # 呼び戻す zenith_update end end #============================================================================== # ■ Sprite_Character #============================================================================== class Sprite_Character < RPG::Sprite #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- alias zenith_initialize initialize def initialize(viewport, character = nil, visible = true) @character_visible = visible zenith_initialize(viewport, character) end #-------------------------------------------------------------------------- # ● フレーム更新 (再定義) #-------------------------------------------------------------------------- def update super # タイル ID、ファイル名、色相のどれかが現在のものと異なる場合 if @tile_id != @character.tile_id or @character_name != @character.character_name or @character_hue != @character.character_hue # タイル ID とファイル名、色相を記憶 @tile_id = @character.tile_id @character_name = @character.character_name @character_hue = @character.character_hue # タイル ID が有効な値の場合 if @tile_id >= 384 self.bitmap = RPG::Cache.tile($game_map.tileset_name, @tile_id, @character.character_hue) self.src_rect.set(0, 0, 32, 32) self.ox = 16 self.oy = 32 # タイル ID が無効な値の場合 else self.bitmap = RPG::Cache.character(@character.character_name, @character.character_hue) @cw = bitmap.width / 4 @ch = bitmap.height / 4 self.ox = @cw / 2 self.oy = @ch end # コラプス済みまたは隠れ状態なら不透明度を 0 にする if @character.collapsed or @character.hidden self.opacity = 0 end end # コラプス済みイベントの場合 一時消去 if @character.collapsed and self.opacity == 0 and @character.is_a?(Game_Event) @character.erase end # アニメーション ID が現在のものと異なる場合 if @character.damage == nil and @character.loop_animation_id != @loop_animation_id @loop_animation_id = @character.loop_animation_id loop_animation($data_animations[@loop_animation_id]) end # 可視状態を設定 self.visible = (not @character.transparent) # グラフィックがキャラクターの場合 if @tile_id == 0 # 転送元の矩形を設定 sx = @character.pattern * @cw sy = (@character.direction - 2) / 2 * @ch self.src_rect.set(sx, sy, @cw, @ch) end # スプライトの座標を設定 self.x = @character.screen_x self.y = @character.screen_y self.z = @character.screen_z(@ch) # 不透明度、合成方法、茂み深さを設定 self.opacity = @character.opacity if @character_visible self.blend_type = @character.blend_type self.bush_depth = @character.bush_depth # 明滅 if @character.blink blink_on else blink_off end # 不可視の場合 unless @character_visible # 出現 if not @character.hidden and not @character.collapsed and (@character.damage == nil or @character.damage_pop) appear @character_visible = true end end # 可視の場合 if @character_visible # 逃走 if @character.hidden $game_system.se_play($data_system.escape_se) escape @character_visible = false end # 白フラッシュ if @character.white_flash whiten @character.white_flash = false end # アニメーション if @character.animation_id != 0 animation = $data_animations[@character.animation_id] animation(animation, @character.animation_hit) @character.animation_id = 0 end # ダメージ if @character.damage_pop damage(@character.damage, @character.critical) @character.damage = nil @character.critical = false @character.damage_pop = false end # コラプス if @character.damage == nil and @character.collapse > 0 if @character.collapse == 1 $game_system.se_play($data_system.enemy_collapse_se) else $game_system.se_play($data_system.actor_collapse_se) end collapse @character_visible = false @character.collapse = 0 @character.collapsed = true end end end end #============================================================================== # ■ Game_Enemy #============================================================================== class Game_Enemy < Game_Battler #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- alias zenith_initialize initialize def initialize(troop_id, member_index) if troop_id == 0 super() @enemy_id = member_index @hp = maxhp @sp = maxsp else zenith_initialize(troop_id, member_index) end end end #============================================================================== # ■ Interpreter #============================================================================== class Interpreter #-------------------------------------------------------------------------- # ● キャラクターエネミー設定 #-------------------------------------------------------------------------- def character_enemy(character_id, enemy_id) if character_id == 0 character = $game_player else character = $game_map.events[character_id] end # エネミー設定 character.battler = Game_Enemy.new(0, enemy_id) # 継続 return true end #-------------------------------------------------------------------------- # ● キャラクターアクター設定 #-------------------------------------------------------------------------- def character_actor(character_id, actor_id) if character_id == 0 character = $game_player else character = $game_map.events[character_id] end # エネミー設定 character.battler = $game_actors[actor_id] # 継続 return true end #-------------------------------------------------------------------------- # ● キャラクター逃走 #-------------------------------------------------------------------------- def character_escape(character_id) if character_id == 0 character = $game_player else character = $game_map.events[character_id] end # 逃走 character.hidden = true # 継続 return true end #-------------------------------------------------------------------------- # ● キャラクターループアニメーション #-------------------------------------------------------------------------- def character_loop_animation(character_id, animation_id) if character_id == 0 character = $game_player else character = $game_map.events[character_id] end # ループアニメーション character.loop_animation_id = animation_id # 継続 return true end #-------------------------------------------------------------------------- # ● キャラクター明滅 ON #-------------------------------------------------------------------------- def character_blink_on(character_id) if character_id == 0 character = $game_player else character = $game_map.events[character_id] end # 明滅 character.blink = true # 継続 return true end #-------------------------------------------------------------------------- # ● キャラクター明滅 OFF #-------------------------------------------------------------------------- def character_blink_off(character_id) if character_id == 0 character = $game_player else character = $game_map.events[character_id] end # 明滅 character.blink = false # 継続 return true end #-------------------------------------------------------------------------- # ● キャラクター白フラッシュ #-------------------------------------------------------------------------- def character_white_flash(character_id) if character_id == 0 character = $game_player else character = $game_map.events[character_id] end # 白フラッシュ character.white_flash = true # 継続 return true end #-------------------------------------------------------------------------- # ● キャラクターダメージ処理 #-------------------------------------------------------------------------- def character_damage(character_id, damage) if character_id == 0 character = $game_player else character = $game_map.events[character_id] end # バトラーが関連付けられている場合 if character.battler? character.battler.hp -= damage end # ダメージを設定 character.damage = damage character.damage_pop = true # 継続 return true end #-------------------------------------------------------------------------- # ● キャラクターコラプス #-------------------------------------------------------------------------- def character_collapse(character_id, type = 1) if character_id == 0 character = $game_player else character = $game_map.events[character_id] end # バトラーが関連付けられている場合 if character.battler? if character.battler.is_a?(Game_Enemy) type = 1 else type = 2 end end # コラプス character.collapse = type # 継続 return true end #-------------------------------------------------------------------------- # ● プレイヤーコラプス解除 #-------------------------------------------------------------------------- def cancel_collapsed # コラプス済み解除 $game_player.collapsed = false # 継続 return true end #-------------------------------------------------------------------------- # ● キャラクター HP 増減 #-------------------------------------------------------------------------- def character_hp(character_id, value, permit_dead = false) if character_id == 0 character = $game_player else character = $game_map.events[character_id] end # バトラーが関連付けられていなければ終了 unless character.battler? return end # HP が 0 でない場合 if character.battler.hp > 0 # HP を変更 (戦闘不能が許可されていなければ 1 にする) if permit_dead == false and character.battler.hp + value <= 0 character.battler.hp = 1 else character.battler.hp += value end end # 継続 return true end #-------------------------------------------------------------------------- # ● キャラクター SP 増減 #-------------------------------------------------------------------------- def character_sp(character_id, value) if character_id == 0 character = $game_player else character = $game_map.events[character_id] end # バトラーが関連付けられていなければ終了 unless character.battler? return end # SP を変更 character.battler.sp += value # 継続 return true end #-------------------------------------------------------------------------- # ● キャラクターステート付加 #-------------------------------------------------------------------------- def character_add_state(character_id, state_id) if character_id == 0 character = $game_player else character = $game_map.events[character_id] end # ステートを付加 character.add_state(state_id) # 継続 return true end #-------------------------------------------------------------------------- # ● キャラクターステート解除 #-------------------------------------------------------------------------- def character_remove_state(character_id, state_id) if character_id == 0 character = $game_player else character = $game_map.events[character_id] end # ステートを付加 character.remove_state(state_id) # 継続 return true end #-------------------------------------------------------------------------- # ● キャラクター全回復 #-------------------------------------------------------------------------- def character_recover_all(character_id) if character_id == 0 character = $game_player else character = $game_map.events[character_id] end # 全回復 character.recover_all # 継続 return true end end